{"version":3,"sources":["services/UserManager.js","components/LoginButton.jsx","services/MapService.js","store/Map.js","components/NewMapButton.jsx","components/AuthNav.jsx","components/NavMenu.jsx","components/Layout.jsx","utilities/getUrlSegments.js","leaflet-extensions.js","components/LeafletMap.jsx","components/pages/MapPage.jsx","components/pages/SigninCallbackPage.jsx","components/pages/NotFoundPage.jsx","App.jsx","registerServiceWorker.ts","index.jsx","images/blueprint-grid.png","images/marker-white.png"],"names":["Oidc","Log","logger","console","userManagerConfig","authority","process","client_id","redirect_uri","response_type","scope","post_logout_redirect_uri","userManager","UserManager","connect","NavItem","onClick","e","preventDefault","signinRedirect","className","contentTypes","jsonRequestConfig","headers","constructor","this","mapApiUrl","retrieve","mapId","retrieveMapUrl","axios","get","response","data","geoJson","JSON","parse","id","error","create","self","getUser","user","createMapUrl","access_token","Number","persist","Error","map","stringify","userId","profile","sub","persistMapUrl","post","createAsyncThunk","getState","requestId","a","currentRequestId","isLoading","MapService","createMap","mapSlice","createSlice","name","initialState","position","zoom","undefined","reducers","state","action","payload","remove","edit","cut","extraReducers","pending","meta","fulfilled","rejected","actions","NewMapButton","React","Component","newMap","props","componentDidUpdate","prevProps","push","render","mapDispatchToProps","ownProps","AuthNav","Fragment","oidc","NavMenu","super","isOpen","toggle","setState","Navbar","light","Container","NavbarBrand","NavbarToggler","Collapse","navbar","children","getUrlSegments","url","replace","split","L","Map","include","findParentLayer","childLayer","parent","eachLayer","l","LayerGroup","hasLayer","getZoomPercentage","getMaxZoom","getMinZoom","getZoom","Layer","addEventListeners","component","on","TextLayer","blockTextLayerMode","removeEventListeners","off","addFeatureProperties","tooltip","getTooltip","feature","toGeoJSON","properties","text","getContent","isGeometryLayer","Polyline","Marker","Circle","CircleMarker","isTemporaryLayer","_pmTempLayer","parseMapUrlQuery","location","pathname","segments","length","slice","join","LeafletMap","addTextLayerListener","_blockTextLayerMode","addTextLayer","latlng","mapRef","createRef","pathOptions","color","fillColor","fillOpacity","weight","pmControlOptions","drawPolyline","drawRectangle","cutPolygon","drawCircleMarker","drawCircle","textEditorOptions","editor","toolbar","buttons","isAuthorised","mapAuthorId","query","toGeoJson","eventArgs","shape","marker","layer","_layerGroup","removeLayer","editText","_isThrottlingTextEdit","setTimeout","textLayer","addTo","leafletElement","fire","toggleAddTextLayerMode","enabled","DomUtil","addClass","getContainer","removeClass","toggleTextEditing","disable","enable","features","clearLayers","createLayerGroupFromGeoJson","geoJSON","style","fromFeatureLayer","subscribe","componentDidMount","initLeafletElement","onZoom","zoomLevel","getElement","fontSize","current","pm","Draw","setPathOptions","options","templineStyle","hintlineStyle","dashArray","addTextControl","Toolbar","createCustomControl","title","afterClick","_button","toggleStatus","addControls","prototype","icon","iconUrl","WhiteMarkerIconUrl","iconAnchor","renderLoadingScreen","opacity","Tooltip","permanent","direction","backgroundLayer","TileLayer","attribution","BlueprintGridUrl","center","ref","crs","CRS","Simple","isLoadingMap","withRouter","MapPage","Layout","SigninCallbackPage","successCallback","errorCallback","NotFoundPage","App","TagManager","initialize","gtmId","Switch","Route","exact","key","path","isLocalhost","Boolean","window","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","log","catch","baseUrl","document","getElementsByTagName","getAttribute","history","createBrowserHistory","basename","oidcMiddleware","createOidcMiddleware","getDefaultMiddleware","serializableCheck","routerMiddleware","middleware","rootReducer","mapReducers","oidcReducer","router","connectRouter","store","configureStore","reducer","ReactDOM","getElementById","URL","toString","origin","addEventListener","fetch","contentType","status","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker","module","exports"],"mappings":"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","file":"static/js/main.bddf7f9e.chunk.js","sourcesContent":["import Oidc from \"oidc-client\";\n\nOidc.Log.logger = console;\n\nlet redirectUri = process.env.REACT_APP_MAPPER_WEB_URL + \"signinCallback\";\nlet postLogoutUri = process.env.REACT_APP_MAPPER_WEB_URL + \"index.html\";\n\nconst userManagerConfig = {\n //silent_redirect_uri: `${window.location.protocol}//${window.location.hostname}${window.location.port ? `:${window.location.port}` : ''}/silent_renew.html`,\n //automaticSilentRenew: true,\n\n authority: process.env.REACT_APP_AUTH_API_URL,\n client_id: \"imbick.mapper.web\",\n redirect_uri: redirectUri,\n response_type: \"code\",\n scope: \"openid profile imbick.mapper.api\",\n post_logout_redirect_uri: postLogoutUri\n};\n\n//todo consider https://stackoverflow.com/questions/45313129/oidc-client-isloggedin\nconst userManager = new Oidc.UserManager(userManagerConfig);\nexport default userManager;\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { NavItem } from \"reactstrap\";\n\nimport userManager from \"../services/UserManager\";\n\nconst LoginButton = () => {\n var onClick = (e) => {\n e.preventDefault();\n userManager.signinRedirect();\n };\n return (\n \n \n \n );\n}\nexport default connect()(LoginButton);\n","import axios from \"axios\";\nimport userManager from \"../services/UserManager\";\n\n//var headersNames = {\n// contentType: \"Content-Type\"\n//}\n\nconst contentTypes = {\n applicationJson: \"application/json\"\n}\n\nconst jsonRequestConfig = {\n headers: {\n \"Content-Type\": contentTypes.applicationJson\n }\n};\n\nclass MapService {\n constructor() {\n this.mapApiUrl = process.env.REACT_APP_MAPPER_API_URL;\n }\n\n async retrieve(mapId) {\n if (!mapId) mapId = \"welcome\";\n const retrieveMapUrl = `${this.mapApiUrl}api/maps/${mapId}`;\n try {\n const response = await axios.get(retrieveMapUrl, jsonRequestConfig);\n response.data.geoJson = JSON.parse(response.data.geoJson);\n response.data.mapId = response.data.id;\n return response.data;\n } catch (e) {\n console.error(\"Problem retrieving map\", e);\n throw e;\n }\n }\n\n async create() {\n\n const self = this;\n const user = await userManager.getUser();\n const createMapUrl = `${self.mapApiUrl}api/maps/create`;\n const response = await axios.get(createMapUrl, {\n headers: {\n \"Content-Type\": contentTypes.applicationJson,\n \"Authorization\": `Bearer ${user.access_token}`\n }\n });\n response.data.mapId = Number(response.data.id);\n return response.data;\n }\n\n async persist(mapId, geoJson) {\n\n const user = await userManager.getUser();\n if (!user)\n throw new Error(\"No authenticated user. Cannot persist map without an authenticated user.\");\n\n const map = {\n id: mapId,\n geoJson: JSON.stringify(geoJson),\n userId: user.profile.sub\n };\n\n const persistMapUrl = `${this.mapApiUrl}api/maps/${map.id}/update`;\n\n return axios.post(persistMapUrl, map, {\n headers: {\n \"Content-Type\": contentTypes.applicationJson,\n \"Authorization\": `Bearer ${user.access_token}`\n }\n });\n }\n}\n\nexport default new MapService();","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport MapService from \"../services/MapService\"\n\nexport const retrieve = createAsyncThunk(\n 'map/retrieve',\n async (mapId, { getState, requestId }) => {\n const { currentRequestId, isLoading } = getState().map;\n\n if (isLoading !== true || requestId !== currentRequestId) {\n return;\n }\n var map = await MapService.retrieve(mapId);\n return map;\n }\n);\n\nexport const createMap = createAsyncThunk(\n 'map/createMap',\n async (data, { getState, requestId }) => {\n const { currentRequestId, isLoading } = getState().map;\n\n if (isLoading !== true || requestId !== currentRequestId) {\n return;\n }\n return await MapService.create();\n }\n);\n\nexport const origin = [0, 0];\nexport const initialZoomLevel = 12;\n\nconst mapSlice = createSlice({\n name: 'map',\n initialState: {\n position: [0.00, 0.00],\n zoom: initialZoomLevel,\n geoJson: null,\n id: null,\n userId: null,\n isLoading: false,\n currentRequestId: undefined,\n error: null\n },\n reducers: {\n create(state, action) {\n state.geoJson = action.payload;\n },\n remove(state, action) {\n state.geoJson = action.payload;\n },\n edit(state, action) {\n state.geoJson = action.payload;\n },\n cut(state, action) {\n state.geoJson = action.payload;\n }\n },\n extraReducers: {\n [retrieve.pending]: (state, action) => {\n if (state.isLoading === false) {\n state.isLoading = true;\n state.currentRequestId = action.meta.requestId;\n }\n },\n [retrieve.fulfilled]: (state, action) => {\n const { requestId } = action.meta;\n if (state.isLoading === true && state.currentRequestId === requestId) {\n state.isLoading = false;\n state.geoJson = action.payload.geoJson;\n state.userId = action.payload.userId;\n state.currentRequestId = undefined;\n }\n },\n [retrieve.rejected]: (state, action) => {\n const { requestId } = action.meta;\n if (state.isLoading === true && state.currentRequestId === requestId) {\n state.isLoading = false;\n state.error = action.error;\n state.currentRequestId = undefined;\n }\n },\n [createMap.pending]: (state, action) => {\n if (state.isLoading === false) {\n state.isLoading = true;\n state.currentRequestId = action.meta.requestId;\n }\n },\n [createMap.fulfilled]: (state, action) => {\n const { requestId } = action.meta;\n if (state.isLoading === true && state.currentRequestId === requestId) {\n state.isLoading = false;\n state.id = action.payload.id;\n state.geoJson = action.payload.geoJson;\n state.userId = action.payload.userId;\n state.currentRequestId = undefined;\n }\n },\n [createMap.rejected]: (state, action) => {\n const { requestId } = action.meta;\n if (state.isLoading === true && state.currentRequestId === requestId) {\n state.isLoading = false;\n state.error = action.error;\n state.currentRequestId = undefined;\n }\n }\n }\n});\n\nexport const { create, remove, edit, cut } = mapSlice.actions;\n\nexport default mapSlice.reducer;","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { NavItem } from \"reactstrap\";\nimport { push } from 'connected-react-router'\n\nimport { createMap } from \"../store/Map\";\n\nclass NewMapButton extends React.Component {\n componentDidUpdate(prevProps) {\n if (this.props.mapId !== prevProps.mapId) {\n this.props.push(`/maps/${this.props.mapId}`);\n }\n }\n\n newMap = (e) => {\n e.preventDefault();\n this.props.createMap();\n }\n\n render() {\n return (\n \n \n \n );\n }\n}\n\nconst mapStateToProps = (state, ownProps) => {\n return {\n mapId: /*ownProps.match.params.id ? Number(ownProps.match.params.id) : */state.map.id\n };\n}\n\nconst mapDispatchToProps = {\n createMap,\n push: push\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(NewMapButton);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { push } from \"connected-react-router\";\nimport { NavItem } from \"reactstrap\";\n\nimport LoginButton from \"./LoginButton\";\nimport NewMapButton from \"./NewMapButton\";\n\nclass AuthNav extends React.Component {\n\n render() {\n\n if (this.props.user)\n return (\n \n \n \n \n \n \n );\n else\n return ;\n }\n}\n\nconst mapStateToProps = (state) => {\n return {\n user: state.oidc.user\n };\n};\n\nexport default connect(\n mapStateToProps,\n { push }\n)(AuthNav);\n","import * as React from 'react';\nimport { Collapse, Navbar, NavbarBrand, NavbarToggler, Container } from 'reactstrap';\n//import { Link } from 'react-router-dom';\n\nimport './NavMenu.css';\nimport AuthNav from \"./AuthNav\"\n\nexport default class NavMenu extends React.PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n isOpen: false\n };\n this.toggle = () => {\n this.setState({\n isOpen: !this.state.isOpen\n });\n }\n }\n\n render() {\n return (\n
\n \n \n Mapper\n \n \n
    \n { /*\n Home\n \n \n Sign in\n \n \n Register\n */\n }\n \n
\n
\n
\n
\n
\n );\n }\n\n\n}\n","import * as React from 'react';\nimport NavMenu from './NavMenu';\n\nexport default (props) => (\n \n \n {props.children}\n \n);\n","const getUrlSegments = (url) => {\n if (!url)\n return [];\n\n return url\n .replace(/^\\/+|\\/+$/g, '') //remove slashes from start and end\n .split('/');\n};\n\nexport default getUrlSegments;","import L from \"leaflet\";\n\nimport { TextLayer } from \"leaflet-textlayer\" //required for L.TextLayer\n\nL.Map.include({\n findParentLayer: function(childLayer) {\n let parent = null;\n this.eachLayer((l) => {\n if (!(l instanceof L.LayerGroup))\n return;\n\n if (l.hasLayer(childLayer)) {\n parent = l;\n return;\n }\n });\n\n return parent;\n },\n getZoomPercentage: function() {\n return (100 / (this.getMaxZoom() - this.getMinZoom())) * (this.getZoom() - this.getMinZoom());\n }\n});\n\nL.Layer.include({\n addEventListeners: function(component) {\n this.on(\"pm:edit\", e => component.edit(e));\n if (this instanceof L.TextLayer) {\n this.on(\"click\", e => component.blockTextLayerMode());\n }\n },\n removeEventListeners: function (component) {\n this.off(\"pm:edit\", e => component.edit(e));\n },\n addFeatureProperties: function() {\n let tooltip = this.getTooltip();\n\n if (this.eachLayer) {\n this.eachLayer((l) => l.addFeatureProperties());\n } else if (tooltip) {\n this.feature = this.toGeoJSON();\n if (!this.feature.properties.text)\n this.feature.properties.text = tooltip.getContent();\n }\n },\n isGeometryLayer: function () {\n return this instanceof L.Polyline || //Polyline includes Polygon and Rectangle\n this instanceof L.Marker ||\n this instanceof L.Circle ||\n this instanceof L.CircleMarker ||\n this instanceof L.TextLayer;\n },\n isTemporaryLayer: function() {\n return this._pmTempLayer;\n }\n});","import React, { createRef } from \"react\";\nimport { connect } from \"react-redux\";\nimport { withRouter } from \"react-router\";\n\nimport L from \"leaflet\";\nimport { Map, TileLayer, Marker, Tooltip } from \"react-leaflet\";\n\nimport { create, remove, edit, cut, retrieve } from \"../store/Map\";\nimport MapService from \"../services/MapService\"\nimport \"./LeafletMap.css\"\nimport BlueprintGridUrl from \"../images/blueprint-grid.png\";\nimport WhiteMarkerIconUrl from \"../images/marker-white.png\";\nimport getUrlSegments from \"../utilities/getUrlSegments\";\nimport \"leaflet-textlayer/dist/leaflet-textlayer.css\";\nimport \"../leaflet-extensions\";\n\nimport \"@imbick/leaflet-geoman-free\";\nimport \"@imbick/leaflet-geoman-free/dist/leaflet-geoman.css\";\n\nconst parseMapUrlQuery = (location) => {\n if (!location || !location.pathname)\n return null;\n\n const segments = getUrlSegments(location.pathname);\n\n if (segments.length === 1)\n return null; //no query found\n\n return segments\n .slice(1)\n .join('/');\n};\n\nexport class LeafletMap\n extends React.Component {\n\n constructor(props) {\n super(props);\n this.mapRef = createRef();\n\n this.pathOptions = {\n color: \"white\",\n fillColor: \"#5f8bab\",\n fillOpacity: 0.4,\n weight: 1.5\n };\n this.pmControlOptions = {\n position: \"topright\",\n drawPolyline: true,\n drawRectangle: true,\n cutPolygon: true,\n //don't currently support circular geometry\n drawCircleMarker: false,\n drawCircle: false\n };\n this.textEditorOptions = {\n editor: {\n toolbar: {\n buttons: [\n 'bold',\n 'italic',\n //{\n // name: 'h1',\n // action: 'append-h2',\n // aria: 'header type 1',\n // tagNames: ['h2'],\n // contentDefault: 'H1',\n // classList: ['custom-class-h1'],\n // attrs: {\n // 'data-custom-attr': 'attr-value-h1'\n // }\n //},\n 'justifyCenter',\n \"justifyLeft\",\n \"justifyCenter\",\n \"justifyRight\"\n ]\n }\n }\n }\n\n this.retrieve = this.props.retrieve;\n }\n\n isAuthorised() {\n if (!this.props.user)\n return false;\n return this.props.user.profile.sub === this.props.mapAuthorId;\n }\n async persist() {\n if (!this.isAuthorised())\n return;\n await MapService.persist(this.props.query, this.toGeoJson());\n }\n blockTextLayerMode() {\n this._blockTextLayerMode = true;\n }\n create(eventArgs) {\n if (eventArgs.shape === \"Marker\") {\n eventArgs.marker.addEventListeners(this);\n } else /*if (eventArgs.shape === \"Polygon\")*/ {\n eventArgs.layer.addEventListeners(this);\n }\n\n this.persist();\n }\n remove(eventArgs) {\n this._layerGroup.removeLayer(eventArgs.layer);\n this.persist();\n }\n edit(eventArgs) {\n //if (eventArgs.layer.bringToFront)\n // eventArgs.layer.bringToFront();\n\n this.persist();\n }\n cut(eventArgs) {\n eventArgs.layer.addEventListeners(this);\n this.persist();\n }\n editText(eventArgs) {\n\n if (!this._isThrottlingTextEdit) {\n setTimeout(() => {\n this._isThrottlingTextEdit = false;\n this.persist();\n },\n 1000);\n }\n this._isThrottlingTextEdit = true;\n }\n addTextLayer(latlng, text) {\n text = text ? text : \"Text\";\n const layer = L.textLayer(text, latlng, this.textEditorOptions)\n .addTo(this.leafletElement);\n this.leafletElement.fire(\"pm:create\", { layer });\n }\n addTextLayerListener = (e) => {\n if (this._blockTextLayerMode) {\n this._blockTextLayerMode = false;\n return;\n }\n this.addTextLayer(e.latlng);\n }\n toggleAddTextLayerMode(enabled) {\n if (enabled) {\n L.DomUtil.addClass(this.leafletElement.getContainer(), \"addtextlayermode-enabled\");\n this.leafletElement.on(\"click\", this.addTextLayerListener);\n } else {\n L.DomUtil.removeClass(this.leafletElement.getContainer(), \"addtextlayermode-enabled\");\n this.leafletElement.off(\"click\", this.addTextLayerListener);\n }\n }\n toggleTextEditing(enabled) {\n this.leafletElement.eachLayer((layer) => {\n if (layer instanceof L.TextLayer) {\n if (enabled)\n layer.disable();\n else layer.enable();\n }\n });\n }\n toGeoJson() {\n var features = [];\n\n this.leafletElement.eachLayer((layer) => {\n if (!layer.isGeometryLayer() || layer.isTemporaryLayer())\n return;\n\n layer.addFeatureProperties();\n features.push(layer.toGeoJSON());\n });\n\n return features;\n }\n clearLayers() {\n this.leafletElement.eachLayer((layer) => {\n if (!layer.isGeometryLayer() || layer.isTemporaryLayer())\n return;\n\n this.leafletElement.removeLayer(layer);\n });\n }\n createLayerGroupFromGeoJson() {\n this.clearLayers();\n\n this._layerGroup = L.geoJSON(this.props.geoJson, {\n style: this.pathOptions\n });\n this._layerGroup.addTo(this.leafletElement);\n const self = this;\n this._layerGroup.eachLayer((layer) => {\n const isTextLayer = layer.feature.properties && layer.feature.properties.text;\n if (isTextLayer) {\n //todo define text options\n this._layerGroup.removeLayer(layer);\n const textLayer = L.TextLayer.fromFeatureLayer(layer);\n textLayer.addTo(this._layerGroup);\n\n //delay here required to allow the editor toolbar to update the text before the event fires (losing the formatting)\n //need to figure out how to prevent the rerender.\n textLayer.editor.subscribe(\"editableBlur\", (e) => setTimeout(self.edit(e), 1000));\n textLayer.editor.subscribe(\"editableInput\", (e) => self.editText(e));\n }\n layer.addEventListeners(this);\n });\n }\n componentDidUpdate(prevProps) {\n const geoJsonHasChanged = this.props.geoJson !== prevProps.geoJson;\n if (geoJsonHasChanged) {\n this.createLayerGroupFromGeoJson();\n //todo this.leafletElement.fitWorld();\n }\n }\n componentDidMount() {\n this.retrieve(this.props.query);\n this.initLeafletElement();\n }\n\n onZoom() {\n //may need to use css rather than style, as it doesn't handle nested elements like H2\n //may need to 'init' layers to a certain zoom level\n var zoomLevel = this.leafletElement.getZoomPercentage();\n this.leafletElement.eachLayer((layer) => {\n if (!(layer instanceof L.TextLayer))\n return;\n\n layer.tooltip.getElement().style.fontSize = (zoomLevel) + \"%\";\n });\n }\n initLeafletElement() {\n this.leafletElement = this.mapRef.current.leafletElement;\n\n this.leafletElement.pm.Draw.setPathOptions(this.pathOptions);\n this.leafletElement.pm.Draw.options.templineStyle = this.pathOptions;\n this.leafletElement.pm.Draw.options.hintlineStyle = { dashArray: [5, 5], ...this.pathOptions };\n\n this.leafletElement.on(\"pm:create\", (e) => { this.create(e); });\n this.leafletElement.on(\"pm:remove\", (e) => { this.remove(e); });\n this.leafletElement.on(\"pm:cut\", (e) => { this.cut(e); });\n this.leafletElement.on(\"pm:globaldragmodetoggled\", (e) => this.toggleTextEditing(e.enabled));\n this.leafletElement.on(\"pm:globalremovemodetoggled\", (e) => this.toggleTextEditing(e.enabled));\n this.leafletElement.on(\"pm:merge\", (e) => this.edit(e));\n \n //this.leafletElement.on(\"zoomend\", (e) => this.onZoom(e));\n\n const addTextControl = this.leafletElement.pm.Toolbar.createCustomControl({\n name: \"text\",\n title: \"Add Text\",\n className: \"addTextButton\",\n actions: [\"cancel\"],\n onClick: () => { },\n afterClick: (e) => this.toggleAddTextLayerMode(addTextControl._button.toggleStatus),\n toggle: true\n });\n\n this.leafletElement.pm.addControls(this.pmControlOptions);\n\n L.Marker.prototype.options.icon = L.icon({\n iconUrl: WhiteMarkerIconUrl,\n iconAnchor: [16, 32]\n });\n }\n renderLoadingScreen() {\n this.clearLayers();\n return \n Loading...\n ;\n }\n render() {\n const backgroundLayer =\n ;\n\n return (\n \n {backgroundLayer}\n {this.props.isLoadingMap ? this.renderLoadingScreen() : }\n \n );\n }\n}\n\nconst mapStateToProps = (state, ownProps) => {\n return {\n geoJson: state.map.geoJson,\n position: state.map.position,\n zoom: state.map.zoom,\n query: state.map.id ? state.map.id : parseMapUrlQuery(ownProps.location), //ownProps.match.params.query ? Number(ownProps.match.params.query) : ,\n isLoadingMap: state.map.isLoading,\n mapAuthorId: state.map.userId,\n user: state.oidc.user\n };\n};\n\nconst mapDispatchToProps = {\n create,\n remove,\n edit,\n cut,\n retrieve\n};\n\nexport default withRouter(connect(\n mapStateToProps,\n mapDispatchToProps\n)(LeafletMap));","import * as React from 'react';\n\nimport Layout from \"../Layout\"\nimport LeafletMap from \"../LeafletMap\"\n\nconst MapPage = (props) => {\n\n return (\n \n \n \n );\n};\n\nexport default MapPage;","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { CallbackComponent } from \"redux-oidc\";\nimport { push } from \"connected-react-router\";\n\nimport userManager from \"../../services/UserManager\";\n\nclass SigninCallbackPage extends React.Component {\n render() {\n return (\n this.props.push(\"/\")}\n errorCallback={error => {\n this.props.push(\"/\");\n console.error(error);\n }}\n >\n
Redirecting...
\n \n );\n }\n}\n\nconst mapDispatchToProps = {\n push: push\n};\n\nexport default connect(null, mapDispatchToProps)(SigninCallbackPage);","import * as React from \"react\";\n\nconst NotFoundPage = () =>\n
Page not found
;\n\n\nexport default NotFoundPage;","import * as React from \"react\";\nimport { Route, Switch } from \"react-router\";\n\nimport TagManager from \"react-gtm-module\";\n\nimport MapPage from \"./components/pages/MapPage\";\nimport SigninCallbackPage from \"./components/pages/SigninCallbackPage\";\nimport NotFoundPage from \"./components/pages/NotFoundPage\";\n\nimport \"./custom.css\"\n\nconst App = () => {\n\n TagManager.initialize({ gtmId: process.env.REACT_APP_GTM_ID });\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default App;","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const url = process.env.PUBLIC_URL as string;\n const publicUrl = new URL(url, window.location.toString());\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing as ServiceWorker;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import \"bootstrap/dist/css/bootstrap.css\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { ConnectedRouter, connectRouter, routerMiddleware } from \"connected-react-router\";\nimport { configureStore, getDefaultMiddleware } from \"@reduxjs/toolkit\";\nimport { reducer as oidcReducer } from \"redux-oidc\";\nimport { createBrowserHistory } from \"history\";\nimport createOidcMiddleware from 'redux-oidc';\n\nimport App from \"./App\";\nimport registerServiceWorker from \"./registerServiceWorker\";\nimport mapReducers from \"./store/Map\";\nimport userManager from './services/UserManager';\n\n// Create browser history to use in the Redux store\nconst baseUrl = document.getElementsByTagName(\"base\")[0].getAttribute(\"href\");\nconst history = createBrowserHistory({ basename: baseUrl });\n\nconst loggerMiddleware = store => next => action => {\n console.log(\"Action type:\", action.type);\n console.log(\"Action payload:\", action.payload);\n console.log(\"State before:\", store.getState());\n next(action);\n console.log(\"State after:\", store.getState());\n};\n\nconst oidcMiddleware = createOidcMiddleware(userManager);\n\nconst devMiddleware = [\n loggerMiddleware,\n oidcMiddleware,\n ...getDefaultMiddleware({\n serializableCheck: false //consider ignoredPaths. See https://github.com/reduxjs/redux-toolkit/releases/tag/v1.2.3\n }),\n routerMiddleware(history)\n];\n\nconst prodMiddleware = [\n oidcMiddleware, \n ...getDefaultMiddleware({\n serializableCheck: false //consider ignoredPaths. See https://github.com/reduxjs/redux-toolkit/releases/tag/v1.2.3\n }),\n routerMiddleware(history)\n];\n\nvar middleware = prodMiddleware;\nif (!process.env.NODE_ENV || process.env.NODE_ENV === 'development') {\n middleware = devMiddleware;\n}\n\n\nconst rootReducer = {\n map: mapReducers,\n oidc: oidcReducer,\n router: connectRouter(history)\n};\n\n// Get the application-wide store instance, prepopulating with state from the server where available.\nconst store = configureStore({\n reducer: rootReducer,\n middleware\n});\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\"));\n\nregisterServiceWorker();\n","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}