import React, { useState, useEffect, useCallback } from 'react'; import Image from 'next/image'; import useNavigationStore from '@/app/store/navigationStore'; interface MonitoringProps { onClose?: () => void; onSelectModel?: (modelPath: string) => void; } const Monitoring: React.FC = ({ onClose, onSelectModel }) => { const [models, setModels] = useState<{ title: string; path: string }[]>([]); const [loadError, setLoadError] = useState(null); const PREFERRED_MODEL = useNavigationStore((state) => state.PREFERRED_MODEL); const handleSelectModel = useCallback((modelPath: string) => { console.log(`[NavigationPage] Model selected: ${modelPath}`); onSelectModel?.(modelPath); }, [onSelectModel]); useEffect(() => { const fetchModels = async () => { try { setLoadError(null); const res = await fetch('/api/big-models/list'); if (!res.ok) { const text = await res.text(); throw new Error(text || 'Failed to fetch models list'); } const data = await res.json(); const items: { name: string; path: string }[] = Array.isArray(data?.models) ? data.models : []; const preferredModelName = PREFERRED_MODEL.split('/').pop()?.split('.').slice(0, -1).join('.') || ''; const formatted = items .map((it) => ({ title: it.name, path: it.path })) .sort((a, b) => { const aName = a.path.split('/').pop()?.split('.').slice(0, -1).join('.') || ''; const bName = b.path.split('/').pop()?.split('.').slice(0, -1).join('.') || ''; if (aName === preferredModelName) return -1; if (bName === preferredModelName) return 1; return a.title.localeCompare(b.title); }); setModels(formatted); } catch (error) { console.error('[Monitoring] Error loading models list:', error); setLoadError(error instanceof Error ? error.message : String(error)); setModels([]); } }; fetchModels(); }, [PREFERRED_MODEL]); return (

Зоны мониторинга

{onClose && ( )}
{loadError && (
Ошибка загрузки списка моделей: {loadError}
)} {models.length > 0 && ( <> {/* Большая панорамная карточка для приоритетной модели */} {models[0] && ( )} {/* Сетка маленьких карточек для остальных моделей */} {models.length > 1 && (
{models.slice(1).map((model, idx) => ( ))}
)} )} {models.length === 0 && !loadError && (
Список моделей пуст. Добавьте файлы в assets/big-models или проверьте API /api/big-models/list.
)}
); }; export default Monitoring;