Toast notifications provide temporary feedback messages.
Code:
1import { useState, useCallback, createContext, useContext } from "react";23type Toast = {4 id: string;5 message: string;6 type: "success" | "error" | "info";7};89const ToastContext = createContext<{10 toasts: Toast[];11 addToast: (message: string, type: Toast["type"]) => void;12 removeToast: (id: string) => void;13}>(null!);1415export function ToastProvider({ children }) {16 const [toasts, setToasts] = useState<Toast[]>([]);1718 const addToast = useCallback((message: string, type: Toast["type"]) => {19 const id = Date.now().toString();20 setToasts(prev => [...prev, { id, message, type }]);21 setTimeout(() => removeToast(id), 3000);22 }, []);2324 const removeToast = useCallback((id: string) => {25 setToasts(prev => prev.filter(t => t.id !== id));26 }, []);2728 return (29 <ToastContext.Provider value={{ toasts, addToast, removeToast }}>30 {children}31 <ToastContainer />32 </ToastContext.Provider>33 );34}3536function ToastContainer() {37 const { toasts, removeToast } = useContext(ToastContext);3839 return (40 <div className="toast-container">41 {toasts.map(toast => (42 <div43 key={toast.id}44 className={`toast toast-${toast.type}`}45 onClick={() => removeToast(toast.id)}46 >47 {toast.message}48 </div>49 ))}50 </div>51 );52}5354// Custom hook55function useToast() {56 const { addToast } = useContext(ToastContext);57 return {58 success: (msg) => addToast(msg, "success"),59 error: (msg) => addToast(msg, "error"),60 info: (msg) => addToast(msg, "info"),61 };62}6364// Usage65function App() {66 return (67 <ToastProvider>68 <MyApp />69 </ToastProvider>70 );71}7273function SaveButton() {74 const toast = useToast();7576 const handleSave = async () => {77 try {78 await save();79 toast.success("Saved successfully");80 } catch (err) {81 toast.error("Failed to save");82 }83 };8485 return <button onClick={handleSave}>Save</button>;86}