From 13cb38aa7dea9e7e03a07145d45ac2a52b103712 Mon Sep 17 00:00:00 2001 From: Algorithm5838 <108630393+Algorithm5838@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:10:12 +0300 Subject: [PATCH] fix: autosave chat controls on change --- src/lib/components/chat/Chat.svelte | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 1468d6b349..b4c1f52def 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -175,6 +175,26 @@ let chatFiles = []; let files = []; let params = {}; + let lastObservedParams = {}; + let lastObservedChatFiles = []; + let controlsSaveTimer: ReturnType | null = null; + + $: if (!equal(params, lastObservedParams) || !equal(chatFiles, lastObservedChatFiles)) { + lastObservedParams = structuredClone(params); + lastObservedChatFiles = structuredClone(chatFiles); + if (!loading && !$temporaryChatEnabled && $chatId) { + if (controlsSaveTimer !== null) { + clearTimeout(controlsSaveTimer); + } + controlsSaveTimer = setTimeout(() => { + controlsSaveTimer = null; + saveControlsHandler().catch((err) => { + console.error('[saveControlsHandler]', err); + toast.error($i18n.t('Failed to save chat controls')); + }); + }, 400); + } + } $: if (chatIdProp) { navigateHandler(); @@ -187,6 +207,12 @@ updateLastReadAt($chatId); } + if (controlsSaveTimer !== null) { + clearTimeout(controlsSaveTimer); + controlsSaveTimer = null; + await saveControlsHandler().catch((err) => console.error('[saveControlsHandler]', err)); + } + loading = true; prompt = ''; @@ -807,6 +833,11 @@ return () => { try { + if (controlsSaveTimer !== null) { + clearTimeout(controlsSaveTimer); + controlsSaveTimer = null; + saveControlsHandler().catch((err) => console.error('[saveControlsHandler]', err)); + } if (chatIdProp && !$temporaryChatEnabled) { updateLastReadAt(chatIdProp); } @@ -2717,6 +2748,15 @@ return _chatId; }; + const saveControlsHandler = async () => { + const _chatId = $chatId; + if (!_chatId || $temporaryChatEnabled || loading) return; + await updateChatById(localStorage.token, _chatId, { + params: params, + files: chatFiles + }); + }; + const saveChatHandler = async (_chatId, history) => { if ($chatId == _chatId) { if (!$temporaryChatEnabled) {