import { create } from 'zustand'; import type { Activity } from '@backspace/shared'; import { wsSendAll } from '../hooks/useWebSocket'; let pushTimer: ReturnType | null = null; interface ActivityState { userActivities: Map; showActivity: boolean; myActivities: Activity[] | null; setUserActivities: (userId: string, activities: Activity[]) => void; clearUserActivities: (userId: string) => void; initActivities: (activityMap: Record) => void; setShowActivity: (show: boolean) => void; pushActivities: (activities: Activity[]) => void; reset: () => void; } export const useActivityStore = create((set, get) => ({ userActivities: new Map(), showActivity: true, myActivities: null, setUserActivities: (userId, activities) => { set((state) => { const next = new Map(state.userActivities); if (activities.length === 0) { next.delete(userId); } else { next.set(userId, activities); } return { userActivities: next }; }); }, clearUserActivities: (userId) => { set((state) => { const next = new Map(state.userActivities); next.delete(userId); return { userActivities: next }; }); }, initActivities: (activityMap) => { set((state) => { const next = new Map(state.userActivities); for (const [userId, activities] of Object.entries(activityMap)) { if (activities.length > 0) { next.set(userId, activities); } else { next.delete(userId); } } return { userActivities: next }; }); }, setShowActivity: (show) => { set({ showActivity: show }); if (!show) { if (pushTimer) { clearTimeout(pushTimer); pushTimer = null; } wsSendAll({ type: 'activity_update', activities: [] }); set({ myActivities: null }); } }, pushActivities: (activities) => { if (!get().showActivity) return; set({ myActivities: activities }); if (pushTimer) clearTimeout(pushTimer); pushTimer = setTimeout(() => { wsSendAll({ type: 'activity_update', activities }); pushTimer = null; }, 5000); }, reset: () => { if (pushTimer) { clearTimeout(pushTimer); pushTimer = null; } set({ userActivities: new Map(), showActivity: true, myActivities: null }); }, }));