import { createFileRoute } from '@tanstack/react-router'; import { useTheme } from '@/components/theme-provider'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Input } from '@/components/ui/input'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useQuery } from '@tanstack/react-query'; import { getAppVersion, getPlatform } from '@/actions/app'; import { useTranslation } from 'react-i18next'; import { setAppLanguage } from '@/actions/language'; import { useAppConfig } from '@/hooks/useAppConfig'; import { Loader2 } from 'lucide-react'; import { useState, useEffect } from 'react'; import { ProxyConfig } from '@/types/config'; function SettingsPage() { const { theme, setTheme } = useTheme(); const { t, i18n } = useTranslation(); const { config, isLoading, saveConfig } = useAppConfig(); // Local state for configuration editing const [proxyConfig, setProxyConfig] = useState(undefined); // Sync config to local state when loaded useEffect(() => { if (config) { setProxyConfig(config.proxy); } }, [config]); const { data: appVersion } = useQuery({ queryKey: ['app', 'version'], queryFn: getAppVersion, }); const { data: platform } = useQuery({ queryKey: ['app', 'platform'], queryFn: getPlatform, }); const handleLanguageChange = (value: string) => { setAppLanguage(value, i18n); }; // Helper to update proxyConfig and auto-save const updateProxyConfig = async (newProxyConfig: ProxyConfig) => { setProxyConfig(newProxyConfig); if (config) { await saveConfig({ ...config, proxy: newProxyConfig }); } }; if (isLoading || !proxyConfig) { return (
); } return (

{t('settings.title')}

{t('settings.description')}

{t('settings.general', 'General')} {t('settings.proxy_tab', 'Proxy')} {/* --- GENERAL TAB --- */} {t('settings.appearance.title')} {t('settings.appearance.description')}

{t('settings.darkModeDescription')}

setTheme(checked ? 'dark' : 'light')} />

{t('settings.language.description')}

{/* Account Settings Card */} {t('settings.account.title', 'Account Settings')} {t('settings.account.description', 'Configure automatic account refresh and sync.')} {/* Auto Refresh Quota */}

{t( 'settings.account.auto_refresh_desc', 'Periodically refresh quota info for all accounts', )}

{ if (config) { await saveConfig({ ...config, auto_refresh: checked }); } }} />
{/* Auto Sync Account */}

{t( 'settings.account.auto_sync_desc', 'Periodically sync active account information', )}

{ if (config) { await saveConfig({ ...config, auto_sync: checked }); } }} />
{t('settings.about.title')} {t('settings.about.description')}
{t('settings.version')}
{appVersion || 'Unknown'}
{t('settings.platform')}
{platform || 'Unknown'}
{t('settings.license')}
CC BY-NC-SA 4.0
{/* --- PROXY TAB (Upstream Proxy Config Only) --- */} {t('settings.proxy.title')} {t('settings.proxy.description')}
updateProxyConfig({ ...proxyConfig, upstream_proxy: { ...proxyConfig.upstream_proxy, enabled: checked }, }) } />
updateProxyConfig({ ...proxyConfig, upstream_proxy: { ...proxyConfig.upstream_proxy, url: e.target.value }, }) } disabled={!proxyConfig.upstream_proxy.enabled} />
); } export const Route = createFileRoute('/settings')({ component: SettingsPage, });