fix(auth-files): isolate model requests

This commit is contained in:
Supra4E8C
2026-07-30 03:54:11 +08:00
parent 966a2918d5
commit 840df32f16
@@ -31,40 +31,63 @@ export function useAuthFilesModels(): UseAuthFilesModelsResult {
const [modelsFileType, setModelsFileType] = useState('');
const [modelsError, setModelsError] = useState<ModelsError>(null);
const modelsCacheRef = useRef<Map<string, AuthFileModelItem[]>>(new Map());
const modelsCacheVersionRef = useRef(0);
const modelsFileVersionRef = useRef<Map<string, number>>(new Map());
const activeModelsRequestIdRef = useRef(0);
const closeModelsModal = useCallback(() => {
activeModelsRequestIdRef.current += 1;
setModelsModalOpen(false);
setModelsLoading(false);
}, []);
const invalidateModels = useCallback((names?: string[]) => {
if (!names) {
modelsCacheRef.current.clear();
modelsFileVersionRef.current.clear();
modelsCacheVersionRef.current += 1;
return;
}
names.forEach((name) => modelsCacheRef.current.delete(name));
new Set(names.map((name) => name.trim()).filter(Boolean)).forEach((name) => {
modelsCacheRef.current.delete(name);
modelsFileVersionRef.current.set(name, (modelsFileVersionRef.current.get(name) ?? 0) + 1);
});
}, []);
const showModels = useCallback(
async (item: AuthFileItem) => {
const cacheKey = item.name.trim();
const requestId = ++activeModelsRequestIdRef.current;
setModelsFileName(item.name);
setModelsFileType(item.type || '');
setModelsList([]);
setModelsError(null);
setModelsModalOpen(true);
const cached = modelsCacheRef.current.get(item.name);
const cached = modelsCacheRef.current.get(cacheKey);
if (cached) {
setModelsList(cached);
setModelsLoading(false);
return;
}
const cacheVersion = modelsCacheVersionRef.current;
const fileVersion = modelsFileVersionRef.current.get(cacheKey) ?? 0;
const isCacheCurrent = () =>
cacheVersion === modelsCacheVersionRef.current &&
fileVersion === (modelsFileVersionRef.current.get(cacheKey) ?? 0);
const isRequestCurrent = () => requestId === activeModelsRequestIdRef.current;
setModelsLoading(true);
try {
const models = await authFilesApi.getModelsForAuthFile(item.name);
modelsCacheRef.current.set(item.name, models);
setModelsList(models);
if (isCacheCurrent()) {
modelsCacheRef.current.set(cacheKey, models);
if (isRequestCurrent()) setModelsList(models);
}
} catch (err) {
if (!isRequestCurrent() || !isCacheCurrent()) return;
const errorMessage = err instanceof Error ? err.message : '';
if (
errorMessage.includes('404') ||
@@ -76,7 +99,7 @@ export function useAuthFilesModels(): UseAuthFilesModelsResult {
showNotification(`${t('notification.load_failed')}: ${errorMessage}`, 'error');
}
} finally {
setModelsLoading(false);
if (isRequestCurrent()) setModelsLoading(false);
}
},
[showNotification, t]