{"version":3,"sources":["common/variables.ts","containers/Layout/Layout.style.ts","components/Navbar/Navbar.style.ts","features/app/app.slice.ts","utils/global.util.ts","utils/melding.util.ts","utils/time.util.ts","utils/vehicle.util.ts","features/filter/filter.slice.ts","features/melding/melding.slice.ts","assets/audio/sound.mp3","hooks/useVariable.ts","hooks/useApi.ts","hooks/useAppDispatch.ts","config/interceptors.ts","hooks/useAppSelector.ts","hooks/useStream.ts","features/melding/melding.wrapper.tsx","features/filter/filter.wrapper.tsx","features/theme/theme.slice.ts","features/theme/theme.wrapper.tsx","features/live/live.slice.ts","features/live/live.wrapper.tsx","features/notifications/notifications.slice.ts","components/Navbar/Navbar.tsx","components/Sidebar/Sidebar.styles.ts","components/Sidebar/SidebarContent/SidebarContent.style.ts","views/DashboardPage/DashboardPage.style.ts","views/MeldingDetailsPage/MeldingDetailsPage.style.ts","views/NotFoundPage/NotFoundPage.tsx","views/UpdatePage/UpdatePage.style.ts","views/PrivacyPage/data/privacy.data.ts","views/PrivacyPage/PrivacyPage.style.ts","views/LiveMapPage/LiveMapPage.style.ts","components/LiveMeldingList/LiveMeldingList.tsx","views/ContactPage/ContactPage.style.ts","views/RoadmapPage/RoadmapPage.style.ts","config/routes.tsx","views/DashboardPage/DashboardPage.tsx","views/MonitorPage/MonitorPage.tsx","views/LiveMapPage/LiveMapPage.tsx","views/UpdatePage/UpdatePage.tsx","views/RoadmapPage/RoadmapPage.tsx","views/PrivacyPage/PrivacyPage.tsx","views/MeldingDetailsPage/MeldingDetailsPage.tsx","views/ContactPage/ContactPage.tsx","components/Sidebar/SidebarContent/SidebarContent.tsx","components/Sidebar/Sidebar.tsx","components/Capcode/Capcode.style.ts","components/Capcode/Capcode.tsx","utils/capcode.util.ts","components/Melding/Melding.style.ts","components/Melding/Melding.tsx","components/MeldingList/MeldingList.tsx","components/HelperTip/HelperTip.tsx","components/VehicleCard/VehicleCard.style.ts","components/VehicleCard/VehicleCard.tsx","components/UnavailableItems/UnavailableItems.style.ts","components/UnavailableItems/UnavailableItems.tsx","components/CustomMap/CustomMap.style.ts","components/CustomMap/CustomMap.tsx","components/FilterSelector/FilterSelector.style.ts","common/icons.ts","components/FilterSelector/FilterSelector.tsx","utils/filter.util.ts","components/FilterItem/FilterItem.style.ts","components/FilterItem/FilterItem.tsx","components/FilterToggler/FilterToggler.style.ts","components/FilterToggler/FilterToggler.tsx","components/Loader/Loader.style.ts","components/Loader/Loader.tsx","components/CustomChart/CustomChart.tsx","components/BigNumberCard/BigNumberCard.tsx","components/Meta/Meta.tsx","containers/Layout/Layout.tsx","themes/globals.ts","themes/dark.theme.ts","themes/index.ts","themes/light.theme.ts","containers/App/App.tsx","containers/Connector/Connector.tsx","store.ts","index.tsx","config/toasts.ts"],"names":["VEHICLE_IMAGE_TYPES","DEFAULT_IMAGE_PATH","process","makeStyles","theme","content","marginTop","minHeight","breakpoints","up","paddingLeft","root","zIndex","drawer","toolbar","spacing","logo","width","mixins","height","backgroundImage","palette","type","backgroundPosition","backgroundSize","backgroundRepeat","display","sidebarMenu","search","position","borderRadius","shape","backgroundColor","fade","secondary","main","margin","marginLeft","searchIcon","padding","pointerEvents","alignItems","justifyContent","inputRoot","grow","flexGrow","inputInput","transition","transitions","create","appSlice","createSlice","name","initialState","sidebarOpen","reducers","openSidebar","state","closeSidebar","toggleSidebar","actions","appReducer","reducer","makeObjectWithValues","object","key","value","Object","keys","reduce","prev","curr","getMeldingTags","melding","important","tags","filter","map","enabled","sort","tag","every","getMeldingLocation","isAdres","adres","isSnelweg","snelweg","latitude","longitude","undefined","getLifelinerLocation","lifeliner","ref","acList","Lat","getLatitude","Long","getLongitude","isTimeLessThenHourFromNow","time","date1","dayjs","hours","diff","Math","floor","getVehicleName","abbreviation","text","filterSlice","isOpen","filters","filterMenusOpen","filtersApplied","openFilter","closeFilter","openFilterMenu","action","payload","closeFilterMenu","setFilterItems","addUserFilter","id","removeUserFilter","filterId","filterReducer","meldingSlice","meldingen","setMeldingen","meldingReducer","useVariable","variable","parsed","Error","instance","axios","baseURL","headers","useApi","useRef","current","useAppDispatch","useDispatch","interceptors","response","use","error","Promise","reject","status","toast","useResponseInterceptorError","useAppSelector","useSelector","stream","io","autoConnect","isConnected","useStream","connect","disconnect","MeldingWrapper","children","dispatch","notificationEnabled","notificationSound","useState","meldingId","setMeldingId","oldMeldingId","setOldMeldingId","initialized","setInitialized","meldingHandler","data","JSON","parse","ungzip","to","_id","useEffect","Audio","sound","play","on","off","FilterWrapper","api","previousFilters","setPreviousFilters","areFilterItemsClosed","values","length","a","get","fetch","previous","isEqual","emit","gzip","stringify","themeSlice","activeTheme","setTheme","localStorage","setItem","themeReducer","ThemeWrapper","prefersDarkMode","window","matchMedia","matches","selectedTheme","getItem","isValid","removeItem","isThemeValid","liveSlice","liveMeldingen","setLiveMeldingen","liveReducer","LiveMeldingWrapper","liveMeldingHandler","notificationSoundSlice","setNotificationSound","notificationSoundReducer","Navbar","classes","useStyles","useTheme","AppBar","className","color","Toolbar","IconButton","onClick","aria-label","Menu","REACT_APP_ENABLE_SEARCH","Search","InputBase","placeholder","input","inputProps","drawerPaper","menuTitle","textTransform","fontWeight","bigNumber","textAlign","fontSize","noLocation","view","accordion","paper","title","wordWrap","cardWrapper","marginRight","media","share","NotFoundPage","history","useHistory","Meta","description","image","twitterName","Box","minWidth","flexDirection","Typography","variant","component","my","Button","replace","ArrowRight","typography","fontWeightBold","subtitle","paddingTop","timeline","down","updateTitle","sideContent","maxWidth","PRIVACY","section","marginBottom","background","primary","LiveMeldingMarkers","locatie","Marker","onclick","push","hoofdmeldingId","page","column","copyright","backgroundGreen","backgroundOrange","backgroundBlack","backgroundGrey","routes","path","dashboardData","setDashboardData","chartData","setChartData","hourly","Aantal","amount","Datum","date","format","url","Grid","container","item","xs","sm","lg","BigNumberCard","number","today","yesterday","lastWeek","Paper","mb","mt","Divider","CustomChart","xKey","yKey","yLabel","justify","xl","brandweer","ambulance","politie","test","onbekend","exact","displayName","displayLocation","icon","DashboardPageIcon","p","MeldingList","hasActions","Loader","FilterToggler","MonitorPageIcon","live","markerPosition","LatLng","center","zoom","minZoom","TileLayer","attribution","LiveMapPageIcon","updates","setUpdates","pt","Timeline","update","index","isFirstItem","isLastItem","TimelineItem","TimelineOppositeContent","version","TimelineSeparator","TimelineDot","TimelineConnector","TimelineContent","changes","change","UpdatePageIcon","roadmap","setRoadmaps","roadmapItem","startDate","eindDate","phase","isBefore","UnstartedIcon","isAfter","ProgressIcon","CompletedIcon","finishDate","slice","toUpperCase","titel","omschrijving","RoadmapPageIcon","Container","paragraph","PrivacyPageIcon","items","useParams","PAGE_URL","setMelding","lifelinerLocation","setLifelinerLocation","isLifelinerMelding","amountOfVoertuigen","voertuigen","hasVoertuigen","amountOfSubmeldingen","hasSubmeldingen","meldingLocatie","getImageUrl","roepnummer","fetchLifelinerLocation","imageWidth","imageHeight","goBack","ArrowBack","md","CustomMap","location","tijd","prio","capcodes","toString","Chip","label","disabled","style","textDecoration","FacebookShareButton","quote","FacebookIcon","size","round","TwitterShareButton","via","hashtags","TwitterIcon","WhatsappShareButton","WhatsappIcon","TelegramShareButton","TelegramIcon","EmailShareButton","subject","EmailIcon","LinkedinShareButton","source","LinkedinIcon","Accordion","expanded","AccordionSummary","expandIcon","ExpandMore","AccordionDetails","voertuig","VehicleCard","vehicle","priority","UnavailableItems","message","direction","m","src","alt","href","Date","getFullYear","target","rel","ContactPageIcon","SidebarContent","useLocation","Hidden","mdUp","Close","smDown","List","route","isActive","matchPath","pathname","handleIsRouteActive","ListItem","button","Link","selected","ListItemIcon","ListItemText","opacity","Sidebar","app","SwipeableDrawer","anchor","open","onOpen","onClose","Drawer","borderLeft","capcode","fontStyle","Capcode","discipline","afkorting","gpkr","paddingBottom","details","Melding","getColorClassName","benaming","MeldingInfo","clsx","naam","regio","noWrap","defaultProps","HelperTip","Tooltip","enterTouchDelay","leaveTouchDelay","placement","header","lineHeight","caption","link","vehicleImage","priorityAmount","parseInt","Number","isNaN","imageType","author","usableImages","pathKey","authorKey","random","getVehicleImage","Card","elevation","CardHeader","titleTypographyProps","subheader","CardMedia","CardContent","standplaats","opmerkingen","CardActions","infoLink","getFilterIcon","filterType","DisciplineIcon","DisciplineIconSelected","unselected","DisciplineIconUnselected","RegioIcon","RegioIconSelected","RegioIconUnselected","DefaultIcon","DefaultIconSelected","DefaultIconUnselected","FilterSelector","filterItems","CheckedIcon","UncheckedIcon","isFilterApplied","includes","filterItem","fields","active","FormControlLabel","control","Checkbox","checked","checkedIcon","onChange","FilterItem","isCurrentItemOpen","handleClose","Dialog","DialogTitle","FormGroup","Array","isArray","gridSize","order","DialogActions","bottom","right","SpeedDial","hidden","ariaLabel","SpeedDialIcon","openIcon","FabProps","FilterIcon","SpeedDialAction","tooltipTitle","tooltipOpen","ResponsiveContainer","AreaChart","x1","y1","x2","y2","offset","stopColor","stopOpacity","XAxis","dataKey","stroke","YAxis","Label","angle","textAnchor","fill","labelStyle","itemStyle","Area","dot","fillOpacity","Helmet","property","Layout","makeColorSet","isDark","hue","titleColor","borderColor","borderLeftColor","GLOBAL_STYLES","yellow","red","blue","orange","green","grey","pink","DARK_THEME","responsiveFontSizes","createMuiTheme","default","overrides","MuiCssBaseline","THEMES","LIGHT","DARK","App","analytics","pageview","ThemeProvider","CssBaseline","Connector","combineReducers","store","configureStore","preloadedState","devTools","configureAppStore","locale","initialize","render","autoClose","hideProgressBar","newestOnTop","closeOnClick","pauseOnFocusLoss","draggable","pauseOnHover","document","getElementById"],"mappings":"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","file":"static/js/main.e11bac03.chunk.js","sourcesContent":["/**\n * The width of the application sidebar, defined in pixels\n */\nexport const SIDEBAR_WIDTH: Readonly = 240;\n\n/**\n * The aspect ratio used by the logo of the application\n */\nexport const LOGO_ASPECT_RATIO: Readonly = 1405 / 619;\n\n/**\n * The type of vehicle images to use.\n *\n * **The order is important! Sorted from most important to less important**\n */\nexport const VEHICLE_IMAGE_TYPES = [\n 'Spoed',\n 'ZonderSpoed',\n 'Standaard',\n] as const;\n\n/**\n * The default image path to use as a placeholder\n */\nexport const DEFAULT_IMAGE_PATH =\n `${process.env.PUBLIC_URL}/static/images/placeholder.jpg` as const;\n","import { makeStyles } from '@material-ui/core';\n\nimport { SIDEBAR_WIDTH } from '~common/variables';\n\n/**\n * The styles which are used by the `Layout` container\n */\nexport default makeStyles((theme) => ({\n content: {\n marginTop: 56,\n minHeight: `calc(100vh - 56px)`,\n [`${theme.breakpoints.up('xs')} and (orientation: landscape)`]: {\n marginTop: 48,\n minHeight: `calc(100vh - 48px)`,\n },\n [theme.breakpoints.up('sm')]: {\n marginTop: 64,\n minHeight: `calc(100vh - 64px)`,\n },\n [theme.breakpoints.up('md')]: {\n paddingLeft: SIDEBAR_WIDTH,\n },\n },\n}));\n","import { fade, makeStyles } from '@material-ui/core';\n\nimport { LOGO_ASPECT_RATIO } from '~common/variables';\n\n/**\n * The styles which are used by the `Navbar` component\n */\nexport default makeStyles((theme) => ({\n root: {\n zIndex: theme.zIndex.drawer + 1,\n },\n toolbar: {\n [theme.breakpoints.up('md')]: {\n paddingLeft: theme.spacing(1.5),\n },\n },\n logo: {\n width: (theme.mixins.toolbar.minHeight / 1.2) * LOGO_ASPECT_RATIO,\n height: theme.mixins.toolbar.minHeight / 1.2,\n backgroundImage: `url(/static/images/logo-${\n theme.palette.type === 'dark' ? 'white' : 'black'\n }.png)`,\n backgroundPosition: 'center',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n display: 'none',\n [theme.breakpoints.up('md')]: {\n display: 'block',\n },\n },\n sidebarMenu: {\n [theme.breakpoints.up('md')]: {\n display: 'none',\n },\n },\n search: {\n position: 'relative',\n borderRadius: theme.shape.borderRadius,\n backgroundColor: fade(theme.palette.secondary.main, 0.15),\n '&:hover': {\n backgroundColor: fade(theme.palette.secondary.main, 0.25),\n },\n margin: theme.spacing(0, 1),\n width: '100%',\n [theme.breakpoints.up('md')]: {\n marginLeft: theme.spacing(3),\n width: '50ch',\n },\n },\n searchIcon: {\n padding: theme.spacing(0, 1),\n height: '100%',\n position: 'absolute',\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n inputRoot: {\n width: '100%',\n },\n grow: {\n flexGrow: 1,\n },\n inputInput: {\n padding: theme.spacing(1, 1, 1, 0),\n paddingLeft: `calc(1em + ${theme.spacing(3)}px)`,\n transition: theme.transitions.create('width'),\n width: '100%',\n },\n}));\n","import { createSlice } from '@reduxjs/toolkit';\n\n/**\n * The types structure which is used by the `App` state\n */\ninterface AppState {\n sidebarOpen: boolean;\n}\n\n/**\n * The initial values of the `App` state\n */\nconst initialState: AppState = {\n sidebarOpen: false,\n};\n\n/**\n * A slice which handles all the `App` state management logic\n */\nconst appSlice = createSlice({\n name: 'app',\n initialState,\n reducers: {\n openSidebar: (state) => {\n state.sidebarOpen = true;\n },\n closeSidebar: (state) => {\n state.sidebarOpen = false;\n },\n toggleSidebar: (state) => {\n state.sidebarOpen = !state.sidebarOpen;\n },\n },\n});\n\n/**\n * The actions available for the \"app\" feature\n */\nexport const { openSidebar, closeSidebar, toggleSidebar } = appSlice.actions;\n\n/**\n * An instance of the \"app\" reducer which handles logic for each action\n */\nexport const appReducer = appSlice.reducer;\n","import { isEqual } from 'lodash';\n\n/**\n * A function that turns a single-level array to a list of strings with comma's\n * @param items An array of items to turn into a list\n * @returns The stringified array list with comma's\n */\nexport const arrayToList = (items: T[]) => {\n const formatted = items.map((item) => ` ${item}`);\n return formatted.toString();\n};\n\n/**\n * Makes an object with assigned values\n * @param object The object to make an object from\n * @param key The key to select\n * @param value The value to assign to each key\n * @returns The filled object\n */\nexport const makeObjectWithValues = (\n object: Record,\n key: any,\n value: any,\n) =>\n Object.keys(object).reduce(\n (prev, curr) => ({ ...prev, [object[curr][key]]: value }),\n {},\n );\n\n/**\n * Checks if object with arrays is equal\n * @param current The current object to check\n * @param previous The previous object to compare with the current object\n * @returns If the object arrays are equal\n */\nexport const isObjectWithArraysEqual = (\n current: Record,\n previous: Record,\n): boolean =>\n Object.keys(current).every((key) => isEqual(current[key], previous[key]));\n","/**\n * Retrieves tags from a \"melding\" object (like \"cruciaal\", \"contact\" or \"test\"),\n * if all tags are disabled the most important one goes first\n * @param melding The \"melding\" object to retrieve the tags from\n * @returns An object with the tags\n */\nexport const getMeldingTags = (\n melding: Record,\n important: 'cruciaal' | 'test' | 'contact',\n) => {\n const tags = Object.keys(melding)\n .filter((key) => typeof melding[key] === 'boolean')\n .map((key) => ({ type: key, enabled: melding[key] }))\n .sort((tag) => (tag.enabled ? -1 : 1));\n\n if (tags.every((tag) => !tag.enabled)) {\n tags.sort((tag) => (tag.type === important ? -1 : 1));\n }\n\n return tags;\n};\n\n/**\n * Retrieves the location (in latitude and longitude) from a \"melding\"\n * @param melding The \"melding\" to use the data from\n * @returns The Lat/Long location from the \"melding\" location\n */\nexport const getMeldingLocation = (\n melding: Record,\n): GlobalLocation | undefined => {\n const isAdres = !!melding.adres;\n const isSnelweg = !!melding.snelweg;\n\n /**\n * Retrieves the latitude from a \"melding\" location\n * @returns The latitude of the location\n */\n const getLatitude = (): number | undefined => {\n if (isAdres) {\n return melding.adres.latitude;\n }\n if (isSnelweg) {\n return melding.snelweg.latitude;\n }\n return undefined;\n };\n\n /**\n * Retrieves the longitude from a \"melding\" location\n * @returns The longitude of the location\n */\n const getLongitude = (): number | undefined => {\n if (isAdres) {\n return melding.adres.longitude;\n }\n if (isSnelweg) {\n return melding.snelweg.longitude;\n }\n return undefined;\n };\n\n const latitude = getLatitude();\n const longitude = getLongitude();\n\n return !!latitude && !!longitude\n ? {\n latitude,\n longitude,\n }\n : undefined;\n};\n\n/**\n * Retrieves the location (in latitude and longitude) from a \"lifeliner melding\"\n * @param lifeliner The \"lifeliner\" to use the data from\n * @returns The Lat/Long location from the \"lifeliner\" location\n */\nexport const getLifelinerLocation = (\n lifeliner: Record,\n): GlobalLocation | undefined => {\n /**\n * Retrieves the latitude from a \"lifeliner\" location\n * @returns The latitude of the location\n */\n const getLatitude = (): any | undefined => {\n const ref = lifeliner?.acList[0]?.Lat;\n if (!ref) {\n return undefined;\n }\n return ref;\n };\n\n /**\n * Retrieves the longitude from a \"lifeliner\" location\n * @returns The longitude of the location\n */\n const getLongitude = (): any | undefined => {\n const ref = lifeliner?.acList[0]?.Long;\n if (!ref) {\n return undefined;\n }\n return ref;\n };\n\n const latitude = getLatitude();\n const longitude = getLongitude();\n\n return !!latitude && !!longitude\n ? {\n latitude,\n longitude,\n }\n : undefined;\n};\n","import dayjs from 'dayjs';\n\n/**\n * Returns the full date of a timestamp\n * @param time The time to extract the date from\n * @returns The date of the timestamp in full\n */\nexport const getDate = (time: string) => {\n const date = dayjs(time);\n return date.format('DD MMMM YYYY');\n};\n\n/**\n * Returns the short version of a date\n * @param time The time to format as a short version\n * @returns The short formatted version of the time\n */\nexport const getTimeShort = (time: string) => {\n const date = dayjs(time);\n return date.format('HH:mm:ss DD/MM/YYYY');\n};\n\n/**\n * Returns the formatted time with custom locale\n * @param time The time to format as a string\n * @returns The formatted time\n */\nexport const getTimeFull = (time: string) => {\n const date = dayjs(time);\n return date.format('D MMMM YYYY [om] HH:mm:ss');\n};\n\n/**\n * Returns if time is less then one hour from now\n * @param time The time to format as a string\n * @returns true of false\n */\nexport const isTimeLessThenHourFromNow = (time: string) => {\n const date1 = dayjs(time);\n const date2 = dayjs();\n\n let hours = date2.diff(date1, 'hours');\n const days = Math.floor(hours / 24);\n hours -= days * 24;\n\n if (hours >= 1) {\n return false;\n }\n return true;\n};\n","import { DEFAULT_IMAGE_PATH, VEHICLE_IMAGE_TYPES } from '~common/variables';\n\n/**\n * Formats the vehicle name and adds it's abbreviation if available\n * @param name The name of the vehicle\n * @param abbreviation The abbreviation name of the vehicle\n * @returns The formatted vehicle name\n */\nexport const getVehicleName = (name: string, abbreviation?: string) => {\n let text = name;\n if (abbreviation) {\n text += ` (${abbreviation})`;\n }\n return text;\n};\n\n/**\n * Select the proper image and it's author from a vehicle\n * @param vehicle The data of the vehicle to use\n * @param priority The priority of the \"melding\" to determine which image to use\n * @returns An object with the image url and it's author\n */\nexport const getVehicleImage = (\n vehicle: Record,\n priority: string,\n): ExternalImage => {\n let priorityAmount = parseInt(priority.replace(/[\\sA-Za-z]/, ''), 10) - 1;\n if (\n Number.isNaN(priorityAmount) ||\n priorityAmount > 2 ||\n priorityAmount < 0\n ) {\n priorityAmount = 2;\n }\n const imageType = VEHICLE_IMAGE_TYPES[priorityAmount];\n\n let vehicleImage: ExternalImage = {\n path: vehicle[`foto${imageType}`],\n author: vehicle[`fotograaf${imageType}`],\n };\n\n if (vehicleImage.path === null || vehicleImage.path === '') {\n const imageTypes = VEHICLE_IMAGE_TYPES.map((type) => ({\n pathKey: `foto${type}`,\n authorKey: `fotograaf${type}`,\n }));\n\n const usableImages: ExternalImage[] = imageTypes\n .map((type) => ({\n path: vehicle[type.pathKey],\n author: vehicle[type.authorKey],\n }))\n .filter((image) => !!image.path && !!image.author);\n\n vehicleImage =\n usableImages[Math.floor(usableImages.length * Math.random())];\n }\n\n return {\n path: vehicleImage?.path\n ? process.env.REACT_APP_PHOTO_URI + vehicleImage.path\n : DEFAULT_IMAGE_PATH,\n author: vehicleImage?.path\n ? vehicleImage.author || 'Onbekende Fotograaf'\n : '',\n };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { FilterDetails } from '~models/api';\nimport { makeObjectWithValues } from '~utils';\n\n/**\n * The types structure which is used by the `Filter` state\n */\ninterface FilterState {\n isOpen: boolean;\n filters: FilterDetails[];\n filterMenusOpen: Record;\n filtersApplied: Record;\n}\n\n/**\n * The initial values of the `Filter` state\n */\nconst initialState: FilterState = {\n isOpen: false,\n filters: [],\n filterMenusOpen: {},\n filtersApplied: {},\n};\n\n/**\n * A slice which handles all the `Filter` state management logic\n */\nconst filterSlice = createSlice({\n name: 'filter',\n initialState,\n reducers: {\n openFilter: (state) => {\n state.isOpen = true;\n },\n closeFilter: (state) => {\n state.isOpen = false;\n },\n openFilterMenu: (state, action: PayloadAction) => {\n state.filterMenusOpen = {\n ...state.filterMenusOpen,\n [action.payload]: true,\n };\n },\n closeFilterMenu: (state, action: PayloadAction) => {\n state.filterMenusOpen = {\n ...state.filterMenusOpen,\n [action.payload]: false,\n };\n },\n setFilterItems: (state, action: PayloadAction) => {\n state.filters = action.payload;\n state.filterMenusOpen = makeObjectWithValues(\n action.payload,\n 'type',\n false,\n );\n state.filtersApplied = makeObjectWithValues(action.payload, 'type', []);\n },\n addUserFilter: (\n state,\n action: PayloadAction<{ type: string; id: string }>,\n ) => {\n state.filtersApplied = {\n ...state.filtersApplied,\n [action.payload.type]: [\n ...state.filtersApplied[action.payload.type],\n action.payload.id,\n ],\n };\n },\n removeUserFilter: (\n state,\n action: PayloadAction<{ type: string; id: string }>,\n ) => {\n state.filtersApplied = {\n ...state.filtersApplied,\n [action.payload.type]: state.filtersApplied[action.payload.type].filter(\n (filterId) => filterId !== action.payload.id,\n ),\n };\n },\n },\n});\n\n/**\n * The actions available for the filter feature\n */\nexport const {\n openFilter,\n closeFilter,\n openFilterMenu,\n closeFilterMenu,\n setFilterItems,\n addUserFilter,\n removeUserFilter,\n} = filterSlice.actions;\n\n/**\n * An instance of the filter reducer which handles the logic for each action\n */\nexport const filterReducer = filterSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\n/**\n * The type that resembles a list of \"meldingen\"\n */\ntype MeldingList = Record[];\n\n/**\n * The types structure which is used by the `Melding` state\n */\ninterface MeldingState {\n meldingen: MeldingList;\n}\n\n/**\n * The initial values of the `Melding` state\n */\nconst initialState: MeldingState = {\n meldingen: [],\n};\n\n/**\n * A slice which handles all the `Melding` state management logic\n */\nconst meldingSlice = createSlice({\n name: 'melding',\n initialState,\n reducers: {\n setMeldingen: (state, action: PayloadAction) => {\n state.meldingen = action.payload;\n },\n },\n});\n\n/**\n * The actions available for the \"melding\" feature\n */\nexport const { setMeldingen } = meldingSlice.actions;\n\n/**\n * An instance of the \"melding\" reducer which handles logic for each action\n */\nexport const meldingReducer = meldingSlice.reducer;\n","export default __webpack_public_path__ + \"static/media/sound.f11c4230.mp3\";","/**\n * A hook that provides access to environment variables\n *\n * @param variable The environment variable which should be loaded\n *\n * @returns The `useVariable` hook\n */\nexport function useVariable(variable: EnvironmentVariable): string {\n const parsed = `REACT_APP_${variable}`;\n\n if (!process.env[parsed]) {\n throw new Error(\n `A value for the variable ${variable} was not provided, \n are you sure you put the key in the environment file as ${parsed}?`,\n );\n }\n\n return process.env[parsed] as string;\n}\n","import { useRef } from 'react';\n\nimport axios, { AxiosInstance } from 'axios';\n\nimport { useVariable } from './useVariable';\n\nimport { useResponseInterceptorError } from '~config/interceptors';\n\n/**\n * An instance of axios to communicate with the API\n */\nconst instance = axios.create({\n baseURL: useVariable('API_URI'),\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n/**\n * Attach an interceptor to handle automatic response actions\n */\ninstance.interceptors.response.use(\n (response) => response,\n (error) => Promise.reject(useResponseInterceptorError(error)),\n);\n\n/**\n * A hook that provides access to the back-end API\n *\n * @returns The `useApi` hook\n */\nexport function useApi(): AxiosInstance {\n /**\n * Stores the API in a reference\n */\n const { current: api } = useRef(instance);\n\n return api;\n}\n","import { useDispatch } from 'react-redux';\n\nimport { AppDispatch } from '../store';\n\n/**\n * A hook that is a typed version of the `useDispatch` hook\n *\n * @returns The `useAppDispatch` hook\n */\nexport function useAppDispatch() {\n return useDispatch();\n}\n","import { AxiosResponse } from 'axios';\nimport { toast } from 'react-toastify';\n\n/**\n * An interceptor to automatically handle toast messages on error\n *\n * @param error The Axios response to handle\n *\n * @returns The modified axios response\n */\nexport function useResponseInterceptorError(error: any): AxiosResponse {\n if (error.response) {\n if (error.response.status === 404) {\n toast.error('Er is een fout opgetreden, dit object is niet gevonden.');\n } else {\n toast.error(\n 'Er is een interne fout opgetreden, neem contact op met de systeembeheerder.',\n );\n }\n }\n\n return error;\n}\n","import { TypedUseSelectorHook, useSelector } from 'react-redux';\n\nimport { RootState } from '../store';\n\n/**\n * A hook that is a typed version of the `useSelector` hook\n *\n * @returns The `useAppSelector` hook\n */\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n","import { io, Socket } from 'socket.io-client';\n\nimport { useVariable } from './useVariable';\n\n/**\n * The action property types which are used by the `useStream` hook\n */\ninterface useStreamActions {\n stream: Socket;\n isConnected: boolean;\n connect: () => void;\n disconnect: () => void;\n}\n\n/**\n * The Websocket instance which is used to communicate with the stream\n */\nconst stream = io(useVariable('STREAM_URI'), { autoConnect: false });\n\n/**\n * A boolean which stores if a user is connected\n */\nlet isConnected = false;\n\n/**\n * A hook that provides access to the back-end stream service\n *\n * @returns The `useStream` hook\n */\nexport function useStream(): useStreamActions {\n /**\n * Connects the client to the stream\n */\n const connect = (): void => {\n stream.connect();\n isConnected = true;\n };\n\n /**\n * Disconnects the client from the stream\n */\n const disconnect = (): void => {\n stream.disconnect();\n isConnected = false;\n };\n\n return { stream, isConnected, connect, disconnect };\n}\n","/* eslint-disable no-unused-vars */\nimport { ReactNode, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { ungzip } from 'pako';\n\nimport sound from '../../assets/audio/sound.mp3';\n\nimport { setMeldingen } from './melding.slice';\n\nimport { store } from 'store';\nimport { useAppDispatch, useAppSelector, useStream } from '~hooks';\n\n/**\n * The property types which are used by the `Melding` wrapper\n */\ninterface MeldingWrapperProps {\n children: ReactNode;\n}\n\n/**\n * A wrapper that provides the values, logic and data for the `Melding` feature\n *\n * @param props The standard properties which are always available\n * @param props.children The child element(s) which should be rendered within the wrapper\n *\n * @returns The `Melding` wrapper\n */\nexport function MeldingWrapper({ children }: MeldingWrapperProps): JSX.Element {\n const { stream } = useStream();\n const dispatch = useAppDispatch();\n const { notificationSound: notificationEnabled } = useAppSelector(\n (state) => state.notificationSound,\n );\n\n const [meldingId, setMeldingId] = useState();\n const [oldMeldingId, setOldMeldingId] = useState();\n const [initialized, setInitialized] = useState(false);\n\n const playAudio = () => {\n new Audio(sound).play();\n };\n\n /**\n * Parses meldingen and sets them to the state\n * @param data The gzipped data for meldingen to set\n */\n const meldingHandler = (data: Uint8Array) => {\n const parsed = JSON.parse(ungzip(data, { to: 'string' }));\n\n setMeldingId(parsed[0]._id);\n\n dispatch(setMeldingen(parsed));\n };\n\n useEffect(() => {\n if (oldMeldingId !== meldingId) {\n if (!initialized) {\n setInitialized(true);\n }\n if (notificationEnabled === 'ON' && !!initialized) {\n playAudio();\n }\n setMeldingId(meldingId);\n setOldMeldingId(meldingId);\n }\n }, [meldingId, oldMeldingId, notificationEnabled]);\n\n /**\n * Change \"meldingen\" data whenever the stream emits an update\n */\n useEffect(() => {\n stream.on('@@stream/meldingen', (data) => meldingHandler(data));\n\n return () => {\n stream.off('@@stream/meldingen', meldingHandler);\n };\n }, []);\n\n return <>{children};\n}\n","import { ReactNode, useEffect, useState } from 'react';\n\nimport { gzip } from 'pako';\n\nimport { setFilterItems } from './filter.slice';\n\nimport { setMeldingen } from '~features/melding';\nimport { useApi, useAppDispatch, useAppSelector, useStream } from '~hooks';\nimport { isObjectWithArraysEqual } from '~utils';\n\n/**\n * The property types which are used by the `Filter` wrapper\n */\ninterface FilterWrapperProps {\n children: ReactNode;\n}\n\n/**\n * A wrapper that provides the values, logic and data for the `Filter` feature\n *\n * @param props The standard properties which are always available\n * @param props.children The child element(s) which should be rendered within the wrapper\n *\n * @returns The `Filter` wrapper\n */\nexport function FilterWrapper({ children }: FilterWrapperProps): JSX.Element {\n const api = useApi();\n const { isConnected, stream } = useStream();\n const { filtersApplied, filters, filterMenusOpen } = useAppSelector(\n (state) => state.filter,\n );\n const dispatch = useAppDispatch();\n const [previousFilters, setPreviousFilters] = useState({});\n\n /**\n * Checks if all filter items are closed to prevent filter spamming\n */\n const areFilterItemsClosed = Object.values(filterMenusOpen).every(\n (value) => value === false,\n );\n\n /**\n * Request the filter types data from the remote\n */\n useEffect(() => {\n if (filters.length < 1) {\n const fetch = async () => {\n const { data } = await api.get('/filters');\n dispatch(setFilterItems(data));\n };\n fetch();\n }\n }, []);\n\n /**\n * Handles the filtering to the stream\n */\n useEffect(() => {\n if (!isConnected) {\n return;\n }\n if (areFilterItemsClosed) {\n const equal = isObjectWithArraysEqual(filtersApplied, previousFilters);\n if (!equal) {\n setPreviousFilters(filtersApplied);\n dispatch(setMeldingen([]));\n stream.emit(\n '@@connector/meldingen/filter',\n gzip(JSON.stringify(filtersApplied), {\n to: 'string',\n }),\n );\n }\n }\n }, [areFilterItemsClosed, filtersApplied]);\n\n return <>{children};\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { ThemeType } from '~themes';\n\n/**\n * The types structure which is used by the `Theme` state\n */\ninterface ThemeState {\n activeTheme: ThemeType;\n}\n\n/**\n * The initial values of the `Theme` state\n */\nconst initialState: ThemeState = {\n activeTheme: 'LIGHT',\n};\n\n/**\n * A slice which handles all the `Theme` state management logic\n */\nconst themeSlice = createSlice({\n name: 'theme',\n initialState,\n reducers: {\n setTheme: (state, action: PayloadAction>) => {\n state.activeTheme = action.payload;\n localStorage.setItem('selected_theme', action.payload);\n },\n },\n});\n\n/**\n * The actions available for the \"theme\" feature\n */\nexport const { setTheme } = themeSlice.actions;\n\n/**\n * An instance of the \"theme\" reducer which handles logic for each action\n */\nexport const themeReducer = themeSlice.reducer;\n","import { ReactNode, useEffect } from 'react';\n\nimport { setTheme } from './theme.slice';\n\nimport { useAppDispatch } from '~hooks';\nimport { ThemeType } from '~themes';\n\n/**\n * The property types which are used by the `Theme` wrapper\n */\ninterface ThemeWrapperProps {\n children: ReactNode;\n}\n\n/**\n * A wrapper that provides the values, logic and data for the `Theme` feature\n *\n * @param props The standard properties which are always available\n * @param props.children The child element(s) which should be rendered within the wrapper\n *\n * @returns The `Theme` wrapper\n */\nexport function ThemeWrapper({ children }: ThemeWrapperProps): JSX.Element {\n const dispatch = useAppDispatch();\n\n const prefersDarkMode = window.matchMedia(\n '(prefers-color-scheme: dark)',\n ).matches;\n\n /**\n * Loads a theme from localstorage and checks if it's valid\n * @returns If the loaded theme is valid\n */\n const isThemeValid = () => {\n const selectedTheme = localStorage.getItem('selected_theme');\n const isValid = selectedTheme === 'DARK' || selectedTheme === 'LIGHT';\n if (!isValid) {\n localStorage.removeItem('selected_theme');\n }\n return isValid;\n };\n\n /**\n * Handles the setting of the theme, if no theme is available load it from preferences\n */\n useEffect(() => {\n if (isThemeValid()) {\n dispatch(setTheme(localStorage.getItem('selected_theme') as ThemeType));\n } else {\n dispatch(setTheme(prefersDarkMode ? 'DARK' : 'LIGHT'));\n }\n }, []);\n\n return <>{children};\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\n/**\n * The type that resembles a list of \"meldingen\"\n */\ntype LiveMeldingList = Record[];\n\n/**\n * The types structure which is used by the `Melding` state\n */\ninterface LiveMeldingState {\n liveMeldingen: LiveMeldingList;\n}\n\n/**\n * The initial values of the `live` state\n */\nconst initialState: LiveMeldingState = {\n liveMeldingen: [],\n};\n\n/**\n * A slice which handles all the `live` state management logic\n */\nconst liveSlice = createSlice({\n name: 'liveMelding',\n initialState,\n reducers: {\n setLiveMeldingen: (state, action: PayloadAction) => {\n state.liveMeldingen = action.payload;\n },\n },\n});\n\n/**\n * The actions available for the \"live\" feature\n */\nexport const { setLiveMeldingen } = liveSlice.actions;\n\n/**\n * An instance of the \"live\" reducer which handles logic for each action\n */\nexport const liveReducer = liveSlice.reducer;\n","/* eslint-disable no-unused-vars */\nimport { ReactNode, useEffect } from 'react';\n\nimport { ungzip } from 'pako';\n\nimport { setLiveMeldingen } from './live.slice';\n\nimport { useAppDispatch, useStream } from '~hooks';\n\n/**\n * The property types which are used by the `Melding` wrapper\n */\ninterface LiveMeldingWrapperProps {\n children: ReactNode;\n}\n\n/**\n * A wrapper that provides the values, logic and data for the `Live` feature\n *\n * @param props The standard properties which are always available\n * @param props.children The child element(s) which should be rendered within the wrapper\n *\n * @returns The `Live` wrapper\n */\nexport function LiveMeldingWrapper({\n children,\n}: LiveMeldingWrapperProps): JSX.Element {\n const { stream } = useStream();\n const dispatch = useAppDispatch();\n\n /**\n * Parses meldingen and sets them to the state\n * @param data The gzipped data for meldingen to set\n */\n const liveMeldingHandler = (data: Uint8Array) => {\n const parsed = JSON.parse(ungzip(data, { to: 'string' }));\n dispatch(setLiveMeldingen(parsed));\n };\n\n /**\n * Change \"live meldingen\" data whenever the stream emits an update\n */\n useEffect(() => {\n stream.on('@@stream/meldingen-today', (data) => liveMeldingHandler(data));\n return () => {\n stream.off('@@stream/meldingen-today');\n };\n }, []);\n\n return <>{children};\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\n/**\n * The different themes which are allowed\n */\nexport type NotificationSoundType = 'ON' | 'OFF';\n\n/**\n * The types structure which is used by the `Notification` state\n */\ninterface NotificationsState {\n notificationSound: NotificationSoundType;\n}\n\n/**\n * The initial values of the `Notification` state\n */\nconst initialState: NotificationsState = {\n notificationSound: 'OFF',\n};\n\n/**\n * A slice which handles all the `Notification Sound` state management logic\n */\nconst notificationSoundSlice = createSlice({\n name: 'notification-sound',\n initialState,\n reducers: {\n setNotificationSound: (\n state,\n action: PayloadAction>,\n ) => {\n state.notificationSound = action.payload;\n localStorage.setItem('notification_sound', action.payload);\n },\n },\n});\n\n/**\n * The actions available for the \"Notification Sound\" feature\n */\nexport const { setNotificationSound } = notificationSoundSlice.actions;\n\n/**\n * An instance of the \"Notification Sound\" reducer which handles logic for each action\n */\nexport const notificationSoundReducer = notificationSoundSlice.reducer;\n","import {\n AppBar,\n IconButton,\n InputBase,\n Toolbar,\n useTheme,\n} from '@material-ui/core';\nimport {\n Search as SearchIcon,\n BrightnessHigh as LightThemeIcon,\n Brightness4 as DarkThemeIcon,\n VolumeOff as DisableSoundIcon,\n VolumeUp as EnableSoundIcon,\n Menu as MenuIcon,\n} from '@material-ui/icons';\n\nimport useStyles from './Navbar.style';\n\nimport { setTheme, toggleSidebar } from '~features';\nimport { setNotificationSound } from '~features/notifications';\nimport { useAppDispatch, useAppSelector } from '~hooks';\n\n/**\n * A component that handles user interactions at the top of the screen\n *\n * @param props The standard properties which are always available\n *\n * @returns The `Navbar` component\n */\nexport function Navbar(): JSX.Element {\n const classes = useStyles();\n const theme = useTheme();\n const dispatch = useAppDispatch();\n const { activeTheme } = useAppSelector((state) => state.theme);\n const { notificationSound } = useAppSelector(\n (state) => state.notificationSound,\n );\n\n /**\n * Handles the toggling of the theme\n */\n const handleThemeToggle = () =>\n dispatch(setTheme(activeTheme === 'DARK' ? 'LIGHT' : 'DARK'));\n\n /**\n * Handles the toggling of the notification sound\n */\n const handleNotificationToggle = () =>\n dispatch(setNotificationSound(notificationSound === 'OFF' ? 'ON' : 'OFF'));\n\n /**\n * Handles the toggling of the sidebar\n */\n const handleSidebarToggle = () => dispatch(toggleSidebar());\n\n return (\n
\n \n \n
\n \n \n \n {!!process.env.REACT_APP_ENABLE_SEARCH && (\n
\n
\n \n
\n \n
\n )}\n
\n \n {theme.palette.type === 'light' ? (\n \n ) : (\n \n )}\n \n \n {notificationSound === 'ON' ? (\n \n ) : (\n \n )}\n \n \n \n
\n );\n}\n","import { makeStyles } from '@material-ui/core';\n\nimport { SIDEBAR_WIDTH } from '~common/variables';\n\n/**\n * The styles which are used by the `Sidebar` component\n */\nexport default makeStyles({\n drawerPaper: {\n width: SIDEBAR_WIDTH,\n },\n});\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `SidebarContent` component\n */\nexport default makeStyles({\n menuTitle: {\n textTransform: 'uppercase',\n '& span': {\n fontWeight: 'bold',\n },\n },\n});\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `DashboardPage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n '& .MuiPaper-root': {\n padding: theme.spacing(2),\n },\n },\n bigNumber: {\n fontWeight: 'bold',\n textAlign: 'center',\n fontSize: '3em',\n },\n}));\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `MeldingDetailsPage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n },\n map: {\n minHeight: 400,\n height: '100%',\n },\n noLocation: {\n height: '100%',\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n view: {\n padding: theme.spacing(2),\n margin: theme.spacing(2, 0),\n },\n accordion: {\n margin: theme.spacing(1, 0),\n },\n paper: {\n padding: theme.spacing(2),\n height: '100%',\n '& > .MuiDivider-root': {\n margin: theme.spacing(1.5, 0),\n },\n },\n title: {\n fontWeight: 'bold',\n margin: theme.spacing(2, 0),\n wordWrap: 'break-word',\n },\n cardWrapper: {\n flexGrow: 1,\n },\n tags: {\n margin: theme.spacing(1, 0),\n '& > .MuiChip-root': {\n marginRight: theme.spacing(1),\n },\n },\n media: {\n width: '100%',\n },\n share: {\n margin: theme.spacing(1, 0),\n '& > .react-share__ShareButton': {\n marginRight: theme.spacing(1),\n },\n },\n}));\n","import { Box, Button, Typography } from '@material-ui/core';\nimport { ArrowRight } from '@material-ui/icons';\nimport { useHistory } from 'react-router-dom';\n\nimport { Meta } from '~components';\n\n/**\n * A page that displays that an entity has not been found\n *\n * @param props The standard properties which are always available\n *\n * @returns The `NotFoundPage` page\n */\nexport function NotFoundPage(): JSX.Element {\n const history = useHistory();\n\n /**\n * Handles the redirection of the user\n */\n const handleRedirect = () => history.replace('/');\n\n return (\n <>\n \n \n \n Uh oh! Deze pagina is niet gevonden...\n \n \n \n \n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `UpdatePage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n width: '100%',\n },\n title: {\n fontWeight: theme.typography.fontWeightBold,\n textAlign: 'left',\n },\n subtitle: {\n paddingTop: theme.spacing(1),\n textAlign: 'left',\n },\n timeline: {\n [theme.breakpoints.up('md')]: {\n width: '100ch',\n },\n [theme.breakpoints.down('xs')]: {\n padding: theme.spacing(0.5),\n },\n },\n paper: {\n padding: theme.spacing(2),\n width: 'auto',\n },\n updateTitle: {\n fontWeight: theme.typography.fontWeightBold,\n },\n sideContent: {\n [theme.breakpoints.up('sm')]: {\n maxWidth: '12ch',\n },\n [theme.breakpoints.down('xs')]: {\n maxWidth: 65,\n },\n },\n}));\n","export interface PrivacySection {\n title: string;\n description: string[];\n}\n\nexport const PRIVACY: PrivacySection[] = [\n {\n title: 'Waarborgen Privacy',\n description: [\n 'Het waarborgen van de privacy van bezoekers van P2000Scanner.nl is een belangrijke taak voor ons. Daarom beschrijven we in onze privacy policy welke informatie we verzamelen en hoe we deze informatie gebruiken.',\n ],\n },\n {\n title: 'Toestemming',\n description: [\n 'Door de informatie en de diensten op P2000Scanner.nl te gebruiken, gaat u akkoord met onze privacy policy en de voorwaarden die wij hierin hebben opgenomen.',\n ],\n },\n {\n title: 'Vragen',\n description: [\n 'Indien u meer informatie wilt ontvangen en/of vragen hebt over de privacy policy van P2000Scanner.nl of specifiek P2000Scanner.nl, kunt u ons benaderen via e-mail. Ons e-mailadres is info@P2000Scanner.nl.',\n ],\n },\n {\n title: 'Monitoren gedrag bezoeker',\n description: [\n 'P2000Scanner.nl maakt gebruik van verschillende technieken om bij te houden wie de website bezoekt, hoe deze bezoeker zich op de website gedraagt en welke pagina’s worden bezocht. Dit is een gebruikelijke manier voor websites omdat het informatie oplevert op die bijdraagt aan de kwaliteit van de gebruikerservaring. De informatie die we via cookies registreren, bestaat uit onder meer IP-adressen, het type browser en de bezochte pagina’s.',\n 'Tevens monitoren we waar bezoekers de website voor het eerst bezoeken en vanaf welke pagina ze vertrekken. Deze informatie houden we anoniem bij en is niet gekoppeld aan andere persoonlijke informatie.',\n ],\n },\n {\n title: 'Gebruik van cookies',\n description: [\n 'P2000Scanner.nl plaatst cookies bij bezoekers. Dat doen we om informatie te verzamelen over de pagina’s die gebruikers op onze website bezoeken, om bij te houden hoe vaak bezoekers terug komen en om te zien welke pagina’s het goed doen op de website.',\n ],\n },\n {\n title: 'Cookies uitschakelen',\n description: [\n 'U kunt er voor kiezen om cookies (volledig) uit te schakelen. Dat doet u door gebruik te maken de mogelijkheden van uw browser. U vindt meer informatie over deze mogelijkheden op de website van de aanbieder van uw browser.',\n ],\n },\n {\n title: 'Cookies van derde partijen',\n description: [\n 'Het is mogelijk dat derde partijen, zoals Google, op onze website adverteren of dat wij gebruik maken van een andere dienst. Daarvoor plaatsen deze derde partijen in sommige gevallen cookies. Deze cookies zijn niet door P2000Scanner.nl te beïnvloeden.',\n ],\n },\n {\n title: 'Onze adverteerders',\n description: [\n 'Op P2000Scanner.nl adverteren meerdere partijen, die allemaal hun eigen cookies plaatsen.',\n 'Deze adverteerders gebruiken technologie voor hun advertenties en de links in hun advertenties die direct door uw browser worden herkend. Ze gebruiken onder meer automatische herkenning van IP-adressen die rechtstreeks naar de adverteerder wordt gestuurd.',\n 'Daarnaast worden cookies, javascript en eventueel webbeacons ingezet om te monitoren hoe effectief de campagnes van deze partijen zijn. P2000Scanner.nl heeft noch invloed noch controle over de cookies, het javascript en de webbeacons die onze adverteerders gebruiken.',\n 'Al deze partijen hebben een eigen privacy policy en hanteren deze privacy policy voor het gebruik van hun website en de daaraan gekoppelde diensten. Meer informatie over hoe deze partijen omgaan met privacy vindt u op de websites van deze partijen',\n ],\n },\n {\n title: 'Privacy policy van adverteerders/derde partijen',\n description: [\n 'Voor meer informatie over de privacy policy van onze adverteerders en derde partijen die verbonden zijn aan deze website, kun u terecht op de websites van deze respectievelijke partijen. P2000Scanner.nl kan geen invloed uitoefenen op deze cookies en de privacy policy van door derden geplaatste cookies. Deze cookies vallen buiten het bereik van de privacy policy van P2000Scanner.nl.',\n ],\n },\n {\n title: 'DART-cookie van Google',\n description: [\n 'Het gebruik van een DART-cookie door Google, maakt het mogelijk dat er advertenties op onze website worden getoond. Daarnaast wordt deze cookie gebruikt voor het tonen van advertenties op andere websites.',\n ],\n },\n];\n","import { makeStyles } from '@material-ui/core';\n\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n },\n title: {\n fontWeight: theme.typography.fontWeightBold,\n textAlign: 'left',\n },\n section: {\n marginTop: theme.spacing(2),\n padding: theme.spacing(2),\n },\n subtitle: {\n paddingTop: theme.spacing(1),\n textAlign: 'left',\n },\n content: {\n '&:not(:last-of-type)': {\n marginBottom: theme.spacing(2),\n },\n },\n}));\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `LiveMapPage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n },\n map: {\n minHeight: 1230,\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n '& [class^=\"leaflet-control-zoom-\"]': {\n backgroundColor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n },\n },\n}));\n","import { Marker } from 'react-leaflet';\nimport { useHistory } from 'react-router-dom';\n\nimport { getMeldingLocation } from '~utils';\n\n/**\n * The property types which are used by the `LiveMeldingMarkers` component\n */\ntype LiveMeldingMarkersProps = {\n liveMeldingen: Record[];\n};\n\n/**\n * A component that renders a list of \"LiveMeldingMarkers\"\n *\n * @param props The standard properties which are always available\n * @param props.meldingen The data to iterate through and display a \"melding\" for each record\n *\n * @returns The `MeldingList` component\n */\nexport function LiveMeldingMarkers({\n liveMeldingen,\n}: LiveMeldingMarkersProps): JSX.Element {\n const history = useHistory();\n return (\n <>\n {liveMeldingen.map((melding) => {\n const locatie = melding ? getMeldingLocation(melding) : undefined;\n if (locatie?.latitude !== undefined) {\n return (\n history.push(`/melding/${melding.hoofdmeldingId}`)}\n />\n );\n }\n return null;\n })}\n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\nconst FOOTER_HEIGHT = 100;\n\n/**\n * The styles which are used by the `MeldingDetailsPage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n },\n page: {\n padding: theme.spacing(2),\n },\n column: {\n fontWeight: theme.typography.fontWeightBold,\n },\n map: {\n minHeight: 400,\n height: '100%',\n },\n view: {\n padding: theme.spacing(2),\n margin: theme.spacing(2, 0),\n },\n logo: {\n height: (theme.mixins.toolbar.minHeight as number) / 1.5,\n },\n copyright: {\n height: FOOTER_HEIGHT,\n alignItems: 'center',\n color: '#7c7c7d',\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n '& p': {\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n margin: theme.spacing(1, 0),\n },\n },\n}));\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `UpdatePage` page\n */\nexport default makeStyles((theme) => ({\n root: {\n width: '100%',\n },\n title: {\n fontWeight: theme.typography.fontWeightBold,\n textAlign: 'left',\n },\n subtitle: {\n paddingTop: theme.spacing(1),\n textAlign: 'left',\n },\n timeline: {\n [theme.breakpoints.up('md')]: {\n width: '120ch',\n },\n [theme.breakpoints.down('xs')]: {\n padding: theme.spacing(0.5),\n },\n },\n backgroundGreen: {\n backgroundColor: 'green',\n },\n backgroundOrange: {\n backgroundColor: 'orange',\n },\n backgroundBlack: {\n backgroundColor: 'black',\n },\n backgroundGrey: {\n backgroundColor: 'gray',\n },\n paper: {\n padding: theme.spacing(2),\n width: 'auto',\n },\n updateTitle: {\n fontWeight: theme.typography.fontWeightBold,\n },\n sideContent: {\n [theme.breakpoints.up('sm')]: {\n maxWidth: '40ch',\n },\n [theme.breakpoints.down('xs')]: {\n maxWidth: 65,\n },\n },\n}));\n","import {\n Category as DashboardPageIcon,\n AspectRatioRounded as MonitorPageIcon,\n GetApp as UpdatePageIcon,\n VpnLock as PrivacyPageIcon,\n Map as LiveMapPageIcon,\n Email as ContactPageIcon,\n GroupWorkRounded as RoadmapPageIcon,\n} from '@material-ui/icons';\n\nimport {\n ContactPage,\n DashboardPage,\n MeldingDetailsPage,\n MonitorPage,\n PrivacyPage,\n RoadmapPage,\n UpdatePage,\n} from '~views';\nimport { LiveMapPage } from '~views/LiveMapPage/LiveMapPage';\n\n/**\n * The routes that will be used for navigation throughout the application\n */\nexport const routes: Route[] = [\n {\n path: '/dashboard',\n component: DashboardPage,\n exact: true,\n displayName: 'Dashboard',\n displayLocation: 'sidebar',\n icon: DashboardPageIcon,\n },\n {\n path: '/',\n component: MonitorPage,\n exact: true,\n displayName: 'Monitor',\n displayLocation: 'sidebar',\n icon: MonitorPageIcon,\n },\n {\n path: '/live',\n component: LiveMapPage,\n exact: true,\n displayName: 'Live Map',\n displayLocation: 'sidebar',\n icon: LiveMapPageIcon,\n },\n {\n path: '/updates',\n component: UpdatePage,\n exact: true,\n displayName: 'Updates',\n displayLocation: 'sidebar',\n icon: UpdatePageIcon,\n },\n {\n path: '/roadmap',\n component: RoadmapPage,\n exact: true,\n displayName: 'Roadmap',\n displayLocation: 'sidebar',\n icon: RoadmapPageIcon,\n },\n {\n path: '/privacy',\n component: PrivacyPage,\n exact: true,\n displayName: 'Privacybeleid',\n displayLocation: 'sidebar',\n icon: PrivacyPageIcon,\n },\n {\n path: '/melding/:id',\n component: MeldingDetailsPage,\n exact: true,\n displayName: 'Melding Details',\n displayLocation: 'none',\n },\n {\n path: '/contact',\n component: ContactPage,\n exact: true,\n displayName: 'Contact',\n displayLocation: 'sidebar',\n icon: ContactPageIcon,\n },\n];\n","import { useEffect, useState } from 'react';\n\nimport { Box, Divider, Grid, Paper, Typography } from '@material-ui/core';\nimport dayjs from 'dayjs';\n\nimport useStyles from './DashboardPage.style';\n\nimport { BigNumberCard, CustomChart, Meta } from '~components';\nimport { useApi } from '~hooks';\n\n/**\n * A page that currently does nothing except being a placeholder\n *\n * @param props The standard properties which are always available\n *\n * @returns The `DashboardPage` page\n */\nexport function DashboardPage() {\n const classes = useStyles();\n const api = useApi();\n\n const [dashboardData, setDashboardData] = useState>();\n const [chartData, setChartData] = useState[]>([]);\n\n useEffect(() => {\n const fetch = async () => {\n const { data } = await api.get('/dashboard');\n setDashboardData(data ?? undefined);\n setChartData(\n data.hourly.map((hourly: any) => ({\n Aantal: hourly.amount,\n Datum: dayjs(hourly.date).format('HH:[00]'),\n })) ?? [],\n );\n };\n fetch();\n }, []);\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n Meldingen afgelopen 24 uur\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import { Box } from '@material-ui/core';\n\nimport { FilterToggler, Loader, MeldingList, Meta } from '~components';\nimport { FilterWrapper, MeldingWrapper } from '~features';\nimport { useAppSelector } from '~hooks';\n\n/**\n * A page that displays \"meldingen\" and provides UI actions for them\n *\n * @param props The standard properties which are always available\n *\n * @returns The `MonitorPage` page\n */\nexport function MonitorPage() {\n const { meldingen } = useAppSelector((state) => state.melding);\n\n return (\n <>\n \n \n \n {meldingen.length > 0 ? (\n \n \n \n ) : (\n \n )}\n \n \n \n \n );\n}\n","import { useTheme } from '@material-ui/core';\nimport { LatLng } from 'leaflet';\nimport { Map, TileLayer } from 'react-leaflet';\n\nimport useStyles from './LiveMapPage.style';\n\nimport { Meta } from '~components';\nimport { LiveMeldingMarkers } from '~components/LiveMeldingList/LiveMeldingList';\nimport { LiveMeldingWrapper } from '~features';\nimport { useAppSelector } from '~hooks';\n\n/**\n * A page that displays \"meldingen on a map\"\n *\n * @param props The standard properties which are always available\n *\n * @returns The `LiveMapPage` page\n */\n\nexport function LiveMapPage() {\n const { liveMeldingen } = useAppSelector((state) => state.live);\n\n const classes = useStyles();\n const theme = useTheme();\n\n /**\n * MarkerPosition to place the map in the center\n */\n const markerPosition = new LatLng(52.1326332 as number, 5.291266 as number);\n\n /**\n * The url to use when the application is in light mode\n */\n const LIGHT_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png';\n\n /**\n * The url to use when the application is in dark mode\n */\n const DARK_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png';\n\n return (\n <>\n \n \n \n \n {liveMeldingen.length > 0 && (\n \n )}\n \n \n \n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { Box, Divider, Paper, Typography } from '@material-ui/core';\nimport {\n Timeline,\n TimelineConnector,\n TimelineContent,\n TimelineDot,\n TimelineItem,\n TimelineOppositeContent,\n TimelineSeparator,\n} from '@material-ui/lab';\n\nimport useStyles from './UpdatePage.style';\n\nimport { Meta } from '~components';\nimport { useApi } from '~hooks';\nimport { getDate } from '~utils';\n\n/**\n * A page that displays update information about the application\n *\n * @param props The standard properties which are always available\n *\n * @returns The `UpdatePage` page\n */\nexport function UpdatePage(): JSX.Element {\n const classes = useStyles();\n const api = useApi();\n\n const [updates, setUpdates] = useState[]>();\n\n /**\n * Fetches the update data and sets it to the state\n */\n useEffect(() => {\n const fetch = async () => {\n const { data } = await api.get(`/updates`);\n setUpdates(data ?? undefined);\n };\n fetch();\n }, []);\n\n return (\n <>\n \n \n \n Updates\n \n \n Op deze pagina worden updates geplaatst zodat bezoekers de voortgang\n van P2000Scanner kunnen bijhouden.\n \n \n \n \n \n \n {updates?.map((update, index) => {\n const isFirstItem = index === 0;\n const isLastItem = index + 1 < updates?.length;\n\n return (\n \n \n \n {getDate(update.date)}\n \n {update.version}\n \n \n \n \n \n {isLastItem && }\n \n \n \n \n {update.description}\n \n {update.changes.length > 0 && (\n
    \n {update.changes.map((change: string) => (\n
  • {change}
  • \n ))}\n
\n )}\n
\n
\n \n );\n })}\n \n \n \n \n );\n}\n","import { useEffect, useState } from 'react';\n\nimport { Box, Divider, Paper, Typography } from '@material-ui/core';\nimport {\n HourglassEmptyOutlined as UnstartedIcon,\n CheckOutlined as CompletedIcon,\n WorkOutlined as ProgressIcon,\n} from '@material-ui/icons';\nimport {\n Timeline,\n TimelineConnector,\n TimelineContent,\n TimelineDot,\n TimelineItem,\n TimelineOppositeContent,\n TimelineSeparator,\n} from '@material-ui/lab';\nimport dayjs from 'dayjs';\n\nimport useStyles from './RoadmapPage.style';\n\nimport { useApi } from '~hooks';\n\n/**\n * A page that displays roadmap information about the application\n *\n * @param props The standard properties which are always available\n *\n * @returns The `RoadmapPage` page\n */\nexport function RoadmapPage(): JSX.Element {\n const classes = useStyles();\n const api = useApi();\n\n const [roadmap, setRoadmaps] = useState[]>();\n\n /**\n * Gets phase of timeline item\n * @param {string} startDate\n * @param {string} endDate\n * @returns Phases:\n * 0, Not started yet |\n * 1, In progress |\n * 2, Completed\n */\n\n const getPhase = (startDate: string, eindDate: string) => {\n if (dayjs().isBefore(startDate)) {\n return { phase: 0, icon: UnstartedIcon, color: classes.backgroundGrey };\n }\n if (dayjs().isAfter(startDate) && dayjs().isBefore(eindDate)) {\n return { phase: 1, icon: ProgressIcon, color: classes.backgroundOrange };\n }\n if (dayjs().isAfter(eindDate)) {\n return { phase: 2, icon: CompletedIcon, color: classes.backgroundGreen };\n }\n return { phase: 0, icon: ProgressIcon, color: classes.backgroundBlack };\n };\n\n /**\n * Fetches the update data and sets it to the state\n */\n useEffect(() => {\n const fetch = async () => {\n const { data } = await api.get(`/roadmap`);\n setRoadmaps(data ?? undefined);\n };\n fetch();\n }, []);\n\n return (\n \n \n Roadmap\n \n \n Op deze pagina kun je zien wat er gemaakt gaat worden in een bepaalde\n periode.\n \n \n \n \n \n \n {roadmap?.map((roadmapItem) => {\n const phase = getPhase(roadmapItem.startDate, roadmapItem.eindDate);\n const finishDate = dayjs(roadmapItem.eindDate).format(\n 'MMMM - YYYY',\n );\n return (\n \n \n \n {finishDate.slice(0, 1).toUpperCase() +\n finishDate.slice(1, finishDate.length)}\n \n \n \n \n {phase.phase === 2 && }\n \n \n \n \n {roadmapItem.titel}\n \n {roadmapItem.omschrijving}\n \n \n \n );\n })}\n \n \n \n );\n}\n","import { Container, Typography, Box, Divider, Paper } from '@material-ui/core';\n\nimport { PRIVACY } from './data/privacy.data';\nimport useStyles from './PrivacyPage.style';\n\nimport { Meta } from '~components';\n\nexport function PrivacyPage() {\n const classes = useStyles();\n\n return (\n <>\n \n \n \n Privacybeleid\n \n \n Privacy policy voor P2000Scanner.nl\n \n \n \n \n \n {PRIVACY.map((section, index) => (\n \n \n {index + 1}) {section.title}\n \n \n {section.description.map((paragraph) => (\n \n {paragraph}\n \n ))}\n \n ))}\n \n \n \n );\n}\n","import { useEffect, useState } from 'react';\n\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n Chip,\n Container,\n Divider,\n Grid,\n IconButton,\n Paper,\n Typography,\n} from '@material-ui/core';\nimport { ArrowBack, ExpandMore as ExpandMoreIcon } from '@material-ui/icons';\nimport { useHistory, useParams } from 'react-router-dom';\nimport {\n EmailIcon,\n EmailShareButton,\n FacebookShareButton,\n FacebookIcon,\n TelegramShareButton,\n TelegramIcon,\n LinkedinShareButton,\n LinkedinIcon,\n TwitterShareButton,\n TwitterIcon,\n WhatsappIcon,\n WhatsappShareButton,\n} from 'react-share';\n\nimport useStyles from './MeldingDetailsPage.style';\n\nimport {\n CustomMap,\n MeldingList,\n UnavailableItems,\n VehicleCard,\n Loader,\n Meta,\n} from '~components';\nimport { useApi } from '~hooks';\nimport {\n arrayToList,\n getMeldingLocation,\n getLifelinerLocation,\n getMeldingTags,\n getTimeFull,\n isTimeLessThenHourFromNow,\n} from '~utils';\n\n/**\n * The property types which are used by the `MeldingDetailsPage` url parameters\n */\ninterface MeldingDetailsParams {\n id: string;\n}\n\n/**\n * A page that displays in-depth details about a \"melding\"\n *\n * @param props The standard properties which are always available\n *\n * @returns The `MeldingDetailsPage` page\n */\nexport function MeldingDetailsPage() {\n const classes = useStyles();\n const history = useHistory();\n const api = useApi();\n const { id } = useParams();\n const PAGE_URL = `https://p2000scanner.nl/melding/${id}`;\n\n const [melding, setMelding] = useState | undefined>();\n const [lifelinerLocation, setLifelinerLocation] = useState<\n GlobalLocation | undefined\n >();\n\n const isLifelinerMelding = !!melding?.lifeliner;\n const amountOfVoertuigen = melding?.voertuigen.length;\n const hasVoertuigen = amountOfVoertuigen > 0;\n const amountOfSubmeldingen = melding?.meldingen.length;\n const hasSubmeldingen = amountOfSubmeldingen > 0;\n const meldingLocatie = melding ? getMeldingLocation(melding) : undefined;\n\n const getImageUrl = (roepnummer?: string) => {\n if (roepnummer === undefined) {\n return `${process.env.REACT_APP_PHOTO_API}/${id}/null/image.jpg`;\n }\n return `${process.env.REACT_APP_PHOTO_API}/${id}/${roepnummer}/image.jpg`;\n };\n /**\n * Fetches the melding data and sets it to the state\n */\n useEffect(() => {\n const fetch = async () => {\n const { data } = await api.get(`/meldingen/${id}`);\n setMelding(data ?? undefined);\n };\n\n fetch();\n }, [id]);\n\n useEffect(() => {\n const fetchLifelinerLocation = async () => {\n const { data } = await api.get(`/aircraft/${melding?.lifeliner}`);\n if (data.length !== 0) {\n setLifelinerLocation(data ? getLifelinerLocation(data) : undefined);\n }\n };\n\n fetchLifelinerLocation();\n }, [isLifelinerMelding, melding]);\n\n return melding ? (\n <>\n \n \n \n history.goBack()}>\n \n \n \n {melding.titel || melding.melding}\n \n \n \n \n \n \n \n \n \n \n \n Datum en tijd\n \n {getTimeFull(melding.tijd)}\n \n \n Melding\n {melding.melding}\n \n Prioriteit\n {melding.prio}\n \n Capcodes overzicht\n \n {arrayToList(melding.capcodes)}\n \n \n Tags\n \n {getMeldingTags(melding, 'cruciaal').map((tag) => (\n \n ))}\n \n \n Delen:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n }\n >\n \n Voertuigen ({amountOfVoertuigen})\n \n \n \n \n {hasVoertuigen ? (\n \n {melding.voertuigen.map(\n (voertuig: Record) => (\n \n \n \n ),\n )}\n \n ) : (\n \n )}\n \n \n \n \n \n }\n >\n \n Bijbehorende meldingen ({amountOfSubmeldingen})\n \n \n \n \n {hasSubmeldingen ? (\n \n ) => ({\n ...m,\n melding: melding.melding,\n tijd: melding.tijd,\n }),\n )}\n />\n \n ) : (\n \n )}\n \n \n \n {isLifelinerMelding && isTimeLessThenHourFromNow(melding.tijd) && (\n \n \n }\n >\n Lifeliner locatie\n \n \n \n \n \n \n \n )}\n \n \n }\n >\n \n Download melding afbeelding\n \n \n \n \n \n }\n >\n Standaard\n \n \n \n \n \n \n \n {hasVoertuigen && (\n <>\n {melding.voertuigen.map((voertuig: Record) => (\n \n \n }\n >\n \n {voertuig.roepnummer || 'Onbekend roepnummer'}\n \n \n \n \n \n \n \n \n ))}\n \n )}\n \n \n \n \n {melding !== undefined && (\n \n \n Bevat deze melding een fout? Klik{' '}\n \n hier\n {' '}\n om het te melden.\n \n \n )}\n \n \n ) : (\n \n );\n}\n","import {\n Box,\n Container,\n Divider,\n Grid,\n Paper,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport { LatLng } from 'leaflet';\nimport { TileLayer, Map } from 'react-leaflet';\n\nimport useStyles from './ContactPage.style';\n\n/**\n * A page that displays in-depth details about a \"contact\"\n *\n * @param props The standard properties which are always available\n *\n * @returns The `ContactPage` page\n */\nexport function ContactPage() {\n const classes = useStyles();\n const theme = useTheme();\n\n /**\n * The position of the marker to use\n */\n const markerPosition = new LatLng(51.99428909219551, 5.967364860449136);\n\n /**\n * The url to use when the application is in light mode\n */\n const LIGHT_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png';\n\n /**\n * The url to use when the application is in dark mode\n */\n const DARK_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png';\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n Wie zijn wij?\n \n \n \n \n \n \n \n P2000Scanner is een website waar men live de P2000 meldingen uit\n zijn/haar regio kan bekijken! Onze site maakt gebruik van\n geavanceerde technieken om de meldingen zo snel mogelijk op het\n scherm te krijgen. Het doel van de website is dus ook om de\n informatie zo snel en eenvoudig mogelijk op scherm te zetten.\n \n \n \n \n Naast het bekijken van de live meldingen is er ook de\n mogelijkheid om bepaalde statistieken te zien van de dag en om\n meldingen te delen op social media. In de toekomst komt er nog\n een uitbreiding zodat de meldingen ook ontvangen kunnen worden\n op je mobiele telefoon.\n \n \n \n \n Tips/Verbeter punten of wil je ons wat anders laten weten? Stuur\n ons dan een{' '}\n \n email!\n {' '}\n \n \n \n \n \n

\n Copyright © {new Date().getFullYear()} P2000Scanner. Alle\n rechten voorbehouden.\n

\n

P2000Scanner is een product van Mundaro

\n \n \n \n
\n
\n
\n
\n
\n );\n}\n","import {\n Box,\n Hidden,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n Toolbar,\n} from '@material-ui/core';\nimport {\n Close as CloseSidebarIcon,\n Block as UnavailableIcon,\n} from '@material-ui/icons';\nimport { Link, matchPath, useLocation } from 'react-router-dom';\n\nimport useStyles from './SidebarContent.style';\n\nimport { routes } from '~config/routes';\nimport { closeSidebar } from '~features';\nimport { useAppDispatch } from '~hooks';\n\n/**\n * A component that contains the content (like navigation items) used by the sidebar\n *\n * @param props The standard properties which are always available\n *\n * @returns The `SidebarContent` component\n */\nexport function SidebarContent(): JSX.Element {\n const classes = useStyles();\n const dispatch = useAppDispatch();\n const location = useLocation();\n\n /**\n * Checks if the route visited by the client is currently active\n * @param route The route which the client is currently on\n * @returns If the current route is active\n */\n const handleIsRouteActive = (route: Route): boolean =>\n !!matchPath(location.pathname, {\n path: route.path,\n exact: route.exact,\n });\n\n /**\n * Handles the closing of the sidebar\n */\n const handleClose = () => dispatch(closeSidebar());\n\n return (\n \n );\n}\n","import { Drawer, Hidden, SwipeableDrawer } from '@material-ui/core';\n\nimport useStyles from './Sidebar.styles';\nimport { SidebarContent } from './SidebarContent/SidebarContent';\n\nimport { closeSidebar, openSidebar } from '~features';\nimport { useAppDispatch, useAppSelector } from '~hooks';\n\n/**\n * A component that handles user navigation at the side of the screen\n *\n * @param props The standard properties which are always available\n *\n * @returns The `Sidebar` component\n */\nexport function Sidebar(): JSX.Element {\n const classes = useStyles();\n const dispatch = useAppDispatch();\n const { sidebarOpen } = useAppSelector((state) => state.app);\n\n const handleOpen = () => dispatch(openSidebar());\n const handleClose = () => dispatch(closeSidebar());\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `Capcode` component\n */\nexport default makeStyles((theme) => ({\n root: {\n borderLeft: '2px solid rgba(0, 0, 0, 0.2)',\n padding: theme.spacing(0.5, 0),\n paddingLeft: theme.spacing(1),\n wordWrap: 'break-word',\n '& span:not(:empty)': {\n marginRight: 5,\n },\n },\n capcode: {\n fontWeight: 'bold',\n },\n description: {\n fontStyle: 'italic',\n },\n}));\n","import { Typography } from '@material-ui/core';\n\nimport useStyles from './Capcode.style';\n\nimport { CapcodeDetails } from '~models/api';\nimport { getCapcodeDescription } from '~utils/capcode.util';\n\n/**\n * The property types which are used by the `Capcode` component\n */\ntype CapcodeProps = {\n capcode: CapcodeDetails;\n};\n\n/**\n * A component that displays details about a \"capcode\" as text\n *\n * @param props The standard properties which are always available\n * @param props.capcode The data which should be used to display \"capcode\" information\n *\n * @returns The `Capcode` component\n */\nexport function Capcode({ capcode }: CapcodeProps): JSX.Element {\n const classes = useStyles();\n\n return (\n \n {capcode.capcode}\n {capcode?.discipline?.afkorting}\n {capcode?.gpkr}\n \n {getCapcodeDescription(capcode.omschrijving)}\n \n \n );\n}\n","/**\n * Formats the \"capcode\" description with support for unavailable descriptions\n * @param description The \"capcode\" description to format\n * @returns The formatted version of the \"capcode\" description\n */\nexport const getCapcodeDescription = (description: string | undefined) => {\n const text = description || 'Onbekende capcode';\n return `(${text})`;\n};\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `Melding` component\n */\nexport default makeStyles((theme) => ({\n root: {\n borderLeft: `6px solid black`,\n padding: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n '&:not(:last-of-type)': {\n marginBottom: theme.spacing(2),\n },\n },\n titel: {\n fontWeight: 600,\n textTransform: 'uppercase',\n },\n details: {\n paddingTop: theme.spacing(1),\n opacity: 0.5,\n '& span': { fontWeight: 'bold' },\n '& > div:nth-of-type(1)': {\n textAlign: 'left',\n },\n '& > div:nth-of-type(2)': {\n textAlign: 'center',\n [theme.breakpoints.down('xs')]: {\n textAlign: 'right',\n },\n },\n '& > div:nth-of-type(3)': {\n textAlign: 'right',\n },\n },\n}));\n","import { Grid, IconButton, Paper, Typography } from '@material-ui/core';\nimport { Launch as MeldingInfoIcon } from '@material-ui/icons';\nimport clsx from 'classnames';\nimport { useHistory } from 'react-router-dom';\n\nimport { Capcode } from '../Capcode/Capcode';\n\nimport useStyles from './Melding.style';\n\nimport { CapcodeDetails } from '~models/api';\nimport { getTimeShort } from '~utils';\n\n/**\n * The property types which are used by the `Melding` component\n */\ninterface MeldingProps {\n melding: Record;\n hasActions?: boolean;\n}\n\n/**\n * The default property values which are used by the `Melding` component\n */\nconst defaultProps: Partial = {\n hasActions: true,\n};\n\n/**\n * A component that displays details about a \"melding\"\n *\n * @param props The standard properties which are always available\n * @param props.melding The data which should be used to display \"melding\" information\n * @param props.hasActions If the \"melding\" has actions which the user can interact with\n *\n * @returns The `Melding` component\n */\nexport function Melding({ melding, hasActions }: MeldingProps): JSX.Element {\n const classes = useStyles();\n const history = useHistory();\n\n /**\n * Gets the colored classname for the discipline\n * @param variant The variant to use (`border | text`)\n * @returns The colored classname to use\n */\n const getColorClassName = (variant: string): string =>\n `${melding?.discipline?.benaming.toUpperCase()}--${variant}`;\n\n /**\n * An element which displays the \"melding\" title and it's \"capcodes\"\n * @returns The \"melding\" information with \"capcodes\"\n */\n const MeldingInfo = (): JSX.Element => (\n <>\n \n {melding.discipline.benaming} {melding.melding}\n \n {melding.capcodes.map((capcode: CapcodeDetails) => (\n \n ))}\n \n );\n\n return (\n \n {hasActions ? (\n \n \n \n \n \n \n \n history.push(`/melding/${melding.hoofdmeldingId}`)\n }\n >\n \n \n \n \n \n ) : (\n \n )}\n \n \n \n {melding.discipline.naam}\n \n \n \n \n {melding.regio?.naam || 'Onbekende regio'}\n \n \n \n \n {getTimeShort(melding.tijd)}\n \n \n \n \n );\n}\n\n/**\n * Assign the default properties to the `Melding` component\n */\nMelding.defaultProps = defaultProps;\n","import { Melding } from '~components/Melding/Melding';\n\n/**\n * The property types which are used by the `MeldingList` component\n */\ntype MeldingListProps = {\n meldingen: Record[];\n hasActions?: boolean;\n};\n\n/**\n * The default property values which are used by the `MeldingList` component\n */\nconst defaultProps: Partial = {\n hasActions: false,\n};\n\n/**\n * A component that renders a list of \"meldingen\"\n *\n * @param props The standard properties which are always available\n * @param props.meldingen The data to iterate through and display a \"melding\" for each record\n *\n * @returns The `MeldingList` component\n */\nexport function MeldingList({\n meldingen,\n hasActions,\n}: MeldingListProps): JSX.Element {\n return (\n <>\n {meldingen.map((melding) => (\n \n ))}\n \n );\n}\n\n/**\n * Assign the default properties to the `MeldingList` component\n */\nMeldingList.defaultProps = defaultProps;\n","import { IconButton, Tooltip } from '@material-ui/core';\nimport { HelpOutline as Icon } from '@material-ui/icons';\n\n/**\n * The property types which are used by the `HelperTip` component\n */\ninterface HelperTipProps {\n text: string;\n}\n\n/**\n * A component that shows a HelperTip on hover\n *\n * @param props The standard properties which are always available\n * @param props.text The text to display when shown\n *\n * @returns The `HelperTip` component\n */\nexport function HelperTip({ text }: HelperTipProps) {\n return (\n \n \n \n \n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The size ratio for an image (16 by 9)\n */\nconst IMAGE_RATIO = '56.25%';\n\n/**\n * The styles which are used by the `VehicleCard` component\n */\nexport default makeStyles((theme) => ({\n root: {\n height: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n },\n header: {\n padding: theme.spacing(2),\n },\n title: {\n fontWeight: 'bold',\n },\n media: {\n height: 0,\n paddingTop: IMAGE_RATIO,\n },\n content: {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n padding: theme.spacing(1, 2),\n flexGrow: 1,\n '& .MuiTypography-overline': {\n fontWeight: 'bold',\n lineHeight: 0,\n },\n '& .MuiTypography-body1': {\n marginBottom: theme.spacing(1.5),\n },\n },\n details: {\n paddingTop: theme.spacing(1),\n },\n caption: {\n fontStyle: 'italic',\n opacity: 0.5,\n },\n link: {\n color: 'inherit',\n textDecoration: 'none',\n },\n}));\n","import {\n Box,\n Button,\n Card,\n CardActions,\n CardContent,\n CardHeader,\n CardMedia,\n Divider,\n Typography,\n} from '@material-ui/core';\n\nimport useStyles from './VehicleCard.style';\n\nimport { getVehicleImage, getVehicleName } from '~utils';\n\n/**\n * The property types which are used by the `VehicleCard` component\n */\ninterface VehicleCardProps {\n vehicle: Record;\n priority: string;\n}\n\n/**\n * A component that displays a vehicle and it's properties as a card\n *\n * @param props The standard properties which are always available\n * @param props.vehicle The data of the vehicle to use\n * @param props.priority The priority of the \"melding\" for the image type\n *\n * @returns The `VehicleCard` component\n */\nexport function VehicleCard({\n vehicle,\n priority,\n}: VehicleCardProps): JSX.Element {\n const classes = useStyles();\n\n /**\n * The image to use for the vehicle\n */\n const vehicleImage = getVehicleImage(vehicle, priority);\n\n return (\n \n \n\n \n \n \n Standplaats\n \n {vehicle.standplaats || 'Onbekend'}\n \n <>\n Opmerkingen\n \n {vehicle.opmerkingen || 'Geen opmerkingen'}\n \n \n \n {vehicleImage.author && (\n \n \n Foto door: {vehicleImage.author}\n \n \n )}\n \n \n \n \n \n \n Meer informatie\n \n \n \n \n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `UnavailableItems` component\n */\nexport default makeStyles((theme) => ({\n root: {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(1),\n fontStyle: 'italic',\n opacity: 0.6,\n },\n icon: {\n marginRight: theme.spacing(1),\n },\n}));\n","import { Box, Typography } from '@material-ui/core';\nimport { ErrorOutline as ErrorIcon } from '@material-ui/icons';\n\nimport useStyles from './UnavailableItems.style';\n\n/**\n * The property types which are used by the `UnavailableItems` component\n */\ninterface UnavailableItemsProps {\n message?: string;\n}\n\n/**\n * The default property values which are used by the `UnavailableItems` component\n */\nconst defaultProps: Partial = {\n message: 'Er zijn geen items gevonden',\n};\n\n/**\n * A component that handles the display and puts a message when a condition is not met\n *\n * @param props The standard properties which are always available\n * @param props.message The message to display when something is unavailable\n *\n * @returns The `UnavailableItems` component\n */\nexport function UnavailableItems({\n message,\n}: UnavailableItemsProps): JSX.Element {\n const classes = useStyles();\n\n return (\n \n \n {message}\n \n );\n}\n\n/**\n * Assign the default properties to the `UnavailableItems` component\n */\nUnavailableItems.defaultProps = defaultProps;\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `CustomMap` component\n */\nexport default makeStyles((theme) => ({\n map: {\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n '& [class^=\"leaflet-control-zoom-\"]': {\n backgroundColor: theme.palette.background.paper,\n color: theme.palette.text.primary,\n },\n },\n noLocation: {\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n fontStyle: 'italic',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n '& *': {\n opacity: 0.5,\n },\n },\n icon: {\n fontSize: '5em',\n },\n text: {\n marginTop: theme.spacing(2),\n },\n}));\n","import { Box, Typography, useTheme } from '@material-ui/core';\nimport { LocationOff as NoLocationIcon } from '@material-ui/icons';\nimport { LatLng } from 'leaflet';\nimport { Map, TileLayer, Marker } from 'react-leaflet';\n\nimport useStyles from './CustomMap.style';\n\n/**\n * The property types which are used by the `CustomMap` component\n */\ntype CustomMapProps = {\n location?: GlobalLocation;\n};\n\n/**\n * The default property values which are used by the `CustomMap` component\n */\nconst defaultProps: Partial = {\n location: undefined,\n};\n\n/**\n * A component displays a custom map with a specific location\n *\n * @param props The standard properties which are always available\n * @param props.location The location to display on the map\n *\n * @returns The `CustomMap` component\n */\nexport function CustomMap({ location }: CustomMapProps): JSX.Element {\n const classes = useStyles();\n const theme = useTheme();\n\n /**\n * Checks if the location is available\n */\n const hasLocation = !!location;\n\n if (hasLocation) {\n /**\n * The position of the marker to use\n */\n const markerPosition = new LatLng(\n location?.latitude as number,\n location?.longitude as number,\n );\n\n /**\n * The url to use when the application is in light mode\n */\n const LIGHT_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png';\n\n /**\n * The url to use when the application is in dark mode\n */\n const DARK_THEME_URL =\n 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png';\n\n return (\n \n \n \n \n );\n }\n\n return (\n \n \n \n Geen locatie beschikbaar\n \n \n );\n}\n\n/**\n * Assign the default properties to the `CustomMap` component\n */\nCustomMap.defaultProps = defaultProps;\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `FilterSelector` component\n */\nexport default makeStyles({\n root: {\n width: '100%',\n },\n});\n","import {\n HomeWorkTwoTone as DisciplineIcon,\n HomeWork as DisciplineIconSelected,\n HomeWorkOutlined as DisciplineIconUnselected,\n MapTwoTone as RegioIcon,\n Map as RegioIconSelected,\n MapOutlined as RegioIconUnselected,\n HelpTwoTone as DefaultIcon,\n Help as DefaultIconSelected,\n HelpOutline as DefaultIconUnselected,\n} from '@material-ui/icons';\n\nimport { FilterType } from '~models/stream';\n\n/**\n * A type for the Icon format\n */\nexport type Icon = typeof DefaultIcon;\n\n/**\n * A type for structuring a set of icons\n */\ntype IconSet = {\n main: Icon;\n selected: Icon;\n unselected: Icon;\n};\n\n/**\n * Gets the icon for the filter type\n * @param filterType The filter type to get an icon for\n * @returns The icon which belongs to the requested filter type\n */\nexport const getFilterIcon = (filterType: FilterType): IconSet => {\n switch (filterType) {\n case 'filterDiscipline': {\n return {\n main: DisciplineIcon,\n selected: DisciplineIconSelected,\n unselected: DisciplineIconUnselected,\n };\n }\n case 'filterRegio': {\n return {\n main: RegioIcon,\n selected: RegioIconSelected,\n unselected: RegioIconUnselected,\n };\n }\n default: {\n return {\n main: DefaultIcon,\n selected: DefaultIconSelected,\n unselected: DefaultIconUnselected,\n };\n }\n }\n};\n","import { Checkbox, FormControlLabel, Typography } from '@material-ui/core';\n\nimport useStyles from './FilterSelector.style';\n\nimport { getFilterIcon } from '~common/icons';\nimport { addUserFilter, removeUserFilter } from '~features';\nimport { useAppDispatch, useAppSelector } from '~hooks';\nimport { FilterItem } from '~models/api';\nimport { FilterType } from '~models/stream';\nimport { getAcceptedFields } from '~utils';\n\n/**\n * The property types which are used by the `FilterSelector` component\n */\ninterface FilterSelectorProps {\n type: string;\n filterItems: FilterItem['items'];\n}\n\n/**\n * A component that handles the selecting of filter items\n *\n * @param props The standard properties which are always available\n * @param props.type The type of the filter which is being used\n * @param props.filterItems The filter items to iterate through\n *\n * @returns The `FilterSelector` component\n */\nexport function FilterSelector({ type, filterItems }: FilterSelectorProps) {\n const classes = useStyles();\n const dispatch = useAppDispatch();\n const { filtersApplied } = useAppSelector((state) => state.filter);\n\n /**\n * Get the icons that belong to the filter selector\n */\n const { selected: CheckedIcon, unselected: UncheckedIcon } = getFilterIcon(\n type as FilterType,\n );\n\n /**\n * Checks if a filter has been applied by the user\n */\n const isFilterApplied = (id: string) => {\n const includes = filtersApplied[type].includes(id);\n return includes;\n };\n\n /**\n * Handles the user selected filters and dispatches them to the state\n * @param id The id of the filter item to use\n * @param selected If the filter has been selected or not\n */\n const handleUserFilterSelection = (id: string, selected: boolean) => {\n if (selected && !isFilterApplied(id)) {\n dispatch(addUserFilter({ type, id }));\n } else {\n dispatch(removeUserFilter({ type, id }));\n }\n };\n\n return (\n <>\n {filterItems.map((filter: Record) => {\n const fields = getAcceptedFields(filter);\n const active = isFilterApplied(filter._id);\n\n return (\n }\n icon={}\n onChange={({ target }) =>\n handleUserFilterSelection(filter._id, target.checked)\n }\n />\n }\n label={\n \n {fields.title}\n \n }\n />\n );\n })}\n \n );\n}\n","import { FilterItem } from '~models/api';\n\n/**\n * Extracts accepted fields from an object\n * @param filterItem The filter item to retrieve the fiels from\n * @returns The accepted fields with their data\n */\nexport const getAcceptedFields = (\n filterItem: Record,\n): { id: string; title: string } => {\n const { _id, naam } = filterItem;\n return { id: _id, title: naam };\n};\n\n/**\n * Checks if a filter item has nested filter items\n * @param filterItems The filter items to check if it has nested items\n * @returns If a filter items list contains nested filter items\n */\nexport const hasNestedFilterItems = (filterItems: FilterItem) =>\n filterItems.items.every((item) => Array.isArray(item?.items));\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `FilterItem` component\n */\nexport default makeStyles((theme) => ({\n content: {\n padding: theme.spacing(2, 3),\n },\n subject: {\n '&:not(:first-of-type)': {\n marginTop: theme.spacing(2),\n },\n },\n subtitle: {\n fontWeight: theme.typography.fontWeightBold,\n },\n}));\n","import {\n Button,\n Dialog,\n DialogActions,\n DialogTitle,\n Divider,\n FormGroup,\n Grid,\n GridSize,\n Typography,\n} from '@material-ui/core';\n\nimport { FilterSelector } from '../FilterSelector/FilterSelector';\nimport { HelperTip } from '../HelperTip/HelperTip';\n\nimport useStyles from './FilterItem.style';\n\nimport { closeFilterMenu } from '~features';\nimport { useAppDispatch, useAppSelector } from '~hooks';\nimport { FilterDetails, FilterItem as FilterItemType } from '~models/api';\nimport { hasNestedFilterItems } from '~utils';\n\n/**\n * The property types which are used by the `FilterItem` component\n */\ninterface FilterItemProps {\n details: FilterDetails;\n}\n\n/**\n * A component that displays the details about a filter item with built-in logic and selection\n *\n * @param props The standard properties which are always available\n * @param props.details The details about the filter item\n *\n * @returns The `FilterItem` component\n */\nexport function FilterItem({ details }: FilterItemProps): JSX.Element {\n const classes = useStyles();\n const { filterMenusOpen } = useAppSelector((state) => state.filter);\n const dispatch = useAppDispatch();\n\n /**\n * Checks if the current filter item is open\n */\n const isCurrentItemOpen = filterMenusOpen[details.type];\n\n /**\n * Handles the closing of the current filter item\n */\n const handleClose = () => dispatch(closeFilterMenu(details.type));\n\n return (\n \n {details.title}\n \n \n {details.filters.map((filter: FilterItemType) => (\n \n \n \n {filter.title}\n {filter.description && }\n \n \n \n {hasNestedFilterItems(filter) ? (\n \n {filter.items.map((filterItem: any) => {\n /**\n * Make equal columns based on the nested array\n * (12 is the maximum columms for `@material-ui`)\n */\n const gridSize = Math.floor(\n 12 / filter.items.length,\n ) as GridSize;\n\n return (\n \n \n \n );\n })}\n \n ) : (\n \n )}\n \n \n ))}\n \n \n \n \n \n \n );\n}\n","import { makeStyles } from '@material-ui/core';\n\n/**\n * The styles which are used by the `FilterToggler` component\n */\nexport default makeStyles((theme) => ({\n root: {\n position: 'fixed',\n bottom: theme.spacing(5),\n right: theme.spacing(5),\n [theme.breakpoints.down('sm')]: {\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n },\n },\n}));\n","import {\n Search as FilterIconClosed,\n Close as FilterIconOpened,\n} from '@material-ui/icons';\nimport { SpeedDial, SpeedDialAction, SpeedDialIcon } from '@material-ui/lab';\n\nimport { FilterItem } from '../FilterItem/FilterItem';\n\nimport useStyles from './FilterToggler.style';\n\nimport { getFilterIcon } from '~common/icons';\nimport { closeFilter, openFilter, openFilterMenu } from '~features';\nimport { useAppDispatch, useAppSelector } from '~hooks';\nimport { FilterType } from '~models/stream';\n\n/**\n * The property types which are used by the `FilterToggler` component\n */\ninterface FilterTogglerProps {\n disabled?: boolean;\n}\n\n/**\n * The default property values which are used by the `FilterToggler` component\n */\nconst defaultProps: Partial = {\n disabled: false,\n};\n\n/**\n * A component that handles the opening and closing of the filter menu\n *\n * @param props The standard properties which are always available\n * @param props.disabled If the filter toggler should be disabled (hidden)\n *\n * @returns The `FilterToggler` component\n */\nexport function FilterToggler({ disabled }: FilterTogglerProps): JSX.Element {\n const classes = useStyles();\n const dispatch = useAppDispatch();\n\n const { isOpen, filters } = useAppSelector((state) => state.filter);\n\n /**\n * Handles the toggling of the filter options menu\n */\n const handleToggle = () => dispatch(isOpen ? closeFilter() : openFilter());\n\n /**\n * Handles the opening of a filter menu\n */\n const handleFilterMenuOpen = (type: string) => dispatch(openFilterMenu(type));\n\n return (\n <>\n {filters.map((filter) => (\n \n ))}\n