From 018df36aafb6c4c47fce662b54533b884e519c1c Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 4 Jan 2026 02:40:32 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=B6=95=EC=A0=9C=20=EB=A7=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/waiting/boothMap/MapPage.tsx | 68 +++---------------- .../waiting/boothMap/hooks/useMapEvents.ts | 34 ++++++++++ .../waiting/boothMap/hooks/useMapZoom.ts | 19 ++++++ 3 files changed, 63 insertions(+), 58 deletions(-) create mode 100644 apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapEvents.ts create mode 100644 apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapZoom.ts diff --git a/apps/nowait-user/src/pages/waiting/boothMap/MapPage.tsx b/apps/nowait-user/src/pages/waiting/boothMap/MapPage.tsx index 99181c7f..525d0197 100644 --- a/apps/nowait-user/src/pages/waiting/boothMap/MapPage.tsx +++ b/apps/nowait-user/src/pages/waiting/boothMap/MapPage.tsx @@ -1,5 +1,5 @@ import BoothList from "./components/BoothList"; -import { useCallback, useEffect, useRef, useState } from "react"; +import { useCallback, useState } from "react"; import BoothDetail from "./components/BoothDetail"; import MapHeader from "./components/MapHeader"; import UniversityPolygon from "./components/UniversityPolygon"; @@ -9,78 +9,30 @@ import { useBooths } from "./hooks/useBooths"; import { useMyLocation } from "./hooks/useMyLocation"; import MapControlButtons from "./components/mapControls/MapControls"; import { Container as MapDiv, NaverMap, Marker } from "react-naver-maps"; +import { useMapZoom } from "./hooks/useMapZoom"; +import { useMapEvents } from "./hooks/useMapEvents"; + declare global { interface Window { naver: any; } } + const MapPage = () => { const [selectedBooth, setSelectedBooth] = useState(null); const [map, setMap] = useState(null); - const [zoomLevel, setZoomLevel] = useState(14); - console.log(zoomLevel); + // const { setIsCompassMode } = isCompassModeStore(); - const isDraggingRef = useRef(false); //대학교 폴리곤(영역) 설정 const paths = useGeoPolygon(); //좌표를 포함한 부스들 가져오기 const booths = useBooths(); //내 위치 좌표 가져오기 const myLocation = useMyLocation(); - - //줌 레벨 가져오기 - useEffect(() => { - if (!map) return; - - const listener = window.naver.maps.Event.addListener( - map, - "zoom_changed", - () => { - const currentZoom = map.getZoom(); - setZoomLevel(currentZoom); - } - ); - - return () => { - window.naver.maps.Event.removeListener(listener); - }; - }, [map]); - + //줌레벨 가져오기 + const zoom = useMapZoom(map); //맵 드래그, 클릭 컨트롤 - useEffect(() => { - if (!map) return; - - const dragStartListener = window.naver.maps.Event.addListener( - map, - "dragstart", - () => { - isDraggingRef.current = true; - } - ); - - const dragEndListener = window.naver.maps.Event.addListener( - map, - "dragend", - () => { - isDraggingRef.current = false; - } - ); - - const clickListener = window.naver.maps.Event.addListener( - map, - "click", - () => { - if (isDraggingRef.current) return; // 드래그 중이면 무시 - setSelectedBooth(null); - } - ); - - return () => { - window.naver.maps.Event.removeListener(dragStartListener); - window.naver.maps.Event.removeListener(dragEndListener); - window.naver.maps.Event.removeListener(clickListener); - }; - }, [map]); + useMapEvents(map, () => setSelectedBooth(null)); const openBooth = useCallback( (id: number) => { @@ -115,7 +67,7 @@ const MapPage = () => { diff --git a/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapEvents.ts b/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapEvents.ts new file mode 100644 index 00000000..0269f8fb --- /dev/null +++ b/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapEvents.ts @@ -0,0 +1,34 @@ +import { useEffect, useRef } from "react"; + +export const useMapEvents = ( + map: any, + onMapClick: () => void +) => { + const isDraggingRef = useRef(false); + + useEffect(() => { + if (!map) return; + + const dragStart = window.naver.maps.Event.addListener( + map, + "dragstart", + () => (isDraggingRef.current = true) + ); + + const dragEnd = window.naver.maps.Event.addListener( + map, + "dragend", + () => (isDraggingRef.current = false) + ); + + const click = window.naver.maps.Event.addListener(map, "click", () => { + if (!isDraggingRef.current) onMapClick(); + }); + + return () => { + window.naver.maps.Event.removeListener(dragStart); + window.naver.maps.Event.removeListener(dragEnd); + window.naver.maps.Event.removeListener(click); + }; + }, [map, onMapClick]); +}; diff --git a/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapZoom.ts b/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapZoom.ts new file mode 100644 index 00000000..729878ff --- /dev/null +++ b/apps/nowait-user/src/pages/waiting/boothMap/hooks/useMapZoom.ts @@ -0,0 +1,19 @@ +import { useEffect, useState } from "react"; + +export const useMapZoom = (map: any) => { + const [zoom, setZoom] = useState(14); + + useEffect(() => { + if (!map) return; + + const listener = window.naver.maps.Event.addListener( + map, + "zoom_changed", + () => setZoom(map.getZoom()) + ); + + return () => window.naver.maps.Event.removeListener(listener); + }, [map]); + + return zoom; +};