// Kurze Rückmeldungen nach einer Aktion („Dienst neu gestartet“). Außerhalb von React // gehalten, damit jede Stelle melden kann, ohne einen Kontext durchzureichen. import { useSyncExternalStore } from "react" export type MeldungsArt = "erfolg" | "fehler" | "info" export interface Meldung { id: number art: MeldungsArt text: string } let meldungen: Meldung[] = [] let naechste = 1 const hoerer = new Set<() => void>() const melde = () => hoerer.forEach((h) => h()) export function melden(art: MeldungsArt, text: string) { const id = naechste++ meldungen = [...meldungen, { id, art, text }].slice(-4) melde() // Fehler bleiben, bis man sie wegklickt — die will man lesen können. if (art !== "fehler") window.setTimeout(() => entfernen(id), 6000) } export function entfernen(id: number) { meldungen = meldungen.filter((m) => m.id !== id) melde() } export const useMeldungen = () => useSyncExternalStore( (h) => { hoerer.add(h) return () => { hoerer.delete(h) } }, () => meldungen, )