2 import { ActionIcon, ChatMessageEditForm, ChatMessageUserBubble } from '$lib/components/app';
3 import { fadeInView } from '$lib/actions/fade-in-view.svelte';
4 import { ArrowUp, Edit, Trash2 } from '@lucide/svelte';
5 import { getProcessingInfoContext } from '$lib/contexts';
6 import { useMessageEditContext } from '$lib/hooks/use-message-edit-context.svelte';
11 extras?: DatabaseMessageExtra[];
12 onSendImmediately: () => void;
13 onEdit: (newContent: string, extras?: DatabaseMessageExtra[]) => void;
18 class: className = '',
26 const processingInfoCtx = getProcessingInfoContext();
27 let showProcessingInfo = $derived(processingInfoCtx.showProcessingInfo);
29 const editCtx = useMessageEditContext({
30 getContent: () => content,
31 getExtras: () => extras,
32 onSave: (content, extras) => onEdit(content, extras)
38 aria-label="Pending user message"
39 class="group flex flex-col items-end gap-3 transition-opacity hover:opacity-80 md:gap-2 {className} sticky {showProcessingInfo
44 {#if editCtx.isEditing}
45 <ChatMessageEditForm />
47 <ChatMessageUserBubble
50 textColorClass="text-muted-foreground"
51 cardBgClass="dark:bg-primary/8"
52 maxHeightStyle="overflow-wrap: anywhere; word-break: break-word;"
55 <div class="max-w-[80%]">
56 <div class="relative flex h-6 items-center justify-between">
57 <div class="right-0 flex items-center gap-2 opacity-100 transition-opacity">
59 class="pointer-events-auto inset-0 flex items-center gap-1 opacity-0 transition-all duration-150 group-focus-within:opacity-100 group-hover:opacity-100"
61 <ActionIcon icon={Edit} tooltip="Edit" onclick={editCtx.handleEdit} />
62 <ActionIcon icon={Trash2} tooltip="Delete" onclick={onDelete} />
63 <ActionIcon icon={ArrowUp} tooltip="Send immediately" onclick={onSendImmediately} />