{"version":3,"sources":["components/assets/wheelchairIcon.svg","components/MapView/index.module.scss","components/Map/components/RoutePopup/index.module.scss","components/assets/walkIcon.svg","components/assets/bikeIcon.svg","services/marker/index.module.scss","components/Map/components/PoiPopup/index.module.scss","components/Map/index.module.scss","services/map/assets/camp.png","services/map/assets/pitstops.png","services/map/assets/stay.png","services/map/assets/easyPin.png","services/map/assets/moderatePin.png","services/map/assets/hardPin.png","services/map/assets/startPin.png","services/map/assets/endPin.png","components/assets/runIcon.svg","components/RouteView/index.module.scss","services/map/constants.ts","components/Map/components/RoutePopup/index.tsx","services/axiosConfig/index.ts","components/Map/utils/index.ts","services/cluster/index.ts","services/gpxParser/index.ts","services/routeDraw/index.ts","services/poi/index.ts","services/marker/index.ts","services/map/index.ts","contexts/index.ts","components/Map/components/PoiPopup/index.tsx","components/Map/components/BasePopup/index.tsx","components/MapView/index.tsx","components/RouteView/index.tsx","components/Map/index.tsx","index.tsx","components/Map/components/BasePopup/index.module.scss"],"names":["module","exports","EVENT_TYPES","MAP_IMAGE_NAMES","LngLatBounds","MAP_IMAGES","image","camp","name","CAMP","pitstops","PITSTOPS","stay","STAY","easyPin","EASY_PIN","moderatePin","MODERATE_PIN","hardPin","HARD_PIN","startPin","START_PIN","endPin","END_PIN","activityToImage","activity","walkIcon","runIcon","bikeIcon","wheelchairFriendlyIds","CATEGORY_INTERACTIVE_LAYERS","ROUTE_INTERACTIVE_LAYERS","RoutePopup","distance","wheelchairFriendly","src","className","styles","toFixed","wheelchairIcon","color","icon","faCheck","axiosInstance","axios","create","baseURL","process","interceptors","response","use","successHandler","error","errorHandler","MAP_MODE","Promise","resolve","reject","addClustersSource","map","routeFeatures","addSource","type","data","features","cluster","clusterMaxZoom","addClusterRoutesLayer","addLayer","id","source","filter","paint","addSingleRoutesLayer","layout","addClusterCountLayer","hasTracks","obj","get","length","getPointsData","path","getPointsCoordinates","pointObjects","object","$","getTrackPoints","trackPoints","trk","trkseg","seg","trkpt","pt","flattenDeep","getRoutePoints","flatten","route","rtept","getBounds","bounds","parseFloat","minlon","minlat","maxlon","maxlat","drawRoute","routePoints","properties","geometry","coordinates","addPoiSource","poiFeatures","addPoiLayer","markerStyleMapper","MARKER_START","MARKER_END","getOneRoute","update","getRouteGpx","then","routesMetadata","metadata","description","routeId","route_id","difficulty","start_point","createSingleRoute","end_point","style","element","document","createElement","Marker","offset","setLngLat","addTo","createMarker","getRoutes","routes","apiPaging","Math","ceil","urls","mapValues","keyBy","togUrl","promises","i","push","slice","val","url","all","parseMetadataToFeatures","createClusters","getPoiData","poisData","poiData","toLowerCase","parsePoisToFeatures","drawPoi","a","xml","parseStringPromise","result","points","flow","dataFromGpx","pointsCoordinates","point","lon","lat","fitBounds","padding","setMapMode","params","URLSearchParams","window","location","search","category","ONE_ROUTE","CATEGORY_MODE","ALL_ROUTES","MapBuilder","container","mapMode","this","Map","minZoom","maxZoom","pitchWithRotate","dragRotate","doubleClickZoom","center","addControl","NavigationControl","showZoom","showCompass","ScaleControl","maxWidth","unit","setZoom","forEach","layer","on","MOUSE_ENTER","getCanvas","cursor","MOUSE_LEAVE","CLICK","flyTo","lngLat","zoom","getZoom","speed","img","loadImage","err","addImage","updatePopup","popup","e","isOpen","remove","getLayer","removeLayer","removeSource","selectedCategory","categories","find","flatMap","categoryData","uniq","uniqBy","getRoutesForAllCategories","CONTEXT_INITIAL_VALUE","routePopup","title","poiPopup","singleRoute","RoutesContext","React","createContext","PoiPopup","alt","BasePopup","headerText","children","text","redirectTo","useCallback","top","href","onClick","MapView","setMapElement","ref","RouteView","includes","props","mapElement","routePopupRef","createRef","poiPopupRef","initializePopups","Popup","closeOnClick","setDOMContent","current","renderPopups","toString","state","addControls","addImages","registerMouseEvents","routeClickHandler","setState","poiClickHandler","getData","getMap","Provider","value","Consumer","PureComponent","mapbox","accessToken","ReactDOM","render","getElementById"],"mappings":"+EAAAA,EAAOC,QAAU,IAA0B,4C,oBCC3CD,EAAOC,QAAU,CAAC,WAAW,0BAA0B,iBAAiB,gCAAgC,sBAAsB,uC,oBCA9HD,EAAOC,QAAU,CAAC,MAAQ,0BAA0B,aAAe,mC,oBCDnED,EAAOC,QAAU,IAA0B,sC,oBCA3CD,EAAOC,QAAU,IAA0B,sC,oBCC3CD,EAAOC,QAAU,CAAC,eAAe,6BAA6B,aAAa,6B,oBCA3ED,EAAOC,QAAU,CAAC,mBAAqB,qCAAqC,aAAe,iC,oBCA3FD,EAAOC,QAAU,CAAC,IAAM,iBAAiB,WAAa,0B,kBCDtDD,EAAOC,QAAU,0jD,kBCAjBD,EAAOC,QAAU,8vB,kBCAjBD,EAAOC,QAAU,8gC,kBCAjBD,EAAOC,QAAU,kmL,kBCAjBD,EAAOC,QAAU,0tM,kBCAjBD,EAAOC,QAAU,83M,kBCAjBD,EAAOC,QAAU,8zB,kBCAjBD,EAAOC,QAAU,k5J,oBCAjBD,EAAOC,QAAU,IAA0B,qC,yDCC3CD,EAAOC,QAAU,CAAC,oBAAoB,qCAAqC,uBAAuB,wCAAwC,kBAAkB,mCAAmC,wBAAwB,yCAAyC,mBAAmB,oCAAoC,wBAAwB,2C,ihDCqBnUC,EAMAC,E,4VAbW,IAAIC,eAAa,CACtC,EAAE,SAAU,WACZ,CAAC,SAAU,c,SAKDF,K,cAAAA,E,yBAAAA,E,0BAAAA,M,cAMAC,K,YAAAA,E,oBAAAA,E,YAAAA,E,oBAAAA,E,4BAAAA,E,oBAAAA,E,sBAAAA,E,mBAAAA,M,KAWL,IAAME,EAAa,CACxB,CAAEC,MAAOC,IAAMC,KAAML,EAAgBM,MACrC,CAAEH,MAAOI,IAAUF,KAAML,EAAgBQ,UACzC,CAAEL,MAAOM,IAAMJ,KAAML,EAAgBU,MACrC,CAAEP,MAAOQ,IAASN,KAAML,EAAgBY,UACxC,CAAET,MAAOU,IAAaR,KAAML,EAAgBc,cAC5C,CAAEX,MAAOY,IAASV,KAAML,EAAgBgB,UACxC,CAAEb,MAAOc,IAAUZ,KAAML,EAAgBkB,WACzC,CAAEf,MAAOgB,IAAQd,KAAML,EAAgBoB,UAG5BC,EAAkB,SAACC,GAC9B,OAAQA,GACN,KAAK,EACH,OAAOC,IACT,KAAK,EACH,OAAOC,IACT,KAAK,EAEL,KAAK,EACH,OAAOC,IACT,QACE,OAAOF,MAIAG,EAAwB,CACnC,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAOWC,EAA8B,CAJd,gBACK,sBAKrBC,EAA2B,CAJd,cC3HXC,EAnB+C,SAAC,GAIxD,IAHLC,EAGI,EAHJA,SACAR,EAEI,EAFJA,SACAS,EACI,EADJA,mBAEA,OACE,oCACE,yBAAKC,IAAKX,EAAgBC,GAAWW,UAAWC,IAAM,QACtD,8BAAOJ,EAAW,KAAMK,QAAQ,GAAhC,OACCJ,GACC,oCACE,yBAAKE,UAAWC,IAAM,aAAkBF,IAAKI,MAC7C,kBAAC,IAAD,CAAiBC,MAAO,QAASC,KAAMC,S,iECzB3CC,G,QAAgBC,EAAMC,OAAO,CACjCC,QAASC,gEAGXJ,GAAcK,aAAaC,SAASC,KAClC,SAACD,GAAD,OAAkCE,GAAeF,MACjD,SAACG,GAAD,OAAuBC,GAAaD,MAGtC,ICUYE,GDVNH,GAAiB,SAACF,GACtB,OAAOM,QAAQC,QAAQP,IAGnBI,GAAe,SAACD,GACpB,OAAOG,QAAQE,OAAOL,IAGTT,MEkDTe,GAAoB,SAACC,EAAgBC,GACzCD,EAAIE,UA3D4B,WA2DE,CAChCC,KAAM,UACNC,KAAM,CACJD,KAAM,oBACNE,SAAUJ,GAEZK,SAAS,EACTC,eAAgB,MAIdC,GAAwB,SAACR,GAC7BA,EAAIS,SAAS,CACXC,GJwEyB,g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","file":"static/js/main.8871b23d.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/wheelchairIcon.2cb9a34c.svg\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"map-view\":\"MapView_map-view__1LZKM\",\"map-view__logo\":\"MapView_map-view__logo__uyTea\",\"map-view__copyright\":\"MapView_map-view__copyright__1x7Tc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"popup\":\"RoutePopup_popup__29ED9\",\"popup__wheel\":\"RoutePopup_popup__wheel__TvYEA\"};","module.exports = __webpack_public_path__ + \"static/media/walkIcon.26a5b1ce.svg\";","module.exports = __webpack_public_path__ + \"static/media/bikeIcon.fea9dd3f.svg\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"marker-start\":\"marker_marker-start__2tQfE\",\"marker-end\":\"marker_marker-end__3ZC1q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"popup__description\":\"PoiPopup_popup__description__2IQUm\",\"popup__image\":\"PoiPopup_popup__image__2W9JX\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"map\":\"Map_map__1Fbmp\",\"map__popup\":\"Map_map__popup__1GLDH\"};","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAjCAYAAACD1LrRAAAAAXNSR0IArs4c6QAABFFJREFUWAm1V01sE0cU/sY2MSGJ2gMFRIUiIAnETm4cWsKpFT300kMlSkJc0VLlgFT+BP2hFAJIkLaU0gNC0EpIxCYSQiD1UKkI0UOlthxQL9hxSBBSU6kU8U+BOKx3+MabSbyza+/6wEjW7Hvz3vfNm5k38ywQ0HJY956ErJeIFDqQHqpmPozud22IJkBYCaQzAkJWso9UGtB6G7KDxCeB4mkFrPVmn0XqjSJw1rGVK6uRKt9A4rmIDjCCf5Qxo/lmFB/H1Xd5kzgT5cSOKJ0AHsQgd5eP+30HEi/A4GPO7xPlzGgWT+L2VhMoh/MfcaxzSr9vGYZumzamzAmGa1n0/EbwVVzCR/WY07oEP/6nPK+j76UJPBrlZr7CsTGgLZlE/2QQamDEMwCxTQS2Sd70FI8PaD1Jv1SkU/L2MKTKNnTEyphRHydxn5oAEFshYP1P+SqJ6wh0KYmhN5VdmBYLY6Rt6hDfVUBhDcleJukRsj/gGEmFHUNkm7YL09cUsQLMoWczU6x0gjUB9+uHBIb6tBymr2GPHbh2tB1lhDkNzu+HdYjt0nLYvmZigX6L4JkZAnmhBYO3ZuRwXzUvdRYbG4F7Kn0WTFFYs4BO5m4+HKVjVXPEJN1ZRqpQYlyCQ7WQKtuaIubBaiZpnqd6tkkUgVidwOmLpr6SXFPEJPzaj1SBc0KHJfpD44U2zGNdF8HXVIqAE+rMYnRDpXFTH4qYoMKC7cpdE8iR7f15fMj3OLiFIs6i931CrQiGw/winn4ewi74cN1EquEOrGtc5oXhAMUED/qyJE79Xc0+MOK7KH7qR8oba4xJ8asJrg6fhPWVqTflquk0hg8WFTAxQuJ6r2P0HRYI48CzKxx34VCQApGVCWT+NP20XDVivkQD/qTiYhLpn7icf5EzrcF0rybCyA9r2a+vSMzq8jVOvNt0YjRFgeh0+RNH/AsuO/fV3Uj8Oi+ctW7tjORLrNKHv+/MJVRuLHOPJzB4VUO04OQ4J/O9lst7+g/cwHrPLadsfIlz6O0mMSM2m7g/C/YeUxtH40FG7SnwiNH8BIUtpr2SPcTj2Mri3WZJ6228j/f6VZBLcUJVIvu9Hkojdo4hNc8c8xA/xM0dNFpkGjKikXY0HDX1Wk6g8ZiTYlrj9Iy6qYCiZ1IuYl53CyVEqYZ2u5fyZZvAiWemXsvOmKhwa8kNOaQ6tK3qXcQWJg7y+DSUGzjf4hc+eT979W5NEpmzjPoPt1YdSERtFL8t108T55FiuSpT5YNT31ZdWfr4jLtUEUS2uxTTgnyL6fW2FqeJLf738UsfpsqxNgwOa4egvh3p37kx5/zsWJ0e4ptdKqlLxHx9+M7KLtOYpHeBOf2mPkgm6Gck9zsP7cMYKZXBQv37m8Qd3sey2QQk8WXqAvfW9HNk0UvMVnNM5ftsNLawQO5p5RJcMw1epBxFtItBqX8Hvat5abz6Isk0Nrfh3+XIXHgOGd9H8bHABsAAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAAAXNSR0IArs4c6QAAAeNJREFUWAntWLtKA0EUPXeMWqXyB7QwMabxD7TTTrEQDSroJ4i92hhbG8HK+CBWgq2dWNjYCIkYESRVCGhjIZoEd7w3OiFZTDYIO1khA7t37rzO2XPnxdIdEmMA5LGaNFRJgTKjOM4a4BBnZjT0himwZz/hMFgWiYte6MUoTl+UPfBmSHqyAtqX2gCQERp69h7LAxImK4lADwy0Uwcm02Pa+A4qMWtkGLQYRzplwHnhDHK+RkahJxSQMH1T7JIxoXLbQCljbQLzyhnPYkEbNdg32R+rCoFQhoD8CA4frSnjkqHOpTcFtcL7kLZGhr/+FaBbw4KDVCLoTC+wF8HJk5RbIyNEeNObMGR+s4GYM4ZYl4xRwm0Dp0zZzdAfX3visDJU9AfcPao3jgrBuXZ388cnTxzFF+Ecq3PjDwEzKr31oe/MeM1sdQLza523Y7ms+5IUdHIYB89eg1fJjCJ9xdv1mlfjv9XTWQzRZDt9q2SkIRPa5QNrnkl5fkE7A/M4ZVZ7O47IHGGzLdW5T2PKYTXs4H3JAU3xQTbE8ync2KKl98EHYIH7XSr0H8WQyrds3a38jwpQp/5CsFhyv6ldtkQ8uVx15C8Er7QtISQkTKotbVPQSRsoMhKmc5Ys3wFFGkIk+F9ZD2cSX/yvFAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAhCAYAAABeD2IVAAAAAXNSR0IArs4c6QAAArFJREFUWAntmE1oE0EYht/ZbFsUhRZRsaJUERsbQfDkSYyiXnrxIk0aoeDFSxGLBxHFogiCFERQUBEPmrTevOhBxJ+rKArtblP8KVKVitSKilrpZn3HsCXNZjab3aRF6FwmM9833/fsOz87G4EqFAOdbQJ2SyOWPG7G1Z9hQ2phAxhIHANygznk7k7i+8thdLWEjSnCBBhC8iSBThfGEBDvItDjUdwcLeyv5HdgKAPJXhu5U4pkY/XQdmxE5q3C7tkdCIoKnaFCJzwjQ7wXiMRjuPXa289trRjKQMdZGzjuDuXuYfAPAlq8DZlXbqu6p6KFbqLjnF8gmZK+q23YT7JItaoR3BbfSlGh80xy1B2ifA+TjOsQ8Vb0Z8t7A76guO37+MQ9fgKqfcQnTuXOGNKm2idvKTt9BLoQHkgms1dytz4ycWBzOShPpQh0kUDd5YJUYmfCzxoiuzYhPagaV1IpgoghJC5VG0hCcF0u5+n/cASpLSool1ISyETnZUp9SDWoGv08+SeIuDuGgRfF8WYpJYGGkbxSayAJwVzLWD0wkdpaDDWjVF6hxDXKe7DYqbZtManD3hPFwDMnzz8oG72aiex1AnU5hrmtxVdO594YMk9lXk0CGRi5MX9AEsNu5Lv0PtfyNtkS3PY9nLo+2ZjvIhd/E5au1XXgngURsSHq8lD2CkIengtAQvB0F+mCXB9Xofn3zEJ3DPJqa8MynHYta0LdiaF/X3EOChWsCOjbm7D4uWr0F3y7TVu7yu7VHxgqgulfXh8JvFVY3DyByqzDM1CEGgxagPIr6oJSC0r5VcCv3/+xpnh/nvb7RGH9eLhapWK4lIqi/Q1fiOOlnKvfx4tuieJ6zQjst8ZwZP0PTKzJwXLZnRgNqPP886IBi7qn8Ef5eV8PfWoD1o068Qrrvy6UuwxM3bObAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAVCAYAAACZm7S3AAAAAXNSR0IArs4c6QAAAhNJREFUOBGNlM1rE1EUxe95kwQbSXXRpSDarZRuLKgkCELarCwu3KjQ7qy0jboT/AN0V1tBdxURxI1UUVInICGJ3xsXdhlaEV0JSgtxoTPXewfe9M2YAWeR++7vnPPmzmMmoNRVrdyuEP85T4wJJh4B4TuB3xNyD/z2fNu1wzbTJ1f394Pte8x82rJ0BfCk6A3PrLVmf6oWhWu15eFgh1/JnY6kA+leJvnklXCi0VjcNipK8M7/BNWrPvXrGlPlpbGA8VFw/AiRQOgL6YFpVAJFZbsX2AOPmxA4OyDYzFP+QLNTH9MqozZ3g7piaM4w03hSINozZGaedy/9UK61UCjMpj2aMyAuuYLMvvO0ufDNZc9ezn1V7jLNyYFh04VMVJosL0+4THvlLtNcTn425BkSnCl8NFVeucjFoQ/o/zoaUnA3YYgabKBaWTnEYdjTQ/jXkEXktHOFw8ZvL2xKqptlG8QB7qy35rail8QYujHIlMUMcFO1eNRqeem1HP+xrIDlAL3xO5ePax/dWReeZ67KTqGus65I59wVq8fhRmvxLRkMOFVrlSq6351/Z0kcVuDtxTUZa8uKblWuussSYf3MCDgn323gmqJeeKQ7gueso2Xv8/qX0YO139KcspqEr/ud+kPb2xqftgVa5d8Ek5Vbj+X0p2XctRft+hnZIPkaii8xtt1Ajfu8/AXZ+X5UBwTV+xc9Y7Fs6yOEhgAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/runIcon.f1c50700.svg\";","// extracted by mini-css-extract-plugin\nmodule.exports = {\"route-view__title\":\"RouteView_route-view__title__3lraX\",\"route-view__distance\":\"RouteView_route-view__distance__3GPeZ\",\"route-view__map\":\"RouteView_route-view__map__16q6R\",\"route-view__os-button\":\"RouteView_route-view__os-button__2LDzI\",\"route-view__logo\":\"RouteView_route-view__logo__1RwI4\",\"route-view__copyright\":\"RouteView_route-view__copyright__2oLP-\"};","import { LngLatBounds } from 'mapbox-gl';\r\n\r\nimport camp from './assets/camp.png';\r\nimport pitstops from './assets/pitstops.png';\r\nimport stay from './assets/stay.png';\r\nimport easyPin from './assets/easyPin.png';\r\nimport moderatePin from './assets/moderatePin.png';\r\nimport hardPin from './assets/hardPin.png';\r\nimport startPin from './assets/startPin.png';\r\nimport endPin from './assets/endPin.png';\r\n\r\nimport walkIcon from '../../components/assets/walkIcon.svg';\r\nimport runIcon from '../../components/assets/runIcon.svg';\r\nimport bikeIcon from '../../components/assets/bikeIcon.svg';\r\n\r\nexport const UK_BBOX = new LngLatBounds([\r\n [-7.555904, 49.766133],\r\n [3.633984, 61.464083]\r\n]);\r\n\r\nexport const INITIAL_ZOOM_LEVEL = 6;\r\n\r\nexport enum EVENT_TYPES {\r\n CLICK = 'click',\r\n MOUSE_ENTER = 'mouseenter',\r\n MOUSE_LEAVE = 'mouseleave'\r\n}\r\n\r\nexport enum MAP_IMAGE_NAMES {\r\n CAMP = 'camp',\r\n PITSTOPS = 'pitstops',\r\n STAY = 'stay',\r\n EASY_PIN = 'easy_pin',\r\n MODERATE_PIN = 'moderate_pin',\r\n HARD_PIN = 'hard_pin',\r\n START_PIN = 'start_pin',\r\n END_PIN = 'end_pin'\r\n}\r\n\r\nexport const MAP_IMAGES = [\r\n { image: camp, name: MAP_IMAGE_NAMES.CAMP },\r\n { image: pitstops, name: MAP_IMAGE_NAMES.PITSTOPS },\r\n { image: stay, name: MAP_IMAGE_NAMES.STAY },\r\n { image: easyPin, name: MAP_IMAGE_NAMES.EASY_PIN },\r\n { image: moderatePin, name: MAP_IMAGE_NAMES.MODERATE_PIN },\r\n { image: hardPin, name: MAP_IMAGE_NAMES.HARD_PIN },\r\n { image: startPin, name: MAP_IMAGE_NAMES.START_PIN },\r\n { image: endPin, name: MAP_IMAGE_NAMES.END_PIN }\r\n];\r\n\r\nexport const activityToImage = (activity: number) => {\r\n switch (activity) {\r\n case 1:\r\n return walkIcon;\r\n case 2:\r\n return runIcon;\r\n case 3:\r\n return bikeIcon;\r\n case 4:\r\n return bikeIcon;\r\n default:\r\n return walkIcon;\r\n }\r\n};\r\n\r\nexport const wheelchairFriendlyIds = [\r\n '3827588',\r\n '4054281',\r\n '3826464',\r\n '4011083',\r\n '4009636',\r\n '4048489',\r\n '4052107',\r\n '4106997',\r\n '4101802',\r\n '3827799',\r\n '3803973',\r\n '3824928',\r\n '3820119',\r\n '3798705',\r\n '3827733',\r\n '3827373',\r\n '3820257',\r\n '3820161',\r\n '3825772',\r\n '3825694',\r\n '3867795',\r\n '3868087',\r\n '3824765',\r\n '3867773',\r\n '3867888',\r\n '3824781',\r\n '3827880',\r\n '4007276',\r\n '3867985',\r\n '3867909',\r\n '3827915',\r\n '3827836',\r\n '3868214',\r\n '3827790',\r\n '3868262',\r\n '3868040',\r\n '3827710',\r\n '3827763',\r\n '3827747',\r\n '3867730',\r\n '3827984',\r\n '3827822',\r\n '3867706',\r\n '3868192',\r\n '3868607',\r\n '3867839',\r\n '3869843',\r\n '3868149',\r\n '3868199',\r\n '3824862',\r\n '3827971',\r\n '3827813',\r\n '3868356',\r\n '3867877',\r\n '3824997',\r\n '3868117',\r\n '3867809',\r\n '3868584',\r\n '3867753',\r\n '3825643',\r\n '3827942',\r\n '3827926',\r\n '3868017',\r\n '3827754',\r\n '3868134',\r\n '3825662',\r\n '3868058',\r\n '3868293',\r\n '3827699',\r\n '3827902',\r\n '3867853',\r\n '3827779',\r\n '3827843',\r\n '4209879',\r\n '3868314',\r\n '3868368',\r\n '3868100',\r\n '3792204',\r\n '4409289',\r\n '4409307',\r\n '4404894',\r\n '3825678',\r\n '4394370',\r\n '4404894',\r\n '4409289',\r\n '3824631',\r\n '4409307'\r\n];\r\n\r\nexport const CLUSTER_LAYER = 'cluster-layer';\r\nexport const SINGLE_ROUTE_LAYER = 'single-route-layer';\r\nexport const POIS_LAYER = 'pois-layer';\r\n\r\nexport const CATEGORY_INTERACTIVE_LAYERS = [CLUSTER_LAYER, SINGLE_ROUTE_LAYER];\r\n\r\nexport const ROUTE_INTERACTIVE_LAYERS = [POIS_LAYER];\r\n","import React from 'react';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons';\r\n\r\nimport styles from './index.module.scss';\r\nimport wheelchairIcon from '../../../assets/wheelchairIcon.svg';\r\n\r\nimport { activityToImage } from '../../../../services/map/constants';\r\n\r\ninterface IRoutePopupProps {\r\n distance: number;\r\n activity: number;\r\n wheelchairFriendly: boolean;\r\n}\r\n\r\nconst RoutePopup: React.FunctionComponent<IRoutePopupProps> = ({\r\n distance,\r\n activity,\r\n wheelchairFriendly\r\n}) => {\r\n return (\r\n <>\r\n <img src={activityToImage(activity)} className={styles['popup']} />\r\n <div>{(distance / 1000).toFixed(2)} km</div>\r\n {wheelchairFriendly && (\r\n <>\r\n <img className={styles['popup__wheel']} src={wheelchairIcon} />\r\n <FontAwesomeIcon color={'green'} icon={faCheck} />\r\n </>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default RoutePopup;\r\n","import axios, { AxiosError, AxiosResponse } from 'axios';\r\n\r\nconst axiosInstance = axios.create({\r\n baseURL: process.env.REACT_APP_DATA_API\r\n});\r\n\r\naxiosInstance.interceptors.response.use(\r\n (response: AxiosResponse<any>) => successHandler(response),\r\n (error: AxiosError) => errorHandler(error)\r\n);\r\n\r\nconst successHandler = (response: AxiosResponse<any>) => {\r\n return Promise.resolve(response);\r\n};\r\n\r\nconst errorHandler = (error: AxiosError) => {\r\n return Promise.reject(error);\r\n};\r\n\r\nexport default axiosInstance;\r\n","export type updateRoutePopupType = (\r\n distance: number,\r\n title: string,\r\n routeId: string,\r\n url: string,\r\n activity: number\r\n) => void;\r\nexport type updatePoiPopupType = (\r\n name: string,\r\n description: string,\r\n image: string,\r\n url: string\r\n) => void;\r\nexport type updateSingleRouteType = (\r\n name: string,\r\n distance: number,\r\n url: string,\r\n activity: number,\r\n routeId: string\r\n) => void;\r\n\r\nexport enum MAP_MODE {\r\n ALL_ROUTES = 'ALL_ROUTES',\r\n CATEGORY_MODE = 'CATEGORY_MODE',\r\n ONE_ROUTE = 'ONE_ROUTE'\r\n}\r\n","import { Map as MapboxMap } from 'mapbox-gl';\r\nimport { Feature } from 'geojson';\r\n\r\nimport IRouteMetadata from '../../models/routeMetadata';\r\nimport {\r\n CLUSTER_LAYER,\r\n MAP_IMAGE_NAMES,\r\n SINGLE_ROUTE_LAYER\r\n} from '../map/constants';\r\n\r\nconst CLUSTER_COUNT_LAYER = 'cluster-count';\r\nexport const CLUSTERS_SOURCE_ID = 'clusters';\r\n\r\nconst CLUSTER_ROUTES_POINT_COLOR = '#d40058';\r\nconst CLUSTER_COUNT_COLOR = '#fff';\r\n\r\nexport const parseMetadataToFeatures = (routesMetadata: IRouteMetadata[]) => {\r\n return routesMetadata.map((metadata: IRouteMetadata) => {\r\n return {\r\n type: 'Feature',\r\n properties: {\r\n name: metadata.name,\r\n description: metadata.description,\r\n distance: metadata.distance,\r\n routeId: metadata.route_id,\r\n difficulty: metadata.difficulty,\r\n url: metadata.url,\r\n activity: metadata.activity\r\n },\r\n geometry: { type: 'Point', coordinates: metadata.start_point }\r\n } as Feature;\r\n });\r\n};\r\n\r\nexport const createClusters = (\r\n map: MapboxMap,\r\n routesMetadata: IRouteMetadata[]\r\n) => {\r\n const routeFeatures = parseMetadataToFeatures(routesMetadata);\r\n\r\n addClustersSource(map, routeFeatures);\r\n addClusterRoutesLayer(map);\r\n addSingleRoutesLayer(map);\r\n addClusterCountLayer(map);\r\n};\r\n\r\nexport const createSingleRoute = (\r\n map: MapboxMap,\r\n routesMetadata: IRouteMetadata[]\r\n) => {\r\n const routeFeatures = routesMetadata.map((metadata: IRouteMetadata) => {\r\n return {\r\n type: 'Feature',\r\n properties: {\r\n name: metadata.name,\r\n description: metadata.description,\r\n distance: metadata.distance,\r\n routeId: metadata.route_id,\r\n difficulty: metadata.difficulty,\r\n activity: metadata.activity\r\n },\r\n geometry: { type: 'Point', coordinates: metadata.start_point }\r\n } as Feature;\r\n });\r\n\r\n addClustersSource(map, routeFeatures);\r\n addSingleRoutesLayer(map);\r\n};\r\n\r\nconst addClustersSource = (map: MapboxMap, routeFeatures: Feature[]) => {\r\n map.addSource(CLUSTERS_SOURCE_ID, {\r\n type: 'geojson',\r\n data: {\r\n type: 'FeatureCollection',\r\n features: routeFeatures\r\n },\r\n cluster: true,\r\n clusterMaxZoom: 14\r\n });\r\n};\r\n\r\nconst addClusterRoutesLayer = (map: MapboxMap) => {\r\n map.addLayer({\r\n id: CLUSTER_LAYER,\r\n type: 'circle',\r\n source: CLUSTERS_SOURCE_ID,\r\n filter: ['has', 'point_count'],\r\n paint: {\r\n 'circle-color': CLUSTER_ROUTES_POINT_COLOR,\r\n 'circle-radius': 17,\r\n 'circle-opacity': 0.95,\r\n 'circle-stroke-width': 4,\r\n 'circle-stroke-opacity': 0.25,\r\n 'circle-stroke-color': CLUSTER_ROUTES_POINT_COLOR\r\n }\r\n });\r\n};\r\n\r\nconst addSingleRoutesLayer = (map: MapboxMap) => {\r\n map.addLayer({\r\n id: SINGLE_ROUTE_LAYER,\r\n type: 'symbol',\r\n source: CLUSTERS_SOURCE_ID,\r\n filter: ['!', ['has', 'point_count']],\r\n layout: {\r\n 'icon-image': [\r\n 'case',\r\n ['==', ['get', 'difficulty'], 0],\r\n MAP_IMAGE_NAMES.EASY_PIN,\r\n ['==', ['number', ['get', 'difficulty']], 1],\r\n MAP_IMAGE_NAMES.MODERATE_PIN,\r\n ['==', ['number', ['get', 'difficulty']], 2],\r\n MAP_IMAGE_NAMES.HARD_PIN,\r\n MAP_IMAGE_NAMES.EASY_PIN\r\n ],\r\n 'icon-size': 0.5,\r\n 'icon-anchor': 'bottom'\r\n }\r\n });\r\n};\r\n\r\nconst addClusterCountLayer = (map: MapboxMap) => {\r\n map.addLayer({\r\n id: CLUSTER_COUNT_LAYER,\r\n type: 'symbol',\r\n source: CLUSTERS_SOURCE_ID,\r\n filter: ['has', 'point_count'],\r\n paint: {\r\n 'text-color': CLUSTER_COUNT_COLOR\r\n },\r\n layout: {\r\n 'text-field': '{point_count_abbreviated}',\r\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\r\n 'text-size': 14\r\n }\r\n });\r\n};\r\n","import { parseStringPromise } from 'xml2js';\r\nimport { LngLatBoundsLike } from 'mapbox-gl';\r\nimport { get, flow, flattenDeep, flatten } from 'lodash';\r\n\r\nimport { IBounds, IGpxObject, ITrkpt } from '../../models/gpxObject';\r\nimport { IPointObject } from '../../models/pointObject';\r\nimport { IPoint } from '../../models/point';\r\n\r\nexport const ROUTE_POINT_KEY = 'gpx.rte';\r\nexport const TRACK_SEGMENTS_PATH = 'gpx.trk';\r\nexport const TRACK_POINT_ARRAY_KEY = 'gpx.trk[0].trkseg[0].trkpt';\r\nexport const WAY_POINT_ARRAY_KEY = 'gpx.wpt';\r\nexport const ROUTE_BOUNDS_KEY = 'gpx.metadata[0].bounds[0]';\r\n\r\nexport const parseGpx = (xml: any) => {\r\n return parseStringPromise(xml).then((result: IGpxObject) => {\r\n if (!hasTracks(result)) {\r\n const routePoints = getRoutePoints(result);\r\n\r\n if (routePoints.length === 0) {\r\n const wayPoints = flow([getPointsData, getPointsCoordinates])(\r\n result,\r\n WAY_POINT_ARRAY_KEY\r\n );\r\n return { points: wayPoints, bounds: getBounds(result) };\r\n } else {\r\n return { points: routePoints, bounds: getBounds(result) };\r\n }\r\n } else {\r\n return { points: getTrackPoints(result), bounds: getBounds(result) };\r\n }\r\n });\r\n};\r\n\r\nexport const hasTracks = (obj: IGpxObject): boolean => {\r\n const trackSegmentPoint = get(obj, TRACK_POINT_ARRAY_KEY, []);\r\n return trackSegmentPoint.length > 0 ? true : false;\r\n};\r\n\r\nexport const getPointsData = (obj: IGpxObject, path: string) => {\r\n return get(obj, path, []);\r\n};\r\n\r\nexport const getPointsCoordinates = (pointObjects: IPointObject[]) => {\r\n return pointObjects.map((object: IPointObject) => object.$);\r\n};\r\n\r\nexport const getTrackPoints = (data: IGpxObject) => {\r\n const trackPoints = get(data, TRACK_SEGMENTS_PATH, []).map(\r\n (trk: { trkseg: any[] }) =>\r\n trk.trkseg.map((seg: { trkpt: IPointObject[] }) =>\r\n seg.trkpt.map((pt: IPointObject) => pt.$)\r\n )\r\n );\r\n return flattenDeep(trackPoints);\r\n};\r\n\r\nexport const getRoutePoints = (data: IGpxObject): IPoint[] => {\r\n return flatten(\r\n get(data, ROUTE_POINT_KEY, []).map((route: { rtept: ITrkpt[] }) =>\r\n route.rtept.map((pt: IPointObject) => pt.$)\r\n )\r\n );\r\n};\r\n\r\nexport const getBounds = (data: IGpxObject) => {\r\n const bounds = get(data, ROUTE_BOUNDS_KEY, []) as IBounds;\r\n return [\r\n parseFloat(bounds.$.minlon),\r\n parseFloat(bounds.$.minlat),\r\n parseFloat(bounds.$.maxlon),\r\n parseFloat(bounds.$.maxlat)\r\n ] as LngLatBoundsLike;\r\n};\r\n","import { LngLatLike, Map as MapboxMap } from 'mapbox-gl';\r\n\r\nexport const ROUTE_LAYER = 'route-layer';\r\n\r\nexport const drawRoute = (map: MapboxMap, routePoints: LngLatLike[]) => {\r\n map.addLayer({\r\n id: ROUTE_LAYER,\r\n type: 'line',\r\n source: {\r\n type: 'geojson',\r\n data: {\r\n type: 'Feature',\r\n properties: {},\r\n geometry: {\r\n type: 'LineString',\r\n coordinates: routePoints as any\r\n }\r\n }\r\n },\r\n layout: {\r\n 'line-join': 'round',\r\n 'line-cap': 'round'\r\n },\r\n paint: {\r\n 'line-color': '#d40058',\r\n 'line-width': 6\r\n }\r\n });\r\n};\r\n","import { Map as MapboxMap } from 'mapbox-gl';\r\n\r\nimport { Feature } from 'geojson';\r\nimport { MAP_IMAGE_NAMES, POIS_LAYER } from '../map/constants';\r\nimport { IPoi } from '../../models/poi';\r\n\r\nexport const POIS_SOURCE_ID = 'pois';\r\n\r\nexport const parsePoisToFeatures = (poisData: IPoi[]) => {\r\n return poisData.map((poiData: any) => {\r\n return {\r\n type: 'Feature',\r\n properties: {\r\n name: poiData['Company name'],\r\n description: poiData['Description for Establishment'],\r\n image: `${process.env.REACT_APP_POIS_IMAGES}${poiData.image}`,\r\n url: poiData['Partner Page URL '],\r\n type: poiData['Icon on Map (eg bench, house, tent)'].toLowerCase()\r\n },\r\n geometry: {\r\n type: 'Point',\r\n coordinates: [poiData['Longitude'], poiData['Latitude']]\r\n }\r\n };\r\n }) as Feature[];\r\n};\r\n\r\nexport const drawPoi = (map: MapboxMap, poisData: IPoi[]) => {\r\n const poiFeatures = parsePoisToFeatures(poisData);\r\n\r\n addPoiSource(map, poiFeatures);\r\n addPoiLayer(map);\r\n};\r\n\r\nexport const addPoiSource = (map: MapboxMap, poiFeatures: Feature[]) => {\r\n map.addSource(POIS_SOURCE_ID, {\r\n type: 'geojson',\r\n data: {\r\n type: 'FeatureCollection',\r\n features: poiFeatures\r\n },\r\n cluster: false\r\n });\r\n};\r\n\r\nexport const addPoiLayer = (map: MapboxMap) => {\r\n map.addLayer({\r\n id: POIS_LAYER,\r\n type: 'symbol',\r\n source: POIS_SOURCE_ID,\r\n layout: {\r\n 'icon-image': [\r\n 'case',\r\n ['==', ['get', 'type'], 'house'],\r\n MAP_IMAGE_NAMES.STAY,\r\n ['==', ['get', 'type'], 'bench'],\r\n MAP_IMAGE_NAMES.PITSTOPS,\r\n ['==', ['get', 'type'], 'tent'],\r\n MAP_IMAGE_NAMES.CAMP,\r\n MAP_IMAGE_NAMES.CAMP\r\n ],\r\n 'icon-size': 0.6,\r\n 'icon-allow-overlap': true\r\n }\r\n });\r\n};\r\n","import { LngLatLike, Map as MapboxMap, Marker } from 'mapbox-gl';\r\nimport { get } from 'lodash';\r\nimport styles from './index.module.scss';\r\n\r\nexport const MARKER_START = 'MARKER_START';\r\nexport const MARKER_END = 'MARKER_END';\r\n\r\nconst markerStyleMapper = {\r\n MARKER_START: styles['marker-start'],\r\n MARKER_END: styles['marker-end']\r\n};\r\n\r\nexport const createMarker = (\r\n coordinates: LngLatLike,\r\n map: MapboxMap,\r\n style: string\r\n) => {\r\n const element = document.createElement('div');\r\n element.className = get(markerStyleMapper, style);\r\n\r\n new Marker(element, { offset: [0, -21] }).setLngLat(coordinates).addTo(map);\r\n};\r\n","import {\r\n LngLatBoundsLike,\r\n LngLatLike,\r\n Map,\r\n NavigationControl,\r\n Popup,\r\n ScaleControl\r\n} from 'mapbox-gl';\r\nimport { find, get, keyBy, mapValues, uniqBy } from 'lodash';\r\n\r\nimport {\r\n CATEGORY_INTERACTIVE_LAYERS,\r\n CLUSTER_LAYER,\r\n EVENT_TYPES,\r\n INITIAL_ZOOM_LEVEL,\r\n MAP_IMAGES,\r\n POIS_LAYER,\r\n ROUTE_INTERACTIVE_LAYERS,\r\n SINGLE_ROUTE_LAYER\r\n} from './constants';\r\nimport axiosInstance from '../axiosConfig';\r\nimport { AxiosResponse } from 'axios';\r\nimport { createClusters, createSingleRoute } from '../cluster';\r\n\r\nimport { parseGpx } from '../gpxParser';\r\nimport { drawRoute, ROUTE_LAYER } from '../routeDraw';\r\nimport { IPoint } from '../../models/point';\r\n\r\nimport { drawPoi } from '../poi';\r\n\r\nimport { IMapImage } from '../../models/mapImage';\r\n\r\nimport {\r\n ICategoryData,\r\n IRouteData,\r\n ROUTES_CATEGORIES\r\n} from '../../models/routesCategories';\r\nimport IRouteMetadata from '../../models/routeMetadata';\r\nimport {\r\n MAP_MODE,\r\n updatePoiPopupType,\r\n updateRoutePopupType,\r\n updateSingleRouteType\r\n} from '../../components/Map/utils';\r\nimport { createMarker, MARKER_END } from '../marker';\r\n\r\nconst MAP_API_PAGING = 50;\r\n\r\nexport const getRoutesForAllCategories = (map: Map) => {\r\n axiosInstance\r\n .get(`${process.env.REACT_APP_CATEGORIES}`, {})\r\n .then((response: AxiosResponse) => {\r\n const { categories } = response.data;\r\n const data = categories.flatMap((categoryData: ICategoryData) =>\r\n categoryData.routes.map((route: IRouteData) => route)\r\n ) as IRouteData[];\r\n\r\n const uniq = uniqBy(data, (val: any) => val.id);\r\n\r\n getRoutes(map, uniq);\r\n });\r\n};\r\n\r\nexport const getRoutesForOneCategory = (\r\n map: Map,\r\n selectedCategory: ROUTES_CATEGORIES\r\n) => {\r\n axiosInstance\r\n .get(`${process.env.REACT_APP_CATEGORIES}`, {})\r\n .then((response: AxiosResponse) => {\r\n const { categories } = response.data;\r\n const routes = get(\r\n find(categories, (obj: any) => {\r\n return obj.category === selectedCategory;\r\n }),\r\n 'routes',\r\n []\r\n ) as [];\r\n\r\n getRoutes(map, routes);\r\n });\r\n};\r\n\r\nexport const getOneRoute = (\r\n id: string,\r\n map: Map,\r\n update: updateSingleRouteType\r\n) => {\r\n getRouteGpx(id, map);\r\n axiosInstance\r\n .get(`routes?route_ids=${id}`, {})\r\n .then((response: AxiosResponse) => {\r\n createSingleRoute(map, response.data);\r\n const {\r\n name,\r\n distance,\r\n route_id,\r\n end_point,\r\n activity\r\n } = response.data[0];\r\n createMarker(end_point, map, MARKER_END);\r\n update(\r\n name,\r\n distance,\r\n `https://explore.osmaps.com/route/${route_id}?referrer=TOG`,\r\n activity,\r\n id\r\n );\r\n });\r\n};\r\n\r\nexport const getRoutes = (map: Map, routes: IRouteData[]) => {\r\n const apiPaging = Math.ceil(routes.length / MAP_API_PAGING);\r\n const data: IRouteMetadata[] = [];\r\n const urls = mapValues(\r\n keyBy(routes, 'id'),\r\n (route: IRouteData) => route.togUrl\r\n );\r\n const promises = [];\r\n\r\n for (let i = 0; i < apiPaging; i++) {\r\n promises.push(\r\n axiosInstance\r\n .get(\r\n `routes?route_ids=${routes\r\n .slice(MAP_API_PAGING * i, MAP_API_PAGING * (i + 1))\r\n .map((route: IRouteData) => route.id)}`,\r\n {}\r\n )\r\n .then((response: AxiosResponse) => {\r\n if (response.data) {\r\n data.push(\r\n ...response.data.map((val: IRouteMetadata) => ({\r\n ...val,\r\n url: urls[val.route_id]\r\n }))\r\n );\r\n }\r\n })\r\n );\r\n }\r\n\r\n Promise.all(promises).then(() => {\r\n createClusters(map, data);\r\n });\r\n};\r\n\r\nexport const getPoiData = (map: Map) => {\r\n axiosInstance\r\n .get(`${process.env.REACT_APP_POIS}`, {})\r\n .then((response: AxiosResponse) => {\r\n drawPoi(map, response.data);\r\n });\r\n};\r\n\r\nexport const getRouteGpx = (id: string, map: Map) => {\r\n axiosInstance\r\n .get(`routes/${id}`, {})\r\n .then(async (response: AxiosResponse) => {\r\n const { data } = response;\r\n const dataFromGpx = (await parseGpx(data)) as {\r\n points: IPoint[];\r\n bounds: LngLatBoundsLike;\r\n };\r\n const pointsCoordinates = dataFromGpx.points.map((point: IPoint) => {\r\n return [point.lon, point.lat];\r\n }) as LngLatLike[];\r\n\r\n drawRoute(map, pointsCoordinates);\r\n map.fitBounds(dataFromGpx.bounds, { padding: 80 });\r\n });\r\n};\r\n\r\nexport const setMapMode = () => {\r\n const params = new URLSearchParams(window.location.search);\r\n const category = params.get('category') as ROUTES_CATEGORIES;\r\n const route = params.get('route');\r\n\r\n if (route) {\r\n return MAP_MODE.ONE_ROUTE;\r\n } else if (category) {\r\n return MAP_MODE.CATEGORY_MODE;\r\n } else {\r\n return MAP_MODE.ALL_ROUTES;\r\n }\r\n};\r\n\r\nexport class MapBuilder {\r\n protected map!: Map;\r\n protected mapMode: MAP_MODE;\r\n\r\n public constructor(container: HTMLDivElement, mapMode: MAP_MODE) {\r\n this.map = new Map({\r\n container,\r\n style:\r\n mapMode === MAP_MODE.ONE_ROUTE\r\n ? process.env.REACT_APP_MAPBOX_STYLE_ROUTE\r\n : process.env.REACT_APP_MAPBOX_STYLE,\r\n minZoom: 3,\r\n maxZoom: 22,\r\n pitchWithRotate: false,\r\n dragRotate: false,\r\n doubleClickZoom: true,\r\n center: [-1.26, 53.4]\r\n });\r\n this.mapMode = mapMode;\r\n }\r\n\r\n public getMap() {\r\n return this.map;\r\n }\r\n\r\n public addControls() {\r\n this.map.addControl(\r\n new NavigationControl({ showZoom: true, showCompass: false })\r\n );\r\n this.map.addControl(\r\n new ScaleControl({ maxWidth: 160, unit: 'imperial' }),\r\n 'bottom-right'\r\n );\r\n this.map.addControl(\r\n new ScaleControl({ maxWidth: 160, unit: 'metric' }),\r\n 'bottom-right'\r\n );\r\n return this;\r\n }\r\n\r\n public setZoom() {\r\n this.map.setZoom(INITIAL_ZOOM_LEVEL);\r\n return this;\r\n }\r\n\r\n public registerMouseEvents() {\r\n const layers =\r\n this.mapMode === MAP_MODE.ONE_ROUTE\r\n ? ROUTE_INTERACTIVE_LAYERS\r\n : CATEGORY_INTERACTIVE_LAYERS;\r\n layers.forEach((layer: string) => {\r\n this.map.on(EVENT_TYPES.MOUSE_ENTER, layer, () => {\r\n this.map.getCanvas().style.cursor = 'pointer';\r\n });\r\n this.map.on(EVENT_TYPES.MOUSE_LEAVE, layer, () => {\r\n this.map.getCanvas().style.cursor = '';\r\n });\r\n });\r\n if (this.mapMode !== MAP_MODE.ONE_ROUTE) {\r\n this.map.on(EVENT_TYPES.CLICK, CLUSTER_LAYER, (obj: any) => {\r\n this.map.flyTo({\r\n center: obj.lngLat,\r\n zoom: this.map.getZoom() + 1,\r\n speed: 0.5\r\n });\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n public addImages() {\r\n MAP_IMAGES.forEach((img: IMapImage) => {\r\n this.map.loadImage(img.image, (err: any, image: any) => {\r\n this.map.addImage(img.name, image);\r\n });\r\n });\r\n return this;\r\n }\r\n\r\n public routeClickHandler(updatePopup: updateRoutePopupType, popup: Popup) {\r\n if (this.mapMode !== MAP_MODE.ONE_ROUTE) {\r\n this.map.on(EVENT_TYPES.CLICK, SINGLE_ROUTE_LAYER, (e: any) => {\r\n const {\r\n name,\r\n distance,\r\n routeId,\r\n url,\r\n activity\r\n } = e.features[0].properties;\r\n const { coordinates } = e.features[0].geometry;\r\n updatePopup(distance, name, routeId, url, activity);\r\n\r\n if (popup.isOpen()) {\r\n popup.remove();\r\n }\r\n\r\n popup\r\n .setLngLat(coordinates)\r\n .addTo(this.map)\r\n .on('close', () => {\r\n if (!!this.map.getLayer(ROUTE_LAYER)) {\r\n this.map.removeLayer(ROUTE_LAYER);\r\n this.map.removeSource(ROUTE_LAYER);\r\n }\r\n });\r\n\r\n getRouteGpx(routeId, this.map);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public poiClickHandler(updatePopup: updatePoiPopupType, popup: Popup) {\r\n if (this.mapMode === MAP_MODE.ONE_ROUTE) {\r\n this.map.on(EVENT_TYPES.CLICK, POIS_LAYER, (e: any) => {\r\n const { name, description, image, url } = e.features[0].properties;\r\n const { coordinates } = e.features[0].geometry;\r\n\r\n if (popup.isOpen()) {\r\n popup.remove();\r\n updatePopup('', '', '', '');\r\n }\r\n\r\n updatePopup(name, description, image, url);\r\n\r\n popup.setLngLat(coordinates).addTo(this.map);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public getData(update: updateSingleRouteType) {\r\n const params = new URLSearchParams(window.location.search);\r\n const category = params.get('category') as ROUTES_CATEGORIES;\r\n const route = params.get('route');\r\n\r\n this.map.on('load', () => {\r\n if (this.mapMode === MAP_MODE.ONE_ROUTE) {\r\n getOneRoute(route!, this.map, update);\r\n getPoiData(this.map);\r\n } else if (this.mapMode === MAP_MODE.CATEGORY_MODE) {\r\n getRoutesForOneCategory(this.map, category);\r\n } else if (this.mapMode === MAP_MODE.ALL_ROUTES) {\r\n getRoutesForAllCategories(this.map);\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n}\r\n","import React from 'react';\r\nimport { IRoutePopup } from '../models/popupContent';\r\nimport { IPoiPopup } from '../models/poiData';\r\nimport { ISingleRoute } from '../models/singleRoute';\r\n\r\nexport interface IPopupContext {\r\n routePopup: IRoutePopup;\r\n poiPopup: IPoiPopup;\r\n singleRoute: ISingleRoute;\r\n}\r\n\r\nexport const CONTEXT_INITIAL_VALUE = {\r\n routePopup: {\r\n routeId: '',\r\n title: '',\r\n distance: 0,\r\n url: '',\r\n activity: 0\r\n },\r\n poiPopup: {\r\n name: '',\r\n description: '',\r\n image: '',\r\n url: ''\r\n },\r\n singleRoute: {\r\n name: '',\r\n distance: 0,\r\n url: '',\r\n activity: 0,\r\n routeId: ''\r\n }\r\n};\r\n\r\nexport const RoutesContext = React.createContext<IPopupContext>(\r\n CONTEXT_INITIAL_VALUE\r\n);\r\n","import React from 'react';\r\nimport styles from './index.module.scss';\r\n\r\ninterface IPoiPopup {\r\n description: string;\r\n image: any;\r\n}\r\n\r\nconst PoiPopup: React.FunctionComponent<IPoiPopup> = ({\r\n description,\r\n image\r\n}) => {\r\n return (\r\n <>\r\n <p className={styles['popup__description']}>\r\n <img className={styles['popup__image']} src={image} alt={'poi'} />\r\n {description}\r\n </p>\r\n </>\r\n );\r\n};\r\n\r\nexport default PoiPopup;\r\n","import React, { useCallback } from 'react';\r\nimport styles from './index.module.scss';\r\n\r\ninterface IBasePopup {\r\n headerText: string;\r\n url: string;\r\n text: string;\r\n}\r\n\r\nconst BasePopup: React.FunctionComponent<IBasePopup> = ({\r\n headerText,\r\n children,\r\n url,\r\n text\r\n}) => {\r\n const redirectTo = useCallback(() => {\r\n window.top.location.href = url;\r\n }, [url]);\r\n\r\n return (\r\n <div className={styles['popup']}>\r\n <div className={styles['popup__header']}>{headerText}</div>\r\n <div className={styles['popup__content']}>{children}</div>\r\n <div className={styles['popup__button']} onClick={redirectTo}>\r\n {text}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default BasePopup;\r\n","import React from 'react';\r\nimport styles from './index.module.scss';\r\n\r\ninterface IMapViewProps {\r\n setMapElement: (element: HTMLDivElement) => void;\r\n}\r\n\r\nconst MapView: React.FunctionComponent<IMapViewProps> = ({ setMapElement }) => {\r\n return (\r\n <>\r\n <div className={styles['map-view__logo']} />\r\n <div className={styles['map-view']} ref={setMapElement} />\r\n <div className={styles['map-view__copyright']}>\r\n Contains OS data @ Crown copyright and database rights 2020\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default MapView;\r\n","import React, { useCallback } from 'react';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faCheck } from '@fortawesome/free-solid-svg-icons';\r\n\r\nimport styles from './index.module.scss';\r\nimport { ISingleRoute } from '../../models/singleRoute';\r\nimport {\r\n activityToImage,\r\n wheelchairFriendlyIds\r\n} from '../../services/map/constants';\r\nimport wheelchairIcon from '../assets/wheelchairIcon.svg';\r\n\r\ninterface IRouteViewProps {\r\n route: ISingleRoute;\r\n setMapElement: (element: HTMLDivElement) => void;\r\n}\r\n\r\nconst RouteView: React.FunctionComponent<IRouteViewProps> = ({\r\n setMapElement,\r\n route\r\n}) => {\r\n const redirectTo = useCallback(() => {\r\n window.top.location.href = route.url;\r\n }, [route]);\r\n\r\n return (\r\n <>\r\n <div className={styles['route-view__title']}>\r\n <div>{route.name}</div>\r\n </div>\r\n <div className={styles['route-view__distance']}>\r\n <img src={activityToImage(route.activity)} alt={'icon'} />\r\n <div>{(route.distance / 1000).toFixed(2)} km</div>\r\n {wheelchairFriendlyIds.includes(route.routeId) && (\r\n <>\r\n <img className={styles['route-view__wheel']} src={wheelchairIcon} />\r\n <FontAwesomeIcon color={'green'} icon={faCheck} />\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className={styles['route-view__logo']} />\r\n <div className={styles['route-view__map']} ref={setMapElement} />\r\n <div className={styles['route-view__copyright']}>\r\n Contains OS data @ Crown copyright and database rights 2020\r\n </div>\r\n <div className={styles['route-view__os-button']} onClick={redirectTo}>\r\n VIEW ROUTE ON OS MAPS\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default RouteView;\r\n","import React from 'react';\r\nimport { Map as MapboxMap, Popup } from 'mapbox-gl';\r\n\r\nimport RoutePopup from './components/RoutePopup';\r\nimport { MapBuilder, setMapMode } from '../../services/map';\r\nimport { IRoutePopup } from '../../models/popupContent';\r\nimport { CONTEXT_INITIAL_VALUE, RoutesContext } from '../../contexts';\r\nimport { IPoiPopup } from '../../models/poiData';\r\nimport PoiPopup from './components/PoiPopup';\r\nimport BasePopup from './components/BasePopup';\r\nimport { MAP_MODE } from './utils';\r\n\r\nimport styles from './index.module.scss';\r\nimport MapView from '../MapView';\r\nimport RouteView from '../RouteView';\r\nimport { ISingleRoute } from '../../models/singleRoute';\r\nimport { wheelchairFriendlyIds } from '../../services/map/constants';\r\n\r\ninterface IMapState {\r\n routePopup: IRoutePopup;\r\n poiPopup: IPoiPopup;\r\n singleRoute: ISingleRoute;\r\n}\r\n\r\nclass Map extends React.PureComponent<{}, IMapState> {\r\n private mapMode: MAP_MODE;\r\n private map?: MapboxMap;\r\n private routePopup?: Popup;\r\n private poiPopup?: Popup;\r\n private mapElement?: HTMLDivElement;\r\n private routePopupRef = React.createRef<HTMLDivElement>();\r\n private poiPopupRef = React.createRef<HTMLDivElement>();\r\n\r\n constructor(props: {}) {\r\n super(props);\r\n this.mapMode = setMapMode();\r\n this.state = CONTEXT_INITIAL_VALUE;\r\n }\r\n\r\n public componentDidMount() {\r\n if (!this.mapElement) {\r\n return;\r\n }\r\n\r\n this.initializePopups();\r\n\r\n this.map = new MapBuilder(this.mapElement!, this.mapMode)\r\n .addControls()\r\n .setZoom()\r\n .addImages()\r\n .registerMouseEvents()\r\n .routeClickHandler(\r\n (\r\n distance: number,\r\n title: string,\r\n routeId: string,\r\n url: string,\r\n activity: number\r\n ) => {\r\n this.setState({\r\n routePopup: {\r\n routeId,\r\n distance,\r\n title,\r\n url,\r\n activity\r\n }\r\n });\r\n },\r\n this.routePopup!\r\n )\r\n .poiClickHandler(\r\n (name: string, description: string, image: any, url: string) => {\r\n this.setState({\r\n poiPopup: {\r\n name,\r\n description,\r\n image,\r\n url\r\n }\r\n });\r\n },\r\n this.poiPopup!\r\n )\r\n .getData(\r\n (\r\n name: string,\r\n distance: number,\r\n url: string,\r\n activity: number,\r\n routeId: string\r\n ) => {\r\n this.setState({\r\n singleRoute: {\r\n name,\r\n distance,\r\n url,\r\n activity,\r\n routeId\r\n }\r\n });\r\n }\r\n )\r\n .getMap();\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this.map) {\r\n this.map.remove();\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n <RoutesContext.Provider value={this.state}>\r\n {this.mapMode === MAP_MODE.ONE_ROUTE ? (\r\n <RoutesContext.Consumer>\r\n {({ singleRoute }) => (\r\n <RouteView\r\n route={singleRoute}\r\n setMapElement={this.setMapElement}\r\n />\r\n )}\r\n </RoutesContext.Consumer>\r\n ) : (\r\n <MapView setMapElement={this.setMapElement} />\r\n )}\r\n\r\n <RoutesContext.Consumer>\r\n {({ poiPopup, routePopup }) =>\r\n this.renderPopups(poiPopup, routePopup, this.mapMode)\r\n }\r\n </RoutesContext.Consumer>\r\n </RoutesContext.Provider>\r\n );\r\n }\r\n\r\n private setMapElement = (element: HTMLDivElement) => {\r\n this.mapElement = element;\r\n };\r\n\r\n private initializePopups = () => {\r\n if (this.mapMode !== MAP_MODE.ONE_ROUTE) {\r\n this.routePopup = new Popup({\r\n offset: 5,\r\n closeOnClick: false,\r\n className: styles['map__popup']\r\n }).setDOMContent(this.routePopupRef.current!);\r\n } else {\r\n this.poiPopup = new Popup({\r\n offset: 25,\r\n closeOnClick: false,\r\n className: styles['map__popup']\r\n }).setDOMContent(this.poiPopupRef.current!);\r\n }\r\n };\r\n\r\n private renderPopups = (\r\n poiPopup: IPoiPopup,\r\n routePopup: IRoutePopup,\r\n mapMode: MAP_MODE\r\n ) => {\r\n return (\r\n <>\r\n {mapMode !== MAP_MODE.ONE_ROUTE ? (\r\n <div ref={this.routePopupRef}>\r\n <BasePopup\r\n headerText={routePopup.title}\r\n url={routePopup.url}\r\n text={'View route'}\r\n >\r\n <RoutePopup\r\n distance={routePopup.distance}\r\n activity={routePopup.activity}\r\n wheelchairFriendly={wheelchairFriendlyIds.includes(\r\n routePopup.routeId.toString()\r\n )}\r\n />\r\n </BasePopup>\r\n </div>\r\n ) : (\r\n <div ref={this.poiPopupRef}>\r\n <BasePopup\r\n headerText={poiPopup.name}\r\n url={poiPopup.url}\r\n text={'More info'}\r\n >\r\n <PoiPopup\r\n description={poiPopup.description}\r\n image={poiPopup.image}\r\n />\r\n </BasePopup>\r\n </div>\r\n )}\r\n </>\r\n );\r\n };\r\n}\r\n\r\nexport default Map;\r\n","import './polyfils';\r\n\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport mapbox from 'mapbox-gl';\r\n\r\nimport Map from './components/Map';\r\n\r\nimport './index.scss';\r\n\r\nmapbox.accessToken = process.env.REACT_APP_MAPBOX_ACCESS_TOKEN || '';\r\n\r\nReactDOM.render(<Map />, document.getElementById('root'));\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"popup__header\":\"BasePopup_popup__header__3XhRn\",\"popup__content\":\"BasePopup_popup__content__OweLz\",\"popup__button\":\"BasePopup_popup__button__3rCiL\"};"],"sourceRoot":""}