"use client"; import { useEffect, useState, type ComponentType, type ReactNode } from "react"; import { ChartColumnBig, ChevronLeft, ChevronRight, PanelsTopLeft, PencilRuler, Search, Settings2, TriangleAlert, Waves, } from "lucide-react"; import type { WindowPopupKey } from "@/features/windowPopup/model/popupDefinitions"; type Props = { onOpenPopup: (popupKey: WindowPopupKey) => Window | null; onOpenInfoSearch: () => void; onToggleGisEdit?: () => void; isGisEditActive?: boolean; isInfoSearchActive?: boolean; initialActiveKey?: WindowPopupKey | null; }; type MenuIconProps = { isActive: boolean; }; const InftwtMenuIcon = ({ isActive }: MenuIconProps) => ( ); const ANALYSIS_POPUP_ITEMS: Array<{ key: WindowPopupKey | "infoSearch"; label: string; icon?: ComponentType<{ className?: string }>; renderIcon?: (props: MenuIconProps) => ReactNode; }> = [ { key: "infoSearch", label: "정보검색", icon: Search }, { key: "pipeAnalysisPopup", label: "관로분석", icon: ChartColumnBig }, { key: "floodPredictionMapPopup", label: "침수예측지도", icon: Waves }, { key: "gisEditPopup", label: "GIS 편집", icon: PencilRuler }, { key: "gisManagementPopup", label: "GIS 관리", icon: Settings2 }, { key: "flowRiskPopup", label: "통수 위험", icon: TriangleAlert }, { key: "inftwtResultPopup", label: "침입수 분석결과", renderIcon: InftwtMenuIcon }, { key: "rdiiResultPopup", label: "RDII 분석결과", icon: ChartColumnBig }, ]; export default function AnalysisPopupMenu({ onOpenPopup, onOpenInfoSearch, onToggleGisEdit, isGisEditActive = false, isInfoSearchActive = false, initialActiveKey = null, }: Props) { const [isOpen, setIsOpen] = useState(true); const [activeKey, setActiveKey] = useState(initialActiveKey); useEffect(() => { if (!isGisEditActive && activeKey === "gisEditPopup") { setActiveKey(null); } }, [activeKey, isGisEditActive]); useEffect(() => { if (!isInfoSearchActive && activeKey === "infoSearch") { setActiveKey(null); } }, [activeKey, isInfoSearchActive]); useEffect(() => { if (!initialActiveKey) return; setActiveKey((currentKey) => currentKey ?? initialActiveKey); }, [initialActiveKey]); return ( {isOpen ? ( 분석도구 {ANALYSIS_POPUP_ITEMS.map((item) => { const Icon = item.icon; const isActive = item.key === "gisEditPopup" ? isGisEditActive : activeKey === item.key; return ( { if (item.key === "gisEditPopup" && onToggleGisEdit) { setActiveKey(item.key); onToggleGisEdit(); return; } setActiveKey(item.key); if (item.key === "infoSearch") { onOpenInfoSearch(); return; } const popupWindow = onOpenPopup(item.key); if (!popupWindow) { setActiveKey(null); return; } const closeWatcher = window.setInterval(() => { if (!popupWindow.closed) return; window.clearInterval(closeWatcher); setActiveKey((currentKey) => currentKey === item.key ? null : currentKey, ); }, 300); }} > {item.renderIcon ? item.renderIcon({ isActive }) : null} {Icon ? ( ) : null} {item.label} ); })} ) : null} setIsOpen((value) => !value)} title={isOpen ? "분석 메뉴 접기" : "분석 메뉴 펼치기"} aria-label={isOpen ? "분석 메뉴 접기" : "분석 메뉴 펼치기"} > {isOpen ? : } ); }