import React from 'react'; import { Sun, Moon, Monitor, Palette, Check } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useTheme } from '@/hooks/useTheme'; import { useTranslation } from '@/hooks/useTranslation'; import { cn } from '@/lib/utils'; interface ThemeSwitcherProps { className?: string; showText?: boolean; } /** * 主题快速切换组件 * * @example * * */ export const ThemeSwitcher: React.FC = ({ className, showText = false }) => { const { theme, setTheme } = useTheme(); const { currentLanguage } = useTranslation(); const themes = [ { key: 'light', name: currentLanguage === 'zh' ? '浅色' : 'Light', icon: Sun, description: currentLanguage === 'zh' ? '明亮模式' : 'Bright mode' }, { key: 'gray', name: currentLanguage === 'zh' ? '灰色' : 'Gray', icon: Monitor, description: currentLanguage === 'zh' ? '舒适模式' : 'Comfortable mode' }, { key: 'dark', name: currentLanguage === 'zh' ? '深色' : 'Dark', icon: Moon, description: currentLanguage === 'zh' ? '暗黑模式' : 'Dark mode' }, { key: 'custom', name: currentLanguage === 'zh' ? '自定义' : 'Custom', icon: Palette, description: currentLanguage === 'zh' ? '个性化' : 'Personalized' } ] as const; const getCurrentThemeIcon = () => { const currentTheme = themes.find(t => t.key === theme); const IconComponent = currentTheme?.icon || Monitor; return IconComponent; }; const getCurrentThemeName = () => { const currentTheme = themes.find(t => t.key === theme); return currentTheme?.name || (currentLanguage === 'zh' ? '主题' : 'Theme'); }; const handleThemeChange = async (themeKey: string) => { try { await setTheme(themeKey as any); } catch (error) { console.error('Failed to change theme:', error); } }; const IconComponent = getCurrentThemeIcon(); return ( {showText && {getCurrentThemeName()}} {themes.map((themeOption) => { const ThemeIcon = themeOption.icon; return ( handleThemeChange(themeOption.key)} className="flex items-center justify-between cursor-pointer" > {themeOption.name} {themeOption.description} {theme === themeOption.key && ( )} ); })} ); };