import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { type CrashEntry, subscribeCrashes } from '../lib/crashRecovery'; import { AlertIcon, XIcon } from './icons'; const VISIBLE_MS = 7_000; const MAX_STACK = 3; // Bottom-right stack of toasts for uncaught errors. Auto-dismisses each // entry after VISIBLE_MS. The user can X-out earlier. export function CrashToast() { const [entries, setEntries] = useState([]); useEffect( () => subscribeCrashes((entry) => { setEntries((prev) => [...prev.slice(-(MAX_STACK - 1)), entry]); }), [], ); useEffect(() => { if (entries.length === 0) return; const latest = entries[entries.length - 1]!; const id = window.setTimeout(() => { setEntries((prev) => prev.filter((e) => e.id !== latest.id)); }, VISIBLE_MS); return () => window.clearTimeout(id); }, [entries]); if (entries.length === 0) return null; return createPortal(
{entries.map((entry) => (

{entry.source === 'promise' ? 'Promise-Fehler' : 'Unerwarteter Fehler'}

{entry.message}

))}
, document.body, ); }