diff --git a/src/components/json.tsx b/src/components/json.tsx --- a/src/components/json.tsx +++ b/src/components/json.tsx @@ -3,12 +3,11 @@ import { createContext, createEffect, + createResource, createSignal, ErrorBoundary, For, on, - onCleanup, - onMount, Show, useContext, } from "solid-js"; @@ -263,26 +262,21 @@ (blob.mimeType.startsWith("image/") || blob.mimeType === "video/mp4"); const MediaDisplay = () => { - const [imageObjectUrl, setImageObjectUrl] = createSignal(); + const [imageUrl] = createResource( + () => (blob.mimeType.startsWith("image/") ? blob.ref.$link : null), + async (cid) => { + const url = `https://${pds()}/xrpc/com.atproto.sync.getBlob?did=${ctx.repo}&cid=${cid}`; - onMount(() => { - if (blob.mimeType.startsWith("image/")) { - const fetchImage = async () => { - const res = await fetch( - `https://${pds()}/xrpc/com.atproto.sync.getBlob?did=${ctx.repo}&cid=${blob.ref.$link}`, - ); - if (!res.ok) throw new Error(res.statusText); - const blobData = await res.blob(); - const url = URL.createObjectURL(blobData); - setImageObjectUrl(url); - }; - fetchImage().catch((err) => console.error("Failed to load image:", err)); - } - }); + await new Promise((resolve) => { + const img = new Image(); + img.src = url; + img.onload = () => resolve(); + img.onerror = () => resolve(); + }); - onCleanup(() => { - if (imageObjectUrl()) URL.revokeObjectURL(imageObjectUrl()!); - }); + return url; + }, + ); return (
@@ -290,7 +284,7 @@ @@ -299,7 +293,7 @@ > setMediaLoaded(true)} />