import { useCallback, useEffect, useState } from 'react'; import { InfoIcon, WarningIcon, ErrorIcon, CloseIcon } from '../icons'; export type ToastType = 'info' | 'warning' | 'error'; export interface ToastProps { id: string; type: ToastType; message: string; duration?: number; onClose?: (id: string) => void; } const getToastStyles = (_type: ToastType) => { const baseStyles = 'flex items-center gap-3 rounded-lg border-l-4 p-4 shadow-lg transition-all duration-300'; const typeStyles = { info: 'border-secondary-500 bg-secondary-100', warning: 'border-yellow-500 bg-yellow-100', error: 'border-red-500 bg-red-100', }; const iconStyles = { info: 'text-secondary-700', warning: 'text-yellow-700', error: 'text-red-700', }; const textStyles = { info: 'text-secondary-900', warning: 'text-yellow-900', error: 'text-red-900', }; return { baseStyles, typeStyles, iconStyles, textStyles }; }; export function Toast({ id, type, message, duration = 5000, onClose }: ToastProps) { const [isVisible, setIsVisible] = useState(true); const [isAnimatingOut, setIsAnimatingOut] = useState(false); const { baseStyles, typeStyles, iconStyles, textStyles } = getToastStyles(type); const handleClose = useCallback(() => { setIsAnimatingOut(true); setTimeout(() => { setIsVisible(false); onClose?.(id); }, 300); }, [id, onClose]); useEffect(() => { if (duration > 0) { const timer = setTimeout(handleClose, duration); return () => clearTimeout(timer); } }, [duration, handleClose]); if (!isVisible) { return null; } const icons = { info: , warning: , error: , }; return (
{icons[type]}

{message}

); }