ki integration
This commit is contained in:
1 parent
82d98bd8cf
commit
9ecb292c26
78 files changed
+12055
-55
No files matched your search
@@ -0,0 +1,51 @@
|
||||
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 `<img>`: Ein `<img>` 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<string>();
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in new issue
Block a user