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 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 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)} />
) }