| import { useMemo } from 'react'; |
| import { useRecoilCallback } from 'recoil'; |
| import { useRecoilValue } from 'recoil'; |
| import { MessageCircleDashed, Box } from 'lucide-react'; |
| import type { BadgeItem } from '~/common'; |
| import { useLocalize, TranslationKeys } from '~/hooks'; |
| import store from '~/store'; |
|
|
| interface ChatBadgeConfig { |
| id: string; |
| icon: typeof Box; |
| label: string; |
| atom?: any; |
| } |
|
|
| const badgeConfig: ReadonlyArray<ChatBadgeConfig> = [ |
| |
| |
| |
| |
| |
| |
| |
| ]; |
|
|
| export default function useChatBadges(): BadgeItem[] { |
| const localize = useLocalize(); |
| const activeBadges = useRecoilValue(store.chatBadges) as Array<{ id: string }>; |
| const activeBadgeIds = useMemo( |
| () => new Set(activeBadges.map((badge) => badge.id)), |
| [activeBadges], |
| ); |
| const allBadges = useMemo(() => { |
| return ( |
| badgeConfig.map((cfg) => ({ |
| id: cfg.id, |
| label: localize(cfg.label as TranslationKeys), |
| icon: cfg.icon, |
| atom: cfg.atom, |
| isAvailable: activeBadgeIds.has(cfg.id), |
| })) || [] |
| ); |
| }, [activeBadgeIds, localize]); |
| return allBadges; |
| } |
|
|
| export function useResetChatBadges() { |
| return useRecoilCallback( |
| ({ reset }) => |
| () => { |
| badgeConfig.forEach(({ atom }) => reset(atom)); |
| reset(store.chatBadges); |
| }, |
| [], |
| ); |
| } |
|
|