import { useCallback, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { authFilesApi } from '@/services/api'; import { useNotificationStore } from '@/stores'; import type { AuthFileItem } from '@/types'; import type { AuthFileModelItem } from '@/features/authFiles/constants'; type ModelsError = 'unsupported' | null; export type UseAuthFilesModelsResult = { modelsModalOpen: boolean; modelsLoading: boolean; modelsList: AuthFileModelItem[]; modelsFileName: string; modelsFileType: string; modelsError: ModelsError; showModels: (item: AuthFileItem) => Promise; closeModelsModal: () => void; }; export function useAuthFilesModels(): UseAuthFilesModelsResult { const { t } = useTranslation(); const showNotification = useNotificationStore((state) => state.showNotification); const [modelsModalOpen, setModelsModalOpen] = useState(false); const [modelsLoading, setModelsLoading] = useState(false); const [modelsList, setModelsList] = useState([]); const [modelsFileName, setModelsFileName] = useState(''); const [modelsFileType, setModelsFileType] = useState(''); const [modelsError, setModelsError] = useState(null); const modelsCacheRef = useRef>(new Map()); const closeModelsModal = useCallback(() => { setModelsModalOpen(false); }, []); const showModels = useCallback( async (item: AuthFileItem) => { setModelsFileName(item.name); setModelsFileType(item.type || ''); setModelsList([]); setModelsError(null); setModelsModalOpen(true); const cached = modelsCacheRef.current.get(item.name); if (cached) { setModelsList(cached); setModelsLoading(false); return; } setModelsLoading(true); try { const models = await authFilesApi.getModelsForAuthFile(item.name); modelsCacheRef.current.set(item.name, models); setModelsList(models); } catch (err) { const errorMessage = err instanceof Error ? err.message : ''; if ( errorMessage.includes('404') || errorMessage.includes('not found') || errorMessage.includes('Not Found') ) { setModelsError('unsupported'); } else { showNotification(`${t('notification.load_failed')}: ${errorMessage}`, 'error'); } } finally { setModelsLoading(false); } }, [showNotification, t] ); return { modelsModalOpen, modelsLoading, modelsList, modelsFileName, modelsFileType, modelsError, showModels, closeModelsModal }; }