diff --git a/.npmrc b/.npmrc
new file mode 100644
index 0000000..e9ee3cb
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+legacy-peer-deps=true
\ No newline at end of file
diff --git a/README.md b/README.md
index 58beeac..cdc6d73 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
+
+
+
# Getting Started with Create React App
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
diff --git a/package-lock.json b/package-lock.json
index 1207d66..f528e95 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,27 +12,36 @@
"@emoji-mart/react": "^1.0.1",
"@emotion/react": "^11.10.4",
"@emotion/styled": "^11.10.4",
+ "@hookform/resolvers": "^3.3.1",
"@iconify/react": "^4.0.0",
"@mui/material": "^5.10.8",
+ "@reduxjs/toolkit": "^1.9.6",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
- "emoji-mart": "^5.2.2",
+ "axios": "^1.7.9",
+ "emoji-mart": "^5.5.2",
"framer-motion": "^7.5.3",
"phosphor-react": "^1.4.1",
"prop-types": "^15.8.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
+ "react-hook-form": "^7.47.0",
"react-i18next": "^11.18.6",
+ "react-redux": "^8.1.2",
"react-router-dom": "^6.4.2",
"react-scripts": "5.0.1",
+ "redux": "^4.2.1",
+ "redux-persist": "^6.0.0",
"simplebar-react": "^2.4.3",
"stylis-plugin-rtl": "^2.0.2",
- "web-vitals": "^2.1.4"
+ "web-vitals": "^2.1.4",
+ "yup": "^1.3.2"
},
"devDependencies": {
- "@faker-js/faker": "^7.5.0"
+ "@faker-js/faker": "^7.5.0",
+ "visualize-react-component": "^1.0.43"
}
},
"node_modules/@adobe/css-tools": {
@@ -1825,11 +1834,11 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
- "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
+ "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
"dependencies": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1847,6 +1856,11 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/runtime/node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ },
"node_modules/@babel/template": {
"version": "7.18.10",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
@@ -2369,6 +2383,21 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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",
@@ -2399,6 +2428,11 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/@eslint/eslintrc/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=="
+ },
"node_modules/@eslint/eslintrc/node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@@ -2420,6 +2454,14 @@
"npm": ">=6.0.0"
}
},
+ "node_modules/@hookform/resolvers": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.1.tgz",
+ "integrity": "sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ==",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.10.7",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
@@ -3632,6 +3674,29 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@reduxjs/toolkit": {
+ "version": "1.9.6",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.6.tgz",
+ "integrity": "sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw==",
+ "dependencies": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react-redux": "^7.2.1 || ^8.0.2"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@remix-run/router": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz",
@@ -4314,6 +4379,15 @@
"@types/node": "*"
}
},
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"node_modules/@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -4724,6 +4798,11 @@
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
"node_modules/@types/ws": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
@@ -5225,13 +5304,13 @@
}
},
"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.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
@@ -5255,34 +5334,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",
@@ -5515,6 +5566,30 @@
"node": ">=4"
}
},
+ "node_modules/axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
@@ -5623,6 +5698,34 @@
"webpack": ">=2"
}
},
+ "node_modules/babel-loader/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/babel-loader/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=="
+ },
"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",
@@ -5924,6 +6027,12 @@
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
},
+ "node_modules/boring-avatars": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.10.1.tgz",
+ "integrity": "sha512-WcgHDeLrazCR03CDPEvCchLsUecZAZvs4F6FnMiGlTEjyQQf15Q5TRl4EUaAQ1dacvhPq7lC9EOTWkCojQ6few==",
+ "dev": true
+ },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6020,6 +6129,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -6176,6 +6297,12 @@
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
},
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==",
+ "dev": true
+ },
"node_modules/clean-css": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz",
@@ -6598,21 +6725,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",
@@ -6624,11 +6736,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",
@@ -7237,6 +7344,19 @@
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -7278,9 +7398,9 @@
}
},
"node_modules/emoji-mart": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.2.2.tgz",
- "integrity": "sha512-BvcrX+Ps9MxSVEjnvxupclU3MBD6WVC4WZOY26csfC6oFdaWpFhdrzeVNVBmCLPOmzY1SE0aAsqZJRNVbZ1yhQ=="
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.5.2.tgz",
+ "integrity": "sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A=="
},
"node_modules/emoji-regex": {
"version": "9.2.2",
@@ -7381,11 +7501,52 @@
"resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -7910,21 +8071,6 @@
"webpack": "^5.0.0"
}
},
- "node_modules/eslint-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/eslint-webpack-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -7957,11 +8103,6 @@
"node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
}
},
- "node_modules/eslint-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/eslint-webpack-plugin/node_modules/schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -7994,6 +8135,21 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/eslint/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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",
@@ -8088,6 +8244,11 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/eslint/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=="
+ },
"node_modules/eslint/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8552,9 +8713,9 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
},
"node_modules/follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
@@ -8608,6 +8769,29 @@
}
}
},
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "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",
@@ -8690,6 +8874,11 @@
"node": ">=8"
}
},
+ "node_modules/fork-ts-checker-webpack-plugin/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=="
+ },
"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",
@@ -8847,9 +9036,12 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/function.prototype.name": {
"version": "1.1.5",
@@ -8876,6 +9068,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/fuse.js": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz",
+ "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -8893,13 +9094,23 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -8918,6 +9129,18 @@
"node": ">=8.0.0"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -9041,6 +9264,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -9114,9 +9348,9 @@
}
},
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -9125,11 +9359,11 @@
}
},
"node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -9138,6 +9372,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -9435,9 +9680,9 @@
}
},
"node_modules/immer": {
- "version": "9.0.15",
- "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
- "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==",
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
@@ -11998,9 +12243,9 @@
"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.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -12265,6 +12510,14 @@
"tmpl": "1.0.5"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -12391,21 +12644,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",
@@ -12417,11 +12655,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",
@@ -14350,6 +14583,15 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -14390,6 +14632,11 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -14410,6 +14657,11 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -14720,6 +14972,21 @@
"react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/react-hook-form": {
+ "version": "7.47.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.47.0.tgz",
+ "integrity": "sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
"node_modules/react-i18next": {
"version": "11.18.6",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz",
@@ -14741,11 +15008,63 @@
}
}
},
+ "node_modules/react-icons": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz",
+ "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==",
+ "dev": true,
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
+ "node_modules/react-redux": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz",
+ "integrity": "sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8 || ^17.0 || ^18.0",
+ "@types/react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react-native": ">=0.59",
+ "redux": "^4 || ^5.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
"node_modules/react-refresh": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -14856,6 +15175,32 @@
}
}
},
+ "node_modules/react-tooltip": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz",
+ "integrity": "sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==",
+ "dev": true,
+ "dependencies": {
+ "prop-types": "^15.8.1",
+ "uuid": "^7.0.3"
+ },
+ "engines": {
+ "npm": ">=6.13"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
+ }
+ },
+ "node_modules/react-tooltip/node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@@ -14937,6 +15282,30 @@
"node": ">=8"
}
},
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/redux-persist": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz",
+ "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==",
+ "peerDependencies": {
+ "redux": ">4.0.0"
+ }
+ },
+ "node_modules/redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "peerDependencies": {
+ "redux": "^4"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -15079,6 +15448,11 @@
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
+ "node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ },
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -15405,6 +15779,34 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "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.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/schema-utils/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=="
+ },
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -16363,6 +16765,11 @@
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
},
+ "node_modules/tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -16395,6 +16802,11 @@
"node": ">=0.6"
}
},
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
"node_modules/tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
@@ -16670,6 +17082,14 @@
"requires-port": "^1.0.0"
}
},
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -16731,6 +17151,27 @@
"node": ">= 0.8"
}
},
+ "node_modules/visualize-react-component": {
+ "version": "1.0.43",
+ "resolved": "https://registry.npmjs.org/visualize-react-component/-/visualize-react-component-1.0.43.tgz",
+ "integrity": "sha512-cjqRtW2D345rMET2xTI3o3o1Ry1dAYcbqiwU0kAIzPoTYpznBOjyxPaR4M6rXWmEsriKQ7se7RqraVoW17Mjlg==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "^5.9.0",
+ "boring-avatars": "^1.6.1",
+ "classnames": "^2.3.1",
+ "commander": "^8.3.0",
+ "fuse.js": "^6.5.3",
+ "picocolors": "^1.0.0",
+ "prismjs": "^1.25.0",
+ "react-icons": "^4.3.1",
+ "react-tooltip": "^4.2.21"
+ },
+ "bin": {
+ "virot": "dist/cli.js"
+ }
+ },
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -16867,21 +17308,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",
@@ -16893,11 +17319,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",
@@ -16970,21 +17391,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",
@@ -16996,11 +17402,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",
@@ -17271,21 +17672,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",
@@ -17300,11 +17686,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",
@@ -17641,6 +18022,28 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yup": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.2.tgz",
+ "integrity": "sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
+ "node_modules/yup/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
},
"dependencies": {
@@ -18840,11 +19243,18 @@
}
},
"@babel/runtime": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
- "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
+ "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
"requires": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.14.0"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ }
}
},
"@babel/runtime-corejs3": {
@@ -19174,6 +19584,17 @@
"strip-json-comments": "^3.1.1"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -19195,6 +19616,11 @@
"argparse": "^2.0.1"
}
},
+ "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=="
+ },
"type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@@ -19208,6 +19634,11 @@
"integrity": "sha512-8wNUCCUHvfvI0gQpDUho/3gPzABffnCn5um65F8dzQ86zz6dlt4+nmAA7PQUc8L+eH+9RgR/qzy5N/8kN0Ozdw==",
"dev": true
},
+ "@hookform/resolvers": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.1.tgz",
+ "integrity": "sha512-K7KCKRKjymxIB90nHDQ7b9nli474ru99ZbqxiqDAWYsYhOsU3/4qLxW91y+1n04ic13ajjZ66L3aXbNef8PELQ=="
+ },
"@humanwhocodes/config-array": {
"version": "0.10.7",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
@@ -20046,6 +20477,17 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
},
+ "@reduxjs/toolkit": {
+ "version": "1.9.6",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.6.tgz",
+ "integrity": "sha512-Gc4ikl90ORF4viIdAkY06JNUnODjKfGxZRwATM30EdHq8hLSVoSrwXne5dd739yenP5bJxAX7tLuOWK5RPGtrw==",
+ "requires": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ }
+ },
"@remix-run/router": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz",
@@ -20532,6 +20974,15 @@
"@types/node": "*"
}
},
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -20889,6 +21340,11 @@
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
+ "@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
"@types/ws": {
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
@@ -21252,13 +21708,13 @@
}
},
"ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"requires": {
"fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
@@ -21268,31 +21724,8 @@
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"requires": {
"ajv": "^8.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "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=="
- }
}
},
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
- },
"ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -21449,6 +21882,29 @@
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
"integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w=="
},
+ "axios": {
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+ "requires": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ }
+ }
+ }
+ },
"axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
@@ -21525,6 +21981,27 @@
"schema-utils": "^2.6.5"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "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=="
+ },
"schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -21772,6 +22249,12 @@
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
},
+ "boring-avatars": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.10.1.tgz",
+ "integrity": "sha512-WcgHDeLrazCR03CDPEvCchLsUecZAZvs4F6FnMiGlTEjyQQf15Q5TRl4EUaAQ1dacvhPq7lC9EOTWkCojQ6few==",
+ "dev": true
+ },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -21837,6 +22320,15 @@
"get-intrinsic": "^1.0.2"
}
},
+ "call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -21947,6 +22439,12 @@
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
},
+ "classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==",
+ "dev": true
+ },
"clean-css": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz",
@@ -22237,17 +22735,6 @@
"source-map": "^0.6.1"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -22256,11 +22743,6 @@
"fast-deep-equal": "^3.1.3"
}
},
- "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=="
- },
"schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -22709,6 +23191,16 @@
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
},
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
"duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -22738,9 +23230,9 @@
"integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg=="
},
"emoji-mart": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.2.2.tgz",
- "integrity": "sha512-BvcrX+Ps9MxSVEjnvxupclU3MBD6WVC4WZOY26csfC6oFdaWpFhdrzeVNVBmCLPOmzY1SE0aAsqZJRNVbZ1yhQ=="
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.5.2.tgz",
+ "integrity": "sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A=="
},
"emoji-regex": {
"version": "9.2.2",
@@ -22823,11 +23315,40 @@
"resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
},
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
+ },
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
+ },
"es-module-lexer": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
},
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "requires": {
+ "es-errors": "^1.3.0"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "requires": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ }
+ },
"es-shim-unscopables": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
@@ -22961,6 +23482,17 @@
"text-table": "^0.2.0"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -23022,6 +23554,11 @@
"argparse": "^2.0.1"
}
},
+ "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=="
+ },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -23282,17 +23819,6 @@
"schema-utils": "^4.0.0"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -23316,11 +23842,6 @@
"supports-color": "^8.0.0"
}
},
- "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=="
- },
"schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -23683,9 +24204,9 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
},
"follow-redirects": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
- "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
},
"fork-ts-checker-webpack-plugin": {
"version": "6.5.2",
@@ -23707,6 +24228,22 @@
"tapable": "^1.0.0"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -23765,6 +24302,11 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
+ "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=="
+ },
"schema-utils": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
@@ -23881,9 +24423,9 @@
"optional": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"function.prototype.name": {
"version": "1.1.5",
@@ -23901,6 +24443,12 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
+ "fuse.js": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz",
+ "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==",
+ "dev": true
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -23912,13 +24460,20 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
}
},
"get-own-enumerable-property-symbols": {
@@ -23931,6 +24486,15 @@
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
},
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -24017,6 +24581,11 @@
"slash": "^3.0.0"
}
},
+ "gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
+ },
"graceful-fs": {
"version": "4.2.10",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -24072,16 +24641,24 @@
}
},
"has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"requires": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "requires": {
+ "function-bind": "^1.1.2"
}
},
"he": {
@@ -24312,9 +24889,9 @@
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
},
"immer": {
- "version": "9.0.15",
- "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
- "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ=="
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
},
"import-fresh": {
"version": "3.3.0",
@@ -26159,9 +26736,9 @@
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"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.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -26366,6 +26943,11 @@
"tmpl": "1.0.5"
}
},
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
+ },
"mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -26449,17 +27031,6 @@
"schema-utils": "^4.0.0"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -26468,11 +27039,6 @@
"fast-deep-equal": "^3.1.3"
}
},
- "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=="
- },
"schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -27657,6 +28223,12 @@
}
}
},
+ "prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "dev": true
+ },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -27696,6 +28268,11 @@
}
}
},
+ "property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -27712,6 +28289,11 @@
}
}
},
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -27935,6 +28517,11 @@
"shallowequal": "^1.1.0"
}
},
+ "react-hook-form": {
+ "version": "7.47.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.47.0.tgz",
+ "integrity": "sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg=="
+ },
"react-i18next": {
"version": "11.18.6",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz",
@@ -27944,11 +28531,37 @@
"html-parse-stringify": "^3.0.1"
}
},
+ "react-icons": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz",
+ "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==",
+ "dev": true
+ },
"react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
+ "react-redux": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz",
+ "integrity": "sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==",
+ "requires": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ }
+ }
+ },
"react-refresh": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
@@ -28026,6 +28639,24 @@
"workbox-webpack-plugin": "^6.4.1"
}
},
+ "react-tooltip": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz",
+ "integrity": "sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==",
+ "dev": true,
+ "requires": {
+ "prop-types": "^15.8.1",
+ "uuid": "^7.0.3"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "dev": true
+ }
+ }
+ },
"react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@@ -28090,6 +28721,24 @@
"strip-indent": "^3.0.0"
}
},
+ "redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "redux-persist": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz",
+ "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ=="
+ },
+ "redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q=="
+ },
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -28201,6 +28850,11 @@
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
+ "reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ },
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -28403,6 +29057,29 @@
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+ },
+ "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=="
+ }
}
},
"select-hose": {
@@ -29147,6 +29824,11 @@
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
},
+ "tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
"tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@@ -29170,6 +29852,11 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
},
+ "toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
"tough-cookie": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
@@ -29371,6 +30058,11 @@
"requires-port": "^1.0.0"
}
},
+ "use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA=="
+ },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -29417,6 +30109,23 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
+ "visualize-react-component": {
+ "version": "1.0.43",
+ "resolved": "https://registry.npmjs.org/visualize-react-component/-/visualize-react-component-1.0.43.tgz",
+ "integrity": "sha512-cjqRtW2D345rMET2xTI3o3o1Ry1dAYcbqiwU0kAIzPoTYpznBOjyxPaR4M6rXWmEsriKQ7se7RqraVoW17Mjlg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "^5.9.0",
+ "boring-avatars": "^1.6.1",
+ "classnames": "^2.3.1",
+ "commander": "^8.3.0",
+ "fuse.js": "^6.5.3",
+ "picocolors": "^1.0.0",
+ "prismjs": "^1.25.0",
+ "react-icons": "^4.3.1",
+ "react-tooltip": "^4.2.21"
+ }
+ },
"void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -29537,17 +30246,6 @@
"schema-utils": "^4.0.0"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -29556,11 +30254,6 @@
"fast-deep-equal": "^3.1.3"
}
},
- "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=="
- },
"schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -29610,17 +30303,6 @@
"ws": "^8.4.2"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -29629,11 +30311,6 @@
"fast-deep-equal": "^3.1.3"
}
},
- "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=="
- },
"schema-utils": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
@@ -29821,17 +30498,6 @@
"workbox-window": "6.5.4"
},
"dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -29843,11 +30509,6 @@
"universalify": "^2.0.0"
}
},
- "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=="
- },
"source-map": {
"version": "0.8.0-beta.0",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
@@ -30127,6 +30788,24 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+ },
+ "yup": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.3.2.tgz",
+ "integrity": "sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==",
+ "requires": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="
+ }
+ }
}
}
}
diff --git a/package.json b/package.json
index 6fbcc83..b2bbf68 100644
--- a/package.json
+++ b/package.json
@@ -7,30 +7,39 @@
"@emoji-mart/react": "^1.0.1",
"@emotion/react": "^11.10.4",
"@emotion/styled": "^11.10.4",
+ "@hookform/resolvers": "^3.3.1",
"@iconify/react": "^4.0.0",
"@mui/material": "^5.10.8",
+ "@reduxjs/toolkit": "^1.9.6",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
- "emoji-mart": "^5.2.2",
+ "axios": "^1.7.9",
+ "emoji-mart": "^5.5.2",
"framer-motion": "^7.5.3",
"phosphor-react": "^1.4.1",
"prop-types": "^15.8.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
+ "react-hook-form": "^7.47.0",
"react-i18next": "^11.18.6",
+ "react-redux": "^8.1.2",
"react-router-dom": "^6.4.2",
"react-scripts": "5.0.1",
+ "redux": "^4.2.1",
+ "redux-persist": "^6.0.0",
"simplebar-react": "^2.4.3",
"stylis-plugin-rtl": "^2.0.2",
- "web-vitals": "^2.1.4"
+ "web-vitals": "^2.1.4",
+ "yup": "^1.3.2"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
- "eject": "react-scripts eject"
+ "eject": "react-scripts eject",
+ "install": "npm install --legacy-peer-deps"
},
"eslintConfig": {
"extends": [
@@ -51,6 +60,7 @@
]
},
"devDependencies": {
- "@faker-js/faker": "^7.5.0"
+ "@faker-js/faker": "^7.5.0",
+ "visualize-react-component": "^1.0.43"
}
}
diff --git a/public/projectImage.png b/public/projectImage.png
new file mode 100644
index 0000000..96a6de4
Binary files /dev/null and b/public/projectImage.png differ
diff --git a/src/App.js b/src/App.js
index 4e72345..c1b1afe 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,5 +1,5 @@
// routes
-import Router from "./routes";
+import Router from './routes';
// theme
import ThemeProvider from './theme';
// components
@@ -9,8 +9,7 @@ function App() {
return (
- {" "}
- {" "}
+
);
diff --git a/src/assets/Images/Talk-logo-transparent.png b/src/assets/Images/Talk-logo-transparent.png
new file mode 100644
index 0000000..e562605
Binary files /dev/null and b/src/assets/Images/Talk-logo-transparent.png differ
diff --git a/src/components/AntSwitch.js b/src/components/AntSwitch.js
index f66bab7..7e1b5b7 100644
--- a/src/components/AntSwitch.js
+++ b/src/components/AntSwitch.js
@@ -1,47 +1,50 @@
-import { Switch } from "@mui/material";
-import { styled } from "@mui/material/styles";
+import { Switch } from '@mui/material';
+import { styled } from '@mui/material/styles';
const AntSwitch = styled(Switch)(({ theme }) => ({
width: 40,
height: 20,
padding: 0,
- display: "flex",
- "&:active": {
- "& .MuiSwitch-thumb": {
+ display: 'flex',
+ '&:active': {
+ '& .MuiSwitch-thumb': {
width: 15,
},
- "& .MuiSwitch-switchBase.Mui-checked": {
- transform: "translateX(9px)",
+ '& .MuiSwitch-switchBase.Mui-checked': {
+ transform: 'translateX(1px)',
},
},
- "& .MuiSwitch-switchBase": {
+ '& .MuiSwitch-switchBase': {
padding: 2,
- "&.Mui-checked": {
- transform: "translateX(20px)",
- color: "#fff",
- "& + .MuiSwitch-track": {
+ '&.Mui-checked': {
+ transform: 'translateX(20px)',
+ color: '#fff',
+ '& + .MuiSwitch-track': {
opacity: 1,
- backgroundColor: theme.palette.primary.main,
+ backgroundColor:
+ theme.palette.mode === 'dark'
+ ? '#177ddc'
+ : theme.palette.primary.main,
},
},
},
- "& .MuiSwitch-thumb": {
- boxShadow: "0 2px 4px 0 rgb(0 35 11 / 20%)",
+ '& .MuiSwitch-thumb': {
+ boxShadow: '0 2px 4px 0 rgb(0 35 11 / 20%)',
width: 16,
height: 16,
borderRadius: 8,
- transition: theme.transitions.create(["width"], {
- duration: 200,
+ transition: theme.transitions.create(['width'], {
+ duration: 300,
}),
},
- "& .MuiSwitch-track": {
+ '& .MuiSwitch-track': {
borderRadius: 20 / 2,
opacity: 1,
backgroundColor:
- theme.palette.mode === "dark"
- ? "rgba(255,255,255,.35)"
- : "rgba(0,0,0,.25)",
- boxSizing: "border-box",
+ theme.palette.mode === 'dark'
+ ? 'rgba(255,255,255,.35)'
+ : 'rgba(0,0,0,.25)',
+ boxSizing: 'border-box',
},
}));
diff --git a/src/components/CallElement.js b/src/components/CallElement.js
new file mode 100644
index 0000000..99fa4d3
--- /dev/null
+++ b/src/components/CallElement.js
@@ -0,0 +1,112 @@
+import { faker } from '@faker-js/faker';
+import { Avatar, Box, IconButton, Stack, Typography } from '@mui/material';
+import React from 'react';
+import StyledBadge from './StyledBadge';
+import { ArrowDownLeft, Phone, VideoCamera } from 'phosphor-react';
+
+const CallElement = ({ img, name, online, incoming, missed }) => {
+ return (
+ <>
+
+ theme.palette.mode === 'light'
+ ? '#fff'
+ : theme.palette.background.default,
+ }}
+ p={2}
+ >
+ {' '}
+
+
+ {online ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ {name}
+
+ {incoming ? (
+
+ ) : (
+
+ )}
+ Yesterday 21:24
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+const CallLogElement = ({ name, img, online }) => {
+ return (
+ <>
+
+ theme.palette.mode === 'light'
+ ? '#fff'
+ : theme.palette.background.default,
+ }}
+ p={2}
+ >
+ {' '}
+
+
+ {online ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ {name}
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export { CallElement, CallLogElement };
diff --git a/src/components/ChatElement.js b/src/components/ChatElement.js
new file mode 100644
index 0000000..b380c36
--- /dev/null
+++ b/src/components/ChatElement.js
@@ -0,0 +1,62 @@
+import {
+ Avatar,
+ Badge,
+ Box,
+ Stack,
+ styled,
+ Typography,
+ useTheme,
+} from '@mui/material';
+import { faker } from '@faker-js/faker';
+import StyledBadge from './StyledBadge';
+
+const ChatElement = ({ id, name, img, msg, time, unread, online }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+ {online ? (
+
+
+
+ ) : (
+
+ )}
+
+
+ {name}
+ {msg}
+
+
+
+
+ {time}
+
+
+
+
+
+ );
+};
+
+export default ChatElement;
diff --git a/src/components/Contact.js b/src/components/Contact.js
new file mode 100644
index 0000000..81884e2
--- /dev/null
+++ b/src/components/Contact.js
@@ -0,0 +1,289 @@
+import {
+ Avatar,
+ Box,
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogContentText,
+ DialogTitle,
+ Divider,
+ IconButton,
+ Slide,
+ Stack,
+ Typography,
+} from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import React, { forwardRef, useState } from 'react';
+import {
+ Bell,
+ CaretRight,
+ Phone,
+ Prohibit,
+ Star,
+ Trash,
+ VideoCamera,
+ X,
+} from 'phosphor-react';
+import { useDispatch } from 'react-redux';
+import { ToggleSidebar, UpdateSidebarType } from '../redux/slices/app';
+import { faker } from '@faker-js/faker';
+import AntSwitch from './AntSwitch';
+
+const Transition = forwardRef(function Transition(props, ref) {
+ return ;
+});
+
+const DeleteDialog = ({ open, handleClose }) => {
+ return (
+
+ );
+};
+
+const BlockDialog = ({ open, handleClose }) => {
+ return (
+
+ );
+};
+
+const Contact = () => {
+ const [openBlock, setOpenBlock] = useState(false);
+ const [openDelete, setOpenDelete] = useState(false);
+
+ const handleCloseBlock = () => {
+ setOpenBlock(false);
+ };
+ const handleCloseDelete = () => {
+ setOpenDelete(false);
+ };
+
+ const dispatch = useDispatch();
+ const theme = useTheme();
+ return (
+
+
+ {/**header */}
+
+
+ Contact info
+ {
+ dispatch(ToggleSidebar());
+ }}
+ >
+
+
+
+
+
+ {/**Body */}
+
+
+
+
+
+ {faker.name.fullName()}
+
+
+ {'05754 - 46846 - 58'}
+
+
+
+
+
+
+
+
+ Voice
+
+
+
+
+
+ Video
+
+
+
+
+
+ About
+
+
+ Imagination is the only limit.
+
+
+
+
+
+ Media, Links, & Docs
+
+
+
+ {[1, 2, 3].map((el) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ Started Messages
+
+ {
+ dispatch(UpdateSidebarType('STARRED'));
+ }}
+ >
+
+
+
+
+
+
+
+ Mute notifications
+
+
+
+
+
+
+ 1 Group in common
+
+
+
+
+
+ Coading Monk
+
+
+ Owl, Rabbit, You
+
+
+
+
+
+
+ }
+ onClick={() => {
+ setOpenBlock(true);
+ }}
+ >
+ Block
+
+ }
+ onClick={() => {
+ setOpenDelete(true);
+ }}
+ >
+ Delete
+
+
+
+
+ {openBlock && (
+
+ )}
+ {openDelete && (
+
+ )}
+
+ );
+};
+
+export default Contact;
diff --git a/src/components/Conversation/Footer.js b/src/components/Conversation/Footer.js
new file mode 100644
index 0000000..030aaf0
--- /dev/null
+++ b/src/components/Conversation/Footer.js
@@ -0,0 +1,161 @@
+import {
+ Box,
+ Stack,
+ IconButton,
+ TextField,
+ InputAdornment,
+ Fab,
+ Tooltip,
+} from '@mui/material';
+import { styled, useTheme } from '@mui/material/styles';
+import {
+ Image,
+ LinkSimple,
+ PaperPlaneTilt,
+ Smiley,
+ Sticker,
+ Camera,
+ File,
+ User,
+} from 'phosphor-react';
+import data from '@emoji-mart/data';
+import Picker from '@emoji-mart/react';
+import { useState } from 'react';
+
+const StyledInput = styled(TextField)(({ theme }) => ({
+ '& .MuiInputBase-input': {
+ paddingTop: '12px',
+ paddingBottom: '12px',
+ },
+}));
+
+const Actions = [
+ {
+ color: '#4da5fe',
+ icon: ,
+ y: 102,
+ title: 'Photo / Video',
+ },
+ { color: '#1b8cfe', icon: , y: 172, title: 'Stikers' },
+ { color: '#0172e4', icon: , y: 242, title: 'Camera' },
+ { color: '#013f7f', icon: , y: 312, title: 'File' },
+ { color: '#4da5fe', icon: , y: 382, title: 'contact' },
+];
+const ChatInput = ({ setOpenPicker }) => {
+ const [openActions, setOpenActions] = useState(false);
+ return (
+
+
+ {Actions.map((el) => (
+
+
+ {el.icon}
+
+
+ ))}
+
+
+ {
+ setOpenActions((prev) => !prev);
+ setOpenPicker(false);
+ }}
+ >
+
+
+
+
+ ),
+ endAdornment: (
+
+ {
+ setOpenPicker((prev) => !prev);
+ setOpenActions(false);
+ }}
+ >
+
+
+
+ ),
+ }}
+ />
+ );
+};
+
+const Footer = (props) => {
+ const theme = useTheme();
+ const [openPicker, setOpenPicker] = useState(false);
+ return (
+
+
+
+ {/* Chatinput */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Footer;
diff --git a/src/components/Conversation/Header.js b/src/components/Conversation/Header.js
new file mode 100644
index 0000000..6f1b29f
--- /dev/null
+++ b/src/components/Conversation/Header.js
@@ -0,0 +1,81 @@
+import { useTheme } from '@mui/material/styles';
+import React from 'react';
+import { faker } from '@faker-js/faker';
+import {
+ Avatar,
+ Box,
+ Stack,
+ Typography,
+ IconButton,
+ Divider,
+} from '@mui/material';
+import { CaretDown, MagnifyingGlass, Phone, VideoCamera } from 'phosphor-react';
+import StyledBadge from '../StyledBadge';
+import { ToggleSidebar, UpdateSidebarType } from '../../redux/slices/app';
+import { useDispatch } from 'react-redux';
+
+export const Header = () => {
+ const dispatch = useDispatch();
+ const theme = useTheme();
+ return (
+
+
+ {
+ dispatch(ToggleSidebar);
+ dispatch(UpdateSidebarType('CONTACT'));
+ }}
+ direction={'row'}
+ spacing={2}
+ >
+
+
+
+
+
+
+ {faker.name.fullName()}
+ Online
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/Conversation/Message.js b/src/components/Conversation/Message.js
new file mode 100644
index 0000000..de9b261
--- /dev/null
+++ b/src/components/Conversation/Message.js
@@ -0,0 +1,44 @@
+import { Box, Stack } from '@mui/material';
+import React from 'react';
+import { Chat_History } from '../../data/index';
+import {
+ Timeline,
+ TextMsg,
+ MediaMsg,
+ ReplyMsg,
+ LinkMsg,
+ DocMsg,
+} from './MsgType';
+
+const Message = ({ menu }) => {
+ return (
+
+
+ {Chat_History.map((el) => {
+ switch (el.type) {
+ case 'divider':
+ return ;
+ case 'msg':
+ switch (el.subtype) {
+ case 'img':
+ return ;
+ case 'doc':
+ return ;
+ case 'link':
+ return ;
+ case 'reply':
+ return ;
+ default:
+ return ;
+ }
+
+ default:
+ return <>>;
+ }
+ })}
+
+
+ );
+};
+
+export default Message;
diff --git a/src/components/Conversation/MsgType.js b/src/components/Conversation/MsgType.js
new file mode 100644
index 0000000..40ea4f7
--- /dev/null
+++ b/src/components/Conversation/MsgType.js
@@ -0,0 +1,299 @@
+import {
+ Divider,
+ Stack,
+ Typography,
+ Box,
+ Link,
+ IconButton,
+ Menu,
+ MenuItem,
+} from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { DotsThreeVertical, DownloadSimple, Image } from 'phosphor-react';
+import { Message_options } from '../../data/index';
+import { useState } from 'react';
+
+const DocMsg = ({ el, menu }) => {
+ const theme = useTheme();
+ return (
+
+
+
+
+
+ Abstract.jpg
+
+
+
+
+
+ {el.message}
+
+
+
+ {menu && }
+
+ );
+};
+
+const LinkMsg = ({ el, menu }) => {
+ const theme = useTheme();
+ return (
+
+
+
+
+
+
+ Creating Chat App
+
+ www.youtube.com
+
+
+
+ {el.message}
+
+
+
+
+ {menu && }
+
+ );
+};
+
+const ReplyMsg = ({ el, menu }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ {el.message}
+
+
+
+ {el.reply}
+
+
+
+ {menu && }
+
+ );
+};
+
+const MediaMsg = ({ el, menu }) => {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ {el.message}
+
+
+
+
+ {menu && }
+
+ );
+};
+
+const TextMsg = ({ el, menu }) => {
+ const theme = useTheme();
+ return (
+
+
+
+ {el.message}
+
+
+
+ {/* options button */}
+ {menu && }
+
+ );
+};
+
+const Timeline = ({ el }) => {
+ const theme = useTheme();
+ return (
+
+
+
+ {el.text}
+
+
+
+
+ );
+};
+
+const MessageOptions = () => {
+ const [anchorEl, setAnchorEl] = useState(null);
+ const open = Boolean(anchorEl);
+ const handleClick = (event) => {
+ setAnchorEl(event.currentTarget);
+ };
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+ return (
+ <>
+
+
+
+
+ >
+ );
+};
+
+export { Timeline, TextMsg, MediaMsg, ReplyMsg, LinkMsg, DocMsg };
diff --git a/src/components/Conversation/index.js b/src/components/Conversation/index.js
new file mode 100644
index 0000000..c1f1e9a
--- /dev/null
+++ b/src/components/Conversation/index.js
@@ -0,0 +1,37 @@
+import { Box, Stack } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+
+import { Header } from './Header';
+import Footer from './Footer';
+import Message from './Message';
+
+const Conversation = () => {
+ const theme = useTheme();
+ return (
+ <>
+
+ {/* Chat header */}
+
+ {/*Msg */}
+
+
+
+ {/* Chat Footer */}
+
+
+ >
+ );
+};
+
+export default Conversation;
diff --git a/src/components/Search/Search.js b/src/components/Search/Search.js
new file mode 100644
index 0000000..9c62231
--- /dev/null
+++ b/src/components/Search/Search.js
@@ -0,0 +1,12 @@
+import { alpha, styled } from '@mui/material';
+
+const Search = styled('div')(({ theme }) => ({
+ position: 'relative',
+ borderRadius: 20,
+ backgroundColor: alpha(theme.palette.background.default, 1),
+ marginRight: theme.spacing(2),
+ marginLeft: 0,
+ width: '100%',
+}));
+
+export default Search;
diff --git a/src/components/Search/SearchIconWrapper.js b/src/components/Search/SearchIconWrapper.js
new file mode 100644
index 0000000..788ea35
--- /dev/null
+++ b/src/components/Search/SearchIconWrapper.js
@@ -0,0 +1,13 @@
+import { styled } from '@mui/material';
+
+const SearchIconWrapper = styled('div')(({ theme }) => ({
+ padding: theme.spacing(0, 2),
+ height: '100%',
+ position: 'absolute',
+ pointerEvents: 'none',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+}));
+
+export default SearchIconWrapper;
diff --git a/src/components/Search/StyledInputBase.js b/src/components/Search/StyledInputBase.js
new file mode 100644
index 0000000..205ba29
--- /dev/null
+++ b/src/components/Search/StyledInputBase.js
@@ -0,0 +1,12 @@
+import { InputBase, styled } from '@mui/material';
+
+const StyledInputBase = styled(InputBase)(({ theme }) => ({
+ color: 'inherit',
+ '& .MuiInputBase-input': {
+ padding: theme.spacing(1, 1, 1, 0),
+ paddingLeft: `calc(1em + ${theme.spacing(4)})`,
+ width: '100%',
+ },
+}));
+
+export default StyledInputBase;
diff --git a/src/components/Search/index.js b/src/components/Search/index.js
new file mode 100644
index 0000000..fd0bb68
--- /dev/null
+++ b/src/components/Search/index.js
@@ -0,0 +1,5 @@
+import Search from './Search';
+import SearchIconWrapper from './SearchIconWrapper';
+import StyledInputBase from './StyledInputBase';
+
+export { Search, SearchIconWrapper, StyledInputBase };
diff --git a/src/components/SharedMessages.js b/src/components/SharedMessages.js
new file mode 100644
index 0000000..cf4ee17
--- /dev/null
+++ b/src/components/SharedMessages.js
@@ -0,0 +1,110 @@
+import {
+ Box,
+ Stack,
+ Typography,
+ IconButton,
+ Tabs,
+ Tab,
+ Grid,
+} from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import React from 'react';
+import { useDispatch } from 'react-redux';
+import { UpdateSidebarType } from '../redux/slices/app';
+import { CaretLeft } from 'phosphor-react';
+import { faker } from '@faker-js/faker';
+import { SHARED_DOCS, SHARED_LINKS } from '../data';
+import { DocMsg, LinkMsg } from './Conversation/MsgType';
+
+const SharedMessages = () => {
+ const theme = useTheme();
+ const dispatch = useDispatch();
+
+ const [value, setValue] = React.useState(0);
+
+ const handleChange = (event, newValue) => {
+ setValue(newValue);
+ };
+ return (
+
+
+ {/**header */}
+
+
+ {
+ dispatch(UpdateSidebarType('CONTACT'));
+ }}
+ >
+
+
+ Shared messages
+
+
+
+
+
+
+
+
+ {(() => {
+ switch (value) {
+ case 0:
+ return (
+
+ {[0, 1, 2, 3, 4, 5, 6].map((el) => {
+ return (
+
+
+
+ );
+ })}
+
+ );
+ case 1:
+ return SHARED_LINKS.map((el) => );
+ case 2:
+ return SHARED_DOCS.map((el) => );
+
+ default:
+ break;
+ }
+ })()}
+
+
+
+ );
+};
+
+export default SharedMessages;
diff --git a/src/components/StarredMessages.js b/src/components/StarredMessages.js
new file mode 100644
index 0000000..0b1c8e8
--- /dev/null
+++ b/src/components/StarredMessages.js
@@ -0,0 +1,62 @@
+import { Box, Stack, Typography, IconButton } from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import React from 'react';
+import { useDispatch } from 'react-redux';
+import { UpdateSidebarType } from '../redux/slices/app';
+import { CaretLeft } from 'phosphor-react';
+import Message from './Conversation/Message';
+
+const StarredMessages = () => {
+ const theme = useTheme();
+ const dispatch = useDispatch();
+
+ return (
+
+
+ {/**header */}
+
+
+ {
+ dispatch(UpdateSidebarType('CONTACT'));
+ }}
+ >
+
+
+ Starrted messages
+
+
+
+ {/**Body */}
+
+
+
+
+
+ );
+};
+
+export default StarredMessages;
diff --git a/src/components/StyledBadge.js b/src/components/StyledBadge.js
new file mode 100644
index 0000000..fb2e2ab
--- /dev/null
+++ b/src/components/StyledBadge.js
@@ -0,0 +1,33 @@
+import { styled } from '@mui/material/styles';
+import { Badge } from '@mui/material';
+
+const StyledBadge = styled(Badge)(({ theme }) => ({
+ '& .MuiBadge-badge': {
+ backgroundColor: '#44b700',
+ color: '#44b700',
+ boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
+ '&::after': {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ width: '100%',
+ height: '100%',
+ borderRadius: '50%',
+ animation: 'ripple 1.2s infinite ease-in-out',
+ border: '1px solid currentColor',
+ content: '""',
+ },
+ },
+ '@keyframes ripple': {
+ '0%': {
+ transform: 'scale(.8)',
+ opacity: 1,
+ },
+ '100%': {
+ transform: 'scale(2.4)',
+ opacity: 0,
+ },
+ },
+}));
+
+export default StyledBadge;
diff --git a/src/components/hook-form/FormProvider.js b/src/components/hook-form/FormProvider.js
new file mode 100644
index 0000000..32fc556
--- /dev/null
+++ b/src/components/hook-form/FormProvider.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import { FormProvider as Form } from 'react-hook-form';
+
+const FormProvider = ({ children, onSubmit, methods }) => {
+ return (
+
+
+ );
+};
+
+export default FormProvider;
diff --git a/src/components/hook-form/RHFAutoComplete.js b/src/components/hook-form/RHFAutoComplete.js
new file mode 100644
index 0000000..65bc892
--- /dev/null
+++ b/src/components/hook-form/RHFAutoComplete.js
@@ -0,0 +1,45 @@
+import { PropTypes } from 'prop-types';
+// form
+import { useFormContext, Controller } from 'react-hook-form';
+//@mui
+import { Autocomplete, TextField } from '@mui/material';
+
+RHFAutoComplete.propTypes = {
+ name: PropTypes.string,
+ label: PropTypes.string,
+ helperText: PropTypes.node,
+};
+
+export default function RHFAutoComplete({ name, label, helperText, ...other }) {
+ const { control, setValue } = useFormContext();
+ return (
+ (
+
+ setValue(name, newValue, { shouldValidate: true })
+ }
+ helperText={error ? error.message : helperText}
+ {...other}
+ renderInput={(params) => (
+
+ )}
+ />
+ )}
+ />
+ );
+}
diff --git a/src/components/hook-form/RHFCodes.js b/src/components/hook-form/RHFCodes.js
new file mode 100644
index 0000000..2009a9b
--- /dev/null
+++ b/src/components/hook-form/RHFCodes.js
@@ -0,0 +1,69 @@
+import { useRef } from 'react';
+// form
+import { useFormContext, Controller } from 'react-hook-form';
+// @mui
+import { Stack, TextField } from '@mui/material';
+
+export default function RHFCodes({ keyName = '', inputs = [], ...other }) {
+ const codesRef = useRef(null);
+
+ const { control } = useFormContext();
+
+ const handleChangeWithNextField = (event, handleChange) => {
+ const { maxLength, value, name } = event.target;
+
+ const fieldIndex = name.replace(keyName, '');
+
+ const fieldIntIndex = Number(fieldIndex);
+
+ const nextfield = document.querySelector(
+ `input[name=${keyName}${fieldIntIndex + 1}]`
+ );
+
+ if (value.length > maxLength) {
+ event.target.value = value[0];
+ }
+
+ if (value.length >= maxLength && fieldIntIndex < 6 && nextfield !== null) {
+ nextfield.focus();
+ }
+
+ handleChange(event);
+ };
+
+ return (
+
+ {inputs.map((name, index) => (
+ (
+ {
+ handleChangeWithNextField(event, field.onChange);
+ }}
+ onFocus={(event) => event.currentTarget.select()}
+ InputProps={{
+ sx: {
+ width: { xs: 36, sm: 56 },
+ height: { xs: 36, sm: 56 },
+ '& input': { p: 0, textAlign: 'center' },
+ },
+ }}
+ inputProps={{
+ maxLength: 1,
+ type: 'number',
+ }}
+ {...other}
+ />
+ )}
+ />
+ ))}
+
+ );
+}
diff --git a/src/components/hook-form/RHFTextField.js b/src/components/hook-form/RHFTextField.js
new file mode 100644
index 0000000..6c0cc60
--- /dev/null
+++ b/src/components/hook-form/RHFTextField.js
@@ -0,0 +1,36 @@
+import { PropTypes } from 'prop-types';
+// form
+import { useFormContext, Controller } from 'react-hook-form';
+//@mui
+import { TextField } from '@mui/material';
+
+RHFTextField.propTypes = {
+ name: PropTypes.string,
+ label: PropTypes.string,
+ helperText: PropTypes.node,
+};
+
+export default function RHFTextField({ name, label, helperText, ...other }) {
+ const { control } = useFormContext();
+ return (
+ (
+
+ )}
+ />
+ );
+}
diff --git a/src/components/hook-form/index.js b/src/components/hook-form/index.js
new file mode 100644
index 0000000..ce6dbad
--- /dev/null
+++ b/src/components/hook-form/index.js
@@ -0,0 +1,5 @@
+import FormProvider from './FormProvider';
+import RHFTextField from './RHFTextField';
+import RHFAutoComplete from './RHFAutoComplete';
+
+export { FormProvider, RHFTextField, RHFAutoComplete };
diff --git a/src/config.js b/src/config.js
index d943b6d..cb10681 100644
--- a/src/config.js
+++ b/src/config.js
@@ -2,14 +2,14 @@
import { enUS, frFR, zhCN, viVN, arSD } from '@mui/material/locale';
// routes
-import { PATH_DASHBOARD } from "./routes/paths";
+import { PATH_DASHBOARD } from './routes/paths';
export const defaultSettings = {
- themeMode: "light",
- themeDirection: "ltr",
- themeContrast: "default",
- themeLayout: "horizontal",
- themeColorPresets: "default",
+ themeMode: 'light',
+ themeDirection: 'ltr',
+ themeContrast: 'default',
+ themeLayout: 'horizontal',
+ themeColorPresets: 'default',
themeStretch: false,
};
@@ -58,7 +58,8 @@ export const allLangs = [
export const defaultLang = allLangs[0]; // English
+export const BASE_URL = 'http://localhost:3005';
-
+export const IS_AUTHENTICATED = false;
// DEFAULT ROOT PATH
export const DEFAULT_PATH = PATH_DASHBOARD.general.app; // as '/app'
diff --git a/src/contexts/SettingsContext.js b/src/contexts/SettingsContext.js
index b4b4cae..3d49ef0 100644
--- a/src/contexts/SettingsContext.js
+++ b/src/contexts/SettingsContext.js
@@ -1,11 +1,11 @@
// provider === component
-import { createContext, useEffect } from "react";
-import { defaultSettings } from "../config";
-import useLocalStorage from "../hooks/useLocalStorage";
+import { createContext, useEffect } from 'react';
+import { defaultSettings } from '../config';
+import useLocalStorage from '../hooks/useLocalStorage';
import getColorPresets, {
defaultPreset,
colorPresets,
-} from "../utils/getColorPresets";
+} from '../utils/getColorPresets';
const initialState = {
...defaultSettings,
@@ -14,6 +14,9 @@ const initialState = {
onToggleMode: () => {},
onChangeMode: () => {},
+ // onToggleMode and onChangeMode are functions related to toggling and changing the mode.
+ // They are initialized with empty arrow functions, which can later be replaced with actual logic.
+
// Direction
onToggleDirection: () => {},
onChangeDirection: () => {},
@@ -42,7 +45,7 @@ const initialState = {
const SettingsContext = createContext(initialState);
const SettingsProvider = ({ children }) => {
- const [settings, setSettings] = useLocalStorage("settings", {
+ const [settings, setSettings] = useLocalStorage('settings', {
themeMode: initialState.themeMode,
themeLayout: initialState.themeLayout,
themeStretch: initialState.themeStretch,
@@ -51,11 +54,11 @@ const SettingsProvider = ({ children }) => {
themeColorPresets: initialState.themeColorPresets,
});
- const isArabic = localStorage.getItem("i18nextLng") === "ar";
+ const isArabic = localStorage.getItem('i18nextLng') === 'ar';
useEffect(() => {
if (isArabic) {
- onChangeDirectionByLang("ar");
+ onChangeDirectionByLang('ar');
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isArabic]);
@@ -65,7 +68,7 @@ const SettingsProvider = ({ children }) => {
const onToggleMode = () => {
setSettings({
...settings,
- themeMode: settings.themeMode === "light" ? "dark" : "light",
+ themeMode: settings.themeMode === 'light' ? 'dark' : 'light',
});
};
@@ -81,7 +84,7 @@ const SettingsProvider = ({ children }) => {
const onToggleDirection = () => {
setSettings({
...settings,
- themeDirection: settings.themeDirection === "rtl" ? "ltr" : "rtl",
+ themeDirection: settings.themeDirection === 'rtl' ? 'ltr' : 'rtl',
});
};
@@ -95,7 +98,7 @@ const SettingsProvider = ({ children }) => {
const onChangeDirectionByLang = (lang) => {
setSettings({
...settings,
- themeDirection: lang === "ar" ? "rtl" : "ltr",
+ themeDirection: lang === 'ar' ? 'rtl' : 'ltr',
});
};
@@ -105,7 +108,7 @@ const SettingsProvider = ({ children }) => {
setSettings({
...settings,
themeLayout:
- settings.themeLayout === "vertical" ? "horizontal" : "vertical",
+ settings.themeLayout === 'vertical' ? 'horizontal' : 'vertical',
});
};
@@ -121,7 +124,7 @@ const SettingsProvider = ({ children }) => {
const onToggleContrast = () => {
setSettings({
...settings,
- themeContrast: settings.themeContrast === "default" ? "bold" : "default",
+ themeContrast: settings.themeContrast === 'default' ? 'bold' : 'default',
});
};
@@ -181,6 +184,7 @@ const SettingsProvider = ({ children }) => {
// Contrast
onChangeContrast,
+
onToggleContrast,
// Stretch
@@ -203,6 +207,18 @@ const SettingsProvider = ({ children }) => {
);
};
-export {SettingsContext};
+export { SettingsContext };
+
+export default SettingsProvider;
+
+/*
-export default SettingsProvider;
\ No newline at end of file
+ this code sets up a React context for managing application settings,
+ provides a provider component for this context, and defines functions
+ to update and persist these settings, including handling language
+ direction changes and color presets. Components that consume this
+ context can access the settings state and update functions to
+ control the application's appearance and behavior.
+
+
+ */
diff --git a/src/data/index.js b/src/data/index.js
index d15cba6..532559c 100644
--- a/src/data/index.js
+++ b/src/data/index.js
@@ -1,4 +1,4 @@
-import { faker } from "@faker-js/faker";
+import { faker } from '@faker-js/faker';
import {
ChatCircleDots,
Gear,
@@ -7,19 +7,19 @@ import {
SignOut,
User,
Users,
-} from "phosphor-react";
+} from 'phosphor-react';
const Profile_Menu = [
{
- title: "Profile",
+ title: 'Profile',
icon: ,
},
{
- title: "Settings",
+ title: 'Settings',
icon: ,
},
{
- title: "Profile",
+ title: 'Signout',
icon: ,
},
];
@@ -46,13 +46,75 @@ const Nav_Setting = [
},
];
+const CallLogs = [
+ {
+ id: 0,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: true,
+ incoming: true,
+ online: true,
+ pinned: true,
+ },
+ {
+ id: 1,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: true,
+ incoming: true,
+ online: true,
+ pinned: true,
+ },
+ {
+ id: 2,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: false,
+ incoming: false,
+ online: true,
+ pinned: true,
+ },
+ {
+ id: 3,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: true,
+ incoming: true,
+ online: false,
+ },
+ {
+ id: 4,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: false,
+ incoming: true,
+ online: false,
+ },
+ {
+ id: 5,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: false,
+ incoming: false,
+ online: true,
+ },
+ {
+ id: 6,
+ img: faker.image.avatar(),
+ name: faker.name.firstName(),
+ missed: false,
+ incoming: true,
+ online: false,
+ },
+];
+
const ChatList = [
{
id: 0,
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "9:36",
+ time: '9:36',
unread: 0,
pinned: true,
online: true,
@@ -62,7 +124,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "12:02",
+ time: '12:02',
unread: 2,
pinned: true,
online: false,
@@ -72,7 +134,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "10:35",
+ time: '10:35',
unread: 3,
pinned: false,
online: true,
@@ -82,7 +144,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "04:00",
+ time: '04:00',
unread: 0,
pinned: false,
online: true,
@@ -92,7 +154,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "08:42",
+ time: '08:42',
unread: 0,
pinned: false,
online: false,
@@ -102,7 +164,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "08:42",
+ time: '08:42',
unread: 0,
pinned: false,
online: false,
@@ -112,7 +174,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "08:42",
+ time: '08:42',
unread: 0,
pinned: false,
online: false,
@@ -122,7 +184,7 @@ const ChatList = [
img: faker.image.avatar(),
name: faker.name.firstName(),
msg: faker.music.songName(),
- time: "08:42",
+ time: '08:42',
unread: 0,
pinned: false,
online: false,
@@ -131,69 +193,69 @@ const ChatList = [
const Chat_History = [
{
- type: "msg",
- message: "Hi 👋🏻, How are ya ?",
+ type: 'msg',
+ message: 'Hi 👋🏻, How are ya ?',
incoming: true,
outgoing: false,
},
{
- type: "divider",
- text: "Today",
+ type: 'divider',
+ text: 'Today',
},
{
- type: "msg",
- message: "Hi 👋 Panda, not bad, u ?",
+ type: 'msg',
+ message: 'Hi 👋 Panda, not bad, u ?',
incoming: false,
outgoing: true,
},
{
- type: "msg",
- message: "Can you send me an abstarct image?",
+ type: 'msg',
+ message: 'Can you send me an abstarct image?',
incoming: false,
outgoing: true,
},
{
- type: "msg",
- message: "Ya sure, sending you a pic",
+ type: 'msg',
+ message: 'Ya sure, sending you a pic',
incoming: true,
outgoing: false,
},
{
- type: "msg",
- subtype: "img",
- message: "Here You Go",
+ type: 'msg',
+ subtype: 'img',
+ message: 'Here You Go',
img: faker.image.abstract(),
incoming: true,
outgoing: false,
},
{
- type: "msg",
- message: "Can you please send this in file format?",
+ type: 'msg',
+ message: 'Can you please send this in file format?',
incoming: false,
outgoing: true,
},
{
- type: "msg",
- subtype: "doc",
- message: "Yes sure, here you go.",
+ type: 'msg',
+ subtype: 'doc',
+ message: 'Yes sure, here you go.',
incoming: true,
outgoing: false,
},
{
- type: "msg",
- subtype: "link",
+ type: 'msg',
+ subtype: 'link',
preview: faker.image.cats(),
- message: "Yep, I can also do that",
+ message: 'Yep, I can also do that',
incoming: true,
outgoing: false,
},
{
- type: "msg",
- subtype: "reply",
- reply: "This is a reply",
- message: "Yep, I can also do that",
+ type: 'msg',
+ subtype: 'reply',
+ reply: 'This is a reply',
+ message: 'Yep, I can also do that',
incoming: false,
outgoing: true,
},
@@ -201,22 +263,85 @@ const Chat_History = [
const Message_options = [
{
- title: "Reply",
+ title: 'Reply',
+ },
+ {
+ title: 'React to message',
+ },
+ {
+ title: 'Forward message',
+ },
+ {
+ title: 'Star message',
},
{
- title: "React to message",
+ title: 'Report',
},
{
- title: "Forward message",
+ title: 'Delete Message',
},
+];
+
+const SHARED_LINKS = [
{
- title: "Star message",
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
},
{
- title: "Report",
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
},
{
- title: "Delete Message",
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
+ },
+ {
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
+ },
+];
+const SHARED_DOCS = [
+ {
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
+ },
+
+ {
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
+ },
+
+ {
+ type: 'msg',
+ subtype: 'link',
+ preview: faker.image.cats(),
+ message: 'Hi 👋🏻, How are ya ?',
+ incoming: true,
+ outgoing: false,
},
];
@@ -227,4 +352,7 @@ export {
ChatList,
Chat_History,
Message_options,
+ SHARED_DOCS,
+ SHARED_LINKS,
+ CallLogs,
};
diff --git a/src/hooks/useSettings.js b/src/hooks/useSettings.js
index 0acc455..43bb183 100644
--- a/src/hooks/useSettings.js
+++ b/src/hooks/useSettings.js
@@ -1,5 +1,5 @@
import { useContext } from 'react';
-import {SettingsContext} from '../contexts/SettingsContext';
+import { SettingsContext } from '../contexts/SettingsContext';
// ----------------------------------------------------------------------
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 0000000..ab2f9e9
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,29 @@
+/* Customize the scrollbar track */
+::-webkit-scrollbar {
+ width: 5px; /* Set the width of the scrollbar */
+}
+
+::-webkit-scrollbar:hover {
+ width: 5px; /* Set the width of the scrollbar */
+}
+
+/* Customize the scrollbar thumb */
+::-webkit-scrollbar-thumb:hover {
+ background-color: #555; /* Change the color of the thumb */
+ border-radius: 5px; /* Add rounded corners to the thumb */
+}
+
+/* Customize the scrollbar track on hover */
+::-webkit-scrollbar:hover {
+ width: 10px; /* Change the width on hover */
+}
+
+/* Customize the scrollbar thumb on hover */
+::-webkit-scrollbar-thumb:hover {
+ background-color: #777; /* Change the color on hover */
+}
+
+/* Customize the scrollbar corner (the intersection of the vertical and horizontal scrollbars) */
+::-webkit-scrollbar-corner {
+ background-color: #333; /* Change the color of the corner */
+}
diff --git a/src/index.js b/src/index.js
index 16d0099..8c8fcad 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,28 +1,30 @@
-import React from "react";
-import ReactDOM from "react-dom/client";
+import React from 'react';
+import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
-import { HelmetProvider } from "react-helmet-async";
-import App from "./App";
-import reportWebVitals from "./reportWebVitals";
+import { HelmetProvider } from 'react-helmet-async';
+import App from './App';
+import reportWebVitals from './reportWebVitals';
+import './index.css';
+import { store } from './redux/store';
+import { Provider as ReduxProvider } from 'react-redux';
// contexts
-import SettingsProvider from "./contexts/SettingsContext";
+import SettingsProvider from './contexts/SettingsContext';
-const root = ReactDOM.createRoot(document.getElementById("root"));
+const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
-
-
-
-
-
+
+
+
+
+
+
+
);
-// If you want to start measuring performance in your app, pass a function
-// to log results (for example: reportWebVitals(console.log))
-// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
diff --git a/src/layouts/dashboard/index.js b/src/layouts/dashboard/index.js
index ebbc00d..7693ad0 100644
--- a/src/layouts/dashboard/index.js
+++ b/src/layouts/dashboard/index.js
@@ -1,12 +1,25 @@
-import React from "react";
-import { Outlet } from "react-router-dom";
+import React from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+import { Box, Stack } from '@mui/material';
+
+import { Sidebar } from './sidebar';
+import { useSelector } from 'react-redux';
const DashboardLayout = () => {
+ const { isLoggedIn } = useSelector((state) => state.auth);
+ if (!isLoggedIn) {
+ return ;
+ }
return (
<>
- Dashboard Layout
-
+
+
+ {/* sidebar */}
+
+
+
+
>
);
};
diff --git a/src/layouts/dashboard/sidebar.js b/src/layouts/dashboard/sidebar.js
new file mode 100644
index 0000000..1f4d1bf
--- /dev/null
+++ b/src/layouts/dashboard/sidebar.js
@@ -0,0 +1,232 @@
+import React, { useState } from 'react';
+import {
+ Box,
+ Stack,
+ IconButton,
+ Divider,
+ Avatar,
+ Menu,
+ MenuItem,
+} from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import { Nav_Buttons, Profile_Menu } from '../../data';
+import useSettings from '../../hooks/useSettings';
+import AntSwitch from '../../components/AntSwitch';
+import { faker } from '@faker-js/faker';
+import talkLogo from '../../assets/Images/Talk-logo-transparent.png';
+
+import { Gear } from 'phosphor-react';
+import { useNavigate } from 'react-router-dom';
+import { LogoutUser } from '../../redux/slices/auth';
+import { useDispatch } from 'react-redux';
+
+const getRoutePath = (index) => {
+ switch (index) {
+ case 0:
+ return '/app';
+ case 1:
+ return '/group';
+ case 2:
+ return '/call';
+ case 3:
+ return '/settings';
+ default:
+ return '/app';
+ }
+};
+
+const getMenuPath = (index) => {
+ switch (index) {
+ case 0:
+ return '/profile';
+ case 1:
+ return '/settings';
+ case 2:
+ //TODO : update token, set isAuthenticated to false
+ return '/auth/login';
+ default:
+ return '/profile';
+ }
+};
+
+export const Sidebar = () => {
+ const dispatch = useDispatch();
+ const theme = useTheme();
+ const [selected, setSelected] = useState(0);
+ const { onToggleMode } = useSettings();
+ const navigate = useNavigate();
+
+ const [anchorEl, setAnchorEl] = useState(null);
+ const open = Boolean(anchorEl);
+ const handleClick = (event) => {
+ setAnchorEl(event.currentTarget);
+ };
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+
+ return (
+
+
+
+
+
+
+
+ {Nav_Buttons.map((el) =>
+ el.index === selected ? (
+
+
+ {el.icon}
+
+
+ ) : (
+ {
+ setSelected(el.index);
+ navigate(getRoutePath(el.index));
+ }}
+ sx={{
+ width: 'max-content',
+ color:
+ theme.palette.mode === 'light'
+ ? '#000'
+ : theme.palette.text.primary,
+ }}
+ key={el.index}
+ >
+ {el.icon}
+
+ )
+ )}
+
+
+
+ {selected === 3 ? (
+
+
+
+
+
+ ) : (
+ {
+ setSelected(3);
+ navigate(getRoutePath(3));
+ }}
+ sx={{
+ width: 'max-content',
+ color:
+ theme.palette.mode === 'light'
+ ? '#000'
+ : theme.palette.text.primary,
+ }}
+ >
+
+
+ )}
+
+
+
+ {
+ onToggleMode();
+ }}
+ defaultChecked
+ />
+
+
+
+
+
+ );
+};
diff --git a/src/layouts/main/index.js b/src/layouts/main/index.js
index 7627bde..1aa8ea6 100644
--- a/src/layouts/main/index.js
+++ b/src/layouts/main/index.js
@@ -1,14 +1,38 @@
-import React from "react";
-import { Outlet } from "react-router-dom";
+import { Container, Stack } from '@mui/material';
+import React from 'react';
+import { Navigate, Outlet } from 'react-router-dom';
+import talkLogo from '../../assets/Images/Talk-logo-transparent.png';
+import { useSelector } from 'react-redux';
const MainLayout = () => {
+ const { isLoggedIn } = useSelector((state) => state.auth);
+ if (isLoggedIn) {
+ return ;
+ }
+
return (
<>
- Main Layout
-
-
+
+
+
+
+
+
+ {/** content area */}
+
+
>
);
};
export default MainLayout;
+
+// main screen
diff --git a/src/pages/auth/Login.js b/src/pages/auth/Login.js
new file mode 100644
index 0000000..21946aa
--- /dev/null
+++ b/src/pages/auth/Login.js
@@ -0,0 +1,37 @@
+import { Link, Stack, Typography } from '@mui/material';
+import React from 'react';
+import { Link as RouterLink } from 'react-router-dom';
+import AuthSocial from '../../sections/auth/AuthSocial';
+import LoginForm from '../../sections/auth/LoginForm';
+
+const Login = () => {
+ return (
+
+ Login here
+
+
+ New user?
+
+ Create an account
+
+
+
+ {/**Login form */}
+
+
+ {/**auth social */}
+
+
+ );
+};
+
+export default Login;
diff --git a/src/pages/auth/NewPassword.js b/src/pages/auth/NewPassword.js
new file mode 100644
index 0000000..d6f2dbd
--- /dev/null
+++ b/src/pages/auth/NewPassword.js
@@ -0,0 +1,51 @@
+import { Link, Stack, Typography } from '@mui/material';
+import { Link as RouterLink } from 'react-router-dom';
+
+import React from 'react';
+import { CaretLeft } from 'phosphor-react';
+import NewPasswordForm from '../../sections/auth/NewPasswordForm';
+
+const NewPassword = () => {
+ return (
+ <>
+
+
+ Reset password
+
+
+ Please set your new password
+
+ {/**new password form */}
+
+
+
+
+
+ Return to sign in
+
+
+ >
+ );
+};
+
+export default NewPassword;
diff --git a/src/pages/auth/Register.js b/src/pages/auth/Register.js
new file mode 100644
index 0000000..31f9c8f
--- /dev/null
+++ b/src/pages/auth/Register.js
@@ -0,0 +1,57 @@
+import { Link, Stack, Typography } from '@mui/material';
+import { Link as RouterLink } from 'react-router-dom';
+import React from 'react';
+import RegisterForm from '../../sections/auth/RegisterForm';
+import AuthSocial from '../../sections/auth/AuthSocial';
+
+const Register = () => {
+ return (
+
+ Get started with DotTalk
+
+
+
+ Already have an account?
+ {/* route to another page using Link in mui */}
+
+ {' '}
+ Sign in
+
+
+
+ {/* registe form */}
+
+
+
+ {'By signing up, I agree to '}
+
+ Terms of Services
+
+ {' and '}
+
+ Privacy Policy
+
+
+
+
+ );
+};
+
+export default Register;
diff --git a/src/pages/auth/ResetPassword.js b/src/pages/auth/ResetPassword.js
new file mode 100644
index 0000000..aa46252
--- /dev/null
+++ b/src/pages/auth/ResetPassword.js
@@ -0,0 +1,51 @@
+import { Stack, Typography, Link } from '@mui/material';
+import { Link as RouterLink } from 'react-router-dom';
+import React from 'react';
+
+import { CaretLeft } from 'phosphor-react';
+import ResetPasswordForm from '../../sections/auth/RestPasswordForm';
+
+const ResetPassword = () => {
+ return (
+ <>
+
+
+ Forgot your password
+
+
+
+ Please enter the email address associated with your account and We
+ will email you a link to reset your password.
+
+ {/** reset password form */}
+
+
+
+ Return to sign in
+
+
+ >
+ );
+};
+
+export default ResetPassword;
diff --git a/src/pages/auth/Verify.js b/src/pages/auth/Verify.js
new file mode 100644
index 0000000..51a894d
--- /dev/null
+++ b/src/pages/auth/Verify.js
@@ -0,0 +1,45 @@
+import { Stack, Typography } from '@mui/material';
+import { CheckCircle } from 'phosphor-react';
+import React from 'react';
+import VerifyForm from '../../sections/auth/VerifyForm';
+import { useSelector } from 'react-redux';
+
+const Verify = () => {
+ const { email } = useSelector((state) => state.auth);
+ return (
+ <>
+
+
+ Please verify OTP
+
+
+
+
+
+ Email sent to {email}
+
+
+
+ {/* verify form here */}
+
+
+ >
+ );
+};
+
+export default Verify;
diff --git a/src/pages/dashboard/Call.js b/src/pages/dashboard/Call.js
new file mode 100644
index 0000000..50b3b9a
--- /dev/null
+++ b/src/pages/dashboard/Call.js
@@ -0,0 +1,119 @@
+import React, { useState } from 'react';
+import {
+ Search,
+ SearchIconWrapper,
+ StyledInputBase,
+} from '../../components/Search';
+import { MagnifyingGlass, Plus } from 'phosphor-react';
+import { Link } from 'react-router-dom';
+import { CallLogs, ChatList } from '../../data';
+import { SimpleBarStyle } from '../../components/Scrollbar';
+import ChatElement from '../../components/ChatElement';
+import CreateGroup from '../../sections/main/CreateGroup';
+import {
+ Box,
+ Divider,
+ IconButton,
+ Stack,
+ Typography,
+ useTheme,
+} from '@mui/material';
+import { CallElement, CallLogElement } from '../../components/CallElement';
+import StartCall from '../../sections/main/StartCall';
+
+const Call = () => {
+ const [openDialog, setOpenDialog] = useState(false);
+ const theme = useTheme();
+
+ const handleCloseDialog = () => {
+ setOpenDialog(false);
+ };
+ return (
+ <>
+
+ {/* left */}
+
+ theme.palette.mode === 'light'
+ ? '#F8FAFF'
+ : theme.palette.background,
+ width: 320,
+ boxShadow: '0px 0px 2px rgba(0, 0, 0, 0.25)',
+ }}
+ >
+
+
+ Call Logs
+
+
+
+
+
+
+
+
+
+
+
+
+ Start new call
+
+ setOpenDialog(true)}>
+
+
+
+
+
+
+
+
+ All Calls
+
+ {/* call logs */}
+
+ {CallLogs.map((el) => {
+ return ;
+ })}
+
+
+
+
+
+
+ {/* right */}
+ {/* TODO reuse Chat Component */}
+
+ {openDialog && (
+
+ )}
+ >
+ );
+};
+
+export default Call;
diff --git a/src/pages/dashboard/Chats.js b/src/pages/dashboard/Chats.js
new file mode 100644
index 0000000..eeab1ec
--- /dev/null
+++ b/src/pages/dashboard/Chats.js
@@ -0,0 +1,98 @@
+import {
+ Box,
+ IconButton,
+ Stack,
+ Typography,
+ Button,
+ Divider,
+} from '@mui/material';
+import { ArchiveBox, CircleDashed, MagnifyingGlass } from 'phosphor-react';
+import React from 'react';
+import { useTheme } from '@mui/material/styles';
+import { ChatList } from '../../data/index';
+import { SimpleBarStyle } from '../../components/Scrollbar';
+import {
+ Search,
+ SearchIconWrapper,
+ StyledInputBase,
+} from '../../components/Search';
+import ChatElement from '../../components/ChatElement';
+
+export const Chats = () => {
+ const theme = useTheme();
+ return (
+
+
+
+
+ Chats
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pinned
+
+
+ {ChatList.filter((el) => el.pinned).map((el) => {
+ return ;
+ })}
+
+
+
+
+ All chats
+
+
+ {ChatList.filter((el) => !el.pinned).map((el) => {
+ return ;
+ })}
+
+
+
+
+
+ );
+};
diff --git a/src/pages/dashboard/GeneralApp.js b/src/pages/dashboard/GeneralApp.js
index 6685f1c..28a5f5b 100644
--- a/src/pages/dashboard/GeneralApp.js
+++ b/src/pages/dashboard/GeneralApp.js
@@ -1,11 +1,52 @@
-import React from "react";
+import React from 'react';
+import { Chats } from './Chats';
+import { Box, Stack } from '@mui/material';
+import Conversation from '../../components/Conversation';
+import { useTheme } from '@mui/material/styles';
+import Contact from '../../components/Contact';
+import { useSelector } from 'react-redux';
+import SharedMessages from '../../components/SharedMessages';
+import StarredMessages from '../../components/StarredMessages';
const GeneralApp = () => {
+ const theme = useTheme();
+ const { sidebar } = useSelector((store) => store.app);
return (
- <>
- App
- >
+
+ {/*Chats boxes*/}
+
+ {/* conversations */}
+
+
+
+
+ {/* conversations */}
+ {sidebar.open &&
+ (() => {
+ switch (sidebar.type) {
+ case 'CONTACT':
+ return ;
+
+ case 'SHARED':
+ return ;
+
+ case 'STARRED':
+ return ;
+ default:
+ break;
+ }
+ })()}
+
);
};
diff --git a/src/pages/dashboard/Group.js b/src/pages/dashboard/Group.js
new file mode 100644
index 0000000..19ecc10
--- /dev/null
+++ b/src/pages/dashboard/Group.js
@@ -0,0 +1,127 @@
+import React, { useState } from 'react';
+import {
+ Box,
+ Divider,
+ IconButton,
+ Stack,
+ Typography,
+ useTheme,
+} from '@mui/material';
+import {
+ Search,
+ SearchIconWrapper,
+ StyledInputBase,
+} from '../../components/Search';
+import { MagnifyingGlass, Plus } from 'phosphor-react';
+import { Link } from 'react-router-dom';
+import { ChatList } from '../../data';
+import { SimpleBarStyle } from '../../components/Scrollbar';
+import ChatElement from '../../components/ChatElement';
+import CreateGroup from '../../sections/main/CreateGroup';
+
+const Group = () => {
+ const [openDialog, setOpenDialog] = useState(false);
+ const theme = useTheme();
+
+ const handleCloseDialog = () => {
+ setOpenDialog(false);
+ };
+
+ return (
+ <>
+
+ {/* left */}
+
+ theme.palette.mode === 'light'
+ ? '#F8FAFF'
+ : theme.palette.background,
+ width: 320,
+ boxShadow: '0px 0px 2px rgba(0, 0, 0, 0.25)',
+ }}
+ >
+
+
+ Groups
+
+
+
+
+
+
+
+
+
+
+
+
+ Create new group
+
+ setOpenDialog(true)}>
+
+
+
+
+
+
+
+
+ Pinned
+
+
+ {ChatList.filter((el) => el.pinned).map((el) => {
+ return ;
+ })}
+
+
+
+
+ All chats
+
+
+ {ChatList.filter((el) => !el.pinned).map((el) => {
+ return ;
+ })}
+
+
+
+
+
+
+ {/* right */}
+ {/* TODO reuse Chat Component */}
+
+ {openDialog && (
+
+ )}
+ >
+ );
+};
+
+export default Group;
diff --git a/src/pages/dashboard/Profile.js b/src/pages/dashboard/Profile.js
new file mode 100644
index 0000000..535fcd1
--- /dev/null
+++ b/src/pages/dashboard/Profile.js
@@ -0,0 +1,37 @@
+import { Box, IconButton, Stack, Typography } from '@mui/material';
+import { CaretLeft } from 'phosphor-react';
+import React from 'react';
+import ProfileForm from '../../sections/settings/ProfileForm';
+
+const Profile = () => {
+ return (
+ <>
+
+ {/* left */}
+
+ theme.palette.mode === 'light'
+ ? '#F8FAFF'
+ : theme.palette.background,
+ width: 320,
+ boxShadow: '0px 0px 2px rgba(0, 0, 0, 0.25)',
+ }}
+ >
+
+
+
+
+
+ Profile
+
+
+
+
+
+ >
+ );
+};
+
+export default Profile;
diff --git a/src/pages/dashboard/Settings.js b/src/pages/dashboard/Settings.js
new file mode 100644
index 0000000..56479b3
--- /dev/null
+++ b/src/pages/dashboard/Settings.js
@@ -0,0 +1,163 @@
+import { faker } from '@faker-js/faker';
+import {
+ Avatar,
+ Box,
+ Divider,
+ IconButton,
+ Stack,
+ Typography,
+} from '@mui/material';
+import { useTheme } from '@mui/material/styles';
+import {
+ Bell,
+ CaretLeft,
+ Image,
+ Info,
+ Key,
+ Keyboard,
+ Lock,
+ Note,
+ PencilCircle,
+} from 'phosphor-react';
+
+import React, { useState } from 'react';
+import Shortcuts from '../../sections/settings/Shortcuts';
+
+const Settings = () => {
+ const theme = useTheme();
+
+ const [openShortcut, setOpenShortcut] = useState(false);
+
+ const handleOpenShortcuts = () => {
+ setOpenShortcut(true);
+ };
+
+ const handleCloseShortcuts = () => {
+ setOpenShortcut(false);
+ };
+
+ const list = [
+ {
+ key: 0,
+ icon: ,
+ title: 'Notifications',
+ onClick: () => {},
+ },
+ {
+ key: 1,
+ icon: ,
+ title: 'Privacy',
+ onClick: () => {},
+ },
+ {
+ key: 2,
+ icon: ,
+ title: 'Security',
+ onClick: () => {},
+ },
+ {
+ key: 3,
+ icon: ,
+ title: 'Theme',
+ //onClick: handleOpenTheme,
+ onClick: () => {},
+ },
+ {
+ key: 4,
+ icon: ,
+ title: 'Notifications',
+ onClick: () => {},
+ },
+ {
+ key: 5,
+ icon: ,
+ title: 'Request Account Info',
+ onClick: () => {},
+ },
+ {
+ key: 6,
+ icon: ,
+ title: 'Keyboard Shortcuts',
+ onClick: handleOpenShortcuts,
+ },
+ {
+ key: 7,
+ icon: ,
+ title: 'Help',
+ onClick: () => {},
+ },
+ ];
+
+ return (
+ <>
+
+ {/**left panel */}
+
+
+ {/**Header */}
+
+
+
+
+ Settings
+
+ {/**profile */}
+
+
+
+
+
+
+ {faker.name.fullName()}
+
+ {faker.random.words()}
+
+
+
+ {/**List of settings */}
+
+
+ {list.map(({ key, icon, title, onClick }) => (
+ <>
+
+
+ {icon}
+ {title}
+
+ {key !== 7 && }
+
+ >
+ ))}
+
+
+
+ {/**right panel */}
+
+ {openShortcut && (
+
+ )}
+ >
+ );
+};
+
+export default Settings;
diff --git a/src/redux/rootReducer.js b/src/redux/rootReducer.js
new file mode 100644
index 0000000..647f587
--- /dev/null
+++ b/src/redux/rootReducer.js
@@ -0,0 +1,24 @@
+// going to take all of the slices thst we creating and combining all the reducers
+import { combineReducers } from 'redux';
+import storage from 'redux-persist/lib/storage';
+import appReducer from './slices/app';
+import authReducer from './slices/auth';
+
+// slices
+
+// define some root configurations showing data in our redux store
+
+const rootPersistConfig = {
+ key: 'root',
+ storage,
+ keyPrefix: 'redux-',
+
+ // whitelist :[], // we can define the all of the states if you want to perisists
+ // blacklist :[] // we can define the name of the reducer that we dont want to persists
+};
+
+const rootReducer = combineReducers({
+ app: appReducer,
+ auth: authReducer,
+});
+export { rootPersistConfig, rootReducer };
diff --git a/src/redux/slices/app.js b/src/redux/slices/app.js
new file mode 100644
index 0000000..b5dec6f
--- /dev/null
+++ b/src/redux/slices/app.js
@@ -0,0 +1,58 @@
+import { createSlice } from '@reduxjs/toolkit';
+
+// need dispatch here to dispatch action here
+// import { dispatch } from '../store';
+
+const initialState = {
+ sidebar: {
+ open: false,
+ type: 'CONTACT', // can be contact, stated,shared
+ },
+};
+
+const slice = createSlice({
+ name: 'app',
+ initialState,
+ reducers: {
+ // update states using reducers
+ // toggle sidebar
+ toggleSidebar(state, action) {
+ state.sidebar.open = !state.sidebar.open;
+ }, // state is now state, action contains payload and action type
+ updateSidebarType(state, action) {
+ state.sidebar.type = action.payload.type;
+ },
+ },
+});
+
+// reducer
+export default slice.reducer;
+
+// thunk functions
+
+export function ToggleSidebar() {
+ return async (dispatch, getState) => {
+ dispatch(slice.actions.toggleSidebar());
+ };
+ // try {
+ // // Perform asynchronous operations here
+ // // For example, you can make an API call using axios or fetch
+ // // const response = await fetch('your-api-endpoint');
+ // // const data = await response.json();
+ // // After the async operation is complete, dispatch the action
+ // dispatch(slice.actions.toggleSidebar());
+ // } catch (error) {
+ // // Handle any errors here
+ // console.error('An error occurred:', error);
+ // }
+}
+
+export function UpdateSidebarType(type) {
+ return async (dispatch, getState) => {
+ dispatch(
+ slice.actions.updateSidebarType({
+ type,
+ })
+ );
+ };
+}
diff --git a/src/redux/slices/auth.js b/src/redux/slices/auth.js
new file mode 100644
index 0000000..8935def
--- /dev/null
+++ b/src/redux/slices/auth.js
@@ -0,0 +1,191 @@
+import { createSlice } from '@reduxjs/toolkit';
+import axiosInstance from '../../utils/axios';
+
+const initialState = {
+ isLoggedIn: false,
+ token: '',
+ isLoading: false,
+ email: '',
+ error: false,
+};
+
+const authSlice = createSlice({
+ name: 'auth',
+ initialState,
+ reducers: {
+ updateIsLoading(state, action) {
+ state.error = action.payload.error;
+ state.isLoading = action.payload.isLoading;
+ },
+ login(state, action) {
+ state.isLoggedIn = action.payload.isLoggedIn;
+ state.token = action.payload.token;
+ },
+ logout(state) {
+ state.isLoggedIn = false;
+ state.token = '';
+ },
+ setLoading(state, action) {
+ state.isLoading = action.payload;
+ },
+ updateRegisterEmail(state, action) {
+ state.email = action.payload.email;
+ },
+ },
+});
+
+// export reducer
+export default authSlice.reducer;
+
+// thunk actions
+
+// login thunk
+export function LoginUser(formValues) {
+ // thunk function has to return another function here
+ // it will be asunc because we are making an API call inside of it
+
+ return async (dispatch, getState) => {
+ axiosInstance
+ .post(
+ '/auth/login',
+ { ...formValues },
+ { headers: { 'Content-Type': 'application/json' } }
+ )
+ .then(function (response) {
+ // handle success
+ console.log(response);
+ dispatch(
+ authSlice.actions.login({
+ isLoggedIn: true,
+ token: response.data.token,
+ })
+ );
+ })
+ .catch(function (error) {
+ // handle error
+ console.log(error);
+ });
+ };
+}
+
+export function LogoutUser() {
+ return async (dispatch, getState) => {
+ // window.localStorage.removeItem('user_id');
+ dispatch(authSlice.actions.logout());
+ };
+}
+
+export function ForgotPassword(formValues) {
+ return async (dispatch, getState) => {
+ axiosInstance
+ .post(
+ '/auth/forgot-password',
+ { ...formValues },
+ { headers: { 'Content-Type': 'application/json' } }
+ )
+ .then(function (response) {
+ console.log(response);
+ })
+ .catch((error) => {
+ console.log(error);
+ });
+ };
+}
+
+export function ResetPassword(formValues) {
+ return async (dispatch, getState) => {
+ axiosInstance
+ .post(
+ '/auth/reset-password',
+ { ...formValues },
+ { headers: { 'Content-Type': 'application/json' } }
+ )
+ .then(function (response) {
+ console.log(response);
+ dispatch(
+ authSlice.actions.login({
+ isLoggedIn: true,
+ token: response.data.token,
+ })
+ );
+ })
+ .catch((error) => {
+ console.log(error);
+ });
+ };
+}
+
+export function RegisterUser(formValues) {
+ return async (dispatch, getState) => {
+ dispatch(
+ authSlice.actions.updateIsLoading({ isLoading: true, error: false })
+ );
+
+ axiosInstance
+ .post(
+ '/auth/register',
+ { ...formValues },
+ { headers: { 'Content-Type': 'application/json' } }
+ )
+ .then(function (response) {
+ console.log(response);
+ dispatch(
+ authSlice.actions.updateRegisterEmail({ email: formValues.email })
+ );
+
+ dispatch(
+ authSlice.actions.updateIsLoading({ isLoading: false, error: false })
+ );
+ })
+ .catch((error) => {
+ console.log(error);
+ dispatch(
+ authSlice.actions.updateIsLoading({ error: true, isLoading: false })
+ );
+ })
+ .finally(() => {
+ // if there is error user should not be redirected
+ if (!getState().auth.error) {
+ window.location.href = '/auth/verify';
+ }
+ });
+ };
+}
+
+export function VerifyEmail(formValues) {
+ return async (dispatch, getState) => {
+ dispatch(
+ authSlice.actions.updateIsLoading({ isLoading: true, error: false })
+ );
+
+ axiosInstance
+ .post(
+ '/auth/verify',
+ { ...formValues },
+ { headers: { 'Content-Type': 'application/json' } }
+ )
+ .then(function (response) {
+ console.log(response);
+
+ dispatch(authSlice.actions.updateRegisterEmail({ email: '' }));
+ window.localStorage.setItem('user_id', response.data.user_id);
+ dispatch(
+ authSlice.actions.login({
+ isLoggedIn: true,
+ token: response.data.token,
+ })
+ );
+
+ dispatch(
+ authSlice.actions.updateIsLoading({ isLoading: false, error: false })
+ );
+ })
+ .catch((error) => {
+ console.log(error);
+
+ dispatch(
+ authSlice.actions.updateIsLoading({ error: true, isLoading: false })
+ );
+ });
+ };
+}
diff --git a/src/redux/store.js b/src/redux/store.js
new file mode 100644
index 0000000..c22b42c
--- /dev/null
+++ b/src/redux/store.js
@@ -0,0 +1,28 @@
+// make our code cleaner and easy to understand
+import { configureStore } from '@reduxjs/toolkit'; // Note the corrected import path
+import {
+ useDispatch as useAppDispatch,
+ useSelector as useAppSelector,
+} from 'react-redux'; // manage the state of the app
+import { persistStore, persistReducer } from 'redux-persist'; // data is not loss after tab close on browser
+import { rootPersistConfig, rootReducer } from './rootReducer';
+
+const store = configureStore({
+ reducer: persistReducer(rootPersistConfig, rootReducer), // get configs from user
+ middleware: (getDefaultMiddleware) =>
+ getDefaultMiddleware({
+ serializableCheck: false,
+ immutableCheck: false,
+ }), //writing and reading
+});
+
+const persistor = persistStore(store); // we pass our orginal store to this and this will give us modified store
+
+const { dispatch } = store;
+
+console.log('store', store);
+
+const useSelector = useAppSelector;
+const useDispatch = () => useAppDispatch();
+
+export { store, persistor, dispatch, useSelector, useDispatch };
diff --git a/src/routes/index.js b/src/routes/index.js
index f0cb544..56078c8 100644
--- a/src/routes/index.js
+++ b/src/routes/index.js
@@ -1,12 +1,13 @@
-import { Suspense, lazy } from "react";
-import { Navigate, useRoutes } from "react-router-dom";
+import { Suspense, lazy } from 'react';
+import { Navigate, useRoutes } from 'react-router-dom';
// layouts
-import DashboardLayout from "../layouts/dashboard";
+import DashboardLayout from '../layouts/dashboard';
+import MainLayout from '../layouts/main/index';
// config
-import { DEFAULT_PATH } from "../config";
-import LoadingScreen from "../components/LoadingScreen";
+import { DEFAULT_PATH } from '../config';
+import LoadingScreen from '../components/LoadingScreen';
const Loadable = (Component) => (props) => {
return (
@@ -19,21 +20,53 @@ const Loadable = (Component) => (props) => {
export default function Router() {
return useRoutes([
{
- path: "/",
+ path: '/auth',
+ element: ,
+ children: [
+ { element: , path: 'login' },
+ { element: , path: 'register' },
+ { element: , path: 'reset-password' },
+ { element: , path: 'new-password' },
+ { element: , path: 'verify' },
+ ],
+ },
+ {
+ path: '/',
element: ,
children: [
{ element: , index: true },
- { path: "app", element: },
-
- { path: "404", element: },
- { path: "*", element: },
+ { path: 'app', element: },
+ { path: 'group', element: },
+ { path: 'call', element: },
+ { path: 'settings', element: },
+ { path: 'profile', element: },
+
+ { path: '404', element: },
+ { path: '*', element: },
],
},
- { path: "*", element: },
+ { path: '*', element: },
]);
}
const GeneralApp = Loadable(
- lazy(() => import("../pages/dashboard/GeneralApp")),
+ lazy(() => import('../pages/dashboard/GeneralApp'))
);
-const Page404 = Loadable(lazy(() => import("../pages/Page404")));
+
+// lazy loding
+const LoginPage = Loadable(lazy(() => import('../pages/auth/Login')));
+const RegisterPage = Loadable(lazy(() => import('../pages/auth/Register')));
+const NewPasswordPage = Loadable(
+ lazy(() => import('../pages/auth/NewPassword'))
+);
+
+const ResetPasswordPage = Loadable(
+ lazy(() => import('../pages/auth/ResetPassword'))
+);
+
+const Settings = Loadable(lazy(() => import('../pages/dashboard/Settings')));
+const Page404 = Loadable(lazy(() => import('../pages/Page404')));
+const GroupPage = Loadable(lazy(() => import('../pages/dashboard/Group')));
+const CallPage = Loadable(lazy(() => import('../pages/dashboard/Call')));
+const ProfilePage = Loadable(lazy(() => import('../pages/dashboard/Profile')));
+const VerifyPage = Loadable(lazy(() => import('../pages/auth/Verify')));
diff --git a/src/sections/auth/AuthSocial.js b/src/sections/auth/AuthSocial.js
new file mode 100644
index 0000000..59c0436
--- /dev/null
+++ b/src/sections/auth/AuthSocial.js
@@ -0,0 +1,38 @@
+import { Divider, IconButton, Stack } from '@mui/material';
+import { GithubLogo, GoogleLogo, TwitterLogo } from 'phosphor-react';
+import React from 'react';
+
+const AuthSocial = () => {
+ return (
+
+
+ Or
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default AuthSocial;
+
+// social logins in login form
diff --git a/src/sections/auth/LoginForm.js b/src/sections/auth/LoginForm.js
new file mode 100644
index 0000000..55e6f11
--- /dev/null
+++ b/src/sections/auth/LoginForm.js
@@ -0,0 +1,130 @@
+import React, { useState } from 'react';
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+import FormProvider from '../../components/hook-form/FormProvider';
+import {
+ Alert,
+ Button,
+ IconButton,
+ InputAdornment,
+ Link,
+ Stack,
+} from '@mui/material';
+import { RHFTextField } from '../../components/hook-form';
+import { Eye, EyeSlash } from 'phosphor-react';
+import { Link as RouterLink } from 'react-router-dom';
+import { useDispatch } from 'react-redux';
+import { LoginUser } from '../../redux/slices/auth';
+
+const LoginForm = () => {
+ const dispatch = useDispatch();
+ const [showPassword, setShowPassword] = useState(false);
+ // use Yup - famouse validator
+ const LoginSchema = Yup.object().shape({
+ email: Yup.string()
+ .required('Email is required')
+ .email('Email must be a valid email'),
+ password: Yup.string().required('Password is required'),
+ });
+
+ const defaultValues = {
+ email: 'kavindamadhuranga74.2@gmail.com',
+ password: '1234',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(LoginSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ setError,
+ handleSubmit,
+ formState: { errors, isSubmitting, isSubmitSuccessful },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ // submit data to backend
+ dispatch(LoginUser(data));
+ } catch (error) {
+ console.log('error', error);
+ reset();
+ setError('afterSubmit', {
+ ...error,
+ message: error.message,
+ });
+ }
+ };
+
+ return (
+
+
+ {!!errors.afterSubmit && (
+ {errors.afterSubmit.message}
+ )}
+
+
+ {
+ setShowPassword(!showPassword);
+ }}
+ >
+ {showPassword ? : }
+
+ ),
+ }}
+ />
+
+
+
+
+ theme.palette.mode === 'light' ? '#454545' : 'grey.800',
+ },
+ }}
+ >
+ Forgot password?
+
+
+
+
+ );
+};
+
+export default LoginForm;
diff --git a/src/sections/auth/NewPasswordForm.js b/src/sections/auth/NewPasswordForm.js
new file mode 100644
index 0000000..6c665b9
--- /dev/null
+++ b/src/sections/auth/NewPasswordForm.js
@@ -0,0 +1,132 @@
+import React, { useState } from 'react';
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+import FormProvider from '../../components/hook-form/FormProvider';
+import {
+ Alert,
+ Button,
+ IconButton,
+ InputAdornment,
+ Stack,
+} from '@mui/material';
+import { RHFTextField } from '../../components/hook-form';
+import { Eye, EyeSlash } from 'phosphor-react';
+import { useDispatch } from 'react-redux';
+import { ResetPassword } from '../../redux/slices/auth';
+import { useSearchParams } from 'react-router-dom';
+
+const NewPasswordForm = () => {
+ const [queryParams] = useSearchParams();
+ const dispatch = useDispatch();
+ const [showPassword, setShowPassword] = useState(false);
+
+ // use Yup - famouse validator
+ // password simmilerity check logic with yup
+ const NewPasswordSchema = Yup.object().shape({
+ password: Yup.string()
+ .min(6, 'Password must be at least 6 characters')
+ .required('Password is required'),
+ passwordConfirm: Yup.string()
+ .required('Password is required')
+ .oneOf([Yup.ref('password'), ''], 'Password must match'),
+ });
+
+ const defaultValues = {
+ password: '',
+ passwordConfirm: '',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(NewPasswordSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ setError,
+ handleSubmit,
+ formState: { errors, isSubmitting, isSubmitSuccessful },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ // submit data to backend
+ dispatch(ResetPassword({ ...data, token: queryParams.get('token') }));
+ } catch (error) {
+ console.log('error', error);
+ reset();
+ setError('afterSubmit', {
+ ...error,
+ message: error.message,
+ });
+ }
+ };
+
+ return (
+
+
+ {!!errors.afterSubmit && (
+ {errors.afterSubmit.message}
+ )}
+
+ {
+ setShowPassword(!showPassword);
+ }}
+ >
+ {showPassword ? : }
+
+ ),
+ }}
+ />
+ {
+ setShowPassword(!showPassword);
+ }}
+ >
+ {showPassword ? : }
+
+ ),
+ }}
+ />
+
+
+
+ );
+};
+
+export default NewPasswordForm;
diff --git a/src/sections/auth/RegisterForm.js b/src/sections/auth/RegisterForm.js
new file mode 100644
index 0000000..72bb438
--- /dev/null
+++ b/src/sections/auth/RegisterForm.js
@@ -0,0 +1,120 @@
+import { yupResolver } from '@hookform/resolvers/yup';
+import React, { useState } from 'react';
+import { useForm } from 'react-hook-form';
+import * as Yup from 'yup';
+import FormProvider from '../../components/hook-form/FormProvider';
+import {
+ Alert,
+ Button,
+ IconButton,
+ InputAdornment,
+ Stack,
+} from '@mui/material';
+import { RHFTextField } from '../../components/hook-form';
+import { Eye, EyeSlash } from 'phosphor-react';
+import { useDispatch } from 'react-redux';
+import { RegisterUser } from '../../redux/slices/auth';
+
+const RegisterForm = () => {
+ const [showPassword, setShowPassword] = useState(false);
+ const dispatch = useDispatch();
+
+ // use Yup - famouse validator
+ const RegisterSchema = Yup.object().shape({
+ firstName: Yup.string().required('First name is required'),
+ lastName: Yup.string().required('Last name is required'),
+ email: Yup.string()
+ .required('Email is required')
+ .email('Email must be a valid email'),
+ password: Yup.string().required('Password is required'),
+ });
+
+ const defaultValues = {
+ firstName: '',
+ lastName: '',
+ email: 'demo@talk.com',
+ password: 'demo1234',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(RegisterSchema),
+ defaultValues,
+ });
+
+ // on submit functions
+ const {
+ reset,
+ setError,
+ handleSubmit,
+ formState: { errors, isSubmitting, isSubmitSuccessful },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ // submit data to backend
+ dispatch(RegisterUser(data));
+ } catch (error) {
+ console.log('error', error);
+ reset();
+ setError('afterSubmit', {
+ ...error,
+ message: error.message,
+ });
+ }
+ };
+
+ return (
+
+
+ {!!errors.afterSubmit && (
+ {errors.afterSubmit.message}
+ )}
+
+
+
+
+
+ {
+ setShowPassword(!showPassword);
+ }}
+ >
+ {showPassword ? : }
+
+ ),
+ }}
+ />
+
+
+
+ );
+};
+
+export default RegisterForm;
diff --git a/src/sections/auth/RestPasswordForm.js b/src/sections/auth/RestPasswordForm.js
new file mode 100644
index 0000000..9fc9f7f
--- /dev/null
+++ b/src/sections/auth/RestPasswordForm.js
@@ -0,0 +1,86 @@
+import React from 'react';
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+import FormProvider from '../../components/hook-form/FormProvider';
+import { Alert, Button, Stack } from '@mui/material';
+import { RHFTextField } from '../../components/hook-form';
+import { useDispatch } from 'react-redux';
+import { ForgotPassword } from '../../redux/slices/auth';
+
+const ResetPasswordForm = () => {
+ const dispatch = useDispatch();
+ // use Yup - famouse validator
+ const ResetPasswordSchema = Yup.object().shape({
+ email: Yup.string()
+ .required('Email is required')
+ .email('Email must be a valid email'),
+ });
+
+ const defaultValues = {
+ email: 'demo@talk.com',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(ResetPasswordSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ setError,
+ handleSubmit,
+ formState: { errors, isSubmitting, isSubmitSuccessful },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ // submit data to backend
+ // email : ""
+ dispatch(ForgotPassword(data));
+ } catch (error) {
+ console.log('error', error);
+ reset();
+ setError('afterSubmit', {
+ ...error,
+ message: error.message,
+ });
+ }
+ };
+
+ return (
+
+
+ {!!errors.afterSubmit && (
+ {errors.afterSubmit.message}
+ )}
+
+
+
+
+
+ );
+};
+
+export default ResetPasswordForm;
diff --git a/src/sections/auth/VerifyForm.js b/src/sections/auth/VerifyForm.js
new file mode 100644
index 0000000..d035d3a
--- /dev/null
+++ b/src/sections/auth/VerifyForm.js
@@ -0,0 +1,93 @@
+import { useState } from 'react';
+import * as Yup from 'yup';
+// form
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+// @mui
+import { Stack, Button } from '@mui/material';
+// components
+import { FormProvider } from '../../components/hook-form';
+import RHFCodes from '../../components/hook-form/RHFCodes';
+import { useDispatch, useSelector } from 'react-redux';
+import { VerifyEmail } from '../../redux/slices/auth';
+
+// ----------------------------------------------------------------------
+
+export default function VerifyForm() {
+ const dispatch = useDispatch();
+ const { email } = useSelector((state) => state.auth);
+
+ const VerifyCodeSchema = Yup.object().shape({
+ code1: Yup.string().required('Code is required'),
+ code2: Yup.string().required('Code is required'),
+ code3: Yup.string().required('Code is required'),
+ code4: Yup.string().required('Code is required'),
+ code5: Yup.string().required('Code is required'),
+ code6: Yup.string().required('Code is required'),
+ });
+
+ const defaultValues = {
+ code1: '',
+ code2: '',
+ code3: '',
+ code4: '',
+ code5: '',
+ code6: '',
+ };
+
+ const methods = useForm({
+ mode: 'onChange',
+ resolver: yupResolver(VerifyCodeSchema),
+ defaultValues,
+ });
+
+ const {
+ handleSubmit,
+ formState: { isSubmitting, errors },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ // Send API Request
+ dispatch(
+ VerifyEmail({
+ email,
+ otp: `${data.code1}${data.code2}${data.code3}${data.code4}${data.code5}${data.code6}`,
+ })
+ );
+ } catch (error) {
+ console.error(error);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/sections/main/CreateGroup.js b/src/sections/main/CreateGroup.js
new file mode 100644
index 0000000..1a353fe
--- /dev/null
+++ b/src/sections/main/CreateGroup.js
@@ -0,0 +1,100 @@
+import {
+ Button,
+ Dialog,
+ DialogContent,
+ DialogTitle,
+ Slide,
+ Stack,
+} from '@mui/material';
+import React, { forwardRef } from 'react';
+import { useForm } from 'react-hook-form';
+import {
+ FormProvider,
+ RHFAutoComplete,
+ RHFTextField,
+} from '../../components/hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+import * as Yup from 'yup';
+
+// TODO - create reusable component
+const Transition = forwardRef(function Transition(props, ref) {
+ return ;
+});
+
+const CreateGroupForm = ({ handleClose }) => {
+ const newGroupSchema = Yup.object().shape({
+ title: Yup.string().required('Title is required'),
+ members: Yup.array().min(2).required('At least 2 members required'),
+ });
+ const defaultValues = { title: '', members: [] };
+
+ const methods = useForm({
+ defaultValues,
+ resolver: yupResolver(newGroupSchema),
+ });
+
+ const {
+ reset,
+ watch,
+ setError,
+ handleSubmit,
+ formState: { errors, isSubmitting, isSubmitSuccessful, isValid },
+ } = methods;
+
+ const onSubmit = async (data) => {
+ try {
+ console.log('data', data);
+ } catch (error) {
+ console.log('error', error);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const CreateGroup = ({ open, handleClose }) => {
+ return (
+
+ );
+};
+
+export default CreateGroup;
diff --git a/src/sections/main/StartCall.js b/src/sections/main/StartCall.js
new file mode 100644
index 0000000..0f8a1ca
--- /dev/null
+++ b/src/sections/main/StartCall.js
@@ -0,0 +1,63 @@
+import {
+ Dialog,
+ DialogContent,
+ DialogTitle,
+ IconButton,
+ Slide,
+ Stack,
+} from '@mui/material';
+import { MagnifyingGlass, X } from 'phosphor-react';
+import React, { forwardRef } from 'react';
+import {
+ Search,
+ SearchIconWrapper,
+ StyledInputBase,
+} from '../../components/Search';
+import { CallLogs } from '../../data';
+import { CallLogElement } from '../../components/CallElement';
+
+const Transition = forwardRef(function Transition(props, ref) {
+ return ;
+});
+
+const StartCall = ({ open, handleClose }) => {
+ return (
+
+ );
+};
+
+export default StartCall;
diff --git a/src/sections/settings/ProfileForm.js b/src/sections/settings/ProfileForm.js
new file mode 100644
index 0000000..58f1f42
--- /dev/null
+++ b/src/sections/settings/ProfileForm.js
@@ -0,0 +1,107 @@
+import React, { useCallback, useState } from 'react';
+import * as Yup from 'yup';
+import { useForm } from 'react-hook-form';
+import { yupResolver } from '@hookform/resolvers/yup';
+import FormProvider from '../../components/hook-form/FormProvider';
+import {
+ Alert,
+ Button,
+ IconButton,
+ InputAdornment,
+ Link,
+ Stack,
+} from '@mui/material';
+import { RHFTextField } from '../../components/hook-form';
+import { Eye, EyeSlash } from 'phosphor-react';
+import { Link as RouterLink } from 'react-router-dom';
+
+const ProfileForm = () => {
+ // use Yup - famouse validator
+ const ProfileSchema = Yup.object().shape({
+ name: Yup.string().required('Name is required'),
+ about: Yup.string().required('About is required'),
+ avatarUrl: Yup.string().required('Avatar is required').nullable(),
+ });
+
+ const defaultValues = {
+ name: 'Kavinda Madhuranga',
+ about: 'Way to the future',
+ };
+
+ const methods = useForm({
+ resolver: yupResolver(ProfileSchema),
+ defaultValues,
+ });
+
+ const {
+ reset,
+ setError,
+ handleSubmit,
+ watch,
+ setValue,
+ control,
+ formState: { errors, isSubmitting, isSubmitSuccessful },
+ } = methods;
+
+ const values = watch();
+
+ const handleDrop = useCallback(
+ (acceptedFiles) => {
+ const file = acceptedFiles[0];
+
+ const newFile = Object.assign(file, {
+ preview: URL.createObjectURL(file),
+ });
+
+ if (newFile) {
+ setValue('avatarUrl', newFile, { showValidate: true });
+ }
+ },
+ [setValue]
+ );
+
+ const onSubmit = async (data) => {
+ try {
+ // submit data to backend
+ console.log('data', data);
+ } catch (error) {
+ console.log('error', error);
+ reset();
+ setError('afterSubmit', {
+ ...error,
+ message: error.message,
+ });
+ }
+ };
+
+ return (
+
+
+ {!!errors.afterSubmit && (
+ {errors.afterSubmit.message}
+ )}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ProfileForm;
diff --git a/src/sections/settings/Shortcuts.js b/src/sections/settings/Shortcuts.js
new file mode 100644
index 0000000..897644c
--- /dev/null
+++ b/src/sections/settings/Shortcuts.js
@@ -0,0 +1,101 @@
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Grid,
+ Slide,
+ Stack,
+ Typography,
+} from '@mui/material';
+import React, { forwardRef } from 'react';
+
+const Transition = forwardRef(function Transition(props, ref) {
+ return ;
+});
+
+const Shortcuts = ({ open, handleClose }) => {
+ const list = [
+ {
+ key: 0,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 1,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 2,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 3,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 4,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 5,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ ];
+ return (
+
+ );
+};
+
+export default Shortcuts;
diff --git a/src/sections/settings/ThemeDialog.js b/src/sections/settings/ThemeDialog.js
new file mode 100644
index 0000000..cc021cc
--- /dev/null
+++ b/src/sections/settings/ThemeDialog.js
@@ -0,0 +1,101 @@
+import {
+ Button,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Grid,
+ Slide,
+ Stack,
+ Typography,
+} from '@mui/material';
+import React, { forwardRef } from 'react';
+
+const Transition = forwardRef(function Transition(props, ref) {
+ return ;
+});
+
+const ThemeDialog = ({ open, handleClose }) => {
+ const list = [
+ {
+ key: 0,
+ title: 'System Default',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 1,
+ title: 'Light theme',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 2,
+ title: 'Dark Theme',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 3,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 4,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ {
+ key: 5,
+ title: 'Mark as read',
+ combination: ['Cmd', 'Shift', 'U'],
+ },
+ ];
+ return (
+
+ );
+};
+
+export default ThemeDialog;
diff --git a/src/theme/index.js b/src/theme/index.js
index 8995a9d..1850302 100644
--- a/src/theme/index.js
+++ b/src/theme/index.js
@@ -1,20 +1,20 @@
-import PropTypes from "prop-types";
-import { useMemo } from "react";
+import PropTypes from 'prop-types';
+import { useMemo } from 'react';
// @mui
-import { CssBaseline } from "@mui/material";
+import { CssBaseline } from '@mui/material';
import {
createTheme,
ThemeProvider as MUIThemeProvider,
StyledEngineProvider,
-} from "@mui/material/styles";
+} from '@mui/material/styles';
// hooks
-import useSettings from "../hooks/useSettings.js";
+import useSettings from '../hooks/useSettings.js';
//
-import palette from "./palette";
-import typography from "./typography";
-import breakpoints from "./breakpoints";
-import componentsOverride from "./overrides";
-import shadows, { customShadows } from "./shadows";
+import palette from './palette';
+import typography from './typography';
+import breakpoints from './breakpoints';
+import componentsOverride from './overrides';
+import shadows, { customShadows } from './shadows';
// ----------------------------------------------------------------------
@@ -25,7 +25,7 @@ ThemeProvider.propTypes = {
export default function ThemeProvider({ children }) {
const { themeMode, themeDirection } = useSettings();
- const isLight = themeMode === "light";
+ const isLight = themeMode === 'light';
const themeOptions = useMemo(
() => ({
diff --git a/src/utils/axios.js b/src/utils/axios.js
new file mode 100644
index 0000000..fb8ad04
--- /dev/null
+++ b/src/utils/axios.js
@@ -0,0 +1,17 @@
+import axios from 'axios';
+import { BASE_URL } from '../config';
+
+const axiosInstance = axios.create({
+ baseURL: BASE_URL,
+});
+
+axiosInstance.interceptors.response.use(
+ (response) => response,
+ (error) => {
+ Promise.reject(
+ (error.response && error.response.data) || 'Something went wrong'
+ );
+ }
+);
+
+export default axiosInstance;