{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { wait } from \"@web3r/flowerkit/fn\";\r\nimport { getMergedObj } from \"@web3r/flowerkit/obj\";\r\nimport type {\r\n  GeoObject, IEvent, IGeometry, IOverlay, map, Placemark,\r\n} from \"yandex-maps\";\r\nimport { getNextClustersByPointClick } from \"./getNextClustersByPointClick\";\r\nimport { handleBalloonDestroy } from \"./handleBalloonDestroy\";\r\nimport { pointDefaults } from \"../../config\";\r\nimport type {\r\n  ILayoutBalloon,\r\n  ILayoutHint, ILayoutIcon,\r\n  TAPI, TBalloonInstance, TConstructorInstance,\r\n  TFactoryCallback,\r\n  TMapContext, TMapInstance,\r\n  TPlacemarkElements,\r\n  TPoint, TPointDefaults,\r\n  IMapRef,\r\n  TPointMetaObj,\r\n} from \"../../config/types\";\r\nimport {\r\n  getLayoutConstructor, getUserField, isCoordsValid, isValidLayout, managePaneVariables,\r\n} from \"../index\";\r\n\r\n/**\r\n * Получает кластеры с предустановленными параметрами\r\n * @param points{TPoint[]=}\r\n * @param options\r\n * @returns TPoint[]\r\n */\r\nconst getNormalizedPoints = (points: TPoint[], options: Partial<TPointDefaults> = pointDefaults) => {\r\n  return (Array.isArray(points) ? points : [])\r\n    .filter((point) => {\r\n      if (!!point && point.id && isCoordsValid(point.coords)) {\r\n        return true;\r\n      } else {\r\n        console.error(`[Map] All points must have \"id\" (string) and \"coords\" (array with two numbers) props`, point);\r\n        return false;\r\n      }\r\n    })\r\n    .map((point) => {\r\n      const defaults = {\r\n        ...pointDefaults,\r\n        ...options,\r\n      };\r\n      const merged = getMergedObj(defaults, point, {\r\n        isMergeArrays: false,\r\n      });\r\n      merged.icon.size = point?.icon?.size ?? defaults.icon.size;\r\n      return merged;\r\n    });\r\n};\r\n\r\n/**\r\n * Получает экземпляр вызова templateLayoutFactory для указанного типа элемента\r\n * @param ymaps\r\n * @param props\r\n * @param getCN\r\n * @param callback\r\n * @param type\r\n * @returns {object}\r\n */\r\nconst PlacemarkInstanceLayout = async function<T, CB = TBalloonInstance>({\r\n  ymaps, props, getCN, callback, type, map,\r\n}: {\r\n  ymaps: TAPI;\r\n  props: TPoint;\r\n  getCN: TMapContext[\"getCN\"];\r\n  callback?: TFactoryCallback<CB>;\r\n  type: TPlacemarkElements;\r\n  map: TMapInstance;\r\n}): Promise<TConstructorInstance<T>> {\r\n\r\n  const meta: TPointMetaObj = (props?.meta ?? {})[type] ?? {};\r\n\r\n  const metaItems = Object.entries(meta || []);\r\n\r\n  const metaValues = await Promise.all(metaItems.map((([ name, value ]) => {\n    const userFnArg = { point: props, instance: ymaps, getCN };\n    return getUserField(value, userFnArg).then((computedValue): [ string, string ] => [ name, computedValue ]);\n  })))\n    .then((values) => {\r\n      return Object.fromEntries(values);\r\n    });\r\n\r\n  return getPlacemarkLayout({\r\n    point: props,\r\n    instance: ymaps,\r\n    type,\r\n    getCN,\r\n  })\r\n    .then((html: string) => {\r\n      return getLayoutConstructor<T, CB>(ymaps, html, callback, metaValues);\r\n    });\r\n};\r\n\r\n/**\r\n * Получает разметку для Placemark\r\n * @param getCN{Function}\r\n * @param point{TPoint}\r\n * @param type{String}\r\n * @param instance{TAPI}\r\n * @returns {string}\r\n */\r\nconst getPlacemarkLayout = async ({\r\n  getCN,\r\n  type,\r\n  instance,\r\n  point,\r\n}: {\r\n  getCN: TMapContext[\"getCN\"];\r\n  point: TPoint;\r\n  type: TPlacemarkElements;\r\n  instance: TAPI;\r\n}): Promise<string> => {\r\n\r\n  const userFnArg = { point, instance, getCN };\r\n\r\n  return new Promise<string>((resolve, reject) => {\n    void (async () => {\n      switch (type) {\n        case \"hint\": {\r\n          const { getLayout = null, extraClasses = {} } = point.render?.hint ?? {};\r\n          if (typeof getLayout === \"function\") { // user layout\r\n            await getUserField(getLayout, userFnArg).then((layout) => {\r\n              return resolve(layout);\r\n            });\r\n          } else { // default layout\r\n            resolve(`\r\n          <div class=\"${getCN(\"hint\", extraClasses)}\" id=\"hint_${point.id}\">\r\n            <div class=\"${getCN(\"hintInner\")}\">\r\n              {% if properties.hintHeader %}<div class=\"${getCN(\"hintTitle\")}\">{{ properties.hintHeader|raw }}</div>{% endif %}\r\n              {% if properties.hintContent %}<div class=\"${getCN(\"hintDescription\")}\">{{ properties.hintContent|raw }}</div>{% endif %}\r\n            </div>\r\n          </div>\r\n        `);\r\n          }\r\n          break;\r\n        }\r\n        case \"pane\":\r\n        case \"balloon\": {\r\n          const { getLayout = null, extraClasses = {} } = point.render?.balloon ?? {};\r\n          if (typeof getLayout === \"function\") { // user layout\r\n            await getUserField(getLayout, userFnArg).then((layout) => {\r\n              return resolve(layout);\r\n            });\r\n          } else { // default layout\r\n            resolve(`\r\n            <div class=\"${getCN(\"balloon\", { ...extraClasses, isPane: type === \"pane\" })}\" id=\"balloon_${point.id}\">\r\n              <div class=\"${getCN(\"balloonInner\")}\">\r\n                {% if properties.balloonHeader %}<div class=\"${getCN(\"balloonTitle\")}\">{{ properties.balloonHeader|raw }}</div>{% endif %}\r\n                {% if properties.balloonContent %}<div class=\"${getCN(\"balloonDescription\")}\">{{ properties.balloonContent|raw }}</div>{% endif %}\r\n              </div>\r\n              <div class=\"${getCN(\"balloonClose\")}\">\r\n                <button data-js-map-balloon-close=\"\" type=\"button\" class=\"${getCN(\"balloonCloseBtn\")}\">\r\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"3rem\" viewBox=\"0 -960 960 960\" width=\"3rem\" fill=\"currentColor\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n                </button>\r\n              </div>\r\n            </div>\r\n          `);\r\n          }\r\n          break;\r\n        }\r\n        case \"icon\": {\r\n          const { getLayout = null, extraClasses = {} } = point.render?.icon ?? {};\r\n          if (typeof getLayout === \"function\") { // user layout\r\n            await getUserField(getLayout, userFnArg).then((layout) => {\r\n              return resolve(layout);\r\n            });\r\n          } else { // default layout\r\n            const title = await getUserField(point.meta?.icon?.title ?? null, userFnArg)\r\n              .then((data) => isValidLayout(data) ? data : \"\")\r\n              .catch(() => \"\");\r\n            const alt = title.replace(/<\\/?[^>]+(>|$)/g, \"\");\r\n            const [ defaultWidth, defaultHeight ] = pointDefaults.icon.size;\r\n            const [ width = defaultWidth, height = defaultHeight ] = point?.icon?.size ?? [ defaultWidth, defaultHeight ];\r\n\r\n            const bc = getCN(\"placemark\");\r\n            const cn = getCN(\"placemark\", extraClasses);\r\n\r\n            resolve(`\r\n            <div style=\"--yaMapPlacemarkWidth: ${width}px; --yaMapPlacemarkHeight: ${height}px\" class=\"${cn} {% if properties.isActive %}${bc}--isActive{% endif %} {% if properties.isInteract %}${bc}--isInteract{% endif %} {% if properties.isOpen %}${bc}--isOpen{% endif %}{% if properties.isDisabled %}${bc}--isDisabled{% endif %}\" id=\"placemark_${point.id}\">\r\n              <div class=\"${getCN(\"placemarkImageBox\")}\">\r\n                <img width=\"${width}\" height=\"${height}\" class=\"${getCN(\"placemarkImageSrc\")}\" src=\"{% if properties.isActive %}${point?.icon?.src?.active}{% elseif properties.isDisabled %}${point?.icon?.src?.disabled}{% else %}${point?.icon?.src?.default}{% endif %}\" alt=\"${alt}\" loading=\"lazy\" />\r\n              </div>\r\n            </div>\r\n          `);\r\n          }\r\n          break;\r\n        }\r\n        default:\n          throw new Error(`Unsupported type \"${type}\"`);\n      }\n    })().catch(reject);\n  })\n    .then((layout) => {\r\n      return isValidLayout(layout) ? layout : Promise.reject(point);\r\n    })\r\n    .catch((err) => {\r\n      console.error(\"[Maps] Something went wrong while parsing layout: \", err);\r\n      return \"\";\r\n    });\r\n};\r\n\r\n/**\r\n * Получает элемент из событий Placemark\r\n * @param event{IEvent}\r\n * @returns {HTMLElement|null}\r\n */\r\nconst getNodeFromPlacemarkEvent: ((event: IEvent) => HTMLElement | null) = (event) => {\r\n  if (event) {\r\n    const source = event.getSourceEvent();\r\n    const target = source?.originalEvent?.target as map.Container;\r\n    return target?.getElement() ?? null;\r\n  } else {\r\n    return null;\r\n  }\r\n};\r\n\r\n/**\r\n * Получает вычисленное свойство из блока `meta` точки через обращение к экземпляру вызова фабрики классов\r\n * @returns {*}\r\n */\r\nconst getPropFromInstanceLayout: ((instance: TConstructorInstance<ILayoutHint> | TConstructorInstance<ILayoutIcon> | TConstructorInstance<ILayoutBalloon> | string, prop?: string) => unknown) = (instance, prop) => {\r\n  return (typeof instance === \"string\") ? instance : instance.getProps(prop);\r\n};\r\n\r\n/**\r\n * Выполняет стандартное поведение, если у события не вызван метод `preventDefault`\r\n * @param event\r\n * @param action\r\n * @param defaultFn\r\n */\r\nconst handlePreventableEvent = ({ event, action, defaultFn }: {\r\n  event: IEvent;\r\n  action?: () => void;\r\n  defaultFn: () => void;\r\n}) => {\r\n  if (typeof action === \"function\") {\r\n    action();\r\n    if (!event.getSourceEvent()?.isDefaultPrevented()) {\r\n      defaultFn();\r\n    }\r\n  } else {\r\n    defaultFn();\r\n  }\r\n};\r\n\r\n/**\r\n * Получает данные точки без состояния\r\n * @param point{TPoint}\r\n * @returns {Object}\r\n */\r\nconst getPointDataForCallback = (point: TPoint): Omit<TPoint, \"state\" | \"render\" | \"options\"> => {\r\n  const pointData = { ...point };\r\n  [\r\n    \"state\",\r\n    \"render\",\r\n    \"options\",\r\n  ]\r\n    .forEach((prop) => {\r\n      delete pointData[prop as keyof TPoint];\r\n    });\r\n  return pointData;\r\n};\r\n\r\n/**\r\n * Получает флаг видимости точки в текущей зоне просмотра\r\n * @returns {Boolean}\r\n */\r\nconst isPlacemarkVisible = (placemark: Placemark): boolean => {\r\n  if (!placemark.getMap()) {\r\n    return false;\r\n  }\r\n  const map = placemark.getMap();\r\n  const bounds = map.getBounds();\r\n  const coordinates = placemark?.geometry?.getCoordinates();\r\n\r\n  if (Array.isArray(coordinates)) {\r\n    const [ lat, lon ] = coordinates;\r\n    const [ [ south, west ], [ north, east ] ] = bounds;\r\n    return lat >= south && lat <= north && lon >= west && lon <= east;\r\n  } else {\r\n    return false;\r\n  }\r\n};\r\n\r\n/**\r\n * Открывает или закрывает балун, если он существует у точки\r\n * @returns {Promise<void>}\r\n */\r\nconst getWithBalloon = async (instance: Placemark, isOpen = true, containerRef?: TMapContext[\"containerRef\"]): Promise<GeoObject<IGeometry, Record<string, unknown>> | void> => {\r\n\r\n  const manageVars = async (isAdd = true) => {\r\n    const overlay = await instance.balloon.getOverlay();\r\n    const paneNode = (overlay as IOverlay & {\r\n      getElement: () => HTMLElement | null;\r\n    })?.getElement();\r\n    managePaneVariables(containerRef, isAdd, paneNode);\r\n  };\r\n\r\n  if (!!instance.balloon) {\r\n    if (isOpen) {\r\n      if (instance.balloon.isOpen()) { // already opened\r\n        return Promise.resolve();\r\n      } else { // try to open\r\n        return instance.balloon.open()\r\n          .then(async () => {\r\n            await manageVars(true);\r\n            return Promise.resolve();\r\n          });\r\n      }\r\n    } else {\r\n      if (instance.balloon.isOpen()) { // opened\r\n        return instance.balloon.close()\r\n          .then(async () => {\r\n            await manageVars(false);\r\n            return Promise.resolve();\r\n          });\r\n      } else { // already closed\r\n        return Promise.resolve();\r\n      }\r\n    }\r\n  } else {\r\n    // not exist\r\n    return Promise.resolve();\r\n  }\r\n};\r\n\r\n/**\r\n * Открывает или закрывает балун, если точка видна во viewport\r\n * @returns Promise<ReturnType<typeof getWithBalloon>>\r\n */\r\nconst getInView = async (instance: Placemark, mapRef: IMapRef[\"ref\"], point: TPoint, containerRef?: TMapContext[\"containerRef\"]): Promise<ReturnType<typeof getWithBalloon>> => {\r\n\r\n  if (!mapRef) {\r\n    return Promise.resolve();\r\n  }\r\n\r\n  const map = mapRef.current;\r\n\r\n  if (!map) {\r\n    return Promise.resolve();\r\n  }\r\n\r\n  if (isPlacemarkVisible(instance)) { // placemark in user viewport\r\n    return await getWithBalloon(instance, true, containerRef);\r\n  }\r\n\r\n  const coords = instance?.geometry?.getCoordinates() || point.coords;\r\n\r\n  // Check when `instance.getMap()` is ready\r\n  const isMapReady = async () => {\r\n    if (instance.getMap()) {\r\n      return Promise.resolve();\r\n    } else {\r\n      return Promise.race([\r\n        // bind `overlaychange` event on Placemark\r\n        new Promise<void>((resolve, reject) => {\r\n          async function onOverlayChange() {\r\n            if (instance.getMap()) {\r\n              await wait(500);\r\n              resolve();\r\n            } else {\r\n              reject();\r\n            }\r\n            instance.events.remove(\"overlaychange\", onOverlayChange);\r\n          }\r\n          instance.events.add(\"overlaychange\", onOverlayChange);\r\n        }),\r\n        // wait 3 s. and check again\r\n        new Promise<void>((resolve, reject) => wait(3000)\r\n          .finally(() => {\r\n            if (instance.getMap()) {\r\n              resolve();\r\n            } else {\r\n              console.error(`[Map] Failed to wait map on balloon`, instance);\r\n              reject();\r\n            }\r\n          })\r\n        ),\r\n      ]);\r\n    }\r\n  };\r\n\r\n  // Set new center and zoom\r\n  return map.panTo(coords, {\r\n    checkZoomRange: true,\r\n    useMapMargin: true,\r\n    duration: 2000,\r\n    flying: true,\r\n    safe: true,\r\n  }).then(async () => {\r\n\r\n    // Wait for map\r\n    await isMapReady();\r\n\r\n    if (isPlacemarkVisible(instance)) {\r\n      return await getWithBalloon(instance, true, containerRef);\r\n    }\r\n\r\n    // @ts-expect-error (api)\r\n    const maxZoom: number = map.options.get(\"maxZoom\") as unknown as number;\r\n\r\n    return map.setZoom(maxZoom, {\r\n      checkZoomRange: false,\r\n      useMapMargin: true,\r\n      duration: 0,\r\n    })\r\n      .then(async () => {\r\n        // When point is removed/recreated, previous placemark has no map.\r\n        if (!instance?.getMap?.() || !isPlacemarkVisible(instance)) {\r\n          return Promise.resolve();\r\n        }\r\n        return await getWithBalloon(instance, true, containerRef);\r\n      })\r\n      .catch((err: Error) => {\r\n        console.error(err);\r\n        return Promise.reject(err);\r\n      });\r\n  });\r\n};\r\nexport {\r\n  getInView,\r\n  getNextClustersByPointClick,\r\n  getNodeFromPlacemarkEvent,\r\n  getNormalizedPoints,\r\n  getPlacemarkLayout,\r\n  getPointDataForCallback,\r\n  getPropFromInstanceLayout,\r\n  getWithBalloon,\r\n  handleBalloonDestroy,\r\n  handlePreventableEvent,\r\n  isPlacemarkVisible,\r\n  PlacemarkInstanceLayout,\r\n};\r\n\r\n\r\n"],"names":["getNormalizedPoints","points","options","pointDefaults","Array","isArray","filter","point","id","isCoordsValid","coords","console","error","map","defaults","merged","getMergedObj","isMergeArrays","icon","size","PlacemarkInstanceLayout","async","ymaps","props","getCN","callback","type","meta","metaItems","Object","entries","metaValues","Promise","all","name","value","userFnArg","instance","getUserField","then","computedValue","values","fromEntries","getPlacemarkLayout","html","getLayoutConstructor","resolve","reject","getLayout","extraClasses","render","hint","layout","balloon","isPane","title","data","isValidLayout","catch","alt","replace","defaultWidth","defaultHeight","width","height","bc","cn","src","active","disabled","default","Error","err","getNodeFromPlacemarkEvent","event","source","getSourceEvent","target","originalEvent","getElement","getPropFromInstanceLayout","prop","getProps","handlePreventableEvent","action","defaultFn","isDefaultPrevented","getPointDataForCallback","pointData","forEach","isPlacemarkVisible","placemark","getMap","bounds","getBounds","coordinates","geometry","getCoordinates","lat","lon","south","west","north","east","getWithBalloon","isOpen","containerRef","manageVars","isAdd","overlay","getOverlay","paneNode","managePaneVariables","open","close","getInView","mapRef","current","isMapReady","race","onOverlayChange","wait","events","remove","add","finally","panTo","checkZoomRange","useMapMargin","duration","flying","safe","maxZoom","get","setZoom"],"mappings":"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"}