import { useEffect, useState } from "react"; import { getNotificationPreferences, updateNotificationPreferences, } from "@/client/api"; import type { NotificationPreferencesResponse } from "@/client/model"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Loader2 } from "lucide-react"; import { useSettingsDataCache } from "@/components/settings/SettingsDataCache"; import { NOTIFICATIONS_PAGE } from "@/css/app/styles"; const DIGEST_MODES = [ { value: "instant", label: "即时" }, { value: "daily", label: "每日摘要" }, { value: "weekly", label: "每周摘要" }, { value: "off", label: "关闭" }, ]; const ToggleRow = ({ label, desc, checked, onChange, }: { label: string; desc: string; checked: boolean; onChange: (v: boolean) => void; }) => (

{label}

{desc}

); export function NotificationsPage() { const { notificationPrefs: cachedPrefs, setNotificationPrefs: setCachedPrefs } = useSettingsDataCache(); const [, setPrefs] = useState(cachedPrefs); const [loading, setLoading] = useState(!cachedPrefs); const [saving, setSaving] = useState(false); const [form, setForm] = useState({ email_enabled: cachedPrefs?.email_enabled ?? true, in_app_enabled: cachedPrefs?.in_app_enabled ?? true, push_enabled: cachedPrefs?.push_enabled ?? false, digest_mode: cachedPrefs?.digest_mode ?? "instant", dnd_enabled: cachedPrefs?.dnd_enabled ?? false, marketing_enabled: cachedPrefs?.marketing_enabled ?? false, security_enabled: cachedPrefs?.security_enabled ?? true, product_enabled: cachedPrefs?.product_enabled ?? true, }); const [message, setMessage] = useState<{ type: "success" | "error"; text: string; } | null>(null); useEffect(() => { if (cachedPrefs) return; (async () => { try { const res = await getNotificationPreferences(); const d = res.data.data!; setPrefs(d); setCachedPrefs(d); setForm({ email_enabled: d.email_enabled, in_app_enabled: d.in_app_enabled, push_enabled: d.push_enabled, digest_mode: d.digest_mode, dnd_enabled: d.dnd_enabled, marketing_enabled: d.marketing_enabled, security_enabled: d.security_enabled, product_enabled: d.product_enabled, }); } catch { setMessage({ type: "error", text: "加载通知偏好失败" }); } finally { setLoading(false); } })(); }, [cachedPrefs, setCachedPrefs]); const handleSave = async () => { try { setSaving(true); setMessage(null); await updateNotificationPreferences({ email_enabled: form.email_enabled, in_app_enabled: form.in_app_enabled, push_enabled: form.push_enabled, digest_mode: form.digest_mode, dnd_enabled: form.dnd_enabled, marketing_enabled: form.marketing_enabled, security_enabled: form.security_enabled, product_enabled: form.product_enabled, }); setMessage({ type: "success", text: "通知设置已保存" }); } catch { setMessage({ type: "error", text: "保存失败,请重试" }); } finally { setSaving(false); } }; if (loading) { return (
); } return (

通知

管理你的通知偏好

{/* Notification Channels */}

通知渠道

setForm((f) => ({ ...f, email_enabled: v })) } />
setForm((f) => ({ ...f, in_app_enabled: v })) } />
setForm((f) => ({ ...f, push_enabled: v })) } />
{/* Digest Mode */}
{/* Notification Types */}

通知类型

setForm((f) => ({ ...f, security_enabled: v })) } />
setForm((f) => ({ ...f, product_enabled: v })) } />
setForm((f) => ({ ...f, marketing_enabled: v })) } />
{/* DND */}

免打扰

setForm((f) => ({ ...f, dnd_enabled: v })) } />
{message && (
{message.text}
)}
); }