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:
@@ -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(() => {
|
||||||
|
if (loadingModelsSiteIdRef.current === loadSiteId) {
|
||||||
setDisabledModelsLoading(false);
|
setDisabledModelsLoading(false);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user