import React, { useEffect, useRef, useState } from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import TextField from '@mui/material/TextField'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import Slider from '@mui/material/Slider'; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; import { getSettings, saveSettings } from '../../api/settings.js'; import { uploadWallpaper } from '../../api/upload.js'; import { showSnack } from '../snack.jsx'; /** 主题设置:主题色/壁纸(上传或URL)/导航卡片样式/玻璃模糊透明度/强制深色(迁移自 v1 主题卡片) */ export default function ThemeSettings() { const [form, setForm] = useState({ primary_color: '#6750a4', theme_wallpaper: '', theme_wallpaper_scale: 'cover', theme_wallpaper_enabled: true, nav_style: 'default', card_style: 'default', glass_blur: '20', glass_opacity: '0.6', theme_force_dark: false, }); const [saving, setSaving] = useState(false); const fileRef = useRef(null); useEffect(() => { getSettings() .then((s) => setForm({ primary_color: s.primary_color || '#6750a4', theme_wallpaper: s.theme_wallpaper || '', theme_wallpaper_scale: s.theme_wallpaper_scale || 'cover', theme_wallpaper_enabled: s.theme_wallpaper_enabled !== '0', nav_style: s.nav_style || 'default', card_style: s.card_style || 'default', glass_blur: s.glass_blur || '20', glass_opacity: s.glass_opacity || '0.6', theme_force_dark: s.theme_force_dark === '1', })) .catch((e) => showSnack(e.message, 'error')); }, []); const set = (k) => (e) => setForm((p) => ({ ...p, [k]: e.target.value })); const handleWallpaperUpload = async (e) => { const file = e.target.files && e.target.files[0]; e.target.value = ''; if (!file) return; try { const data = await uploadWallpaper(file); setForm((p) => ({ ...p, theme_wallpaper: data.url })); showSnack('壁纸已上传'); } catch (err) { showSnack(err.message, 'error'); } }; const save = async () => { setSaving(true); try { await saveSettings({ primary_color: form.primary_color, theme_wallpaper: form.theme_wallpaper.trim(), theme_wallpaper_scale: form.theme_wallpaper_scale, theme_wallpaper_enabled: form.theme_wallpaper_enabled ? '1' : '0', theme_force_dark: form.theme_force_dark ? '1' : '0', nav_style: form.nav_style, card_style: form.card_style, glass_blur: form.glass_blur, glass_opacity: form.glass_opacity, }); showSnack('主题设置已保存'); } catch (e) { showSnack(e.message, 'error'); } setSaving(false); }; return ( 主题设置 主题色 壁纸背景 setForm((p) => ({ ...p, theme_wallpaper_enabled: e.target.checked }))} />} label="启用壁纸背景" sx={{ mb: 1 }} /> 上传后自动填入 URL {form.theme_wallpaper && ( wallpaper )} 样式设置 导航栏样式 v && setForm((p) => ({ ...p, nav_style: v }))} size="small" sx={{ mb: 2 }}> 默认 磨砂玻璃 胶囊 卡片样式 v && setForm((p) => ({ ...p, card_style: v }))} size="small"> 默认 磨砂玻璃 玻璃效果 模糊强度: {form.glass_blur}px setForm((p) => ({ ...p, glass_blur: String(v) }))} sx={{ maxWidth: 400 }} /> 透明度: {form.glass_opacity} setForm((p) => ({ ...p, glass_opacity: String(v) }))} sx={{ maxWidth: 400 }} /> 深色模式 setForm((p) => ({ ...p, theme_force_dark: e.target.checked }))} />} label="强制深色模式(启用后用户无法切换为浅色)" /> ); }