diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 5b70c68eed..fbd91e512c 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2413,8 +2413,11 @@ taskIds = newTaskIds; } - // Backend returns chat_id for new chats — set store + URL - if (res.chat_id && $chatId !== res.chat_id) { + // Backend returns chat_id for new chats — set store + URL. + // Only update if the user hasn't navigated to a different chat + // while the request was in flight (prevents overwriting $chatId + // and causing spurious toast notifications / state duplication). + if (res.chat_id && $chatId !== res.chat_id && $chatId === _chatId) { await chatId.set(res.chat_id); if (!$temporaryChatEnabled) { window.history.replaceState(history.state, '', `/c/${res.chat_id}`); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e8cb71b8c0..2902f1f08d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -425,13 +425,13 @@ return; } - let isFocused = document.visibilityState !== 'visible'; + let isInBackground = document.visibilityState !== 'visible'; if (window.electronAPI) { const res = await window.electronAPI.send({ type: 'window:isFocused' }); if (res) { - isFocused = res.isFocused; + isInBackground = !res.isFocused; } } @@ -471,7 +471,7 @@ return; } - if ((event.chat_id !== $chatId && !$temporaryChatEnabled) || isFocused) { + if ((event.chat_id !== $chatId && !$temporaryChatEnabled) || isInBackground) { if (type === 'chat:completion') { const { done, content, title } = data; const displayTitle = title || $i18n.t('New Chat'); @@ -639,17 +639,17 @@ // check url path const channel = $page.url.pathname.includes(`/channels/${event.channel_id}`); - let isFocused = document.visibilityState !== 'visible'; + let isInBackground = document.visibilityState !== 'visible'; if (window.electronAPI) { const res = await window.electronAPI.send({ type: 'window:isFocused' }); if (res) { - isFocused = res.isFocused; + isInBackground = !res.isFocused; } } - if ((!channel || isFocused) && event?.user?.id !== $user?.id) { + if ((!channel || isInBackground) && event?.user?.id !== $user?.id) { await tick(); const type = event?.data?.type ?? null; const data = event?.data?.data ?? null;