'use client'; import { create } from 'zustand'; import { upsertDailySnapshot, upsertInsight, type XiaobaoRiskInsightCacheItem, } from '@/lib/xiaobao-risk-cache'; import type { XiaobaoRiskSnapshot } from '@/lib/xiaobao-risk-trend'; interface XiaobaoRiskState { snapshots: XiaobaoRiskSnapshot[]; insights: XiaobaoRiskInsightCacheItem[]; pendingInsightKeys: string[]; insightRequestAttempts: Record; riskDataLoaded: boolean; error?: string; fetchRiskData: () => Promise; saveSnapshot: (item: XiaobaoRiskSnapshot) => Promise; saveInsight: (item: XiaobaoRiskInsightCacheItem) => Promise; beginInsightUpdate: (key: string) => void; finishInsightUpdate: (key: string) => void; } const RISK_DATA_CACHE_MS = 30_000; let lastRiskDataFetchAt = 0; export const useXiaobaoRiskStore = create((set, get) => ({ snapshots: [], insights: [], pendingInsightKeys: [], insightRequestAttempts: {}, riskDataLoaded: false, error: undefined, fetchRiskData: async () => { if (get().riskDataLoaded && Date.now() - lastRiskDataFetchAt < RISK_DATA_CACHE_MS) return; lastRiskDataFetchAt = Date.now(); set({ riskDataLoaded: true, error: undefined, }); }, saveSnapshot: async (item) => { const optimistic = upsertDailySnapshot(get().snapshots, item); set({ snapshots: optimistic, error: undefined }); }, saveInsight: async (item) => { const optimistic = upsertInsight(get().insights, item); set({ insights: optimistic, error: undefined }); }, beginInsightUpdate: (key) => { if (!key) return; if (get().pendingInsightKeys.includes(key)) return; set({ pendingInsightKeys: [...get().pendingInsightKeys, key], insightRequestAttempts: { ...get().insightRequestAttempts, [key]: new Date().toISOString(), }, }); }, finishInsightUpdate: (key) => { if (!key) return; set({ pendingInsightKeys: get().pendingInsightKeys.filter((item) => item !== key) }); }, }));