import { useEffect, useState, useSyncExternalStore } from "react"; import { CheckCircle2, CircleX, Info, X } from "lucide-react"; import { dismissToast, snapshot, subscribe, type ToastItem, type ToastVariant } from "@/client/lib/toast"; function ToastCard({ item }: { item: ToastItem }) { const [visible, setVisible] = useState(true); useEffect(() => { if (item.variant === "error") return; const timeout = window.setTimeout(() => { setVisible(false); window.setTimeout(() => dismissToast(item.id), 200); }, 4000); return () => window.clearTimeout(timeout); }, [item.id, item.variant]); const styles: Record = { success: { ring: "border-emerald-500/20 bg-emerald-500/10 text-emerald-100", iconClass: "text-emerald-400", Icon: CheckCircle2, }, error: { ring: "border-red-500/20 bg-red-500/10 text-red-100", iconClass: "text-red-400", Icon: CircleX }, info: { ring: "border-accent-500/20 bg-accent-500/10 text-accent-50", iconClass: "text-accent-400", Icon: Info, }, }; const { ring, iconClass, Icon } = styles[item.variant]; return (
); } export function ToastContainer() { const current = useSyncExternalStore(subscribe, snapshot, snapshot); if (current.length === 0) return null; return (
{current.map((item) => (
))}
); }