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 { getProviderLogo } from '@renderer/config/providers'
import { useAllProviders, useProviders } from '@renderer/hooks/useProvider' import { useAllProviders, useProviders } from '@renderer/hooks/useProvider'
import ImageStorage from '@renderer/services/ImageStorage' import ImageStorage from '@renderer/services/ImageStorage'
import { INITIAL_PROVIDERS } from '@renderer/store/llm'
import { Provider } from '@renderer/types' import { Provider } from '@renderer/types'
import { droppableReorder, generateColorFromChar, getFirstCharacter, uuid } from '@renderer/utils' import { droppableReorder, generateColorFromChar, getFirstCharacter, uuid } from '@renderer/utils'
import { Avatar, Button, Dropdown, Input, MenuProps, Tag } from 'antd' import { Avatar, Button, Dropdown, Input, MenuProps, Tag } from 'antd'
@ -115,86 +116,89 @@ const ProvidersList: FC = () => {
onClick: () => ModelNotesPopup.show({ provider }) onClick: () => ModelNotesPopup.show({ provider })
} }
const menus = [ const editMenu = {
{ label: t('common.edit'),
label: t('common.edit'), key: 'edit',
key: 'edit', icon: <EditOutlined />,
icon: <EditOutlined />, async onClick() {
async onClick() { const { name, type, logoFile, logo } = await AddProviderPopup.show(provider)
const { name, type, logoFile, logo } = await AddProviderPopup.show(provider)
if (name) { if (name) {
updateProvider({ ...provider, name, type }) updateProvider({ ...provider, name, type })
if (provider.id) { if (provider.id) {
if (logoFile && logo) { if (logoFile && logo) {
try { try {
await ImageStorage.set(`provider-${provider.id}`, logo) await ImageStorage.set(`provider-${provider.id}`, logo)
setProviderLogos((prev) => ({ setProviderLogos((prev) => ({
...prev, ...prev,
[provider.id]: logo [provider.id]: logo
})) }))
} catch (error) { } catch (error) {
console.error('Failed to save logo', error) console.error('Failed to save logo', error)
window.message.error('更新Provider Logo失败') window.message.error('更新Provider Logo失败')
} }
} else if (logo === undefined && logoFile === undefined) { } else if (logo === undefined && logoFile === undefined) {
try { try {
await ImageStorage.set(`provider-${provider.id}`, '') await ImageStorage.set(`provider-${provider.id}`, '')
setProviderLogos((prev) => { setProviderLogos((prev) => {
const newLogos = { ...prev } const newLogos = { ...prev }
delete newLogos[provider.id] delete newLogos[provider.id]
return newLogos return newLogos
}) })
} catch (error) { } catch (error) {
console.error('Failed to reset logo', 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) { if (providers.filter((p) => p.id === provider.id).length > 1) {
return menus return menus
} }
if (provider.isSystem) { if (provider.isSystem) {
return [noteMenu] if (INITIAL_PROVIDERS.find((p) => p.id === provider.id)) {
return [noteMenu]
}
return [noteMenu, deleteMenu]
} }
return menus return menus