| import { useState, useCallback } from 'react' |
| import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/Popover' |
| import Button from '@/components/ui/Button' |
| import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select' |
| import { useSettingsStore } from '@/stores/settings' |
| import { PaletteIcon } from 'lucide-react' |
| import { useTranslation } from 'react-i18next' |
| import { cn } from '@/lib/utils' |
|
|
| interface AppSettingsProps { |
| className?: string |
| } |
|
|
| export default function AppSettings({ className }: AppSettingsProps) { |
| const [opened, setOpened] = useState<boolean>(false) |
| const { t } = useTranslation() |
|
|
| const language = useSettingsStore.use.language() |
| const setLanguage = useSettingsStore.use.setLanguage() |
|
|
| const theme = useSettingsStore.use.theme() |
| const setTheme = useSettingsStore.use.setTheme() |
|
|
| const handleLanguageChange = useCallback((value: string) => { |
| setLanguage(value as 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW' | 'ru' | 'ja' | 'de' | 'uk' | 'ko' | 'vi') |
| }, [setLanguage]) |
|
|
| const handleThemeChange = useCallback((value: string) => { |
| setTheme(value as 'light' | 'dark' | 'system') |
| }, [setTheme]) |
|
|
| return ( |
| <Popover open={opened} onOpenChange={setOpened}> |
| <PopoverTrigger asChild> |
| <Button variant="ghost" size="icon" className={cn('h-9 w-9', className)}> |
| <PaletteIcon className="h-5 w-5" /> |
| </Button> |
| </PopoverTrigger> |
| <PopoverContent side="bottom" align="end" className="w-56"> |
| <div className="flex flex-col gap-4"> |
| <div className="flex flex-col gap-2"> |
| <label className="text-sm font-medium">{t('settings.language')}</label> |
| <Select value={language} onValueChange={handleLanguageChange}> |
| <SelectTrigger> |
| <SelectValue /> |
| </SelectTrigger> |
| <SelectContent> |
| <SelectItem value="en">English</SelectItem> |
| <SelectItem value="zh">中文</SelectItem> |
| <SelectItem value="fr">Français</SelectItem> |
| <SelectItem value="ar">العربية</SelectItem> |
| <SelectItem value="zh_TW">繁體中文</SelectItem> |
| <SelectItem value="ru">Русский</SelectItem> |
| <SelectItem value="ja">日本語</SelectItem> |
| <SelectItem value="de">Deutsch</SelectItem> |
| <SelectItem value="uk">Українська</SelectItem> |
| <SelectItem value="ko">한국어</SelectItem> |
| <SelectItem value="vi">Tiếng Việt</SelectItem> |
| </SelectContent> |
| </Select> |
| </div> |
| |
| <div className="flex flex-col gap-2"> |
| <label className="text-sm font-medium">{t('settings.theme')}</label> |
| <Select value={theme} onValueChange={handleThemeChange}> |
| <SelectTrigger> |
| <SelectValue /> |
| </SelectTrigger> |
| <SelectContent> |
| <SelectItem value="light">{t('settings.light')}</SelectItem> |
| <SelectItem value="dark">{t('settings.dark')}</SelectItem> |
| <SelectItem value="system">{t('settings.system')}</SelectItem> |
| </SelectContent> |
| </Select> |
| </div> |
| </div> |
| </PopoverContent> |
| </Popover> |
| ) |
| } |
|
|