import { useCallback, useMemo, useState, type ReactNode } from "react"; import { NotificationSessionContext } from "./notification-session-context"; function addAll(current: ReadonlySet, ids: string[]): ReadonlySet { if (ids.every((id) => current.has(id))) { return current; } const next = new Set(current); ids.forEach((id) => next.add(id)); return next; } /** * Dismissed and read notification ids for this app session only. Nothing is persisted, so a * reload starts over and a condition that still holds shows up again. */ export function NotificationSessionProvider({ children }: { children: ReactNode }) { const [dismissedIds, setDismissedIds] = useState>(() => new Set()); const [readIds, setReadIds] = useState>(() => new Set()); const dismiss = useCallback((ids: string[]) => { setDismissedIds((current) => addAll(current, ids)); }, []); const markRead = useCallback((ids: string[]) => { setReadIds((current) => addAll(current, ids)); }, []); const value = useMemo( () => ({ dismissedIds, readIds, dismiss, markRead }), [dismissedIds, readIds, dismiss, markRead], ); return ( {children} ); }