import React, { useState } from 'react'; import Image from 'next/image'; import useNavigationStore from '@/app/store/navigationStore'; import type { Zone } from '@/app/types'; interface ToolbarButton { icon: string; label: string; onClick: () => void; onMouseDown?: () => void; onMouseUp?: () => void; active?: boolean; children?: ToolbarButton[]; } interface SceneToolbarProps { onZoomIn?: () => void; onZoomOut?: () => void; onTopView?: () => void; onPan?: () => void; onSelectModel?: (modelPath: string) => void; panActive?: boolean; navMenuActive?: boolean; onToggleSensorHighlights?: () => void; sensorHighlightsActive?: boolean; } const SceneToolbar: React.FC = ({ onZoomIn, onZoomOut, onTopView, onPan, onSelectModel, panActive = false, navMenuActive = false, onToggleSensorHighlights, sensorHighlightsActive = true, }) => { const [isZoomOpen, setIsZoomOpen] = useState(false); const { showMonitoring, openMonitoring, closeMonitoring, currentZones, loadZones, currentObject } = useNavigationStore(); const handleToggleNavMenu = () => { if (showMonitoring) { closeMonitoring(); } else { openMonitoring(); } }; const handleHomeClick = async () => { if (!onSelectModel) return; try { let zones: Zone[] = Array.isArray(currentZones) ? currentZones : []; // Если зоны ещё не загружены, откройте Monitoring и загрузите зоны для текущего объекта if ((!zones || zones.length === 0) && currentObject?.id) { if (!showMonitoring) { openMonitoring(); } await loadZones(currentObject.id); zones = useNavigationStore.getState().currentZones || []; } if (!Array.isArray(zones) || zones.length === 0) { console.warn('No zones available to select a model from.'); return; } const sorted = zones.slice().sort((a: Zone, b: Zone) => { const oa = typeof a.order === 'number' ? a.order : 0; const ob = typeof b.order === 'number' ? b.order : 0; if (oa !== ob) return oa - ob; return (a.name || '').localeCompare(b.name || ''); }); const top = sorted[0]; let chosenPath: string | null = top?.model_path && String(top.model_path).trim() ? top.model_path! : null; if (!chosenPath) { const nextWithModel = sorted.find((z) => z.model_path && String(z.model_path).trim()); chosenPath = nextWithModel?.model_path ?? null; } if (chosenPath) { onSelectModel(chosenPath); } else { console.warn('No zone has a valid model_path to open.'); } } catch (error) { console.error('Error selecting top zone model:', error); } }; const defaultButtons: ToolbarButton[] = [ { icon: '/icons/Zoom.png', label: 'Масштаб', onClick: () => setIsZoomOpen(!isZoomOpen), active: isZoomOpen, children: [ { icon: '/icons/plus.svg', label: 'Приблизить', onClick: onZoomIn || (() => {}), }, { icon: '/icons/minus.svg', label: 'Отдалить', onClick: onZoomOut || (() => {}), }, ] }, { icon: '/icons/Video.png', label: 'Вид сверху', onClick: onTopView || (() => console.log('Top View')), }, { icon: '/icons/Pointer.png', label: 'Панорамирование', onClick: onPan || (() => console.log('Pan')), active: panActive, }, { icon: '/icons/Eye.png', label: 'Подсветка датчиков', onClick: onToggleSensorHighlights || (() => console.log('Toggle Sensor Highlights')), active: sensorHighlightsActive, }, { icon: '/icons/Warehouse.png', label: 'Домой', onClick: handleHomeClick, }, { icon: '/icons/Layers.png', label: 'Уровни', onClick: handleToggleNavMenu, active: navMenuActive, }, ]; return (
{defaultButtons.map((button, index) => (
{button.active && button.children && (
{button.children.map((childButton, childIndex) => ( ))}
)}
))}
); }; export default SceneToolbar;