diff --git a/web-app/src/containers/ThreadContent.tsx b/web-app/src/containers/ThreadContent.tsx index 0316ee764..ede897624 100644 --- a/web-app/src/containers/ThreadContent.tsx +++ b/web-app/src/containers/ThreadContent.tsx @@ -71,7 +71,7 @@ export const ThreadContent = memo( streamTools?: any contextOverflowModal?: React.ReactNode | null - updateMessage?: (item: ThreadMessage, message: string) => void + updateMessage?: (item: ThreadMessage, message: string, imageUrls?: string[]) => void } ) => { const { t } = useTranslation() @@ -276,9 +276,10 @@ export const ThreadContent = memo( item.content?.find((c) => c.type === 'text')?.text?.value || '' } - onSave={(message) => { + imageUrls={item.content?.filter((c) => c.type === 'image_url' && c.image_url?.url).map((c) => c.image_url!.url)} + onSave={(message, imageUrls) => { if (item.updateMessage) { - item.updateMessage(item, message) + item.updateMessage(item, message, imageUrls) } }} /> diff --git a/web-app/src/containers/dialogs/EditMessageDialog.tsx b/web-app/src/containers/dialogs/EditMessageDialog.tsx index ade50befe..2df850023 100644 --- a/web-app/src/containers/dialogs/EditMessageDialog.tsx +++ b/web-app/src/containers/dialogs/EditMessageDialog.tsx @@ -11,7 +11,7 @@ import { } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Textarea } from '@/components/ui/textarea' -import { IconPencil } from '@tabler/icons-react' +import { IconPencil, IconX } from '@tabler/icons-react' import { Tooltip, TooltipContent, @@ -20,23 +20,27 @@ import { interface EditMessageDialogProps { message: string - onSave: (message: string) => void + imageUrls?: string[] + onSave: (message: string, imageUrls?: string[]) => void triggerElement?: React.ReactNode } export function EditMessageDialog({ message, + imageUrls, onSave, triggerElement, }: EditMessageDialogProps) { const { t } = useTranslation() const [isOpen, setIsOpen] = useState(false) const [draft, setDraft] = useState(message) + const [keptImages, setKeptImages] = useState(imageUrls || []) const textareaRef = useRef(null) useEffect(() => { setDraft(message) - }, [message]) + setKeptImages(imageUrls || []) + }, [message, imageUrls]) useEffect(() => { if (isOpen && textareaRef.current) { @@ -48,8 +52,15 @@ export function EditMessageDialog({ }, [isOpen]) const handleSave = () => { - if (draft !== message && draft.trim()) { - onSave(draft) + const hasTextChanged = draft !== message && draft.trim() + const hasImageChanged = + JSON.stringify(imageUrls || []) !== JSON.stringify(keptImages) + + if (hasTextChanged || hasImageChanged) { + onSave( + draft.trim() || message, + keptImages.length > 0 ? keptImages : undefined + ) setIsOpen(false) } } @@ -64,7 +75,7 @@ export function EditMessageDialog({ const defaultTrigger = ( -
{t('common:dialogs.editMessage.title')} + {keptImages.length > 0 && ( +
+
+ {keptImages.map((imageUrl, index) => ( +
+ {`Attached +
+ setKeptImages((prev) => + prev.filter((_, i) => i !== index) + ) + } + > + +
+
+ ))} +
+
+ )}