import { useState, useEffect } from 'react'; import { CheckCircle, XCircle, Info, AlertTriangle, X } from 'lucide-react'; export type ToastType = 'success' | 'error' | 'info' | 'warning'; export interface ToastProps { id: string; message: string; type: ToastType; duration?: number; onClose: (id: string) => void; } const Toast = ({ id, message, type, duration = 3000, onClose }: ToastProps) => { const [isVisible, setIsVisible] = useState(false); useEffect(() => { // Exciting entrance requestAnimationFrame(() => setIsVisible(true)); if (duration > 0) { const timer = setTimeout(() => { setIsVisible(false); setTimeout(() => onClose(id), 300); // Wait for transition }, duration); return () => clearTimeout(timer); } }, [duration, id, onClose]); const getIcon = () => { switch (type) { case 'success': return ; case 'error': return ; case 'warning': return ; case 'info': default: return ; } }; const getStyles = () => { switch (type) { case 'success': return 'border-green-100 dark:border-green-900/30 bg-white dark:bg-base-100'; case 'error': return 'border-red-100 dark:border-red-900/30 bg-white dark:bg-base-100'; case 'warning': return 'border-yellow-100 dark:border-yellow-900/30 bg-white dark:bg-base-100'; case 'info': default: return 'border-blue-100 dark:border-blue-900/30 bg-white dark:bg-base-100'; } }; return (
{getIcon()}

{message}

); }; export default Toast;