{"version":3,"file":"assets/js/chunks/6484.968a82d99eb4ea9cbc48.js","mappings":"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","sources":["webpack://web-pwa/./src/domain/search/SearchInputIcon.less?d80b","webpack://web-pwa/./src/domain/search/SearchInputIcon.jsx","webpack://web-pwa/./src/domain/header/QuickSearchInput.jsx","webpack://web-pwa/./src/domain/header/QuickSearchInput.less?9e32","webpack://web-pwa/./src/domain/header/SearchInput.less?f742","webpack://web-pwa/./src/domain/header/SearchInput.jsx","webpack://web-pwa/./src/domain/utils/usePrevious.js","webpack://web-pwa/./src/domain/seo/MetaTags.jsx","webpack://web-pwa/./src/domain/seo/CityService.js","webpack://web-pwa/./src/domain/seo/DepartmentService.js","webpack://web-pwa/./src/store/seo/seo-address.actions.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"common\":\"XwtJj\",\"icon\":\"ngGSR\"};","import React from 'react'\nimport SVGIcon from '../svg/SVGIcon'\nimport classnames from 'classnames'\nimport s from './SearchInputIcon.less'\nimport { useSelector } from 'react-redux'\nimport { selectGeoentityIconDataForSearch } from '../../store/poiassets/poiassets.selectors'\n\nfunction SearchInputIcon() {\n const { iconId, mob_roundImage } = useSelector(selectGeoentityIconDataForSearch)\n if (iconId) return \n if (mob_roundImage) return \n return <>\n}\n\nexport default SearchInputIcon\n","import React, { useCallback, useRef } from 'react'\nimport s from './QuickSearchInput.less'\n\nconst QuickSearchInput = ({ searchInputRef, onChange }) => {\n const quickInputRef = useRef()\n\n const handleChange = useCallback(\n event => {\n searchInputRef.current.focus()\n onChange({ value: event.target.value })\n quickInputRef.current.value = ''\n },\n [searchInputRef, onChange, quickInputRef]\n )\n return \n}\n\nexport default QuickSearchInput\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"ofhDU\"};","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"ptu98\",\"homePageContainer\":\"i7nEr\",\"prefix\":\"PeGRg\",\"field\":\"SLh43\",\"greenPlaceholder\":\"o0B0M\",\"whitePlaceholder\":\"xoOtT\",\"throbber\":\"HB2G0\",\"withIcon\":\"SY57p\",\"btnOk\":\"CN2Sb\"};","import classNames from 'classnames'\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { ROUTE_SUGGEST } from '../../routes'\nimport { TAG_PUBLISHER } from '../analytics/analytics.tagids.constants'\nimport { navigateTo } from '../../store/history/history.actions'\nimport { selectCurrentHistoryRoute, selectIsHomePage } from '../../store/history/history.selectors'\nimport { selectHasSearchIcon } from '../../store/poiassets/poiassets.selectors'\nimport { setSearchTerms } from '../../store/search/searchSlice'\nimport { suggest } from '../../store/suggest/suggest.actions'\nimport { UI_ELEMENTS } from '../../store/ui/ui.constants'\nimport { PUB_TAG } from '../analytics/PublisherTagsService'\nimport { isGE } from '../Device'\nimport TagActionButton from '../genericComponents/TagActionButton'\nimport Throbber from '../loading/Throbber'\nimport { isPagelessRoute } from '../router/routeUtils'\nimport SearchInputIcon from '../search/SearchInputIcon'\nimport useUIDisplay from '../ui/useUIDisplay'\nimport { useAction } from '../utils/react-redux'\nimport useDebounce from '../utils/useDebounce'\nimport { usePrevious } from '../utils/usePrevious'\nimport QuickSearchInput from './QuickSearchInput'\nimport s from './SearchInput.less'\n\nconst SearchInput = forwardRef((props, ref) => {\n const {\n value,\n loading,\n onChange,\n onFocus,\n suggestFilterType,\n className,\n placeholder,\n idx = 0,\n prefix,\n hasGreenPlaceholder = false,\n navigateToSuggestOnFocus = true,\n isFirstStepToFill = true\n } = props\n\n const dispatch = useDispatch()\n const [hasFocus, setFocus] = useState(false)\n const route = useSelector(selectCurrentHistoryRoute)\n const hasIcon = useSelector(selectHasSearchIcon)\n const prevRoute = usePrevious(route)\n const execSuggest = useAction(suggest)\n const execNavigateTo = useAction(navigateTo)\n const [isReady, setIsReady] = useState(false)\n const inputRef = useRef()\n const debouncedValue = useDebounce(value, 250)\n const hasDebouncedValueChangeOnce = useRef(false) // to ignore suggest on first render\n const isBtnOkDisplayed = isGE() && route === ROUTE_SUGGEST && !loading\n const isQuickSearch = isGE() && !hasFocus && (!value || value === '') && isFirstStepToFill\n const inputId = `SearchInput${idx}`\n const { showUI } = useUIDisplay(UI_ELEMENTS.SUGGEST)\n const isHomePage = useSelector(selectIsHomePage)\n\n const onSubmit = useCallback(() => {\n dispatch(setSearchTerms(value))\n return Promise.resolve().then(() => blur())\n }, [value])\n\n useImperativeHandle(ref, () => {\n return { onSubmit }\n })\n\n useEffect(() => {\n if (__BROWSER__) setIsReady(true)\n }, [__BROWSER__])\n\n useEffect(() => {\n if (route !== prevRoute && isPagelessRoute(prevRoute) && !isPagelessRoute(route)) {\n blur()\n }\n }, [route])\n\n const doSuggest = val => {\n dispatch(setSearchTerms(val))\n return execSuggest({ terms: val, suggestFilterType })\n }\n\n useEffect(() => {\n if (hasDebouncedValueChangeOnce.current && hasFocus) {\n doSuggest(debouncedValue)\n }\n hasDebouncedValueChangeOnce.current = true\n }, [hasFocus, debouncedValue])\n\n const handleChange = event => {\n onChange && onChange({ value: event.target.value })\n }\n\n const handleFocus = useCallback(\n e => {\n setTimeout(() => {\n if (value.length !== 0) e.target.select()\n }, 0)\n if (navigateToSuggestOnFocus) execNavigateTo({ route: ROUTE_SUGGEST })\n showUI()\n onFocus && onFocus()\n setFocus(true)\n },\n [execNavigateTo, showUI, doSuggest, onFocus, setFocus]\n )\n\n const blur = useCallback(() => {\n inputRef?.current?.blur()\n setFocus(false)\n }, [inputRef, setFocus])\n\n return (\n \n {prefix && (\n \n )}\n {hasIcon && }\n \n {loading && (\n \n \n \n )}\n {isBtnOkDisplayed && (\n \n OK\n \n )}\n {isQuickSearch && }\n \n )\n})\n\nSearchInput.displayName = 'SearchInput'\nexport default SearchInput\n","import { useEffect, useRef } from 'react'\n\nexport const usePrevious = value => {\n const ref = useRef()\n useEffect(() => {\n ref.current = value\n })\n return ref.current\n}\n","import React, { useCallback } from 'react'\nimport { Helmet } from 'react-helmet'\nimport logo from './Mappy-310.png'\nimport { selectLocale } from '../../store/navigation/navigation.selectors'\nimport translations from './MetaTags.json'\n\nimport { isAbsoluteUrl } from '../utils/url'\nimport { generateAbsoluteBaseUrl } from './seo'\nimport { getHrefLangBySubdomain, SUBDOMAINS, SUBDOMAIN_EN } from '../i18n'\nimport { useSelector } from 'react-redux'\nimport { selectCurrentHistoryFullRoute } from '../../store/history/history.selectors'\n\nconst getImageUrl = ({ image, locale, logo }) => {\n const img = image || logo\n if (!isAbsoluteUrl(img)) return `${generateAbsoluteBaseUrl(locale)}${img}`\n if (img.startsWith('//')) return `https:${img}`\n return img\n}\n\nconst getAlternateLinks = ({ alternateLinkPath, shouldIgnoreEn }) =>\n SUBDOMAINS.map((subdomain, idx) => {\n // not returning an empty React fragment here `<>` so returning array\n // is not filling alternate links with irrelevant and undefined components\n if (subdomain === SUBDOMAIN_EN && shouldIgnoreEn) return undefined\n\n return (\n \n )\n })\n\nconst MetaTags = ({\n title: givenTitle,\n description: givenDescription,\n image,\n url,\n alternateLinkPath,\n canonical,\n type,\n shouldIgnoreEn\n}) => {\n const locale = useSelector(selectLocale)\n const currentFullRoute = useSelector(selectCurrentHistoryFullRoute)\n\n const { title: defaultTitle, description: defaultDescription } = translations?.[locale] ?? {}\n const title = givenTitle || defaultTitle\n const description = givenDescription || defaultDescription\n const img = getImageUrl({ locale, image, logo })\n const typ = type || 'website'\n\n const buildCanonicalRoute = useCallback(() => {\n const canonicalUrl = !canonical ? currentFullRoute : canonical\n\n return canonicalUrl.split('#')[0]\n }, [currentFullRoute])\n\n return (\n \n {title}\n \n \n \n \n {url && }\n \n \n {alternateLinkPath && getAlternateLinks({ alternateLinkPath, shouldIgnoreEn })}\n \n \n )\n}\n\nexport default MetaTags\n","\n export default function () {\n return null\n }\n ","import departments from '../../node/static/seo/departments-250-fr-FR.json'\nimport { isFranceCountryCode } from '../../routes/address/Countries'\n\nexport const getDepartments = () => {\n return departments\n}\n\nexport default class DepartmentService {\n static findDepartmentByCode(departmentCode) {\n return getDepartments().find(department => department.code === departmentCode.toString())\n }\n\n static findBorderingDepartments(departmentCode, countryCode) {\n if (isFranceCountryCode(countryCode)) {\n const department = this.findDepartmentByCode(departmentCode)\n const borderingDepartments = []\n department?.nextTo.forEach(borderDepartmentCode => {\n const borderDepartment = this.findDepartmentByCode(borderDepartmentCode)\n if (borderDepartment) borderingDepartments.push(borderDepartment)\n })\n\n return borderingDepartments\n }\n }\n\n static findDepartmentsFromRegionCode(regionCode, countryCode) {\n if (isFranceCountryCode(countryCode))\n return getDepartments().filter(department => department.regionId === regionCode)\n }\n}\n","import debug from 'debug'\nimport { citiesWithDistricts, getSeoTownFromLocation } from '../../domain/seo/seo'\nimport { getSeoFooterCitiesPositions } from '../../domain/seo/seo-modulo'\nimport { selectFirstAddress } from '../address/address.selectors'\nimport { selectLocale } from '../navigation/navigation.selectors'\nimport { selectIsSeoCityWithDistricts, selectSeoTownDetails, selectSeoTownDetailsId } from './seo.selectors'\n\nimport { localeCountryIsBelgium, localeCountryIsFrance } from '../../domain/i18n'\nimport CityService from '../../domain/seo/CityService'\nimport DepartmentService from '../../domain/seo/DepartmentService'\nimport { formatCitiesLinks } from '../../domain/seo/footer/common/topSearchCities'\nimport { COUNT_CITIES_FOOTER_OTHER, COUNT_CITIES_TO_DISCOVER } from '../../domain/seo/seo.constants'\nimport { isCityWithDistrict } from '../../domain/utils/location'\nimport { MINIMAL_NB_OF_POI_TO_OPEN_CITY } from '../../parameters'\nimport { isFranceCountryCode, isFranceOrBelgiumCountryCode } from '../../routes/address/Countries'\nimport { uniqBy } from '../../utils/array'\nimport { setSeoCitiesForFooter, setSeoCitiesToDiscoverLinks, setSeoTownDetails } from './seoSlice'\n\nconst d = debug('seo')\n\nexport const searchSeoCityData = () => (dispatch, getState) => {\n const address = selectFirstAddress(getState())\n const seoTownFromLocation = getSeoTownFromLocation(address)\n if (!seoTownFromLocation || !isFranceOrBelgiumCountryCode(address.countryCode)) return Promise.resolve()\n\n const locale = selectLocale(getState())\n const town = CityService.findCityByPostCodeAndTownSlugified({ ...seoTownFromLocation, locale })\n const townWithMorePoiAndSameTownCode = CityService.findCityByTownCode({ towncode: address.towncode, locale })\n\n if (!town && !townWithMorePoiAndSameTownCode) return Promise.resolve()\n\n const townPlainObject = town\n ? {\n ...town,\n townWithMorePoiAndSameTownCode:\n (town?.poicount ?? 0) < MINIMAL_NB_OF_POI_TO_OPEN_CITY &&\n (townWithMorePoiAndSameTownCode?.poicount ?? 0) > MINIMAL_NB_OF_POI_TO_OPEN_CITY\n ? townWithMorePoiAndSameTownCode\n : null\n }\n : townWithMorePoiAndSameTownCode\n\n dispatch(\n setSeoTownDetails(\n // N.B.: for old towns, townWithoutDistrict is the new name\n {\n ...townPlainObject,\n townWithoutDistrict: address.town\n }\n )\n )\n return Promise.resolve()\n}\n\nexport const setSeoCityDataFromGeocode = zip => (dispatch, getState) => {\n const address = selectFirstAddress(getState())\n\n dispatch(\n setSeoTownDetails({\n ...address,\n postcode: isCityWithDistrict(zip) ? zip : address.postcode,\n townWithoutDistrict: address.town\n })\n )\n}\n\nexport const searchSeoCitiesForFooter = () => (dispatch, getState) => {\n const locale = selectLocale(getState())\n if (!localeCountryIsFrance(locale) && !localeCountryIsBelgium(locale)) return Promise.resolve()\n\n const hasDistrict = selectIsSeoCityWithDistricts(getState())\n if (d.enabled) d('searchSeoCitiesForFooter, hasDistrict:', hasDistrict)\n\n const searchMethod = hasDistrict ? searchSeoDistrictsForCity : searchSeoCitiesByPositions\n\n const cities = searchMethod()(dispatch, getState).map(({ town, postcode, district }) => ({\n town,\n postcode,\n district\n }))\n\n dispatch(setSeoCitiesForFooter(cities))\n}\n\nexport const searchSeoCitiesByPositions = () => (dispatch, getState) => {\n const locale = selectLocale(getState())\n const count = CityService.findCityCountByLocale({ locale })\n\n const cityId = selectSeoTownDetailsId(getState())\n if (d.enabled) d('searchSeoCitiesByPositions, cityId', cityId)\n if (!cityId) return []\n\n const index = CityService.getIndexByPositionByPoi({ locale, cityId })\n if (d.enabled) d('searchSeoCitiesByPositions, index', index)\n\n const positions = getSeoFooterCitiesPositions(index, count, locale)\n if (d.enabled) d('searchSeoCitiesByPositions, positions', positions)\n\n const cities = CityService.findCitiesByPositionByPoi({ locale, positions })\n if (d.enabled)\n d(\n 'searchSeoCitiesByPositions, cities',\n cities.map(({ towncode, town }) => `${town} (${towncode})`)\n )\n\n if (localeCountryIsFrance(locale)) {\n return uniqBy(\n [...citiesWithDistricts.map(city => ({ ...city, district: false })), ...cities],\n item => item.postcode\n )\n } else {\n return [...cities]\n }\n}\n\nexport const searchSeoDistrictsForCity = () => (dispatch, getState) => {\n const address = selectFirstAddress(getState())\n if (!isFranceCountryCode(address.countryCode)) return Promise.resolve()\n\n const locale = selectLocale(getState())\n const postcode = selectSeoTownDetails(getState())?.postcode\n return CityService.findDistrictsByCityPostcode({ locale, postcode })\n}\n\nexport const cleanCities = (cities = []) => cities.map(({ town, postcode, district }) => ({ town, postcode, district }))\n\nexport const searchFirstCities =\n ({ offset = 0, limit = COUNT_CITIES_FOOTER_OTHER }) =>\n (dispatch, getState) => {\n const locale = selectLocale(getState())\n const cities = CityService.findCitiesOrderedByPoi({ locale, offset, limit })\n dispatch(setSeoCitiesForFooter(cleanCities(cities)))\n }\n\nexport const loadCitiesToDiscover = () => (dispatch, getState) => {\n const locale = selectLocale(getState())\n const cities = CityService.findCitiesOrderedByPoi({ locale, offset: 0, limit: COUNT_CITIES_TO_DISCOVER })\n const payload = formatCitiesLinks(cleanCities(cities), locale)\n dispatch(setSeoCitiesToDiscoverLinks(payload))\n}\n\nexport const searchDepartmentCities = () => (dispatch, getState) => {\n const { departmentCode, countryCode } = selectFirstAddress(getState())\n const cities = CityService.findTopCitiesFromDepartmentWithCode({\n departmentCode,\n countryCode\n })\n dispatch(setSeoCitiesForFooter(cleanCities(cities)))\n}\n\nexport const searchRegionCities = () => (dispatch, getState) => {\n const { regionCode, countryCode } = selectFirstAddress(getState())\n const departmentsFromRegionsList = DepartmentService.findDepartmentsFromRegionCode(regionCode, countryCode)\n const departmentCodes = departmentsFromRegionsList?.map(department => department.code)\n const cities = CityService.findTopCitiesFromDepartmentsWithCode({\n departmentCodes,\n countryCode\n })\n dispatch(setSeoCitiesForFooter(cleanCities(cities)))\n}\n\nexport const searchCountryCities = () => (dispatch, getState) => {\n const { countryCode } = selectFirstAddress(getState())\n if (!isFranceOrBelgiumCountryCode(countryCode)) return\n const locale = selectLocale(getState())\n const cities = CityService.findCitiesOrderedByPoi({ locale })\n dispatch(setSeoCitiesForFooter(cleanCities(cities)))\n}\n"],"names":["iconId","mob_roundImage","useSelector","selectGeoentityIconDataForSearch","React","SVGIcon","icon","className","classnames","s","src","_ref","searchInputRef","onChange","quickInputRef","useRef","handleChange","useCallback","event","current","focus","value","target","ref","autoFocus","SearchInput","forwardRef","props","loading","onFocus","suggestFilterType","placeholder","idx","prefix","hasGreenPlaceholder","navigateToSuggestOnFocus","isFirstStepToFill","dispatch","useDispatch","hasFocus","setFocus","useState","route","selectCurrentHistoryRoute","hasIcon","selectHasSearchIcon","prevRoute","useEffect","usePrevious","execSuggest","useAction","suggest","execNavigateTo","navigateTo","isReady","setIsReady","inputRef","debouncedValue","useDebounce","hasDebouncedValueChangeOnce","isBtnOkDisplayed","isGE","ROUTE_SUGGEST","isQuickSearch","inputId","showUI","useUIDisplay","UI_ELEMENTS","SUGGEST","isHomePage","selectIsHomePage","onSubmit","setSearchTerms","Promise","resolve","then","blur","useImperativeHandle","__BROWSER__","isPagelessRoute","doSuggest","val","terms","handleFocus","e","setTimeout","length","select","_inputRef$current","classNames","htmlFor","SearchInputIcon","type","id","disabled","autoComplete","Throbber","TagActionButton","tagInfo","tag","PUB_TAG","PUB_FOCUS_CHAMP_SAISI","TAG_PUBLISHER","shouldTagImpression","isSubmitButton","QuickSearchInput","displayName","getImageUrl","image","locale","logo","img","isAbsoluteUrl","startsWith","generateAbsoluteBaseUrl","_ref3","title","givenTitle","description","givenDescription","url","alternateLinkPath","canonical","shouldIgnoreEn","selectLocale","currentFullRoute","selectCurrentHistoryFullRoute","defaultTitle","defaultDescription","translations","typ","buildCanonicalRoute","split","Helmet","name","content","property","toLowerCase","_ref2","SUBDOMAINS","map","subdomain","SUBDOMAIN_EN","key","rel","href","hreflang","getHrefLangBySubdomain","getAlternateLinks","getDepartments","departments","DepartmentService","findDepartmentByCode","departmentCode","find","department","code","toString","findBorderingDepartments","countryCode","isFranceCountryCode","this","borderingDepartments","nextTo","forEach","borderDepartmentCode","borderDepartment","push","findDepartmentsFromRegionCode","regionCode","filter","regionId","debug","cleanCities","arguments","undefined","town","postcode","district","searchDepartmentCities","getState","selectFirstAddress","cities","CityService","findTopCitiesFromDepartmentWithCode","setSeoCitiesForFooter","searchRegionCities","departmentsFromRegionsList","departmentCodes","findTopCitiesFromDepartmentsWithCode","searchCountryCities","isFranceOrBelgiumCountryCode","findCitiesOrderedByPoi"],"sourceRoot":""}