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:
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;
|
||||
|
||||
Reference in new issue
Block a user