Skip to content

Commit defeddf

Browse files
committed
fix: display image thumbnails in pending message queue
Previously, QueuedMessageItem only rendered text content and ignored the files array, causing queued messages with only images to appear blank. Now passes files to the component and renders image thumbnails and file name indicators inline. Fixes open-webui#22256
1 parent c977674 commit defeddf

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

src/lib/components/chat/MessageInput.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,7 @@
11871187
<QueuedMessageItem
11881188
id={queuedMessage.id}
11891189
content={queuedMessage.prompt}
1190+
files={queuedMessage.files}
11901191
onSendNow={onQueueSendNow}
11911192
onEdit={onQueueEdit}
11921193
onDelete={onQueueDelete}

src/lib/components/chat/MessageInput/QueuedMessageItem.svelte

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
<script lang="ts">
22
import { getContext } from 'svelte';
33
import Tooltip from '$lib/components/common/Tooltip.svelte';
4+
import Image from '$lib/components/common/Image.svelte';
45
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
56
import EditPencil from '$lib/components/icons/EditPencil.svelte';
67
import ArrowForward from '$lib/components/icons/ArrowForward.svelte';
8+
import { WEBUI_API_BASE_URL } from '$lib/constants';
79
810
const i18n = getContext('i18n');
911
1012
export let id: string;
1113
export let content: string;
14+
export let files: any[] = [];
1215
export let onSendNow: (id: string) => void;
1316
export let onEdit: (id: string) => void;
1417
export let onDelete: (id: string) => void;
@@ -21,8 +24,34 @@
2124
</div>
2225

2326
<!-- Message content -->
24-
<div class="flex-1 min-w-0">
25-
<p class="text-sm text-gray-600 dark:text-gray-300 truncate">{content}</p>
27+
<div class="flex-1 min-w-0 flex items-center gap-2">
28+
{#if files.length > 0}
29+
<div class="flex items-center gap-1 shrink-0">
30+
{#each files as file}
31+
{#if file.type === 'image' || (file?.content_type ?? '').startsWith('image/')}
32+
{@const fileUrl =
33+
file.url?.startsWith('data') || file.url?.startsWith('http')
34+
? file.url
35+
: `${WEBUI_API_BASE_URL}/files/${file.url}${file?.content_type ? '/content' : ''}`}
36+
<Image
37+
src={fileUrl}
38+
alt=""
39+
imageClassName="size-6 rounded-md object-cover"
40+
/>
41+
{:else}
42+
<div class="flex items-center px-1.5 py-0.5 rounded-md bg-gray-100 dark:bg-gray-800 text-xs text-gray-500 dark:text-gray-400">
43+
<span class="max-w-[80px] truncate">{file.name ?? 'file'}</span>
44+
</div>
45+
{/if}
46+
{/each}
47+
</div>
48+
{/if}
49+
50+
{#if content}
51+
<p class="text-sm text-gray-600 dark:text-gray-300 truncate">{content}</p>
52+
{:else if files.length === 0}
53+
<p class="text-sm text-gray-400 dark:text-gray-500 truncate italic">{$i18n.t('Empty message')}</p>
54+
{/if}
2655
</div>
2756

2857
<!-- Actions -->

0 commit comments

Comments
 (0)