diff --git a/.gitignore b/.gitignore
index d5696b6..ea32259 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
**/node_modules
-**/config
+**config**
npm-debug.log
.DS_Store
/*.env
\ No newline at end of file
diff --git a/client/package-lock.json b/client/package-lock.json
index 8ce69ff..6684ef7 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -1091,6 +1091,278 @@
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.1.tgz",
"integrity": "sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg=="
},
+ "@firebase/analytics": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.3.3.tgz",
+ "integrity": "sha512-Mj4lufHCnDqI2e8jAFqWmo9r2ejBJiGbI0MUvoiKVMxQm0kddQxUwmxfE6ozOAZ2HjB6OZ0iiAO+XU+0w/BnlA==",
+ "requires": {
+ "@firebase/analytics-types": "0.3.0",
+ "@firebase/component": "0.1.10",
+ "@firebase/installations": "0.4.8",
+ "@firebase/logger": "0.2.2",
+ "@firebase/util": "0.2.45",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/analytics-types": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.3.0.tgz",
+ "integrity": "sha512-0AJ6xn53Qn0D/YOVHHvlWFfnzzRSdd98Lr8Oqe1PJ2HPIN+o7qf03YmOG7fLpR1uplcWd+7vGKmxUrN3jKUBwg=="
+ },
+ "@firebase/app": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.2.tgz",
+ "integrity": "sha512-rAxc90+82GAPpUxS02EO0dys4+TeQ6XjFjCwQz/OVptGeLgxN9ZoXYAf/bxyeYOdLxJW0kbEKE/0xXaJDt5gsg==",
+ "requires": {
+ "@firebase/app-types": "0.6.0",
+ "@firebase/component": "0.1.10",
+ "@firebase/logger": "0.2.2",
+ "@firebase/util": "0.2.45",
+ "dom-storage": "2.1.0",
+ "tslib": "1.11.1",
+ "xmlhttprequest": "1.8.0"
+ }
+ },
+ "@firebase/app-types": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.0.tgz",
+ "integrity": "sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA=="
+ },
+ "@firebase/auth": {
+ "version": "0.14.3",
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.3.tgz",
+ "integrity": "sha512-XPB3Mf3PwHibv2HbvqOol02ACCuwAKSY9HAtq70w3K3OwSDX4opDdrNOhoer7Nrq3xvX58b+c+oVGxD9mbo/qQ==",
+ "requires": {
+ "@firebase/auth-types": "0.10.0"
+ }
+ },
+ "@firebase/auth-interop-types": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.4.tgz",
+ "integrity": "sha512-CLKNS84KGAv5lRnHTQZFWoR11Ti7gIPFirDDXWek/fSU+TdYdnxJFR5XSD4OuGyzUYQ3Dq7aVj5teiRdyBl9hA=="
+ },
+ "@firebase/auth-types": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.0.tgz",
+ "integrity": "sha512-VuW7c+RAk3AYPU0Hxmun3RzXn7fbJDdjQbxvvpRMnQ9zrhk8mH42cY466M0n4e/UGQ+0smlx5BqZII8aYQ5XPg=="
+ },
+ "@firebase/component": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.10.tgz",
+ "integrity": "sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw==",
+ "requires": {
+ "@firebase/util": "0.2.45",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/database": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.1.tgz",
+ "integrity": "sha512-7XqUbj3nK2vEdFjGOXBfKISmpLrM0caIwwfDPxhn6i7X/g6AIH+D1limH+Jit4QeKMh/IJZDNqO7P+Fz+e8q1Q==",
+ "requires": {
+ "@firebase/auth-interop-types": "0.1.4",
+ "@firebase/component": "0.1.10",
+ "@firebase/database-types": "0.5.0",
+ "@firebase/logger": "0.2.2",
+ "@firebase/util": "0.2.45",
+ "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.5.0",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.0.tgz",
+ "integrity": "sha512-6/W3frFznYOALtw2nrWVPK2ytgdl89CzTqVBHCCGf22wT6uKU63iDBo+Nw+7olFGpD15O0zwYalFIcMZ27tkew==",
+ "requires": {
+ "@firebase/app-types": "0.6.0"
+ }
+ },
+ "@firebase/firestore": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.14.1.tgz",
+ "integrity": "sha512-6wu+Oh00O8NPWyetr8BVZ9Y3Z7PrBZpoJjam2jjB0RVOaksvC1VTmjIOK6cLczt9hD0JRtb5wy+ME7E70N0ruA==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/firestore-types": "1.10.1",
+ "@firebase/logger": "0.2.2",
+ "@firebase/util": "0.2.45",
+ "@firebase/webchannel-wrapper": "0.2.39",
+ "@grpc/grpc-js": "0.8.1",
+ "@grpc/proto-loader": "^0.5.0",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/firestore-types": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.10.1.tgz",
+ "integrity": "sha512-vyKdm+AYUFT8XeUX62IOqaqPFCs/mAMoSEsqIz9HnSVsqCw/IocNjtjSa+3M80kRw4V8fI7JI+Xz6Wg5VJXLqA=="
+ },
+ "@firebase/functions": {
+ "version": "0.4.41",
+ "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.4.41.tgz",
+ "integrity": "sha512-S7fYjzoCSWoTUpTvYRXHYByXdNIP7TYFkfBGvy/ca1WT/6AnBOkdFuxPLilEaKWKlERMbYUQgxyNq52nUPRhCw==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/functions-types": "0.3.16",
+ "@firebase/messaging-types": "0.4.4",
+ "isomorphic-fetch": "2.2.1",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/functions-types": {
+ "version": "0.3.16",
+ "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.3.16.tgz",
+ "integrity": "sha512-kHhBvSYiY2prY4vNQCALYs1+OruTdylvGemHG6G6Bs/rj3qw7ui3WysBsDU/rInJitHIcsZ35qrtanoJeQUIXQ=="
+ },
+ "@firebase/installations": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.8.tgz",
+ "integrity": "sha512-J3tyKCdZ07LR0Bw3rs4CIsWia5exGt77fdbvqnhYa6K8YfIUPFLzsGRvlFJkoIhOMXfujfnC3O/DakROOgOltg==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/installations-types": "0.3.3",
+ "@firebase/util": "0.2.45",
+ "idb": "3.0.2",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/installations-types": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.3.tgz",
+ "integrity": "sha512-XvWhPPAGeZlc+CfCA8jTt2pv19Jovi/nUV73u30QbjBbk5xci9bp5I29aBZukHsR6YNBjFCLSkLPbno4m/bLUg=="
+ },
+ "@firebase/logger": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.2.tgz",
+ "integrity": "sha512-MbEy17Ha1w/DlLtvxG89ScQ+0+yoElGKJ1nUCQHHLjeMNsRwd2wnUPOVCsZvtBzQp8Z0GaFmD4a2iG2v91lEbA=="
+ },
+ "@firebase/messaging": {
+ "version": "0.6.13",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.13.tgz",
+ "integrity": "sha512-QfC1H88q+YYjqzrmplzRwUsVfDJpVB+AaUnv6SPBoh12Eh/Wutu+ot8h6rpEc1b0B69EGYD/Pu2+bnixYVhlUA==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/installations": "0.4.8",
+ "@firebase/messaging-types": "0.4.4",
+ "@firebase/util": "0.2.45",
+ "idb": "3.0.2",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/messaging-types": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.4.4.tgz",
+ "integrity": "sha512-JGtkr+1A1Dw7+yCqQigqBfGKtq0gTCruFScBD4MVjqZHiqGIYpnQisWnpGbkzPR6aOt6iQxgwxUhHG1ulUQGeg=="
+ },
+ "@firebase/performance": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.3.1.tgz",
+ "integrity": "sha512-YBs3iIGNZM39Yas4AU9BFZS4na1J/yoARVUGsL0Vcvw6TaPN57KiqKdfbjxz84WSuC3xrDa6Hirxh9S1sS0zbQ==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/installations": "0.4.8",
+ "@firebase/logger": "0.2.2",
+ "@firebase/performance-types": "0.0.12",
+ "@firebase/util": "0.2.45",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/performance-types": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.12.tgz",
+ "integrity": "sha512-eIDF7CHetOE5sc+hCaUebEn/2Aiaju7UkgZDTl7lNQHz5fK9wJ/11HaE8WdnDr//ngS3lQAGC2RB4lAZeEWraA=="
+ },
+ "@firebase/polyfill": {
+ "version": "0.3.34",
+ "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.34.tgz",
+ "integrity": "sha512-6EN02vwhX6cmyB4YswKhHkS3kMeNDxjCgf4vR3L9wYv+A5QVgAM85ifzf3mZT0tq3f2LfIsTsCIr/mlz2Swl1A==",
+ "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.19",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.19.tgz",
+ "integrity": "sha512-2n6bavDGO+cQsS3fs+yHthnkp5TKh8sqSD89dztt/b3/KKRb4C89r3apb6QIcQw/AlyToM+NyU6WIZyXfVAhqQ==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/installations": "0.4.8",
+ "@firebase/logger": "0.2.2",
+ "@firebase/remote-config-types": "0.1.8",
+ "@firebase/util": "0.2.45",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/remote-config-types": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.8.tgz",
+ "integrity": "sha512-K12IBHO7OD4gCW0FEqZL9zMqVAfS4+joC4YIn3bHezZfu3RL+Bw1wCb0cAD7RfDPcQxWJjxOHpce4YhuqSxPFA=="
+ },
+ "@firebase/storage": {
+ "version": "0.3.32",
+ "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.3.32.tgz",
+ "integrity": "sha512-mwWI03VbTd1jP7mmeNBv7mJ96i8GUX1fSxVept5aV2FQb2pAWTKXr7Gmxg06w642I0T1+qZTRVXs8G5m8vuTjg==",
+ "requires": {
+ "@firebase/component": "0.1.10",
+ "@firebase/storage-types": "0.3.11",
+ "@firebase/util": "0.2.45",
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/storage-types": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.11.tgz",
+ "integrity": "sha512-EMOo5aeiJIa8eQ/VqjIa/DYlDcEJX1V84FOxmLfNWZIlmCSvcqx9E9mcNlOnoUB4iePqQjTMQRtKlIBvvEVhVg=="
+ },
+ "@firebase/util": {
+ "version": "0.2.45",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz",
+ "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==",
+ "requires": {
+ "tslib": "1.11.1"
+ }
+ },
+ "@firebase/webchannel-wrapper": {
+ "version": "0.2.39",
+ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.39.tgz",
+ "integrity": "sha512-V5oQjtYxHlEpWdQr68ZFo8T+3NVccrTieRy8RnzYIasCeptxOxwYUG0cAAKmalgrrrfRJdXup8h5ybi3XSW9Hw=="
+ },
+ "@grpc/grpc-js": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.8.1.tgz",
+ "integrity": "sha512-e8gSjRZnOUefsR3obOgxG9RtYW2Mw83hh7ogE2ByCdgRhoX0mdnJwBcZOami3E0l643KCTZvORFwfSEi48KFIQ==",
+ "requires": {
+ "semver": "^6.2.0"
+ }
+ },
+ "@grpc/proto-loader": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz",
+ "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==",
+ "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",
@@ -1330,6 +1602,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="
+ },
"@reduxjs/toolkit": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.3.5.tgz",
@@ -1681,6 +2007,11 @@
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
"integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA=="
},
+ "@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",
@@ -4516,6 +4847,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",
@@ -4666,6 +5002,14 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
+ "encoding": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
+ "requires": {
+ "iconv-lite": "~0.4.13"
+ }
+ },
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
@@ -5687,6 +6031,27 @@
"locate-path": "^2.0.0"
}
},
+ "firebase": {
+ "version": "7.14.1",
+ "resolved": "https://registry.npmjs.org/firebase/-/firebase-7.14.1.tgz",
+ "integrity": "sha512-2lgBgWuFOd9wnwgOQEKmqqxuWf2Cp2xw08Nwar8/fD5gtoMngn7JY2PE86VUSu7XVTyhVFLfAIAMyZLDaRRTOg==",
+ "requires": {
+ "@firebase/analytics": "0.3.3",
+ "@firebase/app": "0.6.2",
+ "@firebase/app-types": "0.6.0",
+ "@firebase/auth": "0.14.3",
+ "@firebase/database": "0.6.1",
+ "@firebase/firestore": "1.14.1",
+ "@firebase/functions": "0.4.41",
+ "@firebase/installations": "0.4.8",
+ "@firebase/messaging": "0.6.13",
+ "@firebase/performance": "0.3.1",
+ "@firebase/polyfill": "0.3.34",
+ "@firebase/remote-config": "0.1.19",
+ "@firebase/storage": "0.3.32",
+ "@firebase/util": "0.2.45"
+ }
+ },
"flat-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
@@ -6061,6 +6426,11 @@
"resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
"integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE="
},
+ "gud": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
+ "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
+ },
"gzip-size": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
@@ -6191,6 +6561,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",
@@ -6433,6 +6816,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",
@@ -6921,6 +7309,15 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
+ "isomorphic-fetch": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
+ "requires": {
+ "node-fetch": "^1.0.1",
+ "whatwg-fetch": ">=0.10.0"
+ }
+ },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -8455,6 +8852,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",
@@ -8492,6 +8894,11 @@
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
"integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA=="
},
+ "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",
@@ -8740,6 +9147,16 @@
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
"integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY="
},
+ "mini-create-react-context": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz",
+ "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==",
+ "requires": {
+ "@babel/runtime": "^7.4.0",
+ "gud": "^1.0.0",
+ "tiny-warning": "^1.0.2"
+ }
+ },
"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",
@@ -8980,6 +9397,15 @@
"tslib": "^1.10.0"
}
},
+ "node-fetch": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+ "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+ "requires": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ },
"node-forge": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
@@ -10768,6 +11194,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",
@@ -10787,6 +11218,26 @@
"react-is": "^16.8.1"
}
},
+ "protobufjs": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz",
+ "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==",
+ "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"
+ }
+ },
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
@@ -11253,6 +11704,52 @@
"react-is": "^16.9.0"
}
},
+ "react-router": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz",
+ "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==",
+ "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.3.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.1.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz",
+ "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==",
+ "requires": {
+ "@babel/runtime": "^7.1.2",
+ "history": "^4.9.0",
+ "loose-envify": "^1.3.1",
+ "prop-types": "^15.6.2",
+ "react-router": "5.1.2",
+ "tiny-invariant": "^1.0.2",
+ "tiny-warning": "^1.0.0"
+ }
+ },
"react-scripts": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz",
@@ -11682,6 +12179,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",
@@ -13179,6 +13681,11 @@
"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",
@@ -13556,6 +14063,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",
@@ -15511,6 +16023,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/client/package.json b/client/package.json
index 9c719b1..cf8a5b0 100644
--- a/client/package.json
+++ b/client/package.json
@@ -9,10 +9,12 @@
"@testing-library/user-event": "^7.2.1",
"axios": "^0.19.2",
"bootstrap": "^4.4.1",
+ "firebase": "^7.14.1",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-jss": "^10.1.1",
"react-redux": "^7.2.0",
+ "react-router-dom": "^5.1.2",
"react-scripts": "3.4.1"
},
"scripts": {
diff --git a/client/src/components/App/index.jsx b/client/src/components/App/index.jsx
index 6b0124a..c2b6e60 100644
--- a/client/src/components/App/index.jsx
+++ b/client/src/components/App/index.jsx
@@ -1,18 +1,15 @@
import React from "react";
-import { Container } from "reactstrap";
-import ItemModal from "../ItemModal";
-import List from "../List";
-import MainNavbar from "../Navbar";
+import { BrowserRouter as Router } from "react-router-dom";
+
+import MainNavbar from "../MainNavbar";
+import MainRouter from "../Router";
function App() {
return (
- <>
+
-
-
-
-
- >
+
+
);
}
diff --git a/client/src/components/Navbar/Navbar.test.jsx b/client/src/components/MainNavbar/Navbar.test.jsx
similarity index 100%
rename from client/src/components/Navbar/Navbar.test.jsx
rename to client/src/components/MainNavbar/Navbar.test.jsx
diff --git a/client/src/components/Navbar/index.jsx b/client/src/components/MainNavbar/index.jsx
similarity index 51%
rename from client/src/components/Navbar/index.jsx
rename to client/src/components/MainNavbar/index.jsx
index bc63f3c..1aca51e 100644
--- a/client/src/components/Navbar/index.jsx
+++ b/client/src/components/MainNavbar/index.jsx
@@ -1,4 +1,5 @@
import React, { useState } from "react";
+import { Link } from "react-router-dom";
import {
Collapse,
Navbar,
@@ -9,6 +10,7 @@ import {
NavLink,
Container,
} from "reactstrap";
+import * as ROUTES from "../../constants/routes";
export default function MainNavbar() {
const [isOpen, setIsOpen] = useState(false);
@@ -30,6 +32,31 @@ export default function MainNavbar() {
GitHub
+
+
+ Sign In
+
+
+
+
+ Landing
+
+
+
+
+ Home
+
+
+
+
+ Account
+
+
+
+
+ Admin
+
+
diff --git a/server.js b/server.js
index f222553..a27dd60 100644
--- a/server.js
+++ b/server.js
@@ -5,6 +5,7 @@ import moment from "moment";
import helmet from "helmet";
import items from "./routes/api/items.js";
import users from "./routes/api/users.js";
+import * as ROUTES from "./constants/routes.js";
import authenticationChecker from "./middlewares/auth/index.js";
const app = express();
@@ -27,8 +28,8 @@ app.use(authenticationChecker);
// bodyparser middleware
app.use(express.json());
// Register routes
-app.use("/api/items/", items);
-app.use("/api/users/", users);
+app.use(ROUTES.ITEMS, items);
+app.use(ROUTES.USERS, users);
// Serve static assets in production
if (process.env.NODE_ENV === "production") {