From 2adcc217aff0ef3ed20e9e8f10b7fee0860b0a40 Mon Sep 17 00:00:00 2001 From: TekH Date: Wed, 16 Jul 2025 15:26:51 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Unterst=C3=BCtzung=20von=20asynchroner?= =?UTF-8?q?=20Dateneingabe=20f=C3=BCr=20DocFullView=20Komponente=20-=20Doc?= =?UTF-8?q?FullView=20aktualisiert,=20um=20Daten=20als=20Uint8Array=20oder?= =?UTF-8?q?=20Promise=20zu=20akzeptieren=20-=20Asynchrones=20H?= =?UTF-8?q?andling=20in=20useEffect=20hinzugef=C3=BCgt,=20um=20Daten=20vor?= =?UTF-8?q?=20der=20Erstellung=20der=20Objekt-URL=20aufzul=C3=B6sen=20-=20?= =?UTF-8?q?Verbesserte=20Bereinigungslogik,=20um=20die=20Objekt-URL=20rich?= =?UTF-8?q?tig=20zu=20widerrufen=20-=20Ge=C3=A4nderte=20Format-Prop=20ist?= =?UTF-8?q?=20nun=20erforderlich?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sections/document/view/doc-full-view.tsx | 33 ++++++++++++++----- .../src/services/document-service.ts | 11 ++++--- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/client/dd-hub-react/src/sections/document/view/doc-full-view.tsx b/src/client/dd-hub-react/src/sections/document/view/doc-full-view.tsx index 0b73b23..3d0de4a 100644 --- a/src/client/dd-hub-react/src/sections/document/view/doc-full-view.tsx +++ b/src/client/dd-hub-react/src/sections/document/view/doc-full-view.tsx @@ -26,8 +26,8 @@ const getMimeType = (format: FileFormat): string => { }; type DocFullViewProps = { - data: Uint8Array; - format?: FileFormat; + data: Uint8Array | Promise; + format: FileFormat; open: boolean; handleClose: () => void; } @@ -46,16 +46,31 @@ export default function DocFullView({ data, format, open, handleClose }: DocFull const [objectUrl, setObjectUrl] = useState(null); useEffect(() => { - if (!data || !format) - return undefined; + let isMounted = true; + let url: string | null = null; - const mimeType = getMimeType(format); - const blob = new Blob([data], { type: mimeType }); - const url = URL.createObjectURL(blob); - setObjectUrl(url); + const processData = async () => { + try { + const resolvedData = await data; + const mimeType = getMimeType(format); + const blob = new Blob([resolvedData], { type: mimeType }); + url = URL.createObjectURL(blob); + + if (isMounted) { + setObjectUrl(url); + } + } catch (err) { + console.error('Data resolution error:', err); + } + }; + + processData(); return () => { - URL.revokeObjectURL(url); + isMounted = false; + if (url) { + URL.revokeObjectURL(url); + } }; }, [data, format]); diff --git a/src/client/dd-hub-react/src/services/document-service.ts b/src/client/dd-hub-react/src/services/document-service.ts index 1aa9c38..8e94193 100644 --- a/src/client/dd-hub-react/src/services/document-service.ts +++ b/src/client/dd-hub-react/src/services/document-service.ts @@ -1,4 +1,4 @@ -import { _documents } from "src/_mock" +import { _documents, _genFile } from "src/_mock" export type FileFormat = | 'pdf' @@ -37,13 +37,16 @@ export class Doc { id!: number; name!: string; - data!: Uint8Array; addedWhen!: Date; addedWho!: string; changedWhen?: Date; changedWho?: string; attributes: Array = []; + get data(): Promise { + return Promise.resolve(_genFile(this.name)!); + } + getChangedInfo(separator: string = " | "): string | null { const who = this.changedWho?.trim(); const when = this.changedWhen?.toLocaleDateString('de-DE'); @@ -55,7 +58,7 @@ export class Doc { return [who, when].filter(Boolean).join(separator); } - get extension(): FileFormat | undefined { + get extension(): FileFormat { const parts = this.name.split('.'); if (parts.length > 1 && parts[parts.length - 1].trim() !== '') { const ext = parts[parts.length - 1].toLowerCase(); @@ -63,7 +66,7 @@ export class Doc { if (validExtensions.includes(ext as FileFormat)) return ext as FileFormat; } - return undefined; + throw new Error(`Invalid or missing file extension in filename: "${this.name}". Supported extensions are: ${validExtensions.join(', ')}.`); } get iconSrc(): string {