/** Toast notifications: provider + auto-dismissing toast stack. */ import { useCallback, useMemo, useRef, useState, type ReactNode } from 'react' import { ToastContext, type ToastApi, type ToastVariant } from './toast' import './toast.css' interface ToastItem { id: number message: string variant: ToastVariant } export function ToastProvider({ children }: { children: ReactNode }) { const [toasts, setToasts] = useState([]) const idRef = useRef(0) const remove = useCallback((id: number) => setToasts((ts) => ts.filter((t) => t.id !== id)), []) const api = useMemo(() => { const show = (message: string, variant: ToastVariant = 'info') => { const id = (idRef.current += 1) setToasts((ts) => [...ts, { id, message, variant }]) window.setTimeout(() => remove(id), 3500) } return { show, success: (m) => show(m, 'success'), error: (m) => show(m, 'error') } }, [remove]) return ( {children}
{toasts.map((t) => ( ))}
) }