import { useEffect, useState, useCallback } from 'react'; import { Form, Input, Select, Button, ColorPicker, message, Typography } from 'antd'; import { getTheme, updateTheme, } from '../../api/themes'; // --- Component --- export default function ThemeSettings() { const [form] = Form.useForm(); const [, setLoading] = useState(false); const [saving, setSaving] = useState(false); const fetchTheme = useCallback(async () => { setLoading(true); try { const theme = await getTheme(); form.setFieldsValue({ primary_color: theme.primary_color || '#1677ff', logo_url: theme.logo_url || '', sidebar_style: theme.sidebar_style || 'light', }); } catch { // Theme may not exist yet; use defaults form.setFieldsValue({ primary_color: '#1677ff', logo_url: '', sidebar_style: 'light', }); } setLoading(false); }, [form]); useEffect(() => { fetchTheme(); }, [fetchTheme]); const handleSave = async (values: { primary_color: string; logo_url: string; sidebar_style: 'light' | 'dark'; }) => { setSaving(true); try { await updateTheme({ primary_color: typeof values.primary_color === 'string' ? values.primary_color : (values.primary_color as { toHexString?: () => string }).toHexString?.() ?? String(values.primary_color), logo_url: values.logo_url, sidebar_style: values.sidebar_style, }); message.success('主题设置已保存'); } catch (err: unknown) { const errorMsg = (err as { response?: { data?: { message?: string } } })?.response?.data ?.message || '保存失败'; message.error(errorMsg); } setSaving(false); }; return (