'use client'; import { useEffect, useState } from 'react'; import { X, CheckCircle, AlertCircle, Info, AlertTriangle } from 'lucide-react'; import type { Notification } from '@/lib/notifications'; /* ── Icons ── */ const ICONS: Record = { success: { icon: CheckCircle, color: 'text-accent-green' }, error: { icon: AlertCircle, color: 'text-accent-rose' }, info: { icon: Info, color: 'text-accent-cyan' }, warning: { icon: AlertTriangle,color: 'text-accent-amber' }, }; /* ════════════════════════════ Toast ════════════════════════════ */ export default function Toast({ notification, onDismiss, }: { notification: Notification; onDismiss: (id: string) => void; }) { const [visible, setVisible] = useState(false); const [progress, setProgress] = useState(100); const { icon: Icon, color } = ICONS[notification.type]; const duration = notification.duration ?? 4000; /* ── Enter animation ── */ useEffect(() => { requestAnimationFrame(() => setVisible(true)); }, []); /* ── Progress bar ── */ useEffect(() => { if (duration <= 0) return; const start = Date.now(); const frame = () => { const elapsed = Date.now() - start; const pct = Math.max(0, 100 - (elapsed / duration) * 100); setProgress(pct); if (pct > 0) requestAnimationFrame(frame); }; const raf = requestAnimationFrame(frame); return () => cancelAnimationFrame(raf); }, [duration]); return (
{/* Icon */}
{/* Content */}

{notification.title}

{notification.message && (

{notification.message}

)} {/* Progress bar */} {duration > 0 && (
)}
{/* Close */}
); }