fix: Kennzahlen mit Timeout laden, ungültige Seitenbereiche als 400 melden

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bjoernpoettkerandClaude Opus 5.5 committed 2026-11-02 14:22:44 +01:00
1 parent 32b5228f68
commit 79dadb9c93
3 files changed
+70 -6

No files matched your search

@@ -3,6 +3,25 @@ import { Alert, Button, Modal, Space, Spin, Tag, Typography, message } from 'ant
import { paperlessApi, type BelegnummerPruefung, type VergleichKennzahlen } from '../api/paperless';
import { useIsMobile } from '../hooks/useIsMobile';
/** Länger wird auf Seiten-/Wortzahl nicht gewartet – der Vergleich bleibt trotzdem möglich. */
const KENNZAHLEN_TIMEOUT_MS = 30000;
function mitTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
return new Promise<T>((resolve, reject) => {
const timer = setTimeout(() => reject(new Error('Zeitüberschreitung')), ms);
promise.then(
(wert) => {
clearTimeout(timer);
resolve(wert);
},
(err: unknown) => {
clearTimeout(timer);
reject(err instanceof Error ? err : new Error(String(err)));
},
);
});
}
export interface DuplikatVergleichModalProps {
open: boolean;
belegnummer: string;
@@ -70,6 +89,7 @@ export function DuplikatVergleichModal({
const [vorhandenUrl, setVorhandenUrl] = useState<string | null>(null);
const [neuUrl, setNeuUrl] = useState<string | null>(null);
const [kennzahlen, setKennzahlen] = useState<VergleichKennzahlen | null>(null);
const [kennzahlenFehler, setKennzahlenFehler] = useState(false);
const [loading, setLoading] = useState(false);
useEffect(() => {
@@ -79,6 +99,7 @@ export function DuplikatVergleichModal({
let urlNeu: string | null = null;
setLoading(true);
setKennzahlen(null);
setKennzahlenFehler(false);
(async () => {
try {
const [altBlob, neuBlob] = await Promise.all([paperlessApi.getDocumentPdfBlob(paperlessDocumentId), ladeNeuesPdf()]);
@@ -93,12 +114,12 @@ export function DuplikatVergleichModal({
if (!cancelled) setLoading(false);
}
})();
ladeKennzahlen()
mitTimeout(ladeKennzahlen(), KENNZAHLEN_TIMEOUT_MS)
.then((k) => {
if (!cancelled) setKennzahlen(k);
})
.catch(() => {
if (!cancelled) message.warning('Seiten- und Wortzahl konnten nicht ermittelt werden');
if (!cancelled) setKennzahlenFehler(true);
});
return () => {
cancelled = true;
@@ -114,7 +135,11 @@ export function DuplikatVergleichModal({
const versionMoeglich = pruefung?.status === 'eindeutig';
let auffaelligkeiten: ReactNode = <Spin size="small" />;
if (kennzahlen) {
if (kennzahlenFehler) {
auffaelligkeiten = (
<Alert type="warning" showIcon message="Seiten- und Wortzahl konnten nicht ermittelt werden – bitte die PDFs direkt vergleichen." />
);
} else if (kennzahlen) {
const { vorhanden, neu } = kennzahlen;
const alleBekannt = [vorhanden.seiten, neu.seiten, vorhanden.woerter, neu.woerter].every((w) => w !== null);
const gleich = alleBekannt && vorhanden.seiten === neu.seiten && vorhanden.woerter === neu.woerter;