From 723de07a43edb2b679e4d58928c669fec2371c71 Mon Sep 17 00:00:00 2001 From: Iokin Pardo Date: Thu, 20 Nov 2025 23:04:24 +0100 Subject: [PATCH] Allow sending file uploads without typed message --- README.md | 8 ++++++++ src/components/Bot.tsx | 30 +++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7f11d5e5d..8d4fb3106 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,14 @@ Build: yarn build ``` +## Features + +### File-only uploads + +- **Purpose:** Allow users to send uploaded files immediately without having to type a companion message. +- **Usage example:** Upload a document via the **File Upload** button and click **Send** right away; the embed will deliver the files to your Agentflow conversation and, if a text prompt is required, automatically include a hidden `file uploaded` message for you. +- **Dependencies / breaking changes:** No additional configuration is required; the behavior is backward compatible with existing upload settings. + ## Embed in your HTML ### PopUp diff --git a/src/components/Bot.tsx b/src/components/Bot.tsx index 0395cf368..19be4eaca 100644 --- a/src/components/Bot.tsx +++ b/src/components/Bot.tsx @@ -1029,17 +1029,27 @@ export const Bot = (botProps: BotProps & { class?: string }) => { // Handle form submission const handleSubmit = async (value: string | object, action?: IAction | undefined | null, humanInput?: any) => { - if (typeof value === 'string' && value.trim() === '') { + const fileUploadFallbackMessage = 'file uploaded'; + let submissionValue: string | object = value; + let formData = {}; + + if (typeof submissionValue === 'string') { + const trimmedValue = submissionValue.trim(); + const hasUploads = previews().length > 0; const containsFile = previews().filter((item) => !item.mime.startsWith('image') && item.type !== 'audio').length > 0; - if (!previews().length || (previews().length && containsFile)) { + + if (!hasUploads && trimmedValue === '') { return; } + + if (trimmedValue === '' && hasUploads && containsFile) { + submissionValue = fileUploadFallbackMessage; + } } - let formData = {}; - if (typeof value === 'object') { - formData = value; - value = Object.entries(value) + if (typeof submissionValue === 'object') { + formData = submissionValue; + submissionValue = Object.entries(submissionValue) .map(([key, value]) => `${key}: ${value}`) .join('\n'); } @@ -1065,14 +1075,16 @@ export const Bot = (botProps: BotProps & { class?: string }) => { clearPreviews(); + const messageToDisplay = typeof value === 'string' ? value : (submissionValue as string); + setMessages((prevMessages) => { - const messages: MessageType[] = [...prevMessages, { message: value as string, type: 'userMessage', fileUploads: uploads }]; + const messages: MessageType[] = [...prevMessages, { message: messageToDisplay as string, type: 'userMessage', fileUploads: uploads }]; addChatMessage(messages); return messages; }); const body: IncomingInput = { - question: value, + question: submissionValue, chatId: chatId(), }; @@ -1134,7 +1146,7 @@ export const Bot = (botProps: BotProps & { class?: string }) => { return allMessages; }); - updateMetadata(data, value); + updateMetadata(data, submissionValue); setLoading(false); setUserInput('');