import { useEffect, useState, type ReactNode } from 'react'; import { Alert, Button, Modal, Space, Spin, Tag, Typography, message } from 'antd'; 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(promise: Promise, ms: number): Promise { return new Promise((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; /** eindeutig → Version möglich; mehrdeutig → nur Verwerfen */ pruefung: BelegnummerPruefung | null; /** Vorhandenes Dokument (linke Seite) */ paperlessDocumentId: number | null; /** Neuer Beleg (rechte Seite) */ ladeNeuesPdf: () => Promise; ladeKennzahlen: () => Promise; onVersion: () => void; onVerwerfen: () => void; onClose: () => void; } function KennzahlZeile({ label, vorhanden, neu }: { label: string; vorhanden: number | null; neu: number | null }) { const anzeige = (wert: number | null) => (wert === null ? 'nicht ermittelbar' : String(wert)); const vergleichbar = vorhanden !== null && neu !== null; const abweichung = vergleichbar && vorhanden !== neu; return (
{label}: {anzeige(vorhanden)} (vorhanden) → {anzeige(neu)} (neu){' '} {abweichung && abweichend} {!vergleichbar && nicht vergleichbar}
); } function PdfSpalte({ titel, url, loading }: { titel: string; url: string | null; loading: boolean }) { return (
{titel}
{loading || !url ? (
) : (