From bf44cf58d346fcae0d4b260acc8e1d71e1d6cf95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Tue, 30 Jun 2026 11:55:32 +0800 Subject: [PATCH] Add files via upload --- web/static/js/chat.js | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/web/static/js/chat.js b/web/static/js/chat.js index e989e567..a7c592d9 100644 --- a/web/static/js/chat.js +++ b/web/static/js/chat.js @@ -6621,10 +6621,15 @@ function renderConversationsPagination(visibleCount) { } function goConversationsPage(page) { - const next = Math.min(Math.max(1, page), getConversationsTotalPages()); - const scrollToTop = next !== conversationsPagination.page; - conversationsPagination.page = next; - loadConversationsWithGroups(conversationsSearchQuery, { refreshMeta: false, scrollToTop }); + const requestedPage = Math.max(1, parseInt(page, 10) || 1); + const scrollToTop = requestedPage !== conversationsPagination.page; + conversationsPagination.page = requestedPage; + // intentPage:用户主动翻页,不在此处用可能已被并发刷新污染的 total 做钳制 + loadConversationsWithGroups(conversationsSearchQuery, { + refreshMeta: false, + scrollToTop, + intentPage: requestedPage, + }); } function changeConversationsPageSize() { @@ -6737,12 +6742,17 @@ async function loadGroups() { async function loadConversationsWithGroups(searchQuery = '', options = {}) { const refreshMeta = options.refreshMeta !== false; const scrollToTop = options.scrollToTop === true; + const intentPage = Number.isFinite(options.intentPage) ? options.intentPage : null; const loadSeq = ++conversationsListLoadSeq; try { conversationsSearchQuery = searchQuery || ''; - conversationsPagination.pageSize = getConversationsPageSize(); - const pageSize = conversationsPagination.pageSize; - const offset = (conversationsPagination.page - 1) * pageSize; + const pageSize = getConversationsPageSize(); + conversationsPagination.pageSize = pageSize; + const activePage = intentPage != null ? intentPage : conversationsPagination.page; + if (intentPage != null) { + conversationsPagination.page = intentPage; + } + const offset = (activePage - 1) * pageSize; const convParams = new URLSearchParams({ limit: String(pageSize), offset: String(offset) }); if (conversationSortBy === 'created_at') { convParams.set('sort_by', 'created_at'); @@ -6789,10 +6799,24 @@ async function loadConversationsWithGroups(searchQuery = '', options = {}) { const data = await response.json(); if (loadSeq !== conversationsListLoadSeq) return; const parsed = parseConversationsListResponse(data); - conversationsPagination.total = await resolveConversationsListTotal(convParams, parsed, pageSize, offset); + const resolvedTotal = await resolveConversationsListTotal(convParams, parsed, pageSize, offset); if (loadSeq !== conversationsListLoadSeq) return; + conversationsPagination.total = resolvedTotal; - if (clampConversationsPageToTotal()) { + const totalPages = getConversationsTotalPages(); + if (activePage > totalPages) { + conversationsPagination.page = totalPages; + if (loadSeq !== conversationsListLoadSeq) return; + loadConversationsWithGroups(searchQuery, { + ...options, + intentPage: null, + scrollToTop: options.scrollToTop === true || activePage !== totalPages, + }); + return; + } + conversationsPagination.page = activePage; + if (intentPage == null && clampConversationsPageToTotal()) { + if (loadSeq !== conversationsListLoadSeq) return; loadConversationsWithGroups(searchQuery, options); return; }