{"version":3,"file":"282.2623bb047a46a4073821.chunk.js","mappings":"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","sources":["webpack:///./src/widget/components/react_mapbox/utils/tooltip.ts","webpack:///./src/widget/components/react_mapbox/utils/normalizeMapboxParams.ts","webpack:///./src/widget/components/react_mapbox/constants.ts","webpack:///./src/widget/components/react_mapbox/index.tsx"],"sourcesContent":["import { JSX } from 'preact';\nimport mapboxgl, { Popup } from 'mapbox-gl';\n\nimport { device } from '../../../lib/device';\nimport { Settings } from '../../../types/widget_settings.types';\nimport { WidgetLayoutSettings } from '../../../types/config/layout.types';\nimport { IWidget } from '../../../types/widget.types';\n\nconst getClassName = (isMobile: boolean, isABGroup: boolean): string => {\n if (isMobile) {\n if (isABGroup) {\n return 'mapboxgl-popup--mobile';\n }\n return 'mapboxgl-popup--centered';\n }\n return '';\n};\n\nexport const createPopup = (\n wrapper: HTMLDivElement,\n params: { offset: number; element: JSX.Element | HTMLElement },\n widget: IWidget,\n settings: Settings,\n breakpoints: WidgetLayoutSettings['breakpoints'],\n): Popup => {\n const { offset } = params;\n const popupWrapper = wrapper;\n const abTest = settings.config.globals.ab_test;\n const isMobile = device.isMobile() || widget.wrapper.offsetWidth <= breakpoints.s;\n\n popupWrapper.className = 'popup';\n\n const popup = new mapboxgl.Popup({\n offset,\n maxWidth: 'none',\n className: getClassName(isMobile, abTest?.ab_test_group === 'B'),\n closeOnMove: true,\n closeButton: false,\n closeOnClick: true,\n focusAfterOpen: false,\n }).setDOMContent(wrapper);\n\n return popup;\n};\n","import { ParsedMapboxParams } from '../react_mapbox.types';\nimport { DEFAULT_RADIUS, DEFAULT_ZOOM } from '../constants';\nimport { WidgetParams } from '../../../types/config/params.types';\n\nconst stringToBoolean = (string?: string): boolean => string !== 'false';\n\nexport const normalizeMapboxParams = (params: WidgetParams): ParsedMapboxParams => {\n return {\n ...params,\n draggable: stringToBoolean(params.draggable),\n show_logo: stringToBoolean(params.show_logo),\n scrollwheel: stringToBoolean(params.scrollwheel),\n disable_zoom: stringToBoolean(params.disable_zoom),\n width: params.width ? parseInt(params.width, 10) : 320,\n height: params.height ? parseInt(params.height, 10) : 240,\n zoom: params.zoom ? parseInt(params.zoom, 10) : DEFAULT_ZOOM,\n lat: params.lat,\n lng: params.lng,\n radius: params.radius ? parseInt(params.radius, 10) : DEFAULT_RADIUS,\n };\n};\n","export const DEFAULT_LAT = 7.893587;\nexport const DEFAULT_LON = 98.29682;\nexport const DEFAULT_RADIUS = 60;\nexport const DEFAULT_ZOOM = 15;\n","import { cloneElement, Component, createRef, JSX, RefObject, render, toChildArray } from 'preact';\nimport mapboxgl, { Map, Marker, Popup } from 'mapbox-gl';\nimport SuperCluster from 'supercluster';\n\nimport { device } from '../../lib/device';\nimport { emitter } from '../../lib/event_emitter/initialized';\nimport { createWidgetRequestService } from '../../lib/widget_request';\nimport { DataProvider } from '../../lib/data_provider';\nimport { getWhereami } from '../../api/whereami/api';\nimport { debounce } from '../../../shared/lib/utils';\n\nimport { createPopup } from './utils/tooltip';\nimport { normalizeMapboxParams } from './utils/normalizeMapboxParams';\nimport { DEFAULT_LAT, DEFAULT_LON } from './constants';\nimport {\n ICluster,\n IData,\n IDataItem,\n IFeature,\n IItemData,\n IMarkerParams,\n IReactMapboxProps,\n ParsedMapboxParams,\n UserLocation,\n} from './react_mapbox.types';\n\nimport './index.css';\n\nmapboxgl.setRTLTextPlugin(\n 'https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.js',\n (error) => {\n if (error) {\n console.error(error);\n }\n },\n true,\n);\n\n// eslint-disable-next-line import/no-default-export\nexport default class ReactMapbox extends Component {\n readonly mapContainer: RefObject;\n\n markers: {\n [key: string]: Marker;\n };\n\n markersOnMap: {\n [key: string]: Marker;\n };\n\n popupShowFirstTime: boolean;\n\n superCluster: SuperCluster | null;\n\n detectedUserLocation: UserLocation | null;\n\n constructor(props: IReactMapboxProps) {\n super(props);\n this.mapContainer = createRef();\n this.markers = {};\n this.markersOnMap = {};\n this.superCluster = null;\n this.popupShowFirstTime = false;\n this.detectedUserLocation = null;\n }\n\n async componentDidMount() {\n const {\n widget: { params },\n isAB,\n } = this.props;\n\n // TODO на поправить парамсы из src что бы boolean приходили не как стринг\n const parsedParams = normalizeMapboxParams(params);\n\n const { lat, lng } = parsedParams;\n if (!parsedParams.origin && !lat && !lng) {\n this.detectedUserLocation = await this.detectUserLocation(params.locale);\n }\n\n const map = this.initMap(parsedParams, isAB);\n\n map.on('load', () => {\n map.addSource('hotels', {\n type: 'geojson',\n data: {\n type: 'FeatureCollection',\n features: [],\n },\n });\n map.resize();\n const clusterRadius = parsedParams.radius;\n this.superCluster = this.createSuperClusterForLayer(map, 'hotels', clusterRadius);\n const bounds = this.getBounds(map);\n this.updateMap(map, bounds);\n this.addMapEvents(map);\n });\n }\n\n // eslint-disable-next-line\n private cancelRequest: () => void = () => {};\n\n createSuperClusterForLayer = (map: Map, sourceId: string, clusterRadius: number) => {\n const layerSource: any = map.getSource(sourceId);\n // https://github.com/mapbox/mapbox-gl-js/blob/master/src/data/extent.js\n const extent = 8192;\n const scale = extent / layerSource.tileSize;\n const superCluster = new SuperCluster({\n radius: clusterRadius * scale,\n extent,\n maxZoom: layerSource.maxzoom - 1,\n });\n return superCluster;\n };\n\n initMap = (params: ParsedMapboxParams, isAB: boolean | undefined) => {\n const token = 'nBDuKdIoJCVsdFHSNj9N';\n const { zoom, scrollwheel, draggable, disable_zoom: disableZoom, lat, lng } = params;\n\n const { widget, breakpoints } = this.props;\n\n const style = isAB\n ? 'https://maptiles.avs.io/styles/osm-bright/style.json'\n : `https://api.maptiler.com/maps/bright/style.json?key=${token}`;\n\n const latFromParams = lat ? parseFloat(lat) : DEFAULT_LAT;\n const lngFromParams = lng ? parseFloat(lng) : DEFAULT_LON;\n\n const finalLat = this.detectedUserLocation?.lat || latFromParams;\n const finalLng = this.detectedUserLocation?.lng || lngFromParams;\n\n const map = new mapboxgl.Map({\n container: this.mapContainer.current as HTMLElement,\n style,\n center: [finalLng, finalLat],\n zoom,\n scrollZoom: scrollwheel,\n dragRotate: draggable,\n dragPan: draggable,\n });\n if (!disableZoom) {\n const nav = new mapboxgl.NavigationControl({\n showCompass: false,\n showZoom: !disableZoom && !device.isMobile() && widget.wrapper.offsetWidth > breakpoints.s,\n });\n map.addControl(nav, 'bottom-right');\n }\n return map;\n };\n\n getBounds = (map: Map) => {\n const boundsArray = map.getBounds().toArray();\n return `((${boundsArray[0][1]}, ${boundsArray[0][0]}), (${boundsArray[1][1]}, ${boundsArray[1][0]}))`;\n };\n\n addMapEvents = (map: Map): void => {\n map.on(\n 'moveend',\n debounce((): any => {\n const bounds = this.getBounds(map);\n const { children } = this.props;\n this.addCluster(map, children, this.superCluster);\n this.updateMap(map, bounds);\n }, 100),\n );\n };\n\n updateMap = (map: Map, bounds: string): void => {\n this.sendRequests({ bounds }, (data) => {\n const {\n children,\n field: {\n params: { dataFilter },\n },\n widget: { params },\n } = this.props;\n const filteredData: IDataItem[] = dataFilter ? dataFilter(data.items, params) : data.items;\n if (this.superCluster) {\n this.superCluster.load(filteredData as any);\n this.addCluster(map, children, this.superCluster);\n }\n });\n };\n\n addMarkerOnMap = (\n map: Map,\n markers: { [key: string]: Marker },\n children: JSX.Element[],\n item: IFeature,\n ): void => {\n const newMarkers = markers;\n const { id } = item;\n const { widget, settings, providerProps } = this.props;\n const { wrapper } = widget;\n let marker = this.markers[id];\n let popup;\n let markerWrapper;\n if (!marker) {\n const { coordinates } = item.geometry;\n const [lng, lat] = coordinates;\n const { field, breakpoints } = this.props;\n const updatedChildren = this.updateChildrenData(children, item.properties);\n const isCompact =\n wrapper.offsetWidth <= breakpoints.s &&\n settings.config.globals.ab_test?.ab_test_group === 'B';\n const tooltipId = isCompact ? field.params.tooltip_compact : field.params.tooltip;\n const popupElement =\n updatedChildren.find((element: JSX.Element) => element.props.id === tooltipId) ||\n document.createElement('div');\n\n const markerElement =\n updatedChildren.find((element: JSX.Element) => element.props.id === field.params.marker) ||\n document.createElement('div');\n const popupWrapper = document.createElement('div');\n markerWrapper = document.createElement('div');\n // eslint-disable-next-line react/jsx-props-no-spreading\n render({popupElement}, popupWrapper);\n // eslint-disable-next-line react/jsx-props-no-spreading\n render({markerElement}, markerWrapper);\n\n popup = createPopup(\n popupWrapper,\n {\n offset: 20,\n element: popupElement,\n },\n widget,\n settings,\n breakpoints,\n );\n\n marker = this.createMarker(markerWrapper, {\n lat,\n lng,\n popup,\n element: markerElement,\n });\n this.markers[id] = marker;\n this.addMarkerEvents(marker, markerWrapper, popup);\n }\n if (!this.markersOnMap[id]) marker.addTo(map);\n if (popup && !this.popupShowFirstTime) {\n marker.togglePopup();\n markerWrapper?.classList.add('marker--active');\n this.popupShowFirstTime = true;\n }\n newMarkers[id] = marker;\n };\n\n addCluster = (map: Map, children: JSX.Element[], superCluster: any): void => {\n const newMarkers: { [key: string]: Marker } = {};\n const {\n field: {\n params: { clusterSorting },\n },\n } = this.props;\n const bounds = map.getBounds();\n const boundingBox = [bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth()];\n const mapZoom = map.getZoom();\n const zoomLevel = Math.floor(mapZoom); // current zoom level\n const clustersFromSuperCluster = superCluster.getClusters(boundingBox, zoomLevel);\n clustersFromSuperCluster.forEach((cluster: ICluster) => {\n if (cluster.properties.cluster) {\n const clusterId = cluster.properties.cluster_id;\n const leafs: IFeature[] = superCluster.getLeaves(clusterId, Infinity, 0);\n const sortedLeafs: IFeature[] = clusterSorting ? clusterSorting(leafs) : leafs;\n const firstSortedLeaf: IFeature = sortedLeafs[0];\n\n this.addMarkerOnMap(map, newMarkers, children, firstSortedLeaf);\n } else {\n this.addMarkerOnMap(map, newMarkers, children, cluster as any);\n }\n });\n Object.keys(this.markersOnMap).forEach((id) => {\n if (!newMarkers[id]) {\n this.markersOnMap[id].remove();\n }\n });\n this.markersOnMap = newMarkers;\n };\n\n sendRequests = (params: { bounds: string }, callback: (data: IData) => void) => {\n const { widget, field } = this.props;\n const { params: widgetParams } = widget;\n const mergedParams = { ...widgetParams, ...params };\n const dataRequest = field.params.dataRequests;\n const url =\n typeof dataRequest.url === 'function'\n ? dataRequest.url(mergedParams, this.detectedUserLocation?.iata)\n : dataRequest.url;\n const { get } = createWidgetRequestService({ url });\n\n const { cancel, request } = get({ path: '/', attempts: 3 });\n\n this.cancelRequest();\n\n request.then((data) => {\n if (data) {\n callback(data);\n }\n });\n\n this.cancelRequest = cancel;\n };\n\n createMarker = (wrapper: HTMLDivElement, params: IMarkerParams): Marker => {\n const { lat, lng, popup } = params;\n const markerWrapper = wrapper;\n markerWrapper.className = 'marker';\n const marker = new mapboxgl.Marker(wrapper)\n .setLngLat([lng, lat])\n .setPopup(popup)\n .setOffset([0, -15]);\n return marker;\n };\n\n updateChildrenData = (children: JSX.Element[], data: IItemData): JSX.Element[] => {\n const update = (node: JSX.Element, updateData: IItemData) => {\n const childrenCount = toChildArray(node.props.children).length;\n if (Array.isArray(node)) {\n return node;\n }\n if (childrenCount) {\n const nodeClone = cloneElement(node, {\n ...node.props,\n componentData: updateData,\n detectedIata: this.detectedUserLocation?.iata,\n });\n nodeClone.props.children = nodeClone.props.children.map((child: JSX.Element) =>\n update(child, updateData),\n );\n return nodeClone;\n }\n const nodeClone = cloneElement(node, {\n ...node.props,\n componentData: updateData,\n detectedIata: this.detectedUserLocation?.iata,\n });\n return nodeClone;\n };\n return children.map((child) => update(child, data));\n };\n\n addMarkerEvents = (marker: Marker, markerWrapper: HTMLElement, popup: Popup): void => {\n const { widget, breakpoints } = this.props;\n const { id, wrapper } = widget;\n\n emitter.addListener(`${id}_closeAllPopup`, () => {\n if (popup.isOpen()) {\n marker.togglePopup();\n }\n });\n\n popup.on('close', () => markerWrapper.classList.remove('marker--active'));\n\n popup.on('open', () => {\n const map = this.mapContainer.current as HTMLDivElement;\n const popupRect = popup.getElement().getBoundingClientRect();\n const mapRect = map.getBoundingClientRect();\n const popupPosition = { x: popupRect.x + popupRect.width, y: popupRect.y + popupRect.height };\n const mapPosition = { x: mapRect.x + mapRect.width, y: mapRect.y + mapRect.height };\n\n const inMap = popupPosition.x > mapPosition.x || popupPosition.y > mapPosition.y;\n\n const isNotMobileClassName = !popup.getElement().classList.contains('mapboxgl-popup--mobile');\n\n if (inMap && isNotMobileClassName) {\n popup.addClassName('mapboxgl-popup--centered');\n }\n\n if (wrapper.offsetWidth > breakpoints.s) {\n popup.removeClassName('mapboxgl-popup--mobile');\n }\n\n markerWrapper.classList.add('marker--active');\n });\n\n if (!device.isTouch() as boolean) {\n markerWrapper.addEventListener('click', (event) => {\n event.preventDefault();\n });\n } else {\n markerWrapper.addEventListener('touchend', (event) => {\n event.preventDefault();\n emitter.emitEvent(`${id}_closeAllPopup`);\n marker.togglePopup();\n });\n }\n };\n\n prepareLabelUrl = () => {\n const { field } = this.props;\n const url =\n typeof field.params.label.url === 'function'\n ? field.params.label.url(this.props)\n : field.params.label.url;\n\n return url;\n };\n\n async detectUserLocation(locale: string): Promise {\n const { iata, coordinates } = await getWhereami({ locale });\n const [lng, lat] = coordinates.split(':').map((coord) => parseFloat(coord));\n return {\n iata,\n lng,\n lat,\n };\n }\n\n render() {\n const { field, widget } = this.props;\n const {\n params: { show_logo: showLogo },\n } = widget;\n // TODO: на поправить парамсы из src что бы boolean приходили не как стринг\n const showLogoFromParams = showLogo === 'false' ? false : showLogo;\n const labelUrl = this.prepareLabelUrl();\n return (\n
\n {field.params.label && showLogoFromParams && (\n {\n if (el && field.params.label.bg_color) {\n el.style.setProperty('background-color', field.params.label.bg_color, 'important');\n }\n }}\n >\n {\n if (el) {\n el.style.setProperty('width', `${field.params.label.width}px`, 'important');\n el.style.setProperty('height', `${field.params.label.height}px`, 'important');\n el.style.setProperty('background-image', `url(${labelUrl})`, 'important');\n }\n }}\n />\n
\n )}\n
} />\n
\n );\n }\n}\n"],"names":["getClassName","isMobile","isABGroup","stringToBoolean","string","normalizeMapboxParams","params","draggable","show_logo","scrollwheel","disable_zoom","width","parseInt","height","zoom","lat","lng","radius","mapboxgl","error","console","ReactMapbox","props","map","sourceId","clusterRadius","layerSource","getSource","scale","tileSize","SuperCluster","extent","maxZoom","maxzoom","isAB","disableZoom","widget","breakpoints","style","latFromParams","parseFloat","lngFromParams","finalLat","detectedUserLocation","finalLng","container","mapContainer","current","center","scrollZoom","dragRotate","dragPan","nav","showCompass","showZoom","device","wrapper","offsetWidth","s","addControl","boundsArray","getBounds","toArray","on","debounce","bounds","children","addCluster","superCluster","updateMap","sendRequests","data","dataFilter","field","filteredData","items","load","markers","item","popup","markerWrapper","newMarkers","id","settings","providerProps","marker","coordinates","geometry","updatedChildren","updateChildrenData","properties","tooltipId","config","globals","ab_test","ab_test_group","tooltip_compact","tooltip","popupElement","find","element","document","createElement","markerElement","popupWrapper","render","offset","abTest","className","maxWidth","closeOnMove","closeButton","closeOnClick","focusAfterOpen","setDOMContent","createPopup","createMarker","addMarkerEvents","markersOnMap","addTo","popupShowFirstTime","togglePopup","classList","add","clusterSorting","boundingBox","getWest","getSouth","getEast","getNorth","mapZoom","getZoom","zoomLevel","Math","floor","getClusters","forEach","cluster","clusterId","cluster_id","leafs","getLeaves","Infinity","firstSortedLeaf","addMarkerOnMap","Object","keys","remove","callback","mergedParams","dataRequest","dataRequests","url","iata","get","createWidgetRequestService","path","attempts","cancel","request","cancelRequest","then","setLngLat","setPopup","setOffset","update","node","updateData","childrenCount","toChildArray","length","Array","isArray","nodeClone","cloneElement","componentData","detectedIata","child","emitter","isOpen","popupRect","getElement","getBoundingClientRect","mapRect","popupPosition","x","y","mapPosition","inMap","isNotMobileClassName","contains","addClassName","removeClassName","addEventListener","event","preventDefault","label","createRef","this","parsedParams","origin","detectUserLocation","locale","initMap","addSource","type","features","resize","createSuperClusterForLayer","addMapEvents","getWhereami","split","coord","showLogo","showLogoFromParams","labelUrl","prepareLabelUrl","ref","el","bg_color","setProperty","Component"],"sourceRoot":""}