import { createContext, useCallback, useContext, useState } from 'react' import { cn } from '@/lib/utils' import { X, CheckCircle, AlertTriangle, Info, AlertCircle } from 'lucide-react' type ToastVariant = 'success' | 'error' | 'warning' | 'info' interface Toast { id: string message: string variant: ToastVariant } interface ToastContextValue { toasts: Toast[] addToast: (message: string, variant?: ToastVariant) => void removeToast: (id: string) => void } const ToastContext = createContext(null) export function useToast() { const context = useContext(ToastContext) if (!context) { throw new Error('useToast must be used within a ToastProvider') } return context } export function ToastProvider({ children }: { children: React.ReactNode }) { const [toasts, setToasts] = useState([]) const removeToast = useCallback((id: string) => { setToasts((prev) => prev.filter((t) => t.id !== id)) }, []) const addToast = useCallback( (message: string, variant: ToastVariant = 'info') => { const id = crypto.randomUUID() setToasts((prev) => [...prev, { id, message, variant }]) setTimeout(() => removeToast(id), 5000) }, [removeToast] ) return ( {children} ) } function ToastContainer({ toasts, onRemove, }: { toasts: Toast[] onRemove: (id: string) => void }) { if (toasts.length === 0) return null return (
{toasts.map((toast) => ( ))}
) } const variantStyles: Record; container: string }> = { success: { icon: CheckCircle, container: 'bg-green-50 border-green-200 text-green-800 dark:bg-green-950 dark:border-green-800 dark:text-green-200', }, error: { icon: AlertCircle, container: 'bg-red-50 border-red-200 text-red-800 dark:bg-red-950 dark:border-red-800 dark:text-red-200', }, warning: { icon: AlertTriangle, container: 'bg-yellow-50 border-yellow-200 text-yellow-800 dark:bg-yellow-950 dark:border-yellow-800 dark:text-yellow-200', }, info: { icon: Info, container: 'bg-blue-50 border-blue-200 text-blue-800 dark:bg-blue-950 dark:border-blue-800 dark:text-blue-200', }, } function ToastItem({ toast, onRemove, }: { toast: Toast onRemove: (id: string) => void }) { const config = variantStyles[toast.variant] const Icon = config.icon return (

{toast.message}

) }