{"version":3,"sources":["firebase.config.js","state/problemModel.js","state/firestoreModel.js","helpers/timeAgo.js","components/problemsList.js","components/stepCounter.js","components/textArrayInput.js","helpers/escapeAttr.js","helpers/unescapeAttr.js","components/problemsModal.js","components/errorModal.js","Logo-Inversed.svg","App.js","reportWebVitals.js","index.js"],"names":["firebase","initializeApp","apiKey","process","authDomain","projectId","storageBucket","messagingSenderId","appId","problem","Solution","SolvedDate","this","dateToTimestamp","Date","Solutions","length","i","Title","trim","problemId","a","store","collection","problemCollection","doc","get","currentProblemDocument","data","id","uid","where","orderBy","docs","map","Error","normaliseProblem","p","JSON","parse","stringify","LastUpdatedDate","update","CreatedDate","add","docRef","delete","result","firestore","d","Timestamp","fromDate","timeAgo","prevDate","diff","Number","minute","hour","day","month","year","seconds","Math","round","ProblemsList","props","useState","problems","setProblems","useEffect","className","onClick","e","getProblem","stepCounter","steps","step","number","currentStep","setStep","label","TextArrayInput","value","values","setValues","useDynamicRefs","getRef","setRef","toKey","commit","target","vals","Array","keys","forEach","current","lastChild","push","gatherValues","handleChange","setTimeout","focus","onKeyUp","key","preventDefault","tabIndex","onChange","val","ref","type","defaultValue","onBlur","escapeAttr","str","replace","unescapeAttr","ProblemsModal","setCurrentStep","setProblem","name","openState","close","setOpenState","handleChooseSolution","parentNode","tagName","document","querySelectorAll","el","classList","remove","checked","role","aria-hidden","htmlFor","solution","Pros","Cons","Plan","item","data-dismiss","onStepChange","window","confirm","handleDelete","ErrorModal","error","setError","message","description","stack","App","modal","setModal","ProblemCollection","blankProblem","isSignedIn","setIsSignedIn","setUid","uiConfig","signInFlow","signInOptions","auth","GoogleAuthProvider","PROVIDER_ID","callbacks","signInSuccessWithAuthResult","unregisterAuthObserver","onAuthStateChanged","user","getAllProblems","prev","console","deleteProblem","deleteCurrentProblem","then","catch","err","includes","currentSolutions","newSolution","blankSolution","parts","split","part","key1","key2","key3","saveCurrentProblem","savedProblem","handleModalButton","src","LogoInversed","alt","width","href","signOut","filtered","filter","prob","oldProblem","firebaseAuth","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","querySelector"],"mappings":"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","file":"static/js/main.cab86062.chunk.js","sourcesContent":["import firebase from 'firebase/app';\nimport 'firebase/firestore';\nimport 'firebase/auth';\n\nlet config = {\n apiKey: process.env.REACT_APP_API_KEY,\n authDomain: process.env.REACT_APP_AUTH_DOMAIN,\n projectId: process.env.REACT_APP_PROJECT_ID,\n storageBucket: process.env.REACT_APP_STORAGE_BUCKET,\n messagingSenderId: process.env.REACT_APP_MESSAGE_SENDER_ID,\n appId: process.env.REACT_APP_APP_ID\n};\n\nfirebase.initializeApp(config);\n\nexport default firebase;","import FirestoreModel from './firestoreModel';\n\nclass ProblemModel extends FirestoreModel {\n blankProblem() {\n return {\n \"id\": null,\n \"uid\": null,\n \"Plan\": [],\n \"Solution\": null,\n \"Solutions\": [],\n \"LastUpdatedDate\": null,\n \"Title\": \"\",\n \"SolvedDate\": null,\n \"CreatedDate\": null\n };\n }\n\n blankSolution() {\n return {\n \"Title\": null,\n \"Cons\": [],\n \"Pros\": []\n };\n }\n\n normaliseProblem(problem) {\n if (problem.Solution && !problem.SolvedDate) {\n problem.SolvedDate = this.dateToTimestamp(new Date());\n }\n\n if (problem.Solutions && problem.Solutions.length > 0) {\n for (let i = 0; i < problem.Solutions.length; i++) {\n if (!problem.Solutions[i] || problem.Solutions[i]?.Title?.trim() === '') {\n delete problem.Solutions[i];\n }\n }\n }\n\n return problem;\n }\n\n async getCurrentProblem(problemId) {\n const currentProblemDocument = await this.store\n .collection(this.problemCollection)\n .doc(problemId)\n .get();\n return { ...currentProblemDocument.data(), id: currentProblemDocument.id };\n }\n\n async getAllProblems(uid) {\n const problemCollection = await this.store\n .collection(this.problemCollection)\n .where('uid', '==', uid)\n .orderBy('LastUpdatedDate', 'desc')\n .get();\n return problemCollection.docs.map(problem => ({ ...problem.data(), id: problem.id }));\n }\n\n async saveCurrentProblem(problem) {\n if (!problem) {\n throw new Error('Trying to save an undefined problem');\n }\n\n problem = this.normaliseProblem(problem);\n\n if (problem.id) {\n // Make sure we got a copy and not a reference of the original\n let p = JSON.parse( JSON.stringify(problem) );\n delete p.id;\n p.LastUpdatedDate = this.dateToTimestamp(new Date());\n\n await this.store\n .collection(this.problemCollection)\n .doc(problem.id)\n .update(p);\n return problem;\n } else {\n problem.CreatedDate = this.dateToTimestamp(new Date());\n problem.LastUpdatedDate = this.dateToTimestamp(new Date());\n\n let docRef = await this.store\n .collection(this.problemCollection)\n .add(problem);\n\n return { ...problem, id: docRef.id };\n }\n }\n\n async deleteCurrentProblem(problemId) {\n const result = await this.store\n .collection(this.problemCollection)\n .doc(problemId)\n .delete();\n return result;\n } \n}\n\nexport default new ProblemModel();","import firebase from '../firebase.config';\n\nexport default class FirestoreModel {\n store;\n \n constructor() {\n this.store = firebase.firestore();\n }\n\n dateToTimestamp(d) {\n return firebase.firestore.Timestamp.fromDate(d);\n }\n\n get problemCollection() {\n return 'problems';\n }\n}","const timeAgo = (prevDate) => {\n const diff = Number(new Date()) - prevDate;\n const minute = 60 * 1000;\n const hour = minute * 60;\n const day = hour * 24;\n const month = day * 30;\n const year = day * 365;\n switch (true) {\n case diff < minute:\n const seconds = Math.round(diff / 1000);\n return `${seconds} ${seconds > 1 ? 'seconds' : 'second'} ago`\n case diff < hour:\n return Math.round(diff / minute) + ' minutes ago';\n case diff < day:\n return Math.round(diff / hour) + ' hours ago';\n case diff < month:\n return Math.round(diff / day) + ' days ago';\n case diff < year:\n return Math.round(diff / month) + ' months ago';\n case diff > year:\n return Math.round(diff / year) + ' years ago';\n default:\n return \"\";\n }\n};\n\nexport default timeAgo;","import React, { useState, useEffect } from 'react';\nimport timeAgo from '../helpers/timeAgo';\n\nfunction ProblemsList(props) {\n const [problems, setProblems] = useState(props.problems);\n\n useEffect(() => {\n setProblems(props.problems);\n }, [props]);\n\n const handleClick = (e, id) => {\n props.getProblem(id);\n };\n\n return(\n
\n {\n problems && problems.map((problem) => {\n return(\n
handleClick(e, problem.id)}>\n

{problem.Title}

\n

{timeAgo(problem.LastUpdatedDate?.seconds * 1000)}

\n
\n )\n })\n }\n
\n );\n}\n\nexport default ProblemsList;","import React from 'react';\n\nfunction stepCounter(props) {\n const steps = props.steps ? props.steps : [];\n\n return(\n
\n {steps.map(step => (\n
\n
{ props.setStep(step.number)}}>{step.number}
\n
{step.label}
\n
\n ))}\n
\n );\n}\n\nexport default stepCounter;","import React, { useState, useEffect } from 'react';\nimport useDynamicRefs from 'use-dynamic-refs';\n\nfunction TextArrayInput(props) {\n // By having state within the component change it will force the component to re-render.\n const [values, setValues] = useState(props.value);\n const [getRef, setRef] = useDynamicRefs();\n\n useEffect(() => {\n setValues(props.value);\n }, [props]);\n\n function toKey(i) {\n return props.id + i;\n }\n\n function gatherValues() {\n let vals = [];\n [...Array(values.length).keys()].forEach(i => {\n if (getRef(toKey(i)) && getRef(toKey(i)).current && getRef(toKey(i)).current.lastChild.value.length > 0) {\n vals.push(getRef(toKey(i)).current.lastChild.value);\n }\n });\n\n if (getRef(toKey('New')) && getRef(toKey('New')).current && getRef(toKey('New')).current.lastChild.value.length > 0) {\n vals.push(getRef(toKey('New')).current.lastChild.value);\n }\n\n return vals;\n }\n\n function commit(e) {\n let targetValue = e.target.value.trim();\n if (targetValue.length === 0) {\n return false;\n }\n\n let vals = gatherValues();\n if (vals !== values) {\n props.handleChange(props.id, vals);\n setValues(vals);\n setTimeout(() => {\n if (getRef(toKey('New')) && getRef(toKey('New')).current) {\n getRef(toKey('New')).current.focus();\n }\n }, 10);\n }\n }\n\n function onKeyUp(e) {\n if (e.key === 'Enter') {\n e.preventDefault();\n\n if (e.target.className === 'text-array-input-new') {\n commit(e);\n e.target.value = \"\";\n e.target.focus();\n } else if(getRef(toKey(e.target.tabIndex))) {\n getRef(toKey(e.target.tabIndex)).current.focus();\n }\n }\n\n if (e.key === 'Backspace' && e.target.value.trim().length === 0) {\n commit(e);\n if (e.target.tabIndex > 1 && getRef(toKey(e.target.tabIndex - 2))) {\n getRef(toKey(e.target.tabIndex - 2)).current.focus();\n }\n }\n\n if (e.key === 'ArrowUp' && e.target.tabIndex > 1 && getRef(toKey(e.target.tabIndex - 2))) {\n getRef(toKey(e.target.tabIndex - 2)).current.focus();\n }\n\n if (e.key === 'ArrowDown') {\n if (getRef(toKey(e.target.tabIndex)) && getRef(toKey(e.target.tabIndex)).current) {\n getRef(toKey(e.target.tabIndex)).current.focus();\n } else {\n getRef(toKey('New')).current.focus();\n }\n }\n }\n\n function onChange(e) {\n if ((e.target.className === 'text-array-input-new' \n && e.target.value.trim().length > 0) \n || e.target.className !== 'text-array-input-new') {\n commit(e);\n }\n }\n\n return(\n
\n { values.map((val, i) => {\n return \n }) }\n \n
\n );\n}\n\nexport default TextArrayInput;","const escapeAttr = (str) => {\n return ('' + str) /* Forces the conversion to string. */\n .replace(/\\\\/g, '\\\\\\\\') /* This MUST be the 1st replacement. */\n .replace(/\\t/g, '\\\\t') /* These 2 replacements protect whitespaces. */\n .replace(/\\n/g, '\\\\n')\n .replace(/\\u00A0/g, '\\\\u00A0') /* Useful but not absolutely necessary. */\n .replace(/&/g, '\\\\x26') /* These 5 replacements protect from HTML/XML. */\n .replace(/'/g, '\\\\x27')\n .replace(/\"/g, '\\\\x22')\n .replace(//g, '\\\\x3E')\n ;\n};\n\nexport default escapeAttr;","const unescapeAttr = (str) => {\n return ('' + str) /* Forces the conversion to string. */\n .replace(/\\\\\\\\/g, '\\\\') /* This MUST be the 1st replacement. */\n .replace(/\\\\t/g, '\\t') /* These 2 replacements protect whitespaces. */\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\u00A0/g, '\\u00A0') /* Useful but not absolutely necessary. */\n .replace(/\\\\x26/g, '&') /* These 5 replacements protect from HTML/XML. */\n .replace(/\\\\x27/g, '\\'')\n .replace(/\\\\x22/g, '\"')\n .replace(/\\\\x3C/g, '<')\n .replace(/\\\\x3E/g, '>')\n ;\n};\n\nexport default unescapeAttr;","import React, { useEffect, useState } from 'react';\nimport StepCounter from '../components/stepCounter';\nimport TextArrayInput from '../components/textArrayInput';\nimport escapeAttr from '../helpers/escapeAttr';\nimport unescapeAttr from '../helpers/unescapeAttr';\n\nfunction ProblemsModal(props) {\n const [currentStep, setCurrentStep] = useState(1);\n const [problem, setProblem] = useState(props.problem);\n const name = props.name ? props.name : 'problemsModal';\n\n useEffect(() => {\n setProblem(props.problem);\n }, [props]);\n\n useEffect(() => {\n setCurrentStep(props.openState);\n }, [props.openState]);\n\n const steps = [\n { number: 1, label: 'Define' },\n { number: 2, label: 'List' },\n { number: 3, label: 'Evaluate' },\n { number: 4, label: 'Choose' },\n { number: 5, label: 'Plan' },\n { number: 6, label: 'Review' }\n ];\n\n function next() {\n if (currentStep === steps[steps.length-1].number) {\n close();\n } else {\n setCurrentStep(currentStep => currentStep + 1);\n props.onStepChange(currentStep);\n }\n }\n\n function prev() {\n if (currentStep > 1) {\n setCurrentStep(currentStep => currentStep - 1);\n props.onStepChange(currentStep);\n }\n }\n\n function close() {\n props.setOpenState(0);\n }\n\n function handleChange(key, value) {\n props.onChange(key, value);\n }\n\n function handleChooseSolution(e) {\n if (e.target.parentNode && e.target.parentNode.tagName === 'LABEL') {\n document.querySelectorAll(`#${e.target.id}`).forEach(el => el.parentNode.classList.remove('active'));\n e.target.parentNode.classList.add('active');\n e.target.checked = true;\n let val = unescapeAttr(e.target.value);\n handleChange(e.target.id, val);\n }\n }\n\n function handleDelete(e) {\n if (problem.id && window.confirm('Are you sure?')) {\n props.handleDelete(problem.id);\n }\n }\n\n return(\n
0 ? false : true}>\n
\n
\n
\n \n \n
\n
\n { currentStep === 1 &&\n
\n

Define the problem

\n
\n \n { handleChange('Title', e.target.value) }} />\n
\n
\n The more narrowly you can define the problem, the better.\n
\n
\n }\n { currentStep === 2 &&\n
\n

List all possible solutions (even the bad ones)

\n
\n \n solution.Title) : []} handleChange={handleChange} />\n
\n
\n Avoid evaluating the merits of each solution in this step.\n
\n
\n }\n { currentStep === 3 &&\n
\n { problem.Solutions.map((solution, i) => {\n return
\n

{solution.Title}

\n
\n \n \n
\n\n
\n \n \n
\n
\n })}\n
\n }\n { currentStep === 4 &&\n
\n

Choose the best or most practical solution

\n { problem.Solutions.map((solution, i) => {\n return \n })}\n
\n }\n { currentStep === 5 &&\n
\n

Plan how you will carry out the best solution

\n
\n \n \n
\n
\n }\n { currentStep === 6 &&\n
\n

Review your solution

\n

{problem.Solution}

\n
    \n {problem?.Plan.map((item, i) => {\n return
  1. {item}
  2. \n })}\n
\n
\n }\n
\n
\n { currentStep > 1 &&\n \n }\n { problem.id &&\n \n }\n { currentStep === steps[steps.length-1].number ? \n \n :\n \n }\n
\n
\n
\n
\n );\n}\n\nexport default ProblemsModal;","import React, { useEffect, useState } from 'react';\n\nfunction ErrorModal(props) {\n const [error, setError] = useState(null);\n const name = props.name ? props.name : 'errorModal';\n\n useEffect(() => {\n setError(props.error);\n }, [props]);\n\n\n\n function close() {\n setError(null);\n }\n\n\n return(\n
\n
\n
\n
\n

An error occured

\n \n
\n
\n

{error?.name}

\n

{error?.message}

\n {error?.description &&\n

{error.description}

\n }\n {error?.stack &&\n
{error.stack}
\n }\n
\n
\n \n
\n
\n
\n
\n );\n}\n\nexport default ErrorModal;","export default __webpack_public_path__ + \"static/media/Logo-Inversed.c25cfaf0.svg\";","import React, { useState, useEffect } from 'react';\nimport ProblemCollection from './state/problemModel';\nimport ProblemsList from './components/problemsList';\nimport ProblemsModal from './components/problemsModal';\nimport ErrorModal from './components/errorModal';\nimport firebase from 'firebase/app';\nimport 'firebase/auth';\nimport StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth';\nimport './App.scss';\nimport LogoInversed from './Logo-Inversed.svg';\n\nfunction App() {\n const [modal, setModal] = useState(0);\n const [problems, setProblems] = useState([]);\n const [problem, setProblem] = useState(ProblemCollection.blankProblem());\n const [isSignedIn, setIsSignedIn] = useState(false);\n const [uid, setUid] = useState(null);\n const [error, setError] = useState(null);\n\n const uiConfig = {\n // Popup signin flow rather than redirect flow.\n signInFlow: 'popup',\n // We will display Google auth provider.\n signInOptions: [\n firebase.auth.GoogleAuthProvider.PROVIDER_ID\n ],\n callbacks: {\n // Avoid redirects after sign-in.\n signInSuccessWithAuthResult: () => false\n }\n };\n\n // Listen to the Firebase Auth state and set the local state.\n useEffect(() => {\n const unregisterAuthObserver = firebase.auth().onAuthStateChanged(user => {\n setIsSignedIn(!!user);\n setUid(user.uid);\n });\n return () => unregisterAuthObserver(); // Make sure we un-register Firebase observers when the component unmounts.\n }, []);\n\n useEffect(() => {\n (async () => {\n if (uid) {\n try {\n const data = await ProblemCollection.getAllProblems(uid);\n await setProblems(prev => (data));\n } catch (error) {\n error.description = 'During getAllProblems(uid) at uid change.';\n setError(error);\n console.error(error);\n }\n }\n })();\n }, [uid]);\n\n const getProblem = (id) => {\n let filtered = problems.filter(p => p.id === id);\n let prob = filtered && filtered.length > 0 ? filtered[0] : null;\n setProblem(oldProblem => {\n if (prob.Solution) {\n setModal(6);\n }\n else if (prob.Plan && prob.Plan.length > 0) {\n setModal(5);\n }\n else if (prob.Solutions && prob.Solutions.length > 0) {\n setModal(4);\n }\n else if (prob.Title) {\n setModal(2);\n }\n else {\n setModal(1);\n }\n\n return prob\n });\n\n return prob;\n }\n\n const deleteProblem = async (id) => {\n if (!id) return;\n ProblemCollection.deleteCurrentProblem(id)\n .then(() => {\n setModal(0);\n try {\n ProblemCollection.getAllProblems(uid)\n .then((data) => {\n setProblems(prev => (data))\n });\n } catch (error) {\n error.description = 'At getAllProblems(uid) during deleteProblem().';\n setError(error);\n console.error(error);\n }\n }).catch((err) => {\n err.description = 'At deleteCurrentProblem(id) during deleteProblem()';\n setError(err);\n console.error(err);\n });\n }\n\n const onChange = (key, value) => {\n if (key === 'Solutions') {\n setProblem(problem => {\n for(let i = 0; i < problem[key].length; i++) {\n if (problem[key][i] && !value.includes(problem[key][i].Title)) {\n delete problem[key][i];\n }\n }\n let currentSolutions = problem[key].map(solution => solution.Title);\n value.forEach(solution => {\n if (!currentSolutions.includes(solution)) {\n let newSolution = ProblemCollection.blankSolution();\n newSolution.Title = solution;\n problem[key].push(newSolution);\n }\n });\n return problem;\n });\n } else if(key.includes('[') && key.includes('.')) {\n let parts = key.split(/\\.|\\[/).map(part => part.replace(/]$/, ''));\n if (parts.length === 3) {\n let key1 = parts[0],\n key2 = parts[1],\n key3 = parts[2];\n setProblem(problem => {\n problem[key1][key2][key3] = value;\n return problem;\n });\n }\n } else {\n setProblem(problem => {\n problem[key] = value;\n return problem;\n });\n }\n };\n\n const onStepChange = async (step) => {\n try {\n if (!problem.uid && uid) {\n problem.uid = uid;\n }\n\n let savedProblem = await ProblemCollection.saveCurrentProblem(problem);\n setProblem(problem => savedProblem);\n ProblemCollection.getAllProblems(uid)\n .then((data) => {\n setProblems(prev => (data))\n });\n } catch(err) {\n err.description = 'Catch at saveCurrentProblem(problem) during onStepChange().';\n err.stack = JSON.stringify(problem);\n setError(err);\n console.error(err);\n }\n };\n\n const handleModalButton = (e) => {\n setProblem(problem => ProblemCollection.blankProblem());\n setModal(1);\n };\n\n return (\n <>\n { !isSignedIn ?\n
\n
\n
\n \"Soulution\"\n \n
\n
\n
\n :\n <>\n { problems.length > 0 ?\n
\n
\n
\n
\n \"Soulution\"\n { e.preventDefault(); firebase.auth().signOut()}}>Logout\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n \n
\n :\n
\n
\n
\n
\n
\n \"Soulution\"\n { e.preventDefault(); firebase.auth().signOut()}}>Logout\n
\n
 
\n
\n

Welcome!

\n

Structured problem solving a great technique to help you step back from a problem and help your mind work towards a solution.

\n
\n
 
\n
\n \n
\n
\n
\n
\n \n \n
\n }\n \n }\n \n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.querySelector('body')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}