{"version":3,"sources":["components/IconChart.js","components/IconTable.js","components/Loading.js","types/docs.js","utils/display.js","components/LineChart/config.js","components/LineChart/markers.js","components/LineChart/index.js","components/Table/columns.js","components/IconArrowDownRight.js","components/IconArrowUpRight.js","components/IconDot.js","components/Table/index.js","service-worker.js","utils/math.js","App.js","ErrorBoundary.js","index.js"],"names":["IconChart","props","viewBox","fill","height","rx","width","x","y","IconTable","d","Loading","id","PropTypes","arrayOf","shape","areacode","string","isRequired","date","deaths","number","infected","infected7p100k","last_modified","quarantined","recovered","_id","_rev","shortDate","getDate","getMonth","formatNum","Intl","NumberFormat","format","config","areaBlendMode","axisBottom","legend","legendOffset","legendPosition","tickSize","axisLeft","n","orient","tickPadding","tickRotation","axisRight","colors","a","color","defs","linearGradientDef","offset","opacity","enableArea","enableGridX","enableGridY","enablePoints","enableSlices","match","legends","anchor","direction","translateX","translateY","itemHeight","itemWidth","margin","top","right","bottom","left","sliceTooltip","points","slice","className","map","point","index","key","colSpan","data","xFormatted","style","backgroundColor","serieColor","serieId","yFormatted","xFormat","toLocaleDateString","xScale","type","yFormat","yScale","he","axis","value","Date","lineStyle","stroke","strokeWidth","legendOrientation","textStyle","ni","sh","sn","LineChart","docs","useState","stats","setStats","useEffect","reduce","acc","doc","arr","unshift","active","incidence","length","alignItems","display","justifyContent","markers","areacodes","state","frozen","Column","FrozenDirection","LEFT","dataKey","sortable","title","IconArrowDownRight","IconArrowUpRight","IconDot","initialSort","order","SortOrder","DESC","getClassName","rowData","forecast","undefined","getColWidth","innerWidth","numCols","newColWidth","getFill","diff","Table","window","columns","colWidth","setColWidth","setData","sortBy","setSortBy","Cell","column","docIndex","findIndex","includes","isNaN","Number","isInteger","toFixed","Icon","getIcon","sort","b","doc1","doc2","toString","localeCompare","handleResize","target","addEventListener","removeEventListener","autoProps","components","TableCell","fixed","onColumnSort","rowHeight","rowKey","registerValidSW","swUrl","addNotification","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","error","isLocalhost","Boolean","location","hostname","URL","process","href","origin","fetch","headers","response","contentType","get","status","indexOf","ready","unregister","reload","checkValidServiceWorker","console","log","i","di","t","TimeSeries","main","adapter","fromDB","ARMaxEntropy","degree","nextVal","coeff","Math","round","addIncidence","population","floor","parse","getTime","rangeStart","find","locations","fl","rz","plö","rd","sl","od","lg","row","l","db","PouchDB","replication","replicate","from","live","retry","getDocs","dateFrom","dateTo","filter","lastDate","dayjs","nextPredictions","nextForcast","reverse","set","toISOString","addPredictions","getLastModified","now","timestamp","reducer","values","notifications","notification","Object","some","v","nextState","lastModified","Error","App","params","URLSearchParams","search","useReducer","localStorage","installEvent","lastChange","sharebutton","tableview","dispatch","handleDaterange","name","handlePopstate","removeNotification","useCallback","el","document","querySelector","classList","toggle","Promise","resolve","setTimeout","message","random","onLine","on","info","pending","query","descending","include_docs","rows","r","pushState","removeItem","delete","history","registerServiceWorker","matchMedia","matches","test","platform","maxTouchPoints","e","preventDefault","fontSize","onChange","entries","label","onClick","max","min","checked","sourceUri","sourceLabel","toLocaleString","populationSourceUri","populationSourceLabel","alert","prompt","handleInstall","version","data-id","ErrorBoundary","this","wordBreak","stack","children","Component","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.faf8f5d1.chunk.js","sourcesContent":["import React from 'react'\n\nconst IconChart = props => (\n \n \n \n \n \n)\n\nexport default IconChart\n","import React from 'react'\n\nconst IconTable = props => (\n \n \n \n)\n\nexport default IconTable\n","import React from 'react'\n\nconst Loading = () => (\n
\n
Bitte warten…
\n
\n)\n\nexport default Loading\n","import PropTypes from 'prop-types'\n\nexport const docs = PropTypes.arrayOf(\n PropTypes.shape({\n areacode: PropTypes.string.isRequired,\n date: PropTypes.string.isRequired,\n deaths: PropTypes.number.isRequired,\n infected: PropTypes.number.isRequired,\n infected7p100k: PropTypes.number,\n last_modified: PropTypes.string,\n quarantined: PropTypes.number,\n recovered: PropTypes.number,\n _id: PropTypes.string.isRequired,\n _rev: PropTypes.string\n })\n)\n","export const longDate = d => d.toLocaleDateString()\n\nexport const shortDate = d => `${d.getDate()}.${d.getMonth() + 1}.`\n\nexport const { format: formatNum } = new Intl.NumberFormat('de')\n","import React, { Fragment } from 'react'\nimport { linearGradientDef } from '@nivo/core'\nimport { formatNum, longDate, shortDate } from '../../utils/display'\n\nconst config = {\n areaBlendMode: 'darken',\n axisBottom: {\n format: shortDate,\n legend: 'Zeitverlauf',\n legendOffset: 48,\n legendPosition: 'middle',\n tickSize: 8\n },\n axisLeft: {\n format: n => formatNum(n),\n legend: 'Personen',\n legendOffset: -40,\n legendPosition: 'middle',\n orient: 'left',\n tickPadding: 8,\n tickRotation: 0,\n tickSize: 0\n },\n axisRight: {\n format: n => formatNum(n),\n orient: 'right',\n tickPadding: 8,\n tickSize: 0\n },\n colors: a => a.color || '#000',\n defs: [\n linearGradientDef('gradientA', [\n { offset: 0, color: 'inherit' },\n { offset: 100, color: 'inherit', opacity: 0.1 }\n ])\n ],\n enableArea: true,\n enableGridX: false,\n enableGridY: false,\n enablePoints: false,\n enableSlices: 'x',\n fill: [{ match: '*', id: 'gradientA' }],\n legends: [\n {\n anchor: 'left',\n direction: 'column',\n translateX: 16,\n translateY: -32,\n itemHeight: 20,\n itemWidth: 0\n }\n ],\n margin: { top: 24, right: 48, bottom: 72, left: 64 },\n sliceTooltip: ({ slice: { points } }) => (\n \n {points.map((point, index) => (\n \n {!index && (\n \n \n \n \n \n )}\n \n \n \n \n \n \n \n \n ))}\n
\n {point.data.xFormatted}\n
\n \n {point.serieId}{point.data.yFormatted}
\n ),\n xFormat: longDate,\n xScale: { type: 'time' },\n yFormat: formatNum,\n yScale: { type: 'linear' }\n}\n\nexport default config\n","export default {\n he: [\n {\n axis: 'x',\n value: new Date('2020-12-16'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Lockdown',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'y',\n value: 50,\n legend: 'Grenzwert für 7-Tage-Inzidenz',\n legendPosition: 'top-right',\n lineStyle: { stroke: '#aaa', strokeWidth: 1 }\n }\n ],\n ni: [\n {\n axis: 'x',\n value: new Date('2020-05-25'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Erste Lockerungen',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-07-22'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Ferienanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-09-02'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Schulanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-10-18'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Ferienanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-11-01'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Schulanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-11-02'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: `\"Lockdown Light\"`,\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-12-16'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Lockdown',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'y',\n value: 50,\n legend: 'Grenzwert für 7-Tage-Inzidenz',\n legendPosition: 'top-right',\n lineStyle: { stroke: '#aaa', strokeWidth: 1 }\n }\n ],\n sh: [\n {\n axis: 'x',\n value: new Date('2020-05-18'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Erste Lockerungen',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-06-29'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Ferienanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-08-10'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Schulanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-10-05'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Ferienanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-10-19'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Schulanfang',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-11-02'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: `\"Lockdown Light\"`,\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'x',\n value: new Date('2020-12-16'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Lockdown',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'y',\n value: 50,\n legend: 'Grenzwert für 7-Tage-Inzidenz',\n legendPosition: 'top-right',\n lineStyle: { stroke: '#aaa', strokeWidth: 1 }\n }\n ],\n sn: [\n {\n axis: 'x',\n value: new Date('2020-12-16'),\n lineStyle: { stroke: '#ddd', strokeWidth: 1 },\n legend: 'Lockdown',\n legendPosition: 'top-right',\n legendOrientation: 'vertical',\n textStyle: { fill: '#aaa' }\n },\n {\n axis: 'y',\n value: 50,\n legend: 'Grenzwert für 7-Tage-Inzidenz',\n legendPosition: 'top-right',\n lineStyle: { stroke: '#aaa', strokeWidth: 1 }\n }\n ]\n}\n","import PropTypes from 'prop-types'\nimport React, { useEffect, useState } from 'react'\nimport { ResponsiveLine } from '@nivo/line'\nimport Loading from '../Loading'\nimport areacodes from '../../data/areacodes.json'\nimport { docs as docsPropTypes } from '../../types/docs'\nimport config from './config'\nimport markers from './markers'\n\nconst LineChart = ({ areacode, docs, ...props }) => {\n const [stats, setStats] = useState([])\n\n useEffect(() => {\n setStats(\n docs.reduce(\n (acc, doc, index, arr) => {\n acc[0].data.unshift({ x: new Date(doc.date), y: doc.deaths })\n\n doc.active &&\n acc[1].data.unshift({\n x: new Date(doc.date),\n y: doc.active\n })\n\n doc.recovered &&\n acc[2].data.unshift({\n x: new Date(doc.date),\n y: doc.recovered ?? 0\n })\n\n doc.incidence &&\n acc[3].data.unshift({\n x: new Date(doc.date),\n y: doc.incidence ?? 0\n })\n\n acc[4].data.unshift({\n x: new Date(doc.date),\n y: doc.infected\n })\n\n doc.quarantined &&\n acc[5].data.unshift({\n x: new Date(doc.date),\n y: doc.quarantined\n })\n\n return acc\n },\n [\n {\n color: '#FA5C3A',\n id: 'Todesfälle',\n data: []\n },\n {\n color: '#F79F39',\n id: 'aktive Fälle',\n data: []\n },\n {\n color: '#76CE6D',\n id: 'Genesene',\n data: []\n },\n {\n color: '#BB8DEE',\n id: '7-Tage-Inzidenz*',\n data: []\n },\n {\n color: '#E6B539',\n id: 'Infizierte',\n data: []\n },\n {\n color: '#48AFF3',\n id: 'unter Quarantäne',\n data: []\n }\n ]\n )\n )\n }, [areacode, docs])\n\n return docs.length > 0 ? (\n \n \n \n ) : (\n \n )\n}\n\nLineChart.propTypes = {\n areacode: PropTypes.string.isRequired,\n docs: docsPropTypes.isRequired\n}\n\nexport default LineChart\n","import { Column } from 'react-base-table'\n\nexport default [\n {\n frozen: Column.FrozenDirection.LEFT,\n key: 'date',\n dataKey: 'date',\n sortable: true,\n title: 'Datum'\n },\n {\n key: 'infected',\n dataKey: 'infected',\n sortable: true,\n title: 'Infizierte'\n },\n {\n key: 'quarantined',\n dataKey: 'quarantined',\n sortable: true,\n title: 'unter Quarantäne'\n },\n {\n key: 'recovered',\n dataKey: 'recovered',\n sortable: true,\n title: 'Genesene'\n },\n {\n key: 'active',\n dataKey: 'active',\n sortable: true,\n title: 'aktive'\n },\n {\n key: 'deaths',\n dataKey: 'deaths',\n sortable: true,\n title: 'Todesfälle'\n },\n {\n key: 'incidence',\n dataKey: 'incidence',\n sortable: true,\n title: '7-Tage-Inzidenz*'\n }\n]\n","import React from 'react'\n\nconst IconArrowDownRight = props => (\n \n \n \n)\n\nexport default IconArrowDownRight\n","import React from 'react'\n\nconst IconArrowUpRight = props => (\n \n \n \n)\n\nexport default IconArrowUpRight\n","import React from 'react'\n\nconst IconDot = props => (\n \n \n \n)\n\nexport default IconDot\n","import React, { useEffect, useState } from 'react'\nimport BaseTable, { AutoResizer, Column, SortOrder } from 'react-base-table'\nimport { docs as docsPropTypes } from '../../types/docs'\nimport columns from './columns'\nimport IconArrowDownRight from '../IconArrowDownRight'\nimport IconArrowUpRight from '../IconArrowUpRight'\nimport IconDot from '../IconDot'\nimport { shortDate } from '../../utils/display'\nimport './styles.css'\n\nconst initialSort = { key: 'date', order: SortOrder.DESC }\n\nconst getClassName = ({ rowData: { forecast } }) =>\n forecast ? 'is-forecast' : undefined\n\nconst getColWidth = (innerWidth, numCols) => {\n const newColWidth = (innerWidth - 96) / numCols\n return newColWidth > 125 ? newColWidth : 125\n}\n\nconst getIcon = diff => {\n if (diff < 0) {\n return IconArrowDownRight\n }\n\n if (diff > 0) {\n return IconArrowUpRight\n }\n\n return IconDot\n}\n\nconst getFill = (diff, key) => {\n if (diff < 0 || (diff > 0 && key === 'recovered')) {\n return '#76CE6D'\n }\n\n if (diff > 0 || (diff < 0 && key === 'recovered')) {\n return '#FA5C3A'\n }\n}\n\nconst Table = ({ docs }) => {\n const [colWidth, setColWidth] = useState(\n getColWidth(window.innerWidth, columns.length)\n )\n const [data, setData] = useState(docs)\n const [sortBy, setSortBy] = useState(initialSort)\n\n const Cell = ({ column: { key }, rowData: { _id } }) => {\n const docIndex = docs.findIndex(doc => doc._id === _id)\n\n if (docIndex < 0) {\n return null\n }\n\n if (key === 'date') {\n return shortDate(new Date(docs[docIndex][key]))\n }\n\n if (\n [null, ''].includes(docs[docIndex][key]) ||\n isNaN(docs[docIndex][key])\n ) {\n return docs[docIndex][key] ?? ''\n }\n\n if (\n docIndex < docs.length - 1 &&\n !isNaN(docs[docIndex + 1][key]) &&\n docs[docIndex + 1][key] !== undefined &&\n docs[docIndex + 1][key] !== null\n ) {\n let diff = docs[docIndex][key] - docs[docIndex + 1][key]\n\n if (!Number.isInteger(diff)) {\n diff = diff.toFixed(1)\n }\n\n if (diff > 0) {\n diff = '+' + diff\n }\n\n const Icon = getIcon(diff)\n\n return (\n
\n
{docs[docIndex][key]}
\n
\n \n
\n
({diff})
\n
\n )\n }\n\n return docs[docIndex][key] ?? ''\n }\n\n useEffect(() => {\n setData(\n [...docs].sort((a, b) => {\n const doc1 = sortBy.order === 'desc' ? b : a\n const doc2 = sortBy.order === 'desc' ? a : b\n\n if (isNaN(doc1[sortBy.key]) || isNaN(doc2[sortBy.key])) {\n return (doc1[sortBy.key] ?? '')\n .toString()\n .localeCompare(doc2[sortBy.key] ?? '')\n .toString()\n }\n\n return doc1[sortBy.key] - doc2[sortBy.key]\n })\n )\n }, [docs, sortBy])\n\n useEffect(() => {\n const handleResize = ({ target: { innerWidth } }) => {\n setColWidth(getColWidth(innerWidth, columns.length))\n }\n\n window.addEventListener('resize', handleResize)\n\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n return (\n
\n \n {autoProps => (\n \n {columns.map(column => (\n \n ))}\n \n )}\n \n )}\n
\n )\n}\n\nTable.propTypes = {\n docs: docsPropTypes.isRequired\n}\n\nexport default Table\n","const registerValidSW = (swUrl, addNotification) => {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n\n if (installingWorker == null) {\n return\n }\n\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n addNotification(\n 'Es ist ein Update verfügbar. Schließen Sie das Browser-Fenster/-Tab und laden Sie die App neu!'\n )\n } else {\n addNotification('Die App ist nun offline verfügbar.')\n }\n }\n }\n }\n })\n .catch(error => {\n addNotification(\n `Fehler bei der Einrichtung des Offline-Modus: ${error}`,\n 'danger'\n )\n })\n}\n\nconst checkValidServiceWorker = (swUrl, addNotification) => {\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n const contentType = response.headers.get('content-type')\n\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n registerValidSW(swUrl, addNotification)\n }\n })\n .catch(() => {})\n}\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n window.location.hostname === '[::1]' ||\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 const register = addNotification => {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n\n if (publicUrl.origin !== window.location.origin) {\n return\n }\n\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n checkValidServiceWorker(swUrl, addNotification)\n\n navigator.serviceWorker.ready.then(() => {\n console.log('Service worker is active')\n })\n } else {\n registerValidSW(swUrl, addNotification)\n }\n }\n}\n\nexport const unregister = () => {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister()\n })\n .catch(error => {\n console.error(error.message)\n })\n }\n}\n","import dayjs from 'dayjs'\nimport TimeSeries from 'timeseries-analysis'\nimport areacodes from '../data/areacodes'\n\nconst oneDay = 1000 * 60 * 60 * 24\n\nconst forecast = data =>\n ['infected', 'quarantined', 'recovered', 'deaths'].reduce((acc, key, i) => {\n for (let di = data.length - 1; di > 0; di--) {\n if (\n data[di].forecast !== true &&\n (data[di][key] === null || data[di][key] === undefined)\n ) {\n return acc\n }\n }\n\n const t = new TimeSeries.main(\n TimeSeries.adapter.fromDB(data, {\n date: 'date',\n value: key\n })\n )\n\n const coeffs = t.ARMaxEntropy({\n degree: t.data.length - 1\n })\n\n let forecast = coeffs.reduce(\n (nextVal, coeff, i) => nextVal - t.data[t.data.length - 1 - i][1] * coeff,\n 0\n )\n\n if (key === 'recovered' && forecast - t.data[t.data.length - 1][1] < 0) {\n forecast = t.data[t.data.length - 1][1]\n }\n\n return {\n ...acc,\n [key]: Math.round(forecast > 0 ? forecast : 0)\n }\n }, {})\n\nexport const addIncidence = (doc, docs, population) => {\n const d = new Date(\n (Math.floor(Date.parse(doc.date) / oneDay) - 7) * oneDay\n ).getTime()\n\n const findFn = doc =>\n new Date(Math.floor(Date.parse(doc.date) / oneDay) * oneDay).getTime() === d\n\n const rangeStart = docs.find(findFn)\n\n if (rangeStart) {\n doc.incidence = (\n ((doc.infected - rangeStart.infected) / population) *\n 100000\n ).toFixed(1)\n }\n\n return doc\n}\n\nexport const addPredictions = docs => {\n if (docs.length === 0) {\n return docs\n }\n\n const areacode = docs[0].areacode\n const lastDate = dayjs(docs[0].date)\n const nextPredictions = []\n\n for (let i = 1; i < 4; i++) {\n const nextForcast = forecast([...nextPredictions, ...docs].reverse())\n const date = lastDate.set('date', lastDate.date() + i).toISOString()\n\n if (nextForcast.deaths < docs[0].deaths) {\n nextForcast.deaths = docs[0].deaths\n }\n\n if (nextForcast.infected < docs[0].infected) {\n nextForcast.infected = docs[0].infected\n }\n\n nextPredictions.unshift({\n areacode,\n date,\n forecast: true,\n _id: `${date}-${areacode}`,\n ...nextForcast\n })\n }\n\n return [\n ...nextPredictions.map(doc =>\n addIncidence(\n {\n ...doc,\n active:\n doc.recovered !== undefined\n ? doc.infected - doc.recovered - doc.deaths\n : undefined\n },\n [...nextPredictions, ...docs],\n areacodes[areacode].population\n )\n ),\n ...docs\n ]\n}\n","import PouchDB from 'pouchdb'\nimport React, { useCallback, useEffect, useReducer } from 'react'\nimport { version } from '../package.json'\nimport IconChart from './components/IconChart'\nimport IconTable from './components/IconTable'\nimport LineChart from './components/LineChart'\nimport Loading from './components/Loading'\nimport Table from './components/Table'\nimport areacodes from './data/areacodes.json'\nimport { register as registerServiceWorker } from './service-worker'\nimport './styles.css'\nimport { formatNum } from './utils/display'\nimport { addIncidence, addPredictions } from './utils/math'\n\nconst locations = {\n fl: 'Flensburg',\n 'ks-s': 'Kassel',\n rz: 'Kreis Herzogtum Lauenburg',\n plö: 'Kreis Plön',\n rd: 'Kreis Rendsburg-Eckernförde',\n sl: 'Kreis Schleswig-Flensburg',\n od: 'Kreis Stormarn',\n 'ks-lk': 'Landkreis Kassel',\n lg: 'Landkreis Lüneburg',\n row: 'Landkreis Rotenburg',\n l: 'Leipzig'\n}\n\nconst db = new PouchDB('coronastats')\nconst replication = db.replicate.from(\n 'https://api.mundpropaganda.net/coronastats',\n { live: true, retry: true }\n)\n\nconst getDocs = (docs, { areacode, dateFrom, dateTo, forecast }) => {\n docs = docs.filter(d => !d.forecast && d.areacode === areacode).reduce(\n (acc, d, i, arr) => d.infected === arr[i + 1]?.infected ? acc : [...acc, d],\n []\n )\n\n if (dateFrom) {\n const date = new Date(dateFrom)\n docs = docs.filter(d => new Date(d.date) > date)\n }\n\n if (dateTo) {\n const date = new Date(new Date(dateTo).getTime() + 24 * 60 * 60 * 1000)\n docs = docs.filter(d => new Date(d.date) < date)\n }\n\n return forecast ? addPredictions(docs) : docs\n}\n\nconst getLastModified = data => {\n const now = new Date().getTime()\n return data.reduce((timestamp, doc) => {\n const last_modified = Date.parse(doc.last_modified)\n return last_modified < now - 3 && last_modified > timestamp\n ? last_modified\n : timestamp\n }, 0)\n}\n\nconst reducer = (state, { type, ...values }) => {\n switch (type) {\n case 'ADD_NOTIFICATION':\n return {\n ...state,\n notifications: window.innerWidth >= 576\n ? [...state.notifications, values.notification]\n : [values.notification, ...state.notifications]\n }\n\n case 'REMOVE_NOTIFICATION':\n return {\n ...state,\n notifications: state.notifications.filter(\n n => !Object.values(n).some(v => v.includes(values.id))\n )\n }\n\n case 'SET_AREACODE': {\n const nextState = {\n ...state,\n areacode: values.areacode,\n docs: getDocs(state.docs, {\n areacode: values.areacode,\n dateFrom: state.dateFrom,\n dateTo: state.dateTo,\n forecast: state.forecast\n })\n }\n\n return {\n ...nextState,\n lastModified: getLastModified(nextState.docs)\n }\n }\n\n case 'SET_DOCS': {\n const nextState = {\n ...state,\n docs: getDocs(values.docs, {\n areacode: state.areacode,\n dateFrom: state.dateFrom,\n dateTo: state.dateTo,\n forecast: state.forecast\n })\n }\n\n return {\n ...nextState,\n lastModified: getLastModified(nextState.docs)\n }\n }\n\n case 'SET_FORECAST':\n return {\n ...state,\n docs: getDocs(state.docs, {\n areacode: state.areacode,\n dateFrom: state.dateFrom,\n dateTo: state.dateTo,\n forecast: values.forecast\n }),\n forecast: values.forecast\n }\n\n case 'SET_VALUES':\n return {\n ...state,\n ...values\n }\n\n default:\n throw new Error(`Unknown action type: ${type}`)\n }\n}\n\nconst App = () => {\n const params = new URLSearchParams(window.location.search)\n\n const [state, dispatch] = useReducer(reducer, {\n areacode: params.get('areacode') || localStorage.areacode || 'fl',\n dateFrom: params.get('dateFrom') || localStorage.dateFrom || '',\n dateTo: params.get('dateTo') || localStorage.dateTo || '',\n docs: [],\n forecast: params.get('forecast') === 'true' ||\n localStorage.forecast === 'true' ||\n false,\n installEvent: undefined,\n lastChange: undefined,\n lastModified: undefined,\n notifications: [],\n sharebutton: false,\n tableview: params.get('tableview') === 'true' ||\n localStorage.tableview === 'true' ||\n false\n })\n\n const handleDaterange = ({ target: { name, value } }) =>\n dispatch({ type: 'SET_VALUES', [name]: value })\n\n const handlePopstate = (\n { state: { areacode, dateFrom, dateTo, forecast, tableview } }\n ) =>\n dispatch({\n type: 'SET_AREACODE',\n areacode,\n dateFrom,\n dateTo,\n forecast,\n tableview\n })\n\n const removeNotification = useCallback(id => {\n const el = document.querySelector(`div[data-id=\"${id}\"]`)\n\n if (el) {\n el.classList.toggle('notification-in')\n el.classList.toggle('notification-out')\n return new Promise(resolve => {\n setTimeout(\n () => resolve(dispatch({ type: 'REMOVE_NOTIFICATION', id })),\n 500\n )\n })\n } else {\n return Promise.resolve(dispatch({ type: 'REMOVE_NOTIFICATION', id }))\n }\n }, [])\n\n const addNotification = useCallback(\n (message = '', type = '', id = Math.random().toString()) => {\n dispatch({\n type: 'ADD_NOTIFICATION',\n notification: { id, message, type }\n })\n\n if (!type) {\n setTimeout(() => removeNotification(id), 5000)\n }\n\n return id\n },\n [removeNotification]\n )\n\n const handleInstall = () => {\n if (\n state.sharebutton &&\n !window.matchMedia('(display-mode: standalone)').matches\n ) {\n return alert(\n 'Bitte klicken Sie auf den Teilen-Button und wählen Sie \"Zum Startbildschirm hinzufügen\" aus!'\n )\n }\n\n if (state.installEvent) {\n state.installEvent.prompt()\n }\n }\n\n useEffect(() => {\n if (!navigator.onLine) {\n addNotification(\n 'Es besteht keine Internetverbindung. Die App befindet sich im Offline-Modus.',\n 'warning',\n 'offline'\n )\n }\n\n window.addEventListener('online', () => {\n removeNotification('offline').then(() =>\n addNotification('Die Internetverbindung wurde wiederhergestellt.')\n )\n })\n\n window.addEventListener('offline', () =>\n addNotification(\n 'Es besteht keine Internetverbindung. Die App befindet sich im Offline-Modus.',\n 'warning',\n 'offline'\n ))\n }, [addNotification, removeNotification])\n\n useEffect(() => {\n replication.on('change', info => {\n dispatch({ type: 'SET_VALUES', lastChange: info })\n\n if (\n info.pending === 0 &&\n info.docs.some(doc => doc.areacode === state.areacode)\n ) {\n addNotification('Neue Daten geladen.')\n }\n })\n\n replication.on('denied', error =>\n addNotification(\n `Konnte nicht auf Datenbank zugreifen: ${error.message}`,\n 'warning'\n ))\n\n replication.on(\n 'error',\n error => addNotification(`Datenbankfehler: ${error.message}`, 'danger')\n )\n }, [addNotification, removeNotification, state.areacode])\n\n useEffect(() => {\n db.query(`areacode/${state.areacode}`, {\n descending: true,\n include_docs: true\n }).then(\n ({ rows }) =>\n dispatch({\n type: 'SET_DOCS',\n docs: rows.map(({ doc }) =>\n addIncidence(\n doc,\n rows.map(r => r.doc),\n areacodes[state.areacode].population\n )\n )\n }),\n error => {\n if (error.status !== 404) {\n console.error(error)\n addNotification(\n `Es ist ein Fehler aufgetreten: ${error.message}`,\n 'danger'\n )\n }\n }\n )\n }, [\n addNotification,\n state.areacode,\n state.dateFrom,\n state.dateTo,\n state.lastChange\n ])\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search)\n params.set('areacode', state.areacode)\n params.set('forecast', state.forecast)\n params.set('tableview', state.tableview)\n\n localStorage.areacode = state.areacode\n localStorage.forecast = state.forecast\n localStorage.tableview = state.tableview\n\n const pushState = {\n areacode: state.areacode,\n forecast: state.forecast,\n tableview: state.tableview\n }\n\n if (state.dateFrom) {\n localStorage.dateFrom = state.dateFrom\n params.set('dateFrom', state.dateFrom)\n pushState.dateFrom = state.dateFrom\n } else {\n localStorage.removeItem('dateFrom')\n params.delete('dateFrom', state.dateFrom)\n }\n\n if (state.dateTo) {\n localStorage.dateTo = state.dateTo\n params.set('dateTo', state.dateTo)\n pushState.dateTo = state.dateTo\n } else {\n localStorage.removeItem('dateTo')\n params.delete('dateTo', state.dateTo)\n }\n\n if (window.location.search !== '?' + params.toString()) {\n window.history.pushState(pushState, '', '?' + params.toString())\n }\n\n window.addEventListener('popstate', handlePopstate)\n return () => window.removeEventListener('popstate', handlePopstate)\n }, [\n state.areacode,\n state.dateFrom,\n state.dateTo,\n state.forecast,\n state.tableview\n ])\n\n useEffect(() => {\n registerServiceWorker(addNotification)\n }, [addNotification])\n\n useEffect(() => {\n if (window.matchMedia('(display-mode: standalone)').matches) {\n return\n }\n\n if (\n /iPhone|MacIntel/.test(navigator.platform) &&\n navigator.maxTouchPoints > 1\n ) {\n return dispatch({ type: 'SET_VALUES', sharebutton: true })\n }\n\n window.addEventListener('beforeinstallprompt', e => {\n e.preventDefault()\n dispatch({ type: 'SET_VALUES', installEvent: e })\n })\n }, [])\n\n const {\n areacode,\n dateFrom,\n dateTo,\n docs,\n forecast,\n lastModified,\n notifications,\n sharebutton,\n tableview\n } = state\n\n return (\n
\n

Zeitverlauf der Corona-Fälle in

\n\n \n
\n \n dispatch({ type: 'SET_AREACODE', areacode: value })}\n style={{ margin: '0.5rem', width: 'calc(100% - 1.5rem)' }}\n value={areacode}\n >\n {Object.entries(locations).map(([value, label]) => (\n \n ))}\n \n
\n\n
\n \n dispatch({ type: 'SET_VALUES', tableview: !tableview })}\n style={{ margin: '0.5rem' }}\n type='button'\n >\n {tableview\n ? \n : }\n \n
\n
\n\n
\n \n
\n \n
\n\n
\n {docs.length === 0\n ? \n : tableview\n ? \n : (\n \n )}\n \n\n \n\n
\n {notifications.map(n => (\n removeNotification(n.id)}\n >\n {n.message}\n
\n ))}\n \n \n )\n}\n\nexport default App\n","import React, { Component } from 'react'\n\nexport default class ErrorBoundary extends Component {\n state = { error: null }\n\n static getDerivedStateFromError (error) {\n return { error }\n }\n\n componentDidCatch (error, info) {\n console.error(error, info)\n }\n\n render () {\n const { error } = this.state\n return error ? (\n
\n
\n

\n Es ist ein Fehler aufgetreten!\n

\n

\n Bitte schicken Sie einen Screenshot dieser Meldung an{' '}\n bugs@mundpropaganda.net\n !\n

\n

{error.stack}

\n
\n
\n ) : (\n this.props.children\n )\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport ErrorBoundary from './ErrorBoundary'\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n)\n"],"sourceRoot":""}