import { createContext, useContext, useState, useCallback, ReactNode } from 'react'; import { CheckCircle, XCircle, AlertCircle, Info, X } from 'lucide-react'; import '../styles/Toast.css'; export type ToastType = 'success' | 'error' | 'warning' | 'info'; export interface Toast { id: string; message: string; type: ToastType; duration?: number; } interface ToastContextValue { showToast: (message: string, type?: ToastType, duration?: number) => void; hideToast: (id: string) => void; } const ToastContext = createContext(null); export const useToast = () => { const context = useContext(ToastContext); if (!context) { throw new Error('useToast must be used within ToastProvider'); } return context; }; interface ToastProviderProps { children: ReactNode; } export const ToastProvider: React.FC = ({ children }) => { const [toasts, setToasts] = useState([]); const showToast = useCallback((message: string, type: ToastType = 'info', duration: number = 3000) => { const id = `toast-${Date.now()}-${Math.random()}`; const toast: Toast = { id, message, type, duration }; setToasts(prev => [...prev, toast]); if (duration > 0) { setTimeout(() => { hideToast(id); }, duration); } }, []); const hideToast = useCallback((id: string) => { setToasts(prev => prev.filter(t => t.id !== id)); }, []); const getIcon = (type: ToastType) => { switch (type) { case 'success': return ; case 'error': return ; case 'warning': return ; case 'info': return ; } }; return ( {children}
{toasts.map(toast => (
{getIcon(toast.type)}
{toast.message}
))}
); };