@davi-ai/retorik-map 2.0.2 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +145 -61
- package/dist/index.css.map +1 -1
- package/dist/index.js +14 -12
- package/dist/index.js.map +1 -1
- package/dist/index.modern.css +145 -61
- package/dist/index.modern.css.map +1 -1
- package/dist/index.modern.js +15 -13
- package/dist/index.modern.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index_module.tsx","src/components/BotPOIExtensionDisplay.tsx","src/components/Icons/MapIcon.tsx","src/features/poiSlice.ts","src/features/mapSlice.ts","src/translations/labels.ts","src/components/Map.tsx","src/styles/icons/dataUrlIcons.ts","src/features/tenantSlice.ts","src/features/botSlice.ts","src/utils/botUtils.ts","src/models/constants.ts","src/translations/map.json","src/components/MapFilter.tsx","src/models/POI.ts","src/translations/mapFilter.json","src/components/MapFilterItem.tsx","src/components/LocationMarker.tsx","src/utils/MarkerIcons.ts","src/components/POIDetail.tsx","src/utils/globalUtils.ts","src/translations/poi.json","src/components/Routes.tsx","src/components/RoutesItem.tsx","src/utils/routeUtils.ts","src/components/Icons/index.ts","src/components/Icons/CyclingRegularIcon.tsx","src/components/Icons/DrivingCarIcon.tsx","src/components/Icons/FootWalkingIcon.tsx","src/components/Icons/OpenLocationIcon.tsx","src/components/Icons/RoundIcon.tsx","src/components/Icons/TriangleIcon.tsx","src/components/QRCodeComponent.tsx","src/components/CustomLoader.tsx","src/components/POILoader.tsx","src/services/tenantService.ts","src/utils/poiUtils.ts","src/stores/globalStore.ts","src/features/authSlice.ts"],"sourcesContent":["import React, { useMemo } from 'react'\r\nimport { Provider } from 'react-redux'\r\nimport L from 'leaflet'\r\nimport type { LatLngExpression } from 'leaflet'\r\nimport { BotPOIExtensionDisplay } from './components/BotPOIExtensionDisplay'\r\nimport type { Tenant } from './models/Tenant'\r\nimport { MapDisplay } from './components/Map'\r\nimport { POILoader } from './components/POILoader'\r\nimport { setupStore } from './stores/globalStore'\r\nimport { hospitalityImages } from './styles/icons/dataUrlIcons'\r\n\r\nimport {\r\n iconRestaurant,\r\n iconAFaire,\r\n iconHebergement,\r\n iconAVoir,\r\n iconProduit,\r\n iconService,\r\n createGenericIcon\r\n} from './utils/MarkerIcons'\r\n\r\nimport './styles/module.scss'\r\nimport type { MapLabel, MapSettings } from './models/Map'\r\nimport { HospitalityPOIType as POIType } from './models/POI'\r\nimport { defaultColor } from './models/constants'\r\n\r\n/**\r\n * Interactive map's props\r\n * @param {string | undefined} activeTenant the key of the active tenant defined in tenantList\r\n * @param {boolean | undefined} isDevTenant using a dev tenant ?\r\n * @param {Record<string, Tenant>} tenantList list of the tenants with their data that can be used in this instance of interactive map\r\n * @param {LatLngExpression | undefined} userLocation position of the user\r\n * @param {LatLngExpression | undefined} mapCenter position of the center of the map\r\n * @param {number | undefined} limitAroundCenter limit the map around the center, default 200km. Min zoom will be set depending on this number with 3 breakpoints : 0->199 / 200->599 / 599->?\r\n * @param {MapSettings | undefined} settings categogy settings\r\n */\r\ninterface MapProps {\r\n activeTenant?: string\r\n isDevTenant?: boolean\r\n tenantList: Record<string, Tenant>\r\n userLocation?: LatLngExpression\r\n mapCenter?: LatLngExpression\r\n limitAroundCenter?: number\r\n settings?: MapSettings\r\n}\r\n\r\nconst defaultHospitalityIcons: { [name: string]: L.Icon } = {\r\n restaurant: iconRestaurant,\r\n afaire: iconAFaire,\r\n avoir: iconAVoir,\r\n hebergement: iconHebergement,\r\n produit: iconProduit,\r\n service: iconService\r\n}\r\n\r\nconst store = setupStore()\r\nconst Map = ({\r\n activeTenant,\r\n isDevTenant,\r\n tenantList,\r\n userLocation,\r\n mapCenter,\r\n limitAroundCenter,\r\n settings\r\n}: MapProps): JSX.Element => {\r\n const hospitalityCategories = useMemo<Array<string>>(() => {\r\n if (settings?.categories) {\r\n if (settings?.hospitalityCategories) {\r\n return Object.keys(settings.hospitalityCategories).filter(\r\n (key) => settings.hospitalityCategories?.[key]?.display\r\n )\r\n }\r\n } else if (settings?.hospitalityCategories) {\r\n return Object.keys(settings.hospitalityCategories).filter(\r\n (key) => settings.hospitalityCategories?.[key]?.display\r\n )\r\n } else if (settings?.showFilter) {\r\n return settings.showFilter\r\n }\r\n\r\n // By default return all hospitality categories\r\n return Object.keys(POIType)\r\n }, [settings])\r\n\r\n const leafletIcons = useMemo<{ [type: string]: L.Icon }>(() => {\r\n const tempIcons = { ...defaultHospitalityIcons }\r\n\r\n // Create pin icons for categories\r\n if (settings?.categories) {\r\n settings.categories.forEach((category) => {\r\n const icon = createGenericIcon(\r\n category.color || defaultColor,\r\n category.filter?.iconUrl\r\n )\r\n tempIcons[category.name] = icon\r\n })\r\n }\r\n\r\n // Modify pin icons for hospitality categories that have their default color changed\r\n if (settings?.hospitalityCategories) {\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display && values.color) {\r\n const icon = createGenericIcon(\r\n values.color,\r\n hospitalityImages[type]\r\n )\r\n tempIcons[type] = icon\r\n }\r\n }\r\n )\r\n }\r\n\r\n return tempIcons\r\n }, [settings])\r\n\r\n return (\r\n <React.Fragment>\r\n {activeTenant && (\r\n <Provider store={store}>\r\n <MapDisplay\r\n activeTenant={activeTenant}\r\n isDevTenant={isDevTenant}\r\n tenantList={tenantList}\r\n userLocation={userLocation}\r\n mapCenter={mapCenter}\r\n limitAroundCenter={limitAroundCenter}\r\n settings={settings}\r\n icons={leafletIcons}\r\n />\r\n <POILoader\r\n retorikName={tenantList[activeTenant].retorikName}\r\n useDevTenant={!!isDevTenant}\r\n customCategories={settings?.categories}\r\n hospitalityCategories={hospitalityCategories}\r\n />\r\n <BotPOIExtensionDisplay />\r\n </Provider>\r\n )}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport { MapIcon } from './components/Icons/MapIcon'\r\nexport { Map, POIType }\r\nexport { labels } from './translations/labels'\r\nexport type { MapSettings, MapLabel }\r\nexport type { Tenant } from './models/Tenant'\r\n","import React, { useEffect } from 'react'\r\nimport {\r\n CurrentSubView,\r\n RetorikEvent,\r\n setCurrentCustomView,\r\n useUtilsStore\r\n} from '@davi-ai/retorik-framework'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport '../styles/components/BotPOIExtensionDisplay.scss'\r\nimport { MapIcon } from '../components/Icons/MapIcon'\r\nimport {\r\n setDetailOpennedByMap,\r\n setDisplayPOIFinished\r\n} from '../features/poiSlice'\r\nimport { toggleLoader } from '../features/mapSlice'\r\nimport { labels } from '../translations/labels'\r\n\r\nconst BotPOIExtensionDisplay = (): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const retorikEvent = useUtilsStore((state) => state.retorikEvent)\r\n const currentSubView = useUtilsStore((state) => state.currentSubView)\r\n const displayPOIFinished = useSelector(\r\n (state: RootState) => state.poi.displayPOIFinished\r\n )\r\n const detailOpennedByMap = useSelector(\r\n (state: RootState) => state.poi.detailOpennedByMap\r\n )\r\n\r\n useEffect(() => {\r\n if (\r\n retorikEvent &&\r\n retorikEvent === RetorikEvent.DetailViewClose &&\r\n currentSubView === CurrentSubView.none &&\r\n displayPOIFinished\r\n ) {\r\n // Check if POI detail was opened by MAP\r\n if (detailOpennedByMap) {\r\n console.log('Retorik Map > Re-open map')\r\n // Re-Open Map\r\n setCurrentCustomView({\r\n customDisplay: 'mapDisplay',\r\n label: labels,\r\n icon: <MapIcon />,\r\n indice: 1\r\n })\r\n // Reset state\r\n dispatch(setDetailOpennedByMap({ detailOpennedByMap: false }))\r\n dispatch(setDisplayPOIFinished({ displayPOIFinished: false }))\r\n }\r\n } else if (retorikEvent && retorikEvent === RetorikEvent.DetailViewOpen) {\r\n dispatch(\r\n setDisplayPOIFinished({\r\n displayPOIFinished: true\r\n })\r\n )\r\n dispatch(\r\n toggleLoader({\r\n loading: false\r\n })\r\n )\r\n }\r\n }, [retorikEvent])\r\n\r\n return <></>\r\n}\r\n\r\nexport { BotPOIExtensionDisplay }\r\n","import React from 'react'\r\n\r\nconst MapIcon = (): JSX.Element => {\r\n return (\r\n <svg\r\n version='1.1'\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n width: '100%',\r\n height: '100%'\r\n }}\r\n viewBox='0 0 512 512'\r\n xmlSpace='preserve'>\r\n <g fill='#1999B1'>\r\n <g>\r\n <path\r\n d='M256,93.297c-14.021,0-27.516,4.218-39.025,12.198c-3.402,2.359-4.262,7.05-1.921,10.478\r\n c2.342,3.428,6.998,4.294,10.4,1.936c9.004-6.243,19.566-9.543,30.546-9.543c29.754,0,53.96,24.388,53.96,54.365\r\n c0,29.977-24.206,54.366-53.96,54.366c-29.754,0-53.96-24.389-53.96-54.366c0-8.843,2.038-17.273,6.057-25.055\r\n c1.906-3.692,0.482-8.241-3.182-10.161c-3.665-1.919-8.178-0.486-10.085,3.206c-5.067,9.812-7.746,20.881-7.746,32.01\r\n C187.085,201.018,218,232.166,256,232.166s68.915-31.148,68.915-69.435C324.915,124.445,294,93.297,256,93.297z'\r\n />\r\n </g>\r\n </g>\r\n <g fill='#1999B1'>\r\n <g>\r\n <path\r\n d='M511.426,501.571l-73.804-178.665c-1.16-2.809-3.883-4.639-6.903-4.639h-73.547\r\n c14.305-19.498,26.212-38.919,35.511-57.988c16.48-33.794,24.835-66.613,24.835-97.547C417.517,73.001,345.061,0,256,0\r\n S94.483,73.001,94.483,162.731c0,30.934,8.355,63.754,24.835,97.547c9.298,19.069,21.205,38.491,35.511,57.988H81.282\r\n c-3.02,0-5.744,1.831-6.903,4.639L24.087,444.651c-1.587,3.842,0.217,8.252,4.03,9.85c0.94,0.394,1.912,0.581,2.87,0.581\r\n c2.93,0,5.711-1.746,6.906-4.641l7.176-17.372h50.906l-26.38,63.862H18.69l7.647-18.513c1.587-3.842-0.217-8.252-4.03-9.85\r\n c-3.815-1.601-8.191,0.219-9.777,4.06L0.575,501.571c-0.961,2.325-0.705,4.981,0.683,7.075c1.386,2.095,3.72,3.354,6.22,3.354\r\n h497.044c2.499,0,4.834-1.259,6.221-3.354C512.13,506.552,512.387,503.896,511.426,501.571z M109.439,162.731\r\n c0-81.422,65.747-147.663,146.561-147.663S402.561,81.31,402.561,162.731c0,34.143-11.775,88.703-66.245,158.231\r\n c-0.055,0.065-0.104,0.134-0.156,0.201c-2.782,3.547-5.672,7.132-8.681,10.757c-29.932,36.062-60.222,62.395-71.48,71.751\r\n c-11.225-9.324-41.372-35.525-71.283-71.518c-3.084-3.711-6.042-7.38-8.889-11.01c-0.046-0.058-0.089-0.118-0.137-0.175\r\n C121.222,251.445,109.439,196.887,109.439,162.731z M86.269,333.335h50.907l-18.568,44.948H67.702L86.269,333.335z\r\n M129.997,496.932l46.741-113.148l133.014,113.148H129.997z M332.935,496.932L332.935,496.932l-154.352-131.3\r\n c-1.822-1.551-4.27-2.132-6.584-1.566c-2.316,0.565-4.228,2.21-5.143,4.427l-53.057,128.438H85.795l28.296-68.502\r\n c0.961-2.325,0.705-4.98-0.683-7.075c-1.386-2.095-3.721-3.354-6.221-3.354H51.296l10.182-24.65h62.118\r\n c3.02,0,5.744-1.831,6.903-4.639l22.876-55.377h12.978c2.253,2.83,4.543,5.661,6.894,8.491\r\n c38.585,46.43,76.578,76.239,78.177,77.486c1.348,1.051,2.962,1.575,4.576,1.575s3.229-0.525,4.576-1.575\r\n c0.879-0.685,12.757-10.009,29.673-25.96h84.681c4.13,0,7.478-3.373,7.478-7.534s-3.348-7.534-7.478-7.534h-69.269\r\n c10.368-10.503,21.7-22.749,33.093-36.457c2.351-2.83,4.642-5.66,6.894-8.491h80.083l18.567,44.948h-39.457\r\n c-4.13,0-7.478,3.373-7.478,7.534s3.347,7.534,7.478,7.534h45.681l10.182,24.65h-154.07c-3.121,0-5.913,1.952-7.006,4.898\r\n c-1.091,2.946-0.253,6.265,2.104,8.326l75.133,65.707H332.935z M399.681,496.932l-73.024-63.862H466.93l26.381,63.862H399.681z'\r\n />\r\n </g>\r\n </g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport { MapIcon }\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { POI } from '../models/POI'\r\n\r\ntype poiState = {\r\n poiList: POI[]\r\n detailOpennedByMap: boolean\r\n displayPOIFinished: boolean\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'poi',\r\n initialState: {\r\n poiList: [],\r\n detailOpennedByMap: false,\r\n displayPOIFinished: false\r\n } as poiState,\r\n reducers: {\r\n setPoiList: (\r\n state,\r\n { payload: { poiList } }: PayloadAction<{ poiList: POI[] }>\r\n ): void => {\r\n state.poiList = poiList\r\n },\r\n setDetailOpennedByMap: (\r\n state,\r\n {\r\n payload: { detailOpennedByMap }\r\n }: PayloadAction<{ detailOpennedByMap: boolean }>\r\n ): void => {\r\n state.detailOpennedByMap = detailOpennedByMap\r\n },\r\n setDisplayPOIFinished: (\r\n state,\r\n {\r\n payload: { displayPOIFinished }\r\n }: PayloadAction<{ displayPOIFinished: boolean }>\r\n ): void => {\r\n state.displayPOIFinished = displayPOIFinished\r\n }\r\n }\r\n})\r\n\r\nexport const { setPoiList, setDetailOpennedByMap, setDisplayPOIFinished } =\r\n slice.actions\r\n\r\nexport default slice.reducer\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { MapState } from '../models/Map'\r\nimport { LatLngExpression } from 'leaflet'\r\n\r\ntype mapState = {\r\n showFilters: boolean\r\n selectedFilters: string[]\r\n loading: boolean\r\n mapState: MapState | undefined\r\n currentUserLocation: LatLngExpression | undefined\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'map',\r\n initialState: {\r\n showFilters: false,\r\n loading: false,\r\n selectedFilters: [],\r\n mapState: undefined,\r\n currentUserLocation: undefined\r\n } as mapState,\r\n reducers: {\r\n toggleFilters: (\r\n state,\r\n { payload: { showFilters } }: PayloadAction<{ showFilters: boolean }>\r\n ): void => {\r\n state.showFilters = showFilters\r\n },\r\n updateFilters: (\r\n state,\r\n {\r\n payload: { selectedFilters }\r\n }: PayloadAction<{ selectedFilters: string[] }>\r\n ): void => {\r\n state.selectedFilters = selectedFilters\r\n },\r\n toggleLoader: (\r\n state,\r\n { payload: { loading } }: PayloadAction<{ loading: boolean }>\r\n ): void => {\r\n state.loading = loading\r\n },\r\n updateMapState: (\r\n state,\r\n { payload: { mapState } }: PayloadAction<{ mapState: MapState }>\r\n ): void => {\r\n state.mapState = mapState\r\n },\r\n updateUserLocation: (\r\n state,\r\n {\r\n payload: { currentUserLocation }\r\n }: PayloadAction<{ currentUserLocation: LatLngExpression | undefined }>\r\n ): void => {\r\n state.currentUserLocation = currentUserLocation\r\n }\r\n }\r\n})\r\n\r\nexport const {\r\n toggleFilters,\r\n toggleLoader,\r\n updateFilters,\r\n updateMapState,\r\n updateUserLocation\r\n} = slice.actions\r\n\r\nexport default slice.reducer\r\n","export const labels = {\r\n 'ar-EG': 'خريطة تفاعلية',\r\n 'ar-SA': 'خريطة تفاعلية',\r\n 'ca-ES': 'Carta interactiva',\r\n 'cs-CZ': 'Interaktivní mapa',\r\n 'da-DK': 'Interaktiv karte',\r\n 'de-AT': 'Interaktive Karte',\r\n 'de-CH': 'Interaktive Karte',\r\n 'de-DE': 'Interaktive Karte',\r\n 'en-CA': 'Interactive Map',\r\n 'en-GB': 'Interactive Map',\r\n 'en-HK': 'Interactive Map',\r\n 'en-IE': 'Interactive Map',\r\n 'en-IN': 'Interactive Map',\r\n 'en-US': 'Interactive Map',\r\n 'es-ES': 'Mapa interactivo',\r\n 'es-MX': 'Mapa interactivo',\r\n 'fi-FI': 'Interaktiivinen kartta',\r\n 'fr-BE': 'Carte interactive',\r\n 'fr-CA': 'Carte interactive',\r\n 'fr-CH': 'Carte interactive',\r\n 'fr-FR': 'Carte interactive',\r\n 'hi-IN': 'सक्रिय चार्ट',\r\n 'hu-HU': 'Interaktív térkép',\r\n 'id-ID': 'Peta Interaktif',\r\n 'it-IT': 'Mappa interattiva',\r\n 'ja-JP': 'インタラクティブマップ',\r\n 'ko-KR': '인터랙티브 맵',\r\n 'nb-NO': 'Interaktiv kart',\r\n 'nl-BE': 'Interactieve kaart',\r\n 'nl-NL': 'Interactieve kaart',\r\n 'pl-PL': 'Mapa interaktywna',\r\n 'pt-BR': 'Mapa interativo',\r\n 'pt-PT': 'Mapa interativo',\r\n 'ru-RU': 'Интерактивная карта',\r\n 'sv-SE': 'Interaktiv karta',\r\n 'th-TH': 'แผนที่อินเตอร์แอคทีฟ',\r\n 'tr-TR': 'İnteraktif harita',\r\n 'zh-CN': '交互式地图',\r\n 'zh-HK': '交互式地图',\r\n 'zh-TW': '交互式地圖'\r\n}\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport {\r\n CurrentSubView,\r\n RetorikEvent,\r\n useUtilsStore,\r\n useLocaleStore,\r\n setModalFullscreenContent\r\n} from '@davi-ai/retorik-framework'\r\n\r\nimport Leaflet, { LatLngBounds, LatLngExpression, MarkerCluster } from 'leaflet'\r\nimport type { GeoJSON as GeoJSONType } from 'leaflet'\r\nimport 'leaflet.markercluster'\r\nimport 'leaflet.markercluster.freezable'\r\nimport 'leaflet/dist/leaflet.css'\r\nimport {\r\n MapContainer,\r\n TileLayer,\r\n Marker,\r\n ZoomControl,\r\n GeoJSON\r\n} from 'react-leaflet'\r\nimport MarkerClusterGroup from 'react-leaflet-cluster/lib/index'\r\n\r\nimport type { FeatureCollection } from 'geojson'\r\n\r\nimport '../styles/components/Map.scss'\r\nimport {\r\n markerIcon,\r\n markerIconLarge,\r\n markerShadow,\r\n target\r\n} from '../styles/icons/dataUrlIcons'\r\n\r\nimport type { POI } from '../models/POI'\r\nimport type { RootState } from '../stores/globalStore'\r\n\r\nimport {\r\n updateMapState,\r\n updateUserLocation,\r\n toggleLoader\r\n} from '../features/mapSlice'\r\nimport { setActiveTenant, setTenantList } from '../features/tenantSlice'\r\nimport { setCSSInjected } from '../features/botSlice'\r\n\r\nimport type { MapSettings, MapState } from '../models/Map'\r\nimport type { Tenant } from '../models/Tenant'\r\nimport { injectShadowCSS } from '../utils/botUtils'\r\nimport { RETORIK_URL, RETORIK_URL_DEV } from '../models/constants'\r\n\r\nimport translation from '../translations/map.json'\r\n\r\nimport { MapFilter } from './MapFilter'\r\nimport { LocationMarker } from './LocationMarker'\r\nimport { POIDetail } from './POIDetail'\r\nimport CustomLoader from './CustomLoader'\r\n\r\nLeaflet.Icon.Default.imagePath = '../node_modules/leaflet'\r\n\r\nLeaflet.Icon.Default.mergeOptions({\r\n iconRetinaUrl: markerIconLarge,\r\n iconUrl: markerIcon,\r\n shadowUrl: markerShadow\r\n})\r\n\r\ninterface MapProps {\r\n activeTenant?: string\r\n isDevTenant?: boolean\r\n tenantList: { [key: string]: Tenant }\r\n userLocation?: LatLngExpression\r\n mapCenter?: LatLngExpression\r\n limitAroundCenter?: number\r\n settings?: MapSettings\r\n icons: { [key: string]: Leaflet.Icon }\r\n}\r\n\r\nconst defaultMapCenter: LatLngExpression = [46.912815, 3.301331]\r\nconst defaultDistanceAround = 200\r\n\r\nconst MapDisplay = ({\r\n activeTenant,\r\n isDevTenant,\r\n tenantList,\r\n userLocation,\r\n mapCenter,\r\n limitAroundCenter,\r\n settings,\r\n icons\r\n}: MapProps): JSX.Element => {\r\n const pois = useSelector((state: RootState) => state.poi.poiList)\r\n const dispatch = useDispatch()\r\n const locale = useLocaleStore((state) => state.locale)\r\n const retorikEvent = useUtilsStore((state) => state.retorikEvent)\r\n const currentSubView = useUtilsStore((state) => state.currentSubView)\r\n const botCSSInjected: boolean = useSelector(\r\n (state: RootState) => state.bot.CSSInjected\r\n )\r\n const currentUserPos = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const selectedFilters = useSelector(\r\n (state: RootState) => state.map.selectedFilters\r\n )\r\n const mapState = useSelector((state: RootState) => state.map.mapState)\r\n const activeTenantFromStore = useSelector(\r\n (state: RootState) => state.tenant.activeTenant\r\n )\r\n const tenantListFromStore = useSelector(\r\n (state: RootState) => state.tenant.tenantList\r\n )\r\n const loading = useSelector((state: RootState) => state.map.loading)\r\n\r\n const [aroundMeDistance, setAroundMeDistance] = useState<number>(15000)\r\n const [mapLayerData, setMapLayerData] = useState<\r\n FeatureCollection | undefined\r\n >(undefined)\r\n const geoJsonLayer = useRef<GeoJSONType | null>(null)\r\n const markersRef = useRef<Array<{ marker: Leaflet.Marker<any>; id: string }>>(\r\n []\r\n )\r\n const mapRef = useRef<Leaflet.Map | null>(null)\r\n const [selectedPOI, setSelectedPOI] = useState<POI | undefined>()\r\n\r\n const calculateBounds = (): LatLngBounds | undefined => {\r\n const center = mapCenter || userLocation || defaultMapCenter\r\n const latitude = Array.isArray(center) ? center[0] : center.lat\r\n const longitude = Array.isArray(center) ? center[1] : center.lng\r\n\r\n if (latitude && longitude) {\r\n // Latitude / longitude : about 111 km per degree => about 0.009 degree per kilometer\r\n const distanceInDegrees =\r\n (limitAroundCenter || defaultDistanceAround) * 0.009\r\n\r\n return new Leaflet.LatLngBounds(\r\n [latitude - distanceInDegrees, longitude - distanceInDegrees],\r\n [latitude + distanceInDegrees, longitude + distanceInDegrees]\r\n )\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n const [maxBounds] = useState<LatLngBounds | undefined>(calculateBounds())\r\n\r\n const poisToDisplay = useMemo<Array<POI>>(() => {\r\n if (pois && Array.isArray(pois) && pois.length && selectedFilters) {\r\n return pois?.filter((p: POI) => selectedFilters.some((f) => f === p.type))\r\n }\r\n\r\n return []\r\n }, [pois, selectedFilters])\r\n\r\n const closeLoader = (): void => {\r\n dispatch(toggleLoader({ loading: false }))\r\n }\r\n\r\n useEffect(() => {\r\n activeTenant && dispatch(setActiveTenant({ activeTenant: activeTenant }))\r\n }, [activeTenant])\r\n\r\n useEffect(() => {\r\n tenantList && dispatch(setTenantList({ tenantList: tenantList }))\r\n }, [tenantList])\r\n\r\n useEffect(() => {\r\n userLocation &&\r\n dispatch(updateUserLocation({ currentUserLocation: userLocation }))\r\n }, [userLocation])\r\n\r\n useEffect(() => {\r\n // Clear and add layer data to display the relevant route on the map\r\n if (geoJsonLayer.current) {\r\n mapLayerData && geoJsonLayer.current.clearLayers().addData(mapLayerData)\r\n }\r\n }, [mapLayerData])\r\n\r\n useEffect(() => {\r\n // Handle old state\r\n window.setTimeout(function () {\r\n mapRef.current?.whenReady(() => {\r\n console.log('Retorik Map > Map ready')\r\n mapRef.current?.invalidateSize()\r\n })\r\n\r\n if (mapState?.location && mapState.zoom) {\r\n if (mapRef.current) {\r\n mapRef.current.setView(mapState.location, mapState.zoom)\r\n mapRef.current.invalidateSize()\r\n }\r\n } else {\r\n // first time display map\r\n aroundMe()\r\n }\r\n }, 250)\r\n\r\n // Inject CSS to shadow if not already done\r\n if (!botCSSInjected) {\r\n injectShadowCSS()\r\n dispatch(setCSSInjected({ CSSInjected: true }))\r\n }\r\n\r\n if (!userLocation) {\r\n navigator.geolocation.getCurrentPosition(\r\n (res) => {\r\n if (res) {\r\n if (mapRef.current) {\r\n const center: LatLngExpression = {\r\n lat: res.coords.latitude,\r\n lng: res.coords.longitude\r\n }\r\n if (center !== currentUserPos)\r\n dispatch(updateUserLocation({ currentUserLocation: center }))\r\n }\r\n }\r\n },\r\n (error) => {\r\n console.warn(error)\r\n }\r\n )\r\n }\r\n\r\n document.addEventListener('retorikMapCloseLoader', closeLoader)\r\n\r\n return (): void => {\r\n console.log('Retorik Map > Destroy map component')\r\n // save map state\r\n if (markersRef.current && botCSSInjected) {\r\n const saveMapState: MapState = {\r\n zoom: mapRef.current?.getZoom(),\r\n location: mapRef.current?.getCenter()\r\n }\r\n\r\n dispatch(\r\n updateMapState({\r\n mapState: saveMapState\r\n })\r\n )\r\n }\r\n setSelectedPOI(undefined)\r\n dispatch(setCSSInjected({ CSSInjected: false }))\r\n\r\n document.removeEventListener('retorikMapCloseLoader', closeLoader)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (\r\n retorikEvent === RetorikEvent.DetailViewOpen &&\r\n currentSubView === CurrentSubView.custom\r\n ) {\r\n if (mapState && mapState.location && mapState.zoom) {\r\n if (mapRef.current) {\r\n window.setTimeout(function () {\r\n if (\r\n mapRef.current &&\r\n mapState &&\r\n mapState.location &&\r\n mapState.zoom\r\n ) {\r\n mapRef.current.setView(mapState.location, mapState.zoom)\r\n mapRef.current.whenReady(() => {\r\n console.log('Retorik Map > Map ready')\r\n if (mapRef && mapRef.current) mapRef.current.invalidateSize()\r\n })\r\n }\r\n }, 250)\r\n }\r\n }\r\n if (mapRef.current) {\r\n mapRef.current.invalidateSize()\r\n }\r\n }\r\n\r\n if (\r\n retorikEvent === RetorikEvent.DetailViewClose &&\r\n currentSubView === CurrentSubView.none\r\n ) {\r\n if (markersRef.current) {\r\n const saveMapState: MapState = {\r\n zoom: mapRef.current?.getZoom(),\r\n location: mapRef.current?.getCenter()\r\n }\r\n\r\n if (\r\n saveMapState.zoom !== undefined &&\r\n saveMapState.location !== undefined\r\n )\r\n dispatch(\r\n updateMapState({\r\n mapState: saveMapState\r\n })\r\n )\r\n }\r\n }\r\n }, [retorikEvent])\r\n\r\n useEffect(() => {\r\n const aroundMeDistance: number | undefined =\r\n tenantListFromStore[activeTenantFromStore]?.aroundMeDistance\r\n if (aroundMeDistance) {\r\n setAroundMeDistance(aroundMeDistance)\r\n }\r\n }, [tenantListFromStore, activeTenantFromStore])\r\n\r\n useEffect(() => {\r\n // Remove Marker HighLight\r\n markersRef.current.forEach((m) => {\r\n if (m && m.marker) {\r\n const element = m.marker.getElement()\r\n if (element) {\r\n element.classList.remove('markerSelected')\r\n }\r\n }\r\n })\r\n\r\n if (selectedPOI) {\r\n const selectedMarker = markersRef.current.find(\r\n (m) => m.id === selectedPOI.contentItemId\r\n )\r\n\r\n if (selectedMarker) {\r\n const element = selectedMarker.marker.getElement()\r\n // Highlight marker\r\n if (element) {\r\n element.classList.add('markerSelected')\r\n }\r\n }\r\n } else {\r\n // Remove route data on map\r\n setMapLayerData(undefined)\r\n }\r\n }, [selectedPOI])\r\n\r\n useEffect(() => {\r\n // remove Marker HighLight\r\n if (mapRef.current) {\r\n mapRef.current.removeEventListener('click')\r\n mapRef.current.addEventListener('click', () => {\r\n markersRef.current.forEach((m) => {\r\n if (m && m.marker) {\r\n const element = m.marker.getElement()\r\n if (element) {\r\n element.classList.remove('markerSelected')\r\n }\r\n setSelectedPOI(undefined)\r\n }\r\n })\r\n })\r\n }\r\n }, [mapRef.current])\r\n\r\n const markerClickHandler = (\r\n _e: Leaflet.LeafletMouseEvent,\r\n poi: POI\r\n ): void => {\r\n setSelectedPOI(poi)\r\n }\r\n\r\n const closePoi = (): void => {\r\n setSelectedPOI(undefined)\r\n }\r\n\r\n const aroundMe = (): void => {\r\n if (userLocation && tenantList && activeTenant) {\r\n handlerAroundMe(userLocation as Leaflet.LatLngLiteral)\r\n return\r\n }\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n (res) => {\r\n if (res) {\r\n const center: LatLngExpression = {\r\n lat: res.coords.latitude,\r\n lng: res.coords.longitude\r\n }\r\n if (\r\n tenantListFromStore &&\r\n tenantListFromStore[activeTenantFromStore]\r\n ) {\r\n handlerAroundMe(center)\r\n }\r\n }\r\n },\r\n (error) => {\r\n console.warn(error)\r\n }\r\n )\r\n }\r\n\r\n const handlerAroundMe = (center: Leaflet.LatLngLiteral): void => {\r\n if (mapRef.current) {\r\n dispatch(updateUserLocation({ currentUserLocation: center }))\r\n\r\n // Calculez les coordonnées des coins du rectangle de la zone de 10km autour du centre\r\n const southWest = Leaflet.latLng(center)\r\n .toBounds(aroundMeDistance ?? 5000)\r\n .getSouthWest()\r\n const northEast = Leaflet.latLng(center)\r\n .toBounds(aroundMeDistance ?? 5000)\r\n .getNorthEast()\r\n const bounds = Leaflet.latLngBounds(southWest, northEast)\r\n\r\n // Utilisez la méthode fitBounds() pour ajuster la vue de la carte à la zone de 10km autour du centre\r\n mapRef.current.fitBounds(bounds)\r\n\r\n if (mapRef.current !== undefined) {\r\n mapRef.current.eachLayer((l) => {\r\n if (\r\n l instanceof Leaflet.MarkerClusterGroup &&\r\n mapRef.current !== undefined\r\n ) {\r\n l.disableClustering()\r\n }\r\n })\r\n }\r\n\r\n mapRef.current.on('zoomend', function () {\r\n if (mapRef?.current && mapRef.current.getZoom() < 12) {\r\n if (mapRef.current !== undefined) {\r\n mapRef.current.eachLayer((l) => {\r\n if (\r\n l instanceof Leaflet.MarkerClusterGroup &&\r\n mapRef.current !== undefined\r\n ) {\r\n l.enableClustering()\r\n }\r\n })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n setModalFullscreenContent(loading ? <CustomLoader /> : null)\r\n }, [loading])\r\n\r\n return (\r\n <div\r\n className='mapContainer fadeIn'\r\n style={\r\n selectedPOI\r\n ? ({\r\n '--pointerColorHightlight': selectedPOI.color\r\n } as React.CSSProperties)\r\n : undefined\r\n }>\r\n {selectedPOI && (\r\n <POIDetail\r\n poi={selectedPOI}\r\n poiClose={closePoi}\r\n setMapLayerData={setMapLayerData}\r\n retorikAddress={isDevTenant ? RETORIK_URL_DEV : RETORIK_URL}\r\n />\r\n )}\r\n <MapContainer\r\n center={mapCenter || userLocation || defaultMapCenter}\r\n zoom={10}\r\n maxZoom={22}\r\n minZoom={\r\n limitAroundCenter\r\n ? limitAroundCenter > 599\r\n ? 9\r\n : limitAroundCenter > 199\r\n ? 10\r\n : 11\r\n : 10\r\n }\r\n maxBounds={maxBounds}\r\n maxBoundsViscosity={1}\r\n scrollWheelZoom\r\n whenReady={(): void => {}}\r\n className='rf-flex rf-h-screen'\r\n id='mapid'\r\n ref={mapRef}\r\n zoomControl={false}>\r\n <TileLayer\r\n maxNativeZoom={18}\r\n maxZoom={22}\r\n attribution='© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\r\n url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'\r\n />\r\n <MarkerClusterGroup\r\n chunkedLoading\r\n iconCreateFunction={(cluster: MarkerCluster): Leaflet.DivIcon => {\r\n return Leaflet.divIcon({\r\n html: `<span>${cluster.getChildCount()}</span>`,\r\n className: 'custom-marker-cluster',\r\n iconSize: Leaflet.point(33, 33, true)\r\n })\r\n }}\r\n maxClusterRadius={150}\r\n spiderfyOnMaxZoom>\r\n {poisToDisplay.map((poi: POI, i: number) => (\r\n <Marker\r\n key={poi.contentItemId}\r\n position={poi.location || { lat: 0, lng: 0 }}\r\n icon={icons[poi.type]}\r\n ref={(el): any => {\r\n if (el)\r\n markersRef.current[i] = {\r\n marker: el,\r\n id: poi.contentItemId\r\n }\r\n }}\r\n eventHandlers={{\r\n click: (c: Leaflet.LeafletMouseEvent): void =>\r\n markerClickHandler(c, poi)\r\n }}\r\n />\r\n ))}\r\n </MarkerClusterGroup>\r\n <ZoomControl\r\n key={Date.now()}\r\n position='bottomright'\r\n zoomInTitle={\r\n translation[locale]?.zoomintitle || translation['fr-FR'].zoomintitle\r\n }\r\n zoomOutTitle={\r\n translation[locale]?.zoomouttitle ||\r\n translation['fr-FR'].zoomouttitle\r\n }\r\n />\r\n {currentUserPos !== undefined && (\r\n <LocationMarker currentUserPos={currentUserPos} />\r\n )}\r\n {mapLayerData && selectedPOI && (\r\n <GeoJSON ref={geoJsonLayer} data={mapLayerData} />\r\n )}\r\n </MapContainer>\r\n <button\r\n id='around-me'\r\n onClick={aroundMe}\r\n title={`${\r\n translation[locale]?.aroundme1 || translation['fr-FR'].aroundme1\r\n } ${aroundMeDistance / 1000} ${\r\n translation[locale]?.aroundme2 || translation['fr-FR'].aroundme2\r\n }`}>\r\n <img id='map-target' src={target} alt='around me' />\r\n </button>\r\n <MapFilter settings={settings} />\r\n </div>\r\n )\r\n}\r\n\r\nexport { MapDisplay }\r\nexport type { MapProps }\r\n","const pinAFaire =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinAVoir =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOQAAAE/CAYAAABW2W/VAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7tXQe8FcX1nmdBRBFRFAWVh4gFRIqCiBAeXQmglJhiw5gYE2NNDIqFh4JimqBRE41/QU2MjWoFFAiIha6IRBQfRkAFlSKiBuU/3/Xusjt3dne23Z3dPZPfy8N3Z2dnzpzvnm/OnDlTwahoI4GdO3fuzzvTmv/gd5tix6z/xp8qiz8q/Z5tqbSJ/3tp8b+Nf2+uqKgw/qbSHtWJWQIVMbdPzUskwIEHsAF4AFeVAMAkZGYAtKYIWoB0GQcr/k6ljBIgQMYsbAv4ADwA0bB8Mb85kuYNoMLS4odAGolYnRshQEYs4CIAuxYtn2H9In5Los3BehoAnUNWNNq5IECGlGdx3XdGEYBnFuln4FZXb1hQeNb4jX+/u+E1s731m1ay7f/bqtT+kQe1N+sdsE9jVr9O48J/1y/8u5H5W6kx50oA52T+A3DSejSkMAmQAQRoAeEV/HHfFPSzL9axz7atLYBuXQFgW2wADNClUI8YAG12UAcTpFYw+2i8pgjOCQROH1KzVCVAKsrNAkJYQfwolS+5NTOAB0tntXxKDSRYCUBtxq3skRyojfY/lh1a7xg/vSFw+pFWsS4B0kNoHIhVvMr5/GeoinwNAL657oWC9cNPVsree9Zlh3JgtmzUgzU7uIMfgAKcY/kPLCd5bl0UggApEQ4HYaUFhPi3a1m/+T/s3Y9fYwBhmiyg17i8PjcsKAAKilubA1ahjC8Cc7ZC3dxVIUBaprwIxBEq1hAgXFgzuQBCrAepsILlbNmY/zTqrgJOWM1qbjEnkOx2SYAAyWVRpKUAYpWbcsAZM2/VQwRCBQQZ4DyxCRzQrgUUFnR2HNFZxnINSA5ErA2r+U+lm8osWjOFW8NJuaKjXihS/RzrzhMrB7LOzc8tbLW4FAImF04uAaliEQ1ruIgDUXXfT1VJ81oP68yTODg9rGaugZkrQKoAEU4Zg5bmFThxjxvOoM5HncvBeabbWjOXwMwFIIvOmtu5ojnuHxItjRuGpe0r0lkA84q8OH8yDcjiZv7lxXWiVOMAxBkr7iJPafnxaHsjrGXPFpe4rTMRlnclB+bshLsa6+szC8iiwwbeO5wnLCkr1r3Ipi4bQ0CMVb38NQ6L2bn5eQUHkMueJuJmL8iqRzZzgCzS0wf4pFXJ1AFrRFjEPG3g+4NF8rUVgAkaiz3Mccn3NtoeZAqQHIzYS0TAd4lVhNd0JgciNvOppEMCcP704jTWxSsL+gprWZOOEXn3MhOALJ5BhFUsOXmB2FJ4TeetepC2L7z1Qcsa2C4Z0OZap9jZTFnL1AOSg9Fw2pRYRdDSxxZeR+tELWHmv1NYX/Zq8Sun9WUmrGVqAVn0oMIqlmxlwCpO4w4boqf+lV73J0BjzzppdCGYXVJgLUFhU7suSSUgixv8k2RrRXhPH1swnOip7sgK2T/Eyp7VfrSTtRzPm8cWSeqOeqUOkEXHTbU4n2QVQ2p4Ch+HN/a8Tnc6WUvsWw5Mm8MnNYB0o6i0VkwhmiLsMtaW/VsPywSFTQUg3byoM1fcXdhXpJJvCSDFyFntb3HyxGLPcmQaJKQ9IDkY4bSB88bmRQVFnTD/UtrgT4OWlamPoLD9+faIw75lKtaVWgOSg3FoEYy2KcVpfYCRTuqXSdNT9hoXCot1ZTednT3aApKDEaczEHVjKwgGhxeVCknATQLYFjmfO3wkMbEAJbZG8Fu7oiUgORhBUWEdbeVxvslPe4va6ZC2HcKeJUApSV+J7RBYSu1AqRUgnTypWC8+tuC6Qi4bKiQBPxJw2RrREpTaALIIxllc2LZ4VIDxb3OGZiq/qR+ForrRSAAeWAdnD+jr+GjeEr4VLQDpBEZy3oSfYGphlwRcnD3agDJxQLqB8W+zz6cQOEJUpBJAZoIf8FhYSdEClIkCksAYqa5RY4oS0BmUiQGSwKioPVQtFgm4gBLxr4mdFkkSkDitYTs6hTUj0dRY9I8alUjAAZSJel8TAaRsn5HASJhJQgK6gbLsgORgRCY4nPI3C4ExCVWkdxoScAFl03KH2ZUVkLLYVAIjAUMHCTiAsuyxr2UDZPHUBtaNZsGm/9iZgylIXAeNpD7wM5XXFHLCCmU2t5LdyiWesgCyeJ4RUTjmESqKwCnXFNN7/EjAIaJnPAflBX7aCVo3dkA6bW88OP8yik0NOmv0XGwSQOzrL6omyALSyxI4UA5Almxv0KmN2PSJGo5AAgDl5b0miveMlGU7JFZAcutYzeWDbOJmofOMEWgMNRG7BJAS5Bddx4vnKWv4i9vG6XmNDZDFVI1YN5oFHtWxMwbFLkx6AUkgCgk4eF5jdfLEAsjiuvE90YlDHtUo1ITaKKcEHDyvI7mVBPuLvMQFyJJ1I8400o1Tkc8fNVgGCYC6SjKlg7pGnnEgckBy64g8OMiHYxZK1VgGraFXxCYBOHmu6TtDXE/GEjQQKSBl+42wirCOVEgCaZYAri44r9Md4hDGcStZkogtzDijBuQS3hkzBQdF4oSZGnpWNwk4rCeRLGt2VH2NDJAyqkr7jVFNE7WjgwQcggZqeN8i2wqJBJDFa8RhHc3QONxChWTGVEgCWZIA9icv7/lkbNQ1KkBiv7HK6CWo6phnelE+nCxpIo3FlACuWe/JL44VSiTUNTQgZUeqiKpGr70N6lby+Mqj2cF1j/RsfMPW99g6HoSxcSvYFJWoJeAQWreUryXbhn1XKEDKAgDIqxp2SuTPH3doVSGvaKvDenu+YPnamWzRmslsxTpboJTnc1RBXQLYl8T+pFBwSSwO4AcuYQFZzd9sxqqSVzXwPJQ8WNmgHfvJyX9k9fZuGLrRrV9uZP945TfsvY0LQ7dFDeySgOSoFgLQQ2UZCAzIoiMH4XFmoQCA8Or645P/wNoc3jd8Qw4tvP7BcwVwUgkvAYeAgQncSg4N2noYQNocOZ99sY6N44Hj27lDh4p/CTiEZ/lvSPGJmk+WsHtmnaNYm6o5ScAhG3rgsLpAgJSd5CBHTjClPb5xT3buKeOUHl7zyVK2fO0M9srqR9nXO7aXPLPn7rVZx2Y/ZK0a92ZNDrRdkeLYPqwlrCaV4BJAWF39Oo2sDQQ+ERIUkDbrSI6cYJN5Y/95bJ+96js+/Mnn77M7XzgrFOuovee+7NLujzJ4aZ3K9q+3sOqppwQbBD1VCDyXOHgCbYP4BqTMOtJJDv9aeduQNx0fmr3y7+zZ5bb4fP8vkDzRu+WlrMdxFzu2dc0Tx7Od/H9U/EtAsuQIZCWDANJmHSkix9/k7VaxO7t18OvSh7BNMWH+r/01GKA2KDKosqwMn9iaffPtjgCt5vuRqKykL0DKggDGPNub0jgq6qIbGJOwTk5W+tonTyiM6Nud3yiOjKpBAlFYSb+AxDaHuRih/Dj+FFEGgG1ffcpumtbFX0MR1r6+3xxWt3YDaYvDnmgZ4Zuy31QUVlIZkLK1I1lHdSWTgfGjLe+wP08/Q72RmGoiWBpB07JCoPQndEmwgK+1pB9A2taOZB3VJ+rSHo+xw+rbrc36zW/zhF8D1RuJuaasj3jluk0r2TieXZ6KmgQcToMoe1yVAFnMBIDjVWbBJGGyqLhLANsNV/d52lYJwRPVUzpqJ7oRA15idWqZJ+jM/t3Ovzg+5F8gVNQkIFlLKkfvqAJyPO/K+UZ3aN9RbWJQS0ZVdaaBTo4enfusPhvlqemwlkSMa41XDzwBKYtZpWsAvMT63ecXdrmPHd2wk60yPJg6ey8rWAUbM2R5yQDpS1htzo1akugdpfw7KoCs5i8xT3QgZhWHj6l4S0C0Nh989mYh8kb3cnHVg4UuNm1woq2rZCXVZ06SZHkTt5DOYVnFplUAadvqmLbsNjZv1XcTRsVZAiMGzOfrsXqpVmjxCwXH60ZouPbVVQ9HnvGKmDrS88IeV0DKtjrgjKATHd4qICpzGp1gDfc7il3Ve0qqv1S8Zyq+GpIsdZ5bIF6AHM+7azpzaKtDbfJkoWlppXviF8vK9XPYAy+V5JNRE0zOatXfpzG75vTp4qhdnTuOgCym5/jM2hoFkatplKjEExdXs1dXP672sGa1kDYEm93WktYvlyREK9kCcXXuuAFyKB/AA8YgyJmjNp2N92/BLutpB1/aFVj8grl71tkMZzOpeEtA4typ4c6dpk5PugFyMn/IjOsiZ4638FFDVF5kgPvj8/3UHta0liy0Lu1fMuUStUOaD8eMAlJAyugqxa2qTaEIyKwoblbHpTar4WpJ4lsdaasTIG03WNFFq2oTcsA+h7Fhpz+vVlmjWuLRr+Hff7HQO7eMd7D6sP5UvCUguajHkbY6AdJ2aQ7RVW+hjxq4iCGnTRpLEEBinDu++YpdN6ldGodc9j5L9iSltLUEkERX/c3VQXWbst/2ecrfQ5rVDgpIYxi3Tz+TfbhllWaj0qs7qrRVBsihfCimd5XoqvPEppWiiiMKC0i094fn+rKNn6/RCwUa9UZCW6VXD8gAOZ6PwwwGmLfqITZt2RiNhqZPV5xORtz37wvZOx+/ok9HI+xJs4M6sIu6mt/Xtpaz4sCKUFxmU/C2VvNQOqGUBAnIAIlgAPNQHAUDyKfnd6c9xw7c93DbhwtrJjPkp81DGdRuBDv5SHug/KYv1rNbn5Enz8qDTLzGKAkSKIlttQFSPIhMwcTOIhat49sfvcTun3uR15xk6vPzO93JWjTqTlZScVYlWc6n8CCBM62Pi4Cs5h+aR60oxaNc0l2an8f6tR5GisglIH4xTX/zTvbCW39VVNF8VZOk9yg5kiUC0hadQ9cDyBXGLVNbvlSsdLRJZ9HTXf5e2x8iIG3rxzQeGSrHhLhlHS/H+3V/Bzl3nGdIQvNtd0qagKT1o7qaEyDdZUWAdJaPZB1pS4BlBeRQ3ozpz6b1o7pDRx3K+ahJgHSeZ0kCLFsYnRWQ43kz5v4jXb7qLNQjDjjBdikNctDssVst8wGkOFn632fM/0YAAW5DNso33/6P3TP7XO3QeXHXCWyP3fey9euxBcPZx1tXm387vnEvVnXMhY5jQZKs9z+V312i3YAT6pCEYZn7kVZA2uJXaf9RfbbEONaneN6huZa8QwfvdyT7Te9pZoM7vv2aXTexrfoLylRTFo97B0/KtZYn5zJKxyN/yAa2u3HXWCie1ffsSPYjzUTKVkDa7iEj2qEuZy9AijQlTYC8f+7P2dsfzSdAqquDZ01Jrp2RfD+yGg8WACk6dCg7gKdMbRWcAHlFr4ns0HrHlDSWJkAanTfuISEL6U83ZLUlWQTMAAEDkEP5g6ZDh5Li+hO6CMjXP3ienXBYH8dG0ghIYzDL+Nq49eF9ibL6UxFbbYljxww0NwAJc2lG6JBDx5+0/Z6FTDMgRcnQmUh/umLUFh07nLIWsGgAcjb/d1ejMl0V4E/IUQOyNj8ZgMPOW7/c4K8jLrVxByTA45ZT1+848DoCZLApklw1UHDsGIAkD2swuRaeclNk0NcZK/6i7GU955SxrBXfWjBKFM4167exW15VJy8rYnfbHiFP1EWADKY4Tp5WA5DkYQ0mV1dAVk89hW3/egvzs+0RRzIp1Tbdtj1gtRGHSZQ1hKJYHu3V4hLWs4Ut4XTB01ohS9kRxbdyNN1ORysyRX52+e1s9sq/FwbgB5C3DFrGdt9tj9gsJG7ewg1csuK1D9m5+bkMLntrIQsZTEfdAFnFm8TtyIVCHlb/ApYpsvVLzQ8g8fYb+8/loNyTjZx6aiRX1+1WsTu7kV/G+i2PELppWhfHAXoBEg+K1pYA6V9f8ITE0zqHW8gqWEgckJxEgAwmWDwlKrJ47ZxfQAbvSbgnVQCJMEHrNXUEyGAydwNkNW+StjyCybXwlKjIs1bex55bPtZsMUuA7H7cL1iflpeZYyNABlcc2dYHLCQBMrhMpYB8+d1H2OQlozIJyL6tfsO6HvNTAmRInZHRf+xFApD4Kr/caJ+CAvxLWrSQm774kCd76pFJQCIzO06vGIUspH99MZ5wspCzeQUzKIBOefgXcNROHf89iOYJlTUkOXWikTVake5FcgtJgAwpY5kiG8HYaDora0hcs4fr9qyFLGRw5SFABped65NOkTor1s1iE+b/mudvPYL97rRnzTa++XYHGz6xdUy9Cd7sLYOWFrZbrOX2GQPZh5vfZmd3/LM0YJ4AGVzeToDEFUaVRrPVUzq6xjsGf312nxwzZDkPCpZftYmN+HEzh7Are5k7SwVB6Bh8IcsVhL7/uvu/bMEK1pncyXMn4CoCKv4lIEl41Q1OHQqb8y9L2xNBkl6lBZAqotFxLCr9TrqONFqHABl+WgiQLcMLMYctECBjmnRZ8LYXSG+YfBL7esd2zx6J7dw962y25pOljs/B6QLni7WoWDCsHbGG9CpoSzVY3autvH9OgIxJA5wUdP86hxbWjjgpIRZc3YYr3LzKtX1nMrRjFGSze+TVqx0f+8FJo9hJlQPNz3GmctRTVV6vKfTzkHpHS+t9tWMbg3Pns21rC58TID3FqVSBAKkkJn+VELh962B72kOZRZLc66Dk2Dml2Y/ZmW2vV7Z4Ilieev33bO7bEzwHJbPoTtZYrDt8YhuG1JZU/EmAAOlPXkq1ux97EetzvBnoVDid4XS8SVTkUU915VkBNnq+RwYWGehV64kvrFOrHhsxYFdmOeNzJ6qLLyB8ERlFjN31HBBVKEiAABmDIoggWPr+0+yR134nfdOYwW+wiordzM/cwGtt4ILO97BjD/metM2NW2tYg7qV0s9Uj9KJAPMC5KB21fxuyB8oW+0YxJ6JJgmQMUxjKX1rzenbDumbZLfoGhvvXl1zAo3Tc6pgP6huU/bbPk/ZmjHOTOImK1lRpeleY8r7506A3MQFU8/rWzHvwpONv0PTIWzwiSN9WYqgtBIvGT1wcUmqf1m//GS1C9qfkrWqkK2d9MVbAme1v4Wd2OQMGxlCYMBs/hcKLveWX0kNUSk/+Gw5u/OFH7q2hGxyCLWzlv998yW7ftKJSj1AsqkfdbjNsS7u4li0ZopSWzefuYDV2qOOre6NkzsweFW9yi+rHmKVDdr5+jLyajNvn1Msa4Qzvs9e9XmqjXmBFPLynk+wRvsfZ3sW2en+8cpVvnp47KFd2eH1j2f4Inhr/RxfzwLUYia5D7esYrdPt92w7dpmUCeVr45muDIBMsLJDUr1jC7InsetWdM49Yu79G11FT9kvOsGK+N9KgEE1r6FlUHc49S9fQJkRDPUvGEn9rMu99laU3XOGA/B2wqvq1je/fhVdu+/d53Ij6jLZjMXdrmXHd3w1JJmsVUDR5Cf0nC/Zuyq3lNtj0yYfynD3aJUvCXgBMjJ/FFzZfn4wuvYwhr8iYqTBKKyDPvWPpDd0O/f0tf4tVYqs+UUznfL093Z5u0fqTRRUicqWQR6ecofquZ5buF5t5SmlFPH56QiWbAYCjeCH1n78n9bfbb0XfUG+zZhV5+263JXayOL10xljy64NlC71oeGnHQza185SNrOH5/vxzZsxQm8YGWvPfZhN535mu1hOIXgHKLiLgFKchVSQ/qd8DvW5WjzkulCazUbF4e+DVm2r2ft6n8/faNAY7/e8YXyCGrtsTen1X9nTQ5s4/gMLo3FFknY8vPv3c+OOrijrRkx0VfYd2TxeSdAUl5Whdk+7tAqNvTUu0pqRkktxazlsm4h6OCFt+7h67RZ7IuvN3HL/Dm32PsyhL+1aNSd9Tju4pJT/2I7qkEDCmIxq8io68MvX8HeWDvDTzO5qeuWl7WKS4Eyl7uoAi5dxeWrYsFJeZyYj7J4HduK4l1RfokY/UHGBGROEMud/Ep0JI6mYpeAMiDXbVrJU04MJvkVJdC+6WA25MSbSuTxwLxfspUfyh0yYYSXVkBizM0OPpld9L3/Kxn+pCU3s1fe/VcYsWTuWadblOn2K5epBkUFVRXL88vHsRdX3huLkoiAHP/SrwoJphDh47cgAuhfrw1j554yzvZoHBbSeAHW2Fhri+Xtj+az++f+3O8QMlvf8bIdjJiHz9XwX02M0cNCwlLmuYwetITtsVutEhEsrJnEHl9oP58YpZzcDv/iViyA84gDWrN99zrAdnJk585v2ec8GBwOoIdfudJ2PrHcB4oHtr2BdWz2oxKx4Mwkzk5SYUyS4OoCnrd8vPQGZUqWzApbEdiSkBXc+Thy2qn8i+zbSHWrbu2D2PX9ZkduzURAjn66G9uy/eNI+47GEOyAm7vq1Npf2vYnn/+X/f650yJ/bxobvLznkzx88lhr1203KNN1ApJZRUQLIlucCvKV3vnijwrXegctCA645vTpjpQ07PaBbKvG6Cv6PebZ3kqHpN3GByZxSfd/lsTnWp+5f+5F7O2PXgoqpsw9J9vyKHyp4f84Zb2C/7rdGDVOC+DUABUIqIKNLiQQ3nWJqigXWMr75v6scLemitXch9PNa/vOUF4XBgWlGxjFMQCctz7Ts0B7VQrkUtngRJ4O/wEbdRafxTbNdZymRu2NVumjrnUk6VzWcLpaaQVkFf8P2vpwmcFjDunCftr5r0pzDKV+kMd0rucWFI4VgBT7hMO//6IyCMUXwUsJb6Vq6dd6GOvS/DzV6rZ66DPKLU/3KOx1gorCqXTIfs3ZeZ3uYLDqTomhrQ0hazv2S6nYJdCyUY+CHC2lcFmrFZAg/Z9Za8TpiUvzBJ1zyljWqnGvRIbwyupH2aTFpVswYmf6czB2DgjGKAb21vrZbPxLl0TRVCbbkHhYx3FAgqXuyn/PaastcwB5Wt11AfuTyBagYim8tArha4gpxVrSq7y6+nE2cXG1Y7UBba5lpx51jlczbMwzvQqpO/bYfS/PuioVQElxJybtN3pLS+JhvZIDsnDDr3khBQcknfrwlmVJDVC5q3pPsd2ZqNIMtgD+8Pz3zVyneEZc6M9YcVchM5lYXnvvCfbkIvPSa/PjAW2GczCeXVIftzmfdnzhC9gsVgaEvK+4DEi8aEdlHJu+WF/4MjForsozea8jOeXRlgOykKXaCkh87ZqzTI4dd7UBEJHEGJkDVAtiSJEc+dNtH0gf+WW3h1nlgW1tn6G+7DSICMoz2lzHOh31k5J2/zS9P/tN72m2v6/dtILdMdOeNc6oUH+fxuZNXdZUj15jxFoTa04CprukIF+BCW3mYDT3iayArOJNmStwCqGTC/aEw/oUNudVC0AIC/LJ5+97PiI7tAxLhjSPV/d5uuT5Be89yZ5YdGMhkTISKovlz9MHsI+2vFtief0kNsZtyfhC8ANORActed+eyc5z8DmpIAmZMx06NguJ/xAv3qGr6exaIrs/UaZHWE/96fn+gc4ZirQVG+nYUJela8S7QRmtVw0Y/fnz9DM4GN/hnx3CLfkLtm4GddghUOK3pz2ttG7W9Q7MpHEvyTQ3klvIaqNftksNOSDBY82bRB+cfxl7c519MpMeUBLvx9nCm89c6Plq1cTEbg2NGPCSLdIFoXB/4cEHKE6gFNtDoiokrEIRaTCOa42YcrLnWLwq/LTz39gxh3T2qlZ4F95J5TsJOEXoOAHSFrEzb9VDPOnSmFzLEtkBkCVAtQS1Pkb7snOX1jbF69FLwFi88dj4u2hxozqj6OdUyk3TOrNtX9l21VTFmal6skTZfID1uYXEDkehiBZyKP/bA8aHtI4s9XwasjG++eMI3PZqU5ZcCv0ay8GIYARrEduK6gynrI+ydB5GX8J+UWUBmZL14zIORlu0vQjIkgABxDoa15BlQSh+xiBL34+7GXErlJMFWsnzoz7Aj0yFKaKyy5Ifi6AcO2MQB+N/bK9tdVhvdk5HMyKy8FkUwDi745/YCYfZg8St7UqyqbleQhRGVml6VrJ+NAMCpBYSfxQzmec1C53k24y9u+E1du+cC2w6gE14bMZbS1ilv7jqQdaUx4l6tdlwv6MKe6BOQRylmdXf5JnVzwqtw2K72OfEDVjWIltjTlw8kr26+rHQ709rA277j26AtAWaI8cmcm3mrfhJb+hFMYPITrVNnLRwSlRVQlefbKUU/O7VX9W++ZGh1zvT/rkkoNy2/+gGSHDaJV7fzmkXkFv/ZWsh3L3htOktKh6yCSCrQJgitomoHlw9p1okG9CR0NXux/2C9Wl5maf1RgV8WeCgt7XkdSutf+treHzxuVZRTODrx6HifNrWkMaHYgaBvG1/yA4nu9HQge1uZB2P3HXJDjyK8CyGKTjoi2NaRqn5ZAm7Z5Z3jKpRX1zH4VB19dRTwnSp8Oz1/eawurUbmO145Y4Vv1iQkBmJmfNWJNsdhQwBqoC0bX/kLYxOVCKnq70NYWJjHmF01hJ2HYkTJThZErRNcQyPvHo1W/pfeUJmP+AQ273t2T6OoYBoN+hV7n76pHtdGVvhfbZtdxhjcLKQtlyt23lWblCNvBTVNZJVHkGe8ZJnmDbDPOvWryDtBnnGSzZp+lxCV6dw6yi9ZkwKSAxWpK158rYGUSDxGVwthyvmwhSxTZzwQFC5V2l9eF/2k5P/ENi6OrXfolE3npzpL77bjWsv1EsOunyOYHJYSUuR0lV87gZIG23Nk7c1CCB/9r2/s+YH71qjITlw2C0G5DhFrlO/tFXs//ufvs7uerE0+NyvworbMe9tXMT+Ots7K0Fc3l6//U+ivsy7yvtRaY3OsfbLDZAl3ta8eMiCABJXU2Pj1yhRpesP0pcgz6goqxgogQPJyPfjVfIMSEkwgNS7asjQEZBF2moLNsdlorhUNOsliELHtc0g9sXrtioclxp2up0qh3UwGfNdshXDz2pu/HyNpzrkGZCSYICB3Do63vfoBUhbkEBeYluDABJaGfQ5N43G/ZFIKmWU9zYu5DTRfgOX9XmROuPg8MippRe0eqJIUiHo+PIKSEm0lzQYQImyFi1kJf9tuzwwD0mUo1K8KCxT68NP5w6aPyqvI8W+y+Jgg4AxzBdOXgEpiektiV0V58LVQhZBacsmyWgpAAAOoElEQVS1kwfnjk6A9AuEoH1XAWnQtvMISMntVhBxU05Xa9xkrQLIKt6ALblm1k+ARKV4Xpvm1olxe6f4mZMzRXQsoX2rlQ46LrQTJvghj4CUOHNsqTqcQOkJyKKVtDl3sn5wOajiis/9k0fHLFOMjnF7p+zkhIwOi22I2xJBxwUdOL5xz8C3aOUNkA6ROYW7O7yYiCogh/KGzIPLiNy5jef1xO8slqCKKz43c8U9bMYK+0a6bQHPM4KPHrjE9ZqCuOWL7RlcbY7fbqXq2J+x04+/Unkt62b9r4no1EncsgnaviQRsnlVgFebSoAsWklbIuUsR+4EBeSogYtsVwXMf+efbMrS0dI5kJ2E8JqsOD93O82C9/ZtdRXresyFZhdwF8h1k9opdSlPFhJpOobxe1vw21IcI3NEAfoBZDV/2MzbiiwCWEtmsQQFJPKfIueNURDMjaBuWRkz+A3XS2rKLVdkykN6D6eCLO0dmg4xP8b+I3LGqpQ8AVJiHTdzGTlG5oQBJNJ71PCfekYjM1fczSnZXSpzkqo6QQF5aY9H2WH1dyn18rUz2UMvX14ydlw/MGbIcu1k4pZv54ftb2Xtmgww++xnTzovgHSwjrY0j16Trmwh0RAPOLdZyayuJeMGpIyuYl1lKzt3OoIWGQKeX35HIWoKlg0A78SvEDi91ZXSW5/Rbkn7/G+w0tbiRlsJkF5QYoVrH3q2sOVT8mUd8Qa/gMyFlUwCkKLXVBJyVQAfQON2QSzAPmrQ4pJkxl/t2MZunNzBplXiOAmQ3qBzqhGFdfQNyLxYyaQBKUuIDKsIb6hRkE3gsh6Ps3353SLbeHjcHTOH2C5bHT1wccnNVtYEymiHABkcgOKTUVjHoIDMvJVMGpDi+zFRhgXFHRu3DF4mTecPCzr8ydbmFoZbOwTI6MAYlXUMBMg8WEndADlyaid+k/HmAghVnEHGPp8s6/q1T57gCFiirMFAGpV1DAPIkrOSWYreSRKQ4mkNq3WUWTwnFTIsqviMNVkWUdZgALQ+5RCV45iiw+uNvpw61sa4x9WWUQCfZeXW5SQBibSJcMwYBdsm2D5ptP9x/KIWe/oOrCsfX3g9+8FJo0q8q7igBxf1HN3wVHZhl3vN9nBRLK6jI8rqBQ21zyUnOuBZbeMVRO7UehhAYi2JGNcmRuN+9qbUhptMrSQBKb775mldCs6ay3o+zhrv38IUCHLEgmIaBbdz4ZYuo+AqOlxJV6dWPTZiwHybIJ2sJ1FWf/rWslEPdl6nO8SHzOvJ/bX2Xe3AgMTD3EpW8V+2kyBZyCogguLZ5fb7MZwE3anZT1i9vRuaHzsFBsj2IZ1AYvy9esDLbO9a+5lti+ccxXs8rNfOOX3BhKGsW7/cwOa987CSzokxsFmIZXVw5Cid6HATWihAFkFpOy+JYAFQ17Re0PPbPk8V7mGMokQByJu4hdzGLaSYaFfMBHADT6y8ryWx8sdbVjNcZw4QA8zWEoWFDCMf3Cb9++dOD9NE4s9KUjuiT57nHb06HgUgS7ZBcMkrsp2nrUiyS4caQhBAirc0/9+8i9l/PpxbuHwHWd+sBVnAn1h4A0OcqXiL8r3//il79+NXmXhQ1nqzcRgLGUow/GFctY4r19NYHA4f+wqRcxp3aEAWraQt9w7+lsbrB/x4MVUUKQggf9XtH6zJgbYrA809SD/9c7KC6za9xRnMd0HiSQIS748ixYnKPERdR/LFrXy8yqsvkQCyCMrZ/HdX44Vpi3PFhjvSHEZZggBSttd4w+T27OsdX0jpp6y/SGoFSrvn7rUZjoRZS1T7kFHICd5eeH3TVByoqtLhY5VxRgnIkr3J1RsWMCTFSkORAdLvN7jqaQ83p47MclmtCTLQIROdUxn9dDe2ZfvHUgsoWqUwFjKIR118H0IBna7S01FnHKiqZ+IqP2OJDJBFK1lCXdPiddUJkJUHtmW/7Gb3YIq3Rh11cEf24w6/L6SIxLbIv14bxlZ9tGt74xp+SLZ+nUY2XRAzBhIg1aHi4FVFUlrsOeLwfiQlUkDKqCv+loaAAZ0ACZmJ2QeM2Vax2rK1puyEPwFSHUPYb8S+o1DacjBiLz6yEgcgK3nv0EnzIDPozb2cuuqcgycKQF7S/RF2xAEnmJPzxtoZ7OGXQRrsRfVdTk6cr3dsZ08suoEn0HrWbBj7kIjYwWWzsqKSFGv4xNZ8TbdD+ryYRc3qHFLVxrRS1s7Nz2P9Ww8ThxmJV1VsNHJAFq2k7To7/E33WNcKnnBKPLCrqmhUL5gErA6mYC3E/xRiVeFVFXLkLOOW0e4Kj6grsQCyCMrx/Lct573uWc/9bCtEJP9cN6NCv5MWUNSxql7jiROQJbGuiN7BelJX6opIF0S8UIlfAqOeqmIIv9O5OFDVULGqXuONDZBFK1nFf9tiXXWnrljf4XwblfgkMPOtux3XqvG91V/LDlQ1dKyqVy9iBWQRlCXHtHSnrl5Co8+zL4FyU1VDouUAZOqoa/bVjUboJoEkqGrZAJlW6koqm08JJEVVywpIoq75VO40jjopqpoEIIm6plFDc9TnJKlq2QFJ1DVHmp3CoSZNVRMBJFHXFGpqTrqcNFVNEpBEXXOi5GkZpg5UNTFAEnVNi5rmo5+6UNVEAUnUNR/KnoZR6kJVdQAkUdc0aGyG+6gTVU0ckERdM6zpKRiablRVC0ASdU2B5ma0i7pRVZ0ASdQ1o0qv67B0pKraAJKoq65qm81+6UpVtQIkUddsKr+Oo9KVquoISKKuOmpwhvqkM1XVDpBEXTOk+RoORXeqqiUgibpqqMkZ6ZLuVFVnQBJ1zQgIdBlGGqiqtoAk6qqLGmejH2mhqloDkqhrNsCgwyjSQlXTAEiirjpodIr7kCaqqj0gibqmGAkadD1tVDUVgCTqqoFmp7QLaaOqaQIkUdeUgiKpbqeRqqYGkERdk1LrdL43rVQ1VYAk6ppOcCTR67RS1TQCkqhrEhqeonemmaqmDpBEXVOEjAS6mnaqmkpAEnVNQNNT8sq0U9U0A5Koa0pAUq5uZoGqphaQRF3LpebpeE9WqGqqAUnUNR1gKUcvs0JVswBIoq7l0HiN35Elqpp6QBJ11RgpZeha1qhqJgBJ1LUMmq/pK7JGVbMESKKumoImrm5lkapmBpBEXeNSez3bzSpVzRQgibrqCZ44epVVqppFQBJ1jQMBGrWZZaqaOUASddUIOTF0JetUNZOAJOoaAxI0aTLrVDXLgCTqqgmIoupGHqhqZgFJ1DUqGOjRTl6oaqYBSdRVDzBF0Yu8UNU8AJKoaxSISLCNPFHVzAOSqGuCSIrg1XmjqrkAJFHXCJCRUBN5o6p5AiRR14RAFfS1eaSquQEkUdegsEjmubxS1VwBkqhrMuAK8ta8UtU8ApKoaxCElPGZPFPV3AGSqGsZkRXgVXmnqrkEJFHXAEgp0yN5p6p5BiRR1zKBTPU1RFV3SapCVWhZqrdz584qPp5Z1jHNW/UQm7ZsTJaGmYqxEFW1T1MuAUnUVR+sElUlQBYkwK0kUdeEcUlUtXQCcmshyeuaLBqJqsrln2tAEnVNDpREVQmQUgkQdS0/KImqOss89xaSqGt5AUlU1V3eBMiifLilHMv/eblVXH+bM5St3rCgvBqb8bcRVSVAKqk4UVclMYWqRFTVW3xkIS0yooABb4UJWoOoqprkCJCCnIi6qimO31pEVdUkRoAsBSQFDKjpjnItoqrKomIESImsiLqqK5BXTaKqXhKyf06AdJAXUVd/iuRUm6iqPzkSIJ0BSdTVny6V1Caq6l+ABEgXmRF19a9QxhNEVYPJjgDpITeirsEUi6hqMLkRIL0BSdTVp24RVfUpMEt1AqSC7Ii6KgipWIWoqrqsZDUJkIryI+qqJiiiqmpycqpFgFSUH8W6eguKqKq3jLxqECC9JGT5nKirs7CIqvpQJJeqBEifciTqKhcYUVWfiuRQnQDpU45EXUsFRlTVpxKRhYxOYGiJqOsueRJVjVa3yEIGlCdR1+8ER1Q1oAIRZY1WcERdGSOqGq1OoTWykCFkmmfqSlQ1hOLQGjIe4RXXk7lMjkVUNR6dIgsZUq55pK5EVUMqDVnI+ASYN68rUdV4dYksZETyzYvXlahqRApDXtZ4BZkH6kpUNV4dIi9rxPLNsteVqGrEykIWsjwCzSp1JapaHv2hNWTEcs4idSWqGrGSkJe1fALNmteVqGp5dYcsZEzyzgp1Jaoak4LQGrK8gs0CdSWqWl6dIS9rzPJOs9eVqGrMykEWMhkBp5W6ElVNRl9oDRmz3NNIXYmqxqwU5GVNTsBp87oSVU1WV8hClkn+aaGuRFXLpBC0hkxW0GmgrkRVk9UR8rKWWf46e12JqpZZGchC6iFwXakrUVU99IPWkGWeBx2pK1HVMisBeVn1EbhuXleiqnrpBlnIhOZDF+pKVDUhBaA1pF6C14G6ElXVSyfIy5rwfCTpdSWqmvDkk4XUcwKSoq5EVfXUB1pDJjwvSVBXoqoJTzp5WfWdgHJ7XYmq6q0LZCE1mZ9yUVeiqppMOK0h9Z6IclBXoqp66wB5WTWbnzi9rkRVNZtsspDpmJC4qCtR1XTMP60hNZunOKgrUVXNJpm8rOmZkKi9rkRV0zX3ZCE1na+oqCtRVU0nmNaQ6ZqYKKgrUdV0zTl5WTWfrzBeV6Kqmk8uWch0TlBQ6kpUNZ3zTWtIzectCHUlqqr5pJKXNb0T5NfrSlQ13XNNFjIl86dKXYmqpmRCaQ2Z7olSoa5EVdM9x+RlTdn8uXldiaqmbDLJQmZjwpyoa68Wl7AjD2pvHeRm/h9tKioqarIx8nyMgtaQKZtnGXV1GMKVHIxjUza83HeXAJlCFZBRV2EYczgYq1I4tNx3mQCZUhWQUdfiUIiqpnROyamT4olzoa5EVVM8r2QhUzx5EupKVDXF80kWMuWTh+5bqCtR1QzMJ1nIlE+ihbqOJa9qyieTd58Amf45hJWspP3GDEwkH8L/A7eZfBB/pZ2oAAAAAElFTkSuQmCC'\r\n\r\nconst pinOuDormir =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinOuManger =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinProduit =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinService =\r\n 'data:image/png;base64,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'\r\n\r\nconst markerIcon =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAApCAYAAABUdSs8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4yLWMwMDAgNzkuMWI2NWE3OWI0LCAyMDIyLzA2LzEzLTIyOjAxOjAxICAgICAgICAiPg0KICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9Ijg5OUI5MzM0RkU4QzA4QTE3MzM1M0NCNkMwRTk2RTZFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjUyNjBCMjg4NTkwOTExRUQ4MzRFQjVCODM2QjcxNzA0IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUyNjBCMjg3NTkwOTExRUQ4MzRFQjVCODM2QjcxNzA0IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMDIyIE1hY2ludG9zaCI+DQogICAgICA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNGUxNjdlNS0yZmQ2LTRkNmEtOTgwZi0yMWU1ODg4YjIwM2EiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDozY2ZjYjg0OC1lOGRkLWFlNGYtYmUzMS1mNjExNDdlNjc2NWMiIC8+DQogICAgPC9yZGY6RGVzY3JpcHRpb24+DQogIDwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0iciI/PhdxvpsAAAPHSURBVFhHxZh9aFVlHMd/ezHdi2M1XzYzKKM/lEhSfKtYQyWLmIp/FZooRH8W/mvQP6kYQUTgH0oQiESlCQMRDBGCcgYqCkOL3qbh62huU+fW3Nbne+65l+ee+5x7z7lb7QOfe+557p7n+Z3nnOf3PGcV4+PjNpXkBVBRURF+8zIDZ+FKXIPL8AlsQHEPr+J5PIU/Yg8+QC9B3/rIGoOiehI/wD9Rf5jEa7gHn8EqLCBJALX4Bl5Ct/E0/o7bsB7zKBXATNRVP0S3wXL9CB/FHMUCULS70W1gMvwMGzEgLoBp+C6OoFt5styJj2DQp28WvIhf4XydxFLHIM2ZZ1ajx4R6Q4Nmt28wFwYyv8dzE9/Ck74AdN8/wbeDAh/TCP45ZuBS4py/gJulKjDILLzWzSQ8bXbhJ7PhoUy5nyP4Dn3fiQawmsNhfCwoiFJbZ7Z+C2O0lqxQExZGGPnHrJM00HHIbKAvLCzgPm6m745KDXtWeBn9nev39s2koPb4zoVGqPVVs01budPTw8ICuBJboz4rM+c5VoTHQpa3mrW9Fp4kYBWjpJGKZ7k+ogE8FR7zqWZiqDEdk1JJ0ysY0OAh9TJXH9EA/LSQ8puaw5MUNHA3m2MnU5CeowH4L7GRhnRv06IRq8+uVQUEfUcDUNotZJTisdHwJAXjY9SNrRf8EA3Au2rZ9b9YVEk0aVEu6L0dnhTgHYFb4TGf/l4W4l/CkxQoMSk7+hnWRzSAn8NjPkpW3x0lvOthQQL+5spPUGeM2+CHdEkAyoRZs4VebrK/+PqAWR+jUYq7/WbffmF25bewwMtFfURH4Cz+mvnqoeuc2f69/EVXJuXq6hS41PeHLKDdVP/8Y1r6IVPuR7e6UxcdXQuUO7VxeC8oiKOKZ3XhYrNFS1gRWzJpuoc2L7EdvMyFKbjiMDy2g777c8PvBLIOtYqo4L9Qm9SNmOnTE4C2TQfRrTSZfoOzMTYA8TryJHkbmIhaht/EgGIBKO/uQ7fyZKiRzeXmYgGI51HzyG1gIuo94SXMUSoA8T7qkXYbKketMbswjyQBPI4n0W2sHM/g05hHkgBEG2on6zaYRqXODVhA0gCE3pC0eLgNJ1HvFkpsXtIEoLfi4+g2nsTvMXYrlSYA8SzqRdPtoJhaOl/AWNIGIDahkonbkU+l2+1YlHICEB+iFnm3w6ifYjUWpdwAlMm+RLdD12PYhCUpNwAxB/UvGLdjyYahxEutw0QCEAvxD8x2rlyh9J2YiQYg9JRrZrBttldUkAb1mbcjmgqie8L/GbN/ARArDyE2KP8tAAAAAElFTkSuQmCC'\r\n\r\nconst markerIconLarge =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAMAAAAhFXfZAAAC91BMVEVMaXEzeak2f7I4g7g3g7cua5gzeKg8hJo3grY4g7c3grU0gLI2frE0daAubJc2gbQwd6QzeKk2gLMtd5sxdKIua5g1frA2f7IydaM0e6w2fq41fK01eqo3grgubJgta5cxdKI1f7AydaQydaMxc6EubJgvbJkwcZ4ubZkwcJwubZgubJcydqUydKIxapgubJctbJcubZcubJcvbJYubJcvbZkubJctbJctbZcubJg2f7AubJcrbZcubJcubJcua5g3grY0fq8ubJcubJdEkdEwhsw6i88vhswuhcsuhMtBjMgthMsrg8srgss6is8qgcs8i9A9iMYtg8spgcoogMo7hcMngMonf8olfso4gr8kfck5iM8jfMk4iM8he8k1fro7itAgesk2hs8eecgzfLcofssdeMg0hc4cd8g2hcsxeLQbdsgZdcgxeLImfcszhM0vda4xgckzhM4xg84wf8Yxgs4udKsvfcQucqhUndROmdM1fK0wcZ8vb5w0eqpQm9MzeKhXoNVcpdYydKNWn9VZotVKltJFjsIwcJ1Rms9OlslLmtH///8+kc9epdYzd6dbo9VHkMM2f7FHmNBClM8ydqVcpNY9hro3gLM9hLczealQmcw3fa46f7A8gLMxc6I3eagyc6FIldJMl9JSnNRSntNNl9JPnNJFi75UnM9ZodVKksg8kM45jc09e6ZHltFBk883gbRBh7pDk9EwcaBzn784g7dKkcY2i81Om9M7j85Llc81is09g7Q4grY/j9A0eqxKmdFFltBEjcXf6fFImdBCiLxJl9FGlNFBi78yiMxVndEvbpo6js74+vx+psPP3+o/ks5HkcpGmNCjwdZCkNDM3ehYoNJEls+lxNkxh8xHks0+jdC1zd5Lg6r+/v/H2ufz9/o3jM3t8/edvdM/k89Th61OiLBSjbZklbaTt9BfptdjmL1AicBHj8hGk9FAgK1dkLNTjLRekrdClc/k7fM0icy0y9tgp9c4jc2NtM9Dlc8zicxeXZn3AAAAQ3RSTlMAHDdTb4yPA+LtnEQmC4L2EmHqB7XA0d0sr478x4/Yd5i1zOfyPkf1sLVq4Nh3FvjxopQ2/STNuFzUwFIwxKaejILpIBEV9wAABhVJREFUeF6s1NdyFEcY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'\r\n\r\nconst markerShadow =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC'\r\n\r\nconst target =\r\n 'data:image/svg+xml;base64,PHN2ZyBpZD0idGFyZ2V0LTM2OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI1LjAyMyIgaGVpZ2h0PSIyNS4wMjMiIHZpZXdCb3g9IjAgMCAyNS4wMjMgMjUuMDIzIj4NCiAgPHBhdGggaWQ9IlRyYWPDqV82OCIgZGF0YS1uYW1lPSJUcmFjw6kgNjgiIGQ9Ik0yNS4wMjMsMTEuOTU2SDIyLjkyOWExMC40NDcsMTAuNDQ3LDAsMCwwLTkuODYxLTkuODYxVjBIMTEuOTU2VjIuMDk0YTEwLjQ0NywxMC40NDcsMCwwLDAtOS44NjEsOS44NjFIMHYxLjExMkgyLjA5NGExMC40NDcsMTAuNDQ3LDAsMCwwLDkuODYxLDkuODYxdjIuMDk0aDEuMTEyVjIyLjkyOWExMC40NDYsMTAuNDQ2LDAsMCwwLDkuODYxLTkuODYxaDIuMDk0Wk0xMy4wNjgsMjEuODE0VjE5Ljc1M0gxMS45NTZ2Mi4wNjFhOS4zMzIsOS4zMzIsMCwwLDEtOC43NDYtOC43NDZINS4yN1YxMS45NTZIMy4yMDlhOS4zMzIsOS4zMzIsMCwwLDEsOC43NDYtOC43NDZWNS4yN2gxLjExMlYzLjIwOWE5LjMzMiw5LjMzMiwwLDAsMSw4Ljc0Niw4Ljc0NkgxOS43NTN2MS4xMTJoMi4wNjFBOS4zMzIsOS4zMzIsMCwwLDEsMTMuMDY4LDIxLjgxNFoiLz4NCiAgPHBhdGggaWQ9IlRyYWPDqV82OSIgZGF0YS1uYW1lPSJUcmFjw6kgNjkiIGQ9Ik05MS4zMzUsOTUuODU5YTQuNTIzLDQuNTIzLDAsMSwxLDQuNTIzLTQuNTIzQTQuNTI4LDQuNTI4LDAsMCwxLDkxLjMzNSw5NS44NTlabTAtNy43NjRhMy4yNDEsMy4yNDEsMCwxLDAsMy4yNDEsMy4yNDFBMy4yNDQsMy4yNDQsMCwwLDAsOTEuMzM1LDg4LjA5NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03OC44MjQgLTc4LjgyNCkiLz4NCjwvc3ZnPg0K'\r\n\r\nconst afaire =\r\n 'data:image/png;base64,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'\r\n\r\nconst avoir =\r\n 'data:image/png;base64,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'\r\n\r\nconst hebergement =\r\n 'data:image/png;base64,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'\r\n\r\nconst produit =\r\n 'data:image/png;base64,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'\r\n\r\nconst service =\r\n 'data:image/png;base64,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'\r\n\r\nconst restaurant =\r\n 'data:image/png;base64,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'\r\n\r\nconst hospitalityImages = {\r\n afaire,\r\n avoir,\r\n hebergement,\r\n produit,\r\n service,\r\n restaurant\r\n}\r\n\r\nexport {\r\n hospitalityImages,\r\n pinAFaire,\r\n pinAVoir,\r\n pinOuDormir,\r\n pinOuManger,\r\n pinProduit,\r\n pinService,\r\n markerIcon,\r\n markerIconLarge,\r\n markerShadow,\r\n target\r\n}\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { Tenant } from '../models/Tenant'\r\n\r\ntype tenantState = {\r\n activeTenant: string\r\n tenantList: { [key: string]: Tenant }\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'tenant',\r\n initialState: {\r\n activeTenant: '',\r\n tenantList: {}\r\n } as tenantState,\r\n reducers: {\r\n setActiveTenant: (\r\n state,\r\n { payload: { activeTenant } }: PayloadAction<{ activeTenant: string }>\r\n ): void => {\r\n state.activeTenant = activeTenant\r\n },\r\n setTenantList: (\r\n state,\r\n {\r\n payload: { tenantList }\r\n }: PayloadAction<{ tenantList: { [key: string]: Tenant } }>\r\n ): void => {\r\n state.tenantList = tenantList\r\n }\r\n }\r\n})\r\n\r\nexport const { setActiveTenant, setTenantList } = slice.actions\r\n\r\nexport default slice.reducer\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\n\r\ntype botSliceState = {\r\n CSSInjected: boolean\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'bot',\r\n initialState: {\r\n CSSInjected: false\r\n } as botSliceState,\r\n reducers: {\r\n setCSSInjected: (\r\n state,\r\n { payload: { CSSInjected } }: PayloadAction<{ CSSInjected: boolean }>\r\n ): void => {\r\n state.CSSInjected = CSSInjected\r\n }\r\n }\r\n})\r\n\r\nexport const { setCSSInjected } = slice.actions\r\n\r\nexport default slice.reducer\r\n","const closeBotButtonClick = (): void => {\r\n const retorikShadow = document.querySelector('#retorik-shadow')\r\n if (\r\n retorikShadow &&\r\n retorikShadow.shadowRoot &&\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='fermer']\")\r\n ) {\r\n const closeButton: HTMLElement | null =\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='fermer']\")\r\n if (closeButton) {\r\n closeButton.click()\r\n }\r\n } else if (\r\n retorikShadow &&\r\n retorikShadow.shadowRoot &&\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='dashboard']\")\r\n ) {\r\n const closeButton: HTMLElement | null =\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='dashboard']\")\r\n if (closeButton) {\r\n closeButton.click()\r\n }\r\n }\r\n}\r\n\r\nconst injectShadowCSS = (): void => {\r\n const host = document.querySelector('#retorik-shadow')\r\n if (host && host.shadowRoot) {\r\n // Inject shadow dom custom CSS\r\n const sheets = Array.from(document.styleSheets)\r\n const styleToInject = sheets.filter((s: CSSStyleSheet) => {\r\n return Array.from(s.cssRules).some(\r\n (c: CSSRule) => c.cssText.indexOf('#retorik-shadow') > -1\r\n )\r\n })\r\n if (styleToInject && styleToInject.length > 0) {\r\n styleToInject.forEach((s) => {\r\n const host = document.querySelector('#retorik-shadow')\r\n const rules = Array.from(s.cssRules).filter(\r\n (c: CSSRule) =>\r\n c.cssText.indexOf('#retorik-shadow') > -1 ||\r\n c.cssText.indexOf('@keyframes') > -1\r\n )\r\n const strCss: string = rules.map((r) => r.cssText).join(' ')\r\n const style = document.createElement('style')\r\n style.innerHTML = strCss.replaceAll('#retorik-shadow', ':host')\r\n if (host && host.shadowRoot) host.shadowRoot.appendChild(style)\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport { closeBotButtonClick, injectShadowCSS }\r\n","const defaultColor = '#1999B1'\r\n\r\nconst hospitalityColors = {\r\n afaire: '#E23C2A',\r\n restaurant: '#FE942D',\r\n hebergement: '#D211A7',\r\n avoir: '#76AB2A',\r\n produit: '#AFB942',\r\n service: '#00C8BC'\r\n}\r\n\r\nconst RETORIK_URL = 'https://studio.retorik.ai'\r\nconst RETORIK_URL_DEV = 'https://dev.studio.retorik.ai'\r\n\r\nexport { defaultColor, hospitalityColors, RETORIK_URL, RETORIK_URL_DEV }\r\n","{\r\n \"ar-EG\": {\r\n \"zoomintitle\": \"تكبير\",\r\n \"zoomouttitle\": \"تصغير\",\r\n \"aroundme1\": \"إظهار النقاط المهمة في\",\r\n \"aroundme2\": \"كيلومترات من حولي\"\r\n },\r\n \"ar-SA\": {\r\n \"zoomintitle\": \"تكبير\",\r\n \"zoomouttitle\": \"تصغير\",\r\n \"aroundme1\": \"إظهار النقاط المهمة في\",\r\n \"aroundme2\": \"كيلومترات من حولي\"\r\n },\r\n \"ca-ES\": {\r\n \"zoomintitle\": \"Ampliar\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostra els PDI a\",\r\n \"aroundme2\": \"quilòmetres al meu voltant\"\r\n },\r\n \"cs-CZ\": {\r\n \"zoomintitle\": \"Přiblížit\",\r\n \"zoomouttitle\": \"Oddálit\",\r\n \"aroundme1\": \"Zobrazit BZ v\",\r\n \"aroundme2\": \"kilometry kolem mě\"\r\n },\r\n \"da-DK\": {\r\n \"zoomintitle\": \"Zoom ind\",\r\n \"zoomouttitle\": \"Zoome ud\",\r\n \"aroundme1\": \"Vis POI'er kl\",\r\n \"aroundme2\": \"kilometer omkring mig\"\r\n },\r\n \"de-AT\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"de-CH\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"de-DE\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"en-CA\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-GB\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-HK\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-IE\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-IN\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-US\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"es-ES\": {\r\n \"zoomintitle\": \"Acercarse\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostrar puntos de interés en\",\r\n \"aroundme2\": \"kilómetros a mi alrededor\"\r\n },\r\n \"es-MX\": {\r\n \"zoomintitle\": \"Acercarse\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostrar puntos de interés en\",\r\n \"aroundme2\": \"kilómetros a mi alrededor\"\r\n },\r\n \"fi-FI\": {\r\n \"zoomintitle\": \"Lähennä\",\r\n \"zoomouttitle\": \"Loitontaa\",\r\n \"aroundme1\": \"Näytä KP:t osoitteessa\",\r\n \"aroundme2\": \"kilometriä ympärilläni\"\r\n },\r\n \"fr-BE\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-CA\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-CH\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-FR\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"hi-IN\": {\r\n \"zoomintitle\": \"ज़ूम इन\",\r\n \"zoomouttitle\": \"ज़ूम आउट\",\r\n \"aroundme1\": \"POI यहां दिखाएं\",\r\n \"aroundme2\": \"मेरे चारों ओर किलोमीटर\"\r\n },\r\n \"hu-HU\": {\r\n \"zoomintitle\": \"Nagyítás\",\r\n \"zoomouttitle\": \"Kicsinyítés\",\r\n \"aroundme1\": \"POI-k megjelenítése itt:\",\r\n \"aroundme2\": \"kilométerre körülöttem\"\r\n },\r\n \"id-ID\": {\r\n \"zoomintitle\": \"Perbesar\",\r\n \"zoomouttitle\": \"Perkecil\",\r\n \"aroundme1\": \"Tampilkan POI di\",\r\n \"aroundme2\": \"kilometer di sekitarku\"\r\n },\r\n \"it-IT\": {\r\n \"zoomintitle\": \"Ingrandire\",\r\n \"zoomouttitle\": \"Rimpicciolisci\",\r\n \"aroundme1\": \"Mostra PDI a\",\r\n \"aroundme2\": \"chilometri intorno a me\"\r\n },\r\n \"ja-JP\": {\r\n \"zoomintitle\": \"ズームイン\",\r\n \"zoomouttitle\": \"ズームアウトする\",\r\n \"aroundme1\": \"POI を表示\",\r\n \"aroundme2\": \"私の周りのキロメートル\"\r\n },\r\n \"ko-KR\": {\r\n \"zoomintitle\": \"확대\",\r\n \"zoomouttitle\": \"축소\",\r\n \"aroundme1\": \"POI 표시 위치\",\r\n \"aroundme2\": \"내 주변 킬로미터\"\r\n },\r\n \"nb-NO\": {\r\n \"zoomintitle\": \"Zoom inn\",\r\n \"zoomouttitle\": \"Zoome ut\",\r\n \"aroundme1\": \"Vis POI kl\",\r\n \"aroundme2\": \"kilometer rundt meg\"\r\n },\r\n \"nl-BE\": {\r\n \"zoomintitle\": \"In zoomen\",\r\n \"zoomouttitle\": \"Uitzoomen\",\r\n \"aroundme1\": \"Toon POI's op\",\r\n \"aroundme2\": \"kilometer om mij heen\"\r\n },\r\n \"nl-NL\": {\r\n \"zoomintitle\": \"In zoomen\",\r\n \"zoomouttitle\": \"Uitzoomen\",\r\n \"aroundme1\": \"Toon POI's op\",\r\n \"aroundme2\": \"kilometer om mij heen\"\r\n },\r\n \"pl-PL\": {\r\n \"zoomintitle\": \"Zbliżenie\",\r\n \"zoomouttitle\": \"Pomniejsz\",\r\n \"aroundme1\": \"Pokaż POI w\",\r\n \"aroundme2\": \"kilometrów wokół mnie\"\r\n },\r\n \"pt-BR\": {\r\n \"zoomintitle\": \"Mais Zoom\",\r\n \"zoomouttitle\": \"Reduzir o zoom\",\r\n \"aroundme1\": \"Mostrar POIs em\",\r\n \"aroundme2\": \"quilômetros ao meu redor\"\r\n },\r\n \"pt-PT\": {\r\n \"zoomintitle\": \"Mais Zoom\",\r\n \"zoomouttitle\": \"Reduzir o zoom\",\r\n \"aroundme1\": \"Mostrar POIs em\",\r\n \"aroundme2\": \"quilômetros ao meu redor\"\r\n },\r\n \"ru-RU\": {\r\n \"zoomintitle\": \"Приблизить\",\r\n \"zoomouttitle\": \"Уменьшить\",\r\n \"aroundme1\": \"Показать POI на\",\r\n \"aroundme2\": \"километры вокруг меня\"\r\n },\r\n \"sv-SE\": {\r\n \"zoomintitle\": \"Zooma in\",\r\n \"zoomouttitle\": \"Zooma ut\",\r\n \"aroundme1\": \"Visa POIs kl\",\r\n \"aroundme2\": \"kilometer runt mig\"\r\n },\r\n \"th-TH\": {\r\n \"zoomintitle\": \"ขยายเข้า\",\r\n \"zoomouttitle\": \"ซูมออก\",\r\n \"aroundme1\": \"แสดง POI ได้ที่\",\r\n \"aroundme2\": \"กิโลเมตรรอบตัวฉัน\"\r\n },\r\n \"tr-TR\": {\r\n \"zoomintitle\": \"Yakınlaştır\",\r\n \"zoomouttitle\": \"Uzaklaştır\",\r\n \"aroundme1\": \"İÇN'leri şurada göster:\",\r\n \"aroundme2\": \"çevremdeki kilometrelerce\"\r\n },\r\n \"zh-CN\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n },\r\n \"zh-HK\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n },\r\n \"zh-TW\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n }\r\n}","import React, { useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { useLocaleStore } from '@davi-ai/retorik-framework'\r\nimport { updateFilters } from '../features/mapSlice'\r\nimport { HospitalityPOIType } from '../models/POI'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport '../styles/components/MapFilter.scss'\r\nimport hospitalityTranslation from '../translations/mapFilter.json'\r\nimport { MapSettings } from '../models/Map'\r\nimport MapFilterItem from './MapFilterItem'\r\nimport { defaultColor, hospitalityColors } from '../models/constants'\r\n\r\ninterface MapFilterProps {\r\n settings?: MapSettings\r\n}\r\n\r\ninterface Translation {\r\n [locale: string]: {\r\n [type: string]: string\r\n }\r\n}\r\n\r\nconst hospitalityFullFilters = [\r\n HospitalityPOIType.afaire,\r\n HospitalityPOIType.restaurant,\r\n HospitalityPOIType.hebergement,\r\n HospitalityPOIType.avoir,\r\n HospitalityPOIType.produit,\r\n HospitalityPOIType.service\r\n]\r\n\r\nconst MapFilter = ({ settings }: MapFilterProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const locale = useLocaleStore((state) => state.locale)\r\n const selectedFilters = useSelector(\r\n (state: RootState) => state.map.selectedFilters\r\n )\r\n\r\n const [toggle, setToggle] = useState<boolean>(true)\r\n const [showFilters, setShowFilters] = useState<Array<string>>([])\r\n const [translation, setTranslation] = useState<Translation>()\r\n const [localizedTranslation, setLocalizedTranslation] = useState<{\r\n [type: string]: string\r\n }>()\r\n const [colors, setColors] = useState<{\r\n [type: string]: string\r\n }>()\r\n const [icons, setIcons] = useState<{ [type: string]: string }>()\r\n\r\n useEffect(() => {\r\n const tempTranslations: Translation = hospitalityTranslation\r\n const tempColors = hospitalityColors\r\n\r\n if (settings?.categories?.length) {\r\n const tempFilters: Array<string> = []\r\n const tempIcons = {}\r\n\r\n settings.categories.forEach((category) => {\r\n // Add filter\r\n tempFilters.push(category.name)\r\n\r\n // Add label translation\r\n if (category.filter?.localizedLabel) {\r\n Object.entries(category.filter.localizedLabel).forEach(\r\n ([loc, lab]) => {\r\n tempTranslations[loc][category.name] = lab\r\n }\r\n )\r\n } else {\r\n tempTranslations['fr-FR'][category.name] =\r\n category.filter?.label || 'Category'\r\n }\r\n\r\n // Add color\r\n tempColors[category.name] = category.color || defaultColor\r\n\r\n // Add icon\r\n category.filter?.iconUrl &&\r\n (tempIcons[category.name] = category.filter?.iconUrl)\r\n })\r\n\r\n if (settings.hospitalityCategories) {\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display) {\r\n // Add filter\r\n tempFilters.push(type)\r\n\r\n // Change label if needed\r\n if (values.localizedLabel) {\r\n Object.entries(values.localizedLabel).forEach(([loc, lab]) => {\r\n tempTranslations[loc][type] = lab\r\n })\r\n } else if (values.label) {\r\n tempTranslations['fr-FR'][type] = values.label\r\n }\r\n\r\n // Change color if needed\r\n values.color && (tempColors[type] = values.color)\r\n }\r\n }\r\n )\r\n }\r\n\r\n setShowFilters(tempFilters)\r\n setIcons(tempIcons)\r\n } else if (settings?.showFilter?.length) {\r\n setShowFilters(settings?.showFilter)\r\n } else if (settings?.hospitalityCategories) {\r\n const tempFilters: Array<string> = []\r\n\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display) {\r\n // Add filter\r\n tempFilters.push(type)\r\n\r\n // Change label if needed\r\n if (values.localizedLabel) {\r\n Object.entries(values.localizedLabel).forEach(([loc, lab]) => {\r\n tempTranslations[loc][type] = lab\r\n })\r\n } else if (values.label) {\r\n tempTranslations['fr-FR'][type] = values.label\r\n }\r\n\r\n // Change color if needed\r\n values.color && (tempColors[type] = values.color)\r\n }\r\n }\r\n )\r\n\r\n setShowFilters(tempFilters)\r\n } else {\r\n setShowFilters(hospitalityFullFilters)\r\n }\r\n\r\n setTranslation(tempTranslations)\r\n setColors(tempColors)\r\n }, [settings])\r\n\r\n useEffect(() => {\r\n translation &&\r\n locale &&\r\n setLocalizedTranslation(translation[locale] || translation['fr-FR'])\r\n }, [translation, locale])\r\n\r\n const onFilterClick = (type: string): void => {\r\n if (selectedFilters.includes(type)) {\r\n dispatch(\r\n updateFilters({\r\n selectedFilters: selectedFilters.filter((f) => f !== type)\r\n })\r\n )\r\n } else {\r\n dispatch(updateFilters({ selectedFilters: [...selectedFilters, type] }))\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n id='retorik-map-filters'\r\n className={`filterContainer ${toggle ? 'show' : 'hide'}`}>\r\n <div className='filterToggler' onClick={(): void => setToggle(!toggle)}>\r\n {hospitalityTranslation[locale]?.title ||\r\n hospitalityTranslation['fr-FR'].title}\r\n <span className={`arrow ${toggle ? 'active' : ''}`} />\r\n </div>\r\n <div className='filterMenu'>\r\n {localizedTranslation &&\r\n colors &&\r\n showFilters.map((type, key) => {\r\n return localizedTranslation[type] ? (\r\n <MapFilterItem\r\n key={key}\r\n type={type}\r\n label={localizedTranslation[type]}\r\n color={colors[type]}\r\n imageSrc={icons?.[type]}\r\n selected={selectedFilters.includes(type)}\r\n onClick={onFilterClick}\r\n />\r\n ) : (\r\n <React.Fragment key={key} />\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport { MapFilter }\r\n","import type { LatLngExpression } from 'leaflet'\r\n\r\ninterface POI {\r\n name: string\r\n type: string\r\n location: LatLngExpression\r\n contentItemId: string\r\n description?: string\r\n imageURL?: string\r\n address?: string\r\n phone?: string\r\n color?: string\r\n}\r\n\r\ninterface Place {\r\n latitude: number\r\n longitude: number\r\n telephone: string\r\n streetAddress: string\r\n postalCode: string\r\n addressLocality: string\r\n}\r\n\r\ninterface GenericPOI {\r\n displayText: string\r\n contentItemId: string\r\n place: Place\r\n thing: {\r\n name: string\r\n description: string\r\n image: {\r\n paths: string[]\r\n urls: string[]\r\n }\r\n url: {\r\n text: string\r\n url: string\r\n }\r\n }\r\n}\r\n\r\nenum HospitalityPOIType {\r\n restaurant = 'restaurant',\r\n afaire = 'afaire',\r\n avoir = 'avoir',\r\n hebergement = 'hebergement',\r\n produit = 'produit',\r\n service = 'service'\r\n}\r\n\r\nexport type { POI, Place, GenericPOI }\r\nexport { HospitalityPOIType }\r\n","{\r\n \"ar-EG\": {\r\n \"title\": \"النقاط المثيرة للاهتمام\",\r\n \"afaire\": \"أشياء لفعلها\",\r\n \"restaurant\": \"أين تأكل\",\r\n \"hebergement\": \"أو النوم\",\r\n \"avoir\": \"أشياء يمكن رؤيتها\",\r\n \"produit\": \"منتوجات محلية\",\r\n \"service\": \"خدمات\"\r\n },\r\n \"ar-SA\": {\r\n \"title\": \"النقاط المثيرة للاهتمام\",\r\n \"afaire\": \"أشياء لفعلها\",\r\n \"restaurant\": \"أين تأكل\",\r\n \"hebergement\": \"أو النوم\",\r\n \"avoir\": \"أشياء يمكن رؤيتها\",\r\n \"produit\": \"منتوجات محلية\",\r\n \"service\": \"خدمات\"\r\n },\r\n \"ca-ES\": {\r\n \"title\": \"Punts d'interés\",\r\n \"afaire\": \"Coses a fer\",\r\n \"restaurant\": \"On menjar\",\r\n \"hebergement\": \"On dormir\",\r\n \"avoir\": \"Coses per veure\",\r\n \"produit\": \"Productes locals\",\r\n \"service\": \"Serveis\"\r\n },\r\n \"cs-CZ\": {\r\n \"title\": \"Body zájmu\",\r\n \"afaire\": \"Věci ke splnění\",\r\n \"restaurant\": \"Kde jíst\",\r\n \"hebergement\": \"Nebo spát\",\r\n \"avoir\": \"Věci k vidění\",\r\n \"produit\": \"Místní produkty\",\r\n \"service\": \"Služby\"\r\n },\r\n \"da-DK\": {\r\n \"title\": \"Interessepunkter\",\r\n \"afaire\": \"Ting at gøre\",\r\n \"restaurant\": \"Hvor skal man spise\",\r\n \"hebergement\": \"Eller sove\",\r\n \"avoir\": \"Ting at se\",\r\n \"produit\": \"Lokale produkter\",\r\n \"service\": \"Tjenester\"\r\n },\r\n \"de-AT\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"de-CH\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"de-DE\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"en-CA\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-GB\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-HK\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-IE\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-IN\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-US\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"es-ES\": {\r\n \"title\": \"Puntos de interés\",\r\n \"afaire\": \"Cosas para hacer\",\r\n \"restaurant\": \"Donde comer\",\r\n \"hebergement\": \"Donde dormir\",\r\n \"avoir\": \"Cosas por ver\",\r\n \"produit\": \"Productos locales\",\r\n \"service\": \"Servicios\"\r\n },\r\n \"es-MX\": {\r\n \"title\": \"Puntos de interés\",\r\n \"afaire\": \"Cosas para hacer\",\r\n \"restaurant\": \"Donde comer\",\r\n \"hebergement\": \"Donde dormir\",\r\n \"avoir\": \"Cosas por ver\",\r\n \"produit\": \"Productos locales\",\r\n \"service\": \"Servicios\"\r\n },\r\n \"fr-BE\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-CA\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-CH\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-FR\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"hi-IN\": {\r\n \"title\": \"ब्याज के अंक\",\r\n \"afaire\": \"करने के लिए काम\",\r\n \"restaurant\": \"कहाँ खाना है\",\r\n \"hebergement\": \"या सो जाओ\",\r\n \"avoir\": \"देखने लायक चीजें\",\r\n \"produit\": \"स्थानीय उत्पाद\",\r\n \"service\": \"सेवाएं\"\r\n },\r\n \"id-ID\": {\r\n \"title\": \"Tempat menarik\",\r\n \"afaire\": \"Hal yang harus dilakukan\",\r\n \"restaurant\": \"Tempat makan\",\r\n \"hebergement\": \"Atau tidur\",\r\n \"avoir\": \"Hal-hal untuk dilihat\",\r\n \"produit\": \"Produk lokal\",\r\n \"service\": \"Jasa\"\r\n },\r\n \"it-IT\": {\r\n \"title\": \"Punti di interesse\",\r\n \"afaire\": \"Cose da fare\",\r\n \"restaurant\": \"Dove mangiare\",\r\n \"hebergement\": \"Dove dormire\",\r\n \"avoir\": \"Cose da vedere\",\r\n \"produit\": \"Prodotti locali\",\r\n \"service\": \"Servizi\"\r\n },\r\n \"ja-JP\": {\r\n \"title\": \"興味がある点\",\r\n \"afaire\": \"やる事\",\r\n \"restaurant\": \"どこで食べます\",\r\n \"hebergement\": \"それとも寝るか\",\r\n \"avoir\": \"見るべきもの\",\r\n \"produit\": \"地元の特産品\",\r\n \"service\": \"サービス\"\r\n },\r\n \"ko-KR\": {\r\n \"title\": \"가볼만한 곳\",\r\n \"afaire\": \"해야 할 일\",\r\n \"restaurant\": \"먹을 곳\",\r\n \"hebergement\": \"아니면 잠\",\r\n \"avoir\": \"볼만한 것들\",\r\n \"produit\": \"지역상품\",\r\n \"service\": \"서비스\"\r\n },\r\n \"nb-NO\": {\r\n \"title\": \"Interessepunkt\",\r\n \"afaire\": \"Ting å gjøre\",\r\n \"restaurant\": \"Hvor å spise\",\r\n \"hebergement\": \"Hvor å sove\",\r\n \"avoir\": \"Ting å se\",\r\n \"produit\": \"Lokale produkter\",\r\n \"service\": \"Tjenester\"\r\n },\r\n \"nl-BE\": {\r\n \"title\": \"Interessante punten\",\r\n \"afaire\": \"Dingen om te doen\",\r\n \"restaurant\": \"Waar te eten\",\r\n \"hebergement\": \"Waar te slapen\",\r\n \"avoir\": \"Dingen om te zien\",\r\n \"produit\": \"Regionale producten\",\r\n \"service\": \"Diensten\"\r\n },\r\n \"nl-NL\": {\r\n \"title\": \"Interessante punten\",\r\n \"afaire\": \"Dingen om te doen\",\r\n \"restaurant\": \"Waar te eten\",\r\n \"hebergement\": \"Waar te slapen\",\r\n \"avoir\": \"Dingen om te zien\",\r\n \"produit\": \"Regionale producten\",\r\n \"service\": \"Diensten\"\r\n },\r\n \"pl-PL\": {\r\n \"title\": \"Ciekawe miejsca\",\r\n \"afaire\": \"Rzeczy do zrobienia\",\r\n \"restaurant\": \"Gdzie zjeść\",\r\n \"hebergement\": \"Gdzie spać\",\r\n \"avoir\": \"Rzeczy do zobaczenia\",\r\n \"produit\": \"Lokalne produkty\",\r\n \"service\": \"Usługi\"\r\n },\r\n \"pt-BR\": {\r\n \"title\": \"Pontos de interesse\",\r\n \"afaire\": \"Coisas para fazer\",\r\n \"restaurant\": \"Onde comer\",\r\n \"hebergement\": \"Onde dormir\",\r\n \"avoir\": \"Coisas para ver\",\r\n \"produit\": \"Produtos locais\",\r\n \"service\": \"Serviços\"\r\n },\r\n \"pt-PT\": {\r\n \"title\": \"Pontos de interesse\",\r\n \"afaire\": \"Coisas para fazer\",\r\n \"restaurant\": \"Onde comer\",\r\n \"hebergement\": \"Onde dormir\",\r\n \"avoir\": \"Coisas para ver\",\r\n \"produit\": \"Produtos locais\",\r\n \"service\": \"Serviços\"\r\n },\r\n \"ru-RU\": {\r\n \"title\": \"Точки интереса\",\r\n \"afaire\": \"Дела, которые необходимо сделать\",\r\n \"restaurant\": \"Где поесть\",\r\n \"hebergement\": \"Или спать\",\r\n \"avoir\": \"Вещи, чтобы увидеть\",\r\n \"produit\": \"Местные продукты\",\r\n \"service\": \"Услуги\"\r\n },\r\n \"sv-SE\": {\r\n \"title\": \"Intressepunkter\",\r\n \"afaire\": \"Saker att göra\",\r\n \"restaurant\": \"Var man ska äta\",\r\n \"hebergement\": \"Vart man ska sova\",\r\n \"avoir\": \"Saker att se\",\r\n \"produit\": \"Lokala produkter\",\r\n \"service\": \"Tjänster\"\r\n },\r\n \"th-TH\": {\r\n \"title\": \"จุดที่น่าสนใจ\",\r\n \"afaire\": \"สิ่งที่ต้องทำ\",\r\n \"restaurant\": \"กินที่ไหนดี\",\r\n \"hebergement\": \"หรือนอนหลับ\",\r\n \"avoir\": \"สิ่งที่น่าดู\",\r\n \"produit\": \"สินค้าพื้นเมือง\",\r\n \"service\": \"บริการ\"\r\n },\r\n \"tr-TR\": {\r\n \"title\": \"İlgi noktaları\",\r\n \"afaire\": \"Yapılacak şeyler\",\r\n \"restaurant\": \"Nerede yenir\",\r\n \"hebergement\": \"Ya da uyu\",\r\n \"avoir\": \"Görülecek şeyler\",\r\n \"produit\": \"Yerel ürünler\",\r\n \"service\": \"Hizmetler\"\r\n },\r\n \"zh-CN\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n },\r\n \"zh-HK\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n },\r\n \"zh-TW\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n }\r\n}\r\n","import React, { useEffect, useState } from 'react'\r\n\r\nimport {\r\n WhatToDoIcon,\r\n WhatToSeeIcon,\r\n WhereToEatIcon,\r\n WhereToSleepIcon,\r\n LocalProductsIcon,\r\n ServicesIcon\r\n} from '@davi-ai/retorik-framework-hospitality'\r\n\r\nimport '../styles/components/MapFilter.scss'\r\nimport { POIType } from '../index_module'\r\n\r\ninterface MapFilterItemProps {\r\n type: string\r\n label: string\r\n color: string\r\n imageSrc?: string\r\n selected: boolean\r\n onClick: (value: string) => void\r\n}\r\n\r\nconst MapFilterItem = ({\r\n type,\r\n label,\r\n color,\r\n imageSrc,\r\n selected,\r\n onClick\r\n}: MapFilterItemProps): JSX.Element => {\r\n const [image, setImage] = useState<JSX.Element>(<></>)\r\n\r\n useEffect(() => {\r\n switch (type) {\r\n case POIType.afaire:\r\n setImage(<WhatToDoIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.restaurant:\r\n setImage(<WhereToEatIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.hebergement:\r\n setImage(<WhereToSleepIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.avoir:\r\n setImage(<WhatToSeeIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.produit:\r\n setImage(<LocalProductsIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.service:\r\n setImage(<ServicesIcon className='imageFile' color='#FFF' />)\r\n break\r\n default:\r\n imageSrc\r\n ? setImage(<img src={imageSrc} className='imageFile' />)\r\n : setImage(<ServicesIcon className='imageFile' color='#FFF' />)\r\n break\r\n }\r\n }, [type, imageSrc])\r\n\r\n return (\r\n <div\r\n className={`filterCategory ${selected ? 'selectedFilter' : ''}`}\r\n onClick={(): void => onClick(type)}>\r\n <div className={`checkbox ${selected ? 'fadeIn checkbox-selected' : ''}`}>\r\n {`\\u{1F5F8}`}\r\n </div>\r\n <div\r\n className='image'\r\n style={{\r\n backgroundColor: color\r\n }}>\r\n {image}\r\n </div>\r\n <span\r\n style={{\r\n color: color,\r\n fontWeight: 700\r\n }}>\r\n {label}\r\n </span>\r\n </div>\r\n )\r\n}\r\n\r\nexport default MapFilterItem\r\n","import L, { LatLngExpression } from 'leaflet'\r\nimport React, { useEffect, useState } from 'react'\r\nimport { useMap } from 'react-leaflet'\r\nimport { iconUserLocation } from '../utils/MarkerIcons'\r\n\r\ninterface LocationMarkerProps {\r\n currentUserPos: LatLngExpression\r\n}\r\n\r\nconst LocationMarker = (props: LocationMarkerProps): JSX.Element => {\r\n const map = useMap()\r\n const currentUserPos = props.currentUserPos\r\n\r\n const [userMarker, setUserMarker] = useState<L.Marker | undefined>()\r\n useEffect(() => {\r\n if (map && currentUserPos) {\r\n map.flyTo(currentUserPos, map.getZoom())\r\n if (userMarker) userMarker.removeFrom(map)\r\n setUserMarker(L.marker(currentUserPos, { icon: iconUserLocation }))\r\n }\r\n }, [currentUserPos])\r\n\r\n useEffect(() => {\r\n if (userMarker && map) {\r\n userMarker.addTo(map)\r\n }\r\n }, [userMarker])\r\n\r\n return <></>\r\n}\r\n\r\nexport { LocationMarker }\r\n","import L from 'leaflet'\r\n\r\nimport {\r\n pinAFaire,\r\n pinAVoir,\r\n pinOuDormir,\r\n pinOuManger,\r\n pinProduit,\r\n pinService,\r\n markerIcon\r\n} from '../styles/icons/dataUrlIcons'\r\n\r\nconst iconRestaurant = new L.Icon({\r\n iconUrl: pinOuManger,\r\n iconRetinaUrl: pinOuManger,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconAFaire = new L.Icon({\r\n iconUrl: pinAFaire,\r\n iconRetinaUrl: pinAFaire,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconHebergement = new L.Icon({\r\n iconUrl: pinOuDormir,\r\n iconRetinaUrl: pinOuDormir,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconAVoir = new L.Icon({\r\n iconUrl: pinAVoir,\r\n iconRetinaUrl: pinAVoir,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconProduit = new L.Icon({\r\n iconUrl: pinProduit,\r\n iconRetinaUrl: pinProduit,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconService = new L.Icon({\r\n iconUrl: pinService,\r\n iconRetinaUrl: pinService,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconUserLocation = new L.Icon({\r\n iconUrl: markerIcon,\r\n iconRetinaUrl: markerIcon,\r\n iconSize: [30, 40],\r\n iconAnchor: [10, 40]\r\n})\r\n\r\nconst createGenericIcon = (color: string, image?: string): any => {\r\n const html = `<svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n viewBox='0 0 58 80'\r\n xmlSpace='preserve'>\r\n <path\r\n fill='transparent'\r\n stroke='none'\r\n d='\r\n M34.000038,81.000000\r\n C22.666689,81.000000 11.833360,81.000000 1.000023,81.000000\r\n C1.000015,54.333355 1.000015,27.666706 1.000008,1.000045\r\n C20.333307,1.000030 39.666615,1.000030 58.999939,1.000015\r\n C58.999962,27.666632 58.999962,54.333263 58.999981,80.999947\r\n C50.833351,81.000000 42.666702,81.000000 34.000038,81.000000\r\n M33.475105,72.025642\r\n C39.288925,63.219608 44.824600,54.213634 50.978767,45.652252\r\n C61.407108,31.144852 55.529221,10.340107 38.228577,4.554025\r\n C28.070148,1.156609 15.409478,3.774259 8.902496,11.574289\r\n C1.940706,19.919506 0.509056,33.278297 6.117495,42.243046\r\n C13.175139,53.524258 20.588833,64.583954 27.981516,75.650635\r\n C28.341463,76.189476 30.294182,76.323311 30.938543,75.859123\r\n C31.911585,75.158157 32.385235,73.763962 33.475105,72.025642\r\n z'\r\n />\r\n <path\r\n fill=${color}\r\n opacity='1.000000'\r\n stroke='#FFF'\r\n strokeWidth='2'\r\n d='\r\n M33.273117,72.345016\r\n C32.385235,73.763962 31.911585,75.158157 30.938543,75.859123\r\n C30.294182,76.323311 28.341463,76.189476 27.981516,75.650635\r\n C20.588833,64.583954 13.175139,53.524258 6.117495,42.243046\r\n C0.509056,33.278297 1.940706,19.919506 8.902496,11.574289\r\n C15.409478,3.774259 28.070148,1.156609 38.228577,4.554025\r\n C55.529221,10.340107 61.407108,31.144852 50.978767,45.652252\r\n C44.824600,54.213634 39.288925,63.219608 33.273117,72.345016\r\n z'\r\n />\r\n </svg>`\r\n\r\n const htmlWithImage = `<div style='position:relative;'>\r\n <img src=${image} style='position:absolute;aspect-ratio:1;z-index:2;top:0;width:100%;padding:20%;'>\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n viewBox='0 0 58 80'\r\n xmlSpace='preserve'>\r\n <path\r\n fill='transparent'\r\n stroke='none'\r\n d='\r\n M34.000038,81.000000 \r\n C22.666689,81.000000 11.833360,81.000000 1.000023,81.000000 \r\n C1.000015,54.333355 1.000015,27.666706 1.000008,1.000045 \r\n C20.333307,1.000030 39.666615,1.000030 58.999939,1.000015 \r\n C58.999962,27.666632 58.999962,54.333263 58.999981,80.999947 \r\n C50.833351,81.000000 42.666702,81.000000 34.000038,81.000000 \r\n M33.475105,72.025642 \r\n C39.288925,63.219608 44.824600,54.213634 50.978767,45.652252 \r\n C61.407108,31.144852 55.529221,10.340107 38.228577,4.554025 \r\n C28.070148,1.156609 15.409478,3.774259 8.902496,11.574289 \r\n C1.940706,19.919506 0.509056,33.278297 6.117495,42.243046 \r\n C13.175139,53.524258 20.588833,64.583954 27.981516,75.650635 \r\n C28.341463,76.189476 30.294182,76.323311 30.938543,75.859123 \r\n C31.911585,75.158157 32.385235,73.763962 33.475105,72.025642 \r\n z'\r\n />\r\n <path\r\n fill=${color}\r\n opacity='1.000000'\r\n stroke='#FFF'\r\n strokeWidth='2'\r\n d='\r\n M33.273117,72.345016 \r\n C32.385235,73.763962 31.911585,75.158157 30.938543,75.859123 \r\n C30.294182,76.323311 28.341463,76.189476 27.981516,75.650635 \r\n C20.588833,64.583954 13.175139,53.524258 6.117495,42.243046 \r\n C0.509056,33.278297 1.940706,19.919506 8.902496,11.574289 \r\n C15.409478,3.774259 28.070148,1.156609 38.228577,4.554025 \r\n C55.529221,10.340107 61.407108,31.144852 50.978767,45.652252 \r\n C44.824600,54.213634 39.288925,63.219608 33.273117,72.345016 \r\n z'\r\n />\r\n </svg></div>`\r\n\r\n return L.divIcon({\r\n html: image ? htmlWithImage : html,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n })\r\n}\r\n\r\nexport {\r\n iconRestaurant,\r\n iconAFaire,\r\n iconHebergement,\r\n iconAVoir,\r\n iconProduit,\r\n iconService,\r\n iconUserLocation,\r\n createGenericIcon\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport MarkdownIt from 'markdown-it'\r\nimport { useLocaleStore, sendMessage } from '@davi-ai/retorik-framework'\r\n\r\nimport type { RootState } from '../stores/globalStore'\r\nimport { toggleLoader } from '../features/mapSlice'\r\nimport { POI } from '../models/POI'\r\nimport { closeBotButtonClick } from '../utils/botUtils'\r\nimport { capitalizeFirstLetter } from '../utils/globalUtils'\r\nimport {\r\n setDetailOpennedByMap,\r\n setDisplayPOIFinished\r\n} from '../features/poiSlice'\r\nimport translation from '../translations/poi.json'\r\nimport Routes from './Routes'\r\nimport QRCodeComponent from './QRCodeComponent'\r\nimport { RoundIcon } from './Icons'\r\n\r\ninterface POIDetailProps {\r\n poi: POI\r\n retorikAddress: string\r\n poiClose: () => void\r\n setMapLayerData: (data: any) => void\r\n}\r\n\r\nconst md = new MarkdownIt({\r\n breaks: true,\r\n html: true,\r\n xhtmlOut: true,\r\n typographer: true,\r\n quotes: `\"\"''`\r\n})\r\n\r\nconst fadeDuration = 500\r\n\r\nconst POIDetail = ({\r\n poi,\r\n retorikAddress,\r\n poiClose,\r\n setMapLayerData\r\n}: POIDetailProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const currentUserPos = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const locale = useLocaleStore((state) => state.locale)\r\n const [coordinates, setCoordinates] = useState<\r\n Array<Array<number>> | undefined\r\n >(undefined)\r\n const [qrCodeUrl, setQrCodeUrl] = useState<string | null>()\r\n const [imageLoaded, setImageLoaded] = useState<boolean>(false)\r\n const [mainFadingOut, setMainFadingOut] = useState<boolean>(false)\r\n const [fadingOut, setFadingOut] = useState<boolean>(false)\r\n const mainFadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n const mainSecondFadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n const fadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n\r\n useEffect(() => {\r\n if (poi.location && currentUserPos) {\r\n // Set coordinates depending on the real type of the LatLngExpression\r\n const tempCoordinates: Array<Array<number>> = []\r\n // User position first, then POI position\r\n if (Array.isArray(currentUserPos)) {\r\n tempCoordinates.push([currentUserPos[1], currentUserPos[0]])\r\n } else if (currentUserPos.lat && currentUserPos.lng) {\r\n tempCoordinates.push([currentUserPos.lng, currentUserPos.lat])\r\n }\r\n\r\n if (Array.isArray(poi.location)) {\r\n tempCoordinates.push([poi.location[1], poi.location[0]])\r\n } else if (poi.location.lat && poi.location.lng) {\r\n tempCoordinates.push([poi.location.lng, poi.location.lat])\r\n }\r\n\r\n setCoordinates(tempCoordinates)\r\n }\r\n }, [currentUserPos, poi])\r\n\r\n useEffect(() => {\r\n setImageLoaded(!poi.imageURL)\r\n }, [poi.imageURL])\r\n\r\n const showMoreHandler = (poi: POI): void => {\r\n console.log(`Retorik Map > open detail for POI ${poi.name}`)\r\n\r\n closeBotButtonClick()\r\n // Display Loader\r\n dispatch(toggleLoader({ loading: true }))\r\n // Store information that POI detail is openned by the map to handle the return\r\n dispatch(setDetailOpennedByMap({ detailOpennedByMap: true }))\r\n dispatch(setDisplayPOIFinished({ displayPOIFinished: false }))\r\n\r\n sendMessage(undefined, {\r\n identifier: poi.contentItemId,\r\n name: 'hospitality.showPoiById',\r\n searchLabel: ''\r\n })\r\n }\r\n\r\n const handlePoiClose = (): void => {\r\n setMainFadingOut(true)\r\n mainFadeOutTimerRef?.current && clearTimeout(mainFadeOutTimerRef.current)\r\n mainSecondFadeOutTimerRef?.current &&\r\n clearTimeout(mainSecondFadeOutTimerRef.current)\r\n\r\n mainFadeOutTimerRef.current = setTimeout(() => {\r\n setMainFadingOut(false)\r\n }, fadeDuration)\r\n mainSecondFadeOutTimerRef.current = setTimeout(() => {\r\n poiClose()\r\n }, fadeDuration - 100)\r\n }\r\n\r\n const handleCloseQrCode = (): void => {\r\n setFadingOut(true)\r\n fadeOutTimerRef?.current && clearTimeout(fadeOutTimerRef.current)\r\n fadeOutTimerRef.current = setTimeout(() => {\r\n setQrCodeUrl(null)\r\n setFadingOut(false)\r\n }, fadeDuration)\r\n }\r\n\r\n return (\r\n <div\r\n className={`infoPOIPane ${\r\n mainFadingOut ? 'fadeOut' : imageLoaded ? 'fadeIn' : ''\r\n }`}\r\n style={{\r\n visibility: imageLoaded ? 'visible' : 'hidden'\r\n }}>\r\n <span className='poiTitle'>{poi.name}</span>\r\n <span className='poiClose' onClick={handlePoiClose}>\r\n X\r\n </span>\r\n {poi.address && <span className='poiAddress'>{poi.address}</span>}\r\n {poi.phone && <span className='poiPhone'>{`\\u260E ${poi.phone}`}</span>}\r\n\r\n {/* Photo + description + button */}\r\n <div className='poiPhotoAndDescription'>\r\n {poi.imageURL && (\r\n <span className='poiPhoto'>\r\n <img\r\n onLoad={(): void => setImageLoaded(true)}\r\n onError={(): void => setImageLoaded(true)}\r\n src={`${retorikAddress}${poi.imageURL}`}\r\n alt={poi.name}\r\n />\r\n </span>\r\n )}\r\n\r\n <div className='poiDescriptionAndButton'>\r\n {/* Description if this is a string */}\r\n {typeof poi.description === 'string' && poi.description.length && (\r\n <span\r\n className='poiDesc'\r\n dangerouslySetInnerHTML={{ __html: md.render(poi.description) }}\r\n />\r\n )}\r\n <button\r\n onClick={(): void => showMoreHandler(poi)}\r\n className='poiButton'\r\n style={{\r\n color: poi.color,\r\n borderColor: poi.color\r\n }}>\r\n {translation[locale]?.showmore || translation['fr-FR'].showmore}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {coordinates && (\r\n <Routes\r\n coordinates={coordinates}\r\n setMapLayerData={setMapLayerData}\r\n setQrCodeUrl={setQrCodeUrl}\r\n color={poi.color}\r\n />\r\n )}\r\n\r\n {qrCodeUrl && (\r\n <div\r\n className={`qrcode-container ${fadingOut ? 'fadeOut' : 'fadeIn'} `}>\r\n <span className='poiClose white' onClick={handleCloseQrCode}>\r\n X\r\n </span>\r\n <div className='qrcode-text-and-icon'>\r\n <RoundIcon color='#FFF' />\r\n <div className='qrcode-text'>\r\n <div>\r\n {capitalizeFirstLetter(\r\n translation[locale]?.openroutemobile ||\r\n translation['fr-FR'].openroutemobile,\r\n locale\r\n )}\r\n </div>\r\n <div>\r\n {translation[locale]?.scanQR || translation['fr-FR'].scanQR}\r\n </div>\r\n </div>\r\n </div>\r\n <QRCodeComponent src={qrCodeUrl} />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport { POIDetail }\r\n","const capitalizeFirstLetter = (text: string, locale = 'fr-FR'): string => {\r\n if (text?.length) {\r\n const first = text.charAt(0)\r\n const rest = text.slice(1)\r\n return first.toLocaleUpperCase(locale) + rest\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport { capitalizeFirstLetter }\r\n","{\r\n \"ar-EG\": {\r\n \"showmore\": \"اقرأ المزيد\",\r\n \"openroutemobile\": \"افتح طريق خريطة جوجل على الهاتف الذكي\",\r\n \"scanQR\": \"عن طريق مسح رمز الاستجابة السريعة\",\r\n \"route\": \"طريق\"\r\n },\r\n \"ar-SA\": {\r\n \"showmore\": \"اقرأ المزيد\",\r\n \"openroutemobile\": \"افتح طريق خريطة جوجل على الهاتف الذكي\",\r\n \"scanQR\": \"عن طريق مسح رمز الاستجابة السريعة\",\r\n \"route\": \"طريق\"\r\n },\r\n \"ca-ES\": {\r\n \"showmore\": \"Aprèn més\",\r\n \"openroutemobile\": \"obre la ruta de Google Maps al telèfon intel·ligent\",\r\n \"scanQR\": \"escanejant el QrCode\",\r\n \"route\": \"carretera\"\r\n },\r\n \"cs-CZ\": {\r\n \"showmore\": \"Zjistěte více\",\r\n \"openroutemobile\": \"otevřete trasu Google Maps na smartphonu\",\r\n \"scanQR\": \"skenováním QrCode\",\r\n \"route\": \"silnice\"\r\n },\r\n \"da-DK\": {\r\n \"showmore\": \"Lær mere\",\r\n \"openroutemobile\": \"åben Google Map-rute på smartphone\",\r\n \"scanQR\": \"ved at scanne QRCoden\",\r\n \"route\": \"vej\"\r\n },\r\n \"de-AT\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"de-CH\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"de-DE\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"en-CA\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-GB\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-HK\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-IE\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-IN\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-US\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"es-ES\": {\r\n \"showmore\": \"Más información\",\r\n \"openroutemobile\": \"abrir la ruta de Google Maps en el teléfono inteligente\",\r\n \"scanQR\": \"escaneando el QrCode\",\r\n \"route\": \"ruta\"\r\n },\r\n \"es-MX\": {\r\n \"showmore\": \"Más información\",\r\n \"openroutemobile\": \"abrir la ruta de Google Maps en el teléfono inteligente\",\r\n \"scanQR\": \"escaneando el QrCode\",\r\n \"route\": \"ruta\"\r\n },\r\n \"fi-FI\": {\r\n \"showmore\": \"Lue lisää\",\r\n \"openroutemobile\": \"avaa Google Maps -reitti älypuhelimella\",\r\n \"scanQR\": \"skannaamalla QR-koodin\",\r\n \"route\": \"tie\"\r\n },\r\n \"fr-BE\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-CA\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-CH\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-FR\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"hi-IN\": {\r\n \"showmore\": \"और अधिक जानें\",\r\n \"openroutemobile\": \"स्मार्टफोन पर गूगल मैप रूट खोलें\",\r\n \"scanQR\": \"QrCode को स्कैन करके\",\r\n \"route\": \"सड़क\"\r\n },\r\n \"hu-HU\": {\r\n \"showmore\": \"Tudj meg többet\",\r\n \"openroutemobile\": \"nyissa meg a Google Maps útvonalat az okostelefonon\",\r\n \"scanQR\": \"a QR-kód beolvasásával\",\r\n \"route\": \"út\"\r\n },\r\n \"id-ID\": {\r\n \"showmore\": \"Belajarlah lagi\",\r\n \"openroutemobile\": \"buka rute Google Maps di smartphone\",\r\n \"scanQR\": \"dengan memindai QrCode\",\r\n \"route\": \"jalan\"\r\n },\r\n \"it-IT\": {\r\n \"showmore\": \"Saperne di più\",\r\n \"openroutemobile\": \"apri il percorso di Google Maps sullo smartphone\",\r\n \"scanQR\": \"scansionando il QrCode\",\r\n \"route\": \"strada\"\r\n },\r\n \"ja-JP\": {\r\n \"showmore\": \"詳細はこちら\",\r\n \"openroutemobile\": \"スマホでGoogleマップのルートを開く\",\r\n \"scanQR\": \"Qrコードをスキャンすることで\",\r\n \"route\": \"道\"\r\n },\r\n \"ko-KR\": {\r\n \"showmore\": \"더 알아보기\",\r\n \"openroutemobile\": \"스마트폰에서 Google 지도 경로 열기\",\r\n \"scanQR\": \"QrCode를 스캔하여\",\r\n \"route\": \"도로\"\r\n },\r\n \"nb-NO\": {\r\n \"showmore\": \"Lære mer\",\r\n \"openroutemobile\": \"åpne Google Maps-ruten på smarttelefonen\",\r\n \"scanQR\": \"ved å skanne QRCode\",\r\n \"route\": \"vei\"\r\n },\r\n \"nl-BE\": {\r\n \"showmore\": \"Meer informatie gebruiksaanwijzing\",\r\n \"openroutemobile\": \"open Google Maps-route op smartphone\",\r\n \"scanQR\": \"door de QRCode te scannen\",\r\n \"route\": \"weg\"\r\n },\r\n \"nl-NL\": {\r\n \"showmore\": \"Meer informatie gebruiksaanwijzing\",\r\n \"openroutemobile\": \"open Google Maps-route op smartphone\",\r\n \"scanQR\": \"door de QRCode te scannen\",\r\n \"route\": \"weg\"\r\n },\r\n \"pl-PL\": {\r\n \"showmore\": \"Ucz się więcej\",\r\n \"openroutemobile\": \"otwórz trasę Map Google na smartfonie\",\r\n \"scanQR\": \"poprzez zeskanowanie kodu QR\",\r\n \"route\": \"droga\"\r\n },\r\n \"pt-BR\": {\r\n \"showmore\": \"Saber mais\",\r\n \"openroutemobile\": \"abra a rota do Google Maps no smartphone\",\r\n \"scanQR\": \"digitalizando o QrCode\",\r\n \"route\": \"estrada\"\r\n },\r\n \"pt-PT\": {\r\n \"showmore\": \"Saber mais\",\r\n \"openroutemobile\": \"abra a rota do Google Maps no smartphone\",\r\n \"scanQR\": \"digitalizando o QrCode\",\r\n \"route\": \"estrada\"\r\n },\r\n \"ru-RU\": {\r\n \"showmore\": \"Узнать больше\",\r\n \"openroutemobile\": \"открыть маршрут Google Maps на смартфоне\",\r\n \"scanQR\": \"отсканировав QrCode\",\r\n \"route\": \"дорога\"\r\n },\r\n \"sv-SE\": {\r\n \"showmore\": \"Läs mer\",\r\n \"openroutemobile\": \"odprite Google Maps route na pametnem telefonu\",\r\n \"scanQR\": \"s skeniranjem QrCode\",\r\n \"route\": \"cesta\"\r\n },\r\n \"th-TH\": {\r\n \"showmore\": \"เรียนรู้เพิ่มเติม\",\r\n \"openroutemobile\": \"เปิดเส้นทาง Google Maps บนสมาร์ทโฟน\",\r\n \"scanQR\": \"โดยการสแกน QrCode\",\r\n \"route\": \"ถนน\"\r\n },\r\n \"tr-TR\": {\r\n \"showmore\": \"Daha fazla bilgi edin\",\r\n \"openroutemobile\": \"akıllı telefonda Google Haritalar rotasını aç\",\r\n \"scanQR\": \"QrCode'u tarayarak\",\r\n \"route\": \"yol\"\r\n },\r\n \"zh-CN\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n },\r\n \"zh-HK\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n },\r\n \"zh-TW\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n }\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport QRCode from 'qrcode'\r\nimport type { FeatureCollection } from 'geojson'\r\nimport { useLocaleStore, useRetorikStore } from '@davi-ai/retorik-framework'\r\nimport { capitalizeFirstLetter } from '../utils/globalUtils'\r\nimport translation from '../translations/poi.json'\r\nimport RoutesItem from './RoutesItem'\r\nimport { OpenLocationIcon } from './Icons'\r\n\r\ninterface RoutesProps {\r\n coordinates: number[][]\r\n setMapLayerData: (data: FeatureCollection | undefined) => void\r\n color?: string\r\n setQrCodeUrl: (url: string) => void\r\n}\r\n\r\nconst openRoute = 'https://api.openrouteservice.org/v2/directions'\r\nconst openRouteAPIKey =\r\n '5b3ce3597851110001cf62483cfd6bd46f934b7d96f108a35e0f08b8'\r\nconst googleMapsAddress = 'https://www.google.com/maps/dir/?api=1&'\r\n\r\nconst Routes = ({\r\n coordinates,\r\n setMapLayerData,\r\n color,\r\n setQrCodeUrl\r\n}: RoutesProps): JSX.Element => {\r\n const isUsedOnBorne = useRetorikStore(\r\n (state) => state.configuration.isUsedOnBorne\r\n )\r\n const locale = useLocaleStore((state) => state.locale)\r\n\r\n const [drivingCar, setDrivingCar] = useState<FeatureCollection | undefined>(\r\n undefined\r\n )\r\n const [cyclingRegular, setCyclingRegular] = useState<\r\n FeatureCollection | undefined\r\n >(undefined)\r\n const [footWalking, setFootWalking] = useState<FeatureCollection | undefined>(\r\n undefined\r\n )\r\n const [currentChosen, setCurrentChosen] = useState<string | undefined>(\r\n undefined\r\n )\r\n\r\n const travelModeRef = useRef<string>()\r\n\r\n /**\r\n * On component mount :\r\n * - call methods to retrieve data from openroute API\r\n */\r\n useEffect(() => {\r\n if (coordinates) {\r\n calculateForProfile('driving-car')\r\n calculateForProfile('cycling-regular')\r\n calculateForProfile('foot-walking')\r\n }\r\n }, [coordinates])\r\n\r\n /**\r\n * On currentChosen state change :\r\n * - switch on currentChosen value to display the associated data on the map\r\n */\r\n useEffect(() => {\r\n switch (currentChosen) {\r\n case 'drivingCar':\r\n drivingCar && drivingCar.features && setMapLayerData(drivingCar)\r\n travelModeRef.current = 'driving'\r\n break\r\n case 'cyclingRegular':\r\n cyclingRegular &&\r\n cyclingRegular.features &&\r\n setMapLayerData(cyclingRegular)\r\n travelModeRef.current = 'bicycling'\r\n break\r\n case 'footWalking':\r\n footWalking && footWalking.features && setMapLayerData(footWalking)\r\n travelModeRef.current = 'walking'\r\n break\r\n default:\r\n break\r\n }\r\n }, [currentChosen, drivingCar, cyclingRegular, footWalking])\r\n\r\n /**\r\n * On drivingCar state change :\r\n * - if driving car data were retrieved and no course has been chosen, set currentChosen state to 'driving-car'\r\n */\r\n useEffect(() => {\r\n drivingCar && !currentChosen && setCurrentChosen('drivingCar')\r\n }, [drivingCar])\r\n\r\n /**\r\n * On call :\r\n * - call the openroute API to retrieve data for the current course\r\n * @param profile : string\r\n */\r\n const calculateForProfile = async (profile: string): Promise<void> => {\r\n const url = `${openRoute}/${profile}/geojson`\r\n const data = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n Authorization: openRouteAPIKey,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({ coordinates: coordinates })\r\n })\r\n .then((result) => {\r\n return result.json()\r\n })\r\n .catch(() => {\r\n return null\r\n })\r\n\r\n if (data && !data.error) {\r\n switch (profile) {\r\n case 'driving-car':\r\n setDrivingCar(data)\r\n break\r\n case 'cycling-regular':\r\n setCyclingRegular(data)\r\n break\r\n case 'foot-walking':\r\n setFootWalking(data)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n const handleClick = async (): Promise<void> => {\r\n if (travelModeRef?.current && coordinates.length === 2) {\r\n // Create an URL to Google Maps with coordinates and travelling mode\r\n const coordinatesInUrl = `origin=${coordinates[0][1]},${coordinates[0][0]}&destination=${coordinates[1][1]},${coordinates[1][0]}`\r\n const fullUrl = `${googleMapsAddress}${coordinatesInUrl}&travelmode=${travelModeRef.current}`\r\n\r\n if (isUsedOnBorne) {\r\n const url = await QRCode.toDataURL(fullUrl)\r\n setQrCodeUrl(url)\r\n } else {\r\n // If we are not on a borne, open a new tab in browser\r\n window.open(fullUrl, '_blank')\r\n }\r\n }\r\n }\r\n\r\n return drivingCar || cyclingRegular || footWalking ? (\r\n <div className='routes-container'>\r\n {/* Data per choice : Car / Cycle / Foot */}\r\n <div className='routes-data'>\r\n <RoutesItem\r\n summary={{\r\n type: 'drivingCar',\r\n distance: drivingCar?.features?.length\r\n ? drivingCar.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: drivingCar?.features?.length\r\n ? drivingCar.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'drivingCar'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n <RoutesItem\r\n summary={{\r\n type: 'cyclingRegular',\r\n distance: cyclingRegular?.features?.length\r\n ? cyclingRegular.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: cyclingRegular?.features?.length\r\n ? cyclingRegular.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'cyclingRegular'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n <RoutesItem\r\n summary={{\r\n type: 'footWalking',\r\n distance: footWalking?.features?.length\r\n ? footWalking.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: footWalking?.features?.length\r\n ? footWalking.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'footWalking'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n </div>\r\n\r\n {/* Redirection button */}\r\n <button className='route-button' onClick={handleClick}>\r\n <OpenLocationIcon className='route-icon-medium' />\r\n {capitalizeFirstLetter(\r\n translation[locale]?.route || translation['fr-FR'].route,\r\n locale\r\n )}\r\n </button>\r\n </div>\r\n ) : (\r\n <React.Fragment />\r\n )\r\n}\r\n\r\nexport default Routes\r\n","import React from 'react'\r\nimport { getDistanceAsString, getTimeAsString } from '../utils/routeUtils'\r\nimport * as Icons from './Icons'\r\n\r\ninterface Summary {\r\n type: string\r\n distance?: number\r\n duration?: number\r\n}\r\n\r\ninterface RoutesItemProps {\r\n summary: Summary\r\n chosen?: boolean\r\n color?: string\r\n onClick: (type: string) => void\r\n}\r\n\r\nconst RoutesItem = ({\r\n summary,\r\n chosen,\r\n color,\r\n onClick\r\n}: RoutesItemProps): JSX.Element => {\r\n return (\r\n <div\r\n className='route-item-container'\r\n onClick={(): void => onClick(summary.type)}>\r\n <div className='route-item'>\r\n <div className='route-item-icon'>\r\n {/* Colored circle + triangle atop */}\r\n <div\r\n className='route-item-icon-circle'\r\n style={{\r\n backgroundColor: chosen ? color : '#EFEDF0'\r\n }}\r\n />\r\n <div\r\n className={`route-item-icon-triangle ${\r\n summary.type === 'drivingCar'\r\n ? 'route-item-icon-triangle-car'\r\n : 'route-item-icon-triangle-other'\r\n }`}>\r\n <Icons.TriangleIcon\r\n className='route-icon-smallest'\r\n color={chosen ? color : 'transparent'}\r\n />\r\n </div>\r\n\r\n {summary.type === 'drivingCar' && (\r\n <Icons.DrivingCarIcon\r\n className='route-icon-medium route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n {summary.type === 'cyclingRegular' && (\r\n <Icons.CyclingRegularIcon\r\n className='route-icon route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n {summary.type === 'footWalking' && (\r\n <Icons.FootWalkingIcon\r\n className='route-icon route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n </div>\r\n <div className='route-item-text'>\r\n {/* Duration */}\r\n <div className='route-item-duration'>\r\n {getTimeAsString(summary?.duration)}\r\n </div>\r\n\r\n {/* Distance */}\r\n <div className='route-item-distance'>\r\n {getDistanceAsString(summary?.distance)}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default RoutesItem\r\n","const getTimeAsString = (time: number | undefined): string => {\r\n if (typeof time !== 'number') {\r\n return 'NC'\r\n }\r\n\r\n if (time < 1) return 'NC'\r\n if (time < 60) return `${time} s`\r\n if (time < 3600) return `${Math.ceil(time / 60)} min`\r\n if (time === 3600) return `1 h`\r\n if (time > 3600) {\r\n const hours = Math.floor(time / 3600)\r\n const minutes = Math.ceil((time - hours * 3600) / 60)\r\n return `${hours} h ${\r\n minutes === 60 ? 59 : minutes < 10 ? `0${minutes}` : minutes\r\n }`\r\n }\r\n\r\n return 'NC'\r\n}\r\n\r\nconst getDistanceAsString = (distance: number | undefined): string => {\r\n if (typeof distance !== 'number') {\r\n return 'NC'\r\n }\r\n\r\n if (distance <= 0) return '0 m'\r\n if (distance < 1) return `${distance * 100} cm`\r\n if (distance < 1000) return `${distance} m`\r\n if (distance >= 1000) return `${(Math.ceil(distance / 1000) * 10) / 10} km`\r\n\r\n return 'NC'\r\n}\r\n\r\nexport { getTimeAsString, getDistanceAsString }\r\n","import CyclingRegularIcon from './CyclingRegularIcon'\r\nimport DrivingCarIcon from './DrivingCarIcon'\r\nimport FootWalkingIcon from './FootWalkingIcon'\r\nimport OpenLocationIcon from './OpenLocationIcon'\r\nimport RoundIcon from './RoundIcon'\r\nimport TriangleIcon from './TriangleIcon'\r\n\r\nexport {\r\n CyclingRegularIcon,\r\n DrivingCarIcon,\r\n FootWalkingIcon,\r\n OpenLocationIcon,\r\n RoundIcon,\r\n TriangleIcon\r\n}\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst CyclingRegularIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <g transform='translate(0.5 -1.484)'>\r\n <path\r\n d='M20.5,6.789a2.645,2.645,0,1,0-2.645-2.645A2.653,2.653,0,0,0,20.5,6.789Zm-13.885,8.6a6.612,6.612,0,1,0,0,13.224,6.612,6.612,0,1,0,0-13.224Zm0,11.24a4.628,4.628,0,1,1,0-9.257,4.628,4.628,0,1,1,0,9.257ZM14.282,13.4l3.174-3.174,1.058,1.058a9.264,9.264,0,0,0,6.744,2.777V11.418A6.57,6.57,0,0,1,20.5,9.434L17.984,6.922a3.242,3.242,0,0,0-2.116-.793,2.219,2.219,0,0,0-1.851.793l-3.7,3.7a2.611,2.611,0,0,0-.793,1.851,2.219,2.219,0,0,0,.793,1.851l4.232,3.7v6.612h2.645v-8.2Zm10.843,1.984A6.612,6.612,0,1,0,31.737,22,6.548,6.548,0,0,0,25.125,15.385Zm0,11.24A4.628,4.628,0,1,1,29.753,22,4.685,4.685,0,0,1,25.125,26.625Z'\r\n transform='translate(0 0.484)'\r\n fill={color || '#fff'}\r\n />\r\n </g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport default CyclingRegularIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst DrivingCarIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <path\r\n id='car'\r\n d='M32.385,71.254H28.507L27.43,68.559A7.217,7.217,0,0,0,20.7,64H12.471a7.219,7.219,0,0,0-6.735,4.559L4.658,71.254H.781a.777.777,0,0,0-.754.966l.389,1.554a.777.777,0,0,0,.754.589h1.3a4.116,4.116,0,0,0-1.43,3.109V80.58A4.111,4.111,0,0,0,2.076,83.3v3.5a2.073,2.073,0,0,0,2.072,2.072H6.221A2.073,2.073,0,0,0,8.293,86.8V84.725h16.58V86.8a2.073,2.073,0,0,0,2.072,2.072h2.072A2.073,2.073,0,0,0,31.09,86.8V83.3a4.109,4.109,0,0,0,1.036-2.716V77.471A4.118,4.118,0,0,0,30.7,74.362H32a.777.777,0,0,0,.754-.589l.389-1.554a.778.778,0,0,0-.754-.966ZM9.584,70.1a3.109,3.109,0,0,1,2.887-1.954H20.7A3.109,3.109,0,0,1,23.582,70.1l1.291,3.227H8.293ZM6.221,80.567a2.066,2.066,0,1,1,0-4.132,3.987,3.987,0,0,1,3.109,3.1c0,1.24-1.865,1.033-3.109,1.033Zm20.725,0c-1.243,0-3.109.207-3.109-1.033a3.987,3.987,0,0,1,3.109-3.1,2.066,2.066,0,1,1,0,4.132Z'\r\n transform='translate(0.501 -63.5)'\r\n fill={color || '#fff'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default DrivingCarIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst FootWalkingIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='-6 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <path\r\n d='M11.4,5.249A2.625,2.625,0,1,0,8.772,2.625,2.625,2.625,0,0,0,11.4,5.249ZM16.564,13.4l-1.274-.645-.53-1.608A5.962,5.962,0,0,0,9.171,7c-1.968-.005-3.057.552-5.1,1.378A5.216,5.216,0,0,0,1.352,10.9l-.366.744a1.755,1.755,0,0,0,.776,2.346,1.726,1.726,0,0,0,2.324-.782l.366-.744a1.738,1.738,0,0,1,.9-.842l1.465-.591-.831,3.319A3.512,3.512,0,0,0,6.8,17.568l3.275,3.576a3.529,3.529,0,0,1,.815,1.515l1,4.008a1.75,1.75,0,0,0,3.4-.848l-1.214-4.866a3.5,3.5,0,0,0-.815-1.515l-2.488-2.718.94-3.756.3.9a3.487,3.487,0,0,0,1.733,2.023l1.274.645a1.726,1.726,0,0,0,2.324-.782,1.77,1.77,0,0,0-.782-2.351ZM4.048,21.1a3.393,3.393,0,0,1-.776,1.176L.538,25.01a1.75,1.75,0,1,0,2.472,2.477l3.248-3.248a3.554,3.554,0,0,0,.776-1.176l.738-1.848c-3.024-3.3-2.116-2.286-2.592-2.936L4.048,21.1Z'\r\n transform='translate(0.612 0.5)'\r\n fill={color || '#fff'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default FootWalkingIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst OpenLocationIcon = ({ className }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 29.771 29.771'\r\n className={className || 'route-icon-small'}>\r\n <path d='M29.771,0,0,14.886l11.164,3.721,3.721,11.164Z' />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default OpenLocationIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst RoundIcon = ({ color }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 20.306 20.306'\r\n style={{\r\n height: '1rem',\r\n marginTop: '0.2rem'\r\n }}>\r\n <g transform='translate(-2 -2)'>\r\n <path\r\n d='M21.306,12.153A9.153,9.153,0,1,1,12.153,3a9.153,9.153,0,0,1,9.153,9.153Z'\r\n transform='translate(0 0)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n <path\r\n d='M18,21.661V18'\r\n transform='translate(-5.847 -5.847)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n <path\r\n d='M18,12h0'\r\n transform='translate(-5.847 -3.508)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n </g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport default RoundIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst TriangleIcon = ({ className, color }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 16 12'\r\n className={className || 'route-icon-verysmall'}>\r\n <path\r\n d='M6.336,2.5a2,2,0,0,1,3.328,0l4.263,6.394A2,2,0,0,1,12.263,12H3.737A2,2,0,0,1,2.073,8.891Z'\r\n fill={color || 'transparent'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default TriangleIcon\r\n","import React from 'react'\r\n\r\ninterface QRCodeComponentProps {\r\n src: string\r\n alt?: string\r\n}\r\n\r\nconst QRCodeComponent = React.forwardRef<\r\n HTMLImageElement,\r\n QRCodeComponentProps\r\n>(({ src, alt }, ref) => {\r\n return (\r\n <img\r\n ref={ref}\r\n src={src}\r\n style={{\r\n height: '100%',\r\n maxHeight: '120px'\r\n }}\r\n alt={alt || 'QR Code'}\r\n />\r\n )\r\n})\r\n\r\nexport default QRCodeComponent\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport '../styles/components/Map.scss'\r\n\r\nconst CustomLoader = (): JSX.Element => {\r\n const [visible, setVisible] = useState<boolean>(false)\r\n const timerRef = useRef<NodeJS.Timeout | null>(null)\r\n\r\n useEffect(() => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n timerRef.current = setTimeout(() => {\r\n setVisible(true)\r\n }, 4000)\r\n\r\n return (): void => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <div className='loader-container'>\r\n <div className='loader' aria-hidden='true' />\r\n {visible ? (\r\n <div\r\n className='exit-loader'\r\n onClick={(): boolean =>\r\n document.dispatchEvent(new CustomEvent('retorikMapCloseLoader'))\r\n }>\r\n {`\\u2715`}\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default CustomLoader\r\n","import React, { useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { useLocaleStore } from '@davi-ai/retorik-framework'\r\n\r\nimport type { LatLngLiteral } from 'leaflet'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport type { CustomCategory } from '../models/Map'\r\n\r\nimport { POI } from '../models/POI'\r\nimport { getToken, useGetListPOIQuery } from '../services/tenantService'\r\nimport { setPoiList as slicePoiListSet } from '../features/poiSlice'\r\n\r\ninterface POILoaderProps {\r\n retorikName: string\r\n useDevTenant: boolean\r\n customCategories?: Array<CustomCategory>\r\n hospitalityCategories?: Array<string>\r\n}\r\n\r\nconst POILoader = ({\r\n retorikName,\r\n useDevTenant,\r\n customCategories,\r\n hospitalityCategories\r\n}: POILoaderProps): JSX.Element => {\r\n const locale = useLocaleStore((state) => state.locale)\r\n const currentUserLocation = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const [token, setToken] = useState<string | undefined>(undefined)\r\n const [poiList, setPoiList] = useState<POI[]>([])\r\n const dispatch = useDispatch()\r\n\r\n /**\r\n * Get token once to be used in all POI-retrieving queries\r\n */\r\n const callGetToken = async (): Promise<void> => {\r\n const t = await getToken()\r\n t && setToken(t)\r\n }\r\n\r\n useEffect(() => {\r\n callGetToken()\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (token && locale && currentUserLocation) {\r\n // Reset POI list on locale change\r\n setPoiList([])\r\n\r\n // Format user location into standard object with latitude and longitude\r\n const position = {\r\n latitude: 0,\r\n longitude: 0\r\n }\r\n if (\r\n Array.isArray(currentUserLocation) &&\r\n currentUserLocation.length > 1\r\n ) {\r\n position.latitude = currentUserLocation[0]\r\n position.longitude = currentUserLocation[1]\r\n } else {\r\n position.latitude = (currentUserLocation as LatLngLiteral).lat\r\n position.longitude = (currentUserLocation as LatLngLiteral).lng\r\n }\r\n\r\n useGetListPOIQuery({\r\n token: token,\r\n useDevTenant: useDevTenant,\r\n locale: locale.toLowerCase(),\r\n tenant: retorikName,\r\n ...position,\r\n customCategories: customCategories,\r\n hospitalityCategories: hospitalityCategories,\r\n callBack: setPoiList\r\n })\r\n }\r\n }, [token, locale, currentUserLocation])\r\n\r\n useEffect(() => {\r\n dispatch(slicePoiListSet({ poiList: poiList }))\r\n }, [poiList])\r\n\r\n return <></>\r\n}\r\n\r\nexport { POILoader }\r\n","import type { CustomCategory } from '../models/Map'\r\nimport { POI, Place, GenericPOI } from '../models/POI'\r\nimport {\r\n createGenericQuery,\r\n generateHospitalityPoiQuery\r\n} from '../utils/poiUtils'\r\nimport {\r\n defaultColor,\r\n hospitalityColors,\r\n RETORIK_URL,\r\n RETORIK_URL_DEV\r\n} from '../models/constants'\r\n\r\ninterface GetListPOI {\r\n token: string\r\n useDevTenant: boolean\r\n locale: string\r\n tenant: string\r\n latitude: number\r\n longitude: number\r\n customCategories?: Array<CustomCategory>\r\n hospitalityCategories?: Array<string>\r\n callBack: (poiArray: Array<POI>) => void\r\n}\r\n\r\nconst URL_TOKEN_API = 'https://auth.retorik.ai/oidc/token'\r\nconst API_CLIENT_ID = 'asklea'\r\nconst API_CLIENT_SERCRET = '388D45FA-B36B-4988-BA59-B187D329C207'\r\n\r\nexport const getToken = async (): Promise<any> => {\r\n const token = (\r\n await fetch(URL_TOKEN_API, {\r\n method: 'POST',\r\n body: `grant_type=client_credentials&scope=profile&client_id=${API_CLIENT_ID}&client_secret=${API_CLIENT_SERCRET}`,\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n })\r\n ).json()\r\n return token\r\n}\r\n\r\nconst getAddressFromPlaceData = (data: Place): string => {\r\n return `${data.streetAddress || ''} ${data.postalCode || ''} ${\r\n data.addressLocality || ''\r\n }`\r\n}\r\n\r\nexport const useGetListPOIQuery = async ({\r\n token,\r\n useDevTenant,\r\n locale,\r\n tenant,\r\n latitude,\r\n longitude,\r\n customCategories,\r\n hospitalityCategories,\r\n callBack\r\n}: GetListPOI): Promise<void> => {\r\n const urlPOIAPI = useDevTenant\r\n ? `${RETORIK_URL_DEV}/${tenant}/api/graphql`\r\n : `${RETORIK_URL}/${tenant}/api/graphql`\r\n\r\n if (tenant) {\r\n const commonData = {\r\n url: urlPOIAPI,\r\n token,\r\n locale,\r\n from: 0,\r\n size: undefined,\r\n latitude,\r\n longitude,\r\n callBack\r\n }\r\n // If categories are provided, load only these. Otherwise load all hospitality ones.\r\n if (customCategories?.length) {\r\n customCategories.forEach((category) =>\r\n fetchCustomPoiType({\r\n type: category.name,\r\n color: category.color || defaultColor,\r\n ...commonData\r\n })\r\n )\r\n }\r\n\r\n if (hospitalityCategories?.length) {\r\n hospitalityCategories.forEach((category) =>\r\n fetchHospitalityPoiType({ type: category, ...commonData })\r\n )\r\n }\r\n }\r\n}\r\n\r\nconst fetchHospitalityPoiType = async ({\r\n type,\r\n url,\r\n token,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude,\r\n callBack\r\n}): Promise<void> => {\r\n const processedSize = size || 100\r\n const result: POI[] = []\r\n const fetchedData = await fetch(url, {\r\n method: 'POST',\r\n body: generateHospitalityPoiQuery({\r\n type,\r\n locale,\r\n from,\r\n size: processedSize,\r\n latitude,\r\n longitude\r\n }),\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-type': 'application/graphql; charset=UTF-8'\r\n }\r\n })\r\n .then((response) => response.json())\r\n .catch((error) => console.warn(error))\r\n\r\n if (fetchedData?.data) {\r\n const dataKeys = Object.keys(fetchedData.data)\r\n if (dataKeys.length) {\r\n const data = fetchedData.data[dataKeys[0]]\r\n data?.length &&\r\n data.forEach((e: GenericPOI) => {\r\n e.place?.latitude &&\r\n e.place?.longitude &&\r\n result.push({\r\n name: e.displayText,\r\n type: type,\r\n location: { lat: e.place.latitude, lng: e.place.longitude },\r\n contentItemId: e.contentItemId,\r\n description: e.thing.description,\r\n imageURL: e.thing.image?.urls?.length\r\n ? e.thing.image.urls[0]\r\n : undefined,\r\n address: getAddressFromPlaceData(e.place),\r\n phone: e.place?.telephone,\r\n color: hospitalityColors[type]\r\n })\r\n })\r\n }\r\n }\r\n\r\n // If we get results, we call once again to retrieve some more results, until all of them were retrieved\r\n if (result.length) {\r\n callBack((current: Array<POI>) => [...current, ...result])\r\n fetchHospitalityPoiType({\r\n type,\r\n url,\r\n token,\r\n locale,\r\n from: from + processedSize,\r\n size: processedSize,\r\n latitude,\r\n longitude,\r\n callBack\r\n })\r\n }\r\n}\r\n\r\nconst fetchCustomPoiType = async ({\r\n type,\r\n color,\r\n url,\r\n token,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude,\r\n callBack\r\n}): Promise<void> => {\r\n console.log('token : ', token)\r\n const processedSize = size || 100\r\n const result: POI[] = []\r\n const fetchedData = await fetch(url, {\r\n method: 'POST',\r\n body: createGenericQuery({\r\n type,\r\n locale,\r\n from,\r\n size: processedSize,\r\n latitude,\r\n longitude\r\n }),\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-type': 'application/graphql; charset=UTF-8'\r\n }\r\n })\r\n .then((response) => response.json())\r\n .catch((error) => console.warn(error))\r\n\r\n const data = fetchedData?.data?.[`geoDistanceSorted${type}`]\r\n data &&\r\n data.forEach((e: GenericPOI) => {\r\n e.place?.latitude &&\r\n e.place?.longitude &&\r\n result.push({\r\n name: e.displayText,\r\n type: type,\r\n location: { lat: e.place.latitude, lng: e.place.longitude },\r\n contentItemId: e.contentItemId,\r\n description: e.thing.description,\r\n imageURL: e.thing.image?.urls?.length\r\n ? e.thing.image.urls[0]\r\n : undefined,\r\n address: getAddressFromPlaceData(e.place),\r\n phone: e.place?.telephone,\r\n color: color\r\n })\r\n })\r\n\r\n // If we get results, we call once again to retrieve some more results, until all of them were retrieved\r\n if (result.length) {\r\n callBack((current: Array<POI>) => [...current, ...result])\r\n fetchCustomPoiType({\r\n type,\r\n color,\r\n url,\r\n token,\r\n locale,\r\n from: from + processedSize,\r\n size: processedSize,\r\n latitude,\r\n longitude,\r\n callBack\r\n })\r\n }\r\n}\r\n","import { HospitalityPOIType } from '../models/POI'\r\nimport { gql } from 'graphql-request'\r\n\r\ninterface QueryParameters {\r\n from: number\r\n size: number\r\n locale: string\r\n latitude: number\r\n longitude: number\r\n}\r\n\r\nexport interface GeneratePOIQueryProps {\r\n type: string\r\n locale: string\r\n from: number\r\n size: number\r\n latitude: number\r\n longitude: number\r\n}\r\n\r\nconst place = `place {\r\n latitude\r\n longitude\r\n telephone\r\n streetAddress\r\n postalCode\r\n addressLocality\r\n}`\r\n\r\nconst thing = `thing {\r\n name\r\n alternateName\r\n categories\r\n description\r\n image {\r\n urls\r\n paths\r\n }\r\n url {\r\n text\r\n url\r\n }\r\n}`\r\n\r\nconst commonFields = `\r\n contentItemId\r\n displayText\r\n ${place}\r\n ${thing}\r\n`\r\n\r\nconst createGenericQuery = ({\r\n type,\r\n from,\r\n size,\r\n locale,\r\n latitude,\r\n longitude\r\n}: GeneratePOIQueryProps): string => {\r\n return gql`\r\n query GetData {\r\n geoDistanceSorted${type}(parameters: \"{ \\\\\"from\\\\\": ${from}, \\\\\"size\\\\\": ${size}, \\\\\"culture\\\\\": \\\\\"${locale}\\\\\", \\\\\"lat\\\\\": \\\\\"${latitude}\\\\\", \\\\\"lon\\\\\": \\\\\"${longitude}\\\\\" }\") {\r\n ${commonFields}\r\n }\r\n }\r\n `\r\n}\r\n\r\nconst generateHospitalityPoiQuery = ({\r\n type,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude\r\n}: GeneratePOIQueryProps): string => {\r\n const data: QueryParameters = {\r\n from,\r\n size,\r\n locale,\r\n latitude,\r\n longitude\r\n }\r\n\r\n switch (type) {\r\n case HospitalityPOIType.afaire:\r\n return createGenericQuery({ ...data, type: 'TouristAttraction' })\r\n case HospitalityPOIType.avoir:\r\n return createGenericQuery({ ...data, type: 'TouristDestination' })\r\n case HospitalityPOIType.hebergement:\r\n return createGenericQuery({ ...data, type: 'LodgingBusiness' })\r\n case HospitalityPOIType.produit:\r\n return createGenericQuery({ ...data, type: 'Product' })\r\n case HospitalityPOIType.restaurant:\r\n return createGenericQuery({ ...data, type: 'FoodEstablishment' })\r\n case HospitalityPOIType.service:\r\n return createGenericQuery({ ...data, type: 'Service' })\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport { createGenericQuery, generateHospitalityPoiQuery }\r\n","import { combineReducers, configureStore } from '@reduxjs/toolkit'\r\nimport type { PreloadedState } from '@reduxjs/toolkit'\r\nimport authReducer from '../features/authSlice'\r\nimport poiReducer from '../features/poiSlice'\r\nimport mapReducer from '../features/mapSlice'\r\nimport tenantReducer from '../features/tenantSlice'\r\nimport botReducer from '../features/botSlice'\r\nimport type { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore'\r\n\r\nconst rootReducer = combineReducers({\r\n auth: authReducer,\r\n poi: poiReducer,\r\n map: mapReducer,\r\n tenant: tenantReducer,\r\n bot: botReducer\r\n})\r\n\r\nexport const setupStore = (\r\n preloadedState?: PreloadedState<RootState>\r\n): ToolkitStore => {\r\n return configureStore({\r\n reducer: rootReducer,\r\n middleware: (getDefaultMiddleware) =>\r\n // adding the api middleware enables caching, invalidation, polling and other features of `rtk-query`\r\n getDefaultMiddleware({\r\n serializableCheck: false\r\n }),\r\n preloadedState\r\n })\r\n}\r\n\r\nexport type RootState = ReturnType<typeof rootReducer>\r\nexport type AppStore = ReturnType<typeof setupStore>\r\nexport type AppDispatch = AppStore['dispatch']\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\n\r\ntype AuthState = {\r\n token: string | null\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'auth',\r\n initialState: { token: null } as AuthState,\r\n reducers: {\r\n setCredentials: (\r\n state,\r\n { payload: { token } }: PayloadAction<{ token: string }>\r\n ): void => {\r\n state.token = token\r\n }\r\n }\r\n})\r\n\r\nexport const { setCredentials } = slice.actions\r\n\r\nexport default slice.reducer\r\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["src/index_module.tsx","src/components/BotPOIExtensionDisplay.tsx","src/components/Icons/MapIcon.tsx","src/features/poiSlice.ts","src/features/mapSlice.ts","src/translations/labels.ts","src/components/Map.tsx","src/styles/icons/dataUrlIcons.ts","src/features/tenantSlice.ts","src/features/botSlice.ts","src/utils/botUtils.ts","src/models/constants.ts","src/translations/map.json","src/components/MapFilter.tsx","src/models/POI.ts","src/translations/mapFilter.json","src/components/MapFilterItem.tsx","src/components/LocationMarker.tsx","src/utils/MarkerIcons.ts","src/components/POIDetail.tsx","src/utils/globalUtils.ts","src/translations/poi.json","src/components/Routes.tsx","src/components/RoutesItem.tsx","src/utils/routeUtils.ts","src/components/Icons/index.ts","src/components/Icons/CyclingRegularIcon.tsx","src/components/Icons/DrivingCarIcon.tsx","src/components/Icons/FootWalkingIcon.tsx","src/components/Icons/OpenLocationIcon.tsx","src/components/Icons/RoundIcon.tsx","src/components/Icons/TriangleIcon.tsx","src/components/QRCodeComponent.tsx","src/components/CustomLoader.tsx","src/components/POILoader.tsx","src/services/tenantService.ts","src/utils/poiUtils.ts","src/stores/globalStore.ts","src/features/authSlice.ts"],"sourcesContent":["import React, { useMemo } from 'react'\r\nimport { Provider } from 'react-redux'\r\nimport L from 'leaflet'\r\nimport type { LatLngExpression } from 'leaflet'\r\nimport { BotPOIExtensionDisplay } from './components/BotPOIExtensionDisplay'\r\nimport type { Tenant } from './models/Tenant'\r\nimport { MapDisplay } from './components/Map'\r\nimport { POILoader } from './components/POILoader'\r\nimport { setupStore } from './stores/globalStore'\r\nimport { hospitalityImages } from './styles/icons/dataUrlIcons'\r\n\r\nimport {\r\n iconRestaurant,\r\n iconAFaire,\r\n iconHebergement,\r\n iconAVoir,\r\n iconProduit,\r\n iconService,\r\n createGenericIcon\r\n} from './utils/MarkerIcons'\r\n\r\nimport './styles/module.scss'\r\nimport type { MapLabel, MapSettings } from './models/Map'\r\nimport { HospitalityPOIType as POIType } from './models/POI'\r\nimport { defaultColor } from './models/constants'\r\n\r\n/**\r\n * Interactive map's props\r\n * @param {string | undefined} activeTenant the key of the active tenant defined in tenantList\r\n * @param {boolean | undefined} isDevTenant using a dev tenant ?\r\n * @param {Record<string, Tenant>} tenantList list of the tenants with their data that can be used in this instance of interactive map\r\n * @param {LatLngExpression | undefined} userLocation position of the user\r\n * @param {LatLngExpression | undefined} mapCenter position of the center of the map\r\n * @param {number | undefined} limitAroundCenter limit the map around the center, default 200km. Min zoom will be set depending on this number with 3 breakpoints : 0->199 / 200->599 / 599->?\r\n * @param {MapSettings | undefined} settings categogy settings\r\n */\r\ninterface MapProps {\r\n activeTenant?: string\r\n isDevTenant?: boolean\r\n tenantList: Record<string, Tenant>\r\n userLocation?: LatLngExpression\r\n mapCenter?: LatLngExpression\r\n limitAroundCenter?: number\r\n settings?: MapSettings\r\n}\r\n\r\nconst defaultHospitalityIcons: { [name: string]: L.Icon } = {\r\n restaurant: iconRestaurant,\r\n afaire: iconAFaire,\r\n avoir: iconAVoir,\r\n hebergement: iconHebergement,\r\n produit: iconProduit,\r\n service: iconService\r\n}\r\n\r\nconst store = setupStore()\r\nconst Map = ({\r\n activeTenant,\r\n isDevTenant,\r\n tenantList,\r\n userLocation,\r\n mapCenter,\r\n limitAroundCenter,\r\n settings\r\n}: MapProps): JSX.Element => {\r\n const hospitalityCategories = useMemo<Array<string>>(() => {\r\n if (settings?.categories) {\r\n if (settings?.hospitalityCategories) {\r\n return Object.keys(settings.hospitalityCategories).filter(\r\n (key) => settings.hospitalityCategories?.[key]?.display\r\n )\r\n }\r\n } else if (settings?.hospitalityCategories) {\r\n return Object.keys(settings.hospitalityCategories).filter(\r\n (key) => settings.hospitalityCategories?.[key]?.display\r\n )\r\n } else if (settings?.showFilter) {\r\n return settings.showFilter\r\n }\r\n\r\n // By default return all hospitality categories\r\n return Object.keys(POIType)\r\n }, [settings])\r\n\r\n const leafletIcons = useMemo<{ [type: string]: L.Icon }>(() => {\r\n const tempIcons = { ...defaultHospitalityIcons }\r\n\r\n // Create pin icons for categories\r\n if (settings?.categories) {\r\n settings.categories.forEach((category) => {\r\n const icon = createGenericIcon(\r\n category.color || defaultColor,\r\n category.filter?.iconUrl\r\n )\r\n tempIcons[category.name] = icon\r\n })\r\n }\r\n\r\n // Modify pin icons for hospitality categories that have their default color changed\r\n if (settings?.hospitalityCategories) {\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display && values.color) {\r\n const icon = createGenericIcon(\r\n values.color,\r\n hospitalityImages[type]\r\n )\r\n tempIcons[type] = icon\r\n }\r\n }\r\n )\r\n }\r\n\r\n return tempIcons\r\n }, [settings])\r\n\r\n return (\r\n <React.Fragment>\r\n {activeTenant && (\r\n <Provider store={store}>\r\n <MapDisplay\r\n activeTenant={activeTenant}\r\n isDevTenant={isDevTenant}\r\n tenantList={tenantList}\r\n userLocation={userLocation}\r\n mapCenter={mapCenter}\r\n limitAroundCenter={limitAroundCenter}\r\n settings={settings}\r\n icons={leafletIcons}\r\n />\r\n <POILoader\r\n retorikName={tenantList[activeTenant].retorikName}\r\n useDevTenant={!!isDevTenant}\r\n customCategories={settings?.categories}\r\n hospitalityCategories={hospitalityCategories}\r\n />\r\n <BotPOIExtensionDisplay />\r\n </Provider>\r\n )}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport { MapIcon } from './components/Icons/MapIcon'\r\nexport { Map, POIType }\r\nexport { labels } from './translations/labels'\r\nexport type { MapSettings, MapLabel }\r\nexport type { Tenant } from './models/Tenant'\r\n","import React, { useEffect } from 'react'\r\nimport {\r\n CurrentSubView,\r\n RetorikEvent,\r\n setCurrentCustomView,\r\n useCurrentSubView,\r\n useRetorikEvent\r\n} from '@davi-ai/retorik-framework'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport '../styles/components/BotPOIExtensionDisplay.scss'\r\nimport { MapIcon } from '../components/Icons/MapIcon'\r\nimport {\r\n setDetailOpennedByMap,\r\n setDisplayPOIFinished\r\n} from '../features/poiSlice'\r\nimport { toggleLoader } from '../features/mapSlice'\r\nimport { labels } from '../translations/labels'\r\n\r\nconst BotPOIExtensionDisplay = (): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const retorikEvent = useRetorikEvent()\r\n const currentSubView = useCurrentSubView()\r\n const displayPOIFinished = useSelector(\r\n (state: RootState) => state.poi.displayPOIFinished\r\n )\r\n const detailOpennedByMap = useSelector(\r\n (state: RootState) => state.poi.detailOpennedByMap\r\n )\r\n\r\n useEffect(() => {\r\n if (\r\n retorikEvent &&\r\n retorikEvent === RetorikEvent.DetailViewClose &&\r\n currentSubView === CurrentSubView.none &&\r\n displayPOIFinished\r\n ) {\r\n // Check if POI detail was opened by MAP\r\n if (detailOpennedByMap) {\r\n console.log('Retorik Map > Re-open map')\r\n // Re-Open Map\r\n setCurrentCustomView({\r\n customDisplay: 'mapDisplay',\r\n label: labels,\r\n icon: <MapIcon />,\r\n indice: 1\r\n })\r\n // Reset state\r\n dispatch(setDetailOpennedByMap({ detailOpennedByMap: false }))\r\n dispatch(setDisplayPOIFinished({ displayPOIFinished: false }))\r\n }\r\n } else if (retorikEvent && retorikEvent === RetorikEvent.DetailViewOpen) {\r\n dispatch(\r\n setDisplayPOIFinished({\r\n displayPOIFinished: true\r\n })\r\n )\r\n dispatch(\r\n toggleLoader({\r\n loading: false\r\n })\r\n )\r\n }\r\n }, [retorikEvent])\r\n\r\n return <></>\r\n}\r\n\r\nexport { BotPOIExtensionDisplay }\r\n","import React from 'react'\r\n\r\nconst MapIcon = (): JSX.Element => {\r\n return (\r\n <svg\r\n version='1.1'\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n width: '100%',\r\n height: '100%'\r\n }}\r\n viewBox='0 0 512 512'\r\n xmlSpace='preserve'>\r\n <g fill='#1999B1'>\r\n <g>\r\n <path\r\n d='M256,93.297c-14.021,0-27.516,4.218-39.025,12.198c-3.402,2.359-4.262,7.05-1.921,10.478\r\n c2.342,3.428,6.998,4.294,10.4,1.936c9.004-6.243,19.566-9.543,30.546-9.543c29.754,0,53.96,24.388,53.96,54.365\r\n c0,29.977-24.206,54.366-53.96,54.366c-29.754,0-53.96-24.389-53.96-54.366c0-8.843,2.038-17.273,6.057-25.055\r\n c1.906-3.692,0.482-8.241-3.182-10.161c-3.665-1.919-8.178-0.486-10.085,3.206c-5.067,9.812-7.746,20.881-7.746,32.01\r\n C187.085,201.018,218,232.166,256,232.166s68.915-31.148,68.915-69.435C324.915,124.445,294,93.297,256,93.297z'\r\n />\r\n </g>\r\n </g>\r\n <g fill='#1999B1'>\r\n <g>\r\n <path\r\n d='M511.426,501.571l-73.804-178.665c-1.16-2.809-3.883-4.639-6.903-4.639h-73.547\r\n c14.305-19.498,26.212-38.919,35.511-57.988c16.48-33.794,24.835-66.613,24.835-97.547C417.517,73.001,345.061,0,256,0\r\n S94.483,73.001,94.483,162.731c0,30.934,8.355,63.754,24.835,97.547c9.298,19.069,21.205,38.491,35.511,57.988H81.282\r\n c-3.02,0-5.744,1.831-6.903,4.639L24.087,444.651c-1.587,3.842,0.217,8.252,4.03,9.85c0.94,0.394,1.912,0.581,2.87,0.581\r\n c2.93,0,5.711-1.746,6.906-4.641l7.176-17.372h50.906l-26.38,63.862H18.69l7.647-18.513c1.587-3.842-0.217-8.252-4.03-9.85\r\n c-3.815-1.601-8.191,0.219-9.777,4.06L0.575,501.571c-0.961,2.325-0.705,4.981,0.683,7.075c1.386,2.095,3.72,3.354,6.22,3.354\r\n h497.044c2.499,0,4.834-1.259,6.221-3.354C512.13,506.552,512.387,503.896,511.426,501.571z M109.439,162.731\r\n c0-81.422,65.747-147.663,146.561-147.663S402.561,81.31,402.561,162.731c0,34.143-11.775,88.703-66.245,158.231\r\n c-0.055,0.065-0.104,0.134-0.156,0.201c-2.782,3.547-5.672,7.132-8.681,10.757c-29.932,36.062-60.222,62.395-71.48,71.751\r\n c-11.225-9.324-41.372-35.525-71.283-71.518c-3.084-3.711-6.042-7.38-8.889-11.01c-0.046-0.058-0.089-0.118-0.137-0.175\r\n C121.222,251.445,109.439,196.887,109.439,162.731z M86.269,333.335h50.907l-18.568,44.948H67.702L86.269,333.335z\r\n M129.997,496.932l46.741-113.148l133.014,113.148H129.997z M332.935,496.932L332.935,496.932l-154.352-131.3\r\n c-1.822-1.551-4.27-2.132-6.584-1.566c-2.316,0.565-4.228,2.21-5.143,4.427l-53.057,128.438H85.795l28.296-68.502\r\n c0.961-2.325,0.705-4.98-0.683-7.075c-1.386-2.095-3.721-3.354-6.221-3.354H51.296l10.182-24.65h62.118\r\n c3.02,0,5.744-1.831,6.903-4.639l22.876-55.377h12.978c2.253,2.83,4.543,5.661,6.894,8.491\r\n c38.585,46.43,76.578,76.239,78.177,77.486c1.348,1.051,2.962,1.575,4.576,1.575s3.229-0.525,4.576-1.575\r\n c0.879-0.685,12.757-10.009,29.673-25.96h84.681c4.13,0,7.478-3.373,7.478-7.534s-3.348-7.534-7.478-7.534h-69.269\r\n c10.368-10.503,21.7-22.749,33.093-36.457c2.351-2.83,4.642-5.66,6.894-8.491h80.083l18.567,44.948h-39.457\r\n c-4.13,0-7.478,3.373-7.478,7.534s3.347,7.534,7.478,7.534h45.681l10.182,24.65h-154.07c-3.121,0-5.913,1.952-7.006,4.898\r\n c-1.091,2.946-0.253,6.265,2.104,8.326l75.133,65.707H332.935z M399.681,496.932l-73.024-63.862H466.93l26.381,63.862H399.681z'\r\n />\r\n </g>\r\n </g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n <g></g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport { MapIcon }\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { POI } from '../models/POI'\r\n\r\ntype poiState = {\r\n poiList: POI[]\r\n detailOpennedByMap: boolean\r\n displayPOIFinished: boolean\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'poi',\r\n initialState: {\r\n poiList: [],\r\n detailOpennedByMap: false,\r\n displayPOIFinished: false\r\n } as poiState,\r\n reducers: {\r\n setPoiList: (\r\n state,\r\n { payload: { poiList } }: PayloadAction<{ poiList: POI[] }>\r\n ): void => {\r\n state.poiList = poiList\r\n },\r\n setDetailOpennedByMap: (\r\n state,\r\n {\r\n payload: { detailOpennedByMap }\r\n }: PayloadAction<{ detailOpennedByMap: boolean }>\r\n ): void => {\r\n state.detailOpennedByMap = detailOpennedByMap\r\n },\r\n setDisplayPOIFinished: (\r\n state,\r\n {\r\n payload: { displayPOIFinished }\r\n }: PayloadAction<{ displayPOIFinished: boolean }>\r\n ): void => {\r\n state.displayPOIFinished = displayPOIFinished\r\n }\r\n }\r\n})\r\n\r\nexport const { setPoiList, setDetailOpennedByMap, setDisplayPOIFinished } =\r\n slice.actions\r\n\r\nexport default slice.reducer\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { MapState } from '../models/Map'\r\nimport { LatLngExpression } from 'leaflet'\r\n\r\ntype mapState = {\r\n showFilters: boolean\r\n selectedFilters: string[]\r\n loading: boolean\r\n mapState: MapState | undefined\r\n currentUserLocation: LatLngExpression | undefined\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'map',\r\n initialState: {\r\n showFilters: false,\r\n loading: false,\r\n selectedFilters: [],\r\n mapState: undefined,\r\n currentUserLocation: undefined\r\n } as mapState,\r\n reducers: {\r\n toggleFilters: (\r\n state,\r\n { payload: { showFilters } }: PayloadAction<{ showFilters: boolean }>\r\n ): void => {\r\n state.showFilters = showFilters\r\n },\r\n updateFilters: (\r\n state,\r\n {\r\n payload: { selectedFilters }\r\n }: PayloadAction<{ selectedFilters: string[] }>\r\n ): void => {\r\n state.selectedFilters = selectedFilters\r\n },\r\n toggleLoader: (\r\n state,\r\n { payload: { loading } }: PayloadAction<{ loading: boolean }>\r\n ): void => {\r\n state.loading = loading\r\n },\r\n updateMapState: (\r\n state,\r\n { payload: { mapState } }: PayloadAction<{ mapState: MapState }>\r\n ): void => {\r\n state.mapState = mapState\r\n },\r\n updateUserLocation: (\r\n state,\r\n {\r\n payload: { currentUserLocation }\r\n }: PayloadAction<{ currentUserLocation: LatLngExpression | undefined }>\r\n ): void => {\r\n state.currentUserLocation = currentUserLocation\r\n }\r\n }\r\n})\r\n\r\nexport const {\r\n toggleFilters,\r\n toggleLoader,\r\n updateFilters,\r\n updateMapState,\r\n updateUserLocation\r\n} = slice.actions\r\n\r\nexport default slice.reducer\r\n","export const labels = {\r\n 'ar-EG': 'خريطة تفاعلية',\r\n 'ar-SA': 'خريطة تفاعلية',\r\n 'ca-ES': 'Carta interactiva',\r\n 'cs-CZ': 'Interaktivní mapa',\r\n 'da-DK': 'Interaktiv karte',\r\n 'de-AT': 'Interaktive Karte',\r\n 'de-CH': 'Interaktive Karte',\r\n 'de-DE': 'Interaktive Karte',\r\n 'en-CA': 'Interactive Map',\r\n 'en-GB': 'Interactive Map',\r\n 'en-HK': 'Interactive Map',\r\n 'en-IE': 'Interactive Map',\r\n 'en-IN': 'Interactive Map',\r\n 'en-US': 'Interactive Map',\r\n 'es-ES': 'Mapa interactivo',\r\n 'es-MX': 'Mapa interactivo',\r\n 'fi-FI': 'Interaktiivinen kartta',\r\n 'fr-BE': 'Carte interactive',\r\n 'fr-CA': 'Carte interactive',\r\n 'fr-CH': 'Carte interactive',\r\n 'fr-FR': 'Carte interactive',\r\n 'hi-IN': 'सक्रिय चार्ट',\r\n 'hu-HU': 'Interaktív térkép',\r\n 'id-ID': 'Peta Interaktif',\r\n 'it-IT': 'Mappa interattiva',\r\n 'ja-JP': 'インタラクティブマップ',\r\n 'ko-KR': '인터랙티브 맵',\r\n 'nb-NO': 'Interaktiv kart',\r\n 'nl-BE': 'Interactieve kaart',\r\n 'nl-NL': 'Interactieve kaart',\r\n 'pl-PL': 'Mapa interaktywna',\r\n 'pt-BR': 'Mapa interativo',\r\n 'pt-PT': 'Mapa interativo',\r\n 'ru-RU': 'Интерактивная карта',\r\n 'sv-SE': 'Interaktiv karta',\r\n 'th-TH': 'แผนที่อินเตอร์แอคทีฟ',\r\n 'tr-TR': 'İnteraktif harita',\r\n 'zh-CN': '交互式地图',\r\n 'zh-HK': '交互式地图',\r\n 'zh-TW': '交互式地圖'\r\n}\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport {\r\n CurrentSubView,\r\n RetorikEvent,\r\n setModalFullscreenContent,\r\n useLocale,\r\n useRetorikEvent,\r\n useCurrentSubView\r\n} from '@davi-ai/retorik-framework'\r\n\r\nimport Leaflet, { LatLngBounds, LatLngExpression, MarkerCluster } from 'leaflet'\r\nimport type { GeoJSON as GeoJSONType } from 'leaflet'\r\nimport 'leaflet.markercluster'\r\nimport 'leaflet.markercluster.freezable'\r\nimport 'leaflet/dist/leaflet.css'\r\nimport {\r\n MapContainer,\r\n TileLayer,\r\n Marker,\r\n ZoomControl,\r\n GeoJSON\r\n} from 'react-leaflet'\r\nimport MarkerClusterGroup from 'react-leaflet-cluster/lib/index'\r\n\r\nimport type { FeatureCollection } from 'geojson'\r\n\r\nimport '../styles/components/Map.scss'\r\nimport {\r\n markerIcon,\r\n markerIconLarge,\r\n markerShadow,\r\n target\r\n} from '../styles/icons/dataUrlIcons'\r\n\r\nimport type { POI } from '../models/POI'\r\nimport type { RootState } from '../stores/globalStore'\r\n\r\nimport {\r\n updateMapState,\r\n updateUserLocation,\r\n toggleLoader\r\n} from '../features/mapSlice'\r\nimport { setActiveTenant, setTenantList } from '../features/tenantSlice'\r\nimport { setCSSInjected } from '../features/botSlice'\r\n\r\nimport type { MapSettings, MapState } from '../models/Map'\r\nimport type { Tenant } from '../models/Tenant'\r\nimport { injectShadowCSS } from '../utils/botUtils'\r\nimport { RETORIK_URL, RETORIK_URL_DEV } from '../models/constants'\r\n\r\nimport translation from '../translations/map.json'\r\n\r\nimport { MapFilter } from './MapFilter'\r\nimport { LocationMarker } from './LocationMarker'\r\nimport { POIDetail } from './POIDetail'\r\nimport CustomLoader from './CustomLoader'\r\n\r\nLeaflet.Icon.Default.imagePath = '../node_modules/leaflet'\r\n\r\nLeaflet.Icon.Default.mergeOptions({\r\n iconRetinaUrl: markerIconLarge,\r\n iconUrl: markerIcon,\r\n shadowUrl: markerShadow\r\n})\r\n\r\ninterface MapProps {\r\n activeTenant?: string\r\n isDevTenant?: boolean\r\n tenantList: { [key: string]: Tenant }\r\n userLocation?: LatLngExpression\r\n mapCenter?: LatLngExpression\r\n limitAroundCenter?: number\r\n settings?: MapSettings\r\n icons: { [key: string]: Leaflet.Icon }\r\n}\r\n\r\nconst defaultMapCenter: LatLngExpression = [46.912815, 3.301331]\r\nconst defaultDistanceAround = 200\r\n\r\nconst MapDisplay = ({\r\n activeTenant,\r\n isDevTenant,\r\n tenantList,\r\n userLocation,\r\n mapCenter,\r\n limitAroundCenter,\r\n settings,\r\n icons\r\n}: MapProps): JSX.Element => {\r\n const pois = useSelector((state: RootState) => state.poi.poiList)\r\n const dispatch = useDispatch()\r\n const locale = useLocale()\r\n const retorikEvent = useRetorikEvent()\r\n const currentSubView = useCurrentSubView()\r\n const botCSSInjected: boolean = useSelector(\r\n (state: RootState) => state.bot.CSSInjected\r\n )\r\n const currentUserPos = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const selectedFilters = useSelector(\r\n (state: RootState) => state.map.selectedFilters\r\n )\r\n const mapState = useSelector((state: RootState) => state.map.mapState)\r\n const activeTenantFromStore = useSelector(\r\n (state: RootState) => state.tenant.activeTenant\r\n )\r\n const tenantListFromStore = useSelector(\r\n (state: RootState) => state.tenant.tenantList\r\n )\r\n const loading = useSelector((state: RootState) => state.map.loading)\r\n\r\n const [aroundMeDistance, setAroundMeDistance] = useState<number>(15000)\r\n const [mapLayerData, setMapLayerData] = useState<\r\n FeatureCollection | undefined\r\n >(undefined)\r\n const geoJsonLayer = useRef<GeoJSONType | null>(null)\r\n const markersRef = useRef<Array<{ marker: Leaflet.Marker<any>; id: string }>>(\r\n []\r\n )\r\n const mapRef = useRef<Leaflet.Map | null>(null)\r\n const [selectedPOI, setSelectedPOI] = useState<POI | undefined>()\r\n\r\n const calculateBounds = (): LatLngBounds | undefined => {\r\n const center = mapCenter || userLocation || defaultMapCenter\r\n const latitude = Array.isArray(center) ? center[0] : center.lat\r\n const longitude = Array.isArray(center) ? center[1] : center.lng\r\n\r\n if (latitude && longitude) {\r\n // Latitude / longitude : about 111 km per degree => about 0.009 degree per kilometer\r\n const distanceInDegrees =\r\n (limitAroundCenter || defaultDistanceAround) * 0.009\r\n\r\n return new Leaflet.LatLngBounds(\r\n [latitude - distanceInDegrees, longitude - distanceInDegrees],\r\n [latitude + distanceInDegrees, longitude + distanceInDegrees]\r\n )\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n const [maxBounds] = useState<LatLngBounds | undefined>(calculateBounds())\r\n\r\n const poisToDisplay = useMemo<Array<POI>>(() => {\r\n if (pois && Array.isArray(pois) && pois.length && selectedFilters) {\r\n return pois?.filter((p: POI) => selectedFilters.some((f) => f === p.type))\r\n }\r\n\r\n return []\r\n }, [pois, selectedFilters])\r\n\r\n const closeLoader = (): void => {\r\n dispatch(toggleLoader({ loading: false }))\r\n }\r\n\r\n useEffect(() => {\r\n activeTenant && dispatch(setActiveTenant({ activeTenant: activeTenant }))\r\n }, [activeTenant])\r\n\r\n useEffect(() => {\r\n tenantList && dispatch(setTenantList({ tenantList: tenantList }))\r\n }, [tenantList])\r\n\r\n useEffect(() => {\r\n userLocation &&\r\n dispatch(updateUserLocation({ currentUserLocation: userLocation }))\r\n }, [userLocation])\r\n\r\n useEffect(() => {\r\n // Clear and add layer data to display the relevant route on the map\r\n if (geoJsonLayer.current) {\r\n mapLayerData && geoJsonLayer.current.clearLayers().addData(mapLayerData)\r\n }\r\n }, [mapLayerData])\r\n\r\n useEffect(() => {\r\n // Handle old state\r\n window.setTimeout(function () {\r\n mapRef.current?.whenReady(() => {\r\n console.log('Retorik Map > Map ready')\r\n mapRef.current?.invalidateSize()\r\n })\r\n\r\n if (mapState?.location && mapState.zoom) {\r\n if (mapRef.current) {\r\n mapRef.current.setView(mapState.location, mapState.zoom)\r\n mapRef.current.invalidateSize()\r\n }\r\n } else {\r\n // first time display map\r\n aroundMe()\r\n }\r\n }, 250)\r\n\r\n // Inject CSS to shadow if not already done\r\n if (!botCSSInjected) {\r\n injectShadowCSS()\r\n dispatch(setCSSInjected({ CSSInjected: true }))\r\n }\r\n\r\n if (!userLocation) {\r\n navigator.geolocation.getCurrentPosition(\r\n (res) => {\r\n if (res) {\r\n if (mapRef.current) {\r\n const center: LatLngExpression = {\r\n lat: res.coords.latitude,\r\n lng: res.coords.longitude\r\n }\r\n if (center !== currentUserPos)\r\n dispatch(updateUserLocation({ currentUserLocation: center }))\r\n }\r\n }\r\n },\r\n (error) => {\r\n console.warn(error)\r\n }\r\n )\r\n }\r\n\r\n document.addEventListener('retorikMapCloseLoader', closeLoader)\r\n\r\n return (): void => {\r\n console.log('Retorik Map > Destroy map component')\r\n // save map state\r\n if (markersRef.current && botCSSInjected) {\r\n const saveMapState: MapState = {\r\n zoom: mapRef.current?.getZoom(),\r\n location: mapRef.current?.getCenter()\r\n }\r\n\r\n dispatch(\r\n updateMapState({\r\n mapState: saveMapState\r\n })\r\n )\r\n }\r\n setSelectedPOI(undefined)\r\n dispatch(setCSSInjected({ CSSInjected: false }))\r\n\r\n document.removeEventListener('retorikMapCloseLoader', closeLoader)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (\r\n retorikEvent === RetorikEvent.DetailViewOpen &&\r\n currentSubView === CurrentSubView.custom\r\n ) {\r\n if (mapState && mapState.location && mapState.zoom) {\r\n if (mapRef.current) {\r\n window.setTimeout(function () {\r\n if (\r\n mapRef.current &&\r\n mapState &&\r\n mapState.location &&\r\n mapState.zoom\r\n ) {\r\n mapRef.current.setView(mapState.location, mapState.zoom)\r\n mapRef.current.whenReady(() => {\r\n console.log('Retorik Map > Map ready')\r\n if (mapRef && mapRef.current) mapRef.current.invalidateSize()\r\n })\r\n }\r\n }, 250)\r\n }\r\n }\r\n if (mapRef.current) {\r\n mapRef.current.invalidateSize()\r\n }\r\n }\r\n\r\n if (\r\n retorikEvent === RetorikEvent.DetailViewClose &&\r\n currentSubView === CurrentSubView.none\r\n ) {\r\n if (markersRef.current) {\r\n const saveMapState: MapState = {\r\n zoom: mapRef.current?.getZoom(),\r\n location: mapRef.current?.getCenter()\r\n }\r\n\r\n if (\r\n saveMapState.zoom !== undefined &&\r\n saveMapState.location !== undefined\r\n )\r\n dispatch(\r\n updateMapState({\r\n mapState: saveMapState\r\n })\r\n )\r\n }\r\n }\r\n }, [retorikEvent])\r\n\r\n useEffect(() => {\r\n const aroundMeDistance: number | undefined =\r\n tenantListFromStore[activeTenantFromStore]?.aroundMeDistance\r\n if (aroundMeDistance) {\r\n setAroundMeDistance(aroundMeDistance)\r\n }\r\n }, [tenantListFromStore, activeTenantFromStore])\r\n\r\n useEffect(() => {\r\n // Remove Marker HighLight\r\n markersRef.current.forEach((m) => {\r\n if (m && m.marker) {\r\n const element = m.marker.getElement()\r\n if (element) {\r\n element.classList.remove('markerSelected')\r\n }\r\n }\r\n })\r\n\r\n if (selectedPOI) {\r\n const selectedMarker = markersRef.current.find(\r\n (m) => m.id === selectedPOI.contentItemId\r\n )\r\n\r\n if (selectedMarker) {\r\n const element = selectedMarker.marker.getElement()\r\n // Highlight marker\r\n if (element) {\r\n element.classList.add('markerSelected')\r\n }\r\n }\r\n } else {\r\n // Remove route data on map\r\n setMapLayerData(undefined)\r\n }\r\n }, [selectedPOI])\r\n\r\n useEffect(() => {\r\n // remove Marker HighLight\r\n if (mapRef.current) {\r\n mapRef.current.removeEventListener('click')\r\n mapRef.current.addEventListener('click', () => {\r\n markersRef.current.forEach((m) => {\r\n if (m && m.marker) {\r\n const element = m.marker.getElement()\r\n if (element) {\r\n element.classList.remove('markerSelected')\r\n }\r\n setSelectedPOI(undefined)\r\n }\r\n })\r\n })\r\n }\r\n }, [mapRef.current])\r\n\r\n const markerClickHandler = (\r\n _e: Leaflet.LeafletMouseEvent,\r\n poi: POI\r\n ): void => {\r\n setSelectedPOI(poi)\r\n }\r\n\r\n const closePoi = (): void => {\r\n setSelectedPOI(undefined)\r\n }\r\n\r\n const aroundMe = (): void => {\r\n if (userLocation && tenantList && activeTenant) {\r\n handlerAroundMe(userLocation as Leaflet.LatLngLiteral)\r\n return\r\n }\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n (res) => {\r\n if (res) {\r\n const center: LatLngExpression = {\r\n lat: res.coords.latitude,\r\n lng: res.coords.longitude\r\n }\r\n if (\r\n tenantListFromStore &&\r\n tenantListFromStore[activeTenantFromStore]\r\n ) {\r\n handlerAroundMe(center)\r\n }\r\n }\r\n },\r\n (error) => {\r\n console.warn(error)\r\n }\r\n )\r\n }\r\n\r\n const handlerAroundMe = (center: Leaflet.LatLngLiteral): void => {\r\n if (mapRef.current) {\r\n dispatch(updateUserLocation({ currentUserLocation: center }))\r\n\r\n // Calculez les coordonnées des coins du rectangle de la zone de 10km autour du centre\r\n const southWest = Leaflet.latLng(center)\r\n .toBounds(aroundMeDistance ?? 5000)\r\n .getSouthWest()\r\n const northEast = Leaflet.latLng(center)\r\n .toBounds(aroundMeDistance ?? 5000)\r\n .getNorthEast()\r\n const bounds = Leaflet.latLngBounds(southWest, northEast)\r\n\r\n // Utilisez la méthode fitBounds() pour ajuster la vue de la carte à la zone de 10km autour du centre\r\n mapRef.current.fitBounds(bounds)\r\n\r\n if (mapRef.current !== undefined) {\r\n mapRef.current.eachLayer((l) => {\r\n if (\r\n l instanceof Leaflet.MarkerClusterGroup &&\r\n mapRef.current !== undefined\r\n ) {\r\n l.disableClustering()\r\n }\r\n })\r\n }\r\n\r\n mapRef.current.on('zoomend', function () {\r\n if (mapRef?.current && mapRef.current.getZoom() < 12) {\r\n if (mapRef.current !== undefined) {\r\n mapRef.current.eachLayer((l) => {\r\n if (\r\n l instanceof Leaflet.MarkerClusterGroup &&\r\n mapRef.current !== undefined\r\n ) {\r\n l.enableClustering()\r\n }\r\n })\r\n }\r\n }\r\n })\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n setModalFullscreenContent(loading ? <CustomLoader /> : null)\r\n }, [loading])\r\n\r\n return (\r\n <div\r\n className='mapContainer fadeIn'\r\n style={\r\n selectedPOI\r\n ? ({\r\n '--pointerColorHightlight': selectedPOI.color\r\n } as React.CSSProperties)\r\n : undefined\r\n }>\r\n {selectedPOI && (\r\n <POIDetail\r\n poi={selectedPOI}\r\n poiClose={closePoi}\r\n setMapLayerData={setMapLayerData}\r\n retorikAddress={isDevTenant ? RETORIK_URL_DEV : RETORIK_URL}\r\n />\r\n )}\r\n <MapContainer\r\n center={mapCenter || userLocation || defaultMapCenter}\r\n zoom={10}\r\n maxZoom={22}\r\n minZoom={\r\n limitAroundCenter\r\n ? limitAroundCenter > 599\r\n ? 9\r\n : limitAroundCenter > 199\r\n ? 10\r\n : 11\r\n : 10\r\n }\r\n maxBounds={maxBounds}\r\n maxBoundsViscosity={1}\r\n scrollWheelZoom\r\n whenReady={(): void => {}}\r\n className='rf-flex rf-h-screen'\r\n id='mapid'\r\n ref={mapRef}\r\n zoomControl={false}>\r\n <TileLayer\r\n maxNativeZoom={18}\r\n maxZoom={22}\r\n attribution='© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\r\n url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'\r\n />\r\n <MarkerClusterGroup\r\n chunkedLoading\r\n iconCreateFunction={(cluster: MarkerCluster): Leaflet.DivIcon => {\r\n return Leaflet.divIcon({\r\n html: `<span>${cluster.getChildCount()}</span>`,\r\n className: 'custom-marker-cluster',\r\n iconSize: Leaflet.point(33, 33, true)\r\n })\r\n }}\r\n maxClusterRadius={150}\r\n spiderfyOnMaxZoom>\r\n {poisToDisplay.map((poi: POI, i: number) => (\r\n <Marker\r\n key={poi.contentItemId}\r\n position={poi.location || { lat: 0, lng: 0 }}\r\n icon={icons[poi.type]}\r\n ref={(el): any => {\r\n if (el)\r\n markersRef.current[i] = {\r\n marker: el,\r\n id: poi.contentItemId\r\n }\r\n }}\r\n eventHandlers={{\r\n click: (c: Leaflet.LeafletMouseEvent): void =>\r\n markerClickHandler(c, poi)\r\n }}\r\n />\r\n ))}\r\n </MarkerClusterGroup>\r\n <ZoomControl\r\n key={Date.now()}\r\n position='bottomright'\r\n zoomInTitle={\r\n translation[locale]?.zoomintitle || translation['fr-FR'].zoomintitle\r\n }\r\n zoomOutTitle={\r\n translation[locale]?.zoomouttitle ||\r\n translation['fr-FR'].zoomouttitle\r\n }\r\n />\r\n {currentUserPos !== undefined && (\r\n <LocationMarker currentUserPos={currentUserPos} />\r\n )}\r\n {mapLayerData && selectedPOI && (\r\n <GeoJSON ref={geoJsonLayer} data={mapLayerData} />\r\n )}\r\n </MapContainer>\r\n <button\r\n id='around-me'\r\n onClick={aroundMe}\r\n title={`${\r\n translation[locale]?.aroundme1 || translation['fr-FR'].aroundme1\r\n } ${aroundMeDistance / 1000} ${\r\n translation[locale]?.aroundme2 || translation['fr-FR'].aroundme2\r\n }`}>\r\n <img id='map-target' src={target} alt='around me' />\r\n </button>\r\n <MapFilter settings={settings} />\r\n </div>\r\n )\r\n}\r\n\r\nexport { MapDisplay }\r\nexport type { MapProps }\r\n","const pinAFaire =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinAVoir =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinOuDormir =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinOuManger =\r\n 'data:image/png;base64,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'\r\n\r\nconst pinProduit =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOQAAAE/CAYAAABW2W/VAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF7tfQm8FcWZb11AFpFFBBEEZFHBCLIIbohcEHAHt8nkTSYjzjxfZuLLOGYxecnEYGbML6vRmaczmWQSnBkz8yaL4gLIvrshgqAiCl4QUWQRkH27r/7nnu7bXV3VXX1Od5+q7q/83d/Fe7pr+er7n+9fX331VR2jYowEGhsbO/PODOU/+D2s3DHvv/GnvuUfnX4v8jy0h/97dfn/nX/vraurc/6mUx89k7IE6lKun6qXSIADD2AD8ACuegGAtZCZA9CGMmgB0jUcrPg7lQwlQIBMWdge8AF4AKJj+VJuOZHqHaDC0uKHQJqIWNWVECATFnAZgGPLls+xfgm3UtPqYD0dgC4mK5rsXBAgq5Rned03pQzAm8v0s+Jad36ypvTuzt1Nv0v//qR5mbd330Z27Ph+rfq7dgErbiqntj2LndrurKZ/89+ntute/lt3rbpCHgI4n+I/ACetR6uUJgGyAgF6QPg3/PXYFPTgoe3s4OGPSqDb++m7JYB5AVhBl6p6xQFo19OHuWDtenozmGNU3lAG5+MEzhhS8zxKgNSUmweEsIL40SrHjh/gYFvNgbexZOlqCTytDnseAlABzK5dhrFOHQaUfmIUAmcMYTmPEiAjhMaBWM8fuYP/TNWRrwPADz9eXgIhLGBeyimtTmOdOg5gPc68sgTUGAAFOB/mP7Cc5LkNUQgCpEQ4HIR9PSDEv0NLk/Vbwz78eJlVFjBqXFGfOxa0x5mjS1b0lFbto17B59PLwFyk83DRniFAema8DMTv6lhDgHDLtuc5CJezg4c+KpreSMcLYMJ64rcGOGE1p3GL+TgJr1kCBEguizItBRDrw5QDzpiNW35PINRAkAPOPj0nRT0NCgs6+wjRWcYKDUgORKwNp/GfvmFas2XbHG4NZxeKjkahSPdzrDv7nH0NG9DnttJWS0ghYHLhFBKQOhbRsYZbPnhee99PV0mL+hz2Rfv0vJb/hFrNQgOzUIDUASKcMxs3N9FSKulIAM6gAefcxoF5Tdhas5DALAQgy86an3H1Uu4fEi1NB3xhtWrSWQDzb4ri/Mk1IMub+feU14lS3QAQ1298nDyl2ePR1yKs5aABd4StMxGWdy8H5qIadzXV5nMLyLLDBt47nCcMFFDStW8/RkBMVb3iVQ6LCSqLn5BtE8TN3plXj2zuAFmmp7/mk1YvUwesEWERbQphi6fW9j+tAUzQWOxhPmL/aP0jyBUgORixl4iA74BVhNcUQMRmPhU7JADnD2hsiFcW9BXWssGOEUX3MheALJ9BhFUMnLxAbCm8pvjRPbYULTZ6IksJYLtkyMC7VbGzubKW1gOSg9Fx2gSsIujpqnU/onViluhJsS2sLWExFevLXFhLawFZ9qDCKga2MmAV165/lOhpiuCoVdWgsSMG31c6bSIpsJagsHD8WFmsBGR5g/9J2VoR3lNYRaKnVuqjdqcRKzti8DdU1nI6rwhbJNYd9bIOkGXHzTRx5sgqautybh6EN/bS4d9TWUvsW95im8PHGkCGUVRaK+YGYxUNBGvLIQO/lAsKawUgw7yo6zf+W2k7g0qxJdCpw7mltaUiiwH2LB+wQULGA5KDEU4bOG98XlRQ1JdWf4c2+G3Qsoz6CAo7ZNDdqn1LK9aVRgOSg3FqGYy+KcVp/ZdW30/bGRkpum3NhFBYrCvHmezsMRaQHIw4nYGoG19BMPiqdT+0TUeovxlLAMEElw77O5kXFqDE1gh+G1eMBCQHIygqrKOvYDuDQt+M0yFjO4Q9y0uHfU+2rsR2CCylcaA0CpAqTyrWi7CKdGjYWN03tmMhWyNGgtIYQJbBuJDPrC8eFWBc9spXcpXf1FjtzXHHEESgCFIHfZ1uytCNAKQKjOS8MUVN8tGPEGePMaCsOSDDwAjLSCFw+QCDKaNAZgLsV0qKEaCsKSAJjKaoabH6YTIoawZIAmOxQGDaaENAifjXmp0WqSUgcVrDd3QKa0aiqaapbn77owBlTb2vNQGkbJ+RwJhfxTd5ZKaBMnNAcjAiExxO+buFwGiyyua/byGg7Jd1mF2mgJTFphIY86/wNoxQAcrMY18zA2T51AbWjW7Bpv/CF/4XBYnboLEF6CNOigzoc6s40kXcSo7LaviZALJ8nhFROO4RKorAyWqKqZ04ElBE9EznoLwzTj2VPps6IFXbGzg+RbGplU4bvZeWBBD7euWoh2QB6ZkEDmQByMD2Bp3aSEudqN4kJABQjrv8X8R7RjLZDkkVkNw6TuMCQjZxt9B5xiRUhupIWwJICQJLKeSAbeDtDk/T85oaIMupGrFudAs8qnDiUCEJ2CABhec1VSdPKoAsrxvfE5045FG1QQ2pj14JKDyvD3ArCfaXeEkLkIF147KVX6GEVIlPH1WYhQRAXSWZ0kFdE884kDgguXVEHhzkw3ELpWrMQm2ojbQkACfPpKt+I64nUwkaSBSQsv1GJDFGwDgVkoDNEsDVBcjPI5RHuJUMJGKrZpxJA/I13hk3BQdF4lQzNfSuaRJQrCeRLGtRUn1NDJAyqkr7jUlNE9VjggQUQQMNvG+JbYUkAsjyNeKwjm5oHKJwEI1DhSSQJwlgf3Lc5T9PjbomBUjsN9Y7vQRVnbPkTygfTp40kcbiSgCXxg4a8GeiRBKhrlUDUnakiqgqaW+eJaAIrVvN15LDqx13VYCUBQCQV7XaKaH3bZAAriq4cuRDYldxSSwO4FdcqgXkNN6yG6tKXtWK54FetFACkqNaCECvKstAxYAsO3IQHucWCgCwUKuoyxVLQBEw8Di3klMrrbQaQPocOQcPbS8FjlNi4+BUdDitL6vj/8UtJxuPs/0H3o/7Wujzp7XvzVrUtYpdZyNrZJ/ub4j9Xt5fUGRDrzisLr6WcAnLTnKQI0etepMnPM9atIgPgsNHdrLZi/84UZ2+duz/Y23bdI1d58mTx9nT866J/V4RXpg05jfi2cmKT4RUCkifdSRHjlrtbp40v2qdnL34s+zwkV1V1dO2zRns2rH/XVUdePmpOVcH6kDgteIqcffZ4ycOsc0fzKq6fRMrUDh4KtoGiQ1ImXWkkxxyNcHh1hvGP52IDsmAEKfiJL4Y0N5zCybzZckBt+m49W79aCFb+frfx+m6Fc9KToRUZCUrAaTPOlJEjlpf2rTuzK6r/737wImTR7WVq2WLU/iz/umZMXeS9vveB6dMnCO818hOnDymXVfLFq3dZ2ctuo0dOQpnIk87X6H1f2rOBP52o3b7NjyYlJWMBUhZEMCcpZ+nNI4KjREB+eyCm9jx4we19atShY9qII61bdXqVHbj+GcSBeTzSz7HDh3eEdVN6z5PwkrGBSS2Ofo6kqL8OOE6Uy0gufucTZk4L1HFnDF3Apxy2nXqAjLKAeX9cpm37M/Y/oMfaPfBlgeTsJLagJStHck6pgtI1H7RBX/N+veekohObnp/Bnv9rX+IVRcBMpa4+N2TgZuaY60l4wDSt3Yk6xg9UdVaSLRwydDvsp7dr3IbKx321p01bghBo5yybfsS9vKaB6I77nmCABlLXNzbLD0Nou1x1ZraciYAHK9yy8IXvsj2fvpuvN4W6Omzul3GLhv+oG/EqjVkx9P6sXZtu0mlc37/z7MzOg92P4uz/sNLXqq4a886tmHTE9J29h/cyg4c3Bb4TAQkHljx6jfZx7te8dVNlLVZdJK1pHb0ji4gp/Pm7nCapH3H8G8WlTNGBsi4jptqABn1fdjYeJLNmDvR95gMkE0PYB3arD4EyGaxKdaSiHFtiJqDSEDKYlbpGgC5WC8d9gDrceaVSpmbDkh0XAS8GpD+YRIg/fKQRO9o5d/RAeQ03pR7ogMxq3OW/kkU0Av3Obyh8IqGFRkgb5owi3n3+aIEl6aFPHDoQzZ36Z9qWkgCZNhcSZIs7+H6cXrU/OoA0rfVsfbtx9jGzc2b3VEN5P1zxIUiPlQsjY0nSnGo19X/zv1IvQ+pnoZLht7vc+pUA8gmp04gc5qn68HtkKBT5/ZSCF5dXQvfkMlCBjUdUVrCVQSRF/aEAlK21fHcgil0oqMse0VqQLZuwz+zdxt+y9LwssK7HfktWu4f4NWnZ3N0T5Je1kEDvsDTWEx1tZAAGQSkJEtd5BZIFCCn82ZcZw5tdTQL/aJBX2b9+9wcmAWvBUsCkBcP/ibr3dPvaKmUdby/bS57dd0PYr1O2x6xxOV7+NR2Z7FJYwJe7VDnjhKQ5fQcn3hboCDyJmkM+8y9rG+vG33Cx2mGZ+f7/1YtIE85pQO7YdxTlWuE5M2ZC29mR499ql0nAVJbVNIHJVsgoc6dMECCj/zaaYWcOU2S+Mx5f8HO7+d3aqlu9Rp98Y9ZtzNGuBMVL5a1ju/zJRs253QkTnC3CMiPd73K9yHvK1Xl3bIhyioHrsS508CdO/1UMA8DJL6a3ZgtcuYw1r3rKHb5CD/lU512ibu/GPU97OwRjhzyLdarh/9M4taPFvD41JOsdw+comguWz+cz1au/T6Ph50bcMJEtRf+eSPfHplQ8WmPvMayymSmSPOhzCggBaSMrhY9bhVbE9ii8Jbde99kS176su9vyAyADAFJF6xNL+Zxkr09Thq08dGOFezF175Tak62D/o+dwK9uu6HFYMn6XGgvjgWOo32s65TEt+qpK0qQPpusKKLVoNn/44e28tmLrzVN7eKOMaq5x9gHHrBPaxf78m+urz00fngiot/wM48Y5Tvuffef5qteesRI0CJPEFPzy1WKhCJN15JW1WA9F2aU3S6KtJPHF/CMSZv6dplGM/T+dMA+AAmgKRblxGcNrbUBicOM8O6rX7zZ2zw+X/Jzu37R753d+7mt4rxOzdlZfTIn/D2/Dl7V73xY7blg9klhxS8ti1btNHuC/ZUd+xeVYphDaPih4/s5nUG9zKRPsQpRQQkxi7Zk5TS1gAgia769RROGThnvEXcnEcmtwmjp/uekcWFypQ5aqNf5kTasfs1tnzl10IBJTqUmqhiMB+OWIlOH1VJu57jHtxjEg+ut86iAlKXtsoAOZVPkutdLTZdDXo6Zy26naewaN4Nkq0tkRUAHlVv0VF0ERwyMOKUBSyVToEDCo4olI2bf8fWvv1POq9JraAI5huvfpa1atnOVx8BUi1eCW2VXj0gAyS+6t1ggI1b/sDWrn9UayLz9tD1455krU/p6A5LZpmCdPYEp7P+3DeVgPHC8+5i5/X7nE+k23e+wl5YpQdG50XE19bxPKwnY+TQwbs6fUZqD2yLOIUAqUYAvK03jJ8hPhAIEpABEl//7rVyRQ4GEJXypdXf9QWQj7ro/sB2gvjMJUOnBWYpyssoWzPKHDjpfgHK90G9lhIJoK++4l9jARIP61DndMdWm9olQQKB2FYfIMWDyEj3h7R/RSyTJ8zmyY2R+S35gqxtb77zS2me0sHnf5E7cD7ra3TXJ6+zpa/cm3xHFDWec/Z1PADif5ZiccXyyd71bPFLd5f+XCkgZZQ+s8HVsCFJlvMZnMH44i9FQOLr3D1qVeQUj0lv7Mv0QHRwXHDunWxgf//xJ7wncxAloVfYHoH3FF5Up0yeyLOsh1w1gORU2NivBpBFtZKSbbHAkSwRkL7onKJeDyCujZJQflUdz8y/np04cYSH4/2PklVSlaRpXlNYXtP0w1pveO8/WcuWbdhNV88MHW4SlBUNFNVKRm1/iID0rR+LmjdHZR11QHH16F+zDu37+JT6jQ3/wvMPbWIXDbqbtT+1l28d+vGulWz7jpcYjup4y4mTR3x7hTptx/niEMcIx133bpfyoIKRbjXYbz3Ac+2sfftRBoeSWCqlrE49SY8pzvhr9eylw77Hs0qM9jbvu1PSBSStH5tkNIofCD67+1jpfEUp0PgrfsmQsMpb3njnF+yd9/7L97coOoytJoTEDez/Bfe9qLbjKthVl/wD69L5Qm1rKHuwWkDG2YqJOz5Tn5esI30JsLyAnMoH4e4/FnX9GAaWMFCMv/wXrGOH/j49WMf3/d7l+39iuWnCTGWkzJ59G9iiF/+KXXDu1FQBiT7VX/YY69xxoFR3ESn0zLzrQvW6WkCi8qS/aEwFotMvSQIsXxidF5DT+Uvu/mNRL1+tBJAyy7iGJyR+jycmlpVxl/+8lL9TLA4Y8fcsAIl2xl76GDu9UxCU+zjFXvDCXakDMm4mddMBp9M/iY65+5FeQPriV4u4/zjyor9lvc4ap5Sp7NscIXMInfOW1W8+xBq2Pqesp8Np5/D9u1/5PkeOW6zZnZIVINGe7AtCx39QmYX0p48sIm2V7Ee6iZS9gPRFBReNSkAxg1E3J30b/6JMkJ4BaRrigNF51tvWp/s3s/kr/txXT5aARMP4gsAXhVN05r8SQGKrR9xW0WlLx/LY8owk184DfD9yGvpfAqTo0ClqdgAxCLqOtVACUpJ3kx9xUtNUmbJgA37bx8ukAdltWp/uy1iXhdIiZUjvs8azTfy4ls51cZUCErLwgjKLsZkEVkkWATdAwAHkVN5h16FTxMzkSOV/zVXN3lBsfl/N6ag33aGjOBPH/Adr366Hb45VDpxqFAH7kv147p6Zi26JdWNVNW3GebdSQC5ccReXratupXSZSAFSlCJx7LiB5g4gYS7dCJ0iOnT697mF7xP+b1cncIgWGQJEQEr3GSVbG0VQrkoB+ez8G3xZFdZt+DlPm1n9des2yVxcHnHKWsKiA8hF/N/u5lsRrwpAdjdQNu8aSsxFs2//e8F9Rr7p/05DMFGyTcpRaV/FC4V0TnsgTA+nYbwKWcSoHcmSp+TYcQBZeA+r+I0FehqVHKqomRRkZyEBah1AqsBftHWkytPqAJI8rJPm+3QlCpBr3nqY7zM2X/UtKlov7hwZyLN7I4wOpzu2bV/KnT4PV2qMjHhPtsXj7RgsnzdQ3fksKjIJzxUNkIMG3MEzvzcF6ZdLydNaJ0vZUTThQCBepdmz7x0eLfOXSgv52hs/5Uen5EHYQ/mNx/1CbjxGkmIkK7atRIHqQ+4txllQWVEczvU9GrV3a5u8ovobBsh6/jJuRy6VInpYRUBu2vIUe339P0oBiaRTDVuflcpbXIeGTYrOl55zMuDNd/6Vn8b4TdQcp/a5CowvvvZtHnP7Yqx2kYHhuvrfS/PErt/472z9xumx6rP1YYmndTG3kPWwkPi6fpIA2UxZnS0McQ0JkAKsshL/Do6mZMOqgluTx1zyiPuxDoDTUE4ZGJe8/Nds9543qmoOTsXJE/jFQcItWkXJ/xsGyGlcsoXe8hAtJKgXKJgIyDBQiIor5iKSXbwStg7NOlJHhi5ZSF1U+pG4KEUKEGyfeEutvnzi9r3a52VbH7CQBEguWa9wkEgK5/90AYkNfBwwdkoYrZV5c2UTW2tAIn0J0phkARRQWG+6kKJEiqkACdffPY7gixgUIFrIuIAMAxkCz70Jki8f/qAv/rUphjWYr7p/75u5c6g5leS85VO1Ei0f53mQDh3eUe2XN88c8BzPINDWrWfRi19ie/a9XXW9qgp0v6hS60ANKlYBchHvixsUUMRTHmkAEpeZ4lLTWpWn513DUz8er7j5rAGCuN7hFzYnf4YTC86sPBfpXiSnrATIKimrTHmjtgmyULRK12JIgIzNf6e8vOYBvo+6JPUue2Umu64h9Q5k3AABMkTg1awhRfCtfP1BNvKib2c8vcHmKgVk/WX/xDMJnO9WWGk9cQUgJhfLqt24/UzqeRUg3+MN9HUaeW7BFHbs+P6k2rSmniQBCe/p0AtwgVhTwc3KcS7aqVRovXtO4AHyzdfjVarQyDyHDHROqbSeuOPANg+2e7JuN24/k3pekvBqHLyshQ+bg4DTBGRWCi2uwyptV7xMp9J64irugHNuZ0MG/lVhACmN1ik6IOF86dvreua9Mu3osX2luzC8f4OWHD6yS6pj4nPI+H5Kq/aZK5YISFV/o4CiM26cX8R+rcqjiw1/JHiOU3AD9MVD/k/mcovTxySfJUAK0szK8fL0vGszoax9+O3KuNg1y+LE/YpHsbx9aLoKAXdZBu+O9D5HgGQPFJayXnPVf7J2bc/MUncL39bWD+ezlWu/r5QDAbLAgFRdOlp41KQsAOeAsqwZAiQBMrX1iuigSFnPA9U7d4ak0S4ieBDJIysIRniTpzTZz68g6NXjap5Wc3zgMVVoHAGSAJkaIFGxuMGOv8FCLFihvlQnLoC8yaKcd9P2isrGhbZV7fblibqGfcZ/nd7zSz4XcAgRIAmQqQLSe8MUGkKGgTSyBojOKZ2s43GB731eBsioL4EzTh/CxozyZ0xA1nJv6dVjIrt48DdSnZNqxp30uyov6x7eUKesvl2THlSl9YlryE2KtP+V1s8vEufB4c2X3WIbBd7WtIoIyqTH4+13i7qWfKvoRvdPsPhIABZVcKU3sgfoliiQ69Zj6nMj+JcPPOOecie8rIv4HwoXXH49zzLX2pNlLu1JS/sOi6jUIWmOb+bCW9nRY3s1mpBfk656Me+ApFhWz8zj2jhckpNViaNcOBvYrm139umBzfwy18PaXcxqX1XsUJyxxeljnHq1hWTQgwRIYTIQpgVvaNpFvLpc1h6CuRHULSu6eUvjKHtSY1634Z95kuPfalfnTya2gefQ+Xf33W5dhvrmgwDJRVO085AyJUbWcoComuKtF8H6CNpXlWvH/ncgTE/2LNaFr/P7Q1TF22bS2e0QLO89MO30YefuNSWd0S3ePop3oRTNy6qykMja5GrLqnU/Ylu2Pa8rX6ufa9midem6AG9J6ltZF5BRyZhFAYelW/S2iVywsxbdluj8YE9RdqxMV2ajLvoOO/userdPuBQYzi6nnNquO7+r8gL3/3XrTXSQGVYmcXL1K3ROHfGYkSrRbyVzpANIMZcM2oFlxkU/R4/uK6X6kK1zF7/0JfbJ3mA6jbQBif7JPKW66RvjUuq8A5KSXAnISjNNRRQg27bpyq4d678TRJWK/1y+zh3sOZaEYciUNQtA4lznlIlzAt9RUVkF4oJRNcZKvhxNfUcFyMLmZfUKBNePY00TVVq2aMMdD7eyc/v+MY/EacuQ7hGJwURvaBQgp0ycx0+ANCe3mrXodn7lwCfK5kcO+VYpFM0pTSco/NEvcQCJ6/cuGfpd1qnjeQyBBK+s+R47cOjDqOGXPleBC0drZy/GOLC1ze+AbNGK58m5j/X29FurgfJDebaQYXlZ6/n4C5m53H8o+Vs89eNLSn0Ji990XkJmgOMnDgWUNujU8e/HHTi4jc1dFp0QK8qi6wAyKqHzRztWsBdf+04obsQIpDggC7N8RXLqaANSvOs+rrBtet6rwMtXfo3t2I1LwIJFFoupGifuOcR9h2EWcvTIn7BuXYa7VehaggvPu4ud1+9zyveiABmHNob1SbTuceY8rN4iAVJ1i3Khb7/SAeQ5Z1/PaddX4+gcw1UE3jWfaCFFC6MLSJEubt/5MnthVfMJ+zBAxgGjM1hVv0RAPrdgMnf24Bp0dXl70xPsrXd/FfpMkQCpvGwHEuLcv4H/OseR1sIXvshgKfNeogCpcmA8w28AdtaMWAfeOB5JhZuTQolyCwKy+R4RpMDAyQfd4u0z0mjgOnCnqAApZnPD8+INXrItjRMnj7Jn5l0X6JoISC9wzzxjJEMgOdKAILHy+/xQMgIbdEqRAClJcHUn16Xp0huUixIcEAVIUfF27F7Flq/8ulS3wmJJwwDppMDQUVjRQp44eYQD5vpQQCJzOu519JY4d5QsW/lVtnP3at/7YYDUHYfsuSIBUnJviu8G5dxeJ4BkU1F0qholonezkwCoMRKI5aHItjwwLsdCIonoz5yBbtk2h61a90Prx62inNYPrMADSDJ4o1Zi7NThXAYL6SmbOV3t6wVkPf+f3G19XD/uSX7EqmOt5E7tpiABpOicufCWFGrOrsoeZ45mWEN6SumyVi8gO/P/8e1Kx/H8ZTeUeC2JzoxP928OraBVq1P5saduvmew2b3/wJbQ9zqc5vrD3Oc+xTv+HNS+Olq37uS7gg0fIr3H/gNb47cVMa62bc8IHAxGDCn2P8OKdFwRbbVvfzZrUdfKVy3OSh450hQsIC+NgTsi8ZwzX95+6J58iacp2T4t8bA+wgFZSnXvhopwxfNlDsiDpzXOXRFx88Q4U4hLafCut8gcId7P4YHECQ9v0blcBoHwCIj3lqjT+hJ6VArojspeINsmmbnwZn4Q+VOl9spysyJZ8+zFnw3VeFlb3othvZ/nAZASD+u9HJCl/CZeQObu1IcuILFlgUBzsUSxBNl2wvJXv8527FqlVEBZDGulYMTdkmFWv2OH/mz85b8QgH+CYR0WVmQAwckRJyRO9m7P7mN4KN4030eHj+zmYPyj2G3NmDvRl/U8b4CUBOgP54AsubK9gIQ03avN8+DY0QEk4i2RXycuGGUpQFa8eh/7eNerSgUEHb7mqv8SAHKSA2RiqNLKLCMucN1/4H3le7gmHNeFx7XCsiicaDBeVYqL9RbQVKT2iAt82b2WeQKk5Gr7vRyMWDKWiheQ9fz/XcdOHkLoogCJTX0oYHww/oE7i9y8YKXXsT+JfUpVkVvGaDDiWnFcL+4tOJ61/+AHajC278PE9JA6Vlh2NjOKpkocFKVAgGcXNN/+LOuozApjTxV7q2LJEyAlIXOuQ8cHSPyPePGO7VfThQGycjAGk2NFBVLI14yVgXEuB+OBmGDUSSEis4wAVViUTfeuo9jlI37gww8imBDJFNcyqsCIevIESEmmuQe4Lk4LWMgyIMFjhzofvrT6foZT3bYWEZDIi+oUWToK7+eyMeO0u5ipDgeF9+zboBQRgO9Nmeg8GNUWbrICnfYWnEY5eOjjkOk4ydNsBFOFRLUlkwWWLCdOBK2V0ziOnvXuGaTa0W0hfWTzsTPUhwwVJ04cVY7L2z8d62uyvqoidFSA9EXs4Kzf2vWPmjx6om9jAAAREElEQVS+0L5lnerRWkFZ1PGkcwVlOXTkpIVDRyin8y9td0/I91XFKetU/vCvnRdsX0eqHDZZTgK1lawEZE6fZFtIrzbJ+nENB+Mwb4siIAMBAnOWfp7TpI/S62XKNZ/dfSwbNfT+lFuh6rOQALIafLB9cRZNpdKGZP3oBgRIKSv+KGYyz1sWOq+DQMfZkcrMUKVKCUye+Lwv0idqL9gmUYbtP4YB0hdoDqcOnDt5KeKdHnma8DzMke8Lk19tB4qahyKJmPLtP4YBEpzWl8siT0or0gZviFYeJt7uMfhzDeUhOMWZjyGD7mYD+vgCJR7n68ep4nz5/c/lT8UMArZvf3gHjWvMcZ25U/QvirFb1W3oveiFlN0hacM4ZH2UbHeUMgToAtK3/ZGnbyoIwEuLdu95ky15+cu2znOu+j3mkkfYGZ0Hu2PKCzOThMthjL7tDiVlxQfcQvpytUbdTWGbVngBqZs3xjvGBS/cVcplGlbEtar32dVvPsQatsqvBHeemzTmiVLmclnZ+tFCtvL1vw9tf+RFf8uvEx8nfQZec3jPw0rfXjfwW4/ld3bg2vKotZ0ssN1pTxXGd9OEmfw0S3NuorwAUkJXZ3DrCIwFipSylkHZwH+7B/3y5G0Vj0yJEw+uDyGGlTBlUR3l8tYXrmzR9yhGKWtUlrmotXPU+94ctDI5Rb2PgBMEnniLL0SO57dFG3koki9XKV3FWMMA6aOtefK2iufRROXuIAnOFhWjekA0ZyGvRKFtb3/+8jv5/Zf+g99eQOZF32TeVT7ffb3ROd75DwNkwNtqe7C5M/BT+M3JN/AblJ0icx707H4VG9g/SOv2cqqqk2+oM0/RP/zCrwWwdvDQdq1tJKQeuWzEg4EDyUhhsXzlfbzexgjjUcdGj/xRIIUJKPqLq77NDxrvizQ++OLCjVRiee2Nn/D43Xci34dHuxM/kykW5Gjdtn2J78/i0TTVPSeRjRr2gCQYQOpddbqtBCQe4FzfF2y+9u3H2MbNvzdsyJV1x/ttjDSHOOVPpXYSuHLkT1nXLs1RZFEMoHY9jdeyJBjgFm4dm62BUF0UIH1BArbHtnrHruPYiSd6eroaCUwa8xufNc4DICWxq9JgAC3KWraQffnv97wvRJ39q2ZSsnw3yrGTZV+oLVbKdO7kGQKdxfV2tpcrRz7Erb57mhHDCcSuimMMtZBlUPpy7eRlsX35iO+z7l0vdeWRh29k2xW4qf9Qyaj1sfkjldxuhU7343S1Iaz3OoCs5xW4qT1Qme0nQDAG7Hdh38spMq+f+dNOPTRVAhJnji9Vh6rfkYAsW0mfc8f2g8uOMLzryG3bl3KaNM3U+aV+WSQBRWRO6e6OqGHoAnIqr8g9uIzInTlLPs/vWdgfVb/Rn3sBqZMEyujBUOeMkYAkEbJ7VUBUJ7UAWbaSvkTKeYjcETO6xVlHhkWiYMMbFDishL2vc04zKhImaiziuUOxr1Hvj7/il6zjaf2UQ4x6P0oxbf0cAfKTrnpCzBSvjMwRxxkHkOBzbvJNnXhI04V62fC/Y2d1u8Ltpq4SSdzZgaGG1aXKeOetpNr3Z8ydgH1k5RREAbra93XidU3Xj0r6J7GOe3k9ysicagCJ9B4N/MdNSLp+47+x9Rsfr6TfRryDuzyQmc4pUWn5vZ0OU+jGxugUj+GAaGRNsabqEgWoqC8X8RbnuBZyysQ5DLeLqUpU+973kPG8S+fPlC+ftdfDqrCOvjSPUYqvbSFREf/G9VlJ+9eS/iDuzR/M4jcL/yRKZqXPYeVatWwfeBYX5hzngdE6BRMolkZ2UvvGYdx9GQxHbtS+QxFfSHWsRaAPur4BBNHLQHn8xIFQ6+xtcGD/P2UXnNtM7+MAWUfGWT5TrXUs6VWcDnNA5s5KipbGZoWIM5emPJsX+SdhHWMDMo9WUqRuBMhsoeoHZDRVz7Z3+q0lYR0rBWSurKR4kJcAqa+ESTzpBeTWjxbwg9cPJlFtpnUkZR0rAmTerKR478b8FX/Br3hryHRCi9oYLmK9+opfucPH1XW4ws62kpR1rAaQgbOSNkfveL+lN215ir2+/h9t0wkr+yumtrCRnSiicpQpOqImKpZTx1sZd/D4MgrgM1tvXZY5Fq64+AesW5cRAfnhYO+sRbiENNw9P/j8L7L+59zKvWZ+EeOymFncEuAW47CCC1BHDvk292L6vaA4YDx/+Z+zQ4fDLt1h/Gr2M/mVdL8KHHDGlszKtQ/yA8JLQ9vHFXjXjf0tgyfWN+983Js2/4Gt2/DzCN2qY9fV/zZwQBov4dq+Fa9+05dsDH+3EZCSEx3YdxwWFUSuEl41gMRaEjGubt4dW89LioBc8eo32BUX/zBU4aKUp7p9QvNz6lQ7fpmMo+qMsi5Zfy67G5P3wb2evJL+VAxINMatZD0Mo7dhG7MKiJH5OIsn3ggsCjdKeQiQ80P1UZQxrqRDOKYtReHI0TrRETbGqgBZBqXvvCQ2lUFdbbqg57T2vdmE0dNdOc1d9gVuIX/E2rfrEZAd4kyRWwgXk4YVMceo8yzC2eYuwwVG20Pfl6QOdJ/XSVyt+PYu1aGz3kcunYlXPlEKgBDLrj3r2NKX7wntf0t+fyTSV7So899xiZcOHPqQreA3Tk8c8x9uHVFXtJsGVMX8RJ53jBpHEoAMbIPYeIjZ79h5kjt2/m+U7OjzKiRgs0NHcfg4VoicSnRVA7JsJX25d/A3nW/xKuYz8VfzEjGSuGBSqtBmeUuuBdA+XhUlzkQAWQblIv57rNOgbXGuNitI1CSb+Lmt8lZQVa3DxzrzkCQgA3uTO3ev4ekV5enodTqX5TMjLvw663P2tW6TUU6bLPuWx7a8gNzywWy26o0fGz9MBVWNTFwVZ2CJAVJFXW3xuooZpmctup0dOfpJHFnSs5oSaNP6dL5H+Tv3aRv2rxVe1c18ENhzxOH9REqigJRRV/zNBoGjn95v7ffef5qteeuRRIRMlfglMPSCe1i/3pOtYiPi9RPlzg/nYMRefGIlDUD25b1DJ92DzAgYWPbKV43PwSOuaxAVQyV5CbRs0dpXqenLgwHn3MaGDPySKIhEvKpipYkDsmwlfdfZ4W86e1/JT328GqdMnBsIVYtXAz0dVwI62RXi1pnk84hVhVdVOEy+hlvG5nsPEmwwFUCWQTmd/77D21fTs56LJz8SlDNVpZDA7MWf5Sc8dhkrn6RjVaMGmiYgA7GuiN7BelI3RURU59P4HKCMimNNo90i1ol4VpPBqKCqVcWqRs1zaoAsW8l6/tsX62oDdY0SGn2efwkoqGrVsapRkksVkGVQBo5pmU5do4RGn+dfAllTVUeiWQDSSuqaf5WjEaokUAuqmhkgibqS4tskgVpR1UwBSdTVJpUsdl9rRVVrAUiirsXWdeNHX0uqmjkgiboar4+F7mCtqWpNAEnUtdA6b/Tga01VawlIoq5Gq2bxOmcCVa0ZIIm6Fk/hTR6xKVS1poAk6mqyiharb6ZQVRMASdS1WLpv3GhNoqo1ByRRV+P0s1AdMo2qGgFIoq6FwoBRgzWNqpoESKKuRqlq/jtjIlU1BpBEXfMPAJNGaCpVNQqQRF1NUtl898VUqmoiIIm65hsLNR+dyVTVOEASda25vua6A6ZTVSMBSdQ115io6eBMp6omA5Koa01VN3+N20BVjQUkUdf8AaKWI7KFqhoNSKKutVThfLVtC1W1AZBEXfOFjcxHYxNVNR6QRF0z199cNWgbVbUCkERdc4WRTAdjG1W1CZBEXTNVZfsbs5GqWgNIoq72AyTLEdhKVa0CJFHXLFXa7rZspao2ApKoq91YSb33NlNV6wBJ1DV1fba6AdupqpWAJOpqNWZS7bztVNVmQBJ1TVW17as8D1TVWkASdbUPMGn2OC9U1WpAEnVNU8XtqjsvVDUPgCTqahd2Eu9tnqiq9YAk6pq4fltVYd6oai4ASdTVKgwl2tm8UdU8AZKoa6Kqbn5leaSquQEkUVfzAZRkD/NKVXMFSKKuSaq82XXllarmEZBEXc3GUtW9yzNVzR0gibpWre9GV5B3qppLQBJ1NRpTVXUu71Q1z4Ak6lqV6pv3chGoam4BSdTVPEBV06OiUNVcA5KoazUQMOvdolDVIgCSqKtZ2IrdmyJR1dwDkqhrbP036oWiUdVCAJKoq1EYi9WZolHVIgGSqGssKNT+4SJS1cIAkqhr7QEWpwdFpaqFAiRR1ziQqO2zRaWqRQQkUdfaYi2y9SJT1cIBkqhrJB5q+kDRqWohAUnUtaaYC2286FS1yIAk6moYLomqNk9InWFzk0l3Ghsb63lDC72NbdzyB7Z2/aOZtE+NNEuAqKpfGwoJSKKu5nwlEFUlQJYkwK0kUdca45KoanACCmshyetaWzQSVZXLv9CAJOpaO1ASVSVASiVA1DV7UBJVVcu88BaSqGu2gCSqGi5vAmRZPtxSPsz/eY9XXMtWfoXt3L0mW43NeWtEVQmQWipO1FVLTFU9RFQ1WnxkIT0yooCBaIWp9AmiqnqSI0AKciLqqqc4cZ8iqqonMQJkEJAUMKCnO9pPEVXVFhUjQEpkRdRVX4GiniSqGiUh/+cESIW8iLrGUyTV00RV48mRAKkGJFHXeLoUeJqoanwBEiBDZEbUNb5COW8QVa1MdgTICLkRda1MsYiqViY3AmQ0IIm6xtQtoqoxBeZ5nACpITuirhpCKj9CVFVfVrInCZCa8iPqqicooqp6clI9RYDUlB/FukYLiqhqtIyiniBARknI8zlRV7WwiKrGUKSQRwmQMeVI1FUuMKKqMRVJ8TgBMqYciboGBUZUNaYSkYVMTmCoiahrszyJqiarW2QhK5QnUdcmwRFVrVCBiLImKziirowRVU1Wp1AbWcgqZFpk6kpUtQrFoTVkOsIrrycLmRyLqGo6OkUWskq5FpG6ElWtUmnIQqYnwKJ5XYmqpqtLZCETkm9RvK5EVRNSGPKypivIIlBXoqrp6hB5WROWb569rkRVE1YWspDZCDSv1JWoajb6Q2vIhOWcR+pKVDVhJSEva3YCzZvXlahqtrpDFjIleeeFuhJVTUlBaA2ZrWDzQF2JqmarM+RlTVneNntdiaqmrBxkIWsjYFupK1HV2ugLrSFTlruN1JWoaspKQV7W2gnYNq8rUdXa6gpZyIzkbwt1JaqakULQGrK2graBuhJVra2OkJc1Y/mb7HUlqpqxMpCFNEPgplJXoqpm6AetITOeBxOpK1HVjJWAvKzmCNw0rytRVbN0gyxkjebDFOpKVLVGCkBrSLMEbwJ1Japqlk6Ql7XG81FLrytR1RpPPllIMyegVtSVqKqZ+kBryBrPSy2oK1HVGk86eVnNnYCsva5EVc3WBbKQhsxPVtSVqKohE05rSLMnIgvqSlTVbB0gL6th85Om15WoqmGTTRbSjglJi7oSVbVj/mkNadg8pUFdiaoaNsnkZbVnQpL2uhJVtWvuyUIaOl9JUVeiqoZOMK0h7ZqYJKgrUVW75py8rIbPVzVeV6Kqhk8uWUg7J6hS6kpU1c75pjWk4fNWCXUlqmr4pJKX1d4Jiut1Japq91yThbRk/nSpK1FVSyaU1pB2T5QOdSWqavcck5fVsvkL87oSVbVsMslC5mPCVNR1UP87WNcuQ72D3Mv/Z1hdXV1DPkZejFHQGtKyeZZRV8UQ7uVgfNiy4RW+uwRIC1VARl2FYSzmYKy3cGiF7zIB0lIVkFHX8lCIqlo6p+TUsXjiQqgrUVWL55UspMWTJ6GuRFUtnk+ykJZPHrrvoa5EVXMwn2QhLZ9ED3V9mLyqlk8m7z4B0v45hJXsS/uNOZhIPoT/D67Jsh9vmQqUAAAAAElFTkSuQmCC'\r\n\r\nconst pinService =\r\n 'data:image/png;base64,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'\r\n\r\nconst markerIcon =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAApCAYAAABUdSs8AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOTaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4yLWMwMDAgNzkuMWI2NWE3OWI0LCAyMDIyLzA2LzEzLTIyOjAxOjAxICAgICAgICAiPg0KICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPg0KICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9Ijg5OUI5MzM0RkU4QzA4QTE3MzM1M0NCNkMwRTk2RTZFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjUyNjBCMjg4NTkwOTExRUQ4MzRFQjVCODM2QjcxNzA0IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjUyNjBCMjg3NTkwOTExRUQ4MzRFQjVCODM2QjcxNzA0IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMDIyIE1hY2ludG9zaCI+DQogICAgICA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowNGUxNjdlNS0yZmQ2LTRkNmEtOTgwZi0yMWU1ODg4YjIwM2EiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDozY2ZjYjg0OC1lOGRkLWFlNGYtYmUzMS1mNjExNDdlNjc2NWMiIC8+DQogICAgPC9yZGY6RGVzY3JpcHRpb24+DQogIDwvcmRmOlJERj4NCjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0iciI/PhdxvpsAAAPHSURBVFhHxZh9aFVlHMd/ezHdi2M1XzYzKKM/lEhSfKtYQyWLmIp/FZooRH8W/mvQP6kYQUTgH0oQiESlCQMRDBGCcgYqCkOL3qbh62huU+fW3Nbne+65l+ee+5x7z7lb7QOfe+557p7n+Z3nnOf3PGcV4+PjNpXkBVBRURF+8zIDZ+FKXIPL8AlsQHEPr+J5PIU/Yg8+QC9B3/rIGoOiehI/wD9Rf5jEa7gHn8EqLCBJALX4Bl5Ct/E0/o7bsB7zKBXATNRVP0S3wXL9CB/FHMUCULS70W1gMvwMGzEgLoBp+C6OoFt5styJj2DQp28WvIhf4XydxFLHIM2ZZ1ajx4R6Q4Nmt28wFwYyv8dzE9/Ck74AdN8/wbeDAh/TCP45ZuBS4py/gJulKjDILLzWzSQ8bXbhJ7PhoUy5nyP4Dn3fiQawmsNhfCwoiFJbZ7Z+C2O0lqxQExZGGPnHrJM00HHIbKAvLCzgPm6m745KDXtWeBn9nev39s2koPb4zoVGqPVVs01budPTw8ICuBJboz4rM+c5VoTHQpa3mrW9Fp4kYBWjpJGKZ7k+ogE8FR7zqWZiqDEdk1JJ0ysY0OAh9TJXH9EA/LSQ8puaw5MUNHA3m2MnU5CeowH4L7GRhnRv06IRq8+uVQUEfUcDUNotZJTisdHwJAXjY9SNrRf8EA3Au2rZ9b9YVEk0aVEu6L0dnhTgHYFb4TGf/l4W4l/CkxQoMSk7+hnWRzSAn8NjPkpW3x0lvOthQQL+5spPUGeM2+CHdEkAyoRZs4VebrK/+PqAWR+jUYq7/WbffmF25bewwMtFfURH4Cz+mvnqoeuc2f69/EVXJuXq6hS41PeHLKDdVP/8Y1r6IVPuR7e6UxcdXQuUO7VxeC8oiKOKZ3XhYrNFS1gRWzJpuoc2L7EdvMyFKbjiMDy2g777c8PvBLIOtYqo4L9Qm9SNmOnTE4C2TQfRrTSZfoOzMTYA8TryJHkbmIhaht/EgGIBKO/uQ7fyZKiRzeXmYgGI51HzyG1gIuo94SXMUSoA8T7qkXYbKketMbswjyQBPI4n0W2sHM/g05hHkgBEG2on6zaYRqXODVhA0gCE3pC0eLgNJ1HvFkpsXtIEoLfi4+g2nsTvMXYrlSYA8SzqRdPtoJhaOl/AWNIGIDahkonbkU+l2+1YlHICEB+iFnm3w6ifYjUWpdwAlMm+RLdD12PYhCUpNwAxB/UvGLdjyYahxEutw0QCEAvxD8x2rlyh9J2YiQYg9JRrZrBttldUkAb1mbcjmgqie8L/GbN/ARArDyE2KP8tAAAAAElFTkSuQmCC'\r\n\r\nconst markerIconLarge =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAMAAAAhFXfZAAAC91BMVEVMaXEzeak2f7I4g7g3g7cua5gzeKg8hJo3grY4g7c3grU0gLI2frE0daAubJc2gbQwd6QzeKk2gLMtd5sxdKIua5g1frA2f7IydaM0e6w2fq41fK01eqo3grgubJgta5cxdKI1f7AydaQydaMxc6EubJgvbJkwcZ4ubZkwcJwubZgubJcydqUydKIxapgubJctbJcubZcubJcvbJYubJcvbZkubJctbJctbZcubJg2f7AubJcrbZcubJcubJcua5g3grY0fq8ubJcubJdEkdEwhsw6i88vhswuhcsuhMtBjMgthMsrg8srgss6is8qgcs8i9A9iMYtg8spgcoogMo7hcMngMonf8olfso4gr8kfck5iM8jfMk4iM8he8k1fro7itAgesk2hs8eecgzfLcofssdeMg0hc4cd8g2hcsxeLQbdsgZdcgxeLImfcszhM0vda4xgckzhM4xg84wf8Yxgs4udKsvfcQucqhUndROmdM1fK0wcZ8vb5w0eqpQm9MzeKhXoNVcpdYydKNWn9VZotVKltJFjsIwcJ1Rms9OlslLmtH///8+kc9epdYzd6dbo9VHkMM2f7FHmNBClM8ydqVcpNY9hro3gLM9hLczealQmcw3fa46f7A8gLMxc6I3eagyc6FIldJMl9JSnNRSntNNl9JPnNJFi75UnM9ZodVKksg8kM45jc09e6ZHltFBk883gbRBh7pDk9EwcaBzn784g7dKkcY2i81Om9M7j85Llc81is09g7Q4grY/j9A0eqxKmdFFltBEjcXf6fFImdBCiLxJl9FGlNFBi78yiMxVndEvbpo6js74+vx+psPP3+o/ks5HkcpGmNCjwdZCkNDM3ehYoNJEls+lxNkxh8xHks0+jdC1zd5Lg6r+/v/H2ufz9/o3jM3t8/edvdM/k89Th61OiLBSjbZklbaTt9BfptdjmL1AicBHj8hGk9FAgK1dkLNTjLRekrdClc/k7fM0icy0y9tgp9c4jc2NtM9Dlc8zicxeXZn3AAAAQ3RSTlMAHDdTb4yPA+LtnEQmC4L2EmHqB7XA0d0sr478x4/Yd5i1zOfyPkf1sLVq4Nh3FvjxopQ2/STNuFzUwFIwxKaejILpIBEV9wAABhVJREFUeF6s1NdyFEcY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'\r\n\r\nconst markerShadow =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC'\r\n\r\nconst target =\r\n 'data:image/svg+xml;base64,PHN2ZyBpZD0idGFyZ2V0LTM2OTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI1LjAyMyIgaGVpZ2h0PSIyNS4wMjMiIHZpZXdCb3g9IjAgMCAyNS4wMjMgMjUuMDIzIj4NCiAgPHBhdGggaWQ9IlRyYWPDqV82OCIgZGF0YS1uYW1lPSJUcmFjw6kgNjgiIGQ9Ik0yNS4wMjMsMTEuOTU2SDIyLjkyOWExMC40NDcsMTAuNDQ3LDAsMCwwLTkuODYxLTkuODYxVjBIMTEuOTU2VjIuMDk0YTEwLjQ0NywxMC40NDcsMCwwLDAtOS44NjEsOS44NjFIMHYxLjExMkgyLjA5NGExMC40NDcsMTAuNDQ3LDAsMCwwLDkuODYxLDkuODYxdjIuMDk0aDEuMTEyVjIyLjkyOWExMC40NDYsMTAuNDQ2LDAsMCwwLDkuODYxLTkuODYxaDIuMDk0Wk0xMy4wNjgsMjEuODE0VjE5Ljc1M0gxMS45NTZ2Mi4wNjFhOS4zMzIsOS4zMzIsMCwwLDEtOC43NDYtOC43NDZINS4yN1YxMS45NTZIMy4yMDlhOS4zMzIsOS4zMzIsMCwwLDEsOC43NDYtOC43NDZWNS4yN2gxLjExMlYzLjIwOWE5LjMzMiw5LjMzMiwwLDAsMSw4Ljc0Niw4Ljc0NkgxOS43NTN2MS4xMTJoMi4wNjFBOS4zMzIsOS4zMzIsMCwwLDEsMTMuMDY4LDIxLjgxNFoiLz4NCiAgPHBhdGggaWQ9IlRyYWPDqV82OSIgZGF0YS1uYW1lPSJUcmFjw6kgNjkiIGQ9Ik05MS4zMzUsOTUuODU5YTQuNTIzLDQuNTIzLDAsMSwxLDQuNTIzLTQuNTIzQTQuNTI4LDQuNTI4LDAsMCwxLDkxLjMzNSw5NS44NTlabTAtNy43NjRhMy4yNDEsMy4yNDEsMCwxLDAsMy4yNDEsMy4yNDFBMy4yNDQsMy4yNDQsMCwwLDAsOTEuMzM1LDg4LjA5NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03OC44MjQgLTc4LjgyNCkiLz4NCjwvc3ZnPg0K'\r\n\r\nconst afaire =\r\n 'data:image/png;base64,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'\r\n\r\nconst avoir =\r\n 'data:image/png;base64,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'\r\n\r\nconst hebergement =\r\n 'data:image/png;base64,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'\r\n\r\nconst produit =\r\n 'data:image/png;base64,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'\r\n\r\nconst service =\r\n 'data:image/png;base64,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'\r\n\r\nconst restaurant =\r\n 'data:image/png;base64,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'\r\n\r\nconst hospitalityImages = {\r\n afaire,\r\n avoir,\r\n hebergement,\r\n produit,\r\n service,\r\n restaurant\r\n}\r\n\r\nexport {\r\n hospitalityImages,\r\n pinAFaire,\r\n pinAVoir,\r\n pinOuDormir,\r\n pinOuManger,\r\n pinProduit,\r\n pinService,\r\n markerIcon,\r\n markerIconLarge,\r\n markerShadow,\r\n target\r\n}\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\nimport type { Tenant } from '../models/Tenant'\r\n\r\ntype tenantState = {\r\n activeTenant: string\r\n tenantList: { [key: string]: Tenant }\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'tenant',\r\n initialState: {\r\n activeTenant: '',\r\n tenantList: {}\r\n } as tenantState,\r\n reducers: {\r\n setActiveTenant: (\r\n state,\r\n { payload: { activeTenant } }: PayloadAction<{ activeTenant: string }>\r\n ): void => {\r\n state.activeTenant = activeTenant\r\n },\r\n setTenantList: (\r\n state,\r\n {\r\n payload: { tenantList }\r\n }: PayloadAction<{ tenantList: { [key: string]: Tenant } }>\r\n ): void => {\r\n state.tenantList = tenantList\r\n }\r\n }\r\n})\r\n\r\nexport const { setActiveTenant, setTenantList } = slice.actions\r\n\r\nexport default slice.reducer\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\n\r\ntype botSliceState = {\r\n CSSInjected: boolean\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'bot',\r\n initialState: {\r\n CSSInjected: false\r\n } as botSliceState,\r\n reducers: {\r\n setCSSInjected: (\r\n state,\r\n { payload: { CSSInjected } }: PayloadAction<{ CSSInjected: boolean }>\r\n ): void => {\r\n state.CSSInjected = CSSInjected\r\n }\r\n }\r\n})\r\n\r\nexport const { setCSSInjected } = slice.actions\r\n\r\nexport default slice.reducer\r\n","const closeBotButtonClick = (): void => {\r\n const retorikShadow = document.querySelector('#retorik-shadow')\r\n if (\r\n retorikShadow &&\r\n retorikShadow.shadowRoot &&\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='fermer']\")\r\n ) {\r\n const closeButton: HTMLElement | null =\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='fermer']\")\r\n if (closeButton) {\r\n closeButton.click()\r\n }\r\n } else if (\r\n retorikShadow &&\r\n retorikShadow.shadowRoot &&\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='dashboard']\")\r\n ) {\r\n const closeButton: HTMLElement | null =\r\n retorikShadow.shadowRoot.querySelector(\"[data-map='dashboard']\")\r\n if (closeButton) {\r\n closeButton.click()\r\n }\r\n }\r\n}\r\n\r\nconst injectShadowCSS = (): void => {\r\n const host = document.querySelector('#retorik-shadow')\r\n if (host && host.shadowRoot) {\r\n // Inject shadow dom custom CSS\r\n const sheets = Array.from(document.styleSheets)\r\n const styleToInject = sheets.filter((s: CSSStyleSheet) => {\r\n return Array.from(s.cssRules).some(\r\n (c: CSSRule) => c.cssText.indexOf('#retorik-shadow') > -1\r\n )\r\n })\r\n if (styleToInject && styleToInject.length > 0) {\r\n styleToInject.forEach((s) => {\r\n const host = document.querySelector('#retorik-shadow')\r\n const rules = Array.from(s.cssRules).filter(\r\n (c: CSSRule) =>\r\n c.cssText.indexOf('#retorik-shadow') > -1 ||\r\n c.cssText.indexOf('@keyframes') > -1\r\n )\r\n const strCss: string = rules.map((r) => r.cssText).join(' ')\r\n const style = document.createElement('style')\r\n style.innerHTML = strCss.replaceAll('#retorik-shadow', ':host')\r\n if (host && host.shadowRoot) host.shadowRoot.appendChild(style)\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport { closeBotButtonClick, injectShadowCSS }\r\n","const defaultColor = '#1999B1'\r\n\r\nconst hospitalityColors = {\r\n afaire: '#E23C2A',\r\n restaurant: '#FE942D',\r\n hebergement: '#D211A7',\r\n avoir: '#76AB2A',\r\n produit: '#AFB942',\r\n service: '#00C8BC'\r\n}\r\n\r\nconst RETORIK_URL = 'https://studio.retorik.ai'\r\nconst RETORIK_URL_DEV = 'https://dev.studio.retorik.ai'\r\n\r\nexport { defaultColor, hospitalityColors, RETORIK_URL, RETORIK_URL_DEV }\r\n","{\r\n \"ar-EG\": {\r\n \"zoomintitle\": \"تكبير\",\r\n \"zoomouttitle\": \"تصغير\",\r\n \"aroundme1\": \"إظهار النقاط المهمة في\",\r\n \"aroundme2\": \"كيلومترات من حولي\"\r\n },\r\n \"ar-SA\": {\r\n \"zoomintitle\": \"تكبير\",\r\n \"zoomouttitle\": \"تصغير\",\r\n \"aroundme1\": \"إظهار النقاط المهمة في\",\r\n \"aroundme2\": \"كيلومترات من حولي\"\r\n },\r\n \"ca-ES\": {\r\n \"zoomintitle\": \"Ampliar\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostra els PDI a\",\r\n \"aroundme2\": \"quilòmetres al meu voltant\"\r\n },\r\n \"cs-CZ\": {\r\n \"zoomintitle\": \"Přiblížit\",\r\n \"zoomouttitle\": \"Oddálit\",\r\n \"aroundme1\": \"Zobrazit BZ v\",\r\n \"aroundme2\": \"kilometry kolem mě\"\r\n },\r\n \"da-DK\": {\r\n \"zoomintitle\": \"Zoom ind\",\r\n \"zoomouttitle\": \"Zoome ud\",\r\n \"aroundme1\": \"Vis POI'er kl\",\r\n \"aroundme2\": \"kilometer omkring mig\"\r\n },\r\n \"de-AT\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"de-CH\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"de-DE\": {\r\n \"zoomintitle\": \"Hineinzoomen\",\r\n \"zoomouttitle\": \"Rauszoomen\",\r\n \"aroundme1\": \"POIs anzeigen unter\",\r\n \"aroundme2\": \"Kilometer um mich herum\"\r\n },\r\n \"en-CA\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-GB\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-HK\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-IE\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-IN\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"en-US\": {\r\n \"zoomintitle\": \"Zoom in\",\r\n \"zoomouttitle\": \"Zoom out\",\r\n \"aroundme1\": \"Show POIs at\",\r\n \"aroundme2\": \"kilometers around me\"\r\n },\r\n \"es-ES\": {\r\n \"zoomintitle\": \"Acercarse\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostrar puntos de interés en\",\r\n \"aroundme2\": \"kilómetros a mi alrededor\"\r\n },\r\n \"es-MX\": {\r\n \"zoomintitle\": \"Acercarse\",\r\n \"zoomouttitle\": \"Disminuir el zoom\",\r\n \"aroundme1\": \"Mostrar puntos de interés en\",\r\n \"aroundme2\": \"kilómetros a mi alrededor\"\r\n },\r\n \"fi-FI\": {\r\n \"zoomintitle\": \"Lähennä\",\r\n \"zoomouttitle\": \"Loitontaa\",\r\n \"aroundme1\": \"Näytä KP:t osoitteessa\",\r\n \"aroundme2\": \"kilometriä ympärilläni\"\r\n },\r\n \"fr-BE\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-CA\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-CH\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"fr-FR\": {\r\n \"zoomintitle\": \"Zoomer avant\",\r\n \"zoomouttitle\": \"Zoomer arrière\",\r\n \"aroundme1\": \"Afficher les POI à\",\r\n \"aroundme2\": \"km autour de moi\"\r\n },\r\n \"hi-IN\": {\r\n \"zoomintitle\": \"ज़ूम इन\",\r\n \"zoomouttitle\": \"ज़ूम आउट\",\r\n \"aroundme1\": \"POI यहां दिखाएं\",\r\n \"aroundme2\": \"मेरे चारों ओर किलोमीटर\"\r\n },\r\n \"hu-HU\": {\r\n \"zoomintitle\": \"Nagyítás\",\r\n \"zoomouttitle\": \"Kicsinyítés\",\r\n \"aroundme1\": \"POI-k megjelenítése itt:\",\r\n \"aroundme2\": \"kilométerre körülöttem\"\r\n },\r\n \"id-ID\": {\r\n \"zoomintitle\": \"Perbesar\",\r\n \"zoomouttitle\": \"Perkecil\",\r\n \"aroundme1\": \"Tampilkan POI di\",\r\n \"aroundme2\": \"kilometer di sekitarku\"\r\n },\r\n \"it-IT\": {\r\n \"zoomintitle\": \"Ingrandire\",\r\n \"zoomouttitle\": \"Rimpicciolisci\",\r\n \"aroundme1\": \"Mostra PDI a\",\r\n \"aroundme2\": \"chilometri intorno a me\"\r\n },\r\n \"ja-JP\": {\r\n \"zoomintitle\": \"ズームイン\",\r\n \"zoomouttitle\": \"ズームアウトする\",\r\n \"aroundme1\": \"POI を表示\",\r\n \"aroundme2\": \"私の周りのキロメートル\"\r\n },\r\n \"ko-KR\": {\r\n \"zoomintitle\": \"확대\",\r\n \"zoomouttitle\": \"축소\",\r\n \"aroundme1\": \"POI 표시 위치\",\r\n \"aroundme2\": \"내 주변 킬로미터\"\r\n },\r\n \"nb-NO\": {\r\n \"zoomintitle\": \"Zoom inn\",\r\n \"zoomouttitle\": \"Zoome ut\",\r\n \"aroundme1\": \"Vis POI kl\",\r\n \"aroundme2\": \"kilometer rundt meg\"\r\n },\r\n \"nl-BE\": {\r\n \"zoomintitle\": \"In zoomen\",\r\n \"zoomouttitle\": \"Uitzoomen\",\r\n \"aroundme1\": \"Toon POI's op\",\r\n \"aroundme2\": \"kilometer om mij heen\"\r\n },\r\n \"nl-NL\": {\r\n \"zoomintitle\": \"In zoomen\",\r\n \"zoomouttitle\": \"Uitzoomen\",\r\n \"aroundme1\": \"Toon POI's op\",\r\n \"aroundme2\": \"kilometer om mij heen\"\r\n },\r\n \"pl-PL\": {\r\n \"zoomintitle\": \"Zbliżenie\",\r\n \"zoomouttitle\": \"Pomniejsz\",\r\n \"aroundme1\": \"Pokaż POI w\",\r\n \"aroundme2\": \"kilometrów wokół mnie\"\r\n },\r\n \"pt-BR\": {\r\n \"zoomintitle\": \"Mais Zoom\",\r\n \"zoomouttitle\": \"Reduzir o zoom\",\r\n \"aroundme1\": \"Mostrar POIs em\",\r\n \"aroundme2\": \"quilômetros ao meu redor\"\r\n },\r\n \"pt-PT\": {\r\n \"zoomintitle\": \"Mais Zoom\",\r\n \"zoomouttitle\": \"Reduzir o zoom\",\r\n \"aroundme1\": \"Mostrar POIs em\",\r\n \"aroundme2\": \"quilômetros ao meu redor\"\r\n },\r\n \"ru-RU\": {\r\n \"zoomintitle\": \"Приблизить\",\r\n \"zoomouttitle\": \"Уменьшить\",\r\n \"aroundme1\": \"Показать POI на\",\r\n \"aroundme2\": \"километры вокруг меня\"\r\n },\r\n \"sv-SE\": {\r\n \"zoomintitle\": \"Zooma in\",\r\n \"zoomouttitle\": \"Zooma ut\",\r\n \"aroundme1\": \"Visa POIs kl\",\r\n \"aroundme2\": \"kilometer runt mig\"\r\n },\r\n \"th-TH\": {\r\n \"zoomintitle\": \"ขยายเข้า\",\r\n \"zoomouttitle\": \"ซูมออก\",\r\n \"aroundme1\": \"แสดง POI ได้ที่\",\r\n \"aroundme2\": \"กิโลเมตรรอบตัวฉัน\"\r\n },\r\n \"tr-TR\": {\r\n \"zoomintitle\": \"Yakınlaştır\",\r\n \"zoomouttitle\": \"Uzaklaştır\",\r\n \"aroundme1\": \"İÇN'leri şurada göster:\",\r\n \"aroundme2\": \"çevremdeki kilometrelerce\"\r\n },\r\n \"zh-CN\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n },\r\n \"zh-HK\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n },\r\n \"zh-TW\": {\r\n \"zoomintitle\": \"放大\",\r\n \"zoomouttitle\": \"缩小\",\r\n \"aroundme1\": \"显示兴趣点\",\r\n \"aroundme2\": \"我周围公里数\"\r\n }\r\n}","import React, { useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { useIsWidget, useLocale } from '@davi-ai/retorik-framework'\r\nimport { updateFilters } from '../features/mapSlice'\r\nimport { HospitalityPOIType } from '../models/POI'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport '../styles/components/MapFilter.scss'\r\nimport hospitalityTranslation from '../translations/mapFilter.json'\r\nimport { MapSettings } from '../models/Map'\r\nimport MapFilterItem from './MapFilterItem'\r\nimport { defaultColor, hospitalityColors } from '../models/constants'\r\n\r\ninterface MapFilterProps {\r\n settings?: MapSettings\r\n}\r\n\r\ninterface Translation {\r\n [locale: string]: {\r\n [type: string]: string\r\n }\r\n}\r\n\r\nconst hospitalityFullFilters = [\r\n HospitalityPOIType.afaire,\r\n HospitalityPOIType.restaurant,\r\n HospitalityPOIType.hebergement,\r\n HospitalityPOIType.avoir,\r\n HospitalityPOIType.produit,\r\n HospitalityPOIType.service\r\n]\r\n\r\nconst MapFilter = ({ settings }: MapFilterProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const locale = useLocale()\r\n const isWidget = useIsWidget()\r\n const selectedFilters = useSelector(\r\n (state: RootState) => state.map.selectedFilters\r\n )\r\n\r\n const [toggle, setToggle] = useState<boolean>(true)\r\n const [showFilters, setShowFilters] = useState<Array<string>>([])\r\n const [translation, setTranslation] = useState<Translation>()\r\n const [localizedTranslation, setLocalizedTranslation] = useState<{\r\n [type: string]: string\r\n }>()\r\n const [colors, setColors] = useState<{\r\n [type: string]: string\r\n }>()\r\n const [icons, setIcons] = useState<{ [type: string]: string }>()\r\n\r\n useEffect(() => {\r\n const tempTranslations: Translation = hospitalityTranslation\r\n const tempColors = hospitalityColors\r\n\r\n if (settings?.categories?.length) {\r\n const tempFilters: Array<string> = []\r\n const tempIcons = {}\r\n\r\n settings.categories.forEach((category) => {\r\n // Add filter\r\n tempFilters.push(category.name)\r\n\r\n // Add label translation\r\n if (category.filter?.localizedLabel) {\r\n Object.entries(category.filter.localizedLabel).forEach(\r\n ([loc, lab]) => {\r\n tempTranslations[loc][category.name] = lab\r\n }\r\n )\r\n } else {\r\n tempTranslations['fr-FR'][category.name] =\r\n category.filter?.label || 'Category'\r\n }\r\n\r\n // Add color\r\n tempColors[category.name] = category.color || defaultColor\r\n\r\n // Add icon\r\n category.filter?.iconUrl &&\r\n (tempIcons[category.name] = category.filter?.iconUrl)\r\n })\r\n\r\n if (settings.hospitalityCategories) {\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display) {\r\n // Add filter\r\n tempFilters.push(type)\r\n\r\n // Change label if needed\r\n if (values.localizedLabel) {\r\n Object.entries(values.localizedLabel).forEach(([loc, lab]) => {\r\n tempTranslations[loc][type] = lab\r\n })\r\n } else if (values.label) {\r\n tempTranslations['fr-FR'][type] = values.label\r\n }\r\n\r\n // Change color if needed\r\n values.color && (tempColors[type] = values.color)\r\n }\r\n }\r\n )\r\n }\r\n\r\n setShowFilters(tempFilters)\r\n setIcons(tempIcons)\r\n } else if (settings?.showFilter?.length) {\r\n setShowFilters(settings?.showFilter)\r\n } else if (settings?.hospitalityCategories) {\r\n const tempFilters: Array<string> = []\r\n\r\n Object.entries(settings.hospitalityCategories).forEach(\r\n ([type, values]) => {\r\n if (values.display) {\r\n // Add filter\r\n tempFilters.push(type)\r\n\r\n // Change label if needed\r\n if (values.localizedLabel) {\r\n Object.entries(values.localizedLabel).forEach(([loc, lab]) => {\r\n tempTranslations[loc][type] = lab\r\n })\r\n } else if (values.label) {\r\n tempTranslations['fr-FR'][type] = values.label\r\n }\r\n\r\n // Change color if needed\r\n values.color && (tempColors[type] = values.color)\r\n }\r\n }\r\n )\r\n\r\n setShowFilters(tempFilters)\r\n } else {\r\n setShowFilters(hospitalityFullFilters)\r\n }\r\n\r\n setTranslation(tempTranslations)\r\n setColors(tempColors)\r\n }, [settings])\r\n\r\n useEffect(() => {\r\n translation &&\r\n locale &&\r\n setLocalizedTranslation(translation[locale] || translation['fr-FR'])\r\n }, [translation, locale])\r\n\r\n const onFilterClick = (type: string): void => {\r\n if (selectedFilters.includes(type)) {\r\n dispatch(\r\n updateFilters({\r\n selectedFilters: selectedFilters.filter((f) => f !== type)\r\n })\r\n )\r\n } else {\r\n dispatch(updateFilters({ selectedFilters: [...selectedFilters, type] }))\r\n }\r\n }\r\n\r\n return (\r\n <div\r\n id='retorik-map-filters'\r\n className={`${isWidget ? 'filterContainerWidget': 'filterContainer'} ${toggle ? 'show' : 'hide'}`}>\r\n <div className='filterToggler' onClick={(): void => setToggle(!toggle)}>\r\n {hospitalityTranslation[locale]?.title ||\r\n hospitalityTranslation['fr-FR'].title}\r\n <span className={`arrow ${toggle ? 'active' : ''}`} />\r\n </div>\r\n <div className='filterMenu'>\r\n {localizedTranslation &&\r\n colors &&\r\n showFilters.map((type, key) => {\r\n return localizedTranslation[type] ? (\r\n <MapFilterItem\r\n key={key}\r\n type={type}\r\n label={localizedTranslation[type]}\r\n color={colors[type]}\r\n imageSrc={icons?.[type]}\r\n selected={selectedFilters.includes(type)}\r\n onClick={onFilterClick}\r\n />\r\n ) : (\r\n <React.Fragment key={key} />\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport { MapFilter }\r\n","import type { LatLngExpression } from 'leaflet'\r\n\r\ninterface POI {\r\n name: string\r\n type: string\r\n location: LatLngExpression\r\n contentItemId: string\r\n description?: string\r\n imageURL?: string\r\n address?: string\r\n phone?: string\r\n color?: string\r\n}\r\n\r\ninterface Place {\r\n latitude: number\r\n longitude: number\r\n telephone: string\r\n streetAddress: string\r\n postalCode: string\r\n addressLocality: string\r\n}\r\n\r\ninterface GenericPOI {\r\n displayText: string\r\n contentItemId: string\r\n place: Place\r\n thing: {\r\n name: string\r\n description: string\r\n image: {\r\n paths: string[]\r\n urls: string[]\r\n }\r\n url: {\r\n text: string\r\n url: string\r\n }\r\n }\r\n}\r\n\r\nenum HospitalityPOIType {\r\n restaurant = 'restaurant',\r\n afaire = 'afaire',\r\n avoir = 'avoir',\r\n hebergement = 'hebergement',\r\n produit = 'produit',\r\n service = 'service'\r\n}\r\n\r\nexport type { POI, Place, GenericPOI }\r\nexport { HospitalityPOIType }\r\n","{\r\n \"ar-EG\": {\r\n \"title\": \"النقاط المثيرة للاهتمام\",\r\n \"afaire\": \"أشياء لفعلها\",\r\n \"restaurant\": \"أين تأكل\",\r\n \"hebergement\": \"أو النوم\",\r\n \"avoir\": \"أشياء يمكن رؤيتها\",\r\n \"produit\": \"منتوجات محلية\",\r\n \"service\": \"خدمات\"\r\n },\r\n \"ar-SA\": {\r\n \"title\": \"النقاط المثيرة للاهتمام\",\r\n \"afaire\": \"أشياء لفعلها\",\r\n \"restaurant\": \"أين تأكل\",\r\n \"hebergement\": \"أو النوم\",\r\n \"avoir\": \"أشياء يمكن رؤيتها\",\r\n \"produit\": \"منتوجات محلية\",\r\n \"service\": \"خدمات\"\r\n },\r\n \"ca-ES\": {\r\n \"title\": \"Punts d'interés\",\r\n \"afaire\": \"Coses a fer\",\r\n \"restaurant\": \"On menjar\",\r\n \"hebergement\": \"On dormir\",\r\n \"avoir\": \"Coses per veure\",\r\n \"produit\": \"Productes locals\",\r\n \"service\": \"Serveis\"\r\n },\r\n \"cs-CZ\": {\r\n \"title\": \"Body zájmu\",\r\n \"afaire\": \"Věci ke splnění\",\r\n \"restaurant\": \"Kde jíst\",\r\n \"hebergement\": \"Nebo spát\",\r\n \"avoir\": \"Věci k vidění\",\r\n \"produit\": \"Místní produkty\",\r\n \"service\": \"Služby\"\r\n },\r\n \"da-DK\": {\r\n \"title\": \"Interessepunkter\",\r\n \"afaire\": \"Ting at gøre\",\r\n \"restaurant\": \"Hvor skal man spise\",\r\n \"hebergement\": \"Eller sove\",\r\n \"avoir\": \"Ting at se\",\r\n \"produit\": \"Lokale produkter\",\r\n \"service\": \"Tjenester\"\r\n },\r\n \"de-AT\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"de-CH\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"de-DE\": {\r\n \"title\": \"Sehenswürdigkeiten\",\r\n \"afaire\": \"Dinge die zu tun sind\",\r\n \"restaurant\": \"Wo zu essen\",\r\n \"hebergement\": \"Wo zu schlafen\",\r\n \"avoir\": \"Dinge zu sehen\",\r\n \"produit\": \"Lokale Produkte\",\r\n \"service\": \"Dienstleistungen\"\r\n },\r\n \"en-CA\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-GB\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-HK\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-IE\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-IN\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"en-US\": {\r\n \"title\": \"Points of interest\",\r\n \"afaire\": \"To do\",\r\n \"restaurant\": \"Where to eat\",\r\n \"hebergement\": \"Where to sleep\",\r\n \"avoir\": \"To see\",\r\n \"produit\": \"Local products\",\r\n \"service\": \"service\"\r\n },\r\n \"es-ES\": {\r\n \"title\": \"Puntos de interés\",\r\n \"afaire\": \"Cosas para hacer\",\r\n \"restaurant\": \"Donde comer\",\r\n \"hebergement\": \"Donde dormir\",\r\n \"avoir\": \"Cosas por ver\",\r\n \"produit\": \"Productos locales\",\r\n \"service\": \"Servicios\"\r\n },\r\n \"es-MX\": {\r\n \"title\": \"Puntos de interés\",\r\n \"afaire\": \"Cosas para hacer\",\r\n \"restaurant\": \"Donde comer\",\r\n \"hebergement\": \"Donde dormir\",\r\n \"avoir\": \"Cosas por ver\",\r\n \"produit\": \"Productos locales\",\r\n \"service\": \"Servicios\"\r\n },\r\n \"fr-BE\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-CA\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-CH\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"fr-FR\": {\r\n \"title\": \"Les points d'intérêts\",\r\n \"afaire\": \"A faire\",\r\n \"restaurant\": \"Où manger\",\r\n \"hebergement\": \"Où dormir\",\r\n \"avoir\": \"A voir\",\r\n \"produit\": \"Produits locaux\",\r\n \"service\": \"service\"\r\n },\r\n \"hi-IN\": {\r\n \"title\": \"ब्याज के अंक\",\r\n \"afaire\": \"करने के लिए काम\",\r\n \"restaurant\": \"कहाँ खाना है\",\r\n \"hebergement\": \"या सो जाओ\",\r\n \"avoir\": \"देखने लायक चीजें\",\r\n \"produit\": \"स्थानीय उत्पाद\",\r\n \"service\": \"सेवाएं\"\r\n },\r\n \"id-ID\": {\r\n \"title\": \"Tempat menarik\",\r\n \"afaire\": \"Hal yang harus dilakukan\",\r\n \"restaurant\": \"Tempat makan\",\r\n \"hebergement\": \"Atau tidur\",\r\n \"avoir\": \"Hal-hal untuk dilihat\",\r\n \"produit\": \"Produk lokal\",\r\n \"service\": \"Jasa\"\r\n },\r\n \"it-IT\": {\r\n \"title\": \"Punti di interesse\",\r\n \"afaire\": \"Cose da fare\",\r\n \"restaurant\": \"Dove mangiare\",\r\n \"hebergement\": \"Dove dormire\",\r\n \"avoir\": \"Cose da vedere\",\r\n \"produit\": \"Prodotti locali\",\r\n \"service\": \"Servizi\"\r\n },\r\n \"ja-JP\": {\r\n \"title\": \"興味がある点\",\r\n \"afaire\": \"やる事\",\r\n \"restaurant\": \"どこで食べます\",\r\n \"hebergement\": \"それとも寝るか\",\r\n \"avoir\": \"見るべきもの\",\r\n \"produit\": \"地元の特産品\",\r\n \"service\": \"サービス\"\r\n },\r\n \"ko-KR\": {\r\n \"title\": \"가볼만한 곳\",\r\n \"afaire\": \"해야 할 일\",\r\n \"restaurant\": \"먹을 곳\",\r\n \"hebergement\": \"아니면 잠\",\r\n \"avoir\": \"볼만한 것들\",\r\n \"produit\": \"지역상품\",\r\n \"service\": \"서비스\"\r\n },\r\n \"nb-NO\": {\r\n \"title\": \"Interessepunkt\",\r\n \"afaire\": \"Ting å gjøre\",\r\n \"restaurant\": \"Hvor å spise\",\r\n \"hebergement\": \"Hvor å sove\",\r\n \"avoir\": \"Ting å se\",\r\n \"produit\": \"Lokale produkter\",\r\n \"service\": \"Tjenester\"\r\n },\r\n \"nl-BE\": {\r\n \"title\": \"Interessante punten\",\r\n \"afaire\": \"Dingen om te doen\",\r\n \"restaurant\": \"Waar te eten\",\r\n \"hebergement\": \"Waar te slapen\",\r\n \"avoir\": \"Dingen om te zien\",\r\n \"produit\": \"Regionale producten\",\r\n \"service\": \"Diensten\"\r\n },\r\n \"nl-NL\": {\r\n \"title\": \"Interessante punten\",\r\n \"afaire\": \"Dingen om te doen\",\r\n \"restaurant\": \"Waar te eten\",\r\n \"hebergement\": \"Waar te slapen\",\r\n \"avoir\": \"Dingen om te zien\",\r\n \"produit\": \"Regionale producten\",\r\n \"service\": \"Diensten\"\r\n },\r\n \"pl-PL\": {\r\n \"title\": \"Ciekawe miejsca\",\r\n \"afaire\": \"Rzeczy do zrobienia\",\r\n \"restaurant\": \"Gdzie zjeść\",\r\n \"hebergement\": \"Gdzie spać\",\r\n \"avoir\": \"Rzeczy do zobaczenia\",\r\n \"produit\": \"Lokalne produkty\",\r\n \"service\": \"Usługi\"\r\n },\r\n \"pt-BR\": {\r\n \"title\": \"Pontos de interesse\",\r\n \"afaire\": \"Coisas para fazer\",\r\n \"restaurant\": \"Onde comer\",\r\n \"hebergement\": \"Onde dormir\",\r\n \"avoir\": \"Coisas para ver\",\r\n \"produit\": \"Produtos locais\",\r\n \"service\": \"Serviços\"\r\n },\r\n \"pt-PT\": {\r\n \"title\": \"Pontos de interesse\",\r\n \"afaire\": \"Coisas para fazer\",\r\n \"restaurant\": \"Onde comer\",\r\n \"hebergement\": \"Onde dormir\",\r\n \"avoir\": \"Coisas para ver\",\r\n \"produit\": \"Produtos locais\",\r\n \"service\": \"Serviços\"\r\n },\r\n \"ru-RU\": {\r\n \"title\": \"Точки интереса\",\r\n \"afaire\": \"Дела, которые необходимо сделать\",\r\n \"restaurant\": \"Где поесть\",\r\n \"hebergement\": \"Или спать\",\r\n \"avoir\": \"Вещи, чтобы увидеть\",\r\n \"produit\": \"Местные продукты\",\r\n \"service\": \"Услуги\"\r\n },\r\n \"sv-SE\": {\r\n \"title\": \"Intressepunkter\",\r\n \"afaire\": \"Saker att göra\",\r\n \"restaurant\": \"Var man ska äta\",\r\n \"hebergement\": \"Vart man ska sova\",\r\n \"avoir\": \"Saker att se\",\r\n \"produit\": \"Lokala produkter\",\r\n \"service\": \"Tjänster\"\r\n },\r\n \"th-TH\": {\r\n \"title\": \"จุดที่น่าสนใจ\",\r\n \"afaire\": \"สิ่งที่ต้องทำ\",\r\n \"restaurant\": \"กินที่ไหนดี\",\r\n \"hebergement\": \"หรือนอนหลับ\",\r\n \"avoir\": \"สิ่งที่น่าดู\",\r\n \"produit\": \"สินค้าพื้นเมือง\",\r\n \"service\": \"บริการ\"\r\n },\r\n \"tr-TR\": {\r\n \"title\": \"İlgi noktaları\",\r\n \"afaire\": \"Yapılacak şeyler\",\r\n \"restaurant\": \"Nerede yenir\",\r\n \"hebergement\": \"Ya da uyu\",\r\n \"avoir\": \"Görülecek şeyler\",\r\n \"produit\": \"Yerel ürünler\",\r\n \"service\": \"Hizmetler\"\r\n },\r\n \"zh-CN\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n },\r\n \"zh-HK\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n },\r\n \"zh-TW\": {\r\n \"title\": \"兴趣点\",\r\n \"afaire\": \"要做的事情\",\r\n \"restaurant\": \"去哪里吃饭\",\r\n \"hebergement\": \"或者睡觉\",\r\n \"avoir\": \"要看的东西\",\r\n \"produit\": \"土特产\",\r\n \"service\": \"服务\"\r\n }\r\n}\r\n","import React, { useEffect, useState } from 'react'\r\n\r\nimport {\r\n WhatToDoIcon,\r\n WhatToSeeIcon,\r\n WhereToEatIcon,\r\n WhereToSleepIcon,\r\n LocalProductsIcon,\r\n ServicesIcon\r\n} from '@davi-ai/retorik-framework-hospitality'\r\n\r\nimport '../styles/components/MapFilter.scss'\r\nimport { POIType } from '../index_module'\r\n\r\ninterface MapFilterItemProps {\r\n type: string\r\n label: string\r\n color: string\r\n imageSrc?: string\r\n selected: boolean\r\n onClick: (value: string) => void\r\n}\r\n\r\nconst MapFilterItem = ({\r\n type,\r\n label,\r\n color,\r\n imageSrc,\r\n selected,\r\n onClick\r\n}: MapFilterItemProps): JSX.Element => {\r\n const [image, setImage] = useState<JSX.Element>(<></>)\r\n\r\n useEffect(() => {\r\n switch (type) {\r\n case POIType.afaire:\r\n setImage(<WhatToDoIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.restaurant:\r\n setImage(<WhereToEatIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.hebergement:\r\n setImage(<WhereToSleepIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.avoir:\r\n setImage(<WhatToSeeIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.produit:\r\n setImage(<LocalProductsIcon className='imageFile' color='#FFF' />)\r\n break\r\n case POIType.service:\r\n setImage(<ServicesIcon className='imageFile' color='#FFF' />)\r\n break\r\n default:\r\n imageSrc\r\n ? setImage(<img src={imageSrc} className='imageFile' />)\r\n : setImage(<ServicesIcon className='imageFile' color='#FFF' />)\r\n break\r\n }\r\n }, [type, imageSrc])\r\n\r\n return (\r\n <div\r\n className={`filterCategory ${selected ? 'selectedFilter' : ''}`}\r\n onClick={(): void => onClick(type)}>\r\n <div className={`checkbox ${selected ? 'fadeIn checkbox-selected' : ''}`}>\r\n {`\\u{1F5F8}`}\r\n </div>\r\n <div\r\n className='image'\r\n style={{\r\n backgroundColor: color\r\n }}>\r\n {image}\r\n </div>\r\n <span\r\n style={{\r\n color: color,\r\n fontWeight: 700\r\n }}>\r\n {label}\r\n </span>\r\n </div>\r\n )\r\n}\r\n\r\nexport default MapFilterItem\r\n","import L, { LatLngExpression } from 'leaflet'\r\nimport React, { useEffect, useState } from 'react'\r\nimport { useMap } from 'react-leaflet'\r\nimport { iconUserLocation } from '../utils/MarkerIcons'\r\n\r\ninterface LocationMarkerProps {\r\n currentUserPos: LatLngExpression\r\n}\r\n\r\nconst LocationMarker = (props: LocationMarkerProps): JSX.Element => {\r\n const map = useMap()\r\n const currentUserPos = props.currentUserPos\r\n\r\n const [userMarker, setUserMarker] = useState<L.Marker | undefined>()\r\n useEffect(() => {\r\n if (map && currentUserPos) {\r\n map.flyTo(currentUserPos, map.getZoom())\r\n if (userMarker) userMarker.removeFrom(map)\r\n setUserMarker(L.marker(currentUserPos, { icon: iconUserLocation }))\r\n }\r\n }, [currentUserPos])\r\n\r\n useEffect(() => {\r\n if (userMarker && map) {\r\n userMarker.addTo(map)\r\n }\r\n }, [userMarker])\r\n\r\n return <></>\r\n}\r\n\r\nexport { LocationMarker }\r\n","import L from 'leaflet'\r\n\r\nimport {\r\n pinAFaire,\r\n pinAVoir,\r\n pinOuDormir,\r\n pinOuManger,\r\n pinProduit,\r\n pinService,\r\n markerIcon\r\n} from '../styles/icons/dataUrlIcons'\r\n\r\nconst iconRestaurant = new L.Icon({\r\n iconUrl: pinOuManger,\r\n iconRetinaUrl: pinOuManger,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconAFaire = new L.Icon({\r\n iconUrl: pinAFaire,\r\n iconRetinaUrl: pinAFaire,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconHebergement = new L.Icon({\r\n iconUrl: pinOuDormir,\r\n iconRetinaUrl: pinOuDormir,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconAVoir = new L.Icon({\r\n iconUrl: pinAVoir,\r\n iconRetinaUrl: pinAVoir,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconProduit = new L.Icon({\r\n iconUrl: pinProduit,\r\n iconRetinaUrl: pinProduit,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconService = new L.Icon({\r\n iconUrl: pinService,\r\n iconRetinaUrl: pinService,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n})\r\n\r\nconst iconUserLocation = new L.Icon({\r\n iconUrl: markerIcon,\r\n iconRetinaUrl: markerIcon,\r\n iconSize: [30, 40],\r\n iconAnchor: [10, 40]\r\n})\r\n\r\nconst createGenericIcon = (color: string, image?: string): any => {\r\n const html = `<svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n viewBox='0 0 58 80'\r\n xmlSpace='preserve'>\r\n <path\r\n fill='transparent'\r\n stroke='none'\r\n d='\r\n M34.000038,81.000000\r\n C22.666689,81.000000 11.833360,81.000000 1.000023,81.000000\r\n C1.000015,54.333355 1.000015,27.666706 1.000008,1.000045\r\n C20.333307,1.000030 39.666615,1.000030 58.999939,1.000015\r\n C58.999962,27.666632 58.999962,54.333263 58.999981,80.999947\r\n C50.833351,81.000000 42.666702,81.000000 34.000038,81.000000\r\n M33.475105,72.025642\r\n C39.288925,63.219608 44.824600,54.213634 50.978767,45.652252\r\n C61.407108,31.144852 55.529221,10.340107 38.228577,4.554025\r\n C28.070148,1.156609 15.409478,3.774259 8.902496,11.574289\r\n C1.940706,19.919506 0.509056,33.278297 6.117495,42.243046\r\n C13.175139,53.524258 20.588833,64.583954 27.981516,75.650635\r\n C28.341463,76.189476 30.294182,76.323311 30.938543,75.859123\r\n C31.911585,75.158157 32.385235,73.763962 33.475105,72.025642\r\n z'\r\n />\r\n <path\r\n fill=${color}\r\n opacity='1.000000'\r\n stroke='#FFF'\r\n strokeWidth='2'\r\n d='\r\n M33.273117,72.345016\r\n C32.385235,73.763962 31.911585,75.158157 30.938543,75.859123\r\n C30.294182,76.323311 28.341463,76.189476 27.981516,75.650635\r\n C20.588833,64.583954 13.175139,53.524258 6.117495,42.243046\r\n C0.509056,33.278297 1.940706,19.919506 8.902496,11.574289\r\n C15.409478,3.774259 28.070148,1.156609 38.228577,4.554025\r\n C55.529221,10.340107 61.407108,31.144852 50.978767,45.652252\r\n C44.824600,54.213634 39.288925,63.219608 33.273117,72.345016\r\n z'\r\n />\r\n </svg>`\r\n\r\n const htmlWithImage = `<div style='position:relative;'>\r\n <img src=${image} style='position:absolute;aspect-ratio:1;z-index:2;top:0;width:100%;padding:20%;'>\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n xmlnsXlink='http://www.w3.org/1999/xlink'\r\n viewBox='0 0 58 80'\r\n xmlSpace='preserve'>\r\n <path\r\n fill='transparent'\r\n stroke='none'\r\n d='\r\n M34.000038,81.000000 \r\n C22.666689,81.000000 11.833360,81.000000 1.000023,81.000000 \r\n C1.000015,54.333355 1.000015,27.666706 1.000008,1.000045 \r\n C20.333307,1.000030 39.666615,1.000030 58.999939,1.000015 \r\n C58.999962,27.666632 58.999962,54.333263 58.999981,80.999947 \r\n C50.833351,81.000000 42.666702,81.000000 34.000038,81.000000 \r\n M33.475105,72.025642 \r\n C39.288925,63.219608 44.824600,54.213634 50.978767,45.652252 \r\n C61.407108,31.144852 55.529221,10.340107 38.228577,4.554025 \r\n C28.070148,1.156609 15.409478,3.774259 8.902496,11.574289 \r\n C1.940706,19.919506 0.509056,33.278297 6.117495,42.243046 \r\n C13.175139,53.524258 20.588833,64.583954 27.981516,75.650635 \r\n C28.341463,76.189476 30.294182,76.323311 30.938543,75.859123 \r\n C31.911585,75.158157 32.385235,73.763962 33.475105,72.025642 \r\n z'\r\n />\r\n <path\r\n fill=${color}\r\n opacity='1.000000'\r\n stroke='#FFF'\r\n strokeWidth='2'\r\n d='\r\n M33.273117,72.345016 \r\n C32.385235,73.763962 31.911585,75.158157 30.938543,75.859123 \r\n C30.294182,76.323311 28.341463,76.189476 27.981516,75.650635 \r\n C20.588833,64.583954 13.175139,53.524258 6.117495,42.243046 \r\n C0.509056,33.278297 1.940706,19.919506 8.902496,11.574289 \r\n C15.409478,3.774259 28.070148,1.156609 38.228577,4.554025 \r\n C55.529221,10.340107 61.407108,31.144852 50.978767,45.652252 \r\n C44.824600,54.213634 39.288925,63.219608 33.273117,72.345016 \r\n z'\r\n />\r\n </svg></div>`\r\n\r\n return L.divIcon({\r\n html: image ? htmlWithImage : html,\r\n iconSize: new L.Point(50, 65),\r\n className: 'leaflet-div-icon'\r\n })\r\n}\r\n\r\nexport {\r\n iconRestaurant,\r\n iconAFaire,\r\n iconHebergement,\r\n iconAVoir,\r\n iconProduit,\r\n iconService,\r\n iconUserLocation,\r\n createGenericIcon\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport MarkdownIt from 'markdown-it'\r\nimport { sendMessage, useIsWidget, useLocale } from '@davi-ai/retorik-framework'\r\n\r\nimport type { RootState } from '../stores/globalStore'\r\nimport { toggleLoader } from '../features/mapSlice'\r\nimport { POI } from '../models/POI'\r\nimport { closeBotButtonClick } from '../utils/botUtils'\r\nimport { capitalizeFirstLetter } from '../utils/globalUtils'\r\nimport {\r\n setDetailOpennedByMap,\r\n setDisplayPOIFinished\r\n} from '../features/poiSlice'\r\nimport translation from '../translations/poi.json'\r\nimport Routes from './Routes'\r\nimport QRCodeComponent from './QRCodeComponent'\r\nimport { RoundIcon } from './Icons'\r\n\r\ninterface POIDetailProps {\r\n poi: POI\r\n retorikAddress: string\r\n poiClose: () => void\r\n setMapLayerData: (data: any) => void\r\n}\r\n\r\nconst md = new MarkdownIt({\r\n breaks: true,\r\n html: true,\r\n xhtmlOut: true,\r\n typographer: true,\r\n quotes: `\"\"''`\r\n})\r\n\r\nconst fadeDuration = 500\r\n\r\nconst POIDetail = ({\r\n poi,\r\n retorikAddress,\r\n poiClose,\r\n setMapLayerData\r\n}: POIDetailProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const currentUserPos = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const locale = useLocale()\r\n const isWidget = useIsWidget()\r\n const [coordinates, setCoordinates] = useState<\r\n Array<Array<number>> | undefined\r\n >(undefined)\r\n const [qrCodeUrl, setQrCodeUrl] = useState<string | null>()\r\n const [imageLoaded, setImageLoaded] = useState<boolean>(false)\r\n const [mainFadingOut, setMainFadingOut] = useState<boolean>(false)\r\n const [fadingOut, setFadingOut] = useState<boolean>(false)\r\n const mainFadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n const mainSecondFadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n const fadeOutTimerRef = useRef<NodeJS.Timeout>()\r\n\r\n useEffect(() => {\r\n if (poi.location && currentUserPos) {\r\n // Set coordinates depending on the real type of the LatLngExpression\r\n const tempCoordinates: Array<Array<number>> = []\r\n // User position first, then POI position\r\n if (Array.isArray(currentUserPos)) {\r\n tempCoordinates.push([currentUserPos[1], currentUserPos[0]])\r\n } else if (currentUserPos.lat && currentUserPos.lng) {\r\n tempCoordinates.push([currentUserPos.lng, currentUserPos.lat])\r\n }\r\n\r\n if (Array.isArray(poi.location)) {\r\n tempCoordinates.push([poi.location[1], poi.location[0]])\r\n } else if (poi.location.lat && poi.location.lng) {\r\n tempCoordinates.push([poi.location.lng, poi.location.lat])\r\n }\r\n\r\n setCoordinates(tempCoordinates)\r\n }\r\n }, [currentUserPos, poi])\r\n\r\n useEffect(() => {\r\n setImageLoaded(!poi.imageURL)\r\n }, [poi.imageURL])\r\n\r\n const showMoreHandler = (poi: POI): void => {\r\n console.log(`Retorik Map > open detail for POI ${poi.name}`)\r\n\r\n closeBotButtonClick()\r\n // Display Loader\r\n dispatch(toggleLoader({ loading: true }))\r\n // Store information that POI detail is openned by the map to handle the return\r\n dispatch(setDetailOpennedByMap({ detailOpennedByMap: true }))\r\n dispatch(setDisplayPOIFinished({ displayPOIFinished: false }))\r\n\r\n sendMessage(undefined, {\r\n identifier: poi.contentItemId,\r\n name: 'hospitality.showPoiById',\r\n searchLabel: ''\r\n })\r\n }\r\n\r\n const handlePoiClose = (): void => {\r\n setMainFadingOut(true)\r\n mainFadeOutTimerRef?.current && clearTimeout(mainFadeOutTimerRef.current)\r\n mainSecondFadeOutTimerRef?.current &&\r\n clearTimeout(mainSecondFadeOutTimerRef.current)\r\n\r\n mainFadeOutTimerRef.current = setTimeout(() => {\r\n setMainFadingOut(false)\r\n }, fadeDuration)\r\n mainSecondFadeOutTimerRef.current = setTimeout(() => {\r\n poiClose()\r\n }, fadeDuration - 100)\r\n }\r\n\r\n const handleCloseQrCode = (): void => {\r\n setFadingOut(true)\r\n fadeOutTimerRef?.current && clearTimeout(fadeOutTimerRef.current)\r\n fadeOutTimerRef.current = setTimeout(() => {\r\n setQrCodeUrl(null)\r\n setFadingOut(false)\r\n }, fadeDuration)\r\n }\r\n\r\n return (\r\n <div\r\n className={`${isWidget ? 'infoPOIPaneWidget' : 'infoPOIPane'} ${\r\n mainFadingOut ? 'fadeOut' : imageLoaded ? 'fadeIn' : ''\r\n }`}\r\n style={{\r\n visibility: imageLoaded ? 'visible' : 'hidden'\r\n }}>\r\n <span className='poiTitle'>{poi.name}</span>\r\n <span className='poiClose' onClick={handlePoiClose}>\r\n X\r\n </span>\r\n {poi.address && <span className='poiAddress'>{poi.address}</span>}\r\n {poi.phone && <span className='poiPhone'>{`\\u260E ${poi.phone}`}</span>}\r\n\r\n {/* Photo + description + button */}\r\n <div className='poiPhotoAndDescription'>\r\n {poi.imageURL && (\r\n <span className='poiPhoto'>\r\n <img\r\n onLoad={(): void => setImageLoaded(true)}\r\n onError={(): void => setImageLoaded(true)}\r\n src={`${retorikAddress}${poi.imageURL}`}\r\n alt={poi.name}\r\n />\r\n </span>\r\n )}\r\n\r\n <div className='poiDescriptionAndButton'>\r\n {/* Description if this is a string */}\r\n {typeof poi.description === 'string' && poi.description.length && (\r\n <span\r\n className='poiDesc'\r\n dangerouslySetInnerHTML={{ __html: md.render(poi.description) }}\r\n />\r\n )}\r\n <button\r\n onClick={(): void => showMoreHandler(poi)}\r\n className='poiButton'\r\n style={{\r\n color: poi.color,\r\n borderColor: poi.color\r\n }}>\r\n {translation[locale]?.showmore || translation['fr-FR'].showmore}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {coordinates && (\r\n <Routes\r\n coordinates={coordinates}\r\n setMapLayerData={setMapLayerData}\r\n setQrCodeUrl={setQrCodeUrl}\r\n color={poi.color}\r\n />\r\n )}\r\n\r\n {qrCodeUrl && (\r\n <div\r\n className={`qrcode-container ${fadingOut ? 'fadeOut' : 'fadeIn'} `}>\r\n <span className='poiClose white' onClick={handleCloseQrCode}>\r\n X\r\n </span>\r\n <div className='qrcode-text-and-icon'>\r\n <RoundIcon color='#FFF' />\r\n <div className='qrcode-text'>\r\n <div>\r\n {capitalizeFirstLetter(\r\n translation[locale]?.openroutemobile ||\r\n translation['fr-FR'].openroutemobile,\r\n locale\r\n )}\r\n </div>\r\n <div>\r\n {translation[locale]?.scanQR || translation['fr-FR'].scanQR}\r\n </div>\r\n </div>\r\n </div>\r\n <QRCodeComponent src={qrCodeUrl} />\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport { POIDetail }\r\n","const capitalizeFirstLetter = (text: string, locale = 'fr-FR'): string => {\r\n if (text?.length) {\r\n const first = text.charAt(0)\r\n const rest = text.slice(1)\r\n return first.toLocaleUpperCase(locale) + rest\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport { capitalizeFirstLetter }\r\n","{\r\n \"ar-EG\": {\r\n \"showmore\": \"اقرأ المزيد\",\r\n \"openroutemobile\": \"افتح طريق خريطة جوجل على الهاتف الذكي\",\r\n \"scanQR\": \"عن طريق مسح رمز الاستجابة السريعة\",\r\n \"route\": \"طريق\"\r\n },\r\n \"ar-SA\": {\r\n \"showmore\": \"اقرأ المزيد\",\r\n \"openroutemobile\": \"افتح طريق خريطة جوجل على الهاتف الذكي\",\r\n \"scanQR\": \"عن طريق مسح رمز الاستجابة السريعة\",\r\n \"route\": \"طريق\"\r\n },\r\n \"ca-ES\": {\r\n \"showmore\": \"Aprèn més\",\r\n \"openroutemobile\": \"obre la ruta de Google Maps al telèfon intel·ligent\",\r\n \"scanQR\": \"escanejant el QrCode\",\r\n \"route\": \"carretera\"\r\n },\r\n \"cs-CZ\": {\r\n \"showmore\": \"Zjistěte více\",\r\n \"openroutemobile\": \"otevřete trasu Google Maps na smartphonu\",\r\n \"scanQR\": \"skenováním QrCode\",\r\n \"route\": \"silnice\"\r\n },\r\n \"da-DK\": {\r\n \"showmore\": \"Lær mere\",\r\n \"openroutemobile\": \"åben Google Map-rute på smartphone\",\r\n \"scanQR\": \"ved at scanne QRCoden\",\r\n \"route\": \"vej\"\r\n },\r\n \"de-AT\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"de-CH\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"de-DE\": {\r\n \"showmore\": \"Erfahren Sie mehr\",\r\n \"openroutemobile\": \"Öffnen Sie die Google Map-Route auf dem Smartphone\",\r\n \"scanQR\": \"durch Scannen des QrCodes\",\r\n \"route\": \"Route\"\r\n },\r\n \"en-CA\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-GB\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-HK\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-IE\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-IN\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"en-US\": {\r\n \"showmore\": \"Learn more\",\r\n \"openroutemobile\": \"open Google Maps route on smartphone\",\r\n \"scanQR\": \"by scanning the QrCode\",\r\n \"route\": \"route\"\r\n },\r\n \"es-ES\": {\r\n \"showmore\": \"Más información\",\r\n \"openroutemobile\": \"abrir la ruta de Google Maps en el teléfono inteligente\",\r\n \"scanQR\": \"escaneando el QrCode\",\r\n \"route\": \"ruta\"\r\n },\r\n \"es-MX\": {\r\n \"showmore\": \"Más información\",\r\n \"openroutemobile\": \"abrir la ruta de Google Maps en el teléfono inteligente\",\r\n \"scanQR\": \"escaneando el QrCode\",\r\n \"route\": \"ruta\"\r\n },\r\n \"fi-FI\": {\r\n \"showmore\": \"Lue lisää\",\r\n \"openroutemobile\": \"avaa Google Maps -reitti älypuhelimella\",\r\n \"scanQR\": \"skannaamalla QR-koodin\",\r\n \"route\": \"tie\"\r\n },\r\n \"fr-BE\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-CA\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-CH\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"fr-FR\": {\r\n \"showmore\": \"En savoir +\",\r\n \"openroutemobile\": \"ouvrir l'itinéraire Google Maps sur mobile\",\r\n \"scanQR\": \"en scannant le QrCode\",\r\n \"route\": \"y Aller\"\r\n },\r\n \"hi-IN\": {\r\n \"showmore\": \"और अधिक जानें\",\r\n \"openroutemobile\": \"स्मार्टफोन पर गूगल मैप रूट खोलें\",\r\n \"scanQR\": \"QrCode को स्कैन करके\",\r\n \"route\": \"सड़क\"\r\n },\r\n \"hu-HU\": {\r\n \"showmore\": \"Tudj meg többet\",\r\n \"openroutemobile\": \"nyissa meg a Google Maps útvonalat az okostelefonon\",\r\n \"scanQR\": \"a QR-kód beolvasásával\",\r\n \"route\": \"út\"\r\n },\r\n \"id-ID\": {\r\n \"showmore\": \"Belajarlah lagi\",\r\n \"openroutemobile\": \"buka rute Google Maps di smartphone\",\r\n \"scanQR\": \"dengan memindai QrCode\",\r\n \"route\": \"jalan\"\r\n },\r\n \"it-IT\": {\r\n \"showmore\": \"Saperne di più\",\r\n \"openroutemobile\": \"apri il percorso di Google Maps sullo smartphone\",\r\n \"scanQR\": \"scansionando il QrCode\",\r\n \"route\": \"strada\"\r\n },\r\n \"ja-JP\": {\r\n \"showmore\": \"詳細はこちら\",\r\n \"openroutemobile\": \"スマホでGoogleマップのルートを開く\",\r\n \"scanQR\": \"Qrコードをスキャンすることで\",\r\n \"route\": \"道\"\r\n },\r\n \"ko-KR\": {\r\n \"showmore\": \"더 알아보기\",\r\n \"openroutemobile\": \"스마트폰에서 Google 지도 경로 열기\",\r\n \"scanQR\": \"QrCode를 스캔하여\",\r\n \"route\": \"도로\"\r\n },\r\n \"nb-NO\": {\r\n \"showmore\": \"Lære mer\",\r\n \"openroutemobile\": \"åpne Google Maps-ruten på smarttelefonen\",\r\n \"scanQR\": \"ved å skanne QRCode\",\r\n \"route\": \"vei\"\r\n },\r\n \"nl-BE\": {\r\n \"showmore\": \"Meer informatie gebruiksaanwijzing\",\r\n \"openroutemobile\": \"open Google Maps-route op smartphone\",\r\n \"scanQR\": \"door de QRCode te scannen\",\r\n \"route\": \"weg\"\r\n },\r\n \"nl-NL\": {\r\n \"showmore\": \"Meer informatie gebruiksaanwijzing\",\r\n \"openroutemobile\": \"open Google Maps-route op smartphone\",\r\n \"scanQR\": \"door de QRCode te scannen\",\r\n \"route\": \"weg\"\r\n },\r\n \"pl-PL\": {\r\n \"showmore\": \"Ucz się więcej\",\r\n \"openroutemobile\": \"otwórz trasę Map Google na smartfonie\",\r\n \"scanQR\": \"poprzez zeskanowanie kodu QR\",\r\n \"route\": \"droga\"\r\n },\r\n \"pt-BR\": {\r\n \"showmore\": \"Saber mais\",\r\n \"openroutemobile\": \"abra a rota do Google Maps no smartphone\",\r\n \"scanQR\": \"digitalizando o QrCode\",\r\n \"route\": \"estrada\"\r\n },\r\n \"pt-PT\": {\r\n \"showmore\": \"Saber mais\",\r\n \"openroutemobile\": \"abra a rota do Google Maps no smartphone\",\r\n \"scanQR\": \"digitalizando o QrCode\",\r\n \"route\": \"estrada\"\r\n },\r\n \"ru-RU\": {\r\n \"showmore\": \"Узнать больше\",\r\n \"openroutemobile\": \"открыть маршрут Google Maps на смартфоне\",\r\n \"scanQR\": \"отсканировав QrCode\",\r\n \"route\": \"дорога\"\r\n },\r\n \"sv-SE\": {\r\n \"showmore\": \"Läs mer\",\r\n \"openroutemobile\": \"odprite Google Maps route na pametnem telefonu\",\r\n \"scanQR\": \"s skeniranjem QrCode\",\r\n \"route\": \"cesta\"\r\n },\r\n \"th-TH\": {\r\n \"showmore\": \"เรียนรู้เพิ่มเติม\",\r\n \"openroutemobile\": \"เปิดเส้นทาง Google Maps บนสมาร์ทโฟน\",\r\n \"scanQR\": \"โดยการสแกน QrCode\",\r\n \"route\": \"ถนน\"\r\n },\r\n \"tr-TR\": {\r\n \"showmore\": \"Daha fazla bilgi edin\",\r\n \"openroutemobile\": \"akıllı telefonda Google Haritalar rotasını aç\",\r\n \"scanQR\": \"QrCode'u tarayarak\",\r\n \"route\": \"yol\"\r\n },\r\n \"zh-CN\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n },\r\n \"zh-HK\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n },\r\n \"zh-TW\": {\r\n \"showmore\": \"了解更多\",\r\n \"openroutemobile\": \"在智能手机上打开 Google 地图路线\",\r\n \"scanQR\": \"扫描二维码\",\r\n \"route\": \"路\"\r\n }\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport QRCode from 'qrcode'\r\nimport type { FeatureCollection } from 'geojson'\r\nimport { useIsUsedOnBorne, useLocale } from '@davi-ai/retorik-framework'\r\nimport { capitalizeFirstLetter } from '../utils/globalUtils'\r\nimport translation from '../translations/poi.json'\r\nimport RoutesItem from './RoutesItem'\r\nimport { OpenLocationIcon } from './Icons'\r\n\r\ninterface RoutesProps {\r\n coordinates: number[][]\r\n setMapLayerData: (data: FeatureCollection | undefined) => void\r\n color?: string\r\n setQrCodeUrl: (url: string) => void\r\n}\r\n\r\nconst openRoute = 'https://api.openrouteservice.org/v2/directions'\r\nconst openRouteAPIKey =\r\n '5b3ce3597851110001cf62483cfd6bd46f934b7d96f108a35e0f08b8'\r\nconst googleMapsAddress = 'https://www.google.com/maps/dir/?api=1&'\r\n\r\nconst Routes = ({\r\n coordinates,\r\n setMapLayerData,\r\n color,\r\n setQrCodeUrl\r\n}: RoutesProps): JSX.Element => {\r\n const isUsedOnBorne = useIsUsedOnBorne()\r\n const locale = useLocale()\r\n const [drivingCar, setDrivingCar] = useState<FeatureCollection | undefined>(\r\n undefined\r\n )\r\n const [cyclingRegular, setCyclingRegular] = useState<\r\n FeatureCollection | undefined\r\n >(undefined)\r\n const [footWalking, setFootWalking] = useState<FeatureCollection | undefined>(\r\n undefined\r\n )\r\n const [currentChosen, setCurrentChosen] = useState<string | undefined>(\r\n undefined\r\n )\r\n\r\n const travelModeRef = useRef<string>()\r\n\r\n /**\r\n * On component mount :\r\n * - call methods to retrieve data from openroute API\r\n */\r\n useEffect(() => {\r\n if (coordinates) {\r\n calculateForProfile('driving-car')\r\n calculateForProfile('cycling-regular')\r\n calculateForProfile('foot-walking')\r\n }\r\n }, [coordinates])\r\n\r\n /**\r\n * On currentChosen state change :\r\n * - switch on currentChosen value to display the associated data on the map\r\n */\r\n useEffect(() => {\r\n switch (currentChosen) {\r\n case 'drivingCar':\r\n drivingCar && drivingCar.features && setMapLayerData(drivingCar)\r\n travelModeRef.current = 'driving'\r\n break\r\n case 'cyclingRegular':\r\n cyclingRegular &&\r\n cyclingRegular.features &&\r\n setMapLayerData(cyclingRegular)\r\n travelModeRef.current = 'bicycling'\r\n break\r\n case 'footWalking':\r\n footWalking && footWalking.features && setMapLayerData(footWalking)\r\n travelModeRef.current = 'walking'\r\n break\r\n default:\r\n break\r\n }\r\n }, [currentChosen, drivingCar, cyclingRegular, footWalking])\r\n\r\n /**\r\n * On drivingCar state change :\r\n * - if driving car data were retrieved and no course has been chosen, set currentChosen state to 'driving-car'\r\n */\r\n useEffect(() => {\r\n drivingCar && !currentChosen && setCurrentChosen('drivingCar')\r\n }, [drivingCar])\r\n\r\n /**\r\n * On call :\r\n * - call the openroute API to retrieve data for the current course\r\n * @param profile : string\r\n */\r\n const calculateForProfile = async (profile: string): Promise<void> => {\r\n const url = `${openRoute}/${profile}/geojson`\r\n const data = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n Authorization: openRouteAPIKey,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({ coordinates: coordinates })\r\n })\r\n .then((result) => {\r\n return result.json()\r\n })\r\n .catch(() => {\r\n return null\r\n })\r\n\r\n if (data && !data.error) {\r\n switch (profile) {\r\n case 'driving-car':\r\n setDrivingCar(data)\r\n break\r\n case 'cycling-regular':\r\n setCyclingRegular(data)\r\n break\r\n case 'foot-walking':\r\n setFootWalking(data)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n const handleClick = async (): Promise<void> => {\r\n if (travelModeRef?.current && coordinates.length === 2) {\r\n // Create an URL to Google Maps with coordinates and travelling mode\r\n const coordinatesInUrl = `origin=${coordinates[0][1]},${coordinates[0][0]}&destination=${coordinates[1][1]},${coordinates[1][0]}`\r\n const fullUrl = `${googleMapsAddress}${coordinatesInUrl}&travelmode=${travelModeRef.current}`\r\n\r\n if (isUsedOnBorne) {\r\n const url = await QRCode.toDataURL(fullUrl)\r\n setQrCodeUrl(url)\r\n } else {\r\n // If we are not on a borne, open a new tab in browser\r\n window.open(fullUrl, '_blank')\r\n }\r\n }\r\n }\r\n\r\n return drivingCar || cyclingRegular || footWalking ? (\r\n <div className='routes-container'>\r\n {/* Data per choice : Car / Cycle / Foot */}\r\n <div className='routes-data'>\r\n <RoutesItem\r\n summary={{\r\n type: 'drivingCar',\r\n distance: drivingCar?.features?.length\r\n ? drivingCar.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: drivingCar?.features?.length\r\n ? drivingCar.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'drivingCar'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n <RoutesItem\r\n summary={{\r\n type: 'cyclingRegular',\r\n distance: cyclingRegular?.features?.length\r\n ? cyclingRegular.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: cyclingRegular?.features?.length\r\n ? cyclingRegular.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'cyclingRegular'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n <RoutesItem\r\n summary={{\r\n type: 'footWalking',\r\n distance: footWalking?.features?.length\r\n ? footWalking.features[0].properties?.summary?.distance\r\n : undefined,\r\n duration: footWalking?.features?.length\r\n ? footWalking.features[0].properties?.summary?.duration\r\n : undefined\r\n }}\r\n chosen={currentChosen === 'footWalking'}\r\n color={color}\r\n onClick={setCurrentChosen}\r\n />\r\n </div>\r\n\r\n {/* Redirection button */}\r\n <button className='route-button' onClick={handleClick}>\r\n <OpenLocationIcon className='route-icon-medium' />\r\n {capitalizeFirstLetter(\r\n translation[locale]?.route || translation['fr-FR'].route,\r\n locale\r\n )}\r\n </button>\r\n </div>\r\n ) : (\r\n <React.Fragment />\r\n )\r\n}\r\n\r\nexport default Routes\r\n","import React from 'react'\r\nimport { getDistanceAsString, getTimeAsString } from '../utils/routeUtils'\r\nimport * as Icons from './Icons'\r\n\r\ninterface Summary {\r\n type: string\r\n distance?: number\r\n duration?: number\r\n}\r\n\r\ninterface RoutesItemProps {\r\n summary: Summary\r\n chosen?: boolean\r\n color?: string\r\n onClick: (type: string) => void\r\n}\r\n\r\nconst RoutesItem = ({\r\n summary,\r\n chosen,\r\n color,\r\n onClick\r\n}: RoutesItemProps): JSX.Element => {\r\n return (\r\n <div\r\n className='route-item-container'\r\n onClick={(): void => onClick(summary.type)}>\r\n <div className='route-item'>\r\n <div className='route-item-icon'>\r\n {/* Colored circle + triangle atop */}\r\n <div\r\n className='route-item-icon-circle'\r\n style={{\r\n backgroundColor: chosen ? color : '#EFEDF0'\r\n }}\r\n />\r\n <div\r\n className={`route-item-icon-triangle ${\r\n summary.type === 'drivingCar'\r\n ? 'route-item-icon-triangle-car'\r\n : 'route-item-icon-triangle-other'\r\n }`}>\r\n <Icons.TriangleIcon\r\n className='route-icon-smallest'\r\n color={chosen ? color : 'transparent'}\r\n />\r\n </div>\r\n\r\n {summary.type === 'drivingCar' && (\r\n <Icons.DrivingCarIcon\r\n className='route-icon-medium route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n {summary.type === 'cyclingRegular' && (\r\n <Icons.CyclingRegularIcon\r\n className='route-icon route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n {summary.type === 'footWalking' && (\r\n <Icons.FootWalkingIcon\r\n className='route-icon route-index'\r\n color={chosen ? '#FFF' : '#535252'}\r\n />\r\n )}\r\n </div>\r\n <div className='route-item-text'>\r\n {/* Duration */}\r\n <div className='route-item-duration'>\r\n {getTimeAsString(summary?.duration)}\r\n </div>\r\n\r\n {/* Distance */}\r\n <div className='route-item-distance'>\r\n {getDistanceAsString(summary?.distance)}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default RoutesItem\r\n","const getTimeAsString = (time: number | undefined): string => {\r\n if (typeof time !== 'number') {\r\n return 'NC'\r\n }\r\n\r\n if (time < 1) return 'NC'\r\n if (time < 60) return `${time} s`\r\n if (time < 3600) return `${Math.ceil(time / 60)} min`\r\n if (time === 3600) return `1 h`\r\n if (time > 3600) {\r\n const hours = Math.floor(time / 3600)\r\n const minutes = Math.ceil((time - hours * 3600) / 60)\r\n return `${hours} h ${\r\n minutes === 60 ? 59 : minutes < 10 ? `0${minutes}` : minutes\r\n }`\r\n }\r\n\r\n return 'NC'\r\n}\r\n\r\nconst getDistanceAsString = (distance: number | undefined): string => {\r\n if (typeof distance !== 'number') {\r\n return 'NC'\r\n }\r\n\r\n if (distance <= 0) return '0 m'\r\n if (distance < 1) return `${distance * 100} cm`\r\n if (distance < 1000) return `${distance} m`\r\n if (distance >= 1000) return `${(Math.ceil(distance / 1000) * 10) / 10} km`\r\n\r\n return 'NC'\r\n}\r\n\r\nexport { getTimeAsString, getDistanceAsString }\r\n","import CyclingRegularIcon from './CyclingRegularIcon'\r\nimport DrivingCarIcon from './DrivingCarIcon'\r\nimport FootWalkingIcon from './FootWalkingIcon'\r\nimport OpenLocationIcon from './OpenLocationIcon'\r\nimport RoundIcon from './RoundIcon'\r\nimport TriangleIcon from './TriangleIcon'\r\n\r\nexport {\r\n CyclingRegularIcon,\r\n DrivingCarIcon,\r\n FootWalkingIcon,\r\n OpenLocationIcon,\r\n RoundIcon,\r\n TriangleIcon\r\n}\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst CyclingRegularIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <g transform='translate(0.5 -1.484)'>\r\n <path\r\n d='M20.5,6.789a2.645,2.645,0,1,0-2.645-2.645A2.653,2.653,0,0,0,20.5,6.789Zm-13.885,8.6a6.612,6.612,0,1,0,0,13.224,6.612,6.612,0,1,0,0-13.224Zm0,11.24a4.628,4.628,0,1,1,0-9.257,4.628,4.628,0,1,1,0,9.257ZM14.282,13.4l3.174-3.174,1.058,1.058a9.264,9.264,0,0,0,6.744,2.777V11.418A6.57,6.57,0,0,1,20.5,9.434L17.984,6.922a3.242,3.242,0,0,0-2.116-.793,2.219,2.219,0,0,0-1.851.793l-3.7,3.7a2.611,2.611,0,0,0-.793,1.851,2.219,2.219,0,0,0,.793,1.851l4.232,3.7v6.612h2.645v-8.2Zm10.843,1.984A6.612,6.612,0,1,0,31.737,22,6.548,6.548,0,0,0,25.125,15.385Zm0,11.24A4.628,4.628,0,1,1,29.753,22,4.685,4.685,0,0,1,25.125,26.625Z'\r\n transform='translate(0 0.484)'\r\n fill={color || '#fff'}\r\n />\r\n </g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport default CyclingRegularIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst DrivingCarIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <path\r\n id='car'\r\n d='M32.385,71.254H28.507L27.43,68.559A7.217,7.217,0,0,0,20.7,64H12.471a7.219,7.219,0,0,0-6.735,4.559L4.658,71.254H.781a.777.777,0,0,0-.754.966l.389,1.554a.777.777,0,0,0,.754.589h1.3a4.116,4.116,0,0,0-1.43,3.109V80.58A4.111,4.111,0,0,0,2.076,83.3v3.5a2.073,2.073,0,0,0,2.072,2.072H6.221A2.073,2.073,0,0,0,8.293,86.8V84.725h16.58V86.8a2.073,2.073,0,0,0,2.072,2.072h2.072A2.073,2.073,0,0,0,31.09,86.8V83.3a4.109,4.109,0,0,0,1.036-2.716V77.471A4.118,4.118,0,0,0,30.7,74.362H32a.777.777,0,0,0,.754-.589l.389-1.554a.778.778,0,0,0-.754-.966ZM9.584,70.1a3.109,3.109,0,0,1,2.887-1.954H20.7A3.109,3.109,0,0,1,23.582,70.1l1.291,3.227H8.293ZM6.221,80.567a2.066,2.066,0,1,1,0-4.132,3.987,3.987,0,0,1,3.109,3.1c0,1.24-1.865,1.033-3.109,1.033Zm20.725,0c-1.243,0-3.109.207-3.109-1.033a3.987,3.987,0,0,1,3.109-3.1,2.066,2.066,0,1,1,0,4.132Z'\r\n transform='translate(0.501 -63.5)'\r\n fill={color || '#fff'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default DrivingCarIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst FootWalkingIcon = ({\r\n className,\r\n color\r\n}: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='-6 0 34.168 29.135'\r\n className={className || 'route-icon'}>\r\n <path\r\n d='M11.4,5.249A2.625,2.625,0,1,0,8.772,2.625,2.625,2.625,0,0,0,11.4,5.249ZM16.564,13.4l-1.274-.645-.53-1.608A5.962,5.962,0,0,0,9.171,7c-1.968-.005-3.057.552-5.1,1.378A5.216,5.216,0,0,0,1.352,10.9l-.366.744a1.755,1.755,0,0,0,.776,2.346,1.726,1.726,0,0,0,2.324-.782l.366-.744a1.738,1.738,0,0,1,.9-.842l1.465-.591-.831,3.319A3.512,3.512,0,0,0,6.8,17.568l3.275,3.576a3.529,3.529,0,0,1,.815,1.515l1,4.008a1.75,1.75,0,0,0,3.4-.848l-1.214-4.866a3.5,3.5,0,0,0-.815-1.515l-2.488-2.718.94-3.756.3.9a3.487,3.487,0,0,0,1.733,2.023l1.274.645a1.726,1.726,0,0,0,2.324-.782,1.77,1.77,0,0,0-.782-2.351ZM4.048,21.1a3.393,3.393,0,0,1-.776,1.176L.538,25.01a1.75,1.75,0,1,0,2.472,2.477l3.248-3.248a3.554,3.554,0,0,0,.776-1.176l.738-1.848c-3.024-3.3-2.116-2.286-2.592-2.936L4.048,21.1Z'\r\n transform='translate(0.612 0.5)'\r\n fill={color || '#fff'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default FootWalkingIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst OpenLocationIcon = ({ className }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 29.771 29.771'\r\n className={className || 'route-icon-small'}>\r\n <path d='M29.771,0,0,14.886l11.164,3.721,3.721,11.164Z' />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default OpenLocationIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst RoundIcon = ({ color }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 20.306 20.306'\r\n style={{\r\n height: '1rem',\r\n marginTop: '0.2rem'\r\n }}>\r\n <g transform='translate(-2 -2)'>\r\n <path\r\n d='M21.306,12.153A9.153,9.153,0,1,1,12.153,3a9.153,9.153,0,0,1,9.153,9.153Z'\r\n transform='translate(0 0)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n <path\r\n d='M18,21.661V18'\r\n transform='translate(-5.847 -5.847)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n <path\r\n d='M18,12h0'\r\n transform='translate(-5.847 -3.508)'\r\n fill='none'\r\n stroke={color || '#000'}\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='2'\r\n />\r\n </g>\r\n </svg>\r\n )\r\n}\r\n\r\nexport default RoundIcon\r\n","import React from 'react'\r\nimport type { IconDefaultProps } from '../../models/Map'\r\n\r\nconst TriangleIcon = ({ className, color }: IconDefaultProps): JSX.Element => {\r\n return (\r\n <svg\r\n xmlns='http://www.w3.org/2000/svg'\r\n viewBox='0 0 16 12'\r\n className={className || 'route-icon-verysmall'}>\r\n <path\r\n d='M6.336,2.5a2,2,0,0,1,3.328,0l4.263,6.394A2,2,0,0,1,12.263,12H3.737A2,2,0,0,1,2.073,8.891Z'\r\n fill={color || 'transparent'}\r\n />\r\n </svg>\r\n )\r\n}\r\n\r\nexport default TriangleIcon\r\n","import React from 'react'\r\n\r\ninterface QRCodeComponentProps {\r\n src: string\r\n alt?: string\r\n}\r\n\r\nconst QRCodeComponent = React.forwardRef<\r\n HTMLImageElement,\r\n QRCodeComponentProps\r\n>(({ src, alt }, ref) => {\r\n return (\r\n <img\r\n ref={ref}\r\n src={src}\r\n style={{\r\n height: '100%',\r\n maxHeight: '120px'\r\n }}\r\n alt={alt || 'QR Code'}\r\n />\r\n )\r\n})\r\n\r\nexport default QRCodeComponent\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport '../styles/components/Map.scss'\r\n\r\nconst CustomLoader = (): JSX.Element => {\r\n const [visible, setVisible] = useState<boolean>(false)\r\n const timerRef = useRef<NodeJS.Timeout | null>(null)\r\n\r\n useEffect(() => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n timerRef.current = setTimeout(() => {\r\n setVisible(true)\r\n }, 4000)\r\n\r\n return (): void => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n }\r\n }, [])\r\n\r\n return (\r\n <div className='loader-container'>\r\n <div className='loader' aria-hidden='true' />\r\n {visible ? (\r\n <div\r\n className='exit-loader'\r\n onClick={(): boolean =>\r\n document.dispatchEvent(new CustomEvent('retorikMapCloseLoader'))\r\n }>\r\n {`\\u2715`}\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default CustomLoader\r\n","import React, { useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { useLocale } from '@davi-ai/retorik-framework'\r\n\r\nimport type { LatLngLiteral } from 'leaflet'\r\nimport type { RootState } from '../stores/globalStore'\r\nimport type { CustomCategory } from '../models/Map'\r\n\r\nimport { POI } from '../models/POI'\r\nimport { getToken, useGetListPOIQuery } from '../services/tenantService'\r\nimport { setPoiList as slicePoiListSet } from '../features/poiSlice'\r\n\r\ninterface POILoaderProps {\r\n retorikName: string\r\n useDevTenant: boolean\r\n customCategories?: Array<CustomCategory>\r\n hospitalityCategories?: Array<string>\r\n}\r\n\r\nconst POILoader = ({\r\n retorikName,\r\n useDevTenant,\r\n customCategories,\r\n hospitalityCategories\r\n}: POILoaderProps): JSX.Element => {\r\n const locale = useLocale()\r\n const currentUserLocation = useSelector(\r\n (state: RootState) => state.map.currentUserLocation\r\n )\r\n const [token, setToken] = useState<string | undefined>(undefined)\r\n const [poiList, setPoiList] = useState<POI[]>([])\r\n const dispatch = useDispatch()\r\n\r\n /**\r\n * Get token once to be used in all POI-retrieving queries\r\n */\r\n const callGetToken = async (): Promise<void> => {\r\n const t = await getToken()\r\n t && setToken(t)\r\n }\r\n\r\n useEffect(() => {\r\n callGetToken()\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (token && locale && currentUserLocation) {\r\n // Reset POI list on locale change\r\n setPoiList([])\r\n\r\n // Format user location into standard object with latitude and longitude\r\n const position = {\r\n latitude: 0,\r\n longitude: 0\r\n }\r\n if (\r\n Array.isArray(currentUserLocation) &&\r\n currentUserLocation.length > 1\r\n ) {\r\n position.latitude = currentUserLocation[0]\r\n position.longitude = currentUserLocation[1]\r\n } else {\r\n position.latitude = (currentUserLocation as LatLngLiteral).lat\r\n position.longitude = (currentUserLocation as LatLngLiteral).lng\r\n }\r\n\r\n useGetListPOIQuery({\r\n token: token,\r\n useDevTenant: useDevTenant,\r\n locale: locale.toLowerCase(),\r\n tenant: retorikName,\r\n ...position,\r\n customCategories: customCategories,\r\n hospitalityCategories: hospitalityCategories,\r\n callBack: setPoiList\r\n })\r\n }\r\n }, [token, locale, currentUserLocation])\r\n\r\n useEffect(() => {\r\n dispatch(slicePoiListSet({ poiList: poiList }))\r\n }, [poiList])\r\n\r\n return <></>\r\n}\r\n\r\nexport { POILoader }\r\n","import type { CustomCategory } from '../models/Map'\r\nimport { POI, Place, GenericPOI } from '../models/POI'\r\nimport {\r\n createGenericQuery,\r\n generateHospitalityPoiQuery\r\n} from '../utils/poiUtils'\r\nimport {\r\n defaultColor,\r\n hospitalityColors,\r\n RETORIK_URL,\r\n RETORIK_URL_DEV\r\n} from '../models/constants'\r\n\r\ninterface GetListPOI {\r\n token: string\r\n useDevTenant: boolean\r\n locale: string\r\n tenant: string\r\n latitude: number\r\n longitude: number\r\n customCategories?: Array<CustomCategory>\r\n hospitalityCategories?: Array<string>\r\n callBack: (poiArray: Array<POI>) => void\r\n}\r\n\r\nconst URL_TOKEN_API = 'https://auth.retorik.ai/oidc/token'\r\nconst API_CLIENT_ID = 'asklea'\r\nconst API_CLIENT_SERCRET = '388D45FA-B36B-4988-BA59-B187D329C207'\r\n\r\nexport const getToken = async (): Promise<any> => {\r\n const token = (\r\n await fetch(URL_TOKEN_API, {\r\n method: 'POST',\r\n body: `grant_type=client_credentials&scope=profile&client_id=${API_CLIENT_ID}&client_secret=${API_CLIENT_SERCRET}`,\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n })\r\n ).json()\r\n return token\r\n}\r\n\r\nconst getAddressFromPlaceData = (data: Place): string => {\r\n return `${data.streetAddress || ''} ${data.postalCode || ''} ${\r\n data.addressLocality || ''\r\n }`\r\n}\r\n\r\nexport const useGetListPOIQuery = async ({\r\n token,\r\n useDevTenant,\r\n locale,\r\n tenant,\r\n latitude,\r\n longitude,\r\n customCategories,\r\n hospitalityCategories,\r\n callBack\r\n}: GetListPOI): Promise<void> => {\r\n const urlPOIAPI = useDevTenant\r\n ? `${RETORIK_URL_DEV}/${tenant}/api/graphql`\r\n : `${RETORIK_URL}/${tenant}/api/graphql`\r\n\r\n if (tenant) {\r\n const commonData = {\r\n url: urlPOIAPI,\r\n token,\r\n locale,\r\n from: 0,\r\n size: undefined,\r\n latitude,\r\n longitude,\r\n callBack\r\n }\r\n // If categories are provided, load only these. Otherwise load all hospitality ones.\r\n if (customCategories?.length) {\r\n customCategories.forEach((category) =>\r\n fetchCustomPoiType({\r\n type: category.name,\r\n color: category.color || defaultColor,\r\n ...commonData\r\n })\r\n )\r\n }\r\n\r\n if (hospitalityCategories?.length) {\r\n hospitalityCategories.forEach((category) =>\r\n fetchHospitalityPoiType({ type: category, ...commonData })\r\n )\r\n }\r\n }\r\n}\r\n\r\nconst fetchHospitalityPoiType = async ({\r\n type,\r\n url,\r\n token,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude,\r\n callBack\r\n}): Promise<void> => {\r\n const processedSize = size || 100\r\n const result: POI[] = []\r\n const fetchedData = await fetch(url, {\r\n method: 'POST',\r\n body: generateHospitalityPoiQuery({\r\n type,\r\n locale,\r\n from,\r\n size: processedSize,\r\n latitude,\r\n longitude\r\n }),\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-type': 'application/graphql; charset=UTF-8'\r\n }\r\n })\r\n .then((response) => response.json())\r\n .catch((error) => console.warn(error))\r\n\r\n if (fetchedData?.data) {\r\n const dataKeys = Object.keys(fetchedData.data)\r\n if (dataKeys.length) {\r\n const data = fetchedData.data[dataKeys[0]]\r\n data?.length &&\r\n data.forEach((e: GenericPOI) => {\r\n e.place?.latitude &&\r\n e.place?.longitude &&\r\n result.push({\r\n name: e.displayText,\r\n type: type,\r\n location: { lat: e.place.latitude, lng: e.place.longitude },\r\n contentItemId: e.contentItemId,\r\n description: e.thing.description,\r\n imageURL: e.thing.image?.urls?.length\r\n ? e.thing.image.urls[0]\r\n : undefined,\r\n address: getAddressFromPlaceData(e.place),\r\n phone: e.place?.telephone,\r\n color: hospitalityColors[type]\r\n })\r\n })\r\n }\r\n }\r\n\r\n // If we get results, we call once again to retrieve some more results, until all of them were retrieved\r\n if (result.length) {\r\n callBack((current: Array<POI>) => [...current, ...result])\r\n fetchHospitalityPoiType({\r\n type,\r\n url,\r\n token,\r\n locale,\r\n from: from + processedSize,\r\n size: processedSize,\r\n latitude,\r\n longitude,\r\n callBack\r\n })\r\n }\r\n}\r\n\r\nconst fetchCustomPoiType = async ({\r\n type,\r\n color,\r\n url,\r\n token,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude,\r\n callBack\r\n}): Promise<void> => {\r\n console.log('token : ', token)\r\n const processedSize = size || 100\r\n const result: POI[] = []\r\n const fetchedData = await fetch(url, {\r\n method: 'POST',\r\n body: createGenericQuery({\r\n type,\r\n locale,\r\n from,\r\n size: processedSize,\r\n latitude,\r\n longitude\r\n }),\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n 'Content-type': 'application/graphql; charset=UTF-8'\r\n }\r\n })\r\n .then((response) => response.json())\r\n .catch((error) => console.warn(error))\r\n\r\n const data = fetchedData?.data?.[`geoDistanceSorted${type}`]\r\n data &&\r\n data.forEach((e: GenericPOI) => {\r\n e.place?.latitude &&\r\n e.place?.longitude &&\r\n result.push({\r\n name: e.displayText,\r\n type: type,\r\n location: { lat: e.place.latitude, lng: e.place.longitude },\r\n contentItemId: e.contentItemId,\r\n description: e.thing.description,\r\n imageURL: e.thing.image?.urls?.length\r\n ? e.thing.image.urls[0]\r\n : undefined,\r\n address: getAddressFromPlaceData(e.place),\r\n phone: e.place?.telephone,\r\n color: color\r\n })\r\n })\r\n\r\n // If we get results, we call once again to retrieve some more results, until all of them were retrieved\r\n if (result.length) {\r\n callBack((current: Array<POI>) => [...current, ...result])\r\n fetchCustomPoiType({\r\n type,\r\n color,\r\n url,\r\n token,\r\n locale,\r\n from: from + processedSize,\r\n size: processedSize,\r\n latitude,\r\n longitude,\r\n callBack\r\n })\r\n }\r\n}\r\n","import { HospitalityPOIType } from '../models/POI'\r\nimport { gql } from 'graphql-request'\r\n\r\ninterface QueryParameters {\r\n from: number\r\n size: number\r\n locale: string\r\n latitude: number\r\n longitude: number\r\n}\r\n\r\nexport interface GeneratePOIQueryProps {\r\n type: string\r\n locale: string\r\n from: number\r\n size: number\r\n latitude: number\r\n longitude: number\r\n}\r\n\r\nconst place = `place {\r\n latitude\r\n longitude\r\n telephone\r\n streetAddress\r\n postalCode\r\n addressLocality\r\n}`\r\n\r\nconst thing = `thing {\r\n name\r\n alternateName\r\n categories\r\n description\r\n image {\r\n urls\r\n paths\r\n }\r\n url {\r\n text\r\n url\r\n }\r\n}`\r\n\r\nconst commonFields = `\r\n contentItemId\r\n displayText\r\n ${place}\r\n ${thing}\r\n`\r\n\r\nconst createGenericQuery = ({\r\n type,\r\n from,\r\n size,\r\n locale,\r\n latitude,\r\n longitude\r\n}: GeneratePOIQueryProps): string => {\r\n return gql`\r\n query GetData {\r\n geoDistanceSorted${type}(parameters: \"{ \\\\\"from\\\\\": ${from}, \\\\\"size\\\\\": ${size}, \\\\\"culture\\\\\": \\\\\"${locale}\\\\\", \\\\\"lat\\\\\": \\\\\"${latitude}\\\\\", \\\\\"lon\\\\\": \\\\\"${longitude}\\\\\" }\") {\r\n ${commonFields}\r\n }\r\n }\r\n `\r\n}\r\n\r\nconst generateHospitalityPoiQuery = ({\r\n type,\r\n locale,\r\n from,\r\n size,\r\n latitude,\r\n longitude\r\n}: GeneratePOIQueryProps): string => {\r\n const data: QueryParameters = {\r\n from,\r\n size,\r\n locale,\r\n latitude,\r\n longitude\r\n }\r\n\r\n switch (type) {\r\n case HospitalityPOIType.afaire:\r\n return createGenericQuery({ ...data, type: 'TouristAttraction' })\r\n case HospitalityPOIType.avoir:\r\n return createGenericQuery({ ...data, type: 'TouristDestination' })\r\n case HospitalityPOIType.hebergement:\r\n return createGenericQuery({ ...data, type: 'LodgingBusiness' })\r\n case HospitalityPOIType.produit:\r\n return createGenericQuery({ ...data, type: 'Product' })\r\n case HospitalityPOIType.restaurant:\r\n return createGenericQuery({ ...data, type: 'FoodEstablishment' })\r\n case HospitalityPOIType.service:\r\n return createGenericQuery({ ...data, type: 'Service' })\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport { createGenericQuery, generateHospitalityPoiQuery }\r\n","import { combineReducers, configureStore } from '@reduxjs/toolkit'\r\nimport type { PreloadedState } from '@reduxjs/toolkit'\r\nimport authReducer from '../features/authSlice'\r\nimport poiReducer from '../features/poiSlice'\r\nimport mapReducer from '../features/mapSlice'\r\nimport tenantReducer from '../features/tenantSlice'\r\nimport botReducer from '../features/botSlice'\r\nimport type { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore'\r\n\r\nconst rootReducer = combineReducers({\r\n auth: authReducer,\r\n poi: poiReducer,\r\n map: mapReducer,\r\n tenant: tenantReducer,\r\n bot: botReducer\r\n})\r\n\r\nexport const setupStore = (\r\n preloadedState?: PreloadedState<RootState>\r\n): ToolkitStore => {\r\n return configureStore({\r\n reducer: rootReducer,\r\n middleware: (getDefaultMiddleware) =>\r\n // adding the api middleware enables caching, invalidation, polling and other features of `rtk-query`\r\n getDefaultMiddleware({\r\n serializableCheck: false\r\n }),\r\n preloadedState\r\n })\r\n}\r\n\r\nexport type RootState = ReturnType<typeof rootReducer>\r\nexport type AppStore = ReturnType<typeof setupStore>\r\nexport type AppDispatch = AppStore['dispatch']\r\n","import { createSlice } from '@reduxjs/toolkit'\r\nimport type { PayloadAction } from '@reduxjs/toolkit'\r\n\r\ntype AuthState = {\r\n token: string | null\r\n}\r\n\r\nconst slice = createSlice({\r\n name: 'auth',\r\n initialState: { token: null } as AuthState,\r\n reducers: {\r\n setCredentials: (\r\n state,\r\n { payload: { token } }: PayloadAction<{ token: string }>\r\n ): void => {\r\n state.token = token\r\n }\r\n }\r\n})\r\n\r\nexport const { setCredentials } = slice.actions\r\n\r\nexport default slice.reducer\r\n"],"names":[],"version":3,"file":"index.js.map"}
|