From 527b0d3b7f2865027a1fbde4709ac552baec96b7 Mon Sep 17 00:00:00 2001 From: G30 <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 Jul 2026 18:14:06 -0400 Subject: [PATCH] fix(ui): stop the chat input attach menus from fetching twice on open (#27461) --- .../chat/MessageInput/InputMenu/Chats.svelte | 7 +++++-- .../chat/MessageInput/InputMenu/Files.svelte | 7 +++++-- .../MessageInput/InputMenu/Knowledge.svelte | 18 ++++++++++-------- .../chat/MessageInput/InputMenu/Notes.svelte | 7 +++++-- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputMenu/Chats.svelte b/src/lib/components/chat/MessageInput/InputMenu/Chats.svelte index 3924fe1b57..af6ef4b95f 100644 --- a/src/lib/components/chat/MessageInput/InputMenu/Chats.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu/Chats.svelte @@ -25,11 +25,13 @@ let itemsLoading = false; let allItemsLoaded = false; let initialized = false; + let searchedQuery = ''; let searchDebounceTimer: ReturnType; let requestId = 0; - $: if (initialized) { - query; + // Only re-run the search when the query actually changes. Flipping `initialized` + // after the initial load would otherwise trigger a second, identical request. + $: if (initialized && query !== searchedQuery) { scheduleSearch(); } @@ -40,6 +42,7 @@ const init = async () => { requestId += 1; + searchedQuery = query; page = 1; items = []; selectedIdx = 0; diff --git a/src/lib/components/chat/MessageInput/InputMenu/Files.svelte b/src/lib/components/chat/MessageInput/InputMenu/Files.svelte index 7ed40229e2..00237cee36 100644 --- a/src/lib/components/chat/MessageInput/InputMenu/Files.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu/Files.svelte @@ -23,11 +23,13 @@ let itemsLoading = false; let allItemsLoaded = false; let initialized = false; + let searchedQuery = ''; let searchDebounceTimer: ReturnType; let requestId = 0; - $: if (initialized) { - query; + // Only re-run the search when the query actually changes. Flipping `initialized` + // after the initial load would otherwise trigger a second, identical request. + $: if (initialized && query !== searchedQuery) { scheduleSearch(); } @@ -38,6 +40,7 @@ const init = async () => { requestId += 1; + searchedQuery = query; page = 0; items = []; selectedIdx = 0; diff --git a/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte b/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte index a75d9dbefd..9f9f53ad12 100644 --- a/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte @@ -100,11 +100,13 @@ let itemsLoading = false; let allItemsLoaded = false; let initialized = false; + let searchedQuery = ''; let searchDebounceTimer: ReturnType; let requestId = 0; - $: if (initialized) { - query; + // Only re-run the search when the query actually changes. Flipping `initialized` + // after the initial load would otherwise trigger a second, identical request. + $: if (initialized && query !== searchedQuery) { scheduleSearch(); } @@ -115,6 +117,7 @@ const init = async () => { requestId += 1; + searchedQuery = query; reset(); selectedItem = null; await tick(); @@ -151,12 +154,6 @@ total = res.total; const pageItems = res.items; - if ((pageItems ?? []).length === 0) { - allItemsLoaded = true; - } else { - allItemsLoaded = false; - } - if (items) { const existingIds = new Set(items.map((item) => item.id)); const newItems = pageItems.filter((item) => !existingIds.has(item.id)); @@ -164,6 +161,11 @@ } else { items = pageItems; } + + // The response reports the full count, so the end of the list is known without + // probing for an empty page - otherwise a list shorter than one page would + // immediately request the next one. + allItemsLoaded = (pageItems ?? []).length === 0 || items.length >= (total ?? 0); } itemsLoading = false; diff --git a/src/lib/components/chat/MessageInput/InputMenu/Notes.svelte b/src/lib/components/chat/MessageInput/InputMenu/Notes.svelte index f8b2af18bc..6404b62853 100644 --- a/src/lib/components/chat/MessageInput/InputMenu/Notes.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu/Notes.svelte @@ -25,11 +25,13 @@ let itemsLoading = false; let allItemsLoaded = false; let initialized = false; + let searchedQuery = ''; let searchDebounceTimer: ReturnType; let requestId = 0; - $: if (initialized) { - query; + // Only re-run the search when the query actually changes. Flipping `initialized` + // after the initial load would otherwise trigger a second, identical request. + $: if (initialized && query !== searchedQuery) { scheduleSearch(); } @@ -40,6 +42,7 @@ const init = async () => { requestId += 1; + searchedQuery = query; page = 1; items = []; selectedIdx = 0;