"use client"; import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type ReactNode, } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { getAdminSettings } from "@/api/admin-settings"; /** 系统设置页一次拉取的分组(避免各卡片重复 GET) */ export const SYSTEM_SETTINGS_GROUPS = ["draw", "settlement", "frontend", "wallet"] as const; function mergeItemsToKv( items: { key: string; value: unknown }[], into: Record, ): void { for (const item of items) { into[item.key] = item.value; } } type AdminSettingsDataContextValue = { kv: Record | null; loading: boolean; reload: () => Promise; patchKv: (updates: Record) => void; }; const AdminSettingsDataContext = createContext(null); export function AdminSettingsDataProvider({ children }: { children: ReactNode }) { const { t } = useTranslation(["config"]); const [kv, setKv] = useState | null>(null); const [loading, setLoading] = useState(true); const tRef = useRef(t); tRef.current = t; const reload = useCallback(async () => { setLoading(true); try { const responses = await Promise.all( SYSTEM_SETTINGS_GROUPS.map((group) => getAdminSettings(group)), ); const merged: Record = {}; for (const res of responses) { mergeItemsToKv(res.items, merged); } setKv(merged); } catch { toast.error(tRef.current("system.loadFailed", { ns: "config" })); } finally { setLoading(false); } }, []); useEffect(() => { void reload(); }, [reload]); const patchKv = useCallback((updates: Record) => { setKv((prev) => (prev === null ? { ...updates } : { ...prev, ...updates })); }, []); const value = useMemo( () => ({ kv, loading, reload, patchKv }), [kv, loading, reload, patchKv], ); return ( {children} ); } export function useAdminSettingsData(): AdminSettingsDataContextValue { const ctx = useContext(AdminSettingsDataContext); if (ctx === null) { throw new Error("useAdminSettingsData must be used within AdminSettingsDataProvider"); } return ctx; } export function useOptionalAdminSettingsData(): AdminSettingsDataContextValue | null { return useContext(AdminSettingsDataContext); }