mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-08-29 00:41:25 +08:00
fix(auth-files): isolate model requests
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user