import { create } from "zustand"; import { produce } from "immer"; import { SETTINGS_NAMES, type EmailsSettingsContent, type SettingsModel } from "@/domain/settings"; import { get as getSettings, save as saveSettings } from "@/repository/settings"; export interface ContactState { emails: string[]; loading: boolean; loadedAtOnce: boolean; fetchEmails: () => Promise; setEmails: (emails: string[]) => Promise; addEmail: (email: string) => Promise; removeEmail: (email: string) => Promise; } export const useContactStore = create((set, get) => { let fetcher: Promise> | null = null; // 防止多次重复请求 let settings: SettingsModel; // 记录当前设置的其他字段,保存回数据库时用 return { emails: [], loading: false, loadedAtOnce: false, setEmails: async (emails) => { settings ??= await getSettings(SETTINGS_NAMES.EMAILS); settings = await saveSettings({ ...settings, content: { ...settings.content, emails: emails, }, }); set( produce((state: ContactState) => { state.emails = settings.content.emails?.sort() ?? []; state.loadedAtOnce = true; }) ); }, addEmail: async (email) => { const emails = produce(get().emails, (draft) => { if (draft.includes(email)) return; draft.push(email); draft.sort(); }); get().setEmails(emails); }, removeEmail: async (email) => { const emails = produce(get().emails, (draft) => { draft = draft.filter((e) => e !== email); draft.sort(); }); get().setEmails(emails); }, fetchEmails: async () => { fetcher ??= getSettings(SETTINGS_NAMES.EMAILS); try { set({ loading: true }); settings = await fetcher; set({ emails: settings.content.emails?.sort() ?? [], loadedAtOnce: true }); } finally { fetcher = null; set({ loading: false }); } }, }; });