diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f8559c4 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +REACT_APP_FIREBASE_API_KEY = +REACT_APP_FIREBASE_AUTH_DOMAIN = +REACT_APP_FIREBASE_DATABASE_URL = +REACT_APP_FIREBASE_PROJECT_ID = +REACT_APP_FIREBASE_STORAGE_BUCKET = +REACT_APP_FIREBASE_MESSAGING_SENDER_ID = +REACT_APP_FIREBASE_APP_ID = +REACT_APP_MESS_API_ENDPOINT = +REACT_APP_BUS_API_ENDPOINT = +REACT_APP_BASENAME = diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..d163863 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0132de3..65e222a 100644 --- a/.gitignore +++ b/.gitignore @@ -90,6 +90,19 @@ typings/ # production /build +# misc +.DS_Store +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +debug.log + # Editors ######### @@ -138,4 +151,4 @@ GitHub.sublime-settings # Mac OS X files .DS_Store .AppleDouble -.LSOverride +.LSOverride \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ebcf9fb..0cac059 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1161,6 +1161,357 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@firebase/analytics": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.2.tgz", + "integrity": "sha512-4Ceov+rPfOEPIdbjlpTim/wbcUUneIesHag4UOzvmFsRRXqbxLwQpyZQWEbTSriUeU8uTKj9yOW32hsskV9Klg==", + "requires": { + "@firebase/analytics-types": "0.4.0", + "@firebase/component": "0.1.21", + "@firebase/installations": "0.4.19", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.4", + "tslib": "^1.11.1" + } + }, + "@firebase/analytics-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.4.0.tgz", + "integrity": "sha512-Jj2xW+8+8XPfWGkv9HPv/uR+Qrmq37NPYT352wf7MvE9LrstpLVmFg3LqG6MCRr5miLAom5sen2gZ+iOhVDeRA==" + }, + "@firebase/app": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.13.tgz", + "integrity": "sha512-xGrJETzvCb89VYbGSHFHCW7O/y067HRxT7MGehUE1xMxdPVBDNayHnxEuKwzfGvXAjVmajXBKFlKxaCWpgSjCQ==", + "requires": { + "@firebase/app-types": "0.6.1", + "@firebase/component": "0.1.21", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.4", + "dom-storage": "2.1.0", + "tslib": "^1.11.1", + "xmlhttprequest": "1.8.0" + } + }, + "@firebase/app-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", + "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" + }, + "@firebase/auth": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.15.2.tgz", + "integrity": "sha512-2n32PBi6x9jVhc0E/ewKLUCYYTzFEXL4PNkvrrlGKbzeTBEkkyzfgUX7OV9UF5wUOG+gurtUthuur1zspZ/9hg==", + "requires": { + "@firebase/auth-types": "0.10.1" + } + }, + "@firebase/auth-interop-types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" + }, + "@firebase/auth-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.1.tgz", + "integrity": "sha512-/+gBHb1O9x/YlG7inXfxff/6X3BPZt4zgBv4kql6HEmdzNQCodIRlEYnI+/da+lN+dha7PjaFH7C7ewMmfV7rw==" + }, + "@firebase/component": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.21.tgz", + "integrity": "sha512-kd5sVmCLB95EK81Pj+yDTea8pzN2qo/1yr0ua9yVi6UgMzm6zAeih73iVUkaat96MAHy26yosMufkvd3zC4IKg==", + "requires": { + "@firebase/util": "0.3.4", + "tslib": "^1.11.1" + } + }, + "@firebase/database": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.8.1.tgz", + "integrity": "sha512-/1HhR4ejpqUaM9Cn3KSeNdQvdlehWIhdfTVWFxS73ZlLYf7ayk9jITwH10H3ZOIm5yNzxF67p/U7Z/0IPhgWaQ==", + "requires": { + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.21", + "@firebase/database-types": "0.6.1", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.4", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "@firebase/database-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.6.1.tgz", + "integrity": "sha512-JtL3FUbWG+bM59iYuphfx9WOu2Mzf0OZNaqWiQ7lJR8wBe7bS9rIm9jlBFtksB7xcya1lZSQPA/GAy2jIlMIkA==", + "requires": { + "@firebase/app-types": "0.6.1" + } + }, + "@firebase/firestore": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.0.4.tgz", + "integrity": "sha512-fzJKj/4h4jOwPSfHB42XBJIC0zsPsepU6FcBO+8nSx7G2IPfTw8cMgSNin2gPqX6tR1w1NQtHiSlXiRKsbMZdA==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/firestore-types": "2.0.0", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.4", + "@firebase/webchannel-wrapper": "0.4.1", + "@grpc/grpc-js": "^1.0.0", + "@grpc/proto-loader": "^0.5.0", + "node-fetch": "2.6.1", + "tslib": "^1.11.1" + } + }, + "@firebase/firestore-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.0.0.tgz", + "integrity": "sha512-ZGb7p1SSQJP0Z+kc9GAUi+Fx5rJatFddBrS1ikkayW+QHfSIz0omU23OgSHcBGTxe8dJCeKiKA2Yf+tkDKO/LA==" + }, + "@firebase/functions": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.1.tgz", + "integrity": "sha512-xNCAY3cLlVWE8Azf+/84OjnaXMoyUstJ3vwVRG0ie22QhsdQuPa1tXTiPX4Tmm+Hbbd/Aw0A/7dkEnuW+zYzaQ==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/functions-types": "0.4.0", + "@firebase/messaging-types": "0.5.0", + "node-fetch": "2.6.1", + "tslib": "^1.11.1" + } + }, + "@firebase/functions-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz", + "integrity": "sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ==" + }, + "@firebase/installations": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.19.tgz", + "integrity": "sha512-QqAQzosKVVqIx7oMt5ujF4NsIXgtlTnej4JXGJ8sQQuJoMnt3T+PFQRHbr7uOfVaBiHYhEaXCcmmhfKUHwKftw==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/installations-types": "0.3.4", + "@firebase/util": "0.3.4", + "idb": "3.0.2", + "tslib": "^1.11.1" + } + }, + "@firebase/installations-types": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", + "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==" + }, + "@firebase/logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", + "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" + }, + "@firebase/messaging": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.7.3.tgz", + "integrity": "sha512-63nOP2SmQJrj9jrhV3K96L5MRKS6AqmFVLX1XbGk6K6lz38ZC4LIoCcHxzUBXY7fCAuZvNmh/YB3pE8B2mTs8A==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/installations": "0.4.19", + "@firebase/messaging-types": "0.5.0", + "@firebase/util": "0.3.4", + "idb": "3.0.2", + "tslib": "^1.11.1" + } + }, + "@firebase/messaging-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", + "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==" + }, + "@firebase/performance": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.4.tgz", + "integrity": "sha512-CY/fzz7qGQ9hUkvOow22MeJhayHSjXmI4+0AqcxaUC4CWk4oQubyIC4pk62aH+yCwZNNeC7JJUEDbtqI/0rGkQ==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/installations": "0.4.19", + "@firebase/logger": "0.2.6", + "@firebase/performance-types": "0.0.13", + "@firebase/util": "0.3.4", + "tslib": "^1.11.1" + } + }, + "@firebase/performance-types": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz", + "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==" + }, + "@firebase/polyfill": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", + "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", + "requires": { + "core-js": "3.6.5", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } + }, + "@firebase/remote-config": { + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.30.tgz", + "integrity": "sha512-LAfLDcp1AN0V/7AkxBuTKy+Qnq9fKYKxbA5clrXRNVzJbTVnF5eFGsaUOlkes0ESG6lbqKy5ZcDgdl73zBIhAA==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/installations": "0.4.19", + "@firebase/logger": "0.2.6", + "@firebase/remote-config-types": "0.1.9", + "@firebase/util": "0.3.4", + "tslib": "^1.11.1" + } + }, + "@firebase/remote-config-types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz", + "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==" + }, + "@firebase/storage": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.4.2.tgz", + "integrity": "sha512-87CrvKrf8kijVekRBmUs8htsNz7N5X/pDhv3BvJBqw8K65GsUolpyjx0f4QJRkCRUYmh3MSkpa5P08lpVbC6nQ==", + "requires": { + "@firebase/component": "0.1.21", + "@firebase/storage-types": "0.3.13", + "@firebase/util": "0.3.4", + "tslib": "^1.11.1" + } + }, + "@firebase/storage-types": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.13.tgz", + "integrity": "sha512-pL7b8d5kMNCCL0w9hF7pr16POyKkb3imOW7w0qYrhBnbyJTdVxMWZhb0HxCFyQWC0w3EiIFFmxoz8NTFZDEFog==" + }, + "@firebase/util": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.4.tgz", + "integrity": "sha512-VwjJUE2Vgr2UMfH63ZtIX9Hd7x+6gayi6RUXaTqEYxSbf/JmehLmAEYSuxS/NckfzAXWeGnKclvnXVibDgpjQQ==", + "requires": { + "tslib": "^1.11.1" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.4.1.tgz", + "integrity": "sha512-0yPjzuzGMkW1GkrC8yWsiN7vt1OzkMIi9HgxRmKREZl2wnNPOKo/yScTjXf/O57HM8dltqxPF6jlNLFVtc2qdw==" + }, + "@fullcalendar/common": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@fullcalendar/common/-/common-5.6.0.tgz", + "integrity": "sha512-4i4kZDVpRvfdKoJHRljDHsoYu466Odor9FhekP+67dIUoNnXSDTnQRmGfURwiF4RwaTsdWKe2+B7gors9G7zZA==", + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@fullcalendar/daygrid": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-5.6.0.tgz", + "integrity": "sha512-UaNn6/vKQ3zI4/sDhrMACkIHOSZb/MA0JGlvvw3OTYFULqE5TISuYYnDbo9S1Wdz3AbTBvCzYy5Qk1vZQFsGwg==", + "requires": { + "@fullcalendar/common": "~5.6.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@fullcalendar/react": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@fullcalendar/react/-/react-5.6.0.tgz", + "integrity": "sha512-g6U3bFnJZH+dT4N+SqdXVEIV/FCI1ShZedCRCjKXdG2VpvhkcOPeUVRp9gHMKTsy2S4W76f/B/W3r9Av5Ebxdg==", + "requires": { + "@fullcalendar/common": "~5.6.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@fullcalendar/timegrid": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-5.6.0.tgz", + "integrity": "sha512-NG55pzPvrzZEuVq+/Vn1ZbyKARVjsE6PzhiOHvJuyt3gzVPeWjXGUWjDN3BSDZ8p/4dthbF6H9mCPia977aV1g==", + "requires": { + "@fullcalendar/common": "~5.6.0", + "@fullcalendar/daygrid": "~5.6.0", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + } + } + }, + "@grpc/grpc-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.2.1.tgz", + "integrity": "sha512-JpGh2CgqnwVII0S9TMEX3HY+PkLJnb7HSAar3Md1Y3aWxTZqAGb7gTrNyBWn/zueaGFsMYRm2u/oYufWFYVoIQ==", + "requires": { + "@types/node": "^12.12.47", + "google-auth-library": "^6.1.1", + "semver": "^6.2.0" + }, + "dependencies": { + "@types/node": { + "version": "12.19.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.6.tgz", + "integrity": "sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ==" + } + } + }, + "@grpc/proto-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", + "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + }, "@hapi/address": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", @@ -1386,6 +1737,120 @@ "@types/yargs": "^13.0.0" } }, + "@material-ui/core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz", + "integrity": "sha512-bYo9uIub8wGhZySHqLQ833zi4ZML+XCBE1XwJ8EuUVSpTWWG57Pm+YugQToJNFsEyiKFhPh8DPD0bgupz8n01g==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.10.0", + "@material-ui/system": "^4.9.14", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.10.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/icons": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", + "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.57", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz", + "integrity": "sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "dependencies": { + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + } + } + }, + "@material-ui/styles": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.10.0.tgz", + "integrity": "sha512-XPwiVTpd3rlnbfrgtEJ1eJJdFCXZkHxy8TrdieaTvwxNYj42VnnCyFzxYeNW9Lhj4V1oD8YtQ6S5Gie7bZDf7Q==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.0.3", + "jss-plugin-camel-case": "^10.0.3", + "jss-plugin-default-unit": "^10.0.3", + "jss-plugin-global": "^10.0.3", + "jss-plugin-nested": "^10.0.3", + "jss-plugin-props-sort": "^10.0.3", + "jss-plugin-rule-value-function": "^10.0.3", + "jss-plugin-vendor-prefixer": "^10.0.3", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz", + "integrity": "sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A==" + } + } + }, + "@material-ui/system": { + "version": "4.9.14", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.14.tgz", + "integrity": "sha512-oQbaqfSnNlEkXEziDcJDDIy8pbvwUmZXWNqlmIwDqr/ZdCK8FuV3f4nxikUh7hvClKV2gnQ9djh5CZFTHkZj3w==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.9.6", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz", + "integrity": "sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A==" + } + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + }, + "@material-ui/utils": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.10.2.tgz", + "integrity": "sha512-eg29v74P7W5r6a4tWWDAAfZldXIzfyO1am2fIsC39hdUUHm/33k6pGOKPbgDjg/U/4ifmgAePy/1OjkKN6rFRw==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -1400,6 +1865,60 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, "@sheerun/mutationobserver-shim": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", @@ -1727,6 +2246,11 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1769,6 +2293,14 @@ "@types/react": "*" } }, + "@types/react-transition-group": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", + "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", + "requires": { + "@types/react": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -2108,6 +2640,14 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -2195,6 +2735,14 @@ } } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3017,6 +3565,11 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -3263,6 +3816,11 @@ "isarray": "^1.0.0" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -3391,9 +3949,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001137", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz", - "integrity": "sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw==" + "version": "1.0.30001208", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz", + "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==" }, "capture-exit": { "version": "2.0.0", @@ -3661,6 +4219,11 @@ "shallow-clone": "^0.1.2" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4165,6 +4728,15 @@ } } }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", @@ -4629,6 +5201,15 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", + "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -4645,6 +5226,11 @@ } } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -4756,6 +5342,14 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4787,6 +5381,11 @@ } } }, + "email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5486,6 +6085,11 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -5824,6 +6428,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", @@ -5870,6 +6479,30 @@ "schema-utils": "^2.5.0" } }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=" + }, + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filenamify-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", + "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", + "requires": { + "filenamify": "^1.0.0", + "humanize-url": "^1.0.0" + } + }, "filesize": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", @@ -5951,6 +6584,27 @@ "semver-regex": "^2.0.0" } }, + "firebase": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-8.1.1.tgz", + "integrity": "sha512-w1plr2jYvzBkx/rHE6A0EJf9318ufA5omShLuGocPlQtrvphel+KJcd+R02outE5E2lSDhyM0l3EoiA0YCD4hA==", + "requires": { + "@firebase/analytics": "0.6.2", + "@firebase/app": "0.6.13", + "@firebase/app-types": "0.6.1", + "@firebase/auth": "0.15.2", + "@firebase/database": "0.8.1", + "@firebase/firestore": "2.0.4", + "@firebase/functions": "0.6.1", + "@firebase/installations": "0.4.19", + "@firebase/messaging": "0.7.3", + "@firebase/performance": "0.4.4", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.1.30", + "@firebase/storage": "0.4.2", + "@firebase/util": "0.3.4" + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -6184,6 +6838,34 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gaxios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", + "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + } + } + }, + "gcp-metadata": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", + "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -6220,6 +6902,95 @@ "assert-plus": "^1.0.0" } }, + "gh-pages": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-3.1.0.tgz", + "integrity": "sha512-3b1rly9kuf3/dXsT8+ZxP0UhNLOo1CItj+3e31yUVcaph/yDsJ9RzD7JOw5o5zpBTJVQLlJAASNkUfepi9fe2w==", + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify-url": "^1.0.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -6302,6 +7073,45 @@ } } }, + "google-auth-library": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", + "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "google-p12-pem": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", + "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", + "requires": { + "node-forge": "^0.10.0" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -6312,6 +7122,17 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "gtoken": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz", + "integrity": "sha512-4d8N6Lk8TEAHl9vVoRVMh9BNOKWVgl2DdNtr3428O75r3QFrF/a5MMu851VmK0AA8+iSvbwRv69k5XnMLURGhg==", + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, "gzip-size": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", @@ -6450,6 +7271,19 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -6460,6 +7294,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -6658,11 +7500,29 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, + "humanize-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", + "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", + "requires": { + "normalize-url": "^1.0.0", + "strip-url-auth": "^1.0.0" + } + }, "husky": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", @@ -6811,6 +7671,11 @@ } } }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6827,6 +7692,11 @@ "postcss": "^7.0.14" } }, + "idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" + }, "identity-obj-proxy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", @@ -6894,6 +7764,14 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indefinite-observable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", + "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", + "requires": { + "symbol-observable": "1.2.0" + } + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -7194,6 +8072,11 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", @@ -7982,6 +8865,14 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -8057,6 +8948,85 @@ "verror": "1.10.0" } }, + "jss": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz", + "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "indefinite-observable": "^2.0.1", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz", + "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.5.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz", + "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-global": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz", + "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-nested": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz", + "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz", + "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz", + "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz", + "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.5.0" + } + }, "jsx-ast-utils": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", @@ -8066,6 +9036,25 @@ "object.assign": "^4.1.0" } }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -8512,6 +9501,11 @@ } } }, + "local-storage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/local-storage/-/local-storage-2.0.0.tgz", + "integrity": "sha512-/0sRoeijw7yr/igbVVygDuq6dlYCmtsuTmmpnweVlVtl/s10pf5BCq8LWBxW/AMyFJ3MhMUuggMZiYlx6qr9tw==" + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -8531,6 +9525,11 @@ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8690,6 +9689,11 @@ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==" }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -8927,6 +9931,25 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "mini-css-extract-plugin": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", @@ -9065,6 +10088,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -9161,6 +10189,11 @@ "tslib": "^1.10.0" } }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -9973,6 +11006,11 @@ "ts-pnp": "^1.1.6" } }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -10999,6 +12037,11 @@ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, + "promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, "prompts": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", @@ -11018,6 +12061,33 @@ "react-is": "^16.8.1" } }, + "protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "13.13.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.32.tgz", + "integrity": "sha512-sPBvDnrwZE1uePhkCEyI/qQlgZM5kePPAhHIFDWNsOrWBFRBOk3LKJYmVCLeLZlL9Ub/FzMJb31OTWCg2F+06g==" + } + } + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -11414,11 +12484,62 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" }, + "react-firebase-hooks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-firebase-hooks/-/react-firebase-hooks-2.2.0.tgz", + "integrity": "sha512-bwBaCYa8M+bpTqD0masAPGDTzxiTkGbyxv363hyR+NeNH1HbezPll6G7aMIGl+7OOYRPzfdmpkk72zc3VgXfEw==" + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, "react-scripts": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.3.tgz", @@ -11479,6 +12600,17 @@ "workbox-webpack-plugin": "4.3.1" } }, + "react-transition-group": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -11801,6 +12933,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -13005,6 +14142,19 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" + }, "style-loader": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", @@ -13081,6 +14231,11 @@ "util.promisify": "~1.0.0" } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -13319,6 +14474,16 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13392,6 +14557,14 @@ "punycode": "^2.1.0" } }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "ts-pnp": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.6.tgz", @@ -13710,6 +14883,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -14321,6 +15499,13 @@ "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-broadcast-update": { @@ -14329,6 +15514,13 @@ "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-build": { @@ -14370,6 +15562,43 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "requires": { + "workbox-core": "^4.3.1" + } } } }, @@ -14379,19 +15608,26 @@ "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.1.5.tgz", + "integrity": "sha512-9SOEle7YcJzg3njC0xMSmrPIiFjfsFm9WjwGd5enXmI8Lwk8wLdy63B0nzu5LXoibEmS9k+aWF8EzaKtOWjNSA==" }, "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.1.5.tgz", + "integrity": "sha512-6cN+FVbh8fNq56LFKPMchGNKCJeyboHsDuGBqmhDUPvD4uDjsegQpDQzn52VaE0cpywbSIsDF/BSq9E9Yjh5oQ==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^6.1.5" } }, "workbox-google-analytics": { @@ -14403,6 +15639,29 @@ "workbox-core": "^4.3.1", "workbox-routing": "^4.3.1", "workbox-strategies": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "requires": { + "workbox-core": "^4.3.1" + } + } } }, "workbox-navigation-preload": { @@ -14411,14 +15670,23 @@ "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.1.5.tgz", + "integrity": "sha512-yhm1kb6wgi141JeM5X7z42XJxCry53tbMLB3NgrxktrZbwbrJF8JILzYy+RFKC9tHC6u2bPmL789GPLT2NCDzw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^6.1.5", + "workbox-routing": "^6.1.5", + "workbox-strategies": "^6.1.5" } }, "workbox-range-requests": { @@ -14427,22 +15695,29 @@ "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.1.5.tgz", + "integrity": "sha512-uC/Ctz+4GXGL42h1WxUNKxqKRik/38uS0NZ6VY/EHqL2F1ObLFqMHUZ4ZYvyQsKdyI82cxusvhJZHOrY0a2fIQ==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^6.1.5" } }, "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.1.5.tgz", + "integrity": "sha512-QhiOn9KT9YGBdbfWOmJT6pXZOIAxaVrs6J6AMYzRpkUegBTEcv36+ZhE/cfHoT0u2fxVtthHnskOQ/snEzaXQw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^6.1.5" } }, "workbox-streams": { @@ -14451,6 +15726,13 @@ "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "workbox-sw": { @@ -14474,6 +15756,13 @@ "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", "requires": { "workbox-core": "^4.3.1" + }, + "dependencies": { + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + } } }, "worker-farm": { @@ -14565,6 +15854,11 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xregexp": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", diff --git a/package.json b/package.json index 7a4ded1..97810e3 100644 --- a/package.json +++ b/package.json @@ -3,21 +3,43 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fullcalendar/daygrid": "^5.6.0", + "@fullcalendar/react": "^5.6.0", + "@fullcalendar/timegrid": "^5.6.0", + "@material-ui/core": "^4.11.0", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "^4.0.0-alpha.57", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", + "dotenv": "^8.2.0", + "firebase": "^8.1.1", + "gh-pages": "^3.1.0", "husky": "^4.3.0", "lint-staged": "^10.4.0", + "local-storage": "^2.0.0", + "moment": "^2.29.1", "prettier": "^2.1.2", + "prop-types": "^15.7.2", "react": "^16.13.1", "react-dom": "^16.13.1", - "react-scripts": "3.4.3" + "react-firebase-hooks": "^2.2.0", + "react-router-dom": "^5.2.0", + "react-scripts": "3.4.3", + "workbox-core": "^6.1.5", + "workbox-expiration": "^6.1.5", + "workbox-precaching": "^6.1.5", + "workbox-routing": "^6.1.5", + "workbox-strategies": "^6.1.5" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "swtest": "npm run build && python3 -m http.server 3000 --bind 127.0.0.1 --directory build/", + "eject": "react-scripts eject", + "predeploy": "npm run build", + "deploy": "gh-pages -d build" }, "eslintConfig": { "extends": "airbnb", diff --git a/public/favicon.ico b/public/favicon.ico index bcd5dfd..cb4bb4d 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html index aa069f2..9f334df 100644 --- a/public/index.html +++ b/public/index.html @@ -1,21 +1,26 @@ - - - - - - - - - - - React App - - - -
- - + diff --git a/public/logo192.png b/public/logo192.png index fc44b0a..94a3da5 100644 Binary files a/public/logo192.png and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png index a4e47a6..874b496 100644 Binary files a/public/logo512.png and b/public/logo512.png differ diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..f588dd4 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,10 +1,10 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "IITH Dashboard", + "name": "IITH Dashboard", "icons": [ { "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", + "sizes": "64x64", "type": "image/x-icon" }, { @@ -18,7 +18,7 @@ "sizes": "512x512" } ], - "start_url": ".", + "start_url": "/", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" diff --git a/src/App.css b/src/App.css index 74b5e05..40b3193 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +1,18 @@ +@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;500;600&display=swap'); + .App { text-align: center; } -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; +.main-container { + padding-bottom: 20%; + padding-left: 0px; + padding-right: 0px; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } +.bottom-nav { + width: 100%; + position: fixed; + bottom: 0; + text-align: center; } diff --git a/src/App.js b/src/App.js index d6676e9..6c4690a 100644 --- a/src/App.js +++ b/src/App.js @@ -1,23 +1,230 @@ -import React from 'react'; -import logo from './logo.svg'; +import React, { useState, useEffect } from 'react'; +import firebase from 'firebase/app'; +import 'firebase/auth'; +import 'firebase/firestore'; +import dotenv from 'dotenv'; +import { useAuthState } from 'react-firebase-hooks/auth'; +import { Container, CssBaseline } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { ThemeProvider } from '@material-ui/core/styles'; +import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'; +import Home from './pages/Home'; +import Mess from './pages/Mess'; +// import Cab from './pages/Cab'; +import Timetable from './pages/TimeTable'; +import Bus from './pages/Bus'; +import BottomNav from './components/BottomNav'; +import NavbarDrawer from './components/NavbarDrawer'; +import Login from './pages/Login'; + +import makeEventList from './makeEventList'; + +import { lightTheme, darkTheme } from './Themes'; + import './App.css'; +dotenv.config(); + +firebase.initializeApp({ + apiKey: process.env.REACT_APP_FIREBASE_API_KEY, + authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, + databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL, + projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, + storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, + messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, + appId: process.env.REACT_APP_FIREBASE_APP_ID, +}); + function App() { + const [user, userLoading, userError] = useAuthState(firebase.auth()); // eslint-disable-line + const [messData, setMessData] = useState({}); + const [messDataLoading, setMessDataLoading] = useState(true); + const [messDataError, setMessDataError] = useState(false); + const [busData, setBusData] = useState({}); + const [busDataLoading, setBusDataLoading] = useState(true); + const [busDataError, setBusDataError] = useState(false); + + const masterKey = 'masterkey'; + const aimsKey = 'aimskey'; + const customKey = 'customkey'; + const themeKey = 'themeKey'; + + const [aimsTimetable, setAimsTimetable] = useState( + JSON.parse(localStorage.getItem(aimsKey)) || null, + ); + const [customEvents, setCustomEvents] = useState( + JSON.parse(localStorage.getItem(customKey)) || [], + ); + const [eventList, setEventList] = useState( + JSON.parse(localStorage.getItem(masterKey)) || [], + ); + const [theme, setTheme] = useState( + localStorage.getItem(themeKey) === 'light' ? lightTheme : darkTheme, + ); + + const db = firebase.firestore(); + + const addCustomEvent = (eventName, startTime, endTime) => { + const newEvent = { + title: eventName, + start: new Date(startTime), + end: new Date(endTime), + }; + localStorage.setItem( + customKey, + JSON.stringify([...customEvents, newEvent]), + ); + + const newEventList = makeEventList(aimsTimetable, [ + ...customEvents, + newEvent, + ]); + localStorage.setItem(masterKey, JSON.stringify(newEventList)); + + setEventList(newEventList); + setCustomEvents((currentList) => [...currentList, newEvent]); + }; + + const updateTT = () => { + if (user && !userLoading && !userError) { + const docRef = db.collection('users').doc(user.uid); + docRef + .get() + .then((doc) => { + if (doc.exists) { + const tt = {}; + tt.identifiedCourses = doc.data().identifiedCourses; + tt.identifiedSegments = doc.data().identifiedSegments; + tt.identifiedSlots = doc.data().identifiedSlots; + + if (JSON.stringify(aimsTimetable) !== JSON.stringify(tt)) { + const newEventList = makeEventList(tt, customEvents); + console.log(newEventList); + localStorage.setItem(masterKey, JSON.stringify(newEventList)); + setEventList(newEventList); + localStorage.setItem(aimsKey, JSON.stringify(tt)); + setAimsTimetable(tt); + } + } else { + console.log('No such document'); + } + }) + .catch((err) => { + console.log('Error getting document:', err); + }); + } + }; + + const toggleTheme = () => { + if (theme.palette.type === 'dark') { + localStorage.setItem(themeKey, 'light'); + setTheme({ ...lightTheme }); + } else { + localStorage.setItem(themeKey, 'dark'); + setTheme({ ...darkTheme }); + } + }; + + useEffect(() => { + fetch(process.env.REACT_APP_MESS_API_ENDPOINT) + .then((res) => res.json()) + .then((res) => { + setMessData(res); + setMessDataLoading(false); + }) + .catch(() => { + setMessDataError(true); + }); + }, [setMessData, setMessDataLoading, setMessDataError]); + + useEffect(() => { + fetch(process.env.REACT_APP_BUS_API_ENDPOINT) + .then((res) => res.json()) + .then((res) => { + setBusData(res); + setBusDataLoading(false); + }) + .catch(() => { + setBusDataError(true); + }); + }, [setBusData, setBusDataLoading, setBusDataError]); + + if (userError) { + return

An error has ocurred. Please try again later

; + } + + if (userLoading) { + return ( +
+ +
+ ); + } + + if (!user) { + return ; + } + if (window.location.pathname === '/iith-dashboard-pwa') window.location.href = '/'; return ( -
-
- logo -

IITH Dashboard

- - Learn React - -
-
+ + + + + + + + + + + + {/* + + */} + + + + + + + {/* No container here so that timetable component fills the width */} + + + + + + + + + + + + + + ); } diff --git a/src/Themes.js b/src/Themes.js new file mode 100644 index 0000000..da411c9 --- /dev/null +++ b/src/Themes.js @@ -0,0 +1,76 @@ +import { createMuiTheme } from '@material-ui/core/styles'; + +export const lightTheme = createMuiTheme({ + palette: { + primary: { + light: '#c158dc', + main: '#008080', + dark: '#00CCCC', + contrastText: '#FFFFFF', + }, + secondary: { + light: '#c158dc', + main: '#008080', + dark: '#00CCCC', + contrastText: '#FFFFFF', + }, + background: {}, + type: 'light', + }, + typography: { + fontFamily: [ + 'Source Sans Pro', + 'Lato', + 'Raleway', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + ].join(','), + }, +}); + +export const darkTheme = createMuiTheme({ + palette: { + primary: { + light: '#c158dc', + main: '#008080', + dark: '#006666', + contrastText: '#FFFFFF', + }, + secondary: { + light: '#c158dc', + main: '#008080', + dark: '#006666', + contrastText: '#FFFFFF', + }, + background: { + default: '#191919', + paper: '#272727', + }, + type: 'dark', + }, + typography: { + fontFamily: [ + 'Source Sans Pro', + 'Lato', + 'Raleway', + '-apple-system', + 'BlinkMacSystemFont', + '"Segoe UI"', + 'Roboto', + '"Helvetica Neue"', + 'Arial', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + ].join(','), + }, +}); diff --git a/src/components/BottomNav.js b/src/components/BottomNav.js new file mode 100644 index 0000000..25b2de2 --- /dev/null +++ b/src/components/BottomNav.js @@ -0,0 +1,67 @@ +import React, { useState, useEffect } from 'react'; +import { BottomNavigation, BottomNavigationAction } from '@material-ui/core'; +import HomeIcon from '@material-ui/icons/Home'; +import RestaurantIcon from '@material-ui/icons/Restaurant'; +// import LocalTaxiIcon from '@material-ui/icons/LocalTaxi'; +import DirectionsBusIcon from '@material-ui/icons/DirectionsBus'; +import CalendarTodayIcon from '@material-ui/icons/CalendarToday'; +import { Link } from 'react-router-dom'; + +function BottomNav() { + const [currentTab, setCurrentTab] = useState(''); + const [isMobile, setIsMobile] = useState(true); + const handleTabChange = (_, newTab) => { + setCurrentTab(newTab); + }; + useEffect(() => { + const currentPage = window.location.pathname; + // Delete the slash prefix + setCurrentTab(currentPage.substr(1)); + }, [setCurrentTab]); + useEffect(() => { + setIsMobile(window.innerWidth <= 500); + window.addEventListener('resize', () => { + setIsMobile(window.innerWidth <= 500); + }); + }, []); + return ( + + } + /> + } + /> + } + /> + {/* } + /> */} + } + /> + + ); +} +export default BottomNav; diff --git a/src/components/NavBarDrawer.css b/src/components/NavBarDrawer.css new file mode 100644 index 0000000..5d5d2bf --- /dev/null +++ b/src/components/NavBarDrawer.css @@ -0,0 +1,3 @@ +img { + height: 1.2em; +} diff --git a/src/components/NavbarDrawer.js b/src/components/NavbarDrawer.js new file mode 100644 index 0000000..462c462 --- /dev/null +++ b/src/components/NavbarDrawer.js @@ -0,0 +1,164 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import firebase from 'firebase/app'; +import 'firebase/auth'; +import AppBar from '@material-ui/core/AppBar'; +import CssBaseline from '@material-ui/core/CssBaseline'; +import Drawer from '@material-ui/core/Drawer'; +import Hidden from '@material-ui/core/Hidden'; +import IconButton from '@material-ui/core/IconButton'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemText from '@material-ui/core/ListItemText'; +import Divider from '@material-ui/core/Divider'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import MenuIcon from '@material-ui/icons/Menu'; +import SyncIcon from '@material-ui/icons/Sync'; +import ExitToAppIcon from '@material-ui/icons/ExitToApp'; +import Toolbar from '@material-ui/core/Toolbar'; +import Typography from '@material-ui/core/Typography'; +import { makeStyles } from '@material-ui/core/styles'; +import { Switch, FormControlLabel } from '@material-ui/core'; +import './NavBarDrawer.css'; + +const drawerWidth = 240; +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + }, + drawer: { + width: drawerWidth, + flexShrink: 0, + }, + appBar: { + zIndex: theme.zIndex.drawer + 1, + }, + menuButton: { + marginRight: theme.spacing(2), + }, + toolbar: theme.mixins.toolbar, + drawerPaper: { + width: drawerWidth, + }, + drawerContainer: { + overflow: 'auto', + }, + content: { + flexGrow: 1, + padding: theme.spacing(3), + }, +})); + +function NavbarDrawer({ updateTT, toggleTheme }) { + const classes = useStyles(); + const [mobileOpen, setMobileOpen] = React.useState(false); + function handleDrawerToggle() { + setMobileOpen(!mobileOpen); + } + const drawer = ( +
+ + + + + + + + + + + + { + localStorage.clear(); + firebase.auth().signOut(); + window.location.reload(); + }} + > + + + + + + + + + + } + label="Toggle Theme" + /> + + +
+ ); + return ( +
+ + + + + + + + IITH Dashboard + + + + + +
+
+
+
+ ); +} +NavbarDrawer.propTypes = { + updateTT: PropTypes.func, + toggleTheme: PropTypes.func, +}; +NavbarDrawer.defaultProps = { updateTT: () => {}, toggleTheme: () => {} }; +export default NavbarDrawer; diff --git a/src/components/logo.png b/src/components/logo.png new file mode 100644 index 0000000..81ef4e5 Binary files /dev/null and b/src/components/logo.png differ diff --git a/src/logo.png b/src/logo.png new file mode 100644 index 0000000..f225725 Binary files /dev/null and b/src/logo.png differ diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/makeEventList.js b/src/makeEventList.js new file mode 100644 index 0000000..a903826 --- /dev/null +++ b/src/makeEventList.js @@ -0,0 +1,268 @@ +import moment from 'moment'; + +const segmentStartDates = [ + '2021-08-16 00:00:00', + '2021-09-02 00:00:00', + '2021-09-22 00:00:00', + '2021-10-08 00:00:00', + '2021-11-01 00:00:00', + '2021-11-18 00:00:00', +]; + +const segmentEndDates = [ + '2021-09-01 11:59:59', + '2021-09-17 11:59:59', + '2021-10-07 11:59:59', + '2021-10-27 11:59:59', + '2021-11-17 11:59:59', + '2021-12-06 11:59:59', +]; + +const slotInfo = { + A: [ + { + day: 1, + hour: 9, + minute: 0, + duration: 55, + }, + { + day: 3, + hour: 11, + minute: 0, + duration: 55, + }, + { + day: 4, + hour: 10, + minute: 0, + duration: 55, + }, + ], + B: [ + { + day: 1, + hour: 10, + minute: 0, + duration: 55, + }, + { + day: 3, + hour: 9, + minute: 0, + duration: 55, + }, + { + day: 4, + hour: 11, + minute: 0, + duration: 55, + }, + ], + C: [ + { + day: 1, + hour: 11, + minute: 0, + duration: 55, + }, + { + day: 3, + hour: 10, + minute: 0, + duration: 55, + }, + { + day: 4, + hour: 9, + minute: 0, + duration: 55, + }, + ], + D: [ + { + day: 1, + hour: 12, + minute: 0, + duration: 55, + }, + { + day: 2, + hour: 9, + minute: 0, + duration: 55, + }, + { + day: 5, + hour: 11, + minute: 0, + duration: 55, + }, + ], + E: [ + { + day: 2, + hour: 10, + minute: 0, + duration: 55, + }, + { + day: 4, + hour: 12, + minute: 0, + duration: 55, + }, + { + day: 5, + hour: 9, + minute: 0, + duration: 55, + }, + ], + F: [ + { + day: 2, + hour: 11, + minute: 0, + duration: 55, + }, + { + day: 3, + hour: 14, + minute: 30, + duration: 55, + }, + { + day: 5, + hour: 10, + minute: 0, + duration: 55, + }, + ], + G: [ + { + day: 2, + hour: 12, + minute: 0, + duration: 55, + }, + { + day: 3, + hour: 12, + minute: 0, + duration: 55, + }, + { + day: 5, + hour: 12, + minute: 0, + duration: 55, + }, + ], + P: [ + { + day: 1, + hour: 14, + minute: 30, + duration: 85, + }, + { + day: 4, + hour: 16, + minute: 0, + duration: 85, + }, + ], + Q: [ + { + day: 1, + hour: 16, + minute: 0, + duration: 85, + }, + { + day: 4, + hour: 14, + minute: 30, + duration: 85, + }, + ], + R: [ + { + day: 2, + hour: 14, + minute: 30, + duration: 85, + }, + { + day: 5, + hour: 16, + minute: 0, + duration: 85, + }, + ], + S: [ + { + day: 2, + hour: 16, + minute: 0, + duration: 85, + }, + { + day: 5, + hour: 14, + minute: 30, + duration: 85, + }, + ], +}; + +function makeEventList(aimsTimeTable, customEventList) { + const courseEvents = []; + + if (aimsTimeTable) { + aimsTimeTable.identifiedCourses.forEach((courseCode, index) => { + const startSegment = Number(aimsTimeTable.identifiedSegments[index][0]); + const endSegment = Number( + aimsTimeTable.identifiedSegments[index].slice(-1), + ); + + const slot = aimsTimeTable.identifiedSlots[index]; + const segmentStartDate = moment(segmentStartDates[startSegment - 1]); + const segmentEndDate = moment(segmentEndDates[endSegment - 1]); + + slotInfo[slot].forEach((currSlot) => { + let i = currSlot.day; + + while (true) { + const courseTime = segmentStartDate + .clone() + .weekday(i) + .add(currSlot.hour, 'hours') + .add(currSlot.minute, 'minutes'); + + if (courseTime.isBefore(segmentStartDate)) { + i += 7; + continue; //eslint-disable-line + } + + if (courseTime.isAfter(segmentEndDate)) { + break; + } + + courseEvents.push({ + start: courseTime.toDate(), + end: courseTime.clone().add(currSlot.duration, 'minutes').toDate(), + title: courseCode, + }); + + i += 7; + } + }); + }); + } + + return [...courseEvents, ...customEventList]; +} + +export default makeEventList; diff --git a/src/pages/Bus.css b/src/pages/Bus.css new file mode 100644 index 0000000..72530e9 --- /dev/null +++ b/src/pages/Bus.css @@ -0,0 +1,4 @@ +.times-list { + max-height: 400px; + overflow: auto; +} diff --git a/src/pages/Bus.js b/src/pages/Bus.js new file mode 100644 index 0000000..e9a9675 --- /dev/null +++ b/src/pages/Bus.js @@ -0,0 +1,179 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import Button from '@material-ui/core/Button'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import Box from '@material-ui/core/Box'; +import { + Divider, List, ListItem, ListItemText, +} from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import './Bus.css'; + +function Bus({ schedule, loading, error }) { + const [location, setLocation] = useState('LAB'); + //const [isWeekend, setIsWeekend] = useState(false); + const isWeekend = false; + const [open, setOpen] = useState(false); + // const toggleWeek = () => { + // setIsWeekend(!isWeekend); + // }; + const handleClose = () => { + setOpen(false); + }; + + const handleOpen = () => { + setOpen(true); + }; + + const handleChange = (event) => { + setLocation(event.target.value); + }; + + const makeTimeList = (direction) => { + if (direction === 'to') { + let times; + if (location === 'LINGAMPALLY') { + if (isWeekend) { + times = schedule.TOIITH.LINGAMPALLYW; + } else { + times = schedule.TOIITH.LINGAMPALLY; + } + } else { + times = schedule.TOIITH[location]; + } + + return times.map((time) => ( + <> + + {time} + + + + )); + } + if (direction === 'from') { + let times; + if (location === 'LINGAMPALLY') { + if (isWeekend) { + times = schedule.FROMIITH.LINGAMPALLYW; + } else { + times = schedule.FROMIITH.LINGAMPALLY; + } + } else { + times = schedule.FROMIITH[location]; + } + + return times.map((time) => ( + <> + + {time} + + + + )); + } + + return ( + + Error + + ); + }; + + if (error) { + return ( +
+

Error. Please try again later

+ +
+ ); + } + + if (loading) { + return ( +
+ +
+ ); + } + + return ( +
+ + {/* */} + + + + +

+ IITH to + {` ${location[0]}${location.substr(1).toLowerCase()}`} +

+ {makeTimeList('to')} +
+ +

+ {location[0] + location.substr(1).toLowerCase()} + {' '} + to IITH +

+ {makeTimeList('from')} +
+
+
+ ); +} +export default Bus; + +Bus.propTypes = { + schedule: PropTypes.objectOf(PropTypes.object), + loading: PropTypes.bool, + error: PropTypes.bool, +}; + +Bus.defaultProps = { + schedule: {}, + loading: true, + error: false, +}; diff --git a/src/pages/Cab.js b/src/pages/Cab.js new file mode 100644 index 0000000..1c273d7 --- /dev/null +++ b/src/pages/Cab.js @@ -0,0 +1,6 @@ +import React from 'react'; + +function Cab() { + return

Cab Page

; +} +export default Cab; diff --git a/src/pages/Home.js b/src/pages/Home.js new file mode 100644 index 0000000..cf64cf5 --- /dev/null +++ b/src/pages/Home.js @@ -0,0 +1,433 @@ +import React, { useState, useEffect } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Card from '@material-ui/core/Card'; +import Button from '@material-ui/core/Button'; +import PropTypes from 'prop-types'; +import CardContent from '@material-ui/core/CardContent'; +import Typography from '@material-ui/core/Typography'; +import Paper from '@material-ui/core/Paper'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { Divider } from '@material-ui/core'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; + +const useStyles = makeStyles({ + root: { + minWidth: 275, + marginBottom: '3px', + }, + bullet: { + display: 'inline-block', + margin: '0 2px', + transform: 'scale(0.8)', + }, + title: { + fontSize: 14, + }, + pos: { + marginBottom: 12, + }, +}); + +const useStyles2 = makeStyles((theme) => ({ + root: { + flexGrow: 1, + }, + paper: { + padding: theme.spacing(2), + textAlign: 'center', + color: theme.palette.text.secondary, + fontSize: 14, + }, +})); + +const days = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', +]; + +function Home({ + Menu, schedule, events, loading, error, +}) { + const [times, setTimes] = useState(null); + const [start, setStart] = useState(0); + const [open, setOpen] = useState(false); + const activeStep = new Date().getDay(); + const classes = useStyles(); + const classes2 = useStyles2(); + const hall = 'LDH'; + useEffect(() => { + if (!error && !loading && schedule) { + const date = new Date(); + const hours = date.getHours() + date.getMinutes() / 60; + const buses = []; + let check = 0; + if (start === 0) { + let timeSet = schedule.TOIITH.LINGAMPALLY.map((x) => x); + if (date.getDay() === 0 || date.getDay() === 6) { + timeSet = schedule.TOIITH.LINGAMPALLYW.map((x) => x); + } + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + timeSet = schedule.TOIITH.LAB.map((x) => x); + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + timeSet = schedule.TOIITH.SANGAREDDY.map((x) => x); + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + } else { + let timeSet = schedule.FROMIITH.LINGAMPALLY.map((x) => x); + if (date.getDay() === 0 || date.getDay() === 6) { + timeSet = schedule.FROMIITH.LINGAMPALLYW.map((x) => x); + } + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + timeSet = schedule.FROMIITH.LAB.map((x) => x); + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + timeSet = schedule.FROMIITH.SANGAREDDY.map((x) => x); + for (let i = 0; i < timeSet.length; i += 1) { + const index = timeSet[i].lastIndexOf(':'); + const hoursText = parseFloat(timeSet[i].substring(0, index)) + + parseFloat(timeSet[i].substring(index + 1, timeSet[i].length)) / 60; + if (hoursText > hours) { + check = 1; + buses.push(timeSet[i]); + break; + } + } + if (check === 0) buses.push(timeSet[0]); + check = 0; + } + console.log('Done'); + setTimes(buses); + } + }, [schedule, start, setTimes, error, loading]); + + const getMeal = (meal) => { + const listItems = Menu[hall][days[activeStep]][meal]; + const additionalKey = `${hall} Additional`; + const extraItems = Menu[additionalKey][days[activeStep]][meal]; + return ( + +
+ {listItems.join(', ')} + +
+ + Extras + +
+ + {extraItems.map((item) => ( + {item} + ))} + +
+
+ ); + }; + + const getEvents = () => { + const today = new Date(); + const currentEvents = []; + let count = 0; + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + const eventDate = new Date(event.start); + if ( + eventDate.getDate() === today.getDate() + && eventDate.getMonth() === today.getMonth() + && eventDate.getFullYear() === today.getFullYear() + ) { + const newEvent = {}; + newEvent.title = event.title; + const endDate = new Date(event.end); + if ( + eventDate.getDate() === endDate.getDate() + && eventDate.getMonth() === endDate.getMonth() + && eventDate.getFullYear() === endDate.getFullYear() + ) { + newEvent.timestamp = `${eventDate.getHours().toString()}:${ + eventDate.getMinutes().toString() === '0' + ? '00' + : eventDate.getMinutes().toString() + } - ${endDate.getHours().toString()}:${ + endDate.getMinutes().toString() === '0' + ? '00' + : endDate.getMinutes().toString() + }`; + } else { + newEvent.timestamp = ''; + } + count += 1; + currentEvents.push(newEvent); + } + } + if (count === 0) { + return ( +
+ Plenty of time to spare! +
+ ); + } + return ( +
+
    + {currentEvents.map((item) => ( +
  • + {`${item.title} ${item.timestamp}`} +
  • + ))} +
+
+ ); + }; + const toggleStart = (event) => { + if (event.target.value === '0') setStart(0); + else setStart(1); + }; + const handleClose = () => { + setOpen(false); + }; + + const handleOpen = () => { + setOpen(true); + }; + const getMealKey = () => { + const date = new Date(); + const hours = date.getHours() + date.getMinutes() / 60; + if (hours >= 10 && hours <= 15) return 'Lunch'; + if (hours >= 15 && hours <= 18.5) return 'Snacks'; + if (hours >= 18.5 && hours <= 22.5) return 'Dinner'; + return 'Breakfast'; + }; + const mealKey = getMealKey(); + + if (error) { + return ( +
+

Error. Please try again later

+ +
+ ); + } + + if (loading) { + return ( +
+ +
+ ); + } + + return ( +
+ { + if (window.location.pathname !== '/timetable') window.location.assign(`${window.location.href}timetable`); + }} + style={{ marginBottom: '10px' }} + > + + Today's Agenda + {getEvents()} + + + { + if (window.location.pathname !== '/mess') window.location.assign(`${window.location.href}mess`); + }} + style={{ marginBottom: '10px' }} + > + + + Today's + {` ${mealKey}`} + + {getMeal(mealKey)} + + + + + + + + { + if (window.location.pathname !== '/bus') window.location.assign(`${window.location.href}bus`); + }} + > + EV schedule + + + + + + + + + { + if (window.location.pathname !== '/bus') window.location.assign(`${window.location.href}bus`); + }} + > + + + Lingampally + + + + + MainGate + + + + + Sangareddy + + + + + {times != null ? times[0] : 'loading'} + + + + + {times != null ? times[1] : 'loading'} + + + + + {times != null ? times[2] : 'loading'} + + + + + + +
+ ); +} + +Home.propTypes = { + Menu: PropTypes.objectOf(PropTypes.object), + schedule: PropTypes.objectOf(PropTypes.object), + events: PropTypes.arrayOf(PropTypes.object), + loading: PropTypes.bool, + error: PropTypes.bool, +}; + +Home.defaultProps = { + Menu: {}, + schedule: {}, + events: [], + loading: true, + error: false, +}; + +export default Home; diff --git a/src/pages/Login.js b/src/pages/Login.js new file mode 100644 index 0000000..fe1fed7 --- /dev/null +++ b/src/pages/Login.js @@ -0,0 +1,43 @@ +import React from 'react'; +import { Button, Container } from '@material-ui/core'; +import firebase from 'firebase/app'; +import logo from '../logo.png'; + +const googleProvider = new firebase.auth.GoogleAuthProvider(); + +const login = () => { + const provider = googleProvider; + provider.addScope('profile'); + provider.addScope('email'); + firebase + .auth() + .signInWithRedirect(provider) + .then(() => { + console.log('Success'); + }) + .catch((err) => { + console.log(err); + }); +}; + +function Login() { + return ( + + IITH-Dashboard Logo +

Sign in to continue to IITH Dashboard.

+ +
+ ); +} + +export default Login; diff --git a/src/pages/Mess.css b/src/pages/Mess.css new file mode 100644 index 0000000..a90e94d --- /dev/null +++ b/src/pages/Mess.css @@ -0,0 +1,7 @@ +.card-props { + margin-top: 5%; + min-width: 275; +} +.button-props { + margin-bottom: 2%; +} diff --git a/src/pages/Mess.js b/src/pages/Mess.js new file mode 100644 index 0000000..8d9e462 --- /dev/null +++ b/src/pages/Mess.js @@ -0,0 +1,308 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import Stepper from '@material-ui/core/Stepper'; +import Step from '@material-ui/core/Step'; +import StepButton from '@material-ui/core/StepButton'; +import { useTheme, Divider } from '@material-ui/core'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import Button from '@material-ui/core/Button'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import Box from '@material-ui/core/Box'; +import Grid from '@material-ui/core/Grid'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; + +import './Mess.css'; + +const days = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', +]; + +function LensIcon({ color }) { + return ( + + + + ); +} + +LensIcon.propTypes = { + color: PropTypes.string, +}; + +LensIcon.defaultProps = { + color: 'red', +}; + +const StepIcon = ({ + day, + activeStep, + activeColor, + defaultColor, + textColor, +}) => { + let color = defaultColor; + if (day === days[activeStep]) { + color = activeColor; + } + return ( +
+ +
+ {day[0]} +
+
+ ); +}; + +StepIcon.propTypes = { + day: PropTypes.string, + activeStep: PropTypes.number, + activeColor: PropTypes.string, + defaultColor: PropTypes.string, + textColor: PropTypes.string, +}; +StepIcon.defaultProps = { + day: 'Sunday', + activeStep: 0, + activeColor: 'red', + defaultColor: 'red', + textColor: 'black', +}; + +function Mess({ Menu, loading, error }) { + const date = new Date(); + const [activeStep, setActiveStep] = useState(date.getDay()); + const theme = useTheme(); + const [open, setOpen] = useState(false); + const [hall, setHall] = useState( + localStorage.getItem('messPreference') || 'LDH', + ); + const handleChange = (event) => { + localStorage.setItem('messPreference', event.target.value); + setHall(event.target.value); + }; + const handleClose = () => { + setOpen(false); + }; + + const handleOpen = () => { + setOpen(true); + }; + const getMealKey = () => { + const hours = date.getHours() + date.getMinutes() / 60; + if (hours >= 10 && hours <= 15) return 'Lunch'; + if (hours >= 15 && hours <= 18.5) return 'Snacks'; + if (hours >= 18.5 && hours <= 22.5) return 'Dinner'; + return 'Breakfast'; + }; + const mealKey = getMealKey(); + const getMeal = (meal) => { + const listItems = Menu[hall][days[activeStep]][meal]; + const additionalKey = `${hall} Additional`; + const extraItems = Menu[additionalKey][days[activeStep]][meal]; + if (typeof extraItems === 'string') { + return ( +
+ {listItems.map((item) => ( +
{item}
+ ))} +
+ ); + } + return ( +
+ {listItems.map((item) => ( +
{item}
+ ))} + +
+ Extras +
+ {extraItems.map((item) => ( +
{item}
+ ))} +
+ ); + }; + + if (error) { + return ( +
+

Error. Please try again later

+ +
+ ); + } + + if (loading) { + return ( +
+ +
+ ); + } + + return ( +
+ + {days.map((day, index) => ( + + + )} + onClick={() => setActiveStep(index)} + /> + + ))} + + + + + + + + Mess Menu + + + + + + + + + + } + aria-controls="panel1a-content" + id="panel1a-header" + > + Breakfast + + {getMeal('Breakfast')} + + + } + aria-controls="panel2a-content" + id="panel2a-header" + > + Lunch + + {getMeal('Lunch')} + + + } + aria-controls="panel2a-content" + id="panel2a-header" + > + Snacks + + {getMeal('Snacks')} + + + } + aria-controls="panel2a-content" + id="panel2a-header" + > + Dinner + + {getMeal('Dinner')} + + + + +
+ ); +} + +Mess.propTypes = { + Menu: PropTypes.objectOf(PropTypes.object), + loading: PropTypes.bool, + error: PropTypes.bool, +}; + +Mess.defaultProps = { + Menu: {}, + loading: true, + error: false, +}; + +export default Mess; diff --git a/src/pages/TimeTable.css b/src/pages/TimeTable.css new file mode 100644 index 0000000..233ea61 --- /dev/null +++ b/src/pages/TimeTable.css @@ -0,0 +1,80 @@ +#calendar-div { + --primary-color: teal; + --text-color: white; + --border-color: white; + padding-left: 15px; + padding-right: 15px; +} + +.fc-event-time { + display: none; +} + +.fc-event-title { + top: 0; + bottom: 0; + max-height: 100%; + overflow: hidden; + font-size: 85%; + font-weight: bolder; +} + +.fc-v-event { + border: 1px solid var(--primary-color); +} + +.fc-v-event .fc-event-main { + color: white; + height: 100%; + background-color: var(--primary-color); + color: var(--text-color); + border: 1px solid var(--primary-color); +} + +.fc-button-group { + margin-left: 2px; + margin-right: 2px; +} + +.fc-header-toolbar { + margin-bottom: 1.25rem; + margin-left: 1.5em; +} + +.fc-button { + background-color: var(--primary-color) !important; +} + +.fc-button-active { + opacity: 0.6; +} + +.fc-daygrid-event-dot { + margin: 0 4px; + box-sizing: content-box; + width: 0; + height: 0; + border: 4px solid #3788d8; + border: calc(var(--fc-daygrid-event-dot-width, 8px) / 2) solid + var(--fc-event-border-color, var(--primary-color)); + border-radius: 4px; + border-radius: calc(var(--fc-daygrid-event-dot-width, 8px) / 2); +} + +.fc-header-toolbar { + margin-bottom: 1.5em; + margin-left: 0em; + margin-right: 0em; +} + +.fc-theme-standard td { + border: 1px solid var(--fc-border-color, var(--border-color)); +} + +.fc-theme-standard th { + border: 1px solid var(--fc-border-color, var(--border-color)); +} + +.fc-theme-standard .fc-scrollgrid { + border: 1px solid var(--fc-border-color, var(--border-color)); +} diff --git a/src/pages/TimeTable.js b/src/pages/TimeTable.js new file mode 100644 index 0000000..6fd5f1a --- /dev/null +++ b/src/pages/TimeTable.js @@ -0,0 +1,244 @@ +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; +import FullCalendar from '@fullcalendar/react'; +import timeGridPlugin from '@fullcalendar/timegrid'; +import dayGridPlugin from '@fullcalendar/daygrid'; +import { makeStyles, useTheme } from '@material-ui/core/styles'; +import Button from '@material-ui/core/Button'; +import TextField from '@material-ui/core/TextField'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import SnackBar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import Box from '@material-ui/core/Box'; + +import './TimeTable.css'; + +function TimeTable({ eventList, handleNewCustomEvent }) { + const [open, setOpen] = useState(false); + const [def, setDefault] = useState(null); + const [showAimsError, setShowAimsError] = useState( + localStorage.getItem('aimskey') === null, + ); + + const muiTheme = useTheme(); + + let title = ''; + let eventDate = null; + let startTime = null; + let endTime = null; + + const handleClickOpen = () => { + setOpen(true); + }; + + const useStyles = makeStyles((theme) => ({ + container: { + display: 'flex', + flexWrap: 'wrap', + }, + textField: { + marginLeft: theme.spacing(1), + marginRight: theme.spacing(1), + width: 200, + }, + })); + + useEffect(() => { + document + .querySelector('#calendar-div') + .style.setProperty('--primary-color', muiTheme.palette.primary.main); + document + .querySelector('#calendar-div') + .style.setProperty('--text-color', muiTheme.palette.primary.contrastText); + document + .querySelector('#calendar-div') + .style.setProperty('--border-color', '#808080'); + }); + + useEffect(() => { + const today = new Date(); + const date = `${today.getFullYear().toString()}-${ + today.getMonth() + 1 < 10 + ? `0${(today.getMonth() + 1).toString()}` + : (today.getMonth() + 1).toString() + }-${today + .getDate() + .toString()}T${today + .getHours() + .toString()}:${today.getMinutes().toString()}`; + setDefault(date); + }, []); + + const classes = useStyles(); + + const handleClose = () => { + setOpen(false); + }; + + const handleTitleChange = (event) => { + title = event.target.value; + }; + + const handleDateChange = (event) => { + eventDate = event.target.value; + }; + + const handleStartChange = (event) => { + startTime = event.target.value; + }; + + const handleEndChange = (event) => { + endTime = event.target.value; + }; + + const genNewEvent = () => { + if (!eventDate || !endTime || !startTime) { + alert('Start and End Times must be specified to create a new event'); + handleClose(); + return; + } + // TODO: Ensure that end date is after start date, might mess up the Calendar library otherwise + const startDate = new Date(`${eventDate} ${startTime}:00`); + const endDate = new Date(`${eventDate} ${endTime}:00`); + if (startDate < endDate) { + handleNewCustomEvent(title, startDate, endDate); + } else { + handleNewCustomEvent(title, endDate, startDate); + } + handleClose(); + }; + + return ( +
+ + + + + + { + if (reason === 'clickaway') { + return; + } + + setShowAimsError(false); + }} + style={{ + marginBottom: '10%', + }} + > + + AIMS Timetable not synced + + + + Add event + + + Fill out the details of the event below: + + + + + + + + + + +
+ ); +} + +TimeTable.propTypes = { + eventList: PropTypes.arrayOf(PropTypes.object), + handleNewCustomEvent: PropTypes.func, +}; + +TimeTable.defaultProps = { + eventList: [], + handleNewCustomEvent: () => { + alert('Error, please try again later'); + }, +}; + +export default TimeTable; diff --git a/src/service-worker.js b/src/service-worker.js new file mode 100644 index 0000000..bf180dd --- /dev/null +++ b/src/service-worker.js @@ -0,0 +1,72 @@ +/* eslint-disable no-restricted-globals */ + +// This service worker can be customized! +// See https://developers.google.com/web/tools/workbox/modules +// for the list of available Workbox modules, or add any other +// code you'd like. +// You can also remove this file if you'd prefer not to use a +// service worker, and the Workbox build step will be skipped. + +import { clientsClaim } from 'workbox-core'; +import { ExpirationPlugin } from 'workbox-expiration'; +import { precacheAndRoute, createHandlerBoundToURL } from 'workbox-precaching'; +import { registerRoute } from 'workbox-routing'; +import { StaleWhileRevalidate } from 'workbox-strategies'; + +clientsClaim(); + +// Precache all of the assets generated by your build process. +// Their URLs are injected into the manifest variable below. +// This variable must be present somewhere in your service worker file, +// even if you decide not to use precaching. See https://cra.link/PWA +precacheAndRoute(self.__WB_MANIFEST); //eslint-disable-line + +// Set up App Shell-style routing, so that all navigation requests +// are fulfilled with your index.html shell. Learn more at +// https://developers.google.com/web/fundamentals/architecture/app-shell +const fileExtensionRegexp = new RegExp('/[^/?]+\\.[^/]+$'); +registerRoute( + // Return false to exempt requests from being fulfilled by index.html. + ({ request, url }) => { + // If this isn't a navigation, skip. + if (request.mode !== 'navigate') { + return false; + } // If this is a URL that starts with /_, skip. + + if (url.pathname.startsWith('/_')) { + return false; + } // If this looks like a URL for a resource, because it contains // a file extension, skip. + + if (url.pathname.match(fileExtensionRegexp)) { + return true; + } // Return true to signal that we want to use the handler. + + return true; + }, + createHandlerBoundToURL(`${process.env.PUBLIC_URL}/index.html`), +); + +// An example runtime caching route for requests that aren't handled by the +// precache, in this case same-origin .png requests like those from in public/ +registerRoute( + // Add in any other file extensions or routing criteria as needed. + ({ url }) => url.origin === self.location.origin && url.pathname.endsWith('.png'), // Customize this strategy as needed, e.g., by changing to CacheFirst. + new StaleWhileRevalidate({ + cacheName: 'images', + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ maxEntries: 50 }), + ], + }), +); + +// This allows the web app to trigger skipWaiting via +// registration.waiting.postMessage({type: 'SKIP_WAITING'}) +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') { + self.skipWaiting(); + } +}); + +// Any other custom service worker logic can go here. diff --git a/src/serviceWorker.js b/src/serviceWorker.js index 5d050e8..7c91591 100644 --- a/src/serviceWorker.js +++ b/src/serviceWorker.js @@ -30,7 +30,6 @@ export function register(config) { // serve assets; see https://github.com/facebook/create-react-app/issues/2374 return; } - window.addEventListener("load", () => { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; @@ -51,6 +50,14 @@ export function register(config) { registerValidSW(swUrl, config); } }); + window.addEventListener("fetch", function (event) { + console.log("Request made"); + event.respondWith( + fetch(event.request).catch(function () { + return caches.match(event.request); + }) + ); + }); } }