diff --git a/package-lock.json b/package-lock.json index dd65c25..fbba254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,30 +15,28 @@ "@capacitor/core": "^6.1.2", "@capacitor/filesystem": "^6.0.1", "@capacitor/local-notifications": "^6.1.0", - "@chatscope/chat-ui-kit-react": "^2.0.3", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/core": "^6.3.0", + "@dnd-kit/sortable": "^10.0.0", "@electron/packager": "^18.3.6", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@evva/capacitor-secure-storage-plugin": "^3.0.1", - "@mui/icons-material": "^5.16.4", - "@mui/lab": "^5.0.0-alpha.173", - "@mui/material": "^5.16.7", - "@reduxjs/toolkit": "^2.2.7", - "@tanstack/react-virtual": "^3.10.8", + "@mui/icons-material": "^7.0.1", + "@mui/lab": "^7.0.0-beta.11", + "@mui/material": "^7.0.1", + "@tanstack/react-virtual": "^3.13.6", "@testing-library/jest-dom": "^6.4.6", - "@testing-library/user-event": "^14.5.2", - "@tiptap/extension-color": "^2.5.9", - "@tiptap/extension-highlight": "^2.6.6", - "@tiptap/extension-image": "^2.6.6", - "@tiptap/extension-mention": "^2.9.1", - "@tiptap/extension-placeholder": "^2.6.2", - "@tiptap/extension-text-style": "^2.5.9", - "@tiptap/extension-underline": "^2.6.6", - "@tiptap/pm": "^2.5.9", - "@tiptap/react": "^2.5.9", - "@tiptap/starter-kit": "^2.5.9", + "@testing-library/user-event": "^14.6.1", + "@tiptap/extension-color": "^2.11.7", + "@tiptap/extension-highlight": "^2.11.7", + "@tiptap/extension-image": "^2.11.7", + "@tiptap/extension-mention": "^2.11.7", + "@tiptap/extension-placeholder": "^2.11.7", + "@tiptap/extension-text-style": "^2.11.7", + "@tiptap/extension-underline": "^2.11.7", + "@tiptap/pm": "^2.11.7", + "@tiptap/react": "^2.11.7", + "@tiptap/starter-kit": "^2.11.7", "@transistorsoft/capacitor-background-fetch": "^6.0.1", "@types/chrome": "^0.0.263", "@uiw/react-color": "^2.5.1", @@ -61,30 +59,25 @@ "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", "i18next-localstorage-backend": "^4.2.0", + "jotai": "^2.12.3", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", "mime": "^4.0.4", "moment": "^2.30.1", "npm": "^10.8.3", - "quill-image-resize-module-react": "^3.0.0", - "react": "^18.2.0", - "react-copy-to-clipboard": "^5.1.0", + "react": "^19.1.0", "react-countdown-circle-timer": "^3.2.1", - "react-dom": "^18.2.0", + "react-dom": "^19.1.0", "react-dropzone": "^14.2.3", "react-frame-component": "^5.2.7", "react-i18next": "^15.4.1", - "react-infinite-scroller": "^1.2.6", - "react-intersection-observer": "^9.13.0", - "react-json-view-lite": "^2.0.1", + "react-intersection-observer": "^9.16.0", + "react-json-view-lite": "^2.4.1", "react-loader-spinner": "^6.1.6", "react-qr-code": "^2.0.15", - "react-quill": "^2.0.0", - "react-redux": "^9.1.2", - "react-virtualized": "^9.22.5", + "react-virtualized": "^9.22.6", "react-virtuoso": "^4.10.4", - "recoil": "^0.7.7", "short-unique-id": "^5.2.0", "slate": "^0.103.0", "slate-react": "^0.109.0", @@ -96,14 +89,12 @@ "vite-plugin-wasm": "^3.3.0" }, "devDependencies": { - "@testing-library/dom": "^10.3.0", - "@testing-library/react": "^16.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.3.0", "@types/dompurify": "^3.0.5", "@types/lodash": "^4.17.7", - "@types/react": "^18.2.64", - "@types/react-copy-to-clipboard": "^5.0.7", - "@types/react-dom": "^18.2.21", - "@types/react-infinite-scroller": "^1.2.5", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.0", "@types/react-virtualized": "^9.21.30", "@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/parser": "^7.1.1", @@ -1779,30 +1770,6 @@ "@capacitor/core": "^6.0.0" } }, - "node_modules/@chatscope/chat-ui-kit-react": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@chatscope/chat-ui-kit-react/-/chat-ui-kit-react-2.0.3.tgz", - "integrity": "sha512-0IkjFskRec7SHrFivOQPiZMie5GLQL+ZnROiIbj4yptbC3aMEMFdHRAZrfqlid3uQx9kYhdtn34wMLh1vVNMLA==", - "dependencies": { - "@chatscope/chat-ui-kit-styles": "^1.2.0", - "@fortawesome/fontawesome-free": "^5.12.1", - "@fortawesome/fontawesome-svg-core": "^1.2.26", - "@fortawesome/free-solid-svg-icons": "^5.12.0", - "@fortawesome/react-fontawesome": "^0.1.8", - "classnames": "^2.2.6", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "prop-types": "^15.7.2", - "react": "^16.12.0 || ^17.0.0 || ^18.2.0", - "react-dom": "^16.12.0 || ^17.0.0 || ^18.2.0" - } - }, - "node_modules/@chatscope/chat-ui-kit-styles": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@chatscope/chat-ui-kit-styles/-/chat-ui-kit-styles-1.4.0.tgz", - "integrity": "sha512-016mBJD3DESw7Nh+lkKcPd22xG92ghA0VpIXIbjQtmXhC7Ve6wRazTy8z1Ahut+Tbv179+JxrftuMngsj/yV8Q==" - }, "node_modules/@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -1820,9 +1787,10 @@ } }, "node_modules/@dnd-kit/accessibility": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz", - "integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -1831,11 +1799,12 @@ } }, "node_modules/@dnd-kit/core": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.1.0.tgz", - "integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", "dependencies": { - "@dnd-kit/accessibility": "^3.1.0", + "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, @@ -1845,15 +1814,16 @@ } }, "node_modules/@dnd-kit/sortable": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-8.0.0.tgz", - "integrity": "sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { - "@dnd-kit/core": "^6.1.0", + "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, @@ -2433,21 +2403,35 @@ } }, "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/cache/node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.2", @@ -2486,21 +2470,35 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/styled": { "version": "11.11.0", @@ -2527,7 +2525,8 @@ "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.0.1", @@ -2538,9 +2537,10 @@ } }, "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.3.1", @@ -2993,94 +2993,6 @@ "@capacitor/core": "^6.1.2" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dependencies": { - "@floating-ui/dom": "^1.6.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", - "integrity": "sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -3732,64 +3644,35 @@ "node": ">= 10.0.0" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", - "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.2.tgz", + "integrity": "sha512-TfeFU9TgN1N06hyb/pV/63FfO34nijZRMqgHk0TJ3gkl4Fbd+wZ73+ZtOd7jag6hMmzO9HSrBc6Vdn591nhkAg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.16.4", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.4.tgz", - "integrity": "sha512-j9/CWctv6TH6Dou2uR2EH7UOgu79CW/YcozxCYVLJ7l03pCsiOlJ5sBArnWJxJ+nGkFwyL/1d1k8JEPMDR125A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.0.2.tgz", + "integrity": "sha512-Bo57PFLOqXOqPNrXjd8AhzH5s6TCsNUQbvnQ0VKZ8D+lIlteqKnrk/O1luMJUc/BXONK7BfIdTdc7qOnXYbMdw==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.27.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@mui/material": "^7.0.2", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3798,20 +3681,20 @@ } }, "node_modules/@mui/lab": { - "version": "5.0.0-alpha.173", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.173.tgz", - "integrity": "sha512-Gt5zopIWwxDgGy/MXcp6GueD84xFFugFai4hYiXY0zowJpTVnIrTQCQXV004Q7rejJ7aaCntX9hpPJqCrioshA==", + "version": "7.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-7.0.0-beta.11.tgz", + "integrity": "sha512-VJDEUgiRsjo8V2xDvBEE9Cfs1cSlwzp9UFmD3KzIg6emFMqz9BfYh+9cFI4iQWaoz3Agm3q6bVKlhlX6xw6sVQ==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/system": "^5.16.5", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.5", - "clsx": "^2.1.0", + "@babel/runtime": "^7.27.0", + "@mui/system": "^7.0.2", + "@mui/types": "^7.4.1", + "@mui/utils": "^7.0.2", + "clsx": "^2.1.1", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -3820,10 +3703,11 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material": ">=5.15.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@mui/material": "^7.0.2", + "@mui/material-pigment-css": "^7.0.2", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -3832,31 +3716,35 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, "node_modules/@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.2.tgz", + "integrity": "sha512-rjJlJ13+3LdLfobRplkXbjIFEIkn6LgpetgU/Cs3Xd8qINCCQK9qXQIjjQ6P0FXFTPFzEVMj0VgBR1mN+FhOcA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.27.0", + "@mui/core-downloads-tracker": "^7.0.2", + "@mui/system": "^7.0.2", + "@mui/types": "^7.4.1", + "@mui/utils": "^7.0.2", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^18.3.1", + "react-is": "^19.1.0", "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -3865,9 +3753,10 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@mui/material-pigment-css": "^7.0.2", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -3876,35 +3765,40 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, "node_modules/@mui/material/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" }, "node_modules/@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.2.tgz", + "integrity": "sha512-6lt8heDC9wN8YaRqEdhqnm0cFCv08AMf4IlttFvOVn7ZdKd81PNpD/rEtPGLLwQAFyyKSxBG4/2XCgpbcdNKiA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@babel/runtime": "^7.27.0", + "@mui/utils": "^7.0.2", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3913,17 +3807,20 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.2.tgz", + "integrity": "sha512-11Bt4YdHGlh7sB8P75S9mRCUxTlgv7HGbr0UKz6m6Z9KLeiw1Bm9y/t3iqLLVMvSHYB6zL8X8X+LmfTE++gyBw==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@babel/runtime": "^7.27.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -3932,7 +3829,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -3944,21 +3841,22 @@ } }, "node_modules/@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.2.tgz", + "integrity": "sha512-yFUraAWYWuKIISPPEVPSQ1NLeqmTT4qiQ+ktmyS8LO/KwHxB+NNVOacEZaIofh5x1NxY8rzphvU5X2heRZ/RDA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", - "clsx": "^2.1.0", + "@babel/runtime": "^7.27.0", + "@mui/private-theming": "^7.0.2", + "@mui/styled-engine": "^7.0.2", + "@mui/types": "^7.4.1", + "@mui/utils": "^7.0.2", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -3967,8 +3865,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -3983,11 +3881,15 @@ } }, "node_modules/@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.1.tgz", + "integrity": "sha512-gUL8IIAI52CRXP/MixT1tJKt3SI6tVv4U/9soFsTtAsHzaJQptZ42ffdHZV3niX1ei0aUgMvOxBBN0KYqdG39g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.0" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3996,27 +3898,28 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.2.tgz", + "integrity": "sha512-72gcuQjPzhj/MLmPHLCgZjy2VjOH4KniR/4qRtXTTXIEwbkgcN+Y5W/rC90rWtMmZbjt9svZev/z+QHUI4j74w==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", + "@babel/runtime": "^7.27.0", + "@mui/types": "^7.4.1", + "@types/prop-types": "^15.7.14", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "react-is": "^19.1.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4025,9 +3928,10 @@ } }, "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -4107,29 +4011,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@reduxjs/toolkit": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.7.tgz", - "integrity": "sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==", - "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, "node_modules/@remirror/core-constants": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", @@ -4649,34 +4530,36 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz", - "integrity": "sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==", + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.6.tgz", + "integrity": "sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==", + "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.10.8" + "@tanstack/virtual-core": "3.13.6" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tanstack/virtual-core": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.8.tgz", - "integrity": "sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==", + "version": "3.13.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.6.tgz", + "integrity": "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@testing-library/dom": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.3.0.tgz", - "integrity": "sha512-pT/TYB2+IyMYkkB6lqpkzD7VFbsR0JBJtflK3cS68sCNWxmOhWwRm1XvVHlseNEorsNcxkYsb4sRDV3aNIpttg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", @@ -4913,9 +4796,9 @@ } }, "node_modules/@testing-library/react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.0.tgz", - "integrity": "sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", "dev": true, "license": "MIT", "dependencies": { @@ -4926,10 +4809,10 @@ }, "peerDependencies": { "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4941,9 +4824,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "license": "MIT", "engines": { "node": ">=12", @@ -4954,9 +4837,10 @@ } }, "node_modules/@tiptap/core": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.9.1.tgz", - "integrity": "sha512-tifnLL/ARzQ6/FGEJjVwj9UT3v+pENdWHdk9x6F3X0mB1y0SeCjV21wpFLYESzwNdBPAj8NMp8Behv7dBnhIfw==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.11.7.tgz", + "integrity": "sha512-zN+NFFxLsxNEL8Qioc+DL6b8+Tt2bmRbXH22Gk6F6nD30x83eaUSFlSv3wqvgyCq3I1i1NO394So+Agmayx6rQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -4966,33 +4850,36 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.5.9.tgz", - "integrity": "sha512-LhGyigmd/v1OjYPeoVK8UvFHbH6ffh175ZuNvseZY4PsBd7kZhrSUiuMG8xYdNX8FxamsxAzr2YpsYnOzu3W7A==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.7.tgz", + "integrity": "sha512-liD8kWowl3CcYCG9JQlVx1eSNc/aHlt6JpVsuWvzq6J8APWX693i3+zFqyK2eCDn0k+vW62muhSBe3u09hA3Zw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-bold": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.5.9.tgz", - "integrity": "sha512-XUJdzFb31t0+bwiRquJf0btBpqOB3axQNHTKM9XADuL4S+Z6OBPj0I5rYINeElw/Q7muvdWrHWHh/ovNJA1/5A==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.7.tgz", + "integrity": "sha512-VTR3JlldBixXbjpLTFme/Bxf1xeUgZZY3LTlt5JDlCW3CxO7k05CIa+kEZ8LXpog5annytZDUVtWqxrNjmsuHQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.5.9.tgz", - "integrity": "sha512-NddZ8Qn5dgPPa1W4yk0jdhF4tDBh0FwzBpbnDu2Xz/0TUHrA36ugB2CvR5xS1we4zUKckgpVqOqgdelrmqqFVg==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.7.tgz", + "integrity": "sha512-0vYqSUSSap3kk3/VT4tFE1/6StX70I3/NKQ4J68ZSFgkgyB3ZVlYv7/dY3AkEukjsEp3yN7m8Gw8ei2eEwyzwg==", + "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" }, @@ -5001,89 +4888,96 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.5.9.tgz", - "integrity": "sha512-hJTv1x4omFgaID4LMRT5tOZb/VKmi8Kc6jsf4JNq4Grxd2sANmr9qpmKtBZvviK+XD5PpTXHvL+1c8C1SQtuHQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.7.tgz", + "integrity": "sha512-WbPogE2/Q3e3/QYgbT1Sj4KQUfGAJNc5pvb7GrUbvRQsAh7HhtuO8hqdDwH8dEdD/cNUehgt17TO7u8qV6qeBw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-code": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.5.9.tgz", - "integrity": "sha512-Q1PL3DUXiEe5eYUwOug1haRjSaB0doAKwx7KFVI+kSGbDwCV6BdkKAeYf3us/O2pMP9D0im8RWX4dbSnatgwBA==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.7.tgz", + "integrity": "sha512-VpPO1Uy/eF4hYOpohS/yMOcE1C07xmMj0/D989D9aS1x95jWwUVrSkwC+PlWMUBx9PbY2NRsg1ZDwVvlNKZ6yQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.5.9.tgz", - "integrity": "sha512-+MUwp0VFFv2aFiZ/qN6q10vfIc6VhLoFFpfuETX10eIRks0Xuj2nGiqCDj7ca0/M44bRg2VvW8+tg/ZEHFNl9g==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.7.tgz", + "integrity": "sha512-To/y/2H04VWqiANy53aXjV7S6fA86c2759RsH1hTIe57jA1KyE7I5tlAofljOLZK/covkGmPeBddSPHGJbz++Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-color": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.5.9.tgz", - "integrity": "sha512-VUGCT9iqD/Ni9arLIxkCbykAElRMFyew7uk2kbbNvttzdwzmZkbslEgCiaEZQTqKr8w4wjuQL14YOtXc6iwEww==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.11.7.tgz", + "integrity": "sha512-2CWb0Qnh8Crf9OwnnWB+M1QJtWrbn6IMSwuOzk+tSzdWSazjN8h6XAZVemr0qMdAA/SyUigzorStiPxN6o3/vQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/extension-text-style": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" } }, "node_modules/@tiptap/extension-document": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.5.9.tgz", - "integrity": "sha512-VdNZYDyCzC3W430UdeRXR9IZzPeODSbi5Xz/JEdV93THVp8AC9CrZR7/qjqdBTgbTB54VP8Yr6bKfCoIAF0BeQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.7.tgz", + "integrity": "sha512-95ouJXPjdAm9+VBRgFo4lhDoMcHovyl/awORDI8gyEn0Rdglt+ZRZYoySFzbVzer9h0cre+QdIwr9AIzFFbfdA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.5.9.tgz", - "integrity": "sha512-nEOb37UryG6bsU9JAs/HojE6Jg43LupNTAMISbnuB1CPAeAqNsFMwORd9eEPkyEwnQT7MkhsMOSJM44GoPGIFA==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.7.tgz", + "integrity": "sha512-63mL+nxQILizsr5NbmgDeOjFEWi34BLt7evwL6UUZEVM15K8V1G8pD9Y0kCXrZYpHWz0tqFRXdrhDz0Ppu8oVw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.5.9.tgz", - "integrity": "sha512-MWJIQQT6e5MgqHny8neeH2Dx926nVPF7sv4p84nX4E0dnkRbEYUP8mCsWYhSUvxxIif6e+yY+4654f2Q9qTx1w==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.7.tgz", + "integrity": "sha512-DG54WoUu2vxHRVzKZiR5I5RMOYj45IlxQMkBAx1wjS0ch41W8DUYEeipvMMjCeKtEI+emz03xYUcOAP9LRmg+w==", + "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" }, @@ -5092,125 +4986,135 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.5.9.tgz", - "integrity": "sha512-yW7V2ebezsa7mWEDWCg4A1ZGsmSV5bEHKse9wzHCDkb7TutSVhLZxGo72U6hNN9PnAksv+FJQk03NuZNYvNyRQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.7.tgz", + "integrity": "sha512-EceesmPG7FyjXZ8EgeJPUov9G1mAf2AwdypxBNH275g6xd5dmU/KvjoFZjmQ0X1ve7mS+wNupVlGxAEUYoveew==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.5.9.tgz", - "integrity": "sha512-8hQ63SgZRG4BqHOeSfeaowG2eMr2beced018pOGbpHbE3XSYoISkMVuFz4Z8UEVR3W9dTbKo4wxNufSTducocQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.7.tgz", + "integrity": "sha512-zTkZSA6q+F5sLOdCkiC2+RqJQN0zdsJqvFIOVFL/IDVOnq6PZO5THzwRRLvOSnJJl3edRQCl/hUgS0L5sTInGQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-heading": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.5.9.tgz", - "integrity": "sha512-HHowAlGUbFn1qvmY02ydM7qiPPMTGhAJn2A46enDRjNHW5UoqeMfkMpTEYaioOexyguRFSfDT3gpK68IHkQORQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.7.tgz", + "integrity": "sha512-8kWh7y4Rd2fwxfWOhFFWncHdkDkMC1Z60yzIZWjIu72+6yQxvo8w3yeb7LI7jER4kffbMmadgcfhCHC/fkObBA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-highlight": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.6.6.tgz", - "integrity": "sha512-Z02AYWm1AJAfhmfT4fGCI3YitijF4uNu+eiuq7OxhCiVf9IYaq8xlH2YMxa09QvMUo70ovklxk97+vQUUHeqfQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.11.7.tgz", + "integrity": "sha512-c/NH4kIpNOWCUQv8RkFNDyOcgt+2pYFpDf0QBJmzhAuv4BIeS2bDmDtuNS7VgoWRZH+xxCNXfvm2BG+kjtipEg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.6.6" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-history": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.5.9.tgz", - "integrity": "sha512-hGPtJgoZSwnVVqi/xipC2ET/9X2G2UI/Y+M3IYV1ZlM0tCYsv4spNi3uXlZqnXRwYcBXLk5u6e/dmsy5QFbL8g==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.7.tgz", + "integrity": "sha512-Cu5x3aS13I040QSRoLdd+w09G4OCVfU+azpUqxufZxeNs9BIJC+0jowPLeOxKDh6D5GGT2A8sQtxc6a/ssbs8g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.5.9.tgz", - "integrity": "sha512-/ES5NdxCndBmZAgIXSpCJH8YzENcpxR0S8w34coSWyv+iW0Sq7rW/mksQw8ZIVsj8a7ntpoY5OoRFpSlqcvyGw==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.7.tgz", + "integrity": "sha512-uVmQwD2dzZ5xwmvUlciy0ItxOdOfQjH6VLmu80zyJf8Yu7mvwP8JyxoXUX0vd1xHpwAhgQ9/ozjIWYGIw79DPQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-image": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.6.6.tgz", - "integrity": "sha512-dwJKvoqsr72B4tcTH8hXhfBJzUMs/jXUEE9MnfzYnSXf+CYALLjF8r/IkGYbxce62GP/bMDoj8BgpF8saeHtqA==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.11.7.tgz", + "integrity": "sha512-YvCmTDB7Oo+A56tR4S/gcNaYpqU4DDlSQcRp5IQvmQV5EekSe0lnEazGDoqOCwsit9qQhj4MPQJhKrnaWrJUrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.6.6" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-italic": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.5.9.tgz", - "integrity": "sha512-Bw+P139L4cy+B56zpUiRjP8BZSaAUl3JFMnr/FO+FG55QhCxFMXIc6XrC3vslNy5ef3B3zv4gCttS3ee8ByMiw==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.7.tgz", + "integrity": "sha512-r985bkQfG0HMpmCU0X0p/Xe7U1qgRm2mxvcp6iPCuts2FqxaCoyfNZ8YnMsgVK1mRhM7+CQ5SEg2NOmQNtHvPw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.5.9.tgz", - "integrity": "sha512-d9Eo+vBz74SMxP0r25aqiErV256C+lGz+VWMjOoqJa6xWLM1keYy12JtGQWJi8UDVZrDskJKCHq81A0uLt27WA==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.7.tgz", + "integrity": "sha512-6ikh7Y+qAbkSuIHXPIINqfzmWs5uIGrylihdZ9adaIyvrN1KSnWIqrZIk/NcZTg5YFIJlXrnGSRSjb/QM3WUhw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-mention": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-2.9.1.tgz", - "integrity": "sha512-2IzunpivdNtDNdtAXwRiQbNhTm87zrbkhz1cCE+2y9pWiX1QLXyx0HQq/DIAjxp6v7y4sIh+5UTUTFlH7vD9wQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-mention/-/extension-mention-2.11.7.tgz", + "integrity": "sha512-Q/fkceDOug4VjiqrCRLzBnOL9Oj+XugWwDgwfucJJMBOJxZ3++3eZGZ54dri/xK39A4ZD+xuMBF7PrJIy+Z5dw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -5222,113 +5126,121 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.5.9.tgz", - "integrity": "sha512-9MsWpvVvzILuEOd/GdroF7RI7uDuE1M6at9rzsaVGvCPVHZBvu1XR3MSVK5OdiJbbJuPGttlzEFLaN/rQdCGFg==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.7.tgz", + "integrity": "sha512-bLGCHDMB0vbJk7uu8bRg8vES3GsvxkX7Cgjgm/6xysHFbK98y0asDtNxkW1VvuRreNGz4tyB6vkcVCfrxl4jKw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.5.9.tgz", - "integrity": "sha512-HDXGiHTJ/V85dbDMjcFj4XfqyTQZqry6V21ucMzgBZYX60X3gIn7VpQTQnnRjvULSgtfOASSJP6BELc5TyiK0w==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.7.tgz", + "integrity": "sha512-Pl3B4q6DJqTvvAdraqZaNP9Hh0UWEHL5nNdxhaRNuhKaUo7lq8wbDSIxIW3lvV0lyCs0NfyunkUvSm1CXb6d4Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.6.2.tgz", - "integrity": "sha512-Aou6lH456j5mpry36jyAdZzINxFx6fjqvmapmmORJKV+9J889P7RN7laRRsosWHez0Oxg4KuWL3FuDexx6ZJOQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.11.7.tgz", + "integrity": "sha512-/06zXV4HIjYoiaUq1fVJo/RcU8pHbzx21evOpeG/foCfNpMI4xLU/vnxdUi6/SQqpZMY0eFutDqod1InkSOqsg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.6.2", - "@tiptap/pm": "^2.6.2" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" } }, "node_modules/@tiptap/extension-strike": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.5.9.tgz", - "integrity": "sha512-QezkOZpczpl09S8lp5JL7sRkwREoPY16Y/lTvBcFKm3TZbVzYZZ/KwS0zpwK9HXTfXr8os4L9AGjQf0tHonX+w==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.7.tgz", + "integrity": "sha512-D6GYiW9F24bvAY7XMOARNZbC8YGPzdzWdXd8VOOJABhf4ynMi/oW4NNiko+kZ67jn3EGaKoz32VMJzNQgYi1HA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-text": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.5.9.tgz", - "integrity": "sha512-W0pfiQUPsMkwaV5Y/wKW4cFsyXAIkyOFt7uN5u6LrZ/iW9KZ/IsDODPJDikWp0aeQnXzT9NNQULTpCjbHzzS6g==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.7.tgz", + "integrity": "sha512-wObCn8qZkIFnXTLvBP+X8KgaEvTap/FJ/i4hBMfHBCKPGDx99KiJU6VIbDXG8d5ZcFZE0tOetK1pP5oI7qgMlQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.5.9.tgz", - "integrity": "sha512-1pNnl/a5EdY7g3IeFomm0B6eiTvAFOBeJGswoYxogzHmkWbLFhXFdgZ6qz7+k985w4qscsG1GpvtOW3IrJ9J6g==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.7.tgz", + "integrity": "sha512-LHO6DBg/9SkCQFdWlVfw9nolUmw+Cid94WkTY+7IwrpyG2+ZGQxnKpCJCKyeaFNbDoYAtvu0vuTsSXeCkgShcA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-underline": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.6.6.tgz", - "integrity": "sha512-3A4HqsDM/AFb2VaeWACpGexjgI257kz0yU4jNV8uyydDR2KhqeinuEnoSoOmx9T3pL006TWfPg4vaQYPO3qvrQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.11.7.tgz", + "integrity": "sha512-NtoQw6PGijOAtXC6G+0Aq0/Z5wwEjPhNHs8nsjXogfWIgaj/aI4/zfBnA06eI3WT+emMYQTl0fTc4CUPnLVU8g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.6.6" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/pm": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.9.1.tgz", - "integrity": "sha512-mvV86fr7kEuDYEApQ2uMPCKL2uagUE0BsXiyyz3KOkY1zifyVm1fzdkscb24Qy1GmLzWAIIihA+3UHNRgYdOlQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.7.tgz", + "integrity": "sha512-7gEEfz2Q6bYKXM07vzLUD0vqXFhC5geWRA6LCozTiLdVFDdHWiBrvb2rtkL5T7mfLq03zc1QhH7rI3F6VntOEA==", + "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.0", + "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.0", + "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.22.3", + "prosemirror-model": "^1.23.0", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.4.0", + "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.0", - "prosemirror-view": "^1.34.3" + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" }, "funding": { "type": "github", @@ -5336,50 +5248,55 @@ } }, "node_modules/@tiptap/react": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.5.9.tgz", - "integrity": "sha512-NZYAslIb79oxIOFHx9T9ey5oX0aJ1uRbtT2vvrvvyRaO6fKWgAwMYN92bOu5/f2oUVGUp6l7wkYZGdjz/XP5bA==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.11.7.tgz", + "integrity": "sha512-gQZEUkAoPsBptnB4T2gAtiUxswjVGhfsM9vOElQco+b11DYmy110T2Zuhg+2YGvB/CG3RoWJx34808P0FX1ijA==", + "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.5.9", - "@tiptap/extension-floating-menu": "^2.5.9", + "@tiptap/extension-bubble-menu": "^2.11.7", + "@tiptap/extension-floating-menu": "^2.11.7", "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.2.2" + "fast-deep-equal": "^3", + "use-sync-external-store": "^1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/pm": "^2.5.9", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tiptap/starter-kit": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.5.9.tgz", - "integrity": "sha512-nZ4V+vRayomjxUsajFMHv1iJ5SiSaEA65LAXze/CzyZXGMXfL2OLzY7wJoaVJ4BgwINuO0dOSAtpNDN6jI+6mQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.7.tgz", + "integrity": "sha512-K+q51KwNU/l0kqRuV5e1824yOLVftj6kGplGQLvJG56P7Rb2dPbM/JeaDbxQhnHT/KDGamG0s0Po0M3pPY163A==", + "license": "MIT", "dependencies": { - "@tiptap/core": "^2.5.9", - "@tiptap/extension-blockquote": "^2.5.9", - "@tiptap/extension-bold": "^2.5.9", - "@tiptap/extension-bullet-list": "^2.5.9", - "@tiptap/extension-code": "^2.5.9", - "@tiptap/extension-code-block": "^2.5.9", - "@tiptap/extension-document": "^2.5.9", - "@tiptap/extension-dropcursor": "^2.5.9", - "@tiptap/extension-gapcursor": "^2.5.9", - "@tiptap/extension-hard-break": "^2.5.9", - "@tiptap/extension-heading": "^2.5.9", - "@tiptap/extension-history": "^2.5.9", - "@tiptap/extension-horizontal-rule": "^2.5.9", - "@tiptap/extension-italic": "^2.5.9", - "@tiptap/extension-list-item": "^2.5.9", - "@tiptap/extension-ordered-list": "^2.5.9", - "@tiptap/extension-paragraph": "^2.5.9", - "@tiptap/extension-strike": "^2.5.9", - "@tiptap/extension-text": "^2.5.9" + "@tiptap/core": "^2.11.7", + "@tiptap/extension-blockquote": "^2.11.7", + "@tiptap/extension-bold": "^2.11.7", + "@tiptap/extension-bullet-list": "^2.11.7", + "@tiptap/extension-code": "^2.11.7", + "@tiptap/extension-code-block": "^2.11.7", + "@tiptap/extension-document": "^2.11.7", + "@tiptap/extension-dropcursor": "^2.11.7", + "@tiptap/extension-gapcursor": "^2.11.7", + "@tiptap/extension-hard-break": "^2.11.7", + "@tiptap/extension-heading": "^2.11.7", + "@tiptap/extension-history": "^2.11.7", + "@tiptap/extension-horizontal-rule": "^2.11.7", + "@tiptap/extension-italic": "^2.11.7", + "@tiptap/extension-list-item": "^2.11.7", + "@tiptap/extension-ordered-list": "^2.11.7", + "@tiptap/extension-paragraph": "^2.11.7", + "@tiptap/extension-strike": "^2.11.7", + "@tiptap/extension-text": "^2.11.7", + "@tiptap/extension-text-style": "^2.11.7", + "@tiptap/pm": "^2.11.7" }, "funding": { "type": "github", @@ -5550,12 +5467,34 @@ "@types/node": "*" } }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, "node_modules/@types/lodash": { "version": "4.17.7", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -5585,60 +5524,36 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", - "dependencies": { - "parchment": "^1.1.2" - } + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.67", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.67.tgz", - "integrity": "sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", + "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-copy-to-clipboard": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.7.tgz", - "integrity": "sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-dom": { - "version": "18.2.22", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", - "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-infinite-scroller": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/react-infinite-scroller/-/react-infinite-scroller-1.2.5.tgz", - "integrity": "sha512-fJU1jhMgoL6NJFrqTM0Ob7tnd2sQWGxe2ESwiU6FZWbJK/VO/Er5+AOhc+e2zbT0dk5pLygqctsulOLJ8xnSzw==", - "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, @@ -5665,11 +5580,6 @@ "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -5684,7 +5594,8 @@ "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -5952,6 +5863,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-alpha/-/react-color-alpha-2.5.1.tgz", "integrity": "sha512-hPsIgsnuOQrqinXt3Gt+87fHudbUvvPW+TpvRY0HS9v4ptFu5UsCc/7DPTVKTaL+p+0oaA6eTbziLzPLRLzgsQ==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-drag-event-interactive": "2.5.1" @@ -5969,6 +5881,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-block/-/react-color-block-2.5.1.tgz", "integrity": "sha512-qvubiV0z0P3OxpNt6o1UQ3CVsjVBY1/n/oz6Gzzxx9YPqSClI04AtFjwOQxF7M17SYqXv+88y77gfEfPIqk5+A==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-editable-input": "2.5.1", @@ -5987,6 +5900,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-chrome/-/react-color-chrome-2.5.1.tgz", "integrity": "sha512-m/CyRaWgmkW5aQTQ8AZwyvopYm+bhvX06uS+ezQjXDYDtjLvq7RbM0JLLNIOyMXke964R58fhoX4G06ZWd8ycA==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1", @@ -6010,6 +5924,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-circle/-/react-color-circle-2.5.1.tgz", "integrity": "sha512-+8zb/Ork1Q5f2bq0jN+GF7OyqY+2ZDYGrdZovN3EBZLMmERbg6TM2+1gTweeFsdiEM/gpteupJpwKpO1aBCocg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-swatch": "2.5.1" @@ -6027,6 +5942,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-colorful/-/react-color-colorful-2.5.1.tgz", "integrity": "sha512-Y/8Y2Kman6IZQpgs4tPTGPuTNr3fJIJxf4f13jll6xuaOsVZeDq9q+DlMErggL+5ICtaBr8gG+w68nCiY+QqKg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1", @@ -6046,6 +5962,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-compact/-/react-color-compact-2.5.1.tgz", "integrity": "sha512-5jHJcXEkjMwcghzCgSBU2rPMVjuuaJ7B6IxypNkafRQ4FkW/6bP9WpPkzcNXCZ/gPvSJ1OMQ+Y600mdO78qG5Q==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-editable-input": "2.5.1", @@ -6065,6 +5982,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-editable-input/-/react-color-editable-input-2.5.1.tgz", "integrity": "sha512-0kr5vQJGPln8LObXwfI2YLiHFz2DW3Atgi51JXlrZUyyaVujXRgMTAc1fz/1RQR6cU2A4bweFaCQljcTsv+Cdg==", + "license": "MIT", "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" }, @@ -6078,6 +5996,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-editable-input-hsla/-/react-color-editable-input-hsla-2.5.1.tgz", "integrity": "sha512-gmnXB6JrYFAd8VN/EfNDJaTdkFHAnUxjzcsQjQyOEr046jDjWgEc/5o2uE1LwIvoJNg9Lo6LYsr37LnFWwsiLw==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-editable-input-rgba": "2.5.1" @@ -6095,6 +6014,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-editable-input-rgba/-/react-color-editable-input-rgba-2.5.1.tgz", "integrity": "sha512-rk6OxL9lTdRI45aNe3GbUghvaELk4knkEf0gvF/mPHxoeE+nNphSrO5gHm3HhoDOgaplp81VP3q4gUwcdjBzvw==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-editable-input": "2.5.1" @@ -6112,6 +6032,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-github/-/react-color-github-2.5.1.tgz", "integrity": "sha512-t05rIy2ifReiVnjv3x+IVlJH7wvwtZugMeouDa/1Y7jIGZswO0zw3zMxz7qfHrzf5NVYWjmEF8QCj85ngv9brg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-swatch": "2.5.1" @@ -6129,6 +6050,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-hue/-/react-color-hue-2.5.1.tgz", "integrity": "sha512-o7mjZhm+U4gHxaBXFxjPINeE3jWfiZAl7RUFqwn4PDZC8wvhU5hEKgJUvcXzErYro0ZYrE1fC/wUHRpI+vcEBg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1" @@ -6146,6 +6068,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-material/-/react-color-material-2.5.1.tgz", "integrity": "sha512-iPB4YfKVTNO1lSIQ16DMdDurDKvGTjv6Qwi/nq47yE3nnhB0YbOFwb/IZbWBS1sCTPx1an7dM2IZ+hYoYcjrXg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-editable-input": "2.5.1", @@ -6179,6 +6102,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-saturation/-/react-color-saturation-2.5.1.tgz", "integrity": "sha512-mQ6eGmn6dUXfScQrb5tP0TBGCpZWzrQuYOAiwK9u31IJaxFwD1NNAzkiienWe4MQkA5zmgz7Ol6FEdLN8K+vGw==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-drag-event-interactive": "2.5.1" @@ -6196,6 +6120,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-shade-slider/-/react-color-shade-slider-2.5.1.tgz", "integrity": "sha512-hrscAmqmy/Od/usUPETaEuvsNRhUGvNArl73d7HK6e6FjbRFPDBq40LkvjETe8BJMbxrBXTMo6dK7DO08lYq9g==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1" @@ -6213,6 +6138,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-sketch/-/react-color-sketch-2.5.1.tgz", "integrity": "sha512-eQgAnlSZvqoTt6frZa/j+tFdaIBEFneIdxEUfidD8hwvyu5OR/WLHnDy/4fYAxhehDp9Ej8eS3ZsCgPACBMOtA==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1", @@ -6235,6 +6161,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-slider/-/react-color-slider-2.5.1.tgz", "integrity": "sha512-2yluI0Akp6UMXTeAJ4CEjL8flhIFpn3xUPsFXbQmBSzMYJygleVFmwhMye8LSA2PCe3UdaqA2cWXxWsTL0FbIg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-color-alpha": "2.5.1" @@ -6252,6 +6179,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-swatch/-/react-color-swatch-2.5.1.tgz", "integrity": "sha512-EQ7UEzxdohfsdpXmcEWNmK/uiznZovEKo6+j3OLrSU5pZGO7pxjR9sQMlscikvd8Mu1Mm3U0E6bJseo2acD4Lg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1" }, @@ -6268,6 +6196,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-color-wheel/-/react-color-wheel-2.5.1.tgz", "integrity": "sha512-e3tDwDoC2T7zTapRRm/QxcOJ7IWJwNCoxZ/f97RL1Ib3gAN/k67H1bkR9TK7euRCUxGy031guxTgdKO9v19XFg==", + "license": "MIT", "dependencies": { "@uiw/color-convert": "2.5.1", "@uiw/react-drag-event-interactive": "2.5.1" @@ -6285,6 +6214,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@uiw/react-drag-event-interactive/-/react-drag-event-interactive-2.5.1.tgz", "integrity": "sha512-GNxhxk5L4O5Gpi20A/BG5sO0GNBNwtNWJidJsJu3pgHUBErN4rhqTDXXu3BQTz5C8yOG5D02Y6Zq/6yu6ckImw==", + "license": "MIT", "funding": { "url": "https://jaywcjlove.github.io/#/sponsor" }, @@ -7657,6 +7587,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7843,11 +7774,6 @@ "node": ">=8" } }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -8108,14 +8034,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -8327,14 +8245,6 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, "node_modules/cordova-plugin-android-permissions": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/cordova-plugin-android-permissions/-/cordova-plugin-android-permissions-1.1.5.tgz", @@ -8501,6 +8411,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", "engines": { "node": ">=4" } @@ -8509,6 +8420,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -8695,25 +8607,6 @@ "node": ">=6" } }, - "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==", - "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", @@ -10093,11 +9986,6 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -10138,7 +10026,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -10213,11 +10102,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "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==" - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -10993,11 +10877,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/hamt_plus": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", - "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -11554,21 +11433,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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==", - "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.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -12248,6 +12112,27 @@ "node": ">=8" } }, + "node_modules/jotai": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.12.3.tgz", + "integrity": "sha512-DpoddSkmPGXMFtdfnoIHfueFeGP643nqYUWC6REjUcME+PG2UkAtYnLbffRDw3OURI9ZUTcRWkRGLsOvxuWMCg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=17.0.0", + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, "node_modules/jpeg-exif": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", @@ -12505,6 +12390,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } @@ -12895,6 +12781,7 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -12961,7 +12848,8 @@ "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -15924,21 +15812,6 @@ "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==", - "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", @@ -16234,11 +16107,6 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, - "node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16478,9 +16346,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -16495,10 +16363,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16507,7 +16376,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/postject": { "version": "1.0.0-alpha.6", @@ -16702,13 +16572,14 @@ } }, "node_modules/prosemirror-commands": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.0.tgz", - "integrity": "sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.10.2" } }, "node_modules/prosemirror-dropcursor": { @@ -16762,12 +16633,14 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.0.tgz", - "integrity": "sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", + "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", + "license": "MIT", "dependencies": { + "@types/markdown-it": "^14.0.0", "markdown-it": "^14.0.0", - "prosemirror-model": "^1.20.0" + "prosemirror-model": "^1.25.0" } }, "node_modules/prosemirror-menu": { @@ -16782,9 +16655,10 @@ } }, "node_modules/prosemirror-model": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz", - "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz", + "integrity": "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==", + "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" } @@ -16818,15 +16692,16 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.4.0.tgz", - "integrity": "sha512-fxryZZkQG12fSCNuZDrYx6Xvo2rLYZTbKLRd8rglOPgNJGMKIS8uvTt6gGC38m7UCu/ENnXIP9pEz5uDaPc+cA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz", + "integrity": "sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==", + "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.25.0", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.3", + "prosemirror-view": "^1.39.1" } }, "node_modules/prosemirror-trailing-node": { @@ -16855,17 +16730,19 @@ } }, "node_modules/prosemirror-transform": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", - "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz", + "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.36.0.tgz", - "integrity": "sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==", + "version": "1.39.2", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.2.tgz", + "integrity": "sha512-BmOkml0QWNob165gyUxXi5K5CVUgVPpqMEAAml/qzgKn9boLUWVPzQ6LtzXw8Cn1GtRQX4ELumPxqtLTDaAKtg==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", @@ -16907,6 +16784,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -16956,42 +16834,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "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/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", - "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/quill-image-resize-module-react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quill-image-resize-module-react/-/quill-image-resize-module-react-3.0.0.tgz", - "integrity": "sha512-3jVChLoXh+fwEELx3OswOEEuF+1KU3r/B9RAqZ//s+d+UMduVZzUepU1g/XoxjKoBJvWD2lJwBIFBRUNb8ebCw==", - "dependencies": { - "lodash": "^4.17.4", - "quill": "^1.2.2", - "raw-loader": "^0.5.1" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -17000,34 +16842,15 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" - }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "dependencies": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" - } - }, "node_modules/react-countdown-circle-timer": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/react-countdown-circle-timer/-/react-countdown-circle-timer-3.2.1.tgz", @@ -17037,15 +16860,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^19.1.0" } }, "node_modules/react-dropzone": { @@ -17096,24 +16919,14 @@ } } }, - "node_modules/react-infinite-scroller": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/react-infinite-scroller/-/react-infinite-scroller-1.2.6.tgz", - "integrity": "sha512-mGdMyOD00YArJ1S1F3TVU9y4fGSfVVl6p5gh/Vt4u99CJOptfVu/q5V/Wlle72TMgYlBwIhbxK5wF0C/R33PXQ==", - "dependencies": { - "prop-types": "^15.5.8" - }, - "peerDependencies": { - "react": "^0.14.9 || ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-intersection-observer": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.0.tgz", - "integrity": "sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", + "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", + "license": "MIT", "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "react-dom": { @@ -17127,14 +16940,15 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-json-view-lite": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.0.1.tgz", - "integrity": "sha512-yElNMSzL7UJ9rMDQIbTiBemXbvfAoqpxM/0IQd3nr52CLLBC0HxOSKcta/bayct2QCq7ZVzLzI8CGfuf387hHw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz", + "integrity": "sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==", + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^18.0.0 || ^19.0.0" } }, "node_modules/react-lifecycles-compat": { @@ -17175,47 +16989,6 @@ "react": "*" } }, - "node_modules/react-quill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", - "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", - "dependencies": { - "@types/quill": "^1.3.10", - "lodash": "^4.17.4", - "quill": "^1.3.7" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", - "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-redux/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/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -17229,6 +17002,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -17241,9 +17015,10 @@ } }, "node_modules/react-virtualized": { - "version": "9.22.5", - "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.5.tgz", - "integrity": "sha512-YqQMRzlVANBv1L/7r63OHa2b0ZsAaDp1UhVNEdUaXI8A5u6hTpA5NYtUueLH2rFuY/27mTGIBl7ZhqFKzw18YQ==", + "version": "9.22.6", + "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.22.6.tgz", + "integrity": "sha512-U5j7KuUQt3AaMatlMJ0UJddqSiX+Km0YJxSqbAzIiGw5EmNz0khMyqP2hzgu4+QUtm+QPIrxzUX4raJxmVJnHg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", "clsx": "^1.0.4", @@ -17253,8 +17028,8 @@ "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0" + "react": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-virtualized/node_modules/clsx": { @@ -17430,25 +17205,6 @@ "node": ">=8.10.0" } }, - "node_modules/recoil": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", - "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==", - "dependencies": { - "hamt_plus": "1.0.2" - }, - "peerDependencies": { - "react": ">=16.13.1" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -17462,19 +17218,6 @@ "node": ">=8" } }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "peerDependencies": { - "redux": "^5.0.0" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -17734,11 +17477,6 @@ "url": "https://github.com/sponsors/jet2jet" } }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -18075,12 +17813,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", @@ -18223,7 +17959,8 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -18500,9 +18237,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -18886,16 +18624,17 @@ } }, "node_modules/styled-components": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", - "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.17.tgz", + "integrity": "sha512-97D7DwWanI7nN24v0D4SvbfjLE9656umNSJZkBkDIWL37aZqG/wRQ+Y9pWtXyBIM/NSfcBzHLErEsqHmJNSVUg==", + "license": "MIT", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", "@types/stylis": "4.2.5", "css-to-react-native": "3.2.0", "csstype": "3.1.3", - "postcss": "8.4.38", + "postcss": "8.4.49", "shallowequal": "1.1.0", "stylis": "4.3.2", "tslib": "2.6.2" @@ -18915,7 +18654,8 @@ "node_modules/styled-components/node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" }, "node_modules/stylis": { "version": "4.2.0", @@ -19265,11 +19005,6 @@ "node": ">=8.0" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -19498,7 +19233,8 @@ "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" }, "node_modules/ufo": { "version": "1.5.3", @@ -19749,11 +19485,12 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/utf8-byte-length": { diff --git a/package.json b/package.json index 3594023..2869cb9 100644 --- a/package.json +++ b/package.json @@ -20,30 +20,28 @@ "@capacitor/core": "^6.1.2", "@capacitor/filesystem": "^6.0.1", "@capacitor/local-notifications": "^6.1.0", - "@chatscope/chat-ui-kit-react": "^2.0.3", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/core": "^6.3.0", + "@dnd-kit/sortable": "^10.0.0", "@electron/packager": "^18.3.6", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.0", "@evva/capacitor-secure-storage-plugin": "^3.0.1", - "@mui/icons-material": "^5.16.4", - "@mui/lab": "^5.0.0-alpha.173", - "@mui/material": "^5.16.7", - "@reduxjs/toolkit": "^2.2.7", - "@tanstack/react-virtual": "^3.10.8", + "@mui/icons-material": "^7.0.1", + "@mui/lab": "^7.0.0-beta.11", + "@mui/material": "^7.0.1", + "@tanstack/react-virtual": "^3.13.6", "@testing-library/jest-dom": "^6.4.6", - "@testing-library/user-event": "^14.5.2", - "@tiptap/extension-color": "^2.5.9", - "@tiptap/extension-highlight": "^2.6.6", - "@tiptap/extension-image": "^2.6.6", - "@tiptap/extension-mention": "^2.9.1", - "@tiptap/extension-placeholder": "^2.6.2", - "@tiptap/extension-text-style": "^2.5.9", - "@tiptap/extension-underline": "^2.6.6", - "@tiptap/pm": "^2.5.9", - "@tiptap/react": "^2.5.9", - "@tiptap/starter-kit": "^2.5.9", + "@testing-library/user-event": "^14.6.1", + "@tiptap/extension-color": "^2.11.7", + "@tiptap/extension-highlight": "^2.11.7", + "@tiptap/extension-image": "^2.11.7", + "@tiptap/extension-mention": "^2.11.7", + "@tiptap/extension-placeholder": "^2.11.7", + "@tiptap/extension-text-style": "^2.11.7", + "@tiptap/extension-underline": "^2.11.7", + "@tiptap/pm": "^2.11.7", + "@tiptap/react": "^2.11.7", + "@tiptap/starter-kit": "^2.11.7", "@transistorsoft/capacitor-background-fetch": "^6.0.1", "@types/chrome": "^0.0.263", "@uiw/react-color": "^2.5.1", @@ -66,30 +64,25 @@ "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", "i18next-localstorage-backend": "^4.2.0", + "jotai": "^2.12.3", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", "mime": "^4.0.4", "moment": "^2.30.1", "npm": "^10.8.3", - "quill-image-resize-module-react": "^3.0.0", - "react": "^18.2.0", - "react-copy-to-clipboard": "^5.1.0", + "react": "^19.1.0", "react-countdown-circle-timer": "^3.2.1", - "react-dom": "^18.2.0", + "react-dom": "^19.1.0", "react-dropzone": "^14.2.3", "react-frame-component": "^5.2.7", "react-i18next": "^15.4.1", - "react-infinite-scroller": "^1.2.6", - "react-intersection-observer": "^9.13.0", - "react-json-view-lite": "^2.0.1", + "react-intersection-observer": "^9.16.0", + "react-json-view-lite": "^2.4.1", "react-loader-spinner": "^6.1.6", "react-qr-code": "^2.0.15", - "react-quill": "^2.0.0", - "react-redux": "^9.1.2", - "react-virtualized": "^9.22.5", + "react-virtualized": "^9.22.6", "react-virtuoso": "^4.10.4", - "recoil": "^0.7.7", "short-unique-id": "^5.2.0", "slate": "^0.103.0", "slate-react": "^0.109.0", @@ -101,14 +94,12 @@ "vite-plugin-wasm": "^3.3.0" }, "devDependencies": { - "@testing-library/dom": "^10.3.0", - "@testing-library/react": "^16.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.3.0", "@types/dompurify": "^3.0.5", "@types/lodash": "^4.17.7", - "@types/react": "^18.2.64", - "@types/react-copy-to-clipboard": "^5.0.7", - "@types/react-dom": "^18.2.21", - "@types/react-infinite-scroller": "^1.2.5", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.0", "@types/react-virtualized": "^9.21.30", "@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/parser": "^7.1.1", @@ -122,5 +113,11 @@ "typescript": "^5.2.2", "vite": "^5.1.6", "vitest": "^1.6.1" + }, + "overrides": { + "react-loader-spinner": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } } } diff --git a/src/App.tsx b/src/App.tsx index b711dc2..74f5dee 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -33,7 +33,6 @@ import DownloadIcon from '@mui/icons-material/Download'; import ltcLogo from './assets/ltc.png'; import PersonSearchIcon from '@mui/icons-material/PersonSearch'; import qortLogo from './assets/qort.png'; -import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Return } from './assets/Icons/Return.tsx'; import WarningIcon from '@mui/icons-material/Warning'; import './utils/seedPhrase/RandomSentenceGenerator'; @@ -96,7 +95,6 @@ import { Settings } from './components/Group/Settings'; import { MainAvatar } from './components/MainAvatar'; import { useRetrieveDataLocalStorage } from './useRetrieveDataLocalStorage'; import { useQortalGetSaveSettings } from './useQortalGetSaveSettings'; -import { useRecoilState, useResetRecoilState, useSetRecoilState } from 'recoil'; import { canSaveSettingToQdnAtom, enabledDevModeAtom, @@ -142,6 +140,8 @@ import LanguageSelector from './components/Language/LanguageSelector.tsx'; import { DownloadWallet } from './components/Auth/DownloadWallet.tsx'; import { CopyIcon } from './assets/Icons/CopyIcon.tsx'; import { SuccessIcon } from './assets/Icons/SuccessIcon.tsx'; +import { useAtom, useSetAtom } from 'jotai'; +import { useResetAtom } from 'jotai/utils'; type extStates = | 'not-authenticated' @@ -330,9 +330,10 @@ function App() { const [txList, setTxList] = useState([]); const [memberGroups, setMemberGroups] = useState([]); const [isFocused, setIsFocused] = useState(true); - const [hasSettingsChanged, setHasSettingsChanged] = useRecoilState( + const [hasSettingsChanged, setHasSettingsChanged] = useAtom( hasSettingsChangedAtom ); + const balanceSetIntervalRef = useRef(null); const { downloadResource } = useFetchResources(); const holdRefExtState = useRef('not-authenticated'); @@ -405,9 +406,10 @@ function App() { const qortalRequestCheckbox1Ref = useRef(null); useRetrieveDataLocalStorage(userInfo?.address); useQortalGetSaveSettings(userInfo?.name, extState === 'authenticated'); - const [isEnabledDevMode, setIsEnabledDevMode] = - useRecoilState(enabledDevModeAtom); - const setIsDisabledEditorEnter = useSetRecoilState(isDisabledEditorEnterAtom); + const setIsEnabledDevMode = useSetAtom(enabledDevModeAtom); + + const setIsDisabledEditorEnter = useSetAtom(isDisabledEditorEnterAtom); + const [isOpenMinting, setIsOpenMinting] = useState(false); const generatorRef = useRef(null); @@ -453,45 +455,33 @@ function App() { }, [extState, walletToBeDownloaded, shownTutorialsInitiated]); //resets for recoil - const resetAtomSortablePinnedAppsAtom = useResetRecoilState( - sortablePinnedAppsAtom - ); - - const resetAtomIsUsingImportExportSettingsAtom = useResetRecoilState( + const resetAtomSortablePinnedAppsAtom = useResetAtom(sortablePinnedAppsAtom); + const resetAtomIsUsingImportExportSettingsAtom = useResetAtom( isUsingImportExportSettingsAtom ); - const resetAtomCanSaveSettingToQdnAtom = useResetRecoilState( + const resetAtomCanSaveSettingToQdnAtom = useResetAtom( canSaveSettingToQdnAtom ); - - const resetAtomSettingsQDNLastUpdatedAtom = useResetRecoilState( + const resetAtomSettingsQDNLastUpdatedAtom = useResetAtom( settingsQDNLastUpdatedAtom ); - - const resetAtomSettingsLocalLastUpdatedAtom = useResetRecoilState( + const resetAtomSettingsLocalLastUpdatedAtom = useResetAtom( settingsLocalLastUpdatedAtom ); - - const resetAtomOldPinnedAppsAtom = useResetRecoilState(oldPinnedAppsAtom); - const resetAtomQMailLastEnteredTimestampAtom = useResetRecoilState( + const resetAtomOldPinnedAppsAtom = useResetAtom(oldPinnedAppsAtom); + const resetAtomQMailLastEnteredTimestampAtom = useResetAtom( qMailLastEnteredTimestampAtom ); - - const resetAtomMailsAtom = useResetRecoilState(mailsAtom); - const resetGroupPropertiesAtom = useResetRecoilState(groupsPropertiesAtom); - const resetLastPaymentSeenTimestampAtom = useResetRecoilState( + const resetAtomMailsAtom = useResetAtom(mailsAtom); + const resetGroupPropertiesAtom = useResetAtom(groupsPropertiesAtom); + const resetLastPaymentSeenTimestampAtom = useResetAtom( lastPaymentSeenTimestampAtom ); - const resetGroupsOwnerNamesAtom = useResetRecoilState(groupsOwnerNamesAtom); - const resetGroupAnnouncementsAtom = useResetRecoilState( - groupAnnouncementsAtom - ); - const resetMutedGroupsAtom = useResetRecoilState(mutedGroupsAtom); - - const resetGroupChatTimestampsAtom = useResetRecoilState( - groupChatTimestampsAtom - ); - const resetTimestampEnterAtom = useResetRecoilState(timestampEnterDataAtom); + const resetGroupsOwnerNamesAtom = useResetAtom(groupsOwnerNamesAtom); + const resetGroupAnnouncementsAtom = useResetAtom(groupAnnouncementsAtom); + const resetMutedGroupsAtom = useResetAtom(mutedGroupsAtom); + const resetGroupChatTimestampsAtom = useResetAtom(groupChatTimestampsAtom); + const resetTimestampEnterAtom = useResetAtom(timestampEnterDataAtom); const resetAllRecoil = () => { resetAtomSortablePinnedAppsAtom(); @@ -1314,13 +1304,23 @@ function App() { - + { + if (rawWallet?.ltcAddress) { + navigator.clipboard + .writeText(rawWallet.ltcAddress) + .catch((err) => { + console.error('Failed to copy LTC address:', err); + }); + } + }} + > {rawWallet?.ltcAddress?.slice(0, 6)}... {rawWallet?.ltcAddress?.slice(-4)}{' '} - + @@ -1380,13 +1380,24 @@ function App() { - + { + if (rawWallet?.address0) { + navigator.clipboard + .writeText(rawWallet.address0) + .catch((err) => { + console.error('Failed to copy address:', err); + }); + } + }} + > {rawWallet?.address0?.slice(0, 6)}... {rawWallet?.address0?.slice(-4)}{' '} - + + {qortBalanceLoading && ( diff --git a/src/atoms/global.ts b/src/atoms/global.ts index d20b56c..8f4c6d5 100644 --- a/src/atoms/global.ts +++ b/src/atoms/global.ts @@ -1,273 +1,80 @@ -import { atom, selectorFamily } from 'recoil'; +import { atom } from 'jotai'; +import { atomWithReset, atomFamily } from 'jotai/utils'; -export const sortablePinnedAppsAtom = atom({ - key: 'sortablePinnedAppsFromAtom', - default: [ - { - name: 'Q-Tube', - service: 'APP', - }, - { - name: 'Q-Mail', - service: 'APP', - }, - { - name: 'Q-Share', - service: 'APP', - }, - { - name: 'Q-Fund', - service: 'APP', - }, - { - name: 'Q-Shop', - service: 'APP', - }, - { - name: 'Q-Trade', - service: 'APP', - }, - { - name: 'Q-Support', - service: 'APP', - }, - { - name: 'Q-Manager', - service: 'APP', - }, - { - name: 'Q-Blog', - service: 'APP', - }, - { - name: 'Q-Mintership', - service: 'APP', - }, - { - name: 'Q-Wallets', - service: 'APP', - }, - { - name: 'Q-Search', - service: 'APP', - }, - { - name: 'Q-Nodecontrol', - service: 'APP', - }, - ], -}); +// Atoms (resettable) +export const sortablePinnedAppsAtom = atomWithReset([ + { name: 'Q-Tube', service: 'APP' }, + { name: 'Q-Mail', service: 'APP' }, + { name: 'Q-Share', service: 'APP' }, + { name: 'Q-Fund', service: 'APP' }, + { name: 'Q-Shop', service: 'APP' }, + { name: 'Q-Trade', service: 'APP' }, + { name: 'Q-Support', service: 'APP' }, + { name: 'Q-Manager', service: 'APP' }, + { name: 'Q-Blog', service: 'APP' }, + { name: 'Q-Mintership', service: 'APP' }, + { name: 'Q-Wallets', service: 'APP' }, + { name: 'Q-Search', service: 'APP' }, + { name: 'Q-Nodecontrol', service: 'APP' }, +]); -export const canSaveSettingToQdnAtom = atom({ - key: 'canSaveSettingToQdnAtom', - default: false, -}); +export const canSaveSettingToQdnAtom = atomWithReset(false); +export const settingsQDNLastUpdatedAtom = atomWithReset(-100); +export const settingsLocalLastUpdatedAtom = atomWithReset(0); +export const oldPinnedAppsAtom = atomWithReset([]); +export const isUsingImportExportSettingsAtom = atomWithReset(null); +export const fullScreenAtom = atomWithReset(false); +export const hasSettingsChangedAtom = atomWithReset(false); +export const navigationControllerAtom = atomWithReset({}); +export const enabledDevModeAtom = atomWithReset(false); +export const myGroupsWhereIAmAdminAtom = atomWithReset([]); +export const promotionTimeIntervalAtom = atomWithReset(0); +export const promotionsAtom = atomWithReset([]); +export const resourceDownloadControllerAtom = atomWithReset({}); +export const blobControllerAtom = atomWithReset({}); +export const selectedGroupIdAtom = atomWithReset(null); +export const addressInfoControllerAtom = atomWithReset({}); +export const isDisabledEditorEnterAtom = atomWithReset(false); +export const qMailLastEnteredTimestampAtom = atomWithReset(null); +export const lastPaymentSeenTimestampAtom = atomWithReset(null); +export const mailsAtom = atomWithReset([]); +export const groupsPropertiesAtom = atomWithReset({}); +export const groupsOwnerNamesAtom = atomWithReset({}); +export const isOpenBlockedModalAtom = atomWithReset(false); +export const groupAnnouncementsAtom = atomWithReset({}); +export const mutedGroupsAtom = atomWithReset([]); +export const groupChatTimestampsAtom = atomWithReset({}); +export const timestampEnterDataAtom = atomWithReset({}); -export const settingsQDNLastUpdatedAtom = atom({ - key: 'settingsQDNLastUpdatedAtom', - default: -100, -}); +// Atom Families (replacing selectorFamily) +export const resourceKeySelector = atomFamily((key) => + atom((get) => get(resourceDownloadControllerAtom)[key] || null) +); -export const settingsLocalLastUpdatedAtom = atom({ - key: 'settingsLocalLastUpdatedAtom', - default: 0, -}); +export const blobKeySelector = atomFamily((key) => + atom((get) => get(blobControllerAtom)[key] || null) +); -export const oldPinnedAppsAtom = atom({ - key: 'oldPinnedAppsAtom', - default: [], -}); +export const addressInfoKeySelector = atomFamily((key) => + atom((get) => get(addressInfoControllerAtom)[key] || null) +); -export const isUsingImportExportSettingsAtom = atom({ - key: 'isUsingImportExportSettingsAtom', - default: null, -}); +export const groupsOwnerNamesSelector = atomFamily((key) => + atom((get) => get(groupsOwnerNamesAtom)[key] || null) +); -export const fullScreenAtom = atom({ - key: 'fullScreenAtom', - default: false, -}); +export const groupAnnouncementSelector = atomFamily((key) => + atom((get) => get(groupAnnouncementsAtom)[key] || null) +); -export const hasSettingsChangedAtom = atom({ - key: 'hasSettingsChangedAtom', - default: false, -}); +export const groupPropertySelector = atomFamily((key) => + atom((get) => get(groupsPropertiesAtom)[key] || null) +); -export const navigationControllerAtom = atom({ - key: 'navigationControllerAtom', - default: {}, -}); +export const groupChatTimestampSelector = atomFamily((key) => + atom((get) => get(groupChatTimestampsAtom)[key] || null) +); -export const enabledDevModeAtom = atom({ - key: 'enabledDevModeAtom', - default: false, -}); - -export const myGroupsWhereIAmAdminAtom = atom({ - key: 'myGroupsWhereIAmAdminAtom', - default: [], -}); - -export const promotionTimeIntervalAtom = atom({ - key: 'promotionTimeIntervalAtom', - default: 0, -}); - -export const promotionsAtom = atom({ - key: 'promotionsAtom', - default: [], -}); - -export const resourceDownloadControllerAtom = atom({ - key: 'resourceDownloadControllerAtom', - default: {}, -}); - -export const resourceKeySelector = selectorFamily({ - key: 'resourceKeySelector', - get: - (key) => - ({ get }) => { - const resources = get(resourceDownloadControllerAtom); - return resources[key] || null; // Return the value for the key or null if not found - }, -}); - -export const blobControllerAtom = atom({ - key: 'blobControllerAtom', - default: {}, -}); - -export const blobKeySelector = selectorFamily({ - key: 'blobKeySelector', - get: - (key) => - ({ get }) => { - const blobs = get(blobControllerAtom); - return blobs[key] || null; // Return the value for the key or null if not found - }, -}); - -export const selectedGroupIdAtom = atom({ - key: 'selectedGroupIdAtom', - default: null, -}); - -export const addressInfoControllerAtom = atom({ - key: 'addressInfoControllerAtom', - default: {}, -}); - -export const addressInfoKeySelector = selectorFamily({ - key: 'addressInfoKeySelector', - get: - (key) => - ({ get }) => { - const userInfo = get(addressInfoControllerAtom); - return userInfo[key] || null; // Return the value for the key or null if not found - }, -}); - -export const isDisabledEditorEnterAtom = atom({ - key: 'isDisabledEditorEnterAtom', - default: false, -}); - -export const qMailLastEnteredTimestampAtom = atom({ - key: 'qMailLastEnteredTimestampAtom', - default: null, -}); - -export const lastPaymentSeenTimestampAtom = atom({ - key: 'lastPaymentSeenTimestampAtom', - default: null, -}); - -export const mailsAtom = atom({ - key: 'mailsAtom', - default: [], -}); - -export const groupsPropertiesAtom = atom({ - key: 'groupsPropertiesAtom', - default: {}, -}); -export const groupsOwnerNamesAtom = atom({ - key: 'groupsOwnerNamesAtom', - default: {}, -}); - -export const isOpenBlockedModalAtom = atom({ - key: 'isOpenBlockedModalAtom', - default: false, -}); - -export const groupsOwnerNamesSelector = selectorFamily({ - key: 'groupsOwnerNamesSelector', - get: - (key) => - ({ get }) => { - const data = get(groupsOwnerNamesAtom); - return data[key] || null; // Return the value for the key or null if not found - }, -}); - -export const groupAnnouncementsAtom = atom({ - key: 'groupAnnouncementsAtom', - default: {}, -}); - -export const groupAnnouncementSelector = selectorFamily({ - key: 'groupAnnouncementSelector', - get: - (key) => - ({ get }) => { - const data = get(groupAnnouncementsAtom); - return data[key] || null; // Return the value for the key or null if not found - }, -}); - -export const groupPropertySelector = selectorFamily({ - key: 'groupPropertySelector', - get: - (key) => - ({ get }) => { - const data = get(groupsPropertiesAtom); - return data[key] || null; // Return the value for the key or null if not found - }, -}); - -export const mutedGroupsAtom = atom({ - key: 'mutedGroupsAtom', - default: [], -}); - -export const groupChatTimestampsAtom = atom({ - key: 'groupChatTimestampsAtom', - default: {}, -}); - -export const groupChatTimestampSelector = selectorFamily({ - key: 'groupChatTimestampSelector', - get: - (key) => - ({ get }) => { - const data = get(groupChatTimestampsAtom); - return data[key] || null; // Return the value for the key or null if not found - }, -}); - -export const timestampEnterDataAtom = atom({ - key: 'timestampEnterDataAtom', - default: {}, -}); - -export const timestampEnterDataSelector = selectorFamily({ - key: 'timestampEnterDataSelector', - get: - (key) => - ({ get }) => { - const data = get(timestampEnterDataAtom); - return data[key] || null; // Return the value for the key or null if not found - }, -}); +export const timestampEnterDataSelector = atomFamily((key) => + atom((get) => get(timestampEnterDataAtom)[key] || null) +); diff --git a/src/common/useFetchResources.tsx b/src/common/useFetchResources.tsx index 1a4cbd8..cc2ab41 100644 --- a/src/common/useFetchResources.tsx +++ b/src/common/useFetchResources.tsx @@ -1,168 +1,167 @@ import React, { useCallback, useRef } from 'react'; -import { useRecoilState } from 'recoil'; import { resourceDownloadControllerAtom } from '../atoms/global'; import { getBaseApiReact } from '../App'; +import { useSetAtom } from 'jotai'; export const useFetchResources = () => { - const [resources, setResources] = useRecoilState(resourceDownloadControllerAtom); + const setResources = useSetAtom(resourceDownloadControllerAtom); - const downloadResource = useCallback(({ service, name, identifier }, build) => { - setResources((prev) => ({ - ...prev, - [`${service}-${name}-${identifier}`]: { - ...(prev[`${service}-${name}-${identifier}`] || {}), - service, - name, - identifier, - }, - })); + const downloadResource = useCallback( + ({ service, name, identifier }, build) => { + setResources((prev) => ({ + ...prev, + [`${service}-${name}-${identifier}`]: { + ...(prev[`${service}-${name}-${identifier}`] || {}), + service, + name, + identifier, + }, + })); - try { - let isCalling = false; - let percentLoaded = 0; - let timer = 24; - let tries = 0; - let calledFirstTime = false - let intervalId - let timeoutId - const callFunction = async ()=> { - if (isCalling) return; - isCalling = true; + try { + let isCalling = false; + let percentLoaded = 0; + let timer = 24; + let tries = 0; + let calledFirstTime = false; + let intervalId; + let timeoutId; + const callFunction = async () => { + if (isCalling) return; + isCalling = true; - - - let res - - if(!build){ + let res; + + if (!build) { const urlFirstTime = `${getBaseApiReact()}/arbitrary/resource/status/${service}/${name}/${identifier}`; const resCall = await fetch(urlFirstTime, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - res = await resCall.json() - if(tries > 18 ){ - if(intervalId){ - clearInterval(intervalId) - } - if(timeoutId){ - clearTimeout(timeoutId) - } - setResources((prev) => ({ - ...prev, - [`${service}-${name}-${identifier}`]: { - ...(prev[`${service}-${name}-${identifier}`] || {}), - status: { - ...res, - status: 'FAILED_TO_DOWNLOAD', - }, - }, - })); - return - } - tries = tries + 1 - - } - - - if(build || (calledFirstTime === false && res?.status !== 'READY')){ - const url = `${getBaseApiReact()}/arbitrary/resource/properties/${service}/${name}/${identifier}?build=true`; - const resCall = await fetch(url, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - res = await resCall.json(); - - } - calledFirstTime = true - isCalling = false; - - if (res.localChunkCount) { - if (res.percentLoaded) { - if (res.percentLoaded === percentLoaded && res.percentLoaded !== 100) { - timer = timer - 5; - } else { - timer = 24; - } - - if (timer < 0) { - timer = 24; - isCalling = true; - - // Update Recoil state for refetching + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + res = await resCall.json(); + if (tries > 18) { + if (intervalId) { + clearInterval(intervalId); + } + if (timeoutId) { + clearTimeout(timeoutId); + } setResources((prev) => ({ ...prev, [`${service}-${name}-${identifier}`]: { ...(prev[`${service}-${name}-${identifier}`] || {}), status: { ...res, - status: 'REFETCHING', + status: 'FAILED_TO_DOWNLOAD', }, }, })); - - timeoutId = setTimeout(() => { - isCalling = false; - downloadResource({ name, service, identifier }, true); - }, 25000); - return; } - - percentLoaded = res.percentLoaded; + tries = tries + 1; } - // Update Recoil state for progress - setResources((prev) => ({ - ...prev, - [`${service}-${name}-${identifier}`]: { - ...(prev[`${service}-${name}-${identifier}`] || {}), - status: res, - }, - })); - } - - // Check if progress is 100% and clear interval if true - if (res?.status === 'READY') { - if(intervalId){ - clearInterval(intervalId); - - } - if(timeoutId){ - clearTimeout(timeoutId) - } - // Update Recoil state for completion - setResources((prev) => ({ - ...prev, - [`${service}-${name}-${identifier}`]: { - ...(prev[`${service}-${name}-${identifier}`] || {}), - status: res, - }, - })); - } - if(res?.status === 'DOWNLOADED'){ - const url = `${getBaseApiReact()}/arbitrary/resource/status/${service}/${name}/${identifier}?build=true`; - const resCall = await fetch(url, { - method: "GET", + if (build || (calledFirstTime === false && res?.status !== 'READY')) { + const url = `${getBaseApiReact()}/arbitrary/resource/properties/${service}/${name}/${identifier}?build=true`; + const resCall = await fetch(url, { + method: 'GET', headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, }); - res = await resCall.json(); - } + res = await resCall.json(); + } + calledFirstTime = true; + isCalling = false; + + if (res.localChunkCount) { + if (res.percentLoaded) { + if ( + res.percentLoaded === percentLoaded && + res.percentLoaded !== 100 + ) { + timer = timer - 5; + } else { + timer = 24; + } + + if (timer < 0) { + timer = 24; + isCalling = true; + + // Update Recoil state for refetching + setResources((prev) => ({ + ...prev, + [`${service}-${name}-${identifier}`]: { + ...(prev[`${service}-${name}-${identifier}`] || {}), + status: { + ...res, + status: 'REFETCHING', + }, + }, + })); + + timeoutId = setTimeout(() => { + isCalling = false; + downloadResource({ name, service, identifier }, true); + }, 25000); + + return; + } + + percentLoaded = res.percentLoaded; + } + + // Update Recoil state for progress + setResources((prev) => ({ + ...prev, + [`${service}-${name}-${identifier}`]: { + ...(prev[`${service}-${name}-${identifier}`] || {}), + status: res, + }, + })); + } + + // Check if progress is 100% and clear interval if true + if (res?.status === 'READY') { + if (intervalId) { + clearInterval(intervalId); + } + if (timeoutId) { + clearTimeout(timeoutId); + } + // Update Recoil state for completion + setResources((prev) => ({ + ...prev, + [`${service}-${name}-${identifier}`]: { + ...(prev[`${service}-${name}-${identifier}`] || {}), + status: res, + }, + })); + } + if (res?.status === 'DOWNLOADED') { + const url = `${getBaseApiReact()}/arbitrary/resource/status/${service}/${name}/${identifier}?build=true`; + const resCall = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + res = await resCall.json(); + } + }; + callFunction(); + intervalId = setInterval(async () => { + callFunction(); + }, 5000); + } catch (error) { + console.error('Error during resource fetch:', error); } - callFunction() - intervalId = setInterval(async () => { - callFunction() - }, 5000); - - } catch (error) { - console.error('Error during resource fetch:', error); - } - }, [setResources]); + }, + [setResources] + ); return { downloadResource }; }; diff --git a/src/components/Apps/AppInfo.tsx b/src/components/Apps/AppInfo.tsx index 17f9b7e..6dc8c37 100644 --- a/src/components/Apps/AppInfo.tsx +++ b/src/components/Apps/AppInfo.tsx @@ -28,21 +28,21 @@ import { sortablePinnedAppsAtom, } from '../../atoms/global'; import { saveToLocalStorage } from './AppsNavBarDesktop'; -import { useRecoilState, useSetRecoilState } from 'recoil'; + +import { useAtom, useSetAtom } from 'jotai'; export const AppInfo = ({ app, myName }) => { const isInstalled = app?.status?.status === 'READY'; - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( + const [sortablePinnedApps, setSortablePinnedApps] = useAtom( sortablePinnedAppsAtom ); + const theme = useTheme(); const isSelectedAppPinned = !!sortablePinnedApps?.find( (item) => item?.name === app?.name && item?.service === app?.service ); - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); return ( { const isInstalled = app?.status?.status === 'READY'; - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( + const [sortablePinnedApps, setSortablePinnedApps] = useAtom( sortablePinnedAppsAtom ); + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); const isSelectedAppPinned = !!sortablePinnedApps?.find( (item) => item?.name === app?.name && item?.service === app?.service ); - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); + const theme = useTheme(); return ( diff --git a/src/components/Apps/AppViewer.tsx b/src/components/Apps/AppViewer.tsx index 723db86..e76467b 100644 --- a/src/components/Apps/AppViewer.tsx +++ b/src/components/Apps/AppViewer.tsx @@ -74,15 +74,18 @@ export const AppViewer = React.forwardRef( }, [app, path, isDevMode]); useEffect(() => { - if (!iframeRef?.current) return; - const targetOrigin = iframeRef.current - ? new URL(iframeRef.current.src).origin - : '*'; - // Send the navigation command after setting up the listener and timeout - iframeRef.current.contentWindow.postMessage( - { action: 'THEME_CHANGED', theme: themeMode, requestedHandler: 'UI' }, - targetOrigin - ); + const iframe = iframeRef?.current; + if (!iframe) return; + + try { + const targetOrigin = new URL(iframe.src).origin; + iframe.contentWindow?.postMessage( + { action: 'THEME_CHANGED', theme: themeMode, requestedHandler: 'UI' }, + targetOrigin + ); + } catch (err) { + console.error('Failed to send theme change to iframe:', err); + } }, [themeMode]); const removeTrailingSlash = (str) => str.replace(/\/$/, ''); diff --git a/src/components/Apps/AppsDesktop.tsx b/src/components/Apps/AppsDesktop.tsx index 1fc8f65..13bbf7d 100644 --- a/src/components/Apps/AppsDesktop.tsx +++ b/src/components/Apps/AppsDesktop.tsx @@ -20,11 +20,11 @@ import { HomeIcon } from '../../assets/Icons/HomeIcon'; import { MessagingIcon } from '../../assets/Icons/MessagingIcon'; import { Save } from '../Save/Save'; import { IconWrapper } from '../Desktop/DesktopFooter'; -import { useRecoilState } from 'recoil'; import { enabledDevModeAtom } from '../../atoms/global'; import { AppsIcon } from '../../assets/Icons/AppsIcon'; import { CoreSyncStatus } from '../CoreSyncStatus'; import { MessagingIconFilled } from '../../assets/Icons/MessagingIconFilled'; +import { useAtom } from 'jotai'; const uid = new ShortUniqueId({ length: 8 }); @@ -47,8 +47,8 @@ export const AppsDesktop = ({ const [isNewTabWindow, setIsNewTabWindow] = useState(false); const [categories, setCategories] = useState([]); const iframeRefs = useRef({}); - const [isEnabledDevMode, setIsEnabledDevMode] = - useRecoilState(enabledDevModeAtom); + const [isEnabledDevMode, setIsEnabledDevMode] = useAtom(enabledDevModeAtom); + const { showTutorial } = useContext(GlobalContext); const theme = useTheme(); diff --git a/src/components/Apps/AppsDevModeNavBar.tsx b/src/components/Apps/AppsDevModeNavBar.tsx index bcc8811..1c0422a 100644 --- a/src/components/Apps/AppsDevModeNavBar.tsx +++ b/src/components/Apps/AppsDevModeNavBar.tsx @@ -13,16 +13,17 @@ import { unsubscribeFromEvent, } from '../../utils/events'; import RefreshIcon from '@mui/icons-material/Refresh'; -import { useRecoilState } from 'recoil'; import { navigationControllerAtom } from '../../atoms/global'; import { AppsDevModeTabComponent } from './AppsDevModeTabComponent'; +import { useAtom } from 'jotai'; export const AppsDevModeNavBar = () => { const [tabs, setTabs] = useState([]); const [selectedTab, setSelectedTab] = useState(null); - const [navigationController, setNavigationController] = useRecoilState( + const [navigationController, setNavigationController] = useAtom( navigationControllerAtom ); + const theme = useTheme(); const [isNewTabWindow, setIsNewTabWindow] = useState(false); const tabsRef = useRef(null); diff --git a/src/components/Apps/AppsNavBarDesktop.tsx b/src/components/Apps/AppsNavBarDesktop.tsx index a274abf..8d45604 100644 --- a/src/components/Apps/AppsNavBarDesktop.tsx +++ b/src/components/Apps/AppsNavBarDesktop.tsx @@ -26,12 +26,12 @@ import { import TabComponent from './TabComponent'; import PushPinIcon from '@mui/icons-material/PushPin'; import RefreshIcon from '@mui/icons-material/Refresh'; -import { useRecoilState, useSetRecoilState } from 'recoil'; import { navigationControllerAtom, settingsLocalLastUpdatedAtom, sortablePinnedAppsAtom, } from '../../atoms/global'; +import { useAtom, useSetAtom } from 'jotai'; export function saveToLocalStorage(key, subKey, newValue) { try { @@ -67,22 +67,21 @@ export function saveToLocalStorage(key, subKey, newValue) { export const AppsNavBarDesktop = ({ disableBack }) => { const [tabs, setTabs] = useState([]); const [selectedTab, setSelectedTab] = useState(null); - const [navigationController, setNavigationController] = useRecoilState( + const [navigationController, setNavigationController] = useAtom( navigationControllerAtom ); + const [sortablePinnedApps, setSortablePinnedApps] = useAtom( + sortablePinnedAppsAtom + ); + const theme = useTheme(); const [isNewTabWindow, setIsNewTabWindow] = useState(false); const tabsRef = useRef(null); const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( - sortablePinnedAppsAtom - ); - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); const handleClick = (event) => { setAnchorEl(event.currentTarget); diff --git a/src/components/Apps/AppsPrivate.tsx b/src/components/Apps/AppsPrivate.tsx index 4a39b63..78db4ad 100644 --- a/src/components/Apps/AppsPrivate.tsx +++ b/src/components/Apps/AppsPrivate.tsx @@ -15,7 +15,6 @@ import { } from '@mui/material'; import { useDropzone } from 'react-dropzone'; import { useHandlePrivateApps } from './useHandlePrivateApps'; -import { useRecoilState } from 'recoil'; import { groupsPropertiesAtom, myGroupsWhereIAmAdminAtom, @@ -35,6 +34,7 @@ import { MyContext } from '../../App'; import { fileToBase64 } from '../../utils/fileReading'; import { objectToBase64 } from '../../qdn/encryption/group-encryption'; import { getFee } from '../../background'; +import { useAtom } from 'jotai'; const maxFileSize = 50 * 1024 * 1024; // 50MB @@ -44,11 +44,10 @@ export const AppsPrivate = ({ myName }) => { const [logo, setLogo] = useState(null); const [qortalUrl, setQortalUrl] = useState(''); const [selectedGroup, setSelectedGroup] = useState(0); - const [groupsProperties] = useRecoilState(groupsPropertiesAtom); + const [valueTabPrivateApp, setValueTabPrivateApp] = useState(0); - const [myGroupsWhereIAmAdminFromGlobal] = useRecoilState( - myGroupsWhereIAmAdminAtom - ); + const [groupsProperties] = useAtom(groupsPropertiesAtom); + const [myGroupsWhereIAmAdminFromGlobal] = useAtom(myGroupsWhereIAmAdminAtom); const myGroupsWhereIAmAdmin = useMemo(() => { return myGroupsWhereIAmAdminFromGlobal?.filter( diff --git a/src/components/Apps/SortablePinnedApps.tsx b/src/components/Apps/SortablePinnedApps.tsx index f9a24a7..72e42df 100644 --- a/src/components/Apps/SortablePinnedApps.tsx +++ b/src/components/Apps/SortablePinnedApps.tsx @@ -22,11 +22,11 @@ import { settingsLocalLastUpdatedAtom, sortablePinnedAppsAtom, } from '../../atoms/global'; -import { useRecoilState, useSetRecoilState } from 'recoil'; import { saveToLocalStorage } from './AppsNavBarDesktop'; import { ContextMenuPinnedApps } from '../ContextMenuPinnedApps'; import LockIcon from '@mui/icons-material/Lock'; import { useHandlePrivateApps } from './useHandlePrivateApps'; +import { useAtom, useSetAtom } from 'jotai'; const SortableItem = ({ id, name, app, isDesktop }) => { const { openApp } = useHandlePrivateApps(); @@ -137,10 +137,8 @@ export const SortablePinnedApps = ({ myApp, availableQapps = [], }) => { - const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom); - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); + const [pinnedApps, setPinnedApps] = useAtom(sortablePinnedAppsAtom); + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); const transformPinnedApps = useMemo(() => { // Clone the existing pinned apps list diff --git a/src/components/Apps/useHandlePrivateApps.tsx b/src/components/Apps/useHandlePrivateApps.tsx index 2eaa5f9..9a324bb 100644 --- a/src/components/Apps/useHandlePrivateApps.tsx +++ b/src/components/Apps/useHandlePrivateApps.tsx @@ -1,49 +1,44 @@ -import React, { useContext, useState } from "react"; -import { executeEvent } from "../../utils/events"; -import { getBaseApiReact, MyContext } from "../../App"; -import { createEndpoint } from "../../background"; -import { useRecoilState, useSetRecoilState } from "recoil"; +import React, { useContext, useState } from 'react'; +import { executeEvent } from '../../utils/events'; +import { getBaseApiReact, MyContext } from '../../App'; +import { createEndpoint } from '../../background'; import { settingsLocalLastUpdatedAtom, sortablePinnedAppsAtom, -} from "../../atoms/global"; -import { saveToLocalStorage } from "./AppsNavBarDesktop"; -import { base64ToBlobUrl } from "../../utils/fileReading"; -import { base64ToUint8Array } from "../../qdn/encryption/group-encryption"; -import { uint8ArrayToObject } from "../../backgroundFunctions/encryption"; +} from '../../atoms/global'; +import { saveToLocalStorage } from './AppsNavBarDesktop'; +import { base64ToBlobUrl } from '../../utils/fileReading'; +import { base64ToUint8Array } from '../../qdn/encryption/group-encryption'; +import { uint8ArrayToObject } from '../../backgroundFunctions/encryption'; +import { useAtom, useSetAtom } from 'jotai'; export const useHandlePrivateApps = () => { - const [status, setStatus] = useState(""); + const [status, setStatus] = useState(''); const { openSnackGlobal, setOpenSnackGlobal, infoSnackCustom, setInfoSnackCustom, } = useContext(MyContext); - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( - sortablePinnedAppsAtom - ); - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); + const setSortablePinnedApps = useSetAtom(sortablePinnedAppsAtom); + + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); + const openApp = async ( privateAppProperties, addToPinnedApps, setLoadingStatePrivateApp ) => { try { - - - if(setLoadingStatePrivateApp){ + if (setLoadingStatePrivateApp) { setLoadingStatePrivateApp(`Downloading and decrypting private app.`); - } setOpenSnackGlobal(true); setInfoSnackCustom({ - type: "info", - message: "Fetching app data", - duration: null + type: 'info', + message: 'Fetching app data', + duration: null, }); const urlData = `${getBaseApiReact()}/arbitrary/${ privateAppProperties?.service @@ -53,32 +48,30 @@ export const useHandlePrivateApps = () => { let data; try { const responseData = await fetch(urlData, { - method: "GET", + method: 'GET', headers: { - "Content-Type": "application/json", + 'Content-Type': 'application/json', }, }); - if(!responseData?.ok){ - if(setLoadingStatePrivateApp){ - setLoadingStatePrivateApp("Error! Unable to download private app."); + if (!responseData?.ok) { + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp('Error! Unable to download private app.'); } - - throw new Error("Unable to fetch app"); - } + + throw new Error('Unable to fetch app'); + } data = await responseData.text(); if (data?.error) { - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp("Error! Unable to download private app."); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp('Error! Unable to download private app.'); } - throw new Error("Unable to fetch app"); + throw new Error('Unable to fetch app'); } } catch (error) { - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp("Error! Unable to download private app."); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp('Error! Unable to download private app.'); } throw error; } @@ -87,7 +80,7 @@ export const useHandlePrivateApps = () => { // eslint-disable-next-line no-useless-catch try { decryptedData = await window.sendMessage( - "DECRYPT_QORTAL_GROUP_DATA", + 'DECRYPT_QORTAL_GROUP_DATA', { base64: data, @@ -95,16 +88,14 @@ export const useHandlePrivateApps = () => { } ); if (decryptedData?.error) { - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp("Error! Unable to decrypt private app."); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp('Error! Unable to decrypt private app.'); } throw new Error(decryptedData?.error); } } catch (error) { - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp("Error! Unable to decrypt private app."); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp('Error! Unable to decrypt private app.'); } throw error; } @@ -112,19 +103,19 @@ export const useHandlePrivateApps = () => { try { const convertToUint = base64ToUint8Array(decryptedData); const UintToObject = uint8ArrayToObject(convertToUint); - + if (decryptedData) { setInfoSnackCustom({ - type: "info", - message: "Building app", + type: 'info', + message: 'Building app', }); const endpoint = await createEndpoint( `/arbitrary/APP/${privateAppProperties?.name}/zip?preview=true` ); const response = await fetch(endpoint, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "text/plain", + 'Content-Type': 'text/plain', }, body: UintToObject?.app, }); @@ -135,7 +126,7 @@ export const useHandlePrivateApps = () => { ); const res = await fetch(checkIfPreviewLinkStillWorksUrl); if (res.ok) { - executeEvent("refreshApp", { + executeEvent('refreshApp', { tabId: tabId, }); } else { @@ -143,51 +134,50 @@ export const useHandlePrivateApps = () => { `/arbitrary/APP/${privateAppProperties?.name}/zip?preview=true` ); const response = await fetch(endpoint, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "text/plain", + 'Content-Type': 'text/plain', }, body: UintToObject?.app, }); const previewPath = await response.text(); - executeEvent("updateAppUrl", { + executeEvent('updateAppUrl', { tabId: tabId, url: await createEndpoint(previewPath), }); - + setTimeout(() => { - executeEvent("refreshApp", { + executeEvent('refreshApp', { tabId: tabId, }); }, 300); } }; - + const appName = UintToObject?.name; const logo = UintToObject?.logo ? `data:image/png;base64,${UintToObject?.logo}` : null; - + const dataBody = { url: await createEndpoint(previewPath), isPreview: true, isPrivate: true, privateAppProperties: { ...privateAppProperties, logo, appName }, - filePath: "", + filePath: '', refreshFunc: (tabId) => { refreshfunc(tabId, privateAppProperties); }, }; - executeEvent("addTab", { + executeEvent('addTab', { data: dataBody, }); setInfoSnackCustom({ - type: "success", - message: "Opened", + type: 'success', + message: 'Opened', }); - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp(``); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp(``); } if (addToPinnedApps) { setSortablePinnedApps((prev) => { @@ -203,10 +193,10 @@ export const useHandlePrivateApps = () => { }, }, ]; - + saveToLocalStorage( - "ext_saved_settings", - "sortablePinnedApps", + 'ext_saved_settings', + 'sortablePinnedApps', updatedApps ); return updatedApps; @@ -215,20 +205,19 @@ export const useHandlePrivateApps = () => { } } } catch (error) { - if(setLoadingStatePrivateApp){ - - setLoadingStatePrivateApp(`Error! ${error?.message || 'Unable to build private app.'}`); + if (setLoadingStatePrivateApp) { + setLoadingStatePrivateApp( + `Error! ${error?.message || 'Unable to build private app.'}` + ); } - throw error + throw error; } + } catch (error) { + setInfoSnackCustom({ + type: 'error', + message: error?.message || 'Unable to fetch app', + }); } - catch (error) { - setInfoSnackCustom({ - type: "error", - message: error?.message || "Unable to fetch app", - }); - } - }; return { openApp, diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index bef9a99..8770807 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -1,15 +1,12 @@ import { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { executeEvent } from '../../utils/events'; -import { useSetRecoilState } from 'recoil'; import { navigationControllerAtom } from '../../atoms/global'; import { Filesystem, Directory, Encoding } from '@capacitor/filesystem'; import { saveFile } from '../../qortalRequests/get'; import { mimeToExtensionMap } from '../../utils/memeTypes'; import { MyContext } from '../../App'; import FileSaver from 'file-saver'; - - - +import { useSetAtom } from 'jotai'; export const saveFileInChunks = async ( blob: Blob, @@ -45,7 +42,6 @@ export const saveFileInChunks = async ( // Map MIME type to file extension const mimeTypeToExtension = (mimeType: string): string => { - return mimeToExtensionMap[mimeType] || existingExtension || ''; // Use existing extension if MIME type not found }; @@ -76,21 +72,18 @@ export const saveFileInChunks = async ( offset += chunkSize; isFirstChunk = false; } - } catch (error) { console.error('Error saving file in chunks:', error); } }; - - // Helper function to convert a Blob to a Base64 string const blobToBase64 = (blob: Blob): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => { - const base64data = reader.result?.toString().split(",")[1]; - resolve(base64data || ""); + const base64data = reader.result?.toString().split(',')[1]; + resolve(base64data || ''); }; reader.onerror = reject; reader.readAsDataURL(blob); @@ -98,81 +91,81 @@ const blobToBase64 = (blob: Blob): Promise => { }; class Semaphore { - constructor(count) { - this.count = count - this.waiting = [] - } - acquire() { - return new Promise(resolve => { - if (this.count > 0) { - this.count-- - resolve() - } else { - this.waiting.push(resolve) - } - }) - } - release() { - if (this.waiting.length > 0) { - const resolve = this.waiting.shift() - resolve() - } else { - this.count++ - } - } -} -let semaphore = new Semaphore(1) -let reader = new FileReader() - -const fileToBase64 = (file) => new Promise(async (resolve, reject) => { - if (!reader) { - reader = new FileReader() - } - await semaphore.acquire() - reader.readAsDataURL(file) - reader.onload = () => { - const dataUrl = reader.result - if (typeof dataUrl === "string") { - const base64String = dataUrl.split(',')[1] - reader.onload = null - reader.onerror = null - resolve(base64String) - } else { - reader.onload = null - reader.onerror = null - reject(new Error('Invalid data URL')) - } - semaphore.release() - } - reader.onerror = (error) => { - reader.onload = null - reader.onerror = null - reject(error) - semaphore.release() - } -}) - -export function openIndexedDB() { - return new Promise((resolve, reject) => { - const request = indexedDB.open("fileStorageDB", 1); - - request.onupgradeneeded = function (event) { - const db = event.target.result; - if (!db.objectStoreNames.contains("files")) { - db.createObjectStore("files", { keyPath: "id" }); - } - }; - - request.onsuccess = function (event) { - resolve(event.target.result); - }; - - request.onerror = function () { - reject("Error opening IndexedDB"); - }; + constructor(count) { + this.count = count; + this.waiting = []; + } + acquire() { + return new Promise((resolve) => { + if (this.count > 0) { + this.count--; + resolve(); + } else { + this.waiting.push(resolve); + } }); } + release() { + if (this.waiting.length > 0) { + const resolve = this.waiting.shift(); + resolve(); + } else { + this.count++; + } + } +} +let semaphore = new Semaphore(1); +let reader = new FileReader(); +const fileToBase64 = (file) => + new Promise(async (resolve, reject) => { + if (!reader) { + reader = new FileReader(); + } + await semaphore.acquire(); + reader.readAsDataURL(file); + reader.onload = () => { + const dataUrl = reader.result; + if (typeof dataUrl === 'string') { + const base64String = dataUrl.split(',')[1]; + reader.onload = null; + reader.onerror = null; + resolve(base64String); + } else { + reader.onload = null; + reader.onerror = null; + reject(new Error('Invalid data URL')); + } + semaphore.release(); + }; + reader.onerror = (error) => { + reader.onload = null; + reader.onerror = null; + reject(error); + semaphore.release(); + }; + }); + +export function openIndexedDB() { + return new Promise((resolve, reject) => { + const request = indexedDB.open('fileStorageDB', 1); + + request.onupgradeneeded = function (event) { + const db = event.target.result; + if (!db.objectStoreNames.contains('files')) { + db.createObjectStore('files', { keyPath: 'id' }); + } + }; + + request.onsuccess = function (event) { + resolve(event.target.result); + }; + + request.onerror = function () { + reject('Error opening IndexedDB'); + }; + }); +} export const listOfAllQortalRequests = [ 'GET_USER_ACCOUNT', @@ -209,7 +202,7 @@ export const listOfAllQortalRequests = [ 'DECRYPT_QORTAL_GROUP_DATA', 'DECRYPT_DATA_WITH_SHARING_KEY', 'DELETE_HOSTED_DATA', - 'GET_HOSTED_DATA', + 'GET_HOSTED_DATA', 'PUBLISH_MULTIPLE_QDN_RESOURCES', 'PUBLISH_QDN_RESOURCE', 'ENCRYPT_DATA', @@ -259,8 +252,8 @@ export const listOfAllQortalRequests = [ 'UPDATE_GROUP', 'SELL_NAME', 'CANCEL_SELL_NAME', - 'BUY_NAME' -] + 'BUY_NAME', +]; export const UIQortalRequests = [ 'GET_USER_ACCOUNT', @@ -319,316 +312,327 @@ export const UIQortalRequests = [ 'UPDATE_GROUP', 'SELL_NAME', 'CANCEL_SELL_NAME', - 'BUY_NAME' + 'BUY_NAME', ]; +async function retrieveFileFromIndexedDB(fileId) { + const db = await openIndexedDB(); + const transaction = db.transaction(['files'], 'readwrite'); + const objectStore = transaction.objectStore('files'); + return new Promise((resolve, reject) => { + const getRequest = objectStore.get(fileId); - - - async function retrieveFileFromIndexedDB(fileId) { + getRequest.onsuccess = function (event) { + if (getRequest.result) { + // File found, resolve it and delete from IndexedDB + const file = getRequest.result.data; + objectStore.delete(fileId); + resolve(file); + } else { + reject('File not found in IndexedDB'); + } + }; + + getRequest.onerror = function () { + reject('Error retrieving file from IndexedDB'); + }; + }); +} + +async function deleteQortalFilesFromIndexedDB() { + try { const db = await openIndexedDB(); - const transaction = db.transaction(["files"], "readwrite"); - const objectStore = transaction.objectStore("files"); - - return new Promise((resolve, reject) => { - const getRequest = objectStore.get(fileId); - - getRequest.onsuccess = function (event) { - if (getRequest.result) { - // File found, resolve it and delete from IndexedDB - const file = getRequest.result.data; - objectStore.delete(fileId); - resolve(file); - } else { - reject("File not found in IndexedDB"); + const transaction = db.transaction(['files'], 'readwrite'); + const objectStore = transaction.objectStore('files'); + + // Create a request to get all keys + const getAllKeysRequest = objectStore.getAllKeys(); + + getAllKeysRequest.onsuccess = function (event) { + const keys = event.target.result; + + // Iterate through keys to find and delete those containing '_qortalfile' + for (let key of keys) { + if (key.includes('_qortalfile')) { + const deleteRequest = objectStore.delete(key); + + deleteRequest.onsuccess = function () { + console.log( + `File with key '${key}' has been deleted from IndexedDB` + ); + }; + + deleteRequest.onerror = function () { + console.error( + `Failed to delete file with key '${key}' from IndexedDB` + ); + }; } - }; - - getRequest.onerror = function () { - reject("Error retrieving file from IndexedDB"); - }; - }); - } - - async function deleteQortalFilesFromIndexedDB() { - try { - const db = await openIndexedDB(); - const transaction = db.transaction(["files"], "readwrite"); - const objectStore = transaction.objectStore("files"); - - // Create a request to get all keys - const getAllKeysRequest = objectStore.getAllKeys(); - - getAllKeysRequest.onsuccess = function (event) { - const keys = event.target.result; - - // Iterate through keys to find and delete those containing '_qortalfile' - for (let key of keys) { - if (key.includes("_qortalfile")) { - const deleteRequest = objectStore.delete(key); - - deleteRequest.onsuccess = function () { - console.log(`File with key '${key}' has been deleted from IndexedDB`); - }; - - deleteRequest.onerror = function () { - console.error(`Failed to delete file with key '${key}' from IndexedDB`); - }; - } - } - }; - - getAllKeysRequest.onerror = function () { - console.error("Failed to retrieve keys from IndexedDB"); - }; - - transaction.oncomplete = function () { - console.log("Transaction complete for deleting files from IndexedDB"); - }; - - transaction.onerror = function () { - console.error("Error occurred during transaction for deleting files"); - }; - } catch (error) { - console.error("Error opening IndexedDB:", error); - } + } + }; + + getAllKeysRequest.onerror = function () { + console.error('Failed to retrieve keys from IndexedDB'); + }; + + transaction.oncomplete = function () { + console.log('Transaction complete for deleting files from IndexedDB'); + }; + + transaction.onerror = function () { + console.error('Error occurred during transaction for deleting files'); + }; + } catch (error) { + console.error('Error opening IndexedDB:', error); } +} +export const showSaveFilePicker = async ( + data, + { openSnackGlobal, setOpenSnackGlobal, infoSnackCustom, setInfoSnackCustom } +) => { + try { + const { filename, mimeType, blob, fileHandleOptions } = data; - - - export const showSaveFilePicker = async (data, {openSnackGlobal, - setOpenSnackGlobal, - infoSnackCustom, - setInfoSnackCustom}) => { - - - try { - const { filename, mimeType, blob, fileHandleOptions } = data; - - setInfoSnackCustom({ - type: "info", - message: - "Saving file...", - }); - - - setOpenSnackGlobal(true); - - - - FileSaver.saveAs(blob, filename) - - setInfoSnackCustom({ - type: "success", - message: - "Saving file success!", + setInfoSnackCustom({ + type: 'info', + message: 'Saving file...', }); - setOpenSnackGlobal(true); - } catch (error) { - setInfoSnackCustom({ - type: "error", - message: - error?.message ? `Error saving file: ${error?.message}` : 'Error saving file', - }); - - - setOpenSnackGlobal(true); - console.error("Error saving file:", error); - + + FileSaver.saveAs(blob, filename); + + setInfoSnackCustom({ + type: 'success', + message: 'Saving file success!', + }); + + setOpenSnackGlobal(true); + } catch (error) { + setInfoSnackCustom({ + type: 'error', + message: error?.message + ? `Error saving file: ${error?.message}` + : 'Error saving file', + }); + + setOpenSnackGlobal(true); + console.error('Error saving file:', error); + } +}; + +declare var cordova: any; + +async function storeFilesInIndexedDB(obj) { + // First delete any existing files in IndexedDB with '_qortalfile' in their ID + await deleteQortalFilesFromIndexedDB(); + + // Open the IndexedDB + const db = await openIndexedDB(); + const transaction = db.transaction(['files'], 'readwrite'); + const objectStore = transaction.objectStore('files'); + + // Handle the obj.file if it exists and is a File instance + if (obj.file) { + const fileId = Date.now() + 'objFile_qortalfile'; + + // Store the file in IndexedDB + const fileData = { + id: fileId, + data: obj.file, + }; + objectStore.put(fileData); + + // Replace the file object with the file ID in the original object + obj.fileId = fileId; + delete obj.file; + } + if (obj.blob) { + const fileId = Date.now() + 'objFile_qortalfile'; + + // Store the file in IndexedDB + const fileData = { + id: fileId, + data: obj.blob, + }; + objectStore.put(fileData); + + // Replace the file object with the file ID in the original object + let blobObj = { + type: obj.blob?.type, + }; + obj.fileId = fileId; + delete obj.blob; + obj.blob = blobObj; + } + + // Iterate through resources to find files and save them to IndexedDB + for (let resource of obj?.resources || []) { + if (resource.file) { + const fileId = resource.identifier + Date.now() + '_qortalfile'; + + // Store the file in IndexedDB + const fileData = { + id: fileId, + data: resource.file, + }; + objectStore.put(fileData); + + // Replace the file object with the file ID in the original object + resource.fileId = fileId; + delete resource.file; } + } + + // Set transaction completion handlers + transaction.oncomplete = function () { + console.log('Files saved successfully to IndexedDB'); }; - declare var cordova: any; + transaction.onerror = function () { + console.error('Error saving files to IndexedDB'); + }; + return obj; // Updated object with references to stored files +} - - async function storeFilesInIndexedDB(obj) { - // First delete any existing files in IndexedDB with '_qortalfile' in their ID - await deleteQortalFilesFromIndexedDB(); - - // Open the IndexedDB - const db = await openIndexedDB(); - const transaction = db.transaction(["files"], "readwrite"); - const objectStore = transaction.objectStore("files"); - - // Handle the obj.file if it exists and is a File instance - if (obj.file) { - const fileId = Date.now() + "objFile_qortalfile"; - - // Store the file in IndexedDB - const fileData = { - id: fileId, - data: obj.file, - }; - objectStore.put(fileData); - - // Replace the file object with the file ID in the original object - obj.fileId = fileId; - delete obj.file; - } - if (obj.blob) { - const fileId = Date.now() + "objFile_qortalfile"; - - // Store the file in IndexedDB - const fileData = { - id: fileId, - data: obj.blob, - }; - objectStore.put(fileData); - - // Replace the file object with the file ID in the original object - let blobObj = { - type: obj.blob?.type - } - obj.fileId = fileId; - delete obj.blob; - obj.blob = blobObj - } - - // Iterate through resources to find files and save them to IndexedDB - for (let resource of (obj?.resources || [])) { - if (resource.file) { - const fileId = resource.identifier + Date.now() + "_qortalfile"; - - // Store the file in IndexedDB - const fileData = { - id: fileId, - data: resource.file, - }; - objectStore.put(fileData); - - // Replace the file object with the file ID in the original object - resource.fileId = fileId; - delete resource.file; - } - } - - // Set transaction completion handlers - transaction.oncomplete = function () { - console.log("Files saved successfully to IndexedDB"); - }; - - transaction.onerror = function () { - console.error("Error saving files to IndexedDB"); - }; - - return obj; // Updated object with references to stored files - } - -export const useQortalMessageListener = (frameWindow, iframeRef, tabId, isDevMode, appName, appService, skipAuth) => { - const [path, setPath] = useState('') +export const useQortalMessageListener = ( + frameWindow, + iframeRef, + tabId, + isDevMode, + appName, + appService, + skipAuth +) => { + const [path, setPath] = useState(''); const [history, setHistory] = useState({ customQDNHistoryPaths: [], -currentIndex: -1, -isDOMContentLoaded: false - }) - const setHasSettingsChangedAtom = useSetRecoilState(navigationControllerAtom); - const { openSnackGlobal, + currentIndex: -1, + isDOMContentLoaded: false, + }); + const setHasSettingsChangedAtom = useSetAtom(navigationControllerAtom); + + const { + openSnackGlobal, setOpenSnackGlobal, infoSnackCustom, - setInfoSnackCustom } = useContext(MyContext); + setInfoSnackCustom, + } = useContext(MyContext); - - - useEffect(()=> { - if(tabId && !isNaN(history?.currentIndex)){ - setHasSettingsChangedAtom((prev)=> { + useEffect(() => { + if (tabId && !isNaN(history?.currentIndex)) { + setHasSettingsChangedAtom((prev) => { return { ...prev, [tabId]: { hasBack: history?.currentIndex > 0, - } - } - }) + }, + }; + }); } - }, [history?.currentIndex, tabId]) + }, [history?.currentIndex, tabId]); - - const changeCurrentIndex = useCallback((value)=> { - setHistory((prev)=> { + const changeCurrentIndex = useCallback((value) => { + setHistory((prev) => { return { ...prev, - currentIndex: value - } - }) - }, []) + currentIndex: value, + }; + }); + }, []); - const resetHistory = useCallback(()=> { + const resetHistory = useCallback(() => { setHistory({ customQDNHistoryPaths: [], - currentIndex: -1, - isManualNavigation: true, - isDOMContentLoaded: false - }) - }, []) + currentIndex: -1, + isManualNavigation: true, + isDOMContentLoaded: false, + }); + }, []); useEffect(() => { - const listener = async (event) => { - - if (event?.data?.requestedHandler !== 'UI') return; const sendMessageToRuntime = (message, eventPort) => { - window.sendMessage(message.action, message.payload, 300000, message.isExtension, { - name: appName, service: appService - }, skipAuth) - .then((response) => { - if (response.error) { - eventPort.postMessage({ - result: null, - error: { - error: response?.error, - message: typeof response?.error === 'string' ? response?.error : typeof response?.message === 'string' ? response?.message : 'An error has occurred' - }, - }); - } else { - eventPort.postMessage({ - result: response, - error: null, - }); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - + window + .sendMessage( + message.action, + message.payload, + 300000, + message.isExtension, + { + name: appName, + service: appService, + }, + skipAuth + ) + .then((response) => { + if (response.error) { + eventPort.postMessage({ + result: null, + error: { + error: response?.error, + message: + typeof response?.error === 'string' + ? response?.error + : typeof response?.message === 'string' + ? response?.message + : 'An error has occurred', + }, + }); + } else { + eventPort.postMessage({ + result: response, + error: null, + }); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); }; // Check if action is included in the predefined list of UI requests if (UIQortalRequests.includes(event.data.action)) { sendMessageToRuntime( - { action: event.data.action, type: 'qortalRequest', payload: event.data, isExtension: true }, + { + action: event.data.action, + type: 'qortalRequest', + payload: event.data, + isExtension: true, + }, event.ports[0] ); - } else if(event?.data?.action === 'SAVE_FILE' - ){ + } else if (event?.data?.action === 'SAVE_FILE') { try { - const res = await saveFile( event.data, null, true, { - openSnackGlobal, - setOpenSnackGlobal, - infoSnackCustom, - setInfoSnackCustom + const res = await saveFile(event.data, null, true, { + openSnackGlobal, + setOpenSnackGlobal, + infoSnackCustom, + setInfoSnackCustom, }); - - } catch (error) { - - } + } catch (error) {} } else if ( event?.data?.action === 'PUBLISH_MULTIPLE_QDN_RESOURCES' || event?.data?.action === 'PUBLISH_QDN_RESOURCE' || - event?.data?.action === 'ENCRYPT_DATA' || event?.data?.action === 'ENCRYPT_DATA_WITH_SHARING_KEY' || event?.data?.action === 'ENCRYPT_QORTAL_GROUP_DATA' - + event?.data?.action === 'ENCRYPT_DATA' || + event?.data?.action === 'ENCRYPT_DATA_WITH_SHARING_KEY' || + event?.data?.action === 'ENCRYPT_QORTAL_GROUP_DATA' ) { const data = event.data; if (data) { sendMessageToRuntime( - { action: event.data.action, type: 'qortalRequest', payload: data, isExtension: true }, + { + action: event.data.action, + type: 'qortalRequest', + payload: data, + isExtension: true, + }, event.ports[0] ); } else { @@ -637,52 +641,73 @@ isDOMContentLoaded: false error: 'Failed to prepare data for publishing', }); } - } else if(event?.data?.action === 'LINK_TO_QDN_RESOURCE' || - event?.data?.action === 'QDN_RESOURCE_DISPLAYED'){ - const pathUrl = event?.data?.path != null ? (event?.data?.path.startsWith('/') ? '' : '/') + event?.data?.path : null - setPath(pathUrl) - if(appName?.toLowerCase() === 'q-mail'){ - window.sendMessage("addEnteredQmailTimestamp").catch((error) => { + } else if ( + event?.data?.action === 'LINK_TO_QDN_RESOURCE' || + event?.data?.action === 'QDN_RESOURCE_DISPLAYED' + ) { + const pathUrl = + event?.data?.path != null + ? (event?.data?.path.startsWith('/') ? '' : '/') + event?.data?.path + : null; + setPath(pathUrl); + if (appName?.toLowerCase() === 'q-mail') { + window.sendMessage('addEnteredQmailTimestamp').catch((error) => { // error }); - } else if(appName?.toLowerCase() === 'q-wallets'){ - executeEvent('setLastEnteredTimestampPaymentEvent', {}) + } else if (appName?.toLowerCase() === 'q-wallets') { + executeEvent('setLastEnteredTimestampPaymentEvent', {}); } - } else if(event?.data?.action === 'NAVIGATION_HISTORY'){ - if(event?.data?.payload?.isDOMContentLoaded){ - setHistory((prev)=> { - const copyPrev = {...prev} - if((copyPrev?.customQDNHistoryPaths || []).at(-1) === (event?.data?.payload?.customQDNHistoryPaths || []).at(-1)) { + } else if (event?.data?.action === 'NAVIGATION_HISTORY') { + if (event?.data?.payload?.isDOMContentLoaded) { + setHistory((prev) => { + const copyPrev = { ...prev }; + if ( + (copyPrev?.customQDNHistoryPaths || []).at(-1) === + (event?.data?.payload?.customQDNHistoryPaths || []).at(-1) + ) { return { ...prev, - currentIndex: prev.customQDNHistoryPaths.length - 1 === -1 ? 0 : prev.customQDNHistoryPaths.length - 1 - } + currentIndex: + prev.customQDNHistoryPaths.length - 1 === -1 + ? 0 + : prev.customQDNHistoryPaths.length - 1, + }; } - const copyHistory = {...prev} - const paths = [...(copyHistory?.customQDNHistoryPaths.slice(0, copyHistory.currentIndex + 1) || []), ...(event?.data?.payload?.customQDNHistoryPaths || [])] + const copyHistory = { ...prev }; + const paths = [ + ...(copyHistory?.customQDNHistoryPaths.slice( + 0, + copyHistory.currentIndex + 1 + ) || []), + ...(event?.data?.payload?.customQDNHistoryPaths || []), + ]; return { ...prev, customQDNHistoryPaths: paths, - currentIndex: paths.length - 1 - } - }) + currentIndex: paths.length - 1, + }; + }); } else { - setHistory(event?.data?.payload) - + setHistory(event?.data?.payload); } - } else if(event?.data?.action === 'SET_TAB' && !isDevMode){ - executeEvent("addTab", { - data: event?.data?.payload - }) - const targetOrigin = iframeRef.current ? new URL(iframeRef.current.src).origin : "*"; + } else if (event?.data?.action === 'SET_TAB' && !isDevMode) { + executeEvent('addTab', { + data: event?.data?.payload, + }); + const targetOrigin = iframeRef.current + ? new URL(iframeRef.current.src).origin + : '*'; iframeRef.current.contentWindow.postMessage( - { action: 'SET_TAB_SUCCESS', requestedHandler: 'UI',payload: { - name: event?.data?.payload?.name - } }, targetOrigin + { + action: 'SET_TAB_SUCCESS', + requestedHandler: 'UI', + payload: { + name: event?.data?.payload?.name, + }, + }, + targetOrigin ); - } - - + } }; // Add the listener for messages coming from the frameWindow @@ -692,12 +717,7 @@ isDOMContentLoaded: false return () => { frameWindow.removeEventListener('message', listener); }; - - }, [isDevMode, appName, appService]); // Empty dependency array to run once when the component mounts - - - return {path, history, resetHistory, changeCurrentIndex} + return { path, history, resetHistory, changeCurrentIndex }; }; - diff --git a/src/components/Chat/ChatContainer.tsx b/src/components/Chat/ChatContainer.tsx deleted file mode 100644 index 2823b83..0000000 --- a/src/components/Chat/ChatContainer.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { - MainContainer, - ChatContainer, - MessageList, - Message, - MessageInput, - Avatar, -} from '@chatscope/chat-ui-kit-react'; -import '@chatscope/chat-ui-kit-styles/dist/default/styles.min.css'; - -export const ChatContainerComp = ({ messages }) => { - // const [messages, setMessages] = useState([ - // { id: 1, text: "Hello! How are you?", sender: "Joe"}, - // { id: 2, text: "I'm good, thank you!", sender: "Me" } - // ]); - - // const loadMoreMessages = () => { - // // Simulate loading more messages (you could fetch these from an API) - // const moreMessages = [ - // { id: 3, text: "What about you?", sender: "Joe", direction: "incoming" }, - // { id: 4, text: "I'm great, thanks!", sender: "Me", direction: "outgoing" } - // ]; - // setMessages((prevMessages) => [...moreMessages, ...prevMessages]); - // }; - - return ( -
- - - - {messages.map((msg) => ( - - {msg.direction === 'incoming' && ( - - )} - - ))} - - - - - -
- ); -}; diff --git a/src/components/Chat/ChatDirect.tsx b/src/components/Chat/ChatDirect.tsx index a3973e1..1b6b256 100644 --- a/src/components/Chat/ChatDirect.tsx +++ b/src/components/Chat/ChatDirect.tsx @@ -8,7 +8,6 @@ import React, { } from 'react'; import { ChatList } from './ChatList'; -import '@chatscope/chat-ui-kit-styles/dist/default/styles.min.css'; import Tiptap from './TipTap'; import { CustomButton } from '../../styles/App-styles'; import CircularProgress from '@mui/material/CircularProgress'; diff --git a/src/components/Chat/ChatGroup.tsx b/src/components/Chat/ChatGroup.tsx index 154427d..0dd626e 100644 --- a/src/components/Chat/ChatGroup.tsx +++ b/src/components/Chat/ChatGroup.tsx @@ -12,7 +12,6 @@ import { objectToBase64, } from '../../qdn/encryption/group-encryption'; import { ChatList } from './ChatList'; -import '@chatscope/chat-ui-kit-styles/dist/default/styles.min.css'; import Tiptap from './TipTap'; import { CustomButton } from '../../styles/App-styles'; import CircularProgress from '@mui/material/CircularProgress'; @@ -1238,8 +1237,6 @@ export const ChatGroup = ({ )} - {/* */} - { const theme = useTheme(); - const [isDisabledEditorEnter, setIsDisabledEditorEnter] = useRecoilState( + const [isDisabledEditorEnter, setIsDisabledEditorEnter] = useAtom( isDisabledEditorEnterAtom ); + const extensionsFiltered = isChat ? extensions.filter((item) => item?.name !== 'image') : extensions; diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 0306e57..3d1ede6 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -10,8 +10,8 @@ import { import MailOutlineIcon from '@mui/icons-material/MailOutline'; import NotificationsOffIcon from '@mui/icons-material/NotificationsOff'; import { executeEvent } from '../utils/events'; -import { useRecoilState } from 'recoil'; import { mutedGroupsAtom } from '../atoms/global'; +import { useAtom } from 'jotai'; const CustomStyledMenu = styled(Menu)(({ theme }) => ({ '& .MuiPaper-root': { @@ -35,7 +35,8 @@ export const ContextMenu = ({ children, groupId, getUserSettings }) => { const longPressTimeout = useRef(null); const preventClick = useRef(false); // Flag to prevent click after long-press or right-click const theme = useTheme(); - const [mutedGroups] = useRecoilState(mutedGroupsAtom); + const [mutedGroups] = useAtom(mutedGroupsAtom); + const isMuted = useMemo(() => { return mutedGroups.includes(groupId); }, [mutedGroups, groupId]); diff --git a/src/components/ContextMenuPinnedApps.tsx b/src/components/ContextMenuPinnedApps.tsx index 3e2c2be..b7cea32 100644 --- a/src/components/ContextMenuPinnedApps.tsx +++ b/src/components/ContextMenuPinnedApps.tsx @@ -9,8 +9,8 @@ import { } from '@mui/material'; import PushPinIcon from '@mui/icons-material/PushPin'; import { saveToLocalStorage } from './Apps/AppsNavBarDesktop'; -import { useRecoilState } from 'recoil'; import { sortablePinnedAppsAtom } from '../atoms/global'; +import { useSetAtom } from 'jotai'; const CustomStyledMenu = styled(Menu)(({ theme }) => ({ '& .MuiPaper-root': { @@ -34,9 +34,9 @@ export const ContextMenuPinnedApps = ({ children, app, isMine }) => { const maxHoldTimeout = useRef(null); const preventClick = useRef(false); const startTouchPosition = useRef({ x: 0, y: 0 }); // Track initial touch position - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( - sortablePinnedAppsAtom - ); + + const setSortablePinnedApps = useSetAtom(sortablePinnedAppsAtom); + const theme = useTheme(); const handleContextMenu = (event) => { diff --git a/src/components/Desktop/DesktopFooter.tsx b/src/components/Desktop/DesktopFooter.tsx index 3bef9cc..d85c8a0 100644 --- a/src/components/Desktop/DesktopFooter.tsx +++ b/src/components/Desktop/DesktopFooter.tsx @@ -6,8 +6,9 @@ import AppIcon from '../../assets/svgs/AppIcon.svg'; import { HomeIcon } from '../../assets/Icons/HomeIcon'; import { Save } from '../Save/Save'; -import { useRecoilState } from 'recoil'; + import { enabledDevModeAtom } from '../../atoms/global'; +import { useAtom } from 'jotai'; export const IconWrapper = ({ children, @@ -65,8 +66,7 @@ export const DesktopFooter = ({ setIsOpenSideViewDirects, setIsOpenSideViewGroups, }) => { - const [isEnabledDevMode, setIsEnabledDevMode] = - useRecoilState(enabledDevModeAtom); + const [isEnabledDevMode, setIsEnabledDevMode] = useAtom(enabledDevModeAtom); const theme = useTheme(); diff --git a/src/components/DesktopSideBar.tsx b/src/components/DesktopSideBar.tsx index 616a128..e2774a7 100644 --- a/src/components/DesktopSideBar.tsx +++ b/src/components/DesktopSideBar.tsx @@ -2,13 +2,13 @@ import { Box, ButtonBase, useTheme } from '@mui/material'; import { HomeIcon } from '../assets/Icons/HomeIcon'; import { Save } from './Save/Save'; import { IconWrapper } from './Desktop/DesktopFooter'; -import { useRecoilState } from 'recoil'; import { enabledDevModeAtom } from '../atoms/global'; import { AppsIcon } from '../assets/Icons/AppsIcon'; import ThemeSelector from './Theme/ThemeSelector'; import { CoreSyncStatus } from './CoreSyncStatus'; import LanguageSelector from './Language/LanguageSelector'; import { MessagingIconFilled } from '../assets/Icons/MessagingIconFilled'; +import { useAtom } from 'jotai'; export const DesktopSideBar = ({ goToHome, @@ -24,13 +24,10 @@ export const DesktopSideBar = ({ desktopViewMode, myName, }) => { - const [isEnabledDevMode, setIsEnabledDevMode] = - useRecoilState(enabledDevModeAtom); + const [isEnabledDevMode, setIsEnabledDevMode] = useAtom(enabledDevModeAtom); const theme = useTheme(); - console.log('test', desktopViewMode === 'home'); - return ( { const pollName = name; @@ -63,8 +63,9 @@ export const Embed = ({ embedLink }) => { const [external, setExternal] = useState(null); const [imageUrl, setImageUrl] = useState(''); const [parsedData, setParsedData] = useState(null); - const setBlobs = useSetRecoilState(blobControllerAtom); - const [selectedGroupId] = useRecoilState(selectedGroupIdAtom); + const setBlobs = useSetAtom(blobControllerAtom); + const [selectedGroupId] = useAtom(selectedGroupIdAtom); + const resourceData = useMemo(() => { const parsedDataOnTheFly = parseQortalLink(embedLink); if ( @@ -98,7 +99,8 @@ export const Embed = ({ embedLink }) => { return undefined; } }, [resourceData]); - const blobUrl = useRecoilValue(blobKeySelector(keyIdentifier)); + + const blobUrl = useAtomValue(blobKeySelector(keyIdentifier)); const handlePoll = async (parsedData) => { try { @@ -312,7 +314,7 @@ export const Embed = ({ embedLink }) => { hasFetched.current = true; }, [embedLink]); - const resourceDetails = useRecoilValue(resourceKeySelector(keyIdentifier)); + const resourceDetails = useAtomValue(resourceKeySelector(keyIdentifier)); const { parsedType, encryptionType } = useMemo(() => { let parsedType; diff --git a/src/components/Embeds/VideoPlayer.tsx b/src/components/Embeds/VideoPlayer.tsx index 59bfc76..26e3e08 100644 --- a/src/components/Embeds/VideoPlayer.tsx +++ b/src/components/Embeds/VideoPlayer.tsx @@ -19,7 +19,8 @@ import { Menu, MenuItem } from '@mui/material'; import { MoreVert as MoreIcon } from '@mui/icons-material'; import { GlobalContext, getBaseApiReact } from '../../App'; import { resourceKeySelector } from '../../atoms/global'; -import { useRecoilValue } from 'recoil'; + +import { useAtomValue } from 'jotai'; const VideoContainer = styled(Box)` position: relative; display: flex; @@ -80,7 +81,9 @@ export const VideoPlayer: React.FC = ({ return undefined; } }, [service, name, identifier]); - const download = useRecoilValue(resourceKeySelector(keyIdentifier)); + + const download = useAtomValue(resourceKeySelector(keyIdentifier)); + const { downloadResource } = useContext(GlobalContext); const videoRef = useRef(null); diff --git a/src/components/Group/BlockedUsersModal.tsx b/src/components/Group/BlockedUsersModal.tsx index b2d58e7..17837fc 100644 --- a/src/components/Group/BlockedUsersModal.tsx +++ b/src/components/Group/BlockedUsersModal.tsx @@ -21,15 +21,16 @@ import { import { validateAddress } from '../../utils/validateAddress'; import { getNameInfo, requestQueueMemberNames } from './Group'; import { useModal } from '../../common/useModal'; -import { useRecoilState } from 'recoil'; import { isOpenBlockedModalAtom } from '../../atoms/global'; import InfoIcon from '@mui/icons-material/Info'; +import { useAtom } from 'jotai'; export const BlockedUsersModal = () => { const theme = useTheme(); - const [isOpenBlockedModal, setIsOpenBlockedModal] = useRecoilState( + const [isOpenBlockedModal, setIsOpenBlockedModal] = useAtom( isOpenBlockedModalAtom ); + const [hasChanged, setHasChanged] = useState(false); const [value, setValue] = useState(''); const [addressesWithNames, setAddressesWithNames] = useState({}); diff --git a/src/components/Group/Forum/NewThread.tsx b/src/components/Group/Forum/NewThread.tsx index 74ce7f4..94be106 100644 --- a/src/components/Group/Forum/NewThread.tsx +++ b/src/components/Group/Forum/NewThread.tsx @@ -516,12 +516,7 @@ export const NewThread = ({ overrideMobile customEditorHeight="240px" /> - {/* { - setValue(val); - }} - /> */} + diff --git a/src/components/Group/Forum/TextEditor.tsx b/src/components/Group/Forum/TextEditor.tsx deleted file mode 100644 index ac26275..0000000 --- a/src/components/Group/Forum/TextEditor.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import ReactQuill, { Quill } from 'react-quill'; -import 'react-quill/dist/quill.snow.css'; -import ImageResize from 'quill-image-resize-module-react'; -import './texteditor.css'; - -Quill.register('modules/imageResize', ImageResize); - -const modules = { - imageResize: { - parchment: Quill.import('parchment'), - modules: ['Resize', 'DisplaySize'], - }, - toolbar: [ - ['bold', 'italic', 'underline', 'strike'], // styled text - ['blockquote', 'code-block'], // blocks - [{ header: 1 }, { header: 2 }], // custom button values - [{ list: 'ordered' }, { list: 'bullet' }], // lists - [{ script: 'sub' }, { script: 'super' }], // superscript/subscript - [{ indent: '-1' }, { indent: '+1' }], // outdent/indent - [{ direction: 'rtl' }], // text direction - [{ size: ['small', false, 'large', 'huge'] }], // custom dropdown - [{ header: [1, 2, 3, 4, 5, 6, false] }], // custom button values - [{ color: [] }, { background: [] }], // dropdown with defaults - [{ font: [] }], // font family - [{ align: [] }], // text align - ['clean'], // remove formatting - // ["image"], // image - ], -}; - -export const TextEditor = ({ inlineContent, setInlineContent }: any) => { - return ( - - ); -}; diff --git a/src/components/Group/Forum/texteditor.css b/src/components/Group/Forum/texteditor.css deleted file mode 100644 index ac6d2ed..0000000 --- a/src/components/Group/Forum/texteditor.css +++ /dev/null @@ -1,70 +0,0 @@ -.ql-editor { - min-height: 200px; - width: 100%; - color: black; - font-size: 16px; - font-family: Roboto; - max-height: 225px; - overflow-y: scroll; - padding: 0px !important; -} - -.ql-editor::-webkit-scrollbar-track { - background-color: transparent; - cursor: default; -} -.ql-editor::-webkit-scrollbar-track:hover { - background-color: transparent; -} - -.ql-editor::-webkit-scrollbar { - width: 16px; - height: 10px; - background-color: rgba(229, 229, 229, 0.7); -} - -.ql-editor::-webkit-scrollbar-thumb { - background-color: #b0b0b0; - border-radius: 8px; - background-clip: content-box; - border: 4px solid transparent; -} - -.ql-editor img { - cursor: default; -} - -.ql-editor-display { - min-height: 20px; - width: 100%; - color: black; - font-size: 16px; - font-family: Roboto; - padding: 0px !important; -} - -.ql-editor-display img { - cursor: default; -} - -.ql-container { - font-size: 16px; -} - -.ql-toolbar .ql-stroke { - fill: none !important; - stroke: black !important; -} - -.ql-toolbar .ql-fill { - fill: black !important; - stroke: none !important; -} - -.ql-toolbar .ql-picker { - color: black !important; -} - -.ql-toolbar .ql-picker-options { - background-color: white !important; -} diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index f92c3a1..e16404a 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -65,7 +65,7 @@ import { HubsIcon } from '../../assets/Icons/HubsIcon'; import { MessagingIcon } from '../../assets/Icons/MessagingIcon'; import { formatEmailDate } from './QMailMessages'; import { AdminSpace } from '../Chat/AdminSpace'; -import { useRecoilState, useSetRecoilState } from 'recoil'; + import { addressInfoControllerAtom, groupAnnouncementsAtom, @@ -85,6 +85,7 @@ import { BlockedUsersModal } from './BlockedUsersModal'; import { WalletsAppWrapper } from './WalletsAppWrapper'; import { useTranslation } from 'react-i18next'; import { GroupList } from './GroupList'; +import { useAtom, useSetAtom } from 'jotai'; export const getPublishesFromAdmins = async (admins: string[], groupId) => { const queryString = admins.map((name) => `name=${name}`).join('&'); @@ -415,9 +416,10 @@ export const Group = ({ const { setMemberGroups, rootHeight, isRunningPublicNode } = useContext(MyContext); const lastGroupNotification = useRef(null); - const [timestampEnterData, setTimestampEnterData] = useRecoilState( + const [timestampEnterData, setTimestampEnterData] = useAtom( timestampEnterDataAtom ); + const [chatMode, setChatMode] = useState('groups'); const [newChat, setNewChat] = useState(false); const [openSnack, setOpenSnack] = React.useState(false); @@ -428,18 +430,19 @@ export const Group = ({ const [firstSecretKeyInCreation, setFirstSecretKeyInCreation] = React.useState(false); const [groupSection, setGroupSection] = React.useState('home'); - const [groupAnnouncements, setGroupAnnouncements] = useRecoilState( + const [groupAnnouncements, setGroupAnnouncements] = useAtom( groupAnnouncementsAtom ); const [defaultThread, setDefaultThread] = React.useState(null); const [isOpenDrawer, setIsOpenDrawer] = React.useState(false); - const setIsOpenBlockedUserModal = useSetRecoilState(isOpenBlockedModalAtom); + const setIsOpenBlockedUserModal = useSetAtom(isOpenBlockedModalAtom); const [hideCommonKeyPopup, setHideCommonKeyPopup] = React.useState(false); const [isLoadingGroupMessage, setIsLoadingGroupMessage] = React.useState(''); const [drawerMode, setDrawerMode] = React.useState('groups'); - const setMutedGroups = useSetRecoilState(mutedGroupsAtom); + const setMutedGroups = useSetAtom(mutedGroupsAtom); + const [mobileViewMode, setMobileViewMode] = useState('home'); const [mobileViewModeKeepOpen, setMobileViewModeKeepOpen] = useState(''); const isFocusedRef = useRef(true); @@ -453,9 +456,10 @@ export const Group = ({ const settimeoutForRefetchSecretKey = useRef(null); const { clearStatesMessageQueueProvider } = useMessageQueue(); const initiatedGetMembers = useRef(false); - const [groupChatTimestamps, setGroupChatTimestamps] = useRecoilState( + const [groupChatTimestamps, setGroupChatTimestamps] = useAtom( groupChatTimestampsAtom ); + const [appsMode, setAppsMode] = useState('home'); const [appsModeDev, setAppsModeDev] = useState('home'); const [isOpenSideViewDirects, setIsOpenSideViewDirects] = useState(false); @@ -465,12 +469,10 @@ export const Group = ({ const groupsOwnerNamesRef = useRef({}); const { t } = useTranslation(['core', 'group']); - const [groupsProperties, setGroupsProperties] = - useRecoilState(groupsPropertiesAtom); - const [groupsOwnerNames, setGroupsOwnerNames] = - useRecoilState(groupsOwnerNamesAtom); + const [groupsProperties, setGroupsProperties] = useAtom(groupsPropertiesAtom); + const setGroupsOwnerNames = useSetAtom(groupsOwnerNamesAtom); - const setUserInfoForLevels = useSetRecoilState(addressInfoControllerAtom); + const setUserInfoForLevels = useSetAtom(addressInfoControllerAtom); const isPrivate = useMemo(() => { if (selectedGroup?.groupId === '0') return false; @@ -481,7 +483,8 @@ export const Group = ({ return null; }, [selectedGroup]); - const setSelectedGroupId = useSetRecoilState(selectedGroupIdAtom); + const setSelectedGroupId = useSetAtom(selectedGroupIdAtom); + const toggleSideViewDirects = () => { if (isOpenSideViewGroups) { setIsOpenSideViewGroups(false); diff --git a/src/components/Group/GroupJoinRequests.tsx b/src/components/Group/GroupJoinRequests.tsx index 2bf0b26..32252da 100644 --- a/src/components/Group/GroupJoinRequests.tsx +++ b/src/components/Group/GroupJoinRequests.tsx @@ -11,10 +11,10 @@ import { Box, ButtonBase, Collapse, Typography, useTheme } from '@mui/material'; import { CustomLoader } from '../../common/CustomLoader'; import { MyContext, getBaseApiReact } from '../../App'; import { myGroupsWhereIAmAdminAtom } from '../../atoms/global'; -import { useSetRecoilState } from 'recoil'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import { useTranslation } from 'react-i18next'; +import { useSetAtom } from 'jotai'; export const requestQueueGroupJoinRequests = new RequestQueueWithPromise(2); export const GroupJoinRequests = ({ @@ -34,7 +34,8 @@ export const GroupJoinRequests = ({ ); const [loading, setLoading] = React.useState(true); const { txList, setTxList } = React.useContext(MyContext); - const setMyGroupsWhereIAmAdmin = useSetRecoilState(myGroupsWhereIAmAdminAtom); + const setMyGroupsWhereIAmAdmin = useSetAtom(myGroupsWhereIAmAdminAtom); + const theme = useTheme(); const getJoinRequests = async () => { try { diff --git a/src/components/Group/GroupList.tsx b/src/components/Group/GroupList.tsx index 896ed4d..47f464c 100644 --- a/src/components/Group/GroupList.tsx +++ b/src/components/Group/GroupList.tsx @@ -28,8 +28,9 @@ import { groupsOwnerNamesSelector, timestampEnterDataSelector, } from '../../atoms/global'; -import { useRecoilValue } from 'recoil'; + import { timeDifferenceForNotificationChats } from './Group'; +import { useAtomValue } from 'jotai'; export const GroupList = ({ selectGroupFunc, @@ -211,17 +212,18 @@ export const GroupList = ({ const GroupItem = React.memo( ({ selectGroupFunc, group, selectedGroup, getUserSettings, myAddress }) => { const theme = useTheme(); - const ownerName = useRecoilValue(groupsOwnerNamesSelector(group?.groupId)); - const announcement = useRecoilValue( + const ownerName = useAtomValue(groupsOwnerNamesSelector(group?.groupId)); + const announcement = useAtomValue( groupAnnouncementSelector(group?.groupId) ); - const groupProperty = useRecoilValue(groupPropertySelector(group?.groupId)); - const groupChatTimestamp = useRecoilValue( + const groupProperty = useAtomValue(groupPropertySelector(group?.groupId)); + const groupChatTimestamp = useAtomValue( groupChatTimestampSelector(group?.groupId) ); - const timestampEnterData = useRecoilValue( + const timestampEnterData = useAtomValue( timestampEnterDataSelector(group?.groupId) ); + const selectGroupHandler = useCallback(() => { selectGroupFunc(group); }, [group, selectGroupFunc]); diff --git a/src/components/Group/ListOfGroupPromotions.tsx b/src/components/Group/ListOfGroupPromotions.tsx index 4c0ef85..ae275b9 100644 --- a/src/components/Group/ListOfGroupPromotions.tsx +++ b/src/components/Group/ListOfGroupPromotions.tsx @@ -34,7 +34,7 @@ import { import { Spacer } from '../../common/Spacer'; import { CustomLoader } from '../../common/CustomLoader'; import { RequestQueueWithPromise } from '../../utils/queue/queue'; -import { useRecoilState } from 'recoil'; + import { myGroupsWhereIAmAdminAtom, promotionTimeIntervalAtom, @@ -49,6 +49,7 @@ import ErrorBoundary from '../../common/ErrorBoundary'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import { getFee } from '../../background'; +import { useAtom } from 'jotai'; export const requestQueuePromos = new RequestQueueWithPromise(3); export function utf8ToBase64(inputString: string): string { @@ -77,13 +78,14 @@ export const ListOfGroupPromotions = () => { const [loading, setLoading] = useState(false); const [isShowModal, setIsShowModal] = useState(false); const [text, setText] = useState(''); - const [myGroupsWhereIAmAdmin, setMyGroupsWhereIAmAdmin] = useRecoilState( + const [myGroupsWhereIAmAdmin, setMyGroupsWhereIAmAdmin] = useAtom( myGroupsWhereIAmAdminAtom ); - const [promotions, setPromotions] = useRecoilState(promotionsAtom); - const [promotionTimeInterval, setPromotionTimeInterval] = useRecoilState( + const [promotions, setPromotions] = useAtom(promotionsAtom); + const [promotionTimeInterval, setPromotionTimeInterval] = useAtom( promotionTimeIntervalAtom ); + const [isExpanded, setIsExpanded] = React.useState(false); const [openSnack, setOpenSnack] = useState(false); diff --git a/src/components/Group/QMailMessages.tsx b/src/components/Group/QMailMessages.tsx index 624d371..72a23d5 100644 --- a/src/components/Group/QMailMessages.tsx +++ b/src/components/Group/QMailMessages.tsx @@ -11,11 +11,12 @@ import MailIcon from '@mui/icons-material/Mail'; import MailOutlineIcon from '@mui/icons-material/MailOutline'; import { executeEvent } from '../../utils/events'; import { CustomLoader } from '../../common/CustomLoader'; -import { useRecoilState } from 'recoil'; + import { mailsAtom, qMailLastEnteredTimestampAtom } from '../../atoms/global'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import MarkEmailUnreadIcon from '@mui/icons-material/MarkEmailUnread'; +import { useAtom } from 'jotai'; export const isLessThanOneWeekOld = (timestamp) => { // Current time in milliseconds @@ -46,10 +47,11 @@ export function formatEmailDate(timestamp: number) { export const QMailMessages = ({ userName, userAddress }) => { const [isExpanded, setIsExpanded] = useState(false); - const [mails, setMails] = useRecoilState(mailsAtom); - const [lastEnteredTimestamp, setLastEnteredTimestamp] = useRecoilState( + const [mails, setMails] = useAtom(mailsAtom); + const [lastEnteredTimestamp, setLastEnteredTimestamp] = useAtom( qMailLastEnteredTimestampAtom ); + const [loading, setLoading] = useState(true); const theme = useTheme(); diff --git a/src/components/Group/Settings.tsx b/src/components/Group/Settings.tsx index 3ac9a2e..0279d2b 100644 --- a/src/components/Group/Settings.tsx +++ b/src/components/Group/Settings.tsx @@ -17,8 +17,9 @@ import Slide from '@mui/material/Slide'; import { TransitionProps } from '@mui/material/transitions'; import { Box, FormControlLabel, Switch, styled, useTheme } from '@mui/material'; import { enabledDevModeAtom } from '../../atoms/global'; -import { useRecoilState } from 'recoil'; + import ThemeManager from '../Theme/ThemeManager'; +import { useAtom } from 'jotai'; const LocalNodeSwitch = styled(Switch)(({ theme }) => ({ padding: 8, @@ -64,8 +65,8 @@ const Transition = forwardRef(function Transition( export const Settings = ({ address, open, setOpen }) => { const [checked, setChecked] = useState(false); - const [isEnabledDevMode, setIsEnabledDevMode] = - useRecoilState(enabledDevModeAtom); + const [isEnabledDevMode, setIsEnabledDevMode] = useAtom(enabledDevModeAtom); + const theme = useTheme(); const handleChange = (event: ChangeEvent) => { diff --git a/src/components/Group/WalletsAppWrapper.tsx b/src/components/Group/WalletsAppWrapper.tsx index 82e6660..7e44eb6 100644 --- a/src/components/Group/WalletsAppWrapper.tsx +++ b/src/components/Group/WalletsAppWrapper.tsx @@ -7,18 +7,19 @@ import { subscribeToEvent, unsubscribeFromEvent, } from '../../utils/events'; -import { useRecoilState } from 'recoil'; import { navigationControllerAtom } from '../../atoms/global'; import { AppsNavBarLeft, AppsNavBarParent } from '../Apps/Apps-styles'; import { NavBack } from '../../assets/Icons/NavBack.tsx'; import RefreshIcon from '@mui/icons-material/Refresh'; +import { useAtom } from 'jotai'; export const WalletsAppWrapper = () => { const iframeRef = useRef(null); const [isOpen, setIsOpen] = useState(false); - const [navigationController, setNavigationController] = useRecoilState( + const [navigationController, setNavigationController] = useAtom( navigationControllerAtom ); + const [selectedTab, setSelectedTab] = useState({ tabId: '5558589', name: 'Q-Wallets', diff --git a/src/components/QMailStatus.tsx b/src/components/QMailStatus.tsx index c665145..deac6db 100644 --- a/src/components/QMailStatus.tsx +++ b/src/components/QMailStatus.tsx @@ -1,20 +1,20 @@ import { useMemo } from 'react'; -import { useRecoilState } from 'recoil'; import { mailsAtom, qMailLastEnteredTimestampAtom } from '../atoms/global'; import { isLessThanOneWeekOld } from './Group/QMailMessages'; import { ButtonBase, Tooltip, useTheme } from '@mui/material'; import { executeEvent } from '../utils/events'; import { Mail } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; +import { useAtom } from 'jotai'; export const QMailStatus = () => { const { t } = useTranslation(['core']); const theme = useTheme(); - const [lastEnteredTimestamp, setLastEnteredTimestamp] = useRecoilState( + const [lastEnteredTimestamp, setLastEnteredTimestamp] = useAtom( qMailLastEnteredTimestampAtom ); - const [mails, setMails] = useRecoilState(mailsAtom); + const [mails, setMails] = useAtom(mailsAtom); const hasNewMail = useMemo(() => { if (mails?.length === 0) return false; diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx index a19efd2..d67780a 100644 --- a/src/components/Save/Save.tsx +++ b/src/components/Save/Save.tsx @@ -1,5 +1,4 @@ import { useContext, useEffect, useMemo, useState } from 'react'; -import { useRecoilState, useSetRecoilState } from 'recoil'; import isEqual from 'lodash/isEqual'; // TODO Import deep comparison utility import { canSaveSettingToQdnAtom, @@ -34,6 +33,7 @@ import { uint8ArrayToObject, } from '../../backgroundFunctions/encryption'; import { useTranslation } from 'react-i18next'; +import { useAtom, useSetAtom } from 'jotai'; export const handleImportClick = async () => { const fileInput = document.createElement('input'); @@ -66,22 +66,21 @@ export const handleImportClick = async () => { }; export const Save = ({ isDesktop, disableWidth, myName }) => { - const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom); - const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState( + const [pinnedApps, setPinnedApps] = useAtom(sortablePinnedAppsAtom); + const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useAtom( settingsQDNLastUpdatedAtom ); - const [settingsLocalLastUpdated] = useRecoilState( - settingsLocalLastUpdatedAtom + const [settingsLocalLastUpdated] = useAtom(settingsLocalLastUpdatedAtom); + const setHasSettingsChangedAtom = useSetAtom(hasSettingsChangedAtom); + const [isUsingImportExportSettings, setIsUsingImportExportSettings] = useAtom( + isUsingImportExportSettingsAtom ); - const setHasSettingsChangedAtom = useSetRecoilState(hasSettingsChangedAtom); - const [isUsingImportExportSettings, setIsUsingImportExportSettings] = - useRecoilState(isUsingImportExportSettingsAtom); - const [canSave] = useRecoilState(canSaveSettingToQdnAtom); const [openSnack, setOpenSnack] = useState(false); const [isLoading, setIsLoading] = useState(false); const [infoSnack, setInfoSnack] = useState(null); - const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom); + const [oldPinnedApps, setOldPinnedApps] = useAtom(oldPinnedAppsAtom); + const [anchorEl, setAnchorEl] = useState(null); const { show } = useContext(MyContext); const theme = useTheme(); diff --git a/src/hooks/useHandlePaymentNotification.tsx b/src/hooks/useHandlePaymentNotification.tsx index cc6e4e5..9ca9ff5 100644 --- a/src/hooks/useHandlePaymentNotification.tsx +++ b/src/hooks/useHandlePaymentNotification.tsx @@ -2,9 +2,9 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { getBaseApiReact } from '../App'; import { getData, storeData } from '../utils/chromeStorage'; import { checkDifference, getNameInfoForOthers } from '../background'; -import { useRecoilState } from 'recoil'; import { lastPaymentSeenTimestampAtom } from '../atoms/global'; import { subscribeToEvent, unsubscribeFromEvent } from '../utils/events'; +import { useAtom } from 'jotai'; export const useHandlePaymentNotification = (address) => { const [latestTx, setLatestTx] = useState(null); @@ -12,8 +12,9 @@ export const useHandlePaymentNotification = (address) => { const nameAddressOfSender = useRef({}); const isFetchingName = useRef({}); - const [lastEnteredTimestampPayment, setLastEnteredTimestampPayment] = - useRecoilState(lastPaymentSeenTimestampAtom); + const [lastEnteredTimestampPayment, setLastEnteredTimestampPayment] = useAtom( + lastPaymentSeenTimestampAtom + ); useEffect(() => { if (lastEnteredTimestampPayment && address) { diff --git a/src/main.tsx b/src/main.tsx index 3d64137..0a35316 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,21 +1,18 @@ -import ReactDOM from 'react-dom/client'; +import { createRoot } from 'react-dom/client'; import App from './App.tsx'; import '../src/styles/index.css'; import './messaging/messagesToBackground'; import { MessageQueueProvider } from './MessageQueueContext.tsx'; -import { RecoilRoot } from 'recoil'; import { ThemeProvider } from './components/Theme/ThemeContext.tsx'; import { CssBaseline } from '@mui/material'; import '../i18n'; -ReactDOM.createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById('root')!).render( <> - - - + diff --git a/src/useQortalGetSaveSettings.tsx b/src/useQortalGetSaveSettings.tsx index c74f1a2..66691b7 100644 --- a/src/useQortalGetSaveSettings.tsx +++ b/src/useQortalGetSaveSettings.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect } from 'react'; -import { useRecoilState, useSetRecoilState } from 'recoil'; import { canSaveSettingToQdnAtom, isUsingImportExportSettingsAtom, @@ -14,6 +13,7 @@ import { base64ToUint8Array, uint8ArrayToObject, } from './backgroundFunctions/encryption'; +import { useAtom, useSetAtom } from 'jotai'; function fetchFromLocalStorage(key) { try { @@ -67,19 +67,15 @@ const getPublish = async (myName) => { }; export const useQortalGetSaveSettings = (myName, isAuthenticated) => { - const setSortablePinnedApps = useSetRecoilState(sortablePinnedAppsAtom); - const setCanSave = useSetRecoilState(canSaveSettingToQdnAtom); - const setSettingsQDNLastUpdated = useSetRecoilState( - settingsQDNLastUpdatedAtom - ); - const [settingsLocalLastUpdated] = useRecoilState( - settingsLocalLastUpdatedAtom - ); - const [isUsingImportExportSettings] = useRecoilState( + const setSortablePinnedApps = useSetAtom(sortablePinnedAppsAtom); + const setCanSave = useSetAtom(canSaveSettingToQdnAtom); + const setSettingsQDNLastUpdated = useSetAtom(settingsQDNLastUpdatedAtom); + + const [settingsLocalLastUpdated] = useAtom(settingsLocalLastUpdatedAtom); + const [isUsingImportExportSettings] = useAtom( isUsingImportExportSettingsAtom ); - - const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom); + const setOldPinnedApps = useSetAtom(oldPinnedAppsAtom); const getSavedSettings = useCallback( async (myName, settingsLocalLastUpdated) => { diff --git a/src/useRetrieveDataLocalStorage.tsx b/src/useRetrieveDataLocalStorage.tsx index 41c2b8e..6ddc673 100644 --- a/src/useRetrieveDataLocalStorage.tsx +++ b/src/useRetrieveDataLocalStorage.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect } from 'react'; -import { useSetRecoilState } from 'recoil'; import { isUsingImportExportSettingsAtom, oldPinnedAppsAtom, @@ -7,6 +6,7 @@ import { settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom, } from './atoms/global'; +import { useSetAtom } from 'jotai'; function fetchFromLocalStorage(key) { try { @@ -22,21 +22,13 @@ function fetchFromLocalStorage(key) { } export const useRetrieveDataLocalStorage = (address) => { - const setSortablePinnedApps = useSetRecoilState(sortablePinnedAppsAtom); - - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); - - const setIsUsingImportExportSettings = useSetRecoilState( + const setSortablePinnedApps = useSetAtom(sortablePinnedAppsAtom); + const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom); + const setIsUsingImportExportSettings = useSetAtom( isUsingImportExportSettingsAtom ); - - const setSettingsQDNLastUpdated = useSetRecoilState( - settingsQDNLastUpdatedAtom - ); - - const setOldPinnedApps = useSetRecoilState(oldPinnedAppsAtom); + const setSettingsQDNLastUpdated = useSetAtom(settingsQDNLastUpdatedAtom); + const setOldPinnedApps = useSetAtom(oldPinnedAppsAtom); const getSortablePinnedApps = useCallback(() => { const pinnedAppsLocal = fetchFromLocalStorage('ext_saved_settings');