From c67d03fba0c1cc2fae9e8da4c7dedb41ea22d03f Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Mar 2026 23:53:50 -0800 Subject: render imeta media directly instead of routing through parseContent Co-Authored-By: Claude Opus 4.6 --- src/components/ChatMessage.svelte | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/components/ChatMessage.svelte b/src/components/ChatMessage.svelte index 8dc276e8..53baafcd 100644 --- a/src/components/ChatMessage.svelte +++ b/src/components/ChatMessage.svelte @@ -3,25 +3,18 @@ let { content, tags = [] }: { content: string; tags?: any[] } = $props(); - // Parse imeta tags for URLs and MIME types - let imeta = $derived( + // Extract media from imeta tags (NIP-92) + let imetaMedia = $derived( tags .filter((t) => t[0] === "imeta") - .map((t) => { - const url = t.find((v) => v.startsWith("url "))?.slice(4); - const mime = t.find((v) => v.startsWith("m "))?.slice(2) || ""; - return { url, mime }; - }) - .filter((m): m is { url: string; mime: string } => !!m.url), + .map((t) => ({ + url: t.find((v) => v.startsWith("url "))?.slice(4) || "", + mime: t.find((v) => v.startsWith("m "))?.slice(2) || "", + })) + .filter((m) => m.url), ); - // URLs from imeta not already in content - let imetaUrls = $derived(imeta.filter((m) => !content.includes(m.url!)).map((m) => m.url)); - - // Check if a URL is an image according to imeta MIME types - const isImetaImage = (url: string) => imeta.some((m) => m.url === url && m.mime.startsWith("image/")); - - let parts = $derived(parseContent({ content: [content, ...imetaUrls].join("\n"), tags })); + let parts = $derived(parseContent({ content, tags })); const truncUrl = (url: string) => { const short = url.replace(/^https?:\/\/(www\.)?/, ""); @@ -40,13 +33,26 @@ }; +{#each imetaMedia as media} + {#if media.mime.startsWith("image/")} + + + + {:else if media.mime.startsWith("video/")} + + + {:else} + {truncUrl(media.url)} + {/if} +{/each} + {#each parts as { type, value }} {#if type === "text"} {value} {:else if type === "newline"}
{:else if type === "link"} - {#if isImage(value.url) || isImetaImage(value.url)} + {#if isImage(value.url)} -- cgit v1.2.3