'use client' import { useActionState, useEffect, useState } from 'react' import { exportText } from '@/lib/i18n/export' import { useStream } from '@/components/realtime/useStream' import { requestExportAction, type ExportState } from '@/app/(app)/export/actions' /** * Export anfordern und auf das Ergebnis warten. * * Kein Fortschrittsbalken, der eine Zahl erfindet: der Auftrag hat drei * Zustände, und die stehen da. Fertig meldet der Ereignisstrom, dann steht * der Knopf zum Herunterladen bereit - automatisch losladen wäre unhöflich, * wenn jemand die Seite inzwischen wieder verlassen hat und zurückkommt. */ export type ExportPanelTarget = | { kind: 'CASE'; caseNumber: string } | { kind: 'DOCUMENT'; documentNumber: string } | { kind: 'PERSONNEL'; personnelFileId: string } | { kind: 'DEPARTMENT'; departmentKey: string } export function ExportPanel({ target, topic, levels, defaultLevel, }: { target: ExportPanelTarget /** Eigenes Nutzerthema: der Export geht nur den Auftraggeber an. */ topic: string /** * Wählbare Höchststufen. Nur beim Dossier gesetzt - eine einzelne Akte hat * genau eine Stufe, da gäbe es nichts zu wählen. */ levels?: { level: number; name: string }[] defaultLevel?: number }) { const [state, action, pending] = useActionState( requestExportAction, null, ) const [fertig, setFertig] = useState(null) const [gescheitert, setGescheitert] = useState(false) useStream([topic], { 'export.ready': (data) => { const ereignis = data as { id: string } if (state?.jobId && ereignis.id !== state.jobId) return setFertig(ereignis.id) }, }) // Nach der Freigabe eines wartenden Auftrags kommt das Ereignis später; bis // dahin bleibt der Hinweis stehen. useEffect(() => { if (state?.status === 'READY' && state.jobId) setFertig(state.jobId) if (state?.status === 'FAILED') setGescheitert(true) }, [state]) const wartetAufFreigabe = state?.status === 'PENDING_APPROVAL' return (
{target.kind === 'CASE' ? ( ) : target.kind === 'DOCUMENT' ? ( ) : target.kind === 'PERSONNEL' ? ( ) : ( )} {levels ? (

{exportText.maxLevelHint}

) : null}
{state?.error ?

{state.error}

: null} {wartetAufFreigabe ? (

{exportText.waitingApproval}

{exportText.waitingApprovalHint}

) : null} {state?.jobId && !fertig && !wartetAufFreigabe && !gescheitert ? (

{exportText.preparing}

) : null} {gescheitert ?

{exportText.failed}

: null} {fertig ? ( {exportText.download} ) : null}
) }