aboutsummaryrefslogtreecommitdiff
path: root/build/static/js/main.a4bfd80e.chunk.js.map
diff options
context:
space:
mode:
Diffstat (limited to 'build/static/js/main.a4bfd80e.chunk.js.map')
-rw-r--r--build/static/js/main.a4bfd80e.chunk.js.map1
1 files changed, 1 insertions, 0 deletions
diff --git a/build/static/js/main.a4bfd80e.chunk.js.map b/build/static/js/main.a4bfd80e.chunk.js.map
new file mode 100644
index 0000000..2319d2a
--- /dev/null
+++ b/build/static/js/main.a4bfd80e.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["Logo.js","gapi.js","pattern.js","Chart.js","RegexField.js","App.js","serviceWorker.js","index.js"],"names":["Logo","props","react_default","a","createElement","xmlns","viewBox","version","style","id","transform","points","fill","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontFamily","gapi_base","to_params","dict","Object","entries","map","_ref","_ref2","slicedToArray","k","v","concat","encodeURIComponent","join","getCalendars","token","fetch","access_token","method","async","then","response","json","data","items","getColors","Pattern","isRegex","value","label","classCallCheck","this","createClass","key","get","RegExp","emptyPattern","anyPattern","PatternEntry","name","idx","calPattern","eventPattern","cal","event","defaultPatternEntry","customizedLabel","cx","cy","x","y","anchor","dx","dy","textAnchor","withStyles","theme","pieChart","margin","Grid_default","container","spacing","item","xs","lg","className","classes","patternTableWrapper","PieChart","width","height","Pie","patternGraphData","dataKey","outerRadius","deepOrange","Tooltip","formatter","toFixed","calendarGraphData","innerRadius","cyan","d","i","Cell","color","RegexField","_this","pitems","options","p0","push","MenuItem_default","isEmpty","palette","primary","dark","FormControl_default","Select_default","onChange","target","fieldStyles","regex","noRegex","TextField_default","React","Component","default_chart_data","createMuiTheme","light","orange","main","contrastText","typography","useNextVariants","Dashboard","state","open","patterns","page","rowsPerPage","timeRange","Promise","resolver","chrome","identity","getAuthToken","interactive","activePattern","cached","calendars","handleChangePage","setState","handleChangeRowsPerPage","updatePattern","field","removePattern","splice","length","newPattern","toConsumableArray","analyze","startDate","endDate","start","toISOString","end","event_pms","_loop","calId","timeMin","timeMax","status","catch","e","console","log","events","all","results","cal_results","_loop2","calName","filter","p","test","filterPatterns","forEach","summary","undefined","duration","Date","dateTime","background","alert","loadPatterns","colors","gapi","calendar","cals","colorId","_this2","_this$state","rows","nDummy","Math","min","styles","root","AppBar_default","position","appBar","Toolbar_default","disableGutters","toolbar","Typography_default","component","variant","noWrap","title","verticalAlign","marginRight","content","appBarSpacer","CssBaseline_default","md","fullWidth","FormGroup_default","gutterBottom","IconButton_default","marginBottom","marginLeft","onClick","AddCircle_default","Table_default","patternTable","TableHead_default","TableRow_default","patternHead","s","TableCell_default","TableBody_default","slice","onMouseOver","onMouseOut","CustomText","elem","fieldNoRegex","fieldRegex","right","display","DeleteOutlined_default","cursor","colSpan","TablePagination_default","rowsPerPageOptions","count","backIconButtonProps","aria-label","nextIconButtonProps","onChangePage","onChangeRowsPerPage","textAlign","react_dates","startDateId","endDateId","onDatesChange","_ref3","focusedInput","onFocusChange","isOutsideRange","buttonSpacer","Button_default","Chart","TextField","withTheme","RegexField_RegexField","any","zIndex","drawer","transition","transitions","create","easing","sharp","leavingScreen","flexGrow","sectionTitle","flex","mixins","padding","unit","overflow","overflowX","overflowY","minWidth","fab","Boolean","window","location","hostname","match","ReactDOM","render","App","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.a4bfd80e.chunk.js","sourcesContent":["import React from 'react';\nexport default (props) =>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 98.905998 93.557997\"\n version=\"1.1\"\n style={props.style}>\n <g id=\"g13\"\n transform=\"translate(-153.533,-203.047)\">\n <g id=\"g29\">\n <g\n id=\"g27\">\n <polygon\n id=\"polygon7\"\n points=\"252.439,241.924 234.556,288.703 185.103,296.605 153.533,257.728 171.416,210.949 220.869,203.047 \"\n style={{fill: '#ff8000'}} />\n <g\n id=\"g11\"\n transform=\"translate(167.24355,224.20734)\">\n <text\n id=\"text9\"\n style={{fontStyle:'normal',\n fontVariant:'normal',\n fontWeight:'normal',\n fontStretch:'normal',\n fontSize:75,\n fontFamily:'TypoPRO Fantasque Sans Mono',\n fill:'#ffeade'}}\n transform=\"translate(0.586,49.072)\">Cr</text>\n </g>\n </g>\n </g>\n </g>\n </svg>\n","/* global chrome */\nconst gapi_base = 'https://www.googleapis.com/calendar/v3';\n\nfunction to_params(dict) {\n return Object.entries(dict).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');\n}\n\nexport function getAuthToken() {\n return new Promise(resolver =>\n chrome.identity.getAuthToken(\n {interactive: true}, token => resolver(token)));\n}\n\nexport function getCalendars(token) {\n return fetch(gapi_base + '/users/me/calendarList?' + to_params({access_token: token}),\n { method: 'GET', async: true })\n .then(response => response.json())\n .then(data => data.items);\n}\n\nexport function genEventsGetter(calId, timeMin, timeMax) {\n return token => fetch(gapi_base + '/calendars/' + calId + '/events?' + to_params({\n access_token: token,\n timeMin,\n timeMax\n }), { method: 'GET', async: true })\n .then(response => {\n if (response.status === 200)\n return response.json()\n else throw `got response ${response.status}`;\n })\n .catch(e => { console.log(e); return []; })\n .then(data => data.items);\n}\n\nexport function getColors(token) {\n return fetch(gapi_base + '/colors?' + to_params({access_token: token}), { method: 'GET', async: true })\n .then(response => response.json());\n}\n","export class Pattern {\n constructor(id, isRegex, value, label) {\n this.id = id;\n this.isRegex = isRegex;\n this.value = value;\n this.label = label;\n }\n\n get regex() { return new RegExp(this.isRegex ? this.value : `^${this.value}$`); }\n get isEmpty() { return this.label === null; }\n static emptyPattern = () => new Pattern(0, true, '', null);\n static anyPattern = () => new Pattern('any', true, '.*', 'Any');\n}\n\nexport class PatternEntry {\n constructor(name, idx, calPattern, eventPattern) {\n this.name = name;\n this.idx = idx;\n this.cal = calPattern;\n this.event = eventPattern;\n }\n\n static defaultPatternEntry = (idx) => new PatternEntry('', idx, Pattern.emptyPattern(), Pattern.anyPattern());\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Grid from '@material-ui/core/Grid';\nimport deepOrange from '@material-ui/core/colors/deepOrange';\nimport cyan from '@material-ui/core/colors/cyan';\nimport { PieChart, Pie, Cell, Tooltip } from 'recharts';\n\nconst styles = theme => ({\n pieChart: {\n margin: '0 auto',\n }\n});\n\nfunction customizedLabel(props) {\n const {cx, cy, x, y, fill, name} = props;\n let anchor = \"middle\";\n const EPS = 2;\n let dx = 0;\n let dy = 0;\n if (x < cx - EPS) {\n dx = -5;\n anchor = \"end\"\n } else if (x > cx + EPS) {\n dx = 5;\n anchor = \"start\";\n }\n\n if (y < cy - EPS) {\n dy = -5;\n } else if (y > cy + EPS) {\n dy = 10;\n }\n\n return (<text x={x} y={y} dx={dx} dy={dy} fill={fill} textAnchor={anchor}>{`${name}`}</text>);\n}\n\nfunction ChromiclePieChart(props) {\n return (\n <Grid container spacing={0}>\n <Grid item xs={12} lg={6}>\n <div className={props.classes.patternTableWrapper}>\n <PieChart width={400} height={250} className={props.classes.pieChart}>\n <Pie data={props.patternGraphData}\n dataKey='value'\n cx={200}\n cy={125}\n outerRadius={60}\n fill={deepOrange[300]}\n label={customizedLabel}/>\n <Tooltip formatter={(value) => `${value.toFixed(2)} hr`}/>\n </PieChart>\n </div>\n </Grid>\n <Grid item xs={12} lg={6}>\n <div className={props.classes.patternTableWrapper}>\n <PieChart width={400} height={250} className={props.classes.pieChart}>\n <Pie data={props.calendarGraphData}\n dataKey='value'\n cx={200}\n cy={125}\n innerRadius={40}\n outerRadius={70}\n fill={cyan[300]}\n label={customizedLabel}>\n {props.calendarGraphData.map((d, i) => <Cell key={i} fill={d.color}/>)}\n </Pie>\n <Tooltip formatter={(value) => `${value.toFixed(2)} hr`}/>\n </PieChart>\n </div>\n </Grid>\n </Grid>);\n}\n\nChromiclePieChart.propTypes = {\n patternGraphData: PropTypes.array.isRequired,\n calendarGraphData: PropTypes.array.isRequired,\n};\n\nexport default withStyles(styles)(ChromiclePieChart);\n","import React from 'react';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport { Pattern } from './pattern';\n\nclass RegexField extends React.Component {\n render() {\n var pitems = this.props.options;\n var p0 = new Pattern.emptyPattern();\n let items = [];\n pitems[p0.id] = p0;\n for (let id in pitems)\n items.push(\n <MenuItem key={id} value={id}>\n {!pitems[id].isEmpty ?\n pitems[id].label :\n <span style={{color: this.props.theme.palette.primary.dark}}>Custom</span>}\n </MenuItem>);\n return (\n <FormControl>\n <span>\n <Select\n value={this.props.value.id}\n onChange={event => {\n let value;\n if (pitems[event.target.value].label == null) {\n value = new Pattern(0, true,\n this.props.value.isRegex ?\n this.props.value.value :\n `^${this.props.value.value}$`, null);\n } else {\n value = pitems[event.target.value];\n }\n this.props.onChange({target: {value}});\n }}\n className={this.props.value.isRegex ?\n this.props.fieldStyles.regex :\n this.props.fieldStyles.noRegex}>{items}</Select>\n {this.props.value.label == null && (\n <TextField\n value={this.props.value.value}\n onChange={event =>\n this.props.onChange({target: { value: new Pattern(0, true, event.target.value, null)}})} />\n )}\n </span>\n </FormControl>);\n }\n}\n\nexport function CalendarField(props) {\n let options = {};\n for (let id in props.cached.calendars) {\n options[id] = new Pattern(id, false,\n props.cached.calendars[id].name,\n props.cached.calendars[id].name);\n }\n return (\n <RegexField\n value={props.value}\n options={options}\n fieldStyles={props.fieldStyles}\n onChange={props.onChange}\n theme={props.theme} />);\n}\n\nexport function EventField(props) {\n let any = Pattern.anyPattern();\n let options = {};\n options[any.id] = any;\n return (\n <RegexField\n value={props.value}\n options={options}\n fieldStyles={props.fieldStyles}\n onChange={props.onChange}\n theme={props.theme}/>);\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport 'typeface-roboto';\nimport 'react-dates/initialize';\nimport 'react-dates/lib/css/_datepicker.css';\nimport { DateRangePicker } from 'react-dates';\nimport { withStyles, withTheme } from '@material-ui/core/styles';\nimport { MuiThemeProvider, createMuiTheme } from '@material-ui/core/styles';\nimport orange from '@material-ui/core/colors/orange';\nimport cyan from '@material-ui/core/colors/cyan';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableRow from '@material-ui/core/TableRow';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TablePagination from '@material-ui/core/TablePagination';\nimport Paper from '@material-ui/core/Paper';\nimport Button from '@material-ui/core/Button';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport Grid from '@material-ui/core/Grid';\nimport DeleteOutlinedIcon from '@material-ui/icons/DeleteOutlined';\nimport AddCircleIcon from '@material-ui/icons/AddCircle';\nimport IconButton from '@material-ui/core/IconButton';\nimport Logo from './Logo';\nimport * as gapi from './gapi';\nimport { Pattern, PatternEntry } from './pattern';\nimport PieChart from './Chart';\nimport { CalendarField, EventField } from './RegexField';\n\nconst default_chart_data = [{name: 'Work', value: 10, color: cyan[300]},\n {name: 'Wasted', value: 10, color: cyan[300]}];\n\nconst theme = createMuiTheme({\n palette: {\n primary: {\n light: orange[300],\n main: orange[500],\n dark: orange[700],\n contrastText: \"#fff\"\n }\n },\n typography: {\n useNextVariants: true,\n }\n});\n\nfunction filterPatterns(patterns, calName) {\n return patterns.filter(p => {\n return p.cal.regex.test(calName);\n });\n}\n\nconst styles = theme => ({\n root: {\n display: 'flex',\n height: '100vh',\n },\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n transition: theme.transitions.create(['width', 'margin'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen,\n }),\n },\n title: {\n flexGrow: 1,\n },\n sectionTitle: {\n flex: '0 0 auto'\n },\n appBarSpacer: theme.mixins.toolbar,\n content: {\n flexGrow: 1,\n padding: theme.spacing.unit * 3,\n overflow: 'auto',\n },\n buttonSpacer: {\n marginBottom: theme.spacing.unit * 4,\n },\n patternTableWrapper: {\n overflowX: 'auto',\n overflowY: 'hidden'\n },\n patternTable: {\n minWidth: 600\n },\n fab: {\n margin: theme.spacing.unit,\n },\n fieldNoRegex: {\n width: 200\n },\n fieldRegex: {\n marginRight: '0.5em'\n }\n});\n\nclass Dashboard extends React.Component {\n state = {\n open: true,\n patterns: [],\n page: 0,\n rowsPerPage: 5,\n timeRange: null,\n token: gapi.getAuthToken(),\n patternGraphData: default_chart_data,\n calendarGraphData: default_chart_data,\n activePattern: null\n };\n\n cached = {\n calendars: {}\n };\n\n static patternHead = [\n {label: \"Name\", field: \"name\", elem: TextField},\n {label: \"Calendar\", field: \"cal\", elem: withTheme(theme)(CalendarField)},\n {label: \"Event\", field: 'event', elem: withTheme(theme)(EventField)}];\n\n handleChangePage = (event, page) => {\n this.setState({ page });\n };\n\n handleChangeRowsPerPage = event => {\n this.setState({ rowsPerPage: event.target.value });\n };\n\n updatePattern = (field, idx, value) => {\n let patterns = this.state.patterns;\n patterns[idx][field] = value;\n this.setState({ patterns });\n };\n\n removePattern = idx => {\n let patterns = this.state.patterns;\n patterns.splice(idx, 1);\n for (let i = 0; i < patterns.length; i++)\n patterns[i].idx = i;\n this.setState({ patterns });\n };\n\n newPattern = () => {\n let patterns = [PatternEntry.defaultPatternEntry(), ...this.state.patterns];\n for (let i = 1; i < patterns.length; i++)\n patterns[i].idx = i;\n \tthis.setState({ patterns });\n };\n\n analyze = () => {\n if (!(this.state.startDate && this.state.endDate)) {\n alert(\"Please choose a valid time range.\");\n return;\n }\n let start = this.state.startDate.toISOString();\n let end = this.state.endDate.toISOString();\n let event_pms = [];\n for (let id in this.cached.calendars) {\n event_pms.push(\n this.state.token\n .then(gapi.genEventsGetter(id, start, end))\n .then(items => this.cached.calendars[id].events = items));\n }\n\n Promise.all(event_pms).then(() => {\n let results = {}; // pattern idx => time\n let cal_results = {}; // cal id => time\n for (let i = 0; i < this.state.patterns.length; i++)\n results[i] = 0;\n for (let id in this.cached.calendars) {\n let patterns = filterPatterns(this.state.patterns, this.cached.calendars[id].name);\n if (!this.cached.calendars[id].events) continue;\n this.cached.calendars[id].events.forEach(event => {\n if (event.status !== \"confirmed\") return;\n patterns.forEach(p => {\n if (!p.event.regex.test(event.summary)) return;\n if (cal_results[id] === undefined) {\n cal_results[id] = 0;\n }\n let duration = (new Date(event.end.dateTime) - new Date(event.start.dateTime)) / 60000;\n results[p.idx] += duration;\n cal_results[id] += duration;\n });\n });\n }\n let patternGraphData = [];\n let calendarGraphData = [];\n for (let i = 0; i < this.state.patterns.length; i++) {\n patternGraphData.push({ name: this.state.patterns[i].name, value: results[i] / 60.0 });\n }\n for (let id in cal_results) {\n calendarGraphData.push({\n name: this.cached.calendars[id].name,\n value: (cal_results[id] / 60.0),\n color: this.cached.calendars[id].color.background});\n }\n this.setState({ patternGraphData, calendarGraphData });\n });\n };\n\n loadPatterns = () => {\n let token = this.state.token;\n let colors = token.then(gapi.getColors).then(color => {\n return color.calendar;\n });\n let cals = token.then(gapi.getCalendars);\n Promise.all([colors, cals]).then(([colors, items]) => {\n items.forEach(item => {\n this.cached.calendars[item.id] = {\n name: item.summary,\n events: {},\n color: colors[item.colorId]\n };\n });\n this.setState({ patterns: items.map((item, idx) => {\n return new PatternEntry(item.summary, idx,\n new Pattern(item.id, false, item.summary, item.summary),\n Pattern.anyPattern());\n })});\n });\n };\n\n render() {\n const { classes } = this.props;\n const { patterns, rows, rowsPerPage, page } = this.state;\n const nDummy = rowsPerPage - Math.min(rowsPerPage, patterns.length - page * rowsPerPage);\n\n return (\n <MuiThemeProvider theme={theme}>\n <div className={classes.root}>\n <AppBar\n position=\"absolute\"\n className={classes.appBar}>\n <Toolbar disableGutters={!this.state.open} className={classes.toolbar}>\n <Typography component=\"h1\" variant=\"h6\" color=\"inherit\" noWrap className={classes.title}>\n <Logo style={{width: '2em', verticalAlign: 'bottom', marginRight: '0.2em'}}/>Chromicle\n </Typography>\n </Toolbar>\n </AppBar>\n <main className={classes.content}>\n <div className={classes.appBarSpacer} />\n <Grid container spacing={16}>\n <CssBaseline />\n <Grid item md={6} xs={12}>\n <FormControl fullWidth={true}>\n <FormGroup>\n <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n Event Patterns\n <IconButton\n style={{marginBottom: '0.12em', marginLeft: '0.5em'}}\n onClick={() => this.newPattern()}><AddCircleIcon /></IconButton>\n </Typography>\n <div className={classes.patternTableWrapper}>\n <Table className={classes.patternTable}>\n <TableHead>\n <TableRow>{Dashboard.patternHead.map((s, i) => (<TableCell key={i}>{s.label}</TableCell>))}</TableRow>\n </TableHead>\n <TableBody>\n {patterns.slice(page * rowsPerPage, (page + 1) * rowsPerPage).map(p => (\n <TableRow\n onMouseOver={() => this.setState({ activePattern: p.idx })}\n onMouseOut={() => this.setState({ activePattern: null })}>\n {Dashboard.patternHead.map(s => {\n const CustomText = s.elem;\n return (\n <TableCell>\n <CustomText\n value={p[s.field]}\n cached={this.cached}\n fieldStyles={{noRegex: classes.fieldNoRegex, regex: classes.fieldRegex}}\n onChange={event => this.updatePattern(s.field, p.idx, event.target.value)}/>\n </TableCell>)})}\n <span style={(this.state.activePattern === p.idx &&\n { position: 'absolute', right: 0, height: 48 }) ||\n { display: 'none' }}>\n <DeleteOutlinedIcon\n style={{ height: '100%', cursor: 'pointer' }}\n onClick={() => this.removePattern(p.idx)} />\n </span>\n </TableRow>))}\n {nDummy > 0 && (\n <TableRow style={{ height: 48 * nDummy }}>\n <TableCell colSpan={Dashboard.patternHead.length} />\n </TableRow>)}\n </TableBody>\n </Table>\n </div>\n <TablePagination\n rowsPerPageOptions={[5, 10, 25]}\n component=\"div\"\n count={patterns.length}\n rowsPerPage={rowsPerPage}\n page={page}\n backIconButtonProps={{'aria-label': 'Previous Page'}}\n nextIconButtonProps={{'aria-label': 'Next Page'}}\n onChangePage={this.handleChangePage}\n onChangeRowsPerPage={this.handleChangeRowsPerPage}/>\n </FormGroup>\n <FormGroup>\n \t <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n \t Time Range\n \t </Typography>\n <div style={{textAlign: 'center'}}>\n <DateRangePicker\n \t\t\t startDate={this.state.startDate} // momentPropTypes.momentObj or null,\n \t\t\t startDateId=\"your_unique_start_date_id\" // PropTypes.string.isRequired,\n \t\t\t endDate={this.state.endDate} // momentPropTypes.momentObj or null,\n \t\t\t endDateId=\"your_unique_end_date_id\" // PropTypes.string.isRequired,\n \t\t\t onDatesChange={({ startDate, endDate }) => {\n //if (startDate && endDate)\n // this.setState({ timeRange: [startDate.toISOString(), endDate.toISOString()]});\n this.setState({ startDate, endDate });\n }} // PropTypes.func.isRequired,\n \t\t\t focusedInput={this.state.focusedInput} // PropTypes.oneOf([START_DATE, END_DATE]) or null,\n \t\t\t onFocusChange={focusedInput => this.setState({ focusedInput })} // PropTypes.func.isRequired,\n isOutsideRange={() => false}/>\n </div>\n </FormGroup>\n <div className={classes.buttonSpacer} />\n <Grid container spacing={16}>\n <Grid item md={6} xs={12}>\n <FormGroup>\n <Button variant=\"contained\" color=\"primary\" onClick={this.loadPatterns}>Load</Button>\n </FormGroup>\n </Grid>\n <Grid item md={6} xs={12}>\n <FormGroup>\n <Button variant=\"contained\" color=\"primary\" onClick={this.analyze}>Analyze</Button>\n </FormGroup>\n </Grid>\n </Grid>\n </FormControl>\n </Grid>\n <Grid item md={6} xs={12}>\n <Typography variant=\"h6\" component=\"h1\" gutterBottom>\n Graph\n </Typography>\n <PieChart\n patternGraphData={this.state.patternGraphData}\n calendarGraphData={this.state.calendarGraphData}/>\n </Grid>\n </Grid>\n </main>\n </div>\n </MuiThemeProvider>);\n }\n}\n\nDashboard.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(Dashboard);\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file