import { create } from 'zustand'; import { notificationsApi, type NotificationDto } from './notifications-api'; interface NotificationsState { /** Most recent notifications (for dropdown) */ notifications: NotificationDto[]; /** Unread count for badge */ unreadCount: number; /** Whether the dropdown is open */ isOpen: boolean; /** Loading state */ isLoading: boolean; // Actions setOpen: (open: boolean) => void; fetchUnreadCount: () => Promise; fetchRecent: () => Promise; markAsRead: (id: string) => Promise; markAllAsRead: () => Promise; addNotification: (notification: NotificationDto) => void; incrementUnread: () => void; /** Set the unread count directly (from server-pushed WS event). */ setUnreadCount: (count: number) => void; } export const useNotificationsStore = create((set, get) => ({ notifications: [], unreadCount: 0, isOpen: false, isLoading: false, setOpen: (open) => { set({ isOpen: open }); // Fetch latest when opening dropdown if (open) { get().fetchRecent(); } }, fetchUnreadCount: async () => { try { const { count } = await notificationsApi.unreadCount(); set({ unreadCount: count }); } catch { // Silently fail — badge just stays at current count } }, fetchRecent: async () => { set({ isLoading: true }); try { const result = await notificationsApi.list({ limit: 10 }); set({ notifications: result.data, isLoading: false, }); } catch { set({ isLoading: false }); } }, markAsRead: async (id) => { try { await notificationsApi.markAsRead(id); set((state) => ({ notifications: state.notifications.map((n) => n.id === id ? { ...n, isRead: true } : n, ), unreadCount: Math.max(0, state.unreadCount - 1), })); } catch { // Silently fail } }, markAllAsRead: async () => { try { await notificationsApi.markAllAsRead(); set((state) => ({ notifications: state.notifications.map((n) => ({ ...n, isRead: true })), unreadCount: 0, })); } catch { // Silently fail } }, addNotification: (notification) => { set((state) => ({ notifications: [notification, ...state.notifications].slice(0, 10), })); }, incrementUnread: () => { set((state) => ({ unreadCount: state.unreadCount + 1 })); }, setUnreadCount: (count) => { set({ unreadCount: count }); }, }));