ship-gis/src/components/layout/Sidebar.jsx
HeungTak Lee f4f0cb274f dark 프로젝트 구현 현재 상태 스냅샷
- Vite 마이그레이션, OpenLayers+Deck.gl 지도 연동
- STOMP WebSocket 선박 실시간 데이터 수신
- 선박 범례/필터/카운트, 다크시그널 처리
- Ctrl+Drag 박스선택, 우클릭 컨텍스트 메뉴
- 측정도구, 상세모달, 호버 툴팁
- darkSignalIds Set 패턴, INSHORE/OFFSHORE 타임아웃

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:01:54 +09:00

87 lines
2.7 KiB
JavaScript

import { useState } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import SideNav, { keyToPath, pathToKey } from './SideNav';
// 퍼블리시 패널 컴포넌트 재사용
import Panel1Component from '../../publish/pages/Panel1Component';
import Panel2Component from '../../publish/pages/Panel2Component';
import Panel3Component from '../../publish/pages/Panel3Component';
import Panel4Component from '../../publish/pages/Panel4Component';
import Panel5Component from '../../publish/pages/Panel5Component';
import Panel6Component from '../../publish/pages/Panel6Component';
import Panel7Component from '../../publish/pages/Panel7Component';
import Panel8Component from '../../publish/pages/Panel8Component';
// DisplayComponent는 스토어 연결된 버전 사용
import DisplayComponent from '../../component/wrap/side/DisplayComponent';
/**
* 사이드바 컴포넌트
* - 네비게이션 메뉴
* - 패널 영역 (경로에 따라 다른 패널 표시)
*/
export default function Sidebar() {
const navigate = useNavigate();
const location = useLocation();
const [isPanelOpen, setIsPanelOpen] = useState(true);
// URL에서 활성 메뉴 키 추출
const getActiveKey = () => {
const path = location.pathname.split('/')[1] || 'ship';
return pathToKey[path] || 'gnb1';
};
const activeKey = getActiveKey();
const handleMenuChange = (key) => {
setIsPanelOpen(true);
const path = keyToPath[key] || 'ship';
navigate(`/${path}`);
};
const handleTogglePanel = () => {
setIsPanelOpen((prev) => !prev);
};
// 패널 공통 props
const panelProps = {
isOpen: isPanelOpen,
onToggle: handleTogglePanel,
};
// 활성 키에 따른 패널 컴포넌트 렌더링
const renderPanel = () => {
switch (activeKey) {
case 'gnb1':
return <Panel1Component {...panelProps} />;
case 'gnb2':
return <Panel2Component {...panelProps} />;
case 'gnb3':
return <Panel3Component {...panelProps} />;
case 'gnb4':
return <Panel4Component {...panelProps} />;
case 'gnb5':
return <Panel5Component {...panelProps} />;
case 'gnb6':
return <Panel6Component {...panelProps} />;
case 'gnb7':
return <Panel7Component {...panelProps} />;
case 'gnb8':
return <Panel8Component {...panelProps} />;
case 'filter':
case 'layer':
return <DisplayComponent {...panelProps} />;
default:
return <Panel1Component {...panelProps} />;
}
};
return (
<section id="sidePanel">
<SideNav activeKey={activeKey} onChange={handleMenuChange} />
<div className="sidePanelContent">
{renderPanel()}
</div>
</section>
);
}