"use client"; import { createContext, useCallback, useContext, useEffect, useState } from "react"; type ToastKind = "success" | "error" | "info"; type Toast = { id: number; kind: ToastKind; message: string }; type ToastContextValue = { toast: (message: string, kind?: ToastKind) => void; success: (message: string) => void; error: (message: string) => void; }; const ToastContext = createContext(null); let _id = 0; export function ToastProvider({ children }: { children: React.ReactNode }) { const [toasts, setToasts] = useState([]); const remove = useCallback((id: number) => { setToasts((prev) => prev.filter((t) => t.id !== id)); }, []); const toast = useCallback( (message: string, kind: ToastKind = "info") => { const id = ++_id; setToasts((prev) => [...prev, { id, kind, message }]); setTimeout(() => remove(id), 4500); }, [remove] ); const value: ToastContextValue = { toast, success: (m) => toast(m, "success"), error: (m) => toast(m, "error"), }; return ( {children}
{toasts.map((t) => ( ))}
); } export function useToast(): ToastContextValue { const ctx = useContext(ToastContext); if (!ctx) { // No-op fallback so components don't crash outside the provider. return { toast: () => {}, success: () => {}, error: () => {} }; } return ctx; }