import { useAppearance } from "../lib/appearance"; import { CircleCheckIcon, InfoIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon, } from "lucide-react"; import { useEffect, useState, useSyncExternalStore } from "react"; import { Toaster as Sonner, type ToasterProps } from "sonner"; import { OPENGENI_TOASTER_ID, retainEmbeddedToaster, showsEmbeddedToasts, subscribeEmbeddedToasters, } from "../lib/toast"; /** * The page's toaster. `embedded` keeps the session UI's toasts apart from * the host page's own sonner toasts (see lib/toast). */ const Toaster = ({ embedded = false, ...props }: ToasterProps & { embedded?: boolean }) => { const { resolvedTheme } = useAppearance(); const [owner] = useState(() => Symbol("toaster")); useEffect(() => (embedded ? retainEmbeddedToaster(owner) : undefined), [embedded, owner]); const shows = useSyncExternalStore( subscribeEmbeddedToasters, () => !embedded || showsEmbeddedToasts(owner), () => !embedded, ); if (!shows) return null; return ( , info: , warning: , error: , loading: , }} style={ { "--normal-bg": "var(--og-color-surface-3)", "--normal-text": "var(--og-color-fg)", "--normal-border": "var(--og-color-border)", "--border-radius": "var(--og-radius-md)", } as React.CSSProperties } {...props} /> ); }; export { Toaster };