refactor(AvatarSetting): simplify avatar selection by removing radio options

Remove radio group selection for avatar type and only keep emoji picker
Clean up unused imports and code related to the removed functionality
This commit is contained in:
icarus 2025-09-29 21:00:42 +08:00
parent 7ec17dc771
commit ff705d99b3

View File

@ -1,11 +1,7 @@
import { Avatar, Radio, RadioGroup } from '@heroui/react'
import { loggerService } from '@logger'
import { EmojiAvatarWithPicker } from '@renderer/components/Avatar/EmojiAvatarWithPicker' import { EmojiAvatarWithPicker } from '@renderer/components/Avatar/EmojiAvatarWithPicker'
import { getAgentDefaultAvatar } from '@renderer/config/agent'
import { AgentEntity, isAgentType, UpdateAgentForm } from '@renderer/types' import { AgentEntity, isAgentType, UpdateAgentForm } from '@renderer/types'
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import z from 'zod'
import { SettingsItem, SettingsTitle } from './shared' import { SettingsItem, SettingsTitle } from './shared'
@ -14,21 +10,11 @@ export interface AvatarSettingsProps {
update: (form: UpdateAgentForm) => Promise<void> update: (form: UpdateAgentForm) => Promise<void>
} }
const optionsSchema = z.enum(['default', 'emoji']) // const logger = loggerService.withContext('AvatarSetting')
type AvatarOption = z.infer<typeof optionsSchema>
const options = {
DEFAULT: 'default',
EMOJI: 'emoji'
} as const satisfies Record<string, AvatarOption>
const logger = loggerService.withContext('AvatarSetting')
export const AvatarSetting: React.FC<AvatarSettingsProps> = ({ agent, update }) => { export const AvatarSetting: React.FC<AvatarSettingsProps> = ({ agent, update }) => {
const { t } = useTranslation() const { t } = useTranslation()
const isDefault = isAgentType(agent.configuration?.avatar) const isDefault = isAgentType(agent.configuration?.avatar)
const [avatarOption, setAvatarOption] = useState<AvatarOption>(isDefault ? options.DEFAULT : options.EMOJI)
const [emoji, setEmoji] = useState(isDefault ? '⭐️' : (agent.configuration?.avatar ?? '⭐️')) const [emoji, setEmoji] = useState(isDefault ? '⭐️' : (agent.configuration?.avatar ?? '⭐️'))
const updateAvatar = useCallback( const updateAvatar = useCallback(
@ -48,49 +34,17 @@ export const AvatarSetting: React.FC<AvatarSettingsProps> = ({ agent, update })
[agent, update] [agent, update]
) )
const handleOptionChange = useCallback(
(value: string) => {
const result = optionsSchema.safeParse(value)
if (!result.success) {
logger.error('Invalid option', { value })
return
}
const option = result.data
setAvatarOption(option)
if (option === agent?.configuration?.avatar) return
switch (option) {
case options.DEFAULT:
updateAvatar(agent.type)
break
case options.EMOJI:
updateAvatar(emoji)
break
default:
break
}
},
[agent?.configuration?.avatar, agent.type, emoji, updateAvatar]
)
return ( return (
<SettingsItem inline> <SettingsItem inline>
<SettingsTitle>{t('common.avatar')}</SettingsTitle> <SettingsTitle>{t('common.avatar')}</SettingsTitle>
<RadioGroup size="sm" orientation="horizontal" value={avatarOption} onValueChange={handleOptionChange}> <EmojiAvatarWithPicker
<Radio value={options.DEFAULT} classNames={{ label: 'flex flex-row' }}> emoji={emoji}
<Avatar className="h-6 w-6" src={getAgentDefaultAvatar(agent.type)} /> onPick={(emoji: string) => {
</Radio> setEmoji(emoji)
<Radio value={options.EMOJI}> if (emoji === agent?.configuration?.avatar) return
<EmojiAvatarWithPicker updateAvatar(emoji)
emoji={emoji} }}
onPick={(emoji: string) => { />
setEmoji(emoji)
if (emoji === agent?.configuration?.avatar) return
updateAvatar(emoji)
}}
/>
</Radio>
</RadioGroup>
</SettingsItem> </SettingsItem>
) )
} }