import React, { createContext, useContext, useState, useCallback, useEffect } from 'react' import { CheckCircle, XCircle, AlertCircle, Info, X } from 'lucide-react' type ToastType = 'success' | 'error' | 'warning' | 'info' interface Toast { id: number message: string type: ToastType duration: number removing: boolean } declare global { interface Window { __addToast?: (message: string, type?: ToastType, duration?: number) => number } } let toastIdCounter = 0 const ICON_COLORS: Record = { success: '#22c55e', error: '#ef4444', warning: '#f59e0b', info: '#6366f1', } export function ToastContainer() { const [toasts, setToasts] = useState([]) const addToast = useCallback((message: string, type: ToastType = 'info', duration: number = 3000) => { const id = ++toastIdCounter setToasts(prev => [...prev, { id, message, type, duration, removing: false }]) if (duration > 0) { setTimeout(() => { setToasts(prev => prev.map(t => t.id === id ? { ...t, removing: true } : t)) setTimeout(() => { setToasts(prev => prev.filter(t => t.id !== id)) }, 400) }, duration) } return id }, []) const removeToast = useCallback((id: number) => { setToasts(prev => prev.map(t => t.id === id ? { ...t, removing: true } : t)) setTimeout(() => { setToasts(prev => prev.filter(t => t.id !== id)) }, 400) }, []) useEffect(() => { window.__addToast = addToast return () => { delete window.__addToast } }, [addToast]) const icons: Record = { success: , error: , warning: , info: , } return ( <>
{toasts.map(toast => (
{icons[toast.type] || icons.info} {toast.message}
))}
) } export const useToast = () => { const show = useCallback((message: string, type: ToastType, duration?: number) => { if (window.__addToast) { window.__addToast(message, type, duration) } }, []) return { success: (message: string, duration?: number) => show(message, 'success', duration), error: (message: string, duration?: number) => show(message, 'error', duration), warning: (message: string, duration?: number) => show(message, 'warning', duration), info: (message: string, duration?: number) => show(message, 'info', duration), } } export default useToast