From 13b2a17e6f6ed1697c51a6650874313a6da4aa8f Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 7 Mar 2026 08:41:23 -0800 Subject: render decrypted images --- src/components/ChatMessage.svelte | 109 ++++++++++++++++++++++++++++++++++---- 1 file changed, 98 insertions(+), 11 deletions(-) (limited to 'src/components') diff --git a/src/components/ChatMessage.svelte b/src/components/ChatMessage.svelte index aeaac210..d28aefc4 100644 --- a/src/components/ChatMessage.svelte +++ b/src/components/ChatMessage.svelte @@ -1,14 +1,50 @@ -{#each imageUrls as url} - - - +{#each encryptedMedia as tag} + {#if decryptMedia} + {@const mime = getMime(tag)} + {#await decryptMedia(tag)} +
+ {:then blobUrl} + {#if mime.startsWith("image/")} + + + + {:else if mime.startsWith("video/")} + + + {:else if mime.startsWith("audio/")} + + {/if} + {:catch} + {@const url = tag.find((v) => v.startsWith("url "))?.slice(4) || ""} + {truncUrl(url)} + {/await} + {/if} +{/each} + +{#each plainMedia as media} + {#if media.mime.startsWith("image/")} + + + + {:else if media.mime.startsWith("video/")} + + + {:else if media.mime.startsWith("audio/")} + + {:else} + {truncUrl(media.url)} + {/if} {/each} {#each parts as { type, value }} @@ -42,7 +113,9 @@ {:else if type === "newline"}
{:else if type === "link"} - {#if isImage(value.url)} + {#if imetaUrls.has(value.url)} + + {:else if isImage(value.url)} @@ -78,6 +151,20 @@ margin: 4px 0; } + .chat-img-placeholder { + width: 200px; + height: 150px; + border-radius: 8px; + margin: 4px 0; + background: var(--bg-secondary, #e5e7eb); + animation: pulse 1.5s ease-in-out infinite; + } + + @keyframes pulse { + 0%, 100% { opacity: 0.5; } + 50% { opacity: 0.8; } + } + .chat-video { max-width: 100%; border-radius: 8px; -- cgit v1.2.3