UNPKG

react-naver-maps

Version:

React Navermaps API integration for modern development.

269 lines (252 loc) 8.36 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/overlays/rectangle.tsx var rectangle_exports = {}; __export(rectangle_exports, { Rectangle: () => Rectangle }); module.exports = __toCommonJS(rectangle_exports); var import_lodash2 = __toESM(require("lodash.pick")); var import_react8 = require("react"); // src/helpers/event.tsx var import_camelcase = __toESM(require("camelcase")); var import_lodash = __toESM(require("lodash.pick")); var import_react3 = require("react"); // src/listener.tsx var import_react2 = require("react"); // src/contexts/event-target.ts var import_react = require("react"); var EventTargetContext = (0, import_react.createContext)(void 0); var useEventTarget = () => (0, import_react.useContext)(EventTargetContext); // src/listener.tsx function useListener(target, type, listener) { (0, import_react2.useEffect)(() => { const _listener = (...args) => listener(...args, target); const mapEventListener = naver.maps.Event.addListener(target, type, _listener); return () => { naver.maps.Event.removeListener(mapEventListener); }; }, [target, type, listener]); } var Listener = (props) => { const { target: propTarget, type, listener } = props; const contextTarget = useEventTarget(); const target = propTarget || contextTarget; if (!target) { throw new Error("react-naver-maps: No Target to add listener"); } useListener(target, type, listener); return null; }; // src/helpers/event.tsx var import_jsx_runtime = require("react/jsx-runtime"); function HandleEvents(props) { const { events: events2, listeners: _listeners } = props; const eventMap = (0, import_react3.useMemo)(() => createEventMap(events2), events2); const listeners = (0, import_lodash.default)(_listeners, Object.keys(eventMap)); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: Object.keys(listeners).map((key) => { const eventName = eventMap[key]; const listener = listeners[key]; return listener ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Listener, { type: eventName, listener }, key) : null; }) }); } function createEventMap(events2) { return events2.reduce((acc, eventName) => { const key = (0, import_camelcase.default)(`on_${eventName}`); return { [key]: eventName, ...acc }; }, {}); } // src/overlay.tsx var import_react5 = require("react"); // src/contexts/naver-map.ts var import_react4 = require("react"); var NaverMapContext = (0, import_react4.createContext)(void 0); var useMap = () => (0, import_react4.useContext)(NaverMapContext); // src/overlay.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); function Overlay(props) { const { element, children, autoMount = true } = props; const nmap = useMap(); (0, import_react5.useEffect)(() => { if (!autoMount) { return; } if (element.getMap() === nmap) { return; } element.setMap(nmap ? nmap : null); return () => { element.setMap(null); }; }, [nmap]); return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(EventTargetContext.Provider, { value: element, children }); } // src/use-navermaps.ts var import_suspend_react = require("suspend-react"); // src/contexts/client-options.ts var import_react6 = require("react"); var ClientOptionsContext = (0, import_react6.createContext)({}); var useClientOptions = () => (0, import_react6.useContext)(ClientOptionsContext); // src/load-navermaps-script.tsx var import_react7 = require("react"); // src/utils/load-script.ts var import_load_script = __toESM(require("load-script")); function loadScript(src) { return new Promise((resolve, reject) => { (0, import_load_script.default)(src, (err, script) => { if (err) reject(err); else resolve(script); }); }); } // src/load-navermaps-script.tsx var import_jsx_runtime3 = require("react/jsx-runtime"); function loadNavermapsScript(options) { const url = makeUrl(options); const promise = loadScript(url).then(() => { const navermaps = window.naver.maps; if (navermaps.jsContentLoaded) { return navermaps; } return new Promise((resolve) => { navermaps.onJSContentLoaded = () => { resolve(navermaps); }; }); }); return promise; } function makeUrl(options) { const submodules = options.submodules; const clientIdQuery = "ncpKeyId" in options ? `ncpKeyId=${options.ncpKeyId}` : "ncpClientId" in options ? `ncpClientId=${options.ncpClientId}` : "govClientId" in options ? `govClientId=${options.govClientId}` : "finClientId" in options ? `finClientId=${options.finClientId}` : void 0; if (!clientIdQuery) { throw new Error("react-naver-maps: ncpKeyId, ncpClientId, govClientId or finClientId is required"); } let url = `https://oapi.map.naver.com/openapi/v3/maps.js?${clientIdQuery}`; if (submodules) { url += `&submodules=${submodules.join(",")}`; } return url; } // src/use-navermaps.ts async function load(options) { var _a; if (typeof window !== "undefined" && ((_a = window.naver) == null ? void 0 : _a.maps)) { return window.naver.maps; } if (!options) { throw new Error("react-naver-maps: set options with `useNavermaps.config`"); } return await loadNavermapsScript(options); } function useNavermaps() { var _a; if (typeof window === "undefined") { throw new Error("react-naver-maps: browser"); } if ((_a = window.naver) == null ? void 0 : _a.maps) { return window.naver.maps; } const options = useClientOptions(); return (0, import_suspend_react.suspend)(load, [options, "react-naver-maps/loadClient"]); } // src/utils/omit-undefined.ts function omitUndefined(obj) { return Object.keys(obj).reduce((acc, key) => { if (obj[key] === "undefined") { return acc; } return { ...acc, [key]: obj[key] }; }, {}); } // src/overlays/rectangle.tsx var import_jsx_runtime4 = require("react/jsx-runtime"); var optionKeys = [ "strokeWeight", "strokeOpacity", "strokeColor", "strokeStyle", "strokeLineCap", "strokeLineJoin", "fillColor", "fillOpacity" ]; var kvoKeys = [ "bounds", "clickable", "visible", "zIndex" ]; var kvoEvents = kvoKeys.map((key) => `${key}_changed`); var uiEvents = [ "click", "dblclick", "mousedown", "mouseout", "mouseover", "mouseup" ]; var events = [...uiEvents, ...kvoEvents]; var Rectangle = (0, import_react8.forwardRef)(function Rectangle2(props, ref) { const options = (0, import_lodash2.default)(props, [...optionKeys, ...kvoKeys]); const navermaps = useNavermaps(); const [rectangle] = (0, import_react8.useState)(() => new navermaps.Rectangle(options)); (0, import_react8.useImperativeHandle)(ref, () => rectangle); (0, import_react8.useEffect)(() => { rectangle.setOptions(omitUndefined(options)); }, kvoKeys.map((key) => options[key])); return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Overlay, { element: rectangle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(HandleEvents, { events, listeners: props }) }); }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Rectangle }); //# sourceMappingURL=rectangle.js.map