diff --git a/package-lock.json b/package-lock.json index b465b37..2e50614 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "dotenv": "^16.4.5", "framer-motion": "^11.1.5", "js-cookie": "^3.0.5", + "quill": "^2.0.2", "react": "^18.2.0", "react-apexcharts": "^1.4.1", "react-beautiful-dnd": "^13.1.1", @@ -29,7 +30,7 @@ "react-hook-form": "^7.51.3", "react-icons": "^5.1.0", "react-phone-input-2": "^2.15.1", - "react-quill": "^0.0.2", + "react-quill": "^2.0.0", "react-redux": "^9.1.1", "react-router-dom": "^6.22.3", "redux-persist": "^6.0.0", @@ -2758,6 +2759,15 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "license": "MIT" }, + "node_modules/@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "license": "MIT", + "dependencies": { + "parchment": "^1.1.2" + } + }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", @@ -3183,7 +3193,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -3261,6 +3270,15 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/codepage": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", @@ -3466,6 +3484,26 @@ } } }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3477,7 +3515,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -3495,7 +3532,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -3623,7 +3659,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" @@ -3636,7 +3671,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4117,10 +4151,16 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -4131,10 +4171,10 @@ "license": "MIT" }, "node_modules/fast-diff": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.0.1.tgz", - "integrity": "sha512-anEzYJ8VOA5iAMjDOVMTVMrUOXveDTMMk5x0E4p0nJ3VPoIOolF51AqYyE+UD0QIyggUwqppqH7XVA9lF3fdaQ==", - "license": "Apache 2.0" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -4377,7 +4417,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4387,7 +4426,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4495,7 +4533,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" @@ -4534,7 +4571,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -4547,7 +4583,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4560,7 +4595,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4573,7 +4607,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4695,6 +4728,22 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -4812,7 +4861,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -4932,7 +4980,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -5229,13 +5276,21 @@ } }, "node_modules/lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", - "engines": [ - "node", - "rhino" - ], + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -5243,6 +5298,12 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5377,11 +5438,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5518,6 +5594,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5702,20 +5784,41 @@ ], "license": "MIT" }, - "node_modules/quilljs": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/quilljs/-/quilljs-0.18.1.tgz", - "integrity": "sha512-VKaO7GNehgnH4LlFPx5ZAl+KFDoRVtboY0I6UUbYXUsPHP8kR80Tg/CFEYqrqrpCOGQr4OQ5Tjm813gV1DUyQw==", + "node_modules/quill": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.2.tgz", + "integrity": "sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==", "license": "BSD-3-Clause", "dependencies": { - "eventemitter2": "~0.4.13", - "lodash": "~2.4.1", - "rich-text": "~1.0.2" + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" }, "engines": { - "node": ">=0.10" + "npm": ">=8.2.3" } }, + "node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "license": "MIT", + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/quill/node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", + "license": "BSD-3-Clause" + }, "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", @@ -5919,18 +6022,58 @@ } }, "node_modules/react-quill": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-0.0.2.tgz", - "integrity": "sha512-PeiHXZ63Sumh41OdovBQExXJH7B4UsJpyCW8CtRvXrNBa2RJXdciaJvTeb0x6pYQfqkoCYPT5EbUvEr0Z1tohg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", "license": "MIT", "dependencies": { - "quilljs": "^0.18.1" - }, - "engines": { - "node": ">= 0.8.x" + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" }, "peerDependencies": { - "react": ">=0.11.0" + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/react-quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "license": "MIT" + }, + "node_modules/react-quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "license": "Apache-2.0" + }, + "node_modules/react-quill/node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "license": "BSD-3-Clause", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/react-quill/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/react-redux": { @@ -6128,7 +6271,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", @@ -6186,18 +6328,6 @@ "node": ">=0.10.0" } }, - "node_modules/rich-text": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rich-text/-/rich-text-1.0.3.tgz", - "integrity": "sha512-L+Mi0fBH4/TBGH68XZqUXdUr5Ze+ViYkrKuwEvCpeyB1Blbp4CLO4LyYleutTNybujCMQfcmivaNrE3YLrEUgg==", - "license": "MIT", - "dependencies": { - "fast-diff": "~1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6335,7 +6465,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -6353,7 +6482,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", diff --git a/package.json b/package.json index 79d736a..d73c583 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "dotenv": "^16.4.5", "framer-motion": "^11.1.5", "js-cookie": "^3.0.5", + "quill": "^2.0.2", "react": "^18.2.0", "react-apexcharts": "^1.4.1", "react-beautiful-dnd": "^13.1.1", @@ -31,7 +32,7 @@ "react-hook-form": "^7.51.3", "react-icons": "^5.1.0", "react-phone-input-2": "^2.15.1", - "react-quill": "^0.0.2", + "react-quill": "^2.0.0", "react-redux": "^9.1.1", "react-router-dom": "^6.22.3", "redux-persist": "^6.0.0", diff --git a/src/Components/FormField.jsx b/src/Components/FormField.jsx index b7219a8..2c67452 100644 --- a/src/Components/FormField.jsx +++ b/src/Components/FormField.jsx @@ -87,6 +87,7 @@ const FormField = ({ control={control} name={name} defaultValue={value} + rules={rules} render={({ field }) => { if (type === "select") { @@ -514,6 +515,8 @@ const FormField = ({ {/* */} diff --git a/src/Layout/DefaultLayout.jsx b/src/Layout/DefaultLayout.jsx index d1edf86..8ba1653 100644 --- a/src/Layout/DefaultLayout.jsx +++ b/src/Layout/DefaultLayout.jsx @@ -13,7 +13,7 @@ import { TbTransactionDollar, } from "react-icons/tb"; import { TbArrowBadgeRightFilled } from "react-icons/tb"; -import { ArrowBackIcon, ArrowLeftIcon, ArrowRightIcon } from "@chakra-ui/icons"; +import { ArrowBackIcon, ArrowLeftIcon, ArrowRightIcon, AtSignIcon } from "@chakra-ui/icons"; import { Link, NavLink, @@ -163,6 +163,12 @@ const DashboardLayout = ({ isOnline }) => { Sponsor ); + case path.startsWith("/email"): + return ( + + Email Notifiation + + ); case path.startsWith("/investment-type"): return ( diff --git a/src/Pages/Admin/Investor/UnbanInvestor/UnbanInvestor.jsx b/src/Pages/Admin/Investor/UnbanInvestor/UnbanInvestor.jsx index 9c42c4a..834f5ab 100644 --- a/src/Pages/Admin/Investor/UnbanInvestor/UnbanInvestor.jsx +++ b/src/Pages/Admin/Investor/UnbanInvestor/UnbanInvestor.jsx @@ -24,6 +24,8 @@ import { useGetInvestorQuery, useGetUnbanInvestorQuery, } from "../../../../Services/ban.investor.service"; +import { generateSerialNumber } from "../../../../Constants/Constants"; +import { TABLE_PAGINATION } from "../../../../Constants/Paginations"; const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter @@ -33,13 +35,26 @@ const UnbanInvestor = () => { const thirdField = useRef(); const { bankInvestor, setBankInvestor, slideFromRight } = useContext(GlobalStateContext); - const [searchTerm, setSearchTerm] = useState(""); const [isLoading, setIsLoading] = useState(true); const [deleteAlert, setDeleteAlert] = useState(false); const [actionId, setActionId] = useState(""); const [mouseEntered, setMouseEntered] = useState(false); const [mouseEnteredId, setMouseEnteredId] = useState(""); const { isOpen: isOpen, onOpen: onOpen, onClose: onClose } = useDisclosure(); + const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size); + const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page); + const [searchTerm, setSearchTerm] = useState(""); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(""); + + // Debounce the search term to avoid making a request on every keystroke + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedSearchTerm(searchTerm); + }, 500); // Adjust delay as needed + return () => { + clearTimeout(handler); + }; + }, [searchTerm]); const formatDate = (date) => { return new Date(date).toLocaleDateString("en-GB", { @@ -54,7 +69,14 @@ const UnbanInvestor = () => { isLoading: unbanLoading, error, refetch, - } = useGetUnbanInvestorQuery(); + } = useGetUnbanInvestorQuery({ + page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search + size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search + search: debouncedSearchTerm, + }, + { + skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request + }); useEffect(() => { // Simulate loading @@ -101,7 +123,7 @@ const UnbanInvestor = () => { return nameMatches; }); - const extractedArray = filteredData?.map((item) => ({ + const extractedArray = filteredData?.map((item, index) => ({ id: item?.id, "Sr N/O": ( { color={"gray.600"} className="d-flex align-items-center fw-bold web-text-small" > - {item.id} + {generateSerialNumber(index,currentPage, pageSize )} ), Date: ( diff --git a/src/Pages/Admin/Notification.jsx b/src/Pages/Admin/Notification.jsx index 30e60ad..f2811df 100644 --- a/src/Pages/Admin/Notification.jsx +++ b/src/Pages/Admin/Notification.jsx @@ -66,6 +66,10 @@ const Notification = () => { const [form, setForm] = useState({}); const [isLoading, setIsLoading] = useState(false); const [ selectedRadio, setSelectedRadio] = useState([]) + const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size); + const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page); + const [searchTerm, setSearchTerm] = useState(""); + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(""); const { control, @@ -90,9 +94,6 @@ const Notification = () => { } = useGetContactQuery(); - const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size); - const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page); - const formatDate = (date) => { return new Date(date).toLocaleDateString("en-GB", { day: "2-digit", @@ -112,7 +113,17 @@ const Notification = () => { data : investorDetails, isLoading: investorDetailsLoading, refetch, - } = useGetUnbanInvestorQuery(); + } = useGetUnbanInvestorQuery({ + page: debouncedSearchTerm ? undefined : currentPage, // Omit pagination for search + size: debouncedSearchTerm ? undefined : pageSize, // Omit pagination for search + search: debouncedSearchTerm, + }, + { + skip: debouncedSearchTerm === "" && searchTerm !== "", // Skip if search is empty and it's not the initial request + });; + + + console.log(investorDetails); @@ -125,21 +136,23 @@ const Notification = () => { const formFields = [ { - label: "Investment Name", + label: "Notification Header", placeHolder: " ", name: "title", type: "text", + width:"100%", isRequired: true, - section: "Add Details", + section: "Send Custom Push Notification", // value: contact?.phoneNumber || "", }, { - label: "Message", + label: "Notification Message", placeHolder: " ", name: "message", + width:"100%", type: "textarea", isRequired: true, - section: "Add Details", + section: "Send Custom Push Notification", // value: contact?.phoneNumber || "", }, diff --git a/src/Pages/EmailNotification/EmailNotification.jsx b/src/Pages/EmailNotification/EmailNotification.jsx new file mode 100644 index 0000000..b9026fa --- /dev/null +++ b/src/Pages/EmailNotification/EmailNotification.jsx @@ -0,0 +1,188 @@ +import { Badge, Box, Button, FormControl, FormHelperText, FormLabel, HStack, Text } from '@chakra-ui/react' +import React, { useState } from 'react' +import { OPACITY_ON_LOAD } from '../../Layout/animations' +import NormalTable from '../../Components/DataTable/NormalTable'; +import { useGetUnbanInvestorQuery } from '../../Services/ban.investor.service'; +import { formatDate, generateSerialNumber } from '../../Constants/Constants'; +import { TABLE_PAGINATION } from '../../Constants/Paginations'; +import ReactQuill from 'react-quill'; +import 'react-quill/dist/quill.snow.css'; // Importing the Quill snow theme + + + +const EmailNotification = () => { + const [isLoading, setIsLoading] = useState(false); + const [ selectedRadio, setSelectedRadio] = useState([]) + const [value, setValue] = useState(''); + + const { + data : investorDetails, + isLoading: investorDetailsLoading, + refetch, + } = useGetUnbanInvestorQuery(); + + + // ====================================================[Table Setup]================================================================ + const tableHeadRow = [ + "Sr N/O", + "Date", + "Client ID", + "First Name", + "Last Name", + "Country", + "Phone Number", + "E-mail ID", + "KYC Status", + ]; + + + + const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size); + const [currentPage, setCurrentPage] = useState(TABLE_PAGINATION?.page); + + + const extractedArray = investorDetails?.data?.rows?.map((item, idx) => ({ + id: item?.principal_xid, + "Sr N/O": ( + + {generateSerialNumber(idx,currentPage, pageSize )} + + ), + Date: ( + + + {formatDate(item?.date)} + + + ), + "Client ID": ( + + + {item?.clientReference_id} + + + ), + "First Name": ( + + + {item?.firstName} + + + ), + "Last Name": ( + + + {item?.lastName} + + + ), + Country: ( + + + {item?.country} + + + ), + "Phone Number": ( + + + {item?.phoneNumber} + + + ), + "E-mail ID": ( + + + {item?.emailAddress} + + + ), + "KYC Status": ( + + + {item?.KYCStatus === true ? "Completed" : "Incompleted"} + + + ), + })); + + + console.log(value); + + + const modules = { + toolbar: [ + [{ 'header': '1'}, { 'header': '2'}, { 'font': [] }], + [{size: []}], + ['bold', 'italic', 'underline', 'strike', 'blockquote'], + [{'list': 'ordered'}, {'list': 'bullet'}], + // ['link', 'image', 'video'], + ['clean'] + ], + }; + return ( + + + +{/* */} + + + + Customize your email + + + + We'll never share your email. + + + + {/* + Output: + + */} + {/* */} + + + + + ) +} + +export default EmailNotification \ No newline at end of file diff --git a/src/Pages/IO_Management/CreateIO/IODetails.jsx b/src/Pages/IO_Management/CreateIO/IODetails.jsx index 829d895..f2b2997 100644 --- a/src/Pages/IO_Management/CreateIO/IODetails.jsx +++ b/src/Pages/IO_Management/CreateIO/IODetails.jsx @@ -391,6 +391,7 @@ const IODetails = ({ enableNextTab, index, data }) => { label: "Shariah", name: "isShariah", type: "checkBox", + value:IObyID?.data?.isShariah, // isRequired: true, section: " ", width: "32.3%", diff --git a/src/Routes/Nav.js b/src/Routes/Nav.js index fdc45a2..8818b5f 100644 --- a/src/Routes/Nav.js +++ b/src/Routes/Nav.js @@ -31,6 +31,7 @@ import { LuContact } from "react-icons/lu"; import { LiaCrownSolid } from "react-icons/lia"; import { PiCrownDuotone } from "react-icons/pi"; import { HiOutlineBanknotes } from "react-icons/hi2"; +import { AtSignIcon } from "@chakra-ui/icons"; export const nav = [ // { @@ -208,10 +209,15 @@ export const nav = [ icon: GrManual, }, { - title: "Notification", + title: "Push Notification", path: "/notification", icon: MdNotificationsNone, }, + // { + // title: "Email Notification", + // path: "/email", + // icon: AtSignIcon, + // }, { title: "Contact Details", path: "/contact", diff --git a/src/Routes/Routes.js b/src/Routes/Routes.js index dd94426..56dff41 100644 --- a/src/Routes/Routes.js +++ b/src/Routes/Routes.js @@ -42,6 +42,7 @@ import CreateRequest from "../Pages/Fawateer/CreateRequest"; import ApproveRequest from "../Pages/FawateerChecker/ApproveRequest/ApproveRequest"; import ApproveHistory from "../Pages/FawateerChecker/ApproveHistory/ApproveHistoryChecker"; import ApproveHistoryMaker from "../Pages/FawateerChecker/ApproveHistory/ApproveHistoryMaker"; +import EmailNotification from "../Pages/EmailNotification/EmailNotification"; export const RouteLink = [ // =============[ Tanami ]================ @@ -112,6 +113,7 @@ export const RouteLink = [ { path: "/contact", Component: Contact }, // { path: "/contact", Component: UnderConstruction }, // { path: "/users", Component: Users }, + { path: "/email", Component: EmailNotification }, { path: "/users", Component: UnderConstruction }, { path: "/bank-details", Component: BankDetails }, // { path: "/bank-details", Component: UnderConstruction }, diff --git a/src/Services/ban.investor.service.js b/src/Services/ban.investor.service.js index 3e4aa84..12e840d 100644 --- a/src/Services/ban.investor.service.js +++ b/src/Services/ban.investor.service.js @@ -18,10 +18,33 @@ export const banInvestorDetails = createApi({ providesTags: ["getBanInvestor"], }), + getUnbanInvestor: builder.query({ - query: () => `/investorDetails/admin/getAllUnbanned`, + query: ({ page, size, search, kycStatus, country }) => { + // Start with the base URL, including searchTerm + let baseURL = `/investorDetails/admin/getAllUnbanned/?search=${search || ""}`; + + // Conditionally append kycStatus if it's defined + if (kycStatus) { + baseURL += `&kycStatus=${kycStatus}`; + } + + // Conditionally append country if it's defined + if (country) { + baseURL += `&country=${country}`; + } + + // Conditionally append page and size parameters if they are defined + if (page !== undefined && size !== undefined) { + baseURL += `&page=${page}&size=${size}`; + } + + return baseURL; + }, providesTags: ["getBanInvestor"], }), + + getbanInvestor: builder.query({ query: () => `/investorDetails/admin/getAllBanned`,