'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 function ExportPanel({ target, topic, }: { target: { kind: 'CASE'; caseNumber: string } | { kind: 'DOCUMENT'; documentNumber: string } /** Eigenes Nutzerthema: der Export geht nur den Auftraggeber an. */ topic: string }) { 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' ? ( ) : ( )}
{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}
) }