UNPKG

react-kakao-maps-sdk

Version:
96 lines (93 loc) 3.31 kB
import React, { useMemo, useImperativeHandle, useLayoutEffect, useContext } from 'react'; import { useKakaoEvent } from '../hooks/useKakaoEvent.js'; import { useMap } from '../hooks/useMap.js'; import { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect.js'; import { useKakaoMapsSetEffect } from '../hooks/useKakaoMapsSetEffect.js'; import { jsxs, jsx } from 'react/jsx-runtime'; const KakaoMapMarkerClustererContext = /*#__PURE__*/React.createContext(undefined); const MarkerClusterer = /*#__PURE__*/React.forwardRef(function MarkerClusterer(_ref, ref) { let { onClusterclick, onClusterdblclick, onClustered, onClusterout, onClusterover, onClusterrightclick, onCreate, ...props } = _ref; const { children, averageCenter, calculator, clickable, disableClickZoom, gridSize, hoverable, minClusterSize, minLevel, styles, texts } = props; const map = useMap(`MarkerClusterer`); const markerClusterer = useMemo(() => { if (!window.kakao.maps.MarkerClusterer) { console.warn("clusterer 라이브러리를 별도 로드 해야 사용 가능합니다. `https://apis.map.kakao.com/web/guide/#loadlibrary`"); return; } return new kakao.maps.MarkerClusterer({ averageCenter, calculator, clickable, disableClickZoom, gridSize, hoverable, minClusterSize, minLevel, styles, texts }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useImperativeHandle(ref, () => markerClusterer, [markerClusterer]); useLayoutEffect(() => { if (!markerClusterer) return; markerClusterer.setMap(map); return () => { markerClusterer.setMap(null); }; }, [map, markerClusterer]); useLayoutEffect(() => { if (markerClusterer && onCreate) onCreate(markerClusterer); }, [markerClusterer, onCreate]); useKakaoMapsSetEffect(markerClusterer, "setGridSize", gridSize); useKakaoMapsSetEffect(markerClusterer, "setMinClusterSize", minClusterSize); useKakaoMapsSetEffect(markerClusterer, "setAverageCenter", averageCenter); useKakaoMapsSetEffect(markerClusterer, "setMinLevel", minLevel); useKakaoMapsSetEffect(markerClusterer, "setTexts", texts); useKakaoMapsSetEffect(markerClusterer, "setCalculator", calculator); useKakaoMapsSetEffect(markerClusterer, "setStyles", styles); useKakaoEvent(markerClusterer, "clustered", onClustered); useKakaoEvent(markerClusterer, "clusterclick", onClusterclick); useKakaoEvent(markerClusterer, "clusterover", onClusterover); useKakaoEvent(markerClusterer, "clusterout", onClusterout); useKakaoEvent(markerClusterer, "clusterdblclick", onClusterdblclick); useKakaoEvent(markerClusterer, "clusterrightclick", onClusterrightclick); if (!markerClusterer) { return null; } return /*#__PURE__*/jsxs(KakaoMapMarkerClustererContext.Provider, { value: markerClusterer, children: [children, /*#__PURE__*/jsx(MarkerClustererRedraw, { ...props })] }); }); const MarkerClustererRedraw = () => { const markerClusterer = useContext(KakaoMapMarkerClustererContext); useIsomorphicLayoutEffect(() => { markerClusterer.redraw(); }); return null; }; export { KakaoMapMarkerClustererContext, MarkerClusterer };