refactor: streamline provider menu logic in settings

- Consolidated edit and delete menu items for providers into separate constants for improved readability and maintainability.
- Enhanced the logic for displaying menus based on provider status, ensuring correct options are presented for system providers and initial providers.
This commit is contained in:
kangfenmao 2025-05-26 15:14:14 +08:00
parent abe9c09cc3
commit e41152cc1a

View File

@ -4,6 +4,7 @@ import Scrollbar from '@renderer/components/Scrollbar'
import { getProviderLogo } from '@renderer/config/providers'
import { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
import ImageStorage from '@renderer/services/ImageStorage'
import { INITIAL_PROVIDERS } from '@renderer/store/llm'
import { Provider } from '@renderer/types'
import { droppableReorder, generateColorFromChar, getFirstCharacter, uuid } from '@renderer/utils'
import { Avatar, Button, Dropdown, Input, MenuProps, Tag } from 'antd'
@ -115,86 +116,89 @@ const ProvidersList: FC = () => {
onClick: () => ModelNotesPopup.show({ provider })
}
const menus = [
{
label: t('common.edit'),
key: 'edit',
icon: <EditOutlined />,
async onClick() {
const { name, type, logoFile, logo } = await AddProviderPopup.show(provider)
const editMenu = {
label: t('common.edit'),
key: 'edit',
icon: <EditOutlined />,
async onClick() {
const { name, type, logoFile, logo } = await AddProviderPopup.show(provider)
if (name) {
updateProvider({ ...provider, name, type })
if (provider.id) {
if (logoFile && logo) {
try {
await ImageStorage.set(`provider-${provider.id}`, logo)
setProviderLogos((prev) => ({
...prev,
[provider.id]: logo
}))
} catch (error) {
console.error('Failed to save logo', error)
window.message.error('更新Provider Logo失败')
}
} else if (logo === undefined && logoFile === undefined) {
try {
await ImageStorage.set(`provider-${provider.id}`, '')
setProviderLogos((prev) => {
const newLogos = { ...prev }
delete newLogos[provider.id]
return newLogos
})
} catch (error) {
console.error('Failed to reset logo', error)
}
if (name) {
updateProvider({ ...provider, name, type })
if (provider.id) {
if (logoFile && logo) {
try {
await ImageStorage.set(`provider-${provider.id}`, logo)
setProviderLogos((prev) => ({
...prev,
[provider.id]: logo
}))
} catch (error) {
console.error('Failed to save logo', error)
window.message.error('更新Provider Logo失败')
}
} else if (logo === undefined && logoFile === undefined) {
try {
await ImageStorage.set(`provider-${provider.id}`, '')
setProviderLogos((prev) => {
const newLogos = { ...prev }
delete newLogos[provider.id]
return newLogos
})
} catch (error) {
console.error('Failed to reset logo', error)
}
}
}
}
},
noteMenu,
{
label: t('common.delete'),
key: 'delete',
icon: <DeleteOutlined />,
danger: true,
async onClick() {
window.modal.confirm({
title: t('settings.provider.delete.title'),
content: t('settings.provider.delete.content'),
okButtonProps: { danger: true },
okText: t('common.delete'),
centered: true,
onOk: async () => {
// 删除provider前先清理其logo
if (provider.id) {
try {
await ImageStorage.remove(`provider-${provider.id}`)
setProviderLogos((prev) => {
const newLogos = { ...prev }
delete newLogos[provider.id]
return newLogos
})
} catch (error) {
console.error('Failed to delete logo', error)
}
}
setSelectedProvider(providers.filter((p) => p.isSystem)[0])
removeProvider(provider)
}
})
}
}
]
}
const deleteMenu = {
label: t('common.delete'),
key: 'delete',
icon: <DeleteOutlined />,
danger: true,
async onClick() {
window.modal.confirm({
title: t('settings.provider.delete.title'),
content: t('settings.provider.delete.content'),
okButtonProps: { danger: true },
okText: t('common.delete'),
centered: true,
onOk: async () => {
// 删除provider前先清理其logo
if (provider.id) {
try {
await ImageStorage.remove(`provider-${provider.id}`)
setProviderLogos((prev) => {
const newLogos = { ...prev }
delete newLogos[provider.id]
return newLogos
})
} catch (error) {
console.error('Failed to delete logo', error)
}
}
setSelectedProvider(providers.filter((p) => p.isSystem)[0])
removeProvider(provider)
}
})
}
}
const menus = [editMenu, noteMenu, deleteMenu]
if (providers.filter((p) => p.id === provider.id).length > 1) {
return menus
}
if (provider.isSystem) {
return [noteMenu]
if (INITIAL_PROVIDERS.find((p) => p.id === provider.id)) {
return [noteMenu]
}
return [noteMenu, deleteMenu]
}
return menus