diff --git a/.DS_Store b/.DS_Store index eced0a8..aa53cfc 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/client/package-lock.json b/client/package-lock.json index 3bb07e3..07f36be 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -2422,6 +2422,22 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2452,6 +2468,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/@faker-js/faker": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.3.0.tgz", @@ -5231,14 +5253,15 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.20.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -5261,34 +5284,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -5673,6 +5668,37 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -6777,21 +6803,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -6803,11 +6814,6 @@ "ajv": "^8.8.2" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -8171,6 +8177,22 @@ "webpack": "^5.0.0" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8265,6 +8287,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8528,6 +8556,22 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -8771,6 +8815,31 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8853,6 +8922,12 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -12213,9 +12288,10 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -12630,21 +12706,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -12656,11 +12717,6 @@ "ajv": "^8.8.2" } }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -15782,6 +15838,37 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -16899,6 +16986,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -17018,8 +17119,9 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -17227,21 +17329,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -17253,11 +17340,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -17326,21 +17408,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-server/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -17352,11 +17419,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -17611,21 +17673,6 @@ "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -17640,11 +17687,6 @@ "node": ">=10" } }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", diff --git a/client/src/components/dashboard/CalenderExpenseGraph.jsx b/client/src/components/dashboard/CalenderExpenseGraph.jsx index 81163bc..2360f91 100644 --- a/client/src/components/dashboard/CalenderExpenseGraph.jsx +++ b/client/src/components/dashboard/CalenderExpenseGraph.jsx @@ -6,7 +6,6 @@ import Loading from "../loading"; import { getUserDailyExpService, getUserMonthlyExpService } from "../../services/expenseServices"; import { monthNamesMMM } from "../../utils/helper"; import useResponsive from "../../theme/hooks/useResponsive"; -import { set } from "mongoose"; import AlertBanner from "../AlertBanner"; export const CalenderExpenseGraph = () => { diff --git a/client/src/components/expense/addExpense.jsx b/client/src/components/expense/addExpense.jsx index 2206377..6f72b80 100644 --- a/client/src/components/expense/addExpense.jsx +++ b/client/src/components/expense/addExpense.jsx @@ -11,7 +11,7 @@ import useResponsive from '../../theme/hooks/useResponsive'; import { currencyFind } from '../../utils/helper'; import { addExpenseService } from '../../services/expenseServices'; import configData from '../../config.json' -import { useParams } from 'react-router-dom' +import { useParams, useNavigate } from 'react-router-dom' import { getGroupDetailsService } from '../../services/groupServices'; import Loading from '../loading'; import { Link as RouterLink } from 'react-router-dom'; @@ -20,6 +20,7 @@ import { parseISO } from 'date-fns'; export default function AddExpense() { + const navigate = useNavigate(); const params = useParams(); const mdUp = useResponsive('up', 'md'); const profile = JSON.parse(localStorage.getItem('profile')) @@ -58,7 +59,7 @@ export default function AddExpense() { onSubmit: async () => { setLoading(true) if(await addExpenseService(values, setAlert, setAlertMessage)) - window.location = configData.VIEW_GROUP_URL+groupId + navigate(configData.VIEW_GROUP_URL + groupId, { state: { refresh: true } }) }, }); diff --git a/client/src/components/expense/editExpense.jsx b/client/src/components/expense/editExpense.jsx index acc39a2..d89b642 100644 --- a/client/src/components/expense/editExpense.jsx +++ b/client/src/components/expense/editExpense.jsx @@ -16,7 +16,7 @@ import Loading from '../loading'; import { useNavigate } from "react-router-dom"; import AlertBanner from '../AlertBanner'; import { parseISO } from 'date-fns'; - +import configData from '../../config.json'; export default function EditExpense() { @@ -52,10 +52,10 @@ export default function EditExpense() { id: null }, validationSchema: editExpenseSchema, - onSubmit: async () => { + onSubmit: async (values) => { setLoading(true) if(await editExpenseService(values, setAlert, setAlertMessage)) - navigate(-1) + navigate(configData.VIEW_GROUP_URL + values.groupId, { state: { refresh: true } }) }, }); @@ -85,16 +85,18 @@ export default function EditExpense() { id: response_exp?.data?.expense?.groupId } const response_group = await getGroupDetailsService(groupIdJson, setAlert, setAlertMessage) - formik.values.expenseName = exp?.expenseName - formik.values.expenseDescription = exp?.expenseDescription - formik.values.expenseOwner = exp?.expenseOwner - formik.values.expenseMembers = exp?.expenseMembers - formik.values.expenseAmount = exp?.expenseAmount - formik.values.expenseCategory = exp?.expenseCategory - formik.values.expenseDate = exp?.expenseDate - formik.values.groupId = exp?.groupId - formik.values.expenseType = exp?.expenseType - formik.values.id = exp?._id + formik.setValues({ + expenseName: exp?.expenseName, + expenseDescription: exp?.expenseDescription, + expenseOwner: exp?.expenseOwner, + expenseMembers: exp?.expenseMembers, + expenseAmount: exp?.expenseAmount, + expenseCategory: exp?.expenseCategory, + expenseDate: exp?.expenseDate, + groupId: exp?.groupId, + expenseType: exp?.expenseType, + id: exp?._id + }) setGroupMembers(response_group?.data?.group?.groupMembers) setLoading(false) } diff --git a/client/src/components/expense/expenseCard.jsx b/client/src/components/expense/expenseCard.jsx index ba12ab5..05f8434 100644 --- a/client/src/components/expense/expenseCard.jsx +++ b/client/src/components/expense/expenseCard.jsx @@ -38,7 +38,7 @@ const modelStyle = { }; -export default function ExpenseCard({ expenseId, expenseName, expenseAmount, expensePerMember, expenseOwner, expenseDate, currencyType }) { +export default function ExpenseCard({ expenseId, expenseName, expenseAmount, expensePerMember, expenseOwner, expenseDate, currencyType, onExpenseDeleted }) { const mdUp = useResponsive('up', 'md'); const [anchorEl, setAnchorEl] = useState(null); const [deleteConfirm, setDeleteConfirm] = useState(false) @@ -60,8 +60,12 @@ export default function ExpenseCard({ expenseId, expenseName, expenseAmount, exp const apiDeleteCall = async() => { await deleteExpenseService({id: expenseId}) - window.location.reload() deleteConfirmClose() + if (onExpenseDeleted) { + onExpenseDeleted() + } else { + window.location.reload() + } } const open = Boolean(anchorEl); @@ -174,7 +178,7 @@ export default function ExpenseCard({ expenseId, expenseName, expenseAmount, exp - ` { +export const GroupSettlements = ({ currencyType, refreshKey = 0 }) => { const params = useParams(); const [noSettle, setNoSettle] = useState(true) const [alert, setAlert] = useState(false) @@ -27,6 +27,7 @@ export const GroupSettlements = ({ currencyType }) => { const getGroupSettlement = async () => { setReload(false) setLoading(true) + setNoSettle(true) const groupIdJson = { id: params.groupId } @@ -35,7 +36,7 @@ export const GroupSettlements = ({ currencyType }) => { setLoading(false) } getGroupSettlement() - }, [reload]) + }, [reload, params.groupId, refreshKey]) return ( <> @@ -71,7 +72,7 @@ export const GroupSettlements = ({ currencyType }) => { No Settlement requiered ! - : } + : } diff --git a/client/src/components/groups/settlement/userBalanceChart.jsx b/client/src/components/groups/settlement/userBalanceChart.jsx index 68ce613..8291e62 100644 --- a/client/src/components/groups/settlement/userBalanceChart.jsx +++ b/client/src/components/groups/settlement/userBalanceChart.jsx @@ -10,7 +10,7 @@ import { Bar } from "react-chartjs-2" import useResponsive from "../../../theme/hooks/useResponsive" -const UserBalanceChart = () => { +const UserBalanceChart = ({ refreshKey = 0 }) => { const params = useParams(); const mdUp = useResponsive('up', 'md'); const [loading, setLoading] = useState(false) @@ -51,6 +51,8 @@ const UserBalanceChart = () => { useEffect(() => { const getGroupDetails = async () => { setLoading(true) + setGraphData([]) + setGraphLabel([]) const groupIdJson = { id: params.groupId } @@ -71,7 +73,7 @@ const UserBalanceChart = () => { setLoading(false) } getGroupDetails() - }, []) + }, [params.groupId, refreshKey]) return ( <> diff --git a/client/src/components/groups/viewGroup/groupCategoryGraph.jsx b/client/src/components/groups/viewGroup/groupCategoryGraph.jsx index c4f9c19..d48ebee 100644 --- a/client/src/components/groups/viewGroup/groupCategoryGraph.jsx +++ b/client/src/components/groups/viewGroup/groupCategoryGraph.jsx @@ -10,7 +10,7 @@ import ChartDataLabels from 'chartjs-plugin-datalabels'; import 'chart.js/auto' import { convertToCurrency, currencyFind } from '../../../utils/helper'; -const GroupCategoryGraph = ({currencyType}) => { +const GroupCategoryGraph = ({currencyType, refreshKey = 0}) => { const params = useParams(); const [alert, setAlert] = useState(false) const [alertMessage, setAlertMessage] = useState() @@ -66,12 +66,12 @@ const GroupCategoryGraph = ({currencyType}) => { } const category_exp = await getGroupCategoryExpService(groupIdJson, setAlert, setAlertMessage) - setCategoryExp(category_exp.data.data) + setCategoryExp(category_exp?.data?.data) setLoading(false) } getGroupCategoryExpense() - }, []) + }, [params.groupId, refreshKey]) return ( <> {loading ? : diff --git a/client/src/components/groups/viewGroup/groupMonthlyGraph.jsx b/client/src/components/groups/viewGroup/groupMonthlyGraph.jsx index 2e91c3a..8f9cc89 100644 --- a/client/src/components/groups/viewGroup/groupMonthlyGraph.jsx +++ b/client/src/components/groups/viewGroup/groupMonthlyGraph.jsx @@ -9,7 +9,7 @@ import { Line } from "react-chartjs-2"; import 'chart.js/auto' import { monthNamesMMM } from '../../../utils/helper'; -const GroupMonthlyGraph = () => { +const GroupMonthlyGraph = ({ refreshKey = 0 }) => { const params = useParams(); const [alert, setAlert] = useState(false) const [alertMessage, setAlertMessage] = useState() @@ -71,13 +71,13 @@ const GroupMonthlyGraph = () => { const monthly_exp = await getGroupMonthlyExpService(groupIdJson, setAlert, setAlertMessage) const daily_exp = await getGroupDailyExpService(groupIdJson, setAlert, setAlertMessage) - setMonthlyExp(monthly_exp.data.data) - setDailyExp(daily_exp.data.data) + setMonthlyExp(monthly_exp?.data?.data) + setDailyExp(daily_exp?.data?.data) setLoading(false) } getGroupMonthlyExpense() - }, []) + }, [params.groupId, refreshKey]) return ( <> {loading ? : diff --git a/client/src/components/groups/viewGroup/index.jsx b/client/src/components/groups/viewGroup/index.jsx index 8e64b32..8ed6410 100644 --- a/client/src/components/groups/viewGroup/index.jsx +++ b/client/src/components/groups/viewGroup/index.jsx @@ -1,6 +1,6 @@ import { Box, Button, Container, Divider, Fab, Grid, Link, Stack, styled, Typography } from '@mui/material'; import React, { useEffect, useState } from 'react' -import { useParams } from 'react-router-dom' +import { useParams, useLocation } from 'react-router-dom' import { getGroupDetailsService, getGroupExpenseService } from '../../../services/groupServices'; import AlertBanner from '../../AlertBanner'; import Iconify from '../../Iconify'; @@ -19,6 +19,7 @@ const emailId = profile?.emailId var showCount = 10 export default function ViewGroup() { const params = useParams(); + const location = useLocation(); const [loading, setLoading] = useState(true); const [group, setGroup] = useState({}); const [groupExpense, setGroupExpense] = useState([]); @@ -30,6 +31,11 @@ export default function ViewGroup() { const [expFocus, setExpFocus] = useState(false); const [expenses, setExpenses] = useState() const [viewSettlement, setViewSettlement] = useState(0) + const [expenseRefreshKey, setExpenseRefreshKey] = useState(0) + + const triggerExpenseRefresh = () => { + setExpenseRefreshKey(prev => prev + 1) + } const toggleAllExp = () => { @@ -63,9 +69,18 @@ export default function ViewGroup() { return 0 } + useEffect(() => { + if (location.state?.refresh) { + triggerExpenseRefresh() + } + }, [location.state]) + useEffect(() => { const getGroupDetails = async () => { setLoading(true) + showCount = 10 + setShowAllExp(false) + setExpFocus(false) const groupIdJson = { id: params.groupId } @@ -80,7 +95,7 @@ export default function ViewGroup() { setLoading(false) } getGroupDetails() - }, []); + }, [params.groupId, expenseRefreshKey]); const CategoryStyle = styled('span')(({ theme }) => ({ top: 22, @@ -367,7 +382,7 @@ export default function ViewGroup() { } {viewSettlement === 1 && - + } {viewSettlement === 0 && @@ -405,6 +420,7 @@ export default function ViewGroup() { expenseOwner={myExpense?.expenseOwner} expenseDate={myExpense?.expenseDate} currencyType={group?.groupCurrency} + onExpenseDeleted={triggerExpenseRefresh} /> ))} @@ -414,10 +430,10 @@ export default function ViewGroup() { - + - + } diff --git a/components/group.js b/components/group.js index ae54a9f..7c860fd 100644 --- a/components/group.js +++ b/components/group.js @@ -301,7 +301,7 @@ exports.addSplit = async (groupId, expenseAmount, expenseOwner, expenseMembers) }) group.groupTotal += expenseAmount group.split[0][expenseOwner] += expenseAmount - expensePerPerson = expenseAmount / expenseMembers.length + let expensePerPerson = expenseAmount / expenseMembers.length expensePerPerson = Math.round((expensePerPerson + Number.EPSILON) * 100) / 100; //Updating the split values per user for (var user of expenseMembers) { @@ -310,7 +310,7 @@ exports.addSplit = async (groupId, expenseAmount, expenseOwner, expenseMembers) //Nullifying split - check if the group balance is zero else added the diff to owner let bal=0 - for(val of Object.entries(group.split[0])) + for(let val of Object.entries(group.split[0])) { bal += val[1] } @@ -334,7 +334,7 @@ exports.clearSplit = async (groupId, expenseAmount, expenseOwner, expenseMembers }) group.groupTotal -= expenseAmount group.split[0][expenseOwner] -= expenseAmount - expensePerPerson = expenseAmount / expenseMembers.length + let expensePerPerson = expenseAmount / expenseMembers.length expensePerPerson = Math.round((expensePerPerson + Number.EPSILON) * 100) / 100; //Updating the split values per user for (var user of expenseMembers) { @@ -343,7 +343,7 @@ exports.clearSplit = async (groupId, expenseAmount, expenseOwner, expenseMembers //Nullifying split - check if the group balance is zero else added the diff to owner let bal=0 - for(val of Object.entries(group.split[0])) + for(let val of Object.entries(group.split[0])) { bal += val[1] }