From b8ad89d1ab9785ee51aefb2124ba63be14b5e512 Mon Sep 17 00:00:00 2001 From: Hureru <3507039083@qq.com> Date: Sun, 22 Mar 2026 20:26:45 +0800 Subject: [PATCH] fix: use ref-based stale guard for site disabled-models fetch Replace closure-captured editor check with loadingModelsSiteIdRef so the stale-response guard works correctly across rapid site switches. Also gate setDisabledModelsLoading(false) behind the same ref check. --- src/web/pages/Sites.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/web/pages/Sites.tsx b/src/web/pages/Sites.tsx index 0d9848e..75819fa 100644 --- a/src/web/pages/Sites.tsx +++ b/src/web/pages/Sites.tsx @@ -216,6 +216,7 @@ export default function Sites() { count?: number; }>(null); const lastEditorRef = useRef(null); + const loadingModelsSiteIdRef = useRef(null); const rowRefs = useRef>(new Map()); const highlightTimerRef = useRef(null); const toast = useToast(); @@ -356,6 +357,7 @@ export default function Sites() { scrollToEditorTop(); // Load disabled models and available models for this site const loadSiteId = site.id; + loadingModelsSiteIdRef.current = loadSiteId; setDisabledModelsLoading(true); setDisabledModels([]); setAvailableModels([]); @@ -366,7 +368,7 @@ export default function Sites() { ]) .then(([disabledRes, availableRes]: any[]) => { // Guard: only apply if we're still editing the same site - if (editor?.mode !== 'edit' && loadSiteId !== site.id) return; + if (loadingModelsSiteIdRef.current !== loadSiteId) return; setDisabledModels(Array.isArray(disabledRes?.models) ? disabledRes.models : []); setAvailableModels(Array.isArray(availableRes?.models) ? availableRes.models : []); }) @@ -375,7 +377,9 @@ export default function Sites() { // Preserve previous (empty) model lists — don't clear UI silently }) .finally(() => { - setDisabledModelsLoading(false); + if (loadingModelsSiteIdRef.current === loadSiteId) { + setDisabledModelsLoading(false); + } }); };