{"version":3,"sources":["components/LogResult/LogResult.jsx","components/LogEntryForm/LogEntryForm.jsx","components/LogSummary/LogSummary.jsx","components/LogResults/LogResults.jsx","helpers/localStorage.js","components/Home/Home.jsx","components/AppInfo/AppInfo.jsx","components/About/About.jsx","components/Header/Header.jsx","containers/App.js","serviceWorker.js","index.js"],"names":["LogResult","props","classes","makeStyles","root","width","margin","titleWrapper","textOverflow","overflow","title","fontSize","pos","marginBottom","deleteWrapper","position","active","background","inactive","backgroundColor","deleteBtn","color","border","borderRadius","fontWeight","padding","height","cursor","top","right","iconDivider","display","paddingLeft","optionWrapper","optionIconShoe","marginLeft","optionIconInsole","useStyles","log","logOptions","isNewShoe","push","isNewInsole","Card","className","isActive","CardContent","Grid","container","justify","item","Typography","noWrap","variant","location","moment","date","format","distance","icon","faRunning","faShoePrints","CardActions","onClick","delete","id","defaultProps","dateInputRef","React","createRef","LogEntryForm","theme","flexGrow","submitBtn","error","resultWrapper","marginTop","checkbox","input","checkboxlabel","marginRight","initialValues","templateLog","handleChange","name","setFunc","e","target","type","checked","value","validationSchema","Yup","required","typeError","max","min","onSubmit","values","setSubmitting","resetForm","parseFloat","change","current","focus","handleSubmit","formik","autoComplete","noValidate","xs","sm","Input","placeholder","inputRef","getFieldProps","onChange","setFieldValue","component","FormControlLabel","control","Checkbox","label","Button","LogSummary","logs","totalDistance","map","l","reduce","sum","totalLogs","length","Fragment","LogResults","flexWrap","justifyContent","key","uuidv4","storeData","localStorage","setItem","JSON","stringify","err","console","Home","useState","parse","getItem","getData","state","setState","useEffect","val","newVal","len","slice","newState","filter","i","AppInfo","href","About","Header","inner","about","textAlign","nav","listStyleType","s","to","Divider","App","Container","basename","path","exact","Boolean","window","hostname","match","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.c0015155.chunk.js","sourcesContent":["import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Card from \"@material-ui/core/Card\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Typography from \"@material-ui/core/Typography\";\nimport CardContent from \"@material-ui/core/CardContent\";\nimport CardActions from \"@material-ui/core/CardActions\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport moment from \"moment\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faRunning } from \"@fortawesome/free-solid-svg-icons\";\nimport { faShoePrints } from \"@fortawesome/free-solid-svg-icons\";\n\nconst LogResult = (props) => {\n const useStyles = makeStyles({\n root: {\n width: 275,\n margin: \".4rem\",\n },\n titleWrapper: {\n textOverflow: \"ellipsis\",\n width: 210,\n overflow: \"hidden\",\n },\n title: {\n fontSize: 24,\n },\n pos: {\n marginBottom: 12,\n },\n deleteWrapper: {\n position: \"relative\",\n },\n active: {\n background:\n \"linear-gradient(90deg, rgba(0,212,255,1) 0%, rgba(0,212,255,1) 49%, rgba(51,128,177,1) 100%);\",\n },\n inactive: {\n backgroundColor: \"#e0f8ff\",\n },\n deleteBtn: {\n backgroundColor: \"#e74c3c\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"50%\",\n fontWeight: 700,\n padding: \"5px 8px\",\n width: 40,\n height: 40,\n cursor: \"pointer\",\n position: \"absolute\",\n top: \"-7px\",\n right: \"-7px\",\n },\n iconDivider: {\n display: 'inline-block',\n paddingLeft: '10px'\n },\n optionWrapper: {\n fontSize: 12,\n },\n optionIconShoe: {\n marginLeft: '7px',\n fontSize: \"110%\",\n },\n optionIconInsole: {\n marginLeft: '7px',\n fontSize: \"90%\",\n },\n });\n\n const classes = useStyles();\n const log = props.log;\n\n // options\n const logOptions = [];\n if (log.isNewShoe) logOptions.push(\"New shoes\");\n if (log.isNewInsole) logOptions.push(\"New insoles\");\n\n return (\n \n \n \n \n
\n \n {log.location}\n \n
\n \n {moment(log.date).format(\"MM/DD/YYYY\")}\n \n
\n Distance: {log.distance}\n
\n {log.isNewShoe && (\n \n )}\n {log.isNewInsole && (\n \n )}\n
\n
\n
\n {props.isActive ? (\n \n \n props.delete(log.id)}\n >\n \n \n \n \n ) : null}\n
\n
\n \n );\n};\n\nLogResult.defaultProps = {\n isActive: true,\n};\n\nLogResult.propTypes = {\n log: PropTypes.object.isRequired,\n delete: PropTypes.func,\n isActive: PropTypes.bool,\n};\n\nexport default LogResult;\n","import React from \"react\";\nimport LogResult from \"../LogResult/LogResult\";\nimport PropTypes from \"prop-types\";\nimport { Grid, Button, Input } from \"@material-ui/core\";\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport { Formik, Form, ErrorMessage } from \"formik\";\nimport moment from \"moment\";\nimport * as Yup from \"yup\";\n\nconst dateInputRef = React.createRef();\n\nconst LogEntryForm = (props) => {\n const useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n },\n submitBtn: {},\n error: {\n display: \"inline-block\",\n paddingLeft: \".5rem\",\n color: \"red\",\n },\n resultWrapper: {\n marginTop: \".5em\",\n },\n checkbox: {\n paddingLeft: 0,\n },\n input: {\n margin: \".8rem 0\",\n },\n checkboxlabel: {\n marginRight: \"3em\",\n },\n }));\n\n const initialValues = {\n location: \"\",\n distance: \"\",\n date: moment().format(\"YYYY-MM-DD\"),\n isNewShoe: true,\n isNewInsole: false,\n };\n const templateLog = { ...initialValues };\n\n const classes = useStyles();\n\n const handleSubmit = (values) => {\n values.distance = parseFloat(values.distance);\n props.change({ ...values });\n dateInputRef.current.focus();\n };\n\n const handleChange = (name, setFunc, e) => {\n if (e.target.type === \"checkbox\") {\n templateLog[name] = e.target.checked;\n setFunc(name, e.target.checked);\n } else {\n templateLog[name] = e.target.value;\n setFunc(name, e.target.value);\n }\n };\n\n return (\n {\n handleSubmit(values);\n setSubmitting(false);\n\n // formik doesn't appear to reset checkboxes\n resetForm();\n }}\n >\n {(formik) => (\n \n \n \n
\n \n handleChange(\"date\", formik.setFieldValue, e)\n }\n />\n \n
\n
\n \n handleChange(\"location\", formik.setFieldValue, e)\n }\n />\n \n
\n
\n \n handleChange(\"distance\", formik.setFieldValue, e)\n }\n />\n \n
\n
\n \n handleChange(\"isNewShoe\", formik.setFieldValue, e)\n }\n />\n }\n label=\"New shoes\"\n />\n \n handleChange(\"isNewInsole\", formik.setFieldValue, e)\n }\n />\n }\n label=\"New insoles\"\n />\n
\n
\n \n \n \n
\n\n \n
\n \n Submit\n \n
\n
\n \n )}\n \n );\n};\n\nLogEntryForm.defaultProps = {};\n\nLogEntryForm.propTypes = {\n change: PropTypes.func.isRequired,\n};\n\nexport default LogEntryForm;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst LogSummary = (props) => {\n const logs = props.logs;\n const totalDistance = logs\n .map((l) => l.distance)\n .reduce((sum, current) => sum + current, 0);\n const totalLogs = logs.length;\n\n return (\n \n {logs.length ? (\n

\n {totalLogs} log(s), total distance {\" \"}\n {totalDistance}\n

\n ) : null}\n
\n );\n};\n\nLogSummary.propTypes = {\n logs: PropTypes.array,\n};\n\nexport default LogSummary;\n","import React from 'react'\nimport PropTypes from 'prop-types';\nimport LogResult from '../LogResult/LogResult';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst LogResults = (props) => {\n\n const useStyles = makeStyles((theme) => ({\n root: {\n marginTop: '1rem',\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-start'\n }\n }));\n\n const classes = useStyles();\n\n return (\n
\n {props.logs.length > 0 &&\n <>\n {props.logs.map(log => (\n \n ))}\n \n }\n
\n );\n};\n\nLogResults.propTypes = {\n logs: PropTypes.array,\n delete: PropTypes.func\n};\n\nexport default LogResults;","export const getData = (key) => {\n\tif (!localStorage) return;\n\n\ttry {\n\t\treturn JSON.parse(localStorage.getItem(key));\n\t} catch (err) {\n\t\tconsole.error(`Error getting item ${key} from localStorage`, err);\n\t}\n};\n\nexport const storeData = (key, item) => {\n\tif (!localStorage) return;\n\n\ttry {\n\t\treturn localStorage.setItem(key, JSON.stringify(item));\n\t} catch (err) {\n\t\tconsole.error(`Error storing item ${key} to localStorage`, err);\n\t}\n};\n","import React, { useState, useEffect } from \"react\";\nimport \"./Home.css\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport LogEntryForm from \"../LogEntryForm/LogEntryForm\";\nimport LogSummary from \"../LogSummary/LogSummary\";\nimport LogResults from \"../LogResults/LogResults\";\nimport { getData, storeData } from \"../../helpers/localStorage\";\n\nconst Home = () => {\n const initialState = () => getData(\"data\") || [];\n const [state, setState] = useState(initialState);\n\n const useStyles = makeStyles((theme) => ({\n root: {\n margin: \".5rem 0\",\n },\n }));\n\n const classes = useStyles();\n\n useEffect(() => {\n storeData(\"data\", state);\n }, [state]);\n\n const newLogEntryHandler = (val) => {\n val.id = uuidv4();\n let newVal = [...state, val];\n let len = newVal.length;\n if (len > 7) newVal = newVal.slice(1, len);\n setState(newVal);\n };\n\n const deleteHandler = (id) => {\n console.log(\"delete handler called\");\n storeData(\"lastState\", state);\n let newState = state.filter((i) => {\n return i.id !== id;\n });\n setState(newState);\n };\n\n return (\n
\n \n \n \n
\n );\n};\n\nexport default Home;\n","import React from \"react\";\nimport Typography from \"@material-ui/core/Typography\";\nimport { makeStyles } from \"@material-ui/core/styles\";\n\nconst AppInfo = () => {\n const useStyles = makeStyles((theme) => ({\n root: {\n },\n }));\n\n const classes = useStyles();\n\n return (\n
\n \n This React demo app uses features\n such as{\" \"}\n routing,{\" \"}\n \n local storage\n \n , Material-UI,{\" \"}\n Formik (forms),{\" \"}\n Yup (form validation), and{\" \"}\n Font Awesome (icons). It uses a\n pure functional component model using React v16.\n \n
\n );\n};\n\nAppInfo.propTypes = {};\n\nexport default AppInfo;\n","import React from \"react\";\nimport Typography from \"@material-ui/core/Typography\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport AppInfo from \"../AppInfo/AppInfo\";\n\nconst About = () => {\n const useStyles = makeStyles((theme) => ({\n root: {\n margin: \"1rem 0\",\n },\n title: {\n color: \"#536ade\",\n },\n }));\n\n const classes = useStyles();\n\n return (\n
\n \n About\n \n \n
\n );\n};\n\nAbout.propTypes = {};\n\nexport default About;\n","import React from \"react\";\nimport { Grid } from \"@material-ui/core\";\nimport Typography from \"@material-ui/core/Typography\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faRunning } from \"@fortawesome/free-solid-svg-icons\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Divider from \"@material-ui/core/Divider\";\nimport { Link } from \"react-router-dom\";\n\nconst Header = () => {\n const useStyles = makeStyles((theme) => ({\n root: {\n margin: \"1rem 0\",\n },\n inner: {\n marginBottom: '1rem',\n },\n title: {\n color: \"#536ade\",\n },\n about: {\n textAlign: \"right\",\n },\n nav: {\n listStyleType: \"none\",\n padding: 0,\n margin: 0,\n },\n }));\n\n const classes = useStyles();\n\n return (\n
\n
\n \n \n \n Running Log \n \n \n \n \n \n \n
\n \n
\n );\n};\n\nexport default Header;\n","import React from \"react\";\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\nimport Home from \"../components/Home/Home\";\nimport About from \"../components/About/About\";\nimport Header from \"../components/Header/Header\";\nimport { Container } from \"@material-ui/core\";\nimport { makeStyles } from \"@material-ui/core/styles\";\n\nconst App = () => {\n const useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n },\n }));\n\n const classes = useStyles();\n\n return (\n \n \n
\n \n \n \n \n
\n
\n );\n};\n\nexport default App;\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 https://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.0/8 are 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 https://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 https://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 headers: { 'Service-Worker': 'script' },\n })\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\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './containers/App'\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\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: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}