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>
42 lines
828 B
TypeScript
42 lines
828 B
TypeScript
export function createFileLoader() {
|
|
let fileUrl = $state('');
|
|
let isLoading = $state(false);
|
|
let fileError = $state('');
|
|
|
|
async function loadFile(url: string): Promise<void> {
|
|
isLoading = true;
|
|
fileError = '';
|
|
if (fileUrl) URL.revokeObjectURL(fileUrl);
|
|
fileUrl = '';
|
|
|
|
try {
|
|
const response = await fetch(url);
|
|
if (!response.ok) throw new Error('Failed to load file');
|
|
const blob = await response.blob();
|
|
fileUrl = URL.createObjectURL(blob);
|
|
} catch {
|
|
fileError = 'Vorschau konnte nicht geladen werden.';
|
|
} finally {
|
|
isLoading = false;
|
|
}
|
|
}
|
|
|
|
function destroy(): void {
|
|
if (fileUrl) URL.revokeObjectURL(fileUrl);
|
|
}
|
|
|
|
return {
|
|
get fileUrl() {
|
|
return fileUrl;
|
|
},
|
|
get isLoading() {
|
|
return isLoading;
|
|
},
|
|
get fileError() {
|
|
return fileError;
|
|
},
|
|
loadFile,
|
|
destroy
|
|
};
|
|
}
|