"use client"; import { useEffect, useState, type ComponentType, type ReactNode } from "react"; import { ChartColumnBig, ChevronDown, ChevronUp, PanelsTopLeft, PencilRuler, Search, Settings2, TriangleAlert, Waves, } from "lucide-react"; import { getRawJson } from "@/components/lib/api"; import { createPredictionAnalysisTimeRange } from "@/features/fldngPredcPrst/model/analysisTimeRange"; import { windowPopupDefinitions, 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: windowPopupDefinitions.mapSearch.title, icon: Search, }, { key: "pipeAnalysisPopup", label: windowPopupDefinitions.pipeAnalysisPopup.title, icon: ChartColumnBig, }, { key: "fldngPredcPrst", label: windowPopupDefinitions.fldngPredcPrst.title, icon: Waves, }, { key: "agedPipeStatusByCtpvPopup", label: windowPopupDefinitions.agedPipeStatusByCtpvPopup.title, icon: ChartColumnBig, }, { key: "gisEditPopup", label: windowPopupDefinitions.gisEditPopup.title, icon: PencilRuler, }, { key: "gisManagementPopup", label: windowPopupDefinitions.gisManagementPopup.title, icon: Settings2, }, { key: "flowRiskPopup", label: windowPopupDefinitions.flowRiskPopup.title, icon: TriangleAlert, }, { key: "inftwtResultPopup", label: windowPopupDefinitions.inftwtResultPopup.title, renderIcon: InftwtMenuIcon, }, { key: "rdiiResultPopup", label: windowPopupDefinitions.rdiiResultPopup.title, 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< WindowPopupKey | "infoSearch" | null >(initialActiveKey); const [seriousPredictionCount, setSeriousPredictionCount] = useState(0); // 침수예측현황 팝업의 기본 분석시각 범위와 동일한 범위로 메뉴 건수를 조회한다. useEffect(() => { const range = createPredictionAnalysisTimeRange(); const params = new URLSearchParams({ analysisFrom: range.analysisFrom, analysisTo: range.analysisTo, }); let cancelled = false; void getRawJson( `/sewerage-service/api/v1/fldng/predc/prst/count?${params.toString()}`, ) .then((response) => { if (cancelled) return; const payload = response?.data ?? response; const count = Number(payload); setSeriousPredictionCount(Number.isFinite(count) ? count : 0); }) .catch(() => { if (!cancelled) setSeriousPredictionCount(0); }); return () => { cancelled = true; }; }, []); 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 (