{"version":3,"sources":["components/Shared/Header.tsx","components/Home/charts/YearProgress.tsx","components/Home/Charts.tsx","localStorage.ts","components/Home/AddReminder.tsx","components/Home/Reminders.tsx","components/Home/Home.tsx","components/Shared/Loading.tsx","components/FitPlan/FitPlanCell.tsx","components/FitPlan/FitPlan.tsx","components/Shared/NotFound.tsx","components/App.tsx","serviceWorker.ts","index.tsx"],"names":["Header","className","to","title","activeClassName","YearProgress","getPercentage","now","Date","start","getFullYear","diff","getTime","numberOfDays","Math","floor","style","width","Charts","loadState","id","serializedState","localStorage","getItem","JSON","parse","err","saveState","state","stringify","setItem","console","log","AddReminder","props","useState","isEditing","setIsEditing","inputField","useRef","onSubmit","e","preventDefault","current","value","callback","ref","type","autoFocus","onClick","Reminders","namespace","daily","setDaily","weekly","setWeekly","monthly","setMonthly","renderReminder","content","index","key","filter","v","i","deleteReminder","useEffect","text","concat","map","Home","Loading","FitPlanCell","setText","trim","onChange","input","target","FitPlan","stateId","columnHeaders","daysOfWeek","isLoading","setLoading","initNewDataTable","foodData","setFoodData","fitnessData","setFitnessData","result","header","dayOfWeek","dayOfWeekIndex","Fragment","rowSpan","colHeader","newValue","columnHeader","newFoodData","handleFoodSubmit","newFitnessData","handleFitnessSubmit","NotFound","App","exact","path","component","Boolean","window","location","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.c8070a5a.chunk.js","sourcesContent":["import React from 'react';\nimport { NavLink } from 'react-router-dom';\nimport './Header.css';\n\nconst Header: React.FC = () => {\n return (\n
\n
\n \n

Spendy

\n
\n \n
\n
\n );\n}\n\nexport default Header;\n","import React from 'react';\nimport './YearProgress.css';\n\nconst YearProgress: React.FC = () => {\n function getPercentage(): number {\n const now = new Date();\n const start = new Date(now.getFullYear(), 0, 0);\n const diff = now.getTime() - start.getTime();\n const oneDay = 1000 * 60 * 60 * 24;\n const numberOfDays = Math.floor(diff / oneDay);\n\n return Math.floor(numberOfDays / 366 * 100);\n }\n\n return (\n
\n

Year Progress

\n
\n
\n
\n {getPercentage()}%\n
\n );\n}\n\nexport default YearProgress;\n","import React from 'react';\nimport YearProgress from './charts/YearProgress';\n\nconst Charts: React.FC = () => {\n return (\n
\n \n
\n );\n}\n\nexport default Charts;\n","export const loadState = (id: string): object | undefined => {\n try {\n const serializedState = localStorage.getItem(id);\n if (serializedState == null) {\n return undefined;\n }\n return JSON.parse(serializedState);\n } catch (err) {\n return undefined;\n }\n};\n\nexport const saveState = (id: string, state: object): void => {\n try {\n const serializedState = JSON.stringify(state);\n localStorage.setItem(id, serializedState);\n } catch (err) {\n console.log(`Error setting state (${id}): ${err}`);\n }\n};\n","import React, { useRef, useState } from 'react';\n\ninterface IProps {\n callback: (text: string) => void;\n}\n\nconst AddReminder: React.FC = (props) => {\n const [isEditing, setIsEditing] = useState(false);\n const inputField = useRef(null!);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputField?.current?.value) {\n return;\n }\n\n setIsEditing(false);\n props.callback(inputField.current.value);\n };\n\n return (\n \n {isEditing\n ?
\n \n \n setIsEditing(false)}>x\n
\n : setIsEditing(true)}>+}\n
\n );\n}\n\nexport default AddReminder;\n","import React, { useState, useEffect } from 'react';\nimport './Reminders.css';\nimport { loadState, saveState } from '../../localStorage';\nimport AddReminder from './AddReminder';\n\nconst Reminders: React.FC = () => {\n const namespace = 'spendy.reminders';\n const [daily, setDaily] = useState([]);\n const [weekly, setWeekly] = useState([]);\n const [monthly, setMonthly] = useState([]);\n\n useEffect(() => {\n setDaily(loadState(`${namespace}.daily`) as string[] || []);\n setWeekly(loadState(`${namespace}.weekly`) as string[] || []);\n setMonthly(loadState(`${namespace}.monthly`) as string[] || []);\n }, []);\n\n useEffect(() => saveState(`${namespace}.daily`, daily), [daily]);\n\n useEffect(() => saveState(`${namespace}.weekly`, weekly), [weekly]);\n\n useEffect(() => saveState(`${namespace}.monthly`, monthly), [monthly]);\n\n function deleteReminder(content: string, index: number) {\n if (daily[index] === content) {\n setDaily(daily.filter((v, i) => i !== index));\n }\n\n if (weekly[index] === content) {\n setWeekly(weekly.filter((v, i) => i !== index));\n }\n\n if (monthly[index] === content) {\n setMonthly(monthly.filter((v, i) => i !== index));\n }\n }\n\n function renderReminder(content: string, index: number): JSX.Element {\n return (\n
\n {content}\n deleteReminder(content, index)}>Delete\n
\n );\n }\n\n return (\n
\n

Reminders

\n\n
\n

\n Daily\n setDaily(daily.concat(text))} />\n

\n {daily.map(renderReminder)}\n
\n\n
\n

\n Weekly\n setWeekly(weekly.concat(text))} />\n

\n {weekly.map(renderReminder)}\n
\n\n
\n

\n Monthly\n setMonthly(monthly.concat(text))} />\n

\n {monthly.map(renderReminder)}\n
\n
\n );\n}\n\nexport default Reminders;\n","import React from 'react';\nimport Charts from './Charts';\nimport Reminders from './Reminders';\nimport './Home.css';\n\nconst Home: React.FC = () => {\n return (\n
\n \n \n
\n );\n};\n\nexport default Home;\n","import React from 'react';\nimport './Loading.css';\n\nconst Loading: React.FC = () => {\n return (\n
\n );\n}\n\nexport default Loading;\n","import React, { useState } from 'react';\n\ninterface IProps {\n callback: (value: string) => void;\n text: string;\n}\n\nconst FitPlanCell: React.FC = (props) => {\n const [isEditing, setIsEditing] = useState(false);\n const [text, setText] = useState(props.text);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n setText(text.trim());\n\n setIsEditing(false);\n props.callback(text);\n };\n\n const handleClick = () => {\n if (isEditing) {\n return;\n }\n\n setIsEditing(true);\n };\n\n const cancelEdit = () => {\n // Revert to the original input\n setText(props.text);\n setIsEditing(false);\n };\n\n return (\n \n {isEditing\n ?
\n setText(input.target.value)} autoFocus />\n \n Cancel\n
\n : text}\n \n );\n};\n\nexport default FitPlanCell;\n","import React, { useState, useEffect } from 'react';\nimport Loading from '../Shared/Loading';\nimport { loadState, saveState } from '../../localStorage';\nimport FitPlanCell from './FitPlanCell';\nimport IDataTable from './IDataTable';\nimport './FitPlan.css';\n\nconst FitPlan: React.FC = () => {\n const stateId: string = \"spendy.fitPlan\";\n const columnHeaders = [\"Morning\", \"Lunch\", \"Dinner\", \"Evening\"];\n const daysOfWeek = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"];\n const [isLoading, setLoading] = useState(true);\n\n /**\n * food: {\n * columnHeader1: [mon, tues, wed, thurs, fri, sat, sun]\n * columnHeader2: [mon, tues, wed, thurs, fri, sat, sun]\n * }\n */\n const [foodData, setFoodData] = useState(initNewDataTable());\n const [fitnessData, setFitnessData] = useState(initNewDataTable());\n\n useEffect(() => {\n const foodData = loadState(`${stateId}.food`) as IDataTable;\n if (foodData) {\n setFoodData(foodData);\n }\n\n const fitnessData = loadState(`${stateId}.fitness`) as IDataTable;\n if (fitnessData) {\n setFitnessData(fitnessData);\n }\n\n setLoading(false);\n }, []);\n\n useEffect(() => saveState(`${stateId}.food`, foodData), [foodData]);\n useEffect(() => saveState(`${stateId}.fitness`, fitnessData), [fitnessData]);\n\n function initNewDataTable(): IDataTable {\n const result: IDataTable = {};\n for (const header of columnHeaders) {\n // By initing an array to the correct size it means we can shortcut a\n // validation check in the handSubmit method.\n result[header] = daysOfWeek.map(value => \"\");\n }\n return result;\n }\n\n function handleFoodSubmit(newValue: string, columnHeader: string, dayOfWeekIndex: number): void {\n // TODO - fix this hacky way of avoiding state mutation\n var newFoodData = JSON.parse(JSON.stringify(foodData))\n\n // This should be an array of data by day of week number\n const dataForColumnHeaderByDayOfWeek = newFoodData[columnHeader];\n\n dataForColumnHeaderByDayOfWeek[dayOfWeekIndex] = newValue;\n setFoodData(newFoodData);\n }\n\n function handleFitnessSubmit(newValue: string, columnHeader: string, dayOfWeekIndex: number): void {\n // TODO - fix this hacky way of avoiding state mutation\n var newFitnessData = JSON.parse(JSON.stringify(fitnessData))\n\n // This should be an array of data by day of week number\n const dataForColumnHeaderByDayOfWeek = newFitnessData[columnHeader];\n\n dataForColumnHeaderByDayOfWeek[dayOfWeekIndex] = newValue;\n setFitnessData(newFitnessData);\n }\n\n function renderTable(): JSX.Element {\n return (\n \n \n \n \n \n {columnHeaders.map(header => )}\n \n \n \n {daysOfWeek.map((dayOfWeek, dayOfWeekIndex) => (\n \n \n \n \n {columnHeaders.map(colHeader => handleFoodSubmit(value, colHeader, dayOfWeekIndex)}\n text={foodData[colHeader][dayOfWeekIndex]} />)}\n \n \n \n {columnHeaders.map(colHeader => handleFitnessSubmit(value, colHeader, dayOfWeekIndex)}\n text={fitnessData[colHeader][dayOfWeekIndex]} />)}\n \n \n ))}\n \n
{header}
{dayOfWeek}Food
Fitness
\n );\n }\n\n return (\n
\n {isLoading\n ? \n : renderTable()}\n
\n );\n}\n\nexport default FitPlan;\n","import React from 'react';\nimport './NotFound.css';\n\nconst NotFound: React.FC = () => {\n return (\n
\n

Error

\n

Page not found :\\

\n
\n );\n}\n\nexport default NotFound;\n","import React from 'react';\nimport { Route, Switch } from 'react-router-dom';\nimport './App.css';\nimport Header from './Shared/Header';\nimport Home from './Home/Home';\nimport FitPlan from './FitPlan/FitPlan';\nimport NotFound from './Shared//NotFound';\n\nconst App: React.FC = () => {\n return (\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.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\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: 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(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\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: string, config?: 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: string, config?: 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 { BrowserRouter } from 'react-router-dom';\nimport './index.css';\nimport App from './components/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":""}