import { useEffect, useState } from 'react'; import { BUCKET_REFERENZEN, dateiUrl } from './dateien'; /** * Bildquelle für ein geschütztes Appwrite-File – **Web**. * Gegenstück: `bildquelle.ts`. * * Warum nicht einfach die URL ins ``: Ein `` schickt bei einer * site-fremden Anfrage die Appwrite-Session nicht mit, das Bild bleibt leer. * Im Betrieb liegen App und Appwrite unter derselben Domain (`webklar.com`), * dort wäre das kein Thema – in der Entwicklung läuft die App aber auf * `localhost`, und dann ist jede Anfrage site-fremd. * * Deshalb wird die Datei einmal per `fetch` mit `credentials: 'include'` * geholt und als Object-URL gerendert. Das funktioniert in beiden Fällen und * spart die Sonderbehandlung „nur lokal kaputt". */ export function useBildQuelle( fileId?: string, bucketId: string = BUCKET_REFERENZEN, ): { uri: string } | undefined { const [uri, setUri] = useState(); useEffect(() => { if (!fileId) { setUri(undefined); return; } let abgebrochen = false; let objectUrl: string | undefined; fetch(dateiUrl(fileId, bucketId), { credentials: 'include' }) .then((r) => (r.ok ? r.blob() : Promise.reject(new Error(`HTTP ${r.status}`)))) .then((blob) => { if (abgebrochen) return; objectUrl = URL.createObjectURL(blob); setUri(objectUrl); }) .catch(() => { if (!abgebrochen) setUri(undefined); }); return () => { abgebrochen = true; if (objectUrl) URL.revokeObjectURL(objectUrl); }; }, [fileId, bucketId]); return uri ? { uri } : undefined; }