diff --git a/ChangeLog.md b/ChangeLog.md index 242bdba3..ab117a0c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,11 @@ # Changelog: +* **11.06.21** + - Fixed the bug that cause the file transfer to timeout if the user hasn't been quick enough to save his file + - Fixed the emoji picker being cut off + - Fixed the file transfer sidebar not working + - Instantly reflect changes to the server icon for the bookmark menu bar + - Fixed a bug which prevented the proper context menu appear within the bookmark manage modal + * **26.05.21** - Fixed automated builds - Fixed the bookmark UI popout window diff --git a/package-lock.json b/package-lock.json index 9c200c46..c36a8ee5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -344,16 +344,24 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "chalk": { @@ -377,9 +385,9 @@ } }, "electron-to-chromium": { - "version": "1.3.695", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", - "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "escalade": { @@ -395,9 +403,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, "semver": { @@ -2215,16 +2223,24 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "chalk": { @@ -2248,9 +2264,9 @@ } }, "electron-to-chromium": { - "version": "1.3.695", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", - "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "escalade": { @@ -2281,9 +2297,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, "semver": { @@ -3248,16 +3264,24 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "chalk": { @@ -3299,9 +3323,9 @@ } }, "electron-to-chromium": { - "version": "1.3.695", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", - "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "escalade": { @@ -3343,9 +3367,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, "regexpu-core": { @@ -4225,6 +4249,26 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + } + } + }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -4534,22 +4578,30 @@ }, "dependencies": { "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "electron-to-chromium": { - "version": "1.3.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.690.tgz", - "integrity": "sha512-zPbaSv1c8LUKqQ+scNxJKv01RYFkVVF1xli+b+3Ty8ONujHjAMg+t/COmdZqrtnS1gT+g4hbSodHillymt1Lww==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "escalade": { @@ -4559,9 +4611,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true } } @@ -5034,16 +5086,24 @@ }, "dependencies": { "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "core-js-compat": { @@ -5057,9 +5117,9 @@ } }, "electron-to-chromium": { - "version": "1.3.695", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.695.tgz", - "integrity": "sha512-lz66RliUqLHU1Ojxx1A4QUxKydjiQ79Y4dZyPobs2Dmxj5aVL2TM3KoQ2Gs7HS703Bfny+ukI3KOxwAB0xceHQ==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "escalade": { @@ -5069,9 +5129,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, "semver": { @@ -5977,15 +6037,42 @@ } }, "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", - "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + } } }, "buffer": { @@ -6305,6 +6392,66 @@ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", "dev": true }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + } + } + }, "chrome-trace-event": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", @@ -7977,9 +8124,9 @@ } }, "dompurify": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.0.8.tgz", - "integrity": "sha512-vIOSyOXkMx81ghEalh4MLBtDHMx1bhKlaqHDMqM2yeitJ996SLOk5mGdDpI9ifJAgokred8Rmu219fX4OltqXw==" + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.8.tgz", + "integrity": "sha512-9H0UL59EkDLgY3dUFjLV6IEUaHm5qp3mxSqWw7Yyx4Zhk2Jn2cmLe+CNPP3xy13zl8Bqg+0NehQzkdMoVhGRww==" }, "domutils": { "version": "2.0.0", @@ -8070,12 +8217,6 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron-to-chromium": { - "version": "1.3.496", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.496.tgz", - "integrity": "sha512-TXY4mwoyowwi4Lsrq9vcTUYBThyc1b2hXaTZI13p8/FRhY2CTaq5lK+DVjhYkKiTLsKt569Xes+0J5JsVXFurQ==", - "dev": true - }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -8293,12 +8434,6 @@ "es6-symbol": "^3.1.1" } }, - "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", - "dev": true - }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -11697,9 +11832,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inline-chunks-html-webpack-plugin": { @@ -13588,9 +13723,9 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "dev": true }, "nanomatch": { @@ -13702,12 +13837,6 @@ } } }, - "node-releases": { - "version": "1.1.59", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.59.tgz", - "integrity": "sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==", - "dev": true - }, "node-sass": { "version": "4.14.1", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", @@ -14504,14 +14633,14 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "8.2.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", - "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", + "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", "dev": true, "requires": { "colorette": "^1.2.2", - "nanoid": "^3.1.20", - "source-map": "^0.6.1" + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" } }, "postcss-calc": { @@ -18671,6 +18800,12 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -20587,14 +20722,25 @@ "dev": true }, "watchpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", - "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "requires": { - "chokidar": "^2.1.8", + "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" }, "dependencies": { "anymatch": { @@ -20602,6 +20748,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, + "optional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -20612,29 +20759,19 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, + "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" } } } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "optional": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -20646,17 +20783,6 @@ "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "chokidar": { @@ -20664,6 +20790,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, + "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -20679,132 +20806,14 @@ "upath": "^1.1.1" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" } }, "fill-range": { @@ -20812,22 +20821,12 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } } }, "glob-parent": { @@ -20835,6 +20834,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, + "optional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -20845,114 +20845,29 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, + "optional": true, "requires": { "is-extglob": "^2.1.0" } } } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -21064,22 +20979,30 @@ "dev": true }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.71" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "dev": true + } } }, "electron-to-chromium": { - "version": "1.3.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.690.tgz", - "integrity": "sha512-zPbaSv1c8LUKqQ+scNxJKv01RYFkVVF1xli+b+3Ty8ONujHjAMg+t/COmdZqrtnS1gT+g4hbSodHillymt1Lww==", + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, "enhanced-resolve": { @@ -21126,9 +21049,9 @@ "dev": true }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, "p-limit": { diff --git a/package.json b/package.json index 5c0c465c..1f9e43b3 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "mini-css-extract-plugin": "^1.3.9", "mkdirp": "^0.5.1", "node-sass": "^4.14.1", - "postcss": "^8.2.8", + "postcss": "^8.3.0", "postcss-loader": "^5.2.0", "potpack": "^1.0.1", "raw-loader": "^4.0.0", @@ -103,7 +103,7 @@ "crypto-browserify": "^3.12.0", "crypto-js": "^4.0.0", "detect-browser": "^5.2.0", - "dompurify": "^2.0.8", + "dompurify": "^2.2.8", "emoji-mart": "git+https://github.com/WolverinDEV/emoji-mart.git", "emoji-regex": "^9.0.0", "highlight.js": "^10.1.1", diff --git a/shared/js/connectionlog/History.ts b/shared/js/connectionlog/History.ts index 31e4ca85..4bfb747d 100644 --- a/shared/js/connectionlog/History.ts +++ b/shared/js/connectionlog/History.ts @@ -2,9 +2,10 @@ import {LogCategory, logError, logWarn} from "tc-shared/log"; import {tr, tra} from "tc-shared/i18n/localize"; import * as loader from "tc-loader"; import {Stage} from "tc-loader"; -import {ConnectionHandler} from "tc-shared/ConnectionHandler"; +import {ConnectionHandler, ConnectionState} from "tc-shared/ConnectionHandler"; import {server_connections} from "tc-shared/ConnectionManager"; import {ServerProperties} from "tc-shared/tree/Server"; +import {Registry} from "tc-events"; export const kUnknownHistoryServerUniqueId = "unknown"; @@ -44,10 +45,17 @@ export type ConnectionHistoryServerInfo = { passwordProtected: boolean } +export interface ConnectionHistoryEvents { + notify_server_info_updated: { serverUniqueId: string, keys: (keyof ConnectionHistoryServerInfo)[] } +} + export class ConnectionHistory { + readonly events: Registry; private database: IDBDatabase; - constructor() { } + constructor() { + this.events = new Registry(); + } async initializeDatabase() { const openRequest = indexedDB.open("connection-log", 1); @@ -306,16 +314,29 @@ export class ConnectionHistory { return; } - await this.updateDatabaseServerInfo(serverUniqueId, databaseValue => { - databaseValue.name = info.name; - databaseValue.iconId = info.iconId; + const changes: (keyof ConnectionHistoryServerInfo)[] = []; + const updateValue = (databaseKey: string, infoKey: keyof ConnectionHistoryServerInfo) => { + if(databaseValue[databaseKey] === info[infoKey]) { + return; + } - databaseValue.clientsOnline = info.clientsOnline; - databaseValue.clientsMax = info.clientsMax; + databaseValue[databaseKey] = info[infoKey]; + changes.push(infoKey); + } - databaseValue.hostBannerUrl = info.hostBannerUrl - databaseValue.hostBannerMode = info.hostBannerMode; + updateValue("name", "name"); + updateValue("iconId", "iconId"); + + updateValue("clientsOnline", "clientsOnline"); + updateValue("clientsMax", "clientsMax"); + + updateValue("hostBannerUrl", "hostBannerUrl"); + updateValue("hostBannerMode", "hostBannerMode"); + + if(changes.length > 0) { + this.events.fire("notify_server_info_updated", { serverUniqueId: serverUniqueId, keys: changes }); + } }); } @@ -470,6 +491,7 @@ export class ConnectionHistory { } if(entry.value.serverUniqueId === kUnknownHistoryServerUniqueId && onlySucceeded) { + entry.continue(); continue; } @@ -542,7 +564,15 @@ class ConnectionHistoryUpdateListener { } private registerConnectionHandler(handler: ConnectionHandler) { - handler.channelTree.server.events.on("notify_properties_updated", event => { + const events = this.listenerConnectionHandler[handler.handlerId] = []; + events.push(handler.channelTree.server.events.on("notify_properties_updated", event => { + switch(handler.connection_state) { + case ConnectionState.UNCONNECTED: + case ConnectionState.DISCONNECTING: + /* We don't want any changes here */ + return; + } + if("virtualserver_unique_identifier" in event.updated_properties) { if(handler.currentConnectId > 0) { this.history.updateConnectionServerUniqueId(handler.currentConnectId, event.server_properties.virtualserver_unique_identifier) @@ -573,7 +603,7 @@ class ConnectionHistoryUpdateListener { break; } } - }); + })); } } @@ -581,7 +611,7 @@ export let connectionHistory: ConnectionHistory; let historyInfoListener: ConnectionHistoryUpdateListener; loader.register_task(Stage.JAVASCRIPT_INITIALIZING, { - priority: 0, + priority: 40, name: "Chat history setup", function: async () => { if(!('indexedDB' in window)) { diff --git a/shared/js/file/FileManager.tsx b/shared/js/file/FileManager.tsx index 6054bbcd..ecb78b45 100644 --- a/shared/js/file/FileManager.tsx +++ b/shared/js/file/FileManager.tsx @@ -549,9 +549,11 @@ export class FileManager { const initializeCallback = async () => { try { transfer.target = await transfer.targetSupplier(transfer); - if(!transfer.target) + if(!transfer.target) { throw tr("Failed to create transfer target"); + } + transfer.lastStateUpdate = Date.now(); await this.connectionHandler.serverConnection.send_command("ftinitdownload", { "path": options.path, "name": options.name, @@ -565,7 +567,6 @@ export class FileManager { if(transfer.transferState() === FileTransferState.INITIALIZING) { throw tr("missing transfer start notify"); } - } catch (error) { transfer.setFailed({ error: "initialize", @@ -588,9 +589,11 @@ export class FileManager { const initializeCallback = async () => { try { transfer.source = await transfer.sourceSupplier(transfer); - if(!transfer.source) + if(!transfer.source) { throw tr("Failed to create transfer source"); + } + transfer.lastStateUpdate = Date.now(); transfer.fileSize = await transfer.source.fileSize(); await this.connectionHandler.serverConnection.send_command("ftinitupload", { "path": options.path, @@ -604,14 +607,15 @@ export class FileManager { "proto": 1 }, { process_result: options.processCommandResult }); - if(transfer.transferState() === FileTransferState.INITIALIZING) + if(transfer.transferState() === FileTransferState.INITIALIZING) { throw tr("missing transfer start notify"); + } } catch (error) { transfer.setFailed({ error: "initialize", commandResult: error - }, error instanceof CommandResult ? error.formattedMessage() : typeof error === "string" ? error : tr("Lookup the console")); + }, error instanceof CommandResult ? error.formattedMessage() : typeof error === "string" ? error : tr("lookup the console")); } }; @@ -735,8 +739,18 @@ export class FileManager { /* Transfer is locally pending because of some limits */ return false; - case FileTransferState.CONNECTING: case FileTransferState.INITIALIZING: + if(entry instanceof FileDownloadTransfer) { + if(!entry.target) { + /* We're still prompting the user for a target file location. Lets apply a timeout of 1 min. */ + if(entry.transfer.lastStateUpdate < Date.now() + 60 * 1000) { + return false; + } + } + } + return true; + + case FileTransferState.CONNECTING: case FileTransferState.RUNNING: /* These states can time out */ return true; diff --git a/shared/js/ui/AppController.ts b/shared/js/ui/AppController.ts index c58eed9f..47571a49 100644 --- a/shared/js/ui/AppController.ts +++ b/shared/js/ui/AppController.ts @@ -9,12 +9,11 @@ import {initializeConnectionListController} from "tc-shared/ui/frames/connection import * as loader from "tc-loader"; import {Stage} from "tc-loader"; import {server_connections} from "tc-shared/ConnectionManager"; -import {AppUiEvents, AppUiVariables} from "tc-shared/ui/AppDefinitions"; +import {AppUiVariables} from "tc-shared/ui/AppDefinitions"; import {ConnectionHandler} from "tc-shared/ConnectionHandler"; import {SideBarController} from "tc-shared/ui/frames/SideBarController"; import {ServerEventLogController} from "tc-shared/ui/frames/log/Controller"; import {HostBannerController} from "tc-shared/ui/frames/HostBannerController"; -import {UiVariableProvider} from "tc-shared/ui/utils/Variable"; import {createIpcUiVariableProvider, IpcUiVariableProvider} from "tc-shared/ui/utils/IpcVariable"; export class AppController { @@ -128,7 +127,7 @@ export class AppController { } export let appViewController: AppController; -loader.register_task(Stage.JAVASCRIPT_INITIALIZING, { +loader.register_task(Stage.LOADED, { name: "app view", function: async () => { appViewController = new AppController(); @@ -138,5 +137,5 @@ loader.register_task(Stage.JAVASCRIPT_INITIALIZING, { (window as any).AppController = AppController; (window as any).appViewController = appViewController; }, - priority: 0 + priority: 100 }); diff --git a/shared/js/ui/frames/control-bar/Button.scss b/shared/js/ui/frames/control-bar/Button.scss index 861f3ba4..7a88c191 100644 --- a/shared/js/ui/frames/control-bar/Button.scss +++ b/shared/js/ui/frames/control-bar/Button.scss @@ -167,16 +167,6 @@ html:root { right: 0; } - .iconContainer { - margin-right: .25em; - - display: flex; - flex-direction: column; - - flex-shrink: 0; - flex-grow: 0; - } - .dropdownEntry { position: relative; @@ -305,4 +295,11 @@ html:root { transform: rotate(45deg); -webkit-transform: rotate(45deg); } +} + +.iconContainer { + margin-right: .25em; + + display: flex; + flex-direction: column; } \ No newline at end of file diff --git a/shared/js/ui/frames/control-bar/Controller.ts b/shared/js/ui/frames/control-bar/Controller.ts index cd873d88..a2f1cb8a 100644 --- a/shared/js/ui/frames/control-bar/Controller.ts +++ b/shared/js/ui/frames/control-bar/Controller.ts @@ -23,6 +23,8 @@ import {connectionHistory} from "tc-shared/connectionlog/History"; import {RemoteIconInfo} from "tc-shared/file/Icons"; import {spawnModalAddCurrentServerToBookmarks} from "tc-shared/ui/modal/bookmarks-add-server/Controller"; import {getAudioBackend, OutputDevice} from "tc-shared/audio/Player"; +import {ignorePromise} from "tc-shared/proto"; +import {LogCategory, logTrace} from "tc-shared/log"; class InfoController { private readonly mode: ControlBarMode; @@ -34,6 +36,8 @@ class InfoController { private handlerRegisteredEvents: (() => void)[] = []; private defaultRecorderListener: () => void; + private bookmarkServerUniqueIds: string[] = []; + constructor(events: Registry, mode: ControlBarMode) { this.events = events; this.mode = mode; @@ -61,6 +65,16 @@ class InfoController { this.sendVideoState("camera"); })); bookmarks.events.on(["notify_bookmark_edited", "notify_bookmark_created", "notify_bookmark_deleted", "notify_bookmarks_imported"], () => this.sendBookmarks()); + events.push(connectionHistory.events.on("notify_server_info_updated", event => { + if(this.bookmarkServerUniqueIds.indexOf(event.serverUniqueId) === -1) { + return; + } + + if(event.keys.indexOf("iconId") !== -1) { + /* An icon for a bookmark has changed. Send the full new list. */ + ignorePromise(this.sendBookmarks()); + } + })); events.push(getVideoDriver().getEvents().on("notify_device_list_changed", () => this.sendCameraList())); events.push(getRecorderBackend().getDeviceList().getEvents().on("notify_list_updated", () => this.sendMicrophoneList())); events.push(defaultRecorderEvents.on("notify_default_recorder_changed", () => { @@ -202,7 +216,9 @@ class InfoController { }); } + /* Note: This method might be executed concurrently */ public async sendBookmarks() { + this.bookmarkServerUniqueIds = []; const bookmarkList = bookmarks.getOrderedRegisteredBookmarks(); const parent: Bookmark[] = []; @@ -216,15 +232,17 @@ class InfoController { let icon: RemoteIconInfo; try { - const connectInfo = await connectionHistory.lastConnectInfo(bookmark.entry.serverAddress, "address"); + const connectInfo = await connectionHistory.lastConnectInfo(bookmark.entry.serverAddress, "address", true); if(connectInfo) { + this.bookmarkServerUniqueIds.push(connectInfo.serverUniqueId); const info = await connectionHistory.queryServerInfo(connectInfo.serverUniqueId); if(info && info.iconId > 0) { icon = { iconId: info.iconId, serverUniqueId: connectInfo.serverUniqueId }; } } - } catch (_) { - /* no need for any error handling */ + } catch (error) { + /* No need to warn in prod build */ + logTrace(LogCategory.BOOKMARKS, "Failed to query last connect info: %o", error); } parentList.push({ diff --git a/shared/js/ui/frames/control-bar/DropDown.tsx b/shared/js/ui/frames/control-bar/DropDown.tsx index cc606451..d35cce5f 100644 --- a/shared/js/ui/frames/control-bar/DropDown.tsx +++ b/shared/js/ui/frames/control-bar/DropDown.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -import {ReactComponentBase} from "tc-shared/ui/react-elements/ReactComponentBase"; import {IconRenderer, RemoteIconRenderer} from "tc-shared/ui/react-elements/Icon"; import {getIconManager, RemoteIconInfo} from "tc-shared/file/Icons"; import {joinClassList} from "tc-shared/ui/react-elements/Helper"; diff --git a/shared/js/ui/frames/log/Renderer.tsx b/shared/js/ui/frames/log/Renderer.tsx index 57d64cd4..8e5607b5 100644 --- a/shared/js/ui/frames/log/Renderer.tsx +++ b/shared/js/ui/frames/log/Renderer.tsx @@ -43,22 +43,23 @@ const LogEntryRenderer = React.memo((props: { entry: LogMessage }) => { ); }); -const ServerLogRenderer = () => { +const ServerLogRenderer = (props: { backlog?: number }) => { + const backlog = typeof props.backlog === "number" ? props.backlog : 100; const handlerId = useContext(HandlerIdContext); const events = useContext(EventsContext); + + const refContainer = useRef(); + const scrollOffset = useRef("bottom"); + + const [ , setRevision ] = useState(0); const [ logs, setLogs ] = useDependentState(() => { events.fire_react("query_log"); return "loading"; }, [ handlerId ]); - const [ revision, setRevision ] = useState(0); - - const refContainer = useRef(); - const scrollOffset = useRef("bottom"); - events.reactUse("notify_log", event => { const logs = event.events.slice(0); - logs.splice(0, Math.max(0, logs.length - 100)); + logs.splice(0, Math.max(0, logs.length - backlog)); logs.sort((a, b) => a.timestamp - b.timestamp); setLogs(logs); }); @@ -69,10 +70,10 @@ const ServerLogRenderer = () => { } logs.push(event.event); - logs.splice(0, Math.max(0, logs.length - 100)); + logs.splice(0, Math.max(0, logs.length - backlog)); logs.sort((a, b) => a.timestamp - b.timestamp); - setRevision(revision + 1); - }); + setRevision(performance.now()); + }, logs !== "loading", [ logs ]); const fixScroll = () => { if(!refContainer.current) { diff --git a/shared/js/ui/frames/menu-bar/MainMenu.ts b/shared/js/ui/frames/menu-bar/MainMenu.ts index c6613fac..f4ee1fce 100644 --- a/shared/js/ui/frames/menu-bar/MainMenu.ts +++ b/shared/js/ui/frames/menu-bar/MainMenu.ts @@ -11,6 +11,7 @@ import {bookmarks} from "tc-shared/Bookmarks"; import {RemoteIconInfo} from "tc-shared/file/Icons"; import {connectionHistory} from "tc-shared/connectionlog/History"; import {spawnModalAddCurrentServerToBookmarks} from "tc-shared/ui/modal/bookmarks-add-server/Controller"; +import {LogCategory, logTrace} from "tc-shared/log"; function renderConnectionItems() { const items: MenuBarEntry[] = []; @@ -52,7 +53,9 @@ function renderConnectionItems() { return items; } +let bookmarkServerUniqueIds: string[] = []; async function renderBookmarkItems() { + bookmarkServerUniqueIds = []; const bookmarkList = bookmarks.getOrderedRegisteredBookmarks(); const bookmarkItems: MenuBarEntry[] = []; @@ -66,15 +69,17 @@ async function renderBookmarkItems() { let icon: RemoteIconInfo; try { - const connectInfo = await connectionHistory.lastConnectInfo(bookmark.entry.serverAddress, "address"); + const connectInfo = await connectionHistory.lastConnectInfo(bookmark.entry.serverAddress, "address", true); if(connectInfo) { + bookmarkServerUniqueIds.push(connectInfo.serverUniqueId); const info = await connectionHistory.queryServerInfo(connectInfo.serverUniqueId); if(info && info.iconId > 0) { icon = { iconId: info.iconId, serverUniqueId: connectInfo.serverUniqueId }; } } - } catch (_) { - /* no need for any error handling */ + } catch (error) { + /* No need to warn in prod build */ + logTrace(LogCategory.BOOKMARKS, "Failed to query last connect info: %o", error); } parentList.push({ @@ -363,6 +368,16 @@ class MenuBarUpdateListener { })); this.generalHandlerEvents.push(server_connections.events().on("notify_active_handler_changed", () => updateMenuBar())); this.generalHandlerEvents.push(bookmarks.events.on(["notify_bookmark_deleted", "notify_bookmark_created", "notify_bookmark_edited", "notify_bookmarks_imported"], () => updateMenuBar())); + this.generalHandlerEvents.push(connectionHistory.events.on("notify_server_info_updated", event => { + if(bookmarkServerUniqueIds.indexOf(event.serverUniqueId) === -1) { + return; + } + + if(event.keys.indexOf("iconId") !== -1) { + /* An icon for a bookmark has changed. Send the menu bar with the new icons. */ + updateMenuBar(); + } + })); server_connections.getAllConnectionHandlers().forEach(handler => this.registerHandlerEvents(handler)); } diff --git a/shared/js/ui/frames/side/ChannelFileBrowserController.ts b/shared/js/ui/frames/side/ChannelFileBrowserController.ts index 49de6cd2..a8c37913 100644 --- a/shared/js/ui/frames/side/ChannelFileBrowserController.ts +++ b/shared/js/ui/frames/side/ChannelFileBrowserController.ts @@ -59,6 +59,6 @@ export class ChannelFileBrowserController { } private notifyEvents() { - this.uiEvents.fire_react("notify_events", { browserEvents: this.remoteBrowseEvents, channelId: this.currentChannel?.channelId }); + this.uiEvents.fire_react("notify_events", { browserEvents: this.remoteBrowseEvents.generateIpcDescription(), channelId: this.currentChannel?.channelId }); } } \ No newline at end of file diff --git a/shared/js/ui/frames/side/ChannelFileBrowserDefinitions.ts b/shared/js/ui/frames/side/ChannelFileBrowserDefinitions.ts index aba7fb8d..b3c7fd5b 100644 --- a/shared/js/ui/frames/side/ChannelFileBrowserDefinitions.ts +++ b/shared/js/ui/frames/side/ChannelFileBrowserDefinitions.ts @@ -1,11 +1,11 @@ import {FileBrowserEvents} from "tc-shared/ui/modal/transfer/FileDefinitions"; -import {Registry} from "tc-shared/events"; +import {IpcRegistryDescription} from "tc-shared/events"; export interface ChannelFileBrowserUiEvents { query_events: {}, notify_events: { - browserEvents: Registry, + browserEvents: IpcRegistryDescription, channelId: number }, } \ No newline at end of file diff --git a/shared/js/ui/frames/side/ChannelFileBrowserRenderer.scss b/shared/js/ui/frames/side/ChannelFileBrowserRenderer.scss index 063bb556..8415200a 100644 --- a/shared/js/ui/frames/side/ChannelFileBrowserRenderer.scss +++ b/shared/js/ui/frames/side/ChannelFileBrowserRenderer.scss @@ -6,7 +6,7 @@ height: 100%; width: 100%; - color: #999; + color: #999!important; .navbar { flex-shrink: 0; @@ -17,13 +17,13 @@ } .fileTable { - border: none; - border-radius: 0; + border: none!important; + border-radius: 0!important; - background-color: var(--chat-background); + background-color: var(--chat-background)!important; .header { - background-color: var(--chat-background); + background-color: var(--chat-background)!important; } } @@ -36,10 +36,10 @@ } .boxedInput { - background-color: var(--side-info-background); - border-color: #212121; + background-color: var(--side-info-background)!important; + border-color: #212121!important; &:focus-within { - background-color: #242424; + background-color: #242424!important; } } \ No newline at end of file diff --git a/shared/js/ui/frames/side/ChannelFileBrowserRenderer.tsx b/shared/js/ui/frames/side/ChannelFileBrowserRenderer.tsx index 48fe6e83..5607a607 100644 --- a/shared/js/ui/frames/side/ChannelFileBrowserRenderer.tsx +++ b/shared/js/ui/frames/side/ChannelFileBrowserRenderer.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import {useState} from "react"; +import {useEffect, useState} from "react"; import {Registry} from "tc-shared/events"; import {ChannelFileBrowserUiEvents} from "tc-shared/ui/frames/side/ChannelFileBrowserDefinitions"; import {channelPathPrefix, FileBrowserEvents} from "tc-shared/ui/modal/transfer/FileDefinitions"; @@ -32,11 +32,14 @@ export const ChannelFileBrowser = (props: { events: Registry setEvents({ - events: event.browserEvents, + events: Registry.fromIpcDescription(event.browserEvents), channelId: event.channelId })); + useEffect(() => () => events?.events?.destroy(), [ events?.events ]); + if(!events) { return null; } diff --git a/shared/js/ui/frames/side/HeaderRenderer.tsx b/shared/js/ui/frames/side/HeaderRenderer.tsx index 51fac7a5..cfed951f 100644 --- a/shared/js/ui/frames/side/HeaderRenderer.tsx +++ b/shared/js/ui/frames/side/HeaderRenderer.tsx @@ -116,7 +116,7 @@ const BlockPing = () => { return undefined; }); - events.reactUse("notify_ping", event => setPingInfo(event.ping)); + events.reactUse("notify_ping", event => setPingInfo(event.ping), undefined, [ ]); let value, title; if(!pingInfo) { diff --git a/shared/js/ui/frames/video/Renderer.tsx b/shared/js/ui/frames/video/Renderer.tsx index 6658156e..1cfc373f 100644 --- a/shared/js/ui/frames/video/Renderer.tsx +++ b/shared/js/ui/frames/video/Renderer.tsx @@ -41,7 +41,7 @@ const ExpendArrow = React.memo(() => { return false; }); - events.reactUse("notify_expended", event => setExpended(event.expended), undefined, [ setExpended ]); + events.reactUse("notify_expended", event => setExpended(event.expended), undefined, []); return (
events.fire("action_toggle_expended", { expended: !expended })}> @@ -776,8 +776,8 @@ const VisibilityHandler = React.memo((props: { return false; }) - events.reactUse("notify_videos", event => setStreamingCount(event.videoActiveCount)); - events.reactUse("notify_expended", event => setExpanded(event.expended)); + events.reactUse("notify_videos", event => setStreamingCount(event.videoActiveCount), []); + events.reactUse("notify_expended", event => setExpanded(event.expended), []); return (
{props.children} diff --git a/shared/js/ui/modal/bookmarks/Controller.ts b/shared/js/ui/modal/bookmarks/Controller.ts index f88cafd7..a5e5118b 100644 --- a/shared/js/ui/modal/bookmarks/Controller.ts +++ b/shared/js/ui/modal/bookmarks/Controller.ts @@ -567,7 +567,7 @@ class BookmarkModalController { } return this.bookmarkUniqueServerIds[bookmarkId] = (async () => { - const info = await connectionHistory.lastConnectInfo(bookmark.serverAddress, "address"); + const info = await connectionHistory.lastConnectInfo(bookmark.serverAddress, "address", true); if(!info) { return undefined; } diff --git a/shared/js/ui/modal/bookmarks/Renderer.tsx b/shared/js/ui/modal/bookmarks/Renderer.tsx index 58fb5ca5..e8506e71 100644 --- a/shared/js/ui/modal/bookmarks/Renderer.tsx +++ b/shared/js/ui/modal/bookmarks/Renderer.tsx @@ -109,7 +109,7 @@ const BookmarkListEntryRenderer = React.memo((props: { entry: BookmarkListEntry events.fire("action_connect", { uniqueId: props.entry.uniqueId, newTab: false, closeModal: true }); }} onContextMenu={event => { - event.preventDefault(); + event.stopPropagation(); if(selectedItem.remoteValue?.id !== props.entry.uniqueId) { selectedItem.setValue({ id: props.entry.uniqueId }); @@ -195,9 +195,8 @@ const BookmarkList = React.memo(() => {
{ - event.preventDefault(); - if(bookmarks.length === 0) { + /* We've an extra overlay for not having any bookmarks. */ return; } diff --git a/shared/js/ui/modal/transfer/FileBrowserControllerRemote.ts b/shared/js/ui/modal/transfer/FileBrowserControllerRemote.ts index 6dd9d5bf..c5fdc324 100644 --- a/shared/js/ui/modal/transfer/FileBrowserControllerRemote.ts +++ b/shared/js/ui/modal/transfer/FileBrowserControllerRemote.ts @@ -80,16 +80,14 @@ export function initializeRemoteFileBrowserController(connection: ConnectionHand events.on("action_navigate_to", event => { try { - const info = parsePath(event.path, connection); - currentPathInfo = info; + currentPathInfo = parsePath(event.path, connection); currentPath = event.path; selection = []; events.fire_react("notify_current_path", { path: event.path || "/", status: "success", - pathInfo: info }); } catch (error) { events.fire_react("notify_current_path", { @@ -382,7 +380,6 @@ export function initializeRemoteFileBrowserController(connection: ConnectionHand events.on("query_current_path", () => events.fire_react("notify_current_path", { status: "success", path: currentPath, - pathInfo: currentPathInfo })); events.on("action_rename_file_result", result => { @@ -689,12 +686,13 @@ export function initializeRemoteFileBrowserController(connection: ConnectionHand }); }); - events.on("action_start_download", event => { - event.files.forEach(file => { + events.on("action_start_download", async event => { + for(const file of event.files) { try { let targetSupplier; if (__build.target === "client" && TransferProvider.provider().targetSupported(TransferTargetType.FILE)) { - const target = TransferProvider.provider().createFileTarget(undefined, file.name); + /* Get the target file path before we're actiually starting to download the file */ + const target = await TransferProvider.provider().createFileTarget(undefined, file.name); targetSupplier = async () => target; } else if (TransferProvider.provider().targetSupported(TransferTargetType.DOWNLOAD)) { targetSupplier = async () => await TransferProvider.provider().createDownloadTarget(); @@ -720,7 +718,7 @@ export function initializeRemoteFileBrowserController(connection: ConnectionHand } catch (error) { logError(LogCategory.FILE_TRANSFER, tr("Failed to parse path for file download: %s"), error); } - }); + } }); events.on("action_start_upload", event => { diff --git a/shared/js/ui/modal/transfer/FileBrowserRenderer.tsx b/shared/js/ui/modal/transfer/FileBrowserRenderer.tsx index 70b86779..06f7072b 100644 --- a/shared/js/ui/modal/transfer/FileBrowserRenderer.tsx +++ b/shared/js/ui/modal/transfer/FileBrowserRenderer.tsx @@ -115,7 +115,7 @@ const NavigationEntry = (props: { events: Registry, path: str const oldPath = fileUrl.split("/").slice(0, -1).join("/") + "/"; props.events.fire("action_rename_file", { - newPath: props.path + "/", + newPath: props.path.endsWith("/") ? props.path : props.path + "/", oldPath: oldPath, oldName: name, newName: name diff --git a/shared/js/ui/modal/transfer/FileDefinitions.ts b/shared/js/ui/modal/transfer/FileDefinitions.ts index 7342c624..9710dd78 100644 --- a/shared/js/ui/modal/transfer/FileDefinitions.ts +++ b/shared/js/ui/modal/transfer/FileDefinitions.ts @@ -132,7 +132,6 @@ export interface FileBrowserEvents { path: string, status: "success" | "timeout" | "error"; error?: string; - pathInfo?: PathInfo }, notify_transfer_start: { diff --git a/shared/js/ui/modal/whats-new/Renderer.tsx b/shared/js/ui/modal/whats-new/Renderer.tsx index 4e3534d0..0947e4e4 100644 --- a/shared/js/ui/modal/whats-new/Renderer.tsx +++ b/shared/js/ui/modal/whats-new/Renderer.tsx @@ -4,6 +4,7 @@ import * as dompurify from "dompurify"; import {ChangeLog, ChangeLogEntry, ChangeSet} from "tc-shared/update/ChangeLog"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {guid} from "tc-shared/crypto/uid"; +import moment from "moment"; const {Remarkable} = require("remarkable"); const cssStyle = require("./Renderer.scss"); @@ -108,7 +109,7 @@ export const WhatsNew = (props: { changesUI?: ChangeLog, changesClient?: ChangeL - {versionUIDate} + {moment(__build.timestamp).format("dd.MM.YY")} ); } else if (props.changesUI && props.changesClient) { diff --git a/shared/js/ui/react-elements/Checkbox.tsx b/shared/js/ui/react-elements/Checkbox.tsx index 63cafa20..096d8ce7 100644 --- a/shared/js/ui/react-elements/Checkbox.tsx +++ b/shared/js/ui/react-elements/Checkbox.tsx @@ -29,7 +29,7 @@ export class Checkbox extends React.Component render() { const disabled = typeof this.state.disabled === "boolean" ? this.state.disabled : this.props.disabled; - const checked = typeof this.props.value === "boolean" ? this.props.value : typeof this.state.checked === "boolean" ? this.state.checked : this.props.initialValue; + const checked = (typeof this.props.value === "boolean" ? this.props.value : typeof this.state.checked === "boolean" ? this.state.checked : this.props.initialValue) || false; const disabledClass = disabled ? cssStyle.disabled : ""; return ( diff --git a/shared/js/ui/react-elements/DetachButtons.scss b/shared/js/ui/react-elements/DetachButtons.scss index 9986ec76..367484f9 100644 --- a/shared/js/ui/react-elements/DetachButtons.scss +++ b/shared/js/ui/react-elements/DetachButtons.scss @@ -1,13 +1,17 @@ @import "../../../css/static/mixin"; @import "../../../css/static/properties"; +$animation_time: $button_hover_animation_time; .container { position: relative; - overflow: hidden; + /* Don't use overflow hidden here since some container may require overflow */ &:hover { .containerButton { top: 1em; + opacity: 1; + + @include transition(top ease-in-out $animation_time, opacity ease-in-out $animation_time / 2 $animation_time / 2); } } } @@ -16,10 +20,12 @@ position: absolute; z-index: 10; - top: -3em; + opacity: 0; + top: -1em; + right: 1em; - @include transition(all ease-in-out $button_hover_animation_time); + @include transition(top ease-in-out $animation_time, opacity ease-in-out $animation_time / 2); &.disabled { display: none; @@ -38,7 +44,7 @@ cursor: pointer; - @include transition(all ease-in-out $button_hover_animation_time); + @include transition(all ease-in-out $animation_time); &:hover { background-color: #0000008f; diff --git a/shared/js/ui/react-elements/Icon.scss b/shared/js/ui/react-elements/Icon.scss index 2e10c1f4..33b17a8d 100644 --- a/shared/js/ui/react-elements/Icon.scss +++ b/shared/js/ui/react-elements/Icon.scss @@ -2,6 +2,11 @@ width: 1em; height: 1em; + flex-shrink: 0; + flex-grow: 0; + + align-self: center; + display: flex; flex-direction: column; justify-content: stretch; diff --git a/shared/js/ui/react-elements/Icon.tsx b/shared/js/ui/react-elements/Icon.tsx index 08b2968b..07028124 100644 --- a/shared/js/ui/react-elements/Icon.tsx +++ b/shared/js/ui/react-elements/Icon.tsx @@ -64,7 +64,7 @@ export const RemoteIconRenderer = React.memo((props: { icon: RemoteIcon | undefi } return ( - + ); case "loading": diff --git a/shared/js/ui/utils/IpcVariable.ts b/shared/js/ui/utils/IpcVariable.ts index e2c8e602..181e40a4 100644 --- a/shared/js/ui/utils/IpcVariable.ts +++ b/shared/js/ui/utils/IpcVariable.ts @@ -28,6 +28,21 @@ function registerInvokeCallback(callback: () => void) { } } +function savePostMessage(channel: BroadcastChannel | MessageEventSource, message: any) { + try { + // @ts-ignore + channel.postMessage(message); + } catch (error) { + if(error instanceof Error) { + debugger; + console.error(error); + return; + } + + throw error; + } +} + export class IpcUiVariableProvider extends UiVariableProvider { readonly ipcChannelId: string; private readonly bundleMaxSize: number; @@ -72,7 +87,7 @@ export class IpcUiVariableProvider extends UiVa const sendResult = (error?: any) => { if(source) { // @ts-ignore - source.postMessage({ + savePostMessage(source, { type: "edit-result", token, error @@ -124,7 +139,7 @@ export class IpcUiVariableProvider extends UiVa */ private broadcastIpcMessage(message: any) { if(this.bundleMaxSize <= 0) { - this.broadcastChannel.postMessage(message); + savePostMessage(this.broadcastChannel, message); return; } @@ -145,7 +160,7 @@ export class IpcUiVariableProvider extends UiVa return; } - this.broadcastChannel.postMessage({ + savePostMessage(this.broadcastChannel, { type: "bundled", messages: this.enqueuedMessages }); @@ -253,7 +268,7 @@ class IpcUiVariableConsumer extends UiVariableC */ private sendIpcMessage(message: any) { if(this.bundleMaxSize <= 0) { - this.broadcastChannel.postMessage(message); + savePostMessage(this.broadcastChannel, message); return; } @@ -274,7 +289,7 @@ class IpcUiVariableConsumer extends UiVariableC return; } - this.broadcastChannel.postMessage({ + savePostMessage(this.broadcastChannel, { type: "bundled", messages: this.enqueuedMessages }); diff --git a/vendor/TeaEventBus b/vendor/TeaEventBus index 8310382d..49041c40 160000 --- a/vendor/TeaEventBus +++ b/vendor/TeaEventBus @@ -1 +1 @@ -Subproject commit 8310382d8a851b2e7095b400807141065811da53 +Subproject commit 49041c4069a6ae54649748ff5373f82fe2fde15f