diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index 0089c46fe..c10fef1f7 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -110,6 +110,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "dev": true, "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -130,6 +131,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -143,6 +145,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -151,6 +154,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -159,6 +163,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -717,6 +722,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, "engines": { "node": ">=10" }, @@ -728,6 +734,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -772,6 +779,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -800,12 +808,14 @@ "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -819,7 +829,8 @@ "node_modules/@types/node": { "version": "18.16.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", - "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" + "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==", + "devOptional": true }, "node_modules/@types/plist": { "version": "3.0.2", @@ -835,6 +846,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -864,6 +876,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, "optional": true, "dependencies": { "@types/node": "*" @@ -1144,6 +1157,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, "optional": true }, "node_modules/brace-expansion": { @@ -1194,6 +1208,7 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, "engines": { "node": "*" } @@ -1269,6 +1284,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, "engines": { "node": ">=10.6.0" } @@ -1277,6 +1293,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1396,6 +1413,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, "dependencies": { "mimic-response": "^1.0.0" }, @@ -1572,6 +1590,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, "engines": { "node": ">=10" } @@ -1580,6 +1599,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, "optional": true, "dependencies": { "has-property-descriptors": "^1.0.0", @@ -1613,6 +1633,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, "optional": true }, "node_modules/dir-compare": { @@ -1727,6 +1748,7 @@ "version": "28.2.1", "resolved": "https://registry.npmjs.org/electron/-/electron-28.2.1.tgz", "integrity": "sha512-wlzXf+OvOiVlBf9dcSeMMf7Q+N6DG+wtgFbMK0sA/JpIJcdosRbLMQwLg/LTwNVKIbmayqFLDp4FmmFkEMhbYA==", + "dev": true, "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -1852,6 +1874,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "engines": { "node": ">=6" } @@ -1866,6 +1889,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, "optional": true }, "node_modules/esbuild": { @@ -1918,6 +1942,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -1938,6 +1963,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -1978,6 +2004,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, "dependencies": { "pend": "~1.2.0" } @@ -2104,6 +2131,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, "optional": true }, "node_modules/get-caller-file": { @@ -2118,6 +2146,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "optional": true, "dependencies": { "function-bind": "^1.1.1", @@ -2133,6 +2162,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -2206,6 +2236,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -2223,6 +2254,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "optional": true, "dependencies": { "define-properties": "^1.1.3" @@ -2238,6 +2270,7 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -2267,6 +2300,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "optional": true, "dependencies": { "function-bind": "^1.1.1" @@ -2288,6 +2322,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, "optional": true, "dependencies": { "get-intrinsic": "^1.1.1" @@ -2300,6 +2335,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -2312,6 +2348,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -2335,7 +2372,8 @@ "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, "node_modules/http-proxy-agent": { "version": "5.0.0", @@ -2355,6 +2393,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -2598,7 +2637,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -2610,6 +2650,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, "optional": true }, "node_modules/json5": { @@ -2639,6 +2680,7 @@ "version": "4.5.2", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -2668,6 +2710,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, "engines": { "node": ">=8" } @@ -2687,6 +2730,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -2732,6 +2776,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, "engines": { "node": ">=4" } @@ -2857,6 +2902,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, "engines": { "node": ">=10" }, @@ -2868,6 +2914,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -2885,6 +2932,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, "engines": { "node": ">=8" } @@ -2922,7 +2970,8 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -2986,6 +3035,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -3025,6 +3075,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, "engines": { "node": ">=10" }, @@ -3123,12 +3174,14 @@ "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -3164,6 +3217,7 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -3243,12 +3297,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, "optional": true }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -3264,6 +3320,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -3404,6 +3461,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true, "optional": true }, "node_modules/stat-mode": { @@ -3475,6 +3533,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, "dependencies": { "debug": "^4.1.0" }, @@ -3808,6 +3867,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/apps/mobile/app/components/container/index.tsx b/apps/mobile/app/components/container/index.tsx index 6b79d34e8..4913a4003 100644 --- a/apps/mobile/app/components/container/index.tsx +++ b/apps/mobile/app/components/container/index.tsx @@ -28,7 +28,7 @@ export const Container = ({ children }: PropsWithChildren) => { const [height, setHeight] = useState(0); const windowHeightRef = useRef(Dimensions.get("window").height); const { height: windowHeight } = useWindowDimensions(); - + const timerRef = useRef(); useEffect(() => { if (windowHeight !== windowHeightRef.current) { setHeight(0); @@ -46,9 +46,13 @@ export const Container = ({ children }: PropsWithChildren) => { width: "100%" }} onLayout={(event) => { - if (!keyboard.keyboardShown) { - setHeight(event.nativeEvent.layout.height); - } + const height = event.nativeEvent.layout.height; + clearTimeout(timerRef.current); + timerRef.current = setTimeout(() => { + if (!keyboard.keyboardShown) { + setHeight(height); + } + }, 500); }} > {children} diff --git a/apps/mobile/app/components/dialogs/color-picker/index.tsx b/apps/mobile/app/components/dialogs/color-picker/index.tsx index 91dcfe7f9..1ce21a359 100644 --- a/apps/mobile/app/components/dialogs/color-picker/index.tsx +++ b/apps/mobile/app/components/dialogs/color-picker/index.tsx @@ -75,7 +75,7 @@ const ColorPicker = ({ style={{ width: "100%", height: 250, - backgroundColor: selectedColor, + backgroundColor: colors.primary.background, borderRadius: 10 }} > @@ -170,7 +170,6 @@ const ColorPicker = ({ return ToastManager.error( new Error(`Color #${selectedColor} already exists`) ); - const id = await db.colors.add({ title: title.current, colorCode: selectedColor diff --git a/apps/mobile/app/components/list/reorderable-list.tsx b/apps/mobile/app/components/list/reorderable-list.tsx index 8adfd25b0..21455676c 100644 --- a/apps/mobile/app/components/list/reorderable-list.tsx +++ b/apps/mobile/app/components/list/reorderable-list.tsx @@ -23,9 +23,9 @@ import { FlatList, StyleSheet, View } from "react-native"; import { DraxList, DraxListProps, - DraxListRenderItemContent, - DraxProvider + DraxListRenderItemContent } from "react-native-drax"; + import { tabBarRef } from "../../utils/global-refs"; import { SIZE } from "../../utils/size"; import { useSideBarDraggingStore } from "../side-menu/dragging-store"; @@ -74,6 +74,7 @@ function ReorderableList({ const renderItemContent: DraxListRenderItemContent = React.useCallback( (info, props) => { const isHidden = hiddenItemsState.indexOf(info?.item?.id) > -1; + return isHidden && !dragging ? null : ( ({ } return ( - - - - useSideBarDraggingStore.setState({ - dragging: true - }) + + { - const newOrder = getOrderedItems().map((item) => item.id); - const element = newOrder.splice(fromIndex, 1)[0]; - if (toIndex === 0) { - newOrder.unshift(element); - } else { - newOrder.splice(toIndex, 0, element); - } - setItemsOrder(newOrder); - onListOrderChanged?.(newOrder); - }} - onItemDragEnd={(e) => { - console.log(e.receiver?.receiveOffset); - }} - keyExtractor={(item) => (item as any).id} - /> - - + }} + longPressDelay={500} + onItemDragStart={() => + useSideBarDraggingStore.setState({ + dragging: true + }) + } + disableVirtualization + itemsDraggable={disableDefaultDrag ? dragging : true} + lockItemDragsToMainAxis + onItemReorder={({ fromIndex, fromItem, toIndex, toItem }) => { + const newOrder = getOrderedItems().map((item) => item.id); + const element = newOrder.splice(fromIndex, 1)[0]; + if (toIndex === 0) { + newOrder.unshift(element); + } else { + newOrder.splice(toIndex, 0, element); + } + setItemsOrder(newOrder); + onListOrderChanged?.(newOrder); + }} + keyExtractor={(item) => (item as any).id} + /> + ); } diff --git a/apps/mobile/app/components/properties/color-tags.tsx b/apps/mobile/app/components/properties/color-tags.tsx index 54d6e2024..ebc3b0592 100644 --- a/apps/mobile/app/components/properties/color-tags.tsx +++ b/apps/mobile/app/components/properties/color-tags.tsx @@ -111,6 +111,7 @@ export const ColorTags = ({ item }: { item: Note }) => { visible={visible} setVisible={setVisible} onColorAdded={async (color) => { + await db.relations.to(note, "color").unlink(); await db.relations.add(color, note); useRelationStore.getState().update(); useMenuStore.getState().setColorNotes(); diff --git a/apps/mobile/app/components/sheets/editor-tabs/index.tsx b/apps/mobile/app/components/sheets/editor-tabs/index.tsx index d6cc89f39..4a90dceef 100644 --- a/apps/mobile/app/components/sheets/editor-tabs/index.tsx +++ b/apps/mobile/app/components/sheets/editor-tabs/index.tsx @@ -83,7 +83,6 @@ const TabItemComponent = (props: { onPress={() => { if (!props.isFocused) { useTabStore.getState().focusTab(props.tab.id); - props.close?.(); if (props.tab.locked) { eSendEvent(eUnlockNote); } @@ -94,6 +93,7 @@ const TabItemComponent = (props: { }, 300); } } + props.close?.(); }} onLongPress={() => { useTabStore.getState().updateTab(props.tab.id, { diff --git a/apps/mobile/app/components/sheets/move-notes/movenote.tsx b/apps/mobile/app/components/sheets/move-notes/movenote.tsx index fd18fc202..c44a689b1 100644 --- a/apps/mobile/app/components/sheets/move-notes/movenote.tsx +++ b/apps/mobile/app/components/sheets/move-notes/movenote.tsx @@ -105,7 +105,7 @@ export const MoveNotes = ({ diff --git a/apps/mobile/app/components/sheets/notebook-sheet/index.tsx b/apps/mobile/app/components/sheets/notebook-sheet/index.tsx index 3c4bef89c..58eeebc6e 100644 --- a/apps/mobile/app/components/sheets/notebook-sheet/index.tsx +++ b/apps/mobile/app/components/sheets/notebook-sheet/index.tsx @@ -205,7 +205,7 @@ export const NotebookSheet = () => { style={{ position: "absolute", right: 12, - marginTop: -80 + marginTop: -90 }} > . import { useThemeColors } from "@notesnook/theme"; import React, { useCallback } from "react"; -import { FlatList, View } from "react-native"; +import { View } from "react-native"; +import { DraxProvider, DraxScrollView } from "react-native-drax"; import { notesnook } from "../../../e2e/test.ids"; import { db } from "../../common/database"; import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets"; @@ -134,16 +135,12 @@ export const SideMenu = React.memo( paddingTop: insets.top }} > - "mainMenuView"} - renderItem={renderItem} - /> + + + {renderItem()} + + + { if ( useTabStore.getState().getTab(useTabStore.getState().currentTab).locked ) { - console.log("Unlocking note...."); eSendEvent(eUnlockNote); + } else { + editorState().currentlyEditing = true; + eSendEvent(eOnLoadNote); } } } else { diff --git a/apps/mobile/app/screens/editor/index.tsx b/apps/mobile/app/screens/editor/index.tsx index 3fbfc5423..9e4e8ff0d 100755 --- a/apps/mobile/app/screens/editor/index.tsx +++ b/apps/mobile/app/screens/editor/index.tsx @@ -19,7 +19,6 @@ along with this program. If not, see . /* eslint-disable @typescript-eslint/no-var-requires */ -import { useThemeColors } from "@notesnook/theme"; import React, { forwardRef, useCallback, @@ -33,17 +32,12 @@ import WebView from "react-native-webview"; import { ShouldStartLoadRequest } from "react-native-webview/lib/WebViewTypes"; import { notesnook } from "../../../e2e/test.ids"; import { db } from "../../common/database"; -import { IconButton } from "../../components/ui/icon-button"; -import { useDBItem } from "../../hooks/use-db-item"; -import useKeyboard from "../../hooks/use-keyboard"; import BiometicService from "../../services/biometrics"; import { ToastManager, eSendEvent, eSubscribeEvent } from "../../services/event-manager"; -import { useSettingStore } from "../../stores/use-setting-store"; -import { getElevationStyle } from "../../utils/elevation"; import { eOnLoadNote, eUnlockNote, @@ -51,13 +45,13 @@ import { eUnlockWithPassword } from "../../utils/events"; import { openLinkInBrowser } from "../../utils/functions"; +import EditorOverlay from "./loading"; import { EDITOR_URI } from "./source"; import { EditorProps, useEditorType } from "./tiptap/types"; import { useEditor } from "./tiptap/use-editor"; import { useEditorEvents } from "./tiptap/use-editor-events"; import { syncTabs, useTabStore } from "./tiptap/use-tab-store"; import { editorController, editorState } from "./tiptap/utils"; -import EditorOverlay from "./loading"; const style: ViewStyle = { height: "100%", @@ -105,6 +99,7 @@ const Editor = React.memo( useImperativeHandle(ref, () => ({ get: () => editor })); + useLockedNoteHandler(); const onError = useCallback(() => { renderKey.current = @@ -178,7 +173,6 @@ const Editor = React.memo( onMessage={onMessage || undefined} /> - ); } @@ -188,12 +182,8 @@ const Editor = React.memo( export default Editor; -const LockOverlay = () => { - const tab = useTabStore((state) => - state.tabs.find((t) => t.id === state.currentTab) - ); - const isAppLoading = useSettingStore((state) => state.isAppLoading); - const [item] = useDBItem(isAppLoading ? undefined : tab?.noteId, "note"); +const useLockedNoteHandler = () => { + const tab = useTabStore((state) => state.getTab(state.currentTab)); const tabRef = useRef(tab); tabRef.current = tab; @@ -201,8 +191,8 @@ const LockOverlay = () => { for (const tab of useTabStore.getState().tabs) { const noteId = useTabStore.getState().getTab(tab.id)?.noteId; if (!noteId) continue; - if (tab.noteLocked) { - useTabStore.getState().updateTab(tab.id, { + if (tabRef.current && tabRef.current.noteLocked) { + useTabStore.getState().updateTab(tabRef.current.id, { locked: true }); } @@ -224,15 +214,18 @@ const LockOverlay = () => { useEffect(() => { const unlockWithBiometrics = async () => { try { - if (!item || !tabRef.current) return; + if (!tabRef.current?.noteLocked || !tabRef.current) return; console.log("Trying to unlock with biometrics..."); const credentials = await BiometicService.getCredentials( "Unlock note", "Unlock note to open it in editor. If biometrics are not working, you can enter device pin to unlock vault." ); - if (credentials && credentials?.password) { - const note = await db.vault.open(item.id, credentials?.password); + if (credentials && credentials?.password && tabRef.current.noteId) { + const note = await db.vault.open( + tabRef.current.noteId, + credentials?.password + ); eSendEvent(eOnLoadNote, { item: note }); @@ -253,7 +246,7 @@ const LockOverlay = () => { password: string; biometrics?: boolean; }) => { - if (!item || !tabRef.current) return; + if (!tabRef.current?.noteId || !tabRef.current) return; if (!password || password.trim().length === 0) { ToastManager.show({ heading: "Password not entered", @@ -264,7 +257,7 @@ const LockOverlay = () => { } try { - const note = await db.vault.open(item.id, password); + const note = await db.vault.open(tabRef.current?.noteId, password); if (enrollBiometrics) { try { await db.vault.unlock(password); @@ -343,7 +336,7 @@ const LockOverlay = () => { return () => { subs.map((s) => s?.unsubscribe()); }; - }, [item]); + }, [tab?.id]); return null; }; diff --git a/apps/mobile/app/screens/editor/tiptap/commands.ts b/apps/mobile/app/screens/editor/tiptap/commands.ts index 954326d6a..cf0ca480a 100644 --- a/apps/mobile/app/screens/editor/tiptap/commands.ts +++ b/apps/mobile/app/screens/editor/tiptap/commands.ts @@ -124,12 +124,13 @@ const statusBar = statusBars[${tabId}]; if (typeof editor !== "undefined") { editor.commands.blur(); + editor.commands.clearContent(false); } typeof editorTitle !== "undefined" && editorTitle.current && editorTitle.current?.blur(); -if (typeof editorController.content !== undefined) editorController.content.current = null; +if (typeof editorController.content !== undefined) editorController.content.current = ''; editorController.onUpdate(); -editorController.setTitle(null); +editorController.setTitle(''); if (typeof statusBar !== "undefined") { statusBar.current.resetWords(); statusBar.current.set({date:"",saved:""}); diff --git a/apps/mobile/app/screens/editor/tiptap/editor-events.ts b/apps/mobile/app/screens/editor/tiptap/editor-events.ts index e30dbb98f..2a4152ab9 100644 --- a/apps/mobile/app/screens/editor/tiptap/editor-events.ts +++ b/apps/mobile/app/screens/editor/tiptap/editor-events.ts @@ -47,5 +47,6 @@ export const EventTypes = { unlock: "editor-events:unlock", unlockWithBiometrics: "editor-events:unlock-biometrics", disableReadonlyMode: "editor-events:disable-readonly-mode", - readonlyEditorLoaded: "readonlyEditorLoaded" + readonlyEditorLoaded: "readonlyEditorLoaded", + error: "editorError" }; diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx similarity index 97% rename from apps/mobile/app/screens/editor/tiptap/use-editor-events.ts rename to apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx index 21fc2f4b7..e9011c995 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor-events.ts +++ b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx @@ -24,7 +24,7 @@ import { ItemReference } from "@notesnook/core/dist/types"; import type { Attachment } from "@notesnook/editor/dist/extensions/attachment/index"; import { getDefaultPresets } from "@notesnook/editor/dist/toolbar/tool-definitions"; import Clipboard from "@react-native-clipboard/clipboard"; -import { useCallback, useEffect, useRef } from "react"; +import React, { useCallback, useEffect, useRef } from "react"; import { BackHandler, InteractionManager, @@ -47,7 +47,8 @@ import { ToastManager, eSendEvent, eSubscribeEvent, - eUnSubscribeEvent + eUnSubscribeEvent, + presentSheet } from "../../../services/event-manager"; import Navigation from "../../../services/navigation"; import SettingsService from "../../../services/settings"; @@ -74,6 +75,7 @@ import { EventTypes } from "./editor-events"; import { EditorMessage, EditorProps, useEditorType } from "./types"; import { useTabStore } from "./use-tab-store"; import { EditorEvents, editorState } from "./utils"; +import { Issue } from "../../../components/sheets/github/issue"; const publishNote = async () => { const user = useUserStore.getState().user; @@ -274,6 +276,7 @@ export const useEditorEvents = ( }, [onBackPress]); const onLoadNote = useCallback(async () => { + console.log("Loading..."); InteractionManager.runAfterInteractions(() => { if (!DDS.isTab) { handleBack.current = BackHandler.addEventListener( @@ -574,6 +577,18 @@ export const useEditorEvents = ( EditorTabs.present(); break; } + case EventTypes.error: { + presentSheet({ + component: ( + + ) + }); + break; + } case EventTypes.tabFocused: { console.log( "Focused tab", diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor.ts b/apps/mobile/app/screens/editor/tiptap/use-editor.ts index c835d4bdd..2a3b1e728 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor.ts +++ b/apps/mobile/app/screens/editor/tiptap/use-editor.ts @@ -367,6 +367,9 @@ export const useEditor = ( blockId?: string; presistTab?: boolean; }) => { + if (!event) return; + console.log(event.item?.id, event?.item?.title, "loading note..."); + if (event.blockId) { blockIdRef.current = event.blockId; } @@ -401,10 +404,11 @@ export const useEditor = ( if (currentTab?.previewTab && item.id !== currentTab.noteId) { await commands.setLoading(true, useTabStore.getState().currentTab); } - - const noteIsLocked = - (await db.vaults.itemExists(event.item as ItemReference)) && - !(event.item as NoteWithContent).content; + const isLockedNote = await db.vaults.itemExists( + event.item as ItemReference + ); + const tabLocked = + isLockedNote && !(event.item as NoteWithContent).content; // If note was already opened in a tab, focus that tab. if (typeof event.tabId !== "number") { @@ -413,8 +417,8 @@ export const useEditor = ( if (typeof tabId === "number") { useTabStore.getState().updateTab(tabId, { readonly: event.item.readonly || readonly, - locked: noteIsLocked, - noteLocked: noteIsLocked + locked: tabLocked, + noteLocked: isLockedNote }); useTabStore.getState().focusTab(tabId); setTimeout(() => { @@ -431,8 +435,8 @@ export const useEditor = ( // Open note in new tab. useTabStore.getState().newTab({ readonly: event.item.readonly || readonly, - locked: noteIsLocked, - noteLocked: noteIsLocked, + locked: tabLocked, + noteLocked: isLockedNote, noteId: event.item.id, previewTab: false }); @@ -442,8 +446,8 @@ export const useEditor = ( // Otherwise we focus the preview tab or create one to open the note in. useTabStore.getState().focusPreviewTab(event.item.id, { readonly: event.item.readonly || readonly, - locked: noteIsLocked, - noteLocked: noteIsLocked + locked: tabLocked, + noteLocked: isLockedNote }); } } @@ -467,7 +471,7 @@ export const useEditor = ( state.current.movedAway = false; state.current.currentlyEditing = true; - if (!noteIsLocked) { + if (!tabLocked) { await loadContent(item); } @@ -530,6 +534,7 @@ export const useEditor = ( } }, 300); } + postMessage(EditorEvents.theme, theme); }, [ commands, @@ -538,7 +543,8 @@ export const useEditor = ( overlay, postMessage, readonly, - reset + reset, + theme ] ); @@ -554,6 +560,8 @@ export const useEditor = ( if (isDeleted(data) || isTrashItem(data)) { const tabId = useTabStore.getState().getTabForNote(data.id); if (tabId !== undefined) { + console.log("Removing tab"); + await commands.clearContent(tabId); useTabStore.getState().removeTab(tabId); } return; @@ -781,7 +789,9 @@ export const useEditor = ( const onLoad = useCallback(async () => { if (currentNotes.current) overlay(true); - postMessage(EditorEvents.theme, theme); + setTimeout(() => { + postMessage(EditorEvents.theme, theme); + }); commands.setInsets( isDefaultEditor ? insets : { top: 0, left: 0, right: 0, bottom: 0 } ); diff --git a/apps/mobile/app/screens/settings/user-section.js b/apps/mobile/app/screens/settings/user-section.js index 648573dc9..f8ef60463 100644 --- a/apps/mobile/app/screens/settings/user-section.js +++ b/apps/mobile/app/screens/settings/user-section.js @@ -44,7 +44,7 @@ export const getTimeLeft = (t2) => { }; }; -const ProfilePicPlaceholder = () => { +const ProfilePicPlaceholder = (props) => { const { colors } = useThemeColors(); return ( { alignItems: "center" }} activeOpacity={0.9} - onPress={() => { - const theme = - useThemeStore.getState().colorScheme === "dark" - ? useThemeStore.getState().darkTheme - : useThemeStore.getState().lightTheme; - - ImagePicker.openPicker({ - compressImageMaxWidth: 256, - compressImageMaxHeight: 256, - compressImageQuality: 0.8, - avoidEmptySpaceAroundImage: true, - cropping: true, - cropperCircleOverlay: true, - mediaType: "photo", - forceJpg: true, - includeBase64: true, - writeTempFile: false, - cropperToolbarColor: theme.scopes.base.primary.background, - cropperToolbarTitle: "Edit profile picture", - cropperActiveWidgetColor: theme.scopes.base.primary.accent, - cropperToolbarWidgetColor: theme.scopes.base.primary.icon - }).then(async (image) => { - if (!image.data) return; - await db.settings.setProfile({ - profilePicture: "data:image/jpeg;base64," + image.data - }); - useUserStore.setState({ - profile: db.settings.getProfile() - }); - }); - }} + onPress={props?.onChangePicture} > { ); }; +const onChangePicture = () => { + const theme = + useThemeStore.getState().colorScheme === "dark" + ? useThemeStore.getState().darkTheme + : useThemeStore.getState().lightTheme; + + ImagePicker.openPicker({ + compressImageMaxWidth: 256, + compressImageMaxHeight: 256, + compressImageQuality: 0.8, + avoidEmptySpaceAroundImage: true, + cropping: true, + cropperCircleOverlay: true, + mediaType: "photo", + forceJpg: true, + includeBase64: true, + writeTempFile: false, + cropperToolbarColor: theme.scopes.base.primary.background, + cropperToolbarTitle: "Edit profile picture", + cropperActiveWidgetColor: theme.scopes.base.primary.accent, + cropperToolbarWidgetColor: theme.scopes.base.primary.icon + }).then(async (image) => { + if (!image.data) return; + await db.settings.setProfile({ + profilePicture: "data:image/jpeg;base64," + image.data + }); + useUserStore.setState({ + profile: db.settings.getProfile() + }); + }); +}; + const SettingsUserSection = ({ item }) => { const { colors } = useThemeColors(); const user = useUserStore((state) => state.user); @@ -145,18 +147,23 @@ const SettingsUserSection = ({ item }) => { }} > {userProfile?.profilePicture ? ( - + + + ) : ( - + )} diff --git a/apps/theme-builder/package-lock.json b/apps/theme-builder/package-lock.json index 23e3d6fee..c2d08cfc9 100644 --- a/apps/theme-builder/package-lock.json +++ b/apps/theme-builder/package-lock.json @@ -977,7 +977,7 @@ }, "../web": { "name": "@notesnook/web", - "version": "3.0.7-beta", + "version": "3.0.10-beta", "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { diff --git a/packages/editor-mobile/package-lock.json b/packages/editor-mobile/package-lock.json index 13e951443..646d6db0f 100644 --- a/packages/editor-mobile/package-lock.json +++ b/packages/editor-mobile/package-lock.json @@ -42,38 +42,37 @@ "@notesnook/theme": "file:../theme", "@notesnook/ui": "file:../ui", "@social-embed/lib": "^0.0.2-next.1", - "@tiptap/core": "2.1.12", - "@tiptap/extension-character-count": "2.1.12", - "@tiptap/extension-color": "2.1.12", - "@tiptap/extension-font-family": "2.1.12", - "@tiptap/extension-history": "2.1.12", - "@tiptap/extension-horizontal-rule": "2.1.12", - "@tiptap/extension-link": "^2.1.16", - "@tiptap/extension-list-keymap": "2.1.12", - "@tiptap/extension-placeholder": "2.1.12", - "@tiptap/extension-subscript": "2.1.12", - "@tiptap/extension-superscript": "2.1.12", - "@tiptap/extension-table": "2.1.12", - "@tiptap/extension-table-cell": "2.1.12", - "@tiptap/extension-table-header": "2.1.12", - "@tiptap/extension-table-row": "2.1.12", - "@tiptap/extension-task-item": "2.1.12", - "@tiptap/extension-task-list": "2.1.12", - "@tiptap/extension-text-align": "2.1.12", - "@tiptap/extension-text-style": "2.1.12", - "@tiptap/extension-underline": "2.1.12", - "@tiptap/pm": "2.1.12", - "@tiptap/starter-kit": "2.1.12", + "@tiptap/core": "2.2.4", + "@tiptap/extension-character-count": "2.2.4", + "@tiptap/extension-color": "2.2.4", + "@tiptap/extension-font-family": "2.2.4", + "@tiptap/extension-history": "2.2.4", + "@tiptap/extension-horizontal-rule": "2.2.4", + "@tiptap/extension-list-keymap": "2.2.4", + "@tiptap/extension-placeholder": "2.2.4", + "@tiptap/extension-subscript": "2.2.4", + "@tiptap/extension-superscript": "2.2.4", + "@tiptap/extension-table": "2.2.4", + "@tiptap/extension-table-cell": "2.2.4", + "@tiptap/extension-table-header": "2.2.4", + "@tiptap/extension-table-row": "2.2.4", + "@tiptap/extension-task-item": "2.2.4", + "@tiptap/extension-task-list": "2.2.4", + "@tiptap/extension-text-align": "2.2.4", + "@tiptap/extension-text-style": "2.2.4", + "@tiptap/extension-underline": "2.2.4", + "@tiptap/pm": "2.2.4", + "@tiptap/starter-kit": "2.2.4", "async-mutex": "^0.4.0", "clipboard-polyfill": "4.0.0", "detect-indent": "^7.0.0", "entities": "^4.5.0", - "katex": "0.16.4", + "katex": "0.16.9", "linkifyjs": "^4.1.3", "nanoid": "^4.0.1", "prism-themes": "^1.9.0", "prosemirror-codemark": "^0.4.2", - "prosemirror-view": "1.32.2", + "prosemirror-view": "1.33.1", "re-resizable": "^6.9.11", "react-colorful": "^5.6.1", "redent": "^4.0.0", diff --git a/packages/editor-mobile/src/App.tsx b/packages/editor-mobile/src/App.tsx index 05d4ee4cd..80466ca58 100644 --- a/packages/editor-mobile/src/App.tsx +++ b/packages/editor-mobile/src/App.tsx @@ -23,7 +23,7 @@ import { themeToCSS, useThemeEngineStore } from "@notesnook/theme"; -import { useMemo } from "react"; +import React, { useMemo } from "react"; import { Freeze } from "react-freeze"; import "./App.css"; import Tiptap from "./components/editor"; @@ -31,15 +31,131 @@ import { TabContext, useTabStore } from "./hooks/useTabStore"; import { EmotionEditorTheme } from "./theme-factory"; import { getTheme } from "./utils"; import { ReadonlyEditorProvider } from "./components/readonly-editor"; +import { error } from "console"; const currentTheme = getTheme(); if (currentTheme) { useThemeEngineStore.getState().setTheme(currentTheme); } +class ExceptionHandler extends React.Component<{ + children: React.ReactNode; + component: string; +}> { + state: { + error: Error | null; + hasError: boolean; + } = { + hasError: false, + error: null + }; + static getDerivedStateFromError(error: Error) { + return { hasError: true, error: error }; + } + + componentDidCatch(_error: Error) { + // A custom error logging function + post("editorError", { + message: "Editor crashed: " + _error.message, + stack: _error.stack + }); + } + + render() { + return this.state.hasError ? ( +
+

+ An error occurred. +

+ + + + +
+ ) : ( + this.props.children + ); + } +} + function App(): JSX.Element { const tabs = useTabStore((state) => state.tabs); const currentTab = useTabStore((state) => state.currentTab); + return ( @@ -61,7 +177,17 @@ function App(): JSX.Element { ); } -export default App; +export const withErrorBoundry = (Element: React.ElementType, name: string) => { + return function ErrorBoundary() { + return ( + + + + ); + }; +}; + +export default withErrorBoundry(App, "Editor"); function GlobalStyles() { const theme = useThemeEngineStore((store) => store.theme); diff --git a/packages/editor-mobile/src/components/editor.tsx b/packages/editor-mobile/src/components/editor.tsx index 1a961377a..0c4b806eb 100644 --- a/packages/editor-mobile/src/components/editor.tsx +++ b/packages/editor-mobile/src/components/editor.tsx @@ -158,6 +158,27 @@ const Tiptap = ({ }, 500); } }, + onCreate() { + setTimeout(() => { + const noteState = tabRef.current.noteId + ? useTabStore.getState().noteState[tabRef.current.noteId] + : undefined; + const top = noteState?.top; + logger("info", tabRef.current.noteId, noteState?.top); + + if (noteState?.to || noteState?.from) { + editors[tabRef.current.id]?.chain().setTextSelection({ + to: noteState.to, + from: noteState.from + }); + } + containerRef.current?.scrollTo({ + left: 0, + top: top || 0, + behavior: "auto" + }); + }, 32); + }, downloadOptions: { corsHost: settings.corsProxy }, @@ -182,28 +203,8 @@ const Tiptap = ({ const update = useCallback(() => { logger("info", "LOADING NOTE..."); - _editor.commands.setTextSelection(0); + editors[tabRef.current.id]?.commands.setTextSelection(0); setTick((tick) => tick + 1); - setTimeout(() => { - const noteState = tabRef.current.noteId - ? useTabStore.getState().noteState[tabRef.current.noteId] - : undefined; - const top = noteState?.top; - - if (noteState?.to || noteState?.from) { - editors[tabRef.current.id]?.chain().setTextSelection({ - to: noteState.to, - from: noteState.from - }); - } - - containerRef.current?.scrollTo({ - left: 0, - top: top || 0, - behavior: "auto" - }); - }, 32); - globalThis.editorControllers[tabRef.current.id]?.setTitlePlaceholder( "Note title" ); @@ -256,6 +257,12 @@ const Tiptap = ({ from: noteState.from }); } + } else { + containerRef.current?.scrollTo({ + left: 0, + top: 0, + behavior: "auto" + }); } if ( @@ -284,6 +291,7 @@ const Tiptap = ({ } if (state.currentTab === prevState.currentTab) return; updateScrollPosition(state); + logger("info", "updating scroll position"); }); logger("info", tabRef.current.id, "active"); return () => { @@ -436,7 +444,7 @@ const Tiptap = ({ userSelect: "none" }} > - {controller.title} ajklsdksa jdlksaj dksljk jdalkjskldj + {controller.title}

) : null} -

+
{ + if (tab.locked) return; onClickBottomArea(); }} onMouseDown={(e) => { + if (tab.locked) return; if (globalThis.keyboardShown) { e.preventDefault(); } @@ -687,7 +703,7 @@ const Tiptap = ({ style={{ flexGrow: 1, width: "100%", - minHeight: 250 + minHeight: 300 }} />
@@ -730,7 +746,6 @@ const TiptapProvider = (): JSX.Element => { editorContainer.style.cursor = "text"; editorContainer.style.padding = "0px 12px"; editorContainer.style.color = colors.primary.paragraph; - editorContainer.style.paddingBottom = `150px`; editorContainer.style.fontSize = `${settings.fontSize}px`; editorContainer.style.fontFamily = getFontById(settings.fontFamily)?.font || "sans-serif"; diff --git a/packages/editor-mobile/src/components/title.tsx b/packages/editor-mobile/src/components/title.tsx index 71a1da8b0..8da144eaf 100644 --- a/packages/editor-mobile/src/components/title.tsx +++ b/packages/editor-mobile/src/components/title.tsx @@ -75,6 +75,14 @@ function Title({ }; }, [tab.id, titleRef]); + useEffect(() => { + if (!loading) { + setTimeout(() => { + resizeTextarea(); + }); + } + }, [loading, resizeTextarea]); + return loading ? null : ( <>
{ - console.time("wordCounter"); statusBars[tab.id]?.current?.updateWords(); - console.timeEnd("wordCounter"); }, ms); }, [tab.id] @@ -168,6 +166,7 @@ export function useEditorController({ const contentChange = useCallback( (editor: Editor, ignoreEdit?: boolean) => { + if (editorControllers[tab.id]?.loading) return; const currentSessionId = globalThis.sessionId; post(EventTypes.contentchange, undefined, tab.id, tab.noteId); if (!editor) return; @@ -195,20 +194,31 @@ export function useEditorController({ const scroll = useCallback( (_event: React.UIEvent) => { - if (!tab) return; - if (tab.noteId) { - useTabStore.getState().setNoteState(tab.noteId, { + const noteId = useTabStore + .getState() + .getNoteIdForTab(useTabStore.getState().currentTab); + if (noteId) { + useTabStore.getState().setNoteState(noteId, { top: _event.currentTarget.scrollTop }); } }, - [tab] + [] ); const onUpdate = useCallback(() => { update(); + logger("info", "Updating content..."); }, [update]); + useEffect(() => { + if (tab.locked) { + htmlContentRef.current = ""; + setLoading(true); + onUpdate(); + } + }, [tab.locked, onUpdate]); + const onMessage = useCallback( (event: Event & { data?: string }) => { if (event?.data?.[0] !== "{") return; diff --git a/packages/editor-mobile/src/utils/index.ts b/packages/editor-mobile/src/utils/index.ts index 8fcc40f83..046391b32 100644 --- a/packages/editor-mobile/src/utils/index.ts +++ b/packages/editor-mobile/src/utils/index.ts @@ -191,7 +191,8 @@ export const EventTypes = { unlock: "editor-events:unlock", unlockWithBiometrics: "editor-events:unlock-biometrics", disableReadonlyMode: "editor-events:disable-readonly-mode", - readonlyEditorLoaded: "readonlyEditorLoaded" + readonlyEditorLoaded: "readonlyEditorLoaded", + error: "editorError" } as const; export function randId(prefix: string) { diff --git a/packages/editor/package-lock.json b/packages/editor/package-lock.json index 923d3df32..a7f31ca6a 100644 --- a/packages/editor/package-lock.json +++ b/packages/editor/package-lock.json @@ -976,22 +976,6 @@ "@styled-system/css": "^5.1.5" } }, - "node_modules/@theme-ui/color-modes": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.16.2.tgz", - "integrity": "sha512-jWEWx53lxNgWCT38i/kwLV2rsvJz8lVZgi5oImnVwYba9VejXD23q1ckbNFJHosQ8KKXY87ht0KPC6BQFIiHtQ==", - "dev": true, - "peer": true, - "dependencies": { - "@theme-ui/core": "^0.16.2", - "@theme-ui/css": "^0.16.2", - "deepmerge": "^4.2.2" - }, - "peerDependencies": { - "@emotion/react": "^11.11.1", - "react": ">=18" - } - }, "node_modules/@theme-ui/components": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.16.1.tgz", @@ -1037,22 +1021,6 @@ "@emotion/react": "^11.11.1" } }, - "node_modules/@theme-ui/theme-provider": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.16.2.tgz", - "integrity": "sha512-LRnVevODcGqO0JyLJ3wht+PV3ZoZcJ7XXLJAJWDoGeII4vZcPQKwVy4Lpz/juHsZppQxKcB3U+sQDGBnP25irQ==", - "dev": true, - "peer": true, - "dependencies": { - "@theme-ui/color-modes": "^0.16.2", - "@theme-ui/core": "^0.16.2", - "@theme-ui/css": "^0.16.2" - }, - "peerDependencies": { - "@emotion/react": "^11.11.1", - "react": ">=18" - } - }, "node_modules/@tiptap/core": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.2.4.tgz", @@ -2527,7 +2495,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -2591,6 +2560,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -3164,6 +3134,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -3184,6 +3155,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -3315,6 +3287,7 @@ "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0" } diff --git a/packages/editor/src/hooks/use-editor.ts b/packages/editor/src/hooks/use-editor.ts index 3d751d6c4..d3d09bf9d 100644 --- a/packages/editor/src/hooks/use-editor.ts +++ b/packages/editor/src/hooks/use-editor.ts @@ -74,6 +74,7 @@ export const useEditor = ( }) ); if (oldIsFocused && !editor.isFocused) editor.commands.focus(); + options.onCreate?.({ editor: editor }); } editor.options = { ...editor.options, ...options };