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; } const SceneToolbar: React.FC = ({ onZoomIn, onZoomOut, onTopView, onPan, onSelectModel, panActive = false, navMenuActive = false, }) => { 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: 'Zoom', onClick: () => setIsZoomOpen(!isZoomOpen), active: isZoomOpen, children: [ { icon: '/icons/plus.svg', label: 'Zoom In', onClick: onZoomIn || (() => {}), }, { icon: '/icons/minus.svg', label: 'Zoom Out', onClick: onZoomOut || (() => {}), }, ] }, { icon: '/icons/Video.png', label: "Top View", onClick: onTopView || (() => console.log('Top View')), }, { icon: '/icons/Pointer.png', label: 'Pan', onClick: onPan || (() => console.log('Pan')), active: panActive, }, { icon: '/icons/Warehouse.png', label: 'Home', onClick: handleHomeClick, }, { icon: '/icons/Layers.png', label: 'Levels', onClick: handleToggleNavMenu, active: navMenuActive, }, ]; return (
{defaultButtons.map((button, index) => (
{button.active && button.children && (
{button.children.map((childButton, childIndex) => ( ))}
)}
))}
); }; export default SceneToolbar;