diff --git a/package-lock.json b/package-lock.json
index d91426e..702b407 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,8 +8,11 @@
"name": "react-auth-template",
"version": "0.1.0",
"dependencies": {
+ "@ramonak/react-progress-bar": "^5.0.3",
"classnames": "^2.3.2",
+ "env-cmd": "^10.1.0",
"firebase": "^8.10.1",
+ "jsonwebtoken": "^9.0.0",
"papaparse": "^5.4.1",
"react": "^17.0.2",
"react-circular-progressbar": "^2.1.0",
@@ -18,6 +21,8 @@
"react-scripts": "4.0.3",
"react-search-box": "^2.3.0",
"react-select": "^5.7.0",
+ "react-slidy": "^4.3.3",
+ "react-spinners": "^0.13.8",
"react-toastify": "^8.1.0"
},
"devDependencies": {
@@ -1749,11 +1754,11 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.0.tgz",
- "integrity": "sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+ "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"dependencies": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.13.11"
},
"engines": {
"node": ">=6.9.0"
@@ -1886,17 +1891,6 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@emotion/babel-plugin/node_modules/@babel/runtime": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
- "dependencies": {
- "regenerator-runtime": "^0.13.11"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -1933,11 +1927,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@emotion/babel-plugin/node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- },
"node_modules/@emotion/babel-plugin/node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -2011,22 +2000,6 @@
}
}
},
- "node_modules/@emotion/react/node_modules/@babel/runtime": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
- "dependencies": {
- "regenerator-runtime": "^0.13.11"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@emotion/react/node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- },
"node_modules/@emotion/serialize": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz",
@@ -3336,6 +3309,15 @@
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
+ "node_modules/@ramonak/react-progress-bar": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@ramonak/react-progress-bar/-/react-progress-bar-5.0.3.tgz",
+ "integrity": "sha512-VxXGKN74q94jYoeYuFNJm3xvWhVz9dy+alFZ8S4ZmTTr/05CCq9PjwthT8JB27UdAvn8pHvKBmemV8JU2cZi6A==",
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17 || ^18",
+ "react-dom": "^16.0.0 || ^17 || ^18"
+ }
+ },
"node_modules/@remix-run/router": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz",
@@ -5737,6 +5719,11 @@
"isarray": "^1.0.0"
}
},
+ "node_modules/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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -7554,6 +7541,14 @@
"stream-shift": "^1.0.0"
}
},
+ "node_modules/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==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -7676,6 +7671,75 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/env-cmd": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz",
+ "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==",
+ "dependencies": {
+ "commander": "^4.0.0",
+ "cross-spawn": "^7.0.0"
+ },
+ "bin": {
+ "env-cmd": "bin/env-cmd.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/env-cmd/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/env-cmd/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/env-cmd/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/env-cmd/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/env-cmd/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@@ -10580,6 +10644,11 @@
"node": ">= 0.4"
}
},
+ "node_modules/intersection-observer": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz",
+ "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ=="
+ },
"node_modules/ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -12791,6 +12860,35 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+ "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jsx-ast-utils": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
@@ -12803,6 +12901,25 @@
"node": ">=4.0"
}
},
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"node_modules/killable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -15784,13 +15901,13 @@
}
},
"node_modules/prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
- "react-is": "^16.8.1"
+ "react-is": "^16.13.1"
}
},
"node_modules/protobufjs": {
@@ -16449,6 +16566,28 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/react-slidy": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/react-slidy/-/react-slidy-4.3.3.tgz",
+ "integrity": "sha512-SWdHk+x5epue3Kg5YdpO0kPhjh+K4PbOSKvRNbt++KEhG87NbvY6kLmuGQ0CmhzoW26vVMMkT4Conjj0ylW8Tg==",
+ "dependencies": {
+ "intersection-observer": "0.10.0"
+ },
+ "peerDependencies": {
+ "prop-types": "15",
+ "react": ">= 16.8.0",
+ "react-dom": ">= 16.8.0"
+ }
+ },
+ "node_modules/react-spinners": {
+ "version": "0.13.8",
+ "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz",
+ "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==",
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/react-toastify": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz",
@@ -16586,9 +16725,9 @@
}
},
"node_modules/regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"node_modules/regenerator-transform": {
"version": "0.14.5",
@@ -19046,9 +19185,9 @@
}
},
"node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
},
"node_modules/tsutils": {
"version": "3.21.0",
@@ -22526,11 +22665,11 @@
}
},
"@babel/runtime": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.0.tgz",
- "integrity": "sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+ "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"requires": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.13.11"
}
},
"@babel/runtime-corejs3": {
@@ -22630,14 +22769,6 @@
"@babel/helper-plugin-utils": "^7.18.6"
}
},
- "@babel/runtime": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- },
"babel-plugin-macros": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
@@ -22661,11 +22792,6 @@
"has": "^1.0.3"
}
},
- "regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- },
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -22721,21 +22847,6 @@
"@emotion/utils": "^1.2.0",
"@emotion/weak-memoize": "^0.3.0",
"hoist-non-react-statics": "^3.3.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
- "requires": {
- "regenerator-runtime": "^0.13.11"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- }
}
},
"@emotion/serialize": {
@@ -23769,6 +23880,12 @@
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
+ "@ramonak/react-progress-bar": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@ramonak/react-progress-bar/-/react-progress-bar-5.0.3.tgz",
+ "integrity": "sha512-VxXGKN74q94jYoeYuFNJm3xvWhVz9dy+alFZ8S4ZmTTr/05CCq9PjwthT8JB27UdAvn8pHvKBmemV8JU2cZi6A==",
+ "requires": {}
+ },
"@remix-run/router": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.3.tgz",
@@ -25677,6 +25794,11 @@
}
}
},
+ "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": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
@@ -27131,6 +27253,14 @@
"stream-shift": "^1.0.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",
@@ -27229,6 +27359,53 @@
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
},
+ "env-cmd": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz",
+ "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==",
+ "requires": {
+ "commander": "^4.0.0",
+ "cross-spawn": "^7.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
"errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@@ -29437,6 +29614,11 @@
"side-channel": "^1.0.4"
}
},
+ "intersection-observer": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.10.0.tgz",
+ "integrity": "sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ=="
+ },
"ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -31068,6 +31250,27 @@
"universalify": "^2.0.0"
}
},
+ "jsonwebtoken": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+ "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
"jsx-ast-utils": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
@@ -31077,6 +31280,25 @@
"object.assign": "^4.1.2"
}
},
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"killable": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -33466,13 +33688,13 @@
}
},
"prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"requires": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
- "react-is": "^16.8.1"
+ "react-is": "^16.13.1"
}
},
"protobufjs": {
@@ -33993,6 +34215,20 @@
"use-isomorphic-layout-effect": "^1.1.2"
}
},
+ "react-slidy": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/react-slidy/-/react-slidy-4.3.3.tgz",
+ "integrity": "sha512-SWdHk+x5epue3Kg5YdpO0kPhjh+K4PbOSKvRNbt++KEhG87NbvY6kLmuGQ0CmhzoW26vVMMkT4Conjj0ylW8Tg==",
+ "requires": {
+ "intersection-observer": "0.10.0"
+ }
+ },
+ "react-spinners": {
+ "version": "0.13.8",
+ "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz",
+ "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==",
+ "requires": {}
+ },
"react-toastify": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-8.2.0.tgz",
@@ -34104,9 +34340,9 @@
}
},
"regenerator-runtime": {
- "version": "0.13.9",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
- "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"regenerator-transform": {
"version": "0.14.5",
@@ -36033,9 +36269,9 @@
}
},
"tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
},
"tsutils": {
"version": "3.21.0",
diff --git a/package.json b/package.json
index a6f4ed8..3c21a4b 100644
--- a/package.json
+++ b/package.json
@@ -3,8 +3,11 @@
"version": "0.1.0",
"private": true,
"dependencies": {
+ "@ramonak/react-progress-bar": "^5.0.3",
"classnames": "^2.3.2",
+ "env-cmd": "^10.1.0",
"firebase": "^8.10.1",
+ "jsonwebtoken": "^9.0.0",
"papaparse": "^5.4.1",
"react": "^17.0.2",
"react-circular-progressbar": "^2.1.0",
@@ -13,12 +16,14 @@
"react-scripts": "4.0.3",
"react-search-box": "^2.3.0",
"react-select": "^5.7.0",
+ "react-slidy": "^4.3.3",
+ "react-spinners": "^0.13.8",
"react-toastify": "^8.1.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
- "test": "react-scripts",
+ "test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
diff --git a/src/App.js b/src/App.js
index dbc70aa..929b4b8 100644
--- a/src/App.js
+++ b/src/App.js
@@ -31,15 +31,18 @@ const App = () => {
}>
} />
} />
- } />
- } />
- } />
+ } />
+ }
+ />
+ } />
} />
} />
} />
} />
- } />
+ } />
diff --git a/src/components/AddChild/index.js b/src/components/AddChild/index.js
new file mode 100644
index 0000000..031c506
--- /dev/null
+++ b/src/components/AddChild/index.js
@@ -0,0 +1,146 @@
+import React, { useState, useEffect } from "react";
+import classNames from "classnames/bind";
+import styles from "./index.module.css";
+import { useWindowSize } from "../../lib/hooks";
+import {
+ AUTH_INPUT_LABELS,
+ SCHOOL_DISTRICT,
+ DISABILITY,
+ WINDOW_TYPE,
+ STATUS_CODE,
+} from "../../lib/constants";
+import { AuthInputBlock } from "../../components/AuthInputBlock";
+import { AuthSelectBlock } from "../../components/AuthSelectBlock";
+import { AuthButton } from "../AuthButton";
+
+const cx = classNames.bind(styles);
+
+export function AddChild(props) {
+ const isMobile = useWindowSize().type === WINDOW_TYPE.MOBILE;
+
+ const [child, setChild] = useState({});
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState("");
+ const [submitted, setSubmitted] = useState(false);
+ const [leavePage, setLeavePage] = useState(false);
+
+ useEffect(() => {
+ if (leavePage) {
+ if (submitted) {
+ props.setChildren([...props.currChildren, child]);
+ }
+ props.setAddChild(false);
+ }
+ }, [leavePage]);
+
+ const checkValidBirthday = () => {
+ const birthday = child.birthDate;
+
+ // Regular expression for MM-DD-YYYY format
+ const regex = /^\d{2}-\d{2}-\d{4}$/;
+
+ // Check if the input matches the regular expression
+ if (!regex.test(birthday)) {
+ return false;
+ }
+
+ // Check if the date is valid
+ const parts = birthday.split("-");
+ const month = parseInt(parts[0], 10);
+ const day = parseInt(parts[1], 10);
+ const year = parseInt(parts[2], 10);
+
+ // JavaScript Date object will automatically handle leap year
+ const date = new Date(year, month - 1, day);
+ const isValid =
+ date.getFullYear() === year &&
+ date.getMonth() === month - 1 &&
+ date.getDate() === day;
+
+ return isValid;
+ };
+
+ const onSubmit = async () => {
+ if (!child.firstName) props.toast("Please provide your child's name");
+ else if (!child.birthDate)
+ props.toast("Please provide your child's birthdate");
+ else if (!checkValidBirthday(child.birthDate))
+ props.toast("Please enter the birthday in the correct format");
+ else if (!child.schoolDistrict)
+ props.toast("Please provide your child's school district");
+ else if (!child.disabilities)
+ props.toast("Please provide your child's disability");
+ else {
+ setSubmitted(true);
+ setLeavePage(true);
+ }
+ };
+
+ return (
+
+
+
+
+
setLeavePage(true)}
+ style={{
+ borderRadius: "30%",
+ height: "auto",
+ width: "30px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ }}
+ />
+ {" "}
+
+
Add a Child
+
setChild({ ...child, firstName: value })}
+ />
+ setChild({ ...child, birthDate: value })}
+ />
+
+ setChild({ ...child, schoolDistrict: value.label })
+ }
+ />
+ setChild({ ...child, disabilities: value })}
+ />
+
+
+
+ );
+}
diff --git a/src/components/AddChild/index.module.css b/src/components/AddChild/index.module.css
new file mode 100644
index 0000000..f9175f3
--- /dev/null
+++ b/src/components/AddChild/index.module.css
@@ -0,0 +1,85 @@
+.content {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100vh;
+ background-color: rgba(0, 0, 0, 0.2);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.popup {
+ display: block;
+ background-color: white;
+ width: 80%;
+ height: auto;
+
+ font-family: "Poppins";
+ padding: 30px;
+ border-radius: 30px;
+}
+
+.title {
+ margin: 0;
+ font-size: 7vw;
+}
+
+.desc {
+ font-size: 4vw;
+ width: 100%;
+}
+
+.input {
+ width: 95%;
+ font-family: "Poppins";
+ font-size: 3vw;
+ height: 30vh;
+ padding: 10px;
+ margin: 15px 0;
+ border-radius: 20px;
+}
+
+.submit {
+ /* background-color: rgb(2, 152, 186);
+ border-radius: 20px;
+ font-size: 5vw;
+ padding: 10px;
+ width: 50%;
+ color: white; */
+ width: 99%;
+ height: 6vh;
+ font-size: 2vh;
+ font-family: "Poppins";
+ font-weight: bold;
+ color: white;
+ border-width: 0;
+ border-radius: 20px;
+ background-color: rgb(2, 152, 186);
+ padding: 0;
+}
+.submit:hover {
+ cursor: pointer;
+ transform: scale(1.01);
+ transition: 0.2s;
+ box-shadow: 0 6px 4px darkgray;
+}
+
+.submit_wrapper {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-width: 0;
+}
+
+.close_wrapper {
+ display: flex;
+ border-radius: 50%;
+}
+
+.close {
+ margin-left: auto;
+ width: 5vw;
+}
diff --git a/src/components/AllTasksSection/index.js b/src/components/AllTasksSection/index.js
index 664a9c1..6cacc09 100644
--- a/src/components/AllTasksSection/index.js
+++ b/src/components/AllTasksSection/index.js
@@ -2,27 +2,55 @@ import styles from "./index.module.css";
import classNames from "classnames/bind";
import React from "react";
import { TaskListItem } from "../../components/TaskListItem";
+import { useState, useEffect } from "react";
+import { COLORS_ARR } from "../../lib/constants";
const cx = classNames.bind(styles);
export const AllTasksSection = React.forwardRef((props, ref) => {
- const { taskList } = props;
+ const { taskList, isMobile } = props;
+ const [isExpanded, setIsExpanded] = useState(false);
+ const [color, setColor] = useState("#0198BA26");
+
+ const toggleExpansion = () => {
+ setIsExpanded(!isExpanded);
+ };
+
+ useEffect(() => {
+ // randomize color for the display block
+ setColor(COLORS_ARR[Math.floor(Math.random() * COLORS_ARR.length)]);
+ }, []);
return (
-
-
{taskList[0]?.childName}
-
- {taskList.map((item, index) => (
-
- ))}
+
+
+ {taskList[0]?.childName}
+
+
+ {isExpanded &&
+ taskList.map((item, index) => (
+
+ ))}
);
diff --git a/src/components/AllTasksSection/index.module.css b/src/components/AllTasksSection/index.module.css
index e8e3ad7..cd86ac8 100644
--- a/src/components/AllTasksSection/index.module.css
+++ b/src/components/AllTasksSection/index.module.css
@@ -1,17 +1,40 @@
@import url("https://fonts.googleapis.com/css?family=Poppins");
-.tasksSection {
- border-bottom: 3px solid black;
- margin-left: 3vw;
- margin-right: 3vw;
- padding: 4vw;
+.entireSection {
+ border-radius: 50px;
+ margin-top: 2vw;
+ margin-bottom: 1vw;
+ padding-top: 1vw;
+ padding-bottom: 1vw;
+ }
+
+ .entireSection.mobile {
+ border-radius: 50px;
+ margin-top: 3vw;
+ margin-bottom: 3vw;
+ padding-top: 3vw;
+ padding-bottom: 3vw;
}
.childName {
font-family: "Poppins";
font-weight:400;
- font-size: 3vw;
- color: #8B5674;
+ font-size: 1.5vw;
+ margin: 0;
+ margin-left: 6vh;
+}
+
+.childName.mobile {
+ font-family: "Poppins";
+ font-weight:400;
+ font-size: 5vw;
margin: 0;
- margin-right: auto;
+ margin-left: 6vh;
+}
+
+
+.tasksSection {
+ margin-top: 3vw;
+ margin-bottom: 3vw;
+ background-color: rgba(255, 255, 255, 0.5);
}
\ No newline at end of file
diff --git a/src/components/AuthButton/index.module.css b/src/components/AuthButton/index.module.css
index 93030ab..58aaa5b 100644
--- a/src/components/AuthButton/index.module.css
+++ b/src/components/AuthButton/index.module.css
@@ -2,22 +2,23 @@
@value font from "../../index.module.css";
.button {
- width: 100%;
- height: 55px;
+ width: 50%;
+ height: 5vh;
background-color: #0198BA;
color: white;
font-family: "Poppins";
- font-size: 20px;
+ font-size: 2vw;
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
cursor: pointer;
+ margin: auto;
}
.button.mobile {
- width: 100%;
- min-height: 7vh;
+ width: 80%;
+ min-height: 5vh;
background-color: #0198BA;
color: white;
font-family: "Poppins";
@@ -25,6 +26,7 @@
display: flex;
justify-content: center;
align-items: center;
- border-radius: 20px;
+ border-radius: 2vh;
cursor: pointer;
+ margin: 4vh;
}
\ No newline at end of file
diff --git a/src/components/AuthInputBlock/index.js b/src/components/AuthInputBlock/index.js
index bd22279..47e1806 100644
--- a/src/components/AuthInputBlock/index.js
+++ b/src/components/AuthInputBlock/index.js
@@ -15,6 +15,7 @@ export const AuthInputBlock = (props) => {
isMobile
} = props;
+ console.log(isMobile)
return
{
+export const BackArrow = ({ showBackArrow = true, isMobile }) => {
const navigate = useNavigate();
const goBack = () => {
navigate(-1);
@@ -16,14 +16,13 @@ export const BackArrow = ({ showBackArrow = true }) => {
<>
{showBackArrow && (

- //
-
- //
)}
>
);
diff --git a/src/components/BackArrow/index.module.css b/src/components/BackArrow/index.module.css
index b9bc152..216eec4 100644
--- a/src/components/BackArrow/index.module.css
+++ b/src/components/BackArrow/index.module.css
@@ -1,7 +1,16 @@
.backArrow {
display: flex;
justify-content: center;
- width: 5%;
+ width: 2%;
+ height: auto;
+ margin-top: 4vh;
+ margin-left: 5%;
+ }
+
+ .backArrow.mobile {
+ display: flex;
+ justify-content: center;
+ width: 4%;
height: auto;
margin-top: 4vh;
margin-left: 5%;
diff --git a/src/components/Caption/index.js b/src/components/Caption/index.js
index d7cd1d2..7bedd4f 100644
--- a/src/components/Caption/index.js
+++ b/src/components/Caption/index.js
@@ -1,45 +1,46 @@
-import { useWindowSize } from '../../lib/hooks';
-import styles from './index.module.css';
-import classNames from 'classnames/bind';
-import React from 'react';
-import { WINDOW_TYPE } from '../../lib/constants';
-import PropTypes from 'prop-types';
+import { useWindowSize } from "../../lib/hooks";
+import styles from "./index.module.css";
+import classNames from "classnames/bind";
+import React from "react";
+import { WINDOW_TYPE } from "../../lib/constants";
+import PropTypes from "prop-types";
const cx = classNames.bind(styles);
// The caption of each home page
export const Caption = (props) => {
- const {
- mainTitle,
- subTitle,
- className,
- style,
- } = props;
+ const { mainTitle, subTitle, className, style } = props;
- const { type } = useWindowSize();
- const isMobile = type === WINDOW_TYPE.MOBILE;
-
- return
-
- {mainTitle}
-
-
- {subTitle}
-
+
+ {mainTitle}
+
+
+ {subTitle}
+
+ );
};
Caption.propTypes = {
- mainTitle: PropTypes.string.isRequired,
- subTitle: PropTypes.string.isRequired,
- className: PropTypes.string,
- style: PropTypes.objectOf(PropTypes.string),
-}
\ No newline at end of file
+ mainTitle: PropTypes.string.isRequired,
+ subTitle: PropTypes.string.isRequired,
+ className: PropTypes.string,
+ style: PropTypes.objectOf(PropTypes.string),
+};
diff --git a/src/components/Caption/index.module.css b/src/components/Caption/index.module.css
index 75dfc26..403d0c2 100644
--- a/src/components/Caption/index.module.css
+++ b/src/components/Caption/index.module.css
@@ -9,36 +9,36 @@
border: 0;
}
-.mainTitle.mobile {
+.mainTitle {
height: fit-content;
font-family: "Poppins";
font-style: normal;
- font-size: 8vw;
+ font-size: 3vw;
font-weight: 900;
}
-.mainTitle {
+.mainTitle.mobile {
height: fit-content;
font-family: "Poppins";
font-style: normal;
- font-size: 4vw;
+ font-size: 8vw;
font-weight: 900;
}
-.subTitle.mobile {
+.subTitle {
height: fit-content;
font-family: "Poppins";
font-style: normal;
- font-size: 4vw;
+ font-size: 1vw;
font-weight: 500;
color: #818181;
}
-.subTitle {
+.subTitle.mobile {
height: fit-content;
font-family: "Poppins";
font-style: normal;
- font-size: 2vw;
+ font-size: 4vw;
font-weight: 500;
color: #818181;
}
\ No newline at end of file
diff --git a/src/components/CheckBox/index.js b/src/components/CheckBox/index.js
index 7351eaa..dd81649 100644
--- a/src/components/CheckBox/index.js
+++ b/src/components/CheckBox/index.js
@@ -7,14 +7,13 @@ const cx = classNames.bind(styles);
// The caption of each home page
export const CheckBox = (props) => {
- const { value, onChange } = props;
-
- const { type } = useWindowSize();
- const isMobile = type === WINDOW_TYPE.MOBILE;
+ const { value, onChange, isMobile } = props;
return (
{
- {props.user}
+ {props.name}
-
{props.location}
+
{props.heading}
-
{props.content}
+
{props.body}
-
+ {/*
- {props.user}
+ {props.name}
- {props.caption}
-
-
-
- View all {props.comments.length} comments
-
- {props.comments[0].user}
+ {props.comments}
- {props.comments[0].comment}
+ {props.comments}
-
+
*/}
);
};
diff --git a/src/components/CommunityPost/index.module.css b/src/components/CommunityPost/index.module.css
index 4e18e82..b265e64 100644
--- a/src/components/CommunityPost/index.module.css
+++ b/src/components/CommunityPost/index.module.css
@@ -39,7 +39,7 @@
}
.post_info {
- font-size: 1.5vw;
+ font-size: 3.5vw;
}
.post_caption {
diff --git a/src/components/CreatePost/index.js b/src/components/CreatePost/index.js
index f48d999..f49848b 100644
--- a/src/components/CreatePost/index.js
+++ b/src/components/CreatePost/index.js
@@ -1,12 +1,14 @@
import React, { useState } from "react";
import classNames from "classnames/bind";
import styles from "./index.module.css";
+import { AuthInputBlock } from "../AuthInputBlock";
const cx = classNames.bind(styles);
-export function CreatePost() {
+export function CreatePost(props) {
const [postContent, setPostContent] = useState("");
const [isLoading, setIsLoading] = useState(false);
+ const [postTitle, setPostTitle] = useState("");
const [error, setError] = useState("");
const handleSubmit = (e) => {
@@ -14,12 +16,16 @@ export function CreatePost() {
setIsLoading(true);
setError("");
- fetch("/createPost", {
+ fetch(process.env.REACT_APP_HOST_URL + "/posts", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
- body: JSON.stringify({ postContent }),
+ body: JSON.stringify({
+ name: localStorage.getItem("firstName"),
+ title: postTitle,
+ body: postContent,
+ }),
})
.then((res) => {
if (!res.ok) {
@@ -35,6 +41,8 @@ export function CreatePost() {
setIsLoading(false);
setError(err.message);
});
+ props.setCreatePost(false);
+ props.rotate(false);
};
return (
@@ -42,6 +50,14 @@ export function CreatePost() {
);
-}
+}
\ No newline at end of file
diff --git a/src/components/CreatePost/index.module.css b/src/components/CreatePost/index.module.css
index b66a01c..f0d6f48 100644
--- a/src/components/CreatePost/index.module.css
+++ b/src/components/CreatePost/index.module.css
@@ -5,7 +5,6 @@
width: 100%;
height: 100vh;
background-color: rgba(0, 0, 0, 0.2);
-
display: flex;
justify-content: center;
align-items: center;
@@ -15,7 +14,7 @@
display: block;
background-color: white;
width: 80%;
- height: 50%;
+ height: auto;
font-family: "Poppins";
padding: 30px;
@@ -73,3 +72,7 @@
justify-content: center;
border-width: 0;
}
+
+.content_container {
+ font-size: 10vw;
+}
\ No newline at end of file
diff --git a/src/components/OnYourRadar/index.js b/src/components/OnYourRadar/index.js
new file mode 100644
index 0000000..90adad5
--- /dev/null
+++ b/src/components/OnYourRadar/index.js
@@ -0,0 +1,97 @@
+import styles from "./index.module.css";
+import classNames from "classnames/bind";
+import React from "react";
+import { useState, useEffect } from "react";
+import { getChildrenTasksArray } from "../../lib/services";
+import { Loader } from "../../pages/LoadScreen";
+
+const cx = classNames.bind(styles);
+
+export const OnYourRadar = React.forwardRef((props, ref) => {
+ const { childrenId, isMobile } = props;
+ const [hpList, sethpList] = useState([]);
+ const [elseList, setElseList] = useState([]);
+
+ useEffect(async () => {
+ const { taskArray } = await getChildrenTasksArray(childrenId, true);
+ sethpList(taskArray);
+ }, []);
+
+ useEffect(async () => {
+ const { taskArray } = await getChildrenTasksArray(childrenId, false);
+ setElseList(taskArray);
+ }, []);
+
+ const hpElements = hpList.flat().map((thing, index) => (
+
+ {index + 1 + ". " + thing.title}
+
+ ));
+ const elseElements = elseList.flat().map((thing, index) => (
+
+ {index + 1 + ". " + thing.title}
+
+ ));
+
+ return (
+
+
+ On Your Radar
+
+
+
+
+ High Priority
+
+
+ {hpElements}
+
+
+
+
+ All Tasks
+
+
+ {elseElements}
+
+
+
+
+ );
+});
diff --git a/src/components/OnYourRadar/index.module.css b/src/components/OnYourRadar/index.module.css
new file mode 100644
index 0000000..98cf67b
--- /dev/null
+++ b/src/components/OnYourRadar/index.module.css
@@ -0,0 +1,85 @@
+.todo_div {
+ border: 3px #0198ba;
+ border-style: solid;
+ border-radius: 50px;
+ margin-top: 5vw;
+ margin-left: 2vw;
+ margin-right: 2vw;
+ padding-left: 3vw;
+ padding-bottom: 10vw;
+}
+
+.todo_div.mobile {
+ border: 6px #0198ba;
+ border-style: solid;
+ border-radius: 50px;
+ margin-top: 10vw;
+ margin-left: 2vw;
+ margin-right: 2vw;
+ padding-left: 3vw;
+ padding-bottom: 10vw;
+}
+
+.priorityParent{
+ display: flex;
+ justify-content: space-between;
+}
+.priorityBlock{
+ flex: 1;
+ display: inline-block;
+}
+
+.priorityParent.mobile{
+ display: block;
+}
+
+.priorityBlock.mobile{
+ display: block;
+}
+
+.radar.mobile {
+ font-family: "Poppins";
+ font-weight: 900;
+ color: black;
+ font-size: 3vw;
+ margin-top: 3vw;
+}
+
+.radar {
+ font-family: "Poppins";
+ font-weight: 900;
+ color: black;
+ font-size: 2vw;
+}
+
+.priority.mobile {
+ font-family: "Poppins";
+ font-weight: bolder;
+ color: #8b5674;
+ font-size: 3vw;
+}
+
+.priority {
+ font-family: "Poppins";
+ font-weight: bolder;
+ color: #8b5674;
+ font-size: 2vw;
+}
+
+.priority.else {
+ color: #e3d150;
+}
+
+.list {
+ font-family: 'Poppins';
+ color: black;
+ font-weight: 600;
+ font-size: 1.7vw;
+}
+
+.list.mobile {
+ font-family: 'Poppins';
+ color: black;
+ font-weight: 600;
+ font-size: 6vw;
+}
\ No newline at end of file
diff --git a/src/components/PointsDisplay/index.js b/src/components/PointsDisplay/index.js
new file mode 100644
index 0000000..3fdd6c3
--- /dev/null
+++ b/src/components/PointsDisplay/index.js
@@ -0,0 +1,70 @@
+import styles from "./index.module.css";
+import classNames from "classnames/bind";
+import React from "react";
+import {
+ CircularProgressbarWithChildren,
+ buildStyles,
+} from "react-circular-progressbar";
+
+const cx = classNames.bind(styles);
+
+export const PointsDisplay = React.forwardRef((props, ref) => {
+ const { childName, points, goal, isMobile } = props;
+
+ return (
+
+
+
+ {childName}
+
+
+ {goal - points}
+
+
+ points away from weekly goal
+
+
+
+
+
+ {points}
+
+
+ Points
+
+
+
+
+ );
+});
diff --git a/src/components/PointsDisplay/index.module.css b/src/components/PointsDisplay/index.module.css
new file mode 100644
index 0000000..ae6dfd2
--- /dev/null
+++ b/src/components/PointsDisplay/index.module.css
@@ -0,0 +1,82 @@
+.pointsBlock {
+ margin-top: 4vw
+}
+
+.text_div {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ position: relative;
+}
+
+.name {
+ font-family: 'Poppins';
+ font-weight: 800;
+ font-size: 2vw;
+ margin: auto;
+ color: #000000;
+}
+
+.name.mobile {
+ font-family: 'Poppins';
+ font-weight: 800;
+ font-size: 5vw;
+ margin: 1vh;
+ color: #000000;
+}
+
+
+.points.mobile {
+ font-family: 'Poppins';
+ font-weight: 800;
+ font-size: 4.2vw;
+ margin: auto;
+ display: inline-block;
+ color: #000000;
+}
+
+.points {
+ font-family: 'Poppins';
+ font-weight: 800;
+ font-size: 1.8vw;
+ margin: auto;
+ display: inline-block;
+ color: #000000;
+}
+
+.points.text {
+ font-weight: 600;
+ color: #818181;
+}
+
+.progress_circle {
+ width: 20vw;
+ height: 20vw;
+ margin-top: 4vw;
+ margin-bottom: 2vw;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.progress_circle.mobile {
+ width: 40vw;
+ height: 40vw;
+ margin-top: 5vw;
+ margin-bottom: 5vw;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.progress_circle_text {
+ font-family: 'Poppins';
+ font-weight: 900;
+ color: black;
+ font-size: 2vw;
+}
+
+.progress_circle_text.mobile {
+ font-family: 'Poppins';
+ font-weight: 900;
+ color: black;
+ font-size: 6vw;
+}
\ No newline at end of file
diff --git a/src/components/ProfilePicture/index.js b/src/components/ProfilePicture/index.js
index edee73e..63f1ef8 100644
--- a/src/components/ProfilePicture/index.js
+++ b/src/components/ProfilePicture/index.js
@@ -1,13 +1,14 @@
import React from "react";
import styles from "./index.module.css";
import classNames from "classnames";
+import PFP from "../../images/PFP.png";
const cx = classNames.bind(styles);
-function ProfilePicture(props) {
+function ProfilePicture() {
return (
-

+
);
}
diff --git a/src/components/Slider/index.js b/src/components/Slider/index.js
new file mode 100644
index 0000000..48bf209
--- /dev/null
+++ b/src/components/Slider/index.js
@@ -0,0 +1,29 @@
+import React from "react";
+import styles from "./index.module.css";
+import classNames from "classnames/bind";
+import { PointsDisplay } from "../PointsDisplay";
+import ReactSlidy from "react-slidy";
+import "react-slidy/lib/styles.css";
+import { getRandomColor } from "../../lib/utils";
+
+const cx = classNames.bind(styles);
+
+// build a page slider component
+export const Slider = (props) => {
+ const { childrenStats, isMobile } = props;
+
+ return (
+
+ {childrenStats.map((childStats) => (
+
+ ))}
+
+ );
+};
diff --git a/src/components/Slider/index.module.css b/src/components/Slider/index.module.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/TaskListItem/index.js b/src/components/TaskListItem/index.js
index cc9a58c..b89cdb8 100644
--- a/src/components/TaskListItem/index.js
+++ b/src/components/TaskListItem/index.js
@@ -10,7 +10,7 @@ import { checkEvent, uncheckEvent } from "../../lib/services";
const cx = classNames.bind(styles);
export const TaskListItem = React.forwardRef((props, ref) => {
- const { taskName, dueAt, taskId, childName, childId, completed } = props;
+ const { taskName, dueAt, taskId, childId, completed, isMobile } = props;
const navigate = useNavigate();
const [checked, setChecked] = useState(completed);
@@ -29,11 +29,22 @@ export const TaskListItem = React.forwardRef((props, ref) => {
})
}
>
-
{taskName}
-
{dueAt}
-
{childName}
+
+ {taskName}
+
+
+ {dueAt}
+
-
+
);
});
diff --git a/src/components/TaskListItem/index.module.css b/src/components/TaskListItem/index.module.css
index 833737e..2e672f8 100644
--- a/src/components/TaskListItem/index.module.css
+++ b/src/components/TaskListItem/index.module.css
@@ -1,15 +1,28 @@
@import url("https://fonts.googleapis.com/css?family=Poppins");
.tasks_div {
+ border-bottom: 1px solid black;
+ padding: 2vw;
+ display: flex;
+ justify-content: flex-end;
+ }
+
+.tasks_div.mobile {
border-bottom: 3px solid black;
- margin-left: 3vw;
- margin-right: 3vw;
padding: 4vw;
display: flex;
justify-content: flex-end;
}
.taskName {
+ font-family: "Poppins";
+ font-style: normal;
+ font-size: 1.4vw;
+ font-weight: 500;
+ margin: 0;
+}
+
+.taskName.mobile {
font-family: "Poppins";
font-style: normal;
font-size: 5vw;
@@ -17,7 +30,7 @@
margin: 0;
}
-.taskDate {
+.taskDate.mobile {
font-family: "Poppins";
font-weight:400;
font-size: 4vw;
@@ -25,11 +38,10 @@
margin: 0;
}
-.childName {
+.taskDate {
font-family: "Poppins";
font-weight:400;
- font-size: 3vw;
+ font-size: 1.2vw;
color: #8B5674;
margin: 0;
- margin-right: auto;
}
\ No newline at end of file
diff --git a/src/components/UpcomingComponent/index.js b/src/components/UpcomingComponent/index.js
index 0280ae2..6f8dc08 100644
--- a/src/components/UpcomingComponent/index.js
+++ b/src/components/UpcomingComponent/index.js
@@ -5,6 +5,7 @@ import { useNavigate } from "react-router-dom";
import { ROUTES } from "../../lib/constants";
import { CheckBox } from "../CheckBox";
import { checkEvent, uncheckEvent } from "../../lib/services";
+import { COLORS_ARR } from "../../lib/constants";
import React from "react";
const cx = classNames.bind(styles);
@@ -18,6 +19,7 @@ export const UpcomingComponent = (props) => {
completed,
priority,
childId,
+ childName,
isMobile,
} = props;
const [checked, setChecked] = useState(completed);
@@ -25,8 +27,7 @@ export const UpcomingComponent = (props) => {
useEffect(() => {
// randomize color for the display block
- const colors = ["#0198BA26", "#E3D15033", "#8B567478"];
- setColor(colors[Math.floor(Math.random() * colors.length)]);
+ setColor(COLORS_ARR[Math.floor(Math.random() * COLORS_ARR.length)]);
}, []);
const handleChecked = () => {
@@ -41,6 +42,7 @@ export const UpcomingComponent = (props) => {
className={cx(styles.upcomingWrapper)}
style={{
backgroundColor: color,
+ padding: "4vh",
}}
>
{
className={cx(styles.title, {
[styles.mobile]: isMobile,
})}
+ onClick={() =>
+ navigate(ROUTES.TASK_DETAILS, {
+ state: { taskId, completed, childId },
+ })
+ }
>
- {title}
+ {title + " - " + childName}
- {/*

*/}
{
})
}
>
- {time}
+ {time + ", priority level: " + priority}
{
>
{content}
-
- navigate(ROUTES.TASK_DETAILS, { state: { taskId, completed } })
- }
- >
- {priority}
-
>
);
diff --git a/src/components/UpcomingComponent/index.module.css b/src/components/UpcomingComponent/index.module.css
index ed628d7..9148835 100644
--- a/src/components/UpcomingComponent/index.module.css
+++ b/src/components/UpcomingComponent/index.module.css
@@ -2,8 +2,6 @@
.upcomingWrapper {
composes: font;
- margin: 4vw 0;
- padding: 4vw;
background-color: rgba(1, 152, 186, 0.15);
border-radius: 50px;
}
@@ -12,50 +10,34 @@
display: flex;
}
-.header.mobile {
- display: flex;
-}
-
.title{
font-style: normal;
- font-size: 4vw;
+ font-size: 1.7vw;
font-weight: 500;
margin: 0;
color: #000000;
+ width: 90%;
}
.title.mobile {
- font-style: normal;
font-size: 7vw;
- font-weight: 500;
- margin: 0;
- color: #000000;
}
.time{
font-style: normal;
font-weight: 400;
- font-size: 1.5vw;
- color: #8B5674;
- margin: 2;
-
+ font-size: 1.2vw;
color: #0198BA;
}
.time.mobile{
- font-style: normal;
- font-weight: 400;
font-size: 3vw;
- color: #8B5674;
- margin: 2;
-
- color: #0198BA;
}
.content{
font-style: normal;
font-weight: 300;
- font-size: 2vw;
+ font-size: 1.2vw;
color: #8B5674;
margin: 2;
@@ -63,17 +45,5 @@
}
.content.mobile {
- font-style: normal;
- font-weight: 300;
font-size: 3vw;
- color: #8B5674;
- margin: 2;
-
- color: #818181;
-}
-
-.upcomingIcon {
- width: 20px;
- height: 20px;
- cursor: pointer;
}
\ No newline at end of file
diff --git a/src/lib/constants.js b/src/lib/constants.js
index 00a9960..e9ce7b4 100644
--- a/src/lib/constants.js
+++ b/src/lib/constants.js
@@ -3,6 +3,8 @@ export const PRIORITY_LEVEL = {
PRIORITY_LEVEL: 2,
};
+export const COLORS_ARR = ["#0198BA26", "#E3D15033", "#8B567478"];
+
export const WINDOW_TYPE = {
WEB: "WEB",
MOBILE: "MOBILE",
@@ -10,7 +12,7 @@ export const WINDOW_TYPE = {
export const STATUS_CODE = {
SUCESS: "SUCCESS",
- ERROR: "FAILURE",
+ ERROR: "ERROR",
};
export const ROUTES = {
@@ -25,7 +27,7 @@ export const ROUTES = {
UPCOMING_TASKS: "/upcoming",
ALL_TASKS: "/tasks",
TASK_DETAILS: "/task-details",
- VERIFICATION: "/verifyEmail",
+ VERIFICATION: "/verification",
};
export const HOME_NAV_LABELS = {
@@ -47,6 +49,8 @@ export const AUTH_INPUT_LABELS = {
ZIP_CODE: "Zip Code",
PHONE_NUMBER: "Phone Number",
SIGN_UP: "Sign Up!",
+ ADD_CHILD: "Add Child",
+ BIRTH_DATE: "Birth Date (MM-DD-YYYY)",
};
// page titles
@@ -140,3 +144,5 @@ export const SCHOOL_DISTRICT = [
{ label: "Tomball" },
{ label: "Waller" },
];
+
+export const TIMEOUT = 7200000;
diff --git a/src/lib/hooks.js b/src/lib/hooks.js
index 9866c1d..71e94a3 100644
--- a/src/lib/hooks.js
+++ b/src/lib/hooks.js
@@ -80,6 +80,11 @@ export const useCaption = () => {
*/
export const useBackArrow = () => {
const { pathname } = useLocation();
+ const { width, type } = useWindowSize();
+ const isMobile = type === WINDOW_TYPE.MOBILE;
+ if (!isMobile) {
+ return { showBackArrow: false };
+ }
switch (pathname) {
case ROUTES.LOGIN:
return { showBackArrow: false };
diff --git a/src/lib/icons.js b/src/lib/icons.js
index 48d7f57..f25054b 100644
--- a/src/lib/icons.js
+++ b/src/lib/icons.js
@@ -1,17 +1,13 @@
-import { useWindowSize } from "./hooks";
-
export const HomeIcon = (props) => {
- const color = props.filled ? "#0198BA" : "#CCCCCC";
- const textColor = props.filled ? "black" : "#CCCCCC";
- const { height } = useWindowSize();
+ const { isMobile, filled } = props;
+ const color = filled ? "#0198BA" : "#CCCCCC";
+ const textColor = filled ? "black" : "#CCCCCC";
return (