From be85f7cc35707bf76bac28990748d465923e0861 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 10 May 2025 22:09:05 +0400 Subject: [PATCH 1/8] fix: confirm dialog focus --- .../components/common/ConfirmDialog.svelte | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/components/common/ConfirmDialog.svelte b/src/lib/components/common/ConfirmDialog.svelte index c5f23175c..29efc59e4 100644 --- a/src/lib/components/common/ConfirmDialog.svelte +++ b/src/lib/components/common/ConfirmDialog.svelte @@ -1,7 +1,9 @@ {#if show} From ba69c751ca0ec489604bedfa4041fc71a49e304c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 10 May 2025 22:12:36 +0400 Subject: [PATCH 2/8] refac: temporary chat behaviour --- src/lib/components/chat/Chat.svelte | 46 ++++++++++++++++------------- src/routes/(app)/+layout.svelte | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 5d11ce940..defeaf9cf 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -155,12 +155,14 @@ localStorage.getItem(`chat-input${chatIdProp ? `-${chatIdProp}` : ''}`) ); - prompt = input.prompt; - files = input.files; - selectedToolIds = input.selectedToolIds; - webSearchEnabled = input.webSearchEnabled; - imageGenerationEnabled = input.imageGenerationEnabled; - codeInterpreterEnabled = input.codeInterpreterEnabled; + if (!$temporaryChatEnabled) { + prompt = input.prompt; + files = input.files; + selectedToolIds = input.selectedToolIds; + webSearchEnabled = input.webSearchEnabled; + imageGenerationEnabled = input.imageGenerationEnabled; + codeInterpreterEnabled = input.codeInterpreterEnabled; + } } catch (e) {} } @@ -419,25 +421,27 @@ } if (localStorage.getItem(`chat-input${chatIdProp ? `-${chatIdProp}` : ''}`)) { + prompt = ''; + files = []; + selectedToolIds = []; + webSearchEnabled = false; + imageGenerationEnabled = false; + codeInterpreterEnabled = false; + try { const input = JSON.parse( localStorage.getItem(`chat-input${chatIdProp ? `-${chatIdProp}` : ''}`) ); - console.log('chat-input', input); - prompt = input.prompt; - files = input.files; - selectedToolIds = input.selectedToolIds; - webSearchEnabled = input.webSearchEnabled; - imageGenerationEnabled = input.imageGenerationEnabled; - codeInterpreterEnabled = input.codeInterpreterEnabled; - } catch (e) { - prompt = ''; - files = []; - selectedToolIds = []; - webSearchEnabled = false; - imageGenerationEnabled = false; - codeInterpreterEnabled = false; - } + + if (!$temporaryChatEnabled) { + prompt = input.prompt; + files = input.files; + selectedToolIds = input.selectedToolIds; + webSearchEnabled = input.webSearchEnabled; + imageGenerationEnabled = input.imageGenerationEnabled; + codeInterpreterEnabled = input.codeInterpreterEnabled; + } + } catch (e) {} } if (!chatIdProp) { diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 104f92e27..a09afd4ce 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -196,7 +196,7 @@ showChangelog.set($settings?.version !== $config.version); } - if ($user?.permissions?.chat?.temporary ?? true) { + if ($user?.role === 'admin' || ($user?.permissions?.chat?.temporary ?? true)) { if ($page.url.searchParams.get('temporary-chat') === 'true') { temporaryChatEnabled.set(true); } From 30cc51ec828127c9b2b4b1cc954a22ac5e3dd90f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 10 May 2025 22:27:39 +0400 Subject: [PATCH 3/8] feat: edit message files --- src/lib/components/chat/Messages.svelte | 5 +- .../chat/Messages/ResponseMessage.svelte | 4 +- .../chat/Messages/UserMessage.svelte | 105 ++++++++++++++---- 3 files changed, 90 insertions(+), 24 deletions(-) diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index 160d7eb37..22d6b95d0 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -255,7 +255,7 @@ await updateChat(); }; - const editMessage = async (messageId, content, submit = true) => { + const editMessage = async (messageId, { content, files }, submit = true) => { if (history.messages[messageId].role === 'user') { if (submit) { // New user message @@ -268,7 +268,7 @@ childrenIds: [], role: 'user', content: userPrompt, - ...(history.messages[messageId].files && { files: history.messages[messageId].files }), + ...(files && { files: files }), models: selectedModels, timestamp: Math.floor(Date.now() / 1000) // Unix epoch }; @@ -290,6 +290,7 @@ } else { // Edit user message history.messages[messageId].content = content; + history.messages[messageId].files = files; await updateChat(); } } else { diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index e8143e47c..79491d7eb 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -377,7 +377,7 @@ const editMessageConfirmHandler = async () => { const messageContent = postprocessAfterEditing(editedContent ? editedContent : ''); - editMessage(message.id, messageContent, false); + editMessage(message.id, { content: messageContent }, false); edit = false; editedContent = ''; @@ -388,7 +388,7 @@ const saveAsCopyHandler = async () => { const messageContent = postprocessAfterEditing(editedContent ? editedContent : ''); - editMessage(message.id, messageContent); + editMessage(message.id, { content: messageContent }); edit = false; editedContent = ''; diff --git a/src/lib/components/chat/Messages/UserMessage.svelte b/src/lib/components/chat/Messages/UserMessage.svelte index 24d657816..a5556ec86 100644 --- a/src/lib/components/chat/Messages/UserMessage.svelte +++ b/src/lib/components/chat/Messages/UserMessage.svelte @@ -43,6 +43,8 @@ let edit = false; let editedContent = ''; + let editedFiles = []; + let messageEditTextAreaElement: HTMLTextAreaElement; let message = JSON.parse(JSON.stringify(history.messages[messageId])); @@ -62,6 +64,7 @@ const editMessageHandler = async () => { edit = true; editedContent = message.content; + editedFiles = message.files; await tick(); @@ -74,15 +77,17 @@ }; const editMessageConfirmHandler = async (submit = true) => { - editMessage(message.id, editedContent, submit); + editMessage(message.id, { content: editedContent, files: editedFiles }, submit); edit = false; editedContent = ''; + editedFiles = []; }; const cancelEditMessage = () => { edit = false; editedContent = ''; + editedFiles = []; }; const deleteMessageHandler = async () => { @@ -141,30 +146,90 @@ {/if}
- {#if message.files} -
- {#each message.files as file} -
- {#if file.type === 'image'} - - {:else} - - {/if} -
- {/each} -
+ {#if edit !== true} + {#if message.files} +
+ {#each message.files as file} +
+ {#if file.type === 'image'} + + {:else} + + {/if} +
+ {/each} +
+ {/if} {/if} {#if message.content !== ''} {#if edit === true}
+ {#if editedFiles.length > 0} +
+ {#each editedFiles as file, fileIdx} + {#if file.type === 'image'} +
+
+ input +
+
+ +
+
+ {:else} + { + editedFiles.splice(fileIdx, 1); + + editedFiles = editedFiles; + }} + on:click={() => { + console.log(file); + }} + /> + {/if} + {/each} +
+ {/if} +