From c6a12ca1b0741cf5963f29ffa074490383cb2cf7 Mon Sep 17 00:00:00 2001 From: Anajrim <115026399+Anajrim01@users.noreply.github.com> Date: Sat, 14 Sep 2024 16:57:02 +0200 Subject: [PATCH] Fix keylistener issue, race condition, and delete chat bug --- src/lib/ChatInput.svelte | 35 ++++++++++++++++++++++------------- src/misc/eventSource.ts | 4 ++-- src/misc/openai.ts | 7 +------ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/lib/ChatInput.svelte b/src/lib/ChatInput.svelte index 008a33e..7595520 100644 --- a/src/lib/ChatInput.svelte +++ b/src/lib/ChatInput.svelte @@ -120,9 +120,12 @@ // Variable to keep track of the user's first prompt let firstUserPrompt = ''; - let hasUpdatedChatTitle = false; // Flag to avoid multiple updates + // Flag to avoid multiple updates + let hasUpdatedChatTitle = false; async function handleSubmit() { + if (input.trim() === '') return; + isLoadingAnswerStore.set(true); inputCopy = input; @@ -246,9 +249,7 @@ addCompletionToChat(); } } - if ($settingsStore.useTitleSuggestions - && !hasUpdatedChatTitle - && firstUserPrompt) { + if ($settingsStore.useTitleSuggestions && !hasUpdatedChatTitle && firstUserPrompt) { hasUpdatedChatTitle = true; // Ensure the title is only updated once const title = await suggestChatTitle({ ...chat, @@ -279,7 +280,7 @@ const data = JSON.parse(event.data); - showToast(toastStore, data.message || 'An error occured.', 'error'); + showToast(toastStore, data.message || 'An error occurred.', 'error'); if (data.message.includes('API key')) { showModalComponent(modalStore, 'SettingsModal', { slug }); @@ -328,13 +329,21 @@ return; } - if (event.key === 'Enter' && !event.shiftKey) { - if (input.trim() === '') { - // Create new line if input is whitespaced. - addNewLineAndResize(); - } else { - handleSubmit(); - } + switch (event.key) { + case 'ArrowUp': + case 'ArrowDown': + event.stopImmediatePropagation(); + break; + case 'Enter': + if (!event.shiftKey) { + if (input.trim() === '') { + // Create a new line if input is whitespace. + addNewLineAndResize(); + } else { + handleSubmit(); + } + } + break; } } @@ -442,4 +451,4 @@ {/if} - \ No newline at end of file + diff --git a/src/misc/eventSource.ts b/src/misc/eventSource.ts index e6805e1..ace81a4 100644 --- a/src/misc/eventSource.ts +++ b/src/misc/eventSource.ts @@ -2,14 +2,14 @@ import { SSE } from 'sse.js'; export class EventSource { private eventSource?: SSE; - private handleAnswer?: (event: MessageEvent) => void; + private handleAnswer?: (event: MessageEvent) => Promise; private handleError?: (event: MessageEvent) => void; private handleAbort?: (event: MessageEvent) => void; start( url: string, payload: any, - handleAnswer: (event: MessageEvent) => void, + handleAnswer: (event: MessageEvent) => Promise, handleError: (event: MessageEvent) => void, handleAbort: (event: MessageEvent) => void, token?: string diff --git a/src/misc/openai.ts b/src/misc/openai.ts index 1daaf47..8e39c55 100644 --- a/src/misc/openai.ts +++ b/src/misc/openai.ts @@ -186,12 +186,7 @@ export function estimateChatCost(chat: Chat): ChatCost { } export function getProviderForModel(model: AiModel): AiProvider { - if (model.includes('llama')) { - return AiProvider.Meta; - } else if (model.includes('mistral')) { - return AiProvider.Mistral; - } - return AiProvider.OpenAi; + return model ? models[model].provider : AiProvider.OpenAi; } export function getDefaultModelForProvider(provider: AiProvider): AiModel {