import { X } from 'lucide-react' import { FC, useEffect, useState } from 'react' export type ToastType = 'success' | 'error' | 'warning' | 'info' export interface Toast { id: string type: ToastType title?: string message: string duration?: number } interface ToastProps { toast: Toast onRemove: (id: string) => void } const ToastComponent: FC = ({ toast, onRemove }) => { const [isVisible, setIsVisible] = useState(false) const [isRemoving, setIsRemoving] = useState(false) useEffect(() => { // Показываем уведомление с анимацией setIsVisible(true) // Автоматическое скрытие const duration = toast.duration || 5000 const timer = setTimeout(() => { handleRemove() }, duration) return () => clearTimeout(timer) }, []) const handleRemove = () => { setIsRemoving(true) setTimeout(() => { onRemove(toast.id) }, 300) // Время анимации } const getTypeStyles = () => { switch (toast.type) { case 'success': return 'bg-green-50 border-green-200 text-green-800' case 'error': return 'bg-red-50 border-red-200 text-red-800' case 'warning': return 'bg-yellow-50 border-yellow-200 text-yellow-800' case 'info': return 'bg-blue-50 border-blue-200 text-blue-800' default: return 'bg-gray-50 border-gray-200 text-gray-800' } } const getIconColor = () => { switch (toast.type) { case 'success': return 'text-green-600' case 'error': return 'text-red-600' case 'warning': return 'text-yellow-600' case 'info': return 'text-blue-600' default: return 'text-gray-600' } } const getIcon = () => { switch (toast.type) { case 'success': return ( ) case 'error': return ( ) case 'warning': return ( ) case 'info': return ( ) } } return (
{getIcon()}
{toast.title && (

{toast.title}

)}
{toast.message}
) } interface ToastContainerProps { toasts: Toast[] onRemove: (id: string) => void } export const ToastContainer: FC = ({ toasts, onRemove, }) => { if (toasts.length === 0) return null return (
{toasts.map(toast => (
))}
) }