refactor(fileloader): extract createFileLoader hook from document/enrich pages

Move blob URL lifecycle management into a reusable createFileLoader()
hook that owns revoke-before-create and revoke-on-destroy. Replace
identical inline logic in documents/[id] and enrich/[id] with the hook.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-04-15 13:20:32 +02:00
parent dbf7f0bc16
commit 34e7436fdc
4 changed files with 154 additions and 62 deletions

View File

@@ -1,6 +1,7 @@
<script lang="ts">
import { enhance } from '$app/forms';
import { onMount, onDestroy, untrack } from 'svelte';
import { createFileLoader } from '$lib/hooks/useFileLoader.svelte';
import { m } from '$lib/paraglide/messages.js';
import DocumentViewer from '$lib/components/DocumentViewer.svelte';
import WhoWhenSection from '$lib/components/document/WhoWhenSection.svelte';
@@ -11,9 +12,7 @@ let { data, form } = $props();
const doc = $derived(data.document);
// File preview state
let fileUrl = $state('');
let fileError = $state('');
let isLoading = $state(false);
const fileLoader = createFileLoader();
let navHeight = $state(0);
onMount(() => {
@@ -27,30 +26,11 @@ let activeAnnotationPage = $state<number | null>(null);
$effect(() => {
if (doc?.id && doc?.filePath) {
loadFile(doc.id);
fileLoader.loadFile(`/api/documents/${doc.id}/file`);
}
});
async function loadFile(id: string) {
isLoading = true;
fileError = '';
if (fileUrl) URL.revokeObjectURL(fileUrl);
fileUrl = '';
try {
const response = await fetch(`/api/documents/${id}/file`);
if (!response.ok) throw new Error('Fehler');
const blob = await response.blob();
fileUrl = URL.createObjectURL(blob);
} catch {
fileError = m.doc_file_error_preview();
} finally {
isLoading = false;
}
}
onDestroy(() => {
if (fileUrl) URL.revokeObjectURL(fileUrl);
});
onDestroy(() => fileLoader.destroy());
// Form state
let tags = $state(untrack(() => doc.tags?.map((t: { name: string }) => t.name) ?? []));
@@ -93,9 +73,9 @@ let selectedReceivers = $state(untrack(() => doc.receivers ?? []));
<div class="relative flex-[6] overflow-hidden border-r border-line">
<DocumentViewer
doc={doc}
fileUrl={fileUrl}
isLoading={isLoading}
error={fileError}
fileUrl={fileLoader.fileUrl}
isLoading={fileLoader.isLoading}
error={fileLoader.fileError}
bind:annotateMode={annotateMode}
bind:activeAnnotationId={activeAnnotationId}
bind:activeAnnotationPage={activeAnnotationPage}