@h4wldev/react-naver-maps
Version:
React Navermaps API integration for modern development.
1 lines • 7.42 kB
Source Map (JSON)
{"version":3,"sources":["../src/overlays/marker.tsx"],"sourcesContent":["import mapKeys from 'lodash.mapkeys';\nimport pick from 'lodash.pick';\nimport { forwardRef, useLayoutEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { useFirstMountState } from 'react-use';\n\nimport { HandleEvents } from '../helpers/event';\nimport { Overlay } from '../overlay';\nimport type { UIEventHandlers } from '../types/event';\nimport { useNavermaps } from '../use-navermaps';\nimport { getKeys } from '../utils/get-keys';\nimport { omitUndefined } from '../utils/omit-undefined';\nimport { getUncontrolledKey, makeUncontrolledKeyMap, UncontrolledKey } from '../utils/uncontrolled';\n\nconst primitiveKeys = [\n 'animation',\n 'icon',\n 'shape',\n 'title',\n 'cursor',\n 'clickable',\n 'draggable',\n 'visible',\n 'zIndex',\n] as const;\nconst locationalKeys = ['position'] as const;\nconst uncontrolledKeyMap = makeUncontrolledKeyMap(locationalKeys);\nconst kvoKeys = [\n ...primitiveKeys,\n ...locationalKeys,\n] as const;\nconst kvoEvents = kvoKeys.map(key => `${key}_changed`);\nconst uiEvents = [\n 'mousedown',\n 'mouseup',\n 'click',\n 'dblclick',\n 'rightclick',\n 'mouseover',\n 'mouseout',\n 'dragstart',\n 'drag',\n 'dragend',\n] as const;\nconst events = [...uiEvents, ...kvoEvents];\n\ntype MarkerKVO = {\n /** Animation??? */\n animation: naver.maps.Animation;\n position: naver.maps.Coord | naver.maps.CoordLiteral;\n icon: string | naver.maps.ImageIcon | naver.maps.SymbolIcon | naver.maps.HtmlIcon;\n shape: naver.maps.MarkerShape;\n title: string;\n cursor: string;\n clickable: boolean;\n draggable: boolean;\n visible: boolean;\n zIndex: number;\n};\n\ntype UncontrolledProps = {\n [key in typeof locationalKeys[number] as UncontrolledKey<key>]: MarkerKVO[key];\n};\n\n// TODO: Fix DefinitelyTyped\ntype MarkerOptions = Partial<MarkerKVO>;\n\nexport type Props = MarkerOptions & Partial<UncontrolledProps> & UIEventHandlers<typeof uiEvents> & {\n onAnimationChanged?: (value: naver.maps.Animation) => void;\n onPositionChanged?: (value: naver.maps.Coord) => void;\n onIconChanged?: (value: string | naver.maps.ImageIcon | naver.maps.HtmlIcon | naver.maps.SymbolIcon) => void;\n onShapeChanged?: (event: naver.maps.MarkerShape) => void;\n onTitleChanged?: (event: string) => void;\n onCursorChanged?: (event: string) => void;\n onClickableChanged?: (event: boolean) => void;\n onDraggableChanged?: (event: boolean) => void;\n onVisibleChanged?: (event: boolean) => void;\n /**\n * hello yeah\n * @param event helo?\n * @returns\n */\n onZIndexChanged?: (event: number) => void;\n};\n\nfunction makeInitialOption(props: Props) {\n const uncontrolledProps = pick(props, getKeys(uncontrolledKeyMap));\n const prefixCleared = mapKeys(uncontrolledProps, (_, key) => uncontrolledKeyMap[key as keyof typeof uncontrolledKeyMap]);\n const kvoProps = pick(props, kvoKeys);\n\n return omitUndefined({ ...kvoProps, ...prefixCleared });\n}\n\nfunction isLocationalKey(key: string): key is typeof locationalKeys[number] {\n return locationalKeys.includes(key as typeof locationalKeys[number]);\n}\n\nfunction isEqualKvo(kvo: any, target: any) {\n if (kvo === undefined) {\n return false;\n }\n\n if (kvo === target) {\n return true;\n }\n\n try {\n return kvo.equals(target);\n } catch {\n return kvo === target;\n }\n}\n\nexport const Marker = forwardRef<naver.maps.Marker, Props>(function Marker(props, ref) {\n const navermaps = useNavermaps();\n const [marker] = useState(() => new navermaps.Marker(makeInitialOption(props) as naver.maps.MarkerOptions));\n useImperativeHandle<naver.maps.Marker | undefined, naver.maps.Marker | undefined>(ref, () => marker);\n\n // make dirties\n const isFirst = useFirstMountState();\n const dirtiesRef = useRef<Pick<Props, typeof kvoKeys[number]>>({});\n dirtiesRef.current = getDirties();\n\n function getDirties() {\n // initialize의 option과 중복되지 않도록 첫 렌더시 제외한다.\n if (isFirst) {\n return {};\n }\n\n return kvoKeys.reduce((acc, key) => {\n if (props[key] === undefined) {\n return acc;\n }\n\n if (isLocationalKey(key) && props[getUncontrolledKey(key)] !== undefined) {\n return acc;\n }\n\n const kvos = marker.getOptions(key);\n if (isEqualKvo(kvos[key], props[key])) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: props[key],\n };\n }, {});\n }\n\n function pickDirties(keys: readonly string[]) {\n return pick(dirtiesRef.current, keys);\n }\n\n // side effects\n useLayoutEffect(() => {\n const { position } = pickDirties(['position']);\n if (position) {\n marker.setPosition(position);\n }\n }, [dirtiesRef.current['position']]);\n\n useLayoutEffect(() => {\n const dirties = pickDirties(primitiveKeys);\n if (Object.values(dirties).length < 1) {\n return;\n }\n\n marker.setOptions(dirties as naver.maps.MarkerOptions);\n }, primitiveKeys.map(key => dirtiesRef.current[key]));\n\n return (\n <Overlay element={marker}>\n <HandleEvents events={events} listeners={props as any} />\n </Overlay>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,SAAS,YAAY,iBAAiB,qBAAqB,QAAQ,gBAAgB;AACnF,SAAS,0BAA0B;AAyK7B;AA/JN,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,iBAAiB,CAAC,UAAU;AAClC,IAAM,qBAAqB,uBAAuB,cAAc;AAChE,IAAM,UAAU;AAAA,EACd,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,YAAY,QAAQ,IAAI,SAAO,GAAG,aAAa;AACrD,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,SAAS,CAAC,GAAG,UAAU,GAAG,SAAS;AAyCzC,SAAS,kBAAkB,OAAc;AACvC,QAAM,oBAAoB,KAAK,OAAO,QAAQ,kBAAkB,CAAC;AACjE,QAAM,gBAAgB,QAAQ,mBAAmB,CAAC,GAAG,QAAQ,mBAAmB,GAAsC,CAAC;AACvH,QAAM,WAAW,KAAK,OAAO,OAAO;AAEpC,SAAO,cAAc,EAAE,GAAG,UAAU,GAAG,cAAc,CAAC;AACxD;AAEA,SAAS,gBAAgB,KAAmD;AAC1E,SAAO,eAAe,SAAS,GAAoC;AACrE;AAEA,SAAS,WAAW,KAAU,QAAa;AACzC,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,IAAI,OAAO,MAAM;AAAA,EAC1B,QAAE;AACA,WAAO,QAAQ;AAAA,EACjB;AACF;AAEO,IAAM,SAAS,WAAqC,SAASA,QAAO,OAAO,KAAK;AACrF,QAAM,YAAY,aAAa;AAC/B,QAAM,CAAC,MAAM,IAAI,SAAS,MAAM,IAAI,UAAU,OAAO,kBAAkB,KAAK,CAA6B,CAAC;AAC1G,sBAAkF,KAAK,MAAM,MAAM;AAGnG,QAAM,UAAU,mBAAmB;AACnC,QAAM,aAAa,OAA4C,CAAC,CAAC;AACjE,aAAW,UAAU,WAAW;AAEhC,WAAS,aAAa;AAEpB,QAAI,SAAS;AACX,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,QAAQ,OAAO,CAAC,KAAK,QAAQ;AAClC,UAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB,GAAG,KAAK,MAAM,mBAAmB,GAAG,CAAC,MAAM,QAAW;AACxE,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,OAAO,WAAW,GAAG;AAClC,UAAI,WAAW,KAAK,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG;AACrC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG,MAAM,GAAG;AAAA,MAClB;AAAA,IACF,GAAG,CAAC,CAAC;AAAA,EACP;AAEA,WAAS,YAAY,MAAyB;AAC5C,WAAO,KAAK,WAAW,SAAS,IAAI;AAAA,EACtC;AAGA,kBAAgB,MAAM;AACpB,UAAM,EAAE,SAAS,IAAI,YAAY,CAAC,UAAU,CAAC;AAC7C,QAAI,UAAU;AACZ,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,UAAU,CAAC,CAAC;AAEnC,kBAAgB,MAAM;AACpB,UAAM,UAAU,YAAY,aAAa;AACzC,QAAI,OAAO,OAAO,OAAO,EAAE,SAAS,GAAG;AACrC;AAAA,IACF;AAEA,WAAO,WAAW,OAAmC;AAAA,EACvD,GAAG,cAAc,IAAI,SAAO,WAAW,QAAQ,GAAG,CAAC,CAAC;AAEpD,SACE,oBAAC,WAAQ,SAAS,QAChB,8BAAC,gBAAa,QAAgB,WAAW,OAAc,GACzD;AAEJ,CAAC;","names":["Marker"]}