import { createPubSub } from "../utils/pubsub.js"; import { CheckSVG, InfoSVG, ProblemSVG } from "./svg.js"; type MessageType = "info" | "success" | "warning"; interface IMessage { type: MessageType; text: string; } export const toastPubSub = createPubSub(); const { useCallback, useEffect, useRef, useState } = React; const box = { id: 0 }; export const Toast: React.FC = () => { const self = useRef(Symbol(Toast.name)); interface IToast extends IMessage { id: number; } const [toastQueue, setToastQueue] = useState([]); useEffect(() => { toastPubSub.sub(self.current, (data) => { setToastQueue((queue) => [{ id: box.id++, ...data }, ...queue]); }); }, []); const onAnimationEnd = useCallback((ev: React.AnimationEvent) => { if (ev.animationName === "slide-out-right") { setToastQueue((queue) => queue.slice(0, -1)); } }, []); const ToastIter = useCallback((toast: IToast) => { const badge = { info: , success: , warning: , }[toast.type]; return (
{badge}
{toast.text}
); }, []); return (
{toastQueue.map(ToastIter)}
); };