import { useState, useRef, useEffect, useMemo } from 'react'; import type { MainTab } from '../../types/navigation'; import { useAuthStore } from '../../store/authStore'; import { useMenuStore } from '../../store/menuStore'; import { useMapStore } from '../../store/mapStore'; import { useThemeStore } from '../../store/themeStore'; import UserManualPopup from '../ui/UserManualPopup'; interface TopBarProps { activeTab: MainTab; onTabChange: (tab: MainTab) => void; } export function TopBar({ activeTab, onTabChange }: TopBarProps) { const [showQuickMenu, setShowQuickMenu] = useState(false); const [showManual, setShowManual] = useState(false); const quickMenuRef = useRef(null); const { hasPermission, user, logout } = useAuthStore(); const { menuConfig, isLoaded } = useMenuStore(); const { mapToggles, toggleMap, mapTypes, measureMode, setMeasureMode } = useMapStore(); const { theme, toggleTheme } = useThemeStore(); const MAP_TABS = new Set(['prediction', 'hns', 'scat', 'incidents']); const isMapTab = MAP_TABS.has(activeTab); const handleToggleMeasure = (mode: 'distance' | 'area') => { if (!isMapTab) return; setMeasureMode(measureMode === mode ? null : mode); setShowQuickMenu(false); }; const tabs = useMemo(() => { if (!isLoaded || menuConfig.length === 0) return []; return menuConfig .filter((m) => m.enabled && hasPermission(m.id)) .sort((a, b) => a.order - b.order); }, [hasPermission, user?.permissions, menuConfig, isLoaded]); useEffect(() => { const handler = (e: MouseEvent) => { if (quickMenuRef.current && !quickMenuRef.current.contains(e.target as Node)) setShowQuickMenu(false); }; if (showQuickMenu) document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); }, [showQuickMenu]); return (
{/* Left Section */}
{/* Logo */} {/* Divider */}
{/* Tabs */}
{tabs.map((tab) => { const isIncident = tab.id === 'incidents'; const isMonitor = tab.id === 'monitor'; const handleClick = () => { if (isMonitor) { window.open( import.meta.env.VITE_SITUATIONAL_URL ?? 'https://kcg.gc-si.dev', '_blank', ); } else { onTabChange(tab.id as MainTab); } }; return ( ); })}
{/* Right Section */}
{/* Status Badge */} {/*
사고 진행중
*/} {/* Icon Buttons */} {/* */} {hasPermission('admin') && ( )} {user && (
{user.name}
)} {/* Quick Menu */}
{showQuickMenu && (
{/* 거리·면적 계산 */} {/*
📐 거리·면적 계산
*/}
{/* 출력 */}
🖨 출력
{/* 지도 유형 */}
🗺 지도 유형
{mapTypes.map((item) => ( ))}
{/* 테마 전환 */}
{/* 매뉴얼 */}
)}
{/* 사용자 매뉴얼 팝업 */} setShowManual(false)} />
); }