{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./source/images/dropdown-arrow.svg","webpack:///./source/images/marker-icon.svg","webpack:///./source/images/geo-location-marker.svg","webpack:///./source/images/onboarding-bus.png","webpack:///./source/images/icon-day.svg","webpack:///./source/images/icon-from.svg","webpack:///./source/images/icon-time.svg","webpack:///./source/images/icon-dur.svg","webpack:///./source/images/icon-menu.svg","webpack:///./source/images/icon-about.svg","webpack:///./source/images/icon-globe.svg","webpack:///./source/images/logo-light-background.svg","webpack:///./node_modules/date-fns/locale lazy ^\\.\\/.*\\/index\\.js$ namespace object","webpack:///./source/components/ErrorBanner/ErrorBanner.jsx","webpack:///./source/components/Map/Map.jsx","webpack:///./source/components/Map/MapImageLayer.jsx","webpack:///./source/components/Map/Marker.jsx","webpack:///./source/components/Map/MapGeoJSONLayer.jsx","webpack:///./source/IsochroneMapLayer/IsochroneMapLayer.jsx","webpack:///./source/IsochroneMapLayer/index.js","webpack:///./source/RoutesMapLayer/RoutesMapLayer.jsx","webpack:///./source/RoutesMapLayer/index.js","webpack:///./source/components/LanguageSelection/LanguageSelection.jsx","webpack:///./source/components/LanguageSelection/index.js","webpack:///./source/Scenarios/Concept/Concept.jsx","webpack:///./source/Scenarios/Concept/index.js","webpack:///./source/utilities/CommuteTimes.js","webpack:///./source/utilities/Promise.js","webpack:///./source/CensusStats/CensusStats.jsx","webpack:///./source/CensusStats/index.js","webpack:///./source/components/Legend/Legend.jsx","webpack:///./source/components/Legend/index.js","webpack:///./source/CommuteTimes/CommuteTimes.jsx","webpack:///./source/CommuteTimes/index.js","webpack:///./source/Footer/Footer.jsx","webpack:///./source/Footer/index.js","webpack:///./source/components/Carousel/Carousel.jsx","webpack:///./source/components/Carousel/index.js","webpack:///./source/OnBoarding/OnBoardingItem.jsx","webpack:///./source/OnBoarding/OnBoarding.jsx","webpack:///./source/OnBoarding/index.js","webpack:///./source/services/Geocoding/GeocodingOptions.js","webpack:///./source/services/Geocoding/MapboxGeocoding.js","webpack:///./source/services/Geocoding/MetroCloudAllianceGeocoding.js","webpack:///./source/services/Geocoding/Geocoding.js","webpack:///./source/GeoLocation/GeoLocation.jsx","webpack:///./source/GeoLocation/index.js","webpack:///./source/MapActionBar/MapActionBar.jsx","webpack:///./source/MapActionBar/index.js","webpack:///./source/AppTitle/AppTitle.jsx","webpack:///./source/AppTitle/index.js","webpack:///./source/components/Chip/Chip.jsx","webpack:///./source/components/Chip/index.js","webpack:///./source/Scenarios/formGroup.jsx","webpack:///./source/Scenarios/DayPicker/DayPicker.jsx","webpack:///./source/Scenarios/DayPicker/index.js","webpack:///./source/Scenarios/DurationPicker/DurationPicker.jsx","webpack:///./source/Scenarios/DurationPicker/index.js","webpack:///./source/Scenarios/Location/LocationItem.jsx","webpack:///./source/Scenarios/Location/Location.jsx","webpack:///./source/Scenarios/Location/index.js","webpack:///./source/Scenarios/TimePicker/TimePicker.jsx","webpack:///./source/Scenarios/TimePicker/index.js","webpack:///./source/Scenarios/Scenarios.jsx","webpack:///./source/Scenarios/index.js","webpack:///./source/SlidingMenu/SlidingMenu.jsx","webpack:///./source/SlidingMenu/index.js","webpack:///./source/App.jsx","webpack:///./source/index.jsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","e","Promise","resolve","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","oe","err","console","error","jsonpArray","window","oldJsonpFunction","slice","map","webpackAsyncContext","req","then","Error","code","ids","id","all","keys","ErrorBannerContext","React","createContext","Consumer","ErrorBannerProvider","Component","constructor","props","super","this","state","message","undefined","param","retry","displayErrorMessage","setState","render","Provider","msg","closeErrorBanner","msgParams","retryFct","children","ErrorBanner","className","Translation","resourceKey","params","type","onClick","Map","componentDidMount","Leaflet","mapContainer","getMapOptions","Browser","mobile","removeControl","zoomControl","setPosition","onLongPress","on","mouseEvent","latlng","whenReady","invalidateSize","createPane","getPane","style","zIndex","componentWillUnmount","remove","preferCanvas","layers","tileLayer","tileServerURL","accessToken","attribution","zoomOffset","tileSize","center","zoom","minZoom","maxZoom","setTimeout","ref","el","Children","child","index","cloneElement","layerOrder","defaultProps","MapImageLayer","layer","imageOverlay","imageUrl","imageBounds","addTo","componentDidUpdate","prevProps","setUrl","setBounds","Marker","marker","createMarker","removeMarker","latitude","longitude","popupText","bindPopup","closeButton","openPopup","setPopupContent","removePopup","iconUrl","setIcon","icon","getIconOptions","newPos","latLng","setLatLng","centerOffset","targetPoint","project","subtract","unproject","flyTo","draggable","position","getLatLng","onDragEnd","onClosePopup","closePopup","unbindPopup","iconClassNames","classNames","iconAnchor","popupAnchor","MapGeoJSONLayer","zoomOption","weight","strokeWidth","opacity","zoomOptions","forEach","opt","set","width","createJsonLayer","geoJSON","color","pane","setStyleFromZoom","currentZoomLevel","getZoom","setStyle","panBy","IsochroneMapLayer","bounds","image","loading","handleRefreshButtonClick","abortController","getIsochrone","firstLoad","abort","arePropsInitialized","day","time","duration","scenario","concept","AbortController","signal","httpGet","fetchOptions","errorHandler","response","context","status","Bounds","Image","onFetchCompleted","onRefreshButtonClick","generateRefreshButton","Fragment","showRefreshButton","Loading","isFullScreen","isDisplayed","centered","delayed","contextType","RoutesMapLayer","routes","getRoutesMap","dayOfWeek","getRoutesMapRequest","Geometries","catch","isCanceled","reachMap","scenarios","find","item","Value","NetworkColor","LanguageSelection","supportedCultures","currentCulture","inLineMode","onChange","document","location","href","baseURI","target","lang","culturesDisplayNames","Concept","componentWillMount","concepts","label","generateLabel","Label","labelText","height","cx","cy","stroke","fill","ToggleSwitch","options","onSelectedConcept","selectedValue","selectedConcept","displayMode","indexToMinutes","totalDur","stepLength","legend","colors","Math","round","CanceledPromiseError","CensusTableRow","current","future","census","statisticTypes","variation","percent","percentText","toString","ClassNames","CensusStats","censusData","abortControllerCurrent","abortControllerProposed","cancelablePromise","getCensusData","cancelProgressCensusDataRequest","isochroneParam","selectedDay","selectedTime","selectedDur","selectedLocation","cancel","processCensusData","currentScenarioData","futureScenarioData","TravelTimeRangeStats","timePeriod","paramsCurrent","paramsFuture","showError","errorCode","signalCurrent","signalProposed","promise","reject","val","makeCancelable","reason","scale","selectedTimeIndex","commuteTime","nbMin","Legend","onLegendItemSelected","legendColors","legendOpacity","canSelectItem","onCommuteTimeSelected","cssClassNames","itemClassNames","labelClassNames","backgroundColor","CommuteTimes","commuteTimeIndex","showStatistics","hideStatistics","canShowStatistics","enabled","src","arrow","Comment","commentLink","Footer","ConceptNote","Carousel","currentSlideIndex","prev","next","navigateTo","numberOfSlides","count","nextSlidesEnded","prevSlidesEnded","endlessly","renderSlides","slide","slideClassNames","renderNavigationButtons","disabledPrevBtn","disabledNextBtn","displayOnDoneBtn","doneText","onDone","disabled","prevText","renderDots","nextText","Array","dotClassNames","Summary","description","OnBoardingItem","firstSummary","secondSummary","alt","OnBoarding","show","onClose","busImage","title","GeocodingOptions","reverseGecoding","config","geocodingOptions","reverse","geocode","query","mapbounds","mapBounds","limitbybounds","limit","limitResults","country","language","types","getGeocodeOptions","getReverseOptions","MapboxGeocoding","callbackFct","url","clientUrl","bbox","autocomplete","access_token","geocodePromise","ok","json","statusText","JSON","stringify","features","place","placeName","place_name","geometry","coordinates","reversePromise","MetroCloudAllianceGeocoding","api_key","numberofresults","results","filter","parseFloat","lat","lng","searchtype","display_name","Geocoding","_initClient","client","geocodingClient","GeoLocation","handleClick","enableHighAccuracy","timeout","maximumAge","onSuccess","navigator","geolocation","getCurrentPosition","errorMessage","positionError","localizeValue","aria-label","MapActionBar","isAndroid","isIos","onGeoLocationSuccess","showOnBoarding","AppTitle","Chip","chipClasses","FormGroup","hasFocus","formGroupClassNames","formGroup","childWithFocus","onFocus","onBlur","role","aria-labelledby","labelId","iconName","DayPicker","selectRef","createRef","handleChange","daysOptions","values","focus","onSelectedDay","daysList","DurationPicker","Number","onSelectedDur","durList","durationOptions","dur","TranslationContext","LocationItem","Location","searchResults","onSelectedLocation","initGeocodingDebounce","geocodingDebounce","minimumCharBeforeAutoComplete","onClearLocation","wait","debounce","callback","geocodingDebounceRequest","coords","geocodingReverseRequest","AutoComplete","sourceData","onSelectedSuggestion","itemTemplate","inputRef","filterSuggestions","noResultsMessage","hasClearButton","TimePicker","fieldClassName","onSelectedTime","required","Scenarios","showOptions","dayPicker","timePicker","durationPicker","scenarioRef","disableFormSubmit","addEventListener","removeEventListener","event","isInMap","hideOptions","preventDefault","editLocation","editDay","editTime","editDur","renderChips","selectedLocationName","chipsClasses","dayLabel","fromIcon","dayIcon","timeIcon","durIcon","optionClasses","onMenuClick","menuIcon","onSubmit","SlidingMenu","classes","onAbout","aboutIcon","globeIcon","application","transitAgencySite","transitAgencyName","logo","App","markerPopupText","panelParameters","locationOptions","defaultPlaceName","defaultLatitude","defaultLongitude","defaultScenario","defaultValue","defaultTime","isochrone","currentLocation","showSlidingMenu","localStorage","getItem","geocodeAbortController","onLayoutChanged","onConceptChange","onIsochroneFetchCompleted","updateIsochroneState","isIsochroneStateUptoDate","innerWidth","panelEl","getElementById","clientHeight","newSelectedLocation","prevState","newParams","hasImage","openMenu","open","setItem","contains","mapOptions","maxBounds","networkOptions","defaultWidth","defaultOpacity","networkColor","geoLocationMarker","defaultMarker","__webpack_public_path__","translations","parse","text","ReactDom","defaultCulture","documentElement"],"mappings":"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AU,IAA0B,6B,oBCA3CC,EAAOD,QAAU,IAA0B,uB,oBCA3CC,EAAOD,QAAU,IAA0B,wB,oBCA3CC,EAAOD,QAAU,IAA0B,wB,oBCA3CC,EAAOD,QAAU,IAA0B,uB,oBCA3CC,EAAOD,QAAU,IAA0B,wB,oBCA3CC,EAAOD,QAAU,IAA0B,yB,oBCA3CC,EAAOD,QAAU,IAA0B,yB,oBCA3CC,EAAOD,QAAU,IAA0B,oC,kJCA3C,IAAIsC,EAAM,CACT,oCAAqC,CACpC,GAED,kCAAmC,CAClC,GAED,+BAAgC,CAC/B,GAED,sCAAuC,CACtC,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,uCAAwC,CACvC,GACA,GAED,mCAAoC,CACnC,GACA,GAED,uCAAwC,CACvC,GACA,GAED,iCAAkC,CACjC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,mBAAoB,CACnB,IACA,GAED,uCAAwC,CACvC,GACA,GAED,mCAAoC,CACnC,GACA,GAED,uCAAwC,CACvC,GACA,GAED,iCAAkC,CACjC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,mBAAoB,CACnB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,uCAAwC,CACvC,GACA,GAED,mCAAoC,CACnC,GACA,GAED,mBAAoB,CACnB,IACA,GAED,mCAAoC,CACnC,GACA,GAED,mBAAoB,CACnB,IACA,GAED,uCAAwC,CACvC,IAED,mCAAoC,CACnC,IAED,uCAAwC,CACvC,IAED,iCAAkC,CACjC,IAED,8BAA+B,CAC9B,IAED,mBAAoB,CACnB,IAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,GACA,GAED,8BAA+B,CAC9B,GACA,GAED,2BAA4B,CAC3B,GACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,GACA,GAED,gCAAiC,CAChC,GACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,uCAAwC,CACvC,IACA,GAED,mCAAoC,CACnC,IACA,GAED,uCAAwC,CACvC,IACA,GAED,iCAAkC,CACjC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,mBAAoB,CACnB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,uCAAwC,CACvC,IACA,GAED,mCAAoC,CACnC,IACA,GAED,uCAAwC,CACvC,IACA,GAED,iCAAkC,CACjC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,mBAAoB,CACnB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,oCAAqC,CACpC,IACA,GAED,gCAAiC,CAChC,IACA,GAED,oCAAqC,CACpC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,2BAA4B,CAC3B,IACA,GAED,gBAAiB,CAChB,IACA,GAED,uCAAwC,CACvC,IACA,GAED,mCAAoC,CACnC,IACA,GAED,uCAAwC,CACvC,IACA,GAED,iCAAkC,CACjC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,mBAAoB,CACnB,IACA,GAED,uCAAwC,CACvC,IACA,GAED,mCAAoC,CACnC,IACA,GAED,uCAAwC,CACvC,IACA,GAED,iCAAkC,CACjC,IACA,GAED,8BAA+B,CAC9B,IACA,GAED,mBAAoB,CACnB,IACA,IAGF,SAASC,EAAoBC,GAC5B,IAAI5C,EAAoBe,EAAE2B,EAAKE,GAC9B,OAAOpC,QAAQC,UAAUoC,MAAK,WAC7B,IAAItC,EAAI,IAAIuC,MAAM,uBAAyBF,EAAM,KAEjD,MADArC,EAAEwC,KAAO,mBACHxC,KAIR,IAAIyC,EAAMN,EAAIE,GAAMK,EAAKD,EAAI,GAC7B,OAAOxC,QAAQ0C,IAAIF,EAAIP,MAAM,GAAGC,IAAI1C,EAAoBO,IAAIsC,MAAK,WAChE,OAAO7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","file":"main.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({}[chunkId]||chunkId) + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// The chunk loading function for additional chunks\n \t// Since all referenced chunks are already included\n \t// in this file, this function is empty here.\n \t__webpack_require__.e = function requireEnsure() {\n \t\treturn Promise.resolve();\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"public/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([281,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","module.exports = __webpack_public_path__ + \"images/dropdown-arrow.svg\";","module.exports = __webpack_public_path__ + \"images/marker-icon.svg\";","module.exports = __webpack_public_path__ + \"images/geo-location-marker.svg\";","module.exports = __webpack_public_path__ + \"images/onboarding-bus.png\";","module.exports = __webpack_public_path__ + \"images/icon-day.svg\";","module.exports = __webpack_public_path__ + \"images/icon-from.svg\";","module.exports = __webpack_public_path__ + \"images/icon-time.svg\";","module.exports = __webpack_public_path__ + \"images/icon-dur.svg\";","module.exports = __webpack_public_path__ + \"images/icon-menu.svg\";","module.exports = __webpack_public_path__ + \"images/icon-about.svg\";","module.exports = __webpack_public_path__ + \"images/icon-globe.svg\";","module.exports = __webpack_public_path__ + \"images/logo-light-background.svg\";","var map = {\n\t\"./_lib/buildFormatLongFn/index.js\": [\n\t\t2\n\t],\n\t\"./_lib/buildLocalizeFn/index.js\": [\n\t\t3\n\t],\n\t\"./_lib/buildMatchFn/index.js\": [\n\t\t5\n\t],\n\t\"./_lib/buildMatchPatternFn/index.js\": [\n\t\t4\n\t],\n\t\"./af/_lib/formatDistance/index.js\": [\n\t\t31,\n\t\t0\n\t],\n\t\"./af/_lib/formatLong/index.js\": [\n\t\t32,\n\t\t0\n\t],\n\t\"./af/_lib/formatRelative/index.js\": [\n\t\t33,\n\t\t0\n\t],\n\t\"./af/_lib/localize/index.js\": [\n\t\t34,\n\t\t0\n\t],\n\t\"./af/_lib/match/index.js\": [\n\t\t35,\n\t\t0\n\t],\n\t\"./af/index.js\": [\n\t\t332,\n\t\t0\n\t],\n\t\"./ar-DZ/_lib/formatDistance/index.js\": [\n\t\t36,\n\t\t0\n\t],\n\t\"./ar-DZ/_lib/formatLong/index.js\": [\n\t\t37,\n\t\t0\n\t],\n\t\"./ar-DZ/_lib/formatRelative/index.js\": [\n\t\t38,\n\t\t0\n\t],\n\t\"./ar-DZ/_lib/localize/index.js\": [\n\t\t39,\n\t\t0\n\t],\n\t\"./ar-DZ/_lib/match/index.js\": [\n\t\t40,\n\t\t0\n\t],\n\t\"./ar-DZ/index.js\": [\n\t\t333,\n\t\t0\n\t],\n\t\"./ar-SA/_lib/formatDistance/index.js\": [\n\t\t41,\n\t\t0\n\t],\n\t\"./ar-SA/_lib/formatLong/index.js\": [\n\t\t42,\n\t\t0\n\t],\n\t\"./ar-SA/_lib/formatRelative/index.js\": [\n\t\t43,\n\t\t0\n\t],\n\t\"./ar-SA/_lib/localize/index.js\": [\n\t\t44,\n\t\t0\n\t],\n\t\"./ar-SA/_lib/match/index.js\": [\n\t\t45,\n\t\t0\n\t],\n\t\"./ar-SA/index.js\": [\n\t\t334,\n\t\t0\n\t],\n\t\"./be/_lib/formatDistance/index.js\": [\n\t\t46,\n\t\t0\n\t],\n\t\"./be/_lib/formatLong/index.js\": [\n\t\t47,\n\t\t0\n\t],\n\t\"./be/_lib/formatRelative/index.js\": [\n\t\t48,\n\t\t0\n\t],\n\t\"./be/_lib/localize/index.js\": [\n\t\t49,\n\t\t0\n\t],\n\t\"./be/_lib/match/index.js\": [\n\t\t50,\n\t\t0\n\t],\n\t\"./be/index.js\": [\n\t\t338,\n\t\t0\n\t],\n\t\"./bn/_lib/formatDistance/index.js\": [\n\t\t51,\n\t\t0\n\t],\n\t\"./bn/_lib/formatLong/index.js\": [\n\t\t52,\n\t\t0\n\t],\n\t\"./bn/_lib/formatRelative/index.js\": [\n\t\t53,\n\t\t0\n\t],\n\t\"./bn/_lib/localize/index.js\": [\n\t\t21,\n\t\t0\n\t],\n\t\"./bn/_lib/match/index.js\": [\n\t\t54,\n\t\t0\n\t],\n\t\"./bn/index.js\": [\n\t\t339,\n\t\t0\n\t],\n\t\"./ca/_lib/formatDistance/index.js\": [\n\t\t55,\n\t\t0\n\t],\n\t\"./ca/_lib/formatLong/index.js\": [\n\t\t56,\n\t\t0\n\t],\n\t\"./ca/_lib/formatRelative/index.js\": [\n\t\t57,\n\t\t0\n\t],\n\t\"./ca/_lib/localize/index.js\": [\n\t\t58,\n\t\t0\n\t],\n\t\"./ca/_lib/match/index.js\": [\n\t\t59,\n\t\t0\n\t],\n\t\"./ca/index.js\": [\n\t\t340,\n\t\t0\n\t],\n\t\"./cs/_lib/formatDistance/index.js\": [\n\t\t60,\n\t\t0\n\t],\n\t\"./cs/_lib/formatLong/index.js\": [\n\t\t61,\n\t\t0\n\t],\n\t\"./cs/_lib/formatRelative/index.js\": [\n\t\t62,\n\t\t0\n\t],\n\t\"./cs/_lib/localize/index.js\": [\n\t\t63,\n\t\t0\n\t],\n\t\"./cs/_lib/match/index.js\": [\n\t\t64,\n\t\t0\n\t],\n\t\"./cs/index.js\": [\n\t\t341,\n\t\t0\n\t],\n\t\"./cy/_lib/formatDistance/index.js\": [\n\t\t65,\n\t\t0\n\t],\n\t\"./cy/_lib/formatLong/index.js\": [\n\t\t66,\n\t\t0\n\t],\n\t\"./cy/_lib/formatRelative/index.js\": [\n\t\t67,\n\t\t0\n\t],\n\t\"./cy/_lib/localize/index.js\": [\n\t\t68,\n\t\t0\n\t],\n\t\"./cy/_lib/match/index.js\": [\n\t\t69,\n\t\t0\n\t],\n\t\"./cy/index.js\": [\n\t\t342,\n\t\t0\n\t],\n\t\"./da/_lib/formatDistance/index.js\": [\n\t\t70,\n\t\t0\n\t],\n\t\"./da/_lib/formatLong/index.js\": [\n\t\t71,\n\t\t0\n\t],\n\t\"./da/_lib/formatRelative/index.js\": [\n\t\t72,\n\t\t0\n\t],\n\t\"./da/_lib/localize/index.js\": [\n\t\t73,\n\t\t0\n\t],\n\t\"./da/_lib/match/index.js\": [\n\t\t74,\n\t\t0\n\t],\n\t\"./da/index.js\": [\n\t\t343,\n\t\t0\n\t],\n\t\"./de/_lib/formatDistance/index.js\": [\n\t\t75,\n\t\t0\n\t],\n\t\"./de/_lib/formatLong/index.js\": [\n\t\t76,\n\t\t0\n\t],\n\t\"./de/_lib/formatRelative/index.js\": [\n\t\t77,\n\t\t0\n\t],\n\t\"./de/_lib/localize/index.js\": [\n\t\t78,\n\t\t0\n\t],\n\t\"./de/_lib/match/index.js\": [\n\t\t79,\n\t\t0\n\t],\n\t\"./de/index.js\": [\n\t\t344,\n\t\t0\n\t],\n\t\"./el/_lib/formatDistance/index.js\": [\n\t\t80,\n\t\t0\n\t],\n\t\"./el/_lib/formatLong/index.js\": [\n\t\t81,\n\t\t0\n\t],\n\t\"./el/_lib/formatRelative/index.js\": [\n\t\t82,\n\t\t0\n\t],\n\t\"./el/_lib/localize/index.js\": [\n\t\t83,\n\t\t0\n\t],\n\t\"./el/_lib/match/index.js\": [\n\t\t84,\n\t\t0\n\t],\n\t\"./el/index.js\": [\n\t\t345,\n\t\t0\n\t],\n\t\"./en-CA/_lib/formatDistance/index.js\": [\n\t\t85,\n\t\t0\n\t],\n\t\"./en-CA/_lib/formatLong/index.js\": [\n\t\t86,\n\t\t0\n\t],\n\t\"./en-CA/index.js\": [\n\t\t346,\n\t\t0\n\t],\n\t\"./en-GB/_lib/formatLong/index.js\": [\n\t\t87,\n\t\t0\n\t],\n\t\"./en-GB/index.js\": [\n\t\t347,\n\t\t0\n\t],\n\t\"./en-US/_lib/formatDistance/index.js\": [\n\t\t20\n\t],\n\t\"./en-US/_lib/formatLong/index.js\": [\n\t\t30\n\t],\n\t\"./en-US/_lib/formatRelative/index.js\": [\n\t\t14\n\t],\n\t\"./en-US/_lib/localize/index.js\": [\n\t\t15\n\t],\n\t\"./en-US/_lib/match/index.js\": [\n\t\t16\n\t],\n\t\"./en-US/index.js\": [\n\t\t17\n\t],\n\t\"./eo/_lib/formatDistance/index.js\": [\n\t\t88,\n\t\t0\n\t],\n\t\"./eo/_lib/formatLong/index.js\": [\n\t\t89,\n\t\t0\n\t],\n\t\"./eo/_lib/formatRelative/index.js\": [\n\t\t90,\n\t\t0\n\t],\n\t\"./eo/_lib/localize/index.js\": [\n\t\t91,\n\t\t0\n\t],\n\t\"./eo/_lib/match/index.js\": [\n\t\t92,\n\t\t0\n\t],\n\t\"./eo/index.js\": [\n\t\t348,\n\t\t0\n\t],\n\t\"./es/_lib/formatDistance/index.js\": [\n\t\t93,\n\t\t0\n\t],\n\t\"./es/_lib/formatLong/index.js\": [\n\t\t94,\n\t\t0\n\t],\n\t\"./es/_lib/formatRelative/index.js\": [\n\t\t95,\n\t\t0\n\t],\n\t\"./es/_lib/localize/index.js\": [\n\t\t96,\n\t\t0\n\t],\n\t\"./es/_lib/match/index.js\": [\n\t\t97,\n\t\t0\n\t],\n\t\"./es/index.js\": [\n\t\t349,\n\t\t0\n\t],\n\t\"./et/_lib/formatDistance/index.js\": [\n\t\t98,\n\t\t0\n\t],\n\t\"./et/_lib/formatLong/index.js\": [\n\t\t99,\n\t\t0\n\t],\n\t\"./et/_lib/formatRelative/index.js\": [\n\t\t100,\n\t\t0\n\t],\n\t\"./et/_lib/localize/index.js\": [\n\t\t101,\n\t\t0\n\t],\n\t\"./et/_lib/match/index.js\": [\n\t\t102,\n\t\t0\n\t],\n\t\"./et/index.js\": [\n\t\t350,\n\t\t0\n\t],\n\t\"./fa-IR/_lib/formatDistance/index.js\": [\n\t\t103,\n\t\t0\n\t],\n\t\"./fa-IR/_lib/formatLong/index.js\": [\n\t\t104,\n\t\t0\n\t],\n\t\"./fa-IR/_lib/formatRelative/index.js\": [\n\t\t105,\n\t\t0\n\t],\n\t\"./fa-IR/_lib/localize/index.js\": [\n\t\t106,\n\t\t0\n\t],\n\t\"./fa-IR/_lib/match/index.js\": [\n\t\t107,\n\t\t0\n\t],\n\t\"./fa-IR/index.js\": [\n\t\t351,\n\t\t0\n\t],\n\t\"./fi/_lib/formatDistance/index.js\": [\n\t\t108,\n\t\t0\n\t],\n\t\"./fi/_lib/formatLong/index.js\": [\n\t\t109,\n\t\t0\n\t],\n\t\"./fi/_lib/formatRelative/index.js\": [\n\t\t110,\n\t\t0\n\t],\n\t\"./fi/_lib/localize/index.js\": [\n\t\t111,\n\t\t0\n\t],\n\t\"./fi/_lib/match/index.js\": [\n\t\t112,\n\t\t0\n\t],\n\t\"./fi/index.js\": [\n\t\t352,\n\t\t0\n\t],\n\t\"./fr/_lib/formatDistance/index.js\": [\n\t\t113,\n\t\t0\n\t],\n\t\"./fr/_lib/formatLong/index.js\": [\n\t\t114,\n\t\t0\n\t],\n\t\"./fr/_lib/formatRelative/index.js\": [\n\t\t115,\n\t\t0\n\t],\n\t\"./fr/_lib/formatters/index.js\": [\n\t\t353,\n\t\t0\n\t],\n\t\"./fr/_lib/localize/index.js\": [\n\t\t116,\n\t\t0\n\t],\n\t\"./fr/_lib/match/index.js\": [\n\t\t117,\n\t\t0\n\t],\n\t\"./fr/index.js\": [\n\t\t354,\n\t\t0\n\t],\n\t\"./gl/_lib/formatDistance/index.js\": [\n\t\t118,\n\t\t0\n\t],\n\t\"./gl/_lib/formatLong/index.js\": [\n\t\t119,\n\t\t0\n\t],\n\t\"./gl/_lib/formatRelative/index.js\": [\n\t\t120,\n\t\t0\n\t],\n\t\"./gl/_lib/localize/index.js\": [\n\t\t121,\n\t\t0\n\t],\n\t\"./gl/_lib/match/index.js\": [\n\t\t122,\n\t\t0\n\t],\n\t\"./gl/index.js\": [\n\t\t355,\n\t\t0\n\t],\n\t\"./he/_lib/formatDistance/index.js\": [\n\t\t123,\n\t\t0\n\t],\n\t\"./he/_lib/formatLong/index.js\": [\n\t\t124,\n\t\t0\n\t],\n\t\"./he/_lib/formatRelative/index.js\": [\n\t\t125,\n\t\t0\n\t],\n\t\"./he/_lib/localize/index.js\": [\n\t\t126,\n\t\t0\n\t],\n\t\"./he/_lib/match/index.js\": [\n\t\t127,\n\t\t0\n\t],\n\t\"./he/index.js\": [\n\t\t356,\n\t\t0\n\t],\n\t\"./hr/_lib/formatDistance/index.js\": [\n\t\t128,\n\t\t0\n\t],\n\t\"./hr/_lib/formatLong/index.js\": [\n\t\t129,\n\t\t0\n\t],\n\t\"./hr/_lib/formatRelative/index.js\": [\n\t\t130,\n\t\t0\n\t],\n\t\"./hr/_lib/localize/index.js\": [\n\t\t131,\n\t\t0\n\t],\n\t\"./hr/_lib/match/index.js\": [\n\t\t132,\n\t\t0\n\t],\n\t\"./hr/index.js\": [\n\t\t357,\n\t\t0\n\t],\n\t\"./hu/_lib/formatDistance/index.js\": [\n\t\t133,\n\t\t0\n\t],\n\t\"./hu/_lib/formatLong/index.js\": [\n\t\t134,\n\t\t0\n\t],\n\t\"./hu/_lib/formatRelative/index.js\": [\n\t\t135,\n\t\t0\n\t],\n\t\"./hu/_lib/localize/index.js\": [\n\t\t136,\n\t\t0\n\t],\n\t\"./hu/_lib/match/index.js\": [\n\t\t137,\n\t\t0\n\t],\n\t\"./hu/index.js\": [\n\t\t358,\n\t\t0\n\t],\n\t\"./id/_lib/formatDistance/index.js\": [\n\t\t138,\n\t\t0\n\t],\n\t\"./id/_lib/formatLong/index.js\": [\n\t\t139,\n\t\t0\n\t],\n\t\"./id/_lib/formatRelative/index.js\": [\n\t\t140,\n\t\t0\n\t],\n\t\"./id/_lib/localize/index.js\": [\n\t\t141,\n\t\t0\n\t],\n\t\"./id/_lib/match/index.js\": [\n\t\t142,\n\t\t0\n\t],\n\t\"./id/index.js\": [\n\t\t359,\n\t\t0\n\t],\n\t\"./is/_lib/formatDistance/index.js\": [\n\t\t143,\n\t\t0\n\t],\n\t\"./is/_lib/formatLong/index.js\": [\n\t\t144,\n\t\t0\n\t],\n\t\"./is/_lib/formatRelative/index.js\": [\n\t\t145,\n\t\t0\n\t],\n\t\"./is/_lib/localize/index.js\": [\n\t\t146,\n\t\t0\n\t],\n\t\"./is/_lib/match/index.js\": [\n\t\t147,\n\t\t0\n\t],\n\t\"./is/index.js\": [\n\t\t360,\n\t\t0\n\t],\n\t\"./it/_lib/formatDistance/index.js\": [\n\t\t148,\n\t\t0\n\t],\n\t\"./it/_lib/formatLong/index.js\": [\n\t\t149,\n\t\t0\n\t],\n\t\"./it/_lib/formatRelative/index.js\": [\n\t\t150,\n\t\t0\n\t],\n\t\"./it/_lib/localize/index.js\": [\n\t\t151,\n\t\t0\n\t],\n\t\"./it/_lib/match/index.js\": [\n\t\t152,\n\t\t0\n\t],\n\t\"./it/index.js\": [\n\t\t361,\n\t\t0\n\t],\n\t\"./ja/_lib/formatDistance/index.js\": [\n\t\t153,\n\t\t0\n\t],\n\t\"./ja/_lib/formatLong/index.js\": [\n\t\t154,\n\t\t0\n\t],\n\t\"./ja/_lib/formatRelative/index.js\": [\n\t\t155,\n\t\t0\n\t],\n\t\"./ja/_lib/localize/index.js\": [\n\t\t156,\n\t\t0\n\t],\n\t\"./ja/_lib/match/index.js\": [\n\t\t157,\n\t\t0\n\t],\n\t\"./ja/index.js\": [\n\t\t362,\n\t\t0\n\t],\n\t\"./ka/_lib/formatDistance/index.js\": [\n\t\t158,\n\t\t0\n\t],\n\t\"./ka/_lib/formatLong/index.js\": [\n\t\t159,\n\t\t0\n\t],\n\t\"./ka/_lib/formatRelative/index.js\": [\n\t\t160,\n\t\t0\n\t],\n\t\"./ka/_lib/localize/index.js\": [\n\t\t161,\n\t\t0\n\t],\n\t\"./ka/_lib/match/index.js\": [\n\t\t162,\n\t\t0\n\t],\n\t\"./ka/index.js\": [\n\t\t363,\n\t\t0\n\t],\n\t\"./ko/_lib/formatDistance/index.js\": [\n\t\t163,\n\t\t0\n\t],\n\t\"./ko/_lib/formatLong/index.js\": [\n\t\t164,\n\t\t0\n\t],\n\t\"./ko/_lib/formatRelative/index.js\": [\n\t\t165,\n\t\t0\n\t],\n\t\"./ko/_lib/localize/index.js\": [\n\t\t166,\n\t\t0\n\t],\n\t\"./ko/_lib/match/index.js\": [\n\t\t167,\n\t\t0\n\t],\n\t\"./ko/index.js\": [\n\t\t364,\n\t\t0\n\t],\n\t\"./lt/_lib/formatDistance/index.js\": [\n\t\t168,\n\t\t0\n\t],\n\t\"./lt/_lib/formatLong/index.js\": [\n\t\t169,\n\t\t0\n\t],\n\t\"./lt/_lib/formatRelative/index.js\": [\n\t\t170,\n\t\t0\n\t],\n\t\"./lt/_lib/localize/index.js\": [\n\t\t171,\n\t\t0\n\t],\n\t\"./lt/_lib/match/index.js\": [\n\t\t172,\n\t\t0\n\t],\n\t\"./lt/index.js\": [\n\t\t365,\n\t\t0\n\t],\n\t\"./lv/_lib/formatDistance/index.js\": [\n\t\t173,\n\t\t0\n\t],\n\t\"./lv/_lib/formatLong/index.js\": [\n\t\t174,\n\t\t0\n\t],\n\t\"./lv/_lib/formatRelative/index.js\": [\n\t\t175,\n\t\t0\n\t],\n\t\"./lv/_lib/localize/index.js\": [\n\t\t176,\n\t\t0\n\t],\n\t\"./lv/_lib/match/index.js\": [\n\t\t177,\n\t\t0\n\t],\n\t\"./lv/index.js\": [\n\t\t366,\n\t\t0\n\t],\n\t\"./nb/_lib/formatDistance/index.js\": [\n\t\t178,\n\t\t0\n\t],\n\t\"./nb/_lib/formatLong/index.js\": [\n\t\t179,\n\t\t0\n\t],\n\t\"./nb/_lib/formatRelative/index.js\": [\n\t\t180,\n\t\t0\n\t],\n\t\"./nb/_lib/localize/index.js\": [\n\t\t181,\n\t\t0\n\t],\n\t\"./nb/_lib/match/index.js\": [\n\t\t182,\n\t\t0\n\t],\n\t\"./nb/index.js\": [\n\t\t367,\n\t\t0\n\t],\n\t\"./nl/_lib/formatDistance/index.js\": [\n\t\t183,\n\t\t0\n\t],\n\t\"./nl/_lib/formatLong/index.js\": [\n\t\t184,\n\t\t0\n\t],\n\t\"./nl/_lib/formatRelative/index.js\": [\n\t\t185,\n\t\t0\n\t],\n\t\"./nl/_lib/localize/index.js\": [\n\t\t186,\n\t\t0\n\t],\n\t\"./nl/_lib/match/index.js\": [\n\t\t187,\n\t\t0\n\t],\n\t\"./nl/index.js\": [\n\t\t368,\n\t\t0\n\t],\n\t\"./nn/_lib/formatDistance/index.js\": [\n\t\t188,\n\t\t0\n\t],\n\t\"./nn/_lib/formatLong/index.js\": [\n\t\t189,\n\t\t0\n\t],\n\t\"./nn/_lib/formatRelative/index.js\": [\n\t\t190,\n\t\t0\n\t],\n\t\"./nn/_lib/localize/index.js\": [\n\t\t191,\n\t\t0\n\t],\n\t\"./nn/_lib/match/index.js\": [\n\t\t192,\n\t\t0\n\t],\n\t\"./nn/index.js\": [\n\t\t369,\n\t\t0\n\t],\n\t\"./pl/_lib/formatDistance/index.js\": [\n\t\t193,\n\t\t0\n\t],\n\t\"./pl/_lib/formatLong/index.js\": [\n\t\t194,\n\t\t0\n\t],\n\t\"./pl/_lib/formatRelative/index.js\": [\n\t\t195,\n\t\t0\n\t],\n\t\"./pl/_lib/localize/index.js\": [\n\t\t196,\n\t\t0\n\t],\n\t\"./pl/_lib/match/index.js\": [\n\t\t197,\n\t\t0\n\t],\n\t\"./pl/index.js\": [\n\t\t370,\n\t\t0\n\t],\n\t\"./pt-BR/_lib/formatDistance/index.js\": [\n\t\t203,\n\t\t0\n\t],\n\t\"./pt-BR/_lib/formatLong/index.js\": [\n\t\t204,\n\t\t0\n\t],\n\t\"./pt-BR/_lib/formatRelative/index.js\": [\n\t\t205,\n\t\t0\n\t],\n\t\"./pt-BR/_lib/localize/index.js\": [\n\t\t206,\n\t\t0\n\t],\n\t\"./pt-BR/_lib/match/index.js\": [\n\t\t207,\n\t\t0\n\t],\n\t\"./pt-BR/index.js\": [\n\t\t372,\n\t\t0\n\t],\n\t\"./pt/_lib/formatDistance/index.js\": [\n\t\t198,\n\t\t0\n\t],\n\t\"./pt/_lib/formatLong/index.js\": [\n\t\t199,\n\t\t0\n\t],\n\t\"./pt/_lib/formatRelative/index.js\": [\n\t\t200,\n\t\t0\n\t],\n\t\"./pt/_lib/localize/index.js\": [\n\t\t201,\n\t\t0\n\t],\n\t\"./pt/_lib/match/index.js\": [\n\t\t202,\n\t\t0\n\t],\n\t\"./pt/index.js\": [\n\t\t371,\n\t\t0\n\t],\n\t\"./ro/_lib/formatDistance/index.js\": [\n\t\t208,\n\t\t0\n\t],\n\t\"./ro/_lib/formatLong/index.js\": [\n\t\t209,\n\t\t0\n\t],\n\t\"./ro/_lib/formatRelative/index.js\": [\n\t\t210,\n\t\t0\n\t],\n\t\"./ro/_lib/localize/index.js\": [\n\t\t211,\n\t\t0\n\t],\n\t\"./ro/_lib/match/index.js\": [\n\t\t212,\n\t\t0\n\t],\n\t\"./ro/index.js\": [\n\t\t373,\n\t\t0\n\t],\n\t\"./ru/_lib/formatDistance/index.js\": [\n\t\t213,\n\t\t0\n\t],\n\t\"./ru/_lib/formatLong/index.js\": [\n\t\t214,\n\t\t0\n\t],\n\t\"./ru/_lib/formatRelative/index.js\": [\n\t\t215,\n\t\t0\n\t],\n\t\"./ru/_lib/localize/index.js\": [\n\t\t216,\n\t\t0\n\t],\n\t\"./ru/_lib/match/index.js\": [\n\t\t217,\n\t\t0\n\t],\n\t\"./ru/index.js\": [\n\t\t374,\n\t\t0\n\t],\n\t\"./sk/_lib/formatDistance/index.js\": [\n\t\t218,\n\t\t0\n\t],\n\t\"./sk/_lib/formatLong/index.js\": [\n\t\t219,\n\t\t0\n\t],\n\t\"./sk/_lib/formatRelative/index.js\": [\n\t\t220,\n\t\t0\n\t],\n\t\"./sk/_lib/localize/index.js\": [\n\t\t221,\n\t\t0\n\t],\n\t\"./sk/_lib/match/index.js\": [\n\t\t222,\n\t\t0\n\t],\n\t\"./sk/index.js\": [\n\t\t375,\n\t\t0\n\t],\n\t\"./sv/_lib/formatDistance/index.js\": [\n\t\t223,\n\t\t0\n\t],\n\t\"./sv/_lib/formatLong/index.js\": [\n\t\t224,\n\t\t0\n\t],\n\t\"./sv/_lib/formatRelative/index.js\": [\n\t\t225,\n\t\t0\n\t],\n\t\"./sv/_lib/localize/index.js\": [\n\t\t226,\n\t\t0\n\t],\n\t\"./sv/_lib/match/index.js\": [\n\t\t227,\n\t\t0\n\t],\n\t\"./sv/index.js\": [\n\t\t376,\n\t\t0\n\t],\n\t\"./th/_lib/formatDistance/index.js\": [\n\t\t228,\n\t\t0\n\t],\n\t\"./th/_lib/formatLong/index.js\": [\n\t\t229,\n\t\t0\n\t],\n\t\"./th/_lib/formatRelative/index.js\": [\n\t\t230,\n\t\t0\n\t],\n\t\"./th/_lib/localize/index.js\": [\n\t\t231,\n\t\t0\n\t],\n\t\"./th/_lib/match/index.js\": [\n\t\t232,\n\t\t0\n\t],\n\t\"./th/index.js\": [\n\t\t377,\n\t\t0\n\t],\n\t\"./tr/_lib/formatDistance/index.js\": [\n\t\t233,\n\t\t0\n\t],\n\t\"./tr/_lib/formatLong/index.js\": [\n\t\t234,\n\t\t0\n\t],\n\t\"./tr/_lib/formatRelative/index.js\": [\n\t\t235,\n\t\t0\n\t],\n\t\"./tr/_lib/localize/index.js\": [\n\t\t236,\n\t\t0\n\t],\n\t\"./tr/_lib/match/index.js\": [\n\t\t237,\n\t\t0\n\t],\n\t\"./tr/index.js\": [\n\t\t378,\n\t\t0\n\t],\n\t\"./ug/_lib/formatDistance/index.js\": [\n\t\t238,\n\t\t0\n\t],\n\t\"./ug/_lib/formatLong/index.js\": [\n\t\t239,\n\t\t0\n\t],\n\t\"./ug/_lib/formatRelative/index.js\": [\n\t\t240,\n\t\t0\n\t],\n\t\"./ug/_lib/localize/index.js\": [\n\t\t241,\n\t\t0\n\t],\n\t\"./ug/_lib/match/index.js\": [\n\t\t242,\n\t\t0\n\t],\n\t\"./ug/index.js\": [\n\t\t379,\n\t\t0\n\t],\n\t\"./uk/_lib/formatDistance/index.js\": [\n\t\t243,\n\t\t0\n\t],\n\t\"./uk/_lib/formatLong/index.js\": [\n\t\t244,\n\t\t0\n\t],\n\t\"./uk/_lib/formatRelative/index.js\": [\n\t\t245,\n\t\t0\n\t],\n\t\"./uk/_lib/localize/index.js\": [\n\t\t246,\n\t\t0\n\t],\n\t\"./uk/_lib/match/index.js\": [\n\t\t247,\n\t\t0\n\t],\n\t\"./uk/index.js\": [\n\t\t380,\n\t\t0\n\t],\n\t\"./vi/_lib/formatDistance/index.js\": [\n\t\t248,\n\t\t0\n\t],\n\t\"./vi/_lib/formatLong/index.js\": [\n\t\t249,\n\t\t0\n\t],\n\t\"./vi/_lib/formatRelative/index.js\": [\n\t\t250,\n\t\t0\n\t],\n\t\"./vi/_lib/localize/index.js\": [\n\t\t251,\n\t\t0\n\t],\n\t\"./vi/_lib/match/index.js\": [\n\t\t252,\n\t\t0\n\t],\n\t\"./vi/index.js\": [\n\t\t381,\n\t\t0\n\t],\n\t\"./zh-CN/_lib/formatDistance/index.js\": [\n\t\t253,\n\t\t0\n\t],\n\t\"./zh-CN/_lib/formatLong/index.js\": [\n\t\t254,\n\t\t0\n\t],\n\t\"./zh-CN/_lib/formatRelative/index.js\": [\n\t\t255,\n\t\t0\n\t],\n\t\"./zh-CN/_lib/localize/index.js\": [\n\t\t256,\n\t\t0\n\t],\n\t\"./zh-CN/_lib/match/index.js\": [\n\t\t257,\n\t\t0\n\t],\n\t\"./zh-CN/index.js\": [\n\t\t382,\n\t\t0\n\t],\n\t\"./zh-TW/_lib/formatDistance/index.js\": [\n\t\t258,\n\t\t0\n\t],\n\t\"./zh-TW/_lib/formatLong/index.js\": [\n\t\t259,\n\t\t0\n\t],\n\t\"./zh-TW/_lib/formatRelative/index.js\": [\n\t\t260,\n\t\t0\n\t],\n\t\"./zh-TW/_lib/localize/index.js\": [\n\t\t261,\n\t\t0\n\t],\n\t\"./zh-TW/_lib/match/index.js\": [\n\t\t262,\n\t\t0\n\t],\n\t\"./zh-TW/index.js\": [\n\t\t383,\n\t\t0\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__.t(id, 7);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 308;\nmodule.exports = webpackAsyncContext;","import React, { Component } from 'react';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport \"./ErrorBanner.scss\";\r\n\r\nconst ErrorBannerContext = React.createContext();\r\nconst Consumer = ErrorBannerContext.Consumer;\r\n\r\n/**\r\n * Error banner provider\r\n */\r\nclass ErrorBannerProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n message: undefined,\r\n param: undefined,\r\n retry: undefined\r\n }\r\n }\r\n\r\n /**\r\n * display error message in banner\r\n * @param message message resource key\r\n * @param param parameters for the resource\r\n * @param retry lambda to be executed on retry click\r\n */\r\n displayErrorMessage(message, param, retry) {\r\n this.setState({message: message, param: param, retry: retry});\r\n }\r\n\r\n render() {\r\n return (\r\n this.displayErrorMessage(msg, param, retry),\r\n closeErrorBanner: () => this.displayErrorMessage(undefined, {}, undefined),\r\n message: this.state.message,\r\n msgParams: this.state.param,\r\n retryFct: this.state.retry\r\n }}>\r\n {this.props.children}\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Error banner, shows error in provider in a banner\r\n */\r\nfunction ErrorBanner() {\r\n return (\r\n \r\n {({ message, msgParams, retryFct, closeErrorBanner }) => (\r\n message ?\r\n (
\r\n
\r\n
\r\n \r\n
\r\n
\r\n {retryFct ?\r\n \r\n : null }\r\n \r\n
\r\n
)\r\n : null\r\n )}\r\n
);\r\n}\r\n\r\nexport { ErrorBannerProvider, Consumer as ErrorBannerConsumer, ErrorBannerContext, ErrorBanner };\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport Leaflet from 'leaflet';\r\n\r\nimport \"./Map.scss\";\r\nimport \"leaflet/dist/leaflet.css\";\r\n\r\n/**\r\n * Component that shows a map\r\n */\r\nclass Map extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {map: undefined}\r\n }\r\n\r\n componentDidMount() {\r\n // create map control\r\n var map = new Leaflet.Map(this.mapContainer, this.getMapOptions());\r\n // controls should be only on desktop, at the bottom right\r\n if (Leaflet.Browser.mobile)\r\n map.removeControl(map.zoomControl);\r\n else\r\n map.zoomControl.setPosition('bottomright');\r\n\r\n if (this.props.onLongPress) {\r\n map.on('contextmenu', (mouseEvent) => this.props.onLongPress(mouseEvent.latlng));\r\n }\r\n\r\n // On force la carte a recalculer sa taille après le chargement: ref obs607783\r\n map.whenReady(() => {\r\n this.invalidateSize();\r\n })\r\n\r\n map.createPane('geoJsonPane');\r\n map.getPane('geoJsonPane').style.zIndex = 450;\r\n\r\n this.setState(\r\n { map: map },\r\n // Force Leaflet to recalculate the canvas size.\r\n // This has to be done in dev mode since the CSS is loaded after the leaflet JS\r\n // In production mode, css is loaded in link tags in the head, and therefore this is not a problem\r\n () => {\r\n this.invalidateSize();\r\n }\r\n );\r\n }\r\n\r\n componentWillUnmount() {\r\n this.state.map.remove();\r\n }\r\n\r\n /**\r\n * Builds the map options from props\r\n * @returns {object} mapOptions object that can be used with leaflet\r\n */\r\n getMapOptions() {\r\n let mapOptions = {\r\n preferCanvas: true, /*Permet d'afficher une grande quantité de GeoJSON efficacement*/\r\n layers: [\r\n Leaflet.tileLayer(this.props.tileServerURL, {\r\n accessToken: this.props.accessToken,\r\n attribution: this.props.attribution,\r\n zoomOffset: this.props.zoomOffset,\r\n tileSize: this.props.tileSize\r\n })\r\n ],\r\n center: this.props.center,\r\n zoom: this.props.zoom,\r\n minZoom: this.props.minZoom,\r\n maxZoom: this.props.maxZoom\r\n };\r\n\r\n return (mapOptions);\r\n }\r\n\r\n /**\r\n * Invalidate map size. Must be called when the number of tiles shown has to be recalculated.\r\n */\r\n invalidateSize() {\r\n setTimeout(() => this.state.map.invalidateSize(), 0);\r\n }\r\n\r\n /**\r\n * renders the map component\r\n */\r\n render () {\r\n return (\r\n
\r\n
this.mapContainer = el}>\r\n {\r\n this.state.map &&\r\n React.Children.map(this.props.children, (child, index) => {\r\n if (!child)\r\n return (null);\r\n return (React.cloneElement(child, {\r\n map: this.state.map,\r\n layerOrder: index+1\r\n }));\r\n })\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nMap.defaultProps = {\r\n zoom: 10\r\n}\r\n\r\nMap.propTypes = {\r\n /**\r\n * defines the access token for the map service, when null,\r\n * a tileServerURL must be provided\r\n */\r\n accessToken: PropTypes.string,\r\n /**\r\n * defines the attribution text to display on the map,\r\n * might be required legally depending on the tile server used.\r\n */\r\n attribution: PropTypes.string,\r\n /**\r\n * defines the center of the map, default is 0,0\r\n */\r\n center: PropTypes.arrayOf(PropTypes.any),\r\n /**\r\n * defines the map container css classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * function to call when doing a long press on the map. There is\r\n * no default action for the long press\r\n */\r\n onLongPress: PropTypes.func,\r\n /**\r\n * defines the minimum zoom, default is 0\r\n */\r\n minZoom: PropTypes.number,\r\n /**\r\n * defines the maximum zoom, default is 21\r\n */\r\n maxZoom: PropTypes.number,\r\n /**\r\n * defines the maximum bounds to restricts the map to the given geographical bounds.\r\n */\r\n maxBounds: PropTypes.array,\r\n /**\r\n * defines the url for the tile server,\r\n * ex: \"http://myurl/tileserver/{z}/{x}/{y}.png\"\r\n */\r\n tileServerURL: PropTypes.string.isRequired,\r\n /**\r\n * defines the default zoom level, default value is 10\r\n */\r\n zoom: PropTypes.number\r\n}\r\n\r\nexport default Map;\r\n","import { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport Leaflet from 'leaflet';\r\n\r\n/**\r\n * Component that show an image overlay on a map\r\n */\r\nclass MapImageLayer extends Component {\r\n componentDidMount() {\r\n // Create layer and add to map\r\n this.layer = Leaflet.imageOverlay(this.props.imageUrl, this.props.imageBounds, {\r\n zIndex: this.props.layerOrder\r\n });\r\n this.layer.addTo(this.props.map);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.layer.remove();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // Update image layer\r\n if (this.props.imageUrl !== prevProps.imageUrl) {\r\n this.layer.setUrl(this.props.imageUrl);\r\n }\r\n if (this.props.imageBounds !== prevProps.imageBounds) {\r\n this.layer.setBounds(this.props.imageBounds);\r\n }\r\n }\r\n\r\n /**\r\n * renders the image overlay component\r\n */\r\n render() {\r\n return (null);\r\n }\r\n}\r\n\r\nMapImageLayer.propTypes = {\r\n /**\r\n * defines the layer order in the map.\r\n */\r\n layerOrder: PropTypes.number,\r\n /**\r\n * defines the map object on which to add the layer\r\n */\r\n map: PropTypes.object,\r\n /**\r\n * defines the url for the image to show in the overlay layer\r\n */\r\n imageUrl: PropTypes.string,\r\n /**\r\n * defines the bounds where the image layer will be shown\r\n */\r\n imageBounds: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number))\r\n}\r\nexport default MapImageLayer;\r\n","import { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nimport Leaflet from 'leaflet';\r\n\r\n/**\r\n * Component that display a marker on the map.\r\n */\r\nclass Marker extends Component {\r\n componentDidMount() {\r\n this.marker = this.createMarker();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.removeMarker();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // Delete the existing marker when the latitude or the longitude is not defined\r\n if (!this.props.latitude || !this.props.longitude) {\r\n this.removeMarker();\r\n return;\r\n }\r\n // Create a new marker if it was not initialized in the componentDidMount lifecycle\r\n this.marker = this.marker ? this.marker : this.createMarker();\r\n\r\n if (this.props.popupText !== prevProps.popupText) {\r\n if (this.props.popupText && !prevProps.popupText)\r\n this.marker.bindPopup(this.props.popupText, { className: \"marker-popup\", closeButton: false }).openPopup();\r\n else if (this.props.popupText)\r\n this.marker.setPopupContent(this.props.popupText).openPopup();\r\n else if (!this.props.popupText)\r\n this.removePopup();\r\n }\r\n\r\n // Update the marker icon\r\n if (this.props.iconUrl !== prevProps.iconUrl) {\r\n this.marker.setIcon(Leaflet.icon(this.getIconOptions()));\r\n }\r\n\r\n // Update the marker position\r\n if (this.props.latitude !== prevProps.latitude || this.props.longitude !== prevProps.longitude) {\r\n var newPos = Leaflet.latLng(this.props.latitude, this.props.longitude);\r\n this.marker.setLatLng(newPos);\r\n\r\n // Offset marker\r\n if (this.props.centerOffset) {\r\n var targetPoint = this.props.map.project(newPos).subtract([0, this.props.centerOffset() / 2]);\r\n newPos = this.props.map.unproject(targetPoint);\r\n }\r\n\r\n this.props.map.flyTo(newPos);\r\n }\r\n }\r\n /**\r\n * Create the marker and add it to the map\r\n * @returns {object} the marker object\r\n */\r\n createMarker() {\r\n if (!this.props.map || !this.props.latitude || !this.props.longitude) {\r\n return;\r\n }\r\n\r\n var marker = Leaflet.marker([this.props.latitude, this.props.longitude], {\r\n icon: Leaflet.icon(this.getIconOptions()),\r\n draggable: this.props.draggable\r\n });\r\n\r\n marker.addTo(this.props.map);\r\n\r\n if (this.props.draggable) {\r\n marker.on('dragend', () => {\r\n var position = marker.getLatLng();\r\n if (this.props.onDragEnd)\r\n this.props.onDragEnd(position);\r\n });\r\n }\r\n\r\n if (this.props.popupText) {\r\n /* todo: pour être générique, probablement que la classe et les options doivent être configurable */\r\n marker.bindPopup(this.props.popupText, {\r\n className: \"marker-popup\",\r\n closeButton: false\r\n }).openPopup().on('popupclose', () => {\r\n if (this.props.onClosePopup)\r\n this.props.onClosePopup();\r\n });\r\n }\r\n\r\n return (marker);\r\n }\r\n\r\n /**\r\n * Remove the popup on the marker\r\n */\r\n removePopup() {\r\n if (this.marker) {\r\n // remove popup\r\n this.marker.closePopup();\r\n this.marker.unbindPopup();\r\n }\r\n }\r\n\r\n /**\r\n * Remove the marker on the map\r\n */\r\n removeMarker() {\r\n if (this.marker) {\r\n // remove popup\r\n this.removePopup();\r\n // remove marker\r\n this.marker.remove();\r\n this.marker = null;\r\n }\r\n }\r\n /**\r\n * Get the icon options from the props\r\n * @returns {object} iconOptions object use to create the marker\r\n */\r\n getIconOptions() {\r\n const iconClassNames = classNames(this.props.className,\r\n {\r\n 'leaflet-default-icon-path': !this.props.iconUrl\r\n });\r\n\r\n let iconOptions = {\r\n iconUrl: this.props.iconUrl,\r\n className: iconClassNames,\r\n iconAnchor: this.props.iconAnchor,\r\n popupAnchor: [0, this.props.iconAnchor? this.props.iconAnchor[1]*-1 : 0]\r\n };\r\n\r\n return (iconOptions);\r\n }\r\n\r\n /**\r\n * renders the marker component\r\n */\r\n render() {\r\n return (null);\r\n }\r\n}\r\n\r\nMarker.propTypes = {\r\n /**\r\n * defines the map object on which to add the marker\r\n */\r\n map: PropTypes.object,\r\n /**\r\n * defines the url for the marker icon\r\n */\r\n iconUrl: PropTypes.string,\r\n /**\r\n * Used to centered the icon by providing its coordinates. Useful when using a custom icon.\r\n * An array of two numnbers. The first number defines the icon css margin-left properties.\r\n * The second number defines the icon css margin-top properties.\r\n */\r\n iconAnchor: PropTypes.arrayOf(PropTypes.number),\r\n /**\r\n * defines the latitude of the marker\r\n */\r\n latitude: PropTypes.number,\r\n /**\r\n * defines the longitude of the marker\r\n */\r\n longitude: PropTypes.number,\r\n /**\r\n * defines the marker css classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * Indicates if the marker is draggable or not\r\n */\r\n draggable: PropTypes.bool,\r\n /**\r\n * A callback to execute when the user stops dragging the marker on the map.\r\n */\r\n onDragEnd: PropTypes.func,\r\n /**\r\n * Text to show in a popup over the marker, when empty, no popup is shown\r\n */\r\n popupText: PropTypes.string,\r\n /**\r\n * Callback to execute when marker popup is closed.\r\n */\r\n onClosePopup: PropTypes.func\r\n}\r\n\r\nexport default Marker;\r\n","import { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport Leaflet from 'leaflet';\r\n\r\n/**\r\n * Component that show a GeoJSON overlay on a map\r\n */\r\nclass MapGeoJSONLayer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.zoomOption = { weight: props.strokeWidth, opacity: props.opacity }\r\n this.zoomOptions = new Map();\r\n props.zoomOptions.forEach((opt) => {\r\n this.zoomOptions.set(opt.zoom, { opacity: opt.opacity, weight: opt.width });\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n // Create layer and add to map\r\n this.createJsonLayer();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.layer.remove();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // Update image layer\r\n if (this.props.data !== prevProps.data) {\r\n this.layer.remove();\r\n this.createJsonLayer();\r\n }\r\n }\r\n\r\n /**\r\n * creates the json layer from data\r\n */\r\n createJsonLayer() {\r\n this.layer = Leaflet.geoJSON(this.props.data, {\r\n zIndex: this.props.layerOrder,\r\n style: { weight: this.zoomOption.weight, color: this.props.color, opacity: this.zoomOption.opacity },\r\n pane: 'geoJsonPane'\r\n });\r\n this.layer.addTo(this.props.map);\r\n this.props.map.on(\"zoomend\", () => this.setStyleFromZoom());\r\n }\r\n\r\n /**\r\n * Set style from zoom level\r\n */\r\n setStyleFromZoom() {\r\n var currentZoomLevel = this.props.map.getZoom();\r\n\r\n var weight = this.props.strokeWidth;\r\n var opacity = this.props.opacity;\r\n\r\n // Trouver le plus gros zoom dans la config qui ne dépasse\r\n // pas le zoom courant, par ex si dans la config on a 10 15 20\r\n // et le zoom courant est de 12, on va appliquer les config du 10\r\n for (var [key, value] of this.zoomOptions) {\r\n if (key <= currentZoomLevel) {\r\n weight = value.weight;\r\n opacity = value.opacity;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (this.zoomOption.weight !== weight || this.zoomOption.opacity !== opacity) {\r\n this.zoomOption = { weight, opacity };\r\n this.layer.setStyle({ weight, opacity });\r\n // ** hack, il semble avoir un bogue dans leaflet qui fait un reset de l'opacité à 1\r\n // ** on force un redraw de cette façon, c'est aussi pour cette raison qu'on fait un setStyle\r\n // ** seulement si le style à changé\r\n this.props.map.panBy([0,1]);\r\n }\r\n }\r\n\r\n /**\r\n * renders the image overlay component\r\n */\r\n render() {\r\n return (null);\r\n }\r\n}\r\n\r\nMapGeoJSONLayer.defaultProps = {\r\n strokeWidth : 2,\r\n opacity: 0.3,\r\n zoomOptions: []\r\n}\r\n\r\nMapGeoJSONLayer.propTypes = {\r\n /**\r\n * Color of the path strokes for the geoJson data\r\n */\r\n color: PropTypes.string,\r\n /**\r\n * GeoJson object to display, can also be an array of coordinates\r\n */\r\n data: PropTypes.object,\r\n /**\r\n * defines the layer order in the map.\r\n */\r\n layerOrder: PropTypes.number,\r\n /**\r\n * defines the map object on which to add the layer\r\n */\r\n map: PropTypes.object,\r\n /**\r\n * Stroke opacity (alpha channel), must be between 0 and 1\r\n */\r\n opacity: PropTypes.number,\r\n /**\r\n * Stroke width\r\n */\r\n strokeWidth: PropTypes.number,\r\n /**\r\n * Opacity and weight by zoom level\r\n */\r\n zoomOptions: PropTypes.array\r\n}\r\nexport default MapGeoJSONLayer;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { httpGet } from 'giro-react-toolkit/source/UtilityFunctions/Ajax';\r\nimport Loading from 'giro-react-toolkit/source/Loading';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport { MapImageLayer } from 'Map'\r\nimport { ErrorBannerContext } from 'ErrorBanner'\r\n\r\nimport './IsochroneMapLayer.scss';\r\n\r\n/**\r\n * Isochrone map layer component\r\n */\r\nclass IsochroneMapLayer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { bounds: undefined, image: undefined, loading: false };\r\n\r\n this.handleRefreshButtonClick = this.handleRefreshButtonClick.bind(this);\r\n\r\n // utilisé pour le fetch d'isochrone, permet d'annuler un appel pour éviter d'avoir les\r\n // retours multiple dans le désordre et de ne pas afficher la bonne information\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * Fetches the isochrone from the web services\r\n */\r\n getIsochrone(firstLoad) {\r\n // Cancel the in progress isochrone request and make a new one.\r\n if (this.abortController)\r\n this.abortController.abort();\r\n\r\n // props must be initialized to fetch image\r\n if (!this.arePropsInitialized()) {\r\n // remove the existing isochrone map layer\r\n this.setState({ bounds: undefined, image: undefined, loading: false });\r\n return;\r\n }\r\n\r\n var params = {\r\n latitude: this.props.latitude,\r\n longitude: this.props.longitude,\r\n day: this.props.day,\r\n time: this.props.time,\r\n duration: this.props.duration,\r\n scenario: this.props.concept\r\n }\r\n\r\n this.setState({ loading: true });\r\n\r\n var showError = (response) => {\r\n this.context.displayErrorMessage(\r\n \"ReachMapRes.IsochroneFetchErrorText\",\r\n [ response.status ],\r\n () => {\r\n this.getIsochrone()\r\n } /*retryFct*/);\r\n };\r\n\r\n if (window.AbortController)\r\n this.abortController = new AbortController();\r\n\r\n var signal = this.abortController ? this.abortController.signal : null;\r\n\r\n httpGet('home/ReachMap', { params, fetchOptions: { signal }, errorHandler: showError }).then(result => {\r\n // on successful response, update object\r\n this.setState({\r\n bounds: result ? result.Bounds : undefined,\r\n image: result ? (\"data:image/jpeg;base64,\" + result.Image) : undefined,\r\n loading: false\r\n });\r\n if (this.props.onFetchCompleted) {\r\n this.props.onFetchCompleted(result && result.Image /*hasImage*/, firstLoad);\r\n }\r\n\r\n });\r\n }\r\n\r\n arePropsInitialized() {\r\n return (this.props.latitude &&\r\n this.props.longitude &&\r\n this.props.day &&\r\n this.props.time &&\r\n this.props.duration &&\r\n this.props.concept);\r\n }\r\n\r\n componentDidMount() {\r\n this.getIsochrone(true /*firstLoad*/);\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // If props have changed, fetch new isochrone\r\n if (this.props.latitude !== prevProps.latitude ||\r\n this.props.longitude !== prevProps.longitude ||\r\n this.props.day !== prevProps.day ||\r\n this.props.duration !== prevProps.duration ||\r\n this.props.time !== prevProps.time ||\r\n this.props.concept !== prevProps.concept) {\r\n this.getIsochrone(false /*firstLoad*/);\r\n }\r\n }\r\n\r\n handleRefreshButtonClick() {\r\n if (this.props.onRefreshButtonClick)\r\n this.props.onRefreshButtonClick();\r\n }\r\n\r\n generateRefreshButton() {\r\n /* TODO le bouton devrait être mis dans app */\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Render Isochrone layer on map\r\n */\r\n render() {\r\n return (\r\n \r\n {this.props.showRefreshButton && this.generateRefreshButton()}\r\n {this.state.loading && }\r\n {this.arePropsInitialized() && this.state.image && this.state.bounds &&\r\n }\r\n );\r\n }\r\n}\r\n\r\nIsochroneMapLayer.contextType = ErrorBannerContext;\r\n\r\nIsochroneMapLayer.propTypes = {\r\n /**\r\n * defines the latitude of the start point for the isochrone\r\n */\r\n latitude: PropTypes.number,\r\n /**\r\n * defines the longitude of the start point for the isochrone\r\n */\r\n longitude: PropTypes.number,\r\n /**\r\n * defines the day of the week (monday, tuesday, etc) for the isochrone\r\n */\r\n day: PropTypes.string,\r\n /**\r\n * defines the total max duration for the isochrone\r\n */\r\n duration: PropTypes.number,\r\n /**\r\n * defines the time for the start point of the isochrone in format hh:mm\r\n */\r\n time: PropTypes.oneOfType([\r\n PropTypes.string,\r\n PropTypes.instanceOf(Date)\r\n ]),\r\n /**\r\n * defines the selected concept\r\n */\r\n concept: PropTypes.string,\r\n /**\r\n * Called when the fetch is completed\r\n */\r\n onFetchCompleted: PropTypes.func,\r\n /**\r\n * The isochrone map layer shows the refresh button\r\n */\r\n showRefreshButton: PropTypes.bool,\r\n /**\r\n * Called when the refresh button is clicked\r\n */\r\n onRefreshButtonClick: PropTypes.func\r\n}\r\n\r\nexport default IsochroneMapLayer;\r\n","import IsochroneMapLayer from './IsochroneMapLayer';\r\nexport default IsochroneMapLayer;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { httpGet } from 'giro-react-toolkit/source/UtilityFunctions/Ajax';\r\n\r\nimport {MapGeoJSONLayer} from 'Map';\r\n\r\n/**\r\n * Routes map layer component\r\n */\r\nclass RoutesMapLayer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { routes: [] };\r\n\r\n this.getRoutesMap = this.getRoutesMap.bind(this);\r\n\r\n this.abortController = null;\r\n }\r\n\r\n /**\r\n * Fetches the routes map from the web services\r\n */\r\n getRoutesMap() {\r\n // props must be initialized to fetch image\r\n if (!(this.props.day && this.props.concept && this.props.map)) {\r\n // remove the existing routes map layer\r\n this.setState({ routes: [] });\r\n return;\r\n }\r\n\r\n var params = {\r\n dayOfWeek: this.props.day,\r\n scenario: this.props.concept\r\n }\r\n\r\n // Cancel the in progress request.\r\n if (this.abortController)\r\n this.abortController.abort();\r\n\r\n if (window.AbortController)\r\n this.abortController = new AbortController();\r\n\r\n let signal = this.abortController ? this.abortController.signal : null;\r\n\r\n this.getRoutesMapRequest = httpGet('home/RoutesLayer', { params, fetchOptions: { signal } });\r\n\r\n this.getRoutesMapRequest\r\n .then(result => {\r\n this.setState({\r\n routes: result && result.Geometries ? result.Geometries : []\r\n });\r\n }).catch((error) => {\r\n if (!error.isCanceled) {\r\n // todo: gerer les erreurs\r\n this.setState({ routes: [] });\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n if (!this.props.map)\r\n return;\r\n\r\n this.getRoutesMap();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // If props have changed, fetch new routes map\r\n if (this.props.day !== prevProps.day || this.props.concept !== prevProps.concept)\r\n this.getRoutesMap();\r\n }\r\n\r\n /**\r\n * render routes layer on map\r\n */\r\n render() {\r\n var data = {\r\n \"type\": \"MultiLineString\",\r\n \"coordinates\": this.state.routes\r\n };\r\n\r\n // get color concept from configs\r\n var concept = reachMap.concept.scenarios.find(item => {\r\n return item.Value === this.props.concept\r\n });\r\n\r\n var color;\r\n if (concept)\r\n color = concept.NetworkColor;\r\n\r\n if (this.state.routes.length)\r\n return ();\r\n\r\n return (null);\r\n }\r\n}\r\n\r\nRoutesMapLayer.propTypes = {\r\n /**\r\n * defines the day of the week (monday, tuesday, etc) for the routes map\r\n */\r\n day: PropTypes.string,\r\n /**\r\n * defines the selected concept\r\n */\r\n concept: PropTypes.string,\r\n /**\r\n * defines the map object on which to add the layer\r\n */\r\n map: PropTypes.object\r\n}\r\n\r\nexport default RoutesMapLayer;\r\n","import RoutesMapLayer from './RoutesMapLayer';\r\nexport default RoutesMapLayer;\r\n","import React from 'react';\r\nimport { TranslationConsumer } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport \"./LanguageSelection.scss\"\r\n\r\n/**\r\n * Component used to select a language.\r\n */\r\nfunction LanguageSelection(props) {\r\n return (\r\n \r\n {({ supportedCultures, currentCulture }) => {\r\n if (supportedCultures.length < 2)\r\n return (null);\r\n\r\n return (\r\n
\r\n { !props.inLineMode &&
}\r\n {\r\n // Faire un redirection qui permet au serveur de changer la langue courante.\r\n // Il est possible que le routing (react-router ou autre) ne soit pas compatible\r\n // avec ce type de redirection.\r\n document.location.href = document.baseURI + \"?culture=\" + e.target.value;\r\n }}>\r\n {\r\n supportedCultures.map(lang => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n
\r\n );\r\n }}\r\n
\r\n );\r\n}\r\n\r\nexport default LanguageSelection;\r\n","import LanguageSelection from './LanguageSelection';\r\nexport default LanguageSelection;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ToggleSwitch from 'giro-react-toolkit/source/ToggleSwitch';\r\n\r\nimport './Concept.scss';\r\n\r\n/**\r\n * Component used to select a network concept.\r\n */\r\nclass Concept extends Component {\r\n\r\n componentWillMount() {\r\n this.concepts = reachMap.concept.scenarios.map((item) => {\r\n return ({\r\n label: this.generateLabel(item.Label, item.NetworkColor),\r\n value: item.Value\r\n });\r\n });\r\n }\r\n\r\n generateLabel(labelText, color) {\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {labelText}\r\n \r\n
);\r\n }\r\n\r\n/**\r\n * renders the Concept component\r\n */\r\n render() {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConcept.propTypes = {\r\n /**\r\n * The selected concept value\r\n */\r\n selectedConcept: PropTypes.string,\r\n /**\r\n * A callback called when a concept is selected\r\n */\r\n onSelectedConcept: PropTypes.func\r\n}\r\n\r\nexport default Concept;\r\n","import Concept from './Concept';\r\nexport default Concept;\r\n","/**\r\n * Calculate the isochrone step time from the index (zero based)\r\n * @param {number} index\r\n * @param {number} totalDur\r\n */\r\nexport function indexToMinutes(index, totalDur) {\r\n const stepLength = totalDur / reachMap.legend.colors.length;\r\n\r\n const value = Math.round((index + 1) * stepLength);\r\n\r\n return (value);\r\n}\r\n","/**\r\n * A function acting like a class\r\n * Called when a promise is cancelled. The cancelled promise will be rejected with CanceledPromiseError reason.\r\n * It allows us to differentiate if promise is rejected because of cancellation or for any other reason.\r\n * https://stackoverflow.com/questions/41927040/generate-customized-exceptions-in-react\r\n * Idéalement il faudrait une classe qui hérite de 'Error'.\r\n * Pour cela il faut activer le plugin babel babel-plugin-transform-builtin-extend.\r\n * https://www.npmjs.com/package/babel-plugin-transform-builtin-extend\r\n */\r\nexport function CanceledPromiseError() {\r\n this.message = \"Promise canceled\";\r\n this.name = \"CanceledPromiseError\";\r\n}\r\n\r\n/**\r\n * Wraps a promise in an object to allow cancellation.\r\n * A cancelled promise will always be rejected\r\n * https://medium.com/@rajeshnaroth/writing-a-react-hook-to-cancel-promises-when-a-component-unmounts-526efabf251f\r\n * @param {any} promise The promise to wrap\r\n */\r\nexport function makeCancelable(promise) {\r\n let isCanceled = false;\r\n\r\n const wrappedPromise =\r\n new Promise((resolve, reject) => {\r\n promise\r\n .then(\r\n val => (isCanceled\r\n ? reject(new CanceledPromiseError())\r\n : resolve(val))\r\n )\r\n .catch(\r\n error => (isCanceled\r\n ? reject(new CanceledPromiseError())\r\n : reject(error))\r\n );\r\n });\r\n\r\n return {\r\n promise: wrappedPromise,\r\n cancel() {\r\n isCanceled = true;\r\n },\r\n };\r\n}\r\n\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { httpGet } from 'giro-react-toolkit/source/UtilityFunctions/Ajax';\r\nimport Loading from 'giro-react-toolkit/source/Loading';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport ClassNames from \"classnames\";\r\nimport { ErrorBannerContext } from 'ErrorBanner';\r\nimport { indexToMinutes } from '../utilities/CommuteTimes';\r\nimport { CanceledPromiseError, makeCancelable } from '../utilities/Promise';\r\n\r\nimport './CensusStats.scss';\r\n\r\n/**\r\n * Composant qui affiche une ligne du tableau de recensement\r\n */\r\nfunction CensusTableRow(props) {\r\n if (!props.current ||\r\n !props.future ||\r\n props.index >= reachMap.census.statisticTypes.length ||\r\n !reachMap.census.statisticTypes[props.index])\r\n return null;\r\n\r\n const variation = props.future - props.current;\r\n const percent = Math.round((variation / props.current) * 100);\r\n const percentText = ((percent === 0) ? \"~0\" : percent.toString());\r\n\r\n const classNames = ClassNames(\"census-stat-percent\", {\r\n \"census-stat-positive\": variation >= 0,\r\n \"census-stat-negative\": variation < 0,\r\n \"census-stat-hidden\": variation == 0\r\n });\r\n\r\n return (\r\n \r\n {reachMap.census.statisticTypes[props.index].Label}\r\n {props.current}\r\n {props.future}\r\n \r\n
\r\n
\r\n {variation}\r\n
\r\n
\r\n {percentText}%\r\n
\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\n/**\r\n * Composant qui affiche un tableau de données de recensement\r\n * */\r\nclass CensusStats extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = { censusData: [], loading: false };\r\n\r\n this.abortControllerCurrent = null;\r\n this.abortControllerProposed = null;\r\n this.cancelablePromise = null;\r\n }\r\n\r\n componentDidMount() {\r\n if (this.arePropsInitialized())\r\n this.getCensusData();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.cancelProgressCensusDataRequest();\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // If props have changed, fetch new censusData\r\n // Do not fetch censusData if Location changed because this component will be unmounted if location changes\r\n if (this.props.isochroneParam.selectedDay !== prevProps.isochroneParam.selectedDay ||\r\n this.props.isochroneParam.selectedTime !== prevProps.isochroneParam.selectedTime ||\r\n this.props.isochroneParam.selectedDur !== prevProps.isochroneParam.selectedDur) {\r\n this.getCensusData();\r\n }\r\n }\r\n\r\n /**\r\n * Returns if props are initialized to get census data\r\n * */\r\n arePropsInitialized() {\r\n return (this.props.isochroneParam.selectedLocation.latitude &&\r\n this.props.isochroneParam.selectedLocation.longitude &&\r\n this.props.isochroneParam.selectedDay &&\r\n this.props.isochroneParam.selectedTime &&\r\n this.props.isochroneParam.selectedDur);\r\n }\r\n\r\n /**\r\n * Cancel the in progress census data request if any\r\n */\r\n cancelProgressCensusDataRequest() {\r\n if (this.abortControllerCurrent)\r\n this.abortControllerCurrent.abort();\r\n\r\n if (this.abortControllerProposed)\r\n this.abortControllerProposed.abort();\r\n\r\n if (this.cancelablePromise)\r\n this.cancelablePromise.cancel();\r\n }\r\n\r\n /**\r\n * Transforms census data from the API to a format that can be used easily in\r\n * this component\r\n * @param {object} currentScenarioData\r\n * @param {object} futureScenarioData\r\n */\r\n processCensusData(currentScenarioData, futureScenarioData) {\r\n\r\n // API returns a HttpStatusCodeResult instead of ContentResult if no data\r\n // HttpStatusCodeResult with no data has status code 204\r\n if ((currentScenarioData.status) && (currentScenarioData.status === 204))\r\n return ([]);\r\n\r\n // Merge both arrays into one with an object with current/future as the leaf\r\n return (\r\n currentScenarioData.TravelTimeRangeStats.map((timePeriod, i) => {\r\n return (\r\n timePeriod.map((data, j) => {\r\n return ({ current: data, future: futureScenarioData.TravelTimeRangeStats[i][j] });\r\n })\r\n );\r\n })\r\n )\r\n }\r\n\r\n /**\r\n * Fetches census data from props and saves it to state\r\n **/\r\n getCensusData() {\r\n // Cancel the in progress census data request and make a new one.\r\n this.cancelProgressCensusDataRequest();\r\n\r\n // on doit faire 2 appels aux services, une pour le scenario courrant et un autre\r\n // pour le scenario future pour permettre d'afficher et comparer les deux\r\n var paramsCurrent = {\r\n latitude: this.props.isochroneParam.selectedLocation.latitude,\r\n longitude: this.props.isochroneParam.selectedLocation.longitude,\r\n day: this.props.isochroneParam.selectedDay,\r\n time: this.props.isochroneParam.selectedTime,\r\n duration: this.props.isochroneParam.selectedDur,\r\n scenario: reachMap.concept.scenarios[0].Value//current scenario\r\n }\r\n\r\n var paramsFuture = { ...paramsCurrent, scenario: reachMap.concept.scenarios[1].Value };//proposed scenario\r\n\r\n this.setState({ loading: true });\r\n\r\n var showError = (response) => {\r\n this.context.displayErrorMessage(\r\n \"ReachMapRes.StatsFetchErrorText\",\r\n { errorCode: response.status });\r\n this.setState({ censusData: [], loading: false });\r\n };\r\n\r\n if (window.AbortController) {\r\n this.abortControllerCurrent = new AbortController();\r\n this.abortControllerProposed = new AbortController();\r\n }\r\n\r\n var signalCurrent = this.abortControllerCurrent ? this.abortControllerCurrent.signal : null;\r\n var signalProposed = this.abortControllerProposed ? this.abortControllerProposed.signal : null;\r\n\r\n // On fait les 2 appels en parallèle et on attend que les 2 appels soient complétés avant d'afficher les statistiques\r\n this.cancelablePromise = makeCancelable(\r\n Promise.all([\r\n httpGet('home/ReachMapStats', { params: paramsCurrent, fetchOptions: { signalCurrent }, errorHandler: showError }),\r\n httpGet('home/ReachMapStats', { params: paramsFuture, fetchOptions: { signalProposed }, errorHandler: showError })\r\n ]));\r\n\r\n this.cancelablePromise.promise.then(\r\n result => {\r\n if (result && result.length)\r\n this.setState({ censusData: this.processCensusData(result[0], result[1]), loading: false });\r\n else\r\n this.setState({ censusData: [], loading: false });\r\n },\r\n reason => {\r\n if (!(reason instanceof CanceledPromiseError)) {\r\n this.setState({ censusData: [], loading: false });\r\n showError({ status: '[rejected]' });\r\n }\r\n }\r\n ).catch(\r\n () => {\r\n this.setState({ censusData: [], loading: false });\r\n showError({ status: '[error]' });\r\n }\r\n );\r\n }\r\n\r\n render() {\r\n // afficher un chargement si les données ne sont pas chargées encore\r\n if (this.state.loading)\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n\r\n // si on n'a pas de données à afficher on affiche rien\r\n if (!this.state.censusData.length ||\r\n this.props.selectedTimeIndex == null ||\r\n this.state.censusData.length < this.props.selectedTimeIndex)\r\n return (null);\r\n\r\n const commuteTime = indexToMinutes(this.props.selectedTimeIndex, this.props.isochroneParam.selectedDur);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.state.censusData[this.props.selectedTimeIndex].map((r, i) => {\r\n return ()\r\n })}\r\n \r\n
 
\r\n
\r\n
\r\n );\r\n }\r\n\r\n}\r\n\r\nCensusStats.contextType = ErrorBannerContext;\r\n\r\nCensusStats.propTypes = {\r\n /**\r\n * Index (zero based) in the legend of the selected commute time\r\n * null when nothing is selected\r\n */\r\n selectedTimeIndex: PropTypes.number,\r\n\r\n /**\r\n * Isochrone parameters\r\n */\r\n isochroneParam: PropTypes.object\r\n}\r\n\r\nexport default CensusStats;\r\n","import CensusStats from './CensusStats';\r\nexport default CensusStats;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport ClassNames from \"classnames\";\r\n\r\nimport \"./Legend.scss\";\r\nimport { indexToMinutes } from '../../utilities/CommuteTimes';\r\n\r\n/**\r\n * Component that shows a legend\r\n */\r\nclass Legend extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.onLegendItemSelected = this.onLegendItemSelected.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n this.legendColors = reachMap.legend.colors;\r\n this.legendOpacity = reachMap.legend.opacity;\r\n }\r\n\r\n /**\r\n * Event handler that is called when user selects a commute time\r\n */\r\n onLegendItemSelected(index) {\r\n if ((this.props.canSelectItem) && (this.props.onCommuteTimeSelected))\r\n this.props.onCommuteTimeSelected(index);\r\n }\r\n\r\n /**\r\n * renders the legend component\r\n */\r\n render() {\r\n if (!this.legendColors || !this.legendColors.length)\r\n return (null);\r\n\r\n var cssClassNames = this.props.className ? \"legend \" + this.props.className : \"legend\";\r\n\r\n return (\r\n
    \r\n {\r\n this.legendColors.map((item, index) => {\r\n const value = indexToMinutes(index, this.props.totalDur);\r\n const itemClassNames = ClassNames(\r\n \"legend-item\",\r\n {\r\n \"legend-item--selected\": (this.props.selectedTimeIndex === index),\r\n \"legend-item--selectable\": this.props.canSelectItem\r\n }\r\n );\r\n const labelClassNames = ClassNames(\r\n \"legend-item__label\",\r\n {\r\n \"legend-item__label--selectable\": this.props.canSelectItem\r\n }\r\n );\r\n\r\n return (\r\n
  1. {\r\n this.onLegendItemSelected(index)\r\n }}>\r\n
    {value}
    \r\n
    \r\n
  2. \r\n );\r\n })\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nLegend.propTypes = {\r\n /**\r\n * defines the legend container css classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * total duration for the legend scale\r\n */\r\n totalDur: PropTypes.number.isRequired,\r\n /**\r\n * indicates if legend item selection is enabled (legend items are selectable if statistics option is available)\r\n */\r\n canSelectItem: PropTypes.bool,\r\n /**\r\n * The selected commute time (correspond à un item de la légende)\r\n */\r\n selectedCommuteTime: PropTypes.number,\r\n /**\r\n * function to call when a legend item is selected\r\n */\r\n onCommuteTimeSelected: PropTypes.func\r\n}\r\n\r\nLegend.defaultProps = {\r\n canSelectItem: false\r\n};\r\n\r\n\r\nexport default Legend;\r\n","import Legend from './Legend';\r\n\r\nexport default Legend;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport CensusStats from 'CensusStats';\r\nimport Legend from 'Legend';\r\n\r\nimport \"./CommuteTimes.scss\";\r\n\r\nimport arrow from \"../images/dropdown-arrow.svg\";\r\n\r\n/**\r\n * Component that shows commute times. Includes a legend for commute time list\r\n * and some statistics for selected commute time.\r\n * Statistic are shown on demand and can be disabled in config\r\n */\r\nclass CommuteTimes extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { commuteTimeIndex: null };\r\n\r\n this.showStatistics = this.showStatistics.bind(this);\r\n this.hideStatistics = this.hideStatistics.bind(this);\r\n this.canShowStatistics = ((reachMap.census.enabled) && (reachMap.census.statisticTypes) && (reachMap.census.statisticTypes.length > 0));\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // If props have changed, fetch new censusData\r\n if (this.props.isochroneParam.selectedLocation.latitude !== prevProps.isochroneParam.selectedLocation.latitude ||\r\n this.props.isochroneParam.selectedLocation.longitude !== prevProps.isochroneParam.selectedLocation.longitude ||\r\n this.props.isochroneParam.selectedDay !== prevProps.isochroneParam.selectedDay ||\r\n this.props.isochroneParam.selectedTime !== prevProps.isochroneParam.selectedTime ||\r\n this.props.isochroneParam.selectedDur !== prevProps.isochroneParam.selectedDur) {\r\n this.hideStatistics();\r\n }\r\n }\r\n\r\n /**\r\n * Hides the statistics panel\r\n * */\r\n hideStatistics() {\r\n this.setState({ commuteTimeIndex: null });\r\n }\r\n\r\n /**\r\n * Shows the statistics panel\r\n * */\r\n showStatistics(index) {\r\n this.setState({ commuteTimeIndex: index });\r\n }\r\n\r\n render() {\r\n\r\n return (\r\n \r\n \r\n {\r\n this.state.commuteTimeIndex !== null &&\r\n \r\n \r\n \r\n \r\n }\r\n {\r\n this.state.commuteTimeIndex === null &&\r\n this.canShowStatistics &&\r\n \r\n }\r\n \r\n );\r\n }\r\n}\r\n\r\nCommuteTimes.propTypes = {\r\n /**\r\n * Isochrone parameters\r\n */\r\n isochroneParam: PropTypes.object\r\n}\r\n\r\nexport default CommuteTimes;\r\n","import CommuteTimes from './CommuteTimes';\r\n\r\nexport default CommuteTimes;\r\n","import React from 'react';\r\n\r\nimport Concept from 'Scenarios/Concept';\r\nimport CommuteTimes from 'CommuteTimes';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport \"./Footer.scss\";\r\n\r\nconst Comment = () => {\r\n if (!reachMap.commentLink)\r\n return (null);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
);\r\n};\r\n\r\nconst Footer = (props) => {\r\n return (\r\n
\r\n \r\n \r\n
\r\n {reachMap.concept.ConceptNote}\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nFooter.propTypes = {\r\n /**\r\n * The footer classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * The selected concept value\r\n */\r\n selectedConcept: PropTypes.string,\r\n /**\r\n * A callback called when a concept is selected\r\n */\r\n onSelectedConcept: PropTypes.func,\r\n}\r\nexport default Footer;\r\n","import Footer from './Footer';\r\nexport default Footer;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ClassNames from \"classnames\";\r\n\r\nimport \"./Carousel.scss\";\r\n\r\n/**\r\n * Component that shows a Carousel\r\n */\r\nclass Carousel extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n currentSlideIndex: 0\r\n }\r\n\r\n this.prev = this.prev.bind(this);\r\n this.next = this.next.bind(this);\r\n this.navigateTo = this.navigateTo.bind(this);\r\n }\r\n /**\r\n * Navigate to the previous slide of the carousel.\r\n */\r\n prev() {\r\n this.navigateTo(this.state.currentSlideIndex - 1);\r\n }\r\n /**\r\n * Navigate to the next slide of the carousel.\r\n */\r\n next() {\r\n this.navigateTo(this.state.currentSlideIndex + 1);\r\n }\r\n /**\r\n * Navigate to a specific slide of the carousel.\r\n * @param index - The slide index\r\n */\r\n navigateTo(index) {\r\n const numberOfSlides = React.Children.count(this.props.children);\r\n\r\n var nextSlidesEnded = (index >= numberOfSlides);\r\n var prevSlidesEnded = (index < 0);\r\n\r\n var currentSlideIndex = index;\r\n\r\n if (!this.props.endlessly && (nextSlidesEnded || prevSlidesEnded))\r\n return;\r\n\r\n if (this.props.endlessly) {\r\n // Go back to the first slide when all slides have been displayed\r\n // by navigating using the next button.\r\n if (nextSlidesEnded)\r\n currentSlideIndex = 0;\r\n\r\n // Go to the last slide when all slides have been displayed\r\n // by navigating using the previous button.\r\n if (prevSlidesEnded)\r\n currentSlideIndex = numberOfSlides - 1;\r\n }\r\n\r\n this.setState({ currentSlideIndex });\r\n }\r\n /**\r\n * renders the slides elements\r\n */\r\n renderSlides() {\r\n return (\r\n React.Children.map(this.props.children, (slide, index) => {\r\n const slideClassNames = ClassNames(\r\n \"carousel-slide carousel-slide--fade\",\r\n { \"carousel-slide--hidden\": (this.state.currentSlideIndex !== index) }\r\n );\r\n\r\n return (
{ slide }
);\r\n })\r\n );\r\n }\r\n /**\r\n * renders the navigation buttons\r\n * @param numberOfSlides - The number of slides displayed in the carousel\r\n */\r\n renderNavigationButtons(numberOfSlides) {\r\n const disabledPrevBtn = (this.state.currentSlideIndex === 0 && !this.props.endlessly);\r\n const disabledNextBtn = ((this.state.currentSlideIndex === numberOfSlides - 1) && !this.props.endlessly);\r\n const displayOnDoneBtn = (disabledNextBtn && this.props.doneText && this.props.onDone);\r\n\r\n return (\r\n \r\n {\r\n numberOfSlides > 1 &&\r\n {this.props.prevText}\r\n }\r\n\r\n
{ this.renderDots(numberOfSlides) }
\r\n\r\n {\r\n !displayOnDoneBtn &&\r\n {this.props.nextText}\r\n }\r\n\r\n {\r\n displayOnDoneBtn &&\r\n this.props.onDone()}>\r\n {this.props.doneText}\r\n \r\n }\r\n
\r\n );\r\n }\r\n /**\r\n * renders the navigation dots buttons\r\n * @param numberOfSlides - The number of slides displayed in the carousel\r\n */\r\n renderDots(numberOfSlides) {\r\n // do not display navigation dots when there is only one slide\r\n if (numberOfSlides <= 1)\r\n return (null);\r\n\r\n return (\r\n [...Array(numberOfSlides).keys()].map(index => {\r\n const dotClassNames = ClassNames(\r\n \"carousel-dot\",\r\n { \"carousel-dot--active\": (this.state.currentSlideIndex === index) }\r\n );\r\n\r\n return (\r\n this.navigateTo(index) }>\r\n );\r\n })\r\n );\r\n }\r\n /**\r\n * renders the Carousel component\r\n */\r\n render() {\r\n const numberOfSlides = React.Children.count(this.props.children);\r\n\r\n if (!numberOfSlides)\r\n return (null);\r\n\r\n return (\r\n
\r\n
\r\n { this.renderSlides() }\r\n
\r\n
\r\n { this.renderNavigationButtons(numberOfSlides) }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nCarousel.propTypes = {\r\n /**\r\n * defines the Carousel container css classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * defines the Carousel done navigation button text\r\n */\r\n doneText: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.string\r\n ]),\r\n /**\r\n * A flag to enable/disabled the endlessly navigation behavior.\r\n * The default value is false.\r\n */\r\n endlessly: PropTypes.bool,\r\n /**\r\n * defines the Carousel next navigation button text\r\n */\r\n nextText: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.string\r\n ]),\r\n /**\r\n * callback called when the done button is clicked\r\n */\r\n onDone: PropTypes.func,\r\n /**\r\n * defines the Carousel previous navigation button text\r\n */\r\n prevText: PropTypes.oneOfType([\r\n PropTypes.object,\r\n PropTypes.string\r\n ])\r\n}\r\n\r\nCarousel.defaultProps = {\r\n endlessly: false\r\n};\r\n\r\nexport default Carousel;\r\n","import Carousel from './Carousel';\r\n\r\nexport default Carousel;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport \"./OnBoardingItem.scss\";\r\n\r\n/**\r\n * renders a summary in the onboarding item\r\n * @param summary - The summary to display\r\n */\r\nfunction Summary(props) {\r\n return (\r\n
\r\n {props.description}\r\n
);\r\n}\r\n\r\n/**\r\n * Component that shows an OnBoardingItem item\r\n */\r\nfunction OnBoardingItem (props) {\r\n if (!(props.firstSummary && props.secondSummary && props.image))\r\n return (null);\r\n\r\n return (\r\n \r\n
\r\n
\r\n \"Image\"/\r\n
\r\n
\r\n

\r\n \r\n

\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nOnBoardingItem.propTypes = {\r\n /**\r\n * defines the image to display in the onboarding item.\r\n */\r\n image: PropTypes.string,\r\n /**\r\n * defines the first summary to display in the onboarding item.\r\n */\r\n firstSummary: PropTypes.object,\r\n /**\r\n * defines the second summary to display in the onboarding item.\r\n */\r\n secondSummary: PropTypes.object\r\n};\r\n\r\nexport default OnBoardingItem;\r\n","import React, { Component } from 'react';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport Carousel from \"Carousel\";\r\nimport OnBoardingItem from \"./OnBoardingItem\";\r\n\r\nimport busImage from \"../images/onboarding-bus.png\";\r\n\r\nimport \"./OnBoarding.scss\";\r\n\r\n/**\r\n * Component that shows the OnBoarding modal\r\n */\r\nclass OnBoarding extends Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * renders the OnBoarding component\r\n */\r\n render() {\r\n if (!this.props.show)\r\n return (null);\r\n\r\n return (\r\n \r\n
\r\n \r\n }\r\n nextText={}\r\n doneText={}\r\n onDone={ this.props.onClose }>\r\n ,\r\n description: \r\n }}\r\n secondSummary={{\r\n title: ,\r\n description: \r\n }}/>\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default OnBoarding;\r\n","import OnBoarding from './OnBoarding';\r\n\r\nexport default OnBoarding;\r\n","/**\r\n * The geocoding service options\r\n */\r\nclass GeocodingOptions {\r\n\r\n constructor(options, reverseGecoding = false) {\r\n var config = (reverseGecoding) ? reachMap.geocodingOptions.reverse : reachMap.geocodingOptions.geocode;\r\n /*\r\n * The place name for forward geocoding\r\n */\r\n this.query = options.query;\r\n /*\r\n * The place latitude coordinate\r\n */\r\n this.latitude = options.latitude;\r\n /*\r\n * The place longitude coordinate\r\n */\r\n this.longitude = options.longitude;\r\n /*\r\n * Defines the results to a bounding box.\r\n */\r\n this.mapbounds = options.mapbounds || config.mapBounds;\r\n /*\r\n * Controls whether to include results outside of supplied map bounds.\r\n */\r\n this.limitbybounds = options.limitbybounds || config.limitbybounds;\r\n /*\r\n * Defines the number of results returned.\r\n */\r\n this.limit = options.limit || config.limitResults;\r\n /*\r\n * Limit results to one or more countries separated by commas (ca=Canada, ca=France etc...)\r\n */\r\n this.country = options.country || config.country;\r\n /*\r\n * Defines the language to use for response text.\r\n */\r\n this.language = options.language || config.language;\r\n /*\r\n * Used to Filter results to include only a subset of the available feature types.\r\n * Options can be: country, district, place, address ... Multiple options can be comma-separated.\r\n * See mapbox documentation for more details:\r\n * https://www.mapbox.com/api-documentation/?language=cURL#retrieve-places-near-a-location\r\n */\r\n this.types = options.types || config.types;\r\n }\r\n /**\r\n * Get the geocoding options\r\n * @return {object} - The geocoding options.\r\n */\r\n getGeocodeOptions() {\r\n return ({\r\n query: this.query,\r\n country: this.country,\r\n mapbounds: this.mapbounds,\r\n limitbybounds: this.limitbybounds,\r\n limit: this.limit,\r\n language: this.language\r\n });\r\n }\r\n /**\r\n * Get the reverse geocoding options\r\n * @return {object} - The reverse geocoding options.\r\n */\r\n getReverseOptions() {\r\n return ({\r\n latitude: this.latitude,\r\n longitude: this.longitude,\r\n country: this.country,\r\n language: this.language,\r\n limit: this.limit,\r\n types: this.types\r\n });\r\n }\r\n}\r\n\r\nexport default GeocodingOptions;\r\n","import { httpGet } from 'giro-react-toolkit/source/UtilityFunctions/Ajax';\r\n\r\n/**\r\n * The mapbox geocoding service\r\n */\r\nclass MapboxGeocoding {\r\n /**\r\n * Get a place latitude/longitude and name based on some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The geocode request promise object.\r\n */\r\n geocode(options, abortController, callbackFct) {\r\n const url = `${reachMap.geocodingOptions.geocode.clientUrl}${options.query}.json`;\r\n let bbox = null;\r\n\r\n if (options.limitbybounds &&\r\n options.mapbounds &&\r\n options.mapbounds.length === 2 &&\r\n options.mapbounds[0].latitude && options.mapbounds[0].longitude &&\r\n options.mapbounds[1].latitude && options.mapbounds[1].longitude) {\r\n // The mapbox geocoding bounds format is minX,minY,maxX,maxY\r\n bbox = `${options.mapbounds[0].longitude},${options.mapbounds[0].latitude},${options.mapbounds[1].longitude},${options.mapbounds[1].latitude}`;\r\n }\r\n\r\n let params = {\r\n autocomplete: true,\r\n access_token: reachMap.geocodingOptions.accessToken,\r\n limit: options.limit,\r\n country: options.country,\r\n language: options.language\r\n };\r\n\r\n if (bbox)\r\n params.bbox = bbox;\r\n\r\n var signal = abortController ? abortController.signal : null;\r\n\r\n const geocodePromise = httpGet(url, { params, fetchOptions: { signal } });\r\n\r\n geocodePromise.then(response => {\r\n if (response.ok)\r\n return (response.json());\r\n else\r\n throw new Error('Status code:' + response.statusText + '- Failed to geocode the place - ' + JSON.stringify(options));\r\n }).then(result => {\r\n if (!(result && result.features))\r\n callbackFct([]);\r\n\r\n var data = (result.features.map((place) => {\r\n return ({\r\n placeName: place.place_name,\r\n latitude: place.geometry.coordinates[1],\r\n longitude: place.geometry.coordinates[0]\r\n });\r\n }));\r\n\r\n callbackFct(data);\r\n }).catch((error) => {\r\n if (error.name !== 'AbortError') {\r\n callbackFct([], error);\r\n }\r\n });\r\n\r\n return (geocodePromise);\r\n }\r\n /**\r\n * Search a location using the latitude/longitude and some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The reverse request promise object.\r\n */\r\n reverse(options, abortController, callbackFct) {\r\n const url = `${reachMap.geocodingOptions.reverse.clientUrl}${options.longitude},${options.latitude}.json`;\r\n\r\n let params = {\r\n access_token: reachMap.geocodingOptions.accessToken,\r\n limit: options.limit,\r\n country: options.country,\r\n language: options.language,\r\n types: options.types\r\n };\r\n\r\n var signal = abortController ? abortController.signal : null;\r\n\r\n const reversePromise = httpGet(url, { params, fetchOptions: { signal } });\r\n\r\n reversePromise.then(response => {\r\n if (response.ok)\r\n return (response.json());\r\n else\r\n throw new Error('Status code:' + response.statusText + '- Failed to find the place - ' + JSON.stringify(options));\r\n }).then(result => {\r\n if (!(result && result.features))\r\n callbackFct([]);\r\n\r\n var data = (result.features.map((place) => {\r\n return ({\r\n placeName: place.place_name,\r\n latitude: place.geometry.coordinates[1],\r\n longitude: place.geometry.coordinates[0]\r\n });\r\n }));\r\n\r\n callbackFct(data);\r\n }).catch((error) => {\r\n if (error.name !== 'AbortError') {\r\n callbackFct([], error);\r\n }\r\n });\r\n\r\n return (reversePromise);\r\n }\r\n}\r\n\r\nexport default MapboxGeocoding;\r\n","import { httpGet } from 'giro-react-toolkit/source/UtilityFunctions/Ajax';\r\n\r\n/**\r\n * The MetroCloudAlliance geocoding service\r\n */\r\nclass MetroCloudAllianceGeocoding {\r\n /**\r\n * Get a place latitude/longitude and name based on some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The geocode request promise object.\r\n */\r\n geocode(options, abortController, callbackFct) {\r\n const url = reachMap.geocodingOptions.geocode.clientUrl;\r\n let mapbounds = null;\r\n\r\n if (options.mapbounds &&\r\n options.mapbounds.length === 2 &&\r\n options.mapbounds[0].latitude && options.mapbounds[0].longitude &&\r\n options.mapbounds[1].latitude && options.mapbounds[1].longitude) {\r\n // The mapbox geocoding bounds format is minX,minY,maxX,maxY\r\n mapbounds = `${options.mapbounds[0].longitude},${options.mapbounds[0].latitude},${options.mapbounds[1].longitude},${options.mapbounds[1].latitude}`;\r\n }\r\n\r\n let params = {\r\n api_key: reachMap.geocodingOptions.accessToken,\r\n query: options.query,\r\n numberofresults: options.limit,\r\n limitbybounds: options.limitbybounds\r\n };\r\n\r\n if (mapbounds)\r\n params.mapbounds = mapbounds;\r\n\r\n var signal = abortController ? abortController.signal: null;\r\n\r\n const geocodePromise = httpGet(url, { params, fetchOptions: { signal } });\r\n\r\n geocodePromise.then(response => {\r\n if (response.ok)\r\n return (response.json());\r\n else\r\n throw new Error('Status code:' + response.statusText + '- Failed to geocode the place - ' + JSON.stringify(options));\r\n }).then(response => {\r\n if (!(response && response.results))\r\n callbackFct([]);\r\n\r\n // Les lat/long retournés par l'api sont souvent des chaines de caractères.\r\n // On utilise parseFloat pour les convertir tous en nombre flottant.\r\n // Exemple de resultats avec lat/long en chaines de caractères:\r\n // http://api.metrocloudalliance.com/search/?query=LAX&minifyresult=false&numberofresults=50&mapbounds=33.989,-118.541,34.045,-118.459\r\n var data = response.results.filter(p => p.description.length > 0)\r\n .map((place) => {\r\n return ({\r\n placeName: place.description,\r\n latitude: parseFloat(place.lat),\r\n longitude: parseFloat(place.lng)\r\n });\r\n });\r\n\r\n callbackFct(data);\r\n }).catch((error) => {\r\n if (error.name !== 'AbortError') {\r\n callbackFct([], error);\r\n }\r\n });\r\n\r\n return (geocodePromise);\r\n }\r\n /**\r\n * Search a location using the latitude/longitude and some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The reverse request promise object.\r\n */\r\n reverse(options, abortController, callbackFct) {\r\n const url = reachMap.geocodingOptions.reverse.clientUrl;\r\n\r\n let params = {\r\n api_key: reachMap.geocodingOptions.accessToken,\r\n lat: options.latitude,\r\n lng: options.longitude,\r\n numberofresults: options.limit,\r\n searchtype: options.types\r\n };\r\n\r\n var signal = abortController ? abortController.signal : null;\r\n\r\n const reversePromise = httpGet(url, {params, fetchOptions:{signal}});\r\n\r\n reversePromise.then(response => {\r\n if (response.ok)\r\n return (response.json());\r\n else\r\n throw new Error('Status code:' + response.statusText + '- Failed to find the place - ' + JSON.stringify(options));\r\n }).then(response => {\r\n if (!(response && response.length))\r\n callbackFct([]);\r\n\r\n // Les lat/long retournés par l'api sont souvent des chaines de caractères.\r\n // On utilise parseFloat pour les convertir tous en nombre flottant.\r\n // Exemple de resultats avec lat/long en chaines de caractères:\r\n // http://api.metrocloudalliance.com/search/?query=LAX&minifyresult=false&numberofresults=50&mapbounds=33.989,-118.541,34.045,-118.459\r\n var data = response.filter(p => p.display_name.length > 0)\r\n .map((place) => {\r\n return ({\r\n placeName: place.display_name,\r\n latitude: parseFloat(place.lat),\r\n longitude: parseFloat(place.lng)\r\n });\r\n });\r\n\r\n callbackFct(data);\r\n }).catch((error) => {\r\n if (error.name !== 'AbortError') {\r\n callbackFct([], error);\r\n }\r\n });\r\n\r\n return (reversePromise);\r\n }\r\n}\r\n\r\nexport default MetroCloudAllianceGeocoding;\r\n","import MapboxGeocoding from './MapboxGeocoding.js';\r\nimport MetroCloudAllianceGeocoding from './MetroCloudAllianceGeocoding.js';\r\n\r\n/**\r\n * A geocoding service implementation\r\n */\r\nclass Geocoding {\r\n\r\n constructor() {\r\n this._initClient(reachMap.geocodingOptions.client);\r\n }\r\n /**\r\n * Initialize the geocoding client\r\n * @param client - The geocoding client name.\r\n */\r\n _initClient(client) {\r\n if (client == 'mapbox')\r\n this.geocodingClient = new MapboxGeocoding();\r\n else if (client == 'metroCloudAlliance')\r\n /* Site-Spec MetroCloudAlliance Geocoding Provider */\r\n this.geocodingClient = new MetroCloudAllianceGeocoding();\r\n else\r\n throw new Error(\"Invalid geocoding client\");\r\n }\r\n /**\r\n * Get a place latitude/longitude and name based on some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The geocode request promise object.\r\n */\r\n geocode(options, abortController, callbackFct) {\r\n return (this.geocodingClient.geocode(options.getGeocodeOptions(), abortController, callbackFct));\r\n }\r\n /**\r\n * Search a location using the latitude/longitude and some options.\r\n * @param {GeocodingOptions} options - The geocoding options.\r\n * @param {object} abortController\r\n * @param callbackFct - callback to send the data once it is retrieved.\r\n * @returns {Promise} The geocode request promise object.\r\n */\r\n reverse(options, abortController, callbackFct) {\r\n return (this.geocodingClient.reverse(options.getReverseOptions(), abortController, callbackFct));\r\n }\r\n}\r\n\r\nexport default Geocoding;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ClassNames from 'classnames';\r\nimport { ErrorBannerContext } from 'ErrorBanner';\r\nimport { TranslationConsumer } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport './GeoLocation.scss';\r\n\r\n/**\r\n * Component used to fetch the current geolocation of the user using the browser's capabilities.\r\n */\r\nclass GeoLocation extends Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * Handle the click on the button to get the position of the user.\r\n */\r\n handleClick () {\r\n const enableHighAccuracy = this.props.enableHighAccuracy;\r\n const timeout = this.props.timeout;\r\n const maximumAge = this.props.maximumAge;\r\n const onSuccess = this.props.onSuccess;\r\n\r\n return (window.navigator.geolocation.getCurrentPosition(\r\n // success\r\n position => {\r\n onSuccess(position);\r\n },\r\n // error\r\n error => {\r\n this.context.displayErrorMessage(this.errorMessage(error));\r\n },\r\n // PositionOptions\r\n { enableHighAccuracy, timeout, maximumAge }\r\n ));\r\n }\r\n\r\n /**\r\n * get Error message to display from error code\r\n * @param positionError - Object containing a code and a message.\r\n */\r\n errorMessage(positionError) {\r\n if (positionError.code === 1) { // PERMISSION_DENIED\r\n return ('ReachMapRes.GeoLocationErrorPermissionDeniedText');\r\n } else if (positionError.code === 3) { // TIMEOUT\r\n return ('ReachMapRes.GeoLocationErrorTimeoutText');\r\n } else { // also code 2 POSITION_UNAVAILABLE\r\n return ('ReachMapRes.GeoLocationErrorPosUnavailableText');\r\n }\r\n }\r\n\r\n /**\r\n * Renders the GeoLocation component\r\n */\r\n render () {\r\n // GeoLocation is not available\r\n if (!('geolocation' in window.navigator)) {\r\n return;\r\n }\r\n\r\n let classNames = ClassNames(\r\n \"geo-location\",\r\n this.props.className\r\n );\r\n return (\r\n \r\n {({ localizeValue }) => (\r\n this.handleClick() }\r\n aria-label={ localizeValue('ReachMapRes.GeoLocationButtonLabel') }>\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nGeoLocation.contextType = ErrorBannerContext;\r\n\r\nGeoLocation.propTypes = {\r\n /**\r\n * Indicates if the device returns the best possible result for the position.\r\n * Might be slower and consume more battery.\r\n */\r\n enableHighAccuracy: PropTypes.bool,\r\n /**\r\n * The maximum age of a cached position in milliseconds. If 0, the position is not cached.\r\n */\r\n maximumAge: PropTypes.number,\r\n /**\r\n * The timeout in milliseconds the device is allowed to take in order to return a position.\r\n */\r\n timeout: PropTypes.number,\r\n /**\r\n * A callback when the location is successfully fetched\r\n */\r\n onSuccess: PropTypes.func,\r\n /**\r\n * The class names to add to the geolocation button\r\n */\r\n className: PropTypes.string\r\n}\r\n\r\nGeoLocation.defaultProps = {\r\n enableHighAccuracy: true,\r\n timeout: 3000, /* 3s */\r\n maximumAge: 0 /* no caching */\r\n}\r\n\r\nexport default GeoLocation;\r\n","import GeoLocation from './GeoLocation';\r\nexport default GeoLocation;\r\n","import React from 'react';\r\nimport Browser from 'giro-react-toolkit/source/UtilityFunctions/Browser';\r\nimport PropTypes from 'prop-types';\r\nimport GeoLocation from 'GeoLocation';\r\n\r\nimport \"./MapActionBar.scss\"\r\n\r\n/**\r\n * Action bar for the map\r\n * @param props\r\n */\r\nfunction MapActionBar(props) {\r\n const className = Browser.isAndroid() || Browser.isIos() ? \"map-action-bar\" : \"map-action-bar map-action-bar--desktop\";\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nMapActionBar.propTypes = {\r\n /**\r\n * function to call when the onboarding button is pressed\r\n */\r\n showOnBoarding: PropTypes.func,\r\n /**\r\n * function to call when the geoLocalization button is pressed\r\n */\r\n onGeoLocationSuccess: PropTypes.func\r\n}\r\n\r\nexport default MapActionBar;\r\n","import MapActionBar from \"./MapActionBar\"\r\nexport default MapActionBar;\r\n","import React from 'react';\r\n\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport \"./AppTitle.scss\";\r\n\r\nconst AppTitle = () => {\r\n return (\r\n
\r\n \r\n

 

\r\n
\r\n );\r\n};\r\n\r\nexport default AppTitle;\r\n","import AppTitle from './AppTitle';\r\nexport default AppTitle;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport ClassNames from 'classnames';\r\n\r\nimport './Chip.scss';\r\n\r\nconst Chip = (props) => {\r\n let chipClasses = ClassNames(\r\n 'chip',\r\n props.className\r\n );\r\n\r\n return (\r\n );\r\n};\r\n\r\nChip.propTypes = {\r\n /** CSS class names added by the user to the component */\r\n className: PropTypes.string,\r\n /** Icon to show in the chip */\r\n icon: PropTypes.string,\r\n /** Callback function to call when the chip is clicked */\r\n onClick: PropTypes.func,\r\n /** Children to show in the chip */\r\n children: PropTypes.any\r\n};\r\n\r\nexport default Chip;\r\n","import Chip from './Chip';\r\nexport default Chip;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport ClassNames from 'classnames';\r\n/**\r\n * Component for form group, consists of a label, an icon and\r\n * a form element passed as a child.\r\n */\r\nclass FormGroup extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n hasFocus: false\r\n }\r\n }\r\n\r\n /**\r\n * renders the FormGroups component\r\n */\r\n render() {\r\n const formGroupClassNames = ClassNames(\r\n this.props.className,\r\n \"form-group\",\r\n { \"form-group--focused\": this.state.hasFocus }\r\n );\r\n\r\n var formGroup = this;\r\n\r\n var childWithFocus = React.Children.map(this.props.children, function (child) {\r\n return React.cloneElement(child, {\r\n onFocus:() => formGroup.setState({ hasFocus: true }),\r\n onBlur: () => formGroup.setState({ hasFocus: false })\r\n });\r\n });\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nFormGroup.propTypes = {\r\n /**\r\n * Class name to apply to form group\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * Icon name to display in form group\r\n */\r\n iconName: PropTypes.string,\r\n /**\r\n * Id for label\r\n */\r\n labelId: PropTypes.string,\r\n /**\r\n * resource key for label text\r\n */\r\n resourceKey: PropTypes.string\r\n}\r\n\r\nexport default FormGroup;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport FormGroup from \"../formGroup\";\r\n/**\r\n * Component used to select a day.\r\n */\r\nclass DayPicker extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectRef = React.createRef();\r\n\r\n this.handleChange = this.handleChange.bind(this);\r\n }\r\n\r\n /**\r\n * Returns the label of a day type from it's value\r\n * @param day day type\r\n */\r\n static dayLabel(day) {\r\n const dayLabel = reachMap.daysOptions.values.find((el) => {\r\n return (el.value === day);\r\n }).label;\r\n\r\n return (dayLabel);\r\n }\r\n\r\n /**\r\n * Put the focus on the dayPicker input\r\n */\r\n focus() {\r\n this.selectRef.current.focus();\r\n }\r\n\r\n /**\r\n * Handle the day picker change event\r\n * @param e - The event object\r\n */\r\n handleChange(e) {\r\n const value = e.target.value;\r\n\r\n if (this.props.onSelectedDay)\r\n this.props.onSelectedDay(value);\r\n }\r\n /**\r\n * renders the DayPicker component\r\n */\r\n render() {\r\n const selectedDay = this.props.selectedDay;\r\n const daysList = reachMap.daysOptions.values;\r\n\r\n return (\r\n \r\n \r\n {\r\n daysList.map(day => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nDayPicker.propTypes = {\r\n /**\r\n * A callback called when a day is selected\r\n */\r\n onSelectedDay: PropTypes.func,\r\n /**\r\n * Current value of the picklist\r\n */\r\n selectedDay: PropTypes.string\r\n}\r\n\r\nexport default DayPicker;\r\n","import DayPicker from './DayPicker';\r\nexport default DayPicker;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TranslationContext } from 'giro-react-toolkit/source/Translation';\r\nimport FormGroup from \"../formGroup\";\r\n/**\r\n * Component used to select a day.\r\n */\r\nclass DurationPicker extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectRef = React.createRef();\r\n\r\n this.handleChange = this.handleChange.bind(this);\r\n }\r\n\r\n /**\r\n * Put the focus on the dayPicker input\r\n */\r\n focus() {\r\n this.selectRef.current.focus();\r\n }\r\n\r\n /**\r\n * Handle the day picker change event\r\n * @param e - The event object\r\n */\r\n handleChange(e) {\r\n const value = Number(e.target.value);\r\n\r\n if (this.props.onSelectedDur)\r\n this.props.onSelectedDur(value);\r\n }\r\n\r\n /**\r\n * renders the DayPicker component\r\n */\r\n render() {\r\n const durList = reachMap.durationOptions.values;\r\n\r\n return (\r\n \r\n \r\n {\r\n durList.map(dur => {\r\n return (\r\n \r\n );\r\n })\r\n }\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nDurationPicker.propTypes = {\r\n /**\r\n * class to apply to the component\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * A callback called when a day is selected\r\n */\r\n onSelectedDur: PropTypes.func,\r\n /**\r\n * Current value of the picklist\r\n */\r\n selectedDur: PropTypes.number\r\n}\r\n\r\nDurationPicker.contextType = TranslationContext;\r\n\r\nexport default DurationPicker;\r\n","import DurationPicker from './DurationPicker';\r\nexport default DurationPicker;\r\n","import React from 'react';\r\n\r\n/**\r\n * Component in charge to display a location.\r\n * @param {GeocodingResult} data - A geocoding result object that contains the location infos.\r\n */\r\nconst LocationItem = ({ data }) => {\r\n return (\r\n
{ data.placeName }
\r\n );\r\n}\r\n\r\nexport default LocationItem;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport debounce from 'lodash.debounce';\r\nimport { AutoComplete } from 'giro-react-toolkit';\r\nimport { Translation } from 'giro-react-toolkit/source/Translation';\r\nimport { GeocodingOptions, Geocoding } from 'Geocoding';\r\nimport LocationItem from './LocationItem';\r\nimport GeoLocation from 'GeoLocation';\r\nimport FormGroup from '../formGroup';\r\n\r\nimport './Location.scss';\r\n\r\n/**\r\n * Component in charge to display the origin and destination search inputs.\r\n */\r\nclass Location extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n value: this.props.selectedLocation ? this.props.selectedLocation.placeName : \"\",\r\n searchResults: [this.props.selectedLocation]\r\n }\r\n\r\n this.autocomplete = React.createRef();\r\n\r\n this.handleChange = this.handleChange.bind(this);\r\n this.onSelectedLocation = this.onSelectedLocation.bind(this);\r\n this.initGeocodingDebounce = this.initGeocodingDebounce.bind(this);\r\n this.onGeoLocationSuccess = this.onGeoLocationSuccess.bind(this);\r\n\r\n this.geocodingDebounce = this.initGeocodingDebounce(200);\r\n this.minimumCharBeforeAutoComplete = 2;\r\n\r\n this.abortController = null;\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (this.props.selectedLocation !== prevProps.selectedLocation) {\r\n this.setState({\r\n value: this.props.selectedLocation.placeName,\r\n searchResults: [this.props.selectedLocation]\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Put the focus on the autocomplete input\r\n */\r\n focus() {\r\n this.autocomplete.current.focus();\r\n }\r\n\r\n /**\r\n * Handle the search autocomplete change event\r\n * @param e - The event object\r\n */\r\n handleChange(e) {\r\n const value = e.target.value;\r\n\r\n this.setState({ value });\r\n\r\n if (!value.length) {\r\n // Vider la liste des resultats lorsque le champ de saisie est vide.\r\n this.setState({ searchResults: [] });\r\n\r\n this.props.onClearLocation();\r\n return;\r\n }\r\n\r\n if (value.length >= this.minimumCharBeforeAutoComplete) {\r\n this.geocodingDebounce(value,\r\n (searchResults) => {\r\n this.setState({ searchResults });\r\n });\r\n }\r\n }\r\n /**\r\n * Initialize the geocoding debounce handler\r\n * @param wait - The number of milliseconds to delay.\r\n */\r\n initGeocodingDebounce(wait) {\r\n // Le debounce permet d'executer la requête après un certain delais\r\n // lorsqu'on arrête d'ecrire dans l'autocomplete. On peut de cette façon\r\n // éviter de faire un appel à l'api de geocoding à chaque fois que l'on\r\n // saisit un caractère.\r\n return (debounce((query, callback) => {\r\n // Cancel the in progress geocoding request and make a new one.\r\n if (this.abortController)\r\n this.abortController.abort();\r\n\r\n if (window.AbortController)\r\n this.abortController = new AbortController();\r\n\r\n this.geocodingDebounceRequest = new Geocoding().geocode(new GeocodingOptions({ query }), this.abortController,\r\n (results) => {\r\n if (callback)\r\n callback(results);\r\n });\r\n }, wait));\r\n }\r\n /**\r\n * Handle the click event on a suggestion from the autocomplete component.\r\n * Set the current input value with the location name.\r\n * @param {GeocodingResult} selectedLocation - the location item that was clicked\r\n */\r\n onSelectedLocation(selectedLocation) {\r\n this.setState({ value: selectedLocation.placeName });\r\n\r\n if (this.props.onSelectedLocation)\r\n this.props.onSelectedLocation(selectedLocation);\r\n }\r\n /**\r\n * Callback for when the geolocation successfully retrieved the user's coordinates\r\n * @param position - The user's position\r\n */\r\n onGeoLocationSuccess(position) {\r\n // Cancel the in progress reverse geocoding request and make a new one.\r\n if (this.abortController)\r\n this.abortController.abort();\r\n\r\n var latitude = position.coords.latitude;\r\n var longitude = position.coords.longitude;\r\n\r\n if (window.AbortController)\r\n this.abortController = new AbortController();\r\n\r\n this.geocodingReverseRequest = new Geocoding().reverse(new GeocodingOptions({ latitude, longitude }, true /*reverseGecoding*/),\r\n this.abortController,\r\n (results) => {\r\n var placeName = (results && results.length) ? results[0].placeName : `${latitude},${longitude}`;\r\n\r\n this.onSelectedLocation({ placeName, latitude, longitude });\r\n });\r\n }\r\n\r\n /**\r\n * renders the Location component\r\n */\r\n render() {\r\n return (\r\n \r\n \r\n }\r\n hasClearButton={ true } />\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nLocation.propTypes = {\r\n /**\r\n * Defines the selected location\r\n */\r\n selectedLocation: PropTypes.object,\r\n /**\r\n * A callback called when a location is selected\r\n */\r\n onSelectedSuggestion: PropTypes.func,\r\n /**\r\n * A callback called when the location input cleared\r\n */\r\n onClearLocation: PropTypes.func\r\n}\r\n\r\nexport default Location;\r\n","import Location from './Location';\r\nexport default Location;\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport BasicTimePicker from 'giro-react-toolkit/source/TimePicker';\r\nimport Browser from 'giro-react-toolkit/source/UtilityFunctions/Browser';\r\nimport FormGroup from \"../formGroup\";\r\n\r\nclass TimePicker extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.inputRef = React.createRef();\r\n }\r\n\r\n /**\r\n * Put the focus on the time picker input\r\n */\r\n focus() {\r\n this.inputRef.current.focus();\r\n }\r\n\r\n /**\r\n * renders the DayPicker component\r\n */\r\n render() {\r\n const fieldClassName = Browser.isAndroid() || Browser.isIos() ? \"time-picker-dropdown\" : \"\";\r\n\r\n return (\r\n \r\n this.props.onSelectedTime(e.target.value)}\r\n value={this.props.selectedTime}\r\n required={true}\r\n inputRef={this.inputRef} />\r\n \r\n );\r\n }\r\n}\r\n\r\nTimePicker.propTypes = {\r\n /**\r\n * A callback called when a day is selected\r\n */\r\n onSelectedTime: PropTypes.func,\r\n /**\r\n * Current value of the picklist\r\n */\r\n selectedTime: PropTypes.string\r\n}\r\n\r\nexport default TimePicker;\r\n","import TimePicker from './TimePicker';\r\nexport default TimePicker;\r\n","import React, { Component } from 'react';\r\n\r\nimport AppTitle from 'AppTitle';\r\nimport Chip from 'Chip';\r\nimport ClassNames from 'classnames';\r\nimport DayPicker from './DayPicker';\r\nimport DurationPicker from './DurationPicker';\r\nimport Location from './Location';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation, TranslationContext } from 'giro-react-toolkit/source/Translation';\r\nimport TimePicker from './TimePicker';\r\n\r\nimport dayIcon from \"images/icon-day.svg\";\r\nimport fromIcon from \"images/icon-from.svg\";\r\nimport timeIcon from \"images/icon-time.svg\";\r\nimport durIcon from \"images/icon-dur.svg\";\r\nimport menuIcon from \"images/icon-menu.svg\";\r\n\r\nimport './Scenarios.scss';\r\n\r\n/**\r\n * Component that contains the form used to set a scenario\r\n */\r\nclass Scenarios extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n showOptions: true\r\n }\r\n\r\n this.location = React.createRef();\r\n this.dayPicker = React.createRef();\r\n this.timePicker = React.createRef();\r\n this.durationPicker = React.createRef();\r\n this.scenarioRef = React.createRef();\r\n\r\n this.disableFormSubmit = this.disableFormSubmit.bind(this);\r\n this.handleClick = this.handleClick.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n document.addEventListener('touchstart', this.handleClick, false);\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener('touchstart', this.handleClick, false);\r\n }\r\n\r\n /**\r\n * Handles the click outside the scenario panel on SD to close the panel\r\n * @param event\r\n */\r\n handleClick(event) {\r\n if (!this.state.showOptions || !this.props.isInMap(event.target))\r\n return;\r\n\r\n this.hideOptions();\r\n }\r\n\r\n hideOptions() {\r\n this.setState(\r\n { showOptions: false }\r\n );\r\n }\r\n\r\n /**\r\n * Disable the form submission\r\n * @param event - The form event object\r\n */\r\n disableFormSubmit(event) {\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * Handles the click on the location chip\r\n */\r\n editLocation() {\r\n this.setState(\r\n { showOptions: true },\r\n () => {\r\n this.location.current.focus();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Handles the click on the day chip\r\n */\r\n editDay() {\r\n this.setState(\r\n { showOptions: true },\r\n () => {\r\n this.dayPicker.current.focus();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Handles the click on the time chip\r\n */\r\n editTime() {\r\n this.setState(\r\n { showOptions: true },\r\n () => {\r\n this.timePicker.current.focus();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Handles the click on the duration chip\r\n */\r\n editDur() {\r\n this.setState(\r\n { showOptions: true },\r\n () => {\r\n this.durationPicker.current.focus();\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Renders array of chips, chips are only available on small device\r\n * @param selectedLocationName\r\n * @param selectedDay\r\n * @param selectedTime\r\n * @param selectedDur\r\n */\r\n renderChips(selectedLocationName, selectedDay, selectedTime, selectedDur) {\r\n const chipsClasses = ClassNames(\r\n \"scenario__chips\",\r\n { \"scenario__chips--hidden\": this.state.showOptions }\r\n );\r\n\r\n const dayLabel = DayPicker.dayLabel(selectedDay);\r\n\r\n return (\r\n
\r\n {\r\n this.editLocation()\r\n }}>\r\n { selectedLocationName || }\r\n \r\n {\r\n this.editDay()\r\n }}>{dayLabel}\r\n {\r\n this.editTime()\r\n }}>\r\n { selectedTime || }\r\n \r\n {\r\n this.editDur()\r\n }}>\r\n { selectedDur }\r\n  \r\n \r\n \r\n
);\r\n }\r\n\r\n /**\r\n * renders the Scenarios form component\r\n */\r\n render() {\r\n const optionClasses = ClassNames(\r\n \"scenario__options\",\r\n { \"scenario__options--hidden\": !this.state.showOptions }\r\n );\r\n\r\n return (\r\n
\r\n { this.renderChips(this.props.selectedLocation.placeName, this.props.selectedDay, this.props.selectedTime, this.props.selectedDur) }\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nScenarios.contextType = TranslationContext;\r\n\r\nScenarios.propTypes = {\r\n /**\r\n * defines the scenarios form css classnames\r\n */\r\n className: PropTypes.string,\r\n /**\r\n * Defines the selected location name\r\n */\r\n selectedLocation: PropTypes.object,\r\n /**\r\n * Defines the selected day value\r\n */\r\n selectedDay: PropTypes.string,\r\n /**\r\n * Defines the selected duration value\r\n */\r\n selectedDur: PropTypes.number,\r\n /**\r\n * Defines the selected time value\r\n */\r\n selectedTime: PropTypes.string,\r\n /**\r\n * A callback called when the location input cleared\r\n */\r\n onClearLocation: PropTypes.func,\r\n /**\r\n * A callback called when the layout changes\r\n */\r\n onLayoutChanged: PropTypes.func,\r\n /**\r\n * A callback called when a day is selected\r\n */\r\n onSelectedDay: PropTypes.func,\r\n /**\r\n * A callback called when a duration is selected\r\n */\r\n onSelectedDur: PropTypes.func,\r\n /**\r\n * A callback called when a location is selected\r\n */\r\n onSelectedLocation: PropTypes.func,\r\n /**\r\n * A callback called when a time is selected\r\n */\r\n onSelectedTime: PropTypes.func\r\n}\r\n\r\nexport default Scenarios;\r\n","import Scenarios from './Scenarios';\r\nexport default Scenarios;\r\n","import React from 'react';\r\n\r\nimport AppTitle from 'AppTitle';\r\nimport ClassNames from 'classnames';\r\nimport LanguageSelection from 'LanguageSelection';\r\nimport PropTypes from 'prop-types';\r\nimport { Translation, TranslationConsumer } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport aboutIcon from \"images/icon-about.svg\";\r\nimport globeIcon from \"images/icon-globe.svg\";\r\nimport logo from \"images/logo-light-background.svg\";\r\n\r\nimport \"./SlidingMenu.scss\";\r\n\r\n/**\r\n * Sliding menu component\r\n */\r\nfunction SlidingMenu(props) {\r\n let classes = ClassNames(\r\n \"sliding-menu\",\r\n {\"sliding-menu--closed\": !props.show}\r\n );\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n {/* Cacher la barre de langue quand il y a juste une langue */}\r\n \r\n {({ supportedCultures }) => {\r\n return (\r\n \r\n {\r\n supportedCultures.length > 1 &&\r\n
  • \r\n \r\n \r\n
  • \r\n }\r\n
    \r\n );\r\n }}\r\n
    \r\n { /**\r\n * Show link to transit agency only if it is configured\r\n */\r\n reachMap.application.transitAgencySite && reachMap.application.transitAgencyName &&\r\n
  • \r\n \r\n {reachMap.application.transitAgencyName}\r\n \r\n
  • \r\n }\r\n
\r\n
\r\n );\r\n}\r\n\r\nSlidingMenu.propTypes = {\r\n /**\r\n * @callback Callback for the about button\r\n */\r\n onAbout: PropTypes.func,\r\n /**\r\n * @callback Callback for the close menu button\r\n */\r\n onClose: PropTypes.func,\r\n /**\r\n * Show sliding menu\r\n */\r\n show: PropTypes.bool\r\n}\r\nexport default SlidingMenu;\r\n","import SlidingMenu from './SlidingMenu';\r\nexport default SlidingMenu;\r\n","import React, {Component} from 'react';\r\n\r\nimport defaultMarker from './images/marker-icon.svg';\r\nimport geoLocationMarker from './images/geo-location-marker.svg';\r\n\r\nimport { ErrorBannerProvider, ErrorBanner } from \"ErrorBanner\"\r\nimport IsochroneMapLayer from 'IsochroneMapLayer';\r\nimport RoutesMapLayer from 'RoutesMapLayer';\r\nimport LanguageSelection from 'LanguageSelection';\r\nimport Footer from 'Footer';\r\nimport OnBoarding from 'OnBoarding';\r\nimport { GeocodingOptions, Geocoding } from 'Geocoding';\r\nimport { Map, Marker } from 'Map';\r\nimport MapActionBar from 'MapActionBar';\r\nimport Scenarios from 'Scenarios';\r\nimport SlidingMenu from 'SlidingMenu';\r\nimport { TranslationContext } from 'giro-react-toolkit/source/Translation';\r\n\r\nimport './App.scss';\r\nimport 'giro-react-toolkit/source/styles/global.scss';\r\nimport './styles/Global.scss';\r\n\r\n/**\r\n * Main app component\r\n */\r\nclass App extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n markerPopupText: \"\",\r\n panelParameters: {\r\n selectedLocation: {\r\n placeName: reachMap.locationOptions ? reachMap.locationOptions.defaultPlaceName : \"\",\r\n latitude: reachMap.locationOptions ? reachMap.locationOptions.defaultLatitude : null,\r\n longitude: reachMap.locationOptions ? reachMap.locationOptions.defaultLongitude : null\r\n },\r\n selectedConcept: reachMap.concept.defaultScenario,\r\n selectedDay: reachMap.daysOptions.defaultValue,\r\n selectedTime: reachMap.defaultTime,\r\n selectedDur: reachMap.durationOptions.defaultValue\r\n },\r\n isochrone: {\r\n selectedLocation: {\r\n latitude: reachMap.locationOptions ? reachMap.locationOptions.defaultLatitude : null,\r\n longitude: reachMap.locationOptions ? reachMap.locationOptions.defaultLongitude : null\r\n },\r\n selectedConcept: reachMap.concept.defaultScenario,\r\n selectedDay: reachMap.daysOptions.defaultValue,\r\n selectedTime: reachMap.defaultTime,\r\n selectedDur: reachMap.durationOptions.defaultValue\r\n },\r\n currentLocation: null,\r\n showSlidingMenu: false,\r\n showOnBoarding: !localStorage.getItem('firstVisitDone')\r\n };\r\n\r\n // utilisé pour le geocoding, permet d'annuler un appel pour éviter d'avoir les\r\n // retours multiple dans le désordre et de ne pas afficher la bonne information\r\n this.geocodeAbortController = null;\r\n\r\n this.map = React.createRef();\r\n\r\n this.onLayoutChanged = this.onLayoutChanged.bind(this);\r\n this.onClearLocation = this.onClearLocation.bind(this);\r\n this.onConceptChange = this.onConceptChange.bind(this);\r\n this.onDragEnd = this.onDragEnd.bind(this);\r\n this.onSelectedDay = this.onSelectedDay.bind(this);\r\n this.onSelectedLocation = this.onSelectedLocation.bind(this);\r\n this.onSelectedDur = this.onSelectedDur.bind(this);\r\n this.onSelectedTime = this.onSelectedTime.bind(this);\r\n this.onIsochroneFetchCompleted = this.onIsochroneFetchCompleted.bind(this);\r\n this.updateIsochroneState = this.updateIsochroneState.bind(this);\r\n this.isIsochroneStateUptoDate = this.isIsochroneStateUptoDate.bind(this);\r\n }\r\n\r\n /**\r\n * Builds the isochrone state from the component state panel parameters.\r\n * The isochrone state currently includes all the panel parameters.\r\n * If it is no longer the case, this method should be updated.\r\n */\r\n updateIsochroneState() {\r\n this.setState((state) => {\r\n return { isochrone: state.panelParameters };\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the isochrone state is up to date compared to the component state panel parameters.\r\n * @returns True if the isochrone state is up to date.\r\n */\r\n isIsochroneStateUptoDate() {\r\n let uptoDate =\r\n (this.state.isochrone.selectedLocation.latitude === this.state.panelParameters.selectedLocation.latitude &&\r\n this.state.isochrone.selectedLocation.longitude === this.state.panelParameters.selectedLocation.longitude &&\r\n this.state.isochrone.selectedConcept === this.state.panelParameters.selectedConcept &&\r\n this.state.isochrone.selectedDay === this.state.panelParameters.selectedDay &&\r\n this.state.isochrone.selectedTime === this.state.panelParameters.selectedTime &&\r\n this.state.isochrone.selectedDur === this.state.panelParameters.selectedDur);\r\n return (uptoDate);\r\n }\r\n\r\n componentDidMount() {\r\n // On initialise le texte du marker ici car\r\n // this.context n’est pas initialisé dans le constructeur\r\n this.setState({ markerPopupText: this.context.localizeValue('ReachMapRes.MarkerPopupText') });\r\n\r\n // forcer le recalcul de la taille de la carte, sinon sur FF il peut manquer des tuiles\r\n // et le popup peut être au mauvais endroit.\r\n this.onLayoutChanged();\r\n }\r\n\r\n /**\r\n * Return the offset for the center of the map. Useful when the map is partially hidden\r\n * by the option panel.\r\n */\r\n centerOffset() {\r\n if (window.innerWidth < 800) {\r\n // En mode small device, retirer la hauteur du panneau d'option du calcul de hauteur\r\n var panelEl = document.getElementById(\"option-panel\");\r\n if (panelEl) {\r\n return (panelEl.clientHeight);\r\n }\r\n }\r\n return (0);\r\n }\r\n\r\n /**\r\n * Handle the click event on a suggestion from the autocomplete component.\r\n * @param {GeocodingResult} selectedLocation - the location item that was clicked\r\n */\r\n onSelectedLocation(selectedLocation) {\r\n const newSelectedLocation = {\r\n placeName: selectedLocation.placeName,\r\n latitude: selectedLocation.latitude,\r\n longitude: selectedLocation.longitude\r\n }\r\n\r\n this.setState((state) => {\r\n return { panelParameters: { ...state.panelParameters, selectedLocation: newSelectedLocation },\r\n markerPopupText: null };\r\n });\r\n }\r\n /**\r\n * Handle the clear location event.\r\n * Sets the latitude and longitude to null in order to delete the marker on the map.\r\n */\r\n onClearLocation() {\r\n this.setState((state) => {\r\n return { panelParameters: { ...state.panelParameters, selectedLocation: { placeName: \"\", latitude: null, longitude: null }}};\r\n });\r\n }\r\n /**\r\n * Handle the concept change event\r\n * @param selectedConcept The selected concept\r\n */\r\n onConceptChange(selectedConcept) {\r\n // Update the isochrone state to provoke an automatic refresh\r\n this.setState((prevState) => {\r\n let newParams = { ...prevState.panelParameters };\r\n newParams.selectedConcept = selectedConcept;\r\n return { isochrone: newParams, panelParameters: newParams };\r\n });\r\n }\r\n /**\r\n * A function to execute when the user stops dragging the marker on the map.\r\n * @param {object} position of the geographical point object containig the latitude and longitude.\r\n */\r\n onDragEnd(position) {\r\n // Cancel the in progress reverse geocoding request and make a new one.\r\n if (this.geocodeAbortController)\r\n this.geocodeAbortController.abort();\r\n\r\n var latitude = position.lat;\r\n var longitude = position.lng;\r\n\r\n if (window.AbortController)\r\n this.geocodeAbortController = new AbortController();\r\n\r\n this.geocodingReverseRequest = new Geocoding().reverse(new GeocodingOptions({ latitude, longitude }, true /*reverseGecoding*/),\r\n this.geocodeAbortController,\r\n (results) => {\r\n var placeName = (results && results.length) ? results[0].placeName : `${latitude},${longitude}`;\r\n // Update the isochrone state to provoke an automatic refresh\r\n this.setState((prevState) => {\r\n let newParams = { ...prevState.panelParameters };\r\n newParams.selectedLocation = { placeName: placeName, latitude: latitude, longitude: longitude };\r\n return { isochrone: newParams, panelParameters: newParams};\r\n });\r\n });\r\n }\r\n /**\r\n * Handle the day picker change event\r\n * @param selectedDay The selected day\r\n */\r\n onSelectedDay(selectedDay) {\r\n this.setState((state) => {\r\n return { panelParameters: { ...state.panelParameters, selectedDay }};\r\n });\r\n }\r\n\r\n /**\r\n * Handle the day picker change event\r\n * @param selectedDay The selected day\r\n */\r\n onSelectedTime(selectedTime) {\r\n this.setState((state) => {\r\n return { panelParameters: { ...state.panelParameters, selectedTime }};\r\n });\r\n }\r\n\r\n /**\r\n * Handle the isochrone total duration change event\r\n * @param selectedDur The selected duration\r\n */\r\n onSelectedDur(selectedDur) {\r\n this.setState((state) => {\r\n return { panelParameters: { ...state.panelParameters, selectedDur }};\r\n });\r\n }\r\n\r\n /**\r\n * Handles layout change\r\n */\r\n onLayoutChanged() {\r\n this.map.current && this.map.current.invalidateSize();\r\n }\r\n\r\n /**\r\n * Handles the completion of the isochrone fetching\r\n * @param hasImage The isochrone has an image\r\n * @param firstLoad indicates if the fetch is from the initial load of the application\r\n */\r\n onIsochroneFetchCompleted(hasImage, firstLoad) {\r\n if (!this.context)\r\n return;\r\n\r\n if (!hasImage) {\r\n this.setState({ markerPopupText: this.context.localizeValue('ReachMapRes.NoStopText') });\r\n } else if (!firstLoad) {\r\n // do not hide move marker text on load\r\n this.setState({ markerPopupText: null });\r\n }\r\n }\r\n\r\n /**\r\n * Open/Close sliding menu\r\n */\r\n openMenu(open) {\r\n this.setState({ showSlidingMenu: open });\r\n }\r\n\r\n /**\r\n * Open/close on boarding\r\n */\r\n showOnBoarding(show) {\r\n if (!show && !localStorage.getItem('firstVisitDone'))\r\n localStorage.setItem('firstVisitDone', true);\r\n this.setState({ showOnBoarding: show, showSlidingMenu: false });\r\n }\r\n\r\n /**\r\n * Render the component.\r\n */\r\n render() {\r\n let latitude = this.state.panelParameters.selectedLocation.latitude;\r\n let longitude = this.state.panelParameters.selectedLocation.longitude;\r\n\r\n return (\r\n \r\n \r\n {\r\n this.showOnBoarding(true)\r\n }}\r\n onClose={() => {\r\n this.openMenu(false)\r\n }}\r\n show={this.state.showSlidingMenu} />\r\n
\r\n
\r\n {\r\n this.showOnBoarding(false)\r\n }} />\r\n \r\n {\r\n this.openMenu(true)\r\n }}\r\n onSelectedLocation={ this.onSelectedLocation }\r\n onSelectedDay={ this.onSelectedDay }\r\n onSelectedDur={ this.onSelectedDur }\r\n onSelectedTime={ this.onSelectedTime }\r\n isInMap={(el) => {\r\n return (this.map.current.mapContainer.contains(el));\r\n }} />\r\n \r\n \r\n {\r\n this.updateIsochroneState()\r\n }}\r\n onFetchCompleted={(hasImage, firstLoad) => this.onIsochroneFetchCompleted(hasImage, firstLoad) }/>\r\n { /* current location marker */\r\n this.state.currentLocation &&\r\n }\r\n {\r\n this.setState({ markerPopupText: null })\r\n }}\r\n centerOffset={(p) => this.centerOffset(p)} />\r\n this.showOnBoarding(true) }\r\n onGeoLocationSuccess={(position) => this.setState({ currentLocation: position.coords }) }/>\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nApp.contextType = TranslationContext;\r\n\r\nexport default App;\r\n","import React from \"react\";\r\nimport ReactDom from \"react-dom\";\r\nimport { AppContainer } from 'react-hot-loader'\r\nimport { TranslationProvider } from 'giro-react-toolkit/source/Translation';\r\n\r\n// Cette variable sert pour le hot module replacement afin d'éviter que webpack dev server\r\n// utilise le domain du site web (IIS) pour ses communications avec websocket. On force ainsi\r\n// à utiliser le domain de webpack dev server.\r\n__webpack_public_path__ = \"http://localhost:8181/\"; // eslint-disable-line no-undef\r\n\r\n// main app\r\nimport App from \"./App\";\r\n\r\nconst translations = JSON.parse(document.getElementById('reachMapTranslations').text);\r\n\r\nconst render = Component => {\r\n /* AppContainer is necessary for react-hot-loader */\r\n ReactDom.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n );\r\n}\r\n\r\nrender(App);\r\n\r\n/* for Webpack hot reload */\r\nif (module.hot) {\r\n module.hot.accept('./App',\r\n () => {\r\n render(App);\r\n });\r\n}\r\n"],"sourceRoot":""}