{"version":3,"sources":["../src/overlays/marker.tsx"],"sourcesContent":["import mapKeys from 'lodash.mapkeys';\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 { 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 = Object.fromEntries(Object.entries(props).filter(([key]) => key in uncontrolledKeyMap)) as Record<string, any>;\n  const prefixCleared = mapKeys(uncontrolledProps, (_, key) => uncontrolledKeyMap[key as keyof typeof uncontrolledKeyMap]);\n  const kvoProps = Object.fromEntries(kvoKeys.map(key => [key, props[key]])) as Partial<MarkerKVO>;\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 Object.fromEntries(keys.map(key => [key, dirtiesRef.current[key as keyof typeof dirtiesRef.current]])) as Pick<Props, typeof kvoKeys[number]>;\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":"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","names":["Marker"]}