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;
}) => (
);
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}
)}
);
}