'use client'; import { useState, useEffect, createContext, useContext, useCallback } from 'react'; interface Toast { id: string; message: string; type: 'success' | 'error' | 'info'; } interface ToastContextType { toast: (message: string, type?: Toast['type']) => void; } const ToastContext = createContext({ toast: () => {} }); export function useToast() { return useContext(ToastContext); } export function ToastProvider({ children }: { children: React.ReactNode }) { const [toasts, setToasts] = useState([]); const addToast = useCallback((message: string, type: Toast['type'] = 'info') => { const id = crypto.randomUUID(); setToasts((prev) => [...prev, { id, message, type }]); }, []); const removeToast = useCallback((id: string) => { setToasts((prev) => prev.filter((t) => t.id !== id)); }, []); return ( {children}
{toasts.map((t) => ( removeToast(t.id)} /> ))}
); } function ToastItem({ toast, onDismiss }: { toast: Toast; onDismiss: () => void }) { useEffect(() => { const timer = setTimeout(onDismiss, 4000); return () => clearTimeout(timer); }, [onDismiss]); const styles: Record = { success: 'bg-emerald-600', error: 'bg-red-600', info: 'bg-surface-800', }; const icons: Record = { success: ( ), error: ( ), info: ( ), }; return (
{icons[toast.type]} {toast.message}
); }