import { useState, useCallback, useEffect, useRef, type ReactNode } from 'react'; import { atprotoClient } from '../api/client'; import { useAuth } from '../auth/useAuth'; import { NotificationCountContext } from './notificationCountContext'; const POLL_INTERVAL = 30_000; export function NotificationCountProvider({ children }: { children: ReactNode }) { const [unreadCount, setUnreadCount] = useState(0); const { session } = useAuth(); const prevSessionDidRef = useRef(undefined); const intervalRef = useRef | null>(null); if (session?.did !== prevSessionDidRef.current) { prevSessionDidRef.current = session?.did; if (!session) setUnreadCount(0); } const refreshCount = useCallback(async () => { try { const resp = await atprotoClient.getUnreadCount(); setUnreadCount(resp.count); } catch { } }, []); const markSeen = useCallback(async () => { setUnreadCount(0); }, []); useEffect(() => { if (!session) { return; } intervalRef.current = setInterval(() => { void refreshCount(); }, POLL_INTERVAL); const initialTimeout = setTimeout(() => void refreshCount(), 0); return () => { if (intervalRef.current) { clearInterval(intervalRef.current); } clearTimeout(initialTimeout); }; }, [session, refreshCount]); useEffect(() => { const handler = () => setUnreadCount(0); window.addEventListener('foxsky:notifications-seen', handler); return () => window.removeEventListener('foxsky:notifications-seen', handler); }, []); return ( {children} ); }