'use client' import { useEffect } from 'react' export type ScanEvent = { id: string scanStatus: 'PENDING' | 'CLEAN' | 'BLOCKED' | 'FAILED' scanMessage: string | null mimeType: string sizeBytes: number blurhash: string | null width: number | null height: number | null hasThumb: boolean } /** * Hört auf das Ende von Dateiprüfungen. * * Eine einzige Verbindung je Seite, vom Browser selbst wieder aufgebaut, wenn * sie abreisst. Kein Abfragen im Sekundentakt: eine Prüfung dauert je nach * Dateigrösse zwischen einer und dreissig Sekunden, und solange im Leerlauf zu * fragen wäre auf einem Heimserver unhöflich. */ export function useScanEvents(onScanned: (event: ScanEvent) => void): void { useEffect(() => { const quelle = new EventSource('/api/events') const handler = (message: MessageEvent) => { try { onScanned(JSON.parse(message.data) as ScanEvent) } catch { // Kaputte Nutzlast ignorieren, der nächste Seitenaufbau hat den Stand. } } quelle.addEventListener('attachment.scanned', handler as EventListener) return () => { quelle.removeEventListener('attachment.scanned', handler as EventListener) quelle.close() } }, [onScanned]) }