1
0
forked from boos/BoosAPI

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.
This commit is contained in:
Hureru
2026-03-22 20:26:45 +08:00
parent 26be7c024a
commit b8ad89d1ab
+6 -2
View File
@@ -216,6 +216,7 @@ export default function Sites() {
count?: number; count?: number;
}>(null); }>(null);
const lastEditorRef = useRef<SiteEditorState | null>(null); const lastEditorRef = useRef<SiteEditorState | null>(null);
const loadingModelsSiteIdRef = useRef<number | null>(null);
const rowRefs = useRef<Map<number, HTMLTableRowElement>>(new Map()); const rowRefs = useRef<Map<number, HTMLTableRowElement>>(new Map());
const highlightTimerRef = useRef<number | null>(null); const highlightTimerRef = useRef<number | null>(null);
const toast = useToast(); const toast = useToast();
@@ -356,6 +357,7 @@ export default function Sites() {
scrollToEditorTop(); scrollToEditorTop();
// Load disabled models and available models for this site // Load disabled models and available models for this site
const loadSiteId = site.id; const loadSiteId = site.id;
loadingModelsSiteIdRef.current = loadSiteId;
setDisabledModelsLoading(true); setDisabledModelsLoading(true);
setDisabledModels([]); setDisabledModels([]);
setAvailableModels([]); setAvailableModels([]);
@@ -366,7 +368,7 @@ export default function Sites() {
]) ])
.then(([disabledRes, availableRes]: any[]) => { .then(([disabledRes, availableRes]: any[]) => {
// Guard: only apply if we're still editing the same site // 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 : []); setDisabledModels(Array.isArray(disabledRes?.models) ? disabledRes.models : []);
setAvailableModels(Array.isArray(availableRes?.models) ? availableRes.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 // Preserve previous (empty) model lists — don't clear UI silently
}) })
.finally(() => { .finally(() => {
setDisabledModelsLoading(false); if (loadingModelsSiteIdRef.current === loadSiteId) {
setDisabledModelsLoading(false);
}
}); });
}; };