From 9f5bd7bf66c7df13df70682180690b98e1aaf2d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:43:04 +0000 Subject: [PATCH 01/68] Update docker/setup-buildx-action digest to d70bba7 --- .github/workflows/dockerhub.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml index 52e6eb5cde..ab666bf27a 100644 --- a/.github/workflows/dockerhub.yaml +++ b/.github/workflows/dockerhub.yaml @@ -34,7 +34,7 @@ jobs: uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@2b51285047da1547ffb1b2203d8be4c0af6b1f20 # v3 + uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3 with: install: true From 674650f24d3c4d4bbc253ff75f81346caa126c85 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:43:10 +0000 Subject: [PATCH 02/68] Update peter-evans/create-pull-request digest to c55203c --- .github/workflows/update-jitsi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-jitsi.yml b/.github/workflows/update-jitsi.yml index 49b56aadca..3a1ea33cbf 100644 --- a/.github/workflows/update-jitsi.yml +++ b/.github/workflows/update-jitsi.yml @@ -21,7 +21,7 @@ jobs: run: "yarn update:jitsi" - name: Create Pull Request - uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e # v6 + uses: peter-evans/create-pull-request@c55203cfde3e5c11a452d352b4393e68b85b4533 # v6 with: token: ${{ secrets.ELEMENT_BOT_TOKEN }} branch: actions/jitsi-update From f62076cdc147b1b4a8db2c41e6a6e6529fee5283 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:43:15 +0000 Subject: [PATCH 03/68] Update t3chguy/wait-on-check-action digest to 1854102 --- .github/workflows/build_develop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_develop.yml b/.github/workflows/build_develop.yml index 13acfef761..7097099250 100644 --- a/.github/workflows/build_develop.yml +++ b/.github/workflows/build_develop.yml @@ -92,7 +92,7 @@ jobs: find bundles -type d -mindepth 1 -maxdepth 1 -exec sed -i "\:{}:d" _redirects \; - name: Wait for other steps to succeed - uses: t3chguy/wait-on-check-action@05861d3a448898eb33dfce34153bd1ecb9422fb9 # fork + uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork with: ref: ${{ github.sha }} running-workflow-name: "Build & Deploy develop.element.io" From 491ad6de17ce4f2f7dd1342061f2047b2a9f3e67 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:44:21 +0000 Subject: [PATCH 04/68] Update dependency @babel/runtime to v7.24.4 --- yarn.lock | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index b27f562f10..c03b799e2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1263,14 +1263,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== From 8baab4ce8ea9e794fc9c39167c425c2424094380 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:44:41 +0000 Subject: [PATCH 05/68] Update dependency @types/node to v16.18.96 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b27f562f10..e93fe14a3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3229,9 +3229,9 @@ undici-types "~5.26.4" "@types/node@^16": - version "16.18.94" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.94.tgz#3337174e6d031e5803eb0a6a34fdbaafc08b26c3" - integrity sha512-X8q3DoKq8t/QhA0Rk/9wJUajxtXRDiCK+cVaONKLxpsjPhu+xX6uZuEj4UKGLQ4p0obTdFxa0cP/BMvf9mOYZA== + version "16.18.96" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.96.tgz#eb0012d23ff53d14d64ec8a352bf89792de6aade" + integrity sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ== "@types/normalize-package-data@^2.4.0": version "2.4.4" From 159ef4cc1556451ad81874ee98a16b95b4af8529 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:45:40 +0000 Subject: [PATCH 06/68] Update typescript-eslint monorepo to v7.6.0 --- yarn.lock | 147 ++++++++++++++++++++++++++---------------------------- 1 file changed, 70 insertions(+), 77 deletions(-) diff --git a/yarn.lock b/yarn.lock index b27f562f10..43d6ede71a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1687,7 +1687,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.5.1": +"@eslint-community/regexpp@^4.10.0": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -3152,7 +3152,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -3347,7 +3347,7 @@ resolved "https://registry.yarnpkg.com/@types/sdp-transform/-/sdp-transform-2.4.9.tgz#26ef39f487a6909b0512f580b80920a366b27f52" integrity sha512-bVr+/OoZZy7wrHlNcEAAa6PAgKA4BoXPYVN2EijMC5WnGgQ4ZEuixmKnVs2roiAvr7RhIFVH17QD27cojgIZCg== -"@types/semver@^7.5.0": +"@types/semver@^7.5.8": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -3428,90 +3428,90 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz#1dc52fe48454d5b54be2d5f089680452f1628a5a" - integrity sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/type-utils" "7.5.0" - "@typescript-eslint/utils" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3" + integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/type-utils" "7.7.0" + "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + semver "^7.6.0" + ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.5.0.tgz#1eeff36309ac2253c905dd4a88b4b71b72a358ed" - integrity sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ== - dependencies: - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" + integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== + dependencies: + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/typescript-estree" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz#70f0a7361430ab1043a5f97386da2a0d8b2f4d56" - integrity sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA== +"@typescript-eslint/scope-manager@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" + integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" -"@typescript-eslint/type-utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz#a8faa403232da3a3901655387c7082111f692cf9" - integrity sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw== +"@typescript-eslint/type-utils@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" + integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== dependencies: - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/utils" "7.5.0" + "@typescript-eslint/typescript-estree" "7.7.0" + "@typescript-eslint/utils" "7.7.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.5.0.tgz#0a284bcdef3cb850ec9fd57992df9f29d6bde1bc" - integrity sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg== +"@typescript-eslint/types@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" + integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== -"@typescript-eslint/typescript-estree@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz#aa5031c511874420f6b5edd90f8e4021525ee776" - integrity sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ== +"@typescript-eslint/typescript-estree@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" + integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/visitor-keys" "7.7.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.5.0.tgz#bbd963647fbbe9ffea033f42c0fb7e89bb19c858" - integrity sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw== +"@typescript-eslint/utils@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" + integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" - semver "^7.5.4" - -"@typescript-eslint/visitor-keys@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz#8abcac66f93ef20b093e87a400c2d21e3a6d55ee" - integrity sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA== - dependencies: - "@typescript-eslint/types" "7.5.0" - eslint-visitor-keys "^3.4.1" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.7.0" + "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/typescript-estree" "7.7.0" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" + integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== + dependencies: + "@typescript-eslint/types" "7.7.0" + eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -8540,13 +8540,6 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -8561,7 +8554,7 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: +minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -10550,7 +10543,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: +semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -11380,7 +11373,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -ts-api-utils@^1.0.1: +ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== From 5d32728f3ed742901104654f0f1adf1ba10c5ee9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:46:06 +0000 Subject: [PATCH 07/68] Update dependency css-loader to v7 --- package.json | 2 +- yarn.lock | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 53ff9c63b3..30a43063c3 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "concurrently": "^8.0.0", "copy-webpack-plugin": "^12.0.0", "cronstrue": "^2.41.0", - "css-loader": "^6.0.0", + "css-loader": "^7.0.0", "css-minimizer-webpack-plugin": "^6.0.0", "dotenv": "^16.0.2", "eslint": "8.57.0", diff --git a/yarn.lock b/yarn.lock index b27f562f10..048ab5d0b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4834,16 +4834,16 @@ css-has-pseudo@^6.0.2: postcss-selector-parser "^6.0.13" postcss-value-parser "^4.2.0" -css-loader@^6.0.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.10.0.tgz#7c172b270ec7b833951b52c348861206b184a4b7" - integrity sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw== +css-loader@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.1.tgz#de4163c0cb765c03d7957eb9e0a49c7f354948c7" + integrity sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw== dependencies: icss-utils "^5.1.0" postcss "^8.4.33" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.4" - postcss-modules-scope "^3.1.1" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.5.4" @@ -9474,24 +9474,24 @@ postcss-mixins@^10.0.0: postcss-simple-vars "^7.0.1" sugarss "^4.0.1" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" - integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" - integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" From 8c61026761535acb767b7aec0a5ea271565a12c5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:46:33 +0000 Subject: [PATCH 08/68] Update dependency eslint-plugin-unicorn to v52 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 53ff9c63b3..e1c3279c24 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "eslint-plugin-matrix-org": "^1.0.0", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unicorn": "^51.0.0", + "eslint-plugin-unicorn": "^52.0.0", "fake-indexeddb": "^5.0.0", "fetch-mock": "9.11.0", "fetch-mock-jest": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index b27f562f10..64e399e8bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5893,10 +5893,10 @@ eslint-plugin-react@^7.28.0: semver "^6.3.1" string.prototype.matchall "^4.0.10" -eslint-plugin-unicorn@^51.0.0: - version "51.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz#3641c5e110324c3739d6cb98fc1b99ada39f477b" - integrity sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw== +eslint-plugin-unicorn@^52.0.0: + version "52.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz#c7a559edd52e3932cf2b3a05c3b0efc604c1eeb8" + integrity sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng== dependencies: "@babel/helper-validator-identifier" "^7.22.20" "@eslint-community/eslint-utils" "^4.4.0" From 38ea3312f67ce24c2a6400f024249866f0947b98 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:46:44 +0000 Subject: [PATCH 09/68] Update dependency style-loader to v4 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 53ff9c63b3..6bc4bc7745 100644 --- a/package.json +++ b/package.json @@ -192,7 +192,7 @@ "semver": "^7.5.2", "setimmediate": "^1.0.5", "string-replace-loader": "3", - "style-loader": "3", + "style-loader": "4", "stylelint": "^16.1.0", "stylelint-config-standard": "^36.0.0", "stylelint-scss": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index b27f562f10..4ee5dfe4ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11022,10 +11022,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" - integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== +style-loader@4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" + integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== stylehacks@^6.0.2: version "6.0.2" From 36ff005d114311fea9919209dce060e7f6553c7e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:46:50 +0000 Subject: [PATCH 10/68] Update peaceiris/actions-mdbook action to v2 --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5dea22bbb4..2aefb39a32 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -55,7 +55,7 @@ jobs: echo "- [Automations](automations.md)" >> docs/SUMMARY.md - name: Setup mdBook - uses: peaceiris/actions-mdbook@v1 + uses: peaceiris/actions-mdbook@v2 with: mdbook-version: "0.4.10" From 050e9126d8089451ec1118a4bbd68d05cf342a15 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:59:07 +0000 Subject: [PATCH 11/68] Update all non-major dependencies --- .github/workflows/triage-labelled.yml | 2 +- yarn.lock | 213 ++++++++++++-------------- 2 files changed, 103 insertions(+), 112 deletions(-) diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml index 95e1c55005..e57f2bf6d6 100644 --- a/.github/workflows/triage-labelled.yml +++ b/.github/workflows/triage-labelled.yml @@ -148,7 +148,7 @@ jobs: contains(github.event.issue.labels.*.name, 'A-Element-R') steps: - id: add_to_project - uses: actions/add-to-project@v1.0.0 + uses: actions/add-to-project@v1.0.1 with: project-url: ${{ env.PROJECT_URL }} github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/yarn.lock b/yarn.lock index d75feb6a22..db9e055fed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2070,7 +2070,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2230,10 +2230,10 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.23" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" - integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.25" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== "@principalstudio/html-webpack-inject-preload@^1.2.7": version "1.2.7" @@ -2582,10 +2582,10 @@ "@sentry/utils" "7.74.1" tslib "^2.4.1 || ^1.9.3" -"@sentry/babel-plugin-component-annotate@2.16.0": - version "2.16.0" - resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.0.tgz#c831713b85516fb3f9da2985836ddf444dc634e6" - integrity sha512-+uy1qPkA5MSNgJ0L9ur/vNTydfdHwHnBX2RQ+0thsvkqf90fU788YjkkXwUiBBNuqNyI69JiOW6frixAWy7oUg== +"@sentry/babel-plugin-component-annotate@2.16.1": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.1.tgz#da3bf4ec1c1dc68a97d6a7e27bd710001d6b07fb" + integrity sha512-pJka66URsqQbk6hTs9H1XFpUeI0xxuqLYf9Dy5pRGNHSJMtfv91U+CaYSWt03aRRMGDXMduh62zAAY7Wf0HO+A== "@sentry/browser@^7.0.0": version "7.74.1" @@ -2599,59 +2599,59 @@ "@sentry/utils" "7.74.1" tslib "^2.4.1 || ^1.9.3" -"@sentry/bundler-plugin-core@2.16.0": - version "2.16.0" - resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.16.0.tgz#0c33e7a054fb56e43bd160ac141f71dfebf6dda5" - integrity sha512-dhgIZsIR3L9KnE2OO5JJm6hPtStAjEPYKQsZzxRr69uVhd9xAvfXeXr0afKVNVEcIDksas6yMgHqwQ2wOXFIAg== +"@sentry/bundler-plugin-core@2.16.1": + version "2.16.1" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.16.1.tgz#9e053ac33954535c0f0e96fa7a7330a9e7ebac2e" + integrity sha512-n6z8Ts3T9HROLuY7tVEYpBKvS+P7+b8NdqxP7QBcwp2nuPUlN5Ola1ivFjk1p5a7wRYeN9zM8orGe4l2HeNfYA== dependencies: "@babel/core" "^7.18.5" - "@sentry/babel-plugin-component-annotate" "2.16.0" + "@sentry/babel-plugin-component-annotate" "2.16.1" "@sentry/cli" "^2.22.3" dotenv "^16.3.1" find-up "^5.0.0" glob "^9.3.2" - magic-string "0.27.0" + magic-string "0.30.8" unplugin "1.0.1" -"@sentry/cli-darwin@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.30.2.tgz#a592227f428119c1239d76426ee76f895d89d521" - integrity sha512-lZkKXMt0HUAwLQuPpi/DM3CsdCCp+6B2cdur+8fAq7uARXTOsTKVDxv9pkuJHCgHUnguh8ittP5GMr0baTxmMg== - -"@sentry/cli-linux-arm64@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.30.2.tgz#b5d2314e27d0bb75f5a375282e77d2cd74d0690b" - integrity sha512-IWassuXggNhHOPCNrORNmd5SrAx5rU4XDlgOWBJr/ez7DvlPrr9EhV1xsdht6K4mPXhCGJq3rtRdCoWGJQW6Uw== - -"@sentry/cli-linux-arm@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.30.2.tgz#7f1ef0e7b50734e176290e99c6237fd99425d6e3" - integrity sha512-H7hqiLpEL7w/EHdhuUGatwg9O080mdujq4/zS96buKIHXxZE6KqMXGtMVIAvTl1+z6BlBEnfvZGI19MPw3t/7w== - -"@sentry/cli-linux-i686@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.30.2.tgz#e15182f8afb203095bb49bd621adcc91b3b785d3" - integrity sha512-gZIq131M4TJTG1lX9uvpoaGWaEXCEfdDXrXu/z/YZmAKBcThpMYChodXmm8FB6X4xb0TPXzIFqdzlLdglFK46g== - -"@sentry/cli-linux-x64@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.30.2.tgz#dce04b823f0fc54999565da32439c01349872568" - integrity sha512-NmTAIl7aW9OHxwB4149sBfvCbTyK9T/CvBX38keaD2yIThet9gZ4koP49hBDxYF99aQX3E+LIAqWwnkV9W72Sw== - -"@sentry/cli-win32-i686@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.30.2.tgz#54a8ee04b59d6004555f6d833ca17dc8c3e27402" - integrity sha512-SBR/Q3T6o+7uHwHNdjcG9GA3R++9w8oi778b95GuOC3dh0WOU6hXaKwQWe95ZcuSd2rKpouH7dhMjqqNM4HxOA== - -"@sentry/cli-win32-x64@2.30.2": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.30.2.tgz#1e84df37e9f0e5743b42435f92982cf7dae5e6d8" - integrity sha512-gF9wSZxzXFgakkC+uKVLAAYlbYj13e1gTsNm3gm+ODfpV+rbHwvbKoLfNsbVCFVCEZxIV2rXEP5WmTr0kiMvWQ== +"@sentry/cli-darwin@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.31.0.tgz#59e0805db8926a55676c74690e5083a0a78ae11f" + integrity sha512-VM5liyxMnm4K2g0WsrRPXRCMLhaT09C7gK5Fz/CxKYh9sbMZB7KA4hV/3klkyuyw1+ECF1J66cefhNkFZepUig== + +"@sentry/cli-linux-arm64@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.31.0.tgz#38604d2d1e7c2e50d48610d38523e371d2104cd7" + integrity sha512-eENJTmXoFX3uNr8xRW7Bua2Sw3V1tylQfdtS85pNjZPdbm3U8wYQSWu2VoZkK2ASOoC+17YC8jTQxq62KWnSeQ== + +"@sentry/cli-linux-arm@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.31.0.tgz#6e802a279011703d39e4b31de7b950c522a73261" + integrity sha512-AZoCN3waXEfXGCd3YSrikcX/y63oQe0Tiyapkeoifq/0QhI+2MOOrAQb60gthsXwb0UDK/XeFi3PaxyUCphzxA== + +"@sentry/cli-linux-i686@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.31.0.tgz#d4586a18145f43b37324231e0f19f8f23793fc58" + integrity sha512-cQUFb3brhLaNSIoNzjU/YASnTM1I3TDJP9XXzH0eLK9sSopCcDcc6OrYEYvdjJXZKzFv5sbc9UNMsIDbh4+rYg== + +"@sentry/cli-linux-x64@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.31.0.tgz#f89fd87b47a5eb10c292846f3a1a754cf97105fe" + integrity sha512-z1zTNg91nZJRdcGHC/bCU1KwIaifV0MLJteip9KrFDprzhJk1HtMxFOS0+OZ5/UH21CjAFmg9Pj6IAGqm3BYjA== + +"@sentry/cli-win32-i686@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.31.0.tgz#cb3dbb539c8f8bcac4b1f95ab45a87b5143997ee" + integrity sha512-+K7fdk57aUd4CmYrQfDGYPzVyxsTnVro6IPb5QSSLpP03dL7ko5208epu4m2SyN/MkFvscy9Di3n3DTvIfDU2w== + +"@sentry/cli-win32-x64@2.31.0": + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.31.0.tgz#8ac3fa4ae0634911af4f4a497d58d2adce0f303a" + integrity sha512-w5cvpZ6VVlhlyleY8TYHmrP7g48vKHnoVt5xFccfxT+HqQI/AxodvzgVvBTM2kB/sh/kHwexp6bJGWCdkGftww== "@sentry/cli@^2.22.3": - version "2.30.2" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.30.2.tgz#5f62ec56685808875577792dfdc7de1d047905a8" - integrity sha512-jQ/RBJ3bZ4PFbfOsGq8EykygHHmXXPw+i6jqsnQfAPIeZoX+DsqpAZbYubQEZKekmQ8EVGFxGHzUVkd6hLVMbA== + version "2.31.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.31.0.tgz#a659216576fef56733de659057d6b9039d0b64e9" + integrity sha512-nCESoXAG3kRUO5n3QbDYAqX6RU3z1ORjnd7a3sqijYsCGHfOpcjGdS7JYLVg5if+tXMEF5529BPXFe5Kg/J9tw== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" @@ -2659,13 +2659,13 @@ proxy-from-env "^1.1.0" which "^2.0.2" optionalDependencies: - "@sentry/cli-darwin" "2.30.2" - "@sentry/cli-linux-arm" "2.30.2" - "@sentry/cli-linux-arm64" "2.30.2" - "@sentry/cli-linux-i686" "2.30.2" - "@sentry/cli-linux-x64" "2.30.2" - "@sentry/cli-win32-i686" "2.30.2" - "@sentry/cli-win32-x64" "2.30.2" + "@sentry/cli-darwin" "2.31.0" + "@sentry/cli-linux-arm" "2.31.0" + "@sentry/cli-linux-arm64" "2.31.0" + "@sentry/cli-linux-i686" "2.31.0" + "@sentry/cli-linux-x64" "2.31.0" + "@sentry/cli-win32-i686" "2.31.0" + "@sentry/cli-win32-x64" "2.31.0" "@sentry/core@7.74.1": version "7.74.1" @@ -2699,11 +2699,11 @@ tslib "^2.4.1 || ^1.9.3" "@sentry/webpack-plugin@^2.7.1": - version "2.16.0" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.16.0.tgz#4764577edb10c9575a8b4ce03135493f995f56b9" - integrity sha512-BeKLmtK4OD9V3j92fm/lm6yp+++s2U5Uf17HwNFGt39PEOq+wUDISsx0dhXA5Qls2Bg3WhguDK71blCaVefMeg== + version "2.16.1" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.16.1.tgz#ac9d488a30e79906aeb5ab4a4129695b5a777123" + integrity sha512-Cou9HeqxUhRUyEjn9ApXjJ87qMylJ1DH6+4Zx21QZ0p4zXohl7rvesYngVdy8N+RdSNMIryPmj+WZKRmI8CpJQ== dependencies: - "@sentry/bundler-plugin-core" "2.16.0" + "@sentry/bundler-plugin-core" "2.16.1" unplugin "1.0.1" uuid "^9.0.0" @@ -3735,9 +3735,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" - integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn-walk@^8.0.2: version "8.2.0" @@ -3749,20 +3749,20 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== -acorn@^8.0.4, acorn@^8.4.1: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== +acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== acorn@^8.1.0, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.4.1: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== agent-base@6: version "6.0.2" @@ -4385,9 +4385,9 @@ caniuse-lite@^1.0.30001578: integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== caniuse-lite@^1.0.30001587: - version "1.0.30001605" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6" - integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ== + version "1.0.30001610" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf" + integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA== chalk@5.2.0: version "5.2.0" @@ -4781,9 +4781,9 @@ create-require@^1.1.0: integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cronstrue@^2.41.0: - version "2.48.0" - resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.48.0.tgz#8253a7902930df5145791ee191af9d9dee190523" - integrity sha512-w+VAWjiBJmKYeeK+i0ur3G47LcKNgFuWwb8LVJTaXSS2ExtQ5zdiIVnuysgB3N457gTaSllme0qTpdsJWK/wIg== + version "2.49.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.49.0.tgz#d59f6d19e33030d45d9ecd3b845d4ccd79c6bfbd" + integrity sha512-FWZBqdStQaPR8ZTBQGALh1EK9Hl1HcG70dyGvD1rKLPafFO3H73o38dz/e8YkIlbLn3JxmBI/f6Doe3Nh+DcEQ== cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -5398,9 +5398,9 @@ electron-to-chromium@^1.4.601: integrity sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg== electron-to-chromium@^1.4.668: - version "1.4.724" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz#e0a86fe4d3d0e05a4d7b032549d79608078f830d" - integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA== + version "1.4.737" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz#3a774a58e04980741f65d440f5fdf57af18b6dde" + integrity sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw== emittery@^0.13.1: version "0.13.1" @@ -8187,7 +8187,7 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.2.0, "lru-cache@^9.1.1 || ^10.0.0": +lru-cache@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== @@ -8211,12 +8211,12 @@ lz-string@^1.5.0: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== -magic-string@0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== +magic-string@0.30.8: + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" + "@jridgewell/sourcemap-codec" "^1.4.15" make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -8606,10 +8606,10 @@ moo-color@^1.0.2: dependencies: color-name "^1.1.4" -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.0.0: version "2.0.0" @@ -9055,7 +9055,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2: +path-scurry@^1.10.2, path-scurry@^1.6.1: version "1.10.2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== @@ -9063,14 +9063,6 @@ path-scurry@^1.10.2: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-scurry@^1.6.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== - dependencies: - lru-cache "^9.1.1 || ^10.0.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10679,12 +10671,12 @@ signal-exit@^4.0.1: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sirv@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" - integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" totalist "^3.0.0" sisteransi@^1.0.5: @@ -11771,9 +11763,9 @@ webidl-conversions@^7.0.0: integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-bundle-analyzer@^4.8.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz#84b7473b630a7b8c21c741f81d8fe4593208b454" - integrity sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== dependencies: "@discoveryjs/json-ext" "0.5.7" acorn "^8.0.4" @@ -11783,7 +11775,6 @@ webpack-bundle-analyzer@^4.8.0: escape-string-regexp "^4.0.0" gzip-size "^6.0.0" html-escaper "^2.0.2" - is-plain-object "^5.0.0" opener "^1.5.2" picocolors "^1.0.0" sirv "^2.0.3" From e0deabceb369097ddf9f6789dcc9598b71ee390e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 18 Apr 2024 10:40:08 +0100 Subject: [PATCH 12/68] Add automation to close flaky test issues Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .github/workflows/triage-stale-flaky-tests.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/triage-stale-flaky-tests.yml diff --git a/.github/workflows/triage-stale-flaky-tests.yml b/.github/workflows/triage-stale-flaky-tests.yml new file mode 100644 index 0000000000..66665e56e6 --- /dev/null +++ b/.github/workflows/triage-stale-flaky-tests.yml @@ -0,0 +1,16 @@ +name: Close stale flaky issues +on: + schedule: + - cron: "30 1 * * *" +jobs: + close: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - uses: actions/stale@v9 + with: + only-labels: "Z-Flaky-Test" + days-before-stale: 14 + days-before-close: 0 + close-issue-message: "This flaky test issue has not been updated in 14 days. It is being closed as presumed resolved." From 88c49e7c507359b8d7751b2617e842ef3a7231ed Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 22 Apr 2024 12:13:01 +0100 Subject: [PATCH 13/68] Enable the TAC in develop While we work through fixing all the tests on https://github.com/matrix-org/matrix-react-sdk/pull/12439 enable the TAC on nightly so we can get wider testing. --- element.io/develop/config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/element.io/develop/config.json b/element.io/develop/config.json index 9a4227c8af..aed546559d 100644 --- a/element.io/develop/config.json +++ b/element.io/develop/config.json @@ -48,6 +48,7 @@ }, "privacy_policy_url": "https://element.io/cookie-policy", "features": { + "threadsActivityCentre": true, "feature_video_rooms": true, "feature_new_room_decoration_ui": true, "feature_element_call_video_rooms": true From bbf37ba7cf2323110b85f9063e824424009de35e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 23 Apr 2024 13:08:32 +0000 Subject: [PATCH 14/68] Reset matrix-react-sdk back to develop branch --- package.json | 2 +- yarn.lock | 46 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index f09032219d..bd20715d6e 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.1.0", - "matrix-react-sdk": "3.98.0", + "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index a6a494fc21..80e51dba90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3518,10 +3518,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-3.3.1.tgz#f5d69255fa62472626e0ed71b7176b09f21cbcaf" - integrity sha512-V9CQfaMyKdsWxC1D4Wz08Xh0ge3SnaOBf5SSIp1+uwoJTPyfEFHKgqbZl536SHBvVBc9M9IYg+3+lPB8xkFRFA== +"@vector-im/compound-web@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.0.2.tgz#cd89ca076b9b0528718e45110a4c8126e7556c63" + integrity sha512-MBqmSbtcWC6KJjuTWPZ6FYc83YrUJ9dOageUdbayjhVGZ/de/a+nl/vPIAX+5ic2QWUN7nn9hujfzQF69mbIeg== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -8321,6 +8321,25 @@ matrix-js-sdk@32.1.0: unhomoglyph "^1.0.6" uuid "9" +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": + version "32.1.0" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1da5e8f56a29afef0197dd4c3553d2ee4dfbd576" + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8328,10 +8347,9 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.98.0: +"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": version "3.98.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.98.0.tgz#20bde52244f78f1bc0c8be029dae63d6419caa53" - integrity sha512-RUeFLg1Y6HSpvXvML7nfMUFtACe0ubAALAusU8KEW3rUJrPuRFtSVCe1g1KpwS3huEZHA38vi17B1CwDcEvfPQ== + resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/33c56e565db5922a7d87089cd2baf8bdadc66434" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.19.0" @@ -8343,7 +8361,7 @@ matrix-react-sdk@3.98.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^3.3.1" + "@vector-im/compound-web" "^4.0.2" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -8375,7 +8393,7 @@ matrix-react-sdk@3.98.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "32.1.0" + matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -8383,7 +8401,7 @@ matrix-react-sdk@3.98.0: opus-recorder "^8.0.3" pako "^2.0.3" png-chunks-extract "^1.0.0" - posthog-js "1.116.6" + posthog-js "1.126.0" proposal-temporal "^0.9.0" qrcode "1.5.3" re-resizable "^6.9.0" @@ -9782,10 +9800,10 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.116.6: - version "1.116.6" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.116.6.tgz#9a5c9f49230a76642f4c44d93b96710f886c2880" - integrity sha512-rvt8HxzJD4c2B/xsUa4jle8ApdqljeBI2Qqjp4XJMohQf18DXRyM6b96H5/UMs8jxYuZG14Er0h/kEIWeU6Fmw== +posthog-js@1.126.0: + version "1.126.0" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.126.0.tgz#52ca294505d3ddc3ba34aeaafe388676113ff82f" + integrity sha512-8qCdPE9RZkyXI3kKCnkXWxK0jn2mLZg6g5a6KezDPqH7mHTG66v7ANU31hcwzQGV5F5UW1GXw0xL0PaC3HkA6g== dependencies: fflate "^0.4.8" preact "^10.19.3" From 786c590dcf3fe728368a7a81c92d3cd04c6a8fb8 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 23 Apr 2024 13:08:43 +0000 Subject: [PATCH 15/68] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/package.json b/package.json index bd20715d6e..f0c0828cee 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.1.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 80e51dba90..18be69d3ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8301,26 +8301,6 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.1.0: - version "32.1.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.1.0.tgz#b5cb79cc838c450d44d01de1ac58b6cda63b20b9" - integrity sha512-+jRCQKOBuMvAz3nWsf5NGWpttByeC/gw1It1gCZLQsWix6jN1bkHiqwk6OOvcGj4I5ML2bOEbYEr46bcqFUouQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.1.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1da5e8f56a29afef0197dd4c3553d2ee4dfbd576" From 9ce7b191474a8f771587a0da7276ccdc4625c197 Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Wed, 24 Apr 2024 16:20:55 +0530 Subject: [PATCH 16/68] Exempt issues with this label --- .github/workflows/triage-stale-flaky-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/triage-stale-flaky-tests.yml b/.github/workflows/triage-stale-flaky-tests.yml index 66665e56e6..70d63dd2df 100644 --- a/.github/workflows/triage-stale-flaky-tests.yml +++ b/.github/workflows/triage-stale-flaky-tests.yml @@ -14,3 +14,4 @@ jobs: days-before-stale: 14 days-before-close: 0 close-issue-message: "This flaky test issue has not been updated in 14 days. It is being closed as presumed resolved." + exempt-issue-labels: "Z-Flaky-Test-Disabled" From d3deda62a81bcfb6d608f9dd4892a3d68031c8ea Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 29 Apr 2024 09:51:53 +0100 Subject: [PATCH 17/68] Simplify Playwright CI (#27398) --- .github/workflows/downstream-artifacts.yml | 17 --------- .github/workflows/end-to-end-tests.yaml | 40 +++------------------- 2 files changed, 5 insertions(+), 52 deletions(-) delete mode 100644 .github/workflows/downstream-artifacts.yml diff --git a/.github/workflows/downstream-artifacts.yml b/.github/workflows/downstream-artifacts.yml deleted file mode 100644 index 29d1a1fa93..0000000000 --- a/.github/workflows/downstream-artifacts.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Build downstream artifacts -on: - merge_group: - types: [checks_requested] - pull_request: {} - push: - branches: [develop, master] -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - build-element-web: - name: Build element-web - uses: matrix-org/matrix-react-sdk/.github/workflows/element-web.yaml@develop - with: - element-web-sha: ${{ github.sha }} - react-sdk-repository: matrix-org/matrix-react-sdk diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 1fcc64272c..77510bd30c 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -3,10 +3,11 @@ name: matrix-react-sdk End to End Tests on: - workflow_run: - workflows: ["Build downstream artifacts"] - types: - - completed + merge_group: + types: [checks_requested] + pull_request: {} + push: + branches: [develop, master] concurrency: group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }} @@ -22,37 +23,6 @@ jobs: permissions: actions: read issues: read - statuses: write pull-requests: read - deployments: write with: react-sdk-repository: matrix-org/matrix-react-sdk - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - # We want to make the Playwright tests a required check for the merge queue. - # - # Unfortunately, github doesn't distinguish between "checks needed for branch - # protection" (ie, the things that must pass before the PR will even be added - # to the merge queue) and "checks needed in the merge queue". We just have to add - # the check to the branch protection list. - # - # Ergo, if we know we're not going to run the Playwright tests, we need to add a - # passing status check manually. - mark_skipped: - if: github.event.workflow_run.event != 'merge_group' - permissions: - statuses: write - runs-on: ubuntu-latest - steps: - - uses: Sibz/github-status-action@faaa4d96fecf273bd762985e0e7f9f933c774918 # v1 - with: - authToken: "${{ secrets.GITHUB_TOKEN }}" - state: success - description: Playwright skipped - - # Keep in step with the `context` that is updated by `Sibz/github-status-action` - # in matrix-org/matrix-react-sdk/.github/workflows/end-to-end-tests.yaml. - context: "${{ github.workflow }} / end-to-end-tests" - - sha: "${{ github.event.workflow_run.head_sha }}" From 7e8177edb356edd8c933d82a360b70f537b03b54 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 29 Apr 2024 16:20:54 +0100 Subject: [PATCH 18/68] Update end-to-end-tests.yaml --- .github/workflows/end-to-end-tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 77510bd30c..1deb87b153 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -18,7 +18,7 @@ jobs: name: Playwright # We only want to run the playwright tests on merge queue to prevent regressions # from creeping in. They take a long time to run and consume multiple concurrent runners. - if: github.event.workflow_run.event == 'merge_group' + if: github.event_name == 'merge_group' uses: matrix-org/matrix-react-sdk/.github/workflows/end-to-end-tests.yaml@develop permissions: actions: read From 6e59f6f413baf8cea4a2bed291cd4d7e3ce5b70d Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 30 Apr 2024 12:04:05 +0000 Subject: [PATCH 19/68] Upgrade dependency to matrix-js-sdk@32.2.0-rc.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f0c0828cee..8432741871 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "32.2.0-rc.0", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..46f6fbe8ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8301,6 +8301,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@32.2.0-rc.0: + version "32.2.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.2.0-rc.0.tgz#89f9d5fc5273683f41894bdcf3580ab44f615c13" + integrity sha512-yiEc68/iTkBg7W1wQlesoOH+7GdnEiKEYycx69DMS9RCaADFKM2AeWDQR8IAupfb1XAUultqxpMHTE7zKRW8Qg== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.1.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1da5e8f56a29afef0197dd4c3553d2ee4dfbd576" From 9a2066d98a0bfe3e10003abd31ddfb0c3755cd7e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 30 Apr 2024 12:17:16 +0000 Subject: [PATCH 20/68] Upgrade dependency to matrix-react-sdk@3.99.0-rc.0 --- package.json | 2 +- yarn.lock | 48 +++++++++++++++--------------------------------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 8432741871..3018af653f 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.2.0-rc.0", - "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", + "matrix-react-sdk": "3.99.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 46f6fbe8ce..e40604c569 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2157,10 +2157,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -"@matrix-org/analytics-events@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.19.0.tgz#e20e4df54530ed1c755ab728e9c22891e376f9e2" - integrity sha512-wN/hbpTpOxz2u3zHbsJgVMi88oKmK1yqeSZuif3yNW68XQnV2cc0XGUEpl0fgLOl6fj1bZOtxbDg5rCLbqf4CQ== +"@matrix-org/analytics-events@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.20.0.tgz#062a532ddcf0e2e5eb64c5576cd212cb32a11ccf" + integrity sha512-YCRbZrpZU9q+nrB6RsfPZ4NlKs31ySjP2F7GFUZNPKv96GcbihrnMK086td480SJOYpjPv2vttDJC+S67SFe2w== "@matrix-org/emojibase-bindings@^1.1.2": version "1.1.3" @@ -3518,10 +3518,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.0.2.tgz#cd89ca076b9b0528718e45110a4c8126e7556c63" - integrity sha512-MBqmSbtcWC6KJjuTWPZ6FYc83YrUJ9dOageUdbayjhVGZ/de/a+nl/vPIAX+5ic2QWUN7nn9hujfzQF69mbIeg== +"@vector-im/compound-web@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.1.0.tgz#45fa22e4e91b5fd4c2f535e040072990d5a33712" + integrity sha512-FQSJK7PaJ3dR1c1Q3TYVSShJBl9TwlrhKadnTWsPIX6xE+rvCAeujE50QbcEWdDlWeaJ9Hi0bVPlEssJ+eRwtQ== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -8321,25 +8321,6 @@ matrix-js-sdk@32.2.0-rc.0: unhomoglyph "^1.0.6" uuid "9" -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "32.1.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1da5e8f56a29afef0197dd4c3553d2ee4dfbd576" - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8347,12 +8328,13 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": - version "3.98.0" - resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/33c56e565db5922a7d87089cd2baf8bdadc66434" +matrix-react-sdk@3.99.0-rc.0: + version "3.99.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0-rc.0.tgz#1f159f3a5f0fece935d60dfb81319927e083ae22" + integrity sha512-RJx0bkx4elN5VJ4fhy95gnCVQ3h1Nb/sIf4bkdxA6315aGztSfX/vEB+LxXlsrs35s2wnRGacroj6hNS88tkNQ== dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/analytics-events" "^0.19.0" + "@matrix-org/analytics-events" "^0.20.0" "@matrix-org/emojibase-bindings" "^1.1.2" "@matrix-org/matrix-wysiwyg" "2.17.0" "@matrix-org/olm" "3.2.15" @@ -8361,7 +8343,7 @@ matrix-mock-request@^2.5.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.0.2" + "@vector-im/compound-web" "^4.1.0" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -8393,7 +8375,7 @@ matrix-mock-request@^2.5.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" + matrix-js-sdk "32.2.0-rc.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From f5997aaf7cf9a4d15356abae5ea63fe56816b7bb Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 30 Apr 2024 12:27:52 +0000 Subject: [PATCH 21/68] v1.11.66-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3018af653f..6d922fe28a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.65", + "version": "1.11.66-rc.0", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From c8e866e38445d5a4f071fa0885883ce95cb03a26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:07:49 +0000 Subject: [PATCH 22/68] Update babel monorepo to v7.24.5 --- yarn.lock | 360 +++++++++++++++++++++++++++++------------------------- 1 file changed, 193 insertions(+), 167 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..02ad1e324c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,7 +27,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -67,20 +67,20 @@ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.21.3": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" + "@babel/generator" "^7.24.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -88,18 +88,18 @@ semver "^6.3.1" "@babel/eslint-parser@^7.12.10": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" "@babel/eslint-plugin@^7.12.10": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.23.5.tgz#77d4703e9f83b81e9fc13382810372beb2f10f94" - integrity sha512-03+E/58Hoo/ui69gR+beFdGpplpoVK0BSIdke2iw4/Bz7eGN0ssRenNlnU4nmbkowNQOPCStKSwFr8H6DiY49g== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.24.5.tgz#6581b9005ab76308e4aef6b50aa1788099393211" + integrity sha512-5n3K9Zv13VOa9SG2ZiX0WV7A0ddApRn6vsV8zBojCsxnCbYKLjCDvzDfVxS7C4STmjQDOXU1uk/ppxxDTC860w== dependencies: eslint-rule-composer "^0.3.0" @@ -113,12 +113,12 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.24.1", "@babel/generator@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/generator@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.24.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -184,19 +184,19 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== +"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": @@ -208,10 +208,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" - integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -239,13 +239,20 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": +"@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: "@babel/types" "^7.23.0" +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" @@ -253,16 +260,16 @@ dependencies: "@babel/types" "^7.24.0" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -271,10 +278,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== "@babel/helper-plugin-utils@^7.20.2": version "7.22.5" @@ -308,12 +315,12 @@ "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" @@ -322,27 +329,27 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== +"@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" "@babel/helper-string-parser@^7.22.5": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-string-parser@^7.23.4": +"@babel/helper-string-parser@^7.23.4", "@babel/helper-string-parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" @@ -350,22 +357,22 @@ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" "@babel/highlight@^7.22.13": version "7.23.4" @@ -376,7 +383,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.23.4", "@babel/highlight@^7.24.2": +"@babel/highlight@^7.23.4": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== @@ -386,6 +393,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" @@ -401,18 +418,18 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== -"@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" + integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" @@ -705,12 +722,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== +"@babel/plugin-transform-block-scoping@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-class-properties@^7.24.1": version "7.24.1" @@ -729,18 +746,18 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== +"@babel/plugin-transform-classes@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.1": @@ -751,12 +768,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== +"@babel/plugin-transform-destructuring@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-dotall-regex@^7.24.1": version "7.24.1" @@ -910,15 +927,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-object-super@^7.24.1": version "7.24.1" @@ -936,12 +953,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== +"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" @@ -952,12 +969,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== +"@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-private-methods@^7.24.1": version "7.24.1" @@ -967,14 +984,14 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== +"@babel/plugin-transform-private-property-in-object@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-transform-property-literals@^7.24.1": @@ -1080,12 +1097,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== +"@babel/plugin-transform-typeof-symbol@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" + integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-typescript@^7.24.1": version "7.24.1" @@ -1129,15 +1146,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.12.11", "@babel/preset-env@^7.20.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" + integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== dependencies: "@babel/compat-data" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" @@ -1164,12 +1181,12 @@ "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" + "@babel/plugin-transform-block-scoping" "^7.24.5" "@babel/plugin-transform-class-properties" "^7.24.1" "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-classes" "^7.24.5" "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.5" "@babel/plugin-transform-dotall-regex" "^7.24.1" "@babel/plugin-transform-duplicate-keys" "^7.24.1" "@babel/plugin-transform-dynamic-import" "^7.24.1" @@ -1189,13 +1206,13 @@ "@babel/plugin-transform-new-target" "^7.24.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" "@babel/plugin-transform-object-super" "^7.24.1" "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.5" "@babel/plugin-transform-property-literals" "^7.24.1" "@babel/plugin-transform-regenerator" "^7.24.1" "@babel/plugin-transform-reserved-words" "^7.24.1" @@ -1203,7 +1220,7 @@ "@babel/plugin-transform-spread" "^7.24.1" "@babel/plugin-transform-sticky-regex" "^7.24.1" "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.5" "@babel/plugin-transform-unicode-escapes" "^7.24.1" "@babel/plugin-transform-unicode-property-regex" "^7.24.1" "@babel/plugin-transform-unicode-regex" "^7.24.1" @@ -1264,9 +1281,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" @@ -1304,19 +1321,19 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" debug "^4.3.1" globals "^11.1.0" @@ -1329,7 +1346,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.24.0", "@babel/types@^7.4.4": +"@babel/types@^7.21.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== @@ -1338,6 +1355,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -4089,12 +4115,12 @@ babel-plugin-jsx-remove-data-test-id@^3.0.0: integrity sha512-E4uM/LIUizjy2Z5tVAfa8pSXsYgoKWJ97kzuEMfsIxSLSNDWsAhgFVPkgNuakViX5dkNjw1DKIi0VpWP6djqbw== babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: @@ -4106,11 +4132,11 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: core-js-compat "^3.36.1" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -4385,9 +4411,9 @@ caniuse-lite@^1.0.30001578: integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== caniuse-lite@^1.0.30001587: - version "1.0.30001610" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz#2f44ed6e21d359e914271ae35b68903632628ccf" - integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA== + version "1.0.30001614" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" + integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== chalk@5.2.0: version "5.2.0" @@ -4692,9 +4718,9 @@ copy-webpack-plugin@^12.0.0: serialize-javascript "^6.0.2" core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" - integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: browserslist "^4.23.0" @@ -5398,9 +5424,9 @@ electron-to-chromium@^1.4.601: integrity sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg== electron-to-chromium@^1.4.668: - version "1.4.737" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz#3a774a58e04980741f65d440f5fdf57af18b6dde" - integrity sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw== + version "1.4.751" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.751.tgz#b5b19742a435c589de02f60c16618150498bbd59" + integrity sha512-2DEPi++qa89SMGRhufWTiLmzqyuGmNF3SK4+PQetW1JKiZdEpF4XQonJXJCzyuYSA6mauiMhbyVhqYAP45Hvfw== emittery@^0.13.1: version "0.13.1" From 91e9891892a21cb74e40c6e18f645837898b810e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:08:12 +0000 Subject: [PATCH 23/68] Update dependency eslint-plugin-react-hooks to v4.6.2 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..55a2023951 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5858,9 +5858,9 @@ eslint-plugin-matrix-org@^1.0.0: integrity sha512-A3cDjhG7RHwfCS8o3bOip8hSCsxtmgk2ahvqE5v/Ic2kPEZxixY6w8zLj7hFGsrRmPSEpLWqkVLt8uvQBapiQA== eslint-plugin-react-hooks@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.28.0: version "7.34.1" From 6d457e35597e7a0daa84283cdfe4be1de6461ab3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:08:32 +0000 Subject: [PATCH 24/68] Update dependency yaml to v2.4.2 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..ab9ce872b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12149,9 +12149,9 @@ yaml@^1.10.0: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.3: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== yargs-parser@^18.1.2: version "18.1.3" From 686816b8a4a39b98fc27a77cedba402fea7ef4a4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:09:05 +0000 Subject: [PATCH 25/68] Update typescript-eslint monorepo to v7.7.1 --- yarn.lock | 98 +++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..8b34786375 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3421,15 +3421,15 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^7.0.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz#bf34a02f221811505b8bf2f31060c8560c1bb0a3" - integrity sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ== + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" + integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/type-utils" "7.7.0" - "@typescript-eslint/utils" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/type-utils" "7.8.0" + "@typescript-eslint/utils" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.3.1" @@ -3438,46 +3438,46 @@ ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.0.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.0.tgz#6b1b3ce76c5de002c43af8ae933613b0f2b4bcc6" - integrity sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg== - dependencies: - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8" + integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ== + dependencies: + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz#3f0db079b275bb8b0cb5be7613fb3130cfb5de77" - integrity sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw== +"@typescript-eslint/scope-manager@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" + integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" -"@typescript-eslint/type-utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz#36792ff4209a781b058de61631a48df17bdefbc5" - integrity sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg== +"@typescript-eslint/type-utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f" + integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A== dependencies: - "@typescript-eslint/typescript-estree" "7.7.0" - "@typescript-eslint/utils" "7.7.0" + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/utils" "7.8.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.0.tgz#23af4d24bf9ce15d8d301236e3e3014143604f27" - integrity sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w== +"@typescript-eslint/types@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" + integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== -"@typescript-eslint/typescript-estree@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz#b5dd6383b4c6a852d7b256a37af971e8982be97f" - integrity sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ== +"@typescript-eslint/typescript-estree@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" + integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== dependencies: - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/visitor-keys" "7.7.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3485,25 +3485,25 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.0.tgz#3d2b6606a60ac34f3c625facfb3b3ab7e126f58d" - integrity sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig== +"@typescript-eslint/utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" + integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.15" "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.7.0" - "@typescript-eslint/types" "7.7.0" - "@typescript-eslint/typescript-estree" "7.7.0" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" semver "^7.6.0" -"@typescript-eslint/visitor-keys@7.7.0": - version "7.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz#950148cf1ac11562a2d903fdf7acf76714a2dc9e" - integrity sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA== +"@typescript-eslint/visitor-keys@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" + integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== dependencies: - "@typescript-eslint/types" "7.7.0" + "@typescript-eslint/types" "7.8.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": From 8449bdc5c1ab7a03802f0826333b30313ce01fdf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 13:09:29 +0000 Subject: [PATCH 26/68] Update dependency stylelint to v16.4.0 --- yarn.lock | 58 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 18be69d3ec..2e84cd99e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -339,10 +339,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" @@ -376,7 +376,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.23.4", "@babel/highlight@^7.24.2": +"@babel/highlight@^7.23.4": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== @@ -386,6 +386,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" @@ -1653,7 +1663,7 @@ resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz#598a25630fd9ab0edf066d235916f7441404942a" integrity sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg== -"@csstools/selector-specificity@^3.0.2": +"@csstools/selector-specificity@^3.0.2", "@csstools/selector-specificity@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz#208a3929ee614967a1fc8cd6cb758d9fcbf0caae" integrity sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q== @@ -3800,7 +3810,7 @@ ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -3810,6 +3820,16 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + another-json@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" @@ -4813,10 +4833,10 @@ css-declaration-sorter@^7.1.1: resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz#9796bcc257b4647c39993bda8d431ce32b666f80" integrity sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ== -css-functions-list@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" - integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== +css-functions-list@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.2.tgz#9a54c6dd8416ed25c1079cd88234e927526c1922" + integrity sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ== css-has-pseudo@^6.0.2: version "6.0.2" @@ -11037,19 +11057,19 @@ stylelint-scss@^6.0.0: postcss-value-parser "^4.2.0" stylelint@^16.1.0: - version "16.3.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.3.1.tgz#006cc6cd4bd8e7b3acb1607bb8e8de85121b7847" - integrity sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw== + version "16.4.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.4.0.tgz#8811005be82ca06224bc9bc3b4cf2fce30b347ae" + integrity sha512-uSx7VMuXwLuYcNSIg+0/fFNv0WinsfLAqsVVy7h7p80clKOHiGE8pfY6UjqwylTHiJrRIahTl6a8FPxGezhWoA== dependencies: "@csstools/css-parser-algorithms" "^2.6.1" "@csstools/css-tokenizer" "^2.2.4" "@csstools/media-query-list-parser" "^2.1.9" - "@csstools/selector-specificity" "^3.0.2" + "@csstools/selector-specificity" "^3.0.3" "@dual-bundle/import-meta-resolve" "^4.0.0" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" - css-functions-list "^3.2.1" + css-functions-list "^3.2.2" css-tree "^2.3.1" debug "^4.3.4" fast-glob "^3.3.2" @@ -11078,7 +11098,7 @@ stylelint@^16.1.0: strip-ansi "^7.1.0" supports-hyperlinks "^3.0.0" svg-tags "^1.0.0" - table "^6.8.1" + table "^6.8.2" write-file-atomic "^5.0.1" sugarss@^4.0.1: @@ -11204,7 +11224,7 @@ tabbable@^6.0.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -table@^6.8.1: +table@^6.8.2: version "6.8.2" resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== @@ -11592,7 +11612,7 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" -uri-js@^4.2.2: +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== From 73f2dba0c32bc918f9a0c0b0b33d48bc4666c453 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:08:20 +0000 Subject: [PATCH 27/68] Update dependency typescript to v5.4.5 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f0c0828cee..4a4c1a8ded 100644 --- a/package.json +++ b/package.json @@ -199,7 +199,7 @@ "terser-webpack-plugin": "^5.3.9", "ts-node": "^10.9.1", "ts-prune": "^0.10.3", - "typescript": "5.4.3", + "typescript": "5.4.5", "util": "^0.12.5", "webpack": "^5.89.0", "webpack-bundle-analyzer": "^4.8.0", diff --git a/yarn.lock b/yarn.lock index d2c19c70e9..74a5f1c872 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11537,10 +11537,10 @@ typed-array-length@^1.0.4, typed-array-length@^1.0.5: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +typescript@5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== ua-parser-js@^1.0.0, ua-parser-js@^1.0.2: version "1.0.37" From aeef12ef8bc9320645c50af77fef6d148757bd6a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 30 Apr 2024 16:19:35 +0100 Subject: [PATCH 28/68] Update end-to-end-tests.yaml --- .github/workflows/end-to-end-tests.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 1deb87b153..5b09d70c14 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -16,9 +16,6 @@ concurrency: jobs: playwright: name: Playwright - # We only want to run the playwright tests on merge queue to prevent regressions - # from creeping in. They take a long time to run and consume multiple concurrent runners. - if: github.event_name == 'merge_group' uses: matrix-org/matrix-react-sdk/.github/workflows/end-to-end-tests.yaml@develop permissions: actions: read @@ -26,3 +23,6 @@ jobs: pull-requests: read with: react-sdk-repository: matrix-org/matrix-react-sdk + # We only want to run the playwright tests on merge queue to prevent regressions + # from creeping in. They take a long time to run and consume multiple concurrent runners. + skip: ${{ github.event_name != 'merge_group' }} From 4561b2d35d935f1a000e09320adab33442807a8e Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Wed, 1 May 2024 11:36:06 +0100 Subject: [PATCH 29/68] Roll out Rust crypto to 30% of existing users on `app.element.io` --- element.io/app/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element.io/app/config.json b/element.io/app/config.json index 2ea4ce7c61..2214dbc7ea 100644 --- a/element.io/app/config.json +++ b/element.io/app/config.json @@ -45,6 +45,6 @@ "privacy_policy_url": "https://element.io/cookie-policy", "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx", "setting_defaults": { - "RustCrypto.staged_rollout_percent": 10 + "RustCrypto.staged_rollout_percent": 30 } } From 011f7465e731f18cf4c3f2bccfac607e5bb0518b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 13:11:46 +0100 Subject: [PATCH 30/68] Update react-types (#26481) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 8 ++++---- yarn.lock | 44 ++++++++++++++++++++++---------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 4a4c1a8ded..abea4e8397 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "update:jitsi": "curl -s https://meet.element.io/libs/external_api.min.js > ./res/jitsi_external_api.min.js" }, "resolutions": { - "@types/react-dom": "17.0.21", - "@types/react": "17.0.68" + "@types/react-dom": "17.0.25", + "@types/react": "17.0.80" }, "dependencies": { "@matrix-org/olm": "3.2.15", @@ -127,9 +127,9 @@ "@types/node-fetch": "^2.6.4", "@types/pako": "^2.0.3", "@types/qrcode": "^1.5.5", - "@types/react": "17.0.68", + "@types/react": "17.0.80", "@types/react-beautiful-dnd": "^13.1.7", - "@types/react-dom": "17.0.21", + "@types/react-dom": "17.0.25", "@types/react-transition-group": "^4.4.9", "@types/sanitize-html": "^2.9.5", "@types/sdp-transform": "^2.4.9", diff --git a/yarn.lock b/yarn.lock index 74a5f1c872..00057469f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3300,16 +3300,16 @@ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-beautiful-dnd@^13.1.7": - version "13.1.7" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.7.tgz#cc8038896ee7dee99b8bfd0eaed0a02a8617bedc" - integrity sha512-jQZLov9OkD0xRQkqz8/lx66bHYAYv+g4+POBqnH5Jtt/xo4MygzM879Q9sxAiosPBdNj1JYTdbPxDn3dNRYgow== + version "13.1.8" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz#f52d3ea07e1e19159d6c3c4a48c8da3d855e60b4" + integrity sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ== dependencies: "@types/react" "*" -"@types/react-dom@17.0.21", "@types/react-dom@<18.0.0": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" - integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== +"@types/react-dom@17.0.25", "@types/react-dom@<18.0.0": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.25.tgz#e0e5b3571e1069625b3a3da2b279379aa33a0cb5" + integrity sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA== dependencies: "@types/react" "^17" @@ -3324,19 +3324,19 @@ redux "^4.0.0" "@types/react-transition-group@^4.4.9": - version "4.4.9" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.9.tgz#12a1a1b5b8791067198149867b0823fbace31579" - integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg== + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@17.0.68", "@types/react@^17": - version "17.0.68" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" - integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== +"@types/react@*", "@types/react@17.0.80", "@types/react@^17": + version "17.0.80" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" + integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" + "@types/scheduler" "^0.16" csstype "^3.0.2" "@types/retry@0.12.0": @@ -3356,10 +3356,10 @@ dependencies: htmlparser2 "^8.0.0" -"@types/scheduler@*": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== +"@types/scheduler@^0.16": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/sdp-transform@^2.4.9": version "2.4.9" @@ -5045,9 +5045,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== data-urls@^3.0.2: version "3.0.2" From dc85c9fb13dbb24ec934b07c94ea5eae2a2d796e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 2 May 2024 15:11:09 +0000 Subject: [PATCH 31/68] Upgrade dependency to matrix-react-sdk@3.99.0-rc.1 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 6d922fe28a..179248d6fa 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.2.0-rc.0", - "matrix-react-sdk": "3.99.0-rc.0", + "matrix-react-sdk": "3.99.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index e40604c569..67bc889f61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3518,10 +3518,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.1.0.tgz#45fa22e4e91b5fd4c2f535e040072990d5a33712" - integrity sha512-FQSJK7PaJ3dR1c1Q3TYVSShJBl9TwlrhKadnTWsPIX6xE+rvCAeujE50QbcEWdDlWeaJ9Hi0bVPlEssJ+eRwtQ== +"@vector-im/compound-web@^4.1.1": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.1.2.tgz#d8f9ba523700660942722a800c64406216bbbfea" + integrity sha512-u/jj8HF8qpX1NU+sh6f/S1B7HUMGcoAGYLH0wc5lVbf6x6elBsYKD0LSa+/8NDPuQqVWMztu76chUsM5slC49w== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -8328,10 +8328,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.99.0-rc.0: - version "3.99.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0-rc.0.tgz#1f159f3a5f0fece935d60dfb81319927e083ae22" - integrity sha512-RJx0bkx4elN5VJ4fhy95gnCVQ3h1Nb/sIf4bkdxA6315aGztSfX/vEB+LxXlsrs35s2wnRGacroj6hNS88tkNQ== +matrix-react-sdk@3.99.0-rc.1: + version "3.99.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0-rc.1.tgz#1c055ae6c37ec521867a5ad8da687f292604ffe1" + integrity sha512-mkQL4/JodS/zhUn+F29ZT7X/ggjAL+jxIY78Kgjx+bM8PX1ymEUEAhDHDD1ZqeyD7tqC47Pg1aFOtPDCyuwxJQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.20.0" @@ -8343,7 +8343,7 @@ matrix-react-sdk@3.99.0-rc.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.1.0" + "@vector-im/compound-web" "^4.1.1" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" From 729534401fa6f229609a902ab854e0a1d738511b Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 2 May 2024 15:17:05 +0000 Subject: [PATCH 32/68] v1.11.66-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 179248d6fa..30d494719c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.66-rc.0", + "version": "1.11.66-rc.1", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From b82100ede8f1825071f68cd5872f1c7df1b39f0e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 3 May 2024 12:47:40 +0100 Subject: [PATCH 33/68] Fix `element-desktop-ssoid being` included in OIDC Authorization call Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/platform/ElectronPlatform.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vector/platform/ElectronPlatform.tsx b/src/vector/platform/ElectronPlatform.tsx index 9063fc945d..0ae1f75863 100644 --- a/src/vector/platform/ElectronPlatform.tsx +++ b/src/vector/platform/ElectronPlatform.tsx @@ -377,10 +377,12 @@ export default class ElectronPlatform extends VectorBasePlatform { return this.ipc.call("getAvailableSpellCheckLanguages"); } - public getSSOCallbackUrl(fragmentAfterLogin?: string): URL { - const url = super.getSSOCallbackUrl(fragmentAfterLogin); + public getSSOCallbackUrl(forOidc = false, fragmentAfterLogin?: string): URL { + const url = super.getSSOCallbackUrl(forOidc, fragmentAfterLogin); url.protocol = "element"; - url.searchParams.set(SSO_ID_KEY, this.ssoID); + if (!forOidc) { + url.searchParams.set(SSO_ID_KEY, this.ssoID); + } return url; } @@ -446,8 +448,7 @@ export default class ElectronPlatform extends VectorBasePlatform { public async getOidcClientMetadata(): Promise { const baseMetadata = await super.getOidcClientMetadata(); - const redirectUri = this.getSSOCallbackUrl(); - redirectUri.searchParams.delete(SSO_ID_KEY); // it will be shuttled via the state param instead + const redirectUri = this.getSSOCallbackUrl(true); return { ...baseMetadata, applicationType: "native", From f7132ff139dcc96708034c4f8f80dff1e7872afc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 May 2024 12:12:01 +0200 Subject: [PATCH 34/68] Add static file .well-known/assetlinks.json, to allow Android applications Element and Element X running on Android 12 and higher to open external links. --- res/.well-known/assetlinks.json | 62 +++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 res/.well-known/assetlinks.json diff --git a/res/.well-known/assetlinks.json b/res/.well-known/assetlinks.json new file mode 100644 index 0000000000..17fd1c0d62 --- /dev/null +++ b/res/.well-known/assetlinks.json @@ -0,0 +1,62 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "im.vector.app.debug", + "sha256_cert_fingerprints": [ + "B0:B0:51:DC:56:5C:81:2F:E1:7F:6F:3E:94:5B:4D:79:04:71:23:AB:0D:A6:12:86:76:9E:B2:94:91:97:13:0E" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "im.vector.app.nightly", + "sha256_cert_fingerprints": [ + "CA:D3:85:16:84:3A:05:CC:EB:00:AB:7B:D3:80:0F:01:BA:8F:E0:4B:38:86:F3:97:D8:F7:9A:1B:C4:54:E4:0F" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "im.vector.app", + "sha256_cert_fingerprints": [ + "F3:FF:38:D2:E5:A6:38:84:86:4A:4E:0D:45:C5:3B:19:8E:7E:39:C0:50:5B:D9:63:F5:55:D6:53:2D:EA:BF:5F" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "io.element.android.x.debug", + "sha256_cert_fingerprints": [ + "B0:B0:51:DC:56:5C:81:2F:E1:7F:6F:3E:94:5B:4D:79:04:71:23:AB:0D:A6:12:86:76:9E:B2:94:91:97:13:0E" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "io.element.android.x.nightly", + "sha256_cert_fingerprints": [ + "CA:D3:85:16:84:3A:05:CC:EB:00:AB:7B:D3:80:0F:01:BA:8F:E0:4B:38:86:F3:97:D8:F7:9A:1B:C4:54:E4:0F" + ] + } + }, + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "io.element.android.x", + "sha256_cert_fingerprints": [ + "C6:DB:9B:9C:8C:BD:D6:5D:16:E8:EC:8C:8B:91:C8:31:B9:EF:C9:5C:BF:98:AE:41:F6:A9:D8:35:15:1A:7E:16" + ] + } + } +] From 27d4e1d9906ce16ac97fb6838a439ed1f4329206 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 May 2024 14:04:47 +0200 Subject: [PATCH 35/68] Add /.well-known/assetlinks.json to cfp_headers file. --- .github/cfp_headers | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/cfp_headers b/.github/cfp_headers index 5eb050e228..497a5ff58d 100644 --- a/.github/cfp_headers +++ b/.github/cfp_headers @@ -11,3 +11,6 @@ /apple-app-site-association Content-Type: application/json + +/.well-known/assetlinks.json + Content-Type: application/json From 9b988f70deed1e97f8d309e2253cb34b89d02a4b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 May 2024 14:09:42 +0200 Subject: [PATCH 36/68] Add /.well-known/assetlinks.json to webpack.config.js --- webpack.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.config.js b/webpack.config.js index 3b827c8d95..6e0ee9f6c3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -736,6 +736,7 @@ module.exports = (env, argv) => { new CopyWebpackPlugin({ patterns: [ "res/apple-app-site-association", + "res/.well-known/assetlinks.json", "res/jitsi_external_api.min.js", "res/jitsi_external_api.min.js.LICENSE.txt", "res/manifest.json", From 80a7ea76496c8adedeb2560dd95ff3874a0f3235 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 7 May 2024 12:17:45 +0000 Subject: [PATCH 37/68] Upgrade dependency to matrix-js-sdk@32.2.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 30d494719c..a2afcd020d 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.2.0-rc.0", + "matrix-js-sdk": "32.2.0", "matrix-react-sdk": "3.99.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 67bc889f61..df21752f41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8301,6 +8301,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@32.2.0: + version "32.2.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.2.0.tgz#9b49206ba292890ba4fe2cd58e0741a269ade9a5" + integrity sha512-LnfJNq5nMF/R+Wigv7dP+Q6I/D5zKHOIdGg9mYyQmhpLc+skWLCtjqa4cLH+hq5CUyppQXMuPH/FFQaGQQ3ImA== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-js-sdk@32.2.0-rc.0: version "32.2.0-rc.0" resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.2.0-rc.0.tgz#89f9d5fc5273683f41894bdcf3580ab44f615c13" From e85228227004f030a90be398199aa433edea7ba3 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 7 May 2024 12:27:24 +0000 Subject: [PATCH 38/68] Upgrade dependency to matrix-react-sdk@3.99.0 --- package.json | 2 +- yarn.lock | 30 +++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index a2afcd020d..47aa46cdb1 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.2.0", - "matrix-react-sdk": "3.99.0-rc.1", + "matrix-react-sdk": "3.99.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index df21752f41..35d7aedc5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8321,26 +8321,6 @@ matrix-js-sdk@32.2.0: unhomoglyph "^1.0.6" uuid "9" -matrix-js-sdk@32.2.0-rc.0: - version "32.2.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.2.0-rc.0.tgz#89f9d5fc5273683f41894bdcf3580ab44f615c13" - integrity sha512-yiEc68/iTkBg7W1wQlesoOH+7GdnEiKEYycx69DMS9RCaADFKM2AeWDQR8IAupfb1XAUultqxpMHTE7zKRW8Qg== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8348,10 +8328,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.99.0-rc.1: - version "3.99.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0-rc.1.tgz#1c055ae6c37ec521867a5ad8da687f292604ffe1" - integrity sha512-mkQL4/JodS/zhUn+F29ZT7X/ggjAL+jxIY78Kgjx+bM8PX1ymEUEAhDHDD1ZqeyD7tqC47Pg1aFOtPDCyuwxJQ== +matrix-react-sdk@3.99.0: + version "3.99.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0.tgz#bf89a30fa0c28177b40d9963ea254d762fce3f03" + integrity sha512-gFCQ4v3oE4PMZFkZxexp+KVibipO2UvzgLjFKGOkgD2WnfTrCBISCZ0mz19MQbFoxftQRJw65B47bwe6PnD88Q== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.20.0" @@ -8395,7 +8375,7 @@ matrix-react-sdk@3.99.0-rc.1: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "32.2.0-rc.0" + matrix-js-sdk "32.2.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From 2ee54dd4bca071cd756851d32215b33567bcc64c Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 7 May 2024 12:39:40 +0000 Subject: [PATCH 39/68] v1.11.66 --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1100a6cae..79c187a844 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +Changes in [1.11.66](https://github.com/element-hq/element-web/releases/tag/v1.11.66) (2024-05-07) +================================================================================================== +## ✨ Features + +* Use a different error message for UTDs when you weren't in the room. ([#12453](https://github.com/matrix-org/matrix-react-sdk/pull/12453)). Contributed by @uhoreg. +* Take the Threads Activity Centre out of labs ([#12439](https://github.com/matrix-org/matrix-react-sdk/pull/12439)). Contributed by @dbkr. +* Expected UTDs: use a different message for UTDs sent before login ([#12391](https://github.com/matrix-org/matrix-react-sdk/pull/12391)). Contributed by @richvdh. +* Add `Tooltip` to `AccessibleButton` ([#12443](https://github.com/matrix-org/matrix-react-sdk/pull/12443)). Contributed by @florianduros. +* Add analytics to activity toggles ([#12418](https://github.com/matrix-org/matrix-react-sdk/pull/12418)). Contributed by @dbkr. +* Decrypt events in reverse order without copying the array ([#12445](https://github.com/matrix-org/matrix-react-sdk/pull/12445)). Contributed by @Johennes. +* Use new compound tooltip ([#12416](https://github.com/matrix-org/matrix-react-sdk/pull/12416)). Contributed by @florianduros. +* Expected UTDs: report a different Posthog code ([#12389](https://github.com/matrix-org/matrix-react-sdk/pull/12389)). Contributed by @richvdh. + +## 🐛 Bug Fixes + +* TAC: Fix accessibility issue when the Release announcement is displayed ([#12484](https://github.com/matrix-org/matrix-react-sdk/pull/12484)). Contributed by @RiotRobot. +* TAC: Close Release Announcement when TAC button is clicked ([#12485](https://github.com/matrix-org/matrix-react-sdk/pull/12485)). Contributed by @florianduros. +* MenuItem: fix caption usage ([#12455](https://github.com/matrix-org/matrix-react-sdk/pull/12455)). Contributed by @florianduros. +* Show the local echo in previews ([#12451](https://github.com/matrix-org/matrix-react-sdk/pull/12451)). Contributed by @langleyd. +* Fixed the drag and drop of X #27186 ([#12450](https://github.com/matrix-org/matrix-react-sdk/pull/12450)). Contributed by @asimdelvi. +* Move the TAC to above the button ([#12438](https://github.com/matrix-org/matrix-react-sdk/pull/12438)). Contributed by @dbkr. +* Use the same logic in previews as the timeline to hide events that should be hidden ([#12434](https://github.com/matrix-org/matrix-react-sdk/pull/12434)). Contributed by @langleyd. +* Fix selector so maths support doesn't mangle divs ([#12433](https://github.com/matrix-org/matrix-react-sdk/pull/12433)). Contributed by @uhoreg. + + + Changes in [1.11.65](https://github.com/element-hq/element-web/releases/tag/v1.11.65) (2024-04-23) ================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index 47aa46cdb1..bccda15e02 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.66-rc.1", + "version": "1.11.66", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From a71b7f0e6605b680a17849d2f7e953fc75ce7124 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 7 May 2024 12:42:45 +0000 Subject: [PATCH 40/68] Reset matrix-react-sdk back to develop branch --- package.json | 2 +- yarn.lock | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 3a35306d2d..5965beb334 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.2.0", - "matrix-react-sdk": "3.99.0", + "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index e89ff9e2ee..b077a9bc18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3544,7 +3544,7 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.1.1": +"@vector-im/compound-web@^4.1.2": version "4.1.2" resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.1.2.tgz#d8f9ba523700660942722a800c64406216bbbfea" integrity sha512-u/jj8HF8qpX1NU+sh6f/S1B7HUMGcoAGYLH0wc5lVbf6x6elBsYKD0LSa+/8NDPuQqVWMztu76chUsM5slC49w== @@ -8357,6 +8357,25 @@ matrix-js-sdk@32.2.0: unhomoglyph "^1.0.6" uuid "9" +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": + version "32.2.0" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/2a716bd076459f48fed967f3eb4158ebdc1f3600" + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8364,10 +8383,9 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.99.0: +"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": version "3.99.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.99.0.tgz#bf89a30fa0c28177b40d9963ea254d762fce3f03" - integrity sha512-gFCQ4v3oE4PMZFkZxexp+KVibipO2UvzgLjFKGOkgD2WnfTrCBISCZ0mz19MQbFoxftQRJw65B47bwe6PnD88Q== + resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/d1eab0aa7ed0adfeb16160e3983ca38aa4a6fcfd" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.20.0" @@ -8379,7 +8397,7 @@ matrix-react-sdk@3.99.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.1.1" + "@vector-im/compound-web" "^4.1.2" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -8411,7 +8429,7 @@ matrix-react-sdk@3.99.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "32.2.0" + matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -8419,7 +8437,7 @@ matrix-react-sdk@3.99.0: opus-recorder "^8.0.3" pako "^2.0.3" png-chunks-extract "^1.0.0" - posthog-js "1.126.0" + posthog-js "1.130.1" proposal-temporal "^0.9.0" qrcode "1.5.3" re-resizable "^6.9.0" @@ -9818,10 +9836,10 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.126.0: - version "1.126.0" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.126.0.tgz#52ca294505d3ddc3ba34aeaafe388676113ff82f" - integrity sha512-8qCdPE9RZkyXI3kKCnkXWxK0jn2mLZg6g5a6KezDPqH7mHTG66v7ANU31hcwzQGV5F5UW1GXw0xL0PaC3HkA6g== +posthog-js@1.130.1: + version "1.130.1" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.130.1.tgz#e8d037043f801d438f785f441843cce7d8af7ec3" + integrity sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w== dependencies: fflate "^0.4.8" preact "^10.19.3" From 02fd35dad06935671cea0e4374491050f956dc11 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 7 May 2024 12:42:55 +0000 Subject: [PATCH 41/68] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/package.json b/package.json index 5965beb334..f2ad032451 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.2.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index b077a9bc18..f6b8fd6425 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8337,26 +8337,6 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.2.0: - version "32.2.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.2.0.tgz#9b49206ba292890ba4fe2cd58e0741a269ade9a5" - integrity sha512-LnfJNq5nMF/R+Wigv7dP+Q6I/D5zKHOIdGg9mYyQmhpLc+skWLCtjqa4cLH+hq5CUyppQXMuPH/FFQaGQQ3ImA== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.2.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/2a716bd076459f48fed967f3eb4158ebdc1f3600" From 7359c9bf936efd0ad57a893021ad5915fbfb362a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Goinvic?= Date: Wed, 3 Jan 2024 10:42:32 +0100 Subject: [PATCH 42/68] sign images using cosign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gaël Goinvic --- .github/workflows/dockerhub.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml index ab666bf27a..26008d6a8b 100644 --- a/.github/workflows/dockerhub.yaml +++ b/.github/workflows/dockerhub.yaml @@ -7,6 +7,9 @@ on: # This job can take a while, and we have usage limits, so just publish develop only twice a day - cron: "0 7/12 * * *" concurrency: ${{ github.workflow }}-${{ github.ref_name }} + +permissions: + id-token: write # needed for signing the images with GitHub OIDC Token jobs: buildx: name: Docker Buildx @@ -26,6 +29,9 @@ jobs: with: fetch-depth: 0 # needed for docker-package to be able to calculate the version + - name: Install Cosign + uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 # v3 + - name: Prepare if: matrix.prepare run: ${{ matrix.prepare }} @@ -58,6 +64,7 @@ jobs: ${{ matrix.flavor }} - name: Build and push + id: build-and-push uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5 with: context: . @@ -66,6 +73,17 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + - name: Sign the images with GitHub OIDC Token + env: + DIGEST: ${{ steps.build-and-push.outputs.digest }} + TAGS: ${{ steps.meta.outputs.tags }} + run: | + images="" + for tag in ${TAGS}; do + images+="${tag}@${DIGEST} " + done + cosign sign --yes ${images} + - name: Update repo description if: matrix.variant == 'vanilla' uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae # v4 From 6ebe844fc0f9f20b80993ce735d9b06071f1976c Mon Sep 17 00:00:00 2001 From: Ben Banfield-Zanin Date: Wed, 8 May 2024 16:56:45 +0100 Subject: [PATCH 43/68] Indent inline script correctly Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- .github/workflows/dockerhub.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml index 26008d6a8b..3c64e4efbc 100644 --- a/.github/workflows/dockerhub.yaml +++ b/.github/workflows/dockerhub.yaml @@ -80,7 +80,7 @@ jobs: run: | images="" for tag in ${TAGS}; do - images+="${tag}@${DIGEST} " + images+="${tag}@${DIGEST} " done cosign sign --yes ${images} From 3a159beb21bbf0ddfa0fe4863525a8149fa57f0f Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 May 2024 10:42:26 +0100 Subject: [PATCH 44/68] Add code style rule for multiple return types --- code_style.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code_style.md b/code_style.md index 0462f3a4a9..4bd9cebffe 100644 --- a/code_style.md +++ b/code_style.md @@ -224,6 +224,10 @@ Unless otherwise specified, the following applies to all code: // ... } ``` +37. Avoid functions whose behaviour / return type varies with different parameter types. + Multiple return types are fine when appropriate (eg. SDKConfig.get() with a string param which + returns the type according to the param given) but SDKConfig.get() with no args returning the + whole config object is not: this could just be a separate function. ## React From 36571edb9563724b552dbce0bd4d20260ca7ef07 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 9 May 2024 10:53:33 +0100 Subject: [PATCH 45/68] Prettier --- code_style.md | 1 + 1 file changed, 1 insertion(+) diff --git a/code_style.md b/code_style.md index 4bd9cebffe..eab031b46d 100644 --- a/code_style.md +++ b/code_style.md @@ -224,6 +224,7 @@ Unless otherwise specified, the following applies to all code: // ... } ``` + 37. Avoid functions whose behaviour / return type varies with different parameter types. Multiple return types are fine when appropriate (eg. SDKConfig.get() with a string param which returns the type according to the param given) but SDKConfig.get() with no args returning the From 8ba3f53d2c84b14fed0901f5e31115658479fe7a Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 10 May 2024 10:48:11 +0100 Subject: [PATCH 46/68] Hopefully clarify --- code_style.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code_style.md b/code_style.md index eab031b46d..f18de37e0d 100644 --- a/code_style.md +++ b/code_style.md @@ -226,9 +226,10 @@ Unless otherwise specified, the following applies to all code: ``` 37. Avoid functions whose behaviour / return type varies with different parameter types. - Multiple return types are fine when appropriate (eg. SDKConfig.get() with a string param which - returns the type according to the param given) but SDKConfig.get() with no args returning the - whole config object is not: this could just be a separate function. + Multiple return types are fine, but the function's fundamental behaviour should not + change according its arguments: have two separate functions. For example,SDKConfig.get() + with a string param which returns the type according to the param given but SDKConfig.get() + with no args returning the whole config object is not: this could just be a separate function. ## React From 9efa04da7a4865842bc14cd94aa56bee6dc53004 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 10 May 2024 11:58:58 +0100 Subject: [PATCH 47/68] Split out oidc callback url into its own method Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/platform/ElectronPlatform.tsx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/vector/platform/ElectronPlatform.tsx b/src/vector/platform/ElectronPlatform.tsx index 0ae1f75863..dddf73ae07 100644 --- a/src/vector/platform/ElectronPlatform.tsx +++ b/src/vector/platform/ElectronPlatform.tsx @@ -57,6 +57,8 @@ interface SquirrelUpdate { updateURL: string; } +const LEGACY_PROTOCOL = "element"; +const OIDC_PROTOCOL = "io.element.desktop"; const SSO_ID_KEY = "element-desktop-ssoid"; const isMac = navigator.platform.toUpperCase().includes("MAC"); @@ -377,12 +379,10 @@ export default class ElectronPlatform extends VectorBasePlatform { return this.ipc.call("getAvailableSpellCheckLanguages"); } - public getSSOCallbackUrl(forOidc = false, fragmentAfterLogin?: string): URL { - const url = super.getSSOCallbackUrl(forOidc, fragmentAfterLogin); - url.protocol = "element"; - if (!forOidc) { - url.searchParams.set(SSO_ID_KEY, this.ssoID); - } + public getSSOCallbackUrl(fragmentAfterLogin?: string): URL { + const url = super.getSSOCallbackUrl(fragmentAfterLogin); + url.protocol = LEGACY_PROTOCOL; + url.searchParams.set(SSO_ID_KEY, this.ssoID); return url; } @@ -448,11 +448,9 @@ export default class ElectronPlatform extends VectorBasePlatform { public async getOidcClientMetadata(): Promise { const baseMetadata = await super.getOidcClientMetadata(); - const redirectUri = this.getSSOCallbackUrl(true); return { ...baseMetadata, applicationType: "native", - redirectUris: [redirectUri.href], // XXX: This should be overridable in config clientUri: "https://element.io", }; @@ -461,4 +459,13 @@ export default class ElectronPlatform extends VectorBasePlatform { public getOidcClientState(): string { return `:${SSO_ID_KEY}:${this.ssoID}`; } + + /** + * The URL to return to after a successful OIDC authentication + */ + public getOidcCallbackUrl(): URL { + const url = super.getOidcCallbackUrl(); + url.protocol = OIDC_PROTOCOL; + return url; + } } From 58e5b3959dd49019aabae9621a9d866b34fb21ab Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 10 May 2024 13:13:59 +0100 Subject: [PATCH 48/68] Allow explicit configuration of OIDC dynamic registration metadata Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- docs/config.md | 40 ++++++++++++++++++++++++ src/vector/platform/ElectronPlatform.tsx | 7 +++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/docs/config.md b/docs/config.md index 95972a4fa8..e64461e5ec 100644 --- a/docs/config.md +++ b/docs/config.md @@ -261,6 +261,46 @@ When Element is deployed alongside a homeserver with SSO-only login, some option ``` It is most common to use the `immediate` flag instead of `on_welcome_page`. +## Native OIDC + +Native OIDC support is currently in labs and is subject to change. + +Static OIDC Client IDs are preferred and can be specified under `oidc_static_clients` as a mapping from `issuer` to configuration object containing `client_id`. +Issuer must have a trailing forward slash. As an example: + +```json +{ + "oidc_static_clients": { + "https://auth.example.com/": { + "client_id": "example-client-id" + } + } +} +``` + +If a matching static client is not found, the app will attempt to dynamically register a client using metadata specified under `oidc_metadata`. +The following subproperties are available: + +1. `client_uri`: This is the base URI for the OIDC client registration, typically `logo_uri`, `tos_uri`, and `policy_uri` must be either on the same domain or a subdomain of this URI. +2. `logo_uri`: Optional URI for the client logo. +3. `tos_uri`: Optional URI for the client's terms of service. +4. `policy_uri`: Optional URI for the client's privacy policy. +5. `contacts`: Optional list of contact emails for the client. + +As an example: + +```json +{ + "oidc_metadata": { + "client_uri": "https://example.com", + "logo_uri": "https://example.com/logo.png", + "tos_uri": "https://example.com/tos", + "policy_uri": "https://example.com/policy", + "contacts": ["support@example.com"] + } +} +``` + ## VoIP / Jitsi calls Currently, Element uses Jitsi to offer conference calls in rooms, with an experimental Element Call implementation in the works. diff --git a/src/vector/platform/ElectronPlatform.tsx b/src/vector/platform/ElectronPlatform.tsx index dddf73ae07..bd43456d0d 100644 --- a/src/vector/platform/ElectronPlatform.tsx +++ b/src/vector/platform/ElectronPlatform.tsx @@ -446,13 +446,16 @@ export default class ElectronPlatform extends VectorBasePlatform { return (SdkConfig.get() as unknown as Record)["web_base_url"] ?? "https://app.element.io"; } + public get defaultOidcClientUri(): string { + // Default to element.io as our scheme `io.element.desktop` is within its scope on default MAS policies + return "https://element.io"; + } + public async getOidcClientMetadata(): Promise { const baseMetadata = await super.getOidcClientMetadata(); return { ...baseMetadata, applicationType: "native", - // XXX: This should be overridable in config - clientUri: "https://element.io", }; } From f2da5fcf2c928565f9815278719551e77557ff58 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 10 May 2024 16:49:05 +0100 Subject: [PATCH 49/68] Fix typos and clarify wording Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- code_style.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code_style.md b/code_style.md index f18de37e0d..cab6d36d08 100644 --- a/code_style.md +++ b/code_style.md @@ -227,9 +227,9 @@ Unless otherwise specified, the following applies to all code: 37. Avoid functions whose behaviour / return type varies with different parameter types. Multiple return types are fine, but the function's fundamental behaviour should not - change according its arguments: have two separate functions. For example,SDKConfig.get() - with a string param which returns the type according to the param given but SDKConfig.get() - with no args returning the whole config object is not: this could just be a separate function. + change according its arguments: have two separate functions. For example, `SDKConfig.get()` + with a string param which returns the type according to the param given is ok, but `SDKConfig.get()` + with no args returning the whole config object would not be: this should just be a separate function. ## React From 5f1f018a30f3b98e75af77a57fba399eee78fa0b Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 10 May 2024 16:52:19 +0100 Subject: [PATCH 50/68] Fundamental behaviour, not return type --- code_style.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code_style.md b/code_style.md index cab6d36d08..e6ad053111 100644 --- a/code_style.md +++ b/code_style.md @@ -225,11 +225,11 @@ Unless otherwise specified, the following applies to all code: } ``` -37. Avoid functions whose behaviour / return type varies with different parameter types. - Multiple return types are fine, but the function's fundamental behaviour should not - change according its arguments: have two separate functions. For example, `SDKConfig.get()` - with a string param which returns the type according to the param given is ok, but `SDKConfig.get()` - with no args returning the whole config object would not be: this should just be a separate function. +37. Avoid functions whose fundamental behaviour varies with different parameter types. + Multiple return types are fine, but if the function's behaviour is going to change significantly, + have two separate functions. For example, `SDKConfig.get()` with a string param which returns the + type according to the param given is ok, but `SDKConfig.get()` with no args returning the whole + config object would not be: this should just be a separate function. ## React From ae77dac66def850b1cdcd3f9e1bbcf37bd17d5b3 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 12 May 2024 15:03:14 +0200 Subject: [PATCH 51/68] Modernize hash --- webpack.config.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 3b827c8d95..1a43eb0ed5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -449,7 +449,7 @@ module.exports = (env, argv) => { loader: "file-loader", type: "javascript/auto", options: { - name: "[name].[hash:7].[ext]", + name: "[name].[fullhash:7].[ext]", outputPath: ".", }, }, @@ -461,7 +461,7 @@ module.exports = (env, argv) => { type: "javascript/auto", options: { // We deliberately override the name so it makes sense in debugging - name: "opus-encoderWorker.min.[hash:7].[ext]", + name: "opus-encoderWorker.min.[fullhash:7].[ext]", outputPath: ".", }, }, @@ -489,7 +489,7 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: "opus-decoderWorker.min.[hash:7].[ext]", + name: "opus-decoderWorker.min.[fullhash:7].[ext]", outputPath: ".", }, }, @@ -514,7 +514,7 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: "wave-encoderWorker.min.[hash:7].[ext]", + name: "wave-encoderWorker.min.[fullhash:7].[ext]", outputPath: ".", }, }, @@ -525,7 +525,7 @@ module.exports = (env, argv) => { type: "javascript/auto", loader: "file-loader", options: { - name: "i18n/[name].[hash:7].[ext]", + name: "i18n/[name].[fullhash:7].[ext]", }, }, { @@ -595,10 +595,10 @@ module.exports = (env, argv) => { loader: "file-loader", options: { esModule: false, - name: "[name].[hash:7].[ext]", + name: "[name].[fullhash:7].[ext]", outputPath: getAssetOutputPath, publicPath: function (url, resourcePath) { - // CSS image usages end up in the `bundles/[hash]` output + // CSS image usages end up in the `bundles/[fullhash]` output // directory, so we adjust the final path to navigate up // twice. const outputPath = getAssetOutputPath(url, resourcePath); @@ -610,7 +610,7 @@ module.exports = (env, argv) => { }, { test: /\.(gif|png|ttf|woff|woff2|xml|ico)$/, - // Use a content-based hash in the name so that we can set a long cache + // Use a content-based fullhash in the name so that we can set a long cache // lifetime for assets while still delivering changes quickly. oneOf: [ { @@ -619,10 +619,10 @@ module.exports = (env, argv) => { loader: "file-loader", options: { esModule: false, - name: "[name].[hash:7].[ext]", + name: "[name].[fullhash:7].[ext]", outputPath: getAssetOutputPath, publicPath: function (url, resourcePath) { - // CSS image usages end up in the `bundles/[hash]` output + // CSS image usages end up in the `bundles/[fullhash]` output // directory, so we adjust the final path to navigate up // twice. const outputPath = getAssetOutputPath(url, resourcePath); @@ -653,8 +653,8 @@ module.exports = (env, argv) => { // This exports our CSS using the splitChunks and loaders above. new MiniCssExtractPlugin({ - filename: useHMR ? "bundles/[name].css" : "bundles/[hash]/[name].css", - chunkFilename: useHMR ? "bundles/[name].css" : "bundles/[hash]/[name].css", + filename: useHMR ? "bundles/[name].css" : "bundles/[fullhash]/[name].css", + chunkFilename: useHMR ? "bundles/[name].css" : "bundles/[fullhash]/[name].css", ignoreOrder: false, // Enable to remove warnings about conflicting order }), @@ -770,9 +770,9 @@ module.exports = (env, argv) => { // directory and symlink it into place - this allows users who loaded // an older version of the application to continue to access webpack // chunks even after the app is redeployed. - filename: "bundles/[hash]/[name].js", - chunkFilename: "bundles/[hash]/[name].js", - webassemblyModuleFilename: "bundles/[hash]/[modulehash].wasm", + filename: "bundles/[fullhash]/[name].js", + chunkFilename: "bundles/[fullhash]/[name].js", + webassemblyModuleFilename: "bundles/[fullhash]/[modulehash].wasm", }, // configuration for the webpack-dev-server From a10f2e12586df08858e32536b491407d0635ecff Mon Sep 17 00:00:00 2001 From: Marcel Date: Mon, 13 May 2024 10:15:24 +0200 Subject: [PATCH 52/68] Revert "Modernize hash in webpack" (#27466) --- webpack.config.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 1a43eb0ed5..3b827c8d95 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -449,7 +449,7 @@ module.exports = (env, argv) => { loader: "file-loader", type: "javascript/auto", options: { - name: "[name].[fullhash:7].[ext]", + name: "[name].[hash:7].[ext]", outputPath: ".", }, }, @@ -461,7 +461,7 @@ module.exports = (env, argv) => { type: "javascript/auto", options: { // We deliberately override the name so it makes sense in debugging - name: "opus-encoderWorker.min.[fullhash:7].[ext]", + name: "opus-encoderWorker.min.[hash:7].[ext]", outputPath: ".", }, }, @@ -489,7 +489,7 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: "opus-decoderWorker.min.[fullhash:7].[ext]", + name: "opus-decoderWorker.min.[hash:7].[ext]", outputPath: ".", }, }, @@ -514,7 +514,7 @@ module.exports = (env, argv) => { type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725 options: { // We deliberately override the name so it makes sense in debugging - name: "wave-encoderWorker.min.[fullhash:7].[ext]", + name: "wave-encoderWorker.min.[hash:7].[ext]", outputPath: ".", }, }, @@ -525,7 +525,7 @@ module.exports = (env, argv) => { type: "javascript/auto", loader: "file-loader", options: { - name: "i18n/[name].[fullhash:7].[ext]", + name: "i18n/[name].[hash:7].[ext]", }, }, { @@ -595,10 +595,10 @@ module.exports = (env, argv) => { loader: "file-loader", options: { esModule: false, - name: "[name].[fullhash:7].[ext]", + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, publicPath: function (url, resourcePath) { - // CSS image usages end up in the `bundles/[fullhash]` output + // CSS image usages end up in the `bundles/[hash]` output // directory, so we adjust the final path to navigate up // twice. const outputPath = getAssetOutputPath(url, resourcePath); @@ -610,7 +610,7 @@ module.exports = (env, argv) => { }, { test: /\.(gif|png|ttf|woff|woff2|xml|ico)$/, - // Use a content-based fullhash in the name so that we can set a long cache + // Use a content-based hash in the name so that we can set a long cache // lifetime for assets while still delivering changes quickly. oneOf: [ { @@ -619,10 +619,10 @@ module.exports = (env, argv) => { loader: "file-loader", options: { esModule: false, - name: "[name].[fullhash:7].[ext]", + name: "[name].[hash:7].[ext]", outputPath: getAssetOutputPath, publicPath: function (url, resourcePath) { - // CSS image usages end up in the `bundles/[fullhash]` output + // CSS image usages end up in the `bundles/[hash]` output // directory, so we adjust the final path to navigate up // twice. const outputPath = getAssetOutputPath(url, resourcePath); @@ -653,8 +653,8 @@ module.exports = (env, argv) => { // This exports our CSS using the splitChunks and loaders above. new MiniCssExtractPlugin({ - filename: useHMR ? "bundles/[name].css" : "bundles/[fullhash]/[name].css", - chunkFilename: useHMR ? "bundles/[name].css" : "bundles/[fullhash]/[name].css", + filename: useHMR ? "bundles/[name].css" : "bundles/[hash]/[name].css", + chunkFilename: useHMR ? "bundles/[name].css" : "bundles/[hash]/[name].css", ignoreOrder: false, // Enable to remove warnings about conflicting order }), @@ -770,9 +770,9 @@ module.exports = (env, argv) => { // directory and symlink it into place - this allows users who loaded // an older version of the application to continue to access webpack // chunks even after the app is redeployed. - filename: "bundles/[fullhash]/[name].js", - chunkFilename: "bundles/[fullhash]/[name].js", - webassemblyModuleFilename: "bundles/[fullhash]/[modulehash].wasm", + filename: "bundles/[hash]/[name].js", + chunkFilename: "bundles/[hash]/[name].js", + webassemblyModuleFilename: "bundles/[hash]/[modulehash].wasm", }, // configuration for the webpack-dev-server From 6a6a362a8d4c8f5b5bd53230fa068af1c523d428 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 13 May 2024 11:19:55 +0100 Subject: [PATCH 53/68] Update end-to-end-tests.yaml --- .github/workflows/end-to-end-tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 5b09d70c14..782efb43b5 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -22,6 +22,7 @@ jobs: issues: read pull-requests: read with: + element-web-sha: ${{ github.sha }} react-sdk-repository: matrix-org/matrix-react-sdk # We only want to run the playwright tests on merge queue to prevent regressions # from creeping in. They take a long time to run and consume multiple concurrent runners. From 64f0bb546033fb9fa19b8bd1a4a2505cc8244596 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 13 May 2024 13:05:50 +0100 Subject: [PATCH 54/68] Inline consts Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/vector/platform/ElectronPlatform.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vector/platform/ElectronPlatform.tsx b/src/vector/platform/ElectronPlatform.tsx index dddf73ae07..29c331cc73 100644 --- a/src/vector/platform/ElectronPlatform.tsx +++ b/src/vector/platform/ElectronPlatform.tsx @@ -57,8 +57,6 @@ interface SquirrelUpdate { updateURL: string; } -const LEGACY_PROTOCOL = "element"; -const OIDC_PROTOCOL = "io.element.desktop"; const SSO_ID_KEY = "element-desktop-ssoid"; const isMac = navigator.platform.toUpperCase().includes("MAC"); @@ -381,7 +379,7 @@ export default class ElectronPlatform extends VectorBasePlatform { public getSSOCallbackUrl(fragmentAfterLogin?: string): URL { const url = super.getSSOCallbackUrl(fragmentAfterLogin); - url.protocol = LEGACY_PROTOCOL; + url.protocol = "element"; url.searchParams.set(SSO_ID_KEY, this.ssoID); return url; } @@ -465,7 +463,7 @@ export default class ElectronPlatform extends VectorBasePlatform { */ public getOidcCallbackUrl(): URL { const url = super.getOidcCallbackUrl(); - url.protocol = OIDC_PROTOCOL; + url.protocol = "io.element.desktop"; return url; } } From 7a3bc83a554347f83d8b53064c0461181c264e41 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 14 May 2024 10:32:55 +0100 Subject: [PATCH 55/68] Add comment Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- docs/config.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/config.md b/docs/config.md index e64461e5ec..1f6bbabd20 100644 --- a/docs/config.md +++ b/docs/config.md @@ -279,6 +279,7 @@ Issuer must have a trailing forward slash. As an example: ``` If a matching static client is not found, the app will attempt to dynamically register a client using metadata specified under `oidc_metadata`. +The app has sane defaults for the metadata properties below but on stricter policy identity providers they may not pass muster, e.g. `contacts` may be required. The following subproperties are available: 1. `client_uri`: This is the base URI for the OIDC client registration, typically `logo_uri`, `tos_uri`, and `policy_uri` must be either on the same domain or a subdomain of this URI. From 095c613b6980a5d425d48e7ddabfb6204e17f57e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 14 May 2024 17:42:11 +0200 Subject: [PATCH 56/68] Fix deployment of file `res/.well-known/assetlinks.json` --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 6e0ee9f6c3..03506242ad 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -736,7 +736,7 @@ module.exports = (env, argv) => { new CopyWebpackPlugin({ patterns: [ "res/apple-app-site-association", - "res/.well-known/assetlinks.json", + { from: ".well-known/**", context: path.resolve(__dirname, "res") }, "res/jitsi_external_api.min.js", "res/jitsi_external_api.min.js.LICENSE.txt", "res/manifest.json", From bcd5c838e81fb96fef1dabaac9eb330d1f761b28 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 14 May 2024 13:17:38 -0600 Subject: [PATCH 57/68] Typescriptify & use service worker for MSC3916 authentication (#27326) * Typescriptify & use service worker for MSC3916 authentication * appease the linter * appease jest * appease linter * Get the access token directly * Add a bit of jitter * Improve legibility, use factored-out functions for pickling * Add docs * Appease the linter * Document risks of postMessage * Split service worker post message handling out to function * Move registration to async function * Use more early returns * Thanks(?), WebStorm * Handle case of no access token for /versions * Appease linter * Apply suggestions from code review Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * Remove spurious try/catch * Factor out fetch config stuff * Apply suggestions from code review Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> * Finish applying code review suggestions --------- Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- res/sw.js | 1 - src/serviceworker/index.ts | 186 +++++++++++++++++++++++++++++ src/vector/platform/WebPlatform.ts | 40 ++++++- webpack.config.js | 7 +- 4 files changed, 227 insertions(+), 7 deletions(-) delete mode 100644 res/sw.js create mode 100644 src/serviceworker/index.ts diff --git a/res/sw.js b/res/sw.js deleted file mode 100644 index 1fdf7324e1..0000000000 --- a/res/sw.js +++ /dev/null @@ -1 +0,0 @@ -self.addEventListener("fetch", () => {}); diff --git a/src/serviceworker/index.ts b/src/serviceworker/index.ts new file mode 100644 index 0000000000..b06921892f --- /dev/null +++ b/src/serviceworker/index.ts @@ -0,0 +1,186 @@ +/* +Copyright 2024 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { idbLoad } from "matrix-react-sdk/src/utils/StorageAccess"; +import { ACCESS_TOKEN_IV, tryDecryptToken } from "matrix-react-sdk/src/utils/tokens/tokens"; +import { buildAndEncodePickleKey } from "matrix-react-sdk/src/utils/tokens/pickling"; + +const serverSupportMap: { + [serverUrl: string]: { + supportsMSC3916: boolean; + cacheExpiryTimeMs: number; + }; +} = {}; + +self.addEventListener("install", (event) => { + // We skipWaiting() to update the service worker more frequently, particularly in development environments. + // @ts-expect-error - service worker types are not available. See 'fetch' event handler. + event.waitUntil(skipWaiting()); +}); + +self.addEventListener("activate", (event) => { + // We force all clients to be under our control, immediately. This could be old tabs. + // @ts-expect-error - service worker types are not available. See 'fetch' event handler. + event.waitUntil(clients.claim()); +}); + +// @ts-expect-error - the service worker types conflict with the DOM types available through TypeScript. Many hours +// have been spent trying to convince the type system that there's no actual conflict, but it has yet to work. Instead +// of trying to make it do the thing, we force-cast to something close enough where we can (and ignore errors otherwise). +self.addEventListener("fetch", (event: FetchEvent) => { + // This is the authenticated media (MSC3916) check, proxying what was unauthenticated to the authenticated variants. + + if (event.request.method !== "GET") { + return; // not important to us + } + + // Note: ideally we'd keep the request headers etc, but in practice we can't even see those details. + // See https://stackoverflow.com/a/59152482 + let url = event.request.url; + + // We only intercept v3 download and thumbnail requests as presumably everything else is deliberate. + // For example, `/_matrix/media/unstable` or `/_matrix/media/v3/preview_url` are something well within + // the control of the application, and appear to be choices made at a higher level than us. + if (!url.includes("/_matrix/media/v3/download") && !url.includes("/_matrix/media/v3/thumbnail")) { + return; // not a URL we care about + } + + // We need to call respondWith synchronously, otherwise we may never execute properly. This means + // later on we need to proxy the request through if it turns out the server doesn't support authentication. + event.respondWith( + (async (): Promise => { + let accessToken: string | undefined; + try { + // Figure out which homeserver we're communicating with + const csApi = url.substring(0, url.indexOf("/_matrix/media/v3")); + + // Add jitter to reduce request spam, particularly to `/versions` on initial page load + await new Promise((resolve) => setTimeout(() => resolve(), Math.random() * 10)); + + // Locate our access token, and populate the fetchConfig with the authentication header. + // @ts-expect-error - service worker types are not available. See 'fetch' event handler. + const client = await self.clients.get(event.clientId); + accessToken = await getAccessToken(client); + + // Update or populate the server support map using a (usually) authenticated `/versions` call. + await tryUpdateServerSupportMap(csApi, accessToken); + + // If we have server support (and a means of authentication), rewrite the URL to use MSC3916 endpoints. + if (serverSupportMap[csApi].supportsMSC3916 && accessToken) { + // Currently unstable only. + // TODO: Support stable endpoints when available. + url = url.replace(/\/media\/v3\/(.*)\//, "/client/unstable/org.matrix.msc3916/media/$1/"); + } // else by default we make no changes + } catch (err) { + console.error("SW: Error in request rewrite.", err); + } + + // Add authentication and send the request. We add authentication even if MSC3916 endpoints aren't + // being used to ensure patches like this work: + // https://github.com/matrix-org/synapse/commit/2390b66bf0ec3ff5ffb0c7333f3c9b239eeb92bb + return fetch(url, fetchConfigForToken(accessToken)); + })(), + ); +}); + +async function tryUpdateServerSupportMap(clientApiUrl: string, accessToken?: string): Promise { + // only update if we don't know about it, or if the data is stale + if (serverSupportMap[clientApiUrl]?.cacheExpiryTimeMs > new Date().getTime()) { + return; // up to date + } + + const config = fetchConfigForToken(accessToken); + const versions = await (await fetch(`${clientApiUrl}/_matrix/client/versions`, config)).json(); + + serverSupportMap[clientApiUrl] = { + supportsMSC3916: Boolean(versions?.unstable_features?.["org.matrix.msc3916"]), + cacheExpiryTimeMs: new Date().getTime() + 2 * 60 * 60 * 1000, // 2 hours from now + }; +} + +// Ideally we'd use the `Client` interface for `client`, but since it's not available (see 'fetch' listener), we use +// unknown for now and force-cast it to something close enough later. +async function getAccessToken(client: unknown): Promise { + // Access tokens are encrypted at rest, so while we can grab the "access token", we'll need to do work to get the + // real thing. + const encryptedAccessToken = await idbLoad("account", "mx_access_token"); + + // We need to extract a user ID and device ID from localstorage, which means calling WebPlatform for the + // read operation. Service workers can't access localstorage. + const { userId, deviceId } = await askClientForUserIdParams(client); + + // ... and this is why we need the user ID and device ID: they're index keys for the pickle key table. + const pickleKeyData = await idbLoad("pickleKey", [userId, deviceId]); + if (pickleKeyData && (!pickleKeyData.encrypted || !pickleKeyData.iv || !pickleKeyData.cryptoKey)) { + console.error("SW: Invalid pickle key loaded - ignoring"); + return undefined; + } + + // Finally, try decrypting the thing and return that. This may fail, but that's okay. + try { + const pickleKey = await buildAndEncodePickleKey(pickleKeyData, userId, deviceId); + return tryDecryptToken(pickleKey, encryptedAccessToken, ACCESS_TOKEN_IV); + } catch (e) { + console.error("SW: Error decrypting access token.", e); + return undefined; + } +} + +// Ideally we'd use the `Client` interface for `client`, but since it's not available (see 'fetch' listener), we use +// unknown for now and force-cast it to something close enough inside the function. +async function askClientForUserIdParams(client: unknown): Promise<{ userId: string; deviceId: string }> { + return new Promise((resolve, reject) => { + // Dev note: this uses postMessage, which is a highly insecure channel. postMessage is typically visible to other + // tabs, windows, browser extensions, etc, making it far from ideal for sharing sensitive information. This is + // why our service worker calculates/decrypts the access token manually: we don't want the user's access token + // to be available to (potentially) malicious listeners. We do require some information for that decryption to + // work though, and request that in the least sensitive way possible. + // + // We could also potentially use some version of TLS to encrypt postMessage, though that feels way more involved + // than just reading IndexedDB ourselves. + + // Avoid stalling the tab in case something goes wrong. + const timeoutId = setTimeout(() => reject(new Error("timeout in postMessage")), 1000); + + // We don't need particularly good randomness here - we just use this to generate a request ID, so we know + // which postMessage reply is for our active request. + const responseKey = Math.random().toString(36); + + // Add the listener first, just in case the tab is *really* fast. + const listener = (event: MessageEvent): void => { + if (event.data?.responseKey !== responseKey) return; // not for us + clearTimeout(timeoutId); // do this as soon as possible, avoiding a race between resolve and reject. + resolve(event.data); // "unblock" the remainder of the thread, if that were such a thing in JavaScript. + self.removeEventListener("message", listener); // cleanup, since we're not going to do anything else. + }; + self.addEventListener("message", listener); + + // Ask the tab for the information we need. This is handled by WebPlatform. + (client as Window).postMessage({ responseKey, type: "userinfo" }); + }); +} + +function fetchConfigForToken(accessToken?: string): RequestInit | undefined { + if (!accessToken) { + return undefined; // no headers/config to specify + } + + return { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }; +} diff --git a/src/vector/platform/WebPlatform.ts b/src/vector/platform/WebPlatform.ts index 39446158fd..da6f61b323 100644 --- a/src/vector/platform/WebPlatform.ts +++ b/src/vector/platform/WebPlatform.ts @@ -1,7 +1,7 @@ /* Copyright 2016 Aviral Dasgupta Copyright 2016 OpenMarket Ltd -Copyright 2017-2020 New Vector Ltd +Copyright 2017-2020, 2024 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -44,9 +44,41 @@ export default class WebPlatform extends VectorBasePlatform { public constructor() { super(); - // Register service worker if available on this platform - if ("serviceWorker" in navigator) { - navigator.serviceWorker.register("sw.js"); + + // Register the service worker in the background + this.tryRegisterServiceWorker().catch((e) => console.error("Error registering/updating service worker:", e)); + } + + private async tryRegisterServiceWorker(): Promise { + if (!("serviceWorker" in navigator)) { + return; // not available on this platform - don't try to register the service worker + } + + // sw.js is exported by webpack, sourced from `/src/serviceworker/index.ts` + const registration = await navigator.serviceWorker.register("sw.js"); + if (!registration) { + // Registration didn't work for some reason - assume failed and ignore. + // This typically happens in Jest. + return; + } + + await registration.update(); + navigator.serviceWorker.addEventListener("message", this.onServiceWorkerPostMessage.bind(this)); + } + + private onServiceWorkerPostMessage(event: MessageEvent): void { + try { + if (event.data?.["type"] === "userinfo" && event.data?.["responseKey"]) { + const userId = localStorage.getItem("mx_user_id"); + const deviceId = localStorage.getItem("mx_device_id"); + event.source!.postMessage({ + responseKey: event.data["responseKey"], + userId, + deviceId, + }); + } + } catch (e) { + console.error("Error responding to service worker: ", e); } } diff --git a/webpack.config.js b/webpack.config.js index 03506242ad..1b8f385f94 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -153,6 +153,10 @@ module.exports = (env, argv) => { mobileguide: "./src/vector/mobile_guide/index.ts", jitsi: "./src/vector/jitsi/index.ts", usercontent: "./node_modules/matrix-react-sdk/src/usercontent/index.ts", + serviceworker: { + import: "./src/serviceworker/index.ts", + filename: "sw.js", // update WebPlatform if this changes + }, ...(useHMR ? {} : cssThemes), }, @@ -666,7 +670,7 @@ module.exports = (env, argv) => { // HtmlWebpackPlugin will screw up our formatting like the names // of the themes and which chunks we actually care about. inject: false, - excludeChunks: ["mobileguide", "usercontent", "jitsi"], + excludeChunks: ["mobileguide", "usercontent", "jitsi", "serviceworker"], minify: false, templateParameters: { og_image_url: ogImageUrl, @@ -740,7 +744,6 @@ module.exports = (env, argv) => { "res/jitsi_external_api.min.js", "res/jitsi_external_api.min.js.LICENSE.txt", "res/manifest.json", - "res/sw.js", "res/welcome.html", { from: "welcome/**", context: path.resolve(__dirname, "res") }, { from: "themes/**", context: path.resolve(__dirname, "res") }, From a61de47bb6e65300b1151f5cfb2cc7316a77b738 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 15 May 2024 09:06:14 +0000 Subject: [PATCH 58/68] Upgrade dependency to matrix-js-sdk@32.3.0-rc.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f2ad032451..bef591342b 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "32.3.0-rc.0", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..1d21ba4420 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8337,6 +8337,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@32.3.0-rc.0: + version "32.3.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" + integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.2.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/2a716bd076459f48fed967f3eb4158ebdc1f3600" From 6db392025c3259dfe76e1b52f85c5f207a0d9f75 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 15 May 2024 09:14:52 +0000 Subject: [PATCH 59/68] Upgrade dependency to matrix-react-sdk@3.100.0-rc.0 --- package.json | 2 +- yarn.lock | 38 ++++++++++---------------------------- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index bef591342b..051b669231 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.3.0-rc.0", - "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", + "matrix-react-sdk": "3.100.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 1d21ba4420..e783f8a91b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3544,10 +3544,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.1.2.tgz#d8f9ba523700660942722a800c64406216bbbfea" - integrity sha512-u/jj8HF8qpX1NU+sh6f/S1B7HUMGcoAGYLH0wc5lVbf6x6elBsYKD0LSa+/8NDPuQqVWMztu76chUsM5slC49w== +"@vector-im/compound-web@^4.2.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.3.0.tgz#7725dec55f738aa0ccaf3c790b57b36955b90d6a" + integrity sha512-AH8TdmkteR5VL4HgHq+p3H1NngOUJhkhiHr+hb9H0dB35vWNPhs5R3edyzFZhWMWWsJ2E8jhiXf/NqdGh/k4jg== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -8357,25 +8357,6 @@ matrix-js-sdk@32.3.0-rc.0: unhomoglyph "^1.0.6" uuid "9" -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "32.2.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/2a716bd076459f48fed967f3eb4158ebdc1f3600" - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8383,9 +8364,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": - version "3.99.0" - resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/d1eab0aa7ed0adfeb16160e3983ca38aa4a6fcfd" +matrix-react-sdk@3.100.0-rc.0: + version "3.100.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0-rc.0.tgz#d787fa529e959b030409e37ee2be47906639534f" + integrity sha512-I2BLZTYAep39wtkuY5VV7dvfiD/RWYQM2RMrcv9sPVIbeEaZDcVbzX74qvUw7WmEOziAgeBd9nDCz57dTfP/vA== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.20.0" @@ -8397,7 +8379,7 @@ matrix-mock-request@^2.5.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.1.2" + "@vector-im/compound-web" "^4.2.0" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -8429,7 +8411,7 @@ matrix-mock-request@^2.5.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" + matrix-js-sdk "32.3.0-rc.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From 74172969c1dc288434ecf89c5a4bccc83f902bfe Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 15 May 2024 09:21:54 +0000 Subject: [PATCH 60/68] v1.11.67-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 051b669231..9b17d1c796 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.66", + "version": "1.11.67-rc.0", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From ed2440f8cfa49b2ba2fde0d279e219712fef04ad Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 15 May 2024 13:56:02 +0000 Subject: [PATCH 61/68] v1.11.67-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9b17d1c796..9d82873758 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.67-rc.0", + "version": "1.11.67-rc.1", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From eced524029563bf567f647029f86c8fe49e919e3 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 21 May 2024 12:27:33 +0000 Subject: [PATCH 62/68] Upgrade dependency to matrix-js-sdk@32.3.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9d82873758..3a8bf854b8 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.3.0-rc.0", + "matrix-js-sdk": "32.3.0", "matrix-react-sdk": "3.100.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index e783f8a91b..fe2a8ed86d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8337,6 +8337,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@32.3.0: + version "32.3.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0.tgz#af4c279de3c684ec03950d21d410a3ccef62cfee" + integrity sha512-C9QvKBf0ZvoNbwhMQT8XgvF5O1+SMA9yJwdYQb95xUv/5ziFme0DSoqGm1AYtZtI6WmMOi112v1PuV75sowqWw== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-js-sdk@32.3.0-rc.0: version "32.3.0-rc.0" resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" From 89622749e2615dec0945245034ea208a849cc526 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 22 May 2024 12:05:55 +0000 Subject: [PATCH 63/68] Upgrade dependency to matrix-js-sdk@32.4.0 --- package.json | 2 +- yarn.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 3a8bf854b8..cb2fcd466c 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.3.0", + "matrix-js-sdk": "32.4.0", "matrix-react-sdk": "3.100.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index fe2a8ed86d..9d00a34d24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8337,10 +8337,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.3.0: - version "32.3.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0.tgz#af4c279de3c684ec03950d21d410a3ccef62cfee" - integrity sha512-C9QvKBf0ZvoNbwhMQT8XgvF5O1+SMA9yJwdYQb95xUv/5ziFme0DSoqGm1AYtZtI6WmMOi112v1PuV75sowqWw== +matrix-js-sdk@32.3.0-rc.0: + version "32.3.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" + integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" @@ -8357,10 +8357,10 @@ matrix-js-sdk@32.3.0: unhomoglyph "^1.0.6" uuid "9" -matrix-js-sdk@32.3.0-rc.0: - version "32.3.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" - integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== +matrix-js-sdk@32.4.0: + version "32.4.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.4.0.tgz#2a308e158a8dc2ccdfc14ae6c655c4059ea27bbd" + integrity sha512-mzWfF4rJaTFLDfkedqP2jh/i1v5pv6xRHPkAQLn1ytXi72TFKLlKQmjaNUXfQYkmriIYnGYYQwBXQeJgwaT8SQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" From 5e02a42ca0863a6d991f989a5b29d07b401766d4 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 22 May 2024 12:18:40 +0000 Subject: [PATCH 64/68] v1.11.67 --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79c187a844..321acf18ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ +Changes in [1.11.67](https://github.com/element-hq/element-web/releases/tag/v1.11.67) (2024-05-22) +================================================================================================== +## ✨ Features + +* Tooltip: Improve the accessibility of the composer and the rich text editor ([#12459](https://github.com/matrix-org/matrix-react-sdk/pull/12459)). Contributed by @florianduros. +* Allow explicit configuration of OIDC dynamic registration metadata ([#12514](https://github.com/matrix-org/matrix-react-sdk/pull/12514)). Contributed by @t3chguy. +* Tooltip: improve accessibility for messages ([#12487](https://github.com/matrix-org/matrix-react-sdk/pull/12487)). Contributed by @florianduros. +* Collapse UserSettings tabs to just icons on narrow screens ([#12505](https://github.com/matrix-org/matrix-react-sdk/pull/12505)). Contributed by @dbkr. +* Add room topic to right panel room info ([#12503](https://github.com/matrix-org/matrix-react-sdk/pull/12503)). Contributed by @t3chguy. +* OIDC: pass `id_token` via `id_token_hint` on Manage Account interaction ([#12499](https://github.com/matrix-org/matrix-react-sdk/pull/12499)). Contributed by @t3chguy. +* Tooltip: improve accessibility in room ([#12493](https://github.com/matrix-org/matrix-react-sdk/pull/12493)). Contributed by @florianduros. +* Tooltip: improve accessibility for call and voice messages ([#12489](https://github.com/matrix-org/matrix-react-sdk/pull/12489)). Contributed by @florianduros. +* Move the active tab in user settings to the dialog title ([#12481](https://github.com/matrix-org/matrix-react-sdk/pull/12481)). Contributed by @dbkr. +* Tooltip: improve accessibility of spaces ([#12497](https://github.com/matrix-org/matrix-react-sdk/pull/12497)). Contributed by @florianduros. +* Tooltip: improve accessibility of the right panel ([#12490](https://github.com/matrix-org/matrix-react-sdk/pull/12490)). Contributed by @florianduros. +* MSC3575 (Sliding Sync) add well-known proxy support ([#12307](https://github.com/matrix-org/matrix-react-sdk/pull/12307)). Contributed by @EdGeraghty. + +## 🐛 Bug Fixes + +* Reuse single PlaybackWorker between Playback instances ([#12520](https://github.com/matrix-org/matrix-react-sdk/pull/12520)). Contributed by @t3chguy. +* Fix well-known lookup for sliding sync labs check ([#12519](https://github.com/matrix-org/matrix-react-sdk/pull/12519)). Contributed by @t3chguy. +* Fix `element-desktop-ssoid being` included in OIDC Authorization call ([#12495](https://github.com/matrix-org/matrix-react-sdk/pull/12495)). Contributed by @t3chguy. +* Fix beta notifications reconciliation for intentional mentions push rules ([#12510](https://github.com/matrix-org/matrix-react-sdk/pull/12510)). Contributed by @t3chguy. +* fix avatar stretched on 1:1 call ([#12494](https://github.com/matrix-org/matrix-react-sdk/pull/12494)). Contributed by @I-lander. +* Check native sliding sync support against an unstable feature flag ([#12498](https://github.com/matrix-org/matrix-react-sdk/pull/12498)). Contributed by @turt2live. +* Use OPTIONS for sliding sync detection poke ([#12492](https://github.com/matrix-org/matrix-react-sdk/pull/12492)). Contributed by @turt2live. +* TAC: hide tooltip when the release announcement is displayed ([#12472](https://github.com/matrix-org/matrix-react-sdk/pull/12472)). Contributed by @florianduros. + + + Changes in [1.11.66](https://github.com/element-hq/element-web/releases/tag/v1.11.66) (2024-05-07) ================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index cb2fcd466c..e68deb9da7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.67-rc.1", + "version": "1.11.67", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From a7f0e43d96be120fd5136f872d8b0d3fd041ebfc Mon Sep 17 00:00:00 2001 From: "marc.sirisak" Date: Tue, 28 May 2024 17:09:32 +0200 Subject: [PATCH 65/68] chore(merge-conflict): package.json and yarn lock --- package.json | 13 +- yarn.lock | 511 +++++++++++++++++++++++++-------------------------- 2 files changed, 254 insertions(+), 270 deletions(-) diff --git a/package.json b/package.json index 7b7d977d1c..02c042616b 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,8 @@ { "name": "element-web", -<<<<<<< HEAD "productName": "Tchap", "version": "4.5.4", - "version-element-web": "1.11.65", -======= - "version": "1.11.67", ->>>>>>> v1.11.67 + "version-element-web": "1.11.67", "description": "A feature-rich client for Matrix.org", "author": "DINUM", "repository": { @@ -95,13 +91,8 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", -<<<<<<< HEAD - "matrix-js-sdk": "32.1.0", - "matrix-react-sdk": "file:./linked-dependencies/matrix-react-sdk", -======= "matrix-js-sdk": "32.4.0", - "matrix-react-sdk": "3.100.0-rc.0", ->>>>>>> v1.11.67 + "matrix-react-sdk": "file:./linked-dependencies/matrix-react-sdk", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index c2a35ac60c..389d7ada15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -53,11 +53,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -<<<<<<< HEAD -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": -======= "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": ->>>>>>> v1.11.67 version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -65,21 +61,25 @@ "@babel/highlight" "^7.24.2" picocolors "^1.0.0" +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== + dependencies: + "@babel/highlight" "^7.24.6" + picocolors "^1.0.0" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -<<<<<<< HEAD -"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.9": -======= -"@babel/compat-data@^7.22.9": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" + integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== "@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.21.3": ->>>>>>> v1.11.67 version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== @@ -100,6 +100,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.23.9": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" + integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helpers" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/traverse" "^7.24.6" + "@babel/types" "^7.24.6" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/eslint-parser@^7.12.10": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" @@ -121,20 +142,17 @@ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: -<<<<<<< HEAD -======= - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/generator@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" + integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== dependencies: ->>>>>>> v1.11.67 - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -164,9 +182,17 @@ lru-cache "^5.1.1" semver "^6.3.1" -<<<<<<< HEAD -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": -======= +"@babel/helper-compilation-targets@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" + integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== + dependencies: + "@babel/compat-data" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" @@ -183,7 +209,6 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": ->>>>>>> v1.11.67 version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== @@ -223,6 +248,19 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.22.5", "@babel/helper-environment-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" + integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== + +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" + integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -238,19 +276,19 @@ dependencies: "@babel/types" "^7.22.5" -<<<<<<< HEAD -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== -======= +"@babel/helper-hoist-variables@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" + integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== ->>>>>>> v1.11.67 dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.23.0" "@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": version "7.24.5" @@ -259,6 +297,13 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-member-expression-to-functions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz#86084f3e0e4e2169a134754df3870bc7784db71e" + integrity sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" @@ -266,6 +311,13 @@ dependencies: "@babel/types" "^7.24.0" +"@babel/helper-module-imports@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" + integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" @@ -277,6 +329,17 @@ "@babel/helper-split-export-declaration" "^7.24.5" "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-module-transforms@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" + integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -284,12 +347,13 @@ dependencies: "@babel/types" "^7.22.5" -<<<<<<< HEAD -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== -======= +"@babel/helper-optimise-call-expression@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz#f7836e3ccca3dfa02f15d2bc8b794efe75a5256e" + integrity sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" @@ -299,7 +363,6 @@ version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== ->>>>>>> v1.11.67 "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" @@ -310,6 +373,15 @@ "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" +"@babel/helper-replace-supers@^7.22.9": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz#3ea87405a2986a49ab052d10e540fe036d747c71" + integrity sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-member-expression-to-functions" "^7.24.6" + "@babel/helper-optimise-call-expression" "^7.24.6" + "@babel/helper-replace-supers@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" @@ -326,6 +398,13 @@ dependencies: "@babel/types" "^7.24.5" +"@babel/helper-simple-access@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" + integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -333,41 +412,55 @@ dependencies: "@babel/types" "^7.22.5" -<<<<<<< HEAD -"@babel/helper-split-export-declaration@^7.24.5": -======= "@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": ->>>>>>> v1.11.67 version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: "@babel/types" "^7.24.5" -<<<<<<< HEAD -"@babel/helper-string-parser@^7.24.1": -======= +"@babel/helper-split-export-declaration@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" + integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== + dependencies: + "@babel/types" "^7.24.6" + "@babel/helper-string-parser@^7.22.5": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-string-parser@^7.23.4", "@babel/helper-string-parser@^7.24.1": ->>>>>>> v1.11.67 version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" + integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== + "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== +"@babel/helper-validator-identifier@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" + integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== + "@babel/helper-wrap-function@^7.22.20": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" @@ -386,42 +479,30 @@ "@babel/traverse" "^7.24.5" "@babel/types" "^7.24.5" +"@babel/helpers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" + integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/highlight@^7.24.2": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== dependencies: -<<<<<<< HEAD "@babel/helper-validator-identifier" "^7.24.5" -======= - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/highlight@^7.23.4": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" ->>>>>>> v1.11.67 chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -<<<<<<< HEAD -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== - -======= -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== +"@babel/highlight@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== dependencies: - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.6" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" @@ -431,7 +512,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.18.5", "@babel/parser@^7.22.15": +"@babel/parser@^7.18.5": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== @@ -446,7 +527,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== ->>>>>>> v1.11.67 +"@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" @@ -977,16 +1062,6 @@ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: -<<<<<<< HEAD -======= - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== - dependencies: ->>>>>>> v1.11.67 "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-private-methods@^7.24.1": @@ -1293,22 +1368,21 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -<<<<<<< HEAD -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": -======= "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": ->>>>>>> v1.11.67 version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" -<<<<<<< HEAD -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": -======= +"@babel/runtime@^7.14.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15", "@babel/template@^7.24.0": ->>>>>>> v1.11.67 version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== @@ -1317,6 +1391,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.24.6", "@babel/template@^7.3.3": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" + integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + "@babel/traverse@^7.18.5", "@babel/traverse@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" @@ -1333,28 +1416,19 @@ debug "^4.3.1" globals "^11.1.0" -<<<<<<< HEAD -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== - dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" -======= -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/traverse@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" + integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" debug "^4.3.1" globals "^11.1.0" @@ -1367,14 +1441,13 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.21.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": +"@babel/types@^7.21.3", "@babel/types@^7.23.4": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" ->>>>>>> v1.11.67 to-fast-properties "^2.0.0" "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": @@ -1386,6 +1459,15 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@babel/types@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" + integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== + dependencies: + "@babel/helper-string-parser" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1691,16 +1773,12 @@ resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz#598a25630fd9ab0edf066d235916f7441404942a" integrity sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg== -<<<<<<< HEAD "@csstools/selector-resolve-nested@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz#d872f2da402d3ce8bd0cf16ea5f9fba76b18e430" integrity sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg== "@csstools/selector-specificity@^3.0.3": -======= -"@csstools/selector-specificity@^3.0.2", "@csstools/selector-specificity@^3.0.3": ->>>>>>> v1.11.67 version "3.0.3" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz#208a3929ee614967a1fc8cd6cb758d9fcbf0caae" integrity sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q== @@ -1759,11 +1837,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -<<<<<<< HEAD "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": -======= -"@eslint-community/regexpp@^4.10.0": ->>>>>>> v1.11.67 version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -2214,17 +2288,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -<<<<<<< HEAD "@matrix-org/analytics-events@^0.19.0": version "0.19.1" resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.19.1.tgz#304d48b7b8e51117dfd9c1cf46a65e8bee9f46cb" integrity sha512-bYWJIkOzl4Jt02fg1+XoQv5xZ3mP6qBzNmytt1UVfKLaGgLBSvlk9gXx2/3GhSuPBq99/CljEX/zABJ//mexAw== -======= -"@matrix-org/analytics-events@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.20.0.tgz#062a532ddcf0e2e5eb64c5576cd212cb32a11ccf" - integrity sha512-YCRbZrpZU9q+nrB6RsfPZ4NlKs31ySjP2F7GFUZNPKv96GcbihrnMK086td480SJOYpjPv2vttDJC+S67SFe2w== ->>>>>>> v1.11.67 "@matrix-org/emojibase-bindings@^1.1.2": version "1.1.3" @@ -2903,7 +2970,6 @@ "@sentry/types" "7.112.2" "@sentry/utils" "7.112.2" -<<<<<<< HEAD "@sentry-internal/replay-canvas@7.112.2": version "7.112.2" resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.112.2.tgz#a29719ffb816dec01661b81def09d24704476d86" @@ -2923,8 +2989,6 @@ "@sentry/types" "7.112.2" "@sentry/utils" "7.112.2" -======= ->>>>>>> v1.11.67 "@sentry/babel-plugin-component-annotate@2.16.1": version "2.16.1" resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.1.tgz#da3bf4ec1c1dc68a97d6a7e27bd710001d6b07fb" @@ -3708,17 +3772,10 @@ dependencies: htmlparser2 "^8.0.0" -<<<<<<< HEAD -"@types/scheduler@*": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09" - integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw== -======= "@types/scheduler@^0.16": version "0.16.8" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== ->>>>>>> v1.11.67 "@types/sdp-transform@^2.4.9": version "2.4.9" @@ -3822,7 +3879,6 @@ dependencies: "@types/yargs-parser" "*" -<<<<<<< HEAD "@types/yauzl@^2.9.1": version "2.10.3" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" @@ -3835,13 +3891,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== dependencies: -======= -"@typescript-eslint/eslint-plugin@^7.0.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" - integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== - dependencies: ->>>>>>> v1.11.67 "@eslint-community/regexpp" "^4.10.0" "@typescript-eslint/scope-manager" "7.8.0" "@typescript-eslint/type-utils" "7.8.0" @@ -3935,10 +3984,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.2.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.3.0.tgz#7725dec55f738aa0ccaf3c790b57b36955b90d6a" - integrity sha512-AH8TdmkteR5VL4HgHq+p3H1NngOUJhkhiHr+hb9H0dB35vWNPhs5R3edyzFZhWMWWsJ2E8jhiXf/NqdGh/k4jg== +"@vector-im/compound-web@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-3.3.1.tgz#f5d69255fa62472626e0ed71b7176b09f21cbcaf" + integrity sha512-V9CQfaMyKdsWxC1D4Wz08Xh0ge3SnaOBf5SSIp1+uwoJTPyfEFHKgqbZl536SHBvVBc9M9IYg+3+lPB8xkFRFA== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -4178,21 +4227,11 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -<<<<<<< HEAD -acorn-walk@^8.0.0, acorn-walk@^8.0.2, acorn-walk@^8.1.1: -======= acorn-walk@^8.0.0: ->>>>>>> v1.11.67 version "8.3.2" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -<<<<<<< HEAD -acorn@^8.0.4, acorn@^8.1.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -======= acorn-walk@^8.0.2: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -4217,7 +4256,6 @@ acorn@^8.4.1: version "8.11.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== ->>>>>>> v1.11.67 agent-base@6: version "6.0.2" @@ -4263,17 +4301,30 @@ ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -<<<<<<< HEAD -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.2, ajv@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== -======= ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== ->>>>>>> v1.11.67 + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + +ajv@^8.6.2: + version "8.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.14.0.tgz#f514ddfd4756abb200e1704414963620a625ebbb" + integrity sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA== dependencies: fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" @@ -4294,16 +4345,6 @@ allchange@^1.0.6: semver "^7.3.5" yargs "^17.5.1" -ajv@^8.0.1: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - another-json@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/another-json/-/another-json-0.2.0.tgz#b5f4019c973b6dd5c6506a2d93469cb6d32aeedc" @@ -4951,32 +4992,10 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== -<<<<<<< HEAD caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -======= -caniuse-lite@^1.0.30001541: - version "1.0.30001568" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz#53fa9297273c9a977a560663f48cbea1767518b7" - integrity sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A== - -caniuse-lite@^1.0.30001565: - version "1.0.30001583" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz#abb2970cc370801dc7e27bf290509dc132cfa390" - integrity sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q== - -caniuse-lite@^1.0.30001578: - version "1.0.30001589" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" - integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== - -caniuse-lite@^1.0.30001587: - version "1.0.30001614" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" - integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== ->>>>>>> v1.11.67 chalk@5.2.0: version "5.2.0" @@ -5363,17 +5382,20 @@ copy-webpack-plugin@^12.0.0: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -<<<<<<< HEAD -core-js-compat@^3.31.0, core-js-compat@^3.34.0, core-js-compat@^3.36.1: -======= core-js-compat@^3.31.0, core-js-compat@^3.36.1: ->>>>>>> v1.11.67 version "3.37.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: browserslist "^4.23.0" +core-js-compat@^3.34.0: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== + dependencies: + browserslist "^4.23.0" + core-js@^3.0.0: version "3.37.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.0.tgz#d8dde58e91d156b2547c19d8a4efd5c7f6c426bb" @@ -5501,17 +5523,10 @@ css-has-pseudo@^6.0.3: postcss-selector-parser "^6.0.13" postcss-value-parser "^4.2.0" -<<<<<<< HEAD -css-loader@^6.0.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" - integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== -======= css-loader@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.1.tgz#de4163c0cb765c03d7957eb9e0a49c7f354948c7" integrity sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw== ->>>>>>> v1.11.67 dependencies: icss-utils "^5.1.0" postcss "^8.4.33" @@ -5699,7 +5714,6 @@ csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -<<<<<<< HEAD cypress-axe@^1.0.0: version "1.5.0" @@ -5712,9 +5726,9 @@ cypress-real-events@^1.7.1: integrity sha512-oiy+4kGKkzc2PT36k3GGQqkGxNiVypheWjMtfyi89iIk6bYmTzeqxapaLHS3pnhZOX1IEbTDUVxh8T4Nhs1tyQ== cypress@^13.0.0: - version "13.8.1" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.8.1.tgz#f558e51b770a409e2360031bbd36c3f4fb3f2db4" - integrity sha512-Uk6ovhRbTg6FmXjeZW/TkbRM07KPtvM5gah1BIMp4Y2s+i/NMxgaLw0+PbYTOdw1+egE0FP3mWRiGcRkjjmhzA== + version "13.10.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.10.0.tgz#0cfdb54eb046a30c78998e41effb635a50326935" + integrity sha512-tOhwRlurVOQbMduX+KonoMeQILs2cwR3yHGGENoFvvSoLUBHmJ8b9/n21gFSDqjlOJ+SRVcwuh+fG/JDsHsT6Q== dependencies: "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" @@ -5773,8 +5787,6 @@ dashdash@^1.12.0: integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" -======= ->>>>>>> v1.11.67 data-urls@^3.0.2: version "3.0.2" @@ -9260,15 +9272,9 @@ lower-case@^2.0.2: tslib "^2.0.3" lru-cache@^10.2.0: -<<<<<<< HEAD - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== -======= version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== ->>>>>>> v1.11.67 lru-cache@^5.1.1: version "5.1.1" @@ -9386,10 +9392,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.3.0-rc.0: - version "32.3.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" - integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== +matrix-js-sdk@32.1.0: + version "32.1.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.1.0.tgz#b5cb79cc838c450d44d01de1ac58b6cda63b20b9" + integrity sha512-+jRCQKOBuMvAz3nWsf5NGWpttByeC/gw1It1gCZLQsWix6jN1bkHiqwk6OOvcGj4I5ML2bOEbYEr46bcqFUouQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" @@ -9433,18 +9439,11 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -<<<<<<< HEAD "matrix-react-sdk@file:./linked-dependencies/matrix-react-sdk": version "0.0.0" -======= -matrix-react-sdk@3.100.0-rc.0: - version "3.100.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0-rc.0.tgz#d787fa529e959b030409e37ee2be47906639534f" - integrity sha512-I2BLZTYAep39wtkuY5VV7dvfiD/RWYQM2RMrcv9sPVIbeEaZDcVbzX74qvUw7WmEOziAgeBd9nDCz57dTfP/vA== ->>>>>>> v1.11.67 dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/analytics-events" "^0.20.0" + "@matrix-org/analytics-events" "^0.19.0" "@matrix-org/emojibase-bindings" "^1.1.2" "@matrix-org/matrix-wysiwyg" "2.17.0" "@matrix-org/olm" "3.2.15" @@ -9453,7 +9452,7 @@ matrix-react-sdk@3.100.0-rc.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.2.0" + "@vector-im/compound-web" "^3.3.1" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -9485,7 +9484,7 @@ matrix-react-sdk@3.100.0-rc.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "32.3.0-rc.0" + matrix-js-sdk "32.1.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -9493,7 +9492,7 @@ matrix-react-sdk@3.100.0-rc.0: opus-recorder "^8.0.3" pako "^2.0.3" png-chunks-extract "^1.0.0" - posthog-js "1.130.1" + posthog-js "1.116.6" proposal-temporal "^0.9.0" qrcode "1.5.3" re-resizable "^6.9.0" @@ -9735,14 +9734,11 @@ moo-color@^1.0.2: dependencies: color-name "^1.1.4" -<<<<<<< HEAD moo@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== -======= ->>>>>>> v1.11.67 mrmime@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" @@ -10977,10 +10973,10 @@ postcss@^8.3.11, postcss@^8.4.33, postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.130.1: - version "1.130.1" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.130.1.tgz#e8d037043f801d438f785f441843cce7d8af7ec3" - integrity sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w== +posthog-js@1.116.6: + version "1.116.6" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.116.6.tgz#9a5c9f49230a76642f4c44d93b96710f886c2880" + integrity sha512-rvt8HxzJD4c2B/xsUa4jle8ApdqljeBI2Qqjp4XJMohQf18DXRyM6b96H5/UMs8jxYuZG14Er0h/kEIWeU6Fmw== dependencies: fflate "^0.4.8" preact "^10.19.3" @@ -11838,11 +11834,12 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -<<<<<<< HEAD -semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: -======= +semver@^7.3.5: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: ->>>>>>> v1.11.67 version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -13542,11 +13539,7 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -<<<<<<< HEAD yaml@^2.0.0, yaml@^2.2.2, yaml@^2.3.3, yaml@^2.4.1: -======= -yaml@^2.3.3: ->>>>>>> v1.11.67 version "2.4.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== From 90b253414678ea145715a83dc2eb253dd6cc15e5 Mon Sep 17 00:00:00 2001 From: "marc.sirisak" Date: Tue, 28 May 2024 17:10:05 +0200 Subject: [PATCH 66/68] Squashed 'linked-dependencies/matrix-react-sdk/' changes from 1a0120e6953..df47422a082 df47422a082 Merge pull request #7 from tchapgouv/upgrade-v3.100.0-rc.0 79a390fc81f feat(merge): merge conflict with v3.100.0-rc.0, decrypt message, roomtopic, package.json, accessiblebutton 96909be77b4 Merge tag 'v3.100.0-rc.0' into tchap d84bcbc2155 v3.100.0-rc.0 402e5dbc414 Upgrade dependency to matrix-js-sdk@32.3.0-rc.0 77a724526e9 Tooltip: Improve the accessibility of the composer and the rich text editor (#12459) 6e31f691189 Reuse single PlaybackWorker between Playback instances (#12520) 51f71567d7f Fix Netlify deployments not publishing when expected (#12521) f0281886d7c Fix well-known lookup for sliding sync labs check (#12519) d0b30d1631d Allow explicit configuration of OIDC dynamic registration metadata (#12514) 357f882ff50 Move to `AccessibleTooltipButton` in messages (#12487) 7a4ac57954d Disable the login overwriting test (#12507) b283b188986 Fix flakiness in playwright tests (#12512) cc6958980b3 Fix `element-desktop-ssoid being` included in OIDC Authorization call (#12495) ed7a21a63ce Remove spurious type casts and avoid deprecated symbols (#12513) 113299db438 [create-pull-request] automated change (#12515) 4ed6da4eba0 Remove old pre-join UTD logic (#12464) 948435ceb9b Collapse UserSettings tabs to just icons on narrow screens (#12505) c6f6f1d2a29 Fix Playwright github reporter to run in the pull_request context once more (#12509) eee0b2a9c30 Add room topic to right panel room info (#12503) 38893928cbe Add note about MSC3886, MSC3903 and MSC3906 being closed (#12496) 3109b97fd3a Fix beta notifications reconciliation for intentional mentions push rules (#12510) 706c4b71012 Use h tag for widget title instead of b tag (#12504) 51a543643e5 [create-pull-request] automated change (#12502) c8fa831fd52 feat(email-settings): add caption detail for email notif setting d1eab0aa7ed Reset matrix-js-sdk back to develop branch 2bf15d81744 Resetting package fields for development e1d7b1ca3e4 Merge branch 'master' into develop 462b0ff8ac1 v3.99.0 79c79f66d68 Upgrade dependency to matrix-js-sdk@32.2.0 580bb5537d6 OIDC: pass `id_token` via `id_token_hint` on Manage Account interaction (#12499) e2310e637c0 Update end-to-end-tests.yaml febb60ee453 Tooltip: improve accessibility for call and voice messages (#12489) caef3c1921b Tooltip: improve accessibility in room (#12493) 18ef97161ae Move the active tab in user settings to the dialog title (#12481) 0e6fe3cf765 feat(voip): hide video button when feature not active on homeserver f8e040a890d Tooltip: Remove extra data attribute (#12483) c121167087d fix avatar stretched on 1:1 call (#12494) f29823cdcc0 Check native sliding sync support against an unstable feature flag (#12498) 9684dd51456 Make TabbedView a controlled component (#12480) 2f3c84f1f41 Tooltip: improve accessibility of spaces (#12497) 050f61752f2 Convert tabbedview to functional component (#12478) 95ee2979c81 Tooltip: improve accessibility of the right panel (#12490) 3059b5b1e21 Use OPTIONS for sliding sync detection poke (#12492) d25d529e860 Extract functions for service worker usage, and add initial MSC3916 playwright test (when supported) (#12414) a34dbbc0fa4 v3.99.0-rc.1 11731809b03 [Backport staging] TAC: Fix accessibility issue when the Release announcement is displayed (#12484) c152bfd83ca [Backport staging] TAC: Close Release Announcement when TAC button is clicked (#12485) 374cee90806 Fix flaky jest tests (#12486) 7193d4c695d TAC: Fix accessibility issue when the Release announcement is displayed (#12482) 6a3741b7794 TAC: Close Release Announcement when TAC button is clicked (#12475) ad7f626e22f Do not render tooltip when RA is displayed on TAC (#12472) 5dc3ad546c8 Improve comments and types in MatrixClientPeg (#12477) 74e7195a617 Update react-types (#11815) 091499810c3 Update dependency posthog-js to v1.130.1 (#12479) d66cd51186b [create-pull-request] automated change (#12476) 906c9dd9488 Convert UserSettings to functional component (#12474) bb4f57583f9 MSC3575 (Sliding Sync) add well-known proxy support (#12307) 641a20ce636 Prepare for OIDC QR Login PR (#12463) 1c79bbb1ae5 Update dependency typescript to v5.4.5 (#12422) dafd9c23b8c Update all non-major dependencies (#12468) 3ca79968d3d Update dependency stylelint to v16.4.0 (#12470) 016533b761f Update dependency @sentry/browser to v7.112.2 (#12469) 6504cf5c7cf Update typescript-eslint monorepo to v7.7.1 (#12467) c2e632521b6 Update babel monorepo to v7.24.5 (#12465) 9a0d0718f9d Update dependency eslint-plugin-react-hooks to v4.6.2 (#12466) dbedeca07de Update matrix-org (#12426) d813457c42f v3.99.0-rc.0 a6f7aa6ebb2 Upgrade dependency to matrix-js-sdk@32.2.0-rc.0 f648f00727a Update end-to-end-tests.yaml 2df946b5b19 Tooltip: Use `AccessibleButton` in `RovingAccessibleTooltipButton` (#12458) 3634e665b13 Update end-to-end-tests.yaml 16a01d834f2 Update end-to-end-tests.yaml a2f79895cd8 Merge subtree commit 'f93067358d0d82e4dec408cfa822cbc379ec02fd' into upgrade-element-1.11.65 9aeaa388ccd Tooltip: Use `AccessibleButton` in dialogs (#12460) 44e2a6d070b Tooltip: Use `AccessibleButton` in reusable elements (#12461) d5bf1022e9c Use a different error message for UTDs when you weren't in the room. (#12453) 9cc362e9508 Update netlify.yaml 281916fd96d Take the Threads Activity Centre out of labs (#12439) 0138e175d25 Merge pull request #978 from tchapgouv/795-onboarding-enable-secure-backup 02e7fb340e8 Simplify Playwright CI (#12457) 45132ec6aa5 MenuItem: fix caption usage (#12455) 264e202ccd9 Add extra attribute to `AccessibleButton` (#12456) bd7ce7cda9c Expected UTDs: use a different message for UTDs sent before login (#12391) 700b3955a4a Add `Tooltip` to `AccessibleButton` (#12443) 5c4ebff6167 feat(onboarding-enable-secure-backup): reorder onboading and add secure backup ac6d9369692 fix(rageshake): reallow customapp field 644bf78e2ac Show the local echo in previews (#12451) 158e1110b16 Fixed the drag and drop of X ##27186 (#12450) 33c56e565db Reset matrix-js-sdk back to develop branch 5f9edc6049c Resetting package fields for development c778b0f9087 Merge branch 'master' into develop 427be433d07 Add analytics to activity toggles (#12418) 6dd6a7697c2 Decrypt events in reverse order without copying the array (#12445) cc7edade21f Move the TAC to above the button (#12438) 198b975439f [create-pull-request] automated change (#12440) 2c848d7fa76 Merge pull request #12416 from matrix-org/florianduros/tooltip-update c97a3740ac5 Merge branch 'develop' into florianduros/tooltip-update fb989ee7f37 Update compound web bf0fed59f20 Use focus instead of hover d402b52e068 Collect decryption failure translations together (#12436) 48a3a0992ef Merge branch 'refs/heads/develop' into florianduros/tooltip-update 0e65a5aae6e Update dependency posthog-js to v1.126.0 (#12437) 04b5b587a19 Expected UTDs: report a different Posthog code (#12389) 6cec2bba0f4 Use the same logic in prevews as the timeline to hide events that should be hidden (#12434) 9b5d4716e26 Merge branch 'develop' into florianduros/tooltip-update 1ace1707236 [create-pull-request] automated change (#12435) 04a2191cad2 fix selector so maths support doesn't mangle divs (#12433) 193237f2045 Update dependency eslint-plugin-jest to v28 (#12431) 3e12cd950ac Update all non-major dependencies (#12423) 8d22cab686b Update dependency eslint-plugin-unicorn to v52 (#12432) b1bd46cc5f5 Update typescript-eslint monorepo to v7.6.0 (#12427) 68b43f26ac9 Update dependency @sentry/browser to v7.110.0 (#12425) e8fc2cf91b8 Update dependency @playwright/test to v1.43.1 (#12424) 30b864f6f04 Update dependency @types/node to v18.19.31 (#12421) ceab73ab0f5 Update babel monorepo to v7.24.4 (#12420) e53b175a6bc Merge branch 'develop' into florianduros/tooltip-update 6c9d8e5231e Fix e2e test c6325e27d25 Update tests 89b1c2ff705 Update `@vector-im/compound-web` to `v4.0.1` 95c0ff9da96 Fix typing issues 30d60bfcddc Update compound to v4.0.0` 79cbfafce31 Merge branch 'refs/heads/develop' into florianduros/tooltip-update 5354e6efea8 Use new compound tooltip git-subtree-dir: linked-dependencies/matrix-react-sdk git-subtree-split: df47422a082658ff90a95fd23a938a25b19c875f --- .eslintrc.js | 1 - .github/workflows/element-web.yaml | 90 -- .../workflows/end-to-end-tests-netlify.yaml | 68 ++ .github/workflows/end-to-end-tests.yaml | 204 ++-- .github/workflows/netlify.yaml | 6 +- CHANGELOG.md | 25 + package.json | 24 +- playwright.config.ts | 2 +- playwright/Dockerfile | 2 +- playwright/e2e/crypto/crypto.spec.ts | 292 ++++- playwright/e2e/crypto/utils.ts | 42 +- playwright/e2e/login/overwrite_login.spec.ts | 7 +- .../one-to-one-chat/one-to-one-chat.spec.ts | 1 + .../read-receipts/editing-messages.spec.ts | 41 +- .../e2e/read-receipts/high-level.spec.ts | 31 +- playwright/e2e/read-receipts/index.ts | 6 +- .../e2e/read-receipts/new-messages.spec.ts | 133 +-- .../e2e/read-receipts/reactions.spec.ts | 41 +- .../e2e/read-receipts/read-receipts.spec.ts | 35 +- .../e2e/read-receipts/redactions.spec.ts | 160 ++- .../appearance-user-settings-tab.spec.ts | 2 - .../general-user-settings-tab.spec.ts | 5 + .../spaces/threads-activity-centre/index.ts | 2 +- playwright/e2e/threads/threads.spec.ts | 4 +- playwright/e2e/timeline/timeline.spec.ts | 102 ++ .../user-onboarding-new.spec.ts | 12 +- playwright/element-web-test.ts | 4 + playwright/pages/settings.ts | 3 +- .../synapse/templates/default/homeserver.yaml | 6 + ...omSummaryCard-with-verified-e2ee-linux.png | Bin 27217 -> 27122 bytes ...nvite-dialog-room-with-user-pill-linux.png | Bin 23052 -> 23503 bytes .../invite-dialog-room-without-user-linux.png | Bin 16782 -> 17170 bytes ...iew-with-a-poll-on-bubble-layout-linux.png | Bin 24634 -> 24660 bytes ...View-with-a-poll-on-group-layout-linux.png | Bin 24554 -> 24607 bytes .../file-tiles-list-linux.png | Bin 40984 -> 40293 bytes .../with-name-and-address-linux.png | Bin 35113 -> 34363 bytes .../room-header-highlighted-linux.png | Bin 5648 -> 5784 bytes ...with-apps-button-not-highlighted-linux.png | Bin 6737 -> 6867 bytes .../appearance-tab-linux.png | Bin 53079 -> 55326 bytes .../window-12px-linux.png | Bin 73556 -> 73087 bytes .../general-linux.png | Bin 58660 -> 58473 bytes .../general-smallscreen-linux.png | Bin 0 -> 40426 bytes ...ab-should-be-rendered-properly-1-linux.png | Bin 65154 -> 65509 bytes .../space-panel-collapsed-linux.png | Bin 6048 -> 5967 bytes .../space-panel-expanded-linux.png | Bin 20852 -> 22018 bytes ...ly-to-the-location-on-ThreadView-linux.png | Bin 21091 -> 21058 bytes ...ent-tile-reply-chains-irc-layout-linux.png | Bin 9454 -> 9381 bytes ...image-in-timeline-default-layout-linux.png | Bin 0 -> 37770 bytes ...g-new-user-app-download-dialog-1-linux.png | Bin 40723 -> 40740 bytes .../user-view.spec.ts/user-info-linux.png | Bin 17883 -> 17830 bytes res/css/structures/_TabbedView.pcss | 23 + res/css/views/auth/_LoginWithQR.pcss | 132 ++- res/css/views/right_panel/_BaseCard.pcss | 1 + .../views/right_panel/_RoomSummaryCard.pcss | 46 + res/css/views/rooms/_AppsDrawer.pcss | 5 + .../rooms/_MessageComposerFormatBar.pcss | 5 - res/css/views/rooms/_RoomBreadcrumbs.pcss | 5 - .../components/_FormattingButtons.pcss | 20 +- .../toasts/_IncomingLegacyCallToast.pcss | 1 + src/BasePlatform.ts | 80 +- src/DecryptionFailureTracker.ts | 62 +- src/HtmlUtils.tsx | 12 +- src/IConfigOptions.ts | 20 +- src/Lifecycle.ts | 13 +- src/MatrixClientPeg.ts | 46 +- src/Modal.tsx | 46 +- src/PlaybackEncoder.ts | 34 + src/PosthogAnalytics.ts | 2 +- src/SlidingSyncManager.ts | 90 +- .../context_menu/ContextMenuButton.tsx | 4 +- .../context_menu/ContextMenuTooltipButton.tsx | 3 +- src/accessibility/context_menu/MenuItem.tsx | 13 +- .../roving/RovingAccessibleButton.tsx | 2 + .../roving/RovingAccessibleTooltipButton.tsx | 13 +- src/audio/Playback.ts | 14 +- src/components/structures/ContextMenu.tsx | 21 +- src/components/structures/LeftPanel.tsx | 7 +- src/components/structures/MatrixChat.tsx | 8 +- src/components/structures/SpaceHierarchy.tsx | 35 +- src/components/structures/SpaceRoomView.tsx | 3 +- src/components/structures/TabbedView.tsx | 248 ++-- src/components/structures/TimelinePanel.tsx | 147 +-- .../auth/forgot-password/CheckEmail.tsx | 2 +- .../auth/forgot-password/VerifyEmailModal.tsx | 2 +- .../views/audio_messages/PlayPauseButton.tsx | 9 +- .../views/auth/LoginWithQR-types.ts | 43 + src/components/views/auth/LoginWithQR.tsx | 33 +- src/components/views/auth/LoginWithQRFlow.tsx | 186 +-- .../views/avatars/DecoratedRoomAvatar.tsx | 2 +- src/components/views/dialogs/BaseDialog.tsx | 2 +- .../views/dialogs/ForwardDialog.tsx | 16 +- src/components/views/dialogs/InviteDialog.tsx | 4 +- .../views/dialogs/RoomSettingsDialog.tsx | 12 +- .../dialogs/SlidingSyncOptionsDialog.tsx | 142 --- .../views/dialogs/SpacePreferencesDialog.tsx | 5 +- .../views/dialogs/SpaceSettingsDialog.tsx | 4 +- .../views/dialogs/UserSettingsDialog.tsx | 130 ++- .../dialogs/devtools/RoomNotifications.tsx | 7 +- .../dialogs/spotlight/SpotlightDialog.tsx | 4 +- .../views/dialogs/spotlight/TooltipOption.tsx | 9 +- .../views/elements/AccessibleButton.tsx | 46 +- .../elements/AccessibleTooltipButton.tsx | 6 +- src/components/views/elements/AppTile.tsx | 2 +- .../views/elements/CopyableText.tsx | 9 +- .../elements/DesktopCapturerSourcePicker.tsx | 21 +- src/components/views/elements/ImageView.tsx | 14 +- src/components/views/elements/InfoTooltip.tsx | 2 +- .../views/elements/PersistedElement.tsx | 9 +- src/components/views/elements/Pill.tsx | 2 +- src/components/views/elements/RoomTopic.tsx | 20 +- src/components/views/elements/SSOButtons.tsx | 5 +- .../views/elements/TextWithTooltip.tsx | 2 +- .../views/elements/ToggleSwitch.tsx | 10 +- src/components/views/messages/CallEvent.tsx | 9 +- .../views/messages/DecryptionFailureBody.tsx | 36 +- .../views/messages/DownloadActionButton.tsx | 1 + .../views/messages/LegacyCallEvent.tsx | 3 +- .../views/messages/MStickerBody.tsx | 3 +- .../views/messages/MessageActionBar.tsx | 36 +- src/components/views/messages/TextualBody.tsx | 24 +- src/components/views/pips/WidgetPip.tsx | 5 +- .../views/polls/pollHistory/PollListItem.tsx | 2 +- .../polls/pollHistory/PollListItemEnded.tsx | 2 +- .../views/right_panel/HeaderButton.tsx | 8 +- .../views/right_panel/RoomSummaryCard.tsx | 113 +- src/components/views/right_panel/UserInfo.tsx | 7 +- .../views/rooms/CollapsibleButton.tsx | 10 +- src/components/views/rooms/E2EIcon.tsx | 6 +- src/components/views/rooms/EventTile.tsx | 2 +- src/components/views/rooms/HistoryTile.tsx | 3 - .../views/rooms/LegacyRoomHeader.tsx | 46 +- .../views/rooms/LinkPreviewGroup.tsx | 1 + .../views/rooms/MessageComposer.tsx | 5 +- .../views/rooms/MessageComposerButtons.tsx | 5 +- .../views/rooms/MessageComposerFormatBar.tsx | 13 +- .../views/rooms/NotificationBadge.tsx | 2 +- .../views/rooms/PinnedEventTile.tsx | 3 +- .../views/rooms/RoomBreadcrumbs.tsx | 9 +- src/components/views/rooms/RoomHeader.tsx | 6 +- .../rooms/RoomHeader/CallGuestLinkButton.tsx | 4 +- src/components/views/rooms/RoomList.tsx | 12 +- src/components/views/rooms/RoomListHeader.tsx | 4 +- src/components/views/rooms/RoomPreviewBar.tsx | 14 +- src/components/views/rooms/RoomSublist.tsx | 10 +- src/components/views/rooms/RoomTile.tsx | 16 +- src/components/views/rooms/ThreadSummary.tsx | 2 +- .../views/rooms/VoiceRecordComposerTile.tsx | 6 +- .../components/FormattingButtons.tsx | 44 +- .../views/settings/JoinRuleSettings.tsx | 14 +- .../views/settings/Notifications.tsx | 13 + .../devices/DeviceExpandDetailsButton.tsx | 2 +- .../devices/FilteredDeviceListHeader.tsx | 2 +- .../settings/devices/LoginWithQRSection.tsx | 67 +- .../notifications/NotificationSettings2.tsx | 2 +- .../views/settings/shared/SettingsSection.tsx | 25 +- .../tabs/user/AppearanceUserSettingsTab.tsx | 7 +- .../tabs/user/GeneralUserSettingsTab.tsx | 2 +- .../tabs/user/HelpUserSettingsTab.tsx | 2 +- .../tabs/user/KeyboardUserSettingsTab.tsx | 2 +- .../tabs/user/MjolnirUserSettingsTab.tsx | 2 +- .../tabs/user/NotificationUserSettingsTab.tsx | 3 +- .../tabs/user/PreferencesUserSettingsTab.tsx | 2 +- .../settings/tabs/user/SessionManagerTab.tsx | 17 +- .../tabs/user/SidebarUserSettingsTab.tsx | 2 +- .../tabs/user/VoiceUserSettingsTab.tsx | 2 +- .../views/spaces/QuickSettingsButton.tsx | 9 +- .../views/spaces/SpaceCreateMenu.tsx | 3 +- src/components/views/spaces/SpacePanel.tsx | 33 +- .../views/spaces/SpaceTreeLevel.tsx | 13 +- .../ThreadsActivityCentre.tsx | 11 +- .../ThreadsActivityCentreButton.tsx | 13 +- src/components/views/voip/LegacyCallView.tsx | 9 +- .../LegacyCallView/LegacyCallViewButtons.tsx | 29 +- .../LegacyCallView/LegacyCallViewHeader.tsx | 8 +- src/hooks/useUnreadNotifications.ts | 9 +- src/hooks/useUserOnboardingContext.ts | 11 +- src/hooks/useUserOnboardingTasks.ts | 88 +- src/i18n/strings/cs.json | 27 +- src/i18n/strings/de_DE.json | 22 +- src/i18n/strings/el.json | 3 - src/i18n/strings/en_EN.json | 72 +- src/i18n/strings/eo.json | 4 +- src/i18n/strings/es.json | 21 +- src/i18n/strings/et.json | 25 +- src/i18n/strings/fa.json | 4 +- src/i18n/strings/fi.json | 19 +- src/i18n/strings/fr.json | 24 +- src/i18n/strings/gl.json | 9 - src/i18n/strings/he.json | 2 - src/i18n/strings/hu.json | 22 +- src/i18n/strings/id.json | 22 +- src/i18n/strings/is.json | 8 +- src/i18n/strings/it.json | 27 +- src/i18n/strings/ja.json | 21 +- src/i18n/strings/lo.json | 3 - src/i18n/strings/lt.json | 3 - src/i18n/strings/nl.json | 16 - src/i18n/strings/pl.json | 42 +- src/i18n/strings/pt_BR.json | 3 - src/i18n/strings/ru.json | 22 +- src/i18n/strings/sk.json | 22 +- src/i18n/strings/sq.json | 22 +- src/i18n/strings/sv.json | 27 +- src/i18n/strings/uk.json | 22 +- src/i18n/strings/vi.json | 13 +- src/i18n/strings/zh_Hans.json | 11 +- src/i18n/strings/zh_Hant.json | 22 +- .../reconcileNotificationSettings.ts | 4 +- src/rageshake/submit-rageshake.ts | 2 +- src/settings/Settings.tsx | 14 +- .../controllers/AnalyticsController.ts | 42 + .../controllers/SlidingSyncController.ts | 13 +- .../RoomNotificationStateStore.ts | 4 +- src/stores/oidc/OidcClientStore.ts | 23 +- src/stores/room-list/MessagePreviewStore.ts | 49 +- src/toasts/IncomingCallToast.tsx | 11 +- src/toasts/IncomingLegacyCallToast.tsx | 3 +- src/utils/DialogOpener.ts | 1 - src/utils/StorageAccess.ts | 132 +++ src/utils/StorageManager.ts | 98 +- src/utils/exportUtils/HtmlExport.tsx | 41 +- src/utils/oidc/authorize.ts | 5 +- src/utils/oidc/persistOidcSettings.ts | 32 +- src/utils/pillify.tsx | 19 +- src/utils/tokens/pickling.ts | 88 ++ src/utils/tokens/tokens.ts | 10 +- src/utils/tooltipify.tsx | 9 +- .../components/atoms/VoiceBroadcastHeader.tsx | 5 +- .../molecules/VoiceBroadcastRecordingPip.tsx | 6 +- test/DecryptionFailureTracker-test.ts | 177 +-- test/HtmlUtils-test.tsx | 10 + test/Lifecycle-test.ts | 69 +- test/PosthogAnalytics-test.ts | 2 +- test/SlidingSyncManager-test.ts | 95 ++ test/__snapshots__/HtmlUtils-test.tsx.snap | 2 + .../components/structures/MatrixChat-test.tsx | 22 +- .../structures/MessagePanel-test.tsx | 5 +- .../components/structures/RightPanel-test.tsx | 2 - test/components/structures/RoomView-test.tsx | 3 - .../structures/SpaceHierarchy-test.tsx | 5 +- .../components/structures/TabbedView-test.tsx | 62 +- .../structures/ThreadPanel-test.tsx | 34 +- .../components/structures/ThreadView-test.tsx | 4 +- .../structures/TimelinePanel-test.tsx | 29 +- .../__snapshots__/RoomView-test.tsx.snap | 25 +- .../SpaceHierarchy-test.tsx.snap | 4 +- .../__snapshots__/ThreadPanel-test.tsx.snap | 2 - .../__snapshots__/UserMenu-test.tsx.snap | 1 - .../structures/auth/ForgotPassword-test.tsx | 2 - .../avatars/DecoratedRoomAvatar-test.tsx | 5 +- .../DecoratedRoomAvatar-test.tsx.snap | 6 +- .../views/beacon/BeaconListItem-test.tsx | 2 - .../views/beacon/BeaconMarker-test.tsx | 8 +- .../views/beacon/BeaconViewDialog-test.tsx | 12 +- .../views/beacon/DialogSidebar-test.tsx | 5 +- .../views/beacon/ShareLatestLocation-test.tsx | 4 +- .../BeaconListItem-test.tsx.snap | 1 - .../__snapshots__/DialogSidebar-test.tsx.snap | 5 +- .../LeftPanelLiveShareWarning-test.tsx.snap | 2 +- .../RoomLiveShareWarning-test.tsx.snap | 2 +- .../ShareLatestLocation-test.tsx.snap | 1 - .../views/dialogs/ForwardDialog-test.tsx | 4 +- .../views/dialogs/ServerPickerDialog-test.tsx | 3 +- .../views/dialogs/ShareDialog-test.tsx | 7 +- .../views/dialogs/UserSettingsDialog-test.tsx | 113 +- .../ServerPickerDialog-test.tsx.snap | 1 - .../views/elements/AppTile-test.tsx | 8 +- .../DesktopCapturerSourcePicker-test.tsx | 100 ++ .../views/elements/FacePile-test.tsx | 2 - .../views/elements/ImageView-test.tsx | 29 + .../views/elements/InfoTooltip-test.tsx | 5 +- test/components/views/elements/Pill-test.tsx | 2 - .../views/elements/RoomFacePile-test.tsx | 5 +- .../__snapshots__/AppTile-test.tsx.snap | 30 +- .../__snapshots__/FacePile-test.tsx.snap | 1 - .../__snapshots__/ImageView-test.tsx.snap | 82 ++ .../__snapshots__/InfoTooltip-test.tsx.snap | 3 +- .../elements/__snapshots__/Pill-test.tsx.snap | 10 - .../__snapshots__/RoomFacePile-test.tsx.snap | 1 - .../LocationViewDialog-test.tsx.snap | 4 +- .../__snapshots__/ZoomButtons-test.tsx.snap | 4 +- .../views/messages/CallEvent-test.tsx | 3 +- .../messages/DecryptionFailureBody-test.tsx | 58 +- .../views/messages/MLocationBody-test.tsx | 9 +- .../views/messages/MStickerBody-test.tsx | 3 +- .../views/messages/MessageTimestamp-test.tsx | 27 +- .../views/messages/TextualBody-test.tsx | 4 +- .../__snapshots__/TextualBody-test.tsx.snap | 9 +- .../polls/pollHistory/PollHistory-test.tsx | 5 +- .../polls/pollHistory/PollListItem-test.tsx | 4 +- .../pollHistory/PollListItemEnded-test.tsx | 3 +- .../__snapshots__/PollHistory-test.tsx.snap | 2 - .../__snapshots__/PollListItem-test.tsx.snap | 1 - .../PollListItemEnded-test.tsx.snap | 1 - .../right_panel/RoomSummaryCard-test.tsx | 39 +- .../views/right_panel/UserInfo-test.tsx | 42 +- .../RoomSummaryCard-test.tsx.snap | 860 +++++++++++++- .../__snapshots__/UserInfo-test.tsx.snap | 8 +- .../components/views/rooms/EventTile-test.tsx | 13 +- .../views/rooms/LegacyRoomHeader-test.tsx | 3 - .../views/rooms/MemberList-test.tsx | 5 +- .../views/rooms/MemberTile-test.tsx | 7 +- .../views/rooms/MessageComposer-test.tsx | 2 - .../rooms/MessageComposerButtons-test.tsx | 20 +- .../views/rooms/RoomHeader-test.tsx | 7 +- .../RoomHeader/CallGuestLinkButton-test.tsx | 13 +- .../RoomHeader/VideoRoomChatButton-test.tsx | 7 +- .../VideoRoomChatButton-test.tsx.snap | 1 - test/components/views/rooms/RoomList-test.tsx | 23 +- .../__snapshots__/MemberTile-test.tsx.snap | 6 +- .../__snapshots__/RoomHeader-test.tsx.snap | 6 +- .../components/FormattingButtons-test.tsx | 4 +- .../views/settings/Notifications-test.tsx | 3 +- .../devices/FilteredDeviceList-test.tsx | 7 +- .../devices/FilteredDeviceListHeader-test.tsx | 7 +- .../settings/devices/LoginWithQR-test.tsx | 3 +- .../settings/devices/LoginWithQRFlow-test.tsx | 8 +- .../CurrentDeviceSection-test.tsx.snap | 3 + .../FilteredDeviceListHeader-test.tsx.snap | 2 - .../LoginWithQRFlow-test.tsx.snap | 458 +++++--- .../Notifications2-test.tsx.snap | 10 - .../PeopleRoomSettingsTab-test.tsx.snap | 8 +- .../tabs/user/LabsUserSettingsTab-test.tsx | 33 +- .../tabs/user/SessionManagerTab-test.tsx | 9 +- .../AppearanceUserSettingsTab-test.tsx.snap | 10 - .../KeyboardUserSettingsTab-test.tsx.snap | 5 - .../MjolnirUserSettingsTab-test.tsx.snap | 5 - .../PreferencesUserSettingsTab-test.tsx.snap | 5 - .../SessionManagerTab-test.tsx.snap | 3 +- .../SidebarUserSettingsTab-test.tsx.snap | 10 - .../spaces/ThreadsActivityCentre-test.tsx | 24 +- .../__snapshots__/SpacePanel-test.tsx.snap | 43 +- .../ThreadsActivityCentre-test.tsx.snap | 141 ++- test/components/views/voip/CallView-test.tsx | 5 +- .../LegacyCallViewButtons-test.tsx | 67 ++ .../LegacyCallViewButtons-test.tsx.snap | 68 ++ .../controllers/AnalyticsController-test.ts | 35 + test/setupTests.ts | 7 - .../room-list/MessagePreviewStore-test.ts | 155 ++- test/test-utils/client.ts | 7 +- test/test-utils/test-utils.ts | 2 + test/utils/StorageAccess-test.ts | 55 + .../__snapshots__/HTMLExport-test.ts.snap | 2 +- test/utils/oidc/authorize-test.ts | 2 + test/utils/oidc/persistOidcSettings-test.ts | 44 +- test/utils/oidc/registerClient-test.ts | 7 +- yarn.lock | 1027 +++++++++-------- 347 files changed, 6106 insertions(+), 3708 deletions(-) delete mode 100644 .github/workflows/element-web.yaml create mode 100644 .github/workflows/end-to-end-tests-netlify.yaml create mode 100644 playwright/snapshots/settings/general-user-settings-tab.spec.ts/general-smallscreen-linux.png create mode 100644 playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png create mode 100644 src/PlaybackEncoder.ts create mode 100644 src/components/views/auth/LoginWithQR-types.ts delete mode 100644 src/components/views/dialogs/SlidingSyncOptionsDialog.tsx create mode 100644 src/settings/controllers/AnalyticsController.ts create mode 100644 src/utils/StorageAccess.ts create mode 100644 src/utils/tokens/pickling.ts create mode 100644 test/components/views/elements/DesktopCapturerSourcePicker-test.tsx create mode 100644 test/components/views/elements/ImageView-test.tsx create mode 100644 test/components/views/elements/__snapshots__/ImageView-test.tsx.snap create mode 100644 test/components/views/voip/LegacyCallView/LegacyCallViewButtons-test.tsx create mode 100644 test/components/views/voip/LegacyCallView/__snapshots__/LegacyCallViewButtons-test.tsx.snap create mode 100644 test/settings/controllers/AnalyticsController-test.ts create mode 100644 test/utils/StorageAccess-test.ts diff --git a/.eslintrc.js b/.eslintrc.js index 14afc41c07..caeeca403d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -108,7 +108,6 @@ module.exports = { "!matrix-js-sdk/src/extensible_events_v1/PollEndEvent", "!matrix-js-sdk/src/extensible_events_v1/InvalidEventError", "!matrix-js-sdk/src/crypto", - "!matrix-js-sdk/src/crypto/algorithms", "!matrix-js-sdk/src/crypto/aes", "!matrix-js-sdk/src/crypto/olmlib", "!matrix-js-sdk/src/crypto/crypto", diff --git a/.github/workflows/element-web.yaml b/.github/workflows/element-web.yaml deleted file mode 100644 index 8ac5e2da94..0000000000 --- a/.github/workflows/element-web.yaml +++ /dev/null @@ -1,90 +0,0 @@ -# Produce a build of element-web with this version of react-sdk -# and any matching branches of element-web and js-sdk, output it -# as an artifact and run integration tests. -name: Element Web - Build -on: - pull_request: {} - merge_group: - types: [checks_requested] - push: - branches: [develop, master] - repository_dispatch: - types: [upstream-sdk-notify] - - # support triggering from other workflows - workflow_call: - inputs: - react-sdk-repository: - type: string - required: true - description: "The name of the github repository to check out and build." - - matrix-js-sdk-sha: - type: string - required: false - description: "The Git SHA of matrix-js-sdk to build against. By default, will use a matching branch name if it exists, or develop." - element-web-sha: - type: string - required: false - description: "The Git SHA of element-web to build against. By default, will use a matching branch name if it exists, or develop." - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -env: - # fetchdep.sh needs to know our PR number - PR_NUMBER: ${{ github.event.pull_request.number }} - -jobs: - build: - name: "Build Element-Web" - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - repository: ${{ inputs.react-sdk-repository || github.repository }} - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - - - name: Fetch layered build - id: layered_build - env: - # tell layered.sh to check out the right sha of the JS-SDK & EW, if they were given one - JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} - ELEMENT_WEB_GITHUB_BASE_REF: ${{ inputs.element-web-sha }} - run: | - scripts/ci/layered.sh - JSSDK_SHA=$(git -C matrix-js-sdk rev-parse --short=12 HEAD) - REACT_SHA=$(git rev-parse --short=12 HEAD) - VECTOR_SHA=$(git -C element-web rev-parse --short=12 HEAD) - echo "VERSION=$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA" >> $GITHUB_OUTPUT - - - name: Copy config - run: cp element.io/develop/config.json config.json - working-directory: ./element-web - - - name: Build - env: - CI_PACKAGE: true - VERSION: "${{ steps.layered_build.outputs.VERSION }}" - run: | - yarn build - echo $VERSION > webapp/version - working-directory: ./element-web - - # Record the react-sdk sha so our Playwright tests are from the same sha - - name: Record react-sdk SHA - run: | - git rev-parse HEAD > element-web/webapp/sha - - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: previewbuild - path: element-web/webapp - # We'll only use this in a triggered job, then we're done with it - retention-days: 1 diff --git a/.github/workflows/end-to-end-tests-netlify.yaml b/.github/workflows/end-to-end-tests-netlify.yaml new file mode 100644 index 0000000000..4667bfb02b --- /dev/null +++ b/.github/workflows/end-to-end-tests-netlify.yaml @@ -0,0 +1,68 @@ +# Triggers after the playwright tests have finished, +# taking the artifact and uploading it to Netlify for easier viewing +name: Upload End to End Test report to Netlify +on: + workflow_run: + workflows: ["End to End Tests"] + types: + - completed + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }} + cancel-in-progress: ${{ github.event.workflow_run.event == 'pull_request' }} + +jobs: + report: + if: github.event.workflow_run.conclusion != 'cancelled' + name: Report results + runs-on: ubuntu-latest + environment: Netlify + permissions: + statuses: write + deployments: write + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - uses: actions/setup-node@v4 + with: + cache: "yarn" + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Download blob reports from GitHub Actions Artifacts + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + pattern: all-blob-reports-* + path: all-blob-reports + merge-multiple: true + + - name: Merge into HTML Report + run: yarn playwright merge-reports --reporter=html,./playwright/flaky-reporter.ts ./all-blob-reports + env: + # Only pass creds to the flaky-reporter on main branch runs + GITHUB_TOKEN: ${{ github.event.workflow_run.head_branch == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} + + - name: Upload HTML report + uses: actions/upload-artifact@v4 + with: + name: html-report--attempt-${{ github.run_attempt }} + path: playwright-report + retention-days: 14 + + - name: 📤 Deploy to Netlify + uses: matrix-org/netlify-pr-preview@v3 + with: + path: playwright-report + owner: ${{ github.event.workflow_run.head_repository.owner.login }} + branch: ${{ github.event.workflow_run.head_branch }} + revision: ${{ github.event.workflow_run.head_sha }} + token: ${{ secrets.NETLIFY_AUTH_TOKEN }} + site_id: ${{ secrets.NETLIFY_SITE_ID }} + desc: Playwright Report + deployment_env: EndToEndTests + prefix: "e2e-" diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 3228fe91b3..0e224c04db 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -1,90 +1,121 @@ -# Triggers after the layered build has finished, taking the artifact and running Playwright on it +# Produce a build of element-web with this version of react-sdk +# and any matching branches of element-web and js-sdk, output it +# as an artifact and run end-to-end tests. name: End to End Tests on: - workflow_run: - workflows: ["Element Web - Build"] - types: - - completed - - # support calls from other workflows for downstream testing + pull_request: {} + merge_group: + types: [checks_requested] + push: + branches: [develop, master] + repository_dispatch: + types: [upstream-sdk-notify] + + # support triggering from other workflows workflow_call: inputs: + skip: + type: boolean + required: false + default: false + description: "A boolean to skip the playwright check itself while still creating the passing check. Useful when only running in Merge Queues." + react-sdk-repository: type: string required: true description: "The name of the github repository to check out and build." - secrets: - ELEMENT_BOT_TOKEN: - required: true + + matrix-js-sdk-sha: + type: string + required: false + description: "The Git SHA of matrix-js-sdk to build against. By default, will use a matching branch name if it exists, or develop." + element-web-sha: + type: string + required: false + description: "The Git SHA of element-web to build against. By default, will use a matching branch name if it exists, or develop." concurrency: - group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }} - cancel-in-progress: ${{ github.event.workflow_run.event == 'pull_request' }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} + cancel-in-progress: true + +env: + # fetchdep.sh needs to know our PR number + PR_NUMBER: ${{ github.event.pull_request.number }} jobs: - prepare: - name: Prepare - if: github.event.workflow_run.conclusion == 'success' + build: + name: "Build Element-Web" runs-on: ubuntu-latest - permissions: - statuses: write steps: - # We create the status here and then update it to success/failure in the `report` stage - # This provides an easy link to this workflow_run from the PR before the tests are done. - - uses: Sibz/github-status-action@071b5370da85afbb16637d6eed8524a06bc2053e # v1 + - name: Checkout code + uses: actions/checkout@v4 with: - authToken: ${{ secrets.GITHUB_TOKEN }} - state: pending - context: ${{ github.workflow }} / end-to-end-tests - sha: ${{ github.event.workflow_run.head_sha }} - target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + repository: ${{ inputs.react-sdk-repository || github.repository }} + + - uses: actions/setup-node@v4 + with: + cache: "yarn" + + - name: Fetch layered build + id: layered_build + env: + # tell layered.sh to check out the right sha of the JS-SDK & EW, if they were given one + JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} + ELEMENT_WEB_GITHUB_BASE_REF: ${{ inputs.element-web-sha }} + run: | + scripts/ci/layered.sh + JSSDK_SHA=$(git -C matrix-js-sdk rev-parse --short=12 HEAD) + REACT_SHA=$(git rev-parse --short=12 HEAD) + VECTOR_SHA=$(git -C element-web rev-parse --short=12 HEAD) + echo "VERSION=$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA" >> $GITHUB_OUTPUT - tests: + - name: Copy config + run: cp element.io/develop/config.json config.json + working-directory: ./element-web + + - name: Build + env: + CI_PACKAGE: true + VERSION: "${{ steps.layered_build.outputs.VERSION }}" + run: | + yarn build + echo $VERSION > webapp/version + working-directory: ./element-web + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: webapp + path: element-web/webapp + retention-days: 1 + + playwright: name: "Run Tests ${{ matrix.runner }}/${{ strategy.job-total }}" - needs: prepare + needs: build + if: inputs.skip != true runs-on: ubuntu-latest permissions: actions: read issues: read pull-requests: read - environment: EndToEndTests strategy: fail-fast: false matrix: # Run multiple instances in parallel to speed up the tests runner: [1, 2, 3, 4, 5, 6, 7, 8] steps: - - name: 📥 Download artifact - uses: actions/download-artifact@v4 - with: - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - run-id: ${{ github.event.workflow_run.id }} - name: previewbuild - path: webapp - - # The workflow_run.head_sha is the sha of the head commit but the element-web was built using a simulated - # merge commit - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request - # so use the sha from the tarball for the checkout of the tests - # to make sure we get a matching set of code and tests. - - name: Grab sha from webapp - id: sha - run: | - echo "sha=$(cat webapp/sha)" >> $GITHUB_OUTPUT - - uses: actions/checkout@v4 with: - # XXX: We're checking out untrusted code in a secure context - # We need to be careful to not trust anything this code outputs/may do - # - # Note that (in the absence of a `react-sdk-repository` input), - # we check out from the default repository, which is (for this workflow) the - # *target* repository for the pull request. - # - ref: ${{ steps.sha.outputs.sha }} persist-credentials: false path: matrix-react-sdk repository: ${{ inputs.react-sdk-repository || github.repository }} + - name: 📥 Download artifact + uses: actions/download-artifact@v4 + with: + name: webapp + path: webapp + - uses: actions/setup-node@v4 with: cache: "yarn" @@ -126,66 +157,11 @@ jobs: path: matrix-react-sdk/blob-report retention-days: 1 - report: - name: Report results - needs: tests - runs-on: ubuntu-latest - environment: Netlify + complete: + name: end-to-end-tests + needs: playwright if: always() - permissions: - statuses: write - deployments: write + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - repository: ${{ inputs.react-sdk-repository || github.repository }} - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Download blob reports from GitHub Actions Artifacts - uses: actions/download-artifact@v4 - with: - pattern: all-blob-reports-* - path: all-blob-reports - merge-multiple: true - - - name: Merge into HTML Report - run: yarn playwright merge-reports --reporter=html,github,./playwright/flaky-reporter.ts ./all-blob-reports - env: - # Only pass creds to the flaky-reporter on main branch runs - GITHUB_TOKEN: ${{ github.event.workflow_run.head_branch == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} - - - name: Upload HTML report - uses: actions/upload-artifact@v4 - with: - name: html-report--attempt-${{ github.run_attempt }} - path: playwright-report - retention-days: 14 - - - uses: Sibz/github-status-action@071b5370da85afbb16637d6eed8524a06bc2053e # v1 - if: always() - with: - authToken: ${{ secrets.GITHUB_TOKEN }} - state: ${{ needs.tests.result == 'success' && 'success' || 'failure' }} - context: ${{ github.workflow }} / end-to-end-tests - sha: ${{ github.event.workflow_run.head_sha }} - target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - name: 📤 Deploy to Netlify - uses: matrix-org/netlify-pr-preview@v3 - with: - path: playwright-report - owner: ${{ github.event.workflow_run.head_repository.owner.login }} - branch: ${{ github.event.workflow_run.head_branch }} - revision: ${{ github.event.workflow_run.head_sha }} - token: ${{ secrets.NETLIFY_AUTH_TOKEN }} - site_id: ${{ secrets.NETLIFY_SITE_ID }} - desc: Playwright Report - deployment_env: EndToEndTests - prefix: "e2e-" + - if: needs.playwright.result != 'skipped' && needs.playwright.result != 'success' + run: exit 1 diff --git a/.github/workflows/netlify.yaml b/.github/workflows/netlify.yaml index 21c6f22df0..911bfccbf4 100644 --- a/.github/workflows/netlify.yaml +++ b/.github/workflows/netlify.yaml @@ -3,12 +3,12 @@ name: Upload Preview Build to Netlify on: workflow_run: - workflows: ["Element Web - Build"] + workflows: ["End to End Tests"] types: - completed jobs: deploy: - if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' + if: github.event.workflow_run.conclusion != 'cancelled' && github.event.workflow_run.event == 'pull_request' runs-on: ubuntu-latest environment: Netlify steps: @@ -29,7 +29,7 @@ jobs: with: github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - name: previewbuild + name: webapp path: webapp - name: 📤 Deploy to Netlify diff --git a/CHANGELOG.md b/CHANGELOG.md index 440239db81..ea324f0e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +Changes in [3.99.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.99.0) (2024-05-07) +===================================================================================================== +## ✨ Features + +* Use a different error message for UTDs when you weren't in the room. ([#12453](https://github.com/matrix-org/matrix-react-sdk/pull/12453)). Contributed by @uhoreg. +* Take the Threads Activity Centre out of labs ([#12439](https://github.com/matrix-org/matrix-react-sdk/pull/12439)). Contributed by @dbkr. +* Expected UTDs: use a different message for UTDs sent before login ([#12391](https://github.com/matrix-org/matrix-react-sdk/pull/12391)). Contributed by @richvdh. +* Add `Tooltip` to `AccessibleButton` ([#12443](https://github.com/matrix-org/matrix-react-sdk/pull/12443)). Contributed by @florianduros. +* Add analytics to activity toggles ([#12418](https://github.com/matrix-org/matrix-react-sdk/pull/12418)). Contributed by @dbkr. +* Decrypt events in reverse order without copying the array ([#12445](https://github.com/matrix-org/matrix-react-sdk/pull/12445)). Contributed by @Johennes. +* Use new compound tooltip ([#12416](https://github.com/matrix-org/matrix-react-sdk/pull/12416)). Contributed by @florianduros. +* Expected UTDs: report a different Posthog code ([#12389](https://github.com/matrix-org/matrix-react-sdk/pull/12389)). Contributed by @richvdh. + +## 🐛 Bug Fixes + +* TAC: Fix accessibility issue when the Release announcement is displayed ([#12484](https://github.com/matrix-org/matrix-react-sdk/pull/12484)). Contributed by @RiotRobot. +* TAC: Close Release Announcement when TAC button is clicked ([#12485](https://github.com/matrix-org/matrix-react-sdk/pull/12485)). Contributed by @florianduros. +* MenuItem: fix caption usage ([#12455](https://github.com/matrix-org/matrix-react-sdk/pull/12455)). Contributed by @florianduros. +* Show the local echo in previews ([#12451](https://github.com/matrix-org/matrix-react-sdk/pull/12451)). Contributed by @langleyd. +* Fixed the drag and drop of X #27186 ([#12450](https://github.com/matrix-org/matrix-react-sdk/pull/12450)). Contributed by @asimdelvi. +* Move the TAC to above the button ([#12438](https://github.com/matrix-org/matrix-react-sdk/pull/12438)). Contributed by @dbkr. +* Use the same logic in previews as the timeline to hide events that should be hidden ([#12434](https://github.com/matrix-org/matrix-react-sdk/pull/12434)). Contributed by @langleyd. +* Fix selector so maths support doesn't mangle divs ([#12433](https://github.com/matrix-org/matrix-react-sdk/pull/12433)). Contributed by @uhoreg. + + Changes in [3.98.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.98.0) (2024-04-23) ===================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index eae134822e..01e1ff56c5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "matrix-react-sdk", "version": "0.0.0", - "version-matrix": "3.98.0", + "version-matrix": "3.100.0-rc.0", "description": "SDK for matrix.org using React for Tchap", "author": "DINUM", "repository": { @@ -61,14 +61,14 @@ "lint:workflows": "find .github/workflows -type f \\( -iname '*.yaml' -o -iname '*.yml' \\) | xargs -I {} sh -c 'echo \"Linting {}\"; action-validator \"{}\"'" }, "resolutions": { - "@types/react-dom": "17.0.21", - "@types/react": "17.0.68", + "@types/react-dom": "17.0.25", + "@types/react": "17.0.80", "oidc-client-ts": "3.0.1", "jwt-decode": "4.0.0" }, "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/analytics-events": "^0.19.0", + "@matrix-org/analytics-events": "^0.20.0", "@matrix-org/emojibase-bindings": "^1.1.2", "@matrix-org/matrix-wysiwyg": "2.17.0", "@matrix-org/olm": "3.2.15", @@ -77,7 +77,7 @@ "@sentry/browser": "^7.0.0", "@testing-library/react-hooks": "^8.0.1", "@vector-im/compound-design-tokens": "^1.2.0", - "@vector-im/compound-web": "^3.3.1", + "@vector-im/compound-web": "^4.2.0", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", @@ -109,7 +109,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "32.1.0", + "matrix-js-sdk": "32.3.0-rc.0", "matrix-widget-api": "^1.5.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", @@ -117,7 +117,7 @@ "opus-recorder": "^8.0.3", "pako": "^2.0.3", "png-chunks-extract": "^1.0.0", - "posthog-js": "1.116.6", + "posthog-js": "1.130.1", "proposal-temporal": "^0.9.0", "qrcode": "1.5.3", "re-resizable": "^6.9.0", @@ -177,9 +177,9 @@ "@types/node-fetch": "^2.6.2", "@types/pako": "^2.0.0", "@types/qrcode": "^1.3.5", - "@types/react": "17.0.68", + "@types/react": "17.0.80", "@types/react-beautiful-dnd": "^13.0.0", - "@types/react-dom": "17.0.21", + "@types/react-dom": "17.0.25", "@types/react-transition-group": "^4.4.0", "@types/sanitize-html": "2.11.0", "@types/sdp-transform": "^2.4.6", @@ -196,12 +196,12 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-deprecate": "0.8.4", "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jest": "^28.0.0", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-matrix-org": "1.2.1", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unicorn": "^51.0.0", + "eslint-plugin-unicorn": "^52.0.0", "express": "^4.18.2", "fake-indexeddb": "^5.0.2", "fetch-mock-jest": "^1.5.1", @@ -224,7 +224,7 @@ "stylelint-config-standard": "^36.0.0", "stylelint-scss": "^6.0.0", "ts-node": "^10.9.1", - "typescript": "5.4.3" + "typescript": "5.4.5" }, "peerDependencies": { "postcss": "^8.4.19", diff --git a/playwright.config.ts b/playwright.config.ts index 40065b92c4..96a8dd95ec 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -41,7 +41,7 @@ export default defineConfig({ outputDir: "playwright/test-results", workers: 1, retries: process.env.CI ? 2 : 0, - reporter: process.env.CI ? "blob" : [["html", { outputFolder: "playwright/html-report" }]], + reporter: process.env.CI ? [["blob"], ["github"]] : [["html", { outputFolder: "playwright/html-report" }]], projects: [ { name: "Legacy Crypto", diff --git a/playwright/Dockerfile b/playwright/Dockerfile index f13d7a2c68..46d617ccc2 100644 --- a/playwright/Dockerfile +++ b/playwright/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/playwright:v1.42.1-jammy +FROM mcr.microsoft.com/playwright:v1.43.1-jammy WORKDIR /work/matrix-react-sdk VOLUME ["/work/element-web/node_modules"] diff --git a/playwright/e2e/crypto/crypto.spec.ts b/playwright/e2e/crypto/crypto.spec.ts index 957be58711..326aeaff8e 100644 --- a/playwright/e2e/crypto/crypto.spec.ts +++ b/playwright/e2e/crypto/crypto.spec.ts @@ -1,5 +1,5 @@ /* -Copyright 2022 The Matrix.org Foundation C.I.C. +Copyright 2022-2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,19 +15,24 @@ limitations under the License. */ import type { Page } from "@playwright/test"; -import { test, expect } from "../../element-web-test"; +import type { EmittedEvents, Preset } from "matrix-js-sdk/src/matrix"; +import { expect, test } from "../../element-web-test"; import { + copyAndContinue, + createRoom, createSharedRoomWithUser, doTwoWaySasVerification, - copyAndContinue, enableKeyBackup, logIntoElement, logOutOfElement, + sendMessageInCurrentRoom, + verifySession, waitForVerificationRequest, } from "./utils"; import { Bot } from "../../pages/bot"; import { ElementAppPage } from "../../pages/ElementAppPage"; import { Client } from "../../pages/client"; +import { isDendrite } from "../../plugins/homeserver/dendrite"; const openRoomInfo = async (page: Page) => { await page.getByRole("button", { name: "Room info" }).click(); @@ -453,8 +458,8 @@ test.describe("Cryptography", function () { // no e2e icon await expect(lastTileE2eIcon).not.toBeVisible(); - // It can take up to 10 seconds for the key to be backed up. We don't really have much option other than - // to wait :/ + // Workaround for https://github.com/element-hq/element-web/issues/27267. It can take up to 10 seconds for + // the key to be backed up. await page.waitForTimeout(10000); /* log out, and back in */ @@ -532,4 +537,281 @@ test.describe("Cryptography", function () { ).not.toBeVisible(); }); }); + + test.describe("decryption failure messages", () => { + test("should handle device-relative historical messages", async ({ + homeserver, + page, + app, + credentials, + user, + cryptoBackend, + }) => { + test.skip(cryptoBackend === "legacy", "Not implemented for legacy crypto"); + test.setTimeout(60000); + + // Start with a logged-in session, without key backup, and send a message. + await createRoom(page, "Test room", true); + await sendMessageInCurrentRoom(page, "test test"); + + // Log out, discarding the key for the sent message. + await logOutOfElement(page, true); + + // Log in again, and see how the message looks. + await logIntoElement(page, homeserver, credentials); + await app.viewRoomByName("Test room"); + const lastTile = page.locator(".mx_EventTile").last(); + await expect(lastTile).toContainText("Historical messages are not available on this device"); + await expect(lastTile.locator(".mx_EventTile_e2eIcon_decryption_failure")).toBeVisible(); + + // Now, we set up key backup, and then send another message. + const secretStorageKey = await enableKeyBackup(app); + await app.viewRoomByName("Test room"); + await sendMessageInCurrentRoom(page, "test2 test2"); + + // Workaround for https://github.com/element-hq/element-web/issues/27267. It can take up to 10 seconds for + // the key to be backed up. + await page.waitForTimeout(10000); + + // Finally, log out again, and back in, skipping verification for now, and see what we see. + await logOutOfElement(page); + await logIntoElement(page, homeserver, credentials); + await page.locator(".mx_AuthPage").getByRole("button", { name: "Skip verification for now" }).click(); + await page.locator(".mx_AuthPage").getByRole("button", { name: "I'll verify later" }).click(); + await app.viewRoomByName("Test room"); + + // There should be two historical events in the timeline + const tiles = await page.locator(".mx_EventTile").all(); + expect(tiles.length).toBeGreaterThanOrEqual(2); + // look at the last two tiles only + for (const tile of tiles.slice(-2)) { + await expect(tile).toContainText("You need to verify this device for access to historical messages"); + await expect(tile.locator(".mx_EventTile_e2eIcon_decryption_failure")).toBeVisible(); + } + + // Now verify our device (setting up key backup), and check what happens + await verifySession(app, secretStorageKey); + const tilesAfterVerify = (await page.locator(".mx_EventTile").all()).slice(-2); + + // The first message still cannot be decrypted, because it was never backed up. It's now a regular UTD though. + await expect(tilesAfterVerify[0]).toContainText("Unable to decrypt message"); + await expect(tilesAfterVerify[0].locator(".mx_EventTile_e2eIcon_decryption_failure")).toBeVisible(); + + // The second message should now be decrypted, with a grey shield + await expect(tilesAfterVerify[1]).toContainText("test2 test2"); + await expect(tilesAfterVerify[1].locator(".mx_EventTile_e2eIcon_normal")).toBeVisible(); + }); + + test.describe("non-joined historical messages", () => { + test.skip(isDendrite, "does not yet support membership on events"); + + test("should display undecryptable non-joined historical messages with a different message", async ({ + homeserver, + page, + app, + credentials: aliceCredentials, + user: alice, + cryptoBackend, + bot: bob, + }) => { + test.skip(cryptoBackend === "legacy", "Not implemented for legacy crypto"); + + // Bob creates an encrypted room and sends a message to it. He then invites Alice + const roomId = await bob.evaluate( + async (client, { alice }) => { + const encryptionStatePromise = new Promise((resolve) => { + client.on("RoomState.events" as EmittedEvents, (event, _state, _lastStateEvent) => { + if (event.getType() === "m.room.encryption") { + resolve(); + } + }); + }); + + const { room_id: roomId } = await client.createRoom({ + initial_state: [ + { + type: "m.room.encryption", + content: { + algorithm: "m.megolm.v1.aes-sha2", + }, + }, + ], + name: "Test room", + preset: "private_chat" as Preset, + }); + + // wait for m.room.encryption event, so that when we send a + // message, it will be encrypted + await encryptionStatePromise; + + await client.sendTextMessage(roomId, "This should be undecryptable"); + + await client.invite(roomId, alice.userId); + + return roomId; + }, + { alice }, + ); + + // Alice accepts the invite + await expect( + page.getByRole("group", { name: "Invites" }).locator(".mx_RoomSublist_tiles").getByRole("treeitem"), + ).toHaveCount(1); + await page.getByRole("treeitem", { name: "Test room" }).click(); + await page.locator(".mx_RoomView").getByRole("button", { name: "Accept" }).click(); + + // Bob sends an encrypted event and an undecryptable event + await bob.evaluate( + async (client, { roomId }) => { + await client.sendTextMessage(roomId, "This should be decryptable"); + await client.sendEvent( + roomId, + "m.room.encrypted" as any, + { + algorithm: "m.megolm.v1.aes-sha2", + ciphertext: "this+message+will+be+undecryptable", + device_id: client.getDeviceId()!, + sender_key: (await client.getCrypto()!.getOwnDeviceKeys()).ed25519, + session_id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + } as any, + ); + }, + { roomId }, + ); + + // We wait for the event tiles that we expect from the messages that + // Bob sent, in sequence. + await expect( + page.locator(`.mx_EventTile`).getByText("You don't have access to this message"), + ).toBeVisible(); + await expect(page.locator(`.mx_EventTile`).getByText("This should be decryptable")).toBeVisible(); + await expect(page.locator(`.mx_EventTile`).getByText("Unable to decrypt message")).toBeVisible(); + + // And then we ensure that they are where we expect them to be + // Alice should see these event tiles: + // - first message sent by Bob (undecryptable) + // - Bob invited Alice + // - Alice joined the room + // - second message sent by Bob (decryptable) + // - third message sent by Bob (undecryptable) + const tiles = await page.locator(".mx_EventTile").all(); + expect(tiles.length).toBeGreaterThanOrEqual(5); + + // The first message from Bob was sent before Alice was in the room, so should + // be different from the standard UTD message + await expect(tiles[tiles.length - 5]).toContainText("You don't have access to this message"); + await expect(tiles[tiles.length - 5].locator(".mx_EventTile_e2eIcon_decryption_failure")).toBeVisible(); + + // The second message from Bob should be decryptable + await expect(tiles[tiles.length - 2]).toContainText("This should be decryptable"); + // this tile won't have an e2e icon since we got the key from the sender + + // The third message from Bob is undecryptable, but was sent while Alice was + // in the room and is expected to be decryptable, so this should have the + // standard UTD message + await expect(tiles[tiles.length - 1]).toContainText("Unable to decrypt message"); + await expect(tiles[tiles.length - 1].locator(".mx_EventTile_e2eIcon_decryption_failure")).toBeVisible(); + }); + + test("should be able to jump to a message sent before our last join event", async ({ + homeserver, + page, + app, + credentials: aliceCredentials, + user: alice, + cryptoBackend, + bot: bob, + }) => { + // The old pre-join UTD hiding code would hide events sent + // before our latest join event, even if the event that we're + // jumping to was decryptable. We test that this no longer happens. + + test.skip(cryptoBackend === "legacy", "Not implemented for legacy crypto"); + + // Bob: + // - creates an encrypted room, + // - invites Alice, + // - sends a message to it, + // - kicks Alice, + // - sends a bunch more events + // - invites Alice again + // In this way, there will be an event that Alice can decrypt, + // followed by a bunch of undecryptable events which Alice shouldn't + // expect to be able to decrypt. The old code would have hidden all + // the events, even the decryptable event (which it wouldn't have + // even tried to fetch, if it was far enough back). + const { roomId, eventId } = await bob.evaluate( + async (client, { alice }) => { + const { room_id: roomId } = await client.createRoom({ + initial_state: [ + { + type: "m.room.encryption", + content: { + algorithm: "m.megolm.v1.aes-sha2", + }, + }, + ], + name: "Test room", + preset: "private_chat" as Preset, + }); + + // invite Alice + const inviteAlicePromise = new Promise((resolve) => { + client.on("RoomMember.membership" as EmittedEvents, (_event, member, _oldMembership?) => { + if (member.userId === alice.userId && member.membership === "invite") { + resolve(); + } + }); + }); + await client.invite(roomId, alice.userId); + // wait for the invite to come back so that we encrypt to Alice + await inviteAlicePromise; + + // send a message that Alice should be able to decrypt + const { event_id: eventId } = await client.sendTextMessage( + roomId, + "This should be decryptable", + ); + + // kick Alice + const kickAlicePromise = new Promise((resolve) => { + client.on("RoomMember.membership" as EmittedEvents, (_event, member, _oldMembership?) => { + if (member.userId === alice.userId && member.membership === "leave") { + resolve(); + } + }); + }); + await client.kick(roomId, alice.userId); + await kickAlicePromise; + + // send a bunch of messages that Alice won't be able to decrypt + for (let i = 0; i < 20; i++) { + await client.sendTextMessage(roomId, `${i}`); + } + + // invite Alice again + await client.invite(roomId, alice.userId); + + return { roomId, eventId }; + }, + { alice }, + ); + + // Alice accepts the invite + await expect( + page.getByRole("group", { name: "Invites" }).locator(".mx_RoomSublist_tiles").getByRole("treeitem"), + ).toHaveCount(1); + await page.getByRole("treeitem", { name: "Test room" }).click(); + await page.locator(".mx_RoomView").getByRole("button", { name: "Accept" }).click(); + + // wait until we're joined and see the timeline + await expect(page.locator(`.mx_EventTile`).getByText("Alice joined the room")).toBeVisible(); + + // we should be able to jump to the decryptable message that Bob sent + await page.goto(`#/room/${roomId}/${eventId}`); + + await expect(page.locator(`.mx_EventTile`).getByText("This should be decryptable")).toBeVisible(); + }); + }); + }); }); diff --git a/playwright/e2e/crypto/utils.ts b/playwright/e2e/crypto/utils.ts index d43e4c7f94..5b0bf29b97 100644 --- a/playwright/e2e/crypto/utils.ts +++ b/playwright/e2e/crypto/utils.ts @@ -14,15 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { type Page, expect, JSHandle } from "@playwright/test"; +import { expect, JSHandle, type Page } from "@playwright/test"; import type { CryptoEvent, ICreateRoomOpts, MatrixClient } from "matrix-js-sdk/src/matrix"; import type { + EmojiMapping, + ShowSasCallbacks, VerificationRequest, Verifier, - EmojiMapping, VerifierEvent, - ShowSasCallbacks, } from "matrix-js-sdk/src/crypto-api"; import { Credentials, HomeserverInstance } from "../../plugins/homeserver"; import { Client } from "../../pages/client"; @@ -148,7 +148,7 @@ export async function logIntoElement( // select homeserver await page.getByRole("button", { name: "Edit" }).click(); await page.getByRole("textbox", { name: "Other homeserver" }).fill(homeserver.config.baseUrl); - await page.getByRole("button", { name: "Continue" }).click(); + await page.getByRole("button", { name: "Continue", exact: true }).click(); // wait for the dialog to go away await expect(page.locator(".mx_ServerPickerDialog")).not.toBeVisible(); @@ -167,15 +167,40 @@ export async function logIntoElement( } } -export async function logOutOfElement(page: Page) { +/** + * Click the "sign out" option in Element, and wait for the login page to load + * + * @param page - Playwright `Page` object. + * @param discardKeys - if true, expect a "You'll lose access to your encrypted messages" dialog, and dismiss it. + */ +export async function logOutOfElement(page: Page, discardKeys: boolean = false) { await page.getByRole("button", { name: "User menu" }).click(); await page.locator(".mx_UserMenu_contextMenu").getByRole("menuitem", { name: "Sign out" }).click(); - await page.locator(".mx_Dialog .mx_QuestionDialog").getByRole("button", { name: "Sign out" }).click(); + if (discardKeys) { + await page.getByRole("button", { name: "I don't want my encrypted messages" }).click(); + } else { + await page.locator(".mx_Dialog .mx_QuestionDialog").getByRole("button", { name: "Sign out" }).click(); + } // Wait for the login page to load await page.getByRole("heading", { name: "Sign in" }).click(); } +/** + * Open the security settings, and verify the current session using the security key. + * + * @param app - `ElementAppPage` wrapper for the playwright `Page`. + * @param securityKey - The security key (i.e., 4S key), set up during a previous session. + */ +export async function verifySession(app: ElementAppPage, securityKey: string) { + const settings = await app.settings.openUserSettings("Security & Privacy"); + await settings.getByRole("button", { name: "Verify this session" }).click(); + await app.page.getByRole("button", { name: "Verify with Security Key" }).click(); + await app.page.locator(".mx_Dialog").locator('input[type="password"]').fill(securityKey); + await app.page.getByRole("button", { name: "Continue", disabled: false }).click(); + await app.page.getByRole("button", { name: "Done" }).click(); +} + /** * Given a SAS verifier for a bot client: * - wait for the bot to receive the emojis @@ -289,4 +314,9 @@ export async function createRoom(page: Page, roomName: string, isEncrypted: bool } await dialog.getByRole("button", { name: "Create room" }).click(); + + // Wait for the client to process the encryption event before carrying on (and potentially sending events). + if (isEncrypted) { + await expect(page.getByText("Encryption enabled")).toBeVisible(); + } } diff --git a/playwright/e2e/login/overwrite_login.spec.ts b/playwright/e2e/login/overwrite_login.spec.ts index b047cfa3dd..7ef8769c9d 100644 --- a/playwright/e2e/login/overwrite_login.spec.ts +++ b/playwright/e2e/login/overwrite_login.spec.ts @@ -18,7 +18,9 @@ import { test, expect } from "../../element-web-test"; import { logIntoElement } from "../crypto/utils"; test.describe("Overwrite login action", () => { - test("Try replace existing login with new one", async ({ page, app, credentials, homeserver }) => { + // This seems terminally flakey: https://github.com/element-hq/element-web/issues/27363 + // I tried verious things to try & deflake it, to no avail: https://github.com/matrix-org/matrix-react-sdk/pull/12506 + test.skip("Try replace existing login with new one", async ({ page, app, credentials, homeserver }) => { await logIntoElement(page, homeserver, credentials); const userMenu = await app.openUserMenu(); @@ -47,7 +49,6 @@ test.describe("Overwrite login action", () => { }, clientCredentials); // It should be now another user!! - const newUserMenu = await app.openUserMenu(); - await expect(newUserMenu.getByText(bobRegister.userId)).toBeVisible(); + await expect(page.getByText("Welcome BOB")).toBeVisible(); }); }); diff --git a/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts b/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts index 39b30fbab5..287ac77cd4 100644 --- a/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts +++ b/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts @@ -45,6 +45,7 @@ test.describe("1:1 chat room", () => { await expect( page.getByRole("group", { name: "Rooms" }).locator(".mx_RoomTile").getByText(user2.displayName), ).not.toBeVisible(); + await page.waitForTimeout(500); // avoid race condition with routing // open new 1:1 chat room await page.goto(`/#/user/${user2.userId}?action=chat`); diff --git a/playwright/e2e/read-receipts/editing-messages.spec.ts b/playwright/e2e/read-receipts/editing-messages.spec.ts index 49db3bdfbe..5005ad62bf 100644 --- a/playwright/e2e/read-receipts/editing-messages.spec.ts +++ b/playwright/e2e/read-receipts/editing-messages.spec.ts @@ -187,11 +187,11 @@ test.describe("Read receipts", () => { // Given we have read the thread await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); - await util.backToThreadsList(); + await util.assertReadThread("Resp1"); await util.goTo(room1); // When a message inside it is edited @@ -202,6 +202,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Msg1"); }); + test("Reading an edit of a threaded message makes the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -211,11 +212,11 @@ test.describe("Read receipts", () => { // Given an edited thread message appears after we read it await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); - await util.backToThreadsList(); + await util.assertReadThread("Resp1"); await util.goTo(room1); await util.receiveMessages(room2, [msg.editOf("Resp1", "Edit1")]); await util.assertStillRead(room2); @@ -228,6 +229,7 @@ test.describe("Read receipts", () => { await util.assertStillRead(room2); await util.assertReadThread("Msg1"); }); + test("Marking a room as read after an edit in a thread makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -241,14 +243,16 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.editOf("Resp1", "Edit1"), ]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // When I mark the room as read await util.markAsRead(room2); // Then it is read await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); + test("Editing a thread message after marking as read leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -258,7 +262,7 @@ test.describe("Read receipts", () => { // Given a room is marked as read await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.markAsRead(room2); await util.assertRead(room2); @@ -267,7 +271,9 @@ test.describe("Read receipts", () => { // Then the room remains read await util.assertStillRead(room2); + await util.assertReadThread("Msg1"); }); + test("A room with an edited threaded message is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -287,6 +293,7 @@ test.describe("Read receipts", () => { // Then is it still read await util.assertRead(room2); }); + test("A room where all threaded edits are read is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -295,20 +302,23 @@ test.describe("Read receipts", () => { }) => { await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.editOf("Resp1", "Edit1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); + await util.assertReadThread("Msg1"); await util.goTo(room1); // Make sure we are looking at room1 after reload await util.assertStillRead(room2); await util.saveAndReload(); await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); + test("A room where all threaded edits are marked as read is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -321,15 +331,17 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.editOf("Resp1", "Edit1"), ]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.markAsRead(room2); await util.assertRead(room2); + await util.assertReadThread("Msg1"); // When I restart await util.saveAndReload(); // It is still read await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); }); @@ -343,7 +355,7 @@ test.describe("Read receipts", () => { // Given I have read a thread await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.backToThreadsList(); @@ -361,6 +373,7 @@ test.describe("Read receipts", () => { await util.assertStillRead(room2); await util.assertReadThread("Edit1"); }); + test("Reading an edit of a thread root leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -386,6 +399,7 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertStillRead(room2); }); + test("Editing a thread root after reading leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -405,6 +419,7 @@ test.describe("Read receipts", () => { // Then the room stays read await util.assertStillRead(room2); }); + test("Marking a room as read after an edit of a thread root keeps it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -431,6 +446,7 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertStillRead(room2); }); + test("Editing a thread root that is a reply after marking as read leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -444,7 +460,7 @@ test.describe("Read receipts", () => { msg.replyTo("Msg", "Reply"), msg.threadedOff("Reply", "InThread"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 2); await util.markAsRead(room2); await util.assertRead(room2); @@ -458,6 +474,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Edited Reply"); }); + test("Marking a room as read after an edit of a thread root that is a reply leaves it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -472,7 +489,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Reply", "InThread"), ]); await util.receiveMessages(room2, [msg.editOf("Reply", "Edited Reply")]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 2); // When I mark the room as read await util.markAsRead(room2); diff --git a/playwright/e2e/read-receipts/high-level.spec.ts b/playwright/e2e/read-receipts/high-level.spec.ts index 897e752ac4..e237afd64a 100644 --- a/playwright/e2e/read-receipts/high-level.spec.ts +++ b/playwright/e2e/read-receipts/high-level.spec.ts @@ -224,15 +224,15 @@ test.describe("Read receipts", () => { ...msg.manyThreadedOff("Root3", many("T", 20)), ]); await util.goTo(room2); - await util.assertUnread(room2, 60); + await util.assertRead(room2); + await util.assertUnreadThread("Root1"); + await util.assertUnreadThread("Root2"); + await util.assertUnreadThread("Root3"); await util.openThread("Root1"); - await util.assertUnread(room2, 40); await util.assertReadThread("Root1"); await util.openThread("Root2"); - await util.assertUnread(room2, 20); await util.assertReadThread("Root2"); await util.openThread("Root3"); - await util.assertRead(room2); await util.assertReadThread("Root3"); // When I restart and page up to load old thread roots @@ -247,6 +247,7 @@ test.describe("Read receipts", () => { await util.assertReadThread("Root2"); await util.assertReadThread("Root3"); }); + test("Paging up to find old threads that were never read keeps the room unread", async ({ cryptoBackend, roomAlpha: room1, @@ -268,7 +269,7 @@ test.describe("Read receipts", () => { ...many("Msg", 100), ]); await util.goTo(room2); - await util.assertUnread(room2, 6); + await util.assertRead(room2); await util.assertUnreadThread("Root1"); await util.assertUnreadThread("Root2"); await util.assertUnreadThread("Root3"); @@ -278,20 +279,21 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.saveAndReload(); - // Then the room remembers it's unread + // Then the room remembers it's read // TODO: I (andyb) think this will fall in an encrypted room - await util.assertUnread(room2, 6); + await util.assertRead(room2); // And when I page up to load old thread roots await util.goTo(room2); await util.pageUp(); - // Then the room remains unread - await util.assertUnread(room2, 6); + // Then the room remains read + await util.assertRead(room2); await util.assertUnreadThread("Root1"); await util.assertUnreadThread("Root2"); await util.assertUnreadThread("Root3"); }); + test("Looking in thread view to find old threads that were never read makes the room unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -310,7 +312,7 @@ test.describe("Read receipts", () => { ...many("Msg", 100), ]); await util.goTo(room2); - await util.assertUnread(room2, 6); + await util.assertRead(room2); await util.assertUnreadThread("Root1"); await util.assertUnreadThread("Root2"); await util.assertUnreadThread("Root3"); @@ -320,20 +322,21 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.saveAndReload(); - // Then the room remembers it's unread + // Then the room remembers it's read // TODO: I (andyb) think this will fall in an encrypted room - await util.assertUnread(room2, 6); + await util.assertRead(room2); // And when I open the threads view await util.goTo(room2); await util.openThreadList(); - // Then the room remains unread - await util.assertUnread(room2, 6); + // Then the room remains read + await util.assertRead(room2); await util.assertUnreadThread("Root1"); await util.assertUnreadThread("Root2"); await util.assertUnreadThread("Root3"); }); + test("After marking room as read, paging up to find old threads that were never read leaves the room read", async ({ cryptoBackend, roomAlpha: room1, diff --git a/playwright/e2e/read-receipts/index.ts b/playwright/e2e/read-receipts/index.ts index 6b9a8381d2..4dd0450fb9 100644 --- a/playwright/e2e/read-receipts/index.ts +++ b/playwright/e2e/read-receipts/index.ts @@ -403,7 +403,7 @@ class Helpers { * tests we only open the threads panel.) */ async closeThreadsPanel() { - await this.page.locator(".mx_RightPanel").getByTitle("Close").click(); + await this.page.locator(".mx_RightPanel").getByLabel("Close").click(); await expect(this.page.locator(".mx_RightPanel")).not.toBeVisible(); } @@ -411,7 +411,7 @@ class Helpers { * Return to the list of threads, given we are viewing a single thread. */ async backToThreadsList() { - await this.page.locator(".mx_RightPanel").getByTitle("Threads").click(); + await this.page.locator(".mx_RightPanel").getByLabel("Threads").click(); } /** @@ -539,7 +539,7 @@ class Helpers { const threadPanel = this.page.locator(".mx_ThreadPanel"); await expect(threadPanel).toBeVisible(); await threadPanel.evaluate(($panel) => { - const $button = $panel.querySelector('.mx_BaseCard_back[title="Threads"]'); + const $button = $panel.querySelector('.mx_BaseCard_back[aria-label="Threads"]'); // If the Threads back button is present then click it - the // threads button can open either threads list or thread panel if ($button) { diff --git a/playwright/e2e/read-receipts/new-messages.spec.ts b/playwright/e2e/read-receipts/new-messages.spec.ts index 14434709ce..97308a4bb2 100644 --- a/playwright/e2e/read-receipts/new-messages.spec.ts +++ b/playwright/e2e/read-receipts/new-messages.spec.ts @@ -183,9 +183,13 @@ test.describe("Read receipts", () => { // When I receive a threaded message await util.receiveMessages(room2, [msg.threadedOff("Msg1", "Resp1")]); - // Then the room becomes unread - await util.assertUnread(room2, 1); + // Then the room stays read + await util.assertRead(room2); + // but the thread is unread + await util.goTo(room2); + await util.assertUnreadThread("Msg1"); }); + test("Reading the last threaded message makes the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -195,15 +199,16 @@ test.describe("Read receipts", () => { // Given a thread exists and is not read await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); // When I read it await util.openThread("Msg1"); - // The room becomes read - await util.assertRead(room2); + // The thread becomes read + await util.assertReadThread("Msg1"); }); + test("Reading a thread message makes the thread read", async ({ roomAlpha: room1, roomBeta: room2, @@ -217,19 +222,20 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg1", "Resp2"), ]); - await util.assertUnread(room2, 3); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) // When I read the main timeline await util.goTo(room2); - // Then room does appear unread - await util.assertUnread(room2, 2); + // Then room is read + await util.assertRead(room2); - // Until we open the thread + // Reading the thread causes it to become read too await util.openThread("Msg1"); await util.assertReadThread("Msg1"); await util.assertRead(room2); }); + test("Reading an older thread message leaves the thread unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -242,40 +248,19 @@ test.describe("Read receipts", () => { "ThreadRoot", ...msg.manyThreadedOff("ThreadRoot", many("InThread", 20)), ]); - await util.assertUnread(room2, 21); + await util.assertUnread(room2, 1); + await util.goTo(room2); + await util.assertUnreadThread("ThreadRoot"); + await util.goTo(room1); // When I read an older message in the thread await msg.jumpTo(room2.name, "InThread0000", true); - await util.assertUnreadLessThan(room2, 21); // Then the thread is still marked as unread await util.backToThreadsList(); await util.assertUnreadThread("ThreadRoot"); }); - test("Reading only one thread's message does not make the room read", async ({ - roomAlpha: room1, - roomBeta: room2, - util, - msg, - }) => { - // Given two threads are unread - await util.goTo(room1); - await util.receiveMessages(room2, [ - "Msg1", - msg.threadedOff("Msg1", "Resp1"), - "Msg2", - msg.threadedOff("Msg2", "Resp2"), - ]); - await util.assertUnread(room2, 4); - await util.goTo(room2); - await util.assertUnread(room2, 2); - // When I only read one of them - await util.openThread("Msg1"); - - // The room is still unread - await util.assertUnread(room2, 1); - }); test("Reading only one thread's message makes that thread read but not others", async ({ roomAlpha: room1, roomBeta: room2, @@ -290,9 +275,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg2", "Resp2"), ]); - await util.assertUnread(room2, 4); // (Sanity) + await util.assertUnread(room2, 2); // (Sanity) await util.goTo(room2); - await util.assertUnread(room2, 2); + await util.assertRead(room2); await util.assertUnreadThread("Msg1"); await util.assertUnreadThread("Msg2"); @@ -303,6 +288,7 @@ test.describe("Read receipts", () => { await util.assertReadThread("Msg1"); await util.assertUnreadThread("Msg2"); }); + test("Reading the main timeline does not mark a thread message as read", async ({ roomAlpha: room1, roomBeta: room2, @@ -316,15 +302,16 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg1", "Resp2"), ]); - await util.assertUnread(room2, 3); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) // When I read the main timeline await util.goTo(room2); - await util.assertUnread(room2, 2); + await util.assertRead(room2); // Then thread does appear unread await util.assertUnreadThread("Msg1"); }); + test("Marking a room with unread threads as read makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -338,14 +325,17 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg1", "Resp2"), ]); - await util.assertUnread(room2, 3); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) // When I mark the room as read await util.markAsRead(room2); // Then the room is read await util.assertRead(room2); + // and so are the threads + await util.assertReadThread("Msg1"); }); + test("Sending a new thread message after marking as read makes it unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -367,9 +357,11 @@ test.describe("Read receipts", () => { // Then another message appears in the thread await util.receiveMessages(room2, [msg.threadedOff("Msg1", "Resp3")]); - // Then the room becomes unread - await util.assertUnread(room2, 1); + // Then the thread becomes unread + await util.goTo(room2); + await util.assertUnreadThread("Msg1"); }); + test("Sending a new different-thread message after marking as read makes it unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -381,11 +373,8 @@ test.describe("Read receipts", () => { await util.receiveMessages(room2, ["Thread1", "Thread2", msg.threadedOff("Thread1", "t1a")]); // Make sure the message in Thread 1 has definitely arrived, so that we know for sure // that the one in Thread 2 is the latest. - await util.assertUnread(room2, 3); await util.receiveMessages(room2, [msg.threadedOff("Thread2", "t2a")]); - // Make sure the 4th message has arrived before we mark as read. - await util.assertUnread(room2, 4); // When I mark the room as read (making an unthreaded receipt for t2a) await util.markAsRead(room2); @@ -394,9 +383,11 @@ test.describe("Read receipts", () => { // Then another message appears in the other thread await util.receiveMessages(room2, [msg.threadedOff("Thread1", "t1b")]); - // Then the room becomes unread - await util.assertUnread(room2, 1); + // Then the other thread becomes unread + await util.goTo(room2); + await util.assertUnreadThread("Thread1"); }); + test("A room with a new threaded message is still unread after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -410,21 +401,26 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg1", "Resp2"), ]); - await util.assertUnread(room2, 3); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) // When I read the main timeline await util.goTo(room2); - // Then room does appear unread - await util.assertUnread(room2, 2); + // Then room appears read + await util.assertRead(room2); + /// but with an unread thread + await util.assertUnreadThread("Msg1"); await util.saveAndReload(); - await util.assertUnread(room2, 2); + await util.assertRead(room2); + await util.goTo(room2); + await util.assertUnreadThread("Msg1"); - // Until we open the thread + // Opening the thread now marks it as read await util.openThread("Msg1"); - await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); + test("A room where all threaded messages are read is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -438,17 +434,20 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Resp1"), msg.threadedOff("Msg1", "Resp2"), ]); - await util.assertUnread(room2, 3); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) await util.goTo(room2); - await util.assertUnread(room2, 2); - await util.openThread("Msg1"); await util.assertRead(room2); + await util.assertUnreadThread("Msg1"); + await util.openThread("Msg1"); + await util.assertReadThread("Msg1"); // When I restart await util.saveAndReload(); - // Then the room is still read + // Then the room & thread still read await util.assertRead(room2); + await util.goTo(room2); + await util.assertReadThread("Msg1"); }); }); @@ -462,15 +461,16 @@ test.describe("Read receipts", () => { // Given a thread exists await util.goTo(room1); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Resp1")]); - await util.assertUnread(room2, 2); // (Sanity) + await util.assertUnread(room2, 1); // (Sanity) // When I read the main timeline await util.goTo(room2); - // Then room does appear unread - await util.assertUnread(room2, 1); + // Then room doesn't appear unread but the thread does + await util.assertRead(room2); await util.assertUnreadThread("Msg1"); }); + test("Reading a thread root within the thread view marks it as read in the main timeline", async ({ roomAlpha: room1, roomBeta: room2, @@ -485,7 +485,7 @@ test.describe("Read receipts", () => { msg.threadedOff("ThreadRoot", "InThread"), ...many("afterThread", 30), ]); - await util.assertUnread(room2, 62); // Sanity + await util.assertUnread(room2, 61); // Sanity // When I jump to an old message and read the thread await msg.jumpTo(room2.name, "beforeThread0000"); @@ -496,6 +496,7 @@ test.describe("Read receipts", () => { // 30 remaining messages are unread - 7 messages are displayed under the thread root await util.assertUnread(room2, 30 - 7); }); + test("Creating a new thread based on a reply makes the room unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -513,10 +514,12 @@ test.describe("Read receipts", () => { // When I receive a thread message created on the reply await util.receiveMessages(room2, [msg.threadedOff("Reply1", "Resp1")]); - // Then the room is unread - await util.assertUnread(room2, 1); + // Then the thread is unread + await util.goTo(room2); + await util.assertUnreadThread("Reply1"); }); - test("Reading a thread whose root is a reply makes the room read", async ({ + + test("Reading a thread whose root is a reply makes the thread read", async ({ roomAlpha: room1, roomBeta: room2, util, @@ -529,9 +532,9 @@ test.describe("Read receipts", () => { msg.replyTo("Msg1", "Reply1"), msg.threadedOff("Reply1", "Resp1"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 2); await util.goTo(room2); - await util.assertUnread(room2, 1); + await util.assertRead(room2); await util.assertUnreadThread("Reply1"); // When I read the thread diff --git a/playwright/e2e/read-receipts/reactions.spec.ts b/playwright/e2e/read-receipts/reactions.spec.ts index 1063c7d19e..69208e5fc9 100644 --- a/playwright/e2e/read-receipts/reactions.spec.ts +++ b/playwright/e2e/read-receipts/reactions.spec.ts @@ -107,10 +107,11 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); + await util.assertReadThread("Msg1"); await util.goTo(room1); // When someone reacts to a thread message @@ -118,7 +119,9 @@ test.describe("Read receipts", () => { // Then the room remains read await util.assertStillRead(room2); + await util.assertReadThread("Msg1"); }); + test("Marking a room as read after a reaction in a thread makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -133,7 +136,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Reply1"), msg.reactionTo("Reply1", "🪿"), ]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // When I mark the room as read await util.markAsRead(room2); @@ -141,6 +144,7 @@ test.describe("Read receipts", () => { // Then it becomes read await util.assertRead(room2); }); + test("Reacting to a thread message after marking as read does not make the room unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -155,7 +159,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Msg1", "Reply1"), msg.reactionTo("Reply1", "🪿"), ]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.markAsRead(room2); await util.assertRead(room2); @@ -164,7 +168,10 @@ test.describe("Read receipts", () => { // Then the room remains read await util.assertStillRead(room2); + // as does the thread + await util.assertReadThread("Msg1"); }); + test("A room with a reaction to a threaded message is still unread after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -175,22 +182,25 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); await util.goTo(room1); - // And someone reacted to it, which doesn't stop it being read + // And someone reacted to it, which doesn't make it read await util.receiveMessages(room2, [msg.reactionTo("Reply1", "🪿")]); await util.assertStillRead(room2); + await util.assertReadThread("Msg1"); // When I restart await util.saveAndReload(); // Then the room is still read await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); + test("A room where all reactions in threads are read is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -213,7 +223,7 @@ test.describe("Read receipts", () => { msg.reactionTo("Reply2b", "c"), msg.reactionTo("Reply1b", "t"), ]); - await util.assertUnread(room2, 6); + await util.assertUnread(room2, 2); await util.goTo(room2); await util.openThread("Msg1"); await util.assertReadThread("Msg1"); @@ -231,6 +241,7 @@ test.describe("Read receipts", () => { await util.assertReadThread("Msg1"); await util.assertReadThread("Msg2"); }); + test("Can remove a reaction in a thread", async ({ page, roomAlpha: room1, @@ -247,7 +258,7 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1a")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // When I react to a thread message await util.goTo(room2); @@ -283,10 +294,11 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); + await util.assertReadThread("Msg1"); // When someone reacts to it await util.goTo(room1); @@ -295,7 +307,10 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + // as is the thread + await util.assertReadThread("Msg1"); }); + test("Reading a reaction to a thread root leaves the room read", async ({ page, roomAlpha: room1, @@ -307,7 +322,7 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Msg1"); await util.assertRead(room2); @@ -316,6 +331,7 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.receiveMessages(room2, [msg.reactionTo("Msg1", "🪿")]); await util.assertRead(room2); + await util.assertReadThread("Msg1"); // When we read the reaction and go away again await util.goTo(room2); @@ -326,7 +342,9 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + await util.assertReadThread("Msg1"); }); + test("Reacting to a thread root after marking as read makes the room unread but not the thread", async ({ page, roomAlpha: room1, @@ -338,11 +356,12 @@ test.describe("Read receipts", () => { await util.goTo(room1); await util.assertRead(room2); await util.receiveMessages(room2, ["Msg1", msg.threadedOff("Msg1", "Reply1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // And we have marked the room as read await util.markAsRead(room2); await util.assertRead(room2); + await util.assertReadThread("Msg1"); // When someone reacts to it await util.receiveMessages(room2, [msg.reactionTo("Msg1", "🪿")]); @@ -350,6 +369,8 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + // as is the thread + await util.assertReadThread("Msg1"); }); }); }); diff --git a/playwright/e2e/read-receipts/read-receipts.spec.ts b/playwright/e2e/read-receipts/read-receipts.spec.ts index 36f74e2c64..dac679f6a0 100644 --- a/playwright/e2e/read-receipts/read-receipts.spec.ts +++ b/playwright/e2e/read-receipts/read-receipts.spec.ts @@ -16,9 +16,10 @@ limitations under the License. import type { JSHandle } from "@playwright/test"; import type { MatrixEvent, ISendEventResponse, ReceiptType } from "matrix-js-sdk/src/matrix"; -import { test, expect } from "../../element-web-test"; +import { expect } from "../../element-web-test"; import { ElementAppPage } from "../../pages/ElementAppPage"; import { Bot } from "../../pages/bot"; +import { test } from "."; test.describe("Read receipts", () => { test.use({ @@ -189,29 +190,31 @@ test.describe("Read receipts", () => { page, app, bot, + util, }) => { // Given we sent 3 events on the main thread const main1 = await sendMessage(bot); const thread1a = await botSendThreadMessage(bot, main1.event_id); await botSendThreadMessage(bot, main1.event_id); - // 1 unread on the main thread, 2 in the new thread - await expect(page.getByLabel(`${otherRoomName} 3 unread messages.`)).toBeVisible(); + // 1 unread on the main thread, 2 in the new thread that aren't shown + await expect(page.getByLabel(`${otherRoomName} 1 unread message.`)).toBeVisible(); // When we send receipts for main, and the second-last in the thread await sendThreadedReadReceipt(app, main1); await sendThreadedReadReceipt(app, thread1a, main1); // Then the room has only one unread - the one in the thread - await expect(page.getByLabel(`${otherRoomName} 1 unread message.`)).toBeVisible(); + await util.goTo(otherRoomName); + await util.assertUnreadThread("Message 1"); }); - test("Considers room read if there are receipts for main and other thread", async ({ page, app, bot }) => { + test("Considers room read if there are receipts for main and other thread", async ({ page, app, bot, util }) => { // Given we sent 3 events on the main thread const main1 = await sendMessage(bot); await botSendThreadMessage(bot, main1.event_id); const thread1b = await botSendThreadMessage(bot, main1.event_id); - // 1 unread on the main thread, 2 in the new thread - await expect(page.getByLabel(`${otherRoomName} 3 unread messages.`)).toBeVisible(); + // 1 unread on the main thread, 2 in the new thread which don't show + await expect(page.getByLabel(`${otherRoomName} 1 unread message.`)).toBeVisible(); // When we send receipts for main, and the last in the thread await sendThreadedReadReceipt(app, main1); @@ -219,27 +222,33 @@ test.describe("Read receipts", () => { // Then the room has no unreads await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible(); + await util.goTo(otherRoomName); + await util.assertReadThread("Message 1"); }); test("Recognises unread messages on a thread after receiving a unthreaded receipt for earlier ones", async ({ page, app, bot, + util, }) => { // Given we sent 3 events on the main thread const main1 = await sendMessage(bot); const thread1a = await botSendThreadMessage(bot, main1.event_id); await botSendThreadMessage(bot, main1.event_id); - // 1 unread on the main thread, 2 in the new thread - await expect(page.getByLabel(`${otherRoomName} 3 unread messages.`)).toBeVisible(); + // 1 unread on the main thread, 2 in the new thread which don't count + await expect(page.getByLabel(`${otherRoomName} 1 unread message.`)).toBeVisible(); // When we send an unthreaded receipt for the second-last in the thread await sendUnthreadedReadReceipt(app, thread1a); // Then the room has only one unread - the one in the // thread. The one in main is read because the unthreaded - // receipt is for a later event. - await expect(page.getByLabel(`${otherRoomName} 1 unread message.`)).toBeVisible(); + // receipt is for a later event. The room should therefore be + // read, and the thread unread. + await expect(page.getByLabel(`${otherRoomName}`)).toBeVisible(); + await util.goTo(otherRoomName); + await util.assertUnreadThread("Message 1"); }); test("Recognises unread messages on main after receiving a unthreaded receipt for a thread message", async ({ @@ -252,8 +261,8 @@ test.describe("Read receipts", () => { await botSendThreadMessage(bot, main1.event_id); const thread1b = await botSendThreadMessage(bot, main1.event_id); await sendMessage(bot); - // 2 unreads on the main thread, 2 in the new thread - await expect(page.getByLabel(`${otherRoomName} 4 unread messages.`)).toBeVisible(); + // 2 unreads on the main thread, 2 in the new thread which don't count + await expect(page.getByLabel(`${otherRoomName} 2 unread messages.`)).toBeVisible(); // When we send an unthreaded receipt for the last in the thread await sendUnthreadedReadReceipt(app, thread1b); diff --git a/playwright/e2e/read-receipts/redactions.spec.ts b/playwright/e2e/read-receipts/redactions.spec.ts index 1b5751acbc..f7affbed21 100644 --- a/playwright/e2e/read-receipts/redactions.spec.ts +++ b/playwright/e2e/read-receipts/redactions.spec.ts @@ -344,18 +344,23 @@ test.describe("Read receipts", () => { "Root2", msg.threadedOff("Root2", "Root2->A"), ]); - await util.assertUnread(room2, 5); + await util.assertUnread(room2, 2); - // And I have read them await util.goTo(room2); await util.assertUnreadThread("Root1"); + await util.assertUnreadThread("Root2"); + + // And I have read them + await util.assertUnreadThread("Root1"); await util.openThread("Root1"); - await util.assertUnreadLessThan(room2, 4); - await util.openThread("Root2"); await util.assertRead(room2); + await util.backToThreadsList(); + await util.assertReadThread("Root1"); + + await util.openThread("Root2"); + await util.assertReadThread("Root2"); await util.closeThreadsPanel(); await util.goTo(room1); - await util.assertRead(room2); // When the latest message in a thread is redacted await util.receiveMessages(room2, [msg.redactionOf("ThreadMsg2")]); @@ -365,6 +370,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root1"); }); + test("Reading an unread thread after a redaction of the latest message makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -378,9 +384,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("ThreadMsg2")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.assertUnreadThread("Root"); @@ -395,6 +401,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root"); }); + test("Reading an unread thread after a redaction of the latest message makes it read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -408,9 +415,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("ThreadMsg2")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.assertUnreadThread("Root"); await util.openThread("Root"); @@ -424,9 +431,12 @@ test.describe("Read receipts", () => { // When I restart await util.saveAndReload(); - // Then the room is still read + // Then the room and thread are still read await util.assertRead(room2); + await util.openThreadList(); + await util.assertReadThread("Root"); }); + test("Reading an unread thread after a redaction of an older message makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -440,9 +450,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("ThreadMsg1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.assertUnreadThread("Root"); @@ -457,6 +467,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root"); }); + test("Marking an unread thread as read after a redaction makes it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -470,9 +481,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("ThreadMsg1")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // When I mark the room as read await util.markAsRead(room2); @@ -483,6 +494,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root"); }); + test("Sending and redacting a message after marking the thread as read leaves it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -496,20 +508,22 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.markAsRead(room2); await util.assertRead(room2); // When I send and redact a message await util.receiveMessages(room2, [msg.threadedOff("Root", "Msg3")]); - await util.assertUnread(room2, 1); + await util.goTo(room2); + await util.openThreadList(); + await util.assertUnreadThread("Root"); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); // Then the room and thread are read - await util.assertRead(room2); await util.goTo(room2); await util.assertReadThread("Root"); }); + test("Redacting a message after marking the thread as read leaves it read", async ({ roomAlpha: room1, roomBeta: room2, @@ -523,7 +537,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.markAsRead(room2); await util.assertRead(room2); @@ -535,6 +549,7 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root"); }); + test("Reacting to a redacted message leaves the thread read", async ({ roomAlpha: room1, roomBeta: room2, @@ -548,21 +563,27 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg2")]); - await util.assertUnread(room2, 2); - await util.goTo(room2); await util.assertUnread(room2, 1); + await util.goTo(room2); + await util.assertRead(room2); await util.openThread("Root"); await util.assertRead(room2); + await util.backToThreadsList(); + await util.assertReadThread("Root"); await util.goTo(room1); // When we receive a reaction to the redacted event await util.receiveMessages(room2, [msg.reactionTo("Msg2", "z")]); - // Then the room is unread + // Then the room is read await util.assertStillRead(room2); + await util.goTo(room2); + await util.openThreadList(); + await util.assertReadThread("Root"); }); + test("Editing a redacted message leaves the thread read", async ({ roomAlpha: room1, roomBeta: room2, @@ -576,13 +597,15 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg2")]); - await util.assertUnread(room2, 2); - await util.goTo(room2); await util.assertUnread(room2, 1); - await util.openThread("Root"); + await util.goTo(room2); await util.assertRead(room2); + await util.openThreadList(); + await util.assertUnreadThread("Root"); + await util.openThread("Root"); + await util.assertReadThread("Root"); await util.goTo(room1); // When we receive an edit of the redacted message @@ -590,7 +613,12 @@ test.describe("Read receipts", () => { // Then the room is unread await util.assertStillRead(room2); + // and so is the thread + await util.goTo(room2); + await util.openThreadList(); + await util.assertReadThread("Root"); }); + test("Reading a thread after a reaction to a redacted message marks the thread as read", async ({ roomAlpha: room1, roomBeta: room2, @@ -605,9 +633,9 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg3"), msg.reactionTo("Msg3", "x"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // When we read the thread await util.goTo(room2); @@ -617,6 +645,7 @@ test.describe("Read receipts", () => { await util.assertRead(room2); await util.assertReadThread("Root"); }); + test("Reading a thread containing a redacted, edited message marks the thread as read", async ({ roomAlpha: room1, roomBeta: room2, @@ -631,7 +660,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg3"), msg.editOf("Msg3", "Msg3 Edited"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); // When we read the thread @@ -642,6 +671,7 @@ test.describe("Read receipts", () => { await util.assertRead(room2); await util.assertReadThread("Root"); }); + test("Reading a reply to a redacted message marks the thread as read", async ({ roomAlpha: room1, roomBeta: room2, @@ -656,7 +686,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg3"), msg.replyTo("Msg3", "Msg3Reply"), ]); - await util.assertUnread(room2, 4); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); // When we read the thread, creating a receipt that points at the edit @@ -667,6 +697,7 @@ test.describe("Read receipts", () => { await util.assertRead(room2); await util.assertReadThread("Root"); }); + test("Reading a thread root when its only message has been redacted leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -676,7 +707,7 @@ test.describe("Read receipts", () => { // Given we had a thread await util.goTo(room1); await util.receiveMessages(room2, ["Root", msg.threadedOff("Root", "Msg2")]); - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // And then redacted the message that makes it a thread await util.receiveMessages(room2, [msg.redactionOf("Msg2")]); @@ -687,7 +718,11 @@ test.describe("Read receipts", () => { // Then the room is read await util.assertRead(room2); + // and that thread is read + await util.openThreadList(); + await util.assertReadThread("Root"); }); + test("A thread with a redacted unread is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -701,13 +736,13 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "ThreadMsg1"), msg.threadedOff("Root", "ThreadMsg2"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); await util.assertReadThread("Root"); await util.receiveMessages(room2, [msg.threadedOff("Root", "Msg3")]); - await util.assertUnread(room2, 1); + await util.assertRead(room2); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); await util.assertRead(room2); await util.goTo(room2); @@ -722,7 +757,13 @@ test.describe("Read receipts", () => { await util.goTo(room2); await util.assertReadThread("Root"); }); - test("A thread with a read redaction is still read after restart", async ({ + + /* + * Disabled: this doesn't seem to work as, at some point after syncing from cache, the redaction and redacted + * event get removed from the thread timeline such that we have no record of the events that the read receipt + * points to. I suspect this may have been passing by fluke before. + */ + test.skip("A thread with a read redaction is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, util, @@ -737,11 +778,11 @@ test.describe("Read receipts", () => { "Root2", msg.threadedOff("Root2", "Root2->A"), ]); - await util.assertUnread(room2, 5); + await util.assertUnread(room2, 2); await util.goTo(room2); await util.assertUnreadThread("Root1"); await util.openThread("Root1"); - await util.assertUnreadLessThan(room2, 4); + await util.assertRead(room2); await util.openThread("Root2"); await util.assertRead(room2); await util.closeThreadsPanel(); @@ -757,7 +798,12 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + // and so is the thread + await util.openThreadList(); + await util.assertReadThread("Root1"); + await util.assertReadThread("Root2"); }); + test("A thread with an unread reply to a redacted message is still unread after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -772,7 +818,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg3"), msg.replyTo("Msg3", "Msg3Reply"), ]); - await util.assertUnread(room2, 4); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); // And we have read all this @@ -788,6 +834,7 @@ test.describe("Read receipts", () => { await util.assertRead(room2); await util.assertReadThread("Root"); }); + test("A thread with a read reply to a redacted message is still read after restart", async ({ roomAlpha: room1, roomBeta: room2, @@ -802,7 +849,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg3"), msg.replyTo("Msg3", "Msg3Reply"), ]); - await util.assertUnread(room2, 4); + await util.assertUnread(room2, 1); await util.receiveMessages(room2, [msg.redactionOf("Msg3")]); // And I read it, so the room is read @@ -836,7 +883,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); @@ -848,7 +895,12 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertStillRead(room2); }); - test("Redacting a thread root still allows us to read the thread", async ({ + + /* + * Disabled for the same reason as "A thread with a read redaction is still read after restart" + * above + */ + test.skip("Redacting a thread root still allows us to read the thread", async ({ roomAlpha: room1, roomBeta: room2, util, @@ -861,23 +913,24 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); // When someone redacts the thread root await util.receiveMessages(room2, [msg.redactionOf("Root")]); // Then the room is still unread - await util.assertUnread(room2, 2); + await util.assertUnread(room2, 1); // And I can open the thread and read it await util.goTo(room2); - await util.assertUnread(room2, 2); + await util.assertRead(room2); // The redacted message gets collapsed into, "foo was invited, joined and removed a message" await util.openCollapsedMessage(1); await util.openThread("Message deleted"); await util.assertRead(room2); await util.assertReadThread("Root"); }); + test("Sending a threaded message onto a redacted thread root leaves the room unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -891,7 +944,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); @@ -901,11 +954,12 @@ test.describe("Read receipts", () => { // When we receive a new message on it await util.receiveMessages(room2, [msg.threadedOff("Root", "Msg4")]); - // Then the room and thread are unread - await util.assertUnread(room2, 1); + // Then the room is read but the thread is unread + await util.assertRead(room2); await util.goTo(room2); await util.assertUnreadThread("Message deleted"); }); + test("Reacting to a redacted thread root leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -919,7 +973,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); @@ -931,7 +985,9 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + await util.assertReadThread("Root"); }); + test("Editing a redacted thread root leaves the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -945,7 +1001,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); @@ -957,7 +1013,10 @@ test.describe("Read receipts", () => { // Then the room is still read await util.assertRead(room2); + // as is the thread + await util.assertReadThread("Root"); }); + test("Replying to a redacted thread root makes the room unread", async ({ roomAlpha: room1, roomBeta: room2, @@ -971,7 +1030,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); @@ -984,6 +1043,7 @@ test.describe("Read receipts", () => { // Then the room is unread await util.assertUnread(room2, 1); }); + test("Reading a reply to a redacted thread root makes the room read", async ({ roomAlpha: room1, roomBeta: room2, @@ -998,7 +1058,7 @@ test.describe("Read receipts", () => { msg.threadedOff("Root", "Msg2"), msg.threadedOff("Root", "Msg3"), ]); - await util.assertUnread(room2, 3); + await util.assertUnread(room2, 1); await util.goTo(room2); await util.openThread("Root"); await util.assertRead(room2); diff --git a/playwright/e2e/settings/appearance-user-settings-tab.spec.ts b/playwright/e2e/settings/appearance-user-settings-tab.spec.ts index df091f45a8..7e16d73955 100644 --- a/playwright/e2e/settings/appearance-user-settings-tab.spec.ts +++ b/playwright/e2e/settings/appearance-user-settings-tab.spec.ts @@ -25,8 +25,6 @@ test.describe("Appearance user settings tab", () => { test("should be rendered properly", async ({ page, user, app }) => { const tab = await app.settings.openUserSettings("Appearance"); - await expect(tab.getByRole("heading", { name: "Customise your appearance" })).toBeVisible(); - // Click "Show advanced" link button await tab.getByRole("button", { name: "Show advanced" }).click(); diff --git a/playwright/e2e/settings/general-user-settings-tab.spec.ts b/playwright/e2e/settings/general-user-settings-tab.spec.ts index d6d138db5b..625f1d6bd5 100644 --- a/playwright/e2e/settings/general-user-settings-tab.spec.ts +++ b/playwright/e2e/settings/general-user-settings-tab.spec.ts @@ -125,6 +125,11 @@ test.describe("General user settings tab", () => { ); }); + test("should respond to small screen sizes", async ({ page, uut }) => { + await page.setViewportSize({ width: 700, height: 600 }); + await expect(uut).toMatchScreenshot("general-smallscreen.png"); + }); + test("should support adding and removing a profile picture", async ({ uut }) => { const profileSettings = uut.locator(".mx_ProfileSettings"); // Upload a picture diff --git a/playwright/e2e/spaces/threads-activity-centre/index.ts b/playwright/e2e/spaces/threads-activity-centre/index.ts index 7ad477541a..8bafe2e804 100644 --- a/playwright/e2e/spaces/threads-activity-centre/index.ts +++ b/playwright/e2e/spaces/threads-activity-centre/index.ts @@ -341,7 +341,7 @@ export class Helpers { */ assertThreadPanelFocused() { return expect( - this.page.locator(".mx_ThreadPanel").locator(".mx_BaseCard_header").getByTitle("Close"), + this.page.locator(".mx_ThreadPanel").locator(".mx_BaseCard_header").getByLabel("Close"), ).toBeFocused(); } diff --git a/playwright/e2e/threads/threads.spec.ts b/playwright/e2e/threads/threads.spec.ts index 5e32516646..9b5ea46511 100644 --- a/playwright/e2e/threads/threads.spec.ts +++ b/playwright/e2e/threads/threads.spec.ts @@ -495,14 +495,14 @@ test.describe("Threads", () => { await createThread("Hello again Mr. Bot", "Hello again Mr. User in a thread"); // Open thread panel - await page.getByRole("button", { name: "Threads" }).click(); + await page.getByTestId("threadsButton").click(); const threadPanel = page.locator(".mx_ThreadPanel"); await expect( threadPanel.locator(".mx_EventTile_last").getByText("Hello again Mr. User in a thread"), ).toBeVisible(); // Open threads list - await threadPanel.getByRole("button", { name: "Threads" }).click(); + await page.locator(".mx_BaseCard_back").click(); const rightPanel = page.locator(".mx_RightPanel"); // Check that the threads are listed await expect(rightPanel.locator(".mx_EventTile").getByText("Hello Mr. User in a thread")).toBeVisible(); diff --git a/playwright/e2e/timeline/timeline.spec.ts b/playwright/e2e/timeline/timeline.spec.ts index 2ca507fc9e..60aa1e2a27 100644 --- a/playwright/e2e/timeline/timeline.spec.ts +++ b/playwright/e2e/timeline/timeline.spec.ts @@ -70,6 +70,22 @@ const sendEvent = async (client: Client, roomId: string, html = false): Promise< return client.sendEvent(roomId, null, "m.room.message" as EventType, content); }; +const sendImage = async ( + client: Client, + roomId: string, + pngBytes: Buffer, + additionalContent?: any, +): Promise => { + const upload = await client.uploadContent(pngBytes, { name: "image.png", type: "image/png" }); + return client.sendEvent(roomId, null, "m.room.message" as EventType, { + ...(additionalContent ?? {}), + + msgtype: "m.image" as MsgType, + body: "image.png", + url: upload.content_uri, + }); +}; + test.describe("Timeline", () => { test.use({ displayName: OLD_NAME, @@ -1136,5 +1152,91 @@ test.describe("Timeline", () => { screenshotOptions, ); }); + + async function testImageRendering(page: Page, app: ElementAppPage, room: { roomId: string }) { + await app.viewRoomById(room.roomId); + + // Reinstall the service workers to clear their implicit caches (global-level stuff) + await page.evaluate(async () => { + const registrations = await window.navigator.serviceWorker.getRegistrations(); + registrations.forEach((r) => r.update()); + }); + + await sendImage(app.client, room.roomId, NEW_AVATAR); + await expect(page.locator(".mx_MImageBody").first()).toBeVisible(); + + // Exclude timestamp and read marker from snapshot + const screenshotOptions = { + mask: [page.locator(".mx_MessageTimestamp")], + css: ` + .mx_TopUnreadMessagesBar, .mx_MessagePanel_myReadMarker { + display: none !important; + } + `, + }; + + await expect(page.locator(".mx_ScrollPanel")).toMatchScreenshot( + "image-in-timeline-default-layout.png", + screenshotOptions, + ); + } + + test("should render images in the timeline", async ({ page, app, room, context }) => { + await testImageRendering(page, app, room); + }); + + // XXX: This test doesn't actually work because the service worker relies on IndexedDB, which Playwright forces + // to be a localstorage implementation, which service workers cannot access. + // See https://github.com/microsoft/playwright/issues/11164 + // See https://github.com/microsoft/playwright/issues/15684#issuecomment-2070862042 + // + // In practice, this means this test will *always* succeed because it ends up relying on fallback behaviour tested + // above (unless of course the above tests are also broken). + test.describe("MSC3916 - Authenticated Media", () => { + test("should render authenticated images in the timeline", async ({ page, app, room, context }) => { + // Note: we have to use `context` instead of `page` for routing, otherwise we'll miss Service Worker events. + // See https://playwright.dev/docs/service-workers-experimental#network-events-and-routing + + // Install our mocks and preventative measures + await context.route("**/_matrix/client/versions", async (route) => { + // Force enable MSC3916, which may require the service worker's internal cache to be cleared later. + const json = await (await route.fetch()).json(); + if (!json["unstable_features"]) json["unstable_features"] = {}; + json["unstable_features"]["org.matrix.msc3916"] = true; + await route.fulfill({ json }); + }); + await context.route("**/_matrix/media/*/download/**", async (route) => { + // should not be called. We don't use `abort` so that it's clearer in the logs what happened. + await route.fulfill({ + status: 500, + json: { errcode: "M_UNKNOWN", error: "Unexpected route called." }, + }); + }); + await context.route("**/_matrix/media/*/thumbnail/**", async (route) => { + // should not be called. We don't use `abort` so that it's clearer in the logs what happened. + await route.fulfill({ + status: 500, + json: { errcode: "M_UNKNOWN", error: "Unexpected route called." }, + }); + }); + await context.route("**/_matrix/client/unstable/org.matrix.msc3916/download/**", async (route) => { + expect(route.request().headers()["Authorization"]).toBeDefined(); + // we can't use route.continue() because no configured homeserver supports MSC3916 yet + await route.fulfill({ + body: NEW_AVATAR, + }); + }); + await context.route("**/_matrix/client/unstable/org.matrix.msc3916/thumbnail/**", async (route) => { + expect(route.request().headers()["Authorization"]).toBeDefined(); + // we can't use route.continue() because no configured homeserver supports MSC3916 yet + await route.fulfill({ + body: NEW_AVATAR, + }); + }); + + // We check the same screenshot because there should be no user-visible impact to using authentication. + await testImageRendering(page, app, room); + }); + }); }); }); diff --git a/playwright/e2e/user-onboarding/user-onboarding-new.spec.ts b/playwright/e2e/user-onboarding/user-onboarding-new.spec.ts index 46bca0b78b..09a140d441 100644 --- a/playwright/e2e/user-onboarding/user-onboarding-new.spec.ts +++ b/playwright/e2e/user-onboarding/user-onboarding-new.spec.ts @@ -45,7 +45,17 @@ test.describe("User Onboarding (new user)", () => { await expect( page.getByRole("dialog").getByRole("heading", { level: 1, name: "Download Element" }), ).toBeVisible(); - await expect(page.locator(".mx_Dialog")).toMatchScreenshot(); + await expect(page.locator(".mx_Dialog")).toMatchScreenshot( + "User-Onboarding-new-user-app-download-dialog-1.png", + { + // Set a constant bg behind the modal to ensure screenshot stability + css: ` + .mx_AppDownloadDialog_wrapper { + background: black; + } + `, + }, + ); }); test("using find friends action should increase progress", async ({ page, homeserver }) => { diff --git a/playwright/element-web-test.ts b/playwright/element-web-test.ts index e67cca6ab8..2317978898 100644 --- a/playwright/element-web-test.ts +++ b/playwright/element-web-test.ts @@ -33,6 +33,10 @@ import { Bot, CreateBotOpts } from "./pages/bot"; import { ProxyInstance, SlidingSyncProxy } from "./plugins/sliding-sync-proxy"; import { Webserver } from "./plugins/webserver"; +// Enable experimental service worker support +// See https://playwright.dev/docs/service-workers-experimental#how-to-enable +process.env["PW_EXPERIMENTAL_SERVICE_WORKER_NETWORK_EVENTS"] = "1"; + const CONFIG_JSON: Partial = { // This is deliberately quite a minimal config.json, so that we can test that the default settings // actually work. diff --git a/playwright/pages/settings.ts b/playwright/pages/settings.ts index 916ce26e03..c0efb6770c 100644 --- a/playwright/pages/settings.ts +++ b/playwright/pages/settings.ts @@ -25,8 +25,9 @@ export class Settings { * Open the top left user menu, returning a Locator to the resulting context menu. */ public async openUserMenu(): Promise { - await this.page.getByRole("button", { name: "User menu" }).click(); const locator = this.page.locator(".mx_ContextualMenu"); + if (await locator.locator(".mx_UserMenu_contextMenu_header").isVisible()) return locator; + await this.page.getByRole("button", { name: "User menu" }).click(); await locator.waitFor(); return locator; } diff --git a/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml b/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml index c5bea307b4..bc3ecd7c9b 100644 --- a/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml +++ b/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml @@ -96,3 +96,9 @@ oidc_providers: background_updates: min_batch_size: 100000 sleep_duration_ms: 100000 + +experimental_features: + # Needed for e2e/crypto/crypto.spec.ts > Cryptography > decryption failure + # messages > non-joined historical messages. + # Can be removed after Synapse enables it by default + msc4115_membership_on_events: true diff --git a/playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png b/playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png index d3c89613914ed772f89a1efbb53c9dbbe624641d..98c1ff245d3785068989c9167dc68f85cfd606bb 100644 GIT binary patch literal 27122 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 literal 27217 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 xjDw|-0P27@^$9sBT=;z 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 B+QR?< diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png b/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png index 44d8129404d43af592bb3865f74628e15b42330d..852cb85518cc36c97c50f3bc564cde6ddddfd9b4 100644 GIT binary patch literal 17170 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 literal 24634 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 z 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 diff --git a/playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png b/playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png index ad49c25abca364aae0a2dad17f1ca0b3d63bdd6e..b783826727428c66b3a337aed3ffefa0b8d77fbd 100644 GIT binary patch literal 40293 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 literal 40984 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 diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png b/playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png index e53470df87b85744ca4e52cd9b82baac1cbd8d4e..f383a828e2cc08872ce31dd76a5ca64b03e491ab 100644 GIT binary patch literal 34363 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%0AYHdR6vFo82EIuU!u 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 U<74+hBH+(+QE8F9C$GK!8vz5of&c&j diff --git a/playwright/snapshots/room/room-header.spec.ts/room-header-highlighted-linux.png b/playwright/snapshots/room/room-header.spec.ts/room-header-highlighted-linux.png index 5fa24a887f88e4ec2f538da0bc6836a2e0086d95..c792c4bcf0884fb85d1fe4824d2b0d868c6b9ec0 100644 GIT binary patch literal 5784 zcmb7|bySqy^S~b(kw##Nr9>2@5m=C1DQT3H1_7mO332HXq*RoWMd@bg6xk)Dky^U@ zrAuOg@A|&~|IYdS^W1x$bMKwGb7tnweBSA5t5T3LlK}ug@l;Le835qj;O2^?#JKOg zN+}g?!1H>h3I)mrST_NH;n`CqMSZ`FomqeV=MEPn`+Hg(+vyzmT+!QE!QZo@`MGv$ z1!09XFY1`4e;3v4l*^7FzxrrT|MuAWVdPXZZeAQ+V4y&xjIdZAAz7-&^Dp_SWBZkssv$uIkV|ydO>tZ3L-b;|4XxC*25YDCwrn|8Fzch2*dF zX5OMACp{DM*r~=h(H*qW9X7#u5LU{1R^mo!Y2il;Z3+qbV-TiyN?gAk331|nIcf4I zWtr&`DcaG0>MtNi|7_P~&*LFp5GJ4ItoEH>vQ4Mfi7Gye(y}xYOcnbVNAgwc>64j7?zs>jkV<#jHR2qQ|<&xdCgJ;|_Z;wGx zYrCckVNua=uRRM8jWl7WN+fe^Y3|k*v-5?&JYdz0GFdqA79aOj^k8!QXKOXk!pJD9 zK9(`*)2DDvId&by8UZd~B9g)rDL?yM%4v7Df8R73ecx@nxHe-tZ4Dz!ootAfW1mml zr{A!*j`T?S=I&XI`2|bJl#Y7*M@)S9OI_6MJWWtx(vKH>e1eJ>U&*;Gnr;E4Y%+kH z#coAqwQkeiVGLh0^{>{=hP0IEv0_7U?zcqSJ39yGUo34FekyuSr=){WqZ10He)OA( zD~PucaFe|Bx1=BTHDF?B}ChQUc+fbUvd%&dQS=tcpsX3fWyZdyxdrA)jnsp$3^yMsq)b{J7>;OcVADEIu_71 ze;)Q+Km~uo`@mCliSD_+I`&ob>vv6_6pTXmt7whPP~yq7^2|oLhy)F#!#MAn^76v= z^35OIw6`c(<36XK;c;AP6US%BOz%21Q|tF!)zx`*`QWwyxTthCZl#Q(WJ^46P~y^q z^kfN+Kg4#pwh|-NPN|&#sY)grG#|a1HtcFYv1z}`z#puTbL_C&TbQv=Z#Fx>Nt`%# zbe3VG+TC?Et~|T@9xSH*P=sbUDLmOgG{M1sol8!H$odI^am#hT>7P-#ptA~vLfh3) zGFAu!MWl6w`>B5N<%+}V!m}k

3w?0BE9BD1-G4K2Yg(nCN-LuzOTx`ZY*U0#DYZ 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 literal 5648 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 UY`6=^S1N##oI0pl#ys@D0BR*p3;+NC literal 6737 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 diff --git a/playwright/snapshots/settings/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png index e5680339f4b81c96bd4549bc3c1fb4cd816e8158..b7fea9719228bfb29b23d4217f1acf36007268c5 100644 GIT binary patch literal 55326 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 RgJAe)B}Al!O9XYj{u_QbftLUP literal 53079 zcmd?RXH-*9)IN$`5#c8Y2ujlc(h(_2S2|LpcTfnu_YO8hI)vV(caRcVXo~b+Lg+{* zgbtyXJHhw;-*5NR{czX1Sy?12=ggd$J$rU}_A>;$Q;@ocPl=C*hj&j#T3i_q?>Ynz z@9M|fH^DFBU3p#LJX$;%@z<(uNo!NCUaD&6t=py+lyrOVu3mpb zRPV>27omUSu7pJ34b?!*#&P+3Ez;Nbe}2CA4t;enOLnt9w*UHT50C8Ab6Ns|w9H<} zmV2Xq@r#2L&)$R9dtxa`o}sfCnw(ekISbtFOdap-WMN6DbLTHAu-W}KImrxsa^@eO zk9L`*2z_rHo-oliDZV;AGv-aa4#tRwS4N)LQ=A*8+4AQPGXt-JlG5|zlhnJ%m`z8A zQ7RkjWQR`LFG&hH1UH-IrRcv9a7jBzbG_8Nc)E+_{9W{PneECSEQ;?;Kq?e3npIz1 zBItU-J3HZcx$8uiy-#vQVT7z@Gk@@hI zMUhilAt&jZ&N83wT`~fL3(g+2)7!^3r(JB}(jJ@hMrt9nr4_a6Pp7b4SMgH$3S#Q#01-H&eW=VEk;9C1Hzo920n7-TbZ$6e> zAjBVjDvx2(c=sb`rYwh0e8I@CnwyI=E*e&*5Tl8pNN9U~RYrygf#tC40UBcz&hEI;9Vc`M#z z;((cIh6hqDP4y1y`Ild`&GH3$l(tool6If!@@bTi^Ea;H?)-Qnm8>28AW5W;Es}}= z_KP;dMqlJN)8f{yN>Da-bdcn-yUZZa+wQmf_*=UOm%rmrh*7;Y+OOz?kcCo-sMyq! zuvpm}mp2}e7#Ps-*gmF<>~LZW;(QrNJyzXItCsgp(tUSf$0YgkroY0Ge2VP2A8&r4 zV~XO0+#tT$(Kn+J%^bDw67oN{JkT%BEL87;TZ<;co-?oJoAf4SS&(*hTEN{9|JK}& zrc9eHUpcKJ$wBsJ$4XQbqbs}GGo8T+_!V3qA5S#hYB+(8>m|~C2v_Au&z56|tioKq z?Em0-WJji<-(4ApPF4z4zVw7D%YPT*yG>l%P0BmKU$kB4Y+dE8oPqb@zs$nNpiyI1 zF=Nm=Qv-8S?ZWVVYC-1mFl2fsDGPL5^s>_?1TnF7V31z~byI|=CI6ezW-YZOG-_qkjo#$_vxuinimgenuDvJ}yX@t!9-;qJvF7g>L&JGv z*Oy$GB~49u6xXhuzQ}y>?*{LI`2QqzW0hX}gJljrKX0HIq`17YRs2<4r*M-? zyT51c%yufYD8Wyz>&qDcNomgeLQlH?ZDEJdBC7Jp*I|ri(o;qptPK&7Fm~Bgfj7oKAQEo5>4UqV z=(6tC=fh=Kb??iNd&wQD%g50cAc#o|qE5ftR!#71$C{7BT^l>2ndozp#(n?(WLAHc zvk~SR(*dnDrIE~d{ppGiIzLwQQpz7snidP5GudG5UUJXk8k(j;@(lePR=35;DMFZh z!=F6s7m;_?Z+rUapKRuD0}laS)kF^ozCD1KPpluKm-BG#I%Ao#c8q1sQ7PUDTf3@b z>-!I|AGouv3K9De8`PJLKBBT9ke{H5&2NtJdN9UVwj%v0M4rZh4YNvZrpx+N$tJ@o zEdAY+tl2g_jJ)eV^V@`xW752s1yXSS`}e+|#erKF*Hjr{+ezK0`ozcuIJII2AwKfah z9E85h*kyyi!uLt37!l18c}75UZ`?f0ZcP0@8ju_oMnBZH)$`-|ZHVCeKkZ7)D#bAU z6O?bA9?pT{{S`KOo~T?ABd$#mBB|AV;KL1}FPnP$$a8-U`BkRT44GQseB4bDFULU2 zt}7k#NGMak-s4$?o4svpoLsy^^aB!-r!wPkqjHDE&c$`u<$w;D5Y1`1E7fvn0nR3r z^?JZwyZQ@=WborGDINIG*E^9;++51`_V$6Hp(DS(`0uS(Zz3zkG7`9qwZ8>B&;60{ zdvMqBEOLYwwx_#ky0E;QQ>=&hPx7*FuILW4sK!*qZwHvo<;V{ozLpIU1f=@LukE*s z6~wTq7HO-|Lm+18GScxn_n@c>^3}q46}5T~xKoHL=owiw(~dn~*lsqr_-By$My*^V z+FDJe4X*eIbD8#MP@;?zDTq_Us4*UAvlr7td_uxDwcXJUX|kYuC$>TCq_Sgt zZxbcun<~U2gHK54B0x?~Q5FLN zun~6IIh=g}ubJA07ii>~4TMA6o;(dhmn&t!Ef1(E2yRLY7iXaiX!3U!JE!+8%X}}c zcncrjEz)V!k7d_W*3^vC_ex70ud*yKOv_r79$#8Kc7r`2CC#GoO~{o9ie1@CYp$gv z&1z~A_4C*0pP!;u@!z*L=FB|1$i<2MV_^%Fo0+po@lF75OA8}&7Lm+Df}2Ojnou}Y z-zuE#>Ybb+Zz3epawNayDG`E-MZYet;n9I}nWbXts|-`mgQ4DJ#AGN9zmujvA=OA` zs_($)^Nit4`wS?`qqA(0Wv}(3ejWcl#JpqBSQ}wezto*jTxQ%=4L7K9i1s)@myC{T zqDqB4_g7nD^_AXu{kCp<>9ST`D>N|0HX4!nHkRESyUL?o?-5dIHJ0z{Umrbta0@r` zE%t&IR`5=oqD$;y0Dp6unWU6OKX5;Ua#BKh(@HT+kw+>bqD@!8V^UDRPrn}S zH0B_qT>OJpXars!_<+5zSt`_`Gb%4o5ud9y?1Wis^isJ+CA)Y({rPq;aSwW+9~k5~ zQww?aEN2y2RG?l&t%gw#1Ma=HS3Z$ftb~A)S;k_dA^^0OHQ5c3p=+K#Yl2Vzd7*gV zlt>jG5u`oM5^gq>9o=wjSb;gKn(@hTo%S|>LE+kP-%Ua-Rx+7Eas!_tqVt1N2$S!* zmv)(3!_Gp-Q<=ap#diq8WVq)+3Uq#|4!aW75vf{YL#2_}5)^AT>PeIP?$>7v(6h(% zgKXT2;e}I_^`ytZEm6aBevWF5`g&FKu^a{ir#J5My#HH}fALO*O{d|vvrVgQxo*j= zy1hD`hjcP$$HL1VLax)Nazz(59@w>w{RT0AmtxeNJ9ldBX45feb0RUd`Uh*_IT!lgLN$}-B+{7#IKp=VI0q^9`ozu^C zYs5?LQ5AYPW2#LEr3cYNIoQ1y-W6UgvND68&Ti=~^E<8PhZ}ydxfsrMemeQmb3X}F zdP9-Lt1CT$&;OPzK7DaeaIjN-vF8x0KgMDt*M8!83g#>rgS`-bT&xYpV1RB9pk{)H zmU?t1M@lZoKwEBHAUan|oR&uU^6w4#ctII~O6%c^X_{={rDbI>k_4Uy*JK8dGM&kk zSAYBM#w%~uPnzEgo~Uu#hGCq~y^dhXeW@ZB)+L@x=#*ot1v|g54CrLb>q0`=* zz7{jv&((^k(`?(k6*>Qzv+q`=U6Q(9br^UUa+^YI-C0|2nLEGV`Z$Gj?LvPcXH?cMJjCqV_qH^=ynSVmAT#al#sgeQEW_tmH zGUy!?W>m-J`K8clUqFK>i2DvU3xHH)VKJ;)**EVc<~tX}FstVNVArkA6^UU*rU-fJ zts4MS4ndc;@ndpQ87y$}MA$Y`^4b&=u21B>OZ&|4u#lTApPCmJ_welOK#RwEaMZdR zXbTf9Z4;@XlXo40k~_Dgf38Ir;h32zFNrxHCOO_Xp&=zF&xvGI%u~Ye|Z_cEyB>=y|L?`_E`Sa(20Rc)~BkRMZVxEf~kvdXgk{088@x_&F)aEHn&X;z_ z?!}iOw37$od(`1<+a1dNjaxPX3X`4hIajjCPcQ~0_w17Lw6tQc=j91v? zJfcBNeVg1L?b&egY3xzM)oZ1-c#6yZ4BddJ zv%2bui}i4+k!QTzMp)Xvtw2$xM*GPV;e>`Ut2dPPFBVfJMzd(JmyBHE2u($0EtJI7 zvnvDAY`PVi6P4B)McO>bld+ts-o8`oN{n-gp!@BomtAQQe-h`73=jWtAaV%uewD_) zav!ZPRHw~y*~Int(??_d!+AqI3vgc$*w2*81K(k> z7N^ufwt6`LS{B;y_H5klu%9{m0i?6q9p7loDeb9{OKQnvi0)n zKTP1S{r~Cn|K}a`uB~6iqb+|d;;r9;zle3A5RI7+*u2;5n~KarwLw=Oin>H$nqwEd zE)a55U;0G;?jKIKd&JTG-y&}E?lR+U->~yQ5YWE0f0+cr+IV4wUyolcKA7=s>Pd3Q ze;=9@FC02x77p4sg-nU1`btxQg*admN_ZeCe*icA>QPdxIkJ!i3?;k89i% zkYF)OfNmv#&&evULb5R`LfhCYP$n0D72%QYi@RDqPtvqq=j^h>u0a_s6{*$N!->Jr zkcKgrLu;PhYG0;N_7}YhCe_!Lewp|OOtar;CkEMav{`vaUt0p&$hlZkN= zyf9ff)nkN%enA+GDq;u8<<07AP(XZmdQG?3`+Q7j=g5B;B)@hBU8w>&y?S+X>s%jM zXV?5#n8O)&$%hdeRU6la|4tBTiW3kCMh@ii&(!72)DrED#(AAz;d49QC1NtQ<4{^vtK;8JZj%3v4liD_*G z;<>N42dSxIfzUmH$SF*u@v1kEGPT_lhI)Dl9Pg;X*X$8?W=(E6eLZ^aL*;c!HcsuwK3DCqZMZkpr}s;c~Z= z!=%Pz!W@9G$Vyjq%-TKsWzt7Hq&jaEu*zv)kr4ANNA?#Tb8J<(!^zF>o5GWdNig<5 zlI9nFFUIYczN%9T`~Z`VYJu)}=%Iu!29r52VtLIIpllH&gH9DS6lc+z4IhueIHK=rs)%d6uGeTJkX;p zg&tYRr#zQ}?Wv+dErw}-PtafL{6`(=3HqAnKGpDCmM=3Mosw_zxlX}|wNtWAjYoa4 zZiup%*JrZR(l_9iJ&U4Cd-XTLN=R&OZ^jh6;hzC5pCFBUDyor@Zacxw$?0FL9|9Y* z8o_+ge^(m*n}X}Sm2Cp<)Iyoe?=5+g;(@lHco?s3;g0cJW9f^OVb{Nye1n{9523M^ ziLA@csqw}Q zK7YQ7%+O(U#!RYjZ{Im~T6@W+Q^O$E`fsp4(M1O$c`5}741IAKqoXfnlzS|qk-Hte zJJ{_ANJ~o_=H!k_g>##YjPl3EM(TVGfvNe8afHF!m=cibB;*<;k`>S2=P9uGvtr9* zyripE_)g(ycTwg*^RoZRurg=b`;W+T4iB%(D8oBvS5LYlZI->gz4lHWg}7I{HY+?g zue7wau`uwezq)#LkY^)M1l2Lqr)W)Mz2Pzm<;qi;kit$(`tiH3R_M^$uSjQ_^yp=_ z8!;Ml#jB?2nmb#aKt`=3Vp4W`l1U^mSd@w*n=_O1q>#mb9QmKNJZ!9=qMXwd8q)R+R!d3 z-p7RgWUTtdvl$IB&9mVUp>53*flA*xM*$gFj}7X3U*o`UdY0&vtQSwhQdRR{Eylcz zGb**Jnz`Qy)^aS=e(SXn(gW!URvgktntn|?2mw7@bwrd0qB|gRV9Qi4VPA&yS3Pl#o>J>j_ zqY0uRYAV&d)?;b)Cu7c+uK6$37+3huF)N!*Tf(aw3nRP%0RiUJB26=j&-r?+!ZQa9 zd`rA<5hA8%>Wo?<+UG%<*#9xjmH~t59&;>4`Q5#VNbX8xtkOwkLg$E{*LCzBotywe zWU*h@!hg``o-E|552TyiiMWJ1Y3HF`qUnZ5T&ts%ej~Qy*^LSpMRB8=$%4+>bQ1Ve zmEH^6k%2*Bu@F+G2Zgowc^>GeStYa)v5}>VNriR*z!F-!KPp+(YfbuyBqy%=WysO- zE%3w|J(Wr)8MrN0x~#!ri9ilH>WVQvO0~50>{&oNRzO=U)bcd-jb)=%i&oVtT$;(O zrz>Bm8C{0K;YwwTl*9m!Wuvi4r@MAiTe+Xa<+wpLp&0*MN>ZAdMWFbNuR=?_Nja-$jBH86uO_EL+{{2Nq|{aapZU^FFwsmiP1Bja$p8 zqabo)xTdn8jrNIFsYiXj8X+pk+Y>#TO_b-*vQz7YwMf{c!70thz0Q~ykm6k|HoBxF z%+SyfzS%?<^7w_qx{gTUPvVwECw^zJ?R-wWBM7NpG05!fVx6t;Bv41Q#Arl*bLMfK zRZc!XDa_Z%d-jE3+;!{cNZ~{#b2M|VY|BpZzO@c7>ifXV>d^D~;oR3$6a<5F#szyQ z^a~H8716~`=VdI1jZ2Bo2Bcb4cwNLzoJFG~HZ`@Ra(y&|gz-Z50QJuhS9Fei`jgEz zK}te`@n{4CTo9u3P>(geE_6qcnA8P@i5b$owc3!)?DK z_v$erDFOSB;^c9N-;J9Z6I@xc7X5F%xlPY$61d&72_(M+lHVKnd&OI=`rVdZTaA|X ziF=+chy0=QH=kr-sRm(no?M-`&K7E@KsC(Z*}uXLEgM1a-kLAk*t9og=qHg>heZhd2EZwaO|5Q`?kDi>dTH%Hg8uH29VFgl>~^ed?9?%k)CD6N=!0Fes)*7IVIV z^%_*?rsni^{!GAw+CJj7Qm$%46j&W~GHav-rmUVnmlyMyr4u_d34!L8~UFj+yl; z(@&K%3v1zhr_`b^c*4Ar99b(E58orZQuSzfGJ;wpa7C@Vg(C;SWyV#lRpR={M2 zhlTNo9bXG~ewD016%yWdlU_L@GnUH}wuW3SCUZX|G=9UajbxWgkoG>+VQn`YwU@((-ZM-wZ$zhvo^Q*uFr*hjpK3*L};u&R=rp^tD{lw-Ru)TdKpH= zq(Krztg86Bc7pIa%E=2Ce|`*(UN@1JhWUPM1c5~266Qj{%B`0AM6=SN$S0ont+SX!%%$#}vcaUY8TVmbHMvRdk%m8(2m&l0JB_5>fhbt-Gx)Unw=jNkBc@iAiR# z(t3hkrbxTeF4=OZHhLP&xYA}~$t9$uq~uMI!CkStq^!?GL`3u&yy%fwLDUIF$gx-O zD$+J{{61V2E=$T|Ij%W7OS<8{9>b=C1?UQ!fq_BD#XgG$09zCJ4DLz-?EUGO^DRPZ zS!Z0KS=6L6=F`_IV6{|1$T9L_3Q-%1%-5Ho@!rp>w3=8f6-|F{=Mxru4eBbHA!Dsw zC1>yX)Tedx6E&s?u30G#+3GS+)%nIbr@`c0J?OkwZC(1+J;*xafe~NU}yq z!J(X^&4>NVfOi0G`B)Sk9Or2%=yh%qw>q7_d-tRw*I^kSHV{|oW5tUomXu%t@w|G$ zqPDzb#<|c+3)Gs3Dqy&WLak}k&b{0rGN4j2Fs$VWH{E>Q!U)L) zL5Ibz*$ZT$`ccaA389xB7Bj3`!icDDoj_cKoAl`v0^bEgw&mj@$}De|#rFHO^g=s> zb@talwX8_LO3B4vjI=XmBvMb{8E0Nky~WiHMo>=}S>>^Wzn?V(FpxeBr%xbe&R0{J zn!)z}2BmN-g>$Jj0PbKu(rT?_HuA)s(RwrwG_kQo5 z4HxSrE*vPs1Jz6PGn$e<6=R?DrU>Pj51Ho5p$GFC$bo=pUl@0Z{*LH0<^UV1s7SyC zF@0;fFX!*+QHAv~HCQEj^9@Ge6lp-9^xa{Za4^9+ac`Zd@tHx2 zAU+$l18TR5-)`l*@QGoa>^HKZp(&anWP#H0`hf($%W2fPz#ct{NXnAWN(tFXI()XR zz)$J^20S7B*ZX%frYTXGo+H;M6~We)z>L`TV=jEe0K^qLWrHe-%xMQ|uVFwDzIrYj zjXxAhC4gMt-pE%g_@;k>dRMi3<;pqbNs9(QfE$4x7ytapS)_$ffIUz;>9y>y+gbf@ zeY#%i{QP`pcNdx4*H+!DH#6w8@>iq6=j^7?fv&If#-!5g*RKx!)B?CA7zJ zt9gL%m6=jm6BHeOJ6oHT{#U;{YpUI7pP0a#pYy`BFAr+=oX6V9`a`EIX(#%yLj|C} zA0bn_r#(yE7h+e=eLV6EH~`DyEeux{I(1LrwVlZNo`CY1(D@;%k17mYRbyTq4Tu~s zzxYv*Ivjil>WV9*40niNBJZbK>_nNvGQWQxKSo)KDOY4S7YS2s+YcU-Ou%g~eCh?a z=s{Xk)0-&AAb)P0E_{4QQlwokd6$e`-Ola`7QI{ejj&<2_p#$LTQ~%8mdrpo*=D); z7BP?INdI15quD}Es%7t{V{~|U?$4hv4{Y?O)e(4?^$AX3b&H>FLmn&SJh4z$`E=?& z720P|C)ndX5|o?fai7O&c8-31+EvuIcSVo0MVt zl7tv#EU?lfJ#qD-wsiu!#&7-dKn9kt%FIDiz$3A2O9r-eXUrW(zxy!NS9M7c^yqeE zv1q#8ulH4$ou!Tje=6LtLFnmfAY9}@Nree{HfeJ!7}Oihc1lP#$2Fv- z?}wb94ylI3!cM|7fxojH{6nKWOa`X0m3`|;c(_Vnu9g}pOO&%fof*1Q)z!Fa!nl0Q zxH8U|i!vGzV}w+zDk+EavhHUz4&=ih>488nnoUo6T}KF3n40veWIc4-Y_~OE2@Z2v zfAu4yO~Guu&^>``-t``3zm!DKgIdhdM8|jfgAKKRj3BhJ-0Me^(8X0OCFh=ePkhzO zu^RD2c^{vK;)Ar7H%|ML?xZa0;#t4ns4=su{`z&~d_E_k#YP6~nA!4%ci9A$#o*84 zl=T5M+jESuMB5*;_2ZrcLEnNo(D>y}HAo2b+FUlqQk{yW12;I}MwgLhI2lnZK>&ej zxwi3H!~1|G4*lZlL$~NVEP3KO=_9t2*%=Xxdv41v#g+e$3Bb{}>z!4JrGBLZHl9E9c4r3_$RB zc;*r7SMPwzongAsUdQrGX0CUa|0C0t!%v@H?aicJtFY_9U!Sa3WYMq)Nqd>)MS3e#c^B zViG{lYV;5skO7DX*m#Gj3<#uprBj@~ds-FF>Tfd2MIbGd;LNkDgALKFF;QnZmD;Qa zg_m*n$33o>$$67vLtW~H+9jzu=h;y)XL~AP=3o^7%wtl<1G!1yt&-tS)Rp;Sa&yS++2S@sGXC&%wCNk$wPd;AOFX&1}%Xz66!9d0oxZv0Ty+da~lG1dN8 zB%^hv{;tPsp-M)vxorwuarFw8iUXjNHCBn zzQ<*a?ZRbVv=QNEDuBaFW6b?bT%It2`XH-Ny7{j$~TUPCJkEXuq_y(zhG( zb~Jq^W}4evE&wEyS9;#8@*ilG>dfwwa%e;JjBrmM(~7wR0Z4Ye-c>t;z_-#-sbRl?Ky22AI#uvagfXG7dv!O ze-JS3ZS);tz7S^%O2SV;R$6|Mgd%@BqoV2*>=XA=Vwpo%`ThHk9)iRs0^#3th%$tyPd zpGR|0<^TS5go8UONILekc2yCQYDnNccrbjH00>(>5;xVWb&w$9^Oi2s;YKbSc$a)n zP(xxm*!i6xJC)_EI1hS3#U;v%kk_ePmv!+0@Bl={k(@nxz|Gn{HNKoY*Ez_9`M$QQ zZ}O3jib?kXz*1xeg}y|c1Pn0&Q@SFnS`kw+m5-k#Mw%oNR@DWTO_bj_K=kw2ebFTx z6)|=5i@@8ty|LX|J9Ho=s>lW9^1Rd@Ct%bG9mfIkS98Sbwi~02vUpE^LX}xw)SjCZ zh!d!>{HmEhyN zdx=%%J;y!&K;2}89EMYVF~H}ejofa%DQ#QF+r(pZ6{X5dp8Z8ivGaX(?q9E(dOaK- zG1!jr?Q(vZJhFMFu0A&q>P>I;f zs+ji5?|M(#%EsOvNVz7p=p^iR(Fi11ZQ$npP23Pan}4PQnfvS>1(!I;64&|3?%z-2 z%6bbHgGTVjJq+K9G&W{q;mJ#Tp>r2$x`a+WN*jiynfShr?S??hmeU}z8hVmROU z?U}G^aSZF3*smM-nFs^g7nod@jUC}6_D zrlEAZhzQ|cpxfTwUL7iF1eBc2i_;T>V$L~GIL02#n9|FHQ1TA{c>P6posfz@bGklN z#mPyoc2z-Iy8ri$pa)7hm9;|CYCyktmwVohumeqz3_VpfYV%3+aDJ5Qvd&M*`TmEc ziG=Kg^dN}*_qt!ys}-n!T^%VXdHuy7EZn2J)AI3LYRUXA%78fr9`*EWxzTo|GrGWL zzV2*afKm{eo3Bxl))ASLxjG&ue60CYGFbKO_?}vhjnF+xZcTFbB-aA_sd4Ak>G~Xt z;oK|_EcKx8%%O;0og1Cn!Kdzsm`(T^J2SuJ$So`N_Ah_hEC!I7KXG*4v9N<{0o;Np zVV_gC^=bG7wn4Mh&|;#p2pH0KKswNJ zww$k4>$O;>EjaiF%t`In-}gO7XZwAweF;2o6Zvch9$g&J+-V<@Px)|g}>2$ zhyjb9Py`-mvu?Li-z}{Xa9PsH4IZypIF_7Ec00+qJjgxwQexb=i2DRYztppVeY^d!CwB4h6#2Zgm& zz&1+%cF(hIT~oH?9-F@0W`lqnY;UW%2kzOY54b7&l4k~9fE49`nXqkC7j1%@E{nZ+ zQ(@SGuUF%s_R8_*^saENt1t7t3!ZRdqPg@KFmJpv_L5t~=CeO%%5)@^bMMDJ?O*>n zU=|hD2RB`kXE^AfMIU9M0htKyb>yIyrz`<;+Mc^1F&xnUM<$Znbwl^w4Y?AoY_`SA;?{KY#v=!vIaXHIrZZylD%gK{cG+g2CC; z>om)ZnCdH`aVHyBCGg1yj}zYnB@4Lb`W$kn181Lh;D-MN@ma@ z8*98*(vJD<{p{}C}!Gqc<~^zq6yXf@MzwKG{e_N4yR0~wjbakwQWD^_1lU9rK- z9Xop=Joq($1eqyggakMVn+|+y%3QOHHekycaqq0)VyTaX z&6rPr;4}^@lmTGh*!NJs^f|3w>WrMT5mmLo%y+`OacJnWS7QuU^ji zahJ1q2QfYNboXpfcQB?UweIiKk z%`eIbw5jOF#)k7H79p%EQL>=DGHmbs77ea;O~qfKk@n^Wy$o-n{7|+$$~1NQ@HN72 z_6;T9xz3H7H>XQ45U&6+k+;yGWT_`H??bcyWbYzJxB+fvU^yJ`f^gCh*?4hxbsQdq zqn#;b2y1N5wIJsrq?9L@j>wM-4$Aw`HOt5OmQ`)g@Yf>paX-Xv5t(;J8IWq%RRgY5 zE-;zTOyB>AVbxjMmu{cRTpmxv@t&|7Q&Qe1`zR7cr=hI3u{<7o4?!p*3wB2KiZK4o zTQiQ2Gw%fn;MT8QwyvS8wa8K+Q?;S)h}(ImBws7z8w9-?&Em1!Q#JhagVEXY%*8-| zS_wMsTL^Xov5B@&je_J^Aej^RodZ9Axtm!teYCsWfp*H*L%4MG;-0kF89Vg(=x%ge z+zS7>bdb~oYW>&E-|BM)GTL&1!UGQ6b}_|OCUX^pI$H?MMG>e9OjGTrOnYv6-&ndm z>^c*o0%%%19^DVs3Lh2&mms}ae<4E3t}1OkUMVvmlm#X#AuhfGAaocwHIZoBQ1slW zEnj9{l2YhclGX`l{$wx*<6jp31Vmb((t-f3jfq`&dVLZQK8FFd(l465q!#-K4XBE8 zN~xgpG{B3T)|;>zE5lYAW&hE!Z7kqgWHvwh7LwP%TjVTw4khY|d&M#}51i`XUnX`Q z?i`}vd`Q7SDU+GICvT#j$c3Pc$mv$b`T5D3^~CjCb<9{&gN$v}h<#2iuhnQKx&Gr^xTU(=Y2UC;)>7kh zpbceYn<8Z&xHHW^bYZ}eHjn+ayqpvdSq!QKwK3&c;d|lpDp`4~%viP5u=>f9Cs3|< zt~wW5MD@A%Hv!-eKS}zY=YjKI=3_ggHp`Me`!xXk|Ecd$+6c*W+cpFcWHq2mx}!u5 z=Q0gc%O$ahZ}-vm$9oijC!x(VNF|vm3FvfC*HO6L0FA{^t#N*di2G{Po4`q*o`;D& z*??!c*d71k8Z$_3Mb%^Im+TUI&_s7Z%Dajz$PxBV8DdN&Kz+a8jI6Sy0k%Ah^D2>G z&@Erho?>B&^RxtB^Q5(Epf5DOtZJyX+G;A_ZNKw`SKd2%C%V;Ur4yA^vg1moYvcxb z3iaQZ@2e}U^E)Xml+Je)pKa#^Sd3QJ{FaT?$Y3C{{QXtNW?3xIFHg_kk|&y3@0ar_ zK#95C+8b4CEZA`Mq$y9qj0~v~>pV|{6xYUnTx-vnKR9eb#rKfFVt9*=P5-n_Z}Y+h zxAFO%AFa;MK8;Kk@IC*`@3N8Yd$D|>JjH=qkW|)fl|XPD>nq5~yV@ThTsOPJc||=A zHR}b6gaxXHGHx*{B&mYR7pr=ZhX~5x5udgC`RUOxpd?}!NTxPMXMh}>SNcDw<>_{; zAAXO>*xTi3T%9Kpd6zf%;dr+X>48~yof;25n`1dU9DX`4HeOP63$6Uuv4o2AT>Ph^9Y`DbDPEeM^>3rAhCkTh<&Roj@9?j7xQn( z7rD^QKwX@DTjNax4&J#VsG?YSQLk^FzVq<$c45Gq8VP^ zGgR-9>ltRcVE0nldz0_L7c)+F1OGvP{0md%sT>I0d`ebA?9Fif@(YWZw4iSU?rPU= z5-J}#7-Q#&<_GKU;^309Sde^6!%B!gT@R=5@{Xg5phnRg9Un9rsDNWN5Shi!7&Wk- z4Tr0V0yl}31_qP|gFj+IC8$AMUIBdM(nzJv)NKtw-!scB*00aE33GL|oOgQpfSiUS zvBw34ebQ|b6vJka4)Q+C;dbPBr8fc`Z6zjtvEPRhba!B37uI({2+4=FfG|f31oi4D z8$~qQ^f*@s#eTffd>~Xy1~N0eI+nL*J$*BMQqN2CX7&l2){joIyxML~PGczuu^6PY zfPT4&v$vqvSHR~9Ze8fwUbuZb95y0XjpaKRuIlEko?7!W@I9At-&vAzIkgcvWn^H; zcZ{`>m6m?D+)IW0@!DHxdi}Z35Mq<61kmf>0w#D=Ntj~o$jTiiW$_o;@*_C5{{2+1 zs3jjTo^T=K0138|@;G@x3?cMCfK0^@Xmakqj^(q}k7iQQ)~U2{7HDwaRR?E7)+#@I zg;D2)FH}<5o0;W0EVQRZ`xZM`B20StQJA^37SjLz`w^L=kSA`I3l0@G=l%IAPO-6b z+5-spxZ>;C)>+jm>fjZq&Hdp~5rcuK4kAO|o9ar1X!yHmO&_vYC;#4Ie@%;&RdcHs zl?|B4zbLU|jOY#AQJ68s7<@<+cl{)^)4}-4Sl}3RPAPN<`JlpVfF@ATMUI3)ZV(*H(6jae zTrbc9cZw$iRGwBxOXs!W79k${t3}&0Q{MMGo=D(#fmo_@7|m}#m#JQ)oe}X=s-~Bm zMIE5kH};lvHdnW1pK4dE5QR{mEK;4^Ww*0-X$Ljqsn4V`;|)fpWm1Y@4j+fxVIlxe zKAOf>eZ<@7e$V-=DOHMxOF5CZXs>tT0#`SD7nvPqHhH)S0>^0thW!z2crL;pZZ(Eq zWmHlpC<+dW^A?m;c-9BrW^1MSjqw~CO~kPCgWTa6xV z=YbEH3L{dzG9yyGi~T8iROIA>qxRz30!di_tkJWnjXNM{$9L0In}&A(<7oADddPI@ z#HXtlebe4;%U+uoG`_lHcb>oLhCI1XahvWsoR7yMOt~UUE$hT}+|h%-?;wetO;+cD zgp%iG(f)U;#PCtLgo|*ah@Bc_HgL^t+Lo_s-otl#9_wSE;HXzpC$g!i{h$|}=>)i0^GFZI-d@I?T3jD))W$yjP%x@Uhd1-6dUy>sv|0KcyaelY zYsBWRNZk^6Ott2~PY|Ko*9rYS@JpfNyKd{$R7mV`U3*xDPbc~v7n10y zIR1M5V>GgU=A3_Yg7{IasIJ#<6_I=ehzMuA-00Z&dt1|>P@Vg@S47=2MF@l%{Qh!u zV(z`|TSG(Q?K|Ma4#S6sH@|&?J%Dk5Labc2=Y^$_bx2VNJVpE|?jcXyv02Yk{+A1& zpCT(Q*gZauZ)us#L3erm35*<#D*X5L32Z$o{J+cR-H))!`TF(yf{sfiFTV~0%?pBS z0zw`DN)w0lDZhCmzQeZsS>ey0)FbM#$*s-rf4Sm2#uwCWydeQIR8#T@X%sI{B ztPb-_RQLkq?PyNWUVMRxiH`2ck@~AD<*!skeP~Wd&|~5Ip*f!DBtkLV4Jj~U;wLa$ zFrTYlg0I{bR2BT6#IH3)M5^v%JOA|oxdsLr;Z>AbaJMChboOsVy4o(C=_vL9WSt3;jVJVcL|{SWM!w#vRSXS@SHbE!D&!+$iXO(BU@ zubjYD@A{}2kz~?}CMy)9nuc^K&x!3MMQq z4C5dnj%B~_>wuWhh?oq*NfbOH#rSN@G}Sw1=rt4^;C?(4 z{IGe+8u4B6@FZmmlne=}ga`#T_UVEO~HGiLWIEF7* zou0ON-s=c^8wP_tGw7xISY7Rw-KXE4XeS1DM z&(sDvN}fzE@AZx_uRUGMoqVU2VIE z2rkS8zkTS>F*O~B+q9;f`9I`wfz|W^HtwN!tDvCJ+@fTOX&({tZ=P4++SWi_gcr1Fuw(o&68Jmv$6-KFPuOf~cNlAD=%gc>` zs;o_WhKK*PP~AT;K1jKS2R`MUS>LV-3Yz@7s!;dhP;G5}9q*Zb;jo!^*i_^RKZ7gpM%%iD?V6U!5JyYtgD@gZ1b|wXUhpe5uk#iXQ>KgjO za1V3!9eq<+dBpNFz1lxU%gq1Go4ZQN3|+*Khl{!5z!SgttrIyzqj_arA`y}RjU$I8 zj#a!*(WiLSp8uIjeoYN%YD3h$qWE>DBj@3|Y1Tm1+|dz{3HjppR^z$P4$Z0UsM(V~ z16n$|ZKl?8t5AT+%Z(Jry;a(nu0Qxb!plZU;v z=*dsbjA8+Xv|JVQ47fo@XhGuU>s?cTJE=k&!H%+mb@ir})JZ>l`A&2>7Ki ze;ut9+p({d$b3Pp8%45Ffl0_=qoVK+^Jb4fj1W%GU&`m$qbl(vMEI|ie+CG`*SUKq zV4hI{DAxk|g%~lH1EM zQ8FQW9-K=+6~;()87cy&p35VySYIDPPl&(;*kz4eS&2q_h(O&pu$ zC>PWLHJlsP3O+S{l32BF*w-M|9anyvRnF|+*rcZ;O-YD>7R?@rEM+66Y*kF{7gynO zVQsx5F|h`#q0wqP^jPfn(mJ31FHQmmh4>C&w{HXWKkz5`GqS(=LL!kj-{1Afp*s%o zU4X)i@_R`bpY1&lie}C@L2JUhF@@z@vo5#NIFdd09=RG=^B~Qo zXO-!=48s0)IgU&~M`!vG*T=yuSx(Do;#T>DR==QF^iVko-LKaa+IRm)jgsXg)gKpz z%RlMUqg_p#xX!B7)N#M6EUTQA;olwi-OB`%!=-y#*#t&QEjjRb3N*4l)Q2Y#%KVQL zqTXIO+j9@Ld`=#kTIbroxXYHf;Pmnd>@N5}0VI#e6?MI?g8v=@p<2 z`8Bzy=S*be<*U(UCuze^UjG+!ZyiUDCG0s0{ockZg*lzBEAj!t8S!w5;nAB_ujUmA-RnG@4PQ6@M8Xnx zHrxHF(7@)39D4u`kk|NH@n)4R^IT4b7<05K`6V5tK>%u%*()L>%sJSi(;1HMQH7+< zwyeraOMa7VJelLhME-;;cTFwcLU)BGAE{r)TQsz%T~#|B9r~sg=^QVSZBEe#2=4EM z8ZIer>d?>MFK=-N12gj*g+I4Qsi3gnTZrmg%Bl}YR8&}fc7My#(K{U3SLOZvqkh$A zUjeKkyKS{5=*quF0+VJtGmeJ&;JwGKaUN_&w*d3cob37E^K!P9d1HMG9Pv!!^~2bNta0kN$(V zd@46>hQ$jSp_*IZ*c$cyx2Hpo-#1AbO)fWddlB8_pTgGKp$k>bhXJ)tv024q{lEU+ zKByf!H5C{yQi^HKOFz;7a@#|*j`=oc8ET%pMlz>XHFaxfQX{`eh4`by4Zhe_Ydguo zMYP{E!8WPRW9^=G%5eL1kw`q-b>Dw1)!>Adp}YVwo?5W7KB2$mgu(`)sX5+!&-p8Va>=eGNeUf#CkQ(v5w!Zl~eQMKbb7BTI1_kk^$v8E}f zFL9XEvBrFdVM!qeziK-b@>gAbkS~cykFdmPD-!N}w%kp7Ww(s$=6QOhqz%<;&tX!p z#l1zkRCTYwXo$Fz?JQxpX*aqX>M}Q)DUdWn8gI3D3lNN+-Tu1X>|i>)EpDC7tm|ps z>CL^>cd)q`CrTffI()lse`T}M@!jI2@#FH*q^9g4qd-m~8UNE*oBfSxhvUPN59KF@ zpryw;$$istF!=c2U%PkvW|I^KvJ7p__+z*sEJkDVJ?gyf$mviTB`1&i9Z()@mNSh( zYin_xqxKFCKXj54K-^*K(hJa%>_AmmEUmVVONt`3Hpi66Yb`B7j#VZTc%x5Sd;8(Z zoa!F4F0;}Fet54vJ*pGKQd^wg9a>6Amc~uVY%J;W2%@05!RU>jL!orr@?>zb^S49Q zw7Apl*{XD{TKqm}$8Ls&5_yajrs?{Mjh|Olcs#-)y2uM9tC+V#U=|_u+LZv`YZjl@ z-(6&)atkI|-h5b6RgtBu3B`%TpkaQTKCo#&eq}+BcYy~_XupM>K}+jj+a^LZ<6xg2 zu$7kLkLUuxtF7}%w1Jvn0+7i&Gs=*E+1m6LRo#-$4|?L`ro^plDu*v!^V+a22#?DR!r=bD>s}F2GcS-FF(}o!lS1c2#gjVb(rJ-4tyZUj&mS zPY%r0JVB99dTiPp5e;Bm+r&fyiU>J>rG>ABErI6k z&2raCd7Q|IM|;OVRjUYWygrR}&ZpC=RXaR;8opXuQ31+>L2Dg8MOvEvj_jzlUBoZP zXQbHLvjsu^t9gy!%EAO361+IG-2h1^$!~HcKSpP_(El3fHgWeXbkUEh(D3u@%YV2z zh|P~|@PeGtyzBoffhnRo!E=)4tY9eepdjYRkZ?|?C4TWK&)He56({yS z>ugat{<1Ujz1xKey5=lTh*Y7>X*ZIvoUWV5ze5?$SBiA9N)W1S&?mHmFG4IV@IjVJ(YU0R(HrCt|~?5M4wgGG)U505qj0I&cEEP0Q^&CPp>$yXZh7w8;r z`H8;GBHfI$NHX6cJ`<-4$7Tvyn!mi2=!h)>*&hn~cwOImH#%qf6aLT%tquQ8d^tZx zbTRE`H0E%&`ssA?6XO~HtqS&94vFLlQtkjT9LB;#cHAqFU zGHj8yl><*yQ4y!K)Rxe%86-%?aoY=zj*i|}MO^Y+rI78^50~4QIibfEwM-Xc6rXIL zzZc>WMws(XI`3pkwbuSSSn0AxFU_!e*YV)hhcrSEC*Jw-@4#ct);>|ZM@6Z`8+RAO zYb5Cr{eO#Kf;wtl&L8WfkgeF}-#@eEJ|F>tpv%Uo7!@tpB)?nalAOe48piZCprP%S z`SRHu(38&S%2ount5@%HhMsV*%S)>bhE+tPp}JdicnrsB`?GL>eIQ}jAzQV_y{gTF z|HW64)BeSf;<56>Kh(%YknwRV=)5r9{xkKrxBDQQD?5e0l_S)!GrhBJ*3|fTDTEwt zKUajmUs2QfYnh`&&Ur<-{TuMcq;hefvkw(pD%1jr?NPZ_oKz4`jb^PVNCj zAx~u=yiaCv;_#{720OYIQMmDDTqga}Otz@()h{AZ*kn_d=PKV*TOR~gQICImrOnC0 zHsfaYw{jsRVaS_Eo|S`+vCUkf_jk!pDTnhl5=PPm4#xj(UsW!#q8#T(&-aX3C>0v) zXp4fSB-~UyMOLypnyKAaCU%^tHnjtDBkM19spr@X?aBQ7PRvijyA0<8dFn4&KLf&r zTBiCY`IYNkU2+!wUuNNH_3tTGwI)yWALi128RSp_fmY6k!pC4x+g`}tFDGC$UYTmI z7cfHEF_y_@APZ0WSQx?rm7hu8HZ;jTEA$zvce0vI0&Xr(b9aGhC| zDsh=ZtQHt22gz7F)lppVG(;lT3&uZP~nU9q_*5@h>nBn9ss*(@GJ=exK>HH^(nMn+I;*SKBtJ5`2>tTAU# z2p1&z6L%{30Ss@-Jn8%*SZc@wmz30SK&{l)mW0;u?nvdvhhE7|KHzp?kyrfgg zYr`eKJbxYe&~bmiKOXxCxgz`xTRhVrF6JyyC5}W>DVzj^2EqB6&rdu$#aCk$ax)4_ zjpWA+trB6`AXXF;pEkZ(h>oJu#sLw3P=_7;-0!yBa+{K>)$;pD~3=>sq_oMZX=&Jn7tg19fGndG~G3I`!nA^gQl>n zR(i($6TZbGgMQZu65uV$(P&S#CY{W(C^+@Q(A#NQ?oFurT7AYVU0XYtZA$z0iw|R{ zI91iBYk47Vg~`_Bd}pSd>!Zi`_G!m;$K?(f$ek{H%YZ$YQ{J!l<<2{aa@S2}0|P^H z&0@XgyTh2dKSgoHQz%SXwA#}hxlH9hHog{zKYya10G z0XJSX6)lxbQIP!hErYray2eOe8gPzKPo(yAzAk$pr(2v%?TO?N1<{e%`(Wv346<|b zt2Xwvc6(vlIX5y~{}7(x9ufe_hszGH`a3z?)VpRKk6l9xU2Ojz#*d~Vfv_Z~j`$TI zcZ-{Mq&k;{#NyI?B97$kQ|N~ikm*lX=7q8$a<_=Q>JJf;yw5)s%cXb4?E{Ory_lo;Ar9-%q2fUa5JiFWVrEE%BQf932_Z$iQ{k< z{`u2ALOYS)kw3c?zISd)zN+RC7D*1vSncEk2w$-0_Agw6`71=%hD+~}Ll5};^igaU zSL7PccTi{CPno)-=pu(G0ztc%q>wS8WL5&_x$|>QbHA!E5lmtpQ&0tGNvOf_&R5dM>8?TCQKu*AA0qL4;{`;-lWC9Z>{prj zo!8$yNJY6zuWC4F0kJvWP!3u_#!If>K?tOf%!g2w_y5kaHA8A1<#@^tRPPiQtKqfO zkOYe3U{GxDxheb|VNXmkYaZ$tx7Uqvfj*(%Q*v_1N6b7k*%bDXsm|lgu@JjuhUc3+ zma?N&)Q%FtB*w`9Ezqi&;I&^VU~`-x_fvf!V%Rs~Xx4F4eJ|_2MxVqQ{ z1wDg7Dra1=u?h)xw_C&CvA^ZcskZYA;z6TaT=`=KT-~+qL}2=Mfc-o27@;_;8r*Ps zLX3(+*mu zGx9i3MG$4nCv#(wKIQ<11C#pU)9B8Ay21(&T)RdI6R!y0(iEBG{PBy;u?>%(F=U=C zYB$ebiL-KZkM5!8m~UZCM;2U9xuOSya%%Cq(35s(aA#v|^F7#Ug9a?VX^p0_7mZya3gcS>qR#`Z=QUqT|!G2Wrr&&D9xNdO=;R zE%^8FI49>-(9G=wYs0y)jJy21bc6-CmM-EL#svSuWUI0=VE8(`_`!3B*ONbKvI;WP zAhB!Y7@R=`7D6dW$)=7Dzn$q?R_m$zlrQ1)D=IOrhXj8rENBY~6lcWGs%wGmY^uiI zUxUjhvLaWRAr1|fHXiQ&n^8qY#bfVA0CeRu;VbBFVoy0`Xhf!T0>XN|HcP@4Znpx9 zwQ;1Tq4E1$&D;Mq)peuv?OStdckSJpRYDFYz?`db`agbFzdq2wU^UVBIX>IJTvXKDz;Z#Obihp`o9k#C6D}qm-r{@bl~%^y?6t8HiGs$M zgDdA>SwaRny7kgxru9=$?95FMq7V6sh_9Rcu8~+^z=X?w z=r1P$E{GQgQ+(a-ZV3oNsfYWv`*CC!I8%idrYn8AP4(yKXjnyWTovG)mvZ^muJ8jq zMz!yx0?yR=F#9po}z zY?7dBAn>OgF0Q45IXXJIyWf?qD|lSb!4UcjJPf%?nHU-hK9fcZn8f7{jNWX9P-Ebg z0_uAVol+LN{sPsEhyC~VYcgJ!Z>y7zMjO9Gz6A?*0#`!3uqO>jJmaK&JD30*69}JX zNTbyN3D}6JPX90wgYDSN4~s~4zQvb_>jKnJ2>Ahw&JH`npHF8%hGFTafizBwiLapI z-C&VbV&}s$Bf><^lNx?bmRmA1 zFfjNb_DCTO*JPbxsXw&%u)WT1h&3uK^=)AlqUQV4Rl55@7xlk+Lco{K_fhQX8CtaN?ZWzoYms|s z?tp3Ql!O2k=oC%gRK8YFD^k78fe3h9x_{k%A)*RNc~OpU9KR8*wwb3)g`Pn29;$Tx z`+wJBFaZVoi%9{wIg|ZC-c4crmT3hmuVt($Wc+Wns{lyfc|k`CS6#i4ngfhDz)kzZ zhS($*6z~zOEJ!hoT*P_jO1zQmhNJ%h`rdqT<#@wP_5>Tb%+e|-T*%MAsGiC z6~N$er^DOWQZO%k_Cl@XnTi04eL~@@tx=4OagHSomzhNqha*XSG`t^ zS8n&6(+$sdvk};!7BjPM8EX&8yMKED446P_2qgvE9bIw=QW9f}O|yY^cD7{ZBh{wl z22vn~tquOfd_X>tTMFo}(d(LMnOHVjLPPa;KeM_y zSWEbt8Jqp=dR@CF_fX zQXfo-7il%bn8e2iU?g%|+(E@AU(QTPj--BuBA+7MS`u!UOET9JG%XMj7xz1mi}=i` zjm6_)0C+qfuzQ}ob=n?>Si7%x>jL%b^`weiB=yS^(nsl*@qY9^Y0L8gIYJTUy?>Fga5owpvb?Cf=0~tv}b$eay>u zN6*x>6R3LQ4W}IDy zN=i52W44tiB z`b1J=d3e^Z{mBv!tn_`%*Luxz;)~8#ZUMg|9b>aRbsluI9^QS95%x8~Xo|t*`$tzr zbK{OA@q+P^_`K-rT(#z)gpqtezq|qqn#+QqTwIe2mA9e!n32BU^oedw3Km%?9z>`LqUt0;hRZ5`>)}&AO zEu5Kj?q-`PwpgpZHNC*qxp`aQ!&g#1r`-VZQ%E~7j4XgvpIF&oPk~I!{RsWsL%6yF2e`Gx&ktXw;s73FK*Rk>iCAFQF-~TUX8PFXizL@tLw+ z*a*z;EB}m>d5WYR(mUkS%+gn@9XGKK35tKnu19<<)_C9zxB~m5Gdf`P2u)AF=YHz{ z)E2RytuUCUF8VGcxhXiZw6>u~tMr}`%n=}e7egK3__A7e_$?G7*(8hG(OIn5G`KsLVv!m83 zGrdt}Kn`2W-PxDND@~2E=Z4JC zUiGg&4W!2#!x=zvw*32RJK*qf!4|yfra`UV19OoU{v*S}R%d(C=Yt`Q@xn%c5osiv zbT!^e_wi&kzGMGC1|}+E?HaGdi1x>;zybC!QeV*R_3NG3?{U8~a?8QyxuR6TvZ5F@ zBgC(7m@MGcgP8tZ3iSDSNaGbPfa!dsp^}Yw#IfLL10GvPx{OJl+YPw}3>IeHI`J+8 z-_oj{NSHsAW~u9|n3pZEGliyNn2vWl*8i!bw$kA2U;i$4z;&JOkt{KJ8irivUO!{uZS00tD>UU&TQCyVpyW(4y$O-*A|)ER1doARS6Eea}~b z+kCt|BuW9aw2ekwP1fB1+vc6KPrNT@>{|RKw6@FbWp)YQZ=7ZI5raMo# zY}Wh*RR!W28*0@!o!mD6Ww=}72D^0l(5Tf^_t7|dj#5595C~sVP<-y2bYgS8ASs%y zmIA&g6kv=Z@I@C`bwK7~Ag`KG92^Dx_3n!MXXk%l&OG+&eH+T>ZfEeXJ3^o2C8Oxq z6MQ}($sBMk=>RvTFWA3t&4tWl0s@*S1qB6XYtzkL8<|cP?fri|8MRA8WmJpa_h!Co zsB@Nf493lFQ70u;ipD z+&~Bq@r&nvmqt?2&?h@R)bsE_DZxyoqQ^CK)--2S-GHAtXUQ4MHqV zyOLv}a9r1$yR)HZzBzTyeV$<3iO|s&_)}`d0Q9+4;A;v93A(4Z?ZHjnNM9Ch!(6>}paBjY|I0yd~RTq6>5mmXi??MeXY4Ubvvr zfFW2Lc=`AT3v7je`Vbtgyy2Px78j%oPZagIv;SnKKakQFoy}?Cm(el62flThL|}~@ z(pp)c?^xBvG`;L^uz^Z+X!=|j8rttNIXE#lRnKOXyTk8n_znMX>U$wL)$_i&2iN-r zeJO*3h<_NF0(VTdzW~eeR#F$kt?&zS#bJT}1p!$A1a#-em#S<&qC0b|i&kX!%;%PtBo!l? z0WPmT7*l4}t&v_jN2j}BnAg~%Q+@rf4q2z82$u&1%&4fS3=A!NDx#k;iwC`j$un(? z6m^x5cb1uL_H*Lm(8%f$cA2;sX;6UKsx1LC zF;`NNTp=Z^w%Rz@7cvVglV-e}K~-THD3WSA#d zX>wWo1{*c7J>tkcA6@R~(=1Sj5fKw_8XY4Yk)SK~TXS^H)QY)ja0@i50uBk75B5<- z`;On;2!8g1kF1;|zgl6^kl#082Fujl*Z*ZE>l_&P+;G_nf}>PlhJU=(lm>j%RD)gP zH7^hsddP)puIcAX%c=T%n#9CY)6$0*Jq@`!g?0&6_ZTiYN}w$GEV`{{T^z60HIh^> zPxOZ4q`Eeg3+CGEAXs_>Wh1i5Y}k>}0d_mq^*lx|jHP4m|9JQQg>Mo%yW^+_4ld4q z{+e7E^LA-f`Mo*d9*YOD-VLy?0i?Jwk}I{HFfv|ZriowtU2>+v^87IX9%h5pAO2;J zir9_ESR4?=w1e%w3ta~FIFLVayLtw|;09oMM*0sOMa?rNPS*C70NP>%fOr4q&*yQ% zif>Ezd9WcQq@;XaM|y!4!i~|u3`ldZC519kxheVi%Y%3}&u*pDcv3sJtAeQ1)!XI2 zYq^UQ2fN>l_vrUIdX@F;!?}gb9ugrh`jJYYq@m0m#g&tZEsg(j8K_UfdV?IsOYz|V z5pv}zo6LS@jVYdKIvAnDHkZx6(&w`H*w^yt*82dyW?Nv#@16aj&cqSS-$--iyE$sj z4BF5ycNvf&@^C>B*f6P9SLQ>)AP4q(_{>_eYxT8hdaFC{MHdIS(*m-roDU`Hs zZK8pova-@)chncaVUzv@pCFkJ+y$C)fCFRH_|HQY3%VjrUv6z}ZSP@kh8(JhuZIXx zyhzT43N6+VDKwW?fiVAmlng?T%u)_j>Ui=KA@9%+=YVLM{zeo-(G< zQO^ARv79&KmsTg_yiFI!&|S(BqbpF$>b*b)J~(*d1>+Vg$oXf~Y{c>IPZr3s5cCG= zdhGgFgn~WM=}<&$j`}7aH)PzrQF!Ze9_(cYhYBKtS;q}=^$iVbwGMoM%LivZ)#4ZW zXIk7k$j)Ptxd^-Clap))XQy=Cvu>B#KujF8bUxdADocagm%z;yTk&azQM_Tg?iA%u zgJ~+>SSYDTxcTfedKdfa3&)k-KUou7$@HM3DCx8X6{>Ps4=~*s#!4 zNj<%1fCZG#Cg9(@AQt@=5FmAWW|a!*>qOi{0rWMPH5yq z?XLA>3jWhC3Mqoaiegj(XP1{C1Epto_U@e$gZ4bU<2>a$XUQUa3RBRagi3f-mP(%< zDAE@c;<({Dn>%#VWW>$}-H}C7rLVnp1DCur7X<_ahU#58LP>Z%`U*B(AXqSnH=}|B_wO2v8ued+e(|B&MjxmIT=#UgQ_W{z`eDE1t$rv_xofl^k?FBF zBY?-Sa`18S9;f**3PG&9@tM>+MPI%S56+)bRYuetKQcrJJ5AbgfgsmOP| z@yDouki{xveKKFhL{4t06i9UA&TFsqCFGwF zkSi>m%jAyQvuHlo)Fh@qS9wtq!7@7P%B=g3-8Flu=BwDxxBX^10$%KbJ)OnM>Cf%) z84Xp}Zt!%6K@q|>P{Z+)T5+X#*CTIa#!j`(gnc(7ZdUJ{Y#X1O(|QxgI|0>LNkLLo zrdP5??x@19V7Ubu<$Cz{@4t7;@fD{sUpb2AEh_hKmmVwlO4zKep`DQPOQ-H^mzF6i z-p0mM`Aanllb~RrLd6u|B0-ru8#q#8wJpnQ%j7t3>rk* zH$SKhEa9E~GoeTheEpB#mj~#tpI5O8PIZiq#^fnqMON_H(kDHTQNaQ9q=khAK=^Ba zi=F{)ZZNn;c3qK#&np7N1+4BjiYWA`XC@PZN{OBSL!6gH+qWuZ@hT#wB%L-#li}6$ zHvQ#!iSepVp7MTAMD@}*-t$`j6BdX0wtZHTt!*Z29>W#OndcWKftp)j?bhoVwNihQ zE4b}W4d%;wB$x*%oEBOl;_ByiJLBA5$L7(crKS2~Dc37yzYhtjfk6$>z`f+p!~Vx~ zqiQ@Y{`kpk|CQG5&y2Wcjyo~tvQhK&yAEI^Nu zl$6YP)9@sL)8l|5A*P>$3uGNMfut@!tPKV5Cm{DK9T+c_hTR7}QcN(#$#|XFj_)xt znY+&`#w1ge{!c!M5hF)Xqcr(pNW%Q~q5?p%@$AOt3D?>+2LzyO2KL?jk+#k%_J+%& z)uZ)c_%Isgw2yx_c4C!frtMG+upVTKb`~XJVVkb>jt}S0etj%_$6;$K*|0N|*5ZG+ zhbSJ^xpc9=-5AdH^2t)*iuIoyhWy1Vetg4eKKO-*!!(;A^r)AG(*gS?I`3(%DN9Jg zucrJjB65jUCi5-r>pH8Q?bA2D?gGE*&+gBy%wM;0x%@B=GLc0Xnv|7gWKfy(rN~qj z(P2OGn!2z-*p8<|FMKB)iQmsmhJoQsan(Eian|S8Ox5truK!r0{^H8nnM#&Ku`mET z8iJ}RCH?=C(*?iqjd|5KL5-7NyU}2a%TTzre{Bt>q=`RH)FlVJ10A%tuQEeSvhM{B z4$fa^R*aq5j=3EbKagM(w~4d~=X>x0T_nEeF2nTXU9T0(4e~!NaIv{XZ8CTFI@sjL zlWgbHP+oq18?Z>t0}1J%nRZ1a70N~89TZ!fF|i8HM~*wYl+9DY`r#UR0m$oU(z;W- z>khdYms4G$6jO7`{^acXY*eSp%9Sz{kyO0n6wcIab-zl7VBdFd$K^gN?08>lnvMGWl4_*3HVBV%Wpt|7t#&^2)6Nb z!n1llmnVpeF-*zFi!XkN{(z^iFMy&ot@cO=b20I%$}PY%F7H#FRdw* zNUzIh-k@|UPA$W7A^u1{>QmPfqd?93;P}F3Q1rdp_Askv3oe&fL;Oq}q!Fbu8h2e_ zTzcJKq`m5ZHl788+TedGWN3x2w|ek)nm8xMZw?IM`vz5^>cU>eP~D^?5}>W64pPh5EEnfHxc-z2bTgYB{?6^wNvr&C?dRZE zIjzn}01qSR#3-|R{tB1Ig_AF;;};oEYT=}_$jI}+ zB^BtkV>IYIH-}y6^Me$WD`8hkmD5x;Tmpj5oB<%RQqOZQM{YZ!6 zSAYJHRfFP%zo zYVH%AL>A#o9#AS@MQnn$^pviH&7BNDfc7# zyJ_DZ-KAW3Ynxat&0uQHGz2k*X%#|dElr2I8RdqC8HtM+RacrC?B-^O+Z&obZ`pf6 zb7;dIU;F(5)%(s|lI&;4&a}qfkWHo9Pmf_@5T876R)$RDoE^xB5(+LE%hD*tRGm*V z<-1mvmj1L~4F#UIuCav4IX9?yARUWKOOKj%JW(O3`QP>HqCM*QJU9c}GN|m61e|vbJ9j)CcBim_ zh|jE59~`Fe;BdodlV{upnT01&oqVr?Q9XD0vQv};XlLgq~WvQrXP2Jd* zm79C6F8Xopw6wMRI>EG(l9Qw6qxQx9KwE9Q`0#ksH`6TL>zXy|ij}Lcn-gxAvNBdf zB=d2&kbi!@Z;%86!YNd2vNGP#q~P7qhnR!H4{OXKX*_uL-4ELxR1Q5TH^j1RSAAz1 z+*mz37%xsYWh^ZjWn#qkR%_Tfi3?V}_3 z+5S(yffohb7NZb@ZNI*cg$oM6b~2O%L40BWI%6*&=gdax(Z-6V^>$Ka_ULz|k~O&4 zEf3|Bi@~v_K_(&Jg6g`aL}C||XK;Z9V?tyifdv-drfNuwJM)X;;XSbetP)qBW}P_uuB9PUF_;33B-HYIa&2g8|Flc8up7oN3~cRyylK12jcVgM-MSCL`Dm> z;W57pJ=hKy9yYRi{}g=~zu6mif@{n!$*!T9eJv7|lq4HlBqS*H^lMcgqu33l{p(r)!0qzro*? zxu23%idj>?%6UAJ_n_Qr(#bwPsWCN^ahlulla+qW z*Q@fRf6I&+bVIK&b{0*=0v>}ErR9Us>Gx{QavIFF@e0udLvY;LQr~Da+Z4)5c58oGpvSWr}n;GM~HGu4Z!_ak4aCXRi3@_~K7A7``H~h`bA}I%kwU$0CV6KzdaVLKOqRf(_-+4s^>?u zAMZGrkNNd)PuekVP(?x$Dj)& zl%U9*I-rZ1L#nImNfV37`}_MXXK>84@U>)mPx zeCHPz3tL;g2^D6GQzi4Mo;Y@gHOtRrpec3En=MH-he$uQzP{uB;c24N7?6gZ+qG))pi|VV`%~}xh!UsHeu})5|b}Li~Z<;&X zIy;91>xqDgt2epI8$7DvL~#|_bR8(7>2~547$)*u-lg0h5ODezN9rGQ6(9ICdjs*z z=bIqpVhEEu`di7A}R`Y05{-N7N(YDFolc7HI|%?4OB> zfT`LLM8ge@;k&SIWs;cZT;`mh6v0PyEU@`j$e!!dFTzOg;rH4*+1_)BX{aFD1K}`Nbn)ijH#r%TSm;G6UrI)O+37}pjLf=iRg7jT7OMqudLIOKxc}x-Tuy^9f zyz@oKm&?=5Ab)>UQ0U2|&GaQQi_bdwy$OPQx}Hz3_2DrQSiNXuFDcQv|{3%QNHQ4^ID4YIx`P z5X&QF?B?`cr~$nH4~377jm=#0sh|DL)q}fN3>?;5YnD7{yUqk%ci>F@B2Qv}^TfFi5o57!1{!c5NO^HC0tr)u=M>${VrxG|RmGu4laOGssd{?DT9UhBSyKR&M7g(MFBw zc*Y}$dE2HsuDx#O6Om6Y;S4Vk*fK;`SWFH_N!4cvE@nz%bLOHiA@9YPnk%iwgymC( z6fU{>Ce>_i(w?1tJW6vq&O66X6yyc9N9FzHwfXE^Qd4r?f5jj>VCSyn_7K_#YPqeE zW0$M8MPbV_Hkj#>1;Ga8CvlE9M_X1>Fsp$KzIG!fK>boIuttO84Jb+#eIBH0!${9R zc_5LV7Jr+^JC>tfDE+zZ6(t|8fx4%`>pTr{$^@eXmx1Yd{GO?V0bb zLC?s_QY^M+>W)5swN)aPfkGJa&S_hyE#;oSl&mbWiaAlt;R(HeLoyRZ^XK6Ll?M#@ z2Jyww7@vH_1_n<`v66(`LsfNM!y6Tj>9&w1e3pc-7?4)*DS3ILm`}gE9)i>waM>Yl zGdhs;V))%`uCCh;DJd1_{@0KHW9h)-{ZAfBM$>=gp**1_Vve31P7Uxff3 zCn10P_WFOi^^)$(kx#uNe7Cpia_9CX_5LR5B`qtZzf>zOJ6jWAfwnKE8`M>jq>#%V z1x&!IeGjire^&lg-yBOvlEso<>|jGv(nke38ss>N5oqTZOlbxzhQIbylcSrxQ}aHKcDxpy3MB{9L5JaKidfCQ zHfP5FoJkmR^~+GSv5iVRGTT(0GKNw1lpmZYld^nCC&F%g;5=N2n?TDZ_$}Z$@-18< z6PNHb+4gPmW39GzL%z=A=BoE!s!S)^W)LbJvhmZIZ*6U{dnAXKo5JrrQ7LBT=AH-x zZ&-}#CFpy}QpcSRuAuIU0B8eO3{~l||+D&SYJfKe;Q02qKRYa{dU0U>oyb zPKS)`HcYp4@_augzM-jaZ@vFeIootM`&+26F*Afcp73=0J~;B+FBPiH@30{~91yAA z5jD+wP}^76IgqAIOpkhhsMMY(R6?B1V$?E0csRnl$=qRQ&~9KHM%8`Q(9j!MI$~Ei}t~ zjW2x7Zivw7|1MGvTZ8EW+VIG$jQr=%iU73>f^t*2)xqT+q(ZsEzSx-DR1JYGHUNcW zB=FG;;mLE|FruEXyEMk*CtwF#fgwEOl^J3VrpgiX&|+9~3k+YABoS=T3vIjSV9~pY z6Y`0RQ`3PiG98|?NQA6__jxdYx?677j#KOC`Q>y5!8&xpNF?F)%Z&3mk&qjsE|e?6 z7uw$r>a*-jUzXSm7|_T)hhMqEz#h<(kGMAN@ATjZg>*tY_fBW@mk%;Qf#ld`Q5^#y ztK!3FNhc|J*pEBAP%NiPI{wuOQ}{J(owi6JNAOeN2)|-vmzeAp(syyJCQ`+2Y{R6D z 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%0D;DbE$76&i9DahEPQcZkY>dh0)ytg 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�!b>@q0N%K}R>Y#tTWj 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 >WTp2UTZP-J_3o8 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 literal 58660 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 KYNaYxVgCZNmp+sL literal 0 HcmV?d00001 diff --git a/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png b/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png index 02ce908efa5b798c390092cf410724ae2483f543..e5d1ddef4f84938f4bc2906686eb03949f19f021 100644 GIT binary patch literal 65509 zcmeEuWmJ_>xAhT_ZbZ5zB?P5Q8cFGH3F!vu?o??6DFJDuTUzPvZVoBkcVoQw{<;6} z7~l5{gTZ-XKWneG_FQw#eL`Q$NuVJUB10e$v{#a%iVz6g69@#x2N53pMzklt2mJTI zK~X{&Qru6x1%Z%5UWp1RyQc2Uxu`35-NGNZxNL=xbHKr6OJbE73NhwQVrvzab*8B+ z?X%Q!x@F~ahSCs5vX`CByYG{r(B&b9AgU_!)blnA2H-q?tgf#ix-f7QQ}5oNnzWzl z5D)cAdQPQP>X`NNF$E+E6#^Gf!EQkYAt=A4dQtrY*M4$FB~WMVXWr}YF!7JqOS~AF z^ewX?SbvT<7O5QMSM>RkuU?5snG?Q$uNZT1PEY!TFGwoKO+_-EiksYi9rwi#a(_Y? zZWn@AC8AMy%jqKJ3k`166%{FZq^Ko-AQC`gjYLKIW6^%8-95d32~1(aJ0G>J zpw!zbT1a9NVU_|vnd^jepfCl??k&!rK@V9-BbW?2=3Yv}9>4xMz z=)Qf$+9J7%Pe3v9i>tHX(L;U9CldU6EazkSeO=E&{v3$NfiPYIqz9*Yfl$u9#pyn+ z?p|f7t3b$`DJsf0cYGfyaC{W{-%$i~U&M3@(uYcot8QYB5_62J8jnf*c{@rsSpp)W z4BvEGbM6_Vh1ln=NvWs=Z!m==YvIlKhAI5{&fwxHySyK?G>NMmZw|-*K>T|lLri2P zZk>~Prc4buv)D8=;_tL5{$BR8qjwbU z(@eEbinMIxF5!q&H{@ME6L-SGLH=%7d>^6k7pq3}zvpIp(5>26pqn9*ooNnpL>~KH zju{eZlqZ~h{9deSTw$iU5L1Tz*OWwGlDu`4OEfi}6HxS!Qc&<09-4n2Kz_WwIY?R%O85y%oe^PF)}gw?9e_hCmoFm-$7u9(>JsXh}wnGx3<=F9{SH++j@H+ z?P_uQ#rw# zilZeox+F#a95$bMbc>&{v-T$o3&X!tRK(`6nhJt%N_)o2$_zdKd!J3TH-?6&f@IN! zNsJFyVP39DaU7gFGC?Q*^SNqQ4_f?V6YvZ~U!O0LpI_7cJ@+~DckeXO`N7zMi#_w^IOtK z_S`#P)q-ZL-bc~fgeYYDQT(f6$>6JDvo3*e?2DDs$__xC^0k6pO6au zV~;#bV_K?XYHoItBsUo;b&X^Z-LlNMd4_*eU7n*_aFQI+9sfQVJx;SIp^iaaL)hB* zZAQY+zXr|Qp-vEHqfBYSCRsQ65~HP_xRt~9&t_T#Nk6gs2o&%uHOZ-zG?v{Mdu1s& zIXK3pU;mv{<*MP~=Rd`WIy*aKpwxu_E>t2&k_r)qmyk(k$AfZM`D^xQW13eIT5wo) z9BVkB6pA2j8h?bt!T#qOkesgvNVEm2`F=-uBBhom@R8X8nnj)EDp0$_U%1Kznw5iY z$~+Y+_%u)cj(Z+5EzZBnQM%xsx4RcMSel|Yqgp4Es4g1KiPj6D6C*cVqc4@ z8oy2*mVkuxcV;+SjuPm35>yJt)SKL3i-YIjAm^8^1_xJ-6baB<^1#YCv9jgfP6>{` z!|Yy6jQN*FVY}b3efpWN%)qEqNjlMH-CAG8+h9?@;x;MEs8vbI5GR$(vuZy#%}^SJ zJ@N9dX^iC(p7=`Tv@Z0hQtgOyHSqI4b9^m`N;0}XCYr$6dU#eo#zRf*DC_kI-zL=J zpVzVF4jSABQ$HQ2Ty}o4eeSyCFLVPU1^jvD(S3Drcq-byE6J!+R&`MIh+3ZZ8HLcF z#~s5z<6!o1ifG>$P*@ni6S0@o&j;5yz9c&zI}uv$NeCP_GJK=F>{|O1{$JXmq~}Is zsH{_-iRoD@Er0R!9lu*>(BIepnVO$(mtSr0C6^;H=9v$_``P!BCP5yjt)QBknsW4w zBIn~tyJNCv_ySEQOWS*qG<}+eYhT%oNgn^cd#o-#5xrxwbY{(}J$FPTviA#7JZkUF zHXrPC!LBgeg0j07AyF~0m5y+{(yC%a7fw#c9n1({*sHeI*381T-W5T;J3RSxfsT<} zc~EwL=LvOgoYY+WI*nUF!R(VK=%hRmugJWk+S^4VccaM!zpr%3+ph0$ z_v)1*hCl8TxpDJyv*6rFfTEL3uk4E*g{uVVzLJpqY-?Q=t5xJK5@%k6ZSF#fpjo=4D9D{h}T1iRm zdS{X>@n|t|@t}&nvC7AmR#sRzIR3#HWDg+AIM~l@2VWEO+C$==sxh~PuzTLkDPKeH zZv6?_cb<981{;$^3Ee=$rHKKaR*e4rXn42AtQ%fIle4Hmi7-_d{X|xx-pt>gy6V6nNiqA zhr{pgDAAW3MK~jH<%sQeyyH*A*%ligAN1}B&+xM3uBST6l7N8V87uw#!ROIY<;b%j zDe;d_OnwJw=KE)Cil6;*2<}s+DxQt6Y^^rDG=FqNw<>e|&2hngbgq0l3?!M;BJ2dJ zx<)@za!1}i-;4n<8~aM_)ypdH4??YKm$%IN27WfICNg&*Eki1f!EEv~DLfjnPfLpr z-wEyu3>Zjz=j>3v%wAnN*;aR>)$Qz5BEKm!ht+i0m7N`M#gN6*-GdSq0g*U{cM|Ti zwK$=ICU>DYv~o*Z-%M@o>^e&^g7gnQKe!MOejlF}HC8ZTI8n@BLqO__$D-RZI{JvY zU(Rf%3Qar;zqqof@#=IX-1~-z-F(vEQ18gV#zs%S*`dn&a&?Fg3F(dOF}MAw1O$SB z;GW9wsSPc2Ki%tkpVNbhAHr6FJIT=|(0s*etCU~hW z=(Bhvq2|gE%@vRFQ>nQe+;3HGS(%xKSG|I^{4Y@1l2Bz+&R2R^ntiGha>u=La!vJb zf+8mq$8;5krIm{`ahYJX^xH!)7T1!_YBD{XnWvodasCI^eYgg;2F9A8NW1WSC@u{DMGgoYwf+AMTC?BvC^mD&y&Zr#w5 z$+w%P%eDHSyP}e@!cP?IOiX)qgsCPzcc<~2uIN|F<>1D_7AvZ+Fznaa$5@bWoA}V| z%QNBD`uOqV$tEW%K7I=e%V>GYmJlo>+qG@>qFn%8JV1z|5}td7UXqfK_tPZRWh z08wu;#5Er+ZEHtb$+l9?r-VS;?gFsZbFZynTygW5d$m zdI*DsRjoVrDKUhVEUN7=3&Fs$&{Idl^XAi)+^Wu&lUKAnqjm+pwRN%U*(c`GvNB&& zt7x?e$6l^2X@}iu(#_d?s@}dnyX*E>seJE{S#%rPC+$9znoe+V@$xQp?dL9O7*cxO z8V4y?S7l4tZ8H}oI;5QLVwlZ05KLEChvwy(73zLN2bhGOp8k9(H@(d9kTTLMg7mqZ zl=$TI^zzNEr-6kQQm)*m@83m&GeFU^rlyxAM?&@@Pp@Q>RW6N91)Qj^l_kHRYg<~~ z^{KmFz1o_8c;tDh>kl?Kc=*po!TKcoe;@|~lQ=SW#G{fQMr)bGTuzq}w#6!1T%(SC zM=P7FH1oUDO1+<|Up}D`nBcN*>+B;m-ssb#8#S-Q6b||L@e%8Ko854ernT;}hM{3v zl>@1uWxH9?A+D9{UO{UmW2nesVwCo8VeMh|MBA+@GzK7%iGmhjZDa+?xw$I(Aztd`h#f zn|8yZ*Yrqemq*H2;OhFWf^??9#T#VeV!NHo6QZ0Ok)SBdq@*Omt6aG&-RZlNRh#Tx zR@So@+v8tqoDx)fxuGOSL#~lVj~UOUSLXY=y9cLrKh>d$X=|r;mMPux%1#SfUw2W5 zv2J)e{Th86X>_{FOAez|iR*cZjwzi`H0aj<8|H5As$3d9JO2Fc+n32wYuwqnBlJc* z;YIsyT#vIGd9xul$(6ET*_0~D5>HR4e(z@N@VA}y_4V`hlpn*l5fP|6v$gf3SDBIZ z^(mc$7jh)LEnQt&Zt47-@Q|IpAweoCs_TsfJ>d*j_K~+I+hZ@p->tsUDa$0I^%Sm#_XkCVnv#iI$+Oy`5`j0D>^6{w!MjUt|3T*T9L zre!A;E(Qws}M3M1_I9aF}b}#yBUWxri4mKtBhu!dy7uK_g2xt49p&xQfJ+I`5 z1?{lU_PgGG1Yo3n6Qj%EW;*WR%qHUC0P*bt2-v`WYFp^|u3~sI`E<}GFV`d$CDO^zwSc{>=^1#@j5-%CCuR7YlBocB>%(D}ry>n`DbvfpBWR21ebWdB{1gHK z<=}{SN+^3l{K~8GpTu=x@{)9MH7FnWTPbp{RjIo#5)Qtq{OWIfE!M*UIlulE9UGhE z+kB^s94GY<6bsg~qLYy+>gg(-9a98KxpLz5RYDzm(gqAFUjvfaNw8*{nBdV}1?7dQ zX{|Os=S>`MjnHbU1r3Um-A9Mmg<|>!``eD_2ai z=%Se_BWTs`%kgVmoX+TukR_3%#6JKZt;AE9lI<5WrS;9x#7vctmA>Jx?UF7zId)dV zbA-*AT)gQjXaK_DA;hO(_>EUwOw0jhx290097#INjJ?ZKSGW#n%kZ#pa>P-7JWH&6 z`rA9hx0aR>cXGEFozXX#5>cdGfhc%bgoHsL!Gn;8hlGShb(St=l^M*Lzj*upj0M^e zyTCxyVQgd+DG^Nys}U_RsZyej2t%Zp$(XM54Yn*^>oQFPm!;fBWxMsdZTrg&CIbW_~gM{Si;NtM1iR@ z&bU0=7MEtV%`~N^kmbhr64(>l$WY@6Oh|b;IkVpPN{@Iqoww-a<>LT>%8@yajlB zd7$>_aAWoY5vf*l2VbOETP!?YC~sE~+dGm&Ym{WN~kf4z3c4=;FdTIXSsF-{?L}7h<{6hc>0J*BOPI6Kt;pZ{$-}`|@-O($T$nA6!U28_F#+?(Hh{HO5dTTPnGxT5T zj-LQX72@5W6dK(r*B+bIm2FjRv+zTye{>XXLGDVNP)r|0Y#_>p;qhi!4YB>hZcPeu zcP@7hkY&{?Y}3Y(9@EO<2P5GK#?AxZp?b244BW}U#QduRfv25=Lr3+BHg=VLMV*ZQlCqMWTC@!zKk`hjD$`wM8$1|9L^yd2<-J8nJJHU!Y#L=>OEjWz>tHl883wiMOh8-C|o_!HG#ri$ca_ROsn==7x&mGS5?p_ z5)Lcv@V=C4!=9?$5X9!dF8Q>U_I5bnvxCJ}m_Zmsem~=$T3FSaMqB6UHWIG)>-d0V zcd(;DNld(RxVc32wp?82=jKSugPWyoO_ZZ`mi8QJ3Q1Ynzyb@V2m*d=kWyl4DSQiY zU!d>I1mZrO(BGf;{8z)Zw!++#3ug1EWT+&CPB88JO`pQ<&Fwr^V6Y=$bUdG)Y47aZ z8fBGIYO?EQIadXHUz(++!twI*y1sKW+>8+-jIL@x|82v`nHeK!Jeqp5H7tkqd{}pP zy`+?sa2$gQ=3oQ8IO-k533?gN)d@zbN2=XZ6Eccyfp zQf$9r!Ljp)(21>q1!Y6PS_s_)$!4ErV??A>>1E1$^ny6k>mq-evM z%|J1^jYXN5F$}D4~`^y_aeUL)!%~rlJonMEu#DaU;5NK&>F={kmq7jX9npyrK zq(tlVg)>vbKiT`im7@YI#YZXX!lI(3rM;lfpU3gpT**O&`IATHFZo#XAI6Q+ ze#OaRmQ=XiEHfhFAmn3;wCbj1ir7>B#^&oh+s z^;N!OvwV188UL;Pt4{*U2mLp10$2n|P-rFG8!NnThjH(Ra7NZH0#BfwN-~u1N#yEY z2hH&kA>==lt}q+N7eP2?hQ9t2vYSk=izOsyBkK@yq#i;P*@QD*w+v;#6O))r9!WHK zB*8&mGsM*p;btXNO;}Gy1xl;7O;02HUo{4MHP%t`^TRgxX#})&$!+DJ{Uf_oYSTnA zle}RI=PF3@^WQ>zI?=A5y?M!!n3N0yxhIueFL<<@K>xI~qV#2t4-K{T*=3|HF`qs5 zCtkRWje3%tU0I@uu4BQ+hI8wm4o(h*#~7-pt;7EgSXQ|h2Rr}mTVO5-4mPW)RhS=|D-IaZ4lExWj!3$mR)n^apDe!9yAra^0KOuFkgMA+NtGCkj|RI3?u^dN1<{ z3l|5)Ma>j6Qh)6L$oYK(r|Yv&BhPRZuS*uI=Qs?osG)vy+UCd+NqZ-M3(NBj3T|pK z2A9iO>L=8+Mz8PA1{prnGY4t6ZJ%g`D-R?cCFq-&gej0Uu=E+*ZEn&Rs@D@R%SGX{ zAA45V;DjidvKS7Pvv&v}{PjL+1!f7!fcb_%*_kuR{io`ht(|p-O=|^e1u!TM4%yjX zmTNAOb*h$P=x_YwIcWJ3}TUuL%jkHX@C`v^^e1t)#Y^Y$Q-fF^Y)Ul$gJ7Zt^ zN+*?=^(1$}?$iTux(XcvQ7%x`NLDU4;MWsf2p3a77kujfNOhp#jGcA$MwhUR{m2HA zn|x~P;`9LW;w6c8jUz5+Ywb4TAB)CC+9$;TA0^y(pn>`IpBVvncii|aa@epbc3*dEPEGgo=KF=c9C zfL^JoKT~|;dVG#VD&XcfS%V<9!;TeKIp==b3RqSv|LKoTbiXY`t;&pp-85f0^vyyd zwGq>=1_9~b?SN<5I_70mdML{<0*8M9L1+J3e%2rPPYaOsZbUq9WkqA>6qv$}myM7i z4jHg;T^yGu+hL<0Uu0+J7@S^HmzF-8;OZP{!=0;l>{e0(M4^~@{b#o*V!@)5#7d&- zmBpbCc^lBk>Am6u8+DA_0iD*47z;7;lsrCrNBa?18$&}F`GM)gXI_kTj(dswb|tV9 zw4C?Mg6g>wq$QR6NM9oZ=Fj?dEKUddRYpcej_ByZASlnT1s6n$RE#!^2 zrS>eW<#YpXR#!wvvPusYKK|?Rr7g>@)4mR#{g9dZbD`~&@fbEUS zOQ0YeKMF);n{9AH$nDpD*;pq4%*qtEKV8fJ<*p2~xlcD>+_#VX!-Fe~^p~^#t{yiX zqLY)Wf_Gwafny)ix5vJcU#mWe`osr<;(35JT3h2}4R$(0=C9W7Zp05XQ3>-dh}O{= zZQ{$(Q{M3ff55{~O13ub6K3r?0PK~wZu&xIfS(d^jN^i?ZOq5iLInYOZh|iPPa-Mt zebTe1SB>>;V;x8mQR&~qDpN943k=j62``(@tX0cj(!>>kwxxVmbnEFHLaF_(N%txn z*MwucDUNtsllTeD%#Zw@ z8MM{`@0n-kK4PssE+E$<2{~GtZ%+ueFUFYcxq9cptOq27wOXP=kij^}hE)R?sJ%47&}l04h+C2;QDQ2Zedm#(-W+e=!dzt#Q&l z_=Mb288@h&PL*&g`rRjYT?96T_a`hp>ep=&iKinnba7H#(-SXSvn0BEM^g`mL7_TU zpekfJ3yV)cu+$^p)%s(osn?K(vhC*$H7R6oK2o@6e0LGh`5(G4U?I%fH6gm5^TB|J zzdYGRi_?q*KvaYVw#sG>j*M)dGS0!#-ajz#VXFDKXuY!#m;Et5=&-$R>qiH@YO@Ju z#9(w1A;8sa4rcJ*>b__moOEdRuC|a5(5?+z?@P{9$btu~EF-f{T?A-I1;`6{v74K( z7fzjfu3Nq_Fqb>Z{UWsfLx(oK>^|u5DoY z;OzmE+u1e}U?TG(Pkjh^Yl~pA)`F97_KpCT6>yKeY0ohL z&Xy6q$H7AuV!GoGK7Nc&K=7NX3eaW_j&u@>>|&j+vi1d8R6qOmXQiw0gTr5RBkG}f zmf1Nu8O8<9W>a5D+|J&SZS?EB)Ypdy-0k4x%Sd+PLI%~}t<1U9K_JY*0gq~l@6{h| z^S3J46@Z@^uKF3L*I2At!~g;7EN%y@efu*+3e3Sw_Mm8D{|l7I-@jEM0NQ{_)$_N3 zgOmY|F&oMEw5X})5uy3;eQqqLu#F;f!Y4l;$>df57IH8m-%QTHLnsoA>X(ya?Ax`L ziXu+7cDxHF>N~Fv&r-|xwi>S+p2v*p0qNdJQSt(5A@`j|8rI({&DPi1=$LL<=7g-O z`lo!e=5bRAaFlM1-D}7VS8}HJe`QiQ9zqUwT?7Fx5@AqkP9uZp56s^TSAD8?hJ_H0 zmgue8=j;Ngr(WsCRIG#1(T-$Prhl8xWxJ?C{8Y7gm@eg}{&l{xdC_mIlgHR#M+KA% z$ip0YXrKvW0J^a1r3WlB_;*;4#c%S0ok`y|?i&pERXR{Gj2G%4fV$Y@*CE`Nt4>cG zhqN?G?}Y1FoKK_Reg3{ke_;->3AD~A4Q&v#2as5Zz@qh8;=L}Ft*mmzl z&t%gTgp}V)afgRtMzxifWQMY|wprJR>TmTq_pu%e+k(@YMS%?llE&v5qynwpX8Ml` zDcL?DMpEw8kTgFapFx1S<^Ki4Az@!;`O6cOQbx$Q~i)D29G8W!9hCj&zMbC)VMuW^tYqW8LRCaLv% z9z{hjl>s0!wwh=X0ZE{xRLC>O>J|;UD3sIEDx zcBiA=%j}-9vis_hupIBrKg4BFhk^XBct1|%OX)v$LrUtfk8{C8XVv^&7!V^lCfE)Z#32Gpr_i+pF z&qj70YoO@sW%2M-*}&S!yJ$DLk$_rI?BzG{XRI6m!=Tu4UXs>1A&G~tM;;z;J>Qx4 zhI8_4&^J;lYq{x?Pxt?j#lJmq@&F<_8`W;(@HpdrB>Oyc90@=#F8ga#;o=~Q(sxGP zYxb54o)9DqvbOPY`0rL)t%Kz6<)>lU}1|@y5AY3HaoHp zI8z0}fa$}nZA#mB7Crf@Vtdeyv@`F5Uw=jt6j;kWjqos2I+&cEwd{Yu`>r}JZo_T) z=9Qfb%nB8sEPfj3rXEXt_GzwS* z!BQPxJna)sF)>tO=LvaPX&#rOfQtsbpuE&&Y;Co9b@C`j_HUiJ?D`ZN+ni#s!VVTp zxrWiz-i<_gGnVx;k4eK_N?JMfJ~DLg*u)g$>7aAb8Pwl>c~tOqOA$(!pKk&WOS*r4bQuAwo2;r(^=YH3*02m*JtM zr7yac< zk=thKCBX9EO8$4x(x$ zmw8Ha4+O?`q$_2IS&}e?KRRKGu`Y$vzou8QEm|v7y6FFIWxIU*4iF?<15`x7L;M82 zl2ljm(*&g3=lvz@_!)@@u=QFdyAjz*EIwNmJT_BbP|LDBFOs~Et|8X4m>*7gF_G*(TfTcwzyU^aG#BjXae_G9H-=QjLt9IHZ)G3pRr1-S+)Fl zj#sKbF3;2P=aoJdb%hDq(lZlAzt^LbP12xYO(Y=5O3uM0lX*o2;hQ-yX1!NPy z-Q$9B8{c9B?`NeLU_wVN{;ranR-Dk$2OdqPOl&G&%hARB%d~yD=im)KdPB?61CbT> zNT2S@F+T=ttH_ea9mPc4 zOF1o^b&)R<|9g?HAvyOi-RGbjs_D;2e7lN8uOU%`0ojZTmsDja^S4}gPAs+I>? zQ9~(7o?FZ>D~1REzWb&XtM!aMW34MT{ZCZ?iVe+thWIm*KnU#_-_`tK#dqGc69^>N z(AwyrE-=L76fys&OfR=5B0T{?;+$2C&~kRB`%~2^v)L95`*-uj<3M#wbNH9>mvFby z>H5`^ixwY&KUITUER*_`ogh}r=L0YJF>EOk<^cpelM#hG5Vl$b4U-;MqBce3FR=I- z^kY?_TbXE`H4-DG;`{8LNSM=(gjRyVd@U6Oq7;ZV{Do=I!7&@drUL+^-v>j|nQDK~ z&zCi*e}~mjsw+n^7tsOuz4W zqdso>h*4H1Tqiguls^8H6scAQp55o$870;smu`uj;*WdI*`@->y9|GQ%r~2?A<&*{ z9IEo9Wz=d?oc7)tHs<1~1w!FQnU&rFC@I;N-dmj`P%D^`JSv>vIa#x68tBnl=+SDR zj{DYJa%39Pjae+%5H0b81#MUrr%RIu$aE7Q_mi3}tD`^;p0FcLU>lxbl5F7sQs7ve zi2agE8w0JaLC|!iJHr#7^Hk&-blno0^%XRNPc`WxS@15u9$B3)8+8k)mgu5go$WE6 zIB)hHa(KXpXVRrpr184pSfSNNyvP|Qw_-2Y`f^sM`22a&BR!^-Vu)FeLc?yA?tt`K&I)ly-eKYAFoOC|j;jTbO4sze+*_`mk+?yLA z9&^S{`>vb#k zO$Wl|eGB7uvWMY6Sdi0wK}0+? z`6o0q=9YK*=X4Pyg0GBbd|`usG4TR{jAn_J&>`Mg6Z1|3GR1wr*zEBja^-BpV3CB4 zsMy9`^z3zUI`f$ib9(rFerd-+Q)ZFt z1W~R&Wm{-Hyzycvut-f$P0wiE^KTWH5nWT*IWmQ}C`cj|0g6 z0AXTl-<+1rr_;t7*TeVs?A{g7)I1?JuM49PkqC)-s@4H&d9h%*{jf6x^w^)E`KL8% zvB+|-1p?(x`%e{%fP(r2F4xUcpoYrMexlIRC!NY=r-(=)YOa}Vdvt)+Uuhl=?h}Y9 z%;$Bj4#Mcw{x^R2Q<<8HVydQ_Jqav=cWR*X7@F32dH>8!rluVpcvNBr=3s3sP)g?* zVG#5E9+3N)p_p*1$lI$OZim2V8_zPkk;hoLxJ=_VlTT)68#_)(>a#BuM}~i;c8ylN zC~|r{E^qZKyr}ec{Y%juXd>g@%EET|`Ui`GCT5xYfbI~et5{v;VLtT>o!$ z)~;nJ)@_X6n0^a2>URLuIQ=&J0bWmh$!Lvfs>Rr2pu8B_%vH>PbV9^2q=-Q$zrt0*F-}Wn>s++BEwv&lU5Bdy<{)a=v!lotFmPaY{<6{V&U@qeEP*=iIwi8!59iV!-pDaXX>I#egnD0S+t_tAdoYh_*=y9n-z90j-Jj z43L86u$Wwiu+&H8X2Ojh=kMAue(KHudX`lhD$_O5*GshH6n z1n32S9Xm}|3$8NFWCsEwfbe7+yP0m;vq<_AFji)jnob!|Vnwno+#NIv<6uus$S1ge zrb`d!b)n3;p_NO+MrYR%oApN+t^&$yWLi9o3}uFJCo)=U>QKPEN$y7z^V1N2n$3nL zkVxz~{92J04Da7}oVZA1*_?*DH99=qyzSj@Vm8;B_7aR+V`ttZe$$MOhW7MWV9s#NVk=clOl)bbC&6s4F0S*`*~;Ii(4a>w$3oC4R5k&cA?thx zn(t%HUN;DDcks;F0ap(!hQg1qw1gEn9?R5hVQTVqM$zQv^0c!x(EGlNOiV&j`mRUy zcbTCJT!yUnWtFktU0PugDVy* zYZ-{khr)<&-k6xr!pf#_3~@1+ilOxC9VGOhc?eDDPC#`Y-N%)j7Pt5PoT<`13Ot<~ z>r-KA9tinKYoRQ+C%9?+?mn+ej=GlJ99k!Y9(a&DK^y zgHna+z8k7%B-t-{Inx znm<>Qx$<>}@WWJIZy}?r3luzs>f#b*iAr;oq0e6YjJoBh(WLz1z}HJFE5&pccoMlS z(3Q>ElR0gYb8lBy-+-kiBR(7j9)mPQz*rgM{H1H!Rgx|!1G6&L05W8q@$j`tlXtR}~j z6&6GR*{g4goYMK6G*@oQR%l;$b=6CH{@9~ z>=E~7L)*jR3J&-0WWEEX`=)X*AbRh8Zb9Y-9RZ!Vwb8xoo@l+*ZGa<_CoEB@5(!po zo6)L94k#;Qg?!ejC%@qNj;_1@gt`^h>I?IsITA(7XHtY>viT#+0N}HQ}FAMr|eWrE4 zf5Y<%eKDFFY+d`tb<-`*6ZhE$-V|Qk)>}wp3-CTTDS-j!YyNPvfvh6Ziy${LE z%qsJ^_z9!->W6HC`%AL3P!6%iXcFQb14BbUCn)Fge53mPbDo>@j%uD=KMXGgNJCVj zOCJc2&)p9dBgpO)VlUq>RI=>de1+a5eGm{JGJY57WXJ!aaPaCg*GAN)(}q&tgA)t< z^`Y$5UQ|?VPBH>&{K(i0#mt4|TFD>1pc(ICFR{zu>=yC=Po;Ot&T4$yc?ZqW|XK47w0tm>V2>umG3 z7=Q*b%_aiMX^Fi%?ee&IPZ!99VOgDLpS=C@&a+)@a@E{oq8Ja%!6Tqmr{w0=m~PrE z>Btn*kFm8odF0D91Ds@B@~S_LpJlpg{~nTwr8mL01E|P8J*a9bbki&Ud&NeE-hu5e zV$jd}_v3kCJuD20odHTJDv>N1p^eX_JdTadwO5IH4O9}IPi8G9u)v;`hiT6#0?uuB z0{Dz8#|nD5>9##})IXV5YF=}@G?@)EzOJcp3ls1}2>E6@fX9<>yysar3oCY`y;)wA zcXkMr)uNzb6_8S2y*d9a8aQi_xF@Lfu-QM&iGjuwWz7n2YsZ)pC}JLKRarl^_ZAbF z5J+L3;N{fW8(5y#x**Z|D3H*}-p|sMTH;iT@$2eFOnE*@hSa$92b17@+1E)suLh$y z<>;x8LvH*C*@A2tJ&F3DaAiMI0bkSb%NM^bWxrZ5Sf=UFsJU~Eft}0Z2q{>-dq#^>0MM+uSrkUkJ6Alo5 zjbA7LRy%Wec&uKalhX#lA*&%eGd}2IBRX@h_XijDyKjT#5|lQX{rh@%A0nQyb#^@< zNsMrfw7V~nhb#(}60BVh$Vt;Zd5}clF&LruDp3gJZmJsV+W>KU`0)$>N{xDZr;4v@ zp{mT4Lto=*-$0_o#1<##Y>C6eUY@VG<`>5069`xhJy@uK8kC;rZT^#XWm58z;`&B~ z=ZY`|2*tyW1?IORiraIaqTLZcklQmRLC5v`*H~bvdSJ1!;;PI=N=+N5Vc4o{5b!l# z)l8=c=jmk>^9TI@aZ~J2SK??3q_RmbDmb-eBdm*KEZywfc=Hro*}f%nE!>kG;-S9! z2Ob5ywr>aQgYKWO;BbrcPYdvyMquMAF8{lk@_!YVi5rvnG=UD79WS;^mXRF`2f8rg zsAHk8WaabGAc6us+u1WwX2n7?BLx< zLlb~`zMXOhHkOH^k_-|tC9{uf&Hdq?L~Y9L`GqN&m`INBN<=p!5#Oe$S#ferHfwHE zpL+3u-LBuWy5vg@`)IVA>`9D*&;pW@@^z=1NeBXS2e2PNOj)!|{&|~RKZvF|Pq9&8;o%J=rqgJ>$AakaR#iTsDqc9p^Z)*mnN#iORa}NqeY{Kx zJDCp(9?NsL*(dYv77&1=@}npO1blVe&y>C>BN2`keLvN4pDN=G*&rN~RxZ9H+8=3n zn3tGK-K8Pji zY=51sRxPpfL$Leq`sU|gjtCLZR50C)7O6yn4M~1}7(rr)JK868;cV#-gc)4B8_eV`^KO#l`OnaJF=TciR z#=s7_qWRR<%AHA)Hy8Zg0xoV&P{fu7v7V%Z8NEW?YNQWSG6d<^kLa~STCD0rqM{xw zt{2Tb0f&ZcEcO)!sX@=_+zXp&ALKQUsRk?BCADIOyFG+!_s1-E!KDWU?VTMXU)~vo z;hva4Px*JI>(lGl3k+Tm7BM*dazxDPlFQbAfRW7p_T|(t^;G>Ggb21;sX*KqfUY0M zQz(aLPeppZp#4Z6_%sIPu)AHR{;HO57P_{a)AQ)$G_%72jb5RbXoHwrz1|>P#fc?Y zheAG0`-PP<9w#0iht=HoN(;_B;@6};MznHAH|Kg_=B4V#`{-1&pFufoRt|=6M)Ngr z$*1flXQpy4*?;$av0`_qw2EU8r@iTh_Qk>K6~;cAuki4Uua;hS zG-Xccd%XL1gy_Moi}?H~gRA~Vd{lUtpH~LY@bi>2h%GoRmzHy$A-k^2E8g}!U@@|A zH?7mrv1i+gCb+kQ=Gap$6_cUzu}7y2k_+>5w?x&|cvMZKZKt1vM)L@LT$cPkGU`6^ zfm}~knhFL-lgjg{%?C35NO3PLN)c@4ZLD{J`K%adACQW&Ht1=5Z|~H8Zr7`mruZ@1 zcXJNk?iR5!Gc)b%?PZ*aBey4{Itu=Nxx|!gm5gL!@0WJGJpsDa`BOi4RCrit7s17u zNxlQe$QOK;R17@Ho(Skl4SAf9Y8#2yRm!i%ttVT7gTHHX`X;(29ZzTe>ILNEA^n4v z+9N!lpQ>@(PV0=Id_g7UVSL4x(AxSVwhigSkKRn<0;Fd9IN%8Zx;2T}mbV^zuZlIa zsz2vSWG>7dt*&>MeTZKe2uN)!vCJ3MGPv%E>uA>2=-K~oM@0hxs?cBkVuMAy{Mu{X zk`7{B%v@n{LX477+^YXw=1FXmuaLIW^)a8U#}LLELf_l#NkhO1Bc8iv=>0a0D;Bz zj;Fo+=E36mj}Z_t8vPPnwwrX2`9Ks+oiBOScm_*qho{VM=pCTWaKTZ;R3+}D9B|gO zEep}$y9+d@waeC=IDPMfX8 zXUo%jze_THdA80JMJg!f(@eJJfm2d$>)=3PJHrfYEcG!aBr?)yXP{ZB+1bf@E=vD) z8P|2SM>;2Lt%!N#ix`gh9ardn*NxN-5BoEG{gb*r?Hbq6=-?(_iQ5KZey^}d-x)B> zCuVmP{eilr<}z>d-J3a>2#@A!^a!5cauSXgfacp1l=#9-kTrTdXgQ;_YmXuf=8uU{`>6%?+yjhG$qn7S59P!A80fb2A)yPHn>({e`x!R#G% z>L-Wnx&@MYzh^0ZqlK#UKN|hgNI^t)7xQ0jO_xO)pNOvc{91K%UN1>HVm0b4v81na zwoKU!#r_dTuTst>0)Jw3_{%$y!$AO^2v!W){jh)W_7UUa_s_SDNtb7Qw`ukG5(w_w zqlHqDU*jfA-)WT_NlDLL#hucBPl44n0P%m#?a5qKRdt`F`**dpem>zu|C5N`ap3ow zIQ&Yv{r2p`kM?OaE%i!gD$d)+i$S*9S?zbl3jBnl1);m1T8wPMcbxON&XEl9xk}kp z5r0}b-6KzCieqZJIy-}C(4d2PUQAKMysx@zUkig0+Y-J+_#xf)u2_;HHP|@&W9RkX z^>DS=GX3{O@C$4L=kbT&lfO9O3BixZqB^EH0PyRipjh^D)*Wmo0x^-;s{InDF zU50~;RKiK_8+t*_DzCI=)BgUQ(%(Z*dkg<<%Cdile0XN9^eI>jer-4m0P{Whz@%Oi zBILjDMgO~Bh1E#d-jy;9oKzb*8{{DTBnQt{KCRQAiZ7q+5}U?P=xt#^ zP3tZF_6@-nk@aiJ3r}Qve{IyS!*sGRjF{gcT_I*Wd@HxE)9u&>gy5ZLZYN$#!z)Ct zoo|}bZTa|Zmm7|8$O%iWmbMKhTvsUXD`q_}BrwQOsS=(HrV@Sn^l4>J2x=op7(T?M z7It+s#0*hnFDwi^ohH6qzDC0;JYg-w%9?n^7hyH`8!Jl*tFDE?ZJX_E(lH7C-|H%8 zq8k{Zp)NytlV5b5CLbN_9Px-~bHt$XJX&F)RabQJC#L?z0{tVhmnXLvW!KeTbO;%f zjweZ|#$#dWOrC2mbgMo7QH#O>aAXmuAcmv6e=vTa=O-(ny(eN~{PX+W+FFC*5+`iz z+sw%?=R0mO&EV96{R&X*82Tj0!HQ6SL7z-OO zeFvM8Nv@hiGLl(uD>T)1WyBlgNk6~p5t~m`zi7o>%T%sUN)T}1+{<55$WjPNeinfC zqf||HFn97Xx`)R|iE%qjKVp#Dcb})=aG5CdejL7qI&UvT%3>%VJ1c+JC%S7SO6_#f zlzCI}y!gFhH+i~RQhIN^-qG?NB&2&9BXJyVxbH{p*{xQGB2CUTmxJR*J*Z<9^GBOn z>efn(`>y7HK)?6;`w!91R7R5-g7yv{oRe#ejEv{8++JKJgN26O{62`o50Naf?Avkq z5b{gIgMxz>S_>!plASow?xQQ{w^ePh>&(yr=itiY=IiHy)I2`-BOb_Syn2GRkBM3A ze&&%){@laCh^VnwRTw!_GMxn$nX$lN=;hiD?whu&~1T7u3JKRAqnlZNoP=4vxS z;0tr8M=}Zv97MJN~I~EFukPy)D3^swh<&97QTz0^fzCHv6Q>- zl-Wv4pfRhQFwVzfic`{$K3it8KLJ(nYmt(;`{QQWU*|_WhmJX?O3%@Dmk!9#G%EL`2sQvAV-`7B z+u;xiq!iB`*~?U{xli;!;fqxY#^F(_8+znFN1$^b%da!4(J$EVMcEjV$HHoF#BOY7 zPA1CztTST%S4{CKw;cmD9%W$eT1xsh)UeE|WwAD2i3=PGP)ROfq?FD`#^`%h_iW<1 zMYV-W(2t9tgG`N->rgSiR9G0`5kYf&Tj9HBY-A+vy=_3ahgHCCDF6mc^VYwK0Po&} zqB{!L%+lJrgg-Alu<(T!KS|JYIEQrg`VHkJc;f;h2uT?u^Re&ktKO1)wuiiMROfmZ zWnf)138s>KlwMrjU&Vpa?B=V&%RnjqBG-tqyK-{9bor4s5D8y&OnUU>#|Vf_CZSOX z&tSWstvQ^Yb@l_1m|t)*cnAZRfuDcm^+J8FI%0e0u#kl6_e(<)laf=x-SKkcfg-+( z9F^AhS1_Y_x0Id-lXZ_;)YJ=zPDl-lq1Nw{KKt$msAoe8Y?7BC)w$@K&$>Wi$3zmqHDqplk{wsZe}CVVXMV6YKvu7@90Q}ig_o) z+TmERJ37g|(UiNtSWSGSR}_*mTLuetyJdXVn0$$Fo7@Lv;IXJ$Sv3EWRd6X??uIp`;)QY7(N$15R^LB!!UYE zRYN4+M3%q1BpX*oNkDneiA`r}CX`c7rFgh2>&=C-yH@RK&-=()gHF{v>9}(qI1cDL zhFdLDLtA?+VfRSu$IU1Wi(>{Za!S?7dE76vsFv!1HdP@7nx0vDej45#_ zUX*L>35hz7UKfe=(V^N6%tZ>B8_uQW^Z4KP_xGh@gnh@KU}k8h(#&^68Xin&qjf~E zoc*ZHVY2Z^;!CjE++T6CvMj*7lkZ}_Pc8UVLE({%Oz{8gble#i{@dwTB@G7R-|=vF z=*;qeNz{RF%^EK1a8h;aw#-)Y1hA#BJ-2HOc*&g;FQadZ*yqr+FO6qorXWw=%Oq5d z^V$B?*4|1^wRDhdIx{sjb=>em{4TO1X9)9)DPBN(sQuVOGA8+1H6MtN*=l~`iD+pl z=BWmyr06AoYx;cGqR8w77nP;TOov}eN!@^$-aIaZNAy5Z`;UMH4CHW+_uYbmDMx1) z7Fv>^I$?EB+GhoI;DvuKRTj z=E|#CFIwwuYZZU;^OLr|kdnC996(g)`U(?{-j&VYUcCJ?Qf+*$FK-po(SEOL{w5x^ zAGt=tXU(g_5u;LK%7r{T;?WAClKtZy(A1iKYV~0-xDeG)Ij=ie6OxjmKki&4v;Na& zC4BCBOWvqUZ!yu$(Rr@1eu65b#PKAThh*oh+>z*hQCjeh@ zeuGpVmBof_77D@H1jb->W5XV^%gZ1?jffF&!5GL^LghZGbGPf}=H`Lt`{c)aHDPq@ zWIqYa+|5rGbt56w_E5++-kGGuawtRf;@LLW!BX6KD1grP;6#FJ#FZ? z{s|F5t89E(@-Iq8Szo~rl8*5EPg0Icf0x*ahq^qguHkiB$T6Ttd%XEI#bJY}NWH2& zT}UXD0rfZT+c($?FLHnXCU!+tEH{blj8u+%>ej9vo@_Z^OrVgB3u}X;gTY)nGZn(9 zQa#u3=-XGh z8q13?GA6tHUiMiJz1HvLT73gyT#SWuW*MI? zEH9po(9|e!n!fgDEUcY7sCTXZw}Md-pFH$717~cqaS4sLvTZgb%uK#sBSvsAe+N?q0H7KTT*P#U{QVJ^c0GpKB8p zjQDTYHIi7#LjIoyYw!O|`_#i-d_{t#m~@7a0NRZ@eGWa2m=_OYI0TqOY>i3^>swkp zgMu!l^nJ?h`&9pVSneM)%5OpSrrdFy0@qApx(#)8XZ->Yt@<6@IsxAVQi5;*7@=4- zW4|ZxPyaXks!T#+?1fkpJ|TG$e06<3d(=Nzdq`G#Me^?o6(N|D0CWgoywA^F+<3En z+j_xL;q^alXHgJy!e^k5({syY(}?BFYg_oHcxf2={`1+PIm|JiAI9CKxgY!SD&=dY z(AQM3mY3A0^1>>7s4- z|JI35#^_xb1^baG%}6%XfF*gpHIqF~FcvKdYC&ymat`}`@` zuXFXLSmMjR!sF4u88;+{QId{M%CI;xGC=TdVd0i4{XdVZ5^QFO>8U9GNzkf~-HMlQ z#K@im^}@HquOqD!3LYp`+`8Q}Uy!YSy{cjDQyb%mk<226<3ewMxVyu3$2q{3$L4H$ zcf?M@cMTpIz0a4icqXR9Vc<+cBg;Zgeg&N5VkrOi_JZEGS+zRXM)AQaV=6?1Ez#kk zeJOs{Z{J0LCR9>K>H95v?@k>h$XxVLWsY!L9EzPp?1n92q0qkEPZpsTWy@fEo)g535SwYU5F`Z3x@?FlaUG0NJUpvlR}1(NNt!1(npKfgcN z-`%`<^E0biXK{P;Fcvwv=)dbO>(_528dIu`-c2^}Rkwm8h7uRe#S5?4dHi;z?b|2# z`5$5^gXw7d2?^K>tuiNy*v&?4-4CZRX>!!B&&|v<{P?=@vrx}hVb1}Pq~-K(DDPQs zq7ZwG^v6W(`Eo7bda!~hdofJFVI&IcY`aseCHO1^ip)yK{~n+*28g8yR>Yv~^Cm$8mPU@8ebZtmU)aep#5!a>9H8H=J4S z156w&&yIt{2P^DWZa4b4y%cLQbKYBySdP9VC@7erRvtX>K%Ep?eQHg8n@#0qexgwS zFYdadoyAKe52prh9Hm60YrVS|{JR&|%Z*3PX=qaZ3|FwA0Zz~Ev@9i)i2LF-_u&*i zq>xKrAc9u^EXF?C79O^til?Al8eemY%$;akSaZop`6d<_v6N&hovHi<|5izFXdsYm zh~juG^aodCOed=SdY|8bSiCiP89{Nxk}i`ZW7mZ@yRm^+2fdM{15xwlG_B*}IEWn; zVq!RrR65p&i+!WC)w{-HRF>h`qm zI1=7XE-?P^i&DBfL3u0!*wMF@6`G6o%Zo#(@Fl^`V{>j@DL8rA6DO{m-L6GYS644L zkD8FYGknPgV9Qa$z-^I)Q7)r}(|OXLQQy?lEQTezeZO77#J&6@*&x8z+z7QF^jc0g ze{Z$y2Dz$tbWR^!Ky9oMbq3mxbB*TaYO zFTeGE{Sq3UsQ*`tWnB37NHvx#&&$h82+jnDOZ`uUaxRzp*RGw1pV{)Oh*ITy+uK80 z_DqT#oB2onERn0oq%qRHZXA4jwXUmCM4Qwsu)PfOQ&<|wZC3TB2JZl7WL4Fo&aaG+ zTMrbwth=i|IfOc&9H7INds6z2D|Af2W}!>(q@)bK63hAHr(eLR-E?waYoCLcH+rPh zLo0?LDrT5HuSk(B`Z|WyqRcfD%5*3%R+&jh@vsrXbc6-sG z@BFj@44G#v%q1gOo7?5nl?zSL+3YtG=Wwd^mx}a9H+S}=t#S_F8K}VdrCu9NNlD57 zHj965u3f)Mt|}J>j@$}3y@7HI>O_}3rZ^r<>pQ&BeJSEQ z-8?DLf=5an;YPiqm6za7yj6MfkPM(s}q1Qh{oo_z9^!Vt=YJXJ)JmjowZLdy^ zlxAPWFi-ug^p#oVpxz#Kyr{nZHv_K5kza!v!cPuq5L)g*}7KB){OH*h)L-@-t>JCrj(%5=?>Er_-&VH7l?gG8aDA z=Y>33J%Y3_^kww)6?a$6mpTiTg-XI{o7G#RzLAyy$){V-9AX)EACt@CA()kT!O@y- z3Gz7FYPAYyRv`e4F8jD+exXI2+Wmt~4@LFCbRUcJsRQC)*gNKGxPJr&u7E4!{|VUaX^7a~)eo;q&T)6x!yL}tfjTYd&Q znIvzFrNJ>;qPC@^!wiFb+T-GK39tfV5r zp_~YMKa2wXb`F>;FtV;A-NI{}557KqTq=fnP-fnr7?MJ8fPIt7-P>Wp4e!GL%@&hJ zFqM$j!tPRQ64TBXI4?6AzkKN>qvUH0HI@fWOy8`wM^p@%PetZF0?yeCedo`-GwgU_ z8y}V8g;(k3v@eejf7a>|2U7}|8(V-(8&X$9sBrCJWVXbG5~elyThg6PtTc93UF~CM z_dCv>EMO8&?d&Uc>7~mTehqbGNNEwR0LWhH|fV&z#YvSSdsEXJV<9=ecU-(E<)sV5^T{iF%-9J_1I= zVPUw^;YMKr#r>R4!D7hsD=J`?TI0O;#V-4{LdF!L?{Kod{Gf;A?O4WLQJ-qRz7`(` zpIStf3su?$7rJMmNU+iNhCIn$w^BH(hJW{awL|^imJHITG0$ z__LL|G2fvCzNd-a*bA@fk%AzOPSs6aW>yhQx_&-S*!(-y1P@qtr0l1J))f_7!^B#! zEL^u)qV@Jj2@X02@|B{#iuz71Exk|o6)!4e5dxyRGfi650>lR$Y5F;6065i!i==N2L?y{} zwEBAa;%@b|CjHFccu>9n4yk~2fILwYy5WB8bzUP7*3XBz;kt`nZayv(Wv`)b&2fAo zEE82mwP-I!N0{EF+g2Bq=%}Sz(=}P7qbD&?A9(>`g$Ms6_39OF1RI2>1R6XfH$a>?n=oE`YS-d}&8Wr5_1hIv|8dR zNV;*qKsIiri^KF>yL{l04h70>Vt6=ar1V`8n47^{X)ZGxWm3qv1G5$tr27@3)6Qb^ zv*&_Bf}wP@XbczoK%-&kEK84aKKLfy8^syQkS84C`Ubor* z^5#$yQcq9n9803Th6*8oom%ZNPdC)%u=sG$zv4S1y`D78)W#06q)t}wVBB#PHG)G8 z){f)kP$SPac@zW!q4=vlyTx_l`*mMwTXQoasvEqof0GnwuRx(B4WdQCQnC_gzemXY zf`WRXi%3+pR}{XqV66X$3{u}S=RMbuokg~X7Uxe}&Uq6hqgc1*FWd~7lyctUclI9b z%+vDo#{%B-wCAJc$-Y_E8)?^dDWDujpPt<6^qn*8js@)pl5;f-4-U?iAabszp>k#q z>A3nhiyOLYm3xtR4R}SRrF!GXT&oi`am7ZWSR>^dG8}ZQ^N63@o2MIs(VRv-bmT79 z2J1}98DHj&(yM$27J3p!ty#oz8NmSLQvf1ezn#E#ZTm8dnuu(Q&t4|@PD+#U6w$rR z*~%E2wUX^nu5=W(-?#V6qZD+E9>TamLq~Ts#LlIM!$;Tvr~c2+Qt@Q_ZU#aKEluFD zdv=upaFm>!IyWpVi~J8uk)JpB@4tPPSyDw}k1mTxPgfMnT$njF{r*EDvQXeU z(fu|s_9hWpHZeREdeGS$fwld9V6&X)ILEH`S4ee_8*f-eoewx6HltQ1>J zy60&jds=Yf-cGDm(5B7-pT$8{ecepNDmOk zwWI}^5ac#Ma&GSt6xxQnJFcU7W2b5n+!Y#ij+czee^p28;j>FW*a`cP-0KN-v{>Rz zOqZ%(u4OLw;a-4GEz)W?sgoSh6+g6pOi4+3gLulKSVF>Qv!LJFqv4ka1%KT3e5cAt zTapMhv>=-&)E)$o9p1gk{>&&#)e*Hb>svSrSWJdWv2*A?f>J={NA20^)(M^F+GJEq z5Sg{W%$CuNa%U`@moPGTP6|QCPrAO1y zmt5=V>G_x_l5`JWmpjHUAjrj#y8HnRjck&u)6PvwLTpcuqoP}tal5hsK%r2$m&7hR z9N_17*JDBu75>=(*FdA7gyFvvLE=0zm%r4+YHft;7`e~yvX6oC4@b=!@kGd4I@$J$ zvT%T$f`R*|cN1T0vsc7~&w(|3iPMnd=s?7ArTd9rhw#Bzf*JYV%0PY3dQUYEykkhs zUt!P`X>#xYLI_MGx?+W*AlD98J7G_{9f(#2PR9P0=MXkQr{obIQ-7xFR<3Bx&&oc3XteJ7^l49#)6Q*B1U6cPT}TYELsg=m z28f+y_fpryR3q>2(f)FWp+~t_ACU#^dQ=GPlWsQeuDfBjCv@TfR}4aGD2K{BJri6; zOqvv3Kn_FFpW~*BZ zPHs1TzcuSFVSAJ2@s6Q1D)u~j_v?psu2qUp;PJjotkBThSF^>Ah=5EF znFUx(kZ2?^Db-S3!L050apCsaCnTMDzcpgG*vP{FBuB1>Y%=&b7K@O9eYGE-mycf# z=`Qp<_>@DVC0uo|HaOFGsJlDJYSv=`TyDQtRrME&0yw&@SlP@9I5$y=@x*62k@M%I zNxHZ0|9R1B&l1gL@gi$v`F9>VI<}*-9ETa84a!I-%#CXEGmn!OE$zFl?!x!@8G@sK zhf~in(D?EF9u?}(rbWRMbZ6f20=>uG0w~Y{jT^(iX<5GDXo75*Tuh z`G4vtY3vm%;`FNbG?7W~!u`vgOw^4lUz=`PDzIKe8JAP)zThNjoE`N5FQ>|`7-|L@tQ5X9x9of-H8Xn~1uk>#{BkcHv{0K$Vm z{zNOo3@UZc##o?0l|v>H(o(b(3Xm;PeL8m+g>$uew$lH_Yy~?8R(P&qBRc?e|8C3k z#8QA}+iyPxiU}aKZFVI^U8Xu}OX5LLt;KZf2YhT2f`&i(x1;Xtj9u+V!G7Qt?%S8a zA<=oLZ~qAOm^3s@QMm*J2a*yG@rkKrT|WRo8aNyndTU#OgX9Lu4Ttj~c!@oOpZea0 z4eR`i8^0)%hBW*4KZ*U+e3gG1U@^M?EwWIEQ3FgYc0Fd@dbFy;|2PAW52NPfMQGBz z$dV8nFh>HDc8w}aqtvN;J51t7oZNoJ3wGO}oWoVTfYG!qb#1IH;HPl&aJ8M0q3?EA zae4Xdo_kG^8?{PzF|Q#i15B853ZUVKFs?N;ca8;rn({cq*lcbqv^5qMJ#sZ?xJA#4_* z$~+e1?eKkF57+N>md4l+6H*e2ZmcIzk;)%Nn7HnDleD;n>;!Pubnd z=FgEA6LWvI!oWwzCGgPl+LIH!Lg(=`{S6gP@%Fv50w-C7Q>mhJO;T zuU`R{8`(g1P~Tg+FCVDk;KMC`B`ybCaC7wc-ahke#Bvd=Zx|r+(nyKR!u& z%Z#@?kV}gib834+jD`D102S%77OB@y79G9K%lmtFVfpE(qVzDZeTxoqVp8Ug-7P0_ zb-Jsq4^I7fE_ej{M3NAv)5w#hLw6a(KbwrQ#6VOm@!iP>yqyhX`Qc;%8_N&@fs{IO zi><<@LS;O-@2%dj|0T;4`>Vh?s9wKd@i=HpLagwdmo5u?=H~Woo7G17#*~=aP3UT%9(RIEYJw$t*-5X6$rCULb9x|LM-`LU~(s&d=Mml?mBjOVEEsK z2@4B#Duo#58`4OqQB{uq(biogeeVnv(q-|^Mzvs7P>knNCFh&3>U*utCX$Ivhil^$ zyU9{3$K&}D3fae0N-Zs9fiO*ET~(oCCz1+;yz~-TD*`EoL5s1Drpa{9)5daY)v{^} z<20$bMj%o`Kv`IO;uaRvJ~$}x^l!4L*Pa?&8)b^cR#T&$bltxc9E_VumQ)I^A_l7; zCxKKDzQZC7oaF+pks{zW(fbqEx3{won6);wY_CvrI=Z~l>Quo5Lb5)5}kB}S|7*C@r5{Flo$rgwlFw7Q(aqzD!O}+uQ z14th4hBBT)9AzF_r%YQ2?T&p{rw7iy)$U>DBg!s2Fa-q>M7nZF!xBMnkcY)~FJQ>}b?c7Wg$lhEb;WNC8q|I%sy<wTlX!z&KnG}Z&K6O$ZAYn@sHK_G@22A18Kl#H&8A4AmqaPlzp;coOUoMWx2GH(J zTbRuvTj-EbFKvDTP7PXJc7ChQmDLR$An-X<2!vft#~@)4(n8J%2DjtEK+^E z9dOFw^tZS$bw4bf2B(j7UH)%6QVfJhsl=9}fGDRLt$e!nPlV|`1(r+qdp>^DeMANX zInfjD?)E4iytuMe?d8cGlG9~LSTDUy6!G>ZDN%P+(m7k-w1K2j-h7f>oS*C`IOAAw z3#!R*s|)Oh+bn9`5U$~#j@b<*pMRuD5oDnKDK_s{WcAfR8N+xWIc%4Hv=mKNf|N?W zT#*aV7A%l53y_#+B8^xCfa)APNxejzA zfm8w^*0rflg_16SdMH;IUP*C}u1lw`einh|Vc4b8lvi`Y0(v8@>9L~#C{%dmI3SeV zg*yfw9}tgNflMPHGJj#TkdX9zdh}yFjzO0!QV!HKY%cvT`b$QmJwgik1dowXmD6v2^#45gCSv$1 z3pTCsgg5!cg#Pxg7~>>Cd?y-+p~AIE}RVrfCB^~8{aFr6}k-1K#zyAdUWAeYV@3^@*6std2UTgl8-&){ibQ82g zG@vy3G9}v7%BXE(qCb>)hKABg$fP#FRgeuXBSy^# zN}7dMP+o4-vCFrL%MTF8fx0 z+SoyOWH2;w7Jg6hqpQ<6VFa5>at1x=rB^NKSJ4)Gw5EWhmns=i06^sFM&9>peB>|T z%lyBJoapkP<_l97a5%pV*U6T^Prxkkn`7>9wkIba1g`c7CgV$CnEE)%7{mB zolNjN#Ay(kMqU`u%t6D2s>T`4g%j{5-Gt<3zCeZ?DRpIip)pkDQt8%tIJL0ckXKXh zIM>^HgdO!~c<=5ar{K-3rFFh<2ch@dQx*R|nQ;28#&u|Ti7v5g!B2=#Q33KBgBk-J zRisoK$n2oNpi*@o4HkOQ`&l9dkR9!ZByDie+3ejD+vSbeVKNHG7}KHL=%cq*^Jvv) z1H1a%QG5!1>(w4Yk#+Ot3{84ZX*K()L`Gtis0C|N_UF)6Sh`Uw zR8Gv;8&A){;ZMOAk9Mur1^LP0F53T7(q!oMW|n#N&1ZSM5|63PzDHg0f15uTRZB|< znpSx$eZ36C^|`O}y;_cKUn7??o)5gdO3mL<8KlOfHsb3)?}j4Trg+3R9n89?x+jp4 z+$eA!H)K_>ZfX^syraabg!WD`zX?LT3LNiC=kv_6HI6@iCozI}3Flw&(wtqdDCFAj zi|x%0v+f3CO-zr>U&R4R0|)r!_1l}EzY{=k?ZG4pB(jB2X#k`3>Y7MXMHNCsT4sk~ z52(V|XBlL^%AKh~CBKU z8$}M&6%jpad`|a2illWf^dC&3TDu#hzYxux7dj(dMa;Xk z^ja^ac+jFCZoY z3=tTTAl%$?T`_$57b5|f9j-oS zpi8{XxyZZ#I@CuQYGH=b%SQIR|2zNyf;Ir&?i18^ScUy!8e8zhXl-6mwFSI}SxQ zbuP`8Pd9uc8PkhAdJmiLXMtvJYuUhmRmrst^=Scb9` zv+8*C+zn-aT#|g+074Ol=S=@>s8BnmyCK&>H#k;F`2;u>`}_82a7oo>{pTUV2$$c3 z{*XNiP3QSpeSK#W8F_>%Z5`iIGs-0BO#gfX(xT?Kk7m?be4%v>W3!-=j7fbkwB1|T z-Ne`=KazfRTz)v;^*>wy{?cY4S@X^_kU*-G8$XC@%$xf2#}lbV3hXwou&@;R+RD-_ z@EMbSwRsm5h@v$k1O0CQ$thI&VZ)d7#rKvK7S;ct`dk=Vc`N!{2%-D7-s%rLasM@{s*xS6XAhqk^JXw_wlg1Yy;W3VVp`})~)-*WiBP=99sNBLfwD9i@D|ED~ zcSEk2X_|hB%f@~%WU9SYG{CG`Mg|;Slv1>~W$z)6tVnOMezPhCHZQ1PG?mp-^K$OZ zDST!}%Ca-@SoB%@yEy$gneS=Q6Q0m?-CBD^Q?};g@_=K)DTO#PGL!9VO3D>IMk#~V zJPA;qOANf!aU?#d%MZsx(+M{K#W#hZ>#uKY)EhIqf5y0@jQ;ardM_pBUZIK|P(vu? zYZzU8rOlZviEs*tBqVq74K`Ezrnb0xgnc!9pOb+W?Zf5M{&2vgQTo(f@&Zk-M zh1O)yLPnl#UbD(D`qD$UeOJZ2afzd;$1hJJl3#mon@&`QQC88~a9jTS%hbPp6ywev zC8__Vvh#NEJ5{chsjf9EJ5&329ern5Rm+)Qq+r?8I5C0i>4u4y&a^nY_RO}6sJccd zD4PlL>pYA|zu$T>{%aecDmpp_vfd4W&m+N6M(k*V=7D#ZzcE|vuA7@Ww0D$NJiPL6 zd`HN}sT#^VDqjmmr%$J=)O+M(RKc0rOVkxkXOWP`? zf09>|qg?!+ZzoFE*jVRvUNbgMh5IanNDxJ9Bsd!Ut_{#Z1{%$TtBm;ta7L1!cRH4> z{cg-Ejf>_sp<;a&pGl&Ki&mb@N&%J%cI33bp>KvAF~3@Y?ZnGTBg@EUp>^7MHI72S zY5SHzr}y;yS|?1LwyTlpFU*?`N)UgAoryTGRi%T2(GTBhi=f)=xpUE+(eFeLBqjY_ zh-UYcD&_9(_EG;7{cvSzG#eWf&U582`mJp2z8-WYkQ}Xug;}Sbz1*4@b&Eziq64Sh zE2e^!-rr@*9a-ym%jU`#UFB=&l-Qe#T@`eU^n|ZQqM)hL)icAX8+Fq%+%7>zbGrza zaSuY-?w1vDzremRQZVsuNc!j=InSTIoi`{k7ZRgZyfczbc@f(@ge2mM7XuRIt+1&xgn!JBAzUUyq`i35?APHn)gB)sTl4@ExIX=6 zYkPnG)Tv)BxlGJ7)wnqF@CdW7K#ub^tE#TGJKSpujF=#f_jj*ejYu~sPh1_2v+o~< zF=1bZ73b-xSH?}v2)v68Li5R5Gr^7dHA%zpXs&f`%`!@jxE)3kTyWGg ztm*#}w_gCtrI?s?PnWjiVIiI@l4aDM!+krj^<9c=Z;wLOE8!tsf{^sEDDZQ)x4&^Z zrBQpjOb&dYhaMBAFj&`TE(WJ4&3B{tjOiar-VI;2v9Vd`)oM%4xW^z%COghw$_MVK zZ?XoGzaj8ehH|fJw+1J`1&DB&PWD5amRouraCPGE}Hn_!*vYm-ZDoL1-lQa6_K0_|ztJdG-! zgak@)ybVc*T20eFpK+J{*C2emuXsbRf8m<_`dIVHMonYYmE*WT_B&s0*u5Ll?H;kC z;I;fr9Lue<8ZC#WLN=SCOU>;{C+ZtS$Ic$|p1K;lPT*|P$K^#Z_wEFhHysmgZ+Y;m z%@7rE&HSPJnq69YQkwPVcQyS77zqGFT?FJ7i#Dg2P2WBT8$RmGyvr)9Ejm6INB)4{i2#(R%Z!NTIEYuCXw7vwIg*1r= zGb7}r?Xg@dQpb`K5>tp5$k`RO4#(9+IppPsx`&7s-usFu-e(fQIYu8G>KAtz8G&Ib_V#ESE(nh*GPrm#lQy*2_~2#{M~irK zqNdA11nxa?b#;nX1XbPf1Vb%eXUBEFz~iX^A!HjI`PP!wz)X7hw!RK|pU8ieBOR z>@+dd)y3Rh*o!=bTRjAd^p~tJcZ3_lE-xsRuDXzRw(Ad|ZT=i;OmRiTG0H&l_K$K4 z3uYE(5>7)3Y0bCwcp|u+)=7v^&4ksmurT*auU{9{UWh6#{tZ7=2-I|Rthli7?!9|A zjf{*iJfbR@=6$K%8bI}N=^BpoxNJ+|7g{!MkN3oJ$j9?9r{no-FeC#!)=hz|`^{?h z`RYiG?~AaDtFW!PjgL7=ZsaIej2te)Z7P>UekQnczT3={L)$A+F|(S!qnHsUDs4R z1FsLtpp*w3M&;$p>Z9jcVD{^EFmXW~M_Z;V@j|C>Cbeah=jZH{c5iRWbDQH`QeZE6 z<>#|OQoV$_(_%P!J_oTS2c+lWDxT2bgi5*0*UvD{T<)N4)EwZd(UfiXcpeOw7#CZ~ zchWqI5AsWm<;p6y>?7cJSb7q)JfK`-XjZussYzYIhl#2pLfLaa-we6n({eq>($q{e z9sBNAINL%pujex$ey`!VTmIo5h}D`!#3bi(S3z ze0&C(h_U!9sM5MUn!EHCeme%34gk59*M1c&5||$fC(HjuGK$2@O<{b{m#^1SXuNY9 z2)r_|%;AB5ArGe;s;Jd+v35#e}&`0wBq?XP6<;(fZpbDIIf4 z%(7msev8KBo&7zXqr^~rwTN7t?!0xU+))c&S$so@`i)wVvizQ_m3Axkm8}Pqyj`cw z58e*v$R+M0O$Yc5yEU3t^6gWe9+gnr3STTRnvYdCf4*@2=vaW}2Z=!;u@u(*ogpe0!MENU^oA{Nm0#1)Rls)-`LBw=|?= zr+eZplfCgmy`QugHz#{9f>I48PInd+euT(k;9608?XWxV}u59}FQw78~F_CYNZn+aluP;`$3Ty9GCppXHx)97gGG z)Os~B(rN3NnF%^v%+$Ped>c6m*JO5w@lxAExB0XK1BC)XYiZCNivzC2OCj^c0zIc> zz7m=$weN(ohb$IgKYS;)ONAZ~>wy;cc#+EiTvOE4r@^|sZ9pD=uo zJtc_UJ+>4s`;_{-vUAtuBpN@vL!?_Udw~yrl*Am1$v#@hR2P% z=;=waQT1YXPQX~^I!aBx-?B;rQ;=IWY_W!Wjg1dzs0IubTVi590UW?F$GE>5)HF60 z|85{_bL#@9VW?c8a=xb84Mo2BGwsHgC31e?=XyLGrEm?~;J8Gjpt#sY-xNBasU0>X z1H%Hxn`{Nc&8dr-^#wygq>%-ksLyFraDo7oiplB~MY|gZw;?5P`wfkE2MN1rPN#pR z{nLL!G~uxU19-p&Lw1F1u&|(cpS#x zDic4m;oZq=cT53|&QEoTkdA}cuSw#mj+=1Fky~rxgS-+=!{BNke7HcyZwy9#Ok=vIFb=Q z0O);206hV};PT_u1OXJUYu`+BZt81FOOd2vj!yS6i|yJEGK8*qJfFjRCe8%{>ZHfB z7^O_aw;qEVxi}(;=1U2ipWh1#KIaeMIxUkVgg}%Nmz%d*A9p!bmRKa1p8}Xc4=s*+ z{$A6>M6im@?d_8}(i_ej-KM?IUcV+tX^~;L%l_VB!m&9zu*;MJo~pp3DSp?bCh7&X zhg6(sHr!RkywC%D_vlA<+=GgW3fFLYwpT)iqj4~<02g5%1#W-~&;pxg{js##(!>(I ze+BV8c;`ta30;Kj+;myQ6%{{wKCU|Or!SQS3(HR`VULIKJpKi8$eFA&SG_7k$=MdQ zqfm#=X+-OW^4NNQZPNiZlqQfRwaIEV@GlQKY*;B^8kFmRQmX(y)j{NH>dI zymPsqz5mbkp7%N*&h?)4X>X}t-1ofa9COSuEEDw;wdu?sfT*y_+Ymk6YcziAjN>an zVd}gx(ghQ^w)VH;a(3oBlaWvl$uIO`l@j)J{M+6EAIf{rf|6Sh(V755UA1PMsh*o> zjgjdr=Ac~Mp=d2O4M^hUl~F?*n{LS67EtJ`P$MHE9#y!nP?NE!%+1n|XJ66h9o@n4 zsKMngkmdFtr+ow)70m%VkgBF?Agzr9)CkE%C2wh8l5yY35$qK zqgSF=DN(D3d~j9_4G*7snD6Z5f6OO2N^{J@%*<={?Ft0d-zNv`S~@zWZnWfZDVK;9 z`B_8G68@#t+LN9NjUtk#T<7sLW7|Q=HX7Kh8jJ$M9r?0PTE|N7(ZD8#5Mub<0ZS8*)V7M=nPegT#<9+A6=dvFftJ1|x|bA*f|KO| zeZb9X_30?utgB*}_oc6?{f&JObp#WfgZGeSoY|!G&IsCWIB3Yc_7yVo5$@JzPDxbz zQ^=11m27onlL&Zxynt6%m!Vbi{6cv6VYW6uy7o(R|7 zD7qr|ownsX6{0?1a%ypilyagFO^=V%9swXOlp;s0;^Go`*_!2-ldE^1HNR71x$p*- zG&XL#y6sEw@-JMdEJC*0at8rvz_uP27ySZz4lFqV~H5&u%_Y^OJ zN)I7=9UYo7DunT#`S1oLGPVWf=#@czL6(bv<-`k{l8ZU7DPjgffY14`p)ti}V$oWc zWko%m#{?GFOC$ma_0;djZ!cWB>^?)u!O=PF zvd#n2E_0jFIZ5JPU-NxfN)FEqUT+w7ME!W^HL1s2cEV zu=cr{=JN7##YThiH<#t1vvGl z&Im_l9m`-;xMvmBKPhDJI4_5o^wgbxbb;6ycfw*eKg4;c8OLj6^{8c*=ps%C+vzr8q;qEl|%7v+V?LkW}L44bRiul31kk0qS$p>n8%g>!hB zHd7}{(3RW)dIQ5_A+=3da0MDIR;;qaZPw$0pG?dw8m0D>uS}1!)$&NCLgV8yHl)56 z$I;l?xy19BvK$+%ffxKj`AmFpQ*oRaN}ry^p|@D^P+*opzj9+TwRqEg#$pYyJ#K!c?%3u$V43af&cVwi#~nRQydJ-gvFmdsRHf0;2e|5c0Lm=bx%0uO z@qO>#&m$t#Q%~0$ZVAH5hG?#wf?=T5I_KdbR<<^#$XouYS+`Ca)RKFnI@*vWvR+}e z`9VHxPj4$$7mlZ;+~M=txL6bDK`j&w%Khi+Pk1BGIlY+F6-Li~)ux+o>g4f#D@7z_ zq(v2M?$8{9Jiz0QpaQ}o@Y!)WX*4@Fa#GZJS^%0DX09aawF)u=Rzs&=8n7|w>b;L+ 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 L6{NGIbYA`!ng;21 literal 65154 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 diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png b/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png index 32e664808e1925ab95409abe1ba79a7424f58b52..66b8af0e5be4f0cdde15326f59e9e05550c2083e 100644 GIT binary patch delta 4884 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%0DRLX~Fb4s_t7EcPag9hT0#wf4LQ>mPWj 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 literal 20852 zcmeFZWl&sE)Fny`La-#bha^bQ;0_^J@Zjzi++8{e?jg9lyKCcajRdD@+!}Wp>A8%& zshV$Iy{f7A=hgdubr&?}_C5FPz1LoAZ9=}wOJcnud4+<4f+h7$ObK{JprAY*e~Ajb zYZ9{&174muDM@}sDIX)-ML~IoA|)oG;-0z>b#qsqrtCj)Yo62{3XEqPS|*(*6^W)^ zF;dRA{*H(LT(kPk_xg9D@$cR%2Uc?rYz2)RPJaD$7=8Ef5-XS8CIO#Qh$Dtta z_Q%Z_FQ=oX?c%Rrzt+;ls-@h?DA;zsi5$2RqZ2x z(E8f?3C1hxs4!goVGlD+P{6>;-sghgmi?jt0WP6*uVoRHlJCg^%<^XYb+7ZY5;F^^ z1+`DTqJIC-YM0NpD^`5*pR-5$O@ zhv9Z*h`oJ7@`An+VjL!_$N$Q6D^I#*GS)_iOa?yULy+epJvtX{rN~;Pp*={270q8% zy_X$7U_NmNJ{K_O*8jjKFjKf)NN!WO2!1oUo|ferK|Yf_)83h7$ivU8xCFKj zL{N#jvU!cK8?EtzA6`lN@+oYb?O;wDZkOiYjPtc#Na2@SGfrJBg{Oa=vaCaGzZJyJ z%MBvE(a~i)C-EPUH-i#JV22sr7kD*#Ezl}ohzUiRK}OaEc(x@QG|Rs8FA!Y_7)y5L z)#8J6#Z)lmu`hS`8ea1T%wzWnwq3sinp;`g?~f z)uOGEsCQNs-fME3a7P^pb9z8KuS7MGyA)kt-%s5y{VV5@v1!uLq;cerK@${G>u#oM zLHB)axmSGg`zWZ|aE@Zlm@}!Ip$U5N&vi9mAVQYn+_;40bjR^$QHk8zsyHaJtSxcP zQ#nATi+TAu4VI_Iw~rteu)z?$@&%+C!~cb3?ybiz@k6qf2bCj6426qu<1r@do4&LU z4K7MkmIK-0Y*2}m`hy#fQ5MwU_a8poICgQXlqe=tZp zKbtem=#NZ%x!y487U`i}RCiL-TB>owj>3?D3{KHjtkq&VfZ0e^2yljU0gH22ArnyJEh)xxpfZP z&z8*w=Z`MtmK<)>T24PTH#e6ECy{Y>-lH_=k4(!n-nNZp)($D2hJQ9&a!(hSz}tX6>ktA4w@JRlp4Wq+9TUbWbz343q;zS6zthumVEwcDlbp6i*|)U~Nj^?wIlgeI#ps9u{VvWa zn*tYctr{~q6e0l=o(~cco3nD-FEKGW7CRg6Zcb0`M~ar(?uE@DNeMPDTq*^ z3O&I{%IJ<__k4?+FjRO)#Mv1W?yD&`MHBHv<7#*h4=$y{oL5}{N!?th08jkj7)j^! zW6hDQw1fE~&PfYdY7pCX-Y1*0DrH&$y4T1rq)M$6UdMb99Ly9d_R01U)#cK$M+Q7<@1k~I*UbZ`??kvmsD&N^T2<@vkK z{7`Ytc-?}#nAH-^s??^84wn0IGbJ{6-G7Tr*C~Az_cAMlo7sI=u$RkhoYreyBT5_J8Qjg6N-KN-Wy4;Gz$+S!NWD{|%FYX8c#`K6L>&OjZ# zy#bsh2{E(^6e#-#2gLlg0$!JgIZg%G`^#X$pIf8J`EzP#W^xhq+@J@X#^&Zzcwik5 z4-fF*ONr2M$hU6J2zmJVC-P)yi&e_S()jB1+pw?CAW$-X-}g`(;8~+c$1!%M&a*#p zFMuxUGLy>-dz6xyX_YyTMpVuf_^*^vX;u!K_mb%S%EEjt-GeM~d`s`+7iJ>($ zwghPc%*;Jj93x3BKUY6UoaqHIFEx6EB_^Jy?S8(ji<81zFgmpL7xF^wI5rgJ@jT~= zNU7a8JHfqPj}ksPKkr%AW9E_$8~lBk2y5hC9O`?^Z_epDX1SKV-dK5tO4@h0mC_uh zao&k)l(U9Xh%|JGsY`QDxEq?b(rIxe*Vfi1;k53!hV)k(LbXujQw7q#G9_*A@Aup_ z!OnJ~xnl}sW$MGF^Vqa+2c_VPL%DYCIaUo(jlS!ss>Ld18^MOPpa$K*1-7laJhiQ< zEI(e~{m=KeS5!1Kfkjj1la&rmwo8pkSr2ql@n~R8B;QCofBKDE|CEt|pr6Yu4vhLb z+BUp3E#?GQj%d;K_k^)fj``8UQakcXJL9TwV$OO=SxQX}Zgh0?bJQ1kB@h2Ntml6E z`gqlx%#KRUsFr92U=T9zHW;8tM&4n4iKAD=L|BBbqfZyBt&Yq)iHWr$_MBEaMEZO# z10D<(5m=-ax2~kVdUdJ4o*|}+RWW{3kW$=nG*8dX|6SLnrezRt@zBAQAi?IbU zL@o=XV_})X>tSridvU!cA}m^2KNUA^$y+Lr;QQ^-A9FdVFQl85a;<%vWi9h4>72ID zMPnM$GQAqEo)Ga|D{qZycP!mt?9PH-qfq*e%ONT2Szqxd@>}fmUsr` zXXT%l^}b-(PCY|CeNuTFHpxzJ>>%zZox<0k{e{u7v=%yzN)+Yx6tN>c!Sl_&NMi9E zi3{|XFJ;y5EvoA3HiH7rDr-4XnFcwJvn~m)B`~D&Iv$t-_nLaeI53p-`=i9wz?~ zSzjF7C50j$cYN= zgS5G9+Zyw^)&hkU|I}y-RmCi0kZGap%|*kFn751#xQ{M-zz90o37^5bfQ1i)+^4LWx* z3u|Ct`9^9|NrPLyXU!Q#3`AYZmx$esse=;$$ zP~JLI;eGkd?Em!Jc))iQ^k!lx=oke6d_%D%*2ibv*_3ihZb^=V3a8Nve98@`L!Mtn zMdePH6J^#O#3dvqAu`-vl@d9I=W~!El|0n@R#f6rcJr3Lq0?vwX=8Kq{)CD8HD zAyum?n?={XX*=2ZQ`PI^^>oA{`7;5}jnQ$#4@GJ@%z49VYu!;^j@x4()C+4^Rg5L) zo>G&vT)upYl#Y(h-}>zA?CVElTCNn6Tn97i8=3Fv%l9^%2qR=65;Ef0WKheIhX#`I zyS~@GAQx~?j4xYMY%}8Ib3HV(&k3Ie;wr`Sg47Aw`HUIq6)Nj^LT0atoMNGO@+8FB49llsw%MR8)no85s8Kvdb@y_Vr5XT$)8w0KBUwwg`! zrERs1v6%orOHVE?mX$dYXF5iRGX^Su$(hdP+&v)B_jtJDowZw98OXZ-QK!|GdW@wn ze;s%McfPXI2X=i4y2RszAevB|@IIGf>5C+VQ1ZLD(S(GCuFaj`rV9A_2M2#^23@0j zoHb9DLl;pGWK%f;Xcf{O5&sm8jE#u_q!vbi>`9#X@b_SrP~TTn%;Y&CBx9{N>@zAR znUS*(Bwf&a{ExzXv&RQcOBM6^(>Uup7j}I)BD?SXKyGHU>ASKsL{>J7l z!-17wA8E_3yt>qJm8~m0>x!iiZpdGU&q_UN@;{Z!e72ax^Y-?>xjlYDMz&9k>{Sm( zu2})F?av;Jx6Tzecjm}{R_@!k;7hq%bZl&{Ymd9@ss~y+x^JX-c)3`ZnEy~wQ7xZ6 zeOmkQ@Sr6uEL@h6kuftns}5gZ&$+m~obmMXvZ569%=NiG&bk~wIa@eyc0;z!lxcjj zxe1-d^aaj{xYyBxk4@EDUR|`JBH|QyCjZommDr^O6%{8IZgD7ncwJpg#+Q7b&a_4T zMDb~YdRGhq1;WlznG=Ufn#7`OvN*6OSM?d+S)ifJO91P0Tx+!TopcTR|>4^TMfrWC}ykh z9{8c*T)^E97RqdE>)mm%S+Hz8o($dJeEA-{7?;iZn3a2goT4Lws=iic(mx1oK z55bH#4xh5JvKsN3q_e&TV7kgNF);yU@6Urn$Qs3Sn&y&`m_M(xvvVvaOXGZ#)JnwD zx}b_*zoutS{IGX(n__Wdx!k*|-E*?HH#kU+W7Ipv)%WF$)~d5S-n@p;sh2ah3jE=4 zSTp%oZ>giJtLzN}{`NH`WmHgq2|o&eX5NC3D1Nj0x!>OSU4-Z(;YwcZ5f&^t>Hhv7 zix$<&^1m5E_hl^Z)0B;6+ovt-$ijz<-oJlO#O00GZhIGiu-mnj@Hm^X!M=0(u1_N* zL;(VU?m?F=ZbyoR_EdhJr(2_85fND1V`Tjk6Re}IXPd)e0RbA?!cEA3POqURse8f9CscBPp{3+Qm$Ir|` zp;1x&lapUTr5%flK^9Y(M^IY}i@~d!t+x~u^54ge%^+zC+wy@|R5bvi0AC(`-d#L$ zKUsUhqSv~T5)zXnWUN+wu&}UjI>v94bbjClz`4iZtKMXYC_kDxSmdx=dTM7!$;iZ{ zSfqm5{|$KK;NW03womNuFJK5HRD=umCAOG^#2V%6pJio0pX?K4N2~CdC;$9;{fOky zpe=jDB`Wm!av7$_2zF0OF5?9+Fle`|#kl|Kdap#v-{1c=K7KEdR!097u}2{I3uek$ z?mWo>? zb6X9qi0Db}B@5ZSA|N36XEz?pcR{kc4wq^71uI*7_0=9#*3{)mlr^|ltlzqOTyQqG zoo)_IfNyV|_m_Z^V^w7i5h7qpO~}OpP`+B3#!!4&`^oK?Fv=rVGwu)1bxCp4Y_@*E zp0Ch3G4V^wWp655m4BhmC*|S(mgt`%(7pf#;A>dC-Bh!x3@Q%EpDnMHHMo2ZxaVFb zYFC+deM>Die^g7kOhOlc%-6nKDmf2h7Ii6V?Sqj;xz)dAsV}x#kSo7Bqkly6&1e7j z0^MOP2{kre4-T6JVgzV!%}5;owvOyK(_;SdxcHuuD-?Y%9ZyHqa?$WKYlnf2Cx+cE{#Kqyq$2*cKzBD$a-#IxU$<8+Z%NP|INkzl8oU82~ zp%zA?C!-_K)6-{cY!jlzbY+a&MU?c)(^;0W!mf~$1S?vxs;9k`U`D6*i?g+W!^ywdyS=8=^skHq*97s&9veOtcsj9feqH}TWbd|b(lz2 zt*zJCUGbg-MZWI(9vIb38>uFdbNQYz+?ZDW*?8lsHV-i?hO|+Vpd?FA3bS^>-&dYw zBjwQB;PB9=9WddaSIagsolkFSYP9E%Zj@j8yjq1&(V!Y-cP_t47aTlHPs)(d3x4^G zlyh$GXAVYV<8P<*{X=3}g)}orI#{RGJ?Rgvg8St@ak+=i$>j;_+Wb7j;%{G|rGDVM z<92YUi2NrhAztOP&Ae$pj)ES?a0>J zx>Ro2HTiwlyAHzNcbyZ&ukcW5385fYQcewqANJq(hjAJbiGo9ZOS)0*zrdq^6|mH? zOf}r>2qd$3Chfs7VOK+A8##9|A}y7|+DvhA4Gs7B3u^Xi>K#I6-PQAXr$N03VnRYl z`aN2aegihAmC9)3p=nv-4|jV>LT4NWIzA;FdVmpiR%Odz3c_&W zZ9JoC|=^U8sn)hBil}@gv`T{OCUo z=Sr?WMcVGvf2$)+s@J2Y`>t_ywt{`K`t5n$!f!URM-8b!5zh%b0>$Ck-D(&mBELSCORQ(uXoV6nMHa@lFG})hwGQx zLBfLumE6DH+pQcgdr56S%vkD?CIT{*TxgO^PV-D*? za}K;$CM91ex^*qDbGz+Op!Ln&{r!!_?yIhDr~annk%5`a79M`mRKA+p+Ma37Tgfj) z(=*=VU{YZw-M%8_0`!4>a!$&niL|e{Tk6@hhxc4v+w1M`_cjYhxOMA~nzvOl&aa=7 z)+JNR_qg^;`m{Rw#%jEU9~D>)8rbxCpBW;U^yt&Yk5tykno z9Z7Ld`nPFNG$0h8*ZVs20Tmks+U$~NHG9SG_D^tJoqLTb3_N#BNMA?NPawA(>^j-o zt<0U;Xflr%#;8^6PiSbEFNhuEXKFFd^mcS9dC8|L;!{k?b41F1%S}Xfpkyr5*_McI z8>5GpPq0&vD=PdqVOdAlMCbmKkz&_LY6U&$mt>XSZEmn9D)eQV60J7^%_(bqZn&VG zTY+X7F|p^S!|GCXvhk>3txf6c>+7s(OMv{(^qkIZsp*Ry8UhWHL97;&?Clfrk~*4A)r@Ho()K#JM1j*Lzp+q8WHfiAmQ`M(C>1} z)z$Bjg;a>36DkGwaWIR*taVS7g=p%st>MC@W69G17s}ef=l28AAa@G0>?hwp0kCI1 zNL*%QLBca}ztGEd`8!qr@(9&_lV(Nb)5?*Agx~9uPmZ1MOUmF8+4zmSn#xEX=65e) ztLsg=b#J)C)Hmh9Y69utZ`|V>b=yltu)yt>ONZ^UnI%Te2(+UsnwiHI3xD_z#ehbF}1poD%_Z^?ydoNt*=oezTLq;R^hDSJU(v6v0U*7|I{5@n?A zf5Q7aqZE@ol-|cli-)ZBV)>pnHWI~t`XelyBZ+N3o6+L2aUfcv#*~PFn%pCzv9Ynw&q#W@gQBi)w)J^Hhaa&> zXJ#wf?~d>v33q_IJ~=ykmT4I`#9?LTzA`m56k5^#5D%m}6#J7&(=A9^Z{{yOGC@xr zb($QOo}r`ZKbRgb4=qCRgs8*5)f=;;bwM)+_JqxMxR>{ zqedfLZ?tzsknjoGlO(|?+md=3f%gjrZqQCWoA?yQHu)D#>oj5LEm3Am#r-b?X?DDz zhX%_OlpnPv&hB17+zy_}$eczI<$CFTd5tWYk1c?6DH|+(jydlIzDzMok&lg|iwpJs zpR>Q8|A!YqTq81rb1NoF_)E^jc##t~z%_hQ%6(a1UoSPJsi84mY>IJtxQO$mrM~%@ z1GgP?GGS0?jzIno^$#x>vdHNeHT$)-9Y;_zqcr){?I zun+E?3P094dj#CY=Av_Ygwd%h)D_6Ixn(Xt5nx{m=(YZy3tILk7YdczRT4`Tc=po= ztVIJ)W<4-b)mOss?0otH2sE3SL~Tt?R-@|zsrZ8J*hRmfs6ve_0V`j<&I>rVdyAYE zz%y0KIIpV9%3@CC%jX+*BQ!KMC%`GT9NR!ArGG&iQ-Nm1Aj83>Ce}~n%iU00+cC)& zWaltCIw8&-R)lV0Y>b|K@eC#2L$|6-gJM>Xa&771AU4CqLMo)p>SZ!-#<6jMN88cs znSfV+?F=Yic?&H$r?Ka!mF~&N#@bdYvF%NlbZ>%?obXRvq@<)mNNd@@o4e?ULPg^w zE*CaHLCG=+c`KX28&*N<{i~%VMWpHY*gg=Gd<>wZPtF;8p+;&+HU&wyafBe|< z(QD2DXbdEJO@{Ah-^$!Uw=eq9+uI-Px*)?ZeoUP1WvL0zfW^C=Z5`5s_VVe=t-F}w zK95bGH5cWl>ijL`b3tJ0>G^qF3f!FS+r5uDKx%1fuI(6v#i=q=rr1i4c{ra%o1d*< z_J)M{1s|J;Vt+@Ld9v7%{Ke&x(d^FEcUGmxzpUrtnJcPN)i$;<4ao}-#}?kmidl-5 zj-gXg;ihaF;Ddb4{JzJ21E?wFS~j-V85SgFyxe)WzP3;1?YnW=8sYNU(CeOIHt!@$ zDsHG8+A03P&hVSvi(?9v!g$MQg&^#$j!sdQsJ8YS$IdLc&e*bun|XA9Qfi(A5$ynF zs&2=a(6kW{w0Va24I>S-3Ekhul?^75D7_IG%il~UyZI&bk-|0$c-A(f!eYF%e=^Nq zkk%buir~POJi49yZ;?}@%*Goid0hdoSS>eR0+giik1Lw!O!K&|!`GxGEj7WP!C&;p ze>nGxO|Ak$(2uzlrqa@y-JePX(U~b{!Cppr3}3#zdyZx%=OukIN0}~w3OSX)lefI7 zru=lE`L+hxcf=QcD4Kb|UQ+Sa$}ey%lRDQGL^1Ixdh;7u ziaTk}cl$|XnZu=MZqCpCvJsy?auPWJeKxmP;M*g_tt2)+h5L_jG2*He#gd=LO|}94 zDV%TvXFGCFKFieJO_2KW&=od(M{z*ibfzNPpCzwg>a8R1}c%y6xim zKNq=6@xiIY3=5kA3ll2r()g4W?~>mwy!&(sgxr=`V*W$648;oJgRO z<6`;w+*i%}Jv47;HJ8nVZC5;WFYzX(rq8!Sm7rdfS9HlgVz8i>dIeNYAaaJE0CtO*ez%NAQ_cIY>~6aCJ`~!o;>Tn} zAg%xQl_;Y2iXaK;^O-Sp=b9wWRI(!*B2f{c>*LuqWZFLHWqktt81xwUa){a7=>bm- zEm}|_6)m>qO)qkE{!(MF-9hUME+8EnNX}Fuj z*HZfzB{A;cuppeAO=nC%YPFAPIw8Vp1p z%+7qcNurEk?9P)(7b3O0nEp_o@uBGMTqHv?sEi;R^v#!VmA}?P<$pC@-^b8n4C^ z`l+&F&&~%_gabY|SYsjl!rJcUoN(#mLR$}+ov*Wb@ss1az>ZYOmu21hGV;lJP;iTz zk&TTUP#x6E^-TLlczgPKCkxyZ{2W94kcf7*_;|b__&``N5i?+-0QeTb#Kgn9u)br! z@?l3T@^6_)RMhmbz&AHrgr)(JRnU>i*7O8Qtd+)+wFo4Ig{9sSx}PB)MnLs(1D%x1 zHe2B+y(o~sN!Nqci`06ZF*q`WR^a{b6^TWY%sx$j{?Ib&*8j$(Rlvo^ z7q2T;B@(pcp`hqJH}ze7;McBykTCf2PCS%g6@U-9_bmsQGj`DWw2q%Buke{i(4fl& zPTP^Y-u>e8xj3F;CU`+n8Ql||>0?J6{k`+(KgZ2k=Bl3lRYzNY37|W zHDb754@wy2F3?*00RQ#mS7T$NfrUkgT8ZiO9;fv}YXDF_Lki44jivKLW?`~MGgs_C zjvXhF)4~-%lW!w?z2@}jIBGg0Oyse6#cnQ}2T;H$iTvg?#{E8>kuWY}8=JUXoWny~ z4x7nDR%0RHTgun|SdM*#KLi)Hek&#^$$EA>k4do+U|yu8(`X-UF=cLKYLkaNP7*Ms zk5-%joGs+El9B|-#@M6$QIlRaD3l+h+3*XCl$+J_-%EP+;(@r5*+fAvip$H($CdSG zYyhK>FcG&c9w5K0jHU69q_zJE9{477b1hnP&m=Z8jy$SqsLAul;UnYqjfA;UZr!_S zXHWc?tGasm=1nw*ol5@()m5oF6IWq z51cu+9kEOGre7F%+Rs%x=kZuuwlS z8%-O9p{AzR)7MvRdtbqrD4a4BN57}9;4F(NlTen~PfM9}Z$~vUY{0Hulu8>5sxd1sgL@$t^POVP|}{BHr$ zz3m=N<965+s4&FbuCWgu(2jM@w;DN0;`crmH}i1cNl*9{wWRh?>%QW4!@I^w{beSKQ-${w3VxSQWNWkqQq zI^PFw|6|u8rv3s!y0di{Sf(ZCfP>?CvEPXk=9{ZJOu)m-yQVnu3?R22_22pc40y)v zQCvwZi#~Ro^hI^JU;;BzX0gGgr3(m#lG$?j@So#;uO?I3JG6h6b^9)LY<5IypI!iX?uy-qg}k%I(v@jKpj+_OY9>R` z*5>rNJvSL!dI5CNWWZ6WKbjlNAJrxTJ`*P$P*#?_4EFqN_kaVa<^F|@#bM{|ZdEKpG9~a8!VtKZ&Nr&5(-g809?Qy>Irv2#7Pt$2@3T#E_ zcgmn%zM7HKe|&La40sqHO_e^kmtXUg6m!2B0*u8R*qrj=;YljL+b=*5-&s^FvDukE z!zH+@^l!(e=z>5pd~T6OUFtEx!QnlCpyyVhkjQ_8cDWCYs;Hpc9@8}#nLDvwu9k!0 z+zf(+dCg38dTQvfnFL2$GB|siGM|kira5ms&U>^~f&115tT%&z`XskKMoy>P%mE0{ z*=i+8oaPi!lxWJ?jc8K^a#;>Jfrujny6K~yW^ezJI@Ig)Mav+E`KfAr$4FQA6hvUoM zzx({>eE`OzEfEmCP91$%Qd3hObI0A?ox^BMkn4dKdq+vT6cY8lSE4n25&9+psV>** zw_7Ot@`x?6#+X`gq#$p6?PaO%O4BiOFsn$}eGmOM!v?E0GV1hFv_J@TZc z2aYRK4&Fcn&|iGG`kG7Kzu#=0*OMi0(^U0@R#8KlPufr7DEc^bh8zRTF{}H!iBvAV)Q?(!9*@EA{BGY#Y zxz>m%D&`1X=uFnqWiTm@jO|KaXs#7{`Byu^9sF9e*F-e^G+{(^c-2KtHElvGqEPbT ztp}T~g5?w0gD-P%zqd--30k~VBcr*J&=mLSwS~5pYv@37QAU``fWm$HpniYanX!h#4h)_01-%)o<2>%N>ncw3og>bH1Be~i3KIFB9v;Xx(a zS=u1i)_6}K;+BzkUO)IkK(}Z*?`v{{9M=oEjNu$sRmoqeqC>(PXI?X6JCWB1oZ&z0$jWK8k;&(g8F!0Y&4*c%1xk z+}e}@19Fc4dTy6@b&7C&CZ*=mH3!Rk7uM+ZM%phs(O7V2Ixtz#!LZlEC3 zj?IS6(PY&!UN@;mq9Xva)ah|{`ykxMy)y%&9m?SW{<=ZKOS7YXxilE(f)P!+k(hZ4 zdo}hy-jh1fs>KC_s)@qS4hFLrPt!ZjWj^fkHF4I<@5#=ly`$$#2K+(Cdi_^Lx(!ri zTJ7Ecc424NCnY#xK>ASv{5gOHA*SpD-3}``p9^QPwH92z^`$W&Y1djqBNtpqCvWa? z=2}ftCMqOfI_~Y(#bRpA$0Z-BzN2Rh^xF2J)1eVA3!EwV%C2Art_j^ao|B!XBq#Tq z{YeE->z{2$=%f=aKYsok3}8dRmF%O@Zp#_)ia@p|{r3xuN}J(6*$e8<#HtKnjAVHK z$ozYy!4qcPhXi7F^GCc3cmic71KrOylQU;`m6CwVu7p6?&Dw9-fdgi2Y&V(+^HR>1 zP<(7Me)ZC_PxqbTmpn?1DInb-F!(SX4&bjMJutoAv%pIGRik``6eAT~E-tR5J&cZS z$tWJDOS0R`I}tz+LIF${AB2R`Ys?|0&AwS=yk@h4Oc%ocpvE>x99s9iE3%)7!5XfR zo1hl+RtM&t#3BTs>hk--27f;ITu><(7#en7pRBu=q_4_-1bhWzLGrpqw`#_KGbj{D z$GO$~<&ZY4^N(;4)eQsD@~m8j(Lan`C$Ik(MnF>+|K%847O zM+}1q?6hX30zFYa=e;3x{F#U;H|Pe{OR2e*F@8ju!O2 z#kI_2Hi1Dq(9v|5h;gyefgQ;8os(U^rD6)$O!u7Q?`wH_xqR;|co*I7#(FAfzgMfE z%V!7;1L;|b@#yeSVwhl*n9YO-+T!+z{#1%p-pI(v_&F*nDthyK(0`EhmQI??;{`Sw zCYu}{SI1eV#f7#qj1GHEjNiK^e&*onXmofN;C(ULP>M9=L@80LSl#AqKkmJT6spy| z0^r3k;EAYgXeabA0)h`=h^a}5OGur>&qu5u3=UHezQ{T_UKPAU(u=jh$qK% zYM4M(S3|aP^>S^Eq<7ZCTq_S6$nUCcpLv{ZZ9X3~+d0tOOTShgYhnW90LQZuk- zmlRTNyNNufesv7?&o)kLe$FHjeLLF(pOg}x==prwI_y)2c@O)u2rE>j&t5SC9Qp2| z9m*p*wnJiH>`mtZGXUX4oNDR>x|$JO7j2CC&4~i#9)B4X?o_{S2sCXOEESC+pB`TZ z2X1^ST?E(H*JYp0G8HY>N#}1%HvsA)ut2E}IB;O#o1Y6wMBu#BmeXoiFXk+8z$5+q zo)ySvuxj`oE(PFa)ObOJnw{_eG&b`1ZJv-|S=KGAaApX)EoY7Z&UHHVdQ5;Z0Gv_| z2M8>J`_EATW*pCT_|Wx1&*#M{-PSK)HFNn4&cgMbs`XSp7t|}G!@0%9_3a}C0C?X= zspU{JbIETNL0&k@jYDi(hT`s#A3!Gp-d>J$IrUc?El%B^RQt&@;J?W99QuN_l(_9P z2_pgR=s-9)r$2IidmGXlmT*Gy*&hvulFfVW59Vx{+TwW2EG^*A%=jSruo~UKtzB=u zKEC?llTZO5^Z5q`vR&4&G&)|8TpbA;02-NW%7Y-K&m1&!e=?7O$NBo@^0JWiJfJDG z+x88Yu(U4WR#sIRZc~ER;PC$4DRa$c=Kv8H;^JU*zX{{fBrYV>cGu*^@@T(44t{Ap zZ3$SkN5hkxu8n7HTfsg&J_yF{z$mlsJ~?7v1+key&Xz+I885s1(aOMo$U>4lxaaYE zo>Ty=Z$UIcxVX_xoop!emYgN(OvanVoFmDcQ9nDr=;)+cOg6q@H}f|CXOQ#{lVm4A ztITYxl=m^M<#=-D%iqKc-J^cg76L$Msa92NuZ*wJMqyQ}`%70KoIL#X(?bjS^@FyuA1U z6GkBD3yOFcp5fiL@der$s{2Lv;9!Vq$?OUo9#m4o01QkGk5l=vU8Dz>MjMw)W_)Mf zoKnjFe1G}5W+p@Tzw>N7URyl%d;fx-Vr&kvwj4&@97NE?o$V34=N@1cVNntSm6rle zo_GDv!G}R{j;7H0GRtXtohEO2*G2JSN7-?Py31VI4>&Qi+Eu2X=<6>3FVui?B>%%d zE@Br|zmUAt!_EjdW|~&aHqJP*xm`Zri=eC4(PTW}b$(oqD>UHs7S(^mJpZdN`hN?I z{trK75Cza9_{CuI*!qfEiRP4ieY9 zwwNdPw*bp;S2@Z@!GX>@ z|A6kGp7-R;-IXZo`4`Hv-<*FMm>i5l_B1=zS#eR>sM(lY!@T}yL2==|7%glCSQP40(VnyhfL$GF|T&qR6u#Gq0_?1uEwgIYoA*+ ziOB0%QwFsvV0PsG?9n%Ubtr6bl6_-6UrS*{YSo6=(ncX*NyY(sI*|QN1sJhSq-?mD#g<_(7JY~3c`>HxN=o{@Ds(FDxwl;j2;WF9h~_ zT50fL%|XH>FCU5W*m44T-!F+AswkkGdYoB=da$$u-{6NTG&bQ)ifw>gr_{s9531}oqF*t8-73wM41 zJlr1H2I}Q}PGbbQd3m3{5fr)^Fwg|> zs$!PW#ZaD^RfGNN*Nx$XgtKiHqWx^zMi)32x9xJa%ywkaOpW)h(P`tBRQ1y2(KRPwh%h?1N@IL2vn?EQmp^5(kTj%Wq>nx3G4-+7CU2Bi&Bb#05>f8h^;6qbthm+;Gv3|M=`|yDuWe8rFuZprGLQhe@~j zw`fq*3UHlxU|Q=MZr0k0$e+*GvJq`>11AZ(J@L9a=m%`p!fr>Vz})a#iZ{_&vvjgD z_;254b7rS%Qtvk(-9hjC%m6iCqsbEM_LBVFyU(u)3C)u^YxDp z9!uv<-?%*l_^}(8DFSbwdwUm`y!#d#Vm_1CGcz+Nsk~m17E|rC9l}3P@rR~>5oVwr zC~hlH<99oms>b&Z6k0#-1S6DvEP%tJb@1`BzZ_bs+mbH1995~hIGHKp(-%%GlJ)z= zMTOhVBsC!1V*r#K5SRwXnNMmhpp!dX+}2Ay745d2!tZ`&i-(REC@3r+O%Co{$tNmA zzVuYX{)I1$KU)~I_|@NEqm13|I6^t|C>ebf5RjE zAC}AiT?8CAs!i4?{sI9q^EfosHF|ja};3Y5Ch#zDO22Yqa>_d2ztVn zCkVqMh+M;HXlaY>GAKc64#i4I^NV%J@i$j4x0jdK-ty{dCD%Vf2-=Rr-+$<$mQsv< zV`*oneloF60cyv7c<@!XUi@ONCn#xWZ8?d?AUtsrV_IIN*u8$Uwr&C*V@|0V!OAU>U8WbC&$;pX&Z`mrnzG#600{nIC_(^TtoUM~(TYywp`}dxys4i zp_%ti)wC(e>eHu})^FM>Ii-QI{iSnv3U=+;r-d&(qtuDx)uTsXm*b9>78MlkR$5Au z8X6l_P`F!7%?{0+ewPx)j?wPD2UL8tM7Q5IS~_=^Vq0FJX3vp8Ch~T zT9lTOq?R)+`uDrbG^?!s8FmQr?at73?Td_O=3r1P5tiVuDg9j+3viug;!rQ)YIa=Fgj} z0WrUkBt=GqtF`s4Hg3*xU3Uly>M2PI2@Y03z)v4-=kc1_x(nuzJ~c%*pF1^4OG(n| zPri`T=~P==o3ghTX!eY08Z~05B&k<)q^hcGmA$<{lGM=9q%&t)l`wXUdPo2GnLYLR zL-O^xCLWW(HQ=g08Rv9f{LH~A@0?Zm`uZyA&L6L`*VNW&XVG4LmAzecb@iGxW11?f zs^w^D(UN5!xzEq(RBP*5wY9g)&-d3w6%`fX`aUc)L}yxCb@ptVs;X<$(sD+FVq@Hv zA2K-B6?&iE(MpIPqqmkU*RZ(38Zn88Prr5e;dGT^2lVT5 zozthQyBr@rbco02*C8T2OjA;l6crVr)t|1@%;|Tzel~yJ+%B&V_;xzX?+zbzy^W4v zg#P~S|5g5e?iceOnsu)xCnxIgkz*=3QKm1qWGi*zc%`Kz{pz{l`scM{yZQ6x>a~}j zS8R-X)R{SX7hPv_);71-gJS#ZwU?jQlaD>{hj{x_J7pY-tIQu-tJU@zrTEZ zd=wQKp}@cZ)zs9fS9GN7%jtBgt-Z~4KHm{*=cAO1jbDza$Or`l`0L0q_d5VbOHR1H zZ)rKBvhoV`ijGv`o$>nJoEe%sdxo}TZSU55;>P3EleplZAfW0jmJ zmBZ1Zrlw|y!Ly|!d+S3gpTxw|~Clxzdf31GusX9Wa2<0RspfFo4hj0|*^3fY1R0 z2puqh&;bJo9Wa2<0RspfFo4hj0|*^3fY1R02puqh&;bMf4;stbDUt@+E&u=k07*qo IM6N<$f^+uG{Qv*} diff --git a/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png b/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png index 7ef5b4054385dc8b387f685a0ce279120fb76b74..9fc79671a10e60c39fc55c02b454febe67e32e88 100644 GIT binary patch literal 21058 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 kUB1*++W%HpJ56AZPc?f#0H2KA^#A|> literal 21091 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 GKmQM&^yx1E literal 9454 zcmbVyXH-*Blx{=?0RidK1r$UCq<2t3x`3ecA}#a|(g}hHNbgmOAVqo&MSAbOgcf?J zp%Wkk=HkqnS?|ZZx7N##o8+$KoPGA*=iA@@&J9sjmLEe&DnI z18m@$mMtd(yxnnDlYI*+8KT_+fu4ZmrQdvXPupAY@K!=ycOOnG@$eEyzk6F$UW#j6 zFpE+X)jz56)Qz($#JAllX>2U6hc-fKI5DGBYPx&YG}dHqJ}`d4m6ubLCV6v~3};B9 zPJZ;P!d;SKdevx17`}gzRu?kl)dW8l$4(stOG!&h{|MjRwedXJR+R3z_UBx$(Xth= z(V*ev?DFS)W_S;K%KWs?thTn6%!Lh0TBdt>b^VQ{{jfjh?-@l2$k*TiSz!wDL54%~ zJI@Vk9`YCBJo;Elk^WoEu1+N&oQc}%2Y3<{#xPB{8em^j30Zs%s;DeBH3di8RvTCA zgl?z*6C=C{Ah3D^BE%A5P2qEn|qd9$vNhx z6fW|eUH`JI49^ICJw-P2P|_=%sN z-wT($*>KOVU+?RWi4RY9-VcR+gBiDVS5CaYTiI#THfUULeM&BvoUE;sS`E6X@IBca zBMj}_J*l0ja!DvQ7!C|ge0(Jh3G4bB*lSE<#rZ6+-0n!=*O&A)(+&pEN4yuZr{MU_ zD?R-A#*;xgU!Ll;2Q78gQe`@!8rJ2>>N>j(VC(0!%m(F=_2v2f#`lY37^(2UoHsI_4PXj|N4o6=1Zibrqm!T zs`b9ULiyotWjn0Gj2)CdHO41zAB1DzVdb^x5Fx(7ktUelk9dI}DPTMM%B=4Oul^x1 zF&miA*m-A#lq9*q;u#kqo%=X(c}LFixw}_PbaZcrWhK?wL^k0#mb3b<@y7LOw355` zmy)m8PcBaGvxrHg23L0@t!$l4M$1{LFhfD6U@*B0+n2!KxgO34*j<9xfkl5j2>C$i zHDe!p{-l_A#dfu(g@shzgoI0UA%D)DFJavFd&KrdVKRA0X25I1YBUhKY_wW-i5B*>^zvSC5cVTYNRS?fLvNqJzsK*Tr zfGHZ@3?|V^Ca9c+xy(p7ukmoQ#aje6ncRB}ueavFpRcXG z;(R8$N=uU|H^!)nyJ8m}_IiU6ir=Uo%3$$Wi;8!{D$PS8CHuF=&1a};1G+~N@DrUl zxrrqW4Mp56q#W8aX%RD!%?G@Yq~RH;LFWQyxb7!>Ff9~j170#ATDRaeI)Z}!Vp@ej z5*YU)A9(JdkqxXV_86i5d>|%gm|#`>BDp*go%j>syIGu7d~q7gq@wH z^5Q75VjRKw+o|)Y%6c*^o{=U*_(C-DWJ@N{$&7B6>eZS@Yk@JjRm8qnvWad0j@7a; zPX(sC@ngRF_a%B)Z2{j^f;m0*bv2g4n)DVM9-gg1!YaC&s5(a3V=}AUQn8Li=QD>B zQ<6n`ip#3Pu5(IV^*+qepjmDLX@S9LY-GB9?;I(VBqL4+%|f1hq#@gPv3T`8e`N?< zNnGzi6G^lgc_*paR2V;@tFyQ-dT8MaV;{M)_2~yeYR#h>A65+dBvTK@lXi(A zqTtefCnJNsH&=u8gqb;jfs!lF3py0XrJG>#p*tCRa1<~?eQ(Nnv)OJhCC-7Xbul=g z%3_hsPcf0x@w|uoyV&Ws@f6@H1RqLj*DY-hE8NLwwzC$zYD=&cbD4m+cLJ|;0vf41?%P}DN!&ivw|LOy zYP1f&apzI zb1%NXdZB1Ci0X1w`lLI)kfW zE8NUW3{pyZ;ritjrfMM7mxc^k9GRPCvF+CkrRAeLY&CX~u z^Xt8jB@g@}BL%6blCP@3jp7rgy2UPAGYOfVuAqa{(`7wlrX49k!~=d#8RqxY{HAW_ z5?=W*8plVGYR?Md`^7%Ep-4b+M+aq+uV1jUhmH*DZowOHzPfU$;50N>5gi`l7A=(Z zGEQg}Yy8TlL&WG1z?6qi*O__iqLLI)(YBAp${9?sZekG-7gXRrR?Fs!e`;r2y(`T* zD(|M#M&S6$dH85*&P2Q6i#W)6V<=B1d^^m0{hikmz%l&U#|Os7oxi8dU*a5jM-(<) zdNMIGTHi^cz)jVxZ zN+S1O(WDQ`OM5nFBLI*=+Ko1i(v9$V9cCP`Z|*nbJy z&(>a*fu4NZsl-LdDJtgaOoD>;J{4k@3EKooS@2Sa^F6>b-f!|bTOFbqUIrH@Wy2@% zxAYVg*1fOZDI|R9-nC=F{4#0jv6V-pH=<*cqeEIPp45JjlAuDVEHa=8dCdoNKNhI% zp1bC?ABy@e^hUL+ATCmzcWxTXZ!)bWUqD?VZ0FpB{x1GCV{gy!VVQQuxsUx~Bse&j zER%&`ht~&5qQhtXEwq1~&4OTix~n;i%fR4wT21f3fGNVB_#pmv2sm(J>7Ke-{f`RsW{;}|w2 zC4vFGqjAc(>`h(iD>881<4hZ=xFM&c7O|?JrC0D_>!?hpljoVEoAWcaXBYu^$V&T? zP5LCqV}Wydv3bRf8N0tM-}Ex{(*lzV`_O3h^0&fgy9+9-GH=p?Bg|gkNI*ZvawG=5 zT>tXhb!XD`A^&&hxM$}17Y=iwGd2!q(oD{9t$5}UJ=+~6C8aQ*Z|moWq)CHdiK}ic zFyhucRnRli?)MF<>$;tO>Buu;hru1pw|H)zW7n95Vhafl?paWu?GB}$d{OB% zD03+`)7#W&Lj~8Hd#T@;-crwhcy!Wpnq*C0I5|8^V5NYo5{hwkK-HU?>)>MSSfl4m zLgwie&$rtrEDVy>e35YnRU>w)<9cY_+Uv(Km_U&R&3c1M`-Bryary4V`K(6z3it_}{@J?eEHf}1(=CLzL0UJ~8N?I9> zh<7r=RpKO6?*fmm>mr)?tZ4`Am(k}OV*Y>b#2+3z`>sk%f2**T%uGBy?Hn9z3$f__ z&_Fs`{_&5hM7PJzRKe!+;rNRvM4xxhv6 zHLL9=$Ch0iYHVj9OP@;+_173u00bIJy%05NVWNZnW{f$%5!d&xI~5DA4pyCFh7Fg# z5*8oLL&~WO4har63Q8||%tpLH;0T?efe#V=bwd!8`9`ys2NHA4OW!W|1fig#IjHM= zad)Zxr;!rr^|nH%R@-Bgc>nUCy{8U?h;tW;m3=+|2|dsR{TB z@p?MlM1zAxbPA8*#t#;lQlhaRG4GpdjejSPh>7!J+*io;M14h&ET2m#*`r+Z> z$gr@7dSRR&i**78;k1MGr!;aZDhNny^Kt+RzTVb}Pb=a5t;SY|*RVWo&ucXw>kod$OgTOnO zdidDMA;6z%D_*sPI;Vf$=rMaL>H#M3OKir0-25VXqi-d$K;&>VaNie38q~SlCTQ>0 zR=JizL@wse6#YGN7~I?SoFxM3m--ArW03ue63s-qiN3`1w?>!Sj5`7tL2iTm#Ys1} zV$c?TN&|J^bi7ahOmXaK?HzqlHwPi)a+A1L#T6?F2`SquqJK5=49Z2jq$Ka=wmn(g z8J!)?_wWy-o!a|vqxpYlsLNP`S_g|T7}E;{q20Ei8gXe-?kh|(9j?ZmL>&@oSaa1O7+gU z`@A~{sCgs>mX=q?4EwA5`zofUPnl)@t~lI<=;_gxHeF+vMtCPjN_b~1v7ki7bP+QD zNY7j(Eq@AE^LZH1weIWL$Z7_R8TfqShJPh6YK2_ zmIURKeT>*1d@*`aM^Wolw@`+GnC~x#mqHI5@~8(eLI}Y|4(ws`=`8n+aIdH!k*O8{ zkC1jHPwgKQzCItV{ClPSyn(1&y`)NXRi|^;fjWFSW#ufDVLLbe5zsjreY{gTmwdAt>3z9Byt~ZO`&cFBViBKnDDL?O z|Iuti^AD2e{KkkxwqfTyh@ziOT2m{7( z#96VQLA4Qd-+559aku3c!3Vb@fSv+jbI0RXd%kPn0y1}VyYE^M*lO{)b>`7_Rf&Rp z1_>eBR$%6=JzWp|zAmmeg|0m5y^I7646g)NSdf=>?eSg^SC-m7)xB$5&QeJAq{K>l zJe&0(HpgfAO~(|mQ|3>XLn|SuDW^+4t3@tAw~>~%OMM$ohUbVgB($(tYc5V`7iNq) zx@($aHhR!1A{-GC*@vM|`=pyK4|FL$t9bL8r7!u}J%}-0c+K=KzDTRp` zD@Xo@M<=g2lqfW>olPHZkd*LkeTpm-j$r0BXCiglLv4SoG_d`HHB#vcG8~%gUODZq zD>Z=W&GDD)bqm^8BbqMF3U>GJygrYy zp+I1I_Ehtu-?mP!V6jEaZM)@vO$|y`p-<}jz4nn>Of@xVao-=fQ-x0@xW~&V93I}V z`ih!BY^H(-B(AI3NNe>r`yAms=;+8TWUDLMlIqO1HDE~Dn?))wedC*M!W!#LtJ$`q zQ2iqv^zp#CdtoqsE$*cGjO8{bdJKPUnX5hjn4jT1k>glef8{HbzA5h5!JuL~J%*`G z(YF|>K6^ih^>WU|f7gaaqcB_~a;UX*$IZpZLl|@@Z+TV0$~o=1cmXH$4A<%0E*_mI z-X65R8^C7NdqL;d>cK*CyYm|4n1S^9n6H_@oT@BjlX`u`6ExkM$915WO!TwH6@1v$ zkB@a?sTu!gT>%E&7fxu&U2uFk^XOerF8R-zpLLh7u2G4wgOkym= zUAPNtI-<_h1nejhY4-}_xjL^`L&Uhh5D-|!flsHj{uSBV!SNX1OUAx!ElnXJ3bXO) z->Z+X3WvudhV`uFH`hO;*m1lNy+`dQa%b`0^x67V=fkPpVAt9GZ`^yel4URFn3OAB z#&H+D>$!aw?Vx%Yx9(n(3>e(l-Fm_V?FI@8$Xp5=Q5ViX*ENj+lR$5}`Z)|gHThB* z7+jKd>Dir80aQ@i3Gz+nXTFhZ82WMf=gj{^ zwas*DHa#V~5*J7|-D$&=>9jv44RGdGc4CIqs$qX355MC0ZuFBsd?l(QzkdJ*$uVZB zG6$-~caf9*+jmb@_%KShYnT23pvCRZCuSQXv-)=@M@~Ke-<@ct_gOOkUq8~ruLngJ z{xVVF0pzl?X`pupq`9iU&1|;1)h(Z2%^y04qnB)zSTNML-Xb%*CI3#|sDe;nY(&fVP)Pkfr-r#Nx@F zc=ong!`UPS4M3F)G$lzQV3=mdR z`E7f0IgHX2m3~!43O2N(MvEM?MeAo%ZX>(K0K~<`!1J0)FT6yr)+L&49IOWY^8O{b zvYopfTQVfbtC!X`eEMGWPK9E`E9Xxh5XcLS=iNZtZ#n-w80gX-Zo(1D`Vs#I;}!Q- z$D=dM7(2g+&$W7OCQ@bF`zK>MIwj?chvC+k)=O{_~~xMA1=Eax-T?ZE)w_z&}00 zD<)QbbG(u!p8eDFO{d!_*C;G6lh;E1(|lQgU&g@sFhvfdC%pe4Mr=eWWFd&HVjE&>MX@+DOeBNq&5srMr7;nb*>f#gbLvg+N>0;vFI-`Z*nsPAhfh3X9gj(IC(I>l$U&Km>2&4(BH zEXU%2*TbeIGsZo;!aQR0^H-Hp_`U|>Lpn@(4ySbY zXHY6Be96FB($U$ReYt5blZe~)zzmT@?Qe+^vud5>Ys|xI{%caO(oK3!&Qpo=0|v<9 z0@-a|0rk0|3tZ{Axx|>ObRkKGs zX}8Y;T*b5oaH)Lg@9SH+KztvsQ)dOe!1=f_Q4o6tpC}MJcuk2G*3;MDf)!G-YnH5) zcVmMN#)lctFD}O_%<%JEeK4nqrslebCok`}tVT-Sy5Fc;2T%!(yTYjcqLHF5+Y`io zFFyTwL`u^S&hQun&q>Oce8 zTc7gs#@a2^A6;6PVm+dxd#|8?H~f%ld!!3o9g~o*tf7(MqdN|MPZwe72*Gc5pvniALLqfPS1SMr{$3k^@k@X0pHUAr*%ZED(Os2#tZ_f;b8+x#wNzM zhw1NA`09}JDA8{zG^fkJVHpSw$6Q?j+AOm;bGz?;^gnd{`8Is5q0ZUdgeO@}Ny)S) z%G_c+mjH=G5_T*7yd;p2kPx1&udSWAv8xvOo;WY_#%lV{`^L*tt!gWNaj&z_C?xzG zAt~wNX#)ncs7RjjB_~szAjeZFICKw2q%aB^gQ*gN zEbogWP?1*oSd-+E!d^4-JRT`tKL_1kY!n^#0lXl0_-mg9pMity$wgb|=86lt%t)$S zYd|SQ2p0q#x0|O^wRJN@nr~H@b#!%9aM;icOA7jHSNb|wh+3}PXf=G{DCaI8NEMA_ z@J$*lTW(KF2X-KRnvkRaeshNM&GiuF1JHBBCR%W1@-xK*r|mVinm}8Vv5p%UDiLU* z??Al5fHPLgovC7G5s{R4p%j%iunI90<1KC}+GRNBEIpr)YjSXOyv|tZ zqK%*x$7%s`^JpcM>(%K^?r5I9*>hFCar`a__YTO+Y?(vu zcT&n8tS1_BTTK)`Wno!H>?k6JetMX#^}FR503)$c>xId@1p9b%h5_~RNMFa3WsAxU z((x~Km4P0(R$IwKNDa^bZTLJn45q=uQ`u9aQ?66InRi>F@puF7gvl@i92gv1NP+Ww c?V7<{IbcU-ms%ZofC(i3PFcF-?Pvf00OF?pkN^Mx diff --git a/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc55550aae6e92170eb26198e9bebc524968750 GIT binary patch literal 37770 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%0DTkin4(jNd7O585NI-% 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 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/user-onboarding/user-onboarding-new.spec.ts/User-Onboarding-new-user-app-download-dialog-1-linux.png b/playwright/snapshots/user-onboarding/user-onboarding-new.spec.ts/User-Onboarding-new-user-app-download-dialog-1-linux.png index 589cb34cb4fea410e13db0c1c1ddca6724995717..0c7fc94a0edfe2f8788717bcddac5c770cd92d34 100644 GIT binary patch literal 40740 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 literal 40723 zcmeFZbyQa0+BW(SN`rKRG}0v<5&|M1CEXw>_|V;mARsA%bc1wBcOwnb-QA7knUBBU z-sjzWpZ6W({BzFtjqx#tV}Yz^uC?a6=Y3z-bzhSpB}EwwR1#DO1cLEGR!Ri|fgb|@ zB9I?~|Ea`MI0OecdleZ8NYMb<76kGb@<K{n%_VVn&RJJ=;u`7j75qoK56DdF;t#}4 ztC6Tb1S3?0)#_B`I9fuX-g9F`#f9UAuWgrdaBT;*k(TFC191yR{Xdk!Q#FbCyo86d zqatb<ygrjS5WW!L<6Bx<owcWXsbQ@Q4=KCrzj}qj_~WiyKf5eQCHGDYlBE(?XEIQ4 zq1BV9@|9_%hLrK-hJ82D6Md{hDM15G1grlg8oh7k;_GSXcT1emC?6?Fyf3pTK|S?S z)ZN<j-TJhVIabjPx?l9n_T6M@TkC1RCniE4D=)}E@9P~SR`*qhf}-%86w#)_0|NtP zvCu#Nh(h#H`I3-9LPE6Iu>IOdBa4ekJGO1M4;{ZxLAhm?Oj`P(AZ8pmJ21zPm>89o z?)&2>0uQ>M<htAn5{IXB(Ci;^GvWo~d^2!?XQl1_;=x)=u)c0npofe3G%wBVsSXhl zhcZ1i_`2oh;qiIXfm%|aDGsfXNP9NBVt#qi^u5~s-hlRdCSJbB3voSuwK}cU_o;}6 z#_vCxVazS9ZzCh*mP<v`z()9m<S*e%8hK&E%0-f!`!4-_tQPH4WF#C(O<lV0C$tds zscCsB@b%`KuP>bNT;k%kF4_dm{-U-i&#w{g^69EgL~VGrvhrse=kqzH@6!Bif?y9e zk0~u3@OE|U!!+iY?crN~eL6bAnpf(SArcP@a+DjG+?-F$kN*t3789NIzzy*-Ew9iq za)w|!XsR%orq=P)S6;oKMG!VtU=O;9332UZRe&n=TB3@X!`I2)R*JN^b7}<{7aM#< zd#mK)H5QVzjpaJE%)H%hR4%l5<5KlrvvwHvYwU(BZQc{c5+RvJf=$$Qv(3>;{7ka+ zFxb%Z%HX4SQ0>$YaawnddEC-mk`7i2sM*<_)?A{n`AM$|3ku@Axs7jYZie*i+VXvM z#oc^(mSkiC&1z!&>shIznYGfyJ<W5>hEz;nCB(-!XL#v(cFDr#?Nr@1UjvCNE|P=2 z-&NO{28*x)ANK!Jh(ArG-)^dFy!{X(ff5@>oYDA_+_Os>_N!BMyZjAgZdKgJ`B>#R z6_$-i2nYzCUC;me9Tx|Ok0gc=#D@wpYUlE5f%DHZ;xkG{28D#6n=*2x^{G*-#+`BC z=1Rc_sliJkJVD36FnX)xCdoNbRvZ?%>CVB!#ntZaRGH=U_|G#gfBA0y_$e#7TvovM zdpND2atRcFYTS3n=(4mpu|%ZeW~MnOn!9<^&Ci(p(>y~hJl>-Inb+69xbb8aqG-5P z?U!{QWvK*xRTKENy2Zg6)ACcvdG2eL$`kM@3GMD*D(3z;u#ZHmxdp&?KY5oPW&S!Y zP7cH<6^&%t$YkE6wxoqJ)%^;}pD8`1VsIUg&iu-gxx*1u$-(D0+S;mX{@~9L_!?$r z*@{scWMCL2Q?u<%md~i`5%F;(JDD7Rp5}`zlmDu~ry?ACRaFz&{yup}6(ZQRm2JC6 zxaCGSY8b(le}Zpy!{Tx|Gr4F)8xvr$aLW8tL7zU%$kY@u%s>V<*=}^N2A{#T38Ss| z83gywI8&=i8m#yA$-kc_2^Ki{MxY&_f|67&!R`BJF*ful;d%O{getsAtg|7u<g<GH zGM$^78@t{JZNQ)wUPmW^x>xzFZ9zK6-{=1t%}bn+xfS!VpA)RM<;KaMfPRoj^N~nv z-gZo|5urvMaNJpJ^J)lYks-{mmHqlagfJ3zqnjAA9!V;T8MUvU;Gq`GRO3(3q$>?h zp~x{}JMLi4?o70$!ZjEfDxIn#WvQUB^u6Q_e2DuNHaEZWKWcPqTPMWD1ucf^*xs7a zLYf=AM9?WFkyLWe$(dPL<<1|AJ1zYQ3mjh*9@xBXMN3f+TL^(XQ9)X{c-1dkEhyA7 zHia@_ElusxM!<+SEmEYzG`6qlAEUgC1G~XMxn~KP>S;=bZw{qr0|P(gztlq~AElH; zI{O5BR0?eW=oZonx%3K!akS8?cDhHf%S8M565M{%D4zMKGwi&i-b4|Av5f@+pNNRa zuzk_j#@?}|aI;SHhn4DZ7Z;=JRWD*Z>{6#aKXW#Rxp8oChKEMTC68x0-WnSEP*I-y zf0yy3t#^BED!?V#hSSxn%nv(V_CTK@Yuhwry;U|#MKd<xYdu+#lqBqBtHF16N@sbY z<C2s6{r%uck!il_o@t+7GDWxkEZHogo@V6M<F}X;ve319&*E2D$SOQLH(aO#sdYl} zNyEIVtcR-YP*OOdKeZemvJ{RF3@uHaP>ae{r8k;pi2Cfw0$zdJ^%E}cBf%#XYCRyZ zvCm4PTfhD$*evG}pb)(wygsLFzC=+SI=j_(IeaX=V1(UZTUv^x+%~U#NkvV~WQm@s z5(`4TUYA?dB#CYiqC}ry@!k6zg-J^b4uWIQAR#4%he<B_Av2S9w%QgKPOr{nu!uZI zuP&xhl8!aEF+1Lc_s}Eb2uyjT7ZEW@^Xw?mizn{{pA3R;0tB~fBQxabhZ@|@e_lj; zdUyzThNXm*l&H$ed-xyWemC3*D_koRl5x%4dP)b9qjOYR8XQw>!eaqCjJUXt9Vkn* zoMF*QjCtDoq;EM4<KyGV+Kq@#PEHV?e2wCz=9V^#8CnJgli$IwH-8l}%nFmVbd2HN zk=GgyP@Wv!{I;)vzDh*KZA7)+8(~{G%9g)X(_HXgT=dv+_ZoVo+4QED_i^2V)xfLw zyON3g*a7pN51YXNXWM+uLq@)Vfgw10&YWi|__(;AiMhR{h3*GziZ<Y!!#g);vxLlU zc}dyz>xZgeIh;b}lesYZ<J~jDqL@8qoSO5-ET4Dj#;c6{dPG)FA>wxCFXNYOW9Q^& zP#1Q&wQ*0y#-_L;>S~a%()B9+)q<~$?b*i!85(qAL7a)=1xVT8MZv;)b61tfHh)d) z4<l~a@Zl69OwpR<HHsi$T6<@zn(aXR^^hRs;t{N8b3Ba<a&t?SqV~-VLI*!*eG$$m zn3vL=R51Dc?ItM2JMIBwbF>uUgF4HDvZxLt8tJ9+!ndK<uM4#wF#E-%`F=-&JY)OT z)}O(tq5=@u#y}$87kkLt@$`xa2r+4|&B+x$5os?3lAD`r<7gRpdg=ga&O$Rcw6x4n z|CHh#?_1pTn<CD&Q;3I~yRB#lYGZ3Vo_A-w6TLEdgo{k}R6WN)-)St*s5b^9XKnE@ zi;&k1Exb(lb2~e`#=Y-~aUaFj2PTM2#O3U048^ZIZ!ajNL&*FrCyFd*i;bV7v1s#S zL2r*45(K=ij*vWV`!9Z8k8?bI`uy!r0{J9faz3lsJ`FJb>k{ihMYUYx{2!X-4T`~X zUno0gpE!tMV-L@;{YypTzP>0|qxO|z@=fy<AD5*Nbophd+@lBYxi{^I=&%O|DJd&! zJ<BJ2{H=Gm@EWPwl^Y(S)ZpfbzPUii6^BkGB!P|Zi1t&_CyZ<!i}~eCNb}H=FTdR? zBgAlic53rh{1r%r*B478*$vaSe76;t^M&<3yW=~)lo)W3>bg3k`}w5b+lI!*ALtcG z+6E_(E)K++JDYgXUZ`B3LrcxZf~j{5X5Bivx-$GVNU2<{=IfsbURKG-$uW&vPX=~{ zr$8V#9y5k|hfGG4O-@OVC@HZZB~`^iUY_o4laoYgLe2n?sqFnexspxAM}6StIfO;X zuJ;haFEsJ|*@hyRyN;kJBV;t82auAIlIFVxp`}H`;!<H%RaGA7G*Khe!{+*&{QZ2H zf(x{-zdtfQJ{Sz0VWr2QTknEWcd?6mPA+0W+jzVFGN~hd&k+X%I=g;jI|y9l>$~F- zbR)OJ#qe^`Dp)S8wwn;26wm57UF-c8(YrQT%PJ+ywYR%l;%&`XP*?~D@um5c<~}G2 zo91vzv6iwo%pA8r-a&kvptm0p1%+?QBc6To_umk*(wuxk<%=oisjWF*RA}7@g==1D zB9CFyf7~Y|Ah`S~P7H1e#l_7{FeC((a<{JfEI6e0fweWeaL6s8q9b{!>9EIAe&qSy zOuA)Nfg6R87kuu!cO0C&owaA)DBboId9O>IFEBOVESwVZ+wr@dZ+~XiD8?tTHad0^ z`}s0~U^F5^iOLANP{ayW68=^5E24W&v%VYR-Wa5%v3w0p>~d6YbC2((iEMC59M=2q zjpn<%vBmCAnIVs#JV9x?JEnQ)$)lusKQ^&o)IaSA@fk56*ybUC7Du)CiAjJoRDl@( zf*XK~Ek-`iRQuStxV-)*mm?hTI?+xt5M+>F(3k04(kl=#^yORSUyWVm9?oX+@2aW8 zLp2IXW@on%Ac}dkV@ux$Em$PShN%2T*WJ%|+2niI?Ap65_x%d;s?RLe#&GgA*t(V^ z-Af&g;48eIkG-zVWsH_<H@`>|bzrO#`(0ur`EivP5)u-^;j|k|y}}BeasG%pg3A!n z?~Je&JM7zfn%r=$6j5KSaP0&gTVFUBe+_Na(-AWg{C?o_u0thp=Of5Y4*9bc&lni; zFSZKRx>1LRYi|7#crCwJrx38lqm5uuw1bo*NgvfR-$-vUQRMG_u}?!!PXH2~#M$;3 zc5;&Z_0?6Xc7;W??FxO7ZcXq+u|eC=(4%kc25@E9)x1`-vL=anK}?Xz>FJ#Q-nC=u z9qn1SHCct1ZD*Dfwp+)qXB*rJLA~>zv}eTAntNbuOo`eX&u1Bbps7H@$HFz=iuW`m ziP!4+T5@<Y<tekn48yBrYE}idQyq;rmX`Uv*2c!^yw>lul%ex#YvGlN`}noN&j}|` zU@%6#=4I-^Tob#zMxGi9NC}`8;KgWZX|2yN9F!5V>!(|cF+FqIF&=6dgZQW}nJ+Hw z2bd3*X}`I>@i5XTWLh84fdCN1Z9dR4IjLFgTB1NoNksIP!dZ#X*`J_FpO~09R>Yj` zgL+Z7vt+7Xg@sF8L_~1`V)UD6W}OWkYp7n$<e5)cK&gB3T!)m-(b3?T75W&RUWbad zGZr8+%16<4h*y_KQLPT2*ZX~T)i=Sz!9xJDIoUfo&T?zj%vG^^nUi8bidfk9BJ~vw zC#R)%t{Q5}_<W913t3DIeq=;MVAOZTmQmWOr)7F@b9@e2)n``=1yh=34#be=o?keU z0q7DZ>k3QDx`d!AlgK!fl$YZLw7XyJ5|fed<P>_J@5W(Tstc>D$GBYaFo$(V(Wh#k zQ;I(*Eh%wfFa{8WdX7m0#ld))xj;Wkh~BnXUn|3Q)X@$Hr{8{qE!8Ob`*f0kyJBo* zRdMcke@kyZoqR}WWPD7(;o*pEpQ0M+Qwv6q=!21IQjn1(C%aWSij~ACCyKw~ZZ3~o zy8py9`kns#WO1fbCN`Wsb#1iK41>y7)P9{sJI?_N&gaL*z)q$j-O}nNBW>aS{u%aA z4Xz37u9BGf7O=!Tuh83MLT~~MEf=?Z70GYmAO}q;?jsXrYvL9!j4dpf2v~Gk`Ytx- z6$*86O-x)|D-a>=ouchaG~NgxJKIMo8Z7Wad=juD`MvMpA<g}TjT{s<@19sSsMUF` zHq=0$4>5&y9bXK3#`eWm?2J;Be~F>*TJCuHQjJh=vq+^&z<!<T$&(k*+p`_Mq0BhK zT8EvW!KTZ+*^Vz4oLLV<a{R$6lgpN`eD-M<`8gdkGvg1PBx`A@#l@C3Sp|g$W!A^q z)rLh8WaoP$q<}cma516U+S&s6@~QLaOTJoZ$EGsP3Hjh)F-F*(Jvt;JGBUEEPXp>1 zmS|LgM$)MGEm)_x)-mZLlCOLs4?ZO(8HAf#HBr!!gyBaQ!@y1k7LxJQ@nc$A+U4%3 z@5r0e2na~0y@KkpjQexmO6j$$_1O=O-Y>=-7;(6s?ah#adM+ttibqYIG1NIoDdO(% zDM{}sSfp4wRsN3!1c*WIS0)w6;Mt@hASES@O-MlNc58z38>+3~vk;if54{ox)r3x! zo-$K~=+!GM7QK4N`T5ham<8`ch~%dS%L7SuBo{v_D#V9^#fGbu?}lmj=jyO17iN*Z zYiemNZLir|@VQi+92A`MH1Fx~rMcRl4KoG1*~l90plNF)x{(Xm;kC(x4O}<~K`ze| z*f~ws2T8&mH;1r8h=s&geqwzl9B8XXi9#zh&^M;w6mjgKmA|H~y7@5B<%h&cgv~E~ zxgs8ArH3$j*UVHPZ0dcIDyZl<&zbwmKSjFfPRoR?=|bNz5k*Ydq7<*fYj`>9a&2N^ zw6dzKyuBiyP)g)sG<cz?>g#njM5N{zd=rJ15K!EF^wMUIVd%WK1<u{ce{rX{(dW}A zAtv>5pPCv0UEM@Z*I$TavrRH4$LNp>%Lx^C72O2h!jsUj#f^j+RH%`WZzmnuxPnec zt_BQUSZ+8uYz|Sp&YNs)Z$~`asWaZEY_fdsJ2;#s>Haa`z4$jD#gfuo^f>v4&dz)+ z29=tHy&psc_$N&+2KHhFR)hdTKm=%<gEyw7rG+9%(5X4V(Xzy$yVXNaqvs{dN|$Fy zh2;mZ?2sxec_X?_bKYuU--~z^{4fDTp<$;-9_<em9G*$-t9tfFbZK}YpZbTZOBuo| z!1xm_{9hcC8awu{GlH7`Vra66^h2-{q^SQUzW*SWk;wmNi2rZq0{x5}qO1jDkt=pU zOM4H6E-mecS<S%@RlJ0tWAtw5ygVcO_=#MyKmO?{$t$DwPVJ$c{O-{wQ5<_w-5sI? z?}`f=4qR9tHIPoiE2v4lduJ!?amjwZC+2g6o1MCI-Eg=l9@5xG?PdwmsT790%#sXY z&&+iZ&j29y6u0*^ifRuP?ssw3%F5s&w2f{c4Kk7mdLX`d@dAbw;A@?_lJ$g?>YP|T zKgo5ZUR_x%Pc@%}c1mhpHqxY5J-~gNZoE16L#DCVY-MGI)9J?aqkobFs6rtr{11ej z-+MAQs?*!@G&E*<dn^F%@IjA1(4l>Lnnb+!Tl2sGCdB4!`zaZ}izYN-b=8!`pcGZF z_78)ru6Ao}k|gZ=Z6ca1=3P{|7ldonI#E;TIlU${|1~!Sb>|w3EYaF?5bFwMr|SI_ zJ&VR|JU{O_m0}{Y<bf!{;_`No+Zn0hX2~-tDQWy2vcTMwyx3UHzS!T~)4!bq>_xDu z-Fc)p*ycEQs-|3ymY@4xKbKkPTzxV!R8YeQql;Bgqyp`RO3l)5*`wt=h)BgU;rgCS z!>Laa6XzBuifFv9etQRg{yb9sYJOr1z=O>Z=f}FbB1`MT$dUnJ?V!^5?4F43R0$j& zLBj<Viw@sUqDOs~Z_AJgmt&=X7AKILhaDcDvz8Qm`L*t;F)P^QbxZP@fc-h_GW)|s zm=#G&`%{RwNSM+;!;+MkqSK8r^sB^ks#NE$s%@62l|t;*5-+soCk|G-RX2z8*<tqu zZZ80xJc!$TFendexK2JD?;7RVY1psx_0*1+ckP2seee*6?MXOs<{0>?7t1Bs88$oW z<(;>A>V+So#e0XEM-U)@s)2_fdh+B6#K+!T5%mQ;gvWAN`?ACOJxg2vj)viT76eFU zc6RGnA=R&u5je;<wnX2;LWM@Ro0}2zKb*3!PwjI@Umtp%L{&>iht`h$<4P}qFmf^9 zW@Qt9xAivwV^_YP^3le`wCDx3DyVtbBr-8E(K-caGE3n#CukwBqrS}Eyq;{dy}$j0 zP1ChFU9m%QQK&f#|CwMwQm5$#MJ+7F>juui`^2;HWB=$VUK*7ShvT#ZP*=DOre5c( zw={|fDQ5*2Dz0GL&*4SWiiOmuZeD$9JW%Qr6mxmxcZYzqwAAK}76QF2p@QY&!sWTD zdq}5;FkD<*T!dT}kVx>z1<MDk!s+uia;guw$4vT?PDryo&mZ8S`cLx$g&M{~M9C(b zhFk&zQFtQ9%Wt21{lDYAcWch8hhCam+VGG7Osw`u8W}jq$@+lw0hSv)WPh#+D}{G& zEUa#;*zwS6?SW~PKGw}!WJvSe9LDv<{-`DvE-o(5yI(|JjiS}w_i(&-6<V^v(^b}= zpXRH-b;JzTX}Y|0DL=HJp&jf`;CqgAe=hstMaLBe>Cxp8F2pCrnzR5-pN>pORFuMN zPml^6AcockxVKm50i~s!63+WT_|DX}OD#s!PE$&qK)SU#`t=6l^TS>b(P1AEP~1d* z;sBsSK_F;oXuAt_xR{vdB)vR9PZ-G#T>@pR%6g$?opt8pMEC408PGg7C#v|i#~oWc zK7T6#Jk@AnI751Q#=3Fzov?9H!s6nY%h53%P=sVO&wF2Sf7}9Wj%mE6|K-Sa5v?Ny zmjmsc=+!HA*O-{inPR^Ae0_4~{rR@_ew~OIdL#&9p=Pimxey-7LEMjx!zCHXkDgu$ zXJ`*GHyN(T@Gm@L_}GB(t5#a^yveJ<=<VA;av`T>GbvigGy15d#k)BhyXDXjDSs85 zNcH)AEt$)ppdeP8x{n{FDxf33etq5HyP@mjgYFl4+}+fac*@BImq~svYQ4JeztYpJ za#JWN@tFReg4XLd0aX%`p1-~0+i?!<JsCIYn?$kLiD5;<86R^h`2MwbO*_eNd7OP0 z(D}{7XK&o^A#1UvxL-lowbu4(6ro;^mN=_rXJ(`BtoIwx7FhloeffL21I;K&mrcWI zYg%$=;-%_b@YR#|24g1BsWJskQPWM?H*RjV(_UhImoGH$&-fMyHP<t{Q*sJ*${gaR zuNECiN5{Q?k5#qS`V@&cP=rtJ(9_db4xMPkeyKl@Q`x9x+iyKCQC+gQCKGnioT^n2 zdb8j~$uv=*r}4HPJ2FyEqv~O6nd=GRyAXo}d$n1RcdFwn-WJNs%HoY@WoPH^3EiHs zqX`d6ef9TD4RYuM831|*-ZJuBjZQ2jIX^srIj!|UK`8&^+|kFmha;^HlespJ>)ibk zbUY!=-6b|go|jucNP2%-Zbpb(oQSwP5oWL12`sOm?R&#Gx8=WbZqNuZ(sPX7XOhdp zIb!k@!Xoe4TM>Le`A9Q2Bo=fGK9-tvy~THaH`7R?7Msj(^uCdFrZWT+FZ*J5?$d`= z&!p)pz)tVIs){U5_NK2;M)Ev=zGO~b*5|9u-17W{Gb-@C7Z;-2W7RMKgLH}fPKXJ7 zg<TO6+C!8b9Y#Z`OF)5r03qUa;GkC^(^x!z{$&4}r8tr%ARUNpM)Q-J0Y@u#3*1PU z6iiMbQU|E>+47kt-QC-suFS8?Bpe*9ygRb{<5y?CKmWYmdJ3>FP;~&#g9%X66_!i$ z4cCD|K^>rEz%;Xu<_sf^jiNc~g(Oz9)j`Y}MayS96C6A|?Q6XnKD&)cp`?6F9O`4V z_^w|bnleaEGg{r+WoBnBT~+K<JN#zapKtg)Ir&L~+>Q~i<`!xKSo}zT!qa}|diqdO z3w&qsV3JNnovL)Z!Iz+};@9p)F}#Y5p(ng5%`dB{c%8t<$*G)BRbG(8Yn}H+KJQ$0 z{Izgxt(C)zk!wu49Q(zeOPA|2ln_YM%@wJ7F{bp%djI0qR#>(INrrMpK!hBcwI2zm z9S>m6a1ab(5ssBl)}QsnHWxi(GHf$$4#Le8?0bRAA^_xG&=l28cM0m@1{hV)>EO=O zs8%IQ4$O>%B@qNrkbe~iEdN6sF!>+F0U|siOJx+FN{}BxZ>}$yn^2s2VzrKVs7U*1 zy}ay@OFd%r+CS9+&9k3r`9{0R<`=``>K-@t6{OD{6*P`Ew`+&#6b^*GrVg}y!tj0W zk9z4jpbNua%XimUKxm?J*kF6?ei|Nx+iA2KnD!t!JP~L?MS4xXCmZbPt|vF%hwt)f zQ)u$kbc*cNiVE&zhI+rTgC^;iahIIhJf|=HuTr3EqmHn~^C6V!v?U9>qOShVieFiK zc_zjA{R|y)b2I(;?HfgSPm-V@t?QRrDwpNw(*CIHCFKQyAZ;ZIJECUO*A#~Dp>8#% zz3eDlxHs$X{F2q{vrAeLfKL2zy+5I~{X`DyA6|ft8n)ftT~xB9=3l>5h>CW$ewf=h z6l7H1P5m$z%+u-y6TiGQQlLryD&EI}<O}g@0s;d6B6jPe%`e#(<Z_xDqMoA9QbZ{q zQ*)ti3>q|pc(h&L6_AoykOn;quh=6R{U$GeP~+dR^uh>}-p<l;R`1WgzV?qVRBbn# zlRXxQ-u{`AWD)P=1Cf){E!7HFW^xY%Nws9ye5AFvYiKsmJCiNzH<U>~$k|z?y;&A= z-iIeycm0yIeVGqqv5ih=#}+6+M*yKuC49q!^TXSg*J4!Z^7-z+>l+6cbVFcT&LhZM zkHHFTsR|9}pfr%}P4nz0k%0GH@6#$*`@Ky98Aui~SQgy+5S5V;QD0LxAp?}(knebS zr;UD?+lk4^m=kVnHiaA1EIKt77>&1VmS00KNO|#NpRsH66DlO|1bBC`xm=wRgBHfe zt(1GpJKb7Y2Xf`sLF|gXfkf478k&Pfz#_}8A1Y(dHy$hn_T+qjm11-msN6ba36{!G zZiX0S@%F+V=n$2{vaAB~3JM(`{6G8urkJbCjkYv?kIr5k1MvZ?o8M#A8dlk@%C>f9 z9ztxmsc|+2%`q0%*3}K5Hw(YiX0LL+=#nnhi}1zsl^%KD&m#2}Xw@n1N!Ng87XiDz zc5|||x^r~xKpZy~-~kpp#Rg5j^!@ciSvs#g?m9Hqcqt?$&#a^#h*W3tqq;Ao#X2^6 ztTEMlPPf)1BgI!74opnzd{=}T3DP~SXrA1zt4+6C>xsSYI%q8ualbH`y9)hXIkrv~ zy=pHt7GKfg@|)|T;Tw>mvZfXg;huG2-aXiTAteAKG_dx7a(54E&+d3}0yZ|k%OQu# z5AQf_ZT0rn2loD%CDtkPnhk<Pk;=*diA!#<iSUFiXlDhpN{5rg9k_UTL2XV`Odvi$ zf8Bl4Xt86zioQ2rw3qPCQyOJkqpB$C5E2m-mA%~Ni(qJG7OeVRamDofvOeD9bm<w3 z4#h{XhJ;;@@!<5_4Htd9w7SqxIvTFA<kV6UC#oJNV+fy!<VZv{db*nc&<DC)5<rrf zzWkkG9=>1lBR`<d`M_wW@)2mPtsJc|SkRb%CGhMpF)=}~x3{Nq-QzQSq+N9`&5Gn+ zq0A9XeGa1lb>sO+uJL5u-QBW^iqg*}_5ry<Dkx-z6#|&p&uH*ei#^bqlrn_mDSYp@ zVnm3?eOvh3;d){Ks&E{`<gNt1&}@isr+OO@5fd9-pDRg8zY%$^LLX(MwuoG4fSc}& zPnju^Ne87A+TGgn&H7B(Jl~i-eSD2Y0pm)uHTD`SUO;O=);{{)DYSa<AF2=gAJxa9 z45&Wu>Wy-9kW}$18%rEJau)!0<@8wH^mtW{;A7qN8;9HMPIvJLlU(ovrwPMbvLmCT zR#zfEBfGS-zL$L_S+HK!yOh-!gGpD{!^aP4;Jc8!L+R&gAFjT<L1pIVJx`m?NI4Ph zKTx}Tce<1Ew0_$C;B{BrA#N5)IPVT2tA4P7*R29HE;@^@NUtH4*TYDk&ht+&0&Wz5 zPMTX<Y#Y`YN@}zhp9)W@`Q^e$^59~V^`>Q0d+<S>^PUpvniLGl3}TN}!}1xxHtRDQ zOwr3#T1~0mO`;FR;{wY{(2$f-i2qGN;<>{qUR(4LsgpQ7(=cdmYa_>J)@}y)mW^#7 zR`?w}=Kewkr|Ux>P{4CV@QV}@#((eMT%7bn{VPjKo~__uuF<R8Zcj9N>g-O}ki#g( zw(~pV4_9Y;oEPB>Xi#y<bIp1{XNKrfao@jZf(iQo@ArOVRllCrUmzpfEp^{;>PtK# zkLQKLTUuIze&XVyVK_j(hHbS^HET_c8rfLZSd))dL_4RSiXTE(5Oj1%f0}ZsfwFK< zA;zZeI{k+R@d4(*5Jui|I+zV>T!L%Cx&pks(Zl0|g!UUZ0TIxI(JvdV;G-=1{I7^U zaDcqd?R}#KC4~+szYvwNgLUzMlqY$6RRmL~bZfY7ZfA^UVnXGUgUZ_pfVm;vu81}~ zk0JdAtY?_m^gqZ^^HP7TIkfOP|4S)Y9HY(<DYYv_|CCO!3T=*--w20?%ScGTGikk+ z*lqiCg&CUDm#3BSP`};-?j?|%D=Vc}=tE%=PQ7;Jkn>w9wH{izES21Y$APjJK(amD zNMU|dYfoq@EiEhOg+WIf!5DegB(;Ez6YVKS_t+PwXZIqiCQg8hi)$#~94mz4DLja* zE6m71IXED=*wM4GVH$YeA`B#peEz6WoZ6=bF|3q7U1y|<BuWLav;5e?H;%hW1~lQ$ z$nmhZ9>G3jdiUYEX8GGE09&OhF`klR4hs!}m)+UPB_GdE0ffea1Dilu8K4nH<F+Am zE%t5wkd>Dob!L?M`Y9`mu3o32y-bX7M+lGl7aYK3YtNXi#o9YMs6=Qa7t$Un!-a%~ zDg&8_Ote}9_A?5o)=VqY6$ijIQgufD5c?esH!fSzna%2usHcpC6kW4zYEVzf5{=9X znA9swzrb?3XqfCwMEvt^Na_tSxMwbl^TZl{$8DZE=%Z*((8l4nJ;ozoGxdI(UKR|5 zq@L93YW~a1E1IWIU&F4+Nt{4LbF<0`Yg->E1<KM^f`<_w5xWoW=2j;DmQ3GeK63wR z!3dlQ6i+4-@G5NfXCHWe5|^U;nya>a8pj>DuFx#?1`~F1vz8CfUCyp58rvRIlLH4J z%E>zWs56liEzUI<ma~F<he|}RD5}dI2n!j!l$4a=fj=1$i)Vc1>K2MhEkM6q+|G_G zamTeDzpK}MUu~?!c{DHN_!;GdlB-~`9G#(sMaWE*)i#(>oED`8xJQxaAjAS{;)wO> zGj|H)YjneEP6#A`>=WZBa&zMWYcUpB4U+-IqhTOSm0~Ti?s!vu^(km=qIjd@twS3E z+DF9=XmOs=b9YYt*ch&NRrUNNDWz=;3TXhDh#PuPvB6e(9}Mssl*q<bRaSNykos}H z-!vox?b}b7<ilG>JyG==`+6OgIi~teimeOY_ic#rIp{`|U_Mq)w|*!w;$^vo07;?m z3d##H9QuSXHV!;BcnQ1@X^z+NrDm%`99!}ix8km!US$TY9C55;!q`>}xnMORmdXBN zoA0gvn~i~hrIrRAfKic6z3IG<+ZQ&+3(*vlZjh9*HA>yq>_8V1kH}oPbaiv4iVu@w z(hp42Vrz}f4QPggRz^Pb<nCI}c5_jGwt?K&`%V=3KwZB>(0Tgs^t2h|yK37#9INO0 zZIy-IFg#bH&rhg_@W^SI(Mo2aeO+Nk88E4kTNj>zB!M8E$cYlOGgP&F?bm8kL&v({ zT_OO9z^JxlpD7;C3F95E3GhO2fV6D8)k+Mzo+`tAOZh8$Nv5$IW=o(Pxe(bS0in|$ zXa(wyL+e+r;AilJEp^d^VdNqog@&>DtG)RIowpgcJ@DvM)0*S#%^kJrv7_0*DthyC z#QYVND}pm?qL?=}WO09=p2hN4CTHb)?QrQ(664<SJ>;oUTzys@<LgR=oC9qv$l=AX zHw03sU4dApL%mbOj{wnjuY!k+7U`h@+s0C>|4Ugw$$P3QN?S&|aZ4>PDB9aaKQ?&_ z-SD3vg&w`bMT4B)r83;bilD{dGgH4^vq(f03k5Pu>jzi+k5ECU)2=ViPn3IGC`j+8 zLqK;>v&^MYed7gnWNM6`-*k9%)*Ig$zQfaJKP&rfobB6yxbvvq3SrlB{Mq4jw8e|e z!cYwQSIL2Tbr;J{r%;fKf`%gcH^=gkDy?RGuP-Q5J?knjx4u(KeJkv*Nj{q)`?+Rk z<Th??|2QVwQg((&gT)|Nw85R~>KuAg!-D)OMYIE^cfVV{^yu1}$`CTUIb=;ww=()U z6xn(h=07Grvx5XFU|}tNyCj^5F67^@Q`tH^j19_VKzMl7ro9RW9fg={UfXeCPI)OP z=fuayYcCn8hFkXho>MZ=&>%!JX`%FrCh+111O&vMZ*5FgdLls{3tsV>4P0UZNZ6V) zykc{Eg#kl?fQk75!)<*-!{bQV!_zHp7kBfD?e+5gJI~XcY0m!seokr|bPD0Xmb}-N zws*5nj8f{$gC0QG3~GXHap_lXet&j3-Nc48kF=2kbo#NZGn^a&63f4ZyDMh%2x4>B z`n)eesP5;9sf9&w6vLgm4(~?z@7R+r;m{c{6Bw{`4f==ocM14|!`@*_#TYHI{I+C3 zS*1$+OeHBp4N60=MnQY@OLOHy?WYc?n_*zJ7U))x0F73Bgg*57pIL7*#HJ6qC*q1L znAB6_(UY9+)ST$X2Ko~b@g=8zgWH2R`G6ulL7J;dH|8=R65eo{6WrZiV2hIQptIxR zl;`<XPGFT8n2cGj0RDDqa?au*Y=#G<cjob$?w2Si`t4minJm<9+^}*&rLG=*c;%>) zOW6g4e=x}|H<v*r1xAvufK>u`&!1^lx)18Z@C*rPLbF_Nq?l|@6l0ONxTRJ&Gt<)1 z8G+IT6KJc)?Zugk3&yu-WJYl}zkbCNc6o#VxjZ;B0T7#TGCm*5;=DimJWDQm=)3bP zP#fCj=P4YwM+2n3Tr&jbTZ)*PnJphi&PrXT#&|lZj{M?qJ!Y`zwZiAhwvOryg+LPS zw7*#=+3PVF34$If=<h;&HU?7=rZyNvg}U7UeTzt%4Pqsw9(1&QR~t|sY75%V@^Ql0 zOGfvLeN*<;9=}n;Zf>!x=0hG;a&mIE1h2g`1RB&qV@eQ!UE_kh&|*r+@1jryBuw}p z<}DS;ZZ92Q$kIN`k{cIf4iA*0gw>tZwO&FcrXOBQG1+Dc2@pt;euMg^Q@nJ`jgXM< z`T4no<$*fCEf+eFlsfx}7t$)i`RePnVJ{v#Qu%odT|oA2)AhM!2r5|^u-q&)`}$2% z-~<DppF@`{pcZA3t5%1bn5$$sIDebI0x~}i&>by$xw+)#tMq2d7TPzn9)N&ozr5b9 znXGdb17b3ov$JyuF?rzNckjIMTJ~tUqfKS9?a|y&cF}vhuCNrw;Sm8eA%?sO>49># z!88?=dY2XgP@_KrA+RSxE}BXF!!HFd(A)x6qyqIZM^awY-eTPv)F7!314)9&y}+dj zf#}vcXlXj#T%wqonx+C;XJb>+HJs6PxH(J%<bzJ&zyTIHKN|0Q)pVkY(6tP#YZ`8D zToL!Pj++OcZBNWHZKAY*bzBzMM;-PP-AyzZ$QNj1R*u&SstxEGTaz2EOU)0w5=ERT zz#RTmGOd68W`j2H;lqdN7p$8kzv!ibfQ?QzgtbqxuUTS)0@?r+dqSoSm42c<4OE;@ zSuw~39b5KAu9d2aaJ{ZLy}f^b*iPL$^V^kbP?hmE5>2&d0KSAk<jr72Ikhq~G#+KG zRxk-%nZZ!}_V&*0a;);SG%6qx!o0Km{F51aItH3LIwl~5Dy#^a2ID>fFVD(^ftOTU z0EQv3%EBRBQGv^P_vt-;|1I_s6*yrC0#*gD29I{{!;MaJB7J)L13I#xEEkmRsg0H* z1^N|az`ZB+J&ZgeK0a?8zQLuN3#N#RnGJr>=p~4drQO6CdQlChkYN8!L;N<tJK+{d zyZmiHD*nq-M;&CK$_?G#TIFc{c-VNq)McC!{)_SYJgM$2uxu!J7q->d6CO5cH4#=9 zR!&6la?*o!d2<;K3I*KWjfd^^0D1Xw&vuF@knhq8<o)46D^mXc=6<Nem*MJS$1jSZ z?NOPDd8Fge`4t?@u4CYRi=wa3N);_P++;urG69QLnf$2$Yb+utV-}_4*bS_gv=U%B zY#5j=4ZdM^;QgAkJ)|#}#kKRq4qF*nze?X^;-guA{PM^<)uG4k)x~Ip>`UH1%r>s$ zy;?8Bk2*F|sF=26hTJA=9hq+`sEF)p$o7*JA`%k|2xR6Nde=OWrRSmLL0Mq#ZcbOQ z4i9a*fZlm@QvBoa?3+QVbm+w>MbQy}8k}!_A%Zuya=s^Yxn4)CS!4VJpk2p1+Ezd> zm!fi`hH{J~!M1^F;IvUM(*N9_P(@H3UfCPWq%&iW0T~!@<UILgJzQdhkZEq3`tFB1 zNu6w9LqK`ZQNu;v%E?wrI>>Wsd8YorjA(e!czd~bAr|rF%a>wIg?OIMN><Xyn3#Y8 zxH;Q{yIbm=)c&(5`^3@}`la6c1k6v`nAP^zm|oyrVp86b)*3&KHr}1&yj(tc<*5D- zlp%Y$#f^-9Lxd6(r2Sq&itZ?zf>^)Q_<4a=1zCUmkvNmon+GsZO9g<&W4fpKjB8#) zQm1B&aGBqG<Aed&1%7~@Sm4G;Rf{>7{qw6MuPUo6%nyN5#)O#ZT=Y!a1a2NfgvAC8 z<A5=!NvyB0Pu9630q@c#4Bz^)0<07A`7?KYgLYo1!b_<);lQBm;prI*Mi+k%z_{O? z`wfvObef7T>k=#MG4(AM$e&xPT}CFVS^(Qe%KkYi?{#7DlPHE3m9B6D`gFbw<Bs4< zhiNtXL8&)*e+a`(HRqw#7*2q+^cALmpcIhCKLWADLzrIa4?*}-|2GymA(7b1kZUR2 zhO@5_;n{7I`$j$3`EoueJjw!#dm{u`ly~_*81Qf+_lZeJT05qQk<PhY>6vyW{rz&t zkcDjVptl}IV7~*5W*~qboWu6!;A&h>q9IuK0%a~oDt$>!kG75-zzg3LB1?Bpj!dIM z2PQ!1HZ6dj<&AAr)Z|70mk+=|#e&DRNLUJgP<wm9r@|6<p5cTHM8n6?&9n9JV2Tb` zLJkC`A1VvLpm<_%SYv2vbbcw+9T~J(U}n<Hi5HNsN)oM^@v=x?<(|RQK~R{~IQ;tB z5p$nBxlGky2bEypQ|6;+Rqz();mik<WkAaXBtp#lyKCgZWD&otEPP`VlQVJ><+#^B z%oJ#8>pzBuV$8c23&!(7gU1VX(zJeL1C|>o2Ur>KbWu}d^P?gG>mK(1af(ob;Qnh@ z!v8oIs&Rbo1H$|hC(WmWO)yd|l}U5+{(DuNRIVD+89Acz3-G&VfG<K8ug1`TWxA)T zA83Z9jx$b)O*Yt|MGm&KOisO)1UO}=*qXB3YA$ccWVW8zckztW_E?Gt)^Y&FEJuG1 z6ZC?K1RXdm1o*#d-v(~Zootlh$NpYnZ>_f!AtV#5*04ST{YAX&wzjY|vwo5+FL|iw z%+q0+g42B?G@fWzU?FY;{q)<bv+fJH>+LaS#4wW2SV$Nh=MhTn?d`zUi3zwV5|(j^ z2rV9hC|L+6Wq23ZM!*vz2A<Jj{}*{n%MQp@p1>kN4a~a3!&Rjo9Zcnx3&aV0)}E3T zbm`75m3u;?>okCXb5pB;_JO2P%AV9!C&62$Dv<bwfKfa!tPumk!Nn!9F+jewwS)<& zcH0v?KM?!ln1?l>cjs%!&CJXsh)H>^RIaZ|UOr>su^4>>vb;B?NB|lk8!)usph!qo zrrNGZTUW<Osm)70pOd)8g!>&64$zEs<DFPTyIPF4W3NhqniKK15G4KA@tVd0YPUVG z+mtvtJ_4Gm%FH@Q`$SytX^oAIZFkgp8gI6B`fgX8jcx(%__$@@{Ttg)l!USGRWc9U z{lyv|C`@pm83}yMMq6L}tuw8p)Vy*lMQ3Ivq~zsUAciuViXLZc8xeB71K+y9&2q)b z14Uv>cgmFz2R}8SA>$C2^cpaMtz-P9ZxQnJBeB8=K2cFL>czTj9?jNs1Rp?$_>cSa z=y0j2wNk{rKE?VzyemYaE9`D_a+nfWA6P2{afa)}bJeI#yA+MQIxiMl0rG|%f}a0J ze}BSi>-oV}T!z-6x<Lr=*`({=J|q%kc?96&gMCVJPf}n~k^HefpR=-xx==}8VsSQ2 zZ8G3KyT+{EGV`6)LXh96rIili^FJDPUf0wHM$2jd(QoY+tpC3S{Dbf0lkH)y`HTIz z62~1UNOKJ93=AK9?UAq8YgP2mQ0)SC5SYGc*O4L^o)S2(@V)gF4M4UK!#D3x3=Ak8 z_I?q!?C^r!tWYf9@NnnIHL}|cqQ<**cT=-<uQ2l8*Nm;NQd<7nHlaRq2V6PGWFqR- z@30{Ivo)Ws8*kx`j@Zk?yw~!^G#ibhr^|pP2%VG@waV&wK5KYLu!N}^9&B5{Usf2& ze3MNk_4F?wt4F`w7)&C}o~b%xw!3!nYHU5N+4U?eC|J}Ue6A^Kamo*~y;Qqwl})pQ z4LEvJMZY|09;f1h#={{%5dLr6FUX(C$;m~o!3;<MuP^7bi*?CRVm_+%g!KnD49s(( zq(DPLiONPr$!+jd@DPNeHeMaugDnoZj&GQIj`8ysH#L!>7!;bF7ra6PFod!B-3lUv zHH!7gQ{<CE02Y^*U8WTC`hX2IwKozHk!w3#|G0NfCW8wB!SN?{?qg83i`%U(;!B$$ zCD{4|7&?Cf(c~=NP*Yo7ikY3=Ve1#MUY&y(r5H6+Deyh*PSqL2dN=8)FVB`ew+GV9 z;?{^cXijwAA$$Vr<b_1<@rCs#KrfI_6vM(Ujn-d5d_ZhPfSwo)4Gp9j><9Q`D^V)6 zc)dH<AW3vaZL?}~x;sXwQKUbThsmnL({<%&Y4|?zEUwyUg&yQIuxI4QkG8vpG>LCt zn<LwX8q6tSnGS}Ira&sYn<|&+op@6qMF&_0(>JxIX>M*lU^%a!$=RO)q8FK92@=>O zGFtgcR<^zI7Ky|5mzv9Uc^lx%TP#l0ZhYi|E<~WG^$-H^ciW86j=c;J*(|@!DhpIX z(VmnQq)9%^?Y~faQN3nYqpk5t@)IW72ms~Eq+A0(e<GW7g$>tYg7@&~i#g<vyMcn7 zUqUt+t{HSRqv%6Ms-fZz#LUVsIDE71UN|z=uCAsx?aM1qb&igzLG|{gD@uTyhu`)F zIoq2Tqp)5Zm6Z?jh>-A;QJc(Cib<Cvff#m!d!^N&LP(v{7CK-HMvd3kb04=>7!+aV zVE>rca|4Rd`SEdSs6N{_w2{1p+NajzJO*08ia%P52^=^UC$KF7$$z#8T>oQ>Ku$+i z5Ss}d6AJy18rxKU$hGUmz#Mf|Q$|^+C!9&Zc+qRLDEhEAAduOf9Sgv;w#iAghY&_Q zR1mU16pb0uonL__ZWy@`RbP|5Y;*l@H2)OUr6mc8B(QC9Xh_dLhQTbS4l%m1>mQwS zt(`JjoS^BO&xGv$@0gi;J!UravTHrxf$lcWE`q|E%7~eQ|5E(j-3C#u<BrPaxp%%p z%iEZ_JYY<xXW@?N9`)kX)YLQt`(GB<_XGAt+z=pEbHSZE6UEAD5)YClJ_Ytv4JFk9 zvo%%U!E^;uozvbEn`<bQ5QoJmauV4LtcxwT54zaD_eovPceP4;i`2U1-m-$o=&QP0 z>;334v%{=T%?V3WDhu-sAGd~vk}O#JT<01+fvUG&xqjL`Kk-9cm4B=d>wE2)Es%>t zug7~%9N#D#h~Z$rD-#*asQYYpdll-@){6gayUNOZAhEyduAnDJ+IY;dhg?E!WMdP! zk?dAVinUfTrm~2cBZ=fwb9F6dt0Qf`xoO9fNd|<D#!4*!^LAT6xCH2JE?<imQ?#yB zi_Fe_+#_Js${QE_YSNNU*XjUvbBtL<P*MNt1Y4rOz6^XLQ65t?iq6^LOI0Ag8`VLn zqxL^sURU8}1Lw{sLUucA4*8c+CP&Lz9c(&|$c=A${XSyzKpsDRijPLXMzHSga1djC z&j-7y-B$6n#NuqGe|Q1Li<@o&clfNRff5D;Enm>VMn>NJ_%N9QSP}me<2@lC*!Hz& zbG3?>Ya4N`cP3&KtmR>3!24Y|Q!Y8d1_$ecUS1NyTGB=?^bjJkFlTSvNSB$)HTqT% zr*D5{+WO9%13A(wMT8In2qHt{<;{r4ZCJ<EW}B~Or7$uIN|4L(>J#|d^X6u_+s9Ge zk8p5;-7hHd>UJAF-AvB54W*=?gI$1_Np+{qK6jo!dgif%b8>VbK1{FQbGnVnHgw9- z2K*Cc{S)|P_h@(o1r;B5mv2paFB+!3aX{JpIMsBI1sn|)y&A<Rogr~zgwszYsUr<x zZ1VT%tCwn6AbGf6mv;c04#WrW5E%7Do#h2vZ3?wFM9C~pvd`WEe-h*JkCL1-AgH$h zR~L`hIIBKC)(X8mo6SOcnEQPT0y;T?rlE!)=*b}#UgCz5=7y&#E7i~i!Rn>IUr$9a zK5L2bZ=3>yDv|~_Cm8@nfQp0&vgv4n76Rqzwr}Xpgz;3$=M&&$=YYxgB6g6K&M@Ea z-;rQWb~PsdxH#g(q#fhKRIF0#SBz2S)J!qJa)R8=U8WO@W@2riT0Kmx9fndEib+0A z10tvv(cuHw9}W6^pxhY!F6-DVdOi`{I%;RroUBK6d6mz;xU>`o?#s~13X_n~TpoZO zu+gsjn=owoKuaI|+43uk2pTRhTJXP}!yMM)n+Bo~^%DX77rAz(rmzMXcBDGkpl@hJ z?N<|rf{rmS@BToHJt&9eSJ%dy7qVYLM{hwKj~;A>G-uauX`e)1r{^Lfjt)vp2}Iu7 zB9@hlrU6^`d81k6Zok39K3L#3lJbr2Y@A^TrT9x4qTw4O7<~*3UQ_T4J39Fi*i&0} zEO74h{Q~kuWsQR`a!UxEI^CF?JCaJ^wf=V3(gq!Nw4?R*Nm=In6`~-GWJ@tsP>wt| z7ncXkZRBs)7gBHL60Yi5a;rrD>|?+3KHnE=%-z0UxfFsDXW=m_IZeHxN%!%>H)X^` zM8v~x@kjO|Pt94pM2$`pGew41Z1)f3Lc}*E%nAAM*!@76(O<$j4Z432UYVBmq+ekK z&QpXEt6X7U<YJb#;rHt5i2xF#EOIIw_^Tqg|NkE9kLwVAk`jETYpOFeAqwcd78Jyi z*;_LelCdi*{;?;ZqLf^fC~V#wN-uW5ulrlae%<ZcoPdCRsQrZ_2ScK3BC6ej&58*k z33wC^U&#N{fx1<Kg&mbVk#*Uoa&u5?U|%O97{UIRxid3k$LD9_kviVaQ@4czsy{bE zc7sv%ZWEldH96~`$9bD<P05n8iA27zKf)sa*ympkNZ?XYv(enUVS96>Ie~TC;=1n` z>Jr~NPyFPcDK02cLY0DqTCP2Z(^EX}|4iLb|8{Whc*hk1lFC8tkMLjb77r5wLCu-% z8F8c^oQ!U){(`e!)EE&KP~VQs1I{yqrx{{=WYs=)p9l?)#DPGp*g~Gc2B3fR*CC=6 z4)P3ct?2plJ_3Bf<-StACp>+{{%SsnhJQ~B_FFvUeYVEl?y~ZIHX?_Q*!W-+-TxfL z=Y?yu-P$(U@2R~Fx#3iyVEm-51nw?J84|L0_CHai{|Xo)-+-i>E2-qDXk>d8vd#TQ ze)rjWelR&d$^Rab10DnNjCc07Ffw1aABi`?dG|f(zUFCrbcd#{vJ#k6vVWUX|BOe> zn+E3infP#Mzf4|7T){)08A(CFC=VaJQzz9p@zaZI6X2V+$tKr$_+a)a!_!436@D-W z{~o?Sec5PH-Pkns@!;22tM{!2wI1BMB3Mb+Xyqi3+Edi6)UL>r7M(w>vv-<s9C%+; z!M(A&&0GDO6WlQb68j8X^1mD~!Tb~RM~!UDi`wX~4GOAOErr#@%sCF23Fv%V4%4;N z7>G;UYz>0cM*RFdwsUO!K+KttRL~vWe5UvFa>vayc(a-R_O|~HQL?unr0ga>FuK0> zSr1$0H=lNNOxPjkV{m*TFqiDF7J(1HDM8JSdShp&>rA+hpZP%?4BBmLUzZxmhYVT^ z|NXFBHX5F?`m8FeVbQoJWdziG!MC#=amFt#Bp$<Ww$iYx7x%tcO0Hv9sd-(oC+F^Z z#9w#)VSp470@0%R&&ZUwd)nXqemXWEt<rR&sa_Yk^F3Qd9f68%*D`134=Uz=zH+_5 zwGJldfu8O>*D(H>je17jzRzR0Xew|F5D1^pKV#=1<S~NA`fH~%orK+E2m2j<vjgYR zZ?n^#V>PiqX4s3@OV>&3TYa&?{6Lx!;r}|Q@S~zQ6D|lav&R@ZI^QR<^0LV0GZ19H zMh6?or?9~~h`?~}<J|4@GTV?Hu%L8a-KzZ}xhsEfCrDWNqswW+B#!(c6)MAj8#8ua zcA^QH3Dz~l^%Yk;m;wfR_Lg7S-9RAK!Qh4Yyk9MUG@!S)J}$vjL~yTH7s`FhUFQ<Q z4dwqb_spj*m|B@X60E}i5;}he5+=_qJ%hjhgLf5eH%tKz7mY=1yN2u4&y1Gjtn3u; z*or5t6lWaH_y-a*m}jcL80^a>mor~iyAAwzA^G>X*hW+_QTPv&qN7?RoGJO5Rx@MS z8ICRSWf!HtCFFmqElYjjbg`kHmc~2*=Zp`jrLIdCcV=l^F7o{Ek|iu4xoqAXh0Nyd z*=RJD2oW&bPNcsqVv$=3b2?$VAn`|lbD&z<e_eKLdDfIj#>XDE#Nu3B9~*VDxQqqy z5y-Rw&;QS)^pD(x09(VZHPsPQ%c2^D-+KyMMKr2ahBoEurfkn_GprD)eb|I&^@zS1 z5JuE%>ajPWqLFvMP&QW_@QbbhDTU+-85q?E1rhu?EO3BbBmzU@SGBHI0WIIvlC0Gl zm5_Zw{q|>}X#niW@i6~uJZ3%~)DoEDV@TOPS)M&!u6}SU41q9){GELMWXCAG9i8~u zp5mtopLPTD7aZ24y()yRc8YGy?9$N~{*KzeOQh_QPf|UjbZ<A4@4mk6Ahz>G&EuN5 zK@5mby#y>*@s?dHZEg1nnw^->Jq?V|5g07;xOCFMwDnq}=3Z3#Z$qRk+8}>vt#dZ5 zsHb?j?#4|%ZUV1b)ch_c@poM}8-rl+)pFk%3tv_Dy9He+LvdJW0v63*)A9GL{ObV^ zn*e8kKx8$OpPJ#iwia33>a-)Wo{`q}Vnrh&n8P<g!HQMt%bcy<&cSr_2N{`L+cm-U z9)ViRgx%_6VO3L2epvqg&shGyLr*yZwdXi}a%j%3497_EN_Xfpp>IND-5vexa9I8X zmNOn@ZCOt$%@ny%-L<_Xou+ePL11gpzb@&&SGFCfDL)^JSxT4n7CSz@A1D7DU0oX? z=hQW@pQ!68YG>(-OQ7hBoQhUef0;4Zjp`@hifey9n<yf!kB2V!g^*cNg%;sIqVG>h z<h5fi?2Z<QIN9c(*pJdVq2Ev+s9_FIV)mqBsI@WvXKkG9{@f~J9-d(E+-;wY<^Lk@ zEyJRGzjk2^L_y@Ih$tYafJ%!}k}4%3-6?{SLw6g1l8U5s#}Lvnq(}(TF~HDWL-!Ex zn*S5;@jS<V_P4#iY>&ea)IIloU+Y@yT<1F1y6hdtt1^!=UjIYj9s3`!0)OYSwma1H zMdSPBk130uG~2w@Gf~GGms;h~@FFpPTai_!Bm4h7sGTEJ)603Y@VBr?vn296mRPAi z?FmK^-vgxjpH@mrQ1`0CLNSRxk3BWCw`O)=JEr6My}3sF>~hZk7L<sIEFX4wBIZ}n zmV~Bn8%EgAbA3#HPC!s70V`8S`b(ECTesb%L(X#MK8k-@(GgqDvPSJg{$DrHznjX; zvj(~6tytSVfA0?3hEZGCk*iN%M)zKar=|y>Q<r)~WnsM|YVFCUHnmdlw>7t(;KKC@ z*8j<Y{w8+Ki$vLNZoUbxJ7RXXchV;qWO;~g8)4>gOea+@vzgOCoA>sc8#-e7mi$-( zkk+JZ{}ZsP{Q7X=sn+UhLJ_t?Ami}eB8fs2MQSa%I&Lc1&RSB~&hj=d2j&mb(Z<l= ze~0`2mtgS!+&7czh`RLj;(;mbShFPXZUZuWc6K&;xp~s{5_n~GbXzR*`k7++jbwkB zs?hOK0)oiK2YQNMro`=z`E)qWj4W&}xkf7!ig>dt>U@d(ew~86vxV53T3Sh|F!{|? zxb;&hMw#oKJJUAR=dDv(mzUqlX<lx4w22}gl9DT6<`Guh_@W*b8w-~{Ly+O@;*u@4 zk<6@_TwW!(^{(o}GNU)OqNfgr-IVXY+?n@><O#oh*yhj9;GNh1xZVFR|7;?B{5HYn zkAAa$e{Skxk3G*nkL=BReJl6k1!gBFlQ_w16=DRmO&aD9u2q<i*{Ug8o=%hmo1|!& zI?l5u*ZJ>Kmpv4m`f!1Cfu-RQm)pskT#{pT#EBhBNhzmLgO!SZ!9|lb;%JqbV1^|x z(%UfAI<af0)GlGw%Bu{L<m{<N|Hb!La(C7`s!MUFy_;%dmkGR=8NV{(FV0zD!>pZN zjNRLO+xC$E{=hCOGSXNWnmLGX;IDPQ>!H27Ohi|sjAH3HhnPfGSiXGC?j-`^d;js% zAKa#iY4ywY2dxy0dNny|^<K*Z_er-<+5`#{*45`}Qa=CV(;;+fnly_<FZXhIh4qZx z(HeKr_H-g4Af~}z<wnD!z@t^bY6R9Pcm69{`#)#e|LeT!zkFUjORa$S2M!({HG>TK z<)eeGO6$oNo=!w^%v!~nt>GLTr<=2?X=bVvOiB#3s87^&RW4ih`|AdpxoR-qXWq%_ zYcmu~-`?~+d+uC+wVRVNPOrjN-0OHJl3lkl73vifY+79C!!I8i%}TOge!I6cSdemb ze7uDcaQQ$$g?2dFw_(#Oep%abpsHPJq4?qjeE6mND!E#!P9rvc@hiuvAnDHNdD}YU z6sh3-Dqc{Nh>W&xd$HHyU~~3p^~&a#va&Kg=Sjl2r*;w?)!U)UxZlmq=DRCHKlp5t zJ7S-vw6wJ7tUVyUVr69ob(&X_A+-JUA%e;GU;Thf+Qu0xz&}r?vxL1HhRxdtl=>$7 z>w6AUzb`R9crfo2`C3U<HgI=!6gkmfpG~Wv``%$W`(nxq>(^sdF2j`$$n;k+>0x1E z_&ZUwwJm%hD%zi^NH3)n$M2AbIu2)1-`?sJSw5IgP=`5(=h%D{;Fs>v)0e=275Jgt znKNgY)$?>bomkYrog?*wnsABxfvv~k;>^)1@d(VGdoleW5G|rzI^(3S@GMTyMQPk) zPuJ7w9AS&oxJL#wQyQUkU%vc&UpDIN1CJN=ypAgxx%#!jwWx2)7ZWGD@Xxdys~--x zIIjCXW@V^I^6p)83JQwwaoy)<D5$Ap#&w^au{}9*$=Hl)`1Q+v?r*f<A~|sl3{7in zYGQ_t#adJ-vgN(6C?&g27YrZTLQz{6Auy$jzkEoTbt~;Xod^jp6MnS*9ewAau&{7j z?0m)rbYGgC-r@ATXhoNRn+H*Uf3)&9t*0Wmqh;5fr7Tb<4Wpd$e>F6y=IK1;Mhy2k zo+gR<sbt9A)?~ebI#$cqL*Oc&f4o3ULeh&U8+}*y3i>|5G9KS9a@m^W_dF`c7BFj< z<}3~5B45SuNQHv!Ilzs_OnqGGPLYJCV$s(hKU$T}gE(_VTtY(Wye&B~i9pJJdHK=m zg|GA=S5rc&<*F1K{m~JLNJvP4IX#S4R%<#U13^o!A+NGFnU=Q0k}#`zKad^^eMsLQ zB_e5WYS8)prd^5eKYaYyUtlPynyK*o`~6o+SxRa4Xk91M-=D9-AfPzBxtjH7XTdAN ze+g=tw<w_$g9cxwM~}K3^$#8QM(jdH9ZwHBy^2k`?-5?OU<QBrgUd9OVKG=>Rl&q0 z^9Q&2eJLtI=b!LgqbGwiM09isN2@RL=)HYKVOzDXvEQNmEhhOb;v)@{jhAHj(IIEJ z$Dy2y>%7PFrLH7V3R>Dcj+*@!pogR4vrc3%Z4F}rO<4lmI0X$&jvt+;28_Po_c*jS zyNj^?$<}4wm-(#}%G;Ksl}vnm8o=!j7rqUc>xeUV%7GWk!pbVE?|G2c5hsuVN=2zq z;iGlY+d{5=17py<(w`<1Dd@#&d4Al(U5m1V+SM~Eq4i+C!^9}JZgXi}EHHR&ue(sQ z8$If{GFU*xW%3ojXF!XjTJ5%{W^cbF3^zkeOsu4!@D;`)WkOF2^TUTPfz&S;^~{Ba z%fVHdam&9^oQ{}4YF@cx+#Wi=_9VOhBM}nX6DyB*F^p1A-u-PU7P7pYYF(E!LR@%s zbYy?9`Bqt<5{JWKvg`NO#`BAeJ1a}%KVBeptk5V_Op(Y|O7mCC(U>efIe%e5IgY=i z#OTkpvXbZyvyxV8H{?UvYvZvQ$r%zd^k&%>^M}&$6}ptCgY35|PFt78s!^+`HDT3k z6)8nU#cbt_;HoO6@g~+A0Zk!v`HQ_7m{R>>lW#TqQzVFy@@|9oGam>^ieJ~CB_twR z9(5Y;_a&va*xOm`#S_inYiny^->X*GzRlICP{Qr4MfRJ8gHa0aPn-h@oJy$CO#Q+5 z=czY2hZetYk;bX0C9qkh{dNwh^4EAQs3$S()$7TdcOW!<+*E?0mX<EgHu-WM3T_(X zC;C;PMJ~(u8+2S9VUohXe0VophE11m`6iVjFnH4oO@*};$L(V6+6)zH++9#K8_?mp zyo<3y|M~vFVS7Q5k&!V=Jm7}q(;J&t&T!Feu5a6$yMa!s`$2-N64ZaL-@KU#B|83U zs~8>xm;J&cHqFh*lfBwK3QEch%TZbz?QuOfEO+F&1rTo`-?l|Oy^@&VGItAP-ZIah zKhIX@P#_arf0lQ?D{D=ps=GnFvFa_`BJy`#0du8gR4D(xjMG?#Z3vgb)I9a|z0M6C zA@_W}YMA4~B`z+W1&$(HB`cJH2|8tc4KigS*|W7uve|XY6SI^v<`y(UL{7?uaVt-> zg_okA7;~8qusUFeRc{1{Pd5eig5;0OxPzuF7SqnUV)Eh23TyTSC%SJTZ<O+%-<bY! zXSn4bF6~~+SJk7IZUII&)ifWE==Ui-Ki#WLDwi3OuZ^<dAL!~*s6LpB$=0i`1Pd6* z(M$mot~@@<KenEopEstA4Y|qr0!C%^ogCvvJuPNvmH56c!|;b}Rpf{MJY4~CNy!-E z_+G?lr8vBerNIqhAD=k2@fr_CCPdFk(eO`$l;KhY5=24f6Lpk~QoR}S>R`vJDH5bX zv_e|&7JENkA}@B`p@N0NJ4DB3lYyLQwLG1)^>w?$xfm-3Df}<NT|pekiGJc0+CwaI za%lcVF5ybAuG46ERzCbye``3>epTnwyTAKtq4u3Zdk<k3La<fQ7`#Pz{`_F+-qu#H zwpDdnjR$VHqiwwQ!^yEz%sqOJY|rBhp{d3R9&#i%So`v8JN~E?Pq8*Uy7^wB!};ZA zSY96$a%P8Cn#r;|O){HhG179A8l%~0KC?QKzbLLtO2q}kPO#UnUpJD;eOY@t{EI_f zBUjDEd9YTT%GUtJCM>Ln-}DggjHwAF2bQ>MlZ~|3Ss58Mue+p2<;9xk1<XHAKYI&( zq@VS?C^cZR(f(isTltTgj?^FZglQIu^5Grp)u&NU?b2a;a-<P<xfE2c7QSt>$dZ69 ztOzsPw$b`tL#t$DWN3KH4iI8zUG*n~&v&&rB)C78^7Ql!O@+NMTVDP3>pvwX-7jFU z1DZa>Ub))!{f|cmRnRw(3j*Uz5C&{+Z7IX-!R?8UWZCdiE1fq&{V7=T;)UqcBiZA) zEe0P6;Z}+qu~(>fOCwk{li`P%1`QHRJ!t{05o}0Uqilc%+3NZ65JYkzY%Bs`0)zI4 zZ+$bhH(2O0(5i8-U{+aIuXf$(OOv5Iz~PV%%RI!FFZWF~2K1#gr<7u0o?E8PbdxCr z#UJq43`}?KJZp~`&%X7fMlnHH9(<p)>s+*PUoM88ig(qpdZP)3Q_`G?bk-wHR%Q+f zcPLR+BNJ6`rRZ&ZA7pfp8`*lrl%q4Wany4G?<`J_*Syk-w*wLr?@+L)$$Fh0mx1M< z>`#*s5)$I0%~Rn4z=>S1>j*GwH8nM^OIaD)7^~Ve&wsctv+399fG9}~ou_N(UKJD9 z_~zSXB!Z!$c!yS~dm+)4ODl`kp-e`-b%?0FbsZ6XS2IsVq0<$&?fl)rHCrl5S`+j3 z<@{H{*uZyqZ=0)KX7=mTB`RLa*nvD<coPG7WMVd6Q_bdgQZXN2garV0%4cB?8_K^; zAuO)n@gosggrA=uK8lgj3Tg<sZY$W^7XvDDIC5Sp<Dv81Pm)Uz_E7#?r>L=BaI2zq zd|ZDN<rLX7wm!14qfucyOL6N~7OWgBQMmt?FWnFYxeb1a#R)jcH3m?kkN3v&A;M&V zD<UQnLBhxDfV%+?s|;8YZZbt+wY(v36n_C|9tlkqIXzPDN20qb?B=;#w@rk0`jqj` z#NAyw)7{0ZJ$ehtU^-S+QA)gIPr<CxB}wODg6@F!@a?r)ZAK|-9*bg+o!D>$<|LdU zR~Myro8MjmnpITt^@MUY3Y0>Noz~)MM1s9#@-C_5s5Z$U$HG=+Ug4xOb(JnPXlM7G zE15ZHkkkE9EiU2T4=)W{Hjek`5S^C*FJ|jh6au<TgqVPIS{rlSYUl0Gkf)RCA(t0S z0s*h~&zSC#GR@opS<K(qr^@f&zaK6#4#9)FG--+;@O+puE7%v+7WCcl-qq$i;zl1Y zc|0i^PUE8{USG{hj?XH}+`pci>Mzc}oKsUm;{R3(_vfA}bC0U9IEzfEziWibt2N=_ z?}bXC-y%9DkDMoRG>h<V9EBOk*Utw?Dlj7KvAwSaA;`f@K<e;ltMkd|4JxW^aLiIl zDk@>C)q8pwhan#z9ja*U%+CRUnY-9qJHSzUG-WFQFkBH+ioj#h>a7j|08k&<_2v55 z%2F@nBZi9$a-%3{s-#7ItCDbQYngz7kg#8eE9^3s2C7fCpTY11HIRQfOw@S-sFx;x zAg2HV&z*WAx&?451-c7Y=!7lW6jz6LuHF{${F@gC?{xtmT;pMcT=Q+Gg<kmwNQ<FD zw2-4xIwb=w0l~kW5ug-m)|VMQdn_4D)9pht-(RuSkgdk{4BGo`4-3wXv?{uYHE#4Q zm8CkWe~elXXl=9A);@3`R@p?KK6KqVQ$}+#9U?M7sqdb2ft1PwZmIMtN?qThe{y$` ze&7~%6ouv?`H;$bE^?cx8E|Ha-Mk#;TK`%NE)NltnfWlBLtnUg-l0ea@C3`{z$YvE zWE&CZf=P(kvgn+r*me)<ZJP8joxYbD86MjPREZN4jU)rGKU{AhD{)w^_4oH52xXMn z8PLw^U$m;;NjDqFNdpYAJW_EHqLleq)j_oF*CLo=epg>#zxwpV8V1!pkK-3g1y>I) z&+rfcR`HugX;Sc$@Bj=_hp?+k5E%TGdt#r~n$5QMDPlnWgBY)Q6?&bV90_wvWI_Qz zK9qu<mas~vwIuLOX3GO?S}4cdn$r_Ep~Hm~Djtidxz2?A@^WX7-61Yj<c-7xulQWR zB#SLqaj~nMhE0GV^0W%xq&Z@Tv!KTpM$IpDB{hVm0)SljeF^sl3E#wHe~-g$SQtwC ziMr=Z2*#ga+)RRkI^Q37Wy5|?y+nQ=UV8P}O&>oGDnIP$Y?BmnCF9v6f9HprlV;NU zdEZ;*7w@js5nC?8NRnb6#BkUHeJA}YXGOqJg@m2f?FZ|8+69RWK56dAV@l(PtF5Nk z@<-C$T9Ku1eQ6dh(|0L0X(0sYQU_TwN;o!I;^d+&(I-An&<Urvta$_KM+B@VVytSq z132CtJE%zDvkp%j;ytX<+e5y!>b-d36XzUq?O(TH@pq;}o?s=$3DRa?*X)hCp~o}J z%eLjK!a{G%r>4G&`nqvC@B4D^hE2KK7ekxPcsqrrc_hUx7e*(!^OoGM+Y1)@lp;s# zALCu-qL(d|iwYuzbrdAT12pr4xu|_vZ@lG9i~Dx4cbUFtvB*(_f$_JS$pkji!Kaf? z6CWA+^7TcedcKf9DD<fL@Zm#WDMA~C8FO9EW!<XE=XT$>uHK&tz`LR4IQEH`lh2^N zYJUN@=4H*~tTrqyOJI2?qF8Z0$5)S8F6@QxOT=TM?hS5_zNHAhpwr^acdVQJ+ZB`! zjDLg<x*rY(W90^LLdktOx||e$9xXQYAH;=oy3n(|E^YfPcl^ilZ)fsv4b$Ep7CE9$ z&`|M|WT!r<e^&{n)bb>N>9ygTH};_Q_xbc`rmfG9+pO<rZtB8cdl%T29mSh(9J4<A zke=bPP4zmZ1P+5ca#y$DjSsCyu^$E(rp~OIox0SIWVtt06-+CH=leD#T&MI836fHr zlm4D(nhBD9ZjTm67XKU&3C-v`3es>usB0y3hTmWhc{~~f(PlA-ckE|-3ppfsSWKDu zP~qFdsQ?Zg!HQVaY=m|n@GrS~)mr8QIh-YHDIvnyKynO@I&RKL;lC{ztW(_-2p$<y zt8Q=wv!$N%Jb-z^vrm6a$&9nP4A!zgzR-AUK)T|`UjrR-32IZrPT!>KozCHxbaFm_ z7vbv<0XvP-Iy?4v<Zs9IGc|`xNPd^iRM*`VQzVk<^WolFJ|yUi^9f!ZYkAi-06%?e zrgi%}>!I(u$k>a6xsA^uCVuZ3%iJ{N@rN-5phl818(cTLI}SUE3zphrr$5qVjP8zn zTF5i)eBNsaDbi&1+WRFkaUFT{Yi&E`xn2k-H;q)H)j%bb8tsp=VfnRJpZg1xJ952; zk?I^C$2;iFot=I_Yb7pQ?|@HmSQ%7=;Ehgv{t=(1FZQI#SPI(AkAQta(%C~q=l+`C z+jFI$dHXlHJYN+@b^GJDt$64QQvEejif8I(J5j7<JH1Jt!UBhG-TE+ttfgjBOJlg- zn&Qm)XUfLGu0c4HCyc6bzoc4R*lmDmb!E~5w*eQ+ghockH4%_$cNCB2mW^e@g`>0# zHor;Ic7G%jHc>DCG3NN}nK!g`8RA?Z8(A8uD7wL>HDix^$_Y3C!2R$dHYGWk%Wc;J zUX1$YPJ0~Vpq2ggtM?>f4#857r-6Y1d(d#Yykhv_)_3;X0uL;!chuN)D`jC4iV`ph z_g@`~!F(HafGqfQ37}_xg=m6XUIJvk(TnDfCVc0<-Tl1VvhJ4t>qUUdD!JxKO->ET zNl*Tn({u@u8#sPwS;=+XtPjvyciBa@NcE6#R3!rRV7Ys@o~POfFbzI~!6(9i{ks4> zZ!tP|WNl}yU${b(385M3f!n2eZ1fqQjsaTSSs8j#i&`k03gTyB7H*7awRl;WPFU}2 z(DG9&-1)w&4bG9p5q*V`hCgvIPT+c(SAJe>$V-y={5d&l)8}OdFTdIRVRl)bmfJDx zP8R<m<W@S0SPXG!@>*=GjERn4-y8Sp<ie=9x&aJSg&gTR4UGkA4eU`Zh>APbl8%ss zzN_UbG>%8^3fRpBE_(P=a^$U!x|x7J8czruZZ9J7;FkUNxT;mnK?K9%Vn#wC&I}36 zp;nn?^_bVG2k>u8OCRx*N&z+83U6wk9lpA-94Mxp(}SK4VfiWXY1_hgVkk5zw|Jbi zfmxnx(N$Rjra$ZJd+dY*F6vJbCBhCFo|3A-@Ke{l)!g5|#ds6!$6k^R00(2nGN4uM zTH?4imJ7T}HZ-6D+;<V)>)~FMukfgNZAK+w>;B<d@a=Dnk7iWI^l61_HXrKg{MoRP z{^CC{+neDq>;B0fO&pf?dHQGL=$198ZuQ2-#`tZfK4FGOYQ1W)4w#<?q6deEOVxX0 z_yl+ci_Hc8Z5UB&XS~EJ2XM8D-*F}LU~7K4jU&G%p%1ApFXXlhh-l;<kf_+f0#UD% zgABwwCMjl3P)0dVlcF3u6GZY&d(+=8>7Sk)_rrXaa8^wvm=e?nsp*L0Dlh$6lbL`Y z+(q$Qd@Q;s$MF38{C6F(S-_Sp`cPiTgj9+6(xn1KZ?UN|tevh*#8Db_(FV~xmBu4# zxE{CXk+b%MCk9crIO!*_40rjJ!DGGtC2Vm3Gm_KIA!xwQG`mTPDSgF3u;VeKHKx7y zA-jBea+0-G4`hs2e<e&d@DOqp%s$+qHW?`oL0GLE9}4Az-L?V7Zw{gBl@~cSqTcwL zN~w1<5mLk@+*)mK7?U!zv`ST<94;#jqpQe-_Y=XD=K$VZf~2NDf=ydiB;H$whOpB% zmi)LM6S7p%X7l(8ms(4w@9;KhZ6!i$-GVzcnk02nIgd_IrjYO^o!5~~`oz=Goe#!f zjog+a8bIvzyg#SeDKnb*{2Z(fkcYaOa{B6kEmiaNbm3L1K$~VdF8_F`79s)g2S4z% z^uoddYY4Wb@NJf<IY9JI+ZaeLL}_VhhpXMn7I(K^G>yz{Q+nSO_3c-f+DO^lW>0!^ zhC9smpfHppK5}Q1Leu|7xVn$@=JuZYR6&X~pN$IR(s^c%xhqd%HeWaW{zAU9gVvWZ zMQ@!scOg^k%QbMCg_u=f;CfoV(f60z7)td3kz}!l&-{Q*a>Rg(702TX$URe<>Ev&J z+uPY`?^^}(1AEp49u{I}CPax+Or;|>J5LuiOd<Z*G)4$W5qcuB%2K`;;H<W{d*x$> z=l?uV?&W>gc{0Rv7{i$+8VbZ{`ecLOa=$u}DW(*=G+csQtv&UGHP)c!^&KXrwW_W5 z@g<|ntN*Cq3oPSKmnhjHAo0HCe6sGQprmY#g5(Ba8lfNj^IIVz9mRybi^8WzPcYH} zkP3vt24_p7xIjuLtkW2fG54V(`iVN8_5>)I2e8Q$$d?jF#OK3ZthxDeBc*;HEPk#J ziI;kr<!E1eyHF?|^exOM7%xW~$CqGHHins%_KR<p3eM}itGFLDJ$#yxX5-GkVk7kZ zAC88fE%(Tdjg83>KjytkNJWW9nH*d+UFQ&s`->}Nal*L+cuUM~i;s_|dh#wXIVFVx zG8zEK%aD_m)^^*2tE+{!Fi7t7AWM+~uGe*M)CnuWYu=xo21)S}EDzq3$i?xe!4_(J zbQzS)ZKa6A)8nI~Vkj~|g+iK|*HQ%%q?5JNlTMY>HQ+R*dO&TSccU-u7)GNW5|fhl z17}y_dF%>Qn<==*&5aG{s%$X2=?kRCTl5&URn^^wM>KiCk(j{Zl5@SioYxxU{+PWK zN1_#a8Uv*H%JtPd^c8Gn1M^~Q6F(ihrOjNYK<dd1>^tiUdyNfr1ew);AS_LQo9Y8& z(k-`so?o@;uWK+VN+x7P63+<9K%Y43aA(<=QczM{e6cS}xpW+oE>mhDn1vpw=dq&- z&;Q5qwB-FdJTmsfJU|Rn@aJa3#aYr}4=0<R)K>iSj9&7EDDTsPa6_2xhR=@Uh6g%3 z<;g^jenMfveyNWM%yI$pcz8!O6ZemyQOC(D=++Z0aQuo}b7ipORPn4y`hhHNdocx! z5GftriYK41U%Qs<?d>hApO)sfoLgppw9g5!@Fk{ftqT%-?stE0LS|EMi2`$6Iz3rS zDK-?$x+h)*Js*sC0(i92p%<!dv-9c_Y}%y?uV3rpi#)yQ9_hps%!3^%Mt?&2ZD&41 z-jZ30SnG~+8p9KwEDQ`{_&W=@QHB%`z&L=;-UEkqx=-tJhp3PwUMTgCC@tDM>gFw9 zabJUP{md>cqV1wq-6AAyiz_aRX(6dRol*g4ey@dX(_#ooSW7D?RUlke15bO5^I*C` z@)$%pT}Vctxi}giNh&-FGkj**sAEi61QN_z2@*s-e9VX7ng?e9z`K%Y@FR<42xn53 z0LY^Tg9uCBw%q`lSPD>z>q3&Bg+~QX-7%zbc!JHeIr#PuL6<_{rL*uXSGc;~AA3(V z^QC`|@DSrFy@UyP6MQD;dAy_kr@p5<bh}%UE(;%s3yr?uxpBnc&*%7HRRdHe9`{MV zeAxwm`?^g2a1FYO9Z%{z?;;Iaeh7ON8MM5_?cP0jk?OCO`A{=gTF^tuH}&4^v1-mc zHkZTjaPFt#8xMlpQcSM8gtKL&lFZ+}(8;8R&JewP<x0o)8i2Rf?gPC}2#F3bwivSp zcM;A2G3ymTyb{bVKF?|(6UhO<V-8JEp{c;V4XvIoq=cxX%i_t?g(2gFl2Ku!mVfY^ zcPN*`k_x1s#-+H&o_Dr)cL%=S6}6}hxh<duRHIo>>KA|o2sC8`vP_a7h(=2Oy|oY2 z17I42zR+e1{g7o0?ZeI=+-;5+;I<PX&Cb>?vn<8*oYnzmwE{=H2!;%iH8OW%y`Xs| zz#7nAQi$-O0_ent3k>}ZcVyVkx^F8s7X?7$fCiq-T+Xk}gQ+r^P_?4sw~vZo*G&gs zgYocpO0^o#V31m?+6u;&Ld07HHckD@HAY|_)lt}Smw6bbWv>8p8%nP(C5es~rbStd z*XZJ*j&vk@F8GpnIKH!%27mZJ(~2xy+6nOw?^iHew@3}<OF#8$<bbEuK6K9uGqT+% z-|jo_<>iIKa6sW0&LhDbe`ny};OGbB1W2w2Kqo%hR3B}&;c+s;a$H{cKuntCF$3TM zIyKnvJ3TTSS(-)ffOAcTJW>Uq>woa__(}|(w}r4(38l7Vcw~JKlgH<8g$V6Nf#1)C zc&rGum|jQ+630DpucS%b^WxNbJ;ovG;gbO%<`2hDPcncR!6y{(zT3HejiyMFahr5K z!!rTN;sM~99sm?k$CtHUy!i0$Z&VU&n{3IDJ|@w%%4K%^li&;EU?s+@ms;L`YRe*- zA8arE77JwgjArtu%c7fk%Ib~F1M1zas<VsQT8-zj+op71NWA%=bd7v=ahiUaqM2l! zLC?{{ARg$6w}+6`oI@ebo;^!*VHm1t?71Jma<(^hc6RRCHK98p3F@!)@?z7g(!lRX zF|kkl4ogOEqc9R|kd5UOcA`0U7@6=gE}9XK(@PVkr>3@nn!-S9h+8Q%U&<zE8$7?l zWorb*ZYahohcm0{439TAOP-tzajeC}XLn~RidLU`E}1B#NoTRp?5rNAj;g;2y-rox zy}GwG-)WBb!z1Mdt&tp7D39qTQb!DwtYx7FU$NTa3~Xq+TwF4gX)=KTs|4m@XR|GT z0hk{=dkl5-2G*@d%LA|CnihbZS&Z1l%IN+;JwJz|X||is3oh=@i>q9N8dMLQ%!4R{ zGCC7t+?Utl{Z-35i#}dgY?B^baeu)f)|h@`R?uR0bMqw&owoBvtncmdeELXTeRfOm zQQ0shmDY9P?(up<zl&EH0`rdY;`s{~mg?T0!>6_|tl_Ry=~RO~p5MUJpl+)bl8n+} z3Mmpn#pY;sc(;S4&^Fw>1IQ8Y#1z{i*bs=fta;Kf$qQr({Qx3m>Fx1#J_a9OUo#-b zm(ckM5SWr6<z0e(=NKiBTdc{~V^=I6%V)q#v|U0!0_j^Hm=m^!5M@32fguZm_~FcV z`R&a%4yXaW{~_X41IaeW?8ZV-j|7@jyWV8Dt>p(#jBiFHtDYVd=n7^fWNzH@y&IC; z7<P^Bfw@xXj3$G_;BY(5D?=x&9|;t@S&daTHy_hU1OM5vyHzrtncC(YCm(4OZ!KBE z0l=V7XfHMW=;;#~HSDnZ_;O)33tlPHQh@hu5;lK{p;#g>(q6U71GMJ=#3d#v*PZ_7 z(W`6SDSl97T&cNc2ZLlBez1~-EPHK)*2FylhMgOVZSB!dBn2E-6dIrjtIEX=^`R~> zXUM%h%JZ(A7kx(*GGZ(r_UF^s<mGX%GX7DkJCdyEqjAwg>j~v0Cr);5=iQ$zKhwu* zg@m=N;zy8QZ#LH_-x4|5PoZ^N;e=8Kwd0xXk_(q_-jTvHe^{#)#joVl)X2@*Hss51 zeLg}o9^!GavHY^DlamHGT(x6KMb1fHZ-@{$WhiQ^7&ZlV!@?D@DmikINUC8{PrYVa z!}0vn7!YW%hIknZzFyxN&hj9jF&U!XGWcNy0Pywz0G7Tyi0^_DSuw;&KkWREZI_rQ zfzP!4uYVI1RGxR2lT-Y)_`T5CHOu)K=^xR;`;1IX{5x9nidCON*(F+2K5Zc{^0Q3) z<>$b`Bz%{P!za0?asc-Zv(1HadOa1mC5eQo|4&BgsHvB&F*!ywLL8qPGYD@1>0|*Y z#&tG4QZ++Pw-;BlJ3PUP9O)H0Ffu!AG){PhhZ)#ax5c!`e(+lkYh$8M-nkp1jzM%# zjLCC9*u)o|0B2&ys`5tjV0>t{Hm?GVE@<xy0UKr(Jc^Zz<xApscpRcYC*Y_9CR(}L zXn%TgE?XBByjp{^1kl;xh=cMro78X_$FgcZFy9PPT1D@IZm{c^poE|X1z9ss$(tJ! zkBOAKgH}(&F2n}_*QtiQ{>@f1<=5__A4$fD+WHP8UFOgWU%8xz+HT{hHL3GH<L_Un z-}n=}l<UE4B*pF9xlGFGgZ_!}ZmUmUMLnwLS;7q(hGc=-0?MTylarJ2o0HqLM+^$f z-fZPLklVBMPbYYtbVIQv#gEqYB^>|L4Vyfzc#*sJoMXeIl@IINSAXI2#vqz82ed9; zW+Ip1m~6XAbxSf46cS0W-sS+;N{<%sc+ZYRKI+kP5Wv9Dw=H}ME%p6=w6JAI+MICP zn?L`EQE#sA4upTc=z`8>Gq?2*9Mou(ko=>RQ=VgbCRyFbztGu*`QXJT!6J=5`m$a- z`FO!al|*ddHaeIABI-+MWwUi1-?pM;$O5Psz1kTyW-pvOvFSQBHDw`!3iVft0>Mz3 z^J>L>>|pB{K3QP#FON5lmx{|Zgn|6{*A53f)ynD?@(PLY9k-`JS`8s=49^AOk@oR+ zFDnIy-UyGRT_uERGbk+LH8qwMvp0^nmCb^8_Qs9bTLS_E`=Cy(0`uG2f9w>EX5hdT zEhhQV_JGO(aqu;gJ*}nyo$tjRX}P=7HzW!!(uDfGNq4f(g)8og8yg#1KPSpq>HOfg zWlWi97OlPlIPL-tt^~M!%tNZL%a6}@ro?+`o$HjyU<)=-eBrN3{)=omVzmBnEU4bD z68J+|yy6Rr8F{e!i{Isi3n)g~;{+fv&J6|aSG?z;sgIA(BIsTYA#3~(83nyWU>68o zGT{`Wm!TKPXj!FPu_b5*DF{mFOvMzgH@`1}7^4kx0Py5W8X8gfS|Sv0@U}KwZ2DdJ zV1^tEYAFEaRfk<hH}C3|TPNXb`;ZQq{|RNJ;(YU|=3tH*j9w1d5aVFF0H7e2;mIm- zt0-<zSa?9C3=hH(o+sPOldy%05f~m|%d|mWgT7te$?e<I^Y}5ln8~+DFTyl2NhT&{ ztub!%KT5wOefycsUsS22e)d<(O@9-PT#)|#R5M>k@!RH5#u0@Pn^y79wkI7L|11Os zn%-DsdT}d_vQZC(Q2X`kmxTz?g$qBHWRi>tuE-_`kFIZSa_!{X&HDubNY|zYxk?lG zfgpeew}8GXGWP<!Dpzula5`do)7QXa@aNq&1Pr+}hcBS@vB4QoDu`7BK{-JMDW+qy z4)EEEmG(>xZEd~#YhI`LUp#{M9^K&qY_xB_m6TsI#MDX~V9EVLG@-Q7o&L%kQwn)N z0cyN6KX7t(*7Rt9IwX2GC@6?K-edO`rUpucyq6nV`a;I46I$%`y1ToZwmSFhmNwvi z-f!URr+XEWlU#tPw#)A?do@;*#&KP~&3ifSQJ@o@`xqalJm%`y{#E+qKlDx8-k2co z<guZ$?+sp{M{9Cht2U11cVO;yq2aTxE60{%R!aA_x4DE57w8+zN`^~e2-OpSfFLvj zKx8E*Au(JkB`y7U44`epn}WeoNI4=39G2BEJg{(0P<zC`4=CPIfkYzK;HK|Y5H7rY z3}_d@s#D&T7Xo82xIp3fBn}Ov!W(!!c$rt59fxvyApAD|N}{3NP~(_hpKK^Ch1$83 zA*_L~!A%LEED*SAFdz7$397tCO9e2z+P*YDZmsrI7~|L~a#Ep)7`&1)j1dURZg3nt zX2BSLQ>^TjZ8-Jmmk3W12=uo)GFNeC?8_9i_fvFPxRNqb)J8f^RKwf4r~MX%9rj8a zCbKz=1q(MsdpXtcfDJ7F#Cm%Z7y_)2aCR=o)<Bi+?eJ+<MttF@7aV2d*W9vC1#z($ zyNefo+(xP8YL()k)N>1i1^TyWbai>z9AXuyw7f>8AH#_AH)uUb?&3UYfQhk$;TLal z!xi74&8AEf5;v_<i!8hV4fw1saH!bTd{tyAt>?Z0XkI$P{J(|6d?8biqd5ko>6pXE zNBf^6qv1=095fSR(c{aaaL`^iypDL&amZCnK^Eo;d0}{HXfo9Q^qq_rAap}I6b$h{ z6NtG?>F{iRw_SW@mXTj`*t5Dk170K>QfRz54@k5($akKr6~^2)Q|CuL-AFJmm;p!o zfByUvi<^zq$8*BbJ=%CG3m^$zTLU=2A1;Oj)HLit>Ldh(eOa+jG(|7hs@6Z~314MG zrs_tfZ0|;6hksZf^PhM60>{-vaT<d0-Yl^k9gY~M0qp=@w>d1#$S97_t0Y2bJw|<0 z;BM0)&}Kt6jHgu_d{m%Fl#Q`OwU>Tvg^xt^ddKnEyhut)I^4xT#|scLi%?2XZ1ktV zOMxJ0JZzh)2Yp@^l-toldq9H>rF{W=l>qWm5p2r==o?myTteu|uxZbxoa>choAz9# z4YM<qE0bxz$(tQ!e-XMIM1=a4m9ZyOq=rR3)FdZY&C&Aq4`WGCotDEvsc9Q>+Tl^K zT2GMT4q0aNs>2G<_r@M+vI&ElGE}y62iVf>K4tkK&wTB&Jg66?f>ICD-(Lk1DbOPI zg*5`sm&Yr0@mNF2>Aqa7iFVlpg!y6tH3<48K-yMAVF^z?6`S^2ASu$lVy0W*IkrJX zi%EB2T>)XM8pMRIRH<M}^{1}epCOBQlU-eVdZG>6Y0sf7n%62G=IlSvRZeo>U%!jd z`HQxL`n<<>w_o}p6jJp0OT_ko!?CDnyM-O8PzGbHvczdVh4Ug2FFc9_1qGwp$n#`m zzrIP~UMVTt?kRW~CneW+8aJNnqWEAFVGyvAM|P{Rv2lp);kR(e_xP)-f&7Mbu_^)i zG}IcTA;nPzWvIp0+Pjj39^&+(ABg(fc}_wQr#|8{P)KJ{VNTd9OdH=y@!)>}QDpOy zS*xN@5VWbSX#vuNB7ZIt5YWa+i9J`53RIW22*e|M)<xtLw^>_?M)z{5Rgj}jluNF# z$KfEwIuk-_1w!*IpSR=v@QsOj{D*`#7~%^q%6fK?lsL4pl?@Vhfl^Wd)U-{3w^AUk zw?e8Ip>&g+JOxi(LQ$%vbQFjxW-cxjd;o<40TL8n{gyF+_7*^01f{C)VQMmcx!SyE z7r4%MS+_iiiDtGo1ciQuKH_7H)^xMLVrhULRf4sgzOG>6dE{2nz{mog<oWdJJh1sn zz<(&?>mIu+S-`28ZqEE6biDC#ySwp-iB^^ZwIL9mIjW_`v36N%yAU@qtNK@2kK%UF zW9_sV)(8{coI-|X7Du<;9WLn@FO*65-}?QX2uG)Z&sXUSV`mqE8U@_b?jT|mL?<Gw zY@N@Vj>JJ3ZwEX(UKxa^1l`@;iw&EvU<%i61p(nQHWqEnF;vOzFqaO~E4i)4bif9c zfhuK`@*|@g0AQa9oIsal{MN|PKh7z4L4wO`#=Q!NsYgjTueNFkY6ma_sYQ0{+4zcd z*t+6X$~jiT9_(0!99sTyc?IBXT{uc)z+-PTgWo}E{@p1U$qwApyc3#+S-++Vp9uo{ z&}|vLP!(Z+^0mXgS6RIE!pj@-4|c7C4PL4BRD9GV8bt4}i`tFz{NS{mX`#W2Kry5j z$G63nn?k{QJDSr_A{~QQlQGIfM6IeD)Cn;C>)H^8u$#74=ONp&jymU(3t)!tNX4rN zshLtKovONU?$H{60oRR2N>Fvn33#1UVbb;6{8I=;XbPId7i>p@cH+;XK~F!vz4*ah zp3DzCc1DCL(h|<9N*0$1@BDf8##eTa8lyY(l1zkXX0@EC(N@>Gl7PmMK-i=TK|i=b z9jrcgqvi{|qnALtDlrj#UpuFUR0S%bb<Hx7fC(_CGI9k7wIK8r3;*j($-rk_dzNC2 z_ksK)Zuubohz037wMveLqSa*=(Xy@FvxN#UGffB(?7=AM^*f!yxE#E$1M3K2tdxTJ zEWY}Ha2Sn={!eZHcc9O*iOy&0y%uV0YGl55?^jm$#p^Wisr|=*eFuM*?M#T0{oxIG zYyBRyxn}rsAY?-zSgs#;y*mIb%kf_AsVZ#jZAio4p{g@7G9Zo5ud928PZ{CZE`ND# zUuqvwK!&O)M+Cl9gpW(AK%yV5D&-a3)NJ1*P5lz=-vei0h1t*g=cpms^|;D3enB8v z@dWf^X?w7pP*mAo?rK<ydFK>^b$l>fwJT5GdxBnZ!Xj>kO#XGzw>n+k5ttTJsHsWA zLvrY?=)1uh35@H`61t3y=ZsEg>{C0uK;c8;3lI&O`3DE9;bnp)=IY8g7$0f6G1Z8t z$8ywIn7n;nf+N7caUxphI!nc(7)T<aKjrn=r~jKK#sAu}`2XZryeb4jdwXd=PNqk6 z%tbgi3g?asWDOt4qX*?PmdnIh!kiBZu_xTiJoCc^Px#$eQfp2Of}1?~b@fjlNlJz! zwC)%N)9ghzVDg3Lb4u;RErk;DcDv)|BjS#ngY(0w^XIGFFK-o*Az$#Ajf7ck&lmP< zT7IX_U!$HZAtmssCnbNTUt=qt@#~iZ^dpJu1-6D8{yjky9JPh_$K-GKE}wcxi2FO6 zZfus6;?Oyr#{`FUlZIO5&S@Q=BwHR`J_u(@8^4j;m6Y<p_INOOX5i_3<CdlZMc6za zhh8TyvX<Af-wU^+Hjl$Rt*U)gTXQDy(fVbm`?apg@fo7WK5nw>$#S2~Uie#avHx<W z8OjRoa%Nij#S^b%T`xaNRSTUeGj!(tfX1o5<HZ~K7rUoNX;r@6)7#wMRtfTE-egjI z;rUkDbY*5yT1u+>u>BO|19Ym{3VPrdU=9rWNSviu*d94WeoYnWs;Z4LyzhDUR?o^o zfNF^?A>2J<!=vjo*Rox_*wKgWnCld`Q+}KQzBKw!b1riHL}{;M&lJ<)L3L>6g%~f9 zCmX{^$fzIZMzqHmx#}b*8*-n9ywxgp4=P<7<2beT++<OfhEGTe6=vL?=BPDq+ZD>z z>DEt^Igk#8T^d1{-+LqyX?~pUrCR08d0Wt32eD>piY`sD(<|~Ul8)T%C#z-ci@>5( zvp&?ehRGp#QFd*}dAs(*_EI~}-i$z;?pj5OR<2g%l2!Yuoe$4ZkuF?(X_?NmA6mw~ zVQW_1gLOTE-tLU>n=QLS1Fb`tu1J&Y(TlOh0MmgHkrLBoIn{NJj5rk80-8`}yR%ex zlVd)k&@-*bBTgSPAJ}Qw(!{1!WLfls>v9+fTjdg-W;`W1?b)2zfztpIvsJS1jE4$G z({AO&H$X?0hu|zVv~L|3AtL>6FeRI*GV>oFvR}-{=H!u<LSb}v_@_&ZQNhDRvou-6 z83N11s|#^%S28ufU#Lv8@xYF`wXD|sZd12kU+1jed_hM_)unFS8K(~SAUB?nXHY%- zV{iU(oG>|i!y}a(6UF{K#aE$R7S>);Jp%cp3PtxxQ;T`$*FTd`aV5eawJ!CH&QIpL z3$>-Y|9`7rzqI)Sqv;zyK9URJ^9g;4XFS5cI%~3^Eq`LkU6`a*nN`0s1jX=+_9Iml z`&%g-?rw%QG{0>t)y-C@$?>f@tcrIpE{e$4v;v|^=fjw5Ny2JPO2vtmjRS)R_R!0o z{hrcCBEd9uqV4|rhUVL)*o9a|ru#f{Ry9Ylt2NU+$0d({JGwc}N1!`1hJ<xd`f8ns z7T;prh24IZPLV8KH!^0%#-+X*+i5#iN`1rDsS1a_ft}#E(dCCI&(u^63d)4UyBtCp zMEu2|GG#kC-CY%AZrvI?x9`OBZcyy1O#lnC|7V6b1VdLj?|u0)JfIcB!_6&ZO71p{ znb{qQce8bs?-Y9a$_`om>ibCXVs5;4@BM-T|H6-~XKh5E-4IW<5gm%ujE=?;J$l^0 zx<>Nr@&@j}YR)BL?^tMU%_WL%t*WXHji%18uB40!oz9tyC~~o+-uk)KAKC4kMu;jk zhV%E%5D4@C@R=!puyJ@o`RyjPPZ6cL_^f`C!o<ADnDJAm?&W(cyG~rSLI#!sheOtt zN36pFsP&~9A?E|Pak2K<`+dB+b`>J`k|n#t9wy=r`@2j^qR45^i;UN^{3=@;D=Lm@ zf0ugy_p>yW7ilVQ?4$+R2e>X;((PI_NwDfyUVN}6y&f~}^*Q#}<ArTkKO5Z~(`T;I zG+}yrA91gOntgt_A`x%Ul3KcpH5$qxf43PjRivGnuD_K3Qgry0IQFWyw$ti!7#4L} zBV@9?@Vi~WiSvnd<>*Z%a>K6?Rc9npF8RJcW5T5+qiwHp9tKn1Yfzu^besQp(~SD( zQ|>F$v#&=?r3%;|zh-mQJ)f$?1V2wk%y{YsA_k3SL93mDd)k3;&^^bK@tcfRKTS;f zMe#(9bIa4Fn{!c5N^!Q17V29sU(ysT)8G9rb@c|-hxcdb<3C?K=j$1L+hzG<5ub(O z1@FW3cPjD7rq#IUb)|=_YjBwTb{6-eXxWP-r1eka(}sn}UJR7dcg&SN_>17%A5zdo zdvDM1!IOggWm*7LYVardfPGI~Z2Ms-N`T-l91S&LX&%#0_v?Je#h*Hj=U!I?5fHq) za3QfQf82~NZ}`l!d*ALbKc-RqHo1UZmQ>WF2&V09$iv=poL+*jC$<UNmJ{n17Z$Na z!xHR~n$@d|*k(7clbC)tiQbRMNO&Xr`x-noxOU@7Z0-vcBR(khFj=$>n(+G0MNqeJ zWO)x={(FU3%&GI^G#TX;I6Xf7YV*Rfx?$7j@(d!`B9xUR4Hn%$==(}dxbe49o2I3k zEAA@S*7E`ZTLE>CjjwiroPRluE%s(t2J_~=edUAoR?AQ8sUKfNki0Rr8Em>tkg+K< zIh|X`9Dn9DdiV16NY$hXd&0TDS6-O8bG;)X3R>bYLI_Nmd7|7b8|tZ6vC7((oo5Kb zm6%NQ#l%9AnG~O)bu538>5l|OKe-Taqk7ES>110yHRHFYu!%sW>m&2I%LLD~B`MPn zw8zm4*}5tHlS?Jb8sw#C2`1L&177{1Uf1{94`?VqI(F|G>JOUGd~${WdwVox*F3*- zOh{mIe%Y|hL%ijUU=bsQrVHc3%96xHAb}u?oAhn~<>2T^(RafACc9fvBD^<UKc0zX z=Y1-4Vtx5`oNmOgq#{)FTe`bCL11Mw$`-P_hfiB`^Fw$m-40pR15s{ngnNw)GtN1N zH{8I!ObVxd&J%I0{3`fP*uumr-jvSJhO2-6et)<$gMc7NUE6xb<i>98_EF}Ep(dsw zw%y9PZp6{(QNm~x#r2B>5fA<;_<H{yRr|Enq{-UC2ephc_nT+DBO}i~F_vvExf*iP z${~C%SB@xG&JVUB5>DtYc4L}pVP|bPSZaGj^{UIn;UQ~Q;o-TvJ}-hh@`%KL4X=l{ z&{npKB75(meqR4JiHr??VB5|d+sg4?BBimej)1vS_t%ESvZMi<cHuu99`nol=;QI` zn)%w*pFe+fsn^{9e(Bsfi7?f8C)X8&t4L9z=>gIvT@5A9CI5sJ&JZVy@8R;CoI}&B zWs}GV`m#(Kt+*@vakS!TsvmGyVp?cOZWnzW;TI@Hx^NBHaqwJmt5TJ=z=Zmz&n;(K znO*RW542f77A+qiICEKdmM8kJBQE4ELUiH?IxiiKuuI`BOw4|2$d6jN^{2E4mwBy9 z&eoOh%7|^N&TObBnzQp79Q634fU>UeBDX_O#4kfw=A+f)hDYZ#Q2f^~aW3bSI`y-E z|FfPO7Y!>SYS}$O_t1w`(;KVZ%Zjm(9`h!<;uTo@TSJhxfcQ&+VhbB{bN$|xGoo~r z8=Ufdx8+~_<-Z=TIvGb6QkTg4`lM>8MONN+xH%f3%`>&|MR0-CSJBXx!L-5Eh%#)l z&dqOPHm$Dd_f4JCO;9@`npXn97W~`R3Mm>%|1C+6O1w@qCUibp$2YK8tdCoVqR)x- z_ngK;l+Vn-P=RiHir-Uo^W#ocW=2QBxL|t8qDM}<tg>WLzBBtKM?1Z&CdFFk2|Mb7 zGkUSRx6QBU{+kIg*oa=YC2q4`KW_N?(mN{iB`Y<RjJ9M(+X?KjYhQ*eO1&<<BR-hT zAFr=HU76)9`)(X<cEEM>vh&si-9|vdN!@7DSHBoDyO__PSGM-G`92H2((EUUZDI12 z%kb+q5i@OcL3N(J564yI-w&zv`PkAcSo4me&^BNL<8*qqXeiK!WNxY=H)iDa4bUyT z3eEq`MuR`iO6<E&nKc~6j-PpV_TPu#-T3!Y)qi@!_3-nd3IBCQ`?rgQym)z{6VY9< zwxF2(8I3E2ByHA{J#TNmddC_iVyqN=+@@dqF|~Zha7q2-fG|ugR@7ydaKzlaIn*cQ zIeTP?c`bRnqE6%61jCJA2kd3!ZE+QiH=8+!Dt7uR9;=nwnN|tT9?9C%5HeEW-6lWE z?dLtCjm+JwL%SYD5p|qJHQLuJwx!`u)wS5CZdc=UM>Y7o^4{LQcJ);l(}wb#r8%|m zu`zo*=7%o~bWKbtqE4Xg^s%Y?{7J*$bO5dEc{1%mKu}%pz4AfHXg02C_ixt0--)Ts zPC8ecx)I?Y_usG!5lgdlOh4f8qJ%NjDZ}ZTT2uiYd6qOMIFWDhRDPoZPm;P#6g9Mb zPH{8m^#+e=U_dBJlp#6)C-})owRln6qwgA(&SwbjSW6I;8e6`2<?;P3_4hxYs-~V~ z=9!=W`%WxR(<kT)CmhiH0b>U?k(GBzDf+rL&;1EHO_%+$1dUU-cd%f;LZxH#v*2Wy zE2Pi0dM-S?-XWhB`Qm-hmjb^1vAZbjsE`NWH|0;%Wvg}Los_pszi1RLaH_<kKE;%+ zy=m@UBp^uX{#15?lXrGm<DFcaUoI3OI9kFw6)>`0brCmCRASn|BL{bjytgA2;<IpX zpUyusdlNXiKPI?-hG0U(3n%=z=UM@eJ0row8^k#<-$W%>{LyF{#joQtw`Qa&Zku~P z;4dp}dZMT9;qyBv>1p^s<UUUl^narhJcwm(2;JWw8R|%zekz`_`>*hngXHtv*+l{5 z5LGm#n6Z5tKNRX8Q?{DCIl}lboY*M+0lm?mUz~9tzezK9B+VYaayK`=zdB~#oORS| zV!rm`nYT#13p3%?+<B6Y+-{TK+O?<u5Uit4p9c1Qx+#_)@N-FEtYl`@fkDmYK-0o` z(+185fEcvA{4sY?if_A{a|AUWJXHUj467j~R+|1>s0(I!1$DiZ$r&R70F+8fmiIbb zC02C#*s-e8icD{)jHqn2I5}tY!}{(MQ7i|xK4f=Q0&z@nGbmlLAWS8;0Xu-(?;aa< zb{MBMDdwL^5T>`d^RB1?d2gP5;2z(@fAXsfDN#;F_sYs?2>t;~gJk1nEhyHh{W78X zK82W7@|aU4YG==Uy-2;ruY94|=J8r_8rJ?m6K?eVF|H;^eHU9FKDX>R?dEYBP}il3 zo}9Wx;EFrk;1F>?W791^VdVK`0lyR!<a-avqqN;PgB_~!4vD`|i`q%w`!-RczNbYj znKa+w$UcOLEHXs>D9W3HK(wH4zWzN@zizJ2+1;Ltq^4%f8QWhy7)E2v9nu*8(O@3Q zk+LC8;)v+<mc8E~DOvQDW{*K{{Pf;6!xZb?H@TT3%-4zAcxgpWH)<3cpV0o&+WhRm z@T-KQ=J!%~Th7?`mkiFHXr3FLVqBByVrO!@mnNoj&-&(Ftah0=R|Ws^mdJ+D`A>|h zz!W|hOBF&QsxI=WSRKv%8t|=(G@}YLqtdlxY?Ez4I&Ji#ltNY*;J&Z%*ZdCC&Don1 zdzZiIE4}ZUm02mxxZiY#&E;I61UXC`?lLJRAn+2=KTkxMJlph&;8{bz`9%`l`{k!U z7cwuxnag6n`M-~MJBX&U5bzH89)^FMXJlg<nAOPHMX{fSgVDcDvUKy<)}HPB{$N&3 zc7*<wy`^L`-|j}`5(~qs0f5w8Pt%*r!#~S7jGG;~jeUM!MG0Sf9DUs&>F&*&kEXtS zene20O(E0WJtQ<|M?kRisy$OsJqWzVWSRm20hs<_A61m>{ZBr=6VVw;*mxq&g97e< zGu{ZTloB@<lB?ZDQP;|>osnS?bP;EIkJcfrNaDS@9+Q;M#c9vTW$o%c>!2`UzrDSC z$#QKGE7|pTF#=6rb~`JhjBf4tz)EfH)~nt8U$1|o`yW?aZi`_39T9ZNvCQ1E;{8!5 zaa4QVO5!v7J;BdxtoFC4@{3;&h5DFO9umR|i|sUbAz(z^_dl<xu3G8WQazCfba1WX z@-r-G?)LPFe<0tQ8&%HvrJ{s89{)zTED650y;aL^%p*1a7m&A8dr2eB!GT0Klrat7 zXm|r~5)h3~NLgzkoVxbkL1^(PGWE@-p?Q`0AKhh>9QP_!Fi#y%Ls2oVt6)6UCiQ|` zdWibU5+vK&=>F!F4<FxY>EUn(iA6~2`l1Wt=4%U0TweP1*c#!nh1JD|zjgIwpI689 zPzC$AgV$^EaUb&CFMH`?Ta6!(tOw0Me&l8OX#2uBc3n^F@hMoOjpl}gJ5y>8(}`po zxV%IZkK;D>ww_BGN6t1>6`>>*MDF4!Y~ux)%HB*hG0Y9<1sdMYN7lTUcDx=LRWcd) zuU++>!jE3W*?=-Qj`f+G0n=k1#xn#TKAznuLCBvWpvo_uXz6BM@mf4k^k|%E9&kp7 zq6WG(*mSE197xr#l9vo@#t&IEC4~eV*qPB-P2Wkr#LZ|q`8h<-?^h4A4x-`=1ccIE zxmf0h&sPp#w(*!ZsNX~Vyv$!s3vh18C++iPea3Pj_kP=%8{vQ@pJ()@WEQttvVJpH zn^f_<#6`shXDcYUtX>N?rVMfmd{=bqKXGH3S<Kv;pSP*!!-rYVG)z7(oOFogT)8dC zQCYvGq@gsquBV3wtLz4ZaN7F6JWbin>Gs^*jX<=jev%D_er}}VhfGH>)~rMLFHP`U zT^D57U@0TTt9G>Fc;DqXy^xP<bia;Eue@GhF8gCticy#Kv<Pwnr6_-4c=280x2lv1 z+FpeBdnY`w&368;Z{B>io)b-W>?|fm|LO}%m)$!egXZ3tulhRgLqytq^P!LFO>z!# z@bAHg@UYtPpMFAwnlg<4XC(d_T@VCz8t1)#jBIZ~>{3KqJE*V%$W%~K^KlXuJo|CX z`(W!G{SzV65yO$vxAejBEg#4Jza=<0oq6Hz*V?M*?3XABY&)1O``4$E8`1x!$w;Q+ zy}+J5A~$A8G{26&w{7>^Wlwm2Jos?j!@K9`W5ILwS74dps6>8VZf`oU?Ct8jJ#9v@ zd68bH?Y7mHzYU5lu9Yqg(%ks?Wr>XCtk(DS)#{TTFaCJlfAfNiS%M-Khd(_LjfN)w zxvyW?-}}{k_4W0*o7_t;ozA@7^OEt$wR1jCM5jKk@Dof4(sY`xe-POH1zv^(?4`2^ zUUZo_<80dR=}vNmY|V`Ma(|TTK3=}qpHbAFeLa8Ch9yGP-`^CJYXsk0JT2N^TEEt` zAWrb&;vBC#hYTf8t<rno;%8W5W!vMX3~KdktlWH8R*Ydm{Mv)hpJxkftZLouJadxV z);m?7Dl%U^+M}dY)eyd*eT8XM%2Tn$JD++3t=5S#5RW!jRZf`o+Wyrn4`A0K|L;HN z7M-|;^|`lsX6Af}|2w(3KPu0*bdSl_!Z<-eTX;M3-XTX&3si-P8+s{A1nl%>f-O-U z*afSMkULqMt|S=jux0}_R~Km>OfYa*6_$Nh7JS9a#VHG}y-*0vh8oVfFcGR}PSoO5 zD07P2>eess_L`L+2fN5bb<4f{_AkfQ?gkDmyz6W20D=>XXZonsRIU~c+ItQ(RI<}r z4rH5Bf7$aq=`U@K2kVzyD*8KZ_hUtn=%<YMJ3Dv}*n~LT-|_Zc1;~I7n_J@M?->sN zKNY?9+JiT(r{DE;f`m^f&)t8e;o<V@p6&P7?7PFkE1&5O3YHYt#TOSo`y|ScmXN}@ z_PS)jzo5O=$;x2UEv|0uy&%n|vwo?vbhh-Y!r$*|%Z~u}*1EVnDU5nwx?tVPqeWjO zx3O+Hnc?JjQS!^z@4J=lKsuHBFD?&L-oArLZSuuewJYDYNo^HV|9txA`B0EkUQA3i zk(wAC!Py&TzA86_k(VJicdo|T9R`vcK|KV)$~lideFi4GO}Ev`udH0RP;vsp$BX^W zT3e&j!N+FTE(KO;Q$j-*|LmU4x4kgJf!QIp*7%n7t_c&TF)Y25t(2q!c0NZ|uUO^L zsTq6kKP<7HK7HEzZQCBdpZ|2x+P$9>kAXe^#1J?*R%o*Ng5Sp+xvgt2YhO4FYW1A_ zShI#Ry026)F+fX{A9!*%2yDOjns-OU?Uq|@s|~nnI@%U6NjdlLSiLUO#rd-7nrP`Z z)5O!2`QR>$uczB$LDR2iSM0pQGWTA>bF0nCP24XMt>!X54ZXS}q?}dJTP)$=o|`kw z%f(WRX5NSed)rrP@x_ka-)|Lu{$^`ZUnrc_%eJ9<a$E5tpw`;ISs~ZW7VX+52&`j2 zKRa{i&I5%XzkeUNep`CqKD!T}zc$94I|S}mshvO2Aow?n_t#Y^U<Uf~ZRN$P{j%jz kw-ZdHWXnY&JpbDptp{EU)_L(1aN3B$)78&qol`;+021G#xc~qF diff --git a/playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png b/playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png index 9d9b431b0cad87ee5e37110d10984453abc9f312..61ab66015777917db2a47cdbb25fc8fa78d12077 100644 GIT binary patch literal 17830 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 SH9WvhLFAt+Lo1|A0{=f<)4K8i literal 17883 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 diff --git a/res/css/structures/_TabbedView.pcss b/res/css/structures/_TabbedView.pcss index 756f6ab864..34a1766c19 100644 --- a/res/css/structures/_TabbedView.pcss +++ b/res/css/structures/_TabbedView.pcss @@ -129,6 +129,7 @@ limitations under the License. padding-inline: var(--cpd-space-3x) var(--cpd-space-4x); box-sizing: border-box; min-block-size: 40px; + min-inline-size: 40px; border-radius: 24px; font: var(--cpd-font-body-md-medium); position: relative; @@ -164,3 +165,25 @@ limitations under the License. overflow: auto; min-height: 0; /* firefox */ } + +/* Hide the labels on tabs, showing only the icons, on narrow viewports. */ +@media (max-width: 768px) { + .mx_TabbedView_tabsOnLeft.mx_TabbedView_responsive { + .mx_TabbedView_tabLabel_text { + display: none; + } + .mx_TabbedView_tabPanel { + margin-left: 72px; /* 40px sidebar + 32px padding */ + } + .mx_TabbedView_maskedIcon { + margin-right: auto; + margin-left: auto; + } + .mx_TabbedView_tabLabels { + width: auto; + } + .mx_TabbedView_tabLabel { + padding-inline: 0 0; + } + } +} diff --git a/res/css/views/auth/_LoginWithQR.pcss b/res/css/views/auth/_LoginWithQR.pcss index 6a112c7c82..c4904952b6 100644 --- a/res/css/views/auth/_LoginWithQR.pcss +++ b/res/css/views/auth/_LoginWithQR.pcss @@ -32,36 +32,10 @@ limitations under the License. margin-top: $spacing-8; } - .mx_LoginWithQR_separator { - display: flex; - align-items: center; - text-align: center; - - &::before, - &::after { - content: ""; - flex: 1; - border-bottom: 1px solid $quinary-content; - } - - &:not(:empty) { - &::before { - margin-right: 1em; - } - &::after { - margin-left: 1em; - } - } - } - font-size: $font-15px; } .mx_UserSettingsDialog .mx_LoginWithQR { - .mx_AccessibleButton + .mx_AccessibleButton { - margin-left: $spacing-12; - } - font: var(--cpd-font-body-md-regular); h1 { @@ -69,18 +43,14 @@ limitations under the License. margin-bottom: 0; } - li { - line-height: 1.8; + h2 { + margin-top: $spacing-24; } .mx_QRCode { margin: $spacing-28 0; } - .mx_LoginWithQR_buttons { - text-align: center; - } - .mx_LoginWithQR_qrWrapper { display: flex; } @@ -91,12 +61,6 @@ limitations under the License. display: flex; flex-direction: column; - .mx_LoginWithQR_centreTitle { - h1 { - text-align: center; - } - } - h1 > svg { &.normal { color: $secondary-content; @@ -137,11 +101,69 @@ limitations under the License. } ol { - list-style-position: inside; padding-inline-start: 0; + list-style: none; /* list markers do not support the outlined number styling we need */ + + li { + position: relative; + padding-left: var(--cpd-space-7x); + color: 1px solid $input-placeholder; + margin-bottom: var(--cpd-space-4x); + line-height: 20px; + text-align: initial; + } - li::marker { - color: $accent; + /* Circled number list item marker */ + li::before { + content: counter(list-item); + position: absolute; + left: 0; + display: inline-block; + width: 20px; + height: 20px; + line-height: 20px; + border-radius: 50%; + border: 1px solid $input-placeholder; + box-sizing: border-box; + text-align: center; + } + } + + label[for="mx_LoginWithQR_checkCode"] { + margin-top: var(--cpd-space-6x); + color: var(--cpd-color-text-primary); + margin-bottom: var(--cpd-space-1x); + } + + .mx_LoginWithQR_icon { + width: 56px; + height: 56px; + border-radius: 8px; + box-sizing: border-box; + padding: var(--cpd-space-3x); + gap: 10px; + + background-color: var(--cpd-color-bg-success-subtle); + svg { + color: var(--cpd-color-icon-success-primary); + } + + &.mx_LoginWithQR_icon--critical { + background-color: var(--cpd-color-bg-critical-subtle); + svg { + color: var(--cpd-color-icon-critical-primary); + } + } + } + + .mx_LoginWithQR_checkCode_input { + margin-bottom: var(--cpd-space-1x); + text-align: initial; + + input { + /* Workaround for one of the input rules in _common.pcss being not specific enough */ + padding: 0; + padding-inline-start: calc(40px / 2 - (1ch / 2)); } } @@ -164,13 +186,39 @@ limitations under the License. .mx_LoginWithQR_breadcrumbs { font-size: $font-13px; - color: var(--cpd-color-text-secondary); + color: $secondary-content; } .mx_LoginWithQR_main { display: flex; flex-direction: column; flex-grow: 1; + align-items: center; + color: $primary-content; + text-align: center; + + p { + color: $secondary-content; + } + } + + &.mx_LoginWithQR_error .mx_LoginWithQR_main { + max-width: 400px; + margin: 0 auto; + } + + .mx_LoginWithQR_buttons { + display: flex; + flex-direction: column; + align-items: center; + gap: $spacing-16; + margin-top: var(--cpd-space-6x); + + .mx_AccessibleButton { + width: 300px; + height: 48px; + box-sizing: border-box; + } } .mx_QRCode { diff --git a/res/css/views/right_panel/_BaseCard.pcss b/res/css/views/right_panel/_BaseCard.pcss index 6d17930fce..67eb9b7e49 100644 --- a/res/css/views/right_panel/_BaseCard.pcss +++ b/res/css/views/right_panel/_BaseCard.pcss @@ -90,6 +90,7 @@ limitations under the License. min-height: 0; width: 100%; height: 100%; + scrollbar-gutter: stable; } .mx_BaseCard_Group { diff --git a/res/css/views/right_panel/_RoomSummaryCard.pcss b/res/css/views/right_panel/_RoomSummaryCard.pcss index 72b23d860e..4c3ff2f888 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.pcss +++ b/res/css/views/right_panel/_RoomSummaryCard.pcss @@ -51,6 +51,52 @@ limitations under the License. } } + .mx_RoomSummaryCard_topic { + padding: 0 12px; + + .mx_Box { + width: 100%; + } + + .mx_RoomSummaryCard_topic_container { + display: flex; + } + + .mx_RoomSummaryCard_topic_edit { + width: max-content; + } + + p { + white-space: pre-wrap; + width: 100%; + min-width: 0; + margin: 0; + } + + a { + cursor: pointer; + } + + .mx_RoomSummaryCard_topic_chevron { + transition: transform 0.3s; + } + + &.mx_RoomSummaryCard_topic_collapsed { + p { + overflow: hidden; + text-overflow: ellipsis; + white-space: normal; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + } + + .mx_RoomSummaryCard_topic_chevron { + transform: rotate(-90deg); + } + } + } + .mx_RoomSummaryCard_appsGroup { .mx_RoomSummaryCard_Button { /* this button is special so we have to override some of the original styling */ diff --git a/res/css/views/rooms/_AppsDrawer.pcss b/res/css/views/rooms/_AppsDrawer.pcss index fc59568322..83888d0b9f 100644 --- a/res/css/views/rooms/_AppsDrawer.pcss +++ b/res/css/views/rooms/_AppsDrawer.pcss @@ -216,6 +216,11 @@ limitations under the License. margin-right: 12px; } + h3 { + font-size: inherit; + margin: 0; + } + > :last-child { margin-left: 9px; display: flex; diff --git a/res/css/views/rooms/_MessageComposerFormatBar.pcss b/res/css/views/rooms/_MessageComposerFormatBar.pcss index 68520cc741..1cbabecc3a 100644 --- a/res/css/views/rooms/_MessageComposerFormatBar.pcss +++ b/res/css/views/rooms/_MessageComposerFormatBar.pcss @@ -102,9 +102,4 @@ limitations under the License. font-weight: var(--cpd-font-weight-semibold); min-width: 54px; text-align: center; - - .mx_MessageComposerFormatBar_tooltipShortcut { - font-size: $font-9px; - opacity: 0.7; - } } diff --git a/res/css/views/rooms/_RoomBreadcrumbs.pcss b/res/css/views/rooms/_RoomBreadcrumbs.pcss index f502c3f470..73c4b27432 100644 --- a/res/css/views/rooms/_RoomBreadcrumbs.pcss +++ b/res/css/views/rooms/_RoomBreadcrumbs.pcss @@ -49,8 +49,3 @@ limitations under the License. height: 32px; } } - -.mx_RoomBreadcrumbs_Tooltip { - margin-left: -42px; - margin-top: -42px; -} diff --git a/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss b/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss index 8f23227c80..347f475063 100644 --- a/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss +++ b/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss @@ -64,19 +64,11 @@ limitations under the License. } } -.mx_FormattingButtons_Tooltip { - padding: 0 2px 0 2px; - - .mx_FormattingButtons_Tooltip_KeyboardShortcut { - color: $tertiary-content; - - kbd { - margin-top: 2px; - text-align: center; - display: inline-block; - text-transform: capitalize; - font-size: 12px; - font-family: Inter, sans-serif; - } +.mx_FormattingButtons_Tooltip_KeyboardShortcut { + kbd { + text-align: center; + display: inline-block; + text-transform: capitalize; + font-family: Inter, sans-serif; } } diff --git a/res/css/views/toasts/_IncomingLegacyCallToast.pcss b/res/css/views/toasts/_IncomingLegacyCallToast.pcss index e2092ef006..695b588932 100644 --- a/res/css/views/toasts/_IncomingLegacyCallToast.pcss +++ b/res/css/views/toasts/_IncomingLegacyCallToast.pcss @@ -18,6 +18,7 @@ limitations under the License. .mx_IncomingLegacyCallToast { display: flex; flex-direction: row; + align-items: flex-start; pointer-events: initial; /* restore pointer events so the user can accept/decline */ .mx_IncomingLegacyCallToast_content { diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index 7150336e45..e7e4ff7e3c 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -34,10 +34,11 @@ import { CheckUpdatesPayload } from "./dispatcher/payloads/CheckUpdatesPayload"; import { Action } from "./dispatcher/actions"; import { hideToast as hideUpdateToast } from "./toasts/UpdateToast"; import { MatrixClientPeg } from "./MatrixClientPeg"; -import { idbLoad, idbSave, idbDelete } from "./utils/StorageManager"; +import { idbLoad, idbSave, idbDelete } from "./utils/StorageAccess"; import { ViewRoomPayload } from "./dispatcher/payloads/ViewRoomPayload"; import { IConfigOptions } from "./IConfigOptions"; import SdkConfig from "./SdkConfig"; +import { buildAndEncodePickleKey, getPickleAdditionalData } from "./utils/tokens/pickling"; export const SSO_HOMESERVER_URL_KEY = "mx_sso_hs_url"; export const SSO_ID_SERVER_URL_KEY = "mx_sso_is_url"; @@ -314,7 +315,7 @@ export default abstract class BasePlatform { } /** - * The URL to return to after a successful SSO/OIDC authentication + * The URL to return to after a successful SSO authentication * @param fragmentAfterLogin optional fragment for specific view to return to */ public getSSOCallbackUrl(fragmentAfterLogin = ""): URL { @@ -352,55 +353,21 @@ export default abstract class BasePlatform { /** * Get a previously stored pickle key. The pickle key is used for - * encrypting libolm objects. + * encrypting libolm objects and react-sdk-crypto data. * @param {string} userId the user ID for the user that the pickle key is for. - * @param {string} userId the device ID that the pickle key is for. + * @param {string} deviceId the device ID that the pickle key is for. * @returns {string|null} the previously stored pickle key, or null if no * pickle key has been stored. */ public async getPickleKey(userId: string, deviceId: string): Promise<string | null> { - if (!window.crypto || !window.crypto.subtle) { - return null; - } - let data; + let data: { encrypted?: BufferSource; iv?: BufferSource; cryptoKey?: CryptoKey } | undefined; try { data = await idbLoad("pickleKey", [userId, deviceId]); } catch (e) { logger.error("idbLoad for pickleKey failed", e); } - if (!data) { - return null; - } - if (!data.encrypted || !data.iv || !data.cryptoKey) { - logger.error("Badly formatted pickle key"); - return null; - } - - const additionalData = this.getPickleAdditionalData(userId, deviceId); - - try { - const key = await crypto.subtle.decrypt( - { name: "AES-GCM", iv: data.iv, additionalData }, - data.cryptoKey, - data.encrypted, - ); - return encodeUnpaddedBase64(key); - } catch (e) { - logger.error("Error decrypting pickle key"); - return null; - } - } - private getPickleAdditionalData(userId: string, deviceId: string): Uint8Array { - const additionalData = new Uint8Array(userId.length + deviceId.length + 1); - for (let i = 0; i < userId.length; i++) { - additionalData[i] = userId.charCodeAt(i); - } - additionalData[userId.length] = 124; // "|" - for (let i = 0; i < deviceId.length; i++) { - additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); - } - return additionalData; + return (await buildAndEncodePickleKey(data, userId, deviceId)) ?? null; } /** @@ -424,7 +391,7 @@ export default abstract class BasePlatform { const iv = new Uint8Array(32); crypto.getRandomValues(iv); - const additionalData = this.getPickleAdditionalData(userId, deviceId); + const additionalData = getPickleAdditionalData(userId, deviceId); const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv, additionalData }, cryptoKey, randomArray); try { @@ -463,6 +430,13 @@ export default abstract class BasePlatform { return window.location.origin + window.location.pathname; } + /** + * Fallback Client URI to use for OIDC client registration for if one is not specified in config.json + */ + public get defaultOidcClientUri(): string { + return window.location.origin; + } + /** * Metadata to use for dynamic OIDC client registrations */ @@ -470,16 +444,17 @@ export default abstract class BasePlatform { const config = SdkConfig.get(); return { clientName: config.brand, - clientUri: this.baseUrl, - redirectUris: [this.getSSOCallbackUrl().href], - logoUri: new URL("vector-icons/1024.png", this.baseUrl).href, + clientUri: config.oidc_metadata?.client_uri ?? this.defaultOidcClientUri, + redirectUris: [this.getOidcCallbackUrl().href], + logoUri: config.oidc_metadata?.logo_uri ?? new URL("vector-icons/1024.png", this.baseUrl).href, applicationType: "web", // XXX: We break the spec by not consistently supplying these required fields - // contacts: [], // @ts-ignore - tosUri: config.terms_and_conditions_links?.[0]?.url, + contacts: config.oidc_metadata?.contacts, // @ts-ignore - policyUri: config.privacy_policy_url, + tosUri: config.oidc_metadata?.tos_uri ?? config.terms_and_conditions_links?.[0]?.url, + // @ts-ignore + policyUri: config.oidc_metadata?.policy_uri ?? config.privacy_policy_url, }; } @@ -490,4 +465,15 @@ export default abstract class BasePlatform { public getOidcClientState(): string { return ""; } + + /** + * The URL to return to after a successful OIDC authentication + */ + public getOidcCallbackUrl(): URL { + const url = new URL(window.location.href); + // The redirect URL has to exactly match that registered at the OIDC server, so + // ensure that the fragment part of the URL is empty. + url.hash = ""; + return url; + } } diff --git a/src/DecryptionFailureTracker.ts b/src/DecryptionFailureTracker.ts index f9afec0daa..c842e55ec4 100644 --- a/src/DecryptionFailureTracker.ts +++ b/src/DecryptionFailureTracker.ts @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { DecryptionError } from "matrix-js-sdk/src/crypto/algorithms"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; import { Error as ErrorEvent } from "@matrix-org/analytics-events/types/typescript/Error"; +import { DecryptionFailureCode } from "matrix-js-sdk/src/crypto-api"; import { PosthogAnalytics } from "./PosthogAnalytics"; @@ -25,17 +25,15 @@ export class DecryptionFailure { public constructor( public readonly failedEventId: string, - public readonly errorCode: string, + public readonly errorCode: DecryptionFailureCode, ) { this.ts = Date.now(); } } -type ErrorCode = "OlmKeysNotSentError" | "OlmIndexError" | "UnknownError" | "OlmUnspecifiedError"; - +type ErrorCode = ErrorEvent["name"]; type TrackingFn = (count: number, trackedErrCode: ErrorCode, rawError: string) => void; - -export type ErrCodeMapFn = (errcode: string) => ErrorCode; +export type ErrCodeMapFn = (errcode: DecryptionFailureCode) => ErrorCode; export class DecryptionFailureTracker { private static internalInstance = new DecryptionFailureTracker( @@ -52,12 +50,16 @@ export class DecryptionFailureTracker { (errorCode) => { // Map JS-SDK error codes to tracker codes for aggregation switch (errorCode) { - case "MEGOLM_UNKNOWN_INBOUND_SESSION_ID": + case DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID: return "OlmKeysNotSentError"; - case "OLM_UNKNOWN_MESSAGE_INDEX": + case DecryptionFailureCode.OLM_UNKNOWN_MESSAGE_INDEX: return "OlmIndexError"; - case undefined: - return "OlmUnspecifiedError"; + case DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP: + case DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED: + case DecryptionFailureCode.HISTORICAL_MESSAGE_WORKING_BACKUP: + return "HistoricalMessage"; + case DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED: + return "ExpectedDueToMembership"; default: return "UnknownError"; } @@ -76,11 +78,11 @@ export class DecryptionFailureTracker { // accumulated in `failureCounts`. public visibleFailures: Map<string, DecryptionFailure> = new Map(); - // A histogram of the number of failures that will be tracked at the next tracking - // interval, split by failure error code. - public failureCounts: Record<string, number> = { - // [errorCode]: 42 - }; + /** + * A histogram of the number of failures that will be tracked at the next tracking + * interval, split by failure error code. + */ + private failureCounts: Map<DecryptionFailureCode, number> = new Map(); // Event IDs of failures that were tracked previously public trackedEvents: Set<string> = new Set(); @@ -108,10 +110,10 @@ export class DecryptionFailureTracker { * * @param {function} fn The tracking function, which will be called when failures * are tracked. The function should have a signature `(count, trackedErrorCode) => {...}`, - * where `count` is the number of failures and `errorCode` matches the `.code` of - * provided DecryptionError errors (by default, unless `errorCodeMapFn` is specified. - * @param {function?} errorCodeMapFn The function used to map error codes to the - * trackedErrorCode. If not provided, the `.code` of errors will be used. + * where `count` is the number of failures and `errorCode` matches the output of `errorCodeMapFn`. + * + * @param {function} errorCodeMapFn The function used to map decryption failure reason codes to the + * `trackedErrorCode`. */ private constructor( private readonly fn: TrackingFn, @@ -138,13 +140,15 @@ export class DecryptionFailureTracker { // localStorage.setItem('mx-decryption-failure-event-ids', JSON.stringify([...this.trackedEvents])); // } - public eventDecrypted(e: MatrixEvent, err: DecryptionError): void { - // for now we only track megolm decrytion failures + public eventDecrypted(e: MatrixEvent): void { + // for now we only track megolm decryption failures if (e.getWireContent().algorithm != "m.megolm.v1.aes-sha2") { return; } - if (err) { - this.addDecryptionFailure(new DecryptionFailure(e.getId()!, err.code)); + + const errCode = e.decryptionFailureReason; + if (errCode !== null) { + this.addDecryptionFailure(new DecryptionFailure(e.getId()!, errCode)); } else { // Could be an event in the failures, remove it this.removeDecryptionFailuresForEvent(e); @@ -205,7 +209,7 @@ export class DecryptionFailureTracker { this.failures = new Map(); this.visibleEvents = new Set(); this.visibleFailures = new Map(); - this.failureCounts = {}; + this.failureCounts = new Map(); } /** @@ -236,7 +240,7 @@ export class DecryptionFailureTracker { private aggregateFailures(failures: Set<DecryptionFailure>): void { for (const failure of failures) { const errorCode = failure.errorCode; - this.failureCounts[errorCode] = (this.failureCounts[errorCode] || 0) + 1; + this.failureCounts.set(errorCode, (this.failureCounts.get(errorCode) ?? 0) + 1); } } @@ -245,12 +249,12 @@ export class DecryptionFailureTracker { * function with the number of failures that should be tracked. */ public trackFailures(): void { - for (const errorCode of Object.keys(this.failureCounts)) { - if (this.failureCounts[errorCode] > 0) { + for (const [errorCode, count] of this.failureCounts.entries()) { + if (count > 0) { const trackedErrorCode = this.errorCodeMapFn(errorCode); - this.fn(this.failureCounts[errorCode], trackedErrorCode, errorCode); - this.failureCounts[errorCode] = 0; + this.fn(count, trackedErrorCode, errorCode); + this.failureCounts.set(errorCode, 0); } } } diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index b518c43973..b63ed1dcf0 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -348,7 +348,7 @@ export function bodyToHtml(content: IContent, highlights: Optional<string[]>, op isHtmlMessage = !isPlainText; if (isHtmlMessage && SettingsStore.getValue("feature_latex_maths")) { - [...phtml.querySelectorAll<HTMLElement>("div, span[data-mx-maths]")].forEach((e) => { + [...phtml.querySelectorAll<HTMLElement>("div[data-mx-maths], span[data-mx-maths]")].forEach((e) => { e.outerHTML = katex.renderToString(decode(e.getAttribute("data-mx-maths")), { throwOnError: false, displayMode: e.tagName == "DIV", @@ -461,9 +461,13 @@ export function topicToHtml( emojiBodyElements = formatEmojis(topic, false); } - return isFormattedTopic ? ( - <span ref={ref} dangerouslySetInnerHTML={{ __html: safeTopic }} dir="auto" /> - ) : ( + if (isFormattedTopic) { + if (!safeTopic) return null; + return <span ref={ref} dangerouslySetInnerHTML={{ __html: safeTopic }} dir="auto" />; + } + + if (!emojiBodyElements && !topic) return null; + return ( <span ref={ref} dir="auto"> {emojiBodyElements || topic} </span> diff --git a/src/IConfigOptions.ts b/src/IConfigOptions.ts index 0e9645349b..c3a919648e 100644 --- a/src/IConfigOptions.ts +++ b/src/IConfigOptions.ts @@ -200,12 +200,20 @@ export interface IConfigOptions { * The issuer URL must have a trailing `/`. * OPTIONAL */ - oidc_static_clients?: Record< - string, - { - client_id: string; - } - >; + oidc_static_clients?: { + [issuer: string]: { client_id: string }; + }; + + /** + * Configuration for OIDC dynamic registration where a static OIDC client is not configured. + */ + oidc_metadata?: { + client_uri?: string; + logo_uri?: string; + tos_uri?: string; + policy_uri?: string; + contacts?: string[]; + }; } export interface ISsoRedirectOptions { diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index 61097c13c2..8b04f74afc 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -37,6 +37,7 @@ import ActiveWidgetStore from "./stores/ActiveWidgetStore"; import PlatformPeg from "./PlatformPeg"; import { sendLoginRequest } from "./Login"; import * as StorageManager from "./utils/StorageManager"; +import * as StorageAccess from "./utils/StorageAccess"; import SettingsStore from "./settings/SettingsStore"; import { SettingLevel } from "./settings/SettingLevel"; import ToastStore from "./stores/ToastStore"; @@ -288,7 +289,7 @@ export async function attemptDelegatedAuthLogin( */ async function attemptOidcNativeLogin(queryParams: QueryDict): Promise<boolean> { try { - const { accessToken, refreshToken, homeserverUrl, identityServerUrl, idTokenClaims, clientId, issuer } = + const { accessToken, refreshToken, homeserverUrl, identityServerUrl, idToken, clientId, issuer } = await completeOidcLogin(queryParams); const { @@ -310,7 +311,7 @@ async function attemptOidcNativeLogin(queryParams: QueryDict): Promise<boolean> logger.debug("Logged in via OIDC native flow"); await onSuccessfulDelegatedAuthLogin(credentials); // this needs to happen after success handler which clears storages - persistOidcAuthenticatedSettings(clientId, issuer, idTokenClaims); + persistOidcAuthenticatedSettings(clientId, issuer, idToken); return true; } catch (error) { logger.error("Failed to login via OIDC", error); @@ -493,7 +494,7 @@ export interface IStoredSession { async function getStoredToken(storageKey: string): Promise<string | undefined> { let token: string | undefined; try { - token = await StorageManager.idbLoad("account", storageKey); + token = await StorageAccess.idbLoad("account", storageKey); } catch (e) { logger.error(`StorageManager.idbLoad failed for account:${storageKey}`, e); } @@ -502,7 +503,7 @@ async function getStoredToken(storageKey: string): Promise<string | undefined> { if (token) { try { // try to migrate access token to IndexedDB if we can - await StorageManager.idbSave("account", storageKey, token); + await StorageAccess.idbSave("account", storageKey, token); localStorage.removeItem(storageKey); } catch (e) { logger.error(`migration of token ${storageKey} to IndexedDB failed`, e); @@ -719,7 +720,7 @@ async function createOidcTokenRefresher(credentials: IMatrixClientCreds): Promis try { const clientId = getStoredOidcClientId(); const idTokenClaims = getStoredOidcIdTokenClaims(); - const redirectUri = PlatformPeg.get()!.getSSOCallbackUrl().href; + const redirectUri = PlatformPeg.get()!.getOidcCallbackUrl().href; const deviceId = credentials.deviceId; if (!deviceId) { throw new Error("Expected deviceId in user credentials."); @@ -1064,7 +1065,7 @@ async function clearStorage(opts?: { deleteEverything?: boolean }): Promise<void AbstractLocalStorageSettingsHandler.clear(); try { - await StorageManager.idbDelete("account", ACCESS_TOKEN_STORAGE_KEY); + await StorageAccess.idbDelete("account", ACCESS_TOKEN_STORAGE_KEY); } catch (e) { logger.error("idbDelete failed for account:mx_access_token", e); } diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index 07ff3c7178..d14003dbfa 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -73,22 +73,44 @@ export interface IMatrixClientCreds { * you'll find a `MatrixClient` hanging on the `MatrixClientPeg`. */ export interface IMatrixClientPeg { + /** + * The opts used to start the client + */ opts: IStartClientOpts; /** * Return the server name of the user's homeserver * Throws an error if unable to deduce the homeserver name - * (eg. if the user is not logged in) + * (e.g. if the user is not logged in) * * @returns {string} The homeserver name, if present. */ getHomeserverName(): string; + /** + * Get the current MatrixClient, if any + */ get(): MatrixClient | null; + + /** + * Get the current MatrixClient, throwing an error if there isn't one + */ safeGet(): MatrixClient; + + /** + * Unset the current MatrixClient + */ unset(): void; - assign(): Promise<any>; - start(): Promise<any>; + + /** + * Prepare the MatrixClient for use, including initialising the store and crypto, but do not start it + */ + assign(): Promise<IStartClientOpts>; + + /** + * Prepare the MatrixClient for use, including initialising the store and crypto, and start it + */ + start(): Promise<void>; /** * If we've registered a user ID we set this to the ID of the @@ -235,7 +257,7 @@ class MatrixClientPegClass implements IMatrixClientPeg { PlatformPeg.get()?.reload(); }; - public async assign(): Promise<any> { + public async assign(): Promise<IStartClientOpts> { if (!this.matrixClient) { throw new Error("createClient must be called first"); } @@ -273,17 +295,9 @@ class MatrixClientPegClass implements IMatrixClientPeg { opts.threadSupport = true; if (SettingsStore.getValue("feature_sliding_sync")) { - const proxyUrl = SettingsStore.getValue("feature_sliding_sync_proxy_url"); - if (proxyUrl) { - logger.log("Activating sliding sync using proxy at ", proxyUrl); - } else { - logger.log("Activating sliding sync"); - } - opts.slidingSync = SlidingSyncManager.instance.configure( - this.matrixClient, - proxyUrl || this.matrixClient.baseUrl, - ); - SlidingSyncManager.instance.startSpidering(100, 50); // 100 rooms at a time, 50ms apart + opts.slidingSync = await SlidingSyncManager.instance.setup(this.matrixClient); + } else { + SlidingSyncManager.instance.checkSupport(this.matrixClient); } // Connect the matrix client to the dispatcher and setting handlers @@ -362,7 +376,7 @@ class MatrixClientPegClass implements IMatrixClientPeg { } } - public async start(): Promise<any> { + public async start(): Promise<void> { const opts = await this.assign(); logger.log(`MatrixClientPeg: really starting MatrixClient`); diff --git a/src/Modal.tsx b/src/Modal.tsx index aa4ba691dc..2ac12d280f 100644 --- a/src/Modal.tsx +++ b/src/Modal.tsx @@ -20,7 +20,7 @@ import ReactDOM from "react-dom"; import classNames from "classnames"; import { defer, sleep } from "matrix-js-sdk/src/utils"; import { TypedEventEmitter } from "matrix-js-sdk/src/matrix"; -import { Glass, TooltipProvider } from "@vector-im/compound-web"; +import { Glass } from "@vector-im/compound-web"; import dis from "./dispatcher/dispatcher"; import AsyncWrapper from "./AsyncWrapper"; @@ -374,18 +374,16 @@ export class ModalManager extends TypedEventEmitter<ModalManagerEvent, HandlerMa const classes = classNames("mx_Dialog_wrapper mx_Dialog_staticWrapper", this.staticModal.className); const staticDialog = ( - <TooltipProvider> - <div className={classes}> - <Glass className="mx_Dialog_border"> - <div className="mx_Dialog">{this.staticModal.elem}</div> - </Glass> - <div - data-testid="dialog-background" - className="mx_Dialog_background mx_Dialog_staticBackground" - onClick={this.onBackgroundClick} - /> - </div> - </TooltipProvider> + <div className={classes}> + <Glass className="mx_Dialog_border"> + <div className="mx_Dialog">{this.staticModal.elem}</div> + </Glass> + <div + data-testid="dialog-background" + className="mx_Dialog_background mx_Dialog_staticBackground" + onClick={this.onBackgroundClick} + /> + </div> ); ReactDOM.render(staticDialog, ModalManager.getOrCreateStaticContainer()); @@ -401,18 +399,16 @@ export class ModalManager extends TypedEventEmitter<ModalManagerEvent, HandlerMa }); const dialog = ( - <TooltipProvider> - <div className={classes}> - <Glass className="mx_Dialog_border"> - <div className="mx_Dialog">{modal.elem}</div> - </Glass> - <div - data-testid="dialog-background" - className="mx_Dialog_background" - onClick={this.onBackgroundClick} - /> - </div> - </TooltipProvider> + <div className={classes}> + <Glass className="mx_Dialog_border"> + <div className="mx_Dialog">{modal.elem}</div> + </Glass> + <div + data-testid="dialog-background" + className="mx_Dialog_background" + onClick={this.onBackgroundClick} + /> + </div> ); setImmediate(() => ReactDOM.render(dialog, ModalManager.getOrCreateContainer())); diff --git a/src/PlaybackEncoder.ts b/src/PlaybackEncoder.ts new file mode 100644 index 0000000000..a08292e01f --- /dev/null +++ b/src/PlaybackEncoder.ts @@ -0,0 +1,34 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// @ts-ignore - `.ts` is needed here to make TS happy +import { Request, Response } from "./workers/playback.worker"; +import { WorkerManager } from "./WorkerManager"; +import playbackWorkerFactory from "./workers/playbackWorkerFactory"; + +export class PlaybackEncoder { + private static internalInstance = new PlaybackEncoder(); + + public static get instance(): PlaybackEncoder { + return PlaybackEncoder.internalInstance; + } + + private readonly worker = new WorkerManager<Request, Response>(playbackWorkerFactory()); + + public getPlaybackWaveform(input: Float32Array): Promise<number[]> { + return this.worker.call({ data: Array.from(input) }).then((resp) => resp.waveform); + } +} diff --git a/src/PosthogAnalytics.ts b/src/PosthogAnalytics.ts index 20c4ff2f33..f8518d925b 100644 --- a/src/PosthogAnalytics.ts +++ b/src/PosthogAnalytics.ts @@ -313,7 +313,7 @@ export class PosthogAnalytics { // No point identifying again return; } - if (this.posthog.persistence?.get_user_state() === "identified") { + if (this.posthog.persistence?.get_property("$user_state") === "identified") { // Analytics ID has changed, reset as Posthog will refuse to merge in this case this.posthog.reset(); } diff --git a/src/SlidingSyncManager.ts b/src/SlidingSyncManager.ts index 5f459c0b9e..c4387e85d6 100644 --- a/src/SlidingSyncManager.ts +++ b/src/SlidingSyncManager.ts @@ -44,7 +44,7 @@ limitations under the License. * list ops) */ -import { MatrixClient, EventType } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, EventType, AutoDiscovery, Method, timeoutSignal } from "matrix-js-sdk/src/matrix"; import { MSC3575Filter, MSC3575List, @@ -56,6 +56,9 @@ import { import { logger } from "matrix-js-sdk/src/logger"; import { defer, sleep } from "matrix-js-sdk/src/utils"; +import SettingsStore from "./settings/SettingsStore"; +import SlidingSyncController from "./settings/controllers/SlidingSyncController"; + // how long to long poll for const SLIDING_SYNC_TIMEOUT_MS = 20 * 1000; @@ -323,4 +326,89 @@ export class SlidingSyncManager { firstTime = false; } } + + /** + * Set up the Sliding Sync instance; configures the end point and starts spidering. + * The sliding sync endpoint is derived the following way: + * 1. The user-defined sliding sync proxy URL (legacy, for backwards compatibility) + * 2. The client `well-known` sliding sync proxy URL [declared at the unstable prefix](https://github.com/matrix-org/matrix-spec-proposals/blob/kegan/sync-v3/proposals/3575-sync.md#unstable-prefix) + * 3. The homeserver base url (for native server support) + * @param client The MatrixClient to use + * @returns A working Sliding Sync or undefined + */ + public async setup(client: MatrixClient): Promise<SlidingSync | undefined> { + const baseUrl = client.baseUrl; + const proxyUrl = SettingsStore.getValue("feature_sliding_sync_proxy_url"); + const wellKnownProxyUrl = await this.getProxyFromWellKnown(client); + + const slidingSyncEndpoint = proxyUrl || wellKnownProxyUrl || baseUrl; + + this.configure(client, slidingSyncEndpoint); + logger.info("Sliding sync activated at", slidingSyncEndpoint); + this.startSpidering(100, 50); // 100 rooms at a time, 50ms apart + + return this.slidingSync; + } + + /** + * Get the sliding sync proxy URL from the client well known + * @param client The MatrixClient to use + * @return The proxy url + */ + public async getProxyFromWellKnown(client: MatrixClient): Promise<string | undefined> { + let proxyUrl: string | undefined; + + try { + const clientWellKnown = await AutoDiscovery.findClientConfig(client.getDomain()!); + proxyUrl = clientWellKnown?.["org.matrix.msc3575.proxy"]?.url; + } catch (e) { + // client.getDomain() is invalid, `AutoDiscovery.findClientConfig` has thrown + } + + if (proxyUrl != undefined) { + logger.log("getProxyFromWellKnown: client well-known declares sliding sync proxy at", proxyUrl); + } + return proxyUrl; + } + + /** + * Check if the server "natively" supports sliding sync (with an unstable endpoint). + * @param client The MatrixClient to use + * @return Whether the "native" (unstable) endpoint is supported + */ + public async nativeSlidingSyncSupport(client: MatrixClient): Promise<boolean> { + // Per https://github.com/matrix-org/matrix-spec-proposals/pull/3575/files#r1589542561 + // `client` can be undefined/null in tests for some reason. + const support = await client?.doesServerSupportUnstableFeature("org.matrix.msc3575"); + if (support) { + logger.log("nativeSlidingSyncSupport: sliding sync advertised as unstable"); + } + return support; + } + + /** + * Check whether our homeserver has sliding sync support, that the endpoint is up, and + * is a sliding sync endpoint. + * + * Sets static member `SlidingSyncController.serverSupportsSlidingSync` + * @param client The MatrixClient to use + */ + public async checkSupport(client: MatrixClient): Promise<void> { + if (await this.nativeSlidingSyncSupport(client)) { + SlidingSyncController.serverSupportsSlidingSync = true; + return; + } + + const proxyUrl = await this.getProxyFromWellKnown(client); + if (proxyUrl != undefined) { + const response = await fetch(new URL("/client/server.json", proxyUrl), { + method: Method.Get, + signal: timeoutSignal(10 * 1000), // 10s + }); + if (response.status === 200) { + logger.log("checkSupport: well-known sliding sync proxy is up at", proxyUrl); + SlidingSyncController.serverSupportsSlidingSync = true; + } + } + } } diff --git a/src/accessibility/context_menu/ContextMenuButton.tsx b/src/accessibility/context_menu/ContextMenuButton.tsx index 6ef6afef37..35dd986f8e 100644 --- a/src/accessibility/context_menu/ContextMenuButton.tsx +++ b/src/accessibility/context_menu/ContextMenuButton.tsx @@ -28,15 +28,15 @@ type Props<T extends keyof JSX.IntrinsicElements> = ComponentProps<typeof Access // Semantic component for representing the AccessibleButton which launches a <ContextMenu /> export const ContextMenuButton = forwardRef(function <T extends keyof JSX.IntrinsicElements>( - { label, isExpanded, children, onClick, onContextMenu, ...props }: Props<T>, + { label, isExpanded, children, onClick, onContextMenu, element, ...props }: Props<T>, ref: Ref<HTMLElement>, ) { return ( <AccessibleButton {...props} + element={element as keyof JSX.IntrinsicElements} onClick={onClick} onContextMenu={onContextMenu ?? onClick ?? undefined} - title={label} aria-label={label} aria-haspopup={true} aria-expanded={isExpanded} diff --git a/src/accessibility/context_menu/ContextMenuTooltipButton.tsx b/src/accessibility/context_menu/ContextMenuTooltipButton.tsx index 3498662760..2ae8a5de9d 100644 --- a/src/accessibility/context_menu/ContextMenuTooltipButton.tsx +++ b/src/accessibility/context_menu/ContextMenuTooltipButton.tsx @@ -27,12 +27,13 @@ type Props<T extends keyof JSX.IntrinsicElements> = ComponentProps<typeof Access // Semantic component for representing the AccessibleButton which launches a <ContextMenu /> export const ContextMenuTooltipButton = forwardRef(function <T extends keyof JSX.IntrinsicElements>( - { isExpanded, children, onClick, onContextMenu, ...props }: Props<T>, + { isExpanded, children, onClick, onContextMenu, element, ...props }: Props<T>, ref: Ref<HTMLElement>, ) { return ( <AccessibleTooltipButton {...props} + element={element as keyof JSX.IntrinsicElements} onClick={onClick} onContextMenu={onContextMenu ?? onClick ?? undefined} aria-haspopup={true} diff --git a/src/accessibility/context_menu/MenuItem.tsx b/src/accessibility/context_menu/MenuItem.tsx index a244602a09..db3c64468b 100644 --- a/src/accessibility/context_menu/MenuItem.tsx +++ b/src/accessibility/context_menu/MenuItem.tsx @@ -18,25 +18,16 @@ limitations under the License. import React from "react"; -import { RovingAccessibleButton, RovingAccessibleTooltipButton } from "../RovingTabIndex"; +import { RovingAccessibleButton } from "../RovingTabIndex"; interface IProps extends React.ComponentProps<typeof RovingAccessibleButton> { label?: string; - tooltip?: string; } // Semantic component for representing a role=menuitem -export const MenuItem: React.FC<IProps> = ({ children, label, tooltip, ...props }) => { +export const MenuItem: React.FC<IProps> = ({ children, label, ...props }) => { const ariaLabel = props["aria-label"] || label; - if (tooltip) { - return ( - <RovingAccessibleTooltipButton {...props} role="menuitem" aria-label={ariaLabel} title={tooltip}> - {children} - </RovingAccessibleTooltipButton> - ); - } - return ( <RovingAccessibleButton {...props} role="menuitem" aria-label={ariaLabel}> {children} diff --git a/src/accessibility/roving/RovingAccessibleButton.tsx b/src/accessibility/roving/RovingAccessibleButton.tsx index 56c9052714..01e126824d 100644 --- a/src/accessibility/roving/RovingAccessibleButton.tsx +++ b/src/accessibility/roving/RovingAccessibleButton.tsx @@ -34,12 +34,14 @@ export const RovingAccessibleButton = <T extends keyof JSX.IntrinsicElements>({ onFocus, onMouseOver, focusOnMouseOver, + element, ...props }: Props<T>): JSX.Element => { const [onFocusInternal, isActive, ref] = useRovingTabIndex(inputRef); return ( <AccessibleButton {...props} + element={element as keyof JSX.IntrinsicElements} onFocus={(event: React.FocusEvent) => { onFocusInternal(); onFocus?.(event); diff --git a/src/accessibility/roving/RovingAccessibleTooltipButton.tsx b/src/accessibility/roving/RovingAccessibleTooltipButton.tsx index 5607089c6e..76927c1773 100644 --- a/src/accessibility/roving/RovingAccessibleTooltipButton.tsx +++ b/src/accessibility/roving/RovingAccessibleTooltipButton.tsx @@ -16,27 +16,26 @@ limitations under the License. import React, { ComponentProps } from "react"; -import AccessibleTooltipButton from "../../components/views/elements/AccessibleTooltipButton"; import { useRovingTabIndex } from "../RovingTabIndex"; import { Ref } from "./types"; +import AccessibleButton from "../../components/views/elements/AccessibleButton"; -type Props<T extends keyof JSX.IntrinsicElements> = Omit< - ComponentProps<typeof AccessibleTooltipButton<T>>, - "tabIndex" -> & { +type Props<T extends keyof JSX.IntrinsicElements> = Omit<ComponentProps<typeof AccessibleButton<T>>, "tabIndex"> & { inputRef?: Ref; }; -// Wrapper to allow use of useRovingTabIndex for simple AccessibleTooltipButtons outside of React Functional Components. +// Wrapper to allow use of useRovingTabIndex for simple AccessibleButtons outside of React Functional Components. export const RovingAccessibleTooltipButton = <T extends keyof JSX.IntrinsicElements>({ inputRef, onFocus, + element, ...props }: Props<T>): JSX.Element => { const [onFocusInternal, isActive, ref] = useRovingTabIndex(inputRef); return ( - <AccessibleTooltipButton + <AccessibleButton {...props} + element={element as keyof JSX.IntrinsicElements} onFocus={(event: React.FocusEvent) => { onFocusInternal(); onFocus?.(event); diff --git a/src/audio/Playback.ts b/src/audio/Playback.ts index dc2619d692..957d541732 100644 --- a/src/audio/Playback.ts +++ b/src/audio/Playback.ts @@ -19,17 +19,14 @@ import { SimpleObservable } from "matrix-widget-api"; import { logger } from "matrix-js-sdk/src/logger"; import { defer } from "matrix-js-sdk/src/utils"; -// @ts-ignore - `.ts` is needed here to make TS happy -import { Request, Response } from "../workers/playback.worker.ts"; import { UPDATE_EVENT } from "../stores/AsyncStore"; import { arrayFastResample } from "../utils/arrays"; import { IDestroyable } from "../utils/IDestroyable"; import { PlaybackClock } from "./PlaybackClock"; import { createAudioContext, decodeOgg } from "./compat"; import { clamp } from "../utils/numbers"; -import { WorkerManager } from "../WorkerManager"; import { DEFAULT_WAVEFORM, PLAYBACK_WAVEFORM_SAMPLES } from "./consts"; -import playbackWorkerFactory from "../workers/playbackWorkerFactory"; +import { PlaybackEncoder } from "../PlaybackEncoder"; export enum PlaybackState { Decoding = "decoding", @@ -64,7 +61,6 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte private waveformObservable = new SimpleObservable<number[]>(); private readonly clock: PlaybackClock; private readonly fileSize: number; - private readonly worker = new WorkerManager<Request, Response>(playbackWorkerFactory()); /** * Creates a new playback instance from a buffer. @@ -209,7 +205,9 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte // Update the waveform to the real waveform once we have channel data to use. We don't // exactly trust the user-provided waveform to be accurate... - this.resampledWaveform = await this.makePlaybackWaveform(this.audioBuf.getChannelData(0)); + this.resampledWaveform = await PlaybackEncoder.instance.getPlaybackWaveform( + this.audioBuf.getChannelData(0), + ); } this.waveformObservable.update(this.resampledWaveform); @@ -222,10 +220,6 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte this.emit(PlaybackState.Stopped); // signal that we're not decoding anymore } - private makePlaybackWaveform(input: Float32Array): Promise<number[]> { - return this.worker.call({ data: Array.from(input) }).then((resp) => resp.waveform); - } - private onPlaybackEnd = async (): Promise<void> => { await this.context.suspend(); this.emit(PlaybackState.Stopped); diff --git a/src/components/structures/ContextMenu.tsx b/src/components/structures/ContextMenu.tsx index 26b52a6e72..0b71c8dd30 100644 --- a/src/components/structures/ContextMenu.tsx +++ b/src/components/structures/ContextMenu.tsx @@ -20,7 +20,6 @@ import React, { CSSProperties, RefObject, SyntheticEvent, useRef, useState } fro import ReactDOM from "react-dom"; import classNames from "classnames"; import FocusLock from "react-focus-lock"; -import { TooltipProvider } from "@vector-im/compound-web"; import { Writeable } from "../../@types/common"; import UIStore from "../../stores/UIStore"; @@ -630,17 +629,15 @@ export function createMenu( }; const menu = ( - <TooltipProvider> - <ContextMenu - {...props} - mountAsChild={true} - hasBackground={false} - onFinished={onFinished} // eslint-disable-line react/jsx-no-bind - windowResize={onFinished} // eslint-disable-line react/jsx-no-bind - > - <ElementClass {...props} onFinished={onFinished} /> - </ContextMenu> - </TooltipProvider> + <ContextMenu + {...props} + mountAsChild={true} + hasBackground={false} + onFinished={onFinished} // eslint-disable-line react/jsx-no-bind + windowResize={onFinished} // eslint-disable-line react/jsx-no-bind + > + <ElementClass {...props} onFinished={onFinished} /> + </ContextMenu> ); ReactDOM.render(menu, getOrCreateContainer()); diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index c2454e04fb..084afdaf8b 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -26,7 +26,6 @@ import { HEADER_HEIGHT } from "../views/rooms/RoomSublist"; import { Action } from "../../dispatcher/actions"; import RoomSearch from "./RoomSearch"; import ResizeNotifier from "../../utils/ResizeNotifier"; -import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; import SpaceStore from "../../stores/spaces/SpaceStore"; import { MetaSpace, SpaceKey, UPDATE_SELECTED_SPACE } from "../../stores/spaces"; import { getKeyBindingsManager } from "../../KeyBindingsManager"; @@ -41,7 +40,7 @@ import RoomBreadcrumbs from "../views/rooms/RoomBreadcrumbs"; import { KeyBindingAction } from "../../accessibility/KeyboardShortcuts"; import { shouldShowComponent } from "../../customisations/helpers/UIComponents"; import { UIComponent } from "../../settings/UIFeature"; -import { ButtonEvent } from "../views/elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton"; import PosthogTrackers from "../../PosthogTrackers"; import PageType from "../../PageTypes"; import { UserOnboardingButton } from "../views/user-onboarding/UserOnboardingButton"; @@ -333,7 +332,7 @@ export default class LeftPanel extends React.Component<IProps, IState> { // to start a new call if (LegacyCallHandler.instance.getSupportsPstnProtocol()) { dialPadButton = ( - <AccessibleTooltipButton + <AccessibleButton className={classNames("mx_LeftPanel_dialPadButton", {})} onClick={this.onDialPad} title={_t("left_panel|open_dial_pad")} @@ -344,7 +343,7 @@ export default class LeftPanel extends React.Component<IProps, IState> { let rightButton: JSX.Element | undefined; if (this.state.activeSpace === MetaSpace.Home && shouldShowComponent(UIComponent.ExploreRooms)) { rightButton = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_LeftPanel_exploreButton" onClick={this.onExplore} title={_t("action|explore_rooms")} diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 9cb455d236..db10dd515b 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -32,9 +32,7 @@ import { defer, IDeferred, QueryDict } from "matrix-js-sdk/src/utils"; import { logger } from "matrix-js-sdk/src/logger"; import { throttle } from "lodash"; import { CryptoEvent } from "matrix-js-sdk/src/crypto"; -import { DecryptionError } from "matrix-js-sdk/src/crypto/algorithms"; import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup"; -import { TooltipProvider } from "@vector-im/compound-web"; // what-input helps improve keyboard accessibility import "what-input"; @@ -1599,7 +1597,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { // When logging out, stop tracking failures and destroy state cli.on(HttpApiEvent.SessionLoggedOut, () => dft.stop()); - cli.on(MatrixEventEvent.Decrypted, (e, err) => dft.eventDecrypted(e, err as DecryptionError)); + cli.on(MatrixEventEvent.Decrypted, (e) => dft.eventDecrypted(e)); cli.on(ClientEvent.Room, (room) => { if (cli.isCryptoEnabled()) { @@ -2148,9 +2146,7 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> { return ( <ErrorBoundary> - <SDKContext.Provider value={this.stores}> - <TooltipProvider>{view}</TooltipProvider> - </SDKContext.Provider> + <SDKContext.Provider value={this.stores}>{view}</SDKContext.Provider> </ErrorBoundary> ); } diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index 41c2bd139e..fd82b410a7 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -15,7 +15,6 @@ limitations under the License. */ import React, { - ComponentProps, Dispatch, KeyboardEvent, KeyboardEventHandler, @@ -62,7 +61,6 @@ import InfoTooltip from "../views/elements/InfoTooltip"; import TextWithTooltip from "../views/elements/TextWithTooltip"; import { useStateToggle } from "../../hooks/useStateToggle"; import { getChildOrder } from "../../stores/spaces/SpaceStore"; -import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; import { Linkify, topicToHtml } from "../../HtmlUtils"; import { useDispatcher } from "../../hooks/useDispatcher"; import { Action } from "../../dispatcher/actions"; @@ -75,7 +73,6 @@ import { ViewRoomPayload } from "../../dispatcher/payloads/ViewRoomPayload"; import { JoinRoomReadyPayload } from "../../dispatcher/payloads/JoinRoomReadyPayload"; import { KeyBindingAction } from "../../accessibility/KeyboardShortcuts"; import { getKeyBindingsManager } from "../../KeyBindingsManager"; -import { Alignment } from "../views/elements/Tooltip"; import { getTopic } from "../../hooks/room/useTopic"; import { SdkContextClass } from "../../contexts/SDKContext"; import { getDisplayAliasForAliasSet } from "../../Rooms"; @@ -148,7 +145,7 @@ const Tile: React.FC<ITileProps> = ({ let button: ReactElement; if (busy) { button = ( - <AccessibleTooltipButton + <AccessibleButton disabled={true} onClick={onJoinClick} kind="primary_outline" @@ -157,7 +154,7 @@ const Tile: React.FC<ITileProps> = ({ title={_t("space|joining_space")} > <Spinner w={24} h={24} /> - </AccessibleTooltipButton> + </AccessibleButton> ); } else if (joinedRoom || room.join_rule === JoinRule.Knock) { // If the room is knockable, show the "View" button even if we are not a member; that @@ -670,25 +667,16 @@ const ManageButtons: React.FC<IManageButtonsProps> = ({ hierarchy, selected, set const disabled = !selectedRelations.length || removing || saving; - let Button: React.ComponentType<React.ComponentProps<typeof AccessibleButton>> = AccessibleButton; - let props: Partial<ComponentProps<typeof AccessibleTooltipButton>> = {}; - if (!selectedRelations.length) { - Button = AccessibleTooltipButton; - props = { - tooltip: _t("space|select_room_below"), - alignment: Alignment.Top, - }; - } - let buttonText = _t("common|saving"); if (!saving) { buttonText = selectionAllSuggested ? _t("space|unmark_suggested") : _t("space|mark_suggested"); } + const title = !selectedRelations.length ? _t("space|select_room_below") : undefined; + return ( <> - <Button - {...props} + <AccessibleButton onClick={async (): Promise<void> => { setRemoving(true); try { @@ -719,11 +707,13 @@ const ManageButtons: React.FC<IManageButtonsProps> = ({ hierarchy, selected, set }} kind="danger_outline" disabled={disabled} + aria-label={removing ? _t("redact|ongoing") : _t("action|remove")} + title={title} + placement="top" > {removing ? _t("redact|ongoing") : _t("action|remove")} - </Button> - <Button - {...props} + </AccessibleButton> + <AccessibleButton onClick={async (): Promise<void> => { setSaving(true); try { @@ -750,9 +740,12 @@ const ManageButtons: React.FC<IManageButtonsProps> = ({ hierarchy, selected, set }} kind="primary_outline" disabled={disabled} + aria-label={buttonText} + title={title} + placement="top" > {buttonText} - </Button> + </AccessibleButton> </> ); }; diff --git a/src/components/structures/SpaceRoomView.tsx b/src/components/structures/SpaceRoomView.tsx index edc857edaf..a71970c08d 100644 --- a/src/components/structures/SpaceRoomView.tsx +++ b/src/components/structures/SpaceRoomView.tsx @@ -60,7 +60,6 @@ import { defaultRoomsRenderer, } from "../views/dialogs/AddExistingToSpaceDialog"; import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton"; -import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; import ErrorBoundary from "../views/elements/ErrorBoundary"; import Field from "../views/elements/Field"; import RoomFacePile from "../views/elements/RoomFacePile"; @@ -248,7 +247,7 @@ const SpaceLanding: React.FC<{ space: Room }> = ({ space }) => { let settingsButton; if (shouldShowSpaceSettings(space)) { settingsButton = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_SpaceRoomView_landing_settingsButton" onClick={() => { showSpaceSettings(space); diff --git a/src/components/structures/TabbedView.tsx b/src/components/structures/TabbedView.tsx index 61e34d2d0d..c745d9cf5d 100644 --- a/src/components/structures/TabbedView.tsx +++ b/src/components/structures/TabbedView.tsx @@ -1,7 +1,7 @@ /* Copyright 2017 Travis Ralston Copyright 2019 New Vector Ltd -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020, 2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ limitations under the License. import * as React from "react"; import classNames from "classnames"; -import { logger } from "matrix-js-sdk/src/logger"; import { _t, TranslationKey } from "../../languageHandler"; import AutoHideScrollbar from "./AutoHideScrollbar"; @@ -47,138 +46,153 @@ export class Tab<T extends string> { ) {} } +export function useActiveTabWithDefault<T extends string>( + tabs: NonEmptyArray<Tab<string>>, + defaultTabID: T, + initialTabID?: T, +): [T, (tabId: T) => void] { + const [activeTabId, setActiveTabId] = React.useState( + initialTabID && tabs.some((t) => t.id === initialTabID) ? initialTabID : defaultTabID, + ); + + return [activeTabId, setActiveTabId]; +} + export enum TabLocation { LEFT = "left", TOP = "top", } -interface IProps<T extends string> { - tabs: NonEmptyArray<Tab<T>>; - initialTabId?: T; - tabLocation: TabLocation; - onChange?: (tabId: T) => void; - screenName?: ScreenName; +interface ITabPanelProps<T extends string> { + tab: Tab<T>; } -interface IState<T extends string> { - activeTabId: T; +function domIDForTabID(tabId: string): string { + return `mx_tabpanel_${tabId}`; } -export default class TabbedView<T extends string> extends React.Component<IProps<T>, IState<T>> { - public constructor(props: IProps<T>) { - super(props); +function TabPanel<T extends string>({ tab }: ITabPanelProps<T>): JSX.Element { + return ( + <div + className="mx_TabbedView_tabPanel" + key={tab.id} + id={domIDForTabID(tab.id)} + aria-labelledby={`${domIDForTabID(tab.id)}_label`} + > + <AutoHideScrollbar className="mx_TabbedView_tabPanelContent">{tab.body}</AutoHideScrollbar> + </div> + ); +} - const initialTabIdIsValid = props.tabs.find((tab) => tab.id === props.initialTabId); - this.state = { - activeTabId: initialTabIdIsValid ? props.initialTabId! : props.tabs[0].id, - }; - } +interface ITabLabelProps<T extends string> { + tab: Tab<T>; + isActive: boolean; + onClick: () => void; +} - public static defaultProps = { - tabLocation: TabLocation.LEFT, - }; +function TabLabel<T extends string>({ tab, isActive, onClick }: ITabLabelProps<T>): JSX.Element { + const classes = classNames("mx_TabbedView_tabLabel", { + mx_TabbedView_tabLabel_active: isActive, + }); - private getTabById(id: T): Tab<T> | undefined { - return this.props.tabs.find((tab) => tab.id === id); + let tabIcon: JSX.Element | undefined; + if (tab.icon) { + tabIcon = <span className={`mx_TabbedView_maskedIcon ${tab.icon}`} />; } + const id = domIDForTabID(tab.id); + + const label = _t(tab.label); + return ( + <RovingAccessibleButton + className={classes} + onClick={onClick} + data-testid={`settings-tab-${tab.id}`} + role="tab" + aria-selected={isActive} + aria-controls={id} + element="li" + > + {tabIcon} + <span className="mx_TabbedView_tabLabel_text" id={`${id}_label`}> + {label} + </span> + </RovingAccessibleButton> + ); +} + +interface IProps<T extends string> { + // An array of objects representign tabs that the tabbed view will display. + tabs: NonEmptyArray<Tab<T>>; + // The ID of the tab to show + activeTabId: T; + // The location of the tabs, dictating the layout of the TabbedView. + tabLocation?: TabLocation; + // A callback that is called when the active tab should change + onChange: (tabId: T) => void; + // The screen name to report to Posthog. + screenName?: ScreenName; /** - * Shows the given tab - * @param {Tab} tab the tab to show - * @private + * If true, the layout of the tabbed view will be responsive to the viewport size (eg, just showing icons + * instead of names of tabs). + * Only applies if `tabLocation === TabLocation.LEFT`. + * Default: false. */ - private setActiveTab(tab: Tab<T>): void { - // make sure this tab is still in available tabs - if (!!this.getTabById(tab.id)) { - if (this.props.onChange) this.props.onChange(tab.id); - this.setState({ activeTabId: tab.id }); - } else { - logger.error("Could not find tab " + tab.label + " in tabs"); - } - } - - private renderTabLabel(tab: Tab<T>): JSX.Element { - const isActive = this.state.activeTabId === tab.id; - const classes = classNames("mx_TabbedView_tabLabel", { - mx_TabbedView_tabLabel_active: isActive, - }); - - let tabIcon: JSX.Element | undefined; - if (tab.icon) { - tabIcon = <span className={`mx_TabbedView_maskedIcon ${tab.icon}`} />; - } - - const onClickHandler = (): void => this.setActiveTab(tab); - const id = this.getTabId(tab); - - const label = _t(tab.label); - return ( - <RovingAccessibleButton - className={classes} - key={"tab_label_" + tab.label} - onClick={onClickHandler} - data-testid={`settings-tab-${tab.id}`} - role="tab" - aria-selected={isActive} - aria-controls={id} - element="li" - > - {tabIcon} - <span className="mx_TabbedView_tabLabel_text" id={`${id}_label`}> - {label} - </span> - </RovingAccessibleButton> - ); - } + responsive?: boolean; +} - private getTabId(tab: Tab<T>): string { - return `mx_tabpanel_${tab.id}`; - } +/** + * A tabbed view component. Given objects representing content with titles, displays + * them in a tabbed view where the user can select which one of the items to view at once. + */ +export default function TabbedView<T extends string>(props: IProps<T>): JSX.Element { + const tabLocation = props.tabLocation ?? TabLocation.LEFT; - private renderTabPanel(tab: Tab<T>): React.ReactNode { - const id = this.getTabId(tab); - return ( - <div className="mx_TabbedView_tabPanel" key={id} id={id} aria-labelledby={`${id}_label`}> - <AutoHideScrollbar className="mx_TabbedView_tabPanelContent">{tab.body}</AutoHideScrollbar> - </div> - ); - } + const getTabById = (id: T): Tab<T> | undefined => { + return props.tabs.find((tab) => tab.id === id); + }; - public render(): React.ReactNode { - const labels = this.props.tabs.map((tab) => this.renderTabLabel(tab)); - const tab = this.getTabById(this.state.activeTabId); - const panel = tab ? this.renderTabPanel(tab) : null; - - const tabbedViewClasses = classNames({ - mx_TabbedView: true, - mx_TabbedView_tabsOnLeft: this.props.tabLocation == TabLocation.LEFT, - mx_TabbedView_tabsOnTop: this.props.tabLocation == TabLocation.TOP, - }); - - const screenName = tab?.screenName ?? this.props.screenName; - - return ( - <div className={tabbedViewClasses}> - {screenName && <PosthogScreenTracker screenName={screenName} />} - <RovingTabIndexProvider - handleLoop - handleHomeEnd - handleLeftRight={this.props.tabLocation == TabLocation.TOP} - handleUpDown={this.props.tabLocation == TabLocation.LEFT} - > - {({ onKeyDownHandler }) => ( - <ul - className="mx_TabbedView_tabLabels" - role="tablist" - aria-orientation={this.props.tabLocation == TabLocation.LEFT ? "vertical" : "horizontal"} - onKeyDown={onKeyDownHandler} - > - {labels} - </ul> - )} - </RovingTabIndexProvider> - {panel} - </div> - ); - } + const labels = props.tabs.map((tab) => ( + <TabLabel + key={"tab_label_" + tab.id} + tab={tab} + isActive={tab.id === props.activeTabId} + onClick={() => props.onChange(tab.id)} + /> + )); + const tab = getTabById(props.activeTabId); + const panel = tab ? <TabPanel tab={tab} /> : null; + + const tabbedViewClasses = classNames({ + mx_TabbedView: true, + mx_TabbedView_tabsOnLeft: tabLocation == TabLocation.LEFT, + mx_TabbedView_tabsOnTop: tabLocation == TabLocation.TOP, + mx_TabbedView_responsive: props.responsive, + }); + + const screenName = tab?.screenName ?? props.screenName; + + return ( + <div className={tabbedViewClasses}> + {screenName && <PosthogScreenTracker screenName={screenName} />} + <RovingTabIndexProvider + handleLoop + handleHomeEnd + handleLeftRight={tabLocation == TabLocation.TOP} + handleUpDown={tabLocation == TabLocation.LEFT} + > + {({ onKeyDownHandler }) => ( + <ul + className="mx_TabbedView_tabLabels" + role="tablist" + aria-orientation={tabLocation == TabLocation.LEFT ? "vertical" : "horizontal"} + onKeyDown={onKeyDownHandler} + > + {labels} + </ul> + )} + </RovingTabIndexProvider> + {panel} + </div> + ); } diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index ba3c4d203b..45198fff74 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -39,8 +39,7 @@ import { ThreadEvent, ReceiptType, } from "matrix-js-sdk/src/matrix"; -import { KnownMembership, Membership } from "matrix-js-sdk/src/types"; -import { debounce, findLastIndex, throttle } from "lodash"; +import { debounce, findLastIndex } from "lodash"; import { logger } from "matrix-js-sdk/src/logger"; import SettingsStore from "../../settings/SettingsStore"; @@ -54,7 +53,6 @@ import dis from "../../dispatcher/dispatcher"; import { Action } from "../../dispatcher/actions"; import Timer from "../../utils/Timer"; import shouldHideEvent from "../../shouldHideEvent"; -import { arrayFastClone } from "../../utils/arrays"; import MessagePanel from "./MessagePanel"; import { IScrollState } from "./ScrollPanel"; import { ActionPayload } from "../../dispatcher/payloads"; @@ -177,9 +175,6 @@ interface IState { // track whether our room timeline is loading timelineLoading: boolean; - // the index of the first event that is to be shown - firstVisibleEventIndex: number; - // canBackPaginate == false may mean: // // * we haven't (successfully) loaded the timeline yet, or: @@ -297,7 +292,6 @@ class TimelinePanel extends React.Component<IProps, IState> { events: [], liveEvents: [], timelineLoading: true, - firstVisibleEventIndex: 0, canBackPaginate: false, canForwardPaginate: false, readMarkerVisible: true, @@ -569,12 +563,11 @@ class TimelinePanel extends React.Component<IProps, IState> { this.overlayTimelineWindow!.unpaginate(overlayCount, backwards); } - const { events, liveEvents, firstVisibleEventIndex } = this.getEvents(); + const { events, liveEvents } = this.getEvents(); this.buildLegacyCallEventGroupers(events); this.setState({ events, liveEvents, - firstVisibleEventIndex, }); // We can now paginate in the unpaginated direction @@ -618,11 +611,6 @@ class TimelinePanel extends React.Component<IProps, IState> { return Promise.resolve(false); } - if (backwards && this.state.firstVisibleEventIndex !== 0) { - debuglog("won't", dir, "paginate past first visible event"); - return Promise.resolve(false); - } - debuglog("Initiating paginate; backwards:" + backwards); this.setState({ [paginatingKey]: true } as Pick<IState, PaginatingKey>); @@ -637,15 +625,14 @@ class TimelinePanel extends React.Component<IProps, IState> { debuglog("paginate complete backwards:" + backwards + "; success:" + r); - const { events, liveEvents, firstVisibleEventIndex } = this.getEvents(); + const { events, liveEvents } = this.getEvents(); this.buildLegacyCallEventGroupers(events); const newState = { [paginatingKey]: false, [canPaginateKey]: r, events, liveEvents, - firstVisibleEventIndex, - } as Pick<IState, PaginatingKey | CanPaginateKey | "events" | "liveEvents" | "firstVisibleEventIndex">; + } as Pick<IState, PaginatingKey | CanPaginateKey | "events" | "liveEvents">; // moving the window in this direction may mean that we can now // paginate in the other where we previously could not. @@ -663,11 +650,9 @@ class TimelinePanel extends React.Component<IProps, IState> { // itself into the right place return new Promise((resolve) => { this.setState(newState, () => { - // we can continue paginating in the given direction if: - // - timelineWindow.paginate says we can - // - we're paginating forwards, or we won't be trying to - // paginate backwards past the first visible event - resolve(r && (!backwards || firstVisibleEventIndex === 0)); + // we can continue paginating in the given direction if + // timelineWindow.paginate says we can + resolve(r); }); }); }); @@ -783,14 +768,13 @@ class TimelinePanel extends React.Component<IProps, IState> { return; } - const { events, liveEvents, firstVisibleEventIndex } = this.getEvents(); + const { events, liveEvents } = this.getEvents(); this.buildLegacyCallEventGroupers(events); const lastLiveEvent = liveEvents[liveEvents.length - 1]; const updatedState: Partial<IState> = { events, liveEvents, - firstVisibleEventIndex, }; let callRMUpdated = false; @@ -968,8 +952,6 @@ class TimelinePanel extends React.Component<IProps, IState> { if (!this.state.events.includes(ev)) return; - this.recheckFirstVisibleEventIndex(); - // Need to update as we don't display event tiles for events that // haven't yet been decrypted. The event will have just been updated // in place so we just need to re-render. @@ -985,17 +967,6 @@ class TimelinePanel extends React.Component<IProps, IState> { this.setState({ clientSyncState }); }; - private recheckFirstVisibleEventIndex = throttle( - (): void => { - const firstVisibleEventIndex = this.checkForPreJoinUISI(this.state.events); - if (firstVisibleEventIndex !== this.state.firstVisibleEventIndex) { - this.setState({ firstVisibleEventIndex }); - } - }, - 500, - { leading: true, trailing: true }, - ); - private readMarkerTimeout(readMarkerPosition: number | null): number { return readMarkerPosition === 0 ? this.context?.readMarkerInViewThresholdMs ?? this.state.readMarkerInViewThresholdMs @@ -1722,7 +1693,7 @@ class TimelinePanel extends React.Component<IProps, IState> { } // get the list of events from the timeline windows and the pending event list - private getEvents(): Pick<IState, "events" | "liveEvents" | "firstVisibleEventIndex"> { + private getEvents(): Pick<IState, "events" | "liveEvents"> { const mainEvents = this.timelineWindow!.getEvents(); let overlayEvents = this.overlayTimelineWindow?.getEvents() ?? []; if (this.props.overlayTimelineSetFilter !== undefined) { @@ -1754,17 +1725,11 @@ class TimelinePanel extends React.Component<IProps, IState> { [...mainEvents], ); - // `arrayFastClone` performs a shallow copy of the array - // we want the last event to be decrypted first but displayed last - // `reverse` is destructive and unfortunately mutates the "events" array - arrayFastClone(events) - .reverse() - .forEach((event) => { - const client = MatrixClientPeg.safeGet(); - client.decryptEventIfNeeded(event); - }); - - const firstVisibleEventIndex = this.checkForPreJoinUISI(events); + // We want the last event to be decrypted first + const client = MatrixClientPeg.safeGet(); + for (let i = events.length - 1; i >= 0; --i) { + client.decryptEventIfNeeded(events[i]); + } // Hold onto the live events separately. The read receipt and read marker // should use this list, so that they don't advance into pending events. @@ -1793,87 +1758,9 @@ class TimelinePanel extends React.Component<IProps, IState> { return { events, liveEvents, - firstVisibleEventIndex, }; } - /** - * Check for undecryptable messages that were sent while the user was not in - * the room. - * - * @param {Array<MatrixEvent>} events The timeline events to check - * - * @return {Number} The index within `events` of the event after the most recent - * undecryptable event that was sent while the user was not in the room. If no - * such events were found, then it returns 0. - */ - private checkForPreJoinUISI(events: MatrixEvent[]): number { - const cli = MatrixClientPeg.safeGet(); - const room = this.props.timelineSet.room; - - const isThreadTimeline = [TimelineRenderingType.Thread, TimelineRenderingType.ThreadsList].includes( - this.context.timelineRenderingType, - ); - if (events.length === 0 || !room || !cli.isRoomEncrypted(room.roomId) || isThreadTimeline) { - logger.debug("checkForPreJoinUISI: showing all messages, skipping check"); - return 0; - } - - const userId = cli.getSafeUserId(); - - // get the user's membership at the last event by getting the timeline - // that the event belongs to, and traversing the timeline looking for - // that event, while keeping track of the user's membership - let i = events.length - 1; - let userMembership: Membership = KnownMembership.Leave; - for (; i >= 0; i--) { - const timeline = this.props.timelineSet.getTimelineForEvent(events[i].getId()!); - if (!timeline) { - // Somehow, it seems to be possible for live events to not have - // a timeline, even though that should not happen. :( - // https://github.com/vector-im/element-web/issues/12120 - logger.warn( - `Event ${events[i].getId()} in room ${room.roomId} is live, ` + `but it does not have a timeline`, - ); - continue; - } - - userMembership = - timeline.getState(EventTimeline.FORWARDS)?.getMember(userId)?.membership ?? KnownMembership.Leave; - const timelineEvents = timeline.getEvents(); - for (let j = timelineEvents.length - 1; j >= 0; j--) { - const event = timelineEvents[j]; - if (event.getId() === events[i].getId()) { - break; - } else if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) { - userMembership = event.getPrevContent().membership || KnownMembership.Leave; - } - } - break; - } - - // now go through the rest of the events and find the first undecryptable - // one that was sent when the user wasn't in the room - for (; i >= 0; i--) { - const event = events[i]; - if (event.getStateKey() === userId && event.getType() === EventType.RoomMember) { - userMembership = event.getPrevContent().membership || KnownMembership.Leave; - } else if ( - userMembership === KnownMembership.Leave && - (event.isDecryptionFailure() || event.isBeingDecrypted()) - ) { - // reached an undecryptable message when the user wasn't in the room -- don't try to load any more - // Note: for now, we assume that events that are being decrypted are - // not decryptable - we will be called once more when it is decrypted. - logger.debug("checkForPreJoinUISI: reached a pre-join UISI at index ", i); - return i + 1; - } - } - - logger.debug("checkForPreJoinUISI: did not find pre-join UISI"); - return 0; - } - private indexForEventId(evId: string | null): number | null { if (evId === null) { return null; @@ -2124,9 +2011,7 @@ class TimelinePanel extends React.Component<IProps, IState> { // the HS and fetch the latest events, so we are effectively forward paginating. const forwardPaginating = this.state.forwardPaginating || ["PREPARED", "CATCHUP"].includes(this.state.clientSyncState!); - const events = this.state.firstVisibleEventIndex - ? this.state.events.slice(this.state.firstVisibleEventIndex) - : this.state.events; + const events = this.state.events; return ( <MessagePanel ref={this.messagePanel} @@ -2139,7 +2024,7 @@ class TimelinePanel extends React.Component<IProps, IState> { highlightedEventId={this.props.highlightedEventId} readMarkerEventId={this.state.readMarkerEventId} readMarkerVisible={this.state.readMarkerVisible} - canBackPaginate={this.state.canBackPaginate && this.state.firstVisibleEventIndex === 0} + canBackPaginate={this.state.canBackPaginate} showUrlPreview={this.props.showUrlPreview} showReadReceipts={this.props.showReadReceipts} ourUserId={MatrixClientPeg.safeGet().getSafeUserId()} diff --git a/src/components/structures/auth/forgot-password/CheckEmail.tsx b/src/components/structures/auth/forgot-password/CheckEmail.tsx index d9d9c4ca80..af3e6cf216 100644 --- a/src/components/structures/auth/forgot-password/CheckEmail.tsx +++ b/src/components/structures/auth/forgot-password/CheckEmail.tsx @@ -66,7 +66,7 @@ export const CheckEmail: React.FC<CheckEmailProps> = ({ <input onClick={onSubmitForm} type="button" className="mx_Login_submit" value={_t("action|next")} /> <div className="mx_AuthBody_did-not-receive"> <span className="mx_VerifyEMailDialog_text-light">{_t("auth|check_email_resend_prompt")}</span> - <Tooltip label={_t("auth|check_email_resend_tooltip")} side="top" open={tooltipVisible}> + <Tooltip label={_t("auth|check_email_resend_tooltip")} placement="top" open={tooltipVisible}> <AccessibleButton className="mx_AuthBody_resend-button" kind="link" onClick={onResendClickFn}> <RetryIcon className="mx_Icon mx_Icon_16" /> {_t("action|resend")} diff --git a/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx b/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx index 11ede00340..fd461ddc5d 100644 --- a/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx +++ b/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx @@ -65,7 +65,7 @@ export const VerifyEmailModal: React.FC<Props> = ({ <div className="mx_AuthBody_did-not-receive"> <span className="mx_VerifyEMailDialog_text-light">{_t("auth|check_email_resend_prompt")}</span> - <Tooltip label={_t("auth|check_email_resend_tooltip")} side="top" open={tooltipVisible}> + <Tooltip label={_t("auth|check_email_resend_tooltip")} placement="top" open={tooltipVisible}> <AccessibleButton className="mx_AuthBody_resend-button" kind="link" onClick={onResendClickFn}> <RetryIcon className="mx_Icon mx_Icon_16" /> {_t("action|resend")} diff --git a/src/components/views/audio_messages/PlayPauseButton.tsx b/src/components/views/audio_messages/PlayPauseButton.tsx index 63f266fbf7..c49fd2e74c 100644 --- a/src/components/views/audio_messages/PlayPauseButton.tsx +++ b/src/components/views/audio_messages/PlayPauseButton.tsx @@ -17,14 +17,11 @@ limitations under the License. import React, { ComponentProps, ReactNode } from "react"; import classNames from "classnames"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { _t } from "../../../languageHandler"; import { Playback, PlaybackState } from "../../../audio/Playback"; +import AccessibleButton from "../elements/AccessibleButton"; -type Props = Omit< - ComponentProps<typeof AccessibleTooltipButton>, - "title" | "onClick" | "disabled" | "element" | "ref" -> & { +type Props = Omit<ComponentProps<typeof AccessibleButton>, "title" | "onClick" | "disabled" | "element" | "ref"> & { // Playback instance to manipulate. Cannot change during the component lifecycle. playback: Playback; @@ -61,7 +58,7 @@ export default class PlayPauseButton extends React.PureComponent<Props> { }); return ( - <AccessibleTooltipButton + <AccessibleButton data-testid="play-pause-button" className={classes} title={isPlaying ? _t("action|pause") : _t("action|play")} diff --git a/src/components/views/auth/LoginWithQR-types.ts b/src/components/views/auth/LoginWithQR-types.ts new file mode 100644 index 0000000000..33f709d79c --- /dev/null +++ b/src/components/views/auth/LoginWithQR-types.ts @@ -0,0 +1,43 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** + * The intention of this enum is to have a mode that scans a QR code instead of generating one. + */ +export enum Mode { + /** + * A QR code with be generated and shown + */ + Show = "show", +} + +export enum Phase { + Loading, + ShowingQR, + Connecting, + Connected, + WaitingForDevice, + Verifying, + Error, +} + +export enum Click { + Cancel, + Decline, + Approve, + TryAgain, + Back, +} diff --git a/src/components/views/auth/LoginWithQR.tsx b/src/components/views/auth/LoginWithQR.tsx index 1e2efb5106..68060f9f28 100644 --- a/src/components/views/auth/LoginWithQR.tsx +++ b/src/components/views/auth/LoginWithQR.tsx @@ -24,34 +24,7 @@ import { HTTPError, MatrixClient } from "matrix-js-sdk/src/matrix"; import { _t } from "../../../languageHandler"; import { wrapRequestWithDialog } from "../../../utils/UserInteractiveAuth"; import LoginWithQRFlow from "./LoginWithQRFlow"; - -/** - * The intention of this enum is to have a mode that scans a QR code instead of generating one. - */ -export enum Mode { - /** - * A QR code with be generated and shown - */ - Show = "show", -} - -export enum Phase { - Loading, - ShowingQR, - Connecting, - Connected, - WaitingForDevice, - Verifying, - Error, -} - -export enum Click { - Cancel, - Decline, - Approve, - TryAgain, - Back, -} +import { Click, Mode, Phase } from "./LoginWithQR-types"; interface IProps { client: MatrixClient; @@ -73,6 +46,10 @@ export enum LoginWithQRFailureReason { export type FailureReason = RendezvousFailureReason | LoginWithQRFailureReason; +// n.b MSC3886/MSC3903/MSC3906 that this is based on are now closed. +// However, we want to keep this implementation around for some time. +// TODO: define an end-of-life date for this implementation. + /** * A component that allows sign in and E2EE set up with a QR code. * diff --git a/src/components/views/auth/LoginWithQRFlow.tsx b/src/components/views/auth/LoginWithQRFlow.tsx index 05c8d95c42..6a6b78a29b 100644 --- a/src/components/views/auth/LoginWithQRFlow.tsx +++ b/src/components/views/auth/LoginWithQRFlow.tsx @@ -1,5 +1,5 @@ /* -Copyright 2022 The Matrix.org Foundation C.I.C. +Copyright 2022 - 2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,19 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from "react"; -import { RendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; +import React, { ReactNode } from "react"; +import { RendezvousFailureReason as LegacyRendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; import { Icon as ChevronLeftIcon } from "@vector-im/compound-design-tokens/icons/chevron-left.svg"; +import { Icon as CheckCircleSolidIcon } from "@vector-im/compound-design-tokens/icons/check-circle-solid.svg"; +import { Icon as ErrorIcon } from "@vector-im/compound-design-tokens/icons/error.svg"; +import { Heading, Text } from "@vector-im/compound-web"; +import classNames from "classnames"; import { _t } from "../../../languageHandler"; import AccessibleButton from "../elements/AccessibleButton"; import QRCode from "../elements/QRCode"; import Spinner from "../elements/Spinner"; import { Icon as InfoIcon } from "../../../../res/img/element-icons/i.svg"; -import { Click, FailureReason, LoginWithQRFailureReason, Phase } from "./LoginWithQR"; +import { Click, Phase } from "./LoginWithQR-types"; import SdkConfig from "../../../SdkConfig"; +import { FailureReason, LoginWithQRFailureReason } from "./LoginWithQR"; -interface IProps { +interface Props { phase: Phase; code?: string; onClick(type: Click): Promise<void>; @@ -34,13 +39,17 @@ interface IProps { confirmationDigits?: string; } +// n.b MSC3886/MSC3903/MSC3906 that this is based on are now closed. +// However, we want to keep this implementation around for some time. +// TODO: define an end-of-life date for this implementation. + /** * A component that implements the UI for sign in and E2EE set up with a QR code. * * This uses the unstable feature of MSC3906: https://github.com/matrix-org/matrix-spec-proposals/pull/3906 */ -export default class LoginWithQRFlow extends React.Component<IProps> { - public constructor(props: IProps) { +export default class LoginWithQRFlow extends React.Component<Props> { + public constructor(props: Props) { super(props); } @@ -72,49 +81,75 @@ export default class LoginWithQRFlow extends React.Component<IProps> { let main: JSX.Element | undefined; let buttons: JSX.Element | undefined; let backButton = true; - let cancellationMessage: string | undefined; - let centreTitle = false; + let className = ""; switch (this.props.phase) { - case Phase.Error: + case Phase.Error: { + let success = false; + let title: string | undefined; + let message: ReactNode | undefined; + switch (this.props.failureReason) { - case RendezvousFailureReason.Expired: - cancellationMessage = _t("auth|qr_code_login|error_linking_incomplete"); - break; - case RendezvousFailureReason.InvalidCode: - cancellationMessage = _t("auth|qr_code_login|error_invalid_scanned_code"); + case LegacyRendezvousFailureReason.UnsupportedAlgorithm: + case LegacyRendezvousFailureReason.UnsupportedTransport: + case LegacyRendezvousFailureReason.HomeserverLacksSupport: + title = _t("auth|qr_code_login|error_unsupported_protocol_title"); + message = _t("auth|qr_code_login|error_unsupported_protocol"); break; - case RendezvousFailureReason.UnsupportedAlgorithm: - cancellationMessage = _t("auth|qr_code_login|error_device_unsupported"); + + case LegacyRendezvousFailureReason.UserCancelled: + title = _t("auth|qr_code_login|error_user_cancelled_title"); + message = _t("auth|qr_code_login|error_user_cancelled"); break; - case RendezvousFailureReason.UserDeclined: - cancellationMessage = _t("auth|qr_code_login|error_request_declined"); + + case LegacyRendezvousFailureReason.Expired: + title = _t("auth|qr_code_login|error_expired_title"); + message = _t("auth|qr_code_login|error_expired"); break; - case RendezvousFailureReason.OtherDeviceAlreadySignedIn: - cancellationMessage = _t("auth|qr_code_login|error_device_already_signed_in"); + + case LegacyRendezvousFailureReason.InvalidCode: + title = _t("auth|qr_code_login|error_insecure_channel_detected_title"); + message = ( + <> + {_t("auth|qr_code_login|error_insecure_channel_detected")} + + <Text as="h2" size="lg" weight="semibold" data-testid="cancellation-message"> + {_t("auth|qr_code_login|error_insecure_channel_detected_instructions")} + </Text> + <ol> + <li>{_t("auth|qr_code_login|error_insecure_channel_detected_instructions_1")}</li> + <li>{_t("auth|qr_code_login|error_insecure_channel_detected_instructions_2")}</li> + <li>{_t("auth|qr_code_login|error_insecure_channel_detected_instructions_3")}</li> + </ol> + </> + ); break; - case RendezvousFailureReason.OtherDeviceNotSignedIn: - cancellationMessage = _t("auth|qr_code_login|error_device_not_signed_in"); + + case LegacyRendezvousFailureReason.OtherDeviceAlreadySignedIn: + success = true; + title = _t("auth|qr_code_login|error_other_device_already_signed_in_title"); + message = _t("auth|qr_code_login|error_other_device_already_signed_in"); break; - case RendezvousFailureReason.UserCancelled: - cancellationMessage = _t("auth|qr_code_login|error_request_cancelled"); + + case LegacyRendezvousFailureReason.UserDeclined: + title = _t("auth|qr_code_login|error_user_declined_title"); + message = _t("auth|qr_code_login|error_user_declined"); break; + case LoginWithQRFailureReason.RateLimited: - cancellationMessage = _t("auth|qr_code_login|error_rate_limited"); - break; - case RendezvousFailureReason.Unknown: - cancellationMessage = _t("auth|qr_code_login|error_unexpected"); - break; - case RendezvousFailureReason.HomeserverLacksSupport: - cancellationMessage = _t("auth|qr_code_login|error_homeserver_lacks_support"); + title = _t("error|something_went_wrong"); + message = _t("auth|qr_code_login|error_rate_limited"); break; + + case LegacyRendezvousFailureReason.OtherDeviceNotSignedIn: + case LegacyRendezvousFailureReason.Unknown: default: - cancellationMessage = _t("auth|qr_code_login|error_request_cancelled"); + title = _t("error|something_went_wrong"); + message = _t("auth|qr_code_login|error_unexpected"); break; } - centreTitle = true; + className = "mx_LoginWithQR_error"; backButton = false; - main = <p data-testid="cancellation-message">{cancellationMessage}</p>; buttons = ( <> <AccessibleButton @@ -127,7 +162,23 @@ export default class LoginWithQRFlow extends React.Component<IProps> { {this.cancelButton()} </> ); + main = ( + <> + <div + className={classNames("mx_LoginWithQR_icon", { + "mx_LoginWithQR_icon--critical": !success, + })} + > + {success ? <CheckCircleSolidIcon width="32px" /> : <ErrorIcon width="32px" />} + </div> + <Heading as="h1" size="sm" weight="semibold"> + {title} + </Heading> + {typeof message === "object" ? message : <p data-testid="cancellation-message">{message}</p>} + </> + ); break; + } case Phase.Connected: backButton = false; main = ( @@ -145,13 +196,6 @@ export default class LoginWithQRFlow extends React.Component<IProps> { buttons = ( <> - <AccessibleButton - data-testid="decline-login-button" - kind="primary_outline" - onClick={this.handleClick(Click.Decline)} - > - {_t("action|cancel")} - </AccessibleButton> <AccessibleButton data-testid="approve-login-button" kind="primary" @@ -159,23 +203,28 @@ export default class LoginWithQRFlow extends React.Component<IProps> { > {_t("action|approve")} </AccessibleButton> + <AccessibleButton + data-testid="decline-login-button" + kind="primary_outline" + onClick={this.handleClick(Click.Decline)} + > + {_t("action|cancel")} + </AccessibleButton> </> ); break; case Phase.ShowingQR: if (this.props.code) { - const code = ( - <div className="mx_LoginWithQR_qrWrapper"> - <QRCode - data={[{ data: Buffer.from(this.props.code ?? ""), mode: "byte" }]} - className="mx_QRCode" - /> - </div> - ); + const data = Buffer.from(this.props.code ?? ""); + main = ( <> - <h1>{_t("auth|qr_code_login|scan_code_instruction")}</h1> - {code} + <Heading as="h1" size="sm" weight="semibold"> + {_t("auth|qr_code_login|scan_code_instruction")} + </Heading> + <div className="mx_LoginWithQR_qrWrapper"> + <QRCode data={[{ data, mode: "byte" }]} className="mx_QRCode" /> + </div> <ol> <li> {_t("auth|qr_code_login|open_element_other_device", { @@ -209,30 +258,27 @@ export default class LoginWithQRFlow extends React.Component<IProps> { buttons = this.cancelButton(); break; case Phase.Verifying: - centreTitle = true; main = this.simpleSpinner(_t("auth|qr_code_login|completing_setup")); break; } return ( - <div data-testid="login-with-qr" className="mx_LoginWithQR"> - <div className={centreTitle ? "mx_LoginWithQR_centreTitle" : ""}> - {backButton ? ( - <div className="mx_LoginWithQR_heading"> - <AccessibleButton - data-testid="back-button" - className="mx_LoginWithQR_BackButton" - onClick={this.handleClick(Click.Back)} - title="Back" - > - <ChevronLeftIcon /> - </AccessibleButton> - <div className="mx_LoginWithQR_breadcrumbs"> - {_t("settings|sessions|title")} / {_t("settings|sessions|sign_in_with_qr")} - </div> + <div data-testid="login-with-qr" className={classNames("mx_LoginWithQR", className)}> + {backButton ? ( + <div className="mx_LoginWithQR_heading"> + <AccessibleButton + data-testid="back-button" + className="mx_LoginWithQR_BackButton" + onClick={this.handleClick(Click.Back)} + title="Back" + > + <ChevronLeftIcon /> + </AccessibleButton> + <div className="mx_LoginWithQR_breadcrumbs"> + {_t("settings|sessions|title")} / {_t("settings|sessions|sign_in_with_qr")} </div> - ) : null} - </div> + </div> + ) : null} <div className="mx_LoginWithQR_main">{main}</div> <div className="mx_LoginWithQR_buttons">{buttons}</div> </div> diff --git a/src/components/views/avatars/DecoratedRoomAvatar.tsx b/src/components/views/avatars/DecoratedRoomAvatar.tsx index dd83d1e969..7e85588907 100644 --- a/src/components/views/avatars/DecoratedRoomAvatar.tsx +++ b/src/components/views/avatars/DecoratedRoomAvatar.tsx @@ -255,7 +255,7 @@ export default class DecoratedRoomAvatar extends React.PureComponent<IProps, ISt viewAvatarOnClick={this.props.viewAvatarOnClick} /> {icon && ( - <Tooltip label={tooltipText(this.state.icon)!} side="bottom"> + <Tooltip label={tooltipText(this.state.icon)!} placement="bottom"> {icon} </Tooltip> )} diff --git a/src/components/views/dialogs/BaseDialog.tsx b/src/components/views/dialogs/BaseDialog.tsx index 1b160150f7..66f6c9e095 100644 --- a/src/components/views/dialogs/BaseDialog.tsx +++ b/src/components/views/dialogs/BaseDialog.tsx @@ -53,7 +53,7 @@ interface IProps { "top"?: React.ReactNode; // Title for the dialog. - "title"?: JSX.Element | string; + "title"?: React.ReactNode; // Specific aria label to use, if not provided will set aria-labelledBy to mx_Dialog_title "aria-label"?: string; diff --git a/src/components/views/dialogs/ForwardDialog.tsx b/src/components/views/dialogs/ForwardDialog.tsx index d59e23fe4c..7ff95edce3 100644 --- a/src/components/views/dialogs/ForwardDialog.tsx +++ b/src/components/views/dialogs/ForwardDialog.tsx @@ -41,8 +41,6 @@ import { avatarUrlForUser } from "../../../Avatar"; import EventTile from "../rooms/EventTile"; import SearchBox from "../../structures/SearchBox"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; -import { Alignment } from "../elements/Tooltip"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import AutoHideScrollbar from "../../structures/AutoHideScrollbar"; import { StaticNotificationState } from "../../../stores/notifications/StaticNotificationState"; import NotificationBadge from "../rooms/NotificationBadge"; @@ -54,7 +52,7 @@ import EntityTile from "../rooms/EntityTile"; import BaseAvatar from "../avatars/BaseAvatar"; import { Action } from "../../../dispatcher/actions"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; -import { ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; import { isLocationEvent } from "../../../utils/EventUtils"; import { isSelfLocation, locationEventGeoUri } from "../../../utils/location"; import { RoomContextDetails } from "../rooms/RoomContextDetails"; @@ -159,11 +157,11 @@ const Entry: React.FC<IEntryProps<any>> = ({ room, type, content, matrixClient: onFocus={onFocus} id={id} > - <AccessibleTooltipButton + <AccessibleButton className="mx_ForwardList_roomButton" onClick={jumpToRoom} title={_t("forward|open_room")} - alignment={Alignment.Top} + placement="top" tabIndex={isActive ? 0 : -1} > <DecoratedRoomAvatar room={room} size="32px" tooltipProps={{ tabIndex: isActive ? 0 : -1 }} /> @@ -171,20 +169,20 @@ const Entry: React.FC<IEntryProps<any>> = ({ room, type, content, matrixClient: {room.name} </span> <RoomContextDetails component="span" className="mx_ForwardList_entry_detail" room={room} /> - </AccessibleTooltipButton> - <AccessibleTooltipButton + </AccessibleButton> + <AccessibleButton kind={sendState === SendState.Failed ? "danger_outline" : "primary_outline"} className={`mx_ForwardList_sendButton ${className}`} onClick={send} disabled={disabled} title={title} - alignment={Alignment.Top} + placement="top" tabIndex={isActive ? 0 : -1} id={`${id}_send`} > <div className="mx_ForwardList_sendLabel">{_t("forward|send_label")}</div> {icon} - </AccessibleTooltipButton> + </AccessibleButton> </div> ); }; diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 2b3c7af8db..bb81d7a05f 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -1536,9 +1536,9 @@ export default class InviteDialog extends React.PureComponent<Props, IInviteDial ); dialogContent = ( <React.Fragment> - <TabbedView + <TabbedView<TabId> tabs={tabs} - initialTabId={this.state.currentTabId} + activeTabId={this.state.currentTabId} tabLocation={TabLocation.TOP} onChange={this.onTabChange} /> diff --git a/src/components/views/dialogs/RoomSettingsDialog.tsx b/src/components/views/dialogs/RoomSettingsDialog.tsx index a58cef95a7..213ee94aca 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.tsx +++ b/src/components/views/dialogs/RoomSettingsDialog.tsx @@ -56,11 +56,12 @@ export const enum RoomSettingsTab { interface IProps { roomId: string; onFinished: (success?: boolean) => void; - initialTabId?: string; + initialTabId?: RoomSettingsTab; } interface IState { room: Room; + activeTabId: RoomSettingsTab; } class RoomSettingsDialog extends React.Component<IProps, IState> { @@ -70,7 +71,7 @@ class RoomSettingsDialog extends React.Component<IProps, IState> { super(props); const room = this.getRoom(); - this.state = { room }; + this.state = { room, activeTabId: props.initialTabId || RoomSettingsTab.General }; } public componentDidMount(): void { @@ -128,6 +129,10 @@ class RoomSettingsDialog extends React.Component<IProps, IState> { if (event.getType() === EventType.RoomJoinRules) this.forceUpdate(); }; + private onTabChange = (tabId: RoomSettingsTab): void => { + this.setState({ activeTabId: tabId }); + }; + private getTabs(): NonEmptyArray<Tab<RoomSettingsTab>> { const tabs: Tab<RoomSettingsTab>[] = []; @@ -246,8 +251,9 @@ class RoomSettingsDialog extends React.Component<IProps, IState> { <div className="mx_SettingsDialog_content"> <TabbedView tabs={this.getTabs()} - initialTabId={this.props.initialTabId} + activeTabId={this.state.activeTabId} screenName="RoomSettings" + onChange={this.onTabChange} /> </div> </BaseDialog> diff --git a/src/components/views/dialogs/SlidingSyncOptionsDialog.tsx b/src/components/views/dialogs/SlidingSyncOptionsDialog.tsx deleted file mode 100644 index 958c8d0876..0000000000 --- a/src/components/views/dialogs/SlidingSyncOptionsDialog.tsx +++ /dev/null @@ -1,142 +0,0 @@ -/* -Copyright 2022 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import { MatrixClient, Method } from "matrix-js-sdk/src/matrix"; -import { logger } from "matrix-js-sdk/src/logger"; - -import { _t } from "../../../languageHandler"; -import SettingsStore from "../../../settings/SettingsStore"; -import TextInputDialog from "./TextInputDialog"; -import withValidation from "../elements/Validation"; -import { MatrixClientPeg } from "../../../MatrixClientPeg"; -import { useAsyncMemo } from "../../../hooks/useAsyncMemo"; -import { SettingLevel } from "../../../settings/SettingLevel"; - -/** - * Check that the server natively supports sliding sync. - * @param cli The MatrixClient of the logged in user. - * @throws if the proxy server is unreachable or not configured to the given homeserver - */ -async function syncHealthCheck(cli: MatrixClient): Promise<void> { - await cli.http.authedRequest(Method.Post, "/sync", undefined, undefined, { - localTimeoutMs: 10 * 1000, // 10s - prefix: "/_matrix/client/unstable/org.matrix.msc3575", - }); - logger.info("server natively support sliding sync OK"); -} - -/** - * Check that the proxy url is in fact a sliding sync proxy endpoint and it is up. - * @param endpoint The proxy endpoint url - * @param hsUrl The homeserver url of the logged in user. - * @throws if the proxy server is unreachable or not configured to the given homeserver - */ -async function proxyHealthCheck(endpoint: string, hsUrl?: string): Promise<void> { - const controller = new AbortController(); - const id = window.setTimeout(() => controller.abort(), 10 * 1000); // 10s - const res = await fetch(endpoint + "/client/server.json", { - signal: controller.signal, - }); - clearTimeout(id); - if (res.status != 200) { - throw new Error(`proxyHealthCheck: proxy server returned HTTP ${res.status}`); - } - const body = await res.json(); - if (body.server !== hsUrl) { - throw new Error(`proxyHealthCheck: client using ${hsUrl} but server is as ${body.server}`); - } - logger.info("sliding sync proxy is OK"); -} - -export const SlidingSyncOptionsDialog: React.FC<{ onFinished(enabled: boolean): void }> = ({ onFinished }) => { - const cli = MatrixClientPeg.safeGet(); - const currentProxy = SettingsStore.getValue("feature_sliding_sync_proxy_url"); - const hasNativeSupport = useAsyncMemo( - () => - syncHealthCheck(cli).then( - () => true, - () => false, - ), - [], - null, - ); - - let nativeSupport: string; - if (hasNativeSupport === null) { - nativeSupport = _t("labs|sliding_sync_checking"); - } else { - nativeSupport = hasNativeSupport - ? _t("labs|sliding_sync_server_support") - : _t("labs|sliding_sync_server_no_support"); - } - - const validProxy = withValidation<undefined, { error?: unknown }>({ - async deriveData({ value }): Promise<{ error?: unknown }> { - if (!value) return {}; - try { - await proxyHealthCheck(value, MatrixClientPeg.safeGet().baseUrl); - return {}; - } catch (error) { - return { error }; - } - }, - rules: [ - { - key: "required", - test: async ({ value }) => !!value || !!hasNativeSupport, - invalid: () => _t("labs|sliding_sync_server_specify_proxy"), - }, - { - key: "working", - final: true, - test: async (_, { error }) => !error, - valid: () => _t("spotlight|public_rooms|network_dropdown_available_valid"), - invalid: ({ error }) => (error instanceof Error ? error.message : null), - }, - ], - }); - - return ( - <TextInputDialog - title={_t("labs|sliding_sync_configuration")} - description={ - <div> - <div> - <b>{_t("labs|sliding_sync_disable_warning")}</b> - </div> - {nativeSupport} - </div> - } - placeholder={ - hasNativeSupport - ? _t("labs|sliding_sync_proxy_url_optional_label") - : _t("labs|sliding_sync_proxy_url_label") - } - value={currentProxy} - button={_t("action|enable")} - validator={validProxy} - onFinished={(enable, proxyUrl) => { - if (enable) { - SettingsStore.setValue("feature_sliding_sync_proxy_url", null, SettingLevel.DEVICE, proxyUrl); - onFinished(true); - } else { - onFinished(false); - } - }} - /> - ); -}; diff --git a/src/components/views/dialogs/SpacePreferencesDialog.tsx b/src/components/views/dialogs/SpacePreferencesDialog.tsx index f943fc7d3c..881a655076 100644 --- a/src/components/views/dialogs/SpacePreferencesDialog.tsx +++ b/src/components/views/dialogs/SpacePreferencesDialog.tsx @@ -33,7 +33,6 @@ import SettingsSubsection, { SettingsSubsectionText } from "../settings/shared/S interface IProps { space: Room; - initialTabId?: SpacePreferenceTab; onFinished(): void; } @@ -68,7 +67,7 @@ const SpacePreferencesAppearanceTab: React.FC<Pick<IProps, "space">> = ({ space ); }; -const SpacePreferencesDialog: React.FC<IProps> = ({ space, initialTabId, onFinished }) => { +const SpacePreferencesDialog: React.FC<IProps> = ({ space, onFinished }) => { const tabs: NonEmptyArray<Tab<SpacePreferenceTab>> = [ new Tab( SpacePreferenceTab.Appearance, @@ -90,7 +89,7 @@ const SpacePreferencesDialog: React.FC<IProps> = ({ space, initialTabId, onFinis <RoomName room={space} /> </h4> <div className="mx_SettingsDialog_content"> - <TabbedView tabs={tabs} initialTabId={initialTabId} /> + <TabbedView tabs={tabs} activeTabId={SpacePreferenceTab.Appearance} onChange={() => {}} /> </div> </BaseDialog> ); diff --git a/src/components/views/dialogs/SpaceSettingsDialog.tsx b/src/components/views/dialogs/SpaceSettingsDialog.tsx index 0318e1af62..016307d899 100644 --- a/src/components/views/dialogs/SpaceSettingsDialog.tsx +++ b/src/components/views/dialogs/SpaceSettingsDialog.tsx @@ -82,6 +82,8 @@ const SpaceSettingsDialog: React.FC<IProps> = ({ matrixClient: cli, space, onFin ].filter(Boolean) as NonEmptyArray<Tab<SpaceSettingsTab>>; }, [cli, space, onFinished]); + const [activeTabId, setActiveTabId] = React.useState(SpaceSettingsTab.General); + return ( <BaseDialog title={_t("space_settings|title", { spaceName: space.name || _t("common|unnamed_space") })} @@ -91,7 +93,7 @@ const SpaceSettingsDialog: React.FC<IProps> = ({ matrixClient: cli, space, onFin fixedWidth={false} > <div className="mx_SpaceSettingsDialog_content" id="mx_SpaceSettingsDialog"> - <TabbedView tabs={tabs} /> + <TabbedView tabs={tabs} activeTabId={activeTabId} onChange={setActiveTabId} /> </div> </BaseDialog> ); diff --git a/src/components/views/dialogs/UserSettingsDialog.tsx b/src/components/views/dialogs/UserSettingsDialog.tsx index 820617ae96..bb97b36fc9 100644 --- a/src/components/views/dialogs/UserSettingsDialog.tsx +++ b/src/components/views/dialogs/UserSettingsDialog.tsx @@ -1,6 +1,6 @@ /* Copyright 2019 New Vector Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2019, 2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ limitations under the License. import React from "react"; -import TabbedView, { Tab } from "../../structures/TabbedView"; +import TabbedView, { Tab, useActiveTabWithDefault } from "../../structures/TabbedView"; import { _t, _td } from "../../../languageHandler"; import GeneralUserSettingsTab from "../settings/tabs/user/GeneralUserSettingsTab"; -import SettingsStore, { CallbackFn } from "../../../settings/SettingsStore"; +import SettingsStore from "../../../settings/SettingsStore"; import LabsUserSettingsTab, { showLabsFlags } from "../settings/tabs/user/LabsUserSettingsTab"; import AppearanceUserSettingsTab from "../settings/tabs/user/AppearanceUserSettingsTab"; import SecurityUserSettingsTab from "../settings/tabs/user/SecurityUserSettingsTab"; @@ -37,6 +37,7 @@ import SessionManagerTab from "../settings/tabs/user/SessionManagerTab"; import { UserTab } from "./UserTab"; import { NonEmptyArray } from "../../../@types/common"; import { SDKContext, SdkContextClass } from "../../../contexts/SDKContext"; +import { useSettingValue } from "../../../hooks/useSettings"; interface IProps { initialTabId?: UserTab; @@ -44,35 +45,43 @@ interface IProps { onFinished(): void; } -interface IState { - mjolnirEnabled: boolean; -} - -export default class UserSettingsDialog extends React.Component<IProps, IState> { - private settingsWatchers: string[] = []; - - public constructor(props: IProps) { - super(props); - - this.state = { - mjolnirEnabled: SettingsStore.getValue("feature_mjolnir"), - }; - } - - public componentDidMount(): void { - this.settingsWatchers = [SettingsStore.watchSetting("feature_mjolnir", null, this.mjolnirChanged)]; - } - - public componentWillUnmount(): void { - this.settingsWatchers.forEach((watcherRef) => SettingsStore.unwatchSetting(watcherRef)); +function titleForTabID(tabId: UserTab): React.ReactNode { + const subs = { + strong: (sub: string) => <strong>{sub}</strong>, + }; + switch (tabId) { + case UserTab.General: + return _t("settings|general|dialog_title", undefined, subs); + case UserTab.SessionManager: + return _t("settings|sessions|dialog_title", undefined, subs); + case UserTab.Appearance: + return _t("settings|appearance|dialog_title", undefined, subs); + case UserTab.Notifications: + return _t("settings|notifications|dialog_title", undefined, subs); + case UserTab.Preferences: + return _t("settings|preferences|dialog_title", undefined, subs); + case UserTab.Keyboard: + return _t("settings|keyboard|dialog_title", undefined, subs); + case UserTab.Sidebar: + return _t("settings|sidebar|dialog_title", undefined, subs); + case UserTab.Voice: + return _t("settings|voip|dialog_title", undefined, subs); + case UserTab.Security: + return _t("settings|security|dialog_title", undefined, subs); + case UserTab.Labs: + return _t("settings|labs|dialog_title", undefined, subs); + case UserTab.Mjolnir: + return _t("settings|labs_mjolnir|dialog_title", undefined, subs); + case UserTab.Help: + return _t("setting|help_about|dialog_title", undefined, subs); } +} - private mjolnirChanged: CallbackFn = (settingName, roomId, atLevel, newValue) => { - // We can cheat because we know what levels a feature is tracked at, and how it is tracked - this.setState({ mjolnirEnabled: newValue }); - }; +export default function UserSettingsDialog(props: IProps): JSX.Element { + const voipEnabled = useSettingValue<boolean>(UIFeature.Voip); + const mjolnirEnabled = useSettingValue<boolean>("feature_mjolnir"); - private getTabs(): NonEmptyArray<Tab<UserTab>> { + const getTabs = (): NonEmptyArray<Tab<UserTab>> => { const tabs: Tab<UserTab>[] = []; tabs.push( @@ -80,7 +89,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> UserTab.General, _td("common|general"), "mx_UserSettingsDialog_settingsIcon", - <GeneralUserSettingsTab closeSettingsFn={this.props.onFinished} />, + <GeneralUserSettingsTab closeSettingsFn={props.onFinished} />, "UserSettingsGeneral", ), ); @@ -90,7 +99,6 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> _td("settings|sessions|title"), "mx_UserSettingsDialog_sessionsIcon", <SessionManagerTab />, - // don't track with posthog while under construction undefined, ), ); @@ -117,7 +125,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> UserTab.Preferences, _td("common|preferences"), "mx_UserSettingsDialog_preferencesIcon", - <PreferencesUserSettingsTab closeSettingsFn={this.props.onFinished} />, + <PreferencesUserSettingsTab closeSettingsFn={props.onFinished} />, "UserSettingsPreferences", ), ); @@ -140,7 +148,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> ), ); - if (SettingsStore.getValue(UIFeature.Voip)) { + if (voipEnabled) { tabs.push( new Tab( UserTab.Voice, @@ -157,11 +165,11 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> UserTab.Security, _td("room_settings|security|title"), "mx_UserSettingsDialog_securityIcon", - <SecurityUserSettingsTab closeSettingsFn={this.props.onFinished} />, + <SecurityUserSettingsTab closeSettingsFn={props.onFinished} />, "UserSettingsSecurityPrivacy", ), ); - // Show the Labs tab if enabled or if there are any active betas + if (showLabsFlags() || SettingsStore.getFeatureSettingNames().some((k) => SettingsStore.getBetaInfo(k))) { tabs.push( new Tab( @@ -173,7 +181,7 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> ), ); } - if (this.state.mjolnirEnabled) { + if (mjolnirEnabled) { tabs.push( new Tab( UserTab.Mjolnir, @@ -195,29 +203,31 @@ export default class UserSettingsDialog extends React.Component<IProps, IState> ); return tabs as NonEmptyArray<Tab<UserTab>>; - } + }; - public render(): React.ReactNode { - return ( - // XXX: SDKContext is provided within the LoggedInView subtree. - // Modals function outside the MatrixChat React tree, so sdkContext is reprovided here to simulate that. - // The longer term solution is to move our ModalManager into the React tree to inherit contexts properly. - <SDKContext.Provider value={this.props.sdkContext}> - <BaseDialog - className="mx_UserSettingsDialog" - hasCancel={true} - onFinished={this.props.onFinished} - title={_t("common|settings")} - > - <div className="mx_SettingsDialog_content"> - <TabbedView - tabs={this.getTabs()} - initialTabId={this.props.initialTabId} - screenName="UserSettings" - /> - </div> - </BaseDialog> - </SDKContext.Provider> - ); - } + const [activeTabId, setActiveTabId] = useActiveTabWithDefault(getTabs(), UserTab.General, props.initialTabId); + + return ( + // XXX: SDKContext is provided within the LoggedInView subtree. + // Modals function outside the MatrixChat React tree, so sdkContext is reprovided here to simulate that. + // The longer term solution is to move our ModalManager into the React tree to inherit contexts properly. + <SDKContext.Provider value={props.sdkContext}> + <BaseDialog + className="mx_UserSettingsDialog" + hasCancel={true} + onFinished={props.onFinished} + title={titleForTabID(activeTabId)} + > + <div className="mx_SettingsDialog_content"> + <TabbedView + tabs={getTabs()} + activeTabId={activeTabId} + screenName="UserSettings" + onChange={setActiveTabId} + responsive={true} + /> + </div> + </BaseDialog> + </SDKContext.Provider> + ); } diff --git a/src/components/views/dialogs/devtools/RoomNotifications.tsx b/src/components/views/dialogs/devtools/RoomNotifications.tsx index 5d03ee7c3a..397db1fa4b 100644 --- a/src/components/views/dialogs/devtools/RoomNotifications.tsx +++ b/src/components/views/dialogs/devtools/RoomNotifications.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import { NotificationCountType, Room, Thread, ReceiptType } from "matrix-js-sdk/src/matrix"; -import React, { useContext, useMemo } from "react"; +import React, { useContext } from "react"; import { ReadReceipt } from "matrix-js-sdk/src/models/read-receipt"; import MatrixClientContext from "../../../../contexts/MatrixClientContext"; @@ -25,7 +25,6 @@ import { determineUnreadState } from "../../../../RoomNotifs"; import { humanReadableNotificationLevel } from "../../../../stores/notifications/NotificationLevel"; import { doesRoomOrThreadHaveUnreadMessages } from "../../../../Unread"; import BaseTool, { DevtoolsContext, IDevtoolsProps } from "./BaseTool"; -import SettingsStore from "../../../../settings/SettingsStore"; function UserReadUpTo({ target }: { target: ReadReceipt<any, any> }): JSX.Element { const cli = useContext(MatrixClientContext); @@ -66,12 +65,10 @@ function UserReadUpTo({ target }: { target: ReadReceipt<any, any> }): JSX.Elemen } export default function RoomNotifications({ onBack }: IDevtoolsProps): JSX.Element { - const tacEnabled = useMemo(() => SettingsStore.getValue("threadsActivityCentre"), []); - const { room } = useContext(DevtoolsContext); const cli = useContext(MatrixClientContext); - const { level, count } = determineUnreadState(room, undefined, !tacEnabled); + const { level, count } = determineUnreadState(room, undefined, false); const [notificationState] = useNotificationState(room); return ( diff --git a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx index ee42a59221..2ac7681afa 100644 --- a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx +++ b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx @@ -939,7 +939,9 @@ const SpotlightDialog: React.FC<IProps> = ({ initialText = "", initialFilter = n setInviteLinkCopied(true); copyPlaintext(ownInviteLink); }} - onHideTooltip={() => setInviteLinkCopied(false)} + onTooltipOpenChange={(open) => { + if (!open) setInviteLinkCopied(false); + }} title={inviteLinkCopied ? _t("common|copied") : _t("action|copy")} > <span className="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"> diff --git a/src/components/views/dialogs/spotlight/TooltipOption.tsx b/src/components/views/dialogs/spotlight/TooltipOption.tsx index 2233e762d4..0deb4b1311 100644 --- a/src/components/views/dialogs/spotlight/TooltipOption.tsx +++ b/src/components/views/dialogs/spotlight/TooltipOption.tsx @@ -17,18 +17,19 @@ limitations under the License. import classNames from "classnames"; import React, { ComponentProps, ReactNode } from "react"; -import { RovingAccessibleTooltipButton } from "../../../../accessibility/roving/RovingAccessibleTooltipButton"; import { useRovingTabIndex } from "../../../../accessibility/RovingTabIndex"; -import AccessibleTooltipButton from "../../elements/AccessibleTooltipButton"; +import AccessibleButton from "../../elements/AccessibleButton"; +import { Ref } from "../../../../accessibility/roving/types"; -interface TooltipOptionProps extends ComponentProps<typeof RovingAccessibleTooltipButton> { +interface TooltipOptionProps extends ComponentProps<typeof AccessibleButton> { endAdornment?: ReactNode; + inputRef?: Ref; } export const TooltipOption: React.FC<TooltipOptionProps> = ({ inputRef, className, ...props }) => { const [onFocus, isActive, ref] = useRovingTabIndex(inputRef); return ( - <AccessibleTooltipButton + <AccessibleButton {...props} className={classNames(className, "mx_SpotlightDialog_option")} onFocus={onFocus} diff --git a/src/components/views/elements/AccessibleButton.tsx b/src/components/views/elements/AccessibleButton.tsx index 90955dd33f..d94162393e 100644 --- a/src/components/views/elements/AccessibleButton.tsx +++ b/src/components/views/elements/AccessibleButton.tsx @@ -14,8 +14,9 @@ limitations under the License. */ -import React, { forwardRef, FunctionComponent, HTMLAttributes, InputHTMLAttributes, Ref } from "react"; +import React, { ComponentProps, forwardRef, FunctionComponent, HTMLAttributes, InputHTMLAttributes, Ref } from "react"; import classnames from "classnames"; +import { Tooltip } from "@vector-im/compound-web"; import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; @@ -60,6 +61,8 @@ type DynamicElementProps<T extends keyof JSX.IntrinsicElements> = Partial< > & Omit<InputHTMLAttributes<Element>, "onClick">; +type TooltipProps = ComponentProps<typeof Tooltip>; + /** * Type of props accepted by {@link AccessibleButton}. * @@ -85,7 +88,24 @@ type Props<T extends keyof JSX.IntrinsicElements> = DynamicHtmlElementProps<T> & /** * Event handler for button activation. Should be implemented exactly like a normal `onClick` handler. */ - onClick?: ((e: ButtonEvent) => void | Promise<void>) | null; + onClick: ((e: ButtonEvent) => void | Promise<void>) | null; + /** + * The tooltip to show on hover or focus. + */ + title?: TooltipProps["label"]; + /** + * The caption is a secondary text displayed under the `title` of the tooltip. + * Only valid when used in conjunction with `title`. + */ + caption?: TooltipProps["caption"]; + /** + * The placement of the tooltip. + */ + placement?: TooltipProps["placement"]; + /** + * Callback for when the tooltip is opened or closed. + */ + onTooltipOpenChange?: TooltipProps["onOpenChange"]; }; /** @@ -116,11 +136,16 @@ const AccessibleButton = forwardRef(function <T extends keyof JSX.IntrinsicEleme onKeyDown, onKeyUp, triggerOnMouseDown, + title, + caption, + placement = "right", + onTooltipOpenChange, ...restProps }: Props<T>, ref: Ref<HTMLElement>, ): JSX.Element { const newProps: RenderedElementProps = restProps; + newProps["aria-label"] = newProps["aria-label"] ?? title; if (disabled) { newProps["aria-disabled"] = true; newProps["disabled"] = true; @@ -182,7 +207,22 @@ const AccessibleButton = forwardRef(function <T extends keyof JSX.IntrinsicEleme }); // React.createElement expects InputHTMLAttributes - return React.createElement(element, newProps, children); + const button = React.createElement(element, newProps, children); + + if (title) { + return ( + <Tooltip + label={title} + caption={caption} + isTriggerInteractive={true} + placement={placement} + onOpenChange={onTooltipOpenChange} + > + {button} + </Tooltip> + ); + } + return button; }); // Type assertion required due to forwardRef type workaround in react.d.ts diff --git a/src/components/views/elements/AccessibleTooltipButton.tsx b/src/components/views/elements/AccessibleTooltipButton.tsx index 0af5cc9625..759643da1c 100644 --- a/src/components/views/elements/AccessibleTooltipButton.tsx +++ b/src/components/views/elements/AccessibleTooltipButton.tsx @@ -60,8 +60,11 @@ type Props<T extends keyof JSX.IntrinsicElements> = ComponentProps<typeof Access onHideTooltip?(ev: SyntheticEvent): void; }; +/** + * @deprecated use AccessibleButton with `title` and `caption` instead. + */ const AccessibleTooltipButton = forwardRef(function <T extends keyof JSX.IntrinsicElements>( - { title, tooltip, children, forceHide, alignment, onHideTooltip, tooltipClassName, ...props }: Props<T>, + { title, tooltip, children, forceHide, alignment, onHideTooltip, tooltipClassName, element, ...props }: Props<T>, ref: Ref<HTMLElement>, ) { const [hover, setHover] = useState(false); @@ -97,6 +100,7 @@ const AccessibleTooltipButton = forwardRef(function <T extends keyof JSX.Intrins return ( <AccessibleButton {...props} + element={element as keyof JSX.IntrinsicElements} onMouseOver={showTooltip} onMouseLeave={hideTooltip} onFocus={onFocus} diff --git a/src/components/views/elements/AppTile.tsx b/src/components/views/elements/AppTile.tsx index 7a1b641791..0820ac62d1 100644 --- a/src/components/views/elements/AppTile.tsx +++ b/src/components/views/elements/AppTile.tsx @@ -537,7 +537,7 @@ export default class AppTile extends React.Component<IProps, IState> { return ( <span> <WidgetAvatar app={this.props.app} size="20px" /> - <b>{name}</b> + <h3>{name}</h3> <span> {title ? titleSpacer : ""} {title} diff --git a/src/components/views/elements/CopyableText.tsx b/src/components/views/elements/CopyableText.tsx index 7e92b39564..5d9946d2c1 100644 --- a/src/components/views/elements/CopyableText.tsx +++ b/src/components/views/elements/CopyableText.tsx @@ -20,8 +20,7 @@ import classNames from "classnames"; import { _t } from "../../../languageHandler"; import { copyPlaintext } from "../../../utils/strings"; -import { ButtonEvent } from "./AccessibleButton"; -import AccessibleTooltipButton from "./AccessibleTooltipButton"; +import AccessibleButton, { ButtonEvent } from "./AccessibleButton"; interface IProps { children?: React.ReactNode; @@ -53,11 +52,13 @@ const CopyableText: React.FC<IProps> = ({ children, getTextToCopy, border = true return ( <div className={combinedClassName}> {children} - <AccessibleTooltipButton + <AccessibleButton title={tooltip ?? _t("action|copy")} onClick={onCopyClickInternal} className="mx_CopyableText_copyButton" - onHideTooltip={onHideTooltip} + onTooltipOpenChange={(open) => { + if (!open) onHideTooltip(); + }} /> </div> ); diff --git a/src/components/views/elements/DesktopCapturerSourcePicker.tsx b/src/components/views/elements/DesktopCapturerSourcePicker.tsx index e4d52a8104..18cb9e6f4e 100644 --- a/src/components/views/elements/DesktopCapturerSourcePicker.tsx +++ b/src/components/views/elements/DesktopCapturerSourcePicker.tsx @@ -85,8 +85,6 @@ export interface PickerIProps { onFinished(source?: DesktopCapturerSource): void; } -type TabId = "screen" | "window"; - export default class DesktopCapturerSourcePicker extends React.Component<PickerIProps, PickerIState> { public interval?: number; @@ -127,15 +125,15 @@ export default class DesktopCapturerSourcePicker extends React.Component<PickerI this.props.onFinished(this.state.selectedSource); }; - private onTabChange = (): void => { - this.setState({ selectedSource: undefined }); + private onTabChange = (tab: Tabs): void => { + this.setState({ selectedSource: undefined, selectedTab: tab }); }; private onCloseClick = (): void => { this.props.onFinished(); }; - private getTab(type: TabId, label: TranslationKey): Tab<TabId> { + private getTab(type: Tabs, label: TranslationKey): Tab<Tabs> { const sources = this.state.sources .filter((source) => source.id.startsWith(type)) .map((source) => { @@ -153,9 +151,9 @@ export default class DesktopCapturerSourcePicker extends React.Component<PickerI } public render(): React.ReactNode { - const tabs: NonEmptyArray<Tab<TabId>> = [ - this.getTab("screen", _td("voip|screenshare_monitor")), - this.getTab("window", _td("voip|screenshare_window")), + const tabs: NonEmptyArray<Tab<Tabs>> = [ + this.getTab(Tabs.Screens, _td("voip|screenshare_monitor")), + this.getTab(Tabs.Windows, _td("voip|screenshare_window")), ]; return ( @@ -164,7 +162,12 @@ export default class DesktopCapturerSourcePicker extends React.Component<PickerI onFinished={this.onCloseClick} title={_t("voip|screenshare_title")} > - <TabbedView tabs={tabs} tabLocation={TabLocation.TOP} onChange={this.onTabChange} /> + <TabbedView + tabs={tabs} + tabLocation={TabLocation.TOP} + activeTabId={this.state.selectedTab} + onChange={this.onTabChange} + /> <DialogButtons primaryButton={_t("action|share")} hasCancel={true} diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 6f5815e95a..ddc2769c48 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -21,7 +21,6 @@ import FocusLock from "react-focus-lock"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; import { _t } from "../../../languageHandler"; -import AccessibleTooltipButton from "./AccessibleTooltipButton"; import MemberAvatar from "../avatars/MemberAvatar"; import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; import MessageContextMenu from "../context_menus/MessageContextMenu"; @@ -38,6 +37,7 @@ import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { presentableTextForFile } from "../../../utils/FileUtils"; +import AccessibleButton from "./AccessibleButton"; // Max scale to keep gaps around the image const MAX_SCALE = 0.95; @@ -513,14 +513,14 @@ export default class ImageView extends React.Component<IProps, IState> { } const zoomOutButton = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_zoomOut" title={_t("action|zoom_out")} onClick={this.onZoomOutClick} /> ); const zoomInButton = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_zoomIn" title={_t("action|zoom_in")} onClick={this.onZoomInClick} @@ -553,23 +553,23 @@ export default class ImageView extends React.Component<IProps, IState> { <div className="mx_ImageView_toolbar"> {zoomOutButton} {zoomInButton} - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_rotateCCW" title={_t("lightbox|rotate_left")} onClick={this.onRotateCounterClockwiseClick} /> - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_rotateCW" title={_t("lightbox|rotate_right")} onClick={this.onRotateClockwiseClick} /> - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_download" title={_t("action|download")} onClick={this.onDownloadClick} /> {contextMenuButton} - <AccessibleTooltipButton + <AccessibleButton className="mx_ImageView_button mx_ImageView_button_close" title={_t("action|close")} onClick={this.props.onFinished} diff --git a/src/components/views/elements/InfoTooltip.tsx b/src/components/views/elements/InfoTooltip.tsx index 1f6247ccf3..318552cde9 100644 --- a/src/components/views/elements/InfoTooltip.tsx +++ b/src/components/views/elements/InfoTooltip.tsx @@ -43,7 +43,7 @@ export default class InfoTooltip extends React.PureComponent<TooltipProps> { // Tooltip are forced on the right for a more natural feel to them on info icons return ( - <Tooltip label={tooltip || title} side="right"> + <Tooltip label={tooltip || title} placement="right"> <div className={classNames("mx_InfoTooltip", className)} tabIndex={this.props.tabIndex ?? 0}> <span className={classNames("mx_InfoTooltip_icon", iconClassName)} aria-label={title} /> {children} diff --git a/src/components/views/elements/PersistedElement.tsx b/src/components/views/elements/PersistedElement.tsx index 37e5fc26ad..99730ec344 100644 --- a/src/components/views/elements/PersistedElement.tsx +++ b/src/components/views/elements/PersistedElement.tsx @@ -17,7 +17,6 @@ limitations under the License. import React, { MutableRefObject, ReactNode } from "react"; import ReactDOM from "react-dom"; import { isNullOrUndefined } from "matrix-js-sdk/src/utils"; -import { TooltipProvider } from "@vector-im/compound-web"; import dis from "../../../dispatcher/dispatcher"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; @@ -177,11 +176,9 @@ export default class PersistedElement extends React.Component<IProps> { private renderApp(): void { const content = ( <MatrixClientContext.Provider value={MatrixClientPeg.safeGet()}> - <TooltipProvider> - <div ref={this.collectChild} style={this.props.style}> - {this.props.children} - </div> - </TooltipProvider> + <div ref={this.collectChild} style={this.props.style}> + {this.props.children} + </div> </MatrixClientContext.Provider> ); diff --git a/src/components/views/elements/Pill.tsx b/src/components/views/elements/Pill.tsx index 9f332e29c3..52ad1e2b89 100644 --- a/src/components/views/elements/Pill.tsx +++ b/src/components/views/elements/Pill.tsx @@ -151,7 +151,7 @@ export const Pill: React.FC<PillProps> = ({ type: propType, url, inMessage, room <Tooltip label={resourceId ?? ""} open={resourceId ? undefined : false} - side="right" + placement="right" isTriggerInteractive={isAnchor} > {isAnchor ? ( diff --git a/src/components/views/elements/RoomTopic.tsx b/src/components/views/elements/RoomTopic.tsx index fa9fc0fd34..f926ef5cf4 100644 --- a/src/components/views/elements/RoomTopic.tsx +++ b/src/components/views/elements/RoomTopic.tsx @@ -36,6 +36,17 @@ interface IProps extends React.HTMLProps<HTMLDivElement> { room: Room; } +export function onRoomTopicLinkClick(e: React.MouseEvent): void { + const anchor = e.target as HTMLLinkElement; + const localHref = tryTransformPermalinkToLocalHref(anchor.href); + + if (localHref !== anchor.href) { + // it could be converted to a localHref -> therefore handle locally + e.preventDefault(); + window.location.hash = localHref; + } +} + export default function RoomTopic({ room, className, ...props }: IProps): JSX.Element { const client = useContext(MatrixClientContext); const ref = useRef<HTMLDivElement>(null); @@ -54,14 +65,7 @@ export default function RoomTopic({ room, className, ...props }: IProps): JSX.El return; } - const anchor = e.target as HTMLLinkElement; - const localHref = tryTransformPermalinkToLocalHref(anchor.href); - - if (localHref !== anchor.href) { - // it could be converted to a localHref -> therefore handle locally - e.preventDefault(); - window.location.hash = localHref; - } + onRoomTopicLinkClick(e); }, [props], ); diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index 829ffaf3c5..c0647e504f 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -30,7 +30,6 @@ import { Signup } from "@matrix-org/analytics-events/types/typescript/Signup"; import PlatformPeg from "../../../PlatformPeg"; import AccessibleButton from "./AccessibleButton"; import { _t } from "../../../languageHandler"; -import AccessibleTooltipButton from "./AccessibleTooltipButton"; import { mediaFromMxc } from "../../../customisations/Media"; import { PosthogAnalytics } from "../../../PosthogAnalytics"; @@ -131,9 +130,9 @@ const SSOButton: React.FC<ISSOButtonProps> = ({ if (mini) { // TODO fallback icon return ( - <AccessibleTooltipButton {...props} title={label} className={classes} onClick={onClick}> + <AccessibleButton {...props} title={label} className={classes} onClick={onClick}> {icon} - </AccessibleTooltipButton> + </AccessibleButton> ); } diff --git a/src/components/views/elements/TextWithTooltip.tsx b/src/components/views/elements/TextWithTooltip.tsx index 95f8608dae..b6a3bd0cd2 100644 --- a/src/components/views/elements/TextWithTooltip.tsx +++ b/src/components/views/elements/TextWithTooltip.tsx @@ -33,7 +33,7 @@ export default class TextWithTooltip extends React.Component<IProps> { const { className, children, tooltip, tooltipProps } = this.props; return ( - <Tooltip label={tooltip} side="right"> + <Tooltip label={tooltip} placement="right"> <span className={className} tabIndex={tooltipProps?.tabIndex ?? 0}> {children} </span> diff --git a/src/components/views/elements/ToggleSwitch.tsx b/src/components/views/elements/ToggleSwitch.tsx index 588374d17b..8e595ff234 100644 --- a/src/components/views/elements/ToggleSwitch.tsx +++ b/src/components/views/elements/ToggleSwitch.tsx @@ -18,7 +18,7 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -import AccessibleTooltipButton from "./AccessibleTooltipButton"; +import AccessibleButton from "./AccessibleButton"; interface IProps { // Whether or not this toggle is in the 'on' position. @@ -41,7 +41,7 @@ interface IProps { } // Controlled Toggle Switch element, written with Accessibility in mind -export default ({ checked, disabled = false, onChange, ...props }: IProps): JSX.Element => { +export default ({ checked, disabled = false, onChange, title, tooltip, ...props }: IProps): JSX.Element => { const _onClick = (): void => { if (disabled) return; onChange(!checked); @@ -54,15 +54,17 @@ export default ({ checked, disabled = false, onChange, ...props }: IProps): JSX. }); return ( - <AccessibleTooltipButton + <AccessibleButton {...props} className={classes} onClick={_onClick} role="switch" + aria-label={title} aria-checked={checked} aria-disabled={disabled} + title={tooltip} > <div className="mx_ToggleSwitch_ball" /> - </AccessibleTooltipButton> + </AccessibleButton> ); }; diff --git a/src/components/views/messages/CallEvent.tsx b/src/components/views/messages/CallEvent.tsx index e37217c422..c05b56563f 100644 --- a/src/components/views/messages/CallEvent.tsx +++ b/src/components/views/messages/CallEvent.tsx @@ -28,13 +28,12 @@ import { import defaultDispatcher from "../../../dispatcher/dispatcher"; import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { Action } from "../../../dispatcher/actions"; -import type { AccessibleButtonKind, ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { AccessibleButtonKind, ButtonEvent } from "../elements/AccessibleButton"; import MemberAvatar from "../avatars/MemberAvatar"; import { LiveContentSummary, LiveContentType } from "../rooms/LiveContentSummary"; import FacePile from "../elements/FacePile"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { CallDuration, SessionDuration } from "../voip/CallDuration"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; const MAX_FACES = 8; @@ -78,15 +77,15 @@ const ActiveCallEvent = forwardRef<any, ActiveCallEventProps>( <FacePile members={facePileMembers} size="24px" overflow={facePileOverflow} /> </div> {call && <SessionDuration session={call.session} />} - <AccessibleTooltipButton + <AccessibleButton className="mx_CallEvent_button" kind={buttonKind} disabled={onButtonClick === null || buttonDisabledTooltip !== undefined} onClick={onButtonClick} - tooltip={buttonDisabledTooltip} + title={buttonDisabledTooltip} > {buttonText} - </AccessibleTooltipButton> + </AccessibleButton> </div> </div> </div> diff --git a/src/components/views/messages/DecryptionFailureBody.tsx b/src/components/views/messages/DecryptionFailureBody.tsx index b3fa398a2c..1e94e533cd 100644 --- a/src/components/views/messages/DecryptionFailureBody.tsx +++ b/src/components/views/messages/DecryptionFailureBody.tsx @@ -1,5 +1,5 @@ /* -Copyright 2022 The Matrix.org Foundation C.I.C. +Copyright 2022-2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,19 +14,36 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { forwardRef, ForwardRefExoticComponent } from "react"; +import React, { forwardRef, ForwardRefExoticComponent, useContext } from "react"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { DecryptionFailureCode } from "matrix-js-sdk/src/crypto-api"; import { _t } from "../../../languageHandler"; import { IBodyProps } from "./IBodyProps"; import TchapUrls from "../../../../../../src/tchap/util/TchapUrls"; // :TCHAP: better-text-for-locked-messages import ExternalLink from "../elements/ExternalLink"; // :TCHAP: better-text-for-locked-messages +import { LocalDeviceVerificationStateContext } from "../../../contexts/LocalDeviceVerificationStateContext"; -function getErrorMessage(mxEvent?: MatrixEvent): string { - return mxEvent?.isEncryptedDisabledForUnverifiedDevices - ? _t("timeline|decryption_failure_blocked") - // :TCHAP: better-text-for-locked-messages - : _t("threads|unable_to_decrypt"); - : _t( +function getErrorMessage(mxEvent: MatrixEvent, isVerified: boolean | undefined): string { + if (mxEvent.isEncryptedDisabledForUnverifiedDevices) return _t("timeline|decryption_failure|blocked"); + switch (mxEvent.decryptionFailureReason) { + case DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP: + return _t("timeline|decryption_failure|historical_event_no_key_backup"); + + case DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED: + if (isVerified === false) { + // The user seems to have a key backup, so prompt them to verify in the hope that doing so will + // mean we can restore from backup and we'll get the key for this message. + return _t("timeline|decryption_failure|historical_event_unverified_device"); + } + // otherwise, use the default. + break; + + case DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED: + return _t("timeline|decryption_failure|historical_event_user_not_joined"); + } + // :TCHAP: better-text-for-locked-messages : return _t("timeline|decryption_failure|unable_to_decrypt"); + return _t( "threads|unable_to_decrypt_with_info_message", {}, { @@ -41,10 +58,11 @@ function getErrorMessage(mxEvent?: MatrixEvent): string { } // A placeholder element for messages that could not be decrypted -export const DecryptionFailureBody = forwardRef<HTMLDivElement, IBodyProps>(({ mxEvent }, ref): JSX.Element => { +export const DecryptionFailureBody = forwardRef<HTMLDivElement, IBodyProps>(({ mxEvent }, ref): React.JSX.Element => { + const verificationState = useContext(LocalDeviceVerificationStateContext); return ( <div className="mx_DecryptionFailureBody mx_EventTile_content" ref={ref}> - {getErrorMessage(mxEvent)} + {getErrorMessage(mxEvent, verificationState)} </div> ); }) as ForwardRefExoticComponent<IBodyProps>; diff --git a/src/components/views/messages/DownloadActionButton.tsx b/src/components/views/messages/DownloadActionButton.tsx index 852c53f237..4105426bb5 100644 --- a/src/components/views/messages/DownloadActionButton.tsx +++ b/src/components/views/messages/DownloadActionButton.tsx @@ -98,6 +98,7 @@ export default class DownloadActionButton extends React.PureComponent<IProps, IS title={spinner ? _t(this.state.tooltip) : _t("action|download")} onClick={this.onDownloadClick} disabled={!!spinner} + placement="left" > <DownloadIcon /> {spinner} diff --git a/src/components/views/messages/LegacyCallEvent.tsx b/src/components/views/messages/LegacyCallEvent.tsx index 48d69ae094..dd8ccb533b 100644 --- a/src/components/views/messages/LegacyCallEvent.tsx +++ b/src/components/views/messages/LegacyCallEvent.tsx @@ -24,7 +24,6 @@ import MemberAvatar from "../avatars/MemberAvatar"; import LegacyCallEventGrouper, { LegacyCallEventGrouperEvent } from "../../structures/LegacyCallEventGrouper"; import AccessibleButton from "../elements/AccessibleButton"; import InfoTooltip, { InfoTooltipKind } from "../elements/InfoTooltip"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { formatPreciseDuration } from "../../../DateUtils"; import Clock from "../audio_messages/Clock"; @@ -118,7 +117,7 @@ export default class LegacyCallEvent extends React.PureComponent<IProps, IState> }); return ( - <AccessibleTooltipButton + <AccessibleButton className={silenceClass} onClick={this.props.callEventGrouper.toggleSilenced} title={this.state.silenced ? _t("voip|unsilence") : _t("voip|silence")} diff --git a/src/components/views/messages/MStickerBody.tsx b/src/components/views/messages/MStickerBody.tsx index dfe9d336c9..cdf388c149 100644 --- a/src/components/views/messages/MStickerBody.tsx +++ b/src/components/views/messages/MStickerBody.tsx @@ -69,8 +69,7 @@ export default class MStickerBody extends MImageBody { if (!content?.body || !content.info?.w) return null; return { - align: "center", - side: "right", + placement: "right", label: content.body, }; } diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index 13941f10b3..86c8fb127a 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -130,6 +130,7 @@ const OptionsButton: React.FC<IOptionsButtonProps> = ({ ref={button} onFocus={onFocus} tabIndex={isActive ? 0 : -1} + placement="left" > <ContextMenuIcon /> </ContextMenuTooltipButton> @@ -187,6 +188,7 @@ const ReactButton: React.FC<IReactButtonProps> = ({ mxEvent, reactions, onFocusC ref={button} onFocus={onFocus} tabIndex={isActive ? 0 : -1} + placement="left" > <EmojiIcon /> </ContextMenuTooltipButton> @@ -230,22 +232,16 @@ const ReplyInThreadButton: React.FC<IReplyInThreadButton> = ({ mxEvent }) => { } }; + const title = !hasARelation ? _t("action|reply_in_thread") : _t("threads|error_start_thread_existing_relation"); + return ( <RovingAccessibleTooltipButton className="mx_MessageActionBar_iconButton mx_MessageActionBar_threadButton" disabled={hasARelation} - tooltip={ - <> - <div className="mx_Tooltip_title"> - {!hasARelation - ? _t("action|reply_in_thread") - : _t("threads|error_start_thread_existing_relation")} - </div> - </> - } - title={!hasARelation ? _t("action|reply_in_thread") : _t("threads|error_start_thread_existing_relation")} + title={title} onClick={onClick} onContextMenu={onClick} + placement="left" > <ThreadIcon /> </RovingAccessibleTooltipButton> @@ -401,6 +397,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction onClick={this.onEditClick} onContextMenu={this.onEditClick} key="edit" + placement="left" > <EditIcon /> </RovingAccessibleTooltipButton>, @@ -414,6 +411,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction onClick={this.onCancelClick} onContextMenu={this.onCancelClick} key="cancel" + placement="left" > <TrashcanIcon /> </RovingAccessibleTooltipButton> @@ -439,6 +437,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction onClick={this.onResendClick} onContextMenu={this.onResendClick} key="resend" + placement="left" > <ResendIcon /> </RovingAccessibleTooltipButton>, @@ -465,6 +464,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction onClick={this.onReplyClick} onContextMenu={this.onReplyClick} key="reply" + placement="left" > <ReplyIcon /> </RovingAccessibleTooltipButton>, @@ -513,18 +513,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction mx_MessageActionBar_iconButton: true, mx_MessageActionBar_expandCollapseMessageButton: true, }); - const tooltip = ( - <> - <div className="mx_Tooltip_title"> - {this.props.isQuoteExpanded - ? _t("timeline|mab|collapse_reply_chain") - : _t("timeline|mab|expand_reply_chain")} - </div> - <div className="mx_Tooltip_sub"> - {_t(ALTERNATE_KEY_NAME[Key.SHIFT]) + " + " + _t("action|click")} - </div> - </> - ); + toolbarOpts.push( <RovingAccessibleTooltipButton className={expandClassName} @@ -533,9 +522,10 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction ? _t("timeline|mab|collapse_reply_chain") : _t("timeline|mab|expand_reply_chain") } - tooltip={tooltip} + caption={_t(ALTERNATE_KEY_NAME[Key.SHIFT]) + " + " + _t("action|click")} onClick={this.props.toggleThreadExpanded} key="expand" + placement="left" > {this.props.isQuoteExpanded ? <CollapseMessageIcon /> : <ExpandMessageIcon />} </RovingAccessibleTooltipButton>, diff --git a/src/components/views/messages/TextualBody.tsx b/src/components/views/messages/TextualBody.tsx index a3bac0b9cd..7246f7db57 100644 --- a/src/components/views/messages/TextualBody.tsx +++ b/src/components/views/messages/TextualBody.tsx @@ -17,7 +17,6 @@ limitations under the License. import React, { createRef, SyntheticEvent, MouseEvent } from "react"; import ReactDOM from "react-dom"; import { MsgType } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import * as HtmlUtils from "../../../HtmlUtils"; import { formatDate } from "../../../DateUtils"; @@ -32,7 +31,6 @@ import { tooltipifyLinks, unmountTooltips } from "../../../utils/tooltipify"; import { IntegrationManagers } from "../../../integrations/IntegrationManagers"; import { isPermalinkHost, tryTransformPermalinkToLocalHref } from "../../../utils/permalinks/Permalinks"; import { copyPlaintext } from "../../../utils/strings"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import UIStore from "../../../stores/UIStore"; import { Action } from "../../../dispatcher/actions"; import GenericTextContextMenu from "../context_menus/GenericTextContextMenu"; @@ -349,11 +347,7 @@ export default class TextualBody extends React.Component<IBodyProps, IState> { const reason = node.getAttribute("data-mx-spoiler") ?? undefined; node.removeAttribute("data-mx-spoiler"); // we don't want to recurse - const spoiler = ( - <TooltipProvider> - <Spoiler reason={reason} contentHtml={node.outerHTML} /> - </TooltipProvider> - ); + const spoiler = <Spoiler reason={reason} contentHtml={node.outerHTML} />; ReactDOM.render(spoiler, spoilerContainer); node.parentNode?.replaceChild(spoilerContainer, node); @@ -527,22 +521,16 @@ export default class TextualBody extends React.Component<IBodyProps, IState> { const date = this.props.mxEvent.replacingEventDate(); const dateString = date && formatDate(date); - const tooltip = ( - <div> - <div className="mx_Tooltip_title">{_t("timeline|edits|tooltip_title", { date: dateString })}</div> - <div className="mx_Tooltip_sub">{_t("timeline|edits|tooltip_sub")}</div> - </div> - ); - return ( - <AccessibleTooltipButton + <AccessibleButton className="mx_EventTile_edited" onClick={this.openHistoryDialog} - title={_t("timeline|edits|tooltip_label", { date: dateString })} - tooltip={tooltip} + aria-label={_t("timeline|edits|tooltip_label", { date: dateString })} + title={_t("timeline|edits|tooltip_title", { date: dateString })} + caption={_t("timeline|edits|tooltip_sub")} > <span>{`(${_t("common|edited")})`}</span> - </AccessibleTooltipButton> + </AccessibleButton> ); } diff --git a/src/components/views/pips/WidgetPip.tsx b/src/components/views/pips/WidgetPip.tsx index 4a0d5e6618..2ba9e39e25 100644 --- a/src/components/views/pips/WidgetPip.tsx +++ b/src/components/views/pips/WidgetPip.tsx @@ -34,7 +34,6 @@ import { WidgetType } from "../../../widgets/WidgetType"; import { WidgetMessagingStore } from "../../../stores/widgets/WidgetMessagingStore"; import WidgetUtils from "../../../utils/WidgetUtils"; import { ElementWidgetActions } from "../../../stores/widgets/ElementWidgetActions"; -import { Alignment } from "../elements/Tooltip"; interface Props { widgetId: string; @@ -128,9 +127,9 @@ export const WidgetPip: FC<Props> = ({ widgetId, room, viewingRoom, onStartMovin <Toolbar className="mx_WidgetPip_footer"> <RovingAccessibleTooltipButton onClick={onLeaveClick} - tooltip={_t("action|leave")} + title={_t("action|leave")} aria-label={_t("action|leave")} - alignment={Alignment.Top} + placement="top" > <HangupIcon className="mx_Icon mx_Icon_24" /> </RovingAccessibleTooltipButton> diff --git a/src/components/views/polls/pollHistory/PollListItem.tsx b/src/components/views/polls/pollHistory/PollListItem.tsx index 58a2909ea0..7115f3b6a1 100644 --- a/src/components/views/polls/pollHistory/PollListItem.tsx +++ b/src/components/views/polls/pollHistory/PollListItem.tsx @@ -36,7 +36,7 @@ export const PollListItem: React.FC<Props> = ({ event, onClick }) => { const formattedDate = formatLocalDateShort(event.getTs()); return ( <li data-testid={`pollListItem-${event.getId()!}`} className="mx_PollListItem" onClick={onClick}> - <Tooltip label={_t("right_panel|poll|view_poll")} side="top" isTriggerInteractive={false}> + <Tooltip label={_t("right_panel|poll|view_poll")} placement="top" isTriggerInteractive={false}> <div className="mx_PollListItem_content"> <span>{formattedDate}</span> <PollIcon className="mx_PollListItem_icon" /> diff --git a/src/components/views/polls/pollHistory/PollListItemEnded.tsx b/src/components/views/polls/pollHistory/PollListItemEnded.tsx index 657d940865..5da7772323 100644 --- a/src/components/views/polls/pollHistory/PollListItemEnded.tsx +++ b/src/components/views/polls/pollHistory/PollListItemEnded.tsx @@ -99,7 +99,7 @@ export const PollListItemEnded: React.FC<Props> = ({ event, poll, onClick }) => return ( <li data-testid={`pollListItem-${event.getId()!}`} className="mx_PollListItemEnded" onClick={onClick}> - <Tooltip label={_t("right_panel|poll|view_poll")} side="top" isTriggerInteractive={false}> + <Tooltip label={_t("right_panel|poll|view_poll")} placement="top" isTriggerInteractive={false}> <div className="mx_PollListItemEnded_content"> <div className="mx_PollListItemEnded_title"> <PollIcon className="mx_PollListItemEnded_icon" /> diff --git a/src/components/views/right_panel/HeaderButton.tsx b/src/components/views/right_panel/HeaderButton.tsx index 4fb8c1b513..bfe463c6bf 100644 --- a/src/components/views/right_panel/HeaderButton.tsx +++ b/src/components/views/right_panel/HeaderButton.tsx @@ -21,9 +21,7 @@ limitations under the License. import React, { ReactNode } from "react"; import classNames from "classnames"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; -import { ButtonEvent } from "../elements/AccessibleButton"; -import { Alignment } from "../elements/Tooltip"; +import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; interface IProps { // Whether this button is highlighted @@ -52,11 +50,11 @@ export default class HeaderButton extends React.Component<IProps> { }); return ( - <AccessibleTooltipButton + <AccessibleButton {...props} aria-current={isHighlighted ? "true" : "false"} title={title} - alignment={Alignment.Bottom} + placement="bottom" className={classes} onClick={onClick} /> diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index 72cab396c0..54a6d8ecec 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -14,9 +14,19 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; +import React, { SyntheticEvent, useCallback, useContext, useEffect, useMemo, useState } from "react"; import classNames from "classnames"; -import { MenuItem, Tooltip, Separator, ToggleMenuItem, Text, Badge, Heading } from "@vector-im/compound-web"; +import { + MenuItem, + Tooltip, + Separator, + ToggleMenuItem, + Text, + Badge, + Heading, + IconButton, + Link, +} from "@vector-im/compound-web"; import { Icon as SearchIcon } from "@vector-im/compound-design-tokens/icons/search.svg"; import { Icon as FavouriteIcon } from "@vector-im/compound-design-tokens/icons/favourite.svg"; import { Icon as UserAddIcon } from "@vector-im/compound-design-tokens/icons/user-add.svg"; @@ -32,6 +42,7 @@ import { Icon as LockIcon } from "@vector-im/compound-design-tokens/icons/lock-s import { Icon as LockOffIcon } from "@vector-im/compound-design-tokens/icons/lock-off.svg"; import { Icon as PublicIcon } from "@vector-im/compound-design-tokens/icons/public.svg"; import { Icon as ErrorIcon } from "@vector-im/compound-design-tokens/icons/error.svg"; +import { Icon as ChevronDownIcon } from "@vector-im/compound-design-tokens/icons/chevron-down.svg"; import { EventType, JoinRule, Room, RoomStateEvent } from "matrix-js-sdk/src/matrix"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; @@ -49,7 +60,6 @@ import WidgetUtils from "../../../utils/WidgetUtils"; import { IntegrationManagers } from "../../../integrations/IntegrationManagers"; import SettingsStore from "../../../settings/SettingsStore"; import WidgetAvatar from "../avatars/WidgetAvatar"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import WidgetStore, { IApp } from "../../../stores/WidgetStore"; import { E2EStatus } from "../../../utils/ShieldUtils"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; @@ -75,6 +85,10 @@ import { canInviteTo } from "../../../utils/room/canInviteTo"; import { inviteToRoom } from "../../../utils/room/inviteToRoom"; import { useAccountData } from "../../../hooks/useAccountData"; import { useRoomState } from "../../../hooks/useRoomState"; +import { useTopic } from "../../../hooks/room/useTopic"; +import { Linkify, topicToHtml } from "../../../HtmlUtils"; +import { Box } from "../../utils/Box"; +import { onRoomTopicLinkClick } from "../elements/RoomTopic"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; // :TCHAP: tchap-room-icons @@ -187,18 +201,17 @@ const AppRow: React.FC<IAppRowProps> = ({ app, room }) => { return ( <div className={classes} ref={handle}> - <AccessibleTooltipButton + <AccessibleButton className="mx_RoomSummaryCard_icon_app" onClick={onOpenWidgetClick} // only show a tooltip if the widget is pinned - title={openTitle} - forceHide={!(isPinned || isMaximised)} + title={!(isPinned || isMaximised) ? undefined : openTitle} disabled={isPinned || isMaximised} > <WidgetAvatar app={app} size="20px" /> <span>{name}</span> {subtitle} - </AccessibleTooltipButton> + </AccessibleButton> {canModifyWidget && ( <ContextMenuTooltipButton @@ -209,13 +222,13 @@ const AppRow: React.FC<IAppRowProps> = ({ app, room }) => { /> )} - <AccessibleTooltipButton + <AccessibleButton className="mx_RoomSummaryCard_app_pinToggle" onClick={togglePin} title={pinTitle} disabled={cannotPin} /> - <AccessibleTooltipButton + <AccessibleButton className="mx_RoomSummaryCard_app_maximiseToggle" onClick={toggleMaximised} title={maximiseTitle} @@ -276,6 +289,84 @@ const onRoomSettingsClick = (ev: Event): void => { PosthogTrackers.trackInteraction("WebRightPanelRoomInfoSettingsButton", ev); }; +const RoomTopic: React.FC<Pick<IProps, "room">> = ({ room }): JSX.Element | null => { + const [expanded, setExpanded] = useState(false); + + const topic = useTopic(room); + const body = topicToHtml(topic?.text, topic?.html); + + const onEditClick = (e: SyntheticEvent): void => { + e.preventDefault(); + e.stopPropagation(); + defaultDispatcher.dispatch({ action: "open_room_settings" }); + }; + + if (!body) { + return ( + <Flex + as="section" + direction="column" + justify="center" + gap="var(--cpd-space-2x)" + className="mx_RoomSummaryCard_topic" + > + <Box flex="1"> + <Link kind="primary" onClick={onEditClick}> + <Text size="sm" weight="regular"> + {_t("right_panel|add_topic")} + </Text> + </Link> + </Box> + </Flex> + ); + } + + const content = expanded ? <Linkify>{body}</Linkify> : body; + return ( + <Flex + as="section" + direction="column" + justify="center" + gap="var(--cpd-space-2x)" + className={classNames("mx_RoomSummaryCard_topic", { + mx_RoomSummaryCard_topic_collapsed: !expanded, + })} + > + <Box flex="1" className="mx_RoomSummaryCard_topic_container"> + <Text + size="sm" + weight="regular" + onClick={(ev: React.MouseEvent): void => { + if (ev.target instanceof HTMLAnchorElement) { + onRoomTopicLinkClick(ev); + return; + } + setExpanded(!expanded); + }} + > + {content} + </Text> + <IconButton + className="mx_RoomSummaryCard_topic_chevron" + size="24px" + onClick={() => setExpanded(!expanded)} + > + <ChevronDownIcon /> + </IconButton> + </Box> + {expanded && ( + <Box flex="1" className="mx_RoomSummaryCard_topic_edit"> + <Link kind="primary" onClick={onEditClick}> + <Text size="sm" weight="regular"> + {_t("action|edit")} + </Text> + </Link> + </Box> + )} + </Flex> + ); +}; + const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose, onSearchClick }) => { const cli = useContext(MatrixClientContext); @@ -393,6 +484,8 @@ const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose, on )} </Flex> */} + + <RoomTopic room={room} /> </header> ); @@ -414,7 +507,7 @@ const RoomSummaryCard: React.FC<IProps> = ({ room, permalinkCreator, onClose, on align="center" justify="space-between" > - <Tooltip label={_t("action|search")} side="right"> + <Tooltip label={_t("action|search")} placement="right"> <button className="mx_RoomSummaryCard_searchBtn" data-testid="summary-search" diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index 2e7b9bc9ab..dbc6acb29b 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -237,7 +237,12 @@ export function DeviceItem({ ); } else { return ( - <AccessibleButton className={classes} title={device.deviceId} onClick={onDeviceClick}> + <AccessibleButton + className={classes} + title={device.deviceId} + aria-label={deviceName} + onClick={onDeviceClick} + > <div className={iconClasses} /> <div className="mx_UserInfo_device_name">{deviceName}</div> <div className="mx_UserInfo_device_trusted">{trustedLabel}</div> diff --git a/src/components/views/rooms/CollapsibleButton.tsx b/src/components/views/rooms/CollapsibleButton.tsx index c2c658de10..157e7f7a1a 100644 --- a/src/components/views/rooms/CollapsibleButton.tsx +++ b/src/components/views/rooms/CollapsibleButton.tsx @@ -18,7 +18,6 @@ import React, { ComponentProps, useContext } from "react"; import classNames from "classnames"; import AccessibleButton from "../elements/AccessibleButton"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { OverflowMenuContext } from "./MessageComposerButtons"; import { IconizedContextMenuOption } from "../context_menus/IconizedContextMenu"; import { Ref } from "../../../accessibility/roving/types"; @@ -43,13 +42,8 @@ export const CollapsibleButton: React.FC<Props> = ({ } return ( - <AccessibleTooltipButton - {...props} - title={title} - className={classNames(className, iconClassName)} - ref={inputRef} - > + <AccessibleButton {...props} title={title} className={classNames(className, iconClassName)} ref={inputRef}> {children} - </AccessibleTooltipButton> + </AccessibleButton> ); }; diff --git a/src/components/views/rooms/E2EIcon.tsx b/src/components/views/rooms/E2EIcon.tsx index b6cbbe96b5..e655d8b86e 100644 --- a/src/components/views/rooms/E2EIcon.tsx +++ b/src/components/views/rooms/E2EIcon.tsx @@ -48,7 +48,7 @@ interface Props { size?: number; onClick?: () => void; hideTooltip?: boolean; - tooltipSide?: ComponentProps<typeof Tooltip>["side"]; + tooltipPlacement?: ComponentProps<typeof Tooltip>["placement"]; bordered?: boolean; } @@ -69,7 +69,7 @@ const E2EIcon: React.FC<XOR<UserProps, RoomProps>> = ({ size, onClick, hideTooltip, - tooltipSide, + tooltipPlacement, bordered, }) => { const classes = classNames( @@ -109,7 +109,7 @@ const E2EIcon: React.FC<XOR<UserProps, RoomProps>> = ({ } return ( - <Tooltip label={label} side={tooltipSide} isTriggerInteractive={!!onClick}> + <Tooltip label={label} placement={tooltipPlacement} isTriggerInteractive={!!onClick}> {content} </Tooltip> ); diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index b36fb97255..108e0d9d93 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -1546,7 +1546,7 @@ function SentReceipt({ messageState }: ISentReceiptProps): JSX.Element { return ( <div className="mx_EventTile_msgOption"> <div className="mx_ReadReceiptGroup"> - <Tooltip label={label} side="top" align="end"> + <Tooltip label={label} placement="top-end"> <div className="mx_ReadReceiptGroup_button"> <span className="mx_ReadReceiptGroup_container"> <span className={receiptClasses}>{nonCssBadge}</span> diff --git a/src/components/views/rooms/HistoryTile.tsx b/src/components/views/rooms/HistoryTile.tsx index 38449ba922..42faf0db3e 100644 --- a/src/components/views/rooms/HistoryTile.tsx +++ b/src/components/views/rooms/HistoryTile.tsx @@ -25,7 +25,6 @@ const HistoryTile: React.FC = () => { const { room } = useContext(RoomContext); const oldState = room?.getLiveTimeline().getState(EventTimeline.BACKWARDS); - const encryptionState = oldState?.getStateEvents("m.room.encryption")[0]; const historyState = oldState?.getStateEvents("m.room.history_visibility")[0]?.getContent().history_visibility; let subtitle: string | undefined; @@ -33,8 +32,6 @@ const HistoryTile: React.FC = () => { subtitle = _t("timeline|no_permission_messages_before_invite"); } else if (historyState == "joined") { subtitle = _t("timeline|no_permission_messages_before_join"); - } else if (encryptionState) { - subtitle = _t("timeline|encrypted_historical_messages_unavailable"); } return ( diff --git a/src/components/views/rooms/LegacyRoomHeader.tsx b/src/components/views/rooms/LegacyRoomHeader.tsx index 7594931e3b..82080fbd07 100644 --- a/src/components/views/rooms/LegacyRoomHeader.tsx +++ b/src/components/views/rooms/LegacyRoomHeader.tsx @@ -33,7 +33,6 @@ import RoomHeaderButtons from "../right_panel/LegacyRoomHeaderButtons"; import E2EIcon from "./E2EIcon"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import RoomTopic from "../elements/RoomTopic"; import RoomName from "../elements/RoomName"; import { E2EStatus } from "../../../utils/ShieldUtils"; @@ -68,7 +67,6 @@ import IconizedContextMenu, { } from "../context_menus/IconizedContextMenu"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { SessionDuration } from "../voip/CallDuration"; -import { Alignment } from "../elements/Tooltip"; import RoomCallBanner from "../beacon/RoomCallBanner"; import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; import { UIComponent } from "../../../settings/UIFeature"; @@ -111,12 +109,12 @@ const VoiceCallButton: FC<VoiceCallButtonProps> = ({ room, busy, setBusy, behavi }, [behavior, room, setBusy]); return ( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_voiceCallButton" onClick={onClick} - title={_t("voip|voice_call")} - tooltip={tooltip ?? _t("voip|voice_call")} - alignment={Alignment.Bottom} + aria-label={_t("voip|voice_call")} + title={tooltip ?? _t("voip|voice_call")} + placement="bottom" disabled={disabled || busy} /> ); @@ -237,13 +235,13 @@ const VideoCallButton: FC<VideoCallButtonProps> = ({ room, busy, setBusy, behavi return ( <> - <AccessibleTooltipButton + <AccessibleButton ref={buttonRef} className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_videoCallButton" onClick={onClick} - title={_t("voip|video_call")} - tooltip={tooltip ?? _t("voip|video_call")} - alignment={Alignment.Bottom} + aria-label={_t("voip|video_call")} + title={tooltip ?? _t("voip|video_call")} + placement="bottom" disabled={disabled || busy} /> {menu} @@ -442,7 +440,7 @@ const CallLayoutSelector: FC<CallLayoutSelectorProps> = ({ call }) => { return ( <> - <AccessibleTooltipButton + <AccessibleButton ref={buttonRef} className={classNames("mx_LegacyRoomHeader_button", { "mx_LegacyRoomHeader_layoutButton--freedom": layout === Layout.Tile, @@ -450,7 +448,7 @@ const CallLayoutSelector: FC<CallLayoutSelectorProps> = ({ call }) => { })} onClick={onClick} title={_t("room|header|video_call_ec_change_layout")} - alignment={Alignment.Bottom} + placement="bottom" key="layout" /> {menu} @@ -600,11 +598,11 @@ export default class RoomHeader extends React.Component<IProps, IState> { if (!this.props.viewingCall && this.props.onForgetClick) { startButtons.push( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_forgetButton" onClick={this.props.onForgetClick} title={_t("room|header|forget_room_button")} - alignment={Alignment.Bottom} + placement="bottom" key="forget" />, ); @@ -612,7 +610,7 @@ export default class RoomHeader extends React.Component<IProps, IState> { if (!this.props.viewingCall && this.props.onAppsClick) { startButtons.push( - <AccessibleTooltipButton + <AccessibleButton className={classNames("mx_LegacyRoomHeader_button mx_LegacyRoomHeader_appsButton", { mx_LegacyRoomHeader_appsButton_highlight: this.props.appsShown, })} @@ -623,7 +621,7 @@ export default class RoomHeader extends React.Component<IProps, IState> { : _t("room|header|show_widgets_button") } aria-checked={this.props.appsShown} - alignment={Alignment.Bottom} + placement="bottom" key="apps" />, ); @@ -631,11 +629,11 @@ export default class RoomHeader extends React.Component<IProps, IState> { if (!this.props.viewingCall && this.props.onSearchClick && this.props.inRoom) { startButtons.push( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_searchButton" onClick={this.props.onSearchClick} title={_t("action|search")} - alignment={Alignment.Bottom} + placement="bottom" key="search" />, ); @@ -643,11 +641,11 @@ export default class RoomHeader extends React.Component<IProps, IState> { if (this.props.onInviteClick && (!this.props.viewingCall || isVideoRoom) && this.props.inRoom) { startButtons.push( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_inviteButton" onClick={this.props.onInviteClick} title={_t("action|invite")} - alignment={Alignment.Bottom} + placement="bottom" key="invite" />, ); @@ -667,11 +665,11 @@ export default class RoomHeader extends React.Component<IProps, IState> { ); } else { endButtons.push( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_minimiseButton" onClick={this.onHideCallClick} title={_t("room|header|video_room_view_chat_button")} - alignment={Alignment.Bottom} + placement="bottom" key="minimise" />, ); @@ -754,7 +752,7 @@ export default class RoomHeader extends React.Component<IProps, IState> { onClick={this.onContextMenuOpenClick} isExpanded={!!this.state.contextMenuPosition} title={_t("room|context_menu|title")} - alignment={Alignment.Bottom} + placement="bottom" > {roomName} {this.props.room && <div className="mx_LegacyRoomHeader_chevron" />} @@ -784,7 +782,7 @@ export default class RoomHeader extends React.Component<IProps, IState> { const icon = this.props.viewingCall ? ( <div className="mx_LegacyRoomHeader_icon mx_LegacyRoomHeader_icon_video" /> ) : this.props.e2eStatus ? ( - <E2EIcon className="mx_LegacyRoomHeader_icon" status={this.props.e2eStatus} tooltipSide="bottom" /> + <E2EIcon className="mx_LegacyRoomHeader_icon" status={this.props.e2eStatus} tooltipPlacement="bottom" /> ) : // If we're expecting an E2EE status to come in, but it hasn't // yet been loaded, insert a blank div to reserve space this.client.isRoomEncrypted(this.props.room.roomId) && this.client.isCryptoEnabled() ? ( diff --git a/src/components/views/rooms/LinkPreviewGroup.tsx b/src/components/views/rooms/LinkPreviewGroup.tsx index 0b82b8729a..c940e9fce7 100644 --- a/src/components/views/rooms/LinkPreviewGroup.tsx +++ b/src/components/views/rooms/LinkPreviewGroup.tsx @@ -81,6 +81,7 @@ const LinkPreviewGroup: React.FC<IProps> = ({ links, mxEvent, onCancelClick, onH src={require("../../../../res/img/cancel.svg").default} width="18" height="18" + draggable="false" /> </AccessibleButton> ) : undefined} diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index f9aae433fe..613701bf23 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -35,7 +35,6 @@ import { makeRoomPermalink, RoomPermalinkCreator } from "../../../utils/permalin import E2EIcon from "./E2EIcon"; import SettingsStore from "../../../settings/SettingsStore"; import { aboveLeftOf, MenuProps } from "../../structures/ContextMenu"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import ReplyPreview from "./ReplyPreview"; import { UPDATE_EVENT } from "../../../stores/AsyncStore"; import VoiceRecordComposerTile from "./VoiceRecordComposerTile"; @@ -52,7 +51,7 @@ import UIStore, { UI_EVENTS } from "../../../stores/UIStore"; import RoomContext from "../../../contexts/RoomContext"; import { SettingUpdatedPayload } from "../../../dispatcher/payloads/SettingUpdatedPayload"; import MessageComposerButtons from "./MessageComposerButtons"; -import { ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { isLocalRoom } from "../../../utils/localRoom/isLocalRoom"; import { Features } from "../../../settings/Settings"; @@ -75,7 +74,7 @@ interface ISendButtonProps { function SendButton(props: ISendButtonProps): JSX.Element { return ( - <AccessibleTooltipButton + <AccessibleButton className="mx_MessageComposer_sendMessage" onClick={props.onClick} title={props.title ?? _t("composer|send_button_title")} diff --git a/src/components/views/rooms/MessageComposerButtons.tsx b/src/components/views/rooms/MessageComposerButtons.tsx index 7f23efbce2..77d809d1f8 100644 --- a/src/components/views/rooms/MessageComposerButtons.tsx +++ b/src/components/views/rooms/MessageComposerButtons.tsx @@ -19,7 +19,6 @@ import { IEventRelation, Room, MatrixClient, THREAD_RELATION_TYPE, M_POLL_START import React, { createContext, ReactElement, ReactNode, useContext, useRef } from "react"; import { _t } from "../../../languageHandler"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { CollapsibleButton } from "./CollapsibleButton"; import { MenuProps } from "../../structures/ContextMenu"; import dis from "../../../dispatcher/dispatcher"; @@ -37,7 +36,7 @@ import IconizedContextMenu, { IconizedContextMenuOptionList } from "../context_m import { EmojiButton } from "./EmojiButton"; import { filterBoolean } from "../../../utils/arrays"; import { useSettingValue } from "../../../hooks/useSettings"; -import { ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; interface IProps { addEmoji: (emoji: string) => boolean; @@ -128,7 +127,7 @@ const MessageComposerButtons: React.FC<IProps> = (props: IProps) => { <UploadButtonContextProvider roomId={room.roomId} relation={props.relation}> {mainButtons} {moreButtons.length > 0 && ( - <AccessibleTooltipButton + <AccessibleButton className={moreOptionsClasses} onClick={props.toggleButtonMenu} title={_t("quick_settings|sidebar_settings")} diff --git a/src/components/views/rooms/MessageComposerFormatBar.tsx b/src/components/views/rooms/MessageComposerFormatBar.tsx index 0d737c4001..5893540528 100644 --- a/src/components/views/rooms/MessageComposerFormatBar.tsx +++ b/src/components/views/rooms/MessageComposerFormatBar.tsx @@ -127,16 +127,6 @@ interface IFormatButtonProps { class FormatButton extends React.PureComponent<IFormatButtonProps> { public render(): React.ReactNode { const className = `mx_MessageComposerFormatBar_button mx_MessageComposerFormatBar_buttonIcon${this.props.icon}`; - let shortcut; - if (this.props.shortcut) { - shortcut = <div className="mx_MessageComposerFormatBar_tooltipShortcut">{this.props.shortcut}</div>; - } - const tooltip = ( - <div> - <div className="mx_Tooltip_title">{this.props.label}</div> - <div className="mx_Tooltip_sub">{shortcut}</div> - </div> - ); // element="button" and type="button" are necessary for the buttons to work on WebKit, // otherwise the text is deselected before onClick can ever be called @@ -145,8 +135,9 @@ class FormatButton extends React.PureComponent<IFormatButtonProps> { element="button" type="button" onClick={this.props.onClick} + aria-label={this.props.label} title={this.props.label} - tooltip={tooltip} + caption={this.props.shortcut} className={className} /> ); diff --git a/src/components/views/rooms/NotificationBadge.tsx b/src/components/views/rooms/NotificationBadge.tsx index 20ee53d95d..b142c9a128 100644 --- a/src/components/views/rooms/NotificationBadge.tsx +++ b/src/components/views/rooms/NotificationBadge.tsx @@ -121,7 +121,7 @@ export default class NotificationBadge extends React.PureComponent<XOR<IProps, I if (showUnsentTooltip && notification.level === NotificationLevel.Unsent) { return ( - <Tooltip label={_t("notifications|message_didnt_send")} side="right"> + <Tooltip label={_t("notifications|message_didnt_send")} placement="right"> {badge} </Tooltip> ); diff --git a/src/components/views/rooms/PinnedEventTile.tsx b/src/components/views/rooms/PinnedEventTile.tsx index 1395dcc2c5..581583d1d5 100644 --- a/src/components/views/rooms/PinnedEventTile.tsx +++ b/src/components/views/rooms/PinnedEventTile.tsx @@ -27,7 +27,6 @@ import { _t } from "../../../languageHandler"; import { formatDate } from "../../../DateUtils"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; @@ -76,7 +75,7 @@ export default class PinnedEventTile extends React.Component<IProps> { let unpinButton: JSX.Element | undefined; if (this.props.onUnpinClicked) { unpinButton = ( - <AccessibleTooltipButton + <AccessibleButton onClick={this.props.onUnpinClicked} className="mx_PinnedEventTile_unpinButton" title={_t("action|unpin")} diff --git a/src/components/views/rooms/RoomBreadcrumbs.tsx b/src/components/views/rooms/RoomBreadcrumbs.tsx index cd31dbd8e7..23e25f62f5 100644 --- a/src/components/views/rooms/RoomBreadcrumbs.tsx +++ b/src/components/views/rooms/RoomBreadcrumbs.tsx @@ -26,9 +26,8 @@ import { UPDATE_EVENT } from "../../../stores/AsyncStore"; import { useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; import Toolbar from "../../../accessibility/Toolbar"; import { Action } from "../../../dispatcher/actions"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; -import { ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; interface IProps {} @@ -47,15 +46,15 @@ const RoomBreadcrumbTile: React.FC<{ room: Room; onClick: (ev: ButtonEvent) => v const [onFocus, isActive, ref] = useRovingTabIndex(); return ( - <AccessibleTooltipButton + <AccessibleButton className="mx_RoomBreadcrumbs_crumb" onClick={onClick} aria-label={_t("a11y|room_name", { name: room.name })} title={room.name} - tooltipClassName="mx_RoomBreadcrumbs_Tooltip" onFocus={onFocus} ref={ref} tabIndex={isActive ? 0 : -1} + placement="right" > <DecoratedRoomAvatar room={room} @@ -64,7 +63,7 @@ const RoomBreadcrumbTile: React.FC<{ room: Room; onClick: (ev: ButtonEvent) => v hideIfDot={true} tooltipProps={{ tabIndex: isActive ? 0 : -1 }} /> - </AccessibleTooltipButton> + </AccessibleButton> ); }; diff --git a/src/components/views/rooms/RoomHeader.tsx b/src/components/views/rooms/RoomHeader.tsx index ad3bbfe558..702705eda0 100644 --- a/src/components/views/rooms/RoomHeader.tsx +++ b/src/components/views/rooms/RoomHeader.tsx @@ -264,7 +264,7 @@ export default function RoomHeader({ {/* :tchap: customize-room-header-bar - remove public forum icon {!isDirectMessage && roomState.getJoinRule() === JoinRule.Public && ( - <Tooltip label={_t("common|public_room")} side="right"> + <Tooltip label={_t("common|public_room")} placement="right"> <PublicIcon width="16px" height="16px" @@ -277,7 +277,7 @@ export default function RoomHeader({ {/* :tchap: customize-room-header-bar - do not show e2eStatus {isDirectMessage && e2eStatus === E2EStatus.Verified && ( - <Tooltip label={_t("common|verified")} side="right"> + <Tooltip label={_t("common|verified")} placement="right"> <VerifiedIcon width="16px" height="16px" @@ -290,7 +290,7 @@ export default function RoomHeader({ {/* :tchap: customize-room-header-bar - do not show E2EStatus.Warning {isDirectMessage && e2eStatus === E2EStatus.Warning && ( - <Tooltip label={_t("room|header_untrusted_label")} side="right"> + <Tooltip label={_t("room|header_untrusted_label")} placement="right"> <ErrorIcon width="16px" height="16px" diff --git a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx b/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx index c5efe10e0f..fcc269bede 100644 --- a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx +++ b/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx @@ -17,7 +17,7 @@ import { Icon as ExternalLinkIcon } from "@vector-im/compound-design-tokens/icon import { Button, IconButton, Tooltip } from "@vector-im/compound-web"; import React, { useCallback } from "react"; import { logger } from "matrix-js-sdk/src/logger"; -import { EventType, IJoinRuleEventContent, JoinRule, Room } from "matrix-js-sdk/src/matrix"; +import { EventType, JoinRule, Room } from "matrix-js-sdk/src/matrix"; import Modal from "../../../../Modal"; import ShareDialog from "../../dialogs/ShareDialog"; @@ -118,7 +118,7 @@ export const JoinRuleDialog: React.FC<{ EventType.RoomJoinRules, { join_rule: newRule, - } as IJoinRuleEventContent, + }, "", ); // Show the dialog for a bit to give the user feedback diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index 6ddc5d8fb8..f6cd324332 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -57,10 +57,10 @@ import IconizedContextMenu, { IconizedContextMenuOption, IconizedContextMenuOptionList, } from "../context_menus/IconizedContextMenu"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import ExtraTile from "./ExtraTile"; import RoomSublist, { IAuxButtonProps } from "./RoomSublist"; import { SdkContextClass } from "../../../contexts/SDKContext"; +import AccessibleButton from "../elements/AccessibleButton"; interface IProps { onKeyDown: (ev: React.KeyboardEvent, state: IRovingTabIndexState) => void; @@ -160,7 +160,7 @@ const DmAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex, dispatcher = default showSpaceInvite(activeSpace); }} disabled={!canInvite} - tooltip={canInvite ? undefined : _t("spaces|error_no_permission_invite")} + title={canInvite ? undefined : _t("spaces|error_no_permission_invite")} /> )} </IconizedContextMenuOptionList> @@ -185,7 +185,7 @@ const DmAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex, dispatcher = default ); } else if (!activeSpace && showCreateRooms) { return ( - <AccessibleTooltipButton + <AccessibleButton tabIndex={tabIndex} onClick={(e) => { dispatcher.dispatch({ action: "view_create_chat" }); @@ -250,7 +250,7 @@ const UntaggedAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex }) => { PosthogTrackers.trackInteraction("WebRoomListRoomsSublistPlusMenuCreateRoomItem", e); }} disabled={!canAddRooms} - tooltip={canAddRooms ? undefined : _t("spaces|error_no_permission_create_room")} + title={canAddRooms ? undefined : _t("spaces|error_no_permission_create_room")} /> {videoRoomsEnabled && ( <IconizedContextMenuOption @@ -266,7 +266,7 @@ const UntaggedAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex }) => { ); }} disabled={!canAddRooms} - tooltip={canAddRooms ? undefined : _t("spaces|error_no_permission_create_room")} + title={canAddRooms ? undefined : _t("spaces|error_no_permission_create_room")} > <BetaPill /> </IconizedContextMenuOption> @@ -281,7 +281,7 @@ const UntaggedAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex }) => { showAddExistingRooms(activeSpace); }} disabled={!canAddRooms} - tooltip={canAddRooms ? undefined : _t("spaces|error_no_permission_add_room")} + title={canAddRooms ? undefined : _t("spaces|error_no_permission_add_room")} /> </> ) : null} diff --git a/src/components/views/rooms/RoomListHeader.tsx b/src/components/views/rooms/RoomListHeader.tsx index 690300dfa2..bcd918eaf3 100644 --- a/src/components/views/rooms/RoomListHeader.tsx +++ b/src/components/views/rooms/RoomListHeader.tsx @@ -267,7 +267,7 @@ const RoomListHeader: React.FC<IProps> = ({ onVisibilityChange }) => { closePlusMenu(); }} disabled={!canAddSubRooms} - tooltip={!canAddSubRooms ? _t("spaces|error_no_permission_add_room") : undefined} + title={!canAddSubRooms ? _t("spaces|error_no_permission_add_room") : undefined} /> {canCreateSpaces && ( <IconizedContextMenuOption @@ -280,7 +280,7 @@ const RoomListHeader: React.FC<IProps> = ({ onVisibilityChange }) => { closePlusMenu(); }} disabled={!canAddSubSpaces} - tooltip={!canAddSubSpaces ? _t("spaces|error_no_permission_add_space") : undefined} + title={!canAddSubSpaces ? _t("spaces|error_no_permission_add_space") : undefined} > <BetaPill /> </IconizedContextMenuOption> diff --git a/src/components/views/rooms/RoomPreviewBar.tsx b/src/components/views/rooms/RoomPreviewBar.tsx index bbb3154f12..472cb4e4eb 100644 --- a/src/components/views/rooms/RoomPreviewBar.tsx +++ b/src/components/views/rooms/RoomPreviewBar.tsx @@ -15,16 +15,8 @@ limitations under the License. */ import React, { ChangeEvent, ReactNode } from "react"; -import { - Room, - RoomMember, - EventType, - RoomType, - IJoinRuleEventContent, - JoinRule, - MatrixError, -} from "matrix-js-sdk/src/matrix"; -import { KnownMembership } from "matrix-js-sdk/src/types"; +import { Room, RoomMember, EventType, RoomType, JoinRule, MatrixError } from "matrix-js-sdk/src/matrix"; +import { KnownMembership, RoomJoinRulesEventContent } from "matrix-js-sdk/src/types"; import classNames from "classnames"; import { RoomPreviewOpts, RoomViewLifecycle } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle"; @@ -257,7 +249,7 @@ export default class RoomPreviewBar extends React.Component<IProps, IState> { return ( this.props.room?.currentState .getStateEvents(EventType.RoomJoinRules, "") - ?.getContent<IJoinRuleEventContent>().join_rule ?? null + ?.getContent<RoomJoinRulesEventContent>().join_rule ?? null ); } diff --git a/src/components/views/rooms/RoomSublist.tsx b/src/components/views/rooms/RoomSublist.tsx index c8ad9d4aca..6fbccaff6a 100644 --- a/src/components/views/rooms/RoomSublist.tsx +++ b/src/components/views/rooms/RoomSublist.tsx @@ -49,7 +49,6 @@ import ContextMenu, { StyledMenuItemRadio, } from "../../structures/ContextMenu"; import AccessibleButton, { ButtonEvent } from "../../views/elements/AccessibleButton"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import ExtraTile from "./ExtraTile"; import SettingsStore from "../../../settings/SettingsStore"; import { SlidingSyncManager } from "../../../SlidingSyncManager"; @@ -684,11 +683,6 @@ export default class RoomSublist extends React.Component<IProps, IState> { const badgeContainer = <div className="mx_RoomSublist_badgeContainer">{badge}</div>; - let Button: React.ComponentType<React.ComponentProps<typeof AccessibleButton>> = AccessibleButton; - if (this.props.isMinimized) { - Button = AccessibleTooltipButton; - } - // Note: the addRoomButton conditionally gets moved around // the DOM depending on whether or not the list is minimized. // If we're minimized, we want it below the header so it @@ -707,7 +701,7 @@ export default class RoomSublist extends React.Component<IProps, IState> { > <div className="mx_RoomSublist_stickableContainer"> <div className="mx_RoomSublist_stickable"> - <Button + <AccessibleButton onFocus={onFocus} ref={ref} tabIndex={tabIndex} @@ -719,7 +713,7 @@ export default class RoomSublist extends React.Component<IProps, IState> { > <span className={collapseClasses} /> <span id={getLabelId(this.props.tagId)}>{this.props.label}</span> - </Button> + </AccessibleButton> {this.renderMenu()} {this.props.isMinimized ? null : badgeContainer} {this.props.isMinimized ? null : addRoomButton} diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 61f865e9fc..aae949858e 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -37,7 +37,6 @@ import NotificationBadge from "./NotificationBadge"; import { ActionPayload } from "../../../dispatcher/payloads"; import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore"; import { NotificationState, NotificationStateEvents } from "../../../stores/notifications/NotificationState"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { EchoChamber } from "../../../stores/local-echo/EchoChamber"; import { CachedRoomKey, RoomEchoChamber } from "../../../stores/local-echo/RoomEchoChamber"; import { PROPERTY_UPDATED } from "../../../stores/local-echo/GenericEchoChamber"; @@ -464,21 +463,11 @@ export class RoomTile extends React.PureComponent<ClassProps, State> { ariaDescribedBy = messagePreviewId(this.props.room.roomId); } - const props: Partial<React.ComponentProps<typeof AccessibleTooltipButton>> = {}; - let Button: React.ComponentType<React.ComponentProps<typeof AccessibleButton>> = AccessibleButton; - if (this.props.isMinimized) { - Button = AccessibleTooltipButton; - props.title = name; - // force the tooltip to hide whilst we are showing the context menu - props.forceHide = !!this.state.generalMenuPosition; - } - return ( <React.Fragment> <RovingTabIndexWrapper inputRef={this.roomTileRef}> {({ onFocus, isActive, ref }) => ( - <Button - {...props} + <AccessibleButton onFocus={onFocus} tabIndex={isActive ? 0 : -1} ref={ref} @@ -489,6 +478,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> { aria-label={ariaLabel} aria-selected={this.state.selected} aria-describedby={ariaDescribedBy} + title={this.props.isMinimized && !this.state.generalMenuPosition ? name : undefined} > <DecoratedRoomAvatar room={this.props.room} @@ -500,7 +490,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> { {badge} {this.renderGeneralMenu()} {this.renderNotificationsMenu(isActive)} - </Button> + </AccessibleButton> )} </RovingTabIndexWrapper> </React.Fragment> diff --git a/src/components/views/rooms/ThreadSummary.tsx b/src/components/views/rooms/ThreadSummary.tsx index 60d7534ca7..2e03262bd7 100644 --- a/src/components/views/rooms/ThreadSummary.tsx +++ b/src/components/views/rooms/ThreadSummary.tsx @@ -136,7 +136,7 @@ export const ThreadMessagePreview: React.FC<IPreviewProps> = ({ thread, showDisp {lastReply.isDecryptionFailure() ? ( <div className="mx_ThreadSummary_content mx_DecryptionFailureBody" - title={_t("threads|unable_to_decrypt")} + title={_t("timeline|decryption_failure|unable_to_decrypt")} > { /* :TCHAP: better-text-for-locked-messages - <span className="mx_ThreadSummary_message-preview">{_t("threads|unable_to_decrypt")}</span>*/} <span className="mx_ThreadSummary_message-preview"> diff --git a/src/components/views/rooms/VoiceRecordComposerTile.tsx b/src/components/views/rooms/VoiceRecordComposerTile.tsx index 70cabb474c..1001def386 100644 --- a/src/components/views/rooms/VoiceRecordComposerTile.tsx +++ b/src/components/views/rooms/VoiceRecordComposerTile.tsx @@ -19,7 +19,6 @@ import { Room, IEventRelation, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { Optional } from "matrix-events-sdk"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { _t } from "../../../languageHandler"; import { RecordingState } from "../../../audio/VoiceRecording"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -44,6 +43,7 @@ import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import RoomContext from "../../../contexts/RoomContext"; import { IUpload, VoiceMessageRecording } from "../../../audio/VoiceMessageRecording"; import { createVoiceMessageContent } from "../../../utils/createVoiceMessageContent"; +import AccessibleButton from "../elements/AccessibleButton"; interface IProps { room: Room; @@ -271,7 +271,7 @@ export default class VoiceRecordComposerTile extends React.PureComponent<IProps, } stopBtn = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_VoiceRecordComposerTile_stop" onClick={this.onRecordStartEndClick} title={tooltip} @@ -284,7 +284,7 @@ export default class VoiceRecordComposerTile extends React.PureComponent<IProps, if (this.state.recorder && this.state.recordingPhase !== RecordingState.Uploading) { deleteButton = ( - <AccessibleTooltipButton + <AccessibleButton className="mx_VoiceRecordComposerTile_delete" title={_t("action|delete")} onClick={this.onCancel} diff --git a/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx b/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx index bf0ad48cf5..0b09654b7f 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx +++ b/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx @@ -30,54 +30,42 @@ import { Icon as NumberedListIcon } from "../../../../../../res/img/element-icon import { Icon as CodeBlockIcon } from "../../../../../../res/img/element-icons/room/composer/code_block.svg"; import { Icon as IndentIcon } from "../../../../../../res/img/element-icons/room/composer/indent_increase.svg"; import { Icon as UnIndentIcon } from "../../../../../../res/img/element-icons/room/composer/indent_decrease.svg"; -import AccessibleTooltipButton from "../../../elements/AccessibleTooltipButton"; -import { Alignment } from "../../../elements/Tooltip"; -import { KeyboardShortcut } from "../../../settings/KeyboardShortcut"; -import { KeyCombo } from "../../../../../KeyBindingsManager"; import { _t } from "../../../../../languageHandler"; -import { ButtonEvent } from "../../../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../../../elements/AccessibleButton"; import { openLinkModal } from "./LinkModal"; import { useComposerContext } from "../ComposerContext"; +import { KeyboardShortcut } from "../../../settings/KeyboardShortcut"; +import { KeyCombo } from "../../../../../KeyBindingsManager"; -interface TooltipProps { - label: string; - keyCombo?: KeyCombo; -} - -function Tooltip({ label, keyCombo }: TooltipProps): JSX.Element { - return ( - <div className="mx_FormattingButtons_Tooltip"> - {label} - {keyCombo && ( - <KeyboardShortcut value={keyCombo} className="mx_FormattingButtons_Tooltip_KeyboardShortcut" /> - )} - </div> - ); -} - -interface ButtonProps extends TooltipProps { +interface ButtonProps { icon: ReactNode; actionState: ActionState; onClick: MouseEventHandler<HTMLButtonElement>; + label: string; + keyCombo?: KeyCombo; } function Button({ label, keyCombo, onClick, actionState, icon }: ButtonProps): JSX.Element { return ( - <AccessibleTooltipButton + <AccessibleButton element="button" onClick={onClick as (e: ButtonEvent) => void} - title={label} + aria-label={label} className={classNames("mx_FormattingButtons_Button", { mx_FormattingButtons_active: actionState === "reversed", mx_FormattingButtons_Button_hover: actionState === "enabled", mx_FormattingButtons_disabled: actionState === "disabled", })} - tooltip={keyCombo && <Tooltip label={label} keyCombo={keyCombo} />} - forceHide={actionState === "disabled"} - alignment={Alignment.Top} + title={actionState === "disabled" ? undefined : label} + caption={ + keyCombo && ( + <KeyboardShortcut value={keyCombo} className="mx_FormattingButtons_Tooltip_KeyboardShortcut" /> + ) + } + placement="top" > {icon} - </AccessibleTooltipButton> + </AccessibleButton> ); } diff --git a/src/components/views/settings/JoinRuleSettings.tsx b/src/components/views/settings/JoinRuleSettings.tsx index 9f4bceb02a..0d7cac30d7 100644 --- a/src/components/views/settings/JoinRuleSettings.tsx +++ b/src/components/views/settings/JoinRuleSettings.tsx @@ -15,14 +15,8 @@ limitations under the License. */ import React, { ReactNode, useEffect, useState } from "react"; -import { - IJoinRuleEventContent, - JoinRule, - RestrictedAllowType, - Room, - EventType, - Visibility, -} from "matrix-js-sdk/src/matrix"; +import { JoinRule, RestrictedAllowType, Room, EventType, Visibility } from "matrix-js-sdk/src/matrix"; +import { RoomJoinRulesEventContent } from "matrix-js-sdk/src/types"; import StyledRadioGroup, { IDefinition } from "../elements/StyledRadioGroup"; import { _t } from "../../../languageHandler"; @@ -72,7 +66,7 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({ const disabled = !room.currentState.mayClientSendStateEvent(EventType.RoomJoinRules, cli); - const [content, setContent] = useLocalEcho<IJoinRuleEventContent | undefined, IJoinRuleEventContent>( + const [content, setContent] = useLocalEcho<RoomJoinRulesEventContent | undefined, RoomJoinRulesEventContent>( () => room.currentState.getStateEvents(EventType.RoomJoinRules, "")?.getContent(), (content) => cli.sendStateEvent(room.roomId, EventType.RoomJoinRules, content, ""), onError, @@ -391,7 +385,7 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({ if (beforeJoinRule === joinRule && !restrictedAllowRoomIds) return; if (beforeChange && !(await beforeChange(joinRule))) return; - const newContent: IJoinRuleEventContent = { + const newContent: RoomJoinRulesEventContent = { join_rule: joinRule, }; diff --git a/src/components/views/settings/Notifications.tsx b/src/components/views/settings/Notifications.tsx index 693664339f..dea00babe0 100644 --- a/src/components/views/settings/Notifications.tsx +++ b/src/components/views/settings/Notifications.tsx @@ -697,6 +697,19 @@ export default class Notifications extends React.PureComponent<IProps, IState> { key={e.address} value={!!this.state.pushers?.some((p) => p.kind === "email" && p.pushkey === e.address)} label={_t("settings|notifications|enable_email_notifications", { email: e.address })} + /** :TCHAP: email-notification-setting-caption*/ + caption={_t( + "settings|notifications|enable_notifications_email_detail", + {}, + { + a: (sub) => ( + <AccessibleButton kind="link_inline" onClick={() => {window.open("https://aide.tchap.beta.gouv.fr/fr/article/notification-par-email-draft-6k7k89/","_blank")}}> + {sub} + </AccessibleButton> + ), + } + )} + /** end :TCHAP: email-notification-setting-caption */ onChange={this.onEmailNotificationsChanged.bind(this, e.address)} disabled={this.state.phase === Phase.Persisting} /> diff --git a/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx b/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx index cd3cd4ccec..317afdfca1 100644 --- a/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx +++ b/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx @@ -23,7 +23,7 @@ import AccessibleTooltipButton from "../../elements/AccessibleTooltipButton"; type Props<T extends keyof JSX.IntrinsicElements> = Omit< ComponentProps<typeof AccessibleTooltipButton<T>>, - "aria-label" | "title" | "kind" | "className" | "onClick" + "aria-label" | "title" | "kind" | "className" | "onClick" | "element" > & { isExpanded: boolean; onClick: () => void; diff --git a/src/components/views/settings/devices/FilteredDeviceListHeader.tsx b/src/components/views/settings/devices/FilteredDeviceListHeader.tsx index 551b03c96c..cb7359d448 100644 --- a/src/components/views/settings/devices/FilteredDeviceListHeader.tsx +++ b/src/components/views/settings/devices/FilteredDeviceListHeader.tsx @@ -40,7 +40,7 @@ const FilteredDeviceListHeader: React.FC<Props> = ({ return ( <div className="mx_FilteredDeviceListHeader" {...rest}> {!isSelectDisabled && ( - <Tooltip label={checkboxLabel} side="top" isTriggerInteractive={false}> + <Tooltip label={checkboxLabel} placement="top" isTriggerInteractive={false}> <StyledCheckbox kind={CheckboxStyle.Solid} checked={isAllSelected} diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/src/components/views/settings/devices/LoginWithQRSection.tsx index c85b80c3a7..b83668b6b8 100644 --- a/src/components/views/settings/devices/LoginWithQRSection.tsx +++ b/src/components/views/settings/devices/LoginWithQRSection.tsx @@ -35,39 +35,40 @@ interface IProps { wellKnown?: IClientWellKnown; } -export default class LoginWithQRSection extends React.Component<IProps> { - public constructor(props: IProps) { - super(props); - } - - public render(): JSX.Element | null { - // Needs server support for get_login_token and MSC3886: - // in r0 of MSC3882 it is exposed as a feature flag, but in stable and unstable r1 it is a capability - const capability = GET_LOGIN_TOKEN_CAPABILITY.findIn<IGetLoginTokenCapability>(this.props.capabilities); - const getLoginTokenSupported = - !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || !!capability?.enabled; - const msc3886Supported = - !!this.props.versions?.unstable_features?.["org.matrix.msc3886"] || - this.props.wellKnown?.["io.element.rendezvous"]?.server; - const offerShowQr = getLoginTokenSupported && msc3886Supported; +function shouldShowQrLegacy( + versions?: IServerVersions, + wellKnown?: IClientWellKnown, + capabilities?: Capabilities, +): boolean { + // Needs server support for (get_login_token or OIDC Device Authorization Grant) and MSC3886: + // in r0 of MSC3882 it is exposed as a feature flag, but in stable and unstable r1 it is a capability + const loginTokenCapability = GET_LOGIN_TOKEN_CAPABILITY.findIn<IGetLoginTokenCapability>(capabilities); + const getLoginTokenSupported = + !!versions?.unstable_features?.["org.matrix.msc3882"] || !!loginTokenCapability?.enabled; + const msc3886Supported = + !!versions?.unstable_features?.["org.matrix.msc3886"] || !!wellKnown?.["io.element.rendezvous"]?.server; + return getLoginTokenSupported && msc3886Supported; +} - // don't show anything if no method is available - if (!offerShowQr) { - return null; - } +const LoginWithQRSection: React.FC<IProps> = ({ onShowQr, versions, capabilities, wellKnown }) => { + const offerShowQr = shouldShowQrLegacy(versions, wellKnown, capabilities); - return ( - <SettingsSubsection heading={_t("settings|sessions|sign_in_with_qr")}> - <div className="mx_LoginWithQRSection"> - <p className="mx_SettingsTab_subsectionText"> - {_t("settings|sessions|sign_in_with_qr_description")} - </p> - <AccessibleButton onClick={this.props.onShowQr} kind="primary"> - <QrCodeIcon height={20} width={20} /> - {_t("settings|sessions|sign_in_with_qr_button")} - </AccessibleButton> - </div> - </SettingsSubsection> - ); + // don't show anything if no method is available + if (!offerShowQr) { + return null; } -} + + return ( + <SettingsSubsection heading={_t("settings|sessions|sign_in_with_qr")}> + <div className="mx_LoginWithQRSection"> + <p className="mx_SettingsTab_subsectionText">{_t("settings|sessions|sign_in_with_qr_description")}</p> + <AccessibleButton onClick={onShowQr} kind="primary"> + <QrCodeIcon height={20} width={20} /> + {_t("settings|sessions|sign_in_with_qr_button")} + </AccessibleButton> + </div> + </SettingsSubsection> + ); +}; + +export default LoginWithQRSection; diff --git a/src/components/views/settings/notifications/NotificationSettings2.tsx b/src/components/views/settings/notifications/NotificationSettings2.tsx index a15fdd1d8b..84cd57882c 100644 --- a/src/components/views/settings/notifications/NotificationSettings2.tsx +++ b/src/components/views/settings/notifications/NotificationSettings2.tsx @@ -123,7 +123,7 @@ export default function NotificationSettings2(): JSX.Element { )} </SettingsBanner> )} - <SettingsSection heading={_t("notifications|enable_prompt_toast_title")}> + <SettingsSection> <div className="mx_SettingsSubsection_content mx_NotificationSettings2_flags"> <LabelledToggleSwitch label={_t("settings|notifications|enable_notifications_account")} diff --git a/src/components/views/settings/shared/SettingsSection.tsx b/src/components/views/settings/shared/SettingsSection.tsx index be37fd3973..329ce755fc 100644 --- a/src/components/views/settings/shared/SettingsSection.tsx +++ b/src/components/views/settings/shared/SettingsSection.tsx @@ -20,10 +20,25 @@ import React, { HTMLAttributes } from "react"; import Heading from "../../typography/Heading"; export interface SettingsSectionProps extends HTMLAttributes<HTMLDivElement> { - heading: string | React.ReactNode; + heading?: string | React.ReactNode; children?: React.ReactNode; } +function renderHeading(heading: string | React.ReactNode | undefined): React.ReactNode | undefined { + switch (typeof heading) { + case "string": + return ( + <Heading as="h2" size="3"> + {heading} + </Heading> + ); + case "undefined": + return undefined; + default: + return heading; + } +} + /** * A section of settings content * A SettingsTab may contain one or more SettingsSections @@ -43,13 +58,7 @@ export interface SettingsSectionProps extends HTMLAttributes<HTMLDivElement> { */ export const SettingsSection: React.FC<SettingsSectionProps> = ({ className, heading, children, ...rest }) => ( <div {...rest} className={classnames("mx_SettingsSection", className)}> - {typeof heading === "string" ? ( - <Heading as="h2" size="3"> - {heading} - </Heading> - ) : ( - <>{heading}</> - )} + {renderHeading(heading)} <div className="mx_SettingsSection_subSections">{children}</div> </div> ); diff --git a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx index 9408274e9b..99f5a51c3b 100644 --- a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx @@ -32,7 +32,7 @@ import ThemeChoicePanel from "../../ThemeChoicePanel"; import ImageSizePanel from "../../ImageSizePanel"; import SettingsTab from "../SettingsTab"; import { SettingsSection } from "../../shared/SettingsSection"; -import SettingsSubsection, { SettingsSubsectionText } from "../../shared/SettingsSubsection"; +import SettingsSubsection from "../../shared/SettingsSubsection"; import MatrixClientContext from "../../../../../contexts/MatrixClientContext"; interface IProps {} @@ -152,12 +152,9 @@ export default class AppearanceUserSettingsTab extends React.Component<IProps, I } public render(): React.ReactNode { - const brand = SdkConfig.get().brand; - return ( <SettingsTab data-testid="mx_AppearanceUserSettingsTab"> - <SettingsSection heading={_t("settings|appearance|heading")}> - <SettingsSubsectionText>{_t("settings|appearance|subheading", { brand })}</SettingsSubsectionText> + <SettingsSection> <ThemeChoicePanel /> <LayoutSwitcher userId={this.state.userId} diff --git a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.tsx b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.tsx index def6a7725d..d4c8bcb7b2 100644 --- a/src/components/views/settings/tabs/user/GeneralUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/GeneralUserSettingsTab.tsx @@ -564,7 +564,7 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta return ( <SettingsTab data-testid="mx_GeneralUserSettingsTab"> - <SettingsSection heading={_t("common|general")}> + <SettingsSection> <ProfileSettings /> {this.renderAccountSection()} {this.renderLanguageSection()} diff --git a/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx b/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx index c8221b2df4..2bf2c0f604 100644 --- a/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx @@ -264,7 +264,7 @@ export default class HelpUserSettingsTab extends React.Component<IProps, IState> return ( <SettingsTab> - <SettingsSection heading={_t("setting|help_about|title")}> + <SettingsSection> {bugReportingSection} <SettingsSubsection heading={_t("common|faq")} description={faqText} /> <SettingsSubsection heading={_t("setting|help_about|versions")}> diff --git a/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx b/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx index 7a856e0627..ea3a75e8f3 100644 --- a/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx @@ -73,7 +73,7 @@ const KeyboardShortcutSection: React.FC<IKeyboardShortcutSectionProps> = ({ cate const KeyboardUserSettingsTab: React.FC = () => { return ( <SettingsTab> - <SettingsSection heading={_t("settings|keyboard|title")}> + <SettingsSection> {visibleCategories.map(([categoryName, category]) => { return ( <KeyboardShortcutSection key={categoryName} categoryName={categoryName} category={category} /> diff --git a/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx b/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx index 7ec29d4366..29466fc57e 100644 --- a/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx @@ -254,7 +254,7 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> return ( <SettingsTab> - <SettingsSection heading={_t("labs_mjolnir|title")}> + <SettingsSection> <SettingsSubsectionText> <strong className="warning">{_t("labs_mjolnir|advanced_warning")}</strong> <p>{_t("labs_mjolnir|explainer_1", { brand }, { code: (s) => <code>{s}</code> })}</p> diff --git a/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx b/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx index 0a00c32ca1..841babf979 100644 --- a/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx @@ -16,7 +16,6 @@ limitations under the License. import React from "react"; -import { _t } from "../../../../../languageHandler"; import { Features } from "../../../../../settings/Settings"; import SettingsStore from "../../../../../settings/SettingsStore"; import Notifications from "../../Notifications"; @@ -33,7 +32,7 @@ export default class NotificationUserSettingsTab extends React.Component { {newNotificationSettingsEnabled ? ( <NotificationSettings2 /> ) : ( - <SettingsSection heading={_t("notifications|enable_prompt_toast_title")}> + <SettingsSection> <Notifications /> </SettingsSection> )} diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx index 6758519eaf..6df2a1a03c 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx @@ -145,7 +145,7 @@ export default class PreferencesUserSettingsTab extends React.Component<IProps, return ( <SettingsTab data-testid="mx_PreferencesUserSettingsTab"> - <SettingsSection heading={_t("common|preferences")}> + <SettingsSection> {roomListSettings.length > 0 && ( <SettingsSubsection heading={_t("settings|preferences|room_list_heading")}> {this.renderGroup(roomListSettings)} diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/src/components/views/settings/tabs/user/SessionManagerTab.tsx index 61c8e85f8d..ec1d658b5b 100644 --- a/src/components/views/settings/tabs/user/SessionManagerTab.tsx +++ b/src/components/views/settings/tabs/user/SessionManagerTab.tsx @@ -32,7 +32,8 @@ import { ExtendedDevice } from "../../devices/types"; import { deleteDevicesWithInteractiveAuth } from "../../devices/deleteDevices"; import SettingsTab from "../SettingsTab"; import LoginWithQRSection from "../../devices/LoginWithQRSection"; -import LoginWithQR, { Mode } from "../../../auth/LoginWithQR"; +import LoginWithQR from "../../../auth/LoginWithQR"; +import { Mode } from "../../../auth/LoginWithQR-types"; import { useAsyncMemo } from "../../../../../hooks/useAsyncMemo"; import QuestionDialog from "../../../dialogs/QuestionDialog"; import { FilterVariation } from "../../devices/filter"; @@ -283,7 +284,13 @@ const SessionManagerTab: React.FC = () => { return ( <SettingsTab> - <SettingsSection heading={_t("settings|sessions|title")}> + <SettingsSection> + <LoginWithQRSection + onShowQr={onShowQrClicked} + versions={clientVersions} + capabilities={capabilities} + wellKnown={wellKnown} + /> <SecurityRecommendations devices={devices} goToFilteredList={onGoToFilteredList} @@ -337,12 +344,6 @@ const SessionManagerTab: React.FC = () => { /> </SettingsSubsection> )} - <LoginWithQRSection - onShowQr={onShowQrClicked} - versions={clientVersions} - capabilities={capabilities} - wellKnown={wellKnown} - /> </SettingsSection> </SettingsTab> ); diff --git a/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx b/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx index a000e208eb..91aa63170d 100644 --- a/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx @@ -80,7 +80,7 @@ const SidebarUserSettingsTab: React.FC = () => { return ( <SettingsTab> - <SettingsSection heading={_t("settings|sidebar|title")}> + <SettingsSection> <SettingsSubsection heading={_t("settings|sidebar|metaspaces_subsection")} description={_t("settings|sidebar|spaces_explainer")} diff --git a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx index c75539025a..758a48e1c5 100644 --- a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx @@ -180,7 +180,7 @@ export default class VoiceUserSettingsTab extends React.Component<{}, IState> { return ( <SettingsTab> - <SettingsSection heading={_t("settings|voip|title")}> + <SettingsSection> {requestButton} <SettingsSubsection heading={_t("settings|voip|voice_section")} stretchContent> {speakerDropdown} diff --git a/src/components/views/spaces/QuickSettingsButton.tsx b/src/components/views/spaces/QuickSettingsButton.tsx index 4702d9769b..63024c458b 100644 --- a/src/components/views/spaces/QuickSettingsButton.tsx +++ b/src/components/views/spaces/QuickSettingsButton.tsx @@ -18,7 +18,6 @@ import React from "react"; import classNames from "classnames"; import { _t } from "../../../languageHandler"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import ContextMenu, { alwaysAboveRightOf, ChevronFace, useContextMenu } from "../../structures/ContextMenu"; import AccessibleButton from "../elements/AccessibleButton"; import StyledCheckbox from "../elements/StyledCheckbox"; @@ -132,16 +131,16 @@ const QuickSettingsButton: React.FC<{ return ( <> - <AccessibleTooltipButton + <AccessibleButton className={classNames("mx_QuickSettingsButton", { expanded: !isPanelCollapsed })} onClick={openMenu} - title={_t("quick_settings|title")} + aria-label={_t("quick_settings|title")} + title={isPanelCollapsed ? _t("quick_settings|title") : undefined} ref={handle} - forceHide={!isPanelCollapsed} aria-expanded={!isPanelCollapsed} > {!isPanelCollapsed ? _t("common|settings") : null} - </AccessibleTooltipButton> + </AccessibleButton> {contextMenu} </> diff --git a/src/components/views/spaces/SpaceCreateMenu.tsx b/src/components/views/spaces/SpaceCreateMenu.tsx index 2ded20912d..a690d3494d 100644 --- a/src/components/views/spaces/SpaceCreateMenu.tsx +++ b/src/components/views/spaces/SpaceCreateMenu.tsx @@ -38,7 +38,6 @@ import { import { logger } from "matrix-js-sdk/src/logger"; import { _t } from "../../../languageHandler"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import ContextMenu, { ChevronFace } from "../../structures/ContextMenu"; import createRoom, { IOpts as ICreateOpts } from "../../../createRoom"; import MatrixClientContext, { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; @@ -310,7 +309,7 @@ const SpaceCreateMenu: React.FC<{ } else { body = ( <React.Fragment> - <AccessibleTooltipButton + <AccessibleButton className="mx_SpaceCreateMenu_back" onClick={() => setVisibility(null)} title={_t("action|go_back")} diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx index 429a18e134..a9b7093537 100644 --- a/src/components/views/spaces/SpacePanel.tsx +++ b/src/components/views/spaces/SpacePanel.tsx @@ -34,7 +34,6 @@ import { _t } from "../../../languageHandler"; import { useContextMenu } from "../../structures/ContextMenu"; import SpaceCreateMenu from "./SpaceCreateMenu"; import { SpaceButton, SpaceItem } from "./SpaceTreeLevel"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { useEventEmitter, useEventEmitterState } from "../../../hooks/useEventEmitter"; import SpaceStore from "../../../stores/spaces/SpaceStore"; import { @@ -73,6 +72,7 @@ import { ALTERNATE_KEY_NAME } from "../../../accessibility/KeyboardShortcuts"; import { shouldShowComponent } from "../../../customisations/helpers/UIComponents"; import { UIComponent } from "../../../settings/UIFeature"; import { ThreadsActivityCentre } from "./threads-activity-centre/"; +import AccessibleButton from "../elements/AccessibleButton"; const useSpaces = (): [Room[], MetaSpace[], Room[], SpaceKey] => { const invites = useEventEmitterState<Room[]>(SpaceStore.instance, UPDATE_INVITED_SPACES, () => { @@ -368,8 +368,6 @@ const SpacePanel: React.FC = () => { } }); - const isThreadsActivityCentreEnabled = useSettingValue<boolean>("threadsActivityCentre"); - return ( <RovingTabIndexProvider handleHomeEnd handleUpDown={!dragging}> {({ onKeyDownHandler, onDragEndHandler }) => ( @@ -391,24 +389,18 @@ const SpacePanel: React.FC = () => { aria-label={_t("common|spaces")} > <UserMenu isPanelCollapsed={isPanelCollapsed}> - <AccessibleTooltipButton + <AccessibleButton className={classNames("mx_SpacePanel_toggleCollapse", { expanded: !isPanelCollapsed })} onClick={() => setPanelCollapsed(!isPanelCollapsed)} title={isPanelCollapsed ? _t("action|expand") : _t("action|collapse")} - tooltip={ - <div> - <div className="mx_Tooltip_title"> - {isPanelCollapsed ? _t("action|expand") : _t("action|collapse")} - </div> - <div className="mx_Tooltip_sub"> - {IS_MAC - ? "⌘ + ⇧ + D" - : _t(ALTERNATE_KEY_NAME[Key.CONTROL]) + - " + " + - _t(ALTERNATE_KEY_NAME[Key.SHIFT]) + - " + D"} - </div> - </div> + // TODO should use a kbd element for accessibility https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd + caption={ + IS_MAC + ? "⌘ + ⇧ + D" + : _t(ALTERNATE_KEY_NAME[Key.CONTROL]) + + " + " + + _t(ALTERNATE_KEY_NAME[Key.SHIFT]) + + " + D" } /> </UserMenu> @@ -426,9 +418,8 @@ const SpacePanel: React.FC = () => { )} </Droppable> - {isThreadsActivityCentreEnabled && ( - <ThreadsActivityCentre displayButtonLabel={!isPanelCollapsed} /> - )} + <ThreadsActivityCentre displayButtonLabel={!isPanelCollapsed} /> + <QuickSettingsButton isPanelCollapsed={isPanelCollapsed} /> </nav> </DragDropContext> diff --git a/src/components/views/spaces/SpaceTreeLevel.tsx b/src/components/views/spaces/SpaceTreeLevel.tsx index 6b43399c28..253e7bf881 100644 --- a/src/components/views/spaces/SpaceTreeLevel.tsx +++ b/src/components/views/spaces/SpaceTreeLevel.tsx @@ -45,13 +45,12 @@ import { NotificationLevel } from "../../../stores/notifications/NotificationLev import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { NotificationState } from "../../../stores/notifications/NotificationState"; import SpaceContextMenu from "../context_menus/SpaceContextMenu"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; type ButtonProps<T extends keyof JSX.IntrinsicElements> = Omit< - ComponentProps<typeof AccessibleTooltipButton<T>>, - "title" | "onClick" | "size" + ComponentProps<typeof AccessibleButton<T>>, + "title" | "onClick" | "size" | "element" > & { space?: Room; spaceKey?: SpaceKey; @@ -143,17 +142,17 @@ export const SpaceButton = <T extends keyof JSX.IntrinsicElements>({ const onClick = props.onClick ?? (selected && space ? viewSpaceHome : activateSpace); return ( - <AccessibleTooltipButton + <AccessibleButton {...props} className={classNames("mx_SpaceButton", className, { mx_SpaceButton_active: selected, mx_SpaceButton_hasMenuOpen: menuDisplayed, mx_SpaceButton_narrow: isNarrow, })} - title={label} + aria-label={label} + title={!isNarrow || menuDisplayed ? undefined : label} onClick={onClick} onContextMenu={openMenu} - forceHide={!isNarrow || menuDisplayed} ref={handle} tabIndex={tabIndex} onFocus={onFocus} @@ -177,7 +176,7 @@ export const SpaceButton = <T extends keyof JSX.IntrinsicElements>({ {contextMenu} </div> - </AccessibleTooltipButton> + </AccessibleButton> ); }; diff --git a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx b/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx index 8b0b470f12..fc38326398 100644 --- a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx +++ b/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx @@ -37,6 +37,7 @@ import { KeyBindingAction } from "../../../../accessibility/KeyboardShortcuts"; import { ReleaseAnnouncement } from "../../../structures/ReleaseAnnouncement"; import { useIsReleaseAnnouncementOpen } from "../../../../hooks/useIsReleaseAnnouncementOpen"; import { useSettingValue } from "../../../../hooks/useSettings"; +import { ReleaseAnnouncementStore } from "../../../../stores/ReleaseAnnouncementStore"; interface ThreadsActivityCentreProps { /** @@ -82,13 +83,20 @@ export function ThreadsActivityCentre({ displayButtonLabel }: ThreadsActivityCen closeLabel={_t("action|ok")} > <ThreadsActivityCentreButton + disableTooltip={true} displayLabel={displayButtonLabel} notificationLevel={roomsAndNotifications.greatestNotificationLevel} + onClick={async () => { + // Open the TAC after the release announcement closing + setOpen(true); + await ReleaseAnnouncementStore.instance.nextReleaseAnnouncement(); + }} /> </ReleaseAnnouncement> ) : ( <Menu - align="end" + align="start" + side="top" open={open} onOpenChange={(newOpen) => { // Track only when the Threads Activity Centre is opened @@ -96,7 +104,6 @@ export function ThreadsActivityCentre({ displayButtonLabel }: ThreadsActivityCen setOpen(newOpen); }} - side="right" title={_t("threads_activity_centre|header")} trigger={ <ThreadsActivityCentreButton diff --git a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx b/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx index c2e35de7aa..4feb167345 100644 --- a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx +++ b/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx @@ -26,6 +26,10 @@ import { NotificationLevel } from "../../../../stores/notifications/Notification import { notificationLevelToIndicator } from "../../../../utils/notifications"; interface ThreadsActivityCentreButtonProps extends ComponentProps<typeof IconButton> { + /** + * Whether to disable the tooltip. + */ + disableTooltip?: boolean; /** * Display the `Threads` label next to the icon. */ @@ -40,12 +44,15 @@ interface ThreadsActivityCentreButtonProps extends ComponentProps<typeof IconBut * A button to open the thread activity centre. */ export const ThreadsActivityCentreButton = forwardRef<HTMLButtonElement, ThreadsActivityCentreButtonProps>( - function ThreadsActivityCentreButton({ displayLabel, notificationLevel, ...props }, ref): React.JSX.Element { + function ThreadsActivityCentreButton( + { displayLabel, notificationLevel, disableTooltip, ...props }, + ref, + ): React.JSX.Element { // Disable tooltip when the label is displayed - const openTooltip = displayLabel ? false : undefined; + const openTooltip = disableTooltip || displayLabel ? false : undefined; return ( - <Tooltip label={_t("common|threads")} side="right" open={openTooltip}> + <Tooltip label={_t("common|threads")} placement="right" open={openTooltip}> <IconButton aria-label={_t("common|threads")} className={classNames("mx_ThreadsActivityCentreButton", { expanded: displayLabel })} diff --git a/src/components/views/voip/LegacyCallView.tsx b/src/components/views/voip/LegacyCallView.tsx index 06beb329ef..e9ce19e746 100644 --- a/src/components/views/voip/LegacyCallView.tsx +++ b/src/components/views/voip/LegacyCallView.tsx @@ -36,6 +36,7 @@ import LegacyCallViewButtons from "./LegacyCallView/LegacyCallViewButtons"; import { ActionPayload } from "../../../dispatcher/payloads"; import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; +import TchapUIFeature from "../../../../../../src/tchap/util/TchapUIFeature"; /** :TCHAP: hide-video-button-on-call-screen */ interface IProps { // The call for us to display @@ -348,7 +349,13 @@ export default class LegacyCallView extends React.Component<IProps, IState> { const { callState, micMuted, vidMuted, screensharing, sidebarShown, secondaryFeed, sidebarFeeds } = this.state; // If SDPStreamMetadata isn't supported don't show video mute button in voice calls - const vidMuteButtonShown = call.opponentSupportsSDPStreamMetadata() || call.hasLocalUserMediaVideoTrack; + /** :TCHAP: hide-video-button-on-call-screen */ + // const vidMuteButtonShown = call.opponentSupportsSDPStreamMetadata() || call.hasLocalUserMediaVideoTrack; + let vidMuteButtonShown = false // hide by default + if (TchapUIFeature.isFeatureActiveForHomeserver("feature_video_call")) { + vidMuteButtonShown = call.opponentSupportsSDPStreamMetadata() || call.hasLocalUserMediaVideoTrack; + }; + /** end :TCHAP: */ // Screensharing is possible, if we can send a second stream and // identify it using SDPStreamMetadata or if we can replace the already // existing usermedia track by a screensharing track. We also need to be diff --git a/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx b/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx index fd8c85874e..055c3fe49e 100644 --- a/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx +++ b/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx @@ -20,10 +20,8 @@ import React, { ComponentProps, createRef, useState, forwardRef } from "react"; import classNames from "classnames"; import { MatrixCall } from "matrix-js-sdk/src/webrtc/call"; -import AccessibleTooltipButton from "../../elements/AccessibleTooltipButton"; import LegacyCallContextMenu from "../../context_menus/LegacyCallContextMenu"; import DialpadContextMenu from "../../context_menus/DialpadContextMenu"; -import { Alignment } from "../../elements/Tooltip"; import { alwaysMenuProps, alwaysAboveRightOf, @@ -34,7 +32,7 @@ import { import { _t } from "../../../../languageHandler"; import DeviceContextMenu from "../../context_menus/DeviceContextMenu"; import { MediaDeviceKindEnum } from "../../../../MediaDeviceHandler"; -import { ButtonEvent } from "../../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../../elements/AccessibleButton"; // Height of the header duplicated from CSS because we need to subtract it from our max // height to get the max height of the video @@ -42,29 +40,34 @@ const CONTEXT_MENU_VPADDING = 8; // How far the context menu sits above the butt const CONTROLS_HIDE_DELAY = 2000; -type ButtonProps = Omit<ComponentProps<typeof AccessibleTooltipButton>, "title" | "element"> & { +type ButtonProps = Omit<ComponentProps<typeof AccessibleButton>, "title" | "element"> & { state: boolean; onLabel?: string; offLabel?: string; + forceHide?: boolean; + onHover?: (hovering: boolean) => void; }; const LegacyCallViewToggleButton = forwardRef<HTMLElement, ButtonProps>( - ({ children, state: isOn, className, onLabel, offLabel, ...props }, ref) => { + ({ children, state: isOn, className, onLabel, offLabel, forceHide, onHover, ...props }, ref) => { const classes = classNames("mx_LegacyCallViewButtons_button", className, { mx_LegacyCallViewButtons_button_on: isOn, mx_LegacyCallViewButtons_button_off: !isOn, }); + const title = forceHide ? undefined : isOn ? onLabel : offLabel; + return ( - <AccessibleTooltipButton + <AccessibleButton ref={ref} className={classes} - title={isOn ? onLabel : offLabel} - alignment={Alignment.Top} + title={title} + placement="top" + onTooltipOpenChange={onHover} {...props} > {children} - </AccessibleTooltipButton> + </AccessibleButton> ); }, ); @@ -265,7 +268,7 @@ export default class LegacyCallViewButtons extends React.Component<IProps, IStat onClick={this.onDialpadClick} isExpanded={this.state.showDialpad} title={_t("voip|dialpad")} - alignment={Alignment.Top} + placement="top" /> )} <LegacyCallViewDropdownButton @@ -311,14 +314,14 @@ export default class LegacyCallViewButtons extends React.Component<IProps, IStat ref={this.contextMenuButton} isExpanded={this.state.showMoreMenu} title={_t("voip|more_button")} - alignment={Alignment.Top} + placement="top" /> )} - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_hangup" onClick={this.props.handlers.onHangupClick} title={_t("voip|hangup")} - alignment={Alignment.Top} + placement="top" /> </div> ); diff --git a/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx b/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx index 33484eb3ce..c60b70c932 100644 --- a/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx +++ b/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx @@ -19,7 +19,7 @@ import React from "react"; import { _t } from "../../../../languageHandler"; import RoomAvatar from "../../avatars/RoomAvatar"; -import AccessibleTooltipButton from "../../elements/AccessibleTooltipButton"; +import AccessibleButton from "../../elements/AccessibleButton"; interface LegacyCallControlsProps { onExpand?: () => void; @@ -31,21 +31,21 @@ const LegacyCallViewHeaderControls: React.FC<LegacyCallControlsProps> = ({ onExp return ( <div className="mx_LegacyCallViewHeader_controls"> {onMaximize && ( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyCallViewHeader_button mx_LegacyCallViewHeader_button_fullscreen" onClick={onMaximize} title={_t("voip|maximise")} /> )} {onPin && ( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyCallViewHeader_button mx_LegacyCallViewHeader_button_pin" onClick={onPin} title={_t("action|pin")} /> )} {onExpand && ( - <AccessibleTooltipButton + <AccessibleButton className="mx_LegacyCallViewHeader_button mx_LegacyCallViewHeader_button_expand" onClick={onExpand} title={_t("voip|expand")} diff --git a/src/hooks/useUnreadNotifications.ts b/src/hooks/useUnreadNotifications.ts index e0a2f1eeff..f687ee7f1d 100644 --- a/src/hooks/useUnreadNotifications.ts +++ b/src/hooks/useUnreadNotifications.ts @@ -15,13 +15,12 @@ limitations under the License. */ import { RoomEvent } from "matrix-js-sdk/src/matrix"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import type { NotificationCount, Room } from "matrix-js-sdk/src/matrix"; import { determineUnreadState } from "../RoomNotifs"; import { NotificationLevel } from "../stores/notifications/NotificationLevel"; import { useEventEmitter } from "./useEventEmitter"; -import SettingsStore from "../settings/SettingsStore"; export const useUnreadNotifications = ( room?: Room, @@ -31,8 +30,6 @@ export const useUnreadNotifications = ( count: number; level: NotificationLevel; } => { - const tacEnabled = useMemo(() => SettingsStore.getValue("threadsActivityCentre"), []); - const [symbol, setSymbol] = useState<string | null>(null); const [count, setCount] = useState<number>(0); const [level, setLevel] = useState<NotificationLevel>(NotificationLevel.None); @@ -53,11 +50,11 @@ export const useUnreadNotifications = ( useEventEmitter(room, RoomEvent.MyMembership, () => updateNotificationState()); const updateNotificationState = useCallback(() => { - const { symbol, count, level } = determineUnreadState(room, threadId, !tacEnabled); + const { symbol, count, level } = determineUnreadState(room, threadId, false); setSymbol(symbol); setCount(count); setLevel(level); - }, [room, threadId, tacEnabled]); + }, [room, threadId]); useEffect(() => { updateNotificationState(); diff --git a/src/hooks/useUserOnboardingContext.ts b/src/hooks/useUserOnboardingContext.ts index 1d622173f6..10a36d072a 100644 --- a/src/hooks/useUserOnboardingContext.ts +++ b/src/hooks/useUserOnboardingContext.ts @@ -27,6 +27,7 @@ export interface UserOnboardingContext { hasDevices: boolean; hasDmRooms: boolean; hasNotificationsEnabled: boolean; + hasSecureStorage: boolean, // :TCHAP: onboarding-add-secure-backup } const USER_ONBOARDING_CONTEXT_INTERVAL = 5000; @@ -99,9 +100,15 @@ export function useUserOnboardingContext(): UserOnboardingContext { const hasNotificationsEnabled = useUserOnboardingContextValue(false, async () => { return Notifier.isPossible(); }); + /** :TCHAP: onboarding-add-secure-backup */ + const hasSecureStorage = useUserOnboardingContextValue(false, async (cli) => { + const hasKey = await cli.secretStorage.hasKey() + return hasKey + }); + /** end :TCHAP: onboarding-add-secure-backup */ return useMemo( - () => ({ hasAvatar, hasDevices, hasDmRooms, hasNotificationsEnabled }), - [hasAvatar, hasDevices, hasDmRooms, hasNotificationsEnabled], + () => ({ hasAvatar, hasDevices, hasDmRooms, hasNotificationsEnabled, hasSecureStorage }), + [hasAvatar, hasDevices, hasDmRooms, hasNotificationsEnabled, hasSecureStorage], ); } diff --git a/src/hooks/useUserOnboardingTasks.ts b/src/hooks/useUserOnboardingTasks.ts index 8dc06efa5b..11930bcef9 100644 --- a/src/hooks/useUserOnboardingTasks.ts +++ b/src/hooks/useUserOnboardingTasks.ts @@ -29,6 +29,7 @@ import SdkConfig from "../SdkConfig"; import { UseCase } from "../settings/enums/UseCase"; import { useSettingValue } from "./useSettings"; import { UserOnboardingContext } from "./useUserOnboardingContext"; +import { accessSecretStorage } from "../SecurityManager"; // :TCHAP: onboarding-add-secure-backup interface UserOnboardingTask { id: string; @@ -55,7 +56,8 @@ const onClickStartDm = (ev: ButtonEvent): void => { }; const tasks: UserOnboardingTask[] = [ - { + /** :TCHAP: onboarding-add-secure-backup */ + /*{ id: "create-account", title: _t("auth|create_account_title"), description: _t("onboarding|you_made_it"), @@ -145,7 +147,91 @@ const tasks: UserOnboardingTask[] = [ }, hideOnComplete: true, }, + },*/ + { + id: "enable-secure-backup", + title: _t("onboarding|enable_secure_backup"), + description: _t("onboarding|enable_secure_backup_description"), + completed: (ctx: UserOnboardingContext) => ctx.hasSecureStorage, + action: { + label: _t("onboarding|enable_secure_backup_action"), + onClick: (ev: ButtonEvent) => { + accessSecretStorage(); + }, + }, + }, + { + id: "setup-profile", + title: _t("onboarding|set_up_profile"), + description: _t("onboarding|set_up_profile_description"), + completed: (ctx: UserOnboardingContext) => ctx.hasAvatar, + action: { + label: _t("onboarding|set_up_profile_action"), + onClick: (ev: ButtonEvent) => { + PosthogTrackers.trackInteraction("WebUserOnboardingTaskSetupProfile", ev); + defaultDispatcher.dispatch({ + action: Action.ViewUserSettings, + initialTabId: UserTab.General, + }); + }, + }, + }, + { + id: "find-friends", + title: _t("onboarding|find_friends"), + description: _t("onboarding|find_friends_description"), + completed: (ctx: UserOnboardingContext) => ctx.hasDmRooms, + relevant: [UseCase.PersonalMessaging, UseCase.Skip], + action: { + label: _t("onboarding|find_friends_action"), + onClick: onClickStartDm, + }, + }, + { + id: "find-coworkers", + title: _t("onboarding|find_coworkers"), + description: _t("onboarding|get_stuff_done"), + completed: (ctx: UserOnboardingContext) => ctx.hasDmRooms, + relevant: [UseCase.WorkMessaging], + action: { + label: _t("onboarding|find_people"), + onClick: onClickStartDm, + }, + }, + { + id: "find-community-members", + title: _t("onboarding|find_community_members"), + description: _t("onboarding|get_stuff_done"), + completed: (ctx: UserOnboardingContext) => ctx.hasDmRooms, + relevant: [UseCase.CommunityMessaging], + action: { + label: _t("onboarding|find_people"), + onClick: onClickStartDm, + }, + }, + { + id: "download-apps", + title: () => + _t("onboarding|download_app", { + brand: SdkConfig.get("brand"), + }), + description: () => + _t("onboarding|download_app_description", { + brand: SdkConfig.get("brand"), + }), + completed: (ctx: UserOnboardingContext) => ctx.hasDevices, + action: { + label: _t("onboarding|download_app_action"), + onClick: (ev: ButtonEvent) => { + PosthogTrackers.trackInteraction("WebUserOnboardingTaskDownloadApps", ev); + Modal.createDialog(AppDownloadDialog, {}, "mx_AppDownloadDialog_wrapper", false, true); + }, + }, + disabled(): boolean { + return !showAppDownloadDialogPrompt(); + }, }, + /** end :TCHAP: onboarding-add-secure-backup */ ]; export function useUserOnboardingTasks(context: UserOnboardingContext): UserOnboardingTaskWithResolvedCompletion[] { diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index eacf7b6762..3a8f2d9812 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -249,15 +249,7 @@ "completing_setup": "Dokončování nastavení nového zařízení", "confirm_code_match": "Zkontrolujte, zda se níže uvedený kód shoduje s vaším dalším zařízením:", "connecting": "Připojování…", - "error_device_already_signed_in": "Druhé zařízení je již přihlášeno.", - "error_device_not_signed_in": "Druhé zařízení není přihlášeno.", - "error_device_unsupported": "Propojení s tímto zařízením není podporováno.", - "error_homeserver_lacks_support": "Domovský server nepodporuje přihlášení pomocí jiného zařízení.", - "error_invalid_scanned_code": "Naskenovaný kód je neplatný.", - "error_linking_incomplete": "Propojení nebylo dokončeno v požadovaném čase.", "error_rate_limited": "Příliš mnoho pokusů v krátkém čase. Počkejte chvíli, než to zkusíte znovu.", - "error_request_cancelled": "Požadavek byl zrušen.", - "error_request_declined": "Požadavek byl na druhém zařízení odmítnut.", "error_unexpected": "Došlo k neočekávané chybě.", "scan_code_instruction": "Níže uvedený QR kód naskenujte pomocí přihlašovaného zařízení.", "scan_qr_code": "Skenovat QR kód", @@ -1446,18 +1438,9 @@ "rust_crypto_optin_warning": "Přechod na Rust kryptografii vyžaduje proces migrace, který může trvat několik minut. Pro deaktivaci se budete muset odhlásit a znovu přihlásit; používejte s opatrností!", "rust_crypto_requires_logout": "Jakmile je Rust kryptografie povolena, lze ji vypnout pouze odhlášením a opětovným přihlášením.", "sliding_sync": "Režim klouzavé synchronizace", - "sliding_sync_checking": "Kontrola…", - "sliding_sync_configuration": "Nastavení klouzavé synchronizace", "sliding_sync_description": "V aktivním vývoji, nelze zakázat.", - "sliding_sync_disable_warning": "Pro deaktivaci se musíte odhlásit a znovu přihlásit, používejte s opatrností!", "sliding_sync_disabled_notice": "Pro vypnutí se odhlaste a znovu přihlaste", - "sliding_sync_proxy_url_label": "URL proxy serveru", - "sliding_sync_proxy_url_optional_label": "URL proxy serveru (volitelné)", "sliding_sync_server_no_support": "Váš server nemá nativní podporu", - "sliding_sync_server_specify_proxy": "Váš server nemá nativní podporu, musíte zadat proxy server", - "sliding_sync_server_support": "Váš server má nativní podporu", - "threads_activity_centre": "Centrum aktivit vláken (ve vývoji).", - "threads_activity_centre_description": "Upozornění: V aktivním vývoji; znovu načte %(brand)s.", "under_active_development": "V aktivním vývoji.", "unrealiable_e2e": "Nespolehlivé v šifrovaných místnostech", "video_rooms": "Video místnosti", @@ -2414,13 +2397,11 @@ "custom_theme_url": "URL adresa vlastního vzhledu", "font_size": "Velikost písma", "font_size_default": "%(fontSize)s (výchozí)", - "heading": "Přizpůsobte si vzhled aplikace", "image_size_default": "Výchozí", "image_size_large": "Velký", "layout_bubbles": "Bubliny zpráv", "layout_irc": "IRC (experimentální)", "match_system_theme": "Nastavit podle vzhledu systému", - "subheading": "Nastavení vzhledu působí jen v této relaci programu %(brand)s.", "timeline_image_size": "Velikost obrázku na časové ose", "use_high_contrast": "Použít vysoký kontrast" }, @@ -3148,12 +3129,10 @@ "my_threads_description": "Zobrazit všechna vlákna, kterých jste se zúčastnili", "open_thread": "Otevřít vlákno", "show_all_threads": "Zobrazit všechna vlákna", - "show_thread_filter": "Zobrazit:", - "unable_to_decrypt": "Nepodařilo se dešifrovat zprávu" + "show_thread_filter": "Zobrazit:" }, "threads_activity_centre": { - "header": "Aktivita vláken", - "no_rooms_with_unreads_threads": "Zatím nemáte místnosti s nepřečtenými vlákny." + "header": "Aktivita vláken" }, "time": { "about_day_ago": "před jedním dnem", @@ -3196,7 +3175,6 @@ }, "creation_summary_dm": "%(creator)s vytvořil(a) tuto přímou zprávu.", "creation_summary_room": "%(creator)s vytvořil(a) a nakonfiguroval(a) místnost.", - "decryption_failure_blocked": "Odesílatel vám zablokoval přijetí této zprávy", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Dešifrování", "download_action_downloading": "Stahování", @@ -3205,7 +3183,6 @@ "tooltip_sub": "Klikněte pro zobrazení úprav", "tooltip_title": "Upraveno %(date)s" }, - "encrypted_historical_messages_unavailable": "Šifrované zprávy před tímto bodem nejsou k dispozici.", "error_no_renderer": "Tato událost nemohla být zobrazena", "error_rendering_message": "Tuto zprávu nelze načíst", "historical_messages_unavailable": "Dřívější zprávy nelze zobrazit", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 3fc5e49035..1d8beaa14c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -245,15 +245,7 @@ "completing_setup": "Schließe Anmeldung deines neuen Gerätes ab", "confirm_code_match": "Überprüfe, dass der unten angezeigte Code mit deinem anderen Gerät übereinstimmt:", "connecting": "Verbinde …", - "error_device_already_signed_in": "Das andere Gerät ist bereits angemeldet.", - "error_device_not_signed_in": "Das andere Gerät ist nicht angemeldet.", - "error_device_unsupported": "Die Verbindung mit diesem Gerät wird nicht unterstützt.", - "error_homeserver_lacks_support": "Der Heim-Server unterstützt die Anmeldung eines anderen Gerätes nicht.", - "error_invalid_scanned_code": "Der gescannte Code ist ungültig.", - "error_linking_incomplete": "Die Verbindung konnte nicht in der erforderlichen Zeit hergestellt werden.", "error_rate_limited": "Zu viele Versuche in zu kurzer Zeit. Warte ein wenig, bevor du es erneut versuchst.", - "error_request_cancelled": "Die Anfrage wurde abgebrochen.", - "error_request_declined": "Die Anfrage wurde auf dem anderen Gerät abgelehnt.", "error_unexpected": "Ein unerwarteter Fehler ist aufgetreten.", "scan_code_instruction": "Lese den folgenden QR-Code mit deinem nicht angemeldeten Gerät ein.", "scan_qr_code": "QR-Code einlesen", @@ -1431,16 +1423,9 @@ "report_to_moderators_description": "In Räumen, die Moderation unterstützen, lässt dich die Schaltfläche „Melden“ missbräuchliche Verwendung an die Raummoderation melden.", "rust_crypto": "Rust-Verschlüsselungsumsetzung", "sliding_sync": "Sliding-Sync-Modus", - "sliding_sync_checking": "Überprüfe …", - "sliding_sync_configuration": "Sliding-Sync-Konfiguration", "sliding_sync_description": "In aktiver Entwicklung, kann nicht deaktiviert werden.", - "sliding_sync_disable_warning": "Zum Deaktivieren musst du dich neu anmelden. Mit Vorsicht verwenden!", "sliding_sync_disabled_notice": "Zum Deaktivieren, melde dich ab und erneut an", - "sliding_sync_proxy_url_label": "Proxy-URL", - "sliding_sync_proxy_url_optional_label": "Proxy-URL (optional)", "sliding_sync_server_no_support": "Dein Server unterstützt dies nicht nativ", - "sliding_sync_server_specify_proxy": "Dein Server unterstützt dies nicht nativ, du musst einen Proxy angeben", - "sliding_sync_server_support": "Dein Server unterstützt dies nativ", "under_active_development": "In aktiver Entwicklung.", "unrealiable_e2e": "Nicht zuverlässig in verschlüsselten Räumen", "video_rooms": "Videoräume", @@ -2387,13 +2372,11 @@ "custom_theme_success": "Design hinzugefügt!", "custom_theme_url": "URL des selbstdefinierten Designs", "font_size": "Schriftgröße", - "heading": "Verändere das Erscheinungsbild", "image_size_default": "Standard", "image_size_large": "Groß", "layout_bubbles": "Nachrichtenblasen", "layout_irc": "IRC (Experimentell)", "match_system_theme": "An Systemdesign anpassen", - "subheading": "Die %(brand)s Einstellungen zum Erscheinungsbild wirken sich nur auf diese Sitzung aus.", "timeline_image_size": "Bildgröße im Verlauf", "use_high_contrast": "Hohen Kontrast verwenden" }, @@ -3118,8 +3101,7 @@ "my_threads_description": "Zeigt alle Threads, an denen du teilgenommen hast", "open_thread": "Thread anzeigen", "show_all_threads": "Alle Threads anzeigen", - "show_thread_filter": "Zeige:", - "unable_to_decrypt": "Nachrichten-Entschlüsselung nicht möglich" + "show_thread_filter": "Zeige:" }, "time": { "about_day_ago": "vor etwa einem Tag", @@ -3162,7 +3144,6 @@ }, "creation_summary_dm": "%(creator)s hat diese Direktnachricht erstellt.", "creation_summary_room": "%(creator)s hat den Raum erstellt und konfiguriert.", - "decryption_failure_blocked": "Der Absender hat dich vom Erhalt dieser Nachricht ausgeschlossen", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Entschlüsseln", "download_action_downloading": "Herunterladen", @@ -3171,7 +3152,6 @@ "tooltip_sub": "Klicke, um Änderungen anzuzeigen", "tooltip_title": "Geändert am %(date)s" }, - "encrypted_historical_messages_unavailable": "Vor diesem Zeitpunkt sind keine verschlüsselten Nachrichten verfügbar.", "error_no_renderer": "Dieses Ereignis konnte nicht angezeigt werden", "error_rendering_message": "Diese Nachricht kann nicht geladen werden", "historical_messages_unavailable": "Du kannst keine älteren Nachrichten lesen", diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index bd9f43db30..a678188e57 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -1913,13 +1913,11 @@ "custom_theme_success": "Το θέμα προστέθηκε!", "custom_theme_url": "URL προσαρμοσμένου θέματος", "font_size": "Μέγεθος γραμματοσειράς", - "heading": "Προσαρμόστε την εμφάνισή σας", "image_size_default": "Προεπιλογή", "image_size_large": "Μεγάλο", "layout_bubbles": "Συννεφάκια μηνυμάτων", "layout_irc": "IRC (Πειραματικό)", "match_system_theme": "Αντιστοίχιση θέματος συστήματος", - "subheading": "Οι ρυθμίσεις εμφάνισης επηρεάζουν μόνο αυτή τη %(brand)s συνεδρία.", "timeline_image_size": "Μέγεθος εικόνας στη γραμμή χρόνου", "use_high_contrast": "Χρησιμοποιήστε υψηλή αντίθεση" }, @@ -2510,7 +2508,6 @@ "tooltip_sub": "Κάντε κλικ για να δείτε τις τροποποιήσεις", "tooltip_title": "Τροποποιήθηκε στις %(date)s" }, - "encrypted_historical_messages_unavailable": "Κρυπτογραφημένα μηνύματα πριν από αυτό το σημείο δεν είναι διαθέσιμα.", "error_no_renderer": "Δεν ήταν δυνατή η εμφάνιση αυτού του συμβάντος", "error_rendering_message": "Δεν είναι δυνατή η φόρτωση αυτού του μηνύματος", "historical_messages_unavailable": "Δεν μπορείτε να δείτε προηγούμενα μηνύματα", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f0ee695d5e..7b97049e92 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -249,21 +249,29 @@ "completing_setup": "Completing set up of your new device", "confirm_code_match": "Check that the code below matches with your other device:", "connecting": "Connecting…", - "error_device_already_signed_in": "The other device is already signed in.", - "error_device_not_signed_in": "The other device isn't signed in.", - "error_device_unsupported": "Linking with this device is not supported.", - "error_homeserver_lacks_support": "The homeserver doesn't support signing in another device.", - "error_invalid_scanned_code": "The scanned code is invalid.", - "error_linking_incomplete": "The linking wasn't completed in the required time.", + "error_expired": "Sign in expired. Please try again.", + "error_expired_title": "The sign in was not completed in time", + "error_insecure_channel_detected": "A secure connection could not be made to the new device. Your existing devices are still safe and you don't need to worry about them.", + "error_insecure_channel_detected_instructions": "Now what?", + "error_insecure_channel_detected_instructions_1": "Try signing in to the other device again with a QR code in case this was a network problem", + "error_insecure_channel_detected_instructions_2": "If you encounter the same problem, try a different wifi network or use your mobile data instead of wifi", + "error_insecure_channel_detected_instructions_3": "If that doesn't work, sign in manually", + "error_insecure_channel_detected_title": "Connection not secure", + "error_other_device_already_signed_in": "You don’t need to do anything else.", + "error_other_device_already_signed_in_title": "Your other device is already signed in", "error_rate_limited": "Too many attempts in a short time. Wait some time before trying again.", - "error_request_cancelled": "The request was cancelled.", - "error_request_declined": "The request was declined on the other device.", - "error_unexpected": "An unexpected error occurred.", - "follow_remaining_instructions": "Follow the remaining instructions to verify your other device", + "error_unexpected": "An unexpected error occurred. The request to connect your other device has been cancelled.", + "error_unsupported_protocol": "This device does not support signing in to the other device with a QR code.", + "error_unsupported_protocol_title": "Other device not compatible", + "error_user_cancelled": "The sign in was cancelled on the other device.", + "error_user_cancelled_title": "Sign in request cancelled", + "error_user_declined": "You declined the request from your other device to sign in.", + "error_user_declined_title": "Sign in declined", + "follow_remaining_instructions": "Follow the instructions to link your other device", "open_element_other_device": "Open %(brand)s on your other device", "point_the_camera": "Point the camera at the QR code shown here", "scan_code_instruction": "Scan the QR code with another device", - "scan_qr_code": "Scan QR code", + "scan_qr_code": "Sign in with QR code", "select_qr_code": "Select \"%(scanQRCode)s\"", "sign_in_new_device": "Sign in new device", "waiting_for_device": "Waiting for device to sign in" @@ -1452,18 +1460,9 @@ "rust_crypto_optin_warning": "Switching to the Rust cryptography requires a migration process that may take several minutes. To disable you will need to log out and back in; use with caution!", "rust_crypto_requires_logout": "Once enabled, Rust cryptography can only be disabled by logging out and in again", "sliding_sync": "Sliding Sync mode", - "sliding_sync_checking": "Checking…", - "sliding_sync_configuration": "Sliding Sync configuration", "sliding_sync_description": "Under active development, cannot be disabled.", - "sliding_sync_disable_warning": "To disable you will need to log out and back in, use with caution!", "sliding_sync_disabled_notice": "Log out and back in to disable", - "sliding_sync_proxy_url_label": "Proxy URL", - "sliding_sync_proxy_url_optional_label": "Proxy URL (optional)", - "sliding_sync_server_no_support": "Your server lacks native support", - "sliding_sync_server_specify_proxy": "Your server lacks native support, you must specify a proxy", - "sliding_sync_server_support": "Your server has native support", - "threads_activity_centre": "Threads Activity Centre (in development)", - "threads_activity_centre_description": "Warning: Under active development; reloads %(brand)s.", + "sliding_sync_server_no_support": "Your server lacks support", "under_active_development": "Under active development.", "unrealiable_e2e": "Unreliable in encrypted rooms", "video_rooms": "Video rooms", @@ -1822,6 +1821,7 @@ }, "right_panel": { "add_integrations": "Add widgets, bridges & bots", + "add_topic": "Add topic", "edit_integrations": "Edit widgets, bridges & bots", "export_chat_button": "Export chat", "files_button": "Files", @@ -2396,6 +2396,7 @@ "brand_version": "%(brand)s version:", "clear_cache_reload": "Clear cache and reload", "crypto_version": "Crypto version:", + "dialog_title": "<strong>Settings:</strong> Help & About", "help_link": "For help with using %(brand)s, click <a>here</a>.", "homeserver": "Homeserver is <code>%(homeserverUrl)s</code>", "identity_server": "Identity server is <code>%(identityServerUrl)s</code>", @@ -2418,15 +2419,14 @@ "custom_theme_invalid": "Invalid theme schema.", "custom_theme_success": "Theme added!", "custom_theme_url": "Custom theme URL", + "dialog_title": "<strong>Settings:</strong> Appearance", "font_size": "Font size", "font_size_default": "%(fontSize)s (default)", - "heading": "Customise your appearance", "image_size_default": "Default", "image_size_large": "Large", "layout_bubbles": "Message bubbles", "layout_irc": "IRC (Experimental)", "match_system_theme": "Match system theme", - "subheading": "Appearance Settings only affect this %(brand)s session.", "timeline_image_size": "Image size in the timeline", "use_high_contrast": "Use high contrast" }, @@ -2468,6 +2468,7 @@ "deactivate_confirm_erase_label": "Hide my messages from new joiners", "deactivate_section": "Deactivate Account", "deactivate_warning": "Deactivating your account is a permanent action — be careful!", + "dialog_title": "<strong>Settings:</strong> General", "discovery_email_empty": "Discovery options will appear once you have added an email above.", "discovery_email_verification_instructions": "Verify the link in your inbox", "discovery_msisdn_empty": "Discovery options will appear once you have added a phone number above.", @@ -2575,12 +2576,20 @@ "phrase_strong_enough": "Great! This passphrase looks strong enough" }, "keyboard": { + "dialog_title": "<strong>Settings:</strong> Keyboard", "title": "Keyboard" }, + "labs": { + "dialog_title": "<strong>Settings:</strong> Labs" + }, + "labs_mjolnir": { + "dialog_title": "<strong>Settings:</strong> Ignored Users" + }, "notifications": { "default_setting_description": "This setting will be applied by default to all your rooms.", "default_setting_section": "I want to be notified for (Default Setting)", "desktop_notification_message_preview": "Show message preview in desktop notification", + "dialog_title": "<strong>Settings:</strong> Notifications", "email_description": "Receive an email summary of missed notifications", "email_section": "Email summary", "email_select": "Select which emails you want to send summaries to. Manage your emails in <button>General</button>.", @@ -2639,6 +2648,7 @@ "code_blocks_heading": "Code blocks", "compact_modern": "Use a more compact 'Modern' layout", "composer_heading": "Composer", + "dialog_title": "<strong>Settings:</strong> Preferences", "enable_hardware_acceleration": "Enable hardware acceleration", "enable_tray_icon": "Show tray icon and minimise window to it on close", "keyboard_heading": "Keyboard shortcuts", @@ -2688,6 +2698,7 @@ "dehydrated_device_enabled": "Offline device enabled", "delete_backup": "Delete Backup", "delete_backup_confirm_description": "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.", + "dialog_title": "<strong>Settings:</strong> Security & Privacy", "e2ee_default_disabled_warning": "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.", "enable_message_search": "Enable message search in encrypted rooms", "encryption_individual_verification_mode": "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.", @@ -2767,6 +2778,7 @@ "device_unverified_description_current": "Verify your current session for enhanced secure messaging.", "device_verified_description": "This session is ready for secure messaging.", "device_verified_description_current": "Your current session is ready for secure messaging.", + "dialog_title": "<strong>Settings:</strong> Sessions", "error_pusher_state": "Failed to set pusher state", "error_set_name": "Failed to set session name", "filter_all": "All", @@ -2850,6 +2862,7 @@ "show_typing_notifications": "Show typing notifications", "showbold": "Show all activity in the room list (dots or number of unread messages)", "sidebar": { + "dialog_title": "<strong>Settings:</strong> Sidebar", "metaspaces_favourites_description": "Group all your favourite rooms and people in one place.", "metaspaces_home_all_rooms": "Show all rooms", "metaspaces_home_all_rooms_description": "Show all your rooms in Home, even if they're in a space.", @@ -2879,6 +2892,7 @@ "audio_output_empty": "No Audio Outputs detected", "auto_gain_control": "Automatic gain control", "connection_section": "Connection", + "dialog_title": "<strong>Settings:</strong> Voice & Video", "echo_cancellation": "Echo cancellation", "enable_fallback_ice_server": "Allow fallback call assist server (%(server)s)", "enable_fallback_ice_server_description": "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.", @@ -3162,8 +3176,7 @@ "my_threads_description": "Shows all threads you've participated in", "open_thread": "Open thread", "show_all_threads": "Show all threads", - "show_thread_filter": "Show:", - "unable_to_decrypt": "Unable to decrypt message" + "show_thread_filter": "Show:" }, "threads_activity_centre": { "header": "Threads activity", @@ -3213,7 +3226,13 @@ }, "creation_summary_dm": "%(creator)s created this DM.", "creation_summary_room": "%(creator)s created and configured the room.", - "decryption_failure_blocked": "The sender has blocked you from receiving this message", + "decryption_failure": { + "blocked": "The sender has blocked you from receiving this message", + "historical_event_no_key_backup": "Historical messages are not available on this device", + "historical_event_unverified_device": "You need to verify this device for access to historical messages", + "historical_event_user_not_joined": "You don't have access to this message", + "unable_to_decrypt": "Unable to decrypt message" + }, "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Decrypting", "download_action_downloading": "Downloading", @@ -3222,7 +3241,6 @@ "tooltip_sub": "Click to view edits", "tooltip_title": "Edited at %(date)s" }, - "encrypted_historical_messages_unavailable": "Encrypted messages before this point are unavailable.", "error_no_renderer": "This event could not be displayed", "error_rendering_message": "Can't load this message", "historical_messages_unavailable": "You can't see earlier messages", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 7845e4bfb6..caeae03dbd 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1712,11 +1712,9 @@ "custom_theme_success": "Haŭto aldoniĝis!", "custom_theme_url": "Propra URL al haŭto", "font_size": "Grando de tiparo", - "heading": "Adaptu vian aspekton", "image_size_default": "Ordinara", "layout_bubbles": "Mesaĝaj vezikoj", - "match_system_theme": "Similiĝi la sisteman haŭton", - "subheading": "Agordoj de aspekto nur efikos sur ĉi tiun salutaĵon de %(brand)s." + "match_system_theme": "Similiĝi la sisteman haŭton" }, "automatic_language_detection_syntax_highlight": "Ŝalti memagan rekonon de lingvo por sintaksa markado", "autoplay_gifs": "Memage ludi GIF-ojn", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 936ecebb6f..39f6c85e1c 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -233,14 +233,7 @@ "completing_setup": "Terminando de configurar tu nuevo dispositivo", "confirm_code_match": "Comprueba que el siguiente código también aparece en el otro dispositivo:", "connecting": "Conectando…", - "error_device_already_signed_in": "El otro dispositivo ya tiene una sesión iniciada.", - "error_device_not_signed_in": "El otro dispositivo no tiene una sesión iniciada.", - "error_homeserver_lacks_support": "Tu servidor base no es compatible con el inicio de sesión en otro dispositivo.", - "error_invalid_scanned_code": "El código escaneado no es válido.", - "error_linking_incomplete": "El proceso de enlace ha tardado demasiado tiempo, por lo que no se ha completado.", "error_rate_limited": "Demasiados intentos en poco tiempo. Espera un poco antes de volverlo a intentar.", - "error_request_cancelled": "La solicitud ha sido cancelada.", - "error_request_declined": "El otro dispositivo ha rechazado la solicitud.", "error_unexpected": "Ha ocurrido un error inesperado.", "scan_code_instruction": "Escanea el siguiente código QR con tu dispositivo.", "scan_qr_code": "Escanear código QR", @@ -1323,16 +1316,9 @@ "report_to_moderators_description": "En las salas que sean compatible con la moderación, el botón de «Denunciar» avisará a los moderadores de la sala.", "rust_crypto": "Implementación de la criptografía en Rust", "sliding_sync": "Modo de sincronización progresiva", - "sliding_sync_checking": "Comprobando…", - "sliding_sync_configuration": "Configuración de la sincronización progresiva", "sliding_sync_description": "En desarrollo, no se puede desactivar.", - "sliding_sync_disable_warning": "Para desactivarlo, tendrás que cerrar sesión y volverla a iniciar. ¡Ten cuidado!", "sliding_sync_disabled_notice": "Cierra sesión y vuélvela a abrir para desactivar", - "sliding_sync_proxy_url_label": "URL de servidor proxy", - "sliding_sync_proxy_url_optional_label": "URL de servidor proxy (opcional)", "sliding_sync_server_no_support": "Tu servidor no es compatible", - "sliding_sync_server_specify_proxy": "Tu servidor no es compatible, debes configurar un intermediario (proxy)", - "sliding_sync_server_support": "Tu servidor es compatible", "under_active_development": "Funcionalidad en desarrollo.", "video_rooms": "Salas de vídeo", "video_rooms_a_new_way_to_chat": "Una nueva forma de hablar por voz y vídeo en %(brand)s.", @@ -2205,13 +2191,11 @@ "custom_theme_success": "¡Se añadió el tema!", "custom_theme_url": "URL de tema personalizado", "font_size": "Tamaño del texto", - "heading": "Personaliza la apariencia", "image_size_default": "Por defecto", "image_size_large": "Grande", "layout_bubbles": "Burbujas de mensaje", "layout_irc": "IRC (en pruebas)", "match_system_theme": "Usar el mismo tema que el sistema", - "subheading": "Cambiar las opciones de apariencia solo afecta a esta sesión de %(brand)s.", "timeline_image_size": "Tamaño de las imágenes en la línea de tiempo", "use_high_contrast": "Usar un modo con contraste alto" }, @@ -2866,8 +2850,7 @@ "my_threads_description": "Ver todos los hilos en los que has participado", "open_thread": "Abrir hilo", "show_all_threads": "Ver todos los hilos", - "show_thread_filter": "Mostrar:", - "unable_to_decrypt": "No se ha podido descifrar el mensaje" + "show_thread_filter": "Mostrar:" }, "time": { "about_day_ago": "hace aprox. un día", @@ -2907,7 +2890,6 @@ }, "creation_summary_dm": "%(creator)s creó este mensaje directo.", "creation_summary_room": "Sala creada y configurada por %(creator)s.", - "decryption_failure_blocked": "La persona que ha enviado este mensaje te ha bloqueado, no puedes recibir el mensaje", "download_action_decrypting": "Descifrando", "download_action_downloading": "Descargando", "edits": { @@ -2915,7 +2897,6 @@ "tooltip_sub": "Haz clic para ver las ediciones", "tooltip_title": "Última vez editado: %(date)s" }, - "encrypted_historical_messages_unavailable": "Los mensajes cifrados antes de este punto no están disponibles.", "error_no_renderer": "No se ha podido mostrar este evento", "error_rendering_message": "No se ha podido cargar este mensaje", "historical_messages_unavailable": "No puedes ver mensajes anteriores", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index cdfe16cc66..3116ea709f 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -249,15 +249,7 @@ "completing_setup": "Lõpetame uue seadme seadistamise", "confirm_code_match": "Kontrolli, et järgnev kood klapib teises seadmes kuvatava koodiga:", "connecting": "Kõne on ühendamisel…", - "error_device_already_signed_in": "Teine seade on juba võrku loginud.", - "error_device_not_signed_in": "Teine seade ei ole võrku loginud.", - "error_device_unsupported": "Sidumine selle seadmega ei ole toetatud.", - "error_homeserver_lacks_support": "Koduserver ei toeta muude seadmete võrku logimise võimalust.", - "error_invalid_scanned_code": "Skaneeritud QR-kood on vigane.", - "error_linking_incomplete": "Sidumine ei lõppenud etteantud aja jooksul.", "error_rate_limited": "Liiga palju päringuid napis ajavahemikus. Enne uuesti proovimist palun oota veidi.", - "error_request_cancelled": "Päring katkestati.", - "error_request_declined": "Teine seade lükkas päringu tagasi.", "error_unexpected": "Tekkis teadmata viga.", "scan_code_instruction": "Loe QR-koodi seadmega, kus sa oled Matrix'i võrgust välja loginud.", "scan_qr_code": "Loe QR-koodi", @@ -1439,16 +1431,9 @@ "rust_crypto_optin_warning": "Rust'i teekidel põhineva krüptograafia kasutusele võtmine eeldab andmete ümbertõstmist ja selleks võib kuluda õige mitu minutit. Selle funktsionaalsuse väljalülitamiseks pead võrgust välja logima ning seejärel tagasi logima. Palun ole kindel, et tead, mida teed!", "rust_crypto_requires_logout": "Kui Rust'i põhised teegid on kasutusel, siis selle funktsionaalsuse väljalülitamiseks pead võrgust välja logima ning seejärel tagasi logima", "sliding_sync": "Järkjärgulise sünkroniseerimise režiim", - "sliding_sync_checking": "Kontrollin…", - "sliding_sync_configuration": "Sliding Sync konfiguratsioon", "sliding_sync_description": "Aktiivselt arendamisel ega ole võimalik välja lülitada.", - "sliding_sync_disable_warning": "Väljalülitamiseks palun logi välja ning seejärel tagasi, kuid ole sellega ettevaatlik!", "sliding_sync_disabled_notice": "Väljalülitamiseks logi Matrix'i võrgust välja ja seejärel tagasi", - "sliding_sync_proxy_url_label": "Puhverserveri aadress", - "sliding_sync_proxy_url_optional_label": "Puhverserveri aadress (kui vaja)", "sliding_sync_server_no_support": "Selle funktsionaalsuse tugi on sinu koduserveris puudu", - "sliding_sync_server_specify_proxy": "Selle funktsionaalsuse tugi on sinu koduserveris puudu, palun kasuta puhverserverit", - "sliding_sync_server_support": "Selle funktsionaalsuse tugi on sinu koduserveris olemas", "under_active_development": "Aktiivselt arendamisel.", "video_rooms": "Videotoad", "video_rooms_a_new_way_to_chat": "Uus võimalus videovestlusteks rakenduses %(brand)s.", @@ -2374,13 +2359,11 @@ "custom_theme_success": "Teema sai lisatud!", "custom_theme_url": "Kohandatud teema URL", "font_size": "Fontide suurus", - "heading": "Kohenda välimust", "image_size_default": "Tavaline", "image_size_large": "Suur", "layout_bubbles": "Jutumullid", "layout_irc": "IRC (katseline)", "match_system_theme": "Kasuta süsteemset teemat", - "subheading": "Välimuse kohendused kehtivad vaid selles %(brand)s'i sessioonis.", "timeline_image_size": "Piltide suurus ajajoonel", "use_high_contrast": "Kasuta kontrastset välimust" }, @@ -3093,11 +3076,7 @@ "my_threads_description": "Näitab kõiki jutulõngasid, kus sa oled osalenud", "open_thread": "Ava jutulõng", "show_all_threads": "Näita kõiki jutulõngasid", - "show_thread_filter": "Näita:", - "unable_to_decrypt": "Sõnumi dekrüptimine ei õnnestunud" - }, - "threads_activity_centre": { - "no_rooms_with_unreads_threads": "Sul veel pole lugemata jutulõngadega jututubasid." + "show_thread_filter": "Näita:" }, "time": { "about_day_ago": "umbes päev tagasi", @@ -3140,7 +3119,6 @@ }, "creation_summary_dm": "%(creator)s alustas seda otsesuhtlust.", "creation_summary_room": "%(creator)s lõi ja seadistas jututoa.", - "decryption_failure_blocked": "Sõnumi saatja on keelanud sul selle sõnumi saamise", "download_action_decrypting": "Dekrüptin sisu", "download_action_downloading": "Laadin alla", "edits": { @@ -3148,7 +3126,6 @@ "tooltip_sub": "Muudatuste nägemiseks klõpsi", "tooltip_title": "Muutmise kuupäev %(date)s" }, - "encrypted_historical_messages_unavailable": "Enne seda ajahetke saadetud krüptitud sõnumid pole saadaval.", "error_no_renderer": "Seda sündmust ei õnnestunud kuvada", "error_rendering_message": "Selle sõnumi laadimine ei õnnestu", "historical_messages_unavailable": "Sa ei saa näha varasemaid sõnumeid", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index aad57928ed..249c72adfd 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -1503,10 +1503,8 @@ "custom_theme_success": "پوسته اضافه شد!", "custom_theme_url": "آدرس پوسته دلخواه", "font_size": "اندازه فونت", - "heading": "ظاهر پیام‌رسان خود را سفارشی‌سازی کنید", "image_size_default": "پیشفرض", - "match_system_theme": "با پوسته‌ی سیستم تطبیق پیدا کن", - "subheading": "تنظیمات ظاهری برنامه تنها همین نشست %(brand)s را تحت تاثیر قرار می‌دهد." + "match_system_theme": "با پوسته‌ی سیستم تطبیق پیدا کن" }, "automatic_language_detection_syntax_highlight": "فعال‌سازی تشخیص خودکار زبان برای پررنگ‌سازی نحوی", "big_emoji": "نمایش شکلک‌های بزرگ در گفتگوها را فعال کن", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 21535ba92b..656735aa51 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -230,14 +230,7 @@ "phone_optional_label": "Puhelin (valinnainen)", "qr_code_login": { "connecting": "Yhdistetään…", - "error_device_already_signed_in": "Toinen laite on jo sisäänkirjautunut.", - "error_device_not_signed_in": "Toinen laite ei ole sisäänkirjautunut.", - "error_device_unsupported": "Tämän laitteen kanssa linkittäminen ei ole tuettu.", - "error_invalid_scanned_code": "Skannattu koodi on virheellinen.", - "error_linking_incomplete": "Linkitystä ei suoritettu vaaditussa ajassa.", "error_rate_limited": "Liikaa yrityksiä lyhyessä ajassa. Odota hetki, ennen kuin yrität uudelleen.", - "error_request_cancelled": "Pyyntö peruttiin.", - "error_request_declined": "Pyyntö hylättiin toiselta laitteelta.", "error_unexpected": "Tapahtui odottamaton virhe.", "sign_in_new_device": "Kirjaa sisään uusi laite", "waiting_for_device": "Odotetaan laitteen sisäänkirjautumista" @@ -1253,14 +1246,9 @@ "report_to_moderators_description": "Moderointia tukevissa huoneissa väärinkäytökset voi ilmoittaa Ilmoita-painikkeella huoneen moderaattoreille.", "rust_crypto": "Rust-kryptografiatoteutus", "sliding_sync": "Liukuvan synkronoinnin tila", - "sliding_sync_checking": "Tarkistetaan…", - "sliding_sync_configuration": "Liukuvan synkronoinnin asetukset", "sliding_sync_description": "Työn alla, käytöstä poistaminen ei ole mahdollista.", "sliding_sync_disabled_notice": "Poista käytöstä kirjautumalla ulos ja takaisin sisään", - "sliding_sync_proxy_url_label": "Välityspalvelimen URL-osoite", - "sliding_sync_proxy_url_optional_label": "Välityspalvelimen URL-osoite (valinnainen)", "sliding_sync_server_no_support": "Palvelimellasi ei ole natiivitukea", - "sliding_sync_server_support": "Palvelimellasi on natiivituki", "under_active_development": "Aktiivisen kehityksen kohteena.", "video_rooms": "Videohuoneet", "video_rooms_a_new_way_to_chat": "Uusi tapa keskustella äänen ja videon välityksellä %(brand)sissä.", @@ -2091,13 +2079,11 @@ "custom_theme_success": "Teema lisätty!", "custom_theme_url": "Mukautettu teeman osoite", "font_size": "Fontin koko", - "heading": "Mukauta ulkoasua", "image_size_default": "Oletus", "image_size_large": "Suuri", "layout_bubbles": "Viestikuplat", "layout_irc": "IRC (kokeellinen)", "match_system_theme": "Käytä järjestelmän teemaa", - "subheading": "Ulkoasuasetukset vaikuttavat vain tähän %(brand)s-istuntoon.", "timeline_image_size": "Kuvan koko aikajanalla", "use_high_contrast": "Käytä suurta kontrastia" }, @@ -2733,8 +2719,7 @@ "my_threads_description": "Näyttää kaikki ketjut, joissa olet ollut osallinen", "open_thread": "Avaa ketju", "show_all_threads": "Näytä kaikki ketjut", - "show_thread_filter": "Näytä:", - "unable_to_decrypt": "Viestin salauksen purkaminen ei onnistu" + "show_thread_filter": "Näytä:" }, "time": { "about_day_ago": "noin päivä sitten", @@ -2776,7 +2761,6 @@ }, "creation_summary_dm": "%(creator)s loi tämän yksityisviestin.", "creation_summary_room": "%(creator)s loi ja määritti huoneen.", - "decryption_failure_blocked": "Lähettäjä on estänyt sinua saamasta tätä viestiä", "download_action_decrypting": "Puretaan salausta", "download_action_downloading": "Ladataan", "edits": { @@ -2784,7 +2768,6 @@ "tooltip_sub": "Napsauta nähdäksesi muokkaukset", "tooltip_title": "Muokattu %(date)s" }, - "encrypted_historical_messages_unavailable": "Tätä aiemmat salatut viestit eivät ole saatavilla.", "error_no_renderer": "Tätä tapahtumaa ei voitu näyttää", "error_rendering_message": "Tätä viestiä ei voi ladata", "historical_messages_unavailable": "Et voi nähdä aiempia viestejä", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 30441221cb..26199f9f93 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -249,15 +249,7 @@ "completing_setup": "Fin de la configuration de votre nouvel appareil", "confirm_code_match": "Vérifiez que le code ci-dessous correspond à celui sur votre autre appareil :", "connecting": "Connexion…", - "error_device_already_signed_in": "L’autre appareil est déjà connecté.", - "error_device_not_signed_in": "L’autre appareil n’est pas connecté.", - "error_device_unsupported": "L’appairage avec cet appareil n’est pas pris en charge.", - "error_homeserver_lacks_support": "Le serveur d’accueil ne prend pas en charge la connexion d’un autre appareil.", - "error_invalid_scanned_code": "Le code scanné est invalide.", - "error_linking_incomplete": "L’appairage n’a pas été effectué dans le temps imparti.", "error_rate_limited": "Trop de tentatives consécutives. Attendez un peu avant de réessayer.", - "error_request_cancelled": "La demande a été annulée.", - "error_request_declined": "La requête a été refusée sur l’autre appareil.", "error_unexpected": "Une erreur inattendue s’est produite.", "scan_code_instruction": "Scannez le QR code ci-dessous avec l’appareil qui n’est pas connecté.", "scan_qr_code": "Scanner le QR code", @@ -1445,18 +1437,9 @@ "rust_crypto_optin_warning": "Si vous passez à la cryptographie Rust, cela démarrera un processus de migration qui peut durer plusieurs minutes. Pour la désactiver, vous devrez vous déconnecter et vous reconnecter; à utiliser prudemment !", "rust_crypto_requires_logout": "Une fois activée, la cryptographie Rust ne peut être désactivée qu'en se déconnectant et se reconnectant", "sliding_sync": "Mode synchronisation progressive", - "sliding_sync_checking": "Vérification…", - "sliding_sync_configuration": "Configuration de la synchronisation progressive", "sliding_sync_description": "En cours de développement, ne peut être désactivé.", - "sliding_sync_disable_warning": "Pour la désactiver, vous devrez vous déconnecter et vous reconnecter, faites attention !", "sliding_sync_disabled_notice": "Déconnectez et revenez pour désactiver", - "sliding_sync_proxy_url_label": "URL du serveur mandataire (proxy)", - "sliding_sync_proxy_url_optional_label": "URL du serveur mandataire (proxy – facultatif)", "sliding_sync_server_no_support": "Votre serveur manque d’un support natif", - "sliding_sync_server_specify_proxy": "Votre serveur manque d’un support natif, vous devez spécifier un serveur mandataire (proxy)", - "sliding_sync_server_support": "Votre serveur a un support natif", - "threads_activity_centre": "Centre d'activité des fils de discussion (en développement)", - "threads_activity_centre_description": "Attention: en cours de développement actif. Recharge %(brand)s", "under_active_development": "En cours de développement.", "unrealiable_e2e": "Non fiable dans les salons chiffrés", "video_rooms": "Salons vidéo", @@ -2402,13 +2385,11 @@ "custom_theme_success": "Thème ajouté !", "custom_theme_url": "URL personnalisée pour le thème", "font_size": "Taille de la police", - "heading": "Personnalisez l’apparence", "image_size_default": "Par défaut", "image_size_large": "Grande", "layout_bubbles": "Message en bulles", "layout_irc": "IRC (Expérimental)", "match_system_theme": "S’adapter au thème du système", - "subheading": "Les paramètres d’apparence affecteront uniquement cette session de %(brand)s.", "timeline_image_size": "Taille d’image dans l’historique", "use_high_contrast": "Utiliser un contraste élevé" }, @@ -3132,8 +3113,7 @@ "my_threads_description": "Affiche tous les fils de discussion auxquels vous avez participé", "open_thread": "Ouvrir le fil de discussion", "show_all_threads": "Afficher tous les fils de discussion", - "show_thread_filter": "Affiche :", - "unable_to_decrypt": "Impossible de déchiffrer le message" + "show_thread_filter": "Affiche :" }, "time": { "about_day_ago": "il y a environ un jour", @@ -3176,7 +3156,6 @@ }, "creation_summary_dm": "%(creator)s a créé cette conversation privée.", "creation_summary_room": "%(creator)s a créé et configuré le salon.", - "decryption_failure_blocked": "L’expéditeur a bloqué la réception de votre message", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Déchiffrement", "download_action_downloading": "Téléchargement en cours", @@ -3185,7 +3164,6 @@ "tooltip_sub": "Cliquez pour voir les modifications", "tooltip_title": "Modifié le %(date)s" }, - "encrypted_historical_messages_unavailable": "Les messages chiffrés avant ce point sont inaccessibles.", "error_no_renderer": "Cet évènement n’a pas pu être affiché", "error_rendering_message": "Impossible de charger ce message", "historical_messages_unavailable": "Vous ne pouvez pas voir les messages plus anciens", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index e58b0ea5ad..1a7cd9d297 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1211,13 +1211,7 @@ "leave_beta_reload": "Ao saír da beta volveremos a cargar %(brand)s.", "msc3531_hide_messages_pending_moderation": "Permitir que a moderación agoche mensaxes pendentes de moderar.", "pinning": "Fixando mensaxe", - "sliding_sync_configuration": "Configuración Sliding Sync", - "sliding_sync_disable_warning": "Para desactivalo tes que saír e volver a acceder, usa con precaución!", - "sliding_sync_proxy_url_label": "URL do Proxy", - "sliding_sync_proxy_url_optional_label": "URL do proxy (optativo)", "sliding_sync_server_no_support": "O teu servidor non ten soporte nativo", - "sliding_sync_server_specify_proxy": "O teu servidor non ten servidor nativo, tes que indicar un proxy", - "sliding_sync_server_support": "O teu servidor ten soporte nativo", "video_rooms": "Salas de vídeo", "video_rooms_a_new_way_to_chat": "Un novo xeito de conversar con voz e vídeo en %(brand)s.", "video_rooms_always_on_voip_channels": "As salas de vídeo son canles VoIP sempre activas dentro dunha sala en %(brand)s.", @@ -2033,12 +2027,10 @@ "custom_theme_success": "Decorado engadido!", "custom_theme_url": "URL do decorado personalizado", "font_size": "Tamaño da letra", - "heading": "Personaliza o aspecto", "image_size_default": "Por defecto", "image_size_large": "Grande", "layout_bubbles": "Burbullas con mensaxes", "match_system_theme": "Imitar o aspecto do sistema", - "subheading": "Os axustes da aparencia só lle afectan a esta sesión %(brand)s.", "timeline_image_size": "Tamaño de imaxe na cronoloxía", "use_high_contrast": "Usar alto contraste" }, @@ -2674,7 +2666,6 @@ "tooltip_sub": "Preme para ver as edicións", "tooltip_title": "Editado o %(date)s" }, - "encrypted_historical_messages_unavailable": "Non están dispoñibles as mensaxes cifradas anteriores a este punto.", "error_no_renderer": "Non se puido amosar este evento", "error_rendering_message": "Non se cargou a mensaxe", "historical_messages_unavailable": "Non podes ver mensaxes anteriores", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 3a3c2ad736..1de2723275 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1625,12 +1625,10 @@ "custom_theme_success": "ערכת נושא התווספה בהצלחה!", "custom_theme_url": "כתובת ערכת נושא מותאמת אישית", "font_size": "גודל אותיות", - "heading": "התאם את התצוגה שלך", "image_size_default": "ברירת מחדל", "image_size_large": "גדול", "layout_bubbles": "בועות הודעות", "match_system_theme": "התאם לתבנית המערכת", - "subheading": "התאמת תצוגה משפיעה רק על התחברות זו %(brand)s.", "timeline_image_size": "גודל תמונה בציר הזמן" }, "automatic_language_detection_syntax_highlight": "החל זיהוי שפה אוטומטי עבור הדגשת מבנה הכתיבה", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 69988db429..5d3c86655e 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -243,14 +243,6 @@ "completing_setup": "Új eszköz beállításának elvégzése", "confirm_code_match": "Ellenőrizze, hogy az alábbi kód megegyezik a másik eszközödön lévővel:", "connecting": "Kapcsolás…", - "error_device_already_signed_in": "A másik eszköz már bejelentkezett.", - "error_device_not_signed_in": "A másik eszköz még nincs bejelentkezve.", - "error_device_unsupported": "Összekötés ezzel az eszközzel nem támogatott.", - "error_homeserver_lacks_support": "A Matrix-kiszolgáló nem támogatja más eszköz bejelentkeztetését.", - "error_invalid_scanned_code": "A beolvasott kód érvénytelen.", - "error_linking_incomplete": "Az összekötés az elvárt időn belül nem fejeződött be.", - "error_request_cancelled": "A kérés megszakítva.", - "error_request_declined": "A kérést elutasították a másik eszközön.", "error_unexpected": "Nemvárt hiba történt.", "scan_code_instruction": "A kijelentkezett eszközzel olvasd be a QR kódot alább.", "scan_qr_code": "QR kód beolvasása", @@ -1412,16 +1404,9 @@ "report_to_moderators_description": "A moderálást támogató szobákban a problémás tartalmat a „Jelentés” gombbal lehet a moderátorok felé jelezni.", "rust_crypto": "Rust titkosítási implementáció", "sliding_sync": "Csúszó szinkronizációs mód", - "sliding_sync_checking": "Ellenőrzés…", - "sliding_sync_configuration": "Csúszó szinkronizáció beállítása", "sliding_sync_description": "Aktív fejlesztés alatt, nem kapcsolható ki.", - "sliding_sync_disable_warning": "A kikapcsoláshoz ki, majd újra be kell jelentkezni, használja óvatosan.", "sliding_sync_disabled_notice": "A kikapcsoláshoz ki-, és bejelentkezés szükséges", - "sliding_sync_proxy_url_label": "Proxy webcíme", - "sliding_sync_proxy_url_optional_label": "Proxy webcíme (nem kötelező)", "sliding_sync_server_no_support": "A kiszolgálója nem támogatja natívan", - "sliding_sync_server_specify_proxy": "A kiszolgálója nem támogatja natívan, proxy kiszolgálót kell beállítani", - "sliding_sync_server_support": "A kiszolgálója natívan támogatja", "under_active_development": "Aktív fejlesztés alatt.", "video_rooms": "Videószobák", "video_rooms_a_new_way_to_chat": "Új csevegési lehetőség a(z) %(brand)s alkalmazásban, hanggal és videóval.", @@ -2329,13 +2314,11 @@ "custom_theme_success": "Téma hozzáadva!", "custom_theme_url": "Egyéni téma webcíme", "font_size": "Betűméret", - "heading": "A megjelenés testreszabása", "image_size_default": "Alapértelmezett", "image_size_large": "Nagy", "layout_bubbles": "Üzenetbuborékok", "layout_irc": "IRC (kísérleti)", "match_system_theme": "Rendszer témájához megfelelő", - "subheading": "A megjelenés beállításai csak erre az %(brand)s munkamenetre lesznek érvényesek.", "timeline_image_size": "Képméret az idővonalon", "use_high_contrast": "Nagy kontraszt használata" }, @@ -3057,8 +3040,7 @@ "my_threads_description": "Minden üzenetszál megjelenítése, amelyben részt vesz", "open_thread": "Üzenetszál megnyitása", "show_all_threads": "Minden üzenetszál megjelenítése", - "show_thread_filter": "Megjelenítés:", - "unable_to_decrypt": "Üzenet visszafejtése sikertelen" + "show_thread_filter": "Megjelenítés:" }, "time": { "about_day_ago": "egy napja", @@ -3101,7 +3083,6 @@ }, "creation_summary_dm": "%(creator)s hozta létre ezt az üzenetet.", "creation_summary_room": "%(creator)s elkészítette és beállította a szobát.", - "decryption_failure_blocked": "A feladó megtagadta az Ön hozzáférését ehhez az üzenethez", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Visszafejtés", "download_action_downloading": "Letöltés", @@ -3110,7 +3091,6 @@ "tooltip_sub": "A szerkesztések megtekintéséhez kattints", "tooltip_title": "Szerkesztve ekkor: %(date)s" }, - "encrypted_historical_messages_unavailable": "A régebbi titkosított üzenetek elérhetetlenek.", "error_no_renderer": "Az eseményt nem lehet megjeleníteni", "error_rendering_message": "Ezt az üzenetet nem sikerült betölteni", "historical_messages_unavailable": "Nem tekintheted meg a régebbi üzeneteket", diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index 4f942d89da..e35d2e6b46 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -243,14 +243,6 @@ "completing_setup": "Menyelesaikan penyiapan perangkat baru Anda", "confirm_code_match": "Periksa bahwa kode di bawah cocok dengan perangkat Anda yang lain:", "connecting": "Menghubungkan…", - "error_device_already_signed_in": "Perangkat yang lain sudah masuk.", - "error_device_not_signed_in": "Perangkat yang lain belum masuk.", - "error_device_unsupported": "Penautan dengan perangkat ini tidak didukung.", - "error_homeserver_lacks_support": "Homeserver tidak mendukung masuk ke perangkat lain.", - "error_invalid_scanned_code": "Kode yang dipindai tidak absah.", - "error_linking_incomplete": "Penautan tidak selesai dalam waktu yang dibutuhkan.", - "error_request_cancelled": "Permintaan dibatalkan.", - "error_request_declined": "Permintaan ditolak di perangkat yang lain.", "error_unexpected": "Sebuah kesalahan terjadi secara tidak terduga.", "scan_code_instruction": "Pindai kode QR di bawah dengan perangkat Anda yang sudah keluar dari akun.", "scan_qr_code": "Pindai kode QR", @@ -1418,16 +1410,9 @@ "report_to_moderators_description": "Dalam ruangan yang mendukung moderasi, tombol “Laporkan” memungkinkan Anda untuk melaporkan penyalahgunaan ke moderator ruangan.", "rust_crypto": "Implementasi kriptografi Rust", "sliding_sync": "Mode Sinkronisasi Geser", - "sliding_sync_checking": "Memeriksa…", - "sliding_sync_configuration": "Konfigurasi Penyinkronan Bergeser", "sliding_sync_description": "Dalam pengembangan aktif, tidak dapat dinonaktifkan.", - "sliding_sync_disable_warning": "Untuk menonaktifkan Anda harus keluar dan masuk kembali, gunakan dengan hati-hati!", "sliding_sync_disabled_notice": "Keluar dan masuk kembali ke akun untuk menonaktifkan", - "sliding_sync_proxy_url_label": "URL Proksi", - "sliding_sync_proxy_url_optional_label": "URL Proksi (opsional)", "sliding_sync_server_no_support": "Server Anda belum mendukungnya", - "sliding_sync_server_specify_proxy": "Server Anda belum mendukungnya, Anda harus menetapkan sebuah proksi", - "sliding_sync_server_support": "Server Anda mendukungnya", "under_active_development": "Dalam pengembangan aktif.", "unrealiable_e2e": "Tidak dapat diandalkan di ruangan terenkripsi", "video_rooms": "Ruangan video", @@ -2362,13 +2347,11 @@ "custom_theme_success": "Tema ditambahkan!", "custom_theme_url": "URL tema kustom", "font_size": "Ukuran font", - "heading": "Ubah tampilan Anda", "image_size_default": "Bawaan", "image_size_large": "Besar", "layout_bubbles": "Gelembung pesan", "layout_irc": "IRC (Eksperimental)", "match_system_theme": "Sesuaikan dengan tema sistem", - "subheading": "Pengaturan Tampilan hanya ditetapkan di sesi %(brand)s ini.", "timeline_image_size": "Ukuran gambar di lini masa", "use_high_contrast": "Gunakan kontras tinggi" }, @@ -3091,8 +3074,7 @@ "my_threads_description": "Menampilkan semua utasan yang Anda berpartisipasi", "open_thread": "Buka utasan", "show_all_threads": "Tampilkan semua utasan", - "show_thread_filter": "Tampilkan:", - "unable_to_decrypt": "Tidak dapat mendekripsi pesan" + "show_thread_filter": "Tampilkan:" }, "time": { "about_day_ago": "1 hari yang lalu", @@ -3135,7 +3117,6 @@ }, "creation_summary_dm": "%(creator)s membuat pesan langsung ini.", "creation_summary_room": "%(creator)s membuat dan mengatur ruangan ini.", - "decryption_failure_blocked": "Pengirim telah memblokir Anda supaya tidak menerima pesan ini", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Mendekripsi", "download_action_downloading": "Mengunduh", @@ -3144,7 +3125,6 @@ "tooltip_sub": "Klik untuk melihat editan", "tooltip_title": "Diedit di %(date)s" }, - "encrypted_historical_messages_unavailable": "Pesan-pesan terenkripsi sebelum titik ini tidak tersedia.", "error_no_renderer": "Peristiwa ini tidak dapat ditampilkan", "error_rendering_message": "Tidak dapat memuat pesan ini", "historical_messages_unavailable": "Anda tidak dapat melihat pesan-pesan awal", diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 8c8122b30b..99b180dd47 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -218,7 +218,6 @@ "phone_label": "Sími", "phone_optional_label": "Sími (valfrjálst)", "qr_code_login": { - "error_invalid_scanned_code": "Skannaði kóðinn er ógildur.", "sign_in_new_device": "Skrá inn nýtt tæki", "waiting_for_device": "Bíð eftir að tækið skráist inn" }, @@ -1167,8 +1166,6 @@ "pinning": "Festing skilaboða", "report_to_moderators": "Tilkynna til umsjónarmanna", "report_to_moderators_description": "Í spjallrásum sem styðja eftirlit umsjónarmanna, mun 'Kæra'-hnappurinn gefa þér færi á að tilkynna misnotkun til umsjónarmanna spjallrása.", - "sliding_sync_proxy_url_label": "Slóð milliþjóns", - "sliding_sync_proxy_url_optional_label": "Slóð milliþjóns (valfrjálst)", "under_active_development": "Í virkri þróun.", "video_rooms": "Myndspjallrásir", "video_rooms_a_new_way_to_chat": "Ný leið til að spjalla með tali og myndmerki í %(brand)s.", @@ -1929,13 +1926,11 @@ "custom_theme_success": "Þema bætt við!", "custom_theme_url": "Slóð á sérsniðið þema", "font_size": "Leturstærð", - "heading": "Sérsníddu útlitið þitt", "image_size_default": "Sjálfgefið", "image_size_large": "Stórt", "layout_bubbles": "Skilaboðablöðrur", "layout_irc": "IRC (á tilraunastigi)", "match_system_theme": "Samsvara þema kerfis", - "subheading": "Stillingar útlits hafa einungis áhrif á þessa %(brand)s setu.", "timeline_image_size": "Stærð myndar í tímalínunni", "use_high_contrast": "Nota mikil birtuskil" }, @@ -2531,8 +2526,7 @@ "my_threads_description": "Birtir alla spjallþræði sem þú hefur tekið þátt í", "open_thread": "Opna spjallþráð", "show_all_threads": "Birta alla spjallþræði", - "show_thread_filter": "Sýna:", - "unable_to_decrypt": "Tókst ekki að afkóða skilaboð" + "show_thread_filter": "Sýna:" }, "time": { "about_day_ago": "fyrir um degi síðan", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 46085e1050..f08b5605af 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -249,15 +249,7 @@ "completing_setup": "Completamento configurazione nuovo dispositivo", "confirm_code_match": "Controlla che il codice sottostante corrisponda nell'altro dispositivo:", "connecting": "In connessione…", - "error_device_already_signed_in": "L'altro dispositivo ha già fatto l'accesso.", - "error_device_not_signed_in": "L'altro dispositivo non ha fatto l'accesso.", - "error_device_unsupported": "Il collegamento con questo dispositivo non è supportato.", - "error_homeserver_lacks_support": "L'homeserver non supporta l'accesso in un altro dispositivo.", - "error_invalid_scanned_code": "Il codice scansionato non è valido.", - "error_linking_incomplete": "Il collegamento non è stato completato nel tempo previsto.", "error_rate_limited": "Troppi tentativi in poco tempo. Attendi un po' prima di riprovare.", - "error_request_cancelled": "La richiesta è stata annullata.", - "error_request_declined": "La richiesta è stata negata sull'altro dispositivo.", "error_unexpected": "Si è verificato un errore imprevisto.", "scan_code_instruction": "Scansiona il codice QR sottostante con il dispositivo che è disconnesso.", "scan_qr_code": "Scansiona codice QR", @@ -1445,18 +1437,9 @@ "rust_crypto_optin_warning": "Il passaggio alla crittografia Rust richiede un processo di migrazione che può impiegare diversi minuti. Per disattivarla dovrai disconnetterti e poi riaccedere, usala con cautela!", "rust_crypto_requires_logout": "Una volta attivata, la crittografia Rust può essere disattivata solo disconnettendoti e riaccedendo.", "sliding_sync": "Modalità di sincr. con slide", - "sliding_sync_checking": "Controllo…", - "sliding_sync_configuration": "Configurazione sincr. Sliding", "sliding_sync_description": "In sviluppo attivo, non può essere disattivato.", - "sliding_sync_disable_warning": "Per disattivarlo dovrai disconnetterti e riaccedere, usare con cautela!", "sliding_sync_disabled_notice": "Disconnettiti e riconnettiti per disattivare", - "sliding_sync_proxy_url_label": "URL proxy", - "sliding_sync_proxy_url_optional_label": "URL proxy (facoltativo)", "sliding_sync_server_no_support": "Il tuo server non ha il supporto nativo", - "sliding_sync_server_specify_proxy": "Il tuo server non ha il supporto nativo, devi specificare un proxy", - "sliding_sync_server_support": "Il tuo server ha il supporto nativo", - "threads_activity_centre": "Centro attività in discussioni (in sviluppo).", - "threads_activity_centre_description": "Attenzione: in fase di sviluppo attivo; ricarica %(brand)s.", "under_active_development": "In sviluppo attivo.", "unrealiable_e2e": "Inaffidabile nelle stanze cifrate", "video_rooms": "Stanze video", @@ -2410,13 +2393,11 @@ "custom_theme_url": "URL tema personalizzato", "font_size": "Dimensione carattere", "font_size_default": "%(fontSize)s (predefinito)", - "heading": "Personalizza l'aspetto", "image_size_default": "Predefinito", "image_size_large": "Grande", "layout_bubbles": "Messaggi", "layout_irc": "IRC (Sperimentale)", "match_system_theme": "Usa il tema di sistema", - "subheading": "Le impostazioni dell'aspetto hanno effetto solo in questa sessione di %(brand)s.", "timeline_image_size": "Dimensione immagine nella linea temporale", "use_high_contrast": "Usa contrasto alto" }, @@ -3141,12 +3122,10 @@ "my_threads_description": "Mostra tutte le conversazioni a cui hai partecipato", "open_thread": "Apri conversazione", "show_all_threads": "Mostra tutte le conversazioni", - "show_thread_filter": "Mostra:", - "unable_to_decrypt": "Impossibile decifrare il messaggio" + "show_thread_filter": "Mostra:" }, "threads_activity_centre": { - "header": "Attività delle conversazioni", - "no_rooms_with_unreads_threads": "Non hai ancora stanze con conversazioni non lette." + "header": "Attività delle conversazioni" }, "time": { "about_day_ago": "circa un giorno fa", @@ -3189,7 +3168,6 @@ }, "creation_summary_dm": "%(creator)s ha creato questo MD.", "creation_summary_room": "%(creator)s ha creato e configurato la stanza.", - "decryption_failure_blocked": "Il mittente ti ha bloccato dalla ricezione di questo messaggio", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Decifrazione", "download_action_downloading": "Scaricamento", @@ -3198,7 +3176,6 @@ "tooltip_sub": "Clicca per vedere le modifiche", "tooltip_title": "Modificato il %(date)s" }, - "encrypted_historical_messages_unavailable": "I messaggi cifrati prima di questo punto non sono disponibili.", "error_no_renderer": "Questo evento non può essere mostrato", "error_rendering_message": "Impossibile caricare questo messaggio", "historical_messages_unavailable": "Non puoi vedere i messaggi precedenti", diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 22a17aabde..6fe3e3f401 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -233,15 +233,7 @@ "completing_setup": "新しい端末の設定を完了しています", "confirm_code_match": "以下のコードが他の端末と一致していることを確認してください:", "connecting": "接続しています…", - "error_device_already_signed_in": "もう一方のデバイスは既にサインインしています。", - "error_device_not_signed_in": "もう一方の端末はサインインしていません。", - "error_device_unsupported": "この端末とのリンクはサポートしていません。", - "error_homeserver_lacks_support": "ホームサーバーは他の端末でのサインインをサポートしていません。", - "error_invalid_scanned_code": "スキャンされたコードは無効です。", - "error_linking_incomplete": "時間内にリンクが完了しませんでした。", "error_rate_limited": "再試行の数が多すぎます。少し待ってから再度試してください。", - "error_request_cancelled": "リクエストはキャンセルされました。", - "error_request_declined": "リクエストはもう一方の端末で拒否されました。", "error_unexpected": "予期しないエラーが発生しました。", "scan_code_instruction": "サインアウトした端末で以下のQRコードをスキャンしてください。", "scan_qr_code": "QRコードをスキャン", @@ -1338,15 +1330,8 @@ "report_to_moderators_description": "モデレートをサポートするルームで「報告」ボタンを使用すると、ルームのモデレーターに問題を報告できます。", "rust_crypto": "Rustによる暗号の実装", "sliding_sync": "スライド式同期モード", - "sliding_sync_checking": "確認しています…", - "sliding_sync_configuration": "スライド式同期の設定", "sliding_sync_description": "開発中です。無効にできません。", - "sliding_sync_disable_warning": "無効にするにはログアウトして、再度ログインする必要があります。注意して使用してください!", - "sliding_sync_proxy_url_label": "プロクシーのURL", - "sliding_sync_proxy_url_optional_label": "プロクシーのURL(任意)", "sliding_sync_server_no_support": "あなたのサーバーはネイティブでサポートしていません", - "sliding_sync_server_specify_proxy": "あなたのサーバーはネイティブでサポートしていません。プロクシーを指定してください", - "sliding_sync_server_support": "あなたのサーバーはネイティブでサポートしています", "under_active_development": "開発中。", "video_rooms": "ビデオ通話ルーム", "video_rooms_a_new_way_to_chat": "%(brand)sで音声と動画により会話する新しい方法です。", @@ -2201,13 +2186,11 @@ "custom_theme_success": "テーマが追加されました!", "custom_theme_url": "ユーザー定義のテーマのURL", "font_size": "フォントの大きさ", - "heading": "外観のカスタマイズ", "image_size_default": "既定値", "image_size_large": "大", "layout_bubbles": "吹き出し", "layout_irc": "IRC(実験的)", "match_system_theme": "システムテーマに合わせる", - "subheading": "外観の設定はこの%(brand)sのセッションにのみ適用されます。", "timeline_image_size": "タイムライン上での画像のサイズ", "use_high_contrast": "高コントラストを使用" }, @@ -2872,8 +2855,7 @@ "my_threads_description": "参加している全スレッドを表示", "open_thread": "スレッドを開く", "show_all_threads": "全てのスレッドを表示", - "show_thread_filter": "表示:", - "unable_to_decrypt": "メッセージを復号化できません" + "show_thread_filter": "表示:" }, "time": { "about_day_ago": "約1日前", @@ -2924,7 +2906,6 @@ "tooltip_sub": "クリックすると変更履歴を表示", "tooltip_title": "%(date)sに編集済" }, - "encrypted_historical_messages_unavailable": "これ以前の暗号化されたメッセージは利用できません。", "error_no_renderer": "このイベントは表示できませんでした", "error_rendering_message": "このメッセージを読み込めません", "historical_messages_unavailable": "以前のメッセージは表示できません", diff --git a/src/i18n/strings/lo.json b/src/i18n/strings/lo.json index 72f90e0f0a..db8dc5a9fd 100644 --- a/src/i18n/strings/lo.json +++ b/src/i18n/strings/lo.json @@ -1940,13 +1940,11 @@ "custom_theme_success": "ເພີ່ມຫົວຂໍ້!", "custom_theme_url": "ການ ກຳນົດເອງຫົວຂໍ້ URL", "font_size": "ຂະໜາດຕົວອັກສອນ", - "heading": "ປັບແຕ່ງຮູບລັກສະນະຂອງທ່ານ", "image_size_default": "ຄ່າເລີ່ມຕົ້ນ", "image_size_large": "ຂະຫນາດໃຫຍ່", "layout_bubbles": "ຟອງຂໍ້ຄວາມ", "layout_irc": "(ທົດລອງ)IRC", "match_system_theme": "ລະບົບຈັບຄູ່ຫົວຂໍ້", - "subheading": "ການຕັ້ງຄ່າຮູບລັກສະນະມີຜົນກະທົບພຽງແຕ່ %(brand)s ໃນລະບົບ ນີ້.", "timeline_image_size": "ຂະຫນາດຮູບພາບຢູ່ໃນທາມລາຍ", "use_high_contrast": "ໃຊ້ຄວາມຄົມຊັດສູງ" }, @@ -2523,7 +2521,6 @@ "tooltip_sub": "ກົດເພື່ອເບິ່ງການແກ້ໄຂ", "tooltip_title": "ແກ້ໄຂເມື່ອ %(date)s" }, - "encrypted_historical_messages_unavailable": "ຂໍ້ຄວາມທີ່ເຂົ້າລະຫັດໄວ້ກ່ອນຈຸດນີ້ບໍ່ສາມາດໃຊ້ໄດ້.", "error_no_renderer": "ເຫດການນີ້ບໍ່ສາມາດສະແດງໄດ້", "error_rendering_message": "ບໍ່ສາມາດໂຫຼດຂໍ້ຄວາມນີ້ໄດ້", "historical_messages_unavailable": "ທ່ານບໍ່ສາມາດເຫັນຂໍ້ຄວາມກ່ອນໜ້ານີ້", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 66deb29fe1..013f7eb591 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1522,13 +1522,11 @@ "custom_theme_success": "Tema pridėta!", "custom_theme_url": "Pasirinktinės temos URL", "font_size": "Šrifto dydis", - "heading": "Tinkinti savo išvaizdą", "image_size_default": "Numatytas", "image_size_large": "Didelis", "layout_bubbles": "Žinučių burbulai", "layout_irc": "IRC (eksperimentinis)", "match_system_theme": "Suderinti su sistemos tema", - "subheading": "Išvaizdos nustatymai įtakoja tik šį %(brand)s seansą.", "timeline_image_size": "Paveikslėlio dydis laiko juostoje", "use_high_contrast": "Naudoti didelį kontrastą" }, @@ -2012,7 +2010,6 @@ "tooltip_sub": "Spustelėkite kad peržiūrėti pakeitimus", "tooltip_title": "Keista %(date)s" }, - "encrypted_historical_messages_unavailable": "Iki šio taško užšifruotos žinutės yra neprieinamos.", "error_no_renderer": "Nepavyko parodyti šio įvykio", "error_rendering_message": "Nepavyko įkelti šios žinutės", "historical_messages_unavailable": "Negalite matyti ankstesnių žinučių", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 9352a3cf2f..45905e97d8 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -221,14 +221,6 @@ "approve_access_warning": "Door de toegang voor dit apparaat goed te keuren, heeft het volledige toegang tot jouw account.", "completing_setup": "De configuratie van je nieuwe apparaat voltooien", "confirm_code_match": "Controleer of de onderstaande code overeenkomt met je andere apparaat:", - "error_device_already_signed_in": "Het andere apparaat is al aangemeld.", - "error_device_not_signed_in": "Het andere apparaat is niet ingelogd.", - "error_device_unsupported": "Koppelen met dit apparaat wordt niet ondersteund.", - "error_homeserver_lacks_support": "De server ondersteunt het inloggen op een ander apparaat niet.", - "error_invalid_scanned_code": "De gescande code is ongeldig.", - "error_linking_incomplete": "De koppeling is niet binnen de vereiste tijd voltooid.", - "error_request_cancelled": "Het verzoek is geannuleerd.", - "error_request_declined": "Het verzoek is afgewezen op het andere apparaat.", "error_unexpected": "Er is een onverwachte fout opgetreden.", "scan_code_instruction": "Scan de onderstaande QR-code met je apparaat dat is uitgelogd.", "sign_in_new_device": "Aanmelden nieuw apparaat", @@ -1203,12 +1195,7 @@ "leave_beta_reload": "Als je de bèta verlaat, wordt %(brand)s opnieuw geladen.", "msc3531_hide_messages_pending_moderation": "Laat moderators berichten verbergen in afwachting van moderatie.", "pinning": "Berichten vastprikken", - "sliding_sync_configuration": "Scrollende Synchronisatie-configuratie", - "sliding_sync_disable_warning": "Om uit te schakelen moet je uitloggen en weer inloggen, wees voorzichtig!", - "sliding_sync_proxy_url_optional_label": "Proxy-URL (optioneel)", "sliding_sync_server_no_support": "Jouw server heeft geen native ondersteuning", - "sliding_sync_server_specify_proxy": "Jouw server heeft geen native ondersteuning, je moet een proxy opgeven", - "sliding_sync_server_support": "Jouw server heeft native ondersteuning", "video_rooms": "Video kamers", "video_rooms_a_new_way_to_chat": "Een nieuwe manier om te chatten via spraak en video in %(brand)s.", "video_rooms_always_on_voip_channels": "Videoruimten zijn altijd-aan VoIP-kanalen die zijn geïntegreerd in een kamer in %(brand)s.", @@ -2035,13 +2022,11 @@ "custom_theme_success": "Thema toegevoegd!", "custom_theme_url": "Aangepaste thema-URL", "font_size": "Lettergrootte", - "heading": "Weergave aanpassen", "image_size_default": "Standaard", "image_size_large": "Groot", "layout_bubbles": "Berichtenbubbels", "layout_irc": "IRC (Experimenteel)", "match_system_theme": "Aanpassen aan systeemthema", - "subheading": "Weergave-instellingen zijn alleen van toepassing op deze %(brand)s sessie.", "timeline_image_size": "Afbeeldingformaat in de tijdlijn", "use_high_contrast": "Hoog contrast inschakelen" }, @@ -2701,7 +2686,6 @@ "tooltip_sub": "Klik om bewerkingen te zien", "tooltip_title": "Bewerkt op %(date)s" }, - "encrypted_historical_messages_unavailable": "Versleutelde berichten vóór dit punt zijn niet beschikbaar.", "error_no_renderer": "Deze gebeurtenis kon niet weergegeven worden", "error_rendering_message": "Dit bericht kan niet geladen worden", "historical_messages_unavailable": "Je kan eerdere berichten niet zien", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 9b349bdd0e..1ff549f5cf 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -249,15 +249,7 @@ "completing_setup": "Kończenie konfiguracji nowego urządzenia", "confirm_code_match": "Potwierdź, że kod poniżej pasuje z Twoim drugim urządzeniem:", "connecting": "Łączenie…", - "error_device_already_signed_in": "Drugie urządzenie jest już zalogowane.", - "error_device_not_signed_in": "Drugie urządzenie nie jest zalogowane.", - "error_device_unsupported": "Wiązanie z tym urządzeniem nie jest wspierane.", - "error_homeserver_lacks_support": "Serwer domowy nie wspiera logowania innych urządzeń.", - "error_invalid_scanned_code": "Zeskanowany kod jest nieprawidłowy.", - "error_linking_incomplete": "Wiązanie nie zostało zakończone w ustalonym czasie.", "error_rate_limited": "Za dużo prób w krótkim odstępie czasu. Odczekaj trochę, zanim spróbujesz ponownie.", - "error_request_cancelled": "Żądanie zostało anulowane.", - "error_request_declined": "Żądanie zostało odrzucone przez drugie urządzenie.", "error_unexpected": "Wystąpił niespodziewany błąd.", "follow_remaining_instructions": "Podążaj zgodnie z pozostałymi instrukcjami, aby zweryfikować drugie urządzenie", "open_element_other_device": "Otwórz %(brand)s na swoim drugim urządzeniu", @@ -1419,6 +1411,7 @@ "group_spaces": "Przestrzenie", "group_themes": "Motywy", "group_threads": "Wątki", + "group_ui": "Interfejs użytkownika", "group_voip": "Głos i wideo", "group_widgets": "Widżety", "hidebold": "Ukryj kropkę powiadomienia (wyświetlaj tylko licznik plakietek)", @@ -1442,6 +1435,7 @@ "oidc_native_flow": "Uwierzytelnianie natywne OIDC", "oidc_native_flow_description": "⚠ OSTRZEŻENIE: Funkcja eksperymentalna. Użyj uwierzytelniania natywnego OIDC, gdy jest wspierane przez serwer.", "pinning": "Przypinanie wiadomości", + "release_announcement": "Ogłoszenie o wydaniu", "render_reaction_images": "Renderuj niestandardowe obrazy w reakcjach", "render_reaction_images_description": "Czasami określane jako \"emoji niestandardowe\".", "report_to_moderators": "Zgłoś do moderatorów", @@ -1452,18 +1446,9 @@ "rust_crypto_optin_warning": "Przejście na kryptografię Rust wymaga procesu migracji, która może potrwać kilka minut. Aby ją wyłączyć, będziesz musiał zalogować się ponownie; zachowaj ostrożność!", "rust_crypto_requires_logout": "Po włączeniu, kryptografia Rust może zostać wyłączona tylko po ponownym zalogowaniu.", "sliding_sync": "Tryb synchronizacji przesuwanej", - "sliding_sync_checking": "Sprawdzanie…", - "sliding_sync_configuration": "Konfiguracja synchronizacji przesuwanej", "sliding_sync_description": "W trakcie aktywnego rozwoju, nie można wyłączyć.", - "sliding_sync_disable_warning": "By wyłączyć, będziesz musiał się zalogować ponownie. Korzystaj z rozwagą!", "sliding_sync_disabled_notice": "Zaloguj się ponownie, aby wyłączyć", - "sliding_sync_proxy_url_label": "URL proxy", - "sliding_sync_proxy_url_optional_label": "URL proxy (opcjonalne)", "sliding_sync_server_no_support": "Twój serwer nie posiada wsparcia natywnego", - "sliding_sync_server_specify_proxy": "Twój serwer nie posiada wsparcia natywnego, musisz podać serwer proxy", - "sliding_sync_server_support": "Twój serwer posiada wsparcie natywne", - "threads_activity_centre": "Centrum aktywności wątków (w trakcie rozwoju)", - "threads_activity_centre_description": "Ostrzeżenie: W trakcie aktywnego rozwoju; przeładowuje %(brand)s.", "under_active_development": "W trakcie aktywnego rozwoju.", "unrealiable_e2e": "Problematyczny w pokojach szyfrowanych", "video_rooms": "Pokoje wideo", @@ -2421,13 +2406,11 @@ "custom_theme_url": "Niestandardowy adres URL motywu", "font_size": "Rozmiar czcionki", "font_size_default": "%(fontSize)s (domyślny)", - "heading": "Dostosuj wygląd", "image_size_default": "Zwykły", "image_size_large": "Duży", "layout_bubbles": "Dymki wiadomości", "layout_irc": "IRC (eksperymentalny)", "match_system_theme": "Dopasuj do motywu systemowego", - "subheading": "Ustawienia wyglądu wpływają tylko na tę sesję %(brand)s.", "timeline_image_size": "Rozmiar obrazu na osi czasu", "use_high_contrast": "Użyj wysokiego kontrastu" }, @@ -2685,6 +2668,8 @@ "cross_signing_self_signing_private_key": "Samo-podpisujący klucz prywatny:", "cross_signing_user_signing_private_key": "Podpisany przez użytkownika klucz prywatny:", "cryptography_section": "Kryptografia", + "dehydrated_device_description": "Funkcja urządzenia offline umożliwia odbieranie wiadomości szyfrowanych, nawet jeśli nie jesteś zalogowany na żadnym urządzeniu", + "dehydrated_device_enabled": "Urządzenie offline włączone", "delete_backup": "Usuń kopię zapasową", "delete_backup_confirm_description": "Czy jesteś pewien? Stracisz dostęp do wszystkich swoich zaszyfrowanych wiadomości, jeżeli nie utworzyłeś poprawnej kopii zapasowej kluczy.", "e2ee_default_disabled_warning": "Twój administrator serwera wyłączył szyfrowanie end-to-end domyślnie w pokojach prywatnych i wiadomościach bezpośrednich.", @@ -2847,6 +2832,7 @@ "show_redaction_placeholder": "Pokaż symbol zastępczy dla usuniętych wiadomości", "show_stickers_button": "Pokaż przycisk naklejek", "show_typing_notifications": "Pokazuj powiadomienia o pisaniu", + "showbold": "Pokaż całą aktywność na liście pomieszczeń (kropki lub liczbę nieprzeczytanych wiadomości)", "sidebar": { "metaspaces_favourites_description": "Pogrupuj wszystkie swoje ulubione pokoje i osoby w jednym miejscu.", "metaspaces_home_all_rooms": "Pokaż wszystkie pokoje", @@ -2863,6 +2849,7 @@ "title": "Pasek boczny" }, "start_automatically": "Uruchom automatycznie po zalogowaniu się do systemu", + "tac_only_notifications": "Pokaż powiadomienia tylko w centrum aktywności wątków", "use_12_hour_format": "Pokaż czas w formacie 12-sto godzinnym (np. 2:30pm)", "use_command_enter_send_message": "Użyj Command + Enter, aby wysłać wiadomość", "use_command_f_search": "Użyj Command + F aby przeszukać oś czasu", @@ -3159,12 +3146,14 @@ "my_threads_description": "Pokazuje wszystkie wątki, w których brałeś udział", "open_thread": "Otwórz wątek", "show_all_threads": "Pokaż wszystkie wątki", - "show_thread_filter": "Pokaż:", - "unable_to_decrypt": "Nie można rozszyfrować wiadomości" + "show_thread_filter": "Pokaż:" }, "threads_activity_centre": { "header": "Aktywność wątków", - "no_rooms_with_unreads_threads": "Nie masz jeszcze pokoi z nieprzeczytanymi wątkami." + "no_rooms_with_threads_notifs": "Nie masz jeszcze pokoi z powiadomieniami w wątku.", + "no_rooms_with_unread_threads": "Nie masz jeszcze pokoi z nieprzeczytanymi wątkami.", + "release_announcement_description": "Powiadomienia w wątkach zostały przeniesione, teraz znajdziesz je tutaj.", + "release_announcement_header": "Centrum aktywności wątków" }, "time": { "about_day_ago": "około dzień temu", @@ -3207,7 +3196,6 @@ }, "creation_summary_dm": "%(creator)s utworzył tę wiadomość prywatną.", "creation_summary_room": "%(creator)s stworzył i skonfigurował pokój.", - "decryption_failure_blocked": "Nadawca zablokował Ci możliwość otrzymania tej wiadomości", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Rozszyfrowuję", "download_action_downloading": "Pobieranie", @@ -3216,7 +3204,6 @@ "tooltip_sub": "Kliknij, aby wyświetlić edycje", "tooltip_title": "Edytowano o %(date)s" }, - "encrypted_historical_messages_unavailable": "Wiadomości szyfrowane przed tym punktem są niedostępne.", "error_no_renderer": "Ten event nie może zostać wyświetlony", "error_rendering_message": "Nie można wczytać tej wiadomości", "historical_messages_unavailable": "Nie możesz widzieć poprzednich wiadomości", @@ -3659,6 +3646,12 @@ "toast_title": "Aktualizuj %(brand)s", "unavailable": "Niedostępny" }, + "update_room_access_modal": { + "description": "Aby utworzyć link udostępniania, musisz zezwolić gościom na dołączenie do tego pokoju. Może to zmniejszyć bezpieczeństwo pokoju. Gdy zakończysz połączenie, możesz ustawić pokój jako prywatny z powrotem.", + "dont_change_description": "Możesz również zadzwonić w innym pokoju.", + "no_change": "Nie chce zmieniać poziomu uprawnień.", + "title": "Zmień poziom dostępu pokoju" + }, "upload_failed_generic": "Nie udało się przesłać pliku '%(fileName)s'.", "upload_failed_size": "Plik '%(fileName)s' przekracza limit rozmiaru dla tego serwera głównego", "upload_failed_title": "Błąd przesyłania", @@ -3694,6 +3687,7 @@ "deactivate_confirm_action": "Dezaktywuj użytkownika", "deactivate_confirm_description": "Dezaktywacja tego użytkownika, wyloguje go i uniemożliwi logowanie ponowne. Dodatkowo, opuści wszystkie pokoje, w których się znajdują. Tej akcji nie można cofnąć. Czy na pewno chcesz dezaktywować tego użytkownika?", "deactivate_confirm_title": "Dezaktywować użytkownika?", + "dehydrated_device_enabled": "Urządzenie offline włączone", "demote_button": "Degraduj", "demote_self_confirm_description_space": "Nie będziesz mógł cofnąć tej zmiany, ponieważ degradujesz swoje uprawnienia. Jeśli jesteś ostatnim użytkownikiem uprzywilejowanym w tej przestrzeni, nie będziesz mógł ich odzyskać.", "demote_self_confirm_room": "Nie będziesz mógł cofnąć tej zmiany, ponieważ degradujesz swoje uprawnienia. Jeśli jesteś ostatnim użytkownikiem uprzywilejowanym w tym pokoju, nie będziesz mógł ich odzyskać.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 6d322e1f66..75f39a2ebf 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1617,13 +1617,11 @@ "custom_theme_success": "Tema adicionado!", "custom_theme_url": "Link do tema personalizado", "font_size": "Tamanho da fonte", - "heading": "Personalize sua aparência", "image_size_default": "Padrão", "image_size_large": "Grande", "layout_bubbles": "Balões de mensagem", "layout_irc": "IRC (experimental)", "match_system_theme": "Se adaptar ao tema do sistema", - "subheading": "As configurações de aparência afetam apenas esta sessão do %(brand)s.", "timeline_image_size": "Tamanho da imagem na linha do tempo", "use_high_contrast": "Usar alto contraste" }, @@ -2141,7 +2139,6 @@ "tooltip_sub": "Clicar para ver edições", "tooltip_title": "Editado em %(date)s" }, - "encrypted_historical_messages_unavailable": "As mensagens criptografadas antes deste ponto não estão disponíveis.", "error_no_renderer": "Este evento não pôde ser exibido", "error_rendering_message": "Não foi possível carregar esta mensagem", "historical_messages_unavailable": "Você não pode ver as mensagens anteriores", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index f9a84fd00d..fb9db606d2 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -244,14 +244,6 @@ "completing_setup": "Завершение настройки нового устройства", "confirm_code_match": "Проверьте, чтобы код ниже совпадал с тем, что показан на другом устройстве:", "connecting": "Подключение…", - "error_device_already_signed_in": "Уже выполнен вход на другом устройстве.", - "error_device_not_signed_in": "На другом устройстве вход не выполнен.", - "error_device_unsupported": "Соединение с этим устройством не поддерживается.", - "error_homeserver_lacks_support": "Домашний сервер не поддерживает вход с другого устройства.", - "error_invalid_scanned_code": "Отсканированный код недействителен.", - "error_linking_incomplete": "Соединение не было завершено в нужное время.", - "error_request_cancelled": "Запрос был отменён.", - "error_request_declined": "Запрос был отклонен на другом устройстве.", "error_unexpected": "Произошла неожиданная ошибка.", "scan_code_instruction": "Отсканируйте приведенный ниже QR-код на устройстве, которое вышло из системы.", "scan_qr_code": "Сканировать QR-код", @@ -1430,16 +1422,9 @@ "report_to_moderators_description": "В поддерживающих модерирование комнатах, кнопка \"Пожаловаться\" позволит вам сообщить о нарушении модераторам комнаты.", "rust_crypto": "Реализация криптографии Rust", "sliding_sync": "Режим Sliding Sync", - "sliding_sync_checking": "Проверка…", - "sliding_sync_configuration": "Настройка Sliding sync", "sliding_sync_description": "В активной разработке, нельзя отключить.", - "sliding_sync_disable_warning": "Чтобы отключить, вам нужно выйти из системы и снова войти в систему, используйте с осторожностью!", "sliding_sync_disabled_notice": "Выйдите из системы и снова войдите, чтобы отключить", - "sliding_sync_proxy_url_label": "URL-адрес прокси-сервера", - "sliding_sync_proxy_url_optional_label": "URL-адрес прокси-сервера (необязательно)", "sliding_sync_server_no_support": "На вашем сервере отсутствует встроенная поддержка", - "sliding_sync_server_specify_proxy": "На вашем сервере отсутствует встроенная поддержка, необходимо указать прокси-сервер", - "sliding_sync_server_support": "Ваш сервер имеет встроенную поддержку", "under_active_development": "В активной разработке.", "unrealiable_e2e": "Ненадежно в зашифрованных комнатах", "video_rooms": "Видеокомнаты", @@ -2387,13 +2372,11 @@ "custom_theme_success": "Тема добавлена!", "custom_theme_url": "Ссылка на стороннюю тему", "font_size": "Размер шрифта", - "heading": "Настройка внешнего вида", "image_size_default": "По умолчанию", "image_size_large": "Большой", "layout_bubbles": "Пузыри сообщений", "layout_irc": "IRC (Экспериментально)", "match_system_theme": "Тема системы", - "subheading": "Настройки внешнего вида работают только в этом сеансе %(brand)s.", "timeline_image_size": "Размер изображения в ленте сообщений", "use_high_contrast": "Высокая контрастность" }, @@ -3119,8 +3102,7 @@ "my_threads_description": "Показывает все обсуждения, в которых вы принимали участие", "open_thread": "Открыть ветку", "show_all_threads": "Показать все обсуждения", - "show_thread_filter": "Показать:", - "unable_to_decrypt": "Невозможно расшифровать сообщение" + "show_thread_filter": "Показать:" }, "time": { "about_day_ago": "около суток назад", @@ -3163,7 +3145,6 @@ }, "creation_summary_dm": "%(creator)s начал(а) этот чат.", "creation_summary_room": "%(creator)s создал(а) и настроил(а) комнату.", - "decryption_failure_blocked": "Отправитель заблокировал получение этого сообщения", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Расшифровка", "download_action_downloading": "Загрузка", @@ -3172,7 +3153,6 @@ "tooltip_sub": "Нажмите для просмотра правок", "tooltip_title": "Изменено %(date)s" }, - "encrypted_historical_messages_unavailable": "Зашифрованные сообщения до этого момента недоступны.", "error_no_renderer": "Не удалось отобразить это событие", "error_rendering_message": "Не удалось загрузить это сообщение", "historical_messages_unavailable": "Вы не можете просматривать более старые сообщения", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index ca7b24e476..b158fb30d5 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -244,14 +244,6 @@ "completing_setup": "Dokončenie nastavenia nového zariadenia", "confirm_code_match": "Skontrolujte, či sa nižšie uvedený kód zhoduje s vaším druhým zariadením:", "connecting": "Pripájanie…", - "error_device_already_signed_in": "Druhé zariadenie je už prihlásené.", - "error_device_not_signed_in": "Druhé zariadenie nie je prihlásené.", - "error_device_unsupported": "Prepojenie s týmto zariadením nie je podporované.", - "error_homeserver_lacks_support": "Domovský server nepodporuje prihlasovanie do iného zariadenia.", - "error_invalid_scanned_code": "Naskenovaný kód je neplatný.", - "error_linking_incomplete": "Prepojenie nebolo dokončené v požadovanom čase.", - "error_request_cancelled": "Žiadosť bola zrušená.", - "error_request_declined": "Žiadosť bola na druhom zariadení zamietnutá.", "error_unexpected": "Vyskytla sa neočakávaná chyba.", "scan_code_instruction": "Naskenujte nižšie uvedený QR kód pomocou zariadenia, ktoré je odhlásené.", "scan_qr_code": "Skenovať QR kód", @@ -1435,16 +1427,9 @@ "report_to_moderators_description": "V miestnostiach, ktoré podporujú moderovanie, môžete pomocou tlačidla \"Nahlásiť\" nahlásiť porušovanie pravidiel moderátorom miestnosti.", "rust_crypto": "Implementácia kryptografie Rust", "sliding_sync": "Režim kĺzavej synchronizácie", - "sliding_sync_checking": "Kontrolovanie…", - "sliding_sync_configuration": "Konfigurácia kĺzavej synchronizácie", "sliding_sync_description": "V štádiu aktívneho vývoja, nie je možné to vypnúť.", - "sliding_sync_disable_warning": "Pre vypnutie sa musíte odhlásiť a znova prihlásiť, používajte opatrne!", "sliding_sync_disabled_notice": "Odhláste sa a znova sa prihláste, aby sa to vyplo", - "sliding_sync_proxy_url_label": "URL adresa proxy servera", - "sliding_sync_proxy_url_optional_label": "URL adresa proxy servera (voliteľná)", "sliding_sync_server_no_support": "Váš server nemá natívnu podporu", - "sliding_sync_server_specify_proxy": "Váš server nemá natívnu podporu, musíte zadať proxy server", - "sliding_sync_server_support": "Váš server má natívnu podporu", "under_active_development": "V štádiu aktívneho vývoja.", "unrealiable_e2e": "Nespoľahlivé v šifrovaných miestnostiach", "video_rooms": "Video miestnosti", @@ -2391,13 +2376,11 @@ "custom_theme_success": "Vzhľad pridaný!", "custom_theme_url": "URL adresa vlastného vzhľadu", "font_size": "Veľkosť písma", - "heading": "Upravte svoj vzhľad", "image_size_default": "Predvolené", "image_size_large": "Veľký", "layout_bubbles": "Správy v bublinách", "layout_irc": "IRC (experimentálne)", "match_system_theme": "Prispôsobiť sa vzhľadu systému", - "subheading": "Nastavenia vzhľadu ovplyvnia len túto reláciu %(brand)s.", "timeline_image_size": "Veľkosť obrázku na časovej osi", "use_high_contrast": "Použiť vysoký kontrast" }, @@ -3122,8 +3105,7 @@ "my_threads_description": "Zobrazí všetky vlákna, v ktorých ste sa zúčastnili", "open_thread": "Otvoriť vlákno", "show_all_threads": "Zobraziť všetky vlákna", - "show_thread_filter": "Zobraziť:", - "unable_to_decrypt": "Nie je možné dešifrovať správu" + "show_thread_filter": "Zobraziť:" }, "time": { "about_day_ago": "asi pred jedným dňom", @@ -3166,7 +3148,6 @@ }, "creation_summary_dm": "%(creator)s vytvoril/a túto priamu správu.", "creation_summary_room": "%(creator)s vytvoril a nastavil miestnosť.", - "decryption_failure_blocked": "Odosielateľ vám zablokoval príjem tejto správy", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Dešifrovanie", "download_action_downloading": "Preberanie", @@ -3175,7 +3156,6 @@ "tooltip_sub": "Kliknutím zobrazíte úpravy", "tooltip_title": "Upravené %(date)s" }, - "encrypted_historical_messages_unavailable": "Šifrované správy pred týmto bodom nie sú k dispozícii.", "error_no_renderer": "Nie je možné zobraziť túto udalosť", "error_rendering_message": "Nemožno načítať túto správu", "historical_messages_unavailable": "Nemôžete vidieť predchádzajúce správy", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index c75782696c..eadf91d796 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -235,15 +235,7 @@ "completing_setup": "Po plotësohet ujdisja e pajisjes tuaj të re", "confirm_code_match": "Kontrolloni se kodi më poshtë përkon me atë në pajisjen tuaj tjetër:", "connecting": "Po lidhet…", - "error_device_already_signed_in": "Nga pajisja tjetër është bërë tashmë hyrja.", - "error_device_not_signed_in": "Te pajisja tjetër s’është bërë hyrja.", - "error_device_unsupported": "Lidhja me këtë pajisje nuk mbulohet.", - "error_homeserver_lacks_support": "Shërbyesi Home nuk mbulon bërje hyrjeje në një pajisje tjetër.", - "error_invalid_scanned_code": "Kodi i skanuar është i pavlefshëm.", - "error_linking_incomplete": "Lidhja s’u plotësua brenda kohës së domosdoshme.", "error_rate_limited": "Shumë përpjekje në një kohë të shkurtër. Prisni ca, para se të riprovoni.", - "error_request_cancelled": "Kërkesa u anulua.", - "error_request_declined": "Kërkesa u hodh poshtë në pajisjen tjetër.", "error_unexpected": "Ndodhi një gabim të papritur.", "scan_code_instruction": "Skanoni kodin QR më poshtë me pajisjen ku është bërë dalja.", "scan_qr_code": "Skanoni kodin QR", @@ -1348,16 +1340,9 @@ "report_to_moderators": "Raportojeni te moderatorët", "report_to_moderators_description": "Në dhoma që mbulojnë moderimin, butoni “Raportojeni” do t’ju lejojë t’u raportoni abuzim moderatorëve të dhomës.", "rust_crypto": "Sendërtim kriptografie Rust", - "sliding_sync_checking": "Po kontrollohet…", - "sliding_sync_configuration": "Formësim Sliding Sync-u", "sliding_sync_description": "Nën zhvillim aktiv, s’mund të çaktivizohet.", - "sliding_sync_disable_warning": "Për ta çaktivizuar do t’ju duhet të bëni daljen dhe ribëni hyrjen, përdoreni me kujdes!", "sliding_sync_disabled_notice": "Që të çaktivizohet, dilni dhe rihyni në llogari", - "sliding_sync_proxy_url_label": "URL Ndërmjetësi", - "sliding_sync_proxy_url_optional_label": "URL ndërmjetësi (opsionale)", "sliding_sync_server_no_support": "Shërbyesit tuaj i mungon mbulim i brendshëm për këtë", - "sliding_sync_server_specify_proxy": "Shërbyesit tuaj i mungon mbulimi së brendshmi, duhet të specifikoni një ndërmjetës", - "sliding_sync_server_support": "Shërbyesi juaj ka mbulim të brendshëm për këtë", "under_active_development": "Nën zhvillim aktiv.", "video_rooms": "Dhoma me video", "video_rooms_a_new_way_to_chat": "Një rrugë e re për të biseduar me zë dhe video në %(brand)s.", @@ -2256,13 +2241,11 @@ "custom_theme_success": "Tema u shtua!", "custom_theme_url": "URL teme vetjake", "font_size": "Madhësi shkronjash", - "heading": "Përshtatni dukjen tuaj", "image_size_default": "Parazgjedhje", "image_size_large": "E madhe", "layout_bubbles": "Flluska mesazhesh", "layout_irc": "IRC (Eksperimentale)", "match_system_theme": "Përputhe me temën e sistemit", - "subheading": "Rregullimet e Dukjes prekin vetëm këtë sesion %(brand)s.", "timeline_image_size": "Madhësi figure në rrjedhën kohore", "use_high_contrast": "Përdor kontrast të lartë" }, @@ -2939,8 +2922,7 @@ "my_threads_description": "Shfaq krejt rrjedhat ku keni marrë pjesë", "open_thread": "Hape rrjedhën", "show_all_threads": "Shfaqi krejt rrjedhat", - "show_thread_filter": "Shfaq:", - "unable_to_decrypt": "S’arrihet të shfshehtëzohet mesazhi" + "show_thread_filter": "Shfaq:" }, "time": { "about_day_ago": "rreth një ditë më parë", @@ -2976,7 +2958,6 @@ }, "creation_summary_dm": "%(creator)s krijoi këtë DM.", "creation_summary_room": "%(creator)s krijoi dhe formësoi dhomën.", - "decryption_failure_blocked": "Dërguesi ka bllokuar marrjen e këtij mesazhi nga ju", "download_action_decrypting": "Po shfshehtëzohet", "download_action_downloading": "Shkarkim", "edits": { @@ -2984,7 +2965,6 @@ "tooltip_sub": "Klikoni që të shihni përpunime", "tooltip_title": "Përpunuar më %(date)s" }, - "encrypted_historical_messages_unavailable": "S’mund të kihen më mesazhe të fshehtëzuar para kësaj pike.", "error_no_renderer": "Ky akt s’u shfaq dot", "error_rendering_message": "S’ngarkohet dot ky mesazh", "historical_messages_unavailable": "S’mund të shihni mesazhe më të hershëm", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 722ef247af..8a6cb95a1f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -249,15 +249,7 @@ "completing_setup": "Slutför inställning av din nya enhet", "confirm_code_match": "Kolla att koden nedan matchar din andra enhet:", "connecting": "Kopplar upp …", - "error_device_already_signed_in": "Den andra enheten är redan inloggad.", - "error_device_not_signed_in": "Den andra enheten är inte inloggad.", - "error_device_unsupported": "Länkning med den här enheten stöds inte.", - "error_homeserver_lacks_support": "Hemservern stöder inte inloggning av en annan enhet.", - "error_invalid_scanned_code": "Den skannade koden är ogiltig.", - "error_linking_incomplete": "Länkningen slutfördes inte inom den krävda tiden.", "error_rate_limited": "För många försök under för kort tid. Vänta ett tag innan du försöker igen.", - "error_request_cancelled": "Förfrågan avbröts.", - "error_request_declined": "Förfrågan nekades på den andra enheten.", "error_unexpected": "Ett oväntade fel inträffade.", "scan_code_instruction": "Skanna QR-koden nedan med din andra enhet som är utloggad.", "scan_qr_code": "Skanna QR-kod", @@ -1445,18 +1437,9 @@ "rust_crypto_optin_warning": "Byte till Rust-kryptografi kräver en migreringsprocess som kan ta flera minuter. För att inaktivera måste du logga ut och in igen; använd med försiktighet!", "rust_crypto_requires_logout": "När Rust-kryptografi har aktiverats kan den endast avaktiveras genom att logga ut och logga in igen", "sliding_sync": "Sliding sync-läge", - "sliding_sync_checking": "Kontrollerar …", - "sliding_sync_configuration": "Sliding sync-konfiguration", "sliding_sync_description": "Under aktiv utveckling, kan inte inaktiveras.", - "sliding_sync_disable_warning": "För att inaktivera det här så behöver du logga ut och logga in igen, använd varsamt!", "sliding_sync_disabled_notice": "Logga ut och in igen för att inaktivera", - "sliding_sync_proxy_url_label": "Proxy-URL", - "sliding_sync_proxy_url_optional_label": "Proxy-URL (valfritt)", "sliding_sync_server_no_support": "Din server saknar nativt stöd", - "sliding_sync_server_specify_proxy": "Din server saknar nativt stöd, du måste ange en proxy", - "sliding_sync_server_support": "Din server har nativt stöd", - "threads_activity_centre": "Aktivitetscenter för trådar (under utveckling). För närvarande tar detta bara bort antalet trådaviseringar från det totala antalet i rumslistan", - "threads_activity_centre_description": "Varning: Under aktiv utveckling; laddar om Element.", "under_active_development": "Under aktiv utveckling.", "unrealiable_e2e": "Otillförlitlig i krypterade rum", "video_rooms": "Videorum", @@ -2409,13 +2392,11 @@ "custom_theme_success": "Tema tillagt!", "custom_theme_url": "Anpassad tema-URL", "font_size": "Teckenstorlek", - "heading": "Anpassa ditt utseende", "image_size_default": "Standard", "image_size_large": "Stor", "layout_bubbles": "Meddelandebubblor", "layout_irc": "IRC (Experimentellt)", "match_system_theme": "Matcha systemtema", - "subheading": "Utseende inställningar påverkar bara den här %(brand)s-sessionen.", "timeline_image_size": "Bildstorlek i tidslinjen", "use_high_contrast": "Använd högkontrast" }, @@ -3140,12 +3121,10 @@ "my_threads_description": "Visar alla trådar du har medverkat i", "open_thread": "Öppna tråd", "show_all_threads": "Visa alla trådar", - "show_thread_filter": "Visa:", - "unable_to_decrypt": "Kunde inte avkryptera meddelande" + "show_thread_filter": "Visa:" }, "threads_activity_centre": { - "header": "Aktivitet för trådar", - "no_rooms_with_unreads_threads": "Du har inte rum med olästa trådar än." + "header": "Aktivitet för trådar" }, "time": { "about_day_ago": "cirka en dag sedan", @@ -3188,7 +3167,6 @@ }, "creation_summary_dm": "%(creator)s skapade den här DM:en.", "creation_summary_room": "%(creator)s skapade och konfigurerade rummet.", - "decryption_failure_blocked": "Avsändaren har blockerat dig från att ta emot det här meddelandet", "disambiguated_profile": "%(displayName)s (%(matrixId)s)", "download_action_decrypting": "Avkrypterar", "download_action_downloading": "Laddar ner", @@ -3197,7 +3175,6 @@ "tooltip_sub": "Klicka för att visa redigeringar", "tooltip_title": "Redigerat vid %(date)s" }, - "encrypted_historical_messages_unavailable": "Krypterade meddelanden innan den här tidpunkten är otillgängliga.", "error_no_renderer": "Den här händelsen kunde inte visas", "error_rendering_message": "Kan inte ladda det här meddelandet", "historical_messages_unavailable": "Du kan inte se tidigare meddelanden", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index b9b307889e..79378c5c75 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -241,15 +241,7 @@ "completing_setup": "Завершення налаштування нового пристрою", "confirm_code_match": "Перевірте, чи збігається наведений внизу код з кодом на вашому іншому пристрої:", "connecting": "З'єднання…", - "error_device_already_signed_in": "На іншому пристрої вхід було виконано.", - "error_device_not_signed_in": "На іншому пристрої вхід не виконано.", - "error_device_unsupported": "Зв'язок з цим пристроєм не підтримується.", - "error_homeserver_lacks_support": "Домашній сервер не підтримує вхід на іншому пристрої.", - "error_invalid_scanned_code": "Сканований код недійсний.", - "error_linking_incomplete": "У встановлені терміни з'єднання не було виконано.", "error_rate_limited": "Забагато спроб за короткий час. Зачекайте трохи, перш ніж повторити спробу.", - "error_request_cancelled": "Запит було скасовано.", - "error_request_declined": "На іншому пристрої запит відхилено.", "error_unexpected": "Виникла непередбачувана помилка.", "scan_code_instruction": "Скануйте QR-код знизу своїм пристроєм, на якому ви вийшли.", "scan_qr_code": "Скануйте QR-код", @@ -1396,16 +1388,9 @@ "report_to_moderators_description": "У кімнатах, які підтримують модерацію, кнопка «Поскаржитися» дає змогу повідомити про зловживання модераторам кімнати.", "rust_crypto": "Реалізація криптографії Rust", "sliding_sync": "Режим ковзної синхронізації", - "sliding_sync_checking": "Перевірка…", - "sliding_sync_configuration": "Конфігурація ковзної синхронізації", "sliding_sync_description": "На стадії активної розробки, вимкнути не можна.", - "sliding_sync_disable_warning": "Для вимкнення потрібно буде вийти з системи та зайти знову, користуйтеся з обережністю!", "sliding_sync_disabled_notice": "Вийдіть і знову увійдіть, щоб вимкнути", - "sliding_sync_proxy_url_label": "URL-адреса проксі-сервера", - "sliding_sync_proxy_url_optional_label": "URL-адреса проксі-сервера (необов'язково)", "sliding_sync_server_no_support": "На вашому сервері немає вбудованої підтримки", - "sliding_sync_server_specify_proxy": "На вашому сервері немає вбудованої підтримки, ви повинні вказати проксі", - "sliding_sync_server_support": "Ваш сервер має вбудовану підтримку", "under_active_development": "У стадії активної розробки.", "video_rooms": "Відеокімнати", "video_rooms_a_new_way_to_chat": "Новий спосіб спілкування за допомогою голосового та відеозв’язку в %(brand)s.", @@ -2328,13 +2313,11 @@ "custom_theme_success": "Тему додано!", "custom_theme_url": "Посилання на власну тему", "font_size": "Розмір шрифту", - "heading": "Налаштування вигляду", "image_size_default": "Типовий", "image_size_large": "Великі", "layout_bubbles": "Бульбашки повідомлень", "layout_irc": "IRC (Експериментально)", "match_system_theme": "Тема системи", - "subheading": "Налаштування вигляду впливають тільки на цей сеанс %(brand)s.", "timeline_image_size": "Розмір зображень у стрічці", "use_high_contrast": "Висока контрастність" }, @@ -3054,8 +3037,7 @@ "my_threads_description": "Показує всі гілки, де ви брали участь", "open_thread": "Відкрити гілку", "show_all_threads": "Показати всі гілки", - "show_thread_filter": "Показати:", - "unable_to_decrypt": "Не вдалося розшифрувати повідомлення" + "show_thread_filter": "Показати:" }, "time": { "about_day_ago": "близько доби тому", @@ -3098,7 +3080,6 @@ }, "creation_summary_dm": "%(creator)s створює цю приватну розмову.", "creation_summary_room": "%(creator)s створює й налаштовує кімнату.", - "decryption_failure_blocked": "Відправник заблокував вам отримання цього повідомлення", "download_action_decrypting": "Розшифрування", "download_action_downloading": "Завантаження", "edits": { @@ -3106,7 +3087,6 @@ "tooltip_sub": "Натисніть, щоб переглянути зміни", "tooltip_title": "Змінено %(date)s" }, - "encrypted_historical_messages_unavailable": "Зашифровані повідомлення до цієї точки недоступні.", "error_no_renderer": "Неможливо показати цю подію", "error_rendering_message": "Не вдалося завантажити це повідомлення", "historical_messages_unavailable": "Ви не можете переглядати давніші повідомлення", diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 7fc2c66760..82bba11048 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -229,9 +229,6 @@ "password_field_weak_label": "Mật khẩu được phép, nhưng không an toàn", "phone_label": "Điện thoại", "phone_optional_label": "Điện thoại (tùy chọn)", - "qr_code_login": { - "error_invalid_scanned_code": "Mã vừa quét là không hợp lệ." - }, "register_action": "Tạo tài khoản", "registration": { "continue_without_email_description": "Lưu ý là nếu bạn không thêm địa chỉ thư điện tử và quên mật khẩu, bạn có thể <b>vĩnh viễn mất quyền truy cập vào tài khoản của mình</b>.", @@ -1291,10 +1288,7 @@ "sliding_sync": "Chế độ đồng bộ tối ưu (Sync v3)", "sliding_sync_description": "Đang được phát triển tích cực, không thể vô hiệu.", "sliding_sync_disabled_notice": "Đăng xuất và đăng nhập lại để vô hiệu hóa", - "sliding_sync_proxy_url_label": "Đường dẫn máy chủ ủy nhiệm (proxy)", "sliding_sync_server_no_support": "Máy chủ của bạn không hoàn toàn hỗ trợ", - "sliding_sync_server_specify_proxy": "Máy chủ của bạn không hỗ trợ, bạn cần chỉ định máy chủ ủy nhiệm (proxy)", - "sliding_sync_server_support": "Máy chủ của bạn hoàn toàn hỗ trợ", "under_active_development": "Đang được phát triển tích cực.", "video_rooms": "Phòng video", "video_rooms_a_new_way_to_chat": "Một cách mới để trò chuyện bằng thoại và video trong %(brand)s.", @@ -2120,13 +2114,11 @@ "custom_theme_success": "Đã thêm chủ đề!", "custom_theme_url": "URL chủ đề tùy chỉnh", "font_size": "Cỡ chữ", - "heading": "Tùy chỉnh diện mạo của bạn", "image_size_default": "Mặc định", "image_size_large": "Lớn", "layout_bubbles": "Bong bóng tin nhắn", "layout_irc": "IRC (thử nghiệm)", "match_system_theme": "Theo chủ đề hệ thống", - "subheading": "Cài đặt Giao diện chỉ ảnh hưởng đến phiên %(brand)s này.", "timeline_image_size": "Kích thước hình ảnh trong timeline", "use_high_contrast": "Sử dụng độ tương phản cao" }, @@ -2798,8 +2790,7 @@ "my_threads": "Các chủ đề của tôi", "my_threads_description": "Hiển thị tất cả các chủ đề bạn đã tham gia", "show_all_threads": "Hiển thị tất cả chủ đề", - "show_thread_filter": "Hiển thị:", - "unable_to_decrypt": "Không thể giải mã tin nhắn" + "show_thread_filter": "Hiển thị:" }, "time": { "about_day_ago": "khoảng một ngày trước", @@ -2837,7 +2828,6 @@ }, "creation_summary_dm": "%(creator)s đã tạo DM này.", "creation_summary_room": "%(creator)s đã tạo và định cấu hình phòng.", - "decryption_failure_blocked": "Người gửi không cho bạn nhận tin nhắn này", "download_action_decrypting": "Đang giải mã", "download_action_downloading": "Đang tải xuống", "edits": { @@ -2845,7 +2835,6 @@ "tooltip_sub": "Nhấp để xem các chỉnh sửa", "tooltip_title": "Đã chỉnh sửa lúc %(date)s" }, - "encrypted_historical_messages_unavailable": "Các tin nhắn được mã hóa trước thời điểm này không có sẵn.", "error_no_renderer": "Sự kiện này không thể được hiển thị", "error_rendering_message": "Không thể tải tin nhắn này", "historical_messages_unavailable": "Bạn khồng thể thấy các tin nhắn trước", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index e03a592144..e53f50442c 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -243,8 +243,7 @@ "approve_access_warning": "为此设备批准访问权限后,它对你的帐户有完全的访问权限。", "completing_setup": "完成新设备的设置", "confirm_code_match": "检查以下代码是否与你的其他设备匹配:", - "connecting": "正在连接……", - "error_homeserver_lacks_support": "此服务器不支持多设备登录" + "connecting": "正在连接……" }, "register_action": "创建账户", "registration": { @@ -1309,12 +1308,7 @@ "rust_crypto": "Rust加密实现", "sliding_sync": "滑动同步模式", "sliding_sync_description": "正在积极开发中,不能禁用。", - "sliding_sync_disable_warning": "要停用,你必须登出并重新登录,请小心!", - "sliding_sync_proxy_url_label": "代理URL", - "sliding_sync_proxy_url_optional_label": "代理URL(可选)", "sliding_sync_server_no_support": "你的服务器缺少原生支持", - "sliding_sync_server_specify_proxy": "你的服务器缺少原生支持,你必须指定代理", - "sliding_sync_server_support": "你的服务器有原生支持", "under_active_development": "积极开发中。", "video_rooms": "视频房间", "video_rooms_a_new_way_to_chat": "在 %(brand)s 中使用语音和视频的新方式。", @@ -2157,13 +2151,11 @@ "custom_theme_success": "主题已添加!", "custom_theme_url": "自定义主题URL", "font_size": "字体大小", - "heading": "自定义你的外观", "image_size_default": "默认", "image_size_large": "大", "layout_bubbles": "消息气泡", "layout_irc": "IRC(实验性)", "match_system_theme": "匹配系统主题", - "subheading": "外观设置仅会影响此 %(brand)s 会话。", "timeline_image_size": "时间线中的图像大小", "use_high_contrast": "使用高对比度" }, @@ -2836,7 +2828,6 @@ "tooltip_sub": "点击查看编辑历史", "tooltip_title": "编辑于 %(date)s" }, - "encrypted_historical_messages_unavailable": "在此之前的加密消息不可用。", "error_no_renderer": "无法显示此事件", "error_rendering_message": "无法加载此消息", "historical_messages_unavailable": "你不能查看更早的消息", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 0f02cb8ed0..16939a2138 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -241,15 +241,7 @@ "completing_setup": "完成您新裝置的設定", "confirm_code_match": "請確認下列代碼與您另一台裝置上的代碼相符:", "connecting": "連線中…", - "error_device_already_signed_in": "其他裝置已登入。", - "error_device_not_signed_in": "其他裝置未登入。", - "error_device_unsupported": "不支援與此裝置連結。", - "error_homeserver_lacks_support": "家伺服器不支援在其他裝置上登入。", - "error_invalid_scanned_code": "掃描的代碼無效。", - "error_linking_incomplete": "未在要求的時間內完成連結。", "error_rate_limited": "短時間內嘗試太多次,請稍待一段時間後再嘗試。", - "error_request_cancelled": "請求已取消。", - "error_request_declined": "請求在另一台裝置上被拒絕。", "error_unexpected": "發生預料之外的錯誤。", "scan_code_instruction": "請用您已登出的裝置掃描下列 QR Code。", "scan_qr_code": "掃描 QR Code", @@ -1399,16 +1391,9 @@ "report_to_moderators_description": "在支援審核的聊天室中,「回報」按鈕讓您可以回報濫用行為給聊天室管理員。", "rust_crypto": "Rust 密碼學實作", "sliding_sync": "滑動同步模式", - "sliding_sync_checking": "正在檢查…", - "sliding_sync_configuration": "滑動同步設定", "sliding_sync_description": "正在積極開發中,無法停用。", - "sliding_sync_disable_warning": "要停用,您必須登出並重新登入,請小心使用!", "sliding_sync_disabled_notice": "登出並重新登入以停用", - "sliding_sync_proxy_url_label": "代理伺服器網址", - "sliding_sync_proxy_url_optional_label": "代理伺服器網址(選填)", "sliding_sync_server_no_support": "您的伺服器缺乏原生支援", - "sliding_sync_server_specify_proxy": "您的伺服器缺乏原生支援,您必須指定代理", - "sliding_sync_server_support": "您的伺服器有原生支援", "under_active_development": "正在積極開發中。", "video_rooms": "視訊聊天室", "video_rooms_a_new_way_to_chat": "在 %(brand)s 中透過語音及視訊聊天的新方式。", @@ -2330,13 +2315,11 @@ "custom_theme_success": "已新增佈景主題!", "custom_theme_url": "自訂佈景主題網址", "font_size": "字型大小", - "heading": "自訂您的外觀", "image_size_default": "預設", "image_size_large": "大", "layout_bubbles": "訊息泡泡", "layout_irc": "IRC(實驗性)", "match_system_theme": "符合系統佈景主題", - "subheading": "外觀設定僅會影響此 %(brand)s 工作階段。", "timeline_image_size": "時間軸中的圖片大小", "use_high_contrast": "使用高對比" }, @@ -3049,8 +3032,7 @@ "my_threads_description": "顯示您參與的所有討論串", "open_thread": "開啟討論串", "show_all_threads": "顯示所有討論串", - "show_thread_filter": "顯示:", - "unable_to_decrypt": "無法解密訊息" + "show_thread_filter": "顯示:" }, "time": { "about_day_ago": "大約一天前", @@ -3089,7 +3071,6 @@ }, "creation_summary_dm": "%(creator)s 建立了此私人訊息。", "creation_summary_room": "%(creator)s 建立並設定了聊天室。", - "decryption_failure_blocked": "傳送者已封鎖您,因此無法接收此訊息", "download_action_decrypting": "正在解密", "download_action_downloading": "正在下載", "edits": { @@ -3097,7 +3078,6 @@ "tooltip_sub": "點擊以檢視編輯", "tooltip_title": "編輯於 %(date)s" }, - "encrypted_historical_messages_unavailable": "在此之前的加密訊息不可用。", "error_no_renderer": "此活動無法顯示", "error_rendering_message": "無法載入此訊息", "historical_messages_unavailable": "您看不到更早的訊息", diff --git a/src/models/notificationsettings/reconcileNotificationSettings.ts b/src/models/notificationsettings/reconcileNotificationSettings.ts index 510e7ca3af..49b35a6575 100644 --- a/src/models/notificationsettings/reconcileNotificationSettings.ts +++ b/src/models/notificationsettings/reconcileNotificationSettings.ts @@ -107,7 +107,7 @@ function toStandardRules( if (supportsIntentionalMentions) { standardRules.set(RuleId.IsUserMention, { rule_id: RuleId.IsUserMention, - kind: PushRuleKind.ContentSpecific, + kind: PushRuleKind.Override, enabled: true, actions: userMentionActions, }); @@ -129,7 +129,7 @@ function toStandardRules( if (supportsIntentionalMentions) { standardRules.set(RuleId.IsRoomMention, { rule_id: RuleId.IsRoomMention, - kind: PushRuleKind.ContentSpecific, + kind: PushRuleKind.Override, enabled: true, actions: roomMentionActions, }); diff --git a/src/rageshake/submit-rageshake.ts b/src/rageshake/submit-rageshake.ts index 99b0d45b8c..acc2bb98fd 100644 --- a/src/rageshake/submit-rageshake.ts +++ b/src/rageshake/submit-rageshake.ts @@ -105,7 +105,7 @@ async function collectBaseInformation(body: FormData, opts: IOpts): Promise<void /* :TCHAP: bug-reporting - rename app - for bugreport rageshakes body.append("app", opts.customApp || "element-web"); */ - body.append("app", "tchap-web"); + body.append("app", opts.customApp || "tchap-web"); // end :TCHAP: body.append("version", version ?? "UNKNOWN"); body.append("user_agent", userAgent); diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 6be0a6b46f..3650e51814 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -47,6 +47,7 @@ import ServerSupportUnstableFeatureController from "./controllers/ServerSupportU import { WatchManager } from "./WatchManager"; import { CustomTheme } from "../theme"; import SettingsStore from "./SettingsStore"; +import AnalyticsController from "./controllers/AnalyticsController"; export const defaultWatchManager = new WatchManager(); @@ -406,7 +407,7 @@ export const SETTINGS: { [setting: string]: ISetting } = { controller: new SlidingSyncController(), }, "feature_sliding_sync_proxy_url": { - // This is not a distinct feature, it is a setting for feature_sliding_sync above + // This is not a distinct feature, it is a legacy setting for feature_sliding_sync above supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "", }, @@ -597,11 +598,13 @@ export const SETTINGS: { [setting: string]: ISetting } = { displayName: _td("settings|showbold"), default: false, invertedSettingName: "feature_hidebold", + controller: new AnalyticsController("WebSettingsNotificationsShowBoldToggle"), }, "Notifications.tac_only_notifications": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, displayName: _td("settings|tac_only_notifications"), default: true, + controller: new AnalyticsController("WebSettingsNotificationsTACOnlyNotificationsToggle"), }, "feature_ask_to_join": { isFeature: true, @@ -1148,15 +1151,6 @@ export const SETTINGS: { [setting: string]: ISetting } = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: [], }, - "threadsActivityCentre": { - supportedLevels: LEVELS_ACCOUNT_SETTINGS, - labsGroup: LabGroup.Threads, - controller: new ReloadOnChangeController(), - displayName: _td("labs|threads_activity_centre"), - description: () => _t("labs|threads_activity_centre_description", { brand: SdkConfig.get().brand }), - default: false, - isFeature: true, - }, /** * Enable or disable the release announcement feature */ diff --git a/src/settings/controllers/AnalyticsController.ts b/src/settings/controllers/AnalyticsController.ts new file mode 100644 index 0000000000..5c127ed3b9 --- /dev/null +++ b/src/settings/controllers/AnalyticsController.ts @@ -0,0 +1,42 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import SettingController from "./SettingController"; +import { SettingLevel } from "../SettingLevel"; +import PosthogTrackers, { InteractionName } from "../../PosthogTrackers"; + +/** + * Controller that sends events to analytics when a setting is changed. + * Since it will only trigger events when the setting is changed, + * (and the value isn't reported: only the fact that it's been toggled) + * it won't be useful for tracking what percentage of a userbase has a given setting + * enabled, but many of our settings can be set per device and Posthog only supports + * per-user properties, so this isn't straightforward. This is only for seeing how + * often people interact with the settings. + */ +export default class AnalyticsController extends SettingController { + /** + * + * @param interactionName The name of the event to send to analytics + */ + public constructor(private interactionName: InteractionName) { + super(); + } + + public onChange(_level: SettingLevel, _roomId: string | null, _newValue: any): void { + PosthogTrackers.trackInteraction(this.interactionName); + } +} diff --git a/src/settings/controllers/SlidingSyncController.ts b/src/settings/controllers/SlidingSyncController.ts index 77bdf7f42f..7d7ca78128 100644 --- a/src/settings/controllers/SlidingSyncController.ts +++ b/src/settings/controllers/SlidingSyncController.ts @@ -1,5 +1,6 @@ /* Copyright 2022 The Matrix.org Foundation C.I.C. +Copyright 2024 Ed Geraghty <ed@geraghty.family> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,18 +17,11 @@ limitations under the License. import SettingController from "./SettingController"; import PlatformPeg from "../../PlatformPeg"; -import { SettingLevel } from "../SettingLevel"; -import { SlidingSyncOptionsDialog } from "../../components/views/dialogs/SlidingSyncOptionsDialog"; -import Modal from "../../Modal"; import SettingsStore from "../SettingsStore"; import { _t } from "../../languageHandler"; export default class SlidingSyncController extends SettingController { - public async beforeChange(level: SettingLevel, roomId: string, newValue: any): Promise<boolean> { - const { finished } = Modal.createDialog(SlidingSyncOptionsDialog); - const [value] = await finished; - return newValue === value; // abort the operation if we're already in the state the user chose via modal - } + public static serverSupportsSlidingSync: boolean; public async onChange(): Promise<void> { PlatformPeg.get()?.reload(); @@ -38,6 +32,9 @@ export default class SlidingSyncController extends SettingController { if (SettingsStore.getValue("feature_sliding_sync")) { return _t("labs|sliding_sync_disabled_notice"); } + if (!SlidingSyncController.serverSupportsSlidingSync) { + return _t("labs|sliding_sync_server_no_support"); + } return false; } diff --git a/src/stores/notifications/RoomNotificationStateStore.ts b/src/stores/notifications/RoomNotificationStateStore.ts index f2d10ac4fb..502d2dcce7 100644 --- a/src/stores/notifications/RoomNotificationStateStore.ts +++ b/src/stores/notifications/RoomNotificationStateStore.ts @@ -42,8 +42,6 @@ export class RoomNotificationStateStore extends AsyncStoreWithClient<IState> { private listMap = new Map<TagID, ListNotificationState>(); private _globalState = new SummarizedNotificationState(); - private tacEnabled = SettingsStore.getValue("threadsActivityCentre"); - private constructor(dispatcher = defaultDispatcher) { super(dispatcher, {}); SettingsStore.watchSetting("feature_dynamic_room_predecessors", null, () => { @@ -99,7 +97,7 @@ export class RoomNotificationStateStore extends AsyncStoreWithClient<IState> { */ public getRoomState(room: Room): RoomNotificationState { if (!this.roomMap.has(room)) { - this.roomMap.set(room, new RoomNotificationState(room, !this.tacEnabled)); + this.roomMap.set(room, new RoomNotificationState(room, false)); } return this.roomMap.get(room)!; } diff --git a/src/stores/oidc/OidcClientStore.ts b/src/stores/oidc/OidcClientStore.ts index 57fe1adcd1..ffe6977390 100644 --- a/src/stores/oidc/OidcClientStore.ts +++ b/src/stores/oidc/OidcClientStore.ts @@ -18,7 +18,11 @@ import { MatrixClient, discoverAndValidateOIDCIssuerWellKnown } from "matrix-js- import { logger } from "matrix-js-sdk/src/logger"; import { OidcClient } from "oidc-client-ts"; -import { getStoredOidcTokenIssuer, getStoredOidcClientId } from "../../utils/oidc/persistOidcSettings"; +import { + getStoredOidcTokenIssuer, + getStoredOidcClientId, + getStoredOidcIdToken, +} from "../../utils/oidc/persistOidcSettings"; import PlatformPeg from "../../PlatformPeg"; /** @@ -58,7 +62,7 @@ export class OidcClientStore { const { accountManagementEndpoint, metadata } = await discoverAndValidateOIDCIssuerWellKnown( authIssuer.issuer, ); - this._accountManagementEndpoint = accountManagementEndpoint ?? metadata.issuer; + this.setAccountManagementEndpoint(accountManagementEndpoint, metadata.issuer); } catch (e) { console.log("Auth issuer not found", e); } @@ -72,6 +76,16 @@ export class OidcClientStore { return !!this.authenticatedIssuer; } + private setAccountManagementEndpoint(endpoint: string | undefined, issuer: string): void { + // if no account endpoint is configured default to the issuer + const url = new URL(endpoint ?? issuer); + const idToken = getStoredOidcIdToken(); + if (idToken) { + url.searchParams.set("id_token_hint", idToken); + } + this._accountManagementEndpoint = url.toString(); + } + public get accountManagementEndpoint(): string | undefined { return this._accountManagementEndpoint; } @@ -150,13 +164,12 @@ export class OidcClientStore { const { accountManagementEndpoint, metadata, signingKeys } = await discoverAndValidateOIDCIssuerWellKnown( this.authenticatedIssuer, ); - // if no account endpoint is configured default to the issuer - this._accountManagementEndpoint = accountManagementEndpoint ?? metadata.issuer; + this.setAccountManagementEndpoint(accountManagementEndpoint, metadata.issuer); this.oidcClient = new OidcClient({ ...metadata, authority: metadata.issuer, signingKeys, - redirect_uri: PlatformPeg.get()!.getSSOCallbackUrl().href, + redirect_uri: PlatformPeg.get()!.getOidcCallbackUrl().href, client_id: clientId, }); } catch (error) { diff --git a/src/stores/room-list/MessagePreviewStore.ts b/src/stores/room-list/MessagePreviewStore.ts index 62dfa6f0f1..a3c44084d5 100644 --- a/src/stores/room-list/MessagePreviewStore.ts +++ b/src/stores/room-list/MessagePreviewStore.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { Room, RelationType, MatrixEvent, Thread, M_POLL_START } from "matrix-js-sdk/src/matrix"; +import { Room, RelationType, MatrixEvent, Thread, M_POLL_START, RoomEvent } from "matrix-js-sdk/src/matrix"; import { isNullOrUndefined } from "matrix-js-sdk/src/utils"; import { ActionPayload } from "../../dispatcher/payloads"; @@ -32,6 +32,7 @@ import { UPDATE_EVENT } from "../AsyncStore"; import { IPreview } from "./previews/IPreview"; import { VoiceBroadcastInfoEventType } from "../../voice-broadcast"; import { VoiceBroadcastPreview } from "./previews/VoiceBroadcastPreview"; +import shouldHideEvent from "../../shouldHideEvent"; // Emitted event for when a room's preview has changed. First argument will the room for which // the change happened. @@ -184,23 +185,8 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> { return previewDef?.previewer.getTextFor(event, undefined, true) ?? ""; } - private shouldSkipPreview(event: MatrixEvent, previousEvent?: MatrixEvent): boolean { - if (event.isRelation(RelationType.Replace)) { - if (previousEvent !== undefined) { - // Ignore edits if they don't apply to the latest event in the room to keep the preview on the latest event - const room = this.matrixClient?.getRoom(event.getRoomId()!); - const relatedEvent = room?.findEventById(event.relationEventId!); - if (relatedEvent !== previousEvent) { - return true; - } - } - } - - return false; - } - private async generatePreview(room: Room, tagId?: TagID): Promise<void> { - const events = [...room.getLiveTimeline().getEvents()]; + const events = [...room.getLiveTimeline().getEvents(), ...room.getPendingEvents()]; // add last reply from each thread room.getThreads().forEach((thread: Thread): void => { @@ -221,8 +207,6 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> { this.previews.set(room.roomId, map); } - const previousEventInAny = map.get(TAG_ANY)?.event; - // Set the tags so we know what to generate if (!map.has(TAG_ANY)) map.set(TAG_ANY, null); if (tagId && !map.has(tagId)) map.set(tagId, null); @@ -237,7 +221,8 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> { const event = events[i]; await this.matrixClient?.decryptEventIfNeeded(event); - + const shouldHide = shouldHideEvent(event); + if (shouldHide) continue; const previewDef = PREVIEWS[event.getType()]; if (!previewDef) continue; if (previewDef.isState && isNullOrUndefined(event.getStateKey())) continue; @@ -245,16 +230,11 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> { const anyPreviewText = previewDef.previewer.getTextFor(event); if (!anyPreviewText) continue; // not previewable for some reason - if (!this.shouldSkipPreview(event, previousEventInAny)) { - changed = changed || anyPreviewText !== map.get(TAG_ANY)?.text; - map.set(TAG_ANY, mkMessagePreview(anyPreviewText, event)); - } + changed = changed || anyPreviewText !== map.get(TAG_ANY)?.text; + map.set(TAG_ANY, mkMessagePreview(anyPreviewText, event)); const tagsToGenerate = Array.from(map.keys()).filter((t) => t !== TAG_ANY); // we did the any tag above for (const genTagId of tagsToGenerate) { - const previousEventInTag = map.get(genTagId)?.event; - if (this.shouldSkipPreview(event, previousEventInTag)) continue; - const realTagId = genTagId === TAG_ANY ? undefined : genTagId; const preview = previewDef.previewer.getTextFor(event, realTagId); @@ -299,4 +279,19 @@ export class MessagePreviewStore extends AsyncStoreWithClient<IState> { await this.generatePreview(room, TAG_ANY); } } + + protected async onReady(): Promise<void> { + if (!this.matrixClient) return; + this.matrixClient.on(RoomEvent.LocalEchoUpdated, this.onLocalEchoUpdated); + } + + protected async onNotReady(): Promise<void> { + if (!this.matrixClient) return; + this.matrixClient.off(RoomEvent.LocalEchoUpdated, this.onLocalEchoUpdated); + } + + protected onLocalEchoUpdated = async (ev: MatrixEvent, room: Room): Promise<void> => { + if (!this.previews.has(room.roomId)) return; + await this.generatePreview(room, TAG_ANY); + }; } diff --git a/src/toasts/IncomingCallToast.tsx b/src/toasts/IncomingCallToast.tsx index 5fc64fc3de..dfdf25efe6 100644 --- a/src/toasts/IncomingCallToast.tsx +++ b/src/toasts/IncomingCallToast.tsx @@ -20,7 +20,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/matrix"; import { MatrixRTCSessionManagerEvents } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSessionManager"; // eslint-disable-next-line no-restricted-imports import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession"; -import { Button, Tooltip, TooltipProvider } from "@vector-im/compound-web"; +import { Button, Tooltip } from "@vector-im/compound-web"; import { Icon as VideoCallIcon } from "@vector-im/compound-design-tokens/icons/video-call-solid.svg"; import { _t } from "../languageHandler"; @@ -36,13 +36,12 @@ import { LiveContentType, } from "../components/views/rooms/LiveContentSummary"; import { useCall, useJoinCallButtonDisabledTooltip } from "../hooks/useCall"; -import { ButtonEvent } from "../components/views/elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../components/views/elements/AccessibleButton"; import { useDispatcher } from "../hooks/useDispatcher"; import { ActionPayload } from "../dispatcher/payloads"; import { Call } from "../models/Call"; import { AudioID } from "../LegacyCallHandler"; import { useEventEmitter, useTypedEventEmitter } from "../hooks/useEventEmitter"; -import AccessibleTooltipButton from "../components/views/elements/AccessibleTooltipButton"; import { CallStore, CallStoreEvent } from "../stores/CallStore"; export const getIncomingCallToastKey = (callId: string, roomId: string): string => `call_${callId}_${roomId}`; @@ -168,7 +167,7 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { ); return ( - <TooltipProvider> + <> <div> <RoomAvatar room={room ?? undefined} size="24px" /> </div> @@ -195,11 +194,11 @@ export function IncomingCallToast({ notifyEvent }: Props): JSX.Element { disabledTooltip={otherCallIsOngoing ? "Ongoing call" : undefined} /> </div> - <AccessibleTooltipButton + <AccessibleButton className="mx_IncomingCallToast_closeButton" onClick={onCloseClick} title={_t("action|close")} /> - </TooltipProvider> + </> ); } diff --git a/src/toasts/IncomingLegacyCallToast.tsx b/src/toasts/IncomingLegacyCallToast.tsx index fbe806e543..8b51096264 100644 --- a/src/toasts/IncomingLegacyCallToast.tsx +++ b/src/toasts/IncomingLegacyCallToast.tsx @@ -25,7 +25,6 @@ import LegacyCallHandler, { LegacyCallHandlerEvent } from "../LegacyCallHandler" import { MatrixClientPeg } from "../MatrixClientPeg"; import { _t } from "../languageHandler"; import RoomAvatar from "../components/views/avatars/RoomAvatar"; -import AccessibleTooltipButton from "../components/views/elements/AccessibleTooltipButton"; import AccessibleButton, { ButtonEvent } from "../components/views/elements/AccessibleButton"; export const getIncomingLegacyCallToastKey = (callId: string): string => `call_${callId}`; @@ -136,7 +135,7 @@ export default class IncomingLegacyCallToast extends React.Component<IProps, ISt </AccessibleButton> </div> </div> - <AccessibleTooltipButton + <AccessibleButton className={silenceClass} disabled={callForcedSilent} onClick={this.onSilenceClick} diff --git a/src/utils/DialogOpener.ts b/src/utils/DialogOpener.ts index 0dc39b92e6..1252fd65ac 100644 --- a/src/utils/DialogOpener.ts +++ b/src/utils/DialogOpener.ts @@ -91,7 +91,6 @@ export class DialogOpener { Modal.createDialog( SpacePreferencesDialog, { - initialTabId: payload.initalTabId, space: payload.space, }, undefined, diff --git a/src/utils/StorageAccess.ts b/src/utils/StorageAccess.ts new file mode 100644 index 0000000000..94d3a2d1c7 --- /dev/null +++ b/src/utils/StorageAccess.ts @@ -0,0 +1,132 @@ +/* +Copyright 2019-2021, 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** + * Retrieves the IndexedDB factory object. + * + * @returns {IDBFactory | undefined} The IndexedDB factory object if available, or undefined if it is not supported. + */ +export function getIDBFactory(): IDBFactory | undefined { + // IndexedDB loading is lazy for easier testing. + + // just *accessing* _indexedDB throws an exception in firefox with + // indexeddb disabled. + try { + // `self` is preferred for service workers, which access this file's functions. + // We check `self` first because `window` returns something which doesn't work for service workers. + // Note: `self?.indexedDB ?? window.indexedDB` breaks in service workers for unknown reasons. + return self?.indexedDB ? self.indexedDB : window.indexedDB; + } catch (e) {} +} + +let idb: IDBDatabase | null = null; + +async function idbInit(): Promise<void> { + if (!getIDBFactory()) { + throw new Error("IndexedDB not available"); + } + idb = await new Promise((resolve, reject) => { + const request = getIDBFactory()!.open("matrix-react-sdk", 1); + request.onerror = reject; + request.onsuccess = (): void => { + resolve(request.result); + }; + request.onupgradeneeded = (): void => { + const db = request.result; + db.createObjectStore("pickleKey"); + db.createObjectStore("account"); + }; + }); +} + +/** + * Loads an item from an IndexedDB table within the underlying `matrix-react-sdk` database. + * + * If IndexedDB access is not supported in the environment, an error is thrown. + * + * @param {string} table The name of the object store in IndexedDB. + * @param {string | string[]} key The key where the data is stored. + * @returns {Promise<any>} A promise that resolves with the retrieved item from the table. + */ +export async function idbLoad(table: string, key: string | string[]): Promise<any> { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb!.transaction([table], "readonly"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.get(key); + request.onerror = reject; + request.onsuccess = (event): void => { + resolve(request.result); + }; + }); +} + +/** + * Saves data to an IndexedDB table within the underlying `matrix-react-sdk` database. + * + * If IndexedDB access is not supported in the environment, an error is thrown. + * + * @param {string} table The name of the object store in the IndexedDB. + * @param {string|string[]} key The key to use for storing the data. + * @param {*} data The data to be saved. + * @returns {Promise<void>} A promise that resolves when the data is saved successfully. + */ +export async function idbSave(table: string, key: string | string[], data: any): Promise<void> { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb!.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.put(data, key); + request.onerror = reject; + request.onsuccess = (event): void => { + resolve(); + }; + }); +} + +/** + * Deletes a record from an IndexedDB table within the underlying `matrix-react-sdk` database. + * + * If IndexedDB access is not supported in the environment, an error is thrown. + * + * @param {string} table The name of the object store where the record is stored. + * @param {string|string[]} key The key of the record to be deleted. + * @returns {Promise<void>} A Promise that resolves when the record(s) have been successfully deleted. + */ +export async function idbDelete(table: string, key: string | string[]): Promise<void> { + if (!idb) { + await idbInit(); + } + return new Promise((resolve, reject) => { + const txn = idb!.transaction([table], "readwrite"); + txn.onerror = reject; + + const objectStore = txn.objectStore(table); + const request = objectStore.delete(key); + request.onerror = reject; + request.onsuccess = (): void => { + resolve(); + }; + }); +} diff --git a/src/utils/StorageManager.ts b/src/utils/StorageManager.ts index faf5f7d27a..0cee3d9ef5 100644 --- a/src/utils/StorageManager.ts +++ b/src/utils/StorageManager.ts @@ -19,18 +19,10 @@ import { logger } from "matrix-js-sdk/src/logger"; import SettingsStore from "../settings/SettingsStore"; import { Features } from "../settings/Settings"; +import { getIDBFactory } from "./StorageAccess"; const localStorage = window.localStorage; -// make this lazy in order to make testing easier -function getIndexedDb(): IDBFactory | undefined { - // just *accessing* _indexedDB throws an exception in firefox with - // indexeddb disabled. - try { - return window.indexedDB; - } catch (e) {} -} - // The JS SDK will add a prefix of "matrix-js-sdk:" to the sync store name. const SYNC_STORE_NAME = "riot-web-sync"; const LEGACY_CRYPTO_STORE_NAME = "matrix-js-sdk:crypto"; @@ -68,7 +60,7 @@ export async function checkConsistency(): Promise<{ }> { log("Checking storage consistency"); log(`Local storage supported? ${!!localStorage}`); - log(`IndexedDB supported? ${!!getIndexedDb()}`); + log(`IndexedDB supported? ${!!getIDBFactory()}`); let dataInLocalStorage = false; let dataInCryptoStore = false; @@ -86,7 +78,7 @@ export async function checkConsistency(): Promise<{ error("Local storage cannot be used on this browser"); } - if (getIndexedDb() && localStorage) { + if (getIDBFactory() && localStorage) { const results = await checkSyncStore(); if (!results.healthy) { healthy = false; @@ -96,7 +88,7 @@ export async function checkConsistency(): Promise<{ error("Sync store cannot be used on this browser"); } - if (getIndexedDb()) { + if (getIDBFactory()) { const results = await checkCryptoStore(); dataInCryptoStore = results.exists; if (!results.healthy) { @@ -138,7 +130,7 @@ interface StoreCheck { async function checkSyncStore(): Promise<StoreCheck> { let exists = false; try { - exists = await IndexedDBStore.exists(getIndexedDb()!, SYNC_STORE_NAME); + exists = await IndexedDBStore.exists(getIDBFactory()!, SYNC_STORE_NAME); log(`Sync store using IndexedDB contains data? ${exists}`); return { exists, healthy: true }; } catch (e) { @@ -152,7 +144,7 @@ async function checkCryptoStore(): Promise<StoreCheck> { if (await SettingsStore.getValue(Features.RustCrypto)) { // check first if there is a rust crypto store try { - const rustDbExists = await IndexedDBCryptoStore.exists(getIndexedDb()!, RUST_CRYPTO_STORE_NAME); + const rustDbExists = await IndexedDBCryptoStore.exists(getIDBFactory()!, RUST_CRYPTO_STORE_NAME); log(`Rust Crypto store using IndexedDB contains data? ${rustDbExists}`); if (rustDbExists) { @@ -162,7 +154,7 @@ async function checkCryptoStore(): Promise<StoreCheck> { // No rust store, so let's check if there is a legacy store not yet migrated. try { const legacyIdbExists = await IndexedDBCryptoStore.existsAndIsNotMigrated( - getIndexedDb()!, + getIDBFactory()!, LEGACY_CRYPTO_STORE_NAME, ); log(`Legacy Crypto store using IndexedDB contains non migrated data? ${legacyIdbExists}`); @@ -183,7 +175,7 @@ async function checkCryptoStore(): Promise<StoreCheck> { let exists = false; // legacy checks try { - exists = await IndexedDBCryptoStore.exists(getIndexedDb()!, LEGACY_CRYPTO_STORE_NAME); + exists = await IndexedDBCryptoStore.exists(getIDBFactory()!, LEGACY_CRYPTO_STORE_NAME); log(`Crypto store using IndexedDB contains data? ${exists}`); return { exists, healthy: true }; } catch (e) { @@ -214,77 +206,3 @@ async function checkCryptoStore(): Promise<StoreCheck> { export function setCryptoInitialised(cryptoInited: boolean): void { localStorage.setItem("mx_crypto_initialised", String(cryptoInited)); } - -/* Simple wrapper functions around IndexedDB. - */ - -let idb: IDBDatabase | null = null; - -async function idbInit(): Promise<void> { - if (!getIndexedDb()) { - throw new Error("IndexedDB not available"); - } - idb = await new Promise((resolve, reject) => { - const request = getIndexedDb()!.open("matrix-react-sdk", 1); - request.onerror = reject; - request.onsuccess = (): void => { - resolve(request.result); - }; - request.onupgradeneeded = (): void => { - const db = request.result; - db.createObjectStore("pickleKey"); - db.createObjectStore("account"); - }; - }); -} - -export async function idbLoad(table: string, key: string | string[]): Promise<any> { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readonly"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.get(key); - request.onerror = reject; - request.onsuccess = (event): void => { - resolve(request.result); - }; - }); -} - -export async function idbSave(table: string, key: string | string[], data: any): Promise<void> { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.put(data, key); - request.onerror = reject; - request.onsuccess = (event): void => { - resolve(); - }; - }); -} - -export async function idbDelete(table: string, key: string | string[]): Promise<void> { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.delete(key); - request.onerror = reject; - request.onsuccess = (): void => { - resolve(); - }; - }); -} diff --git a/src/utils/exportUtils/HtmlExport.tsx b/src/utils/exportUtils/HtmlExport.tsx index 6f17942007..3edf0f3cc0 100644 --- a/src/utils/exportUtils/HtmlExport.tsx +++ b/src/utils/exportUtils/HtmlExport.tsx @@ -20,7 +20,6 @@ import { Room, MatrixEvent, EventType, MsgType } from "matrix-js-sdk/src/matrix" import { renderToStaticMarkup } from "react-dom/server"; import { logger } from "matrix-js-sdk/src/logger"; import escapeHtml from "escape-html"; -import { TooltipProvider } from "@vector-im/compound-web"; import Exporter from "./Exporter"; import { mediaFromMxc } from "../../customisations/Media"; @@ -284,27 +283,25 @@ export default class HTMLExporter extends Exporter { return ( <div className="mx_Export_EventWrapper" id={mxEv.getId()}> <MatrixClientContext.Provider value={this.room.client}> - <TooltipProvider> - <EventTile - mxEvent={mxEv} - continuation={continuation} - isRedacted={mxEv.isRedacted()} - replacingEventId={mxEv.replacingEventId()} - forExport={true} - alwaysShowTimestamps={true} - showUrlPreview={false} - checkUnmounting={() => false} - isTwelveHour={false} - last={false} - lastInSection={false} - permalinkCreator={this.permalinkCreator} - lastSuccessful={false} - isSelectedEvent={false} - showReactions={false} - layout={Layout.Group} - showReadReceipts={false} - /> - </TooltipProvider> + <EventTile + mxEvent={mxEv} + continuation={continuation} + isRedacted={mxEv.isRedacted()} + replacingEventId={mxEv.replacingEventId()} + forExport={true} + alwaysShowTimestamps={true} + showUrlPreview={false} + checkUnmounting={() => false} + isTwelveHour={false} + last={false} + lastInSection={false} + permalinkCreator={this.permalinkCreator} + lastSuccessful={false} + isSelectedEvent={false} + showReactions={false} + layout={Layout.Group} + showReadReceipts={false} + /> </MatrixClientContext.Provider> </div> ); diff --git a/src/utils/oidc/authorize.ts b/src/utils/oidc/authorize.ts index 8bbdd9894a..345fb42969 100644 --- a/src/utils/oidc/authorize.ts +++ b/src/utils/oidc/authorize.ts @@ -40,7 +40,7 @@ export const startOidcLogin = async ( identityServerUrl?: string, isRegistration?: boolean, ): Promise<void> => { - const redirectUri = PlatformPeg.get()!.getSSOCallbackUrl().href; + const redirectUri = PlatformPeg.get()!.getOidcCallbackUrl().href; const nonce = randomString(10); @@ -86,6 +86,8 @@ type CompleteOidcLoginResponse = { accessToken: string; // refreshToken gained from OIDC token issuer, when falsy token cannot be refreshed refreshToken?: string; + // idToken gained from OIDC token issuer + idToken: string; // this client's id as registered with the OIDC issuer clientId: string; // issuer used during authentication @@ -109,6 +111,7 @@ export const completeOidcLogin = async (queryParams: QueryDict): Promise<Complet identityServerUrl, accessToken: tokenResponse.access_token, refreshToken: tokenResponse.refresh_token, + idToken: tokenResponse.id_token, clientId: oidcClientSettings.clientId, issuer: oidcClientSettings.issuer, idTokenClaims, diff --git a/src/utils/oidc/persistOidcSettings.ts b/src/utils/oidc/persistOidcSettings.ts index 8a557952f1..2918e68ac8 100644 --- a/src/utils/oidc/persistOidcSettings.ts +++ b/src/utils/oidc/persistOidcSettings.ts @@ -15,9 +15,14 @@ limitations under the License. */ import { IdTokenClaims } from "oidc-client-ts"; +import { decodeIdToken } from "matrix-js-sdk/src/matrix"; const clientIdStorageKey = "mx_oidc_client_id"; const tokenIssuerStorageKey = "mx_oidc_token_issuer"; +const idTokenStorageKey = "mx_oidc_id_token"; +/** + * @deprecated in favour of using idTokenStorageKey + */ const idTokenClaimsStorageKey = "mx_oidc_id_token_claims"; /** @@ -25,15 +30,13 @@ const idTokenClaimsStorageKey = "mx_oidc_id_token_claims"; * Only set after successful authentication * @param clientId * @param issuer + * @param idToken + * @param idTokenClaims */ -export const persistOidcAuthenticatedSettings = ( - clientId: string, - issuer: string, - idTokenClaims: IdTokenClaims, -): void => { +export const persistOidcAuthenticatedSettings = (clientId: string, issuer: string, idToken: string): void => { localStorage.setItem(clientIdStorageKey, clientId); localStorage.setItem(tokenIssuerStorageKey, issuer); - localStorage.setItem(idTokenClaimsStorageKey, JSON.stringify(idTokenClaims)); + localStorage.setItem(idTokenStorageKey, idToken); }; /** @@ -59,13 +62,26 @@ export const getStoredOidcClientId = (): string => { }; /** - * Retrieve stored id token claims from local storage - * @returns idtokenclaims or undefined + * Retrieve stored id token claims from stored id token or local storage + * @returns idTokenClaims or undefined */ export const getStoredOidcIdTokenClaims = (): IdTokenClaims | undefined => { + const idToken = getStoredOidcIdToken(); + if (idToken) { + return decodeIdToken(idToken); + } + const idTokenClaims = localStorage.getItem(idTokenClaimsStorageKey); if (!idTokenClaims) { return; } return JSON.parse(idTokenClaims) as IdTokenClaims; }; + +/** + * Retrieve stored id token from local storage + * @returns idToken or undefined + */ +export const getStoredOidcIdToken = (): string | undefined => { + return localStorage.getItem(idTokenStorageKey) ?? undefined; +}; diff --git a/src/utils/pillify.tsx b/src/utils/pillify.tsx index 22fcaec99a..38ac08d6ee 100644 --- a/src/utils/pillify.tsx +++ b/src/utils/pillify.tsx @@ -18,7 +18,6 @@ import React from "react"; import ReactDOM from "react-dom"; import { PushProcessor } from "matrix-js-sdk/src/pushprocessor"; import { MatrixClient, MatrixEvent, RuleId } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import SettingsStore from "../settings/SettingsStore"; import { Pill, pillRoomNotifLen, pillRoomNotifPos, PillType } from "../components/views/elements/Pill"; @@ -84,9 +83,7 @@ export function pillifyLinks( const pillContainer = document.createElement("span"); const pill = ( - <TooltipProvider> - <Pill url={href} inMessage={true} room={room} shouldShowPillAvatar={shouldShowPillAvatar} /> - </TooltipProvider> + <Pill url={href} inMessage={true} room={room} shouldShowPillAvatar={shouldShowPillAvatar} /> ); ReactDOM.render(pill, pillContainer); @@ -141,14 +138,12 @@ export function pillifyLinks( const pillContainer = document.createElement("span"); const pill = ( - <TooltipProvider> - <Pill - type={PillType.AtRoomMention} - inMessage={true} - room={room} - shouldShowPillAvatar={shouldShowPillAvatar} - /> - </TooltipProvider> + <Pill + type={PillType.AtRoomMention} + inMessage={true} + room={room} + shouldShowPillAvatar={shouldShowPillAvatar} + /> ); ReactDOM.render(pill, pillContainer); diff --git a/src/utils/tokens/pickling.ts b/src/utils/tokens/pickling.ts new file mode 100644 index 0000000000..c113559a69 --- /dev/null +++ b/src/utils/tokens/pickling.ts @@ -0,0 +1,88 @@ +/* +Copyright 2016 Aviral Dasgupta +Copyright 2016 OpenMarket Ltd +Copyright 2018 New Vector Ltd +Copyright 2020, 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { encodeUnpaddedBase64 } from "matrix-js-sdk/src/matrix"; +import { logger } from "matrix-js-sdk/src/logger"; + +/** + * Calculates the `additionalData` for the AES-GCM key used by the pickling processes. This + * additional data is *not* encrypted, but *is* authenticated. The additional data is constructed + * from the user ID and device ID provided. + * + * The later-constructed pickle key is used to decrypt values, such as access tokens, from IndexedDB. + * + * See https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams for more information on + * `additionalData`. + * + * @param {string} userId The user ID who owns the pickle key. + * @param {string} deviceId The device ID which owns the pickle key. + * @return {Uint8Array} The additional data as a Uint8Array. + */ +export function getPickleAdditionalData(userId: string, deviceId: string): Uint8Array { + const additionalData = new Uint8Array(userId.length + deviceId.length + 1); + for (let i = 0; i < userId.length; i++) { + additionalData[i] = userId.charCodeAt(i); + } + additionalData[userId.length] = 124; // "|" + for (let i = 0; i < deviceId.length; i++) { + additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); + } + return additionalData; +} + +/** + * Decrypts the provided data into a pickle key and base64-encodes it ready for use elsewhere. + * + * If `data` is undefined in part or in full, returns undefined. + * + * If crypto functions are not available, returns undefined regardless of input. + * + * @param data An object containing the encrypted pickle key data: encrypted payload, initialization vector (IV), and crypto key. Typically loaded from indexedDB. + * @param userId The user ID the pickle key belongs to. + * @param deviceId The device ID the pickle key belongs to. + * @returns A promise that resolves to the encoded pickle key, or undefined if the key cannot be built and encoded. + */ +export async function buildAndEncodePickleKey( + data: { encrypted?: BufferSource; iv?: BufferSource; cryptoKey?: CryptoKey } | undefined, + userId: string, + deviceId: string, +): Promise<string | undefined> { + if (!crypto?.subtle) { + return undefined; + } + if (!data || !data.encrypted || !data.iv || !data.cryptoKey) { + return undefined; + } + + try { + const additionalData = getPickleAdditionalData(userId, deviceId); + const pickleKeyBuf = await crypto.subtle.decrypt( + { name: "AES-GCM", iv: data.iv, additionalData }, + data.cryptoKey, + data.encrypted, + ); + if (pickleKeyBuf) { + return encodeUnpaddedBase64(pickleKeyBuf); + } + } catch (e) { + logger.error("Error decrypting pickle key"); + } + + return undefined; +} diff --git a/src/utils/tokens/tokens.ts b/src/utils/tokens/tokens.ts index 864b6b2090..f526775e63 100644 --- a/src/utils/tokens/tokens.ts +++ b/src/utils/tokens/tokens.ts @@ -17,7 +17,7 @@ limitations under the License. import { decryptAES, encryptAES, IEncryptedPayload } from "matrix-js-sdk/src/crypto/aes"; import { logger } from "matrix-js-sdk/src/logger"; -import * as StorageManager from "../StorageManager"; +import * as StorageAccess from "../StorageAccess"; /** * Utility functions related to the storage and retrieval of access tokens @@ -50,10 +50,10 @@ async function pickleKeyToAesKey(pickleKey: string): Promise<Uint8Array> { for (let i = 0; i < pickleKey.length; i++) { pickleKeyBuffer[i] = pickleKey.charCodeAt(i); } - const hkdfKey = await window.crypto.subtle.importKey("raw", pickleKeyBuffer, "HKDF", false, ["deriveBits"]); + const hkdfKey = await crypto.subtle.importKey("raw", pickleKeyBuffer, "HKDF", false, ["deriveBits"]); pickleKeyBuffer.fill(0); return new Uint8Array( - await window.crypto.subtle.deriveBits( + await crypto.subtle.deriveBits( { name: "HKDF", hash: "SHA-256", @@ -142,7 +142,7 @@ export async function persistTokenInStorage( // Save either the encrypted access token, or the plain access // token if there is no token or we were unable to encrypt (e.g. if the browser doesn't // have WebCrypto). - await StorageManager.idbSave("account", storageKey, encryptedToken || token); + await StorageAccess.idbSave("account", storageKey, encryptedToken || token); } catch (e) { // if we couldn't save to indexedDB, fall back to localStorage. We // store the access token unencrypted since localStorage only saves @@ -155,7 +155,7 @@ export async function persistTokenInStorage( } } else { try { - await StorageManager.idbSave("account", storageKey, token); + await StorageAccess.idbSave("account", storageKey, token); } catch (e) { if (!!token) { localStorage.setItem(storageKey, token); diff --git a/src/utils/tooltipify.tsx b/src/utils/tooltipify.tsx index 8f384e59e4..e3280f7fe2 100644 --- a/src/utils/tooltipify.tsx +++ b/src/utils/tooltipify.tsx @@ -16,7 +16,6 @@ limitations under the License. import React from "react"; import ReactDOM from "react-dom"; -import { TooltipProvider } from "@vector-im/compound-web"; import PlatformPeg from "../PlatformPeg"; import LinkWithTooltip from "../components/views/elements/LinkWithTooltip"; @@ -61,11 +60,9 @@ export function tooltipifyLinks(rootNodes: ArrayLike<Element>, ignoredNodes: Ele // wrapping the link with the LinkWithTooltip component, keeping the same children. Ideally we'd do this // without the superfluous span but this is not something React trivially supports at this time. const tooltip = ( - <TooltipProvider> - <LinkWithTooltip tooltip={href}> - <span dangerouslySetInnerHTML={{ __html: node.innerHTML }} /> - </LinkWithTooltip> - </TooltipProvider> + <LinkWithTooltip tooltip={href}> + <span dangerouslySetInnerHTML={{ __html: node.innerHTML }} /> + </LinkWithTooltip> ); ReactDOM.render(tooltip, node); diff --git a/src/voice-broadcast/components/atoms/VoiceBroadcastHeader.tsx b/src/voice-broadcast/components/atoms/VoiceBroadcastHeader.tsx index 1fe579bfbe..34a2a81a20 100644 --- a/src/voice-broadcast/components/atoms/VoiceBroadcastHeader.tsx +++ b/src/voice-broadcast/components/atoms/VoiceBroadcastHeader.tsx @@ -29,7 +29,6 @@ import Spinner from "../../../components/views/elements/Spinner"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { Action } from "../../../dispatcher/actions"; import dis from "../../../dispatcher/dispatcher"; -import AccessibleTooltipButton from "../../../components/views/elements/AccessibleTooltipButton"; interface VoiceBroadcastHeaderProps { linkToRoom?: boolean; @@ -95,14 +94,14 @@ export const VoiceBroadcastHeader: React.FC<VoiceBroadcastHeaderProps> = ({ }); const microphoneLine = microphoneLabel && ( - <AccessibleTooltipButton + <AccessibleButton className={microphoneLineClasses} onClick={onMicrophoneLineClick} title={_t("voip|change_input_device")} > <MicrophoneIcon className="mx_Icon mx_Icon_16" /> <span>{microphoneLabel}</span> - </AccessibleTooltipButton> + </AccessibleButton> ); const onRoomAvatarOrNameClick = (): void => { diff --git a/src/voice-broadcast/components/molecules/VoiceBroadcastRecordingPip.tsx b/src/voice-broadcast/components/molecules/VoiceBroadcastRecordingPip.tsx index 026cf40ce1..46ca3f9319 100644 --- a/src/voice-broadcast/components/molecules/VoiceBroadcastRecordingPip.tsx +++ b/src/voice-broadcast/components/molecules/VoiceBroadcastRecordingPip.tsx @@ -32,7 +32,7 @@ import { Icon as MicrophoneIcon } from "../../../../res/img/compound/mic-16px.sv import { _t } from "../../../languageHandler"; import { useAudioDeviceSelection } from "../../../hooks/useAudioDeviceSelection"; import { DevicesContextMenu } from "../../../components/views/audio_messages/DevicesContextMenu"; -import AccessibleTooltipButton from "../../../components/views/elements/AccessibleTooltipButton"; +import AccessibleButton from "../../../components/views/elements/AccessibleButton"; interface VoiceBroadcastRecordingPipProps { recording: VoiceBroadcastRecording; @@ -92,12 +92,12 @@ export const VoiceBroadcastRecordingPip: React.FC<VoiceBroadcastRecordingPipProp ) : ( <div className="mx_VoiceBroadcastBody_controls"> {toggleControl} - <AccessibleTooltipButton + <AccessibleButton onClick={(): void => setShowDeviceSelect(true)} title={_t("voip|change_input_device")} > <MicrophoneIcon className="mx_Icon mx_Icon_16 mx_Icon_alert" /> - </AccessibleTooltipButton> + </AccessibleButton> <VoiceBroadcastControl icon={<StopIcon className="mx_Icon mx_Icon_16" />} label="Stop Recording" diff --git a/test/DecryptionFailureTracker-test.ts b/test/DecryptionFailureTracker-test.ts index 553d4f4d74..305692fce8 100644 --- a/test/DecryptionFailureTracker-test.ts +++ b/test/DecryptionFailureTracker-test.ts @@ -19,21 +19,11 @@ import { DecryptionFailureCode } from "matrix-js-sdk/src/crypto-api"; import { DecryptionFailureTracker } from "../src/DecryptionFailureTracker"; -class MockDecryptionError extends Error { - public readonly code: string; - - constructor(code?: string) { - super(); - - this.code = code || "MOCK_DECRYPTION_ERROR"; - } -} - -async function createFailedDecryptionEvent() { +async function createFailedDecryptionEvent(code?: DecryptionFailureCode) { return await mkDecryptionFailureMatrixEvent({ roomId: "!room:id", sender: "@alice:example.com", - code: DecryptionFailureCode.UNKNOWN_ERROR, + code: code ?? DecryptionFailureCode.UNKNOWN_ERROR, msg: ":(", }); } @@ -50,9 +40,7 @@ describe("DecryptionFailureTracker", function () { ); tracker.addVisibleEvent(failedDecryptionEvent); - - const err = new MockDecryptionError(); - tracker.eventDecrypted(failedDecryptionEvent, err); + tracker.eventDecrypted(failedDecryptionEvent); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -65,7 +53,9 @@ describe("DecryptionFailureTracker", function () { }); it("tracks a failed decryption with expected raw error for a visible event", async function () { - const failedDecryptionEvent = await createFailedDecryptionEvent(); + const failedDecryptionEvent = await createFailedDecryptionEvent( + DecryptionFailureCode.OLM_UNKNOWN_MESSAGE_INDEX, + ); let count = 0; let reportedRawCode = ""; @@ -79,9 +69,7 @@ describe("DecryptionFailureTracker", function () { ); tracker.addVisibleEvent(failedDecryptionEvent); - - const err = new MockDecryptionError("INBOUND_SESSION_MISMATCH_ROOM_ID"); - tracker.eventDecrypted(failedDecryptionEvent, err); + tracker.eventDecrypted(failedDecryptionEvent); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -93,7 +81,7 @@ describe("DecryptionFailureTracker", function () { expect(count).not.toBe(0); // Should add the rawCode to the event context - expect(reportedRawCode).toBe("INBOUND_SESSION_MISMATCH_ROOM_ID"); + expect(reportedRawCode).toBe("OLM_UNKNOWN_MESSAGE_INDEX"); }); it("tracks a failed decryption for an event that becomes visible later", async function () { @@ -106,9 +94,7 @@ describe("DecryptionFailureTracker", function () { () => "UnknownError", ); - const err = new MockDecryptionError(); - tracker.eventDecrypted(failedDecryptionEvent, err); - + tracker.eventDecrypted(failedDecryptionEvent); tracker.addVisibleEvent(failedDecryptionEvent); // Pretend "now" is Infinity @@ -131,8 +117,7 @@ describe("DecryptionFailureTracker", function () { () => "UnknownError", ); - const err = new MockDecryptionError(); - tracker.eventDecrypted(failedDecryptionEvent, err); + tracker.eventDecrypted(failedDecryptionEvent); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -156,9 +141,7 @@ describe("DecryptionFailureTracker", function () { ); tracker.addVisibleEvent(decryptedEvent); - - const err = new MockDecryptionError(); - tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent); // Indicate successful decryption. await decryptExistingEvent(decryptedEvent, { @@ -188,15 +171,14 @@ describe("DecryptionFailureTracker", function () { () => "UnknownError", ); - const err = new MockDecryptionError(); - tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent); // Indicate successful decryption. await decryptExistingEvent(decryptedEvent, { plainType: "m.room.message", plainContent: { body: "success" }, }); - tracker.eventDecrypted(decryptedEvent, null); + tracker.eventDecrypted(decryptedEvent); tracker.addVisibleEvent(decryptedEvent); @@ -222,16 +204,15 @@ describe("DecryptionFailureTracker", function () { tracker.addVisibleEvent(decryptedEvent); // Arbitrary number of failed decryptions for both events - const err = new MockDecryptionError(); - tracker.eventDecrypted(decryptedEvent, err); - tracker.eventDecrypted(decryptedEvent, err); - tracker.eventDecrypted(decryptedEvent, err); - tracker.eventDecrypted(decryptedEvent, err); - tracker.eventDecrypted(decryptedEvent, err); - tracker.eventDecrypted(decryptedEvent2, err); - tracker.eventDecrypted(decryptedEvent2, err); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent2); tracker.addVisibleEvent(decryptedEvent2); - tracker.eventDecrypted(decryptedEvent2, err); + tracker.eventDecrypted(decryptedEvent2); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -259,8 +240,7 @@ describe("DecryptionFailureTracker", function () { tracker.addVisibleEvent(decryptedEvent); // Indicate decryption - const err = new MockDecryptionError(); - tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -268,7 +248,7 @@ describe("DecryptionFailureTracker", function () { tracker.trackFailures(); // Indicate a second decryption, after having tracked the failure - tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent); tracker.trackFailures(); @@ -292,8 +272,7 @@ describe("DecryptionFailureTracker", function () { tracker.addVisibleEvent(decryptedEvent); // Indicate decryption - const err = new MockDecryptionError(); - tracker.eventDecrypted(decryptedEvent, err); + tracker.eventDecrypted(decryptedEvent); // Pretend "now" is Infinity // NB: This saves to localStorage specific to DFT @@ -312,7 +291,7 @@ describe("DecryptionFailureTracker", function () { //secondTracker.loadTrackedEvents(); - secondTracker.eventDecrypted(decryptedEvent, err); + secondTracker.eventDecrypted(decryptedEvent); secondTracker.checkFailures(Infinity); secondTracker.trackFailures(); @@ -326,25 +305,27 @@ describe("DecryptionFailureTracker", function () { // @ts-ignore access to private constructor const tracker = new DecryptionFailureTracker( (total: number, errorCode: string) => (counts[errorCode] = (counts[errorCode] || 0) + total), - (error: string) => (error === "UnknownError" ? "UnknownError" : "OlmKeysNotSentError"), + (error: DecryptionFailureCode) => + error === DecryptionFailureCode.UNKNOWN_ERROR ? "UnknownError" : "OlmKeysNotSentError", ); - const decryptedEvent1 = await createFailedDecryptionEvent(); - const decryptedEvent2 = await createFailedDecryptionEvent(); - const decryptedEvent3 = await createFailedDecryptionEvent(); - - const error1 = new MockDecryptionError("UnknownError"); - const error2 = new MockDecryptionError("OlmKeysNotSentError"); + const decryptedEvent1 = await createFailedDecryptionEvent(DecryptionFailureCode.UNKNOWN_ERROR); + const decryptedEvent2 = await createFailedDecryptionEvent( + DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID, + ); + const decryptedEvent3 = await createFailedDecryptionEvent( + DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID, + ); tracker.addVisibleEvent(decryptedEvent1); tracker.addVisibleEvent(decryptedEvent2); tracker.addVisibleEvent(decryptedEvent3); // One failure of ERROR_CODE_1, and effectively two for ERROR_CODE_2 - tracker.eventDecrypted(decryptedEvent1, error1); - tracker.eventDecrypted(decryptedEvent2, error2); - tracker.eventDecrypted(decryptedEvent2, error2); - tracker.eventDecrypted(decryptedEvent3, error2); + tracker.eventDecrypted(decryptedEvent1); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent3); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -364,21 +345,19 @@ describe("DecryptionFailureTracker", function () { (_errorCode: string) => "OlmUnspecifiedError", ); - const decryptedEvent1 = await createFailedDecryptionEvent(); - const decryptedEvent2 = await createFailedDecryptionEvent(); - const decryptedEvent3 = await createFailedDecryptionEvent(); - - const error1 = new MockDecryptionError("ERROR_CODE_1"); - const error2 = new MockDecryptionError("ERROR_CODE_2"); - const error3 = new MockDecryptionError("ERROR_CODE_3"); + const decryptedEvent1 = await createFailedDecryptionEvent( + DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID, + ); + const decryptedEvent2 = await createFailedDecryptionEvent(DecryptionFailureCode.OLM_UNKNOWN_MESSAGE_INDEX); + const decryptedEvent3 = await createFailedDecryptionEvent(DecryptionFailureCode.UNKNOWN_ERROR); tracker.addVisibleEvent(decryptedEvent1); tracker.addVisibleEvent(decryptedEvent2); tracker.addVisibleEvent(decryptedEvent3); - tracker.eventDecrypted(decryptedEvent1, error1); - tracker.eventDecrypted(decryptedEvent2, error2); - tracker.eventDecrypted(decryptedEvent3, error3); + tracker.eventDecrypted(decryptedEvent1); + tracker.eventDecrypted(decryptedEvent2); + tracker.eventDecrypted(decryptedEvent3); // Pretend "now" is Infinity tracker.checkFailures(Infinity); @@ -397,20 +376,72 @@ describe("DecryptionFailureTracker", function () { (errorCode: string) => Array.from(errorCode).reverse().join(""), ); - const decryptedEvent = await createFailedDecryptionEvent(); + const decryptedEvent = await createFailedDecryptionEvent(DecryptionFailureCode.OLM_UNKNOWN_MESSAGE_INDEX); + tracker.addVisibleEvent(decryptedEvent); + tracker.eventDecrypted(decryptedEvent); - const error = new MockDecryptionError("ERROR_CODE_1"); + // Pretend "now" is Infinity + tracker.checkFailures(Infinity); - tracker.addVisibleEvent(decryptedEvent); + tracker.trackFailures(); + + // should track remapped error code + expect(counts["XEDNI_EGASSEM_NWONKNU_MLO"]).toBe(1); + }); - tracker.eventDecrypted(decryptedEvent, error); + it("default error code mapper maps error codes correctly", async () => { + const errorCodes: string[] = []; + + // @ts-ignore access to private constructor + const tracker = new DecryptionFailureTracker( + (total: number, errorCode: string) => { + errorCodes.push(errorCode); + }, + // @ts-ignore access to private member + DecryptionFailureTracker.instance.errorCodeMapFn, + ); + + const event1 = await createFailedDecryptionEvent(DecryptionFailureCode.MEGOLM_UNKNOWN_INBOUND_SESSION_ID); + tracker.addVisibleEvent(event1); + tracker.eventDecrypted(event1); + + const event2 = await createFailedDecryptionEvent(DecryptionFailureCode.OLM_UNKNOWN_MESSAGE_INDEX); + tracker.addVisibleEvent(event2); + tracker.eventDecrypted(event2); + + const event3 = await createFailedDecryptionEvent(DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP); + tracker.addVisibleEvent(event3); + tracker.eventDecrypted(event3); + + const event4 = await createFailedDecryptionEvent(DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED); + tracker.addVisibleEvent(event4); + tracker.eventDecrypted(event4); + + const event5 = await createFailedDecryptionEvent(DecryptionFailureCode.HISTORICAL_MESSAGE_WORKING_BACKUP); + tracker.addVisibleEvent(event5); + tracker.eventDecrypted(event5); + + const event6 = await createFailedDecryptionEvent(DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED); + tracker.addVisibleEvent(event6); + tracker.eventDecrypted(event6); + + const event7 = await createFailedDecryptionEvent(DecryptionFailureCode.UNKNOWN_ERROR); + tracker.addVisibleEvent(event7); + tracker.eventDecrypted(event7); // Pretend "now" is Infinity tracker.checkFailures(Infinity); tracker.trackFailures(); - // should track remapped error code - expect(counts["1_EDOC_RORRE"]).toBe(1); + expect(errorCodes).toEqual([ + "OlmKeysNotSentError", + "OlmIndexError", + "HistoricalMessage", + "HistoricalMessage", + "HistoricalMessage", + "ExpectedDueToMembership", + "UnknownError", + ]); }); }); diff --git a/test/HtmlUtils-test.tsx b/test/HtmlUtils-test.tsx index f177fc1b47..d9e75faaa9 100644 --- a/test/HtmlUtils-test.tsx +++ b/test/HtmlUtils-test.tsx @@ -166,6 +166,16 @@ describe("bodyToHtml", () => { }); expect(html).toMatchSnapshot(); }); + + it("should not mangle divs", () => { + const html = getHtml({ + body: "hello world", + msgtype: "m.text", + formatted_body: "<p>hello</p><div>world</div>", + format: "org.matrix.custom.html", + }); + expect(html).toMatchSnapshot(); + }); }); }); diff --git a/test/Lifecycle-test.ts b/test/Lifecycle-test.ts index fac59b235a..4a6122f470 100644 --- a/test/Lifecycle-test.ts +++ b/test/Lifecycle-test.ts @@ -26,7 +26,7 @@ import StorageEvictedDialog from "../src/components/views/dialogs/StorageEvicted import { logout, restoreFromLocalStorage, setLoggedIn } from "../src/Lifecycle"; import { MatrixClientPeg } from "../src/MatrixClientPeg"; import Modal from "../src/Modal"; -import * as StorageManager from "../src/utils/StorageManager"; +import * as StorageAccess from "../src/utils/StorageAccess"; import { flushPromises, getMockClientWithEventEmitter, mockClientMethodsUser, mockPlatformPeg } from "./test-utils"; import { OidcClientStore } from "../src/stores/oidc/OidcClientStore"; import { makeDelegatedAuthConfig } from "./test-utils/oidc"; @@ -128,13 +128,13 @@ describe("Lifecycle", () => { }; const initIdbMock = (mockStore: Record<string, Record<string, unknown>> = {}): void => { - jest.spyOn(StorageManager, "idbLoad") + jest.spyOn(StorageAccess, "idbLoad") .mockClear() .mockImplementation( // @ts-ignore mock type async (table: string, key: string) => mockStore[table]?.[key] ?? null, ); - jest.spyOn(StorageManager, "idbSave") + jest.spyOn(StorageAccess, "idbSave") .mockClear() .mockImplementation( // @ts-ignore mock type @@ -144,7 +144,7 @@ describe("Lifecycle", () => { mockStore[tableKey] = table; }, ); - jest.spyOn(StorageManager, "idbDelete").mockClear().mockResolvedValue(undefined); + jest.spyOn(StorageAccess, "idbDelete").mockClear().mockResolvedValue(undefined); }; const homeserverUrl = "https://server.org"; @@ -258,16 +258,16 @@ describe("Lifecycle", () => { expect(localStorage.setItem).toHaveBeenCalledWith("mx_is_guest", "false"); expect(localStorage.setItem).toHaveBeenCalledWith("mx_device_id", deviceId); - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); // dont put accessToken in localstorage when we have idb expect(localStorage.setItem).not.toHaveBeenCalledWith("mx_access_token", accessToken); }); it("should persist access token when idb is not available", async () => { - jest.spyOn(StorageManager, "idbSave").mockRejectedValue("oups"); + jest.spyOn(StorageAccess, "idbSave").mockRejectedValue("oups"); expect(await restoreFromLocalStorage()).toEqual(true); - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); // put accessToken in localstorage as fallback expect(localStorage.setItem).toHaveBeenCalledWith("mx_access_token", accessToken); }); @@ -316,11 +316,7 @@ describe("Lifecycle", () => { // refresh token from storage is re-persisted expect(localStorage.setItem).toHaveBeenCalledWith("mx_has_refresh_token", "true"); - expect(StorageManager.idbSave).toHaveBeenCalledWith( - "account", - "mx_refresh_token", - refreshToken, - ); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_refresh_token", refreshToken); }); it("should create new matrix client with credentials", async () => { @@ -359,7 +355,7 @@ describe("Lifecycle", () => { expect(localStorage.setItem).toHaveBeenCalledWith("mx_has_access_token", "true"); // token encrypted and persisted - expect(StorageManager.idbSave).toHaveBeenCalledWith( + expect(StorageAccess.idbSave).toHaveBeenCalledWith( "account", "mx_access_token", encryptedTokenShapedObject, @@ -368,7 +364,7 @@ describe("Lifecycle", () => { it("should persist access token when idb is not available", async () => { // dont fail for pickle key persist - jest.spyOn(StorageManager, "idbSave").mockImplementation( + jest.spyOn(StorageAccess, "idbSave").mockImplementation( async (table: string, key: string | string[]) => { if (table === "account" && key === "mx_access_token") { throw new Error("oups"); @@ -378,7 +374,7 @@ describe("Lifecycle", () => { expect(await restoreFromLocalStorage()).toEqual(true); - expect(StorageManager.idbSave).toHaveBeenCalledWith( + expect(StorageAccess.idbSave).toHaveBeenCalledWith( "account", "mx_access_token", encryptedTokenShapedObject, @@ -422,7 +418,7 @@ describe("Lifecycle", () => { // refresh token from storage is re-persisted expect(localStorage.setItem).toHaveBeenCalledWith("mx_has_refresh_token", "true"); - expect(StorageManager.idbSave).toHaveBeenCalledWith( + expect(StorageAccess.idbSave).toHaveBeenCalledWith( "account", "mx_refresh_token", encryptedTokenShapedObject, @@ -502,7 +498,7 @@ describe("Lifecycle", () => { expect(localStorage.setItem).toHaveBeenCalledWith("mx_is_guest", "false"); expect(localStorage.setItem).toHaveBeenCalledWith("mx_device_id", deviceId); - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); // dont put accessToken in localstorage when we have idb expect(localStorage.setItem).not.toHaveBeenCalledWith("mx_access_token", accessToken); }); @@ -513,14 +509,14 @@ describe("Lifecycle", () => { refreshToken, }); - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_refresh_token", refreshToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_refresh_token", refreshToken); // dont put accessToken in localstorage when we have idb expect(localStorage.setItem).not.toHaveBeenCalledWith("mx_access_token", accessToken); }); it("should remove any access token from storage when there is none in credentials and idb save fails", async () => { - jest.spyOn(StorageManager, "idbSave").mockRejectedValue("oups"); + jest.spyOn(StorageAccess, "idbSave").mockRejectedValue("oups"); await setLoggedIn({ ...credentials, // @ts-ignore @@ -534,7 +530,7 @@ describe("Lifecycle", () => { it("should clear stores", async () => { await setLoggedIn(credentials); - expect(StorageManager.idbDelete).toHaveBeenCalledWith("account", "mx_access_token"); + expect(StorageAccess.idbDelete).toHaveBeenCalledWith("account", "mx_access_token"); expect(sessionStorage.clear).toHaveBeenCalled(); expect(mockClient.clearStores).toHaveBeenCalled(); }); @@ -566,7 +562,7 @@ describe("Lifecycle", () => { }); // unpickled access token saved - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); expect(mockPlatform.createPickleKey).not.toHaveBeenCalled(); }); @@ -585,16 +581,12 @@ describe("Lifecycle", () => { expect(localStorage.setItem).toHaveBeenCalledWith("mx_device_id", deviceId); expect(localStorage.setItem).toHaveBeenCalledWith("mx_has_pickle_key", "true"); - expect(StorageManager.idbSave).toHaveBeenCalledWith( + expect(StorageAccess.idbSave).toHaveBeenCalledWith( "account", "mx_access_token", encryptedTokenShapedObject, ); - expect(StorageManager.idbSave).toHaveBeenCalledWith( - "pickleKey", - [userId, deviceId], - expect.any(Object), - ); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("pickleKey", [userId, deviceId], expect.any(Object)); // dont put accessToken in localstorage when we have idb expect(localStorage.setItem).not.toHaveBeenCalledWith("mx_access_token", accessToken); }); @@ -604,12 +596,12 @@ describe("Lifecycle", () => { await setLoggedIn(credentials); // persist the unencrypted token - expect(StorageManager.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); + expect(StorageAccess.idbSave).toHaveBeenCalledWith("account", "mx_access_token", accessToken); }); it("should persist token in localStorage when idb fails to save token", async () => { // dont fail for pickle key persist - jest.spyOn(StorageManager, "idbSave").mockImplementation( + jest.spyOn(StorageAccess, "idbSave").mockImplementation( async (table: string, key: string | string[]) => { if (table === "account" && key === "mx_access_token") { throw new Error("oups"); @@ -624,7 +616,7 @@ describe("Lifecycle", () => { it("should remove any access token from storage when there is none in credentials and idb save fails", async () => { // dont fail for pickle key persist - jest.spyOn(StorageManager, "idbSave").mockImplementation( + jest.spyOn(StorageAccess, "idbSave").mockImplementation( async (table: string, key: string | string[]) => { if (table === "account" && key === "mx_access_token") { throw new Error("oups"); @@ -665,13 +657,8 @@ describe("Lifecycle", () => { const issuer = "https://auth.com/"; const delegatedAuthConfig = makeDelegatedAuthConfig(issuer); - const idTokenClaims = { - aud: "123", - iss: issuer, - sub: "123", - exp: 123, - iat: 456, - }; + const idToken = + "eyJhbGciOiJSUzI1NiIsImtpZCI6Imh4ZEhXb0Y5bW4ifQ.eyJzdWIiOiIwMUhQUDJGU0JZREU5UDlFTU04REQ3V1pIUiIsImlzcyI6Imh0dHBzOi8vYXV0aC1vaWRjLmxhYi5lbGVtZW50LmRldi8iLCJpYXQiOjE3MTUwNzE5ODUsImF1dGhfdGltZSI6MTcwNzk5MDMxMiwiY19oYXNoIjoidGt5R1RhUjU5aTk3YXoyTU4yMGdidyIsImV4cCI6MTcxNTA3NTU4NSwibm9uY2UiOiJxaXhwM0hFMmVaIiwiYXVkIjoiMDFIWDk0Mlg3QTg3REgxRUs2UDRaNjI4WEciLCJhdF9oYXNoIjoiNFlFUjdPRlVKTmRTeEVHV2hJUDlnZyJ9.HxODneXvSTfWB5Vc4cf7b8GiN2gdwUuTiyVqZuupWske2HkZiJZUt5Lsxg9BW3gz28POkE0Ln17snlkmy02B_AD3DQxKOOxQCzIIARHdfFvZxgGWsMdFcVQZDW7rtXcqgj-SpVaUQ_8acsgxSrz_DF2o0O4tto0PT6wVUiw8KlBmgWTscWPeAWe-39T-8EiQ8Wi16h6oSPcz2NzOQ7eOM_S9fDkOorgcBkRGLl1nrahrPSdWJSGAeruk5mX4YxN714YThFDyEA2t9YmKpjaiSQ2tT-Xkd7tgsZqeirNs2ni9mIiFX3bRX6t2AhUNzA7MaX9ZyizKGa6go3BESO_oDg"; beforeAll(() => { fetchMock.get( @@ -690,7 +677,7 @@ describe("Lifecycle", () => { beforeEach(() => { initSessionStorageMock(); // set values in session storage as they would be after a successful oidc authentication - persistOidcAuthenticatedSettings(clientId, issuer, idTokenClaims); + persistOidcAuthenticatedSettings(clientId, issuer, idToken); }); it("should not try to create a token refresher without a refresh token", async () => { @@ -720,7 +707,7 @@ describe("Lifecycle", () => { clientId, // @ts-ignore set undefined issuer undefined, - idTokenClaims, + idToken, ); await setLoggedIn({ ...credentials, @@ -752,7 +739,7 @@ describe("Lifecycle", () => { it("should create a client when creating token refresher fails", async () => { // set invalid value in session storage for a malformed oidc authentication - persistOidcAuthenticatedSettings(null as any, issuer, idTokenClaims); + persistOidcAuthenticatedSettings(null as any, issuer, idToken); // succeeded expect( diff --git a/test/PosthogAnalytics-test.ts b/test/PosthogAnalytics-test.ts index 748c8f17f6..c131e536d1 100644 --- a/test/PosthogAnalytics-test.ts +++ b/test/PosthogAnalytics-test.ts @@ -36,7 +36,7 @@ const getFakePosthog = (): PostHog => register: jest.fn(), get_distinct_id: jest.fn(), persistence: { - get_user_state: jest.fn(), + get_property: jest.fn(), }, identifyUser: jest.fn(), }) as unknown as PostHog; diff --git a/test/SlidingSyncManager-test.ts b/test/SlidingSyncManager-test.ts index 76ebd8f15c..9cb30c5b6f 100644 --- a/test/SlidingSyncManager-test.ts +++ b/test/SlidingSyncManager-test.ts @@ -17,9 +17,12 @@ limitations under the License. import { SlidingSync } from "matrix-js-sdk/src/sliding-sync"; import { mocked } from "jest-mock"; import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; +import fetchMockJest from "fetch-mock-jest"; import { SlidingSyncManager } from "../src/SlidingSyncManager"; import { stubClient } from "./test-utils"; +import SlidingSyncController from "../src/settings/controllers/SlidingSyncController"; +import SettingsStore from "../src/settings/SettingsStore"; jest.mock("matrix-js-sdk/src/sliding-sync"); const MockSlidingSync = <jest.Mock<SlidingSync>>(<unknown>SlidingSync); @@ -37,6 +40,8 @@ describe("SlidingSyncManager", () => { mocked(client.getRoom).mockReturnValue(null); manager.configure(client, "invalid"); manager.slidingSync = slidingSync; + fetchMockJest.reset(); + fetchMockJest.get("https://proxy/client/server.json", {}); }); describe("setRoomVisible", () => { @@ -231,4 +236,94 @@ describe("SlidingSyncManager", () => { ); }); }); + describe("checkSupport", () => { + beforeEach(() => { + SlidingSyncController.serverSupportsSlidingSync = false; + jest.spyOn(manager, "getProxyFromWellKnown").mockResolvedValue("https://proxy/"); + }); + it("shorts out if the server has 'native' sliding sync support", async () => { + jest.spyOn(manager, "nativeSlidingSyncSupport").mockResolvedValue(true); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeFalsy(); + await manager.checkSupport(client); + expect(manager.getProxyFromWellKnown).not.toHaveBeenCalled(); // We return earlier + expect(SlidingSyncController.serverSupportsSlidingSync).toBeTruthy(); + }); + it("tries to find a sliding sync proxy url from the client well-known if there's no 'native' support", async () => { + jest.spyOn(manager, "nativeSlidingSyncSupport").mockResolvedValue(false); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeFalsy(); + await manager.checkSupport(client); + expect(manager.getProxyFromWellKnown).toHaveBeenCalled(); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeTruthy(); + }); + it("should query well-known on server_name not baseUrl", async () => { + fetchMockJest.get("https://matrix.org/.well-known/matrix/client", { + "m.homeserver": { + base_url: "https://matrix-client.matrix.org", + server: "matrix.org", + }, + "org.matrix.msc3575.proxy": { + url: "https://proxy/", + }, + }); + fetchMockJest.get("https://matrix-client.matrix.org/_matrix/client/versions", { versions: ["v1.4"] }); + + mocked(manager.getProxyFromWellKnown).mockRestore(); + jest.spyOn(manager, "nativeSlidingSyncSupport").mockResolvedValue(false); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeFalsy(); + await manager.checkSupport(client); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeTruthy(); + expect(fetchMockJest).not.toHaveFetched("https://matrix-client.matrix.org/.well-known/matrix/client"); + }); + }); + describe("nativeSlidingSyncSupport", () => { + beforeEach(() => { + SlidingSyncController.serverSupportsSlidingSync = false; + }); + it("should make an OPTIONS request to avoid unintended side effects", async () => { + // See https://github.com/element-hq/element-web/issues/27426 + + const unstableSpy = jest + .spyOn(client, "doesServerSupportUnstableFeature") + .mockImplementation(async (feature: string) => { + expect(feature).toBe("org.matrix.msc3575"); + return true; + }); + const proxySpy = jest.spyOn(manager, "getProxyFromWellKnown").mockResolvedValue("https://proxy/"); + + expect(SlidingSyncController.serverSupportsSlidingSync).toBeFalsy(); + await manager.checkSupport(client); // first thing it does is call nativeSlidingSyncSupport + expect(proxySpy).not.toHaveBeenCalled(); + expect(unstableSpy).toHaveBeenCalled(); + expect(SlidingSyncController.serverSupportsSlidingSync).toBeTruthy(); + }); + }); + describe("setup", () => { + beforeEach(() => { + jest.spyOn(manager, "configure"); + jest.spyOn(manager, "startSpidering"); + }); + it("uses the baseUrl as a proxy if no proxy is set in the client well-known and the server has no native support", async () => { + await manager.setup(client); + expect(manager.configure).toHaveBeenCalled(); + expect(manager.configure).toHaveBeenCalledWith(client, client.baseUrl); + expect(manager.startSpidering).toHaveBeenCalled(); + }); + it("uses the proxy declared in the client well-known", async () => { + jest.spyOn(manager, "getProxyFromWellKnown").mockResolvedValue("https://proxy/"); + await manager.setup(client); + expect(manager.configure).toHaveBeenCalled(); + expect(manager.configure).toHaveBeenCalledWith(client, "https://proxy/"); + expect(manager.startSpidering).toHaveBeenCalled(); + }); + it("uses the legacy `feature_sliding_sync_proxy_url` if it was set", async () => { + jest.spyOn(manager, "getProxyFromWellKnown").mockResolvedValue("https://proxy/"); + jest.spyOn(SettingsStore, "getValue").mockImplementation((name: string) => { + if (name === "feature_sliding_sync_proxy_url") return "legacy-proxy"; + }); + await manager.setup(client); + expect(manager.configure).toHaveBeenCalled(); + expect(manager.configure).toHaveBeenCalledWith(client, "legacy-proxy"); + expect(manager.startSpidering).toHaveBeenCalled(); + }); + }); }); diff --git a/test/__snapshots__/HtmlUtils-test.tsx.snap b/test/__snapshots__/HtmlUtils-test.tsx.snap index c4d91467c0..c33cc46433 100644 --- a/test/__snapshots__/HtmlUtils-test.tsx.snap +++ b/test/__snapshots__/HtmlUtils-test.tsx.snap @@ -2,6 +2,8 @@ exports[`bodyToHtml feature_latex_maths should not mangle code blocks 1`] = `"<p>hello</p><pre><code>$\\xi$</code></pre><p>world</p>"`; +exports[`bodyToHtml feature_latex_maths should not mangle divs 1`] = `"<p>hello</p><div>world</div>"`; + exports[`bodyToHtml feature_latex_maths should render block katex 1`] = `"<p>hello</p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>ξ</mi></mrow><annotation encoding="application/x-tex">\\xi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.04601em;">ξ</span></span></span></span></span><p>world</p>"`; exports[`bodyToHtml feature_latex_maths should render inline katex 1`] = `"hello <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ξ</mi></mrow><annotation encoding="application/x-tex">\\xi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.04601em;">ξ</span></span></span></span> world"`; diff --git a/test/components/structures/MatrixChat-test.tsx b/test/components/structures/MatrixChat-test.tsx index 908c7a7c04..00a44c44bd 100644 --- a/test/components/structures/MatrixChat-test.tsx +++ b/test/components/structures/MatrixChat-test.tsx @@ -29,7 +29,7 @@ import { defer, sleep } from "matrix-js-sdk/src/utils"; import { UserVerificationStatus } from "matrix-js-sdk/src/crypto-api"; import MatrixChat from "../../../src/components/structures/MatrixChat"; -import * as StorageManager from "../../../src/utils/StorageManager"; +import * as StorageAccess from "../../../src/utils/StorageAccess"; import defaultDispatcher from "../../../src/dispatcher/dispatcher"; import { Action } from "../../../src/dispatcher/actions"; import { UserTab } from "../../../src/components/views/dialogs/UserTab"; @@ -61,6 +61,7 @@ import SettingsStore from "../../../src/settings/SettingsStore"; import { SettingLevel } from "../../../src/settings/SettingLevel"; import { MatrixClientPeg as peg } from "../../../src/MatrixClientPeg"; import DMRoomMap from "../../../src/utils/DMRoomMap"; +import { ReleaseAnnouncementStore } from "../../../src/stores/ReleaseAnnouncementStore"; jest.mock("matrix-js-sdk/src/oidc/authorize", () => ({ completeAuthorizationCodeGrant: jest.fn(), @@ -219,8 +220,8 @@ describe("<MatrixChat />", () => { headers: { "content-type": "application/json" }, }); - jest.spyOn(StorageManager, "idbLoad").mockReset(); - jest.spyOn(StorageManager, "idbSave").mockResolvedValue(undefined); + jest.spyOn(StorageAccess, "idbLoad").mockReset(); + jest.spyOn(StorageAccess, "idbSave").mockResolvedValue(undefined); jest.spyOn(defaultDispatcher, "dispatch").mockClear(); jest.spyOn(defaultDispatcher, "fire").mockClear(); @@ -283,6 +284,7 @@ describe("<MatrixChat />", () => { const tokenResponse: BearerTokenResponse = { access_token: accessToken, refresh_token: "def456", + id_token: "ghi789", scope: "test", token_type: "Bearer", expires_at: 12345, @@ -458,7 +460,7 @@ describe("<MatrixChat />", () => { describe("when login succeeds", () => { beforeEach(() => { - jest.spyOn(StorageManager, "idbLoad").mockImplementation( + jest.spyOn(StorageAccess, "idbLoad").mockImplementation( async (_table: string, key: string | string[]) => (key === "mx_access_token" ? accessToken : null), ); loginClient.getProfileInfo.mockResolvedValue({ @@ -552,7 +554,7 @@ describe("<MatrixChat />", () => { beforeEach(async () => { await populateStorageForSession(); - jest.spyOn(StorageManager, "idbLoad").mockImplementation(async (table, key) => { + jest.spyOn(StorageAccess, "idbLoad").mockImplementation(async (table, key) => { const safeKey = Array.isArray(key) ? key[0] : key; return mockidb[table]?.[safeKey]; }); @@ -627,6 +629,12 @@ describe("<MatrixChat />", () => { (id) => [room, spaceRoom].find((room) => room.roomId === id) || null, ); jest.spyOn(spaceRoom, "isSpaceRoom").mockReturnValue(true); + + jest.spyOn(ReleaseAnnouncementStore.instance, "getReleaseAnnouncement").mockReturnValue(null); + }); + + afterEach(() => { + jest.restoreAllMocks(); }); describe("leave_room", () => { @@ -861,7 +869,7 @@ describe("<MatrixChat />", () => { mockClient.loginFlows.mockResolvedValue({ flows: [{ type: "m.login.password" }] }); - jest.spyOn(StorageManager, "idbLoad").mockImplementation(async (table, key) => { + jest.spyOn(StorageAccess, "idbLoad").mockImplementation(async (table, key) => { const safeKey = Array.isArray(key) ? key[0] : key; return mockidb[table]?.[safeKey]; }); @@ -1157,7 +1165,7 @@ describe("<MatrixChat />", () => { describe("when login succeeds", () => { beforeEach(() => { - jest.spyOn(StorageManager, "idbLoad").mockImplementation( + jest.spyOn(StorageAccess, "idbLoad").mockImplementation( async (_table: string, key: string | string[]) => { if (key === "mx_access_token") { return accessToken as any; diff --git a/test/components/structures/MessagePanel-test.tsx b/test/components/structures/MessagePanel-test.tsx index 3513cee91f..23f094d4ab 100644 --- a/test/components/structures/MessagePanel-test.tsx +++ b/test/components/structures/MessagePanel-test.tsx @@ -20,7 +20,6 @@ import { EventEmitter } from "events"; import { MatrixEvent, Room, RoomMember, Thread, ReceiptType } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { render } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import MessagePanel, { shouldFormContinuation } from "../../../src/components/structures/MessagePanel"; import SettingsStore from "../../../src/settings/SettingsStore"; @@ -99,9 +98,7 @@ describe("MessagePanel", function () { const getComponent = (props = {}, roomContext: Partial<IRoomState> = {}) => ( <MatrixClientContext.Provider value={client}> <RoomContext.Provider value={{ ...defaultRoomContext, ...roomContext }}> - <TooltipProvider> - <MessagePanel {...defaultProps} {...props} /> - </TooltipProvider> + <MessagePanel {...defaultProps} {...props} /> </RoomContext.Provider> </MatrixClientContext.Provider> ); diff --git a/test/components/structures/RightPanel-test.tsx b/test/components/structures/RightPanel-test.tsx index 49eea96410..d7f5fbef11 100644 --- a/test/components/structures/RightPanel-test.tsx +++ b/test/components/structures/RightPanel-test.tsx @@ -19,7 +19,6 @@ import { render, screen, waitFor } from "@testing-library/react"; import { jest } from "@jest/globals"; import { mocked, MockedObject } from "jest-mock"; import { MatrixClient } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import _RightPanel from "../../../src/components/structures/RightPanel"; import { MatrixClientPeg } from "../../../src/MatrixClientPeg"; @@ -123,7 +122,6 @@ describe("RightPanel", () => { resizeNotifier={resizeNotifier} permalinkCreator={new RoomPermalinkCreator(r1, r1.roomId)} />, - { wrapper: TooltipProvider }, ); // Wait for RPS room 1 updates to fire const rpsUpdated = waitForRpsUpdate(); diff --git a/test/components/structures/RoomView-test.tsx b/test/components/structures/RoomView-test.tsx index d0d12d7105..31f5c896ae 100644 --- a/test/components/structures/RoomView-test.tsx +++ b/test/components/structures/RoomView-test.tsx @@ -33,7 +33,6 @@ import { KnownMembership } from "matrix-js-sdk/src/types"; import { MEGOLM_ALGORITHM } from "matrix-js-sdk/src/crypto/olmlib"; import { fireEvent, render, screen, RenderResult, waitForElementToBeRemoved, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import { stubClient, @@ -145,7 +144,6 @@ describe("RoomView", () => { wrappedRef={ref as any} /> </SDKContext.Provider>, - { wrapper: TooltipProvider }, ); await flushPromises(); return roomView; @@ -183,7 +181,6 @@ describe("RoomView", () => { onRegistered={jest.fn()} /> </SDKContext.Provider>, - { wrapper: TooltipProvider }, ); await flushPromises(); return roomView; diff --git a/test/components/structures/SpaceHierarchy-test.tsx b/test/components/structures/SpaceHierarchy-test.tsx index 653b24fc53..d25f8a6f12 100644 --- a/test/components/structures/SpaceHierarchy-test.tsx +++ b/test/components/structures/SpaceHierarchy-test.tsx @@ -20,7 +20,6 @@ import { fireEvent, render, screen, waitFor, waitForElementToBeRemoved } from "@ import { HierarchyRoom, JoinRule, MatrixClient, Room } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { RoomHierarchy } from "matrix-js-sdk/src/room-hierarchy"; -import { TooltipProvider } from "@vector-im/compound-web"; import { MatrixClientPeg } from "../../../src/MatrixClientPeg"; import { mkStubRoom, stubClient } from "../../test-utils"; @@ -287,9 +286,7 @@ describe("SpaceHierarchy", () => { }; const getComponent = (props = {}): React.ReactElement => ( <MatrixClientContext.Provider value={client}> - <TooltipProvider> - <SpaceHierarchy {...defaultProps} {...props} /> - </TooltipProvider> + <SpaceHierarchy {...defaultProps} {...props} /> </MatrixClientContext.Provider> ); diff --git a/test/components/structures/TabbedView-test.tsx b/test/components/structures/TabbedView-test.tsx index d624633390..5ecf682afc 100644 --- a/test/components/structures/TabbedView-test.tsx +++ b/test/components/structures/TabbedView-test.tsx @@ -28,8 +28,17 @@ describe("<TabbedView />", () => { const defaultProps = { tabLocation: TabLocation.LEFT, tabs: [generalTab, labsTab, securityTab] as NonEmptyArray<Tab<any>>, + onChange: () => {}, }; - const getComponent = (props = {}): React.ReactElement => <TabbedView {...defaultProps} {...props} />; + const getComponent = ( + props: { + activeTabId: "GENERAL" | "LABS" | "SECURITY"; + onChange?: () => any; + tabs?: NonEmptyArray<Tab<any>>; + } = { + activeTabId: "GENERAL", + }, + ): React.ReactElement => <TabbedView {...defaultProps} {...props} />; const getTabTestId = (tab: Tab<string>): string => `settings-tab-${tab.id}`; const getActiveTab = (container: HTMLElement): Element | undefined => @@ -42,38 +51,15 @@ describe("<TabbedView />", () => { expect(container).toMatchSnapshot(); }); - it("renders first tab as active tab when no initialTabId", () => { - const { container } = render(getComponent()); - expect(getActiveTab(container)?.textContent).toEqual(_t(generalTab.label)); - expect(getActiveTabBody(container)?.textContent).toEqual("general"); - }); - - it("renders first tab as active tab when initialTabId is not valid", () => { - const { container } = render(getComponent({ initialTabId: "bad-tab-id" })); - expect(getActiveTab(container)?.textContent).toEqual(_t(generalTab.label)); - expect(getActiveTabBody(container)?.textContent).toEqual("general"); - }); - - it("renders initialTabId tab as active when valid", () => { - const { container } = render(getComponent({ initialTabId: securityTab.id })); - expect(getActiveTab(container)?.textContent).toEqual(_t(securityTab.label)); - expect(getActiveTabBody(container)?.textContent).toEqual("security"); - }); - - it("sets active tab on tab click", () => { - const { container, getByTestId } = render(getComponent()); - - act(() => { - fireEvent.click(getByTestId(getTabTestId(securityTab))); - }); - + it("renders activeTabId tab as active when valid", () => { + const { container } = render(getComponent({ activeTabId: securityTab.id })); expect(getActiveTab(container)?.textContent).toEqual(_t(securityTab.label)); expect(getActiveTabBody(container)?.textContent).toEqual("security"); }); it("calls onchange on on tab click", () => { const onChange = jest.fn(); - const { getByTestId } = render(getComponent({ onChange })); + const { getByTestId } = render(getComponent({ activeTabId: "GENERAL", onChange })); act(() => { fireEvent.click(getByTestId(getTabTestId(securityTab))); @@ -84,31 +70,13 @@ describe("<TabbedView />", () => { it("keeps same tab active when order of tabs changes", () => { // start with middle tab active - const { container, rerender } = render(getComponent({ initialTabId: labsTab.id })); + const { container, rerender } = render(getComponent({ activeTabId: labsTab.id })); expect(getActiveTab(container)?.textContent).toEqual(_t(labsTab.label)); - rerender(getComponent({ tabs: [labsTab, generalTab, securityTab] })); + rerender(getComponent({ tabs: [labsTab, generalTab, securityTab], activeTabId: labsTab.id })); // labs tab still active expect(getActiveTab(container)?.textContent).toEqual(_t(labsTab.label)); }); - - it("does not reactivate inititalTabId on rerender", () => { - const { container, getByTestId, rerender } = render(getComponent()); - - expect(getActiveTab(container)?.textContent).toEqual(_t(generalTab.label)); - - // make security tab active - act(() => { - fireEvent.click(getByTestId(getTabTestId(securityTab))); - }); - expect(getActiveTab(container)?.textContent).toEqual(_t(securityTab.label)); - - // rerender with new tab location - rerender(getComponent({ tabLocation: TabLocation.TOP })); - - // still security tab - expect(getActiveTab(container)?.textContent).toEqual(_t(securityTab.label)); - }); }); diff --git a/test/components/structures/ThreadPanel-test.tsx b/test/components/structures/ThreadPanel-test.tsx index 74a1d4023f..4f66379a3d 100644 --- a/test/components/structures/ThreadPanel-test.tsx +++ b/test/components/structures/ThreadPanel-test.tsx @@ -25,7 +25,6 @@ import { FeatureSupport, Thread, } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import ThreadPanel, { ThreadFilterType, ThreadPanelHeader } from "../../../src/components/structures/ThreadPanel"; import MatrixClientContext from "../../../src/contexts/MatrixClientContext"; @@ -51,7 +50,6 @@ describe("ThreadPanel", () => { filterOption={ThreadFilterType.All} setFilterOption={() => undefined} />, - { wrapper: TooltipProvider }, ); expect(asFragment()).toMatchSnapshot(); }); @@ -63,7 +61,6 @@ describe("ThreadPanel", () => { filterOption={ThreadFilterType.My} setFilterOption={() => undefined} />, - { wrapper: TooltipProvider }, ); expect(asFragment()).toMatchSnapshot(); }); @@ -75,7 +72,6 @@ describe("ThreadPanel", () => { filterOption={ThreadFilterType.All} setFilterOption={() => undefined} />, - { wrapper: TooltipProvider }, ); expect(asFragment()).toMatchSnapshot(); }); @@ -87,7 +83,6 @@ describe("ThreadPanel", () => { filterOption={ThreadFilterType.All} setFilterOption={() => undefined} />, - { wrapper: TooltipProvider }, ); const found = container.querySelector(".mx_ThreadPanel_dropdown"); expect(found).toBeTruthy(); @@ -103,7 +98,6 @@ describe("ThreadPanel", () => { filterOption={ThreadFilterType.All} setFilterOption={() => undefined} />, - { wrapper: TooltipProvider }, ); fireEvent.click(container.querySelector(".mx_ThreadPanel_dropdown")!); const found = screen.queryAllByRole("menuitemradio"); @@ -126,13 +120,11 @@ describe("ThreadPanel", () => { const { container } = render( <RoomContext.Provider value={roomContextObject}> <MatrixClientContext.Provider value={mockClient}> - <TooltipProvider> - <ThreadPanelHeader - empty={false} - filterOption={ThreadFilterType.All} - setFilterOption={() => undefined} - /> - </TooltipProvider> + <ThreadPanelHeader + empty={false} + filterOption={ThreadFilterType.All} + setFilterOption={() => undefined} + /> </MatrixClientContext.Provider> </RoomContext.Provider>, ); @@ -146,13 +138,11 @@ describe("ThreadPanel", () => { const mockClient = createTestClient(); const { container } = render( <MatrixClientContext.Provider value={mockClient}> - <TooltipProvider> - <ThreadPanelHeader - empty={false} - filterOption={ThreadFilterType.All} - setFilterOption={() => undefined} - /> - </TooltipProvider> + <ThreadPanelHeader + empty={false} + filterOption={ThreadFilterType.All} + setFilterOption={() => undefined} + /> </MatrixClientContext.Provider>, ); fireEvent.click(getByRole(container, "button", { name: "Mark all as read" })); @@ -308,7 +298,7 @@ describe("ThreadPanel", () => { myThreads!.addLiveEvent(ownThread.rootEvent); let events: EventData[] = []; - const renderResult = render(<TestThreadPanel />, { wrapper: TooltipProvider }); + const renderResult = render(<TestThreadPanel />); await waitFor(() => expect(renderResult.container.querySelector(".mx_AutoHideScrollbar")).toBeFalsy()); await waitFor(() => { events = findEvents(renderResult.container); @@ -354,7 +344,7 @@ describe("ThreadPanel", () => { allThreads!.addLiveEvent(otherThread.rootEvent); let events: EventData[] = []; - const renderResult = render(<TestThreadPanel />, { wrapper: TooltipProvider }); + const renderResult = render(<TestThreadPanel />); await waitFor(() => expect(renderResult.container.querySelector(".mx_AutoHideScrollbar")).toBeFalsy()); await waitFor(() => { events = findEvents(renderResult.container); diff --git a/test/components/structures/ThreadView-test.tsx b/test/components/structures/ThreadView-test.tsx index 83eed5eb9d..d7cbfa1756 100644 --- a/test/components/structures/ThreadView-test.tsx +++ b/test/components/structures/ThreadView-test.tsx @@ -197,7 +197,9 @@ describe("ThreadView", () => { it("sets the correct thread in the room view store", async () => { // expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBeNull(); const { unmount } = await getComponent(); - expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBe(rootEvent.getId()); + waitFor(() => { + expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBe(rootEvent.getId()); + }); unmount(); await waitFor(() => expect(SdkContextClass.instance.roomViewStore.getThreadId()).toBeNull()); diff --git a/test/components/structures/TimelinePanel-test.tsx b/test/components/structures/TimelinePanel-test.tsx index afbe173940..0396ea68a4 100644 --- a/test/components/structures/TimelinePanel-test.tsx +++ b/test/components/structures/TimelinePanel-test.tsx @@ -39,7 +39,6 @@ import { KnownMembership } from "matrix-js-sdk/src/types"; import React, { createRef } from "react"; import { Mocked, mocked } from "jest-mock"; import { forEachRight } from "lodash"; -import { TooltipProvider } from "@vector-im/compound-web"; import TimelinePanel from "../../../src/components/structures/TimelinePanel"; import MatrixClientContext from "../../../src/contexts/MatrixClientContext"; @@ -212,7 +211,6 @@ describe("TimelinePanel", () => { manageReadReceipts={true} ref={ref} />, - { wrapper: TooltipProvider }, ); await flushPromises(); timelinePanel = ref.current!; @@ -392,7 +390,7 @@ describe("TimelinePanel", () => { onEventScrolledIntoView: jest.fn(), }; - const { rerender } = render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + const { rerender } = render(<TimelinePanel {...props} />); expect(props.onEventScrolledIntoView).toHaveBeenCalledWith(undefined); props.eventId = events[1].getId(); rerender(<TimelinePanel {...props} />); @@ -409,9 +407,7 @@ describe("TimelinePanel", () => { setupPagination(client, timeline, eventsPage1, null); await withScrollPanelMountSpy(async (mountSpy) => { - const { container } = render(<TimelinePanel {...getProps(room, events)} timelineSet={timelineSet} />, { - wrapper: TooltipProvider, - }); + const { container } = render(<TimelinePanel {...getProps(room, events)} timelineSet={timelineSet} />, {}); await waitFor(() => expectEvents(container, [events[1]])); @@ -428,7 +424,7 @@ describe("TimelinePanel", () => { const [, room, events] = setupTestData(); await withScrollPanelMountSpy(async (mountSpy) => { - const { container } = render(<TimelinePanel {...getProps(room, events)} />, { wrapper: TooltipProvider }); + const { container } = render(<TimelinePanel {...getProps(room, events)} />); await waitFor(() => expectEvents(container, [events[0], events[1]])); @@ -455,7 +451,7 @@ describe("TimelinePanel", () => { const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear(); - render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + render(<TimelinePanel {...props} />); const event = new MatrixEvent({ type: RoomEvent.Timeline, origin_server_ts: 0 }); const data = { timeline: otherTimeline, liveEvent: true }; @@ -471,7 +467,7 @@ describe("TimelinePanel", () => { const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear(); - render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + render(<TimelinePanel {...props} />); const event = new MatrixEvent({ type: RoomEvent.Timeline, origin_server_ts: 0 }); const data = { timeline: props.timelineSet.getLiveTimeline(), liveEvent: false }; @@ -487,7 +483,7 @@ describe("TimelinePanel", () => { const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear(); - render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + render(<TimelinePanel {...props} />); const event = new MatrixEvent({ type: RoomEvent.Timeline, origin_server_ts: 0 }); const data = { timeline: props.timelineSet.getLiveTimeline(), liveEvent: false }; @@ -504,7 +500,7 @@ describe("TimelinePanel", () => { const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear(); - render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + render(<TimelinePanel {...props} />); const event = new MatrixEvent({ type: RoomEvent.Timeline, origin_server_ts: 0 }); const data = { timeline: props.timelineSet.getLiveTimeline(), liveEvent: true }; @@ -527,7 +523,7 @@ describe("TimelinePanel", () => { const paginateSpy = jest.spyOn(TimelineWindow.prototype, "paginate").mockClear(); - render(<TimelinePanel {...props} />, { wrapper: TooltipProvider }); + render(<TimelinePanel {...props} />); await flushPromises(); @@ -568,7 +564,6 @@ describe("TimelinePanel", () => { overlayTimelineSet={overlayTimelineSet} overlayTimelineSetFilter={isCallEvent} />, - { wrapper: TooltipProvider }, ); await waitFor(() => expectEvents(container, [ @@ -608,7 +603,6 @@ describe("TimelinePanel", () => { const { container } = render( <TimelinePanel {...getProps(room, events)} overlayTimelineSet={overlayTimelineSet} />, - { wrapper: TooltipProvider }, ); await waitFor(() => @@ -640,7 +634,6 @@ describe("TimelinePanel", () => { const { container } = render( <TimelinePanel {...getProps(room, events)} overlayTimelineSet={overlayTimelineSet} />, - { wrapper: TooltipProvider }, ); await waitFor(() => @@ -672,7 +665,6 @@ describe("TimelinePanel", () => { const { container } = render( <TimelinePanel {...getProps(room, events)} overlayTimelineSet={overlayTimelineSet} />, - { wrapper: TooltipProvider }, ); await waitFor(() => @@ -707,7 +699,6 @@ describe("TimelinePanel", () => { timelineSet={timelineSet} overlayTimelineSet={overlayTimelineSet} />, - { wrapper: TooltipProvider }, ); await waitFor(() => expectEvents(container, [overlayEvents[0], events[0]])); @@ -781,7 +772,6 @@ describe("TimelinePanel", () => { await withScrollPanelMountSpy(async (mountSpy) => { const { container } = render( <TimelinePanel {...getProps(room, events)} overlayTimelineSet={overlayTimelineSet} />, - { wrapper: TooltipProvider }, ); await waitFor(() => @@ -894,7 +884,6 @@ describe("TimelinePanel", () => { <MatrixClientContext.Provider value={client}> <TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad /> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ); await dom.findByText("RootEvent"); await dom.findByText("ReplyEvent1"); @@ -948,7 +937,6 @@ describe("TimelinePanel", () => { <MatrixClientContext.Provider value={client}> <TimelinePanel timelineSet={allThreads} manageReadReceipts sendReadReceiptOnLoad /> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ); await dom.findByText("RootEvent"); await dom.findByText("ReplyEvent1"); @@ -1017,7 +1005,6 @@ describe("TimelinePanel", () => { <MatrixClientContext.Provider value={client}> <TimelinePanel timelineSet={timelineSet} manageReadReceipts={true} sendReadReceiptOnLoad={true} /> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ); await waitFor(() => expect(screen.queryByRole("progressbar")).toBeNull()); diff --git a/test/components/structures/__snapshots__/RoomView-test.tsx.snap b/test/components/structures/__snapshots__/RoomView-test.tsx.snap index 80d6ac7c74..91bfd33e83 100644 --- a/test/components/structures/__snapshots__/RoomView-test.tsx.snap +++ b/test/components/structures/__snapshots__/RoomView-test.tsx.snap @@ -47,11 +47,7 @@ exports[`RoomView for a local room in state CREATING should match the snapshot 1 class="mx_LegacyRoomHeader_topic mx_RoomTopic" dir="auto" tabindex="0" - > - <span - dir="auto" - /> - </div> + /> </div> </header> <div @@ -129,11 +125,7 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`] class="mx_LegacyRoomHeader_topic mx_RoomTopic" dir="auto" tabindex="0" - > - <span - dir="auto" - /> - </div> + /> </div> </header> <main @@ -296,11 +288,7 @@ exports[`RoomView for a local room in state NEW should match the snapshot 1`] = class="mx_LegacyRoomHeader_topic mx_RoomTopic" dir="auto" tabindex="0" - > - <span - dir="auto" - /> - </div> + /> </div> </header> <main @@ -523,7 +511,6 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t </div> </div> <span - data-state="closed" tabindex="0" > <div @@ -548,11 +535,7 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t class="mx_LegacyRoomHeader_topic mx_RoomTopic" dir="auto" tabindex="0" - > - <span - dir="auto" - /> - </div> + /> </div> </header> <main diff --git a/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap b/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap index f328c1fa0b..1156d0c563 100644 --- a/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap +++ b/test/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap @@ -32,6 +32,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` > <div aria-disabled="true" + aria-label="Remove" class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_danger_outline mx_AccessibleButton_disabled" disabled="" role="button" @@ -41,6 +42,7 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` </div> <div aria-disabled="true" + aria-label="Mark as not suggested" class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline mx_AccessibleButton_disabled" disabled="" role="button" @@ -391,8 +393,6 @@ exports[`SpaceHierarchy <SpaceHierarchy /> renders 1`] = ` Join </div> <span - class="" - data-state="closed" tabindex="0" > <span diff --git a/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap b/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap index 3a7e57cce2..45dd72ddf7 100644 --- a/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap +++ b/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap @@ -13,7 +13,6 @@ exports[`ThreadPanel Header expect that All filter for ThreadPanelHeader properl <button aria-label="Mark all as read" class="_icon-button_16nk7_17" - data-state="closed" role="button" style="--cpd-icon-button-size: 24px;" tabindex="0" @@ -54,7 +53,6 @@ exports[`ThreadPanel Header expect that My filter for ThreadPanelHeader properly <button aria-label="Mark all as read" class="_icon-button_16nk7_17" - data-state="closed" role="button" style="--cpd-icon-button-size: 24px;" tabindex="0" diff --git a/test/components/structures/__snapshots__/UserMenu-test.tsx.snap b/test/components/structures/__snapshots__/UserMenu-test.tsx.snap index a43b718020..029db9bfd4 100644 --- a/test/components/structures/__snapshots__/UserMenu-test.tsx.snap +++ b/test/components/structures/__snapshots__/UserMenu-test.tsx.snap @@ -12,7 +12,6 @@ exports[`<UserMenu> <UserMenu> when video broadcast when rendered should render class="mx_AccessibleButton mx_UserMenu_contextMenuButton" role="button" tabindex="0" - title="User menu" > <div class="mx_UserMenu_userAvatar" diff --git a/test/components/structures/auth/ForgotPassword-test.tsx b/test/components/structures/auth/ForgotPassword-test.tsx index 0dbb495523..6977fe9ec4 100644 --- a/test/components/structures/auth/ForgotPassword-test.tsx +++ b/test/components/structures/auth/ForgotPassword-test.tsx @@ -19,7 +19,6 @@ import { mocked } from "jest-mock"; import { act, render, RenderResult, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { MatrixClient, createClient } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import ForgotPassword from "../../../../src/components/structures/auth/ForgotPassword"; import { ValidatedServerConfig } from "../../../../src/utils/ValidatedServerConfig"; @@ -103,7 +102,6 @@ describe("<ForgotPassword>", () => { beforeEach(() => { renderResult = render( <ForgotPassword serverConfig={serverConfig} onComplete={onComplete} onLoginClick={onLoginClick} />, - { wrapper: TooltipProvider }, ); }); diff --git a/test/components/views/avatars/DecoratedRoomAvatar-test.tsx b/test/components/views/avatars/DecoratedRoomAvatar-test.tsx index bf62355ce4..d9a7b9b16e 100644 --- a/test/components/views/avatars/DecoratedRoomAvatar-test.tsx +++ b/test/components/views/avatars/DecoratedRoomAvatar-test.tsx @@ -19,7 +19,6 @@ import { mocked } from "jest-mock"; import { JoinRule, MatrixClient, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; import React from "react"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; import { stubClient } from "../../../test-utils"; @@ -39,9 +38,7 @@ describe("DecoratedRoomAvatar", () => { let room: Room; function renderComponent() { - return render(<DecoratedRoomAvatar room={room} size="32px" />, { - wrapper: TooltipProvider, - }); + return render(<DecoratedRoomAvatar room={room} size="32px" />); } beforeEach(() => { diff --git a/test/components/views/avatars/__snapshots__/DecoratedRoomAvatar-test.tsx.snap b/test/components/views/avatars/__snapshots__/DecoratedRoomAvatar-test.tsx.snap index c5323de9f6..b060312070 100644 --- a/test/components/views/avatars/__snapshots__/DecoratedRoomAvatar-test.tsx.snap +++ b/test/components/views/avatars/__snapshots__/DecoratedRoomAvatar-test.tsx.snap @@ -16,9 +16,8 @@ exports[`DecoratedRoomAvatar shows an avatar with globe icon and tooltip for pub r </span> <div - aria-describedby="radix-0" + aria-describedby="floating-ui-2" class="mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_globe" - data-state="delayed-open" tabindex="0" /> </div> @@ -41,9 +40,8 @@ exports[`DecoratedRoomAvatar shows the presence indicator in a DM room that also r </span> <div - aria-describedby="radix-1" + aria-describedby="floating-ui-8" class="mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_online" - data-state="delayed-open" tabindex="0" /> </div> diff --git a/test/components/views/beacon/BeaconListItem-test.tsx b/test/components/views/beacon/BeaconListItem-test.tsx index 6050e2b6cd..10497b369f 100644 --- a/test/components/views/beacon/BeaconListItem-test.tsx +++ b/test/components/views/beacon/BeaconListItem-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { act, fireEvent, render } from "@testing-library/react"; import { Beacon, RoomMember, MatrixEvent, LocationAssetType } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import BeaconListItem from "../../../../src/components/views/beacon/BeaconListItem"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; @@ -76,7 +75,6 @@ describe("<BeaconListItem />", () => { <MatrixClientContext.Provider value={mockClient}> <BeaconListItem {...defaultProps} {...props} /> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ); const setupRoomWithBeacons = (beaconInfoEvents: MatrixEvent[], locationEvents?: MatrixEvent[]): Beacon[] => { diff --git a/test/components/views/beacon/BeaconMarker-test.tsx b/test/components/views/beacon/BeaconMarker-test.tsx index 15b1335d90..4a5b5b8711 100644 --- a/test/components/views/beacon/BeaconMarker-test.tsx +++ b/test/components/views/beacon/BeaconMarker-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { act, render, screen } from "@testing-library/react"; +import { act, render, screen, waitFor } from "@testing-library/react"; import * as maplibregl from "maplibre-gl"; import { Beacon, Room, RoomMember, MatrixEvent, getBeaconInfoIdentifier } from "matrix-js-sdk/src/matrix"; @@ -111,13 +111,15 @@ describe("<BeaconMarker />", () => { expect(screen.queryByTestId("avatar-img")).not.toBeInTheDocument(); }); - it("renders marker when beacon has location", () => { + it("renders marker when beacon has location", async () => { const room = setupRoom([defaultEvent]); const beacon = room.currentState.beacons.get(getBeaconInfoIdentifier(defaultEvent)); beacon?.addLocations([location1]); const { asFragment } = renderComponent({ beacon }); + await waitFor(() => { + expect(screen.getByTestId("avatar-img")).toBeInTheDocument(); + }); expect(asFragment()).toMatchSnapshot(); - expect(screen.getByTestId("avatar-img")).toBeInTheDocument(); }); it("updates with new locations", () => { diff --git a/test/components/views/beacon/BeaconViewDialog-test.tsx b/test/components/views/beacon/BeaconViewDialog-test.tsx index b796253e2a..8347fca18b 100644 --- a/test/components/views/beacon/BeaconViewDialog-test.tsx +++ b/test/components/views/beacon/BeaconViewDialog-test.tsx @@ -15,11 +15,10 @@ limitations under the License. */ import React from "react"; -import { act, fireEvent, render, RenderResult } from "@testing-library/react"; +import { act, fireEvent, render, RenderResult, waitFor } from "@testing-library/react"; import { MatrixClient, MatrixEvent, Room, RoomMember, getBeaconInfoIdentifier } from "matrix-js-sdk/src/matrix"; import * as maplibregl from "maplibre-gl"; import { mocked } from "jest-mock"; -import { TooltipProvider } from "@vector-im/compound-web"; import BeaconViewDialog from "../../../../src/components/views/beacon/BeaconViewDialog"; import { @@ -80,8 +79,7 @@ describe("<BeaconViewDialog />", () => { matrixClient: mockClient as MatrixClient, }; - const getComponent = (props = {}): RenderResult => - render(<BeaconViewDialog {...defaultProps} {...props} />, { wrapper: TooltipProvider }); + const getComponent = (props = {}): RenderResult => render(<BeaconViewDialog {...defaultProps} {...props} />); const openSidebar = (getByTestId: RenderResult["getByTestId"]) => { fireEvent.click(getByTestId("beacon-view-dialog-open-sidebar")); @@ -94,7 +92,7 @@ describe("<BeaconViewDialog />", () => { jest.clearAllMocks(); }); - it("renders a map with markers", () => { + it("renders a map with markers", async () => { const room = setupRoom([defaultEvent]); const beacon = room.currentState.beacons.get(getBeaconInfoIdentifier(defaultEvent))!; beacon.addLocations([location1]); @@ -105,7 +103,9 @@ describe("<BeaconViewDialog />", () => { lat: 51, }); // marker added - expect(mockMarker.addTo).toHaveBeenCalledWith(mockMap); + await waitFor(() => { + expect(mockMarker.addTo).toHaveBeenCalledWith(mockMap); + }); }); it("does not render any own beacon status when user is not live sharing", () => { diff --git a/test/components/views/beacon/DialogSidebar-test.tsx b/test/components/views/beacon/DialogSidebar-test.tsx index 0c14d334df..3f1e9194eb 100644 --- a/test/components/views/beacon/DialogSidebar-test.tsx +++ b/test/components/views/beacon/DialogSidebar-test.tsx @@ -16,7 +16,6 @@ limitations under the License. import React, { ComponentProps } from "react"; import { act, fireEvent, render } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import DialogSidebar from "../../../../src/components/views/beacon/DialogSidebar"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; @@ -53,9 +52,7 @@ describe("<DialogSidebar />", () => { const getComponent = (props = {}) => ( <MatrixClientContext.Provider value={client}> - <TooltipProvider> - <DialogSidebar {...defaultProps} {...props} /> - </TooltipProvider> + <DialogSidebar {...defaultProps} {...props} /> </MatrixClientContext.Provider> ); diff --git a/test/components/views/beacon/ShareLatestLocation-test.tsx b/test/components/views/beacon/ShareLatestLocation-test.tsx index 279e21671f..654b3dc73a 100644 --- a/test/components/views/beacon/ShareLatestLocation-test.tsx +++ b/test/components/views/beacon/ShareLatestLocation-test.tsx @@ -16,7 +16,6 @@ limitations under the License. import React from "react"; import { fireEvent, render } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import ShareLatestLocation from "../../../../src/components/views/beacon/ShareLatestLocation"; import { copyPlaintext } from "../../../../src/utils/strings"; @@ -33,8 +32,7 @@ describe("<ShareLatestLocation />", () => { timestamp: 123, }, }; - const getComponent = (props = {}) => - render(<ShareLatestLocation {...defaultProps} {...props} />, { wrapper: TooltipProvider }); + const getComponent = (props = {}) => render(<ShareLatestLocation {...defaultProps} {...props} />); beforeEach(() => { jest.clearAllMocks(); diff --git a/test/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap b/test/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap index 1d7a958672..b80d05c1ae 100644 --- a/test/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap +++ b/test/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap @@ -32,7 +32,6 @@ exports[`<BeaconListItem /> when a beacon is live and has locations renders beac class="mx_BeaconListItem_interactions" > <a - data-state="closed" data-testid="open-location-in-osm" href="https://www.openstreetmap.org/?mlat=51&mlon=41#map=16/51/41" rel="noreferrer noopener" diff --git a/test/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap b/test/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap index 869e17d5e6..bd6f9656ff 100644 --- a/test/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap +++ b/test/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap @@ -14,11 +14,11 @@ exports[`<DialogSidebar /> renders sidebar correctly with beacons 1`] = ` View list </h4> <div + aria-label="Close sidebar" class="mx_AccessibleButton mx_DialogSidebar_closeButton" data-testid="dialog-sidebar-close" role="button" tabindex="0" - title="Close sidebar" > <div class="mx_DialogSidebar_closeButtonIcon" @@ -65,7 +65,6 @@ exports[`<DialogSidebar /> renders sidebar correctly with beacons 1`] = ` class="mx_BeaconListItem_interactions" > <a - data-state="closed" data-testid="open-location-in-osm" href="https://www.openstreetmap.org/?mlat=51&mlon=41#map=16/51/41" rel="noreferrer noopener" @@ -113,11 +112,11 @@ exports[`<DialogSidebar /> renders sidebar correctly without beacons 1`] = ` View list </h4> <div + aria-label="Close sidebar" class="mx_AccessibleButton mx_DialogSidebar_closeButton" data-testid="dialog-sidebar-close" role="button" tabindex="0" - title="Close sidebar" > <div class="mx_DialogSidebar_closeButtonIcon" diff --git a/test/components/views/beacon/__snapshots__/LeftPanelLiveShareWarning-test.tsx.snap b/test/components/views/beacon/__snapshots__/LeftPanelLiveShareWarning-test.tsx.snap index b481b1f8fd..f052aaf61b 100644 --- a/test/components/views/beacon/__snapshots__/LeftPanelLiveShareWarning-test.tsx.snap +++ b/test/components/views/beacon/__snapshots__/LeftPanelLiveShareWarning-test.tsx.snap @@ -3,10 +3,10 @@ exports[`<LeftPanelLiveShareWarning /> when user has live location monitor renders correctly when minimized 1`] = ` <DocumentFragment> <div + aria-label="You are sharing your live location" class="mx_AccessibleButton mx_LeftPanelLiveShareWarning mx_LeftPanelLiveShareWarning__minimized" role="button" tabindex="0" - title="You are sharing your live location" > <div height="10" diff --git a/test/components/views/beacon/__snapshots__/RoomLiveShareWarning-test.tsx.snap b/test/components/views/beacon/__snapshots__/RoomLiveShareWarning-test.tsx.snap index 348f951b81..99e25ac3f5 100644 --- a/test/components/views/beacon/__snapshots__/RoomLiveShareWarning-test.tsx.snap +++ b/test/components/views/beacon/__snapshots__/RoomLiveShareWarning-test.tsx.snap @@ -109,11 +109,11 @@ exports[`<RoomLiveShareWarning /> when user has live beacons and geolocation is Retry </button> <button + aria-label="Stop and close" class="mx_AccessibleButton mx_RoomLiveShareWarning_closeButton" data-testid="room-live-share-wire-error-close-button" role="button" tabindex="0" - title="Stop and close" > <div class="mx_RoomLiveShareWarning_closeButtonIcon" diff --git a/test/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap b/test/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap index 068e4b8ca9..3455bee930 100644 --- a/test/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap +++ b/test/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap @@ -3,7 +3,6 @@ exports[`<ShareLatestLocation /> renders share buttons when there is a location 1`] = ` <DocumentFragment> <a - data-state="closed" data-testid="open-location-in-osm" href="https://www.openstreetmap.org/?mlat=51&mlon=42#map=16/51/42" rel="noreferrer noopener" diff --git a/test/components/views/dialogs/ForwardDialog-test.tsx b/test/components/views/dialogs/ForwardDialog-test.tsx index 6206087ab8..12c6048e61 100644 --- a/test/components/views/dialogs/ForwardDialog-test.tsx +++ b/test/components/views/dialogs/ForwardDialog-test.tsx @@ -130,9 +130,9 @@ describe("ForwardDialog", () => { expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(3); const searchInput = getByTestId(container, "searchbox-input"); - act(() => userEvent.type(searchInput, "a")); + await userEvent.type(searchInput, "a"); - expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(3); + expect(container.querySelectorAll(".mx_ForwardList_entry")).toHaveLength(2); }); it("should be navigable using arrow keys", async () => { diff --git a/test/components/views/dialogs/ServerPickerDialog-test.tsx b/test/components/views/dialogs/ServerPickerDialog-test.tsx index 06fbca9550..0ca923d9cb 100644 --- a/test/components/views/dialogs/ServerPickerDialog-test.tsx +++ b/test/components/views/dialogs/ServerPickerDialog-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { fireEvent, render, screen } from "@testing-library/react"; import fetchMock from "fetch-mock-jest"; -import { TooltipProvider } from "@vector-im/compound-web"; import ServerPickerDialog from "../../../../src/components/views/dialogs/ServerPickerDialog"; import SdkConfig from "../../../../src/SdkConfig"; @@ -56,7 +55,7 @@ describe("<ServerPickerDialog />", () => { onFinished: any; serverConfig: ValidatedServerConfig; }> = {}, - ) => render(<ServerPickerDialog {...defaultProps} {...props} />, { wrapper: TooltipProvider }); + ) => render(<ServerPickerDialog {...defaultProps} {...props} />); beforeEach(() => { SdkConfig.add({ diff --git a/test/components/views/dialogs/ShareDialog-test.tsx b/test/components/views/dialogs/ShareDialog-test.tsx index a78f4cf62f..06d6c30de4 100644 --- a/test/components/views/dialogs/ShareDialog-test.tsx +++ b/test/components/views/dialogs/ShareDialog-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { EventTimeline, MatrixEvent, Room, RoomMember } from "matrix-js-sdk/src/matrix"; import { render, RenderOptions } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; import SettingsStore from "../../../../src/settings/SettingsStore"; @@ -31,11 +30,7 @@ jest.mock("../../../../src/utils/ShieldUtils"); function getWrapper(): RenderOptions { return { wrapper: ({ children }) => ( - <TooltipProvider> - <MatrixClientContext.Provider value={MatrixClientPeg.safeGet()}> - {children} - </MatrixClientContext.Provider> - </TooltipProvider> + <MatrixClientContext.Provider value={MatrixClientPeg.safeGet()}>{children}</MatrixClientContext.Provider> ), }; } diff --git a/test/components/views/dialogs/UserSettingsDialog-test.tsx b/test/components/views/dialogs/UserSettingsDialog-test.tsx index a2cd034ba3..72232d5e1b 100644 --- a/test/components/views/dialogs/UserSettingsDialog-test.tsx +++ b/test/components/views/dialogs/UserSettingsDialog-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { ReactElement } from "react"; -import { render } from "@testing-library/react"; +import { render, screen } from "@testing-library/react"; import { mocked, MockedObject } from "jest-mock"; import { MatrixClient } from "matrix-js-sdk/src/matrix"; @@ -29,6 +29,8 @@ import { mockClientMethodsServer, mockPlatformPeg, mockClientMethodsCrypto, + mockClientMethodsRooms, + useMockMediaDevices, } from "../../../test-utils"; import { UIFeature } from "../../../../src/settings/UIFeature"; import { SettingLevel } from "../../../../src/settings/SettingLevel"; @@ -48,6 +50,10 @@ jest.mock("../../../../src/settings/SettingsStore", () => ({ unwatchSetting: jest.fn(), getFeatureSettingNames: jest.fn(), getBetaInfo: jest.fn(), + getDisplayName: jest.fn(), + getDescription: jest.fn(), + shouldHaveWarning: jest.fn(), + disabledMessage: jest.fn(), })); jest.mock("../../../../src/SdkConfig", () => ({ @@ -72,31 +78,32 @@ describe("<UserSettingsDialog />", () => { ...mockClientMethodsUser(userId), ...mockClientMethodsServer(), ...mockClientMethodsCrypto(), + ...mockClientMethodsRooms(), + getIgnoredUsers: jest.fn().mockResolvedValue([]), + getPushers: jest.fn().mockResolvedValue([]), + getProfileInfo: jest.fn().mockResolvedValue({}), }); sdkContext = new SdkContextClass(); sdkContext.client = mockClient; mockSettingsStore.getValue.mockReturnValue(false); + mockSettingsStore.getValueAt.mockReturnValue(false); mockSettingsStore.getFeatureSettingNames.mockReturnValue([]); mockSdkConfig.get.mockReturnValue({ brand: "Test" }); }); const getActiveTabLabel = (container: Element) => container.querySelector(".mx_TabbedView_tabLabel_active")?.textContent; - const getActiveTabHeading = (container: Element) => - container.querySelector(".mx_SettingsSection .mx_Heading_h3")?.textContent; it("should render general settings tab when no initialTabId", () => { const { container } = render(getComponent()); expect(getActiveTabLabel(container)).toEqual("General"); - expect(getActiveTabHeading(container)).toEqual("General"); }); it("should render initial tab when initialTabId is set", () => { const { container } = render(getComponent({ initialTabId: UserTab.Help })); expect(getActiveTabLabel(container)).toEqual("Help & About"); - expect(getActiveTabHeading(container)).toEqual("Help & About"); }); it("should render general tab if initialTabId tab cannot be rendered", () => { @@ -104,7 +111,6 @@ describe("<UserSettingsDialog />", () => { const { container } = render(getComponent({ initialTabId: UserTab.Mjolnir })); expect(getActiveTabLabel(container)).toEqual("General"); - expect(getActiveTabHeading(container)).toEqual("General"); }); it("renders tabs correctly", () => { @@ -124,9 +130,95 @@ describe("<UserSettingsDialog />", () => { expect(getByTestId(`settings-tab-${UserTab.Voice}`)).toBeTruthy(); }); - it("renders session manager tab", () => { - const { getByTestId } = render(getComponent()); + it("renders with session manager tab selected", () => { + const { getByTestId } = render(getComponent({ initialTabId: UserTab.SessionManager })); expect(getByTestId(`settings-tab-${UserTab.SessionManager}`)).toBeTruthy(); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Sessions"); + }); + + it("renders with appearance tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Appearance })); + + expect(getActiveTabLabel(container)).toEqual("Appearance"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Appearance"); + }); + + it("renders with notifications tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Notifications })); + + expect(getActiveTabLabel(container)).toEqual("Notifications"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Notifications"); + }); + + it("renders with preferences tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Preferences })); + + expect(getActiveTabLabel(container)).toEqual("Preferences"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Preferences"); + }); + + it("renders with keyboard tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Keyboard })); + + expect(getActiveTabLabel(container)).toEqual("Keyboard"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Keyboard"); + }); + + it("renders with sidebar tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Sidebar })); + + expect(getActiveTabLabel(container)).toEqual("Sidebar"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Sidebar"); + }); + + it("renders with voip tab selected", () => { + useMockMediaDevices(); + mockSettingsStore.getValue.mockImplementation((settingName): any => settingName === UIFeature.Voip); + const { container } = render(getComponent({ initialTabId: UserTab.Voice })); + + expect(getActiveTabLabel(container)).toEqual("Voice & Video"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Voice & Video"); + }); + + it("renders with secutity tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Security })); + + expect(getActiveTabLabel(container)).toEqual("Security & Privacy"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Security & Privacy"); + }); + + it("renders with labs tab selected", () => { + // @ts-ignore I give up trying to get the types right here + // why do we have functions that return different things depending on what they're passed? + mockSdkConfig.get.mockImplementation((x) => { + const mockConfig = { show_labs_settings: true, brand: "Test" }; + switch (x) { + case "show_labs_settings": + case "brand": + // @ts-ignore + return mockConfig[x]; + default: + return mockConfig; + } + }); + const { container } = render(getComponent({ initialTabId: UserTab.Labs })); + + expect(getActiveTabLabel(container)).toEqual("Labs"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Labs"); + }); + + it("renders with mjolnir tab selected", () => { + mockSettingsStore.getValue.mockImplementation((settingName): any => settingName === "feature_mjolnir"); + const { container } = render(getComponent({ initialTabId: UserTab.Mjolnir })); + expect(getActiveTabLabel(container)).toEqual("Ignored users"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Ignored Users"); + }); + + it("renders with help tab selected", () => { + const { container } = render(getComponent({ initialTabId: UserTab.Help })); + + expect(getActiveTabLabel(container)).toEqual("Help & About"); + expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Settings: Help & About"); }); it("renders labs tab when show_labs_settings is enabled in config", () => { @@ -152,14 +244,17 @@ describe("<UserSettingsDialog />", () => { watchSettingCallbacks[settingName] = callback; return `mock-watcher-id-${settingName}`; }); + mockSettingsStore.getValue.mockReturnValue(false); const { queryByTestId, unmount } = render(getComponent()); expect(queryByTestId(`settings-tab-${UserTab.Mjolnir}`)).toBeFalsy(); - expect(mockSettingsStore.watchSetting.mock.calls[0][0]).toEqual("feature_mjolnir"); + expect(mockSettingsStore.watchSetting).toHaveBeenCalledWith("feature_mjolnir", null, expect.anything()); // call the watch setting callback + mockSettingsStore.getValue.mockReturnValue(true); watchSettingCallbacks["feature_mjolnir"]("feature_mjolnir", "", SettingLevel.ACCOUNT, true, true); + // tab is rendered now expect(queryByTestId(`settings-tab-${UserTab.Mjolnir}`)).toBeTruthy(); diff --git a/test/components/views/dialogs/__snapshots__/ServerPickerDialog-test.tsx.snap b/test/components/views/dialogs/__snapshots__/ServerPickerDialog-test.tsx.snap index 6a0b26a890..cb7069c437 100644 --- a/test/components/views/dialogs/__snapshots__/ServerPickerDialog-test.tsx.snap +++ b/test/components/views/dialogs/__snapshots__/ServerPickerDialog-test.tsx.snap @@ -57,7 +57,6 @@ exports[`<ServerPickerDialog /> should render dialog 1`] = ` > <span class="mx_Login_underlinedServerName" - data-state="closed" tabindex="0" > matrix.org diff --git a/test/components/views/elements/AppTile-test.tsx b/test/components/views/elements/AppTile-test.tsx index f15f0ce560..69a3b60036 100644 --- a/test/components/views/elements/AppTile-test.tsx +++ b/test/components/views/elements/AppTile-test.tsx @@ -377,12 +377,12 @@ describe("AppTile", () => { }); it("clicking 'minimise' should send the widget to the right", async () => { - await userEvent.click(renderResult.getByTitle("Minimise")); + await userEvent.click(renderResult.getByLabelText("Minimise")); expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Right); }); it("clicking 'maximise' should send the widget to the center", async () => { - await userEvent.click(renderResult.getByTitle("Maximise")); + await userEvent.click(renderResult.getByLabelText("Maximise")); expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Center); }); @@ -435,7 +435,7 @@ describe("AppTile", () => { }); it("clicking 'un-maximise' should send the widget to the top", async () => { - await userEvent.click(renderResult.getByTitle("Un-maximise")); + await userEvent.click(renderResult.getByLabelText("Un-maximise")); expect(moveToContainerSpy).toHaveBeenCalledWith(r1, app1, Container.Top); }); }); @@ -461,7 +461,7 @@ describe("AppTile", () => { }); it("should display the »Popout widget« button", () => { - expect(renderResult.getByTitle("Popout widget")).toBeInTheDocument(); + expect(renderResult.getByLabelText("Popout widget")).toBeInTheDocument(); }); }); }); diff --git a/test/components/views/elements/DesktopCapturerSourcePicker-test.tsx b/test/components/views/elements/DesktopCapturerSourcePicker-test.tsx new file mode 100644 index 0000000000..aafa356a3d --- /dev/null +++ b/test/components/views/elements/DesktopCapturerSourcePicker-test.tsx @@ -0,0 +1,100 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; + +import DesktopCapturerSourcePicker from "../../../../src/components/views/elements/DesktopCapturerSourcePicker"; +import PlatformPeg from "../../../../src/PlatformPeg"; +import BasePlatform from "../../../../src/BasePlatform"; + +const SOURCES = [ + { + id: "screen1", + name: "Screen 1", + thumbnailURL: "data:image/png;base64,", + }, + { + id: "window1", + name: "Window 1", + thumbnailURL: "data:image/png;base64,", + }, +]; + +describe("DesktopCapturerSourcePicker", () => { + beforeEach(() => { + const plaf = { + getDesktopCapturerSources: jest.fn().mockResolvedValue(SOURCES), + supportsSetting: jest.fn().mockReturnValue(false), + }; + jest.spyOn(PlatformPeg, "get").mockReturnValue(plaf as unknown as BasePlatform); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it("should render the component", () => { + render(<DesktopCapturerSourcePicker onFinished={() => {}} />); + expect(screen.getByRole("button", { name: "Cancel" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Share" })).toBeInTheDocument(); + }); + + it("should disable share button until a source is selected", () => { + render(<DesktopCapturerSourcePicker onFinished={() => {}} />); + expect(screen.getByRole("button", { name: "Share" })).toBeDisabled(); + }); + + it("should contain a screen source in the default tab", async () => { + render(<DesktopCapturerSourcePicker onFinished={() => {}} />); + + const screen1Button = await screen.findByRole("button", { name: "Screen 1" }); + + expect(screen1Button).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Window 1" })).not.toBeInTheDocument(); + }); + + it("should contain a window source in the window tab", async () => { + render(<DesktopCapturerSourcePicker onFinished={() => {}} />); + + await userEvent.click(screen.getByRole("tab", { name: "Application window" })); + + const window1Button = await screen.findByRole("button", { name: "Window 1" }); + + expect(window1Button).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Screen 1" })).not.toBeInTheDocument(); + }); + + it("should call onFinished with no arguments if cancelled", async () => { + const onFinished = jest.fn(); + render(<DesktopCapturerSourcePicker onFinished={onFinished} />); + + await userEvent.click(screen.getByRole("button", { name: "Cancel" })); + expect(onFinished).toHaveBeenCalledWith(); + }); + + it("should call onFinished with the selected source when share clicked", async () => { + const onFinished = jest.fn(); + render(<DesktopCapturerSourcePicker onFinished={onFinished} />); + + const screen1Button = await screen.findByRole("button", { name: "Screen 1" }); + + await userEvent.click(screen1Button); + await userEvent.click(screen.getByRole("button", { name: "Share" })); + expect(onFinished).toHaveBeenCalledWith(SOURCES[0]); + }); +}); diff --git a/test/components/views/elements/FacePile-test.tsx b/test/components/views/elements/FacePile-test.tsx index 313a0299be..8026c47407 100644 --- a/test/components/views/elements/FacePile-test.tsx +++ b/test/components/views/elements/FacePile-test.tsx @@ -14,7 +14,6 @@ limitations under the License. import { render } from "@testing-library/react"; import React from "react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { KnownMembership } from "matrix-js-sdk/src/types"; import FacePile from "../../../../src/components/views/elements/FacePile"; @@ -26,7 +25,6 @@ describe("<FacePile />", () => { const { asFragment } = render( <FacePile members={[member]} size="36px" overflow={false} tooltipLabel="tooltip" />, - { wrapper: TooltipProvider }, ); expect(asFragment()).toMatchSnapshot(); diff --git a/test/components/views/elements/ImageView-test.tsx b/test/components/views/elements/ImageView-test.tsx new file mode 100644 index 0000000000..f0475df964 --- /dev/null +++ b/test/components/views/elements/ImageView-test.tsx @@ -0,0 +1,29 @@ +/* + * + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * / + */ + +import React from "react"; +import { render } from "@testing-library/react"; + +import ImageView from "../../../../src/components/views/elements/ImageView"; + +describe("<ImageView />", () => { + it("renders correctly", () => { + const { container } = render(<ImageView src="https://example.com/image.png" onFinished={jest.fn()} />); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/test/components/views/elements/InfoTooltip-test.tsx b/test/components/views/elements/InfoTooltip-test.tsx index 226497cea8..049fa87847 100644 --- a/test/components/views/elements/InfoTooltip-test.tsx +++ b/test/components/views/elements/InfoTooltip-test.tsx @@ -17,15 +17,12 @@ limitations under the License. import React from "react"; import userEvent from "@testing-library/user-event"; import { render, waitFor } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import InfoTooltip from "../../../../src/components/views/elements/InfoTooltip"; describe("InfoTooltip", () => { it("should show tooltip on hover", async () => { - const { getByText, asFragment } = render(<InfoTooltip tooltip="Tooltip text">Trigger text</InfoTooltip>, { - wrapper: TooltipProvider, - }); + const { getByText, asFragment } = render(<InfoTooltip tooltip="Tooltip text">Trigger text</InfoTooltip>); const trigger = getByText("Trigger text"); expect(trigger).toBeVisible(); diff --git a/test/components/views/elements/Pill-test.tsx b/test/components/views/elements/Pill-test.tsx index ea1a8b34eb..cdde49cc56 100644 --- a/test/components/views/elements/Pill-test.tsx +++ b/test/components/views/elements/Pill-test.tsx @@ -19,7 +19,6 @@ import { act, render, RenderResult, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { mocked, Mocked } from "jest-mock"; import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import dis from "../../../../src/dispatcher/dispatcher"; import { Pill, PillProps, PillType } from "../../../../src/components/views/elements/Pill"; @@ -65,7 +64,6 @@ describe("<Pill>", () => { <div onClick={pillParentClickHandler}> <Pill {...withDefault} /> </div>, - { wrapper: TooltipProvider }, ); }; diff --git a/test/components/views/elements/RoomFacePile-test.tsx b/test/components/views/elements/RoomFacePile-test.tsx index 29af381897..8846187417 100644 --- a/test/components/views/elements/RoomFacePile-test.tsx +++ b/test/components/views/elements/RoomFacePile-test.tsx @@ -14,7 +14,6 @@ limitations under the License. import { render } from "@testing-library/react"; import React from "react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { mkRoom, mkRoomMember, stubClient, withClientContextRenderOptions } from "../../../test-utils"; @@ -33,9 +32,7 @@ describe("<RoomFacePile />", () => { ]); const { asFragment } = render( - <TooltipProvider> - <RoomFacePile onlyKnownUsers={false} room={room} /> - </TooltipProvider>, + <RoomFacePile onlyKnownUsers={false} room={room} />, withClientContextRenderOptions(MatrixClientPeg.get()!), ); diff --git a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap index 92b89013e1..4b84fa46c6 100644 --- a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap @@ -13,11 +13,11 @@ exports[`AppTile destroys non-persisted right panel widget on room change 1`] = class="mx_BaseCard_header" > <div + aria-label="Close" class="mx_AccessibleButton mx_BaseCard_close" data-testid="base-card-close-button" role="button" tabindex="0" - title="Close" /> <div class="mx_BaseCard_headerProp" @@ -37,7 +37,6 @@ exports[`AppTile destroys non-persisted right panel widget on room change 1`] = class="mx_AccessibleButton mx_BaseCard_header_title_button--option" role="button" tabindex="0" - title="Options" /> </div> </div> @@ -126,9 +125,9 @@ exports[`AppTile for a pinned widget should render 1`] = ` width="20px" /> </span> - <b> + <h3> Example 1 - </b> + </h3> <span /> </span> </span> @@ -136,20 +135,20 @@ exports[`AppTile for a pinned widget should render 1`] = ` class="mx_AppTileMenuBar_widgets" > <div + aria-label="Un-maximise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Un-maximise" > <div class="mx_Icon mx_Icon_12" /> </div> <div + aria-label="Minimise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Minimise" > <div class="mx_Icon mx_Icon_12" @@ -162,7 +161,6 @@ exports[`AppTile for a pinned widget should render 1`] = ` class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Options" > <div class="mx_Icon mx_Icon_12" @@ -213,9 +211,9 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` width="20px" /> </span> - <b> + <h3> Example 1 - </b> + </h3> <span /> </span> </span> @@ -223,20 +221,20 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` class="mx_AppTileMenuBar_widgets" > <div + aria-label="Un-maximise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Un-maximise" > <div class="mx_Icon mx_Icon_12" /> </div> <div + aria-label="Minimise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Minimise" > <div class="mx_Icon mx_Icon_12" @@ -249,7 +247,6 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Options" > <div class="mx_Icon mx_Icon_12" @@ -367,9 +364,9 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` width="20px" /> </span> - <b> + <h3> Example 1 - </b> + </h3> <span /> </span> </span> @@ -377,20 +374,20 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` class="mx_AppTileMenuBar_widgets" > <div + aria-label="Maximise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Maximise" > <div class="mx_Icon mx_Icon_12" /> </div> <div + aria-label="Minimise" class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Minimise" > <div class="mx_Icon mx_Icon_12" @@ -403,7 +400,6 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` class="mx_AccessibleButton mx_AppTileMenuBar_widgets_button" role="button" tabindex="0" - title="Options" > <div class="mx_Icon mx_Icon_12" diff --git a/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap b/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap index efd688ed12..f7d800eb19 100644 --- a/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/FacePile-test.tsx.snap @@ -4,7 +4,6 @@ exports[`<FacePile /> renders with a tooltip 1`] = ` <DocumentFragment> <div class="mx_AccessibleButton mx_FacePile" - data-state="closed" role="button" tabindex="0" > diff --git a/test/components/views/elements/__snapshots__/ImageView-test.tsx.snap b/test/components/views/elements/__snapshots__/ImageView-test.tsx.snap new file mode 100644 index 0000000000..93d6d3a357 --- /dev/null +++ b/test/components/views/elements/__snapshots__/ImageView-test.tsx.snap @@ -0,0 +1,82 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`<ImageView /> renders correctly 1`] = ` +<div> + <div + data-focus-guard="true" + style="width: 1px; height: 0px; padding: 0px; overflow: hidden; position: fixed; top: 1px; left: 1px;" + tabindex="0" + /> + <div + aria-label="Image view" + class="mx_ImageView" + data-focus-lock-disabled="false" + role="dialog" + > + <div + class="mx_ImageView_panel" + > + <div /> + <div + class="mx_ImageView_toolbar" + > + <div + aria-describedby="floating-ui-2" + aria-label="Zoom out" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_zoomOut" + role="button" + tabindex="0" + /> + <div + aria-label="Zoom in" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_zoomIn" + role="button" + tabindex="0" + /> + <div + aria-label="Rotate Left" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_rotateCCW" + role="button" + tabindex="0" + /> + <div + aria-label="Rotate Right" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_rotateCW" + role="button" + tabindex="0" + /> + <div + aria-label="Download" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_download" + role="button" + tabindex="0" + /> + <div + aria-label="Close" + class="mx_AccessibleButton mx_ImageView_button mx_ImageView_button_close" + role="button" + tabindex="0" + /> + </div> + </div> + <div + class="mx_ImageView_image_wrapper" + > + <img + class="mx_ImageView_image " + draggable="true" + src="https://example.com/image.png" + style="transform: translateX(0px) + translateY(0px) + scale(0) + rotate(0deg); cursor: zoom-out;" + /> + </div> + </div> + <div + data-focus-guard="true" + style="width: 1px; height: 0px; padding: 0px; overflow: hidden; position: fixed; top: 1px; left: 1px;" + tabindex="0" + /> +</div> +`; diff --git a/test/components/views/elements/__snapshots__/InfoTooltip-test.tsx.snap b/test/components/views/elements/__snapshots__/InfoTooltip-test.tsx.snap index 075f5721b6..57cbf5d171 100644 --- a/test/components/views/elements/__snapshots__/InfoTooltip-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/InfoTooltip-test.tsx.snap @@ -3,9 +3,8 @@ exports[`InfoTooltip should show tooltip on hover 1`] = ` <DocumentFragment> <div - aria-describedby="radix-0" + aria-describedby="floating-ui-2" class="mx_InfoTooltip" - data-state="delayed-open" tabindex="0" > <span diff --git a/test/components/views/elements/__snapshots__/Pill-test.tsx.snap b/test/components/views/elements/__snapshots__/Pill-test.tsx.snap index 1ec5b38bc0..3202e04655 100644 --- a/test/components/views/elements/__snapshots__/Pill-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/Pill-test.tsx.snap @@ -11,7 +11,6 @@ exports[`<Pill> should not render an avatar or link when called with inMessage = <div> <bdi> <span - data-state="closed" tabindex="0" > <span @@ -34,7 +33,6 @@ exports[`<Pill> should render the expected pill for @room 1`] = ` <div> <bdi> <span - data-state="closed" tabindex="0" > <span @@ -69,7 +67,6 @@ exports[`<Pill> should render the expected pill for a known user not in the room <bdi> <a class="mx_Pill mx_UserPill" - data-state="closed" href="https://matrix.to/#/@user2:example.com" > <span @@ -100,7 +97,6 @@ exports[`<Pill> should render the expected pill for a message in another room 1` <bdi> <a class="mx_Pill mx_EventPill" - data-state="closed" href="https://matrix.to/#/!room1:example.com/$123-456" > <span @@ -131,7 +127,6 @@ exports[`<Pill> should render the expected pill for a message in the same room 1 <bdi> <a class="mx_Pill mx_EventPill" - data-state="closed" href="https://matrix.to/#/!room1:example.com/$123-456" > <span @@ -162,7 +157,6 @@ exports[`<Pill> should render the expected pill for a room alias 1`] = ` <bdi> <a class="mx_Pill mx_RoomPill" - data-state="closed" href="https://matrix.to/#/#room1:example.com" > <span @@ -193,7 +187,6 @@ exports[`<Pill> should render the expected pill for a space 1`] = ` <bdi> <a class="mx_Pill mx_RoomPill" - data-state="closed" href="https://matrix.to/#/!space1:example.com" > <span @@ -224,7 +217,6 @@ exports[`<Pill> should render the expected pill for an uknown user not in the ro <bdi> <a class="mx_Pill mx_UserPill" - data-state="closed" href="https://matrix.to/#/@user3:example.com" > <div @@ -247,7 +239,6 @@ exports[`<Pill> when rendering a pill for a room should render the expected pill <bdi> <a class="mx_Pill mx_RoomPill" - data-state="closed" href="https://matrix.to/#/!room1:example.com" > <span @@ -278,7 +269,6 @@ exports[`<Pill> when rendering a pill for a user in the room should render as ex <bdi> <a class="mx_Pill mx_UserPill" - data-state="closed" href="https://matrix.to/#/@user1:example.com" > <span diff --git a/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap b/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap index 82db5c7449..ef901cd0cc 100644 --- a/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/RoomFacePile-test.tsx.snap @@ -4,7 +4,6 @@ exports[`<RoomFacePile /> renders 1`] = ` <DocumentFragment> <div class="mx_AccessibleButton mx_FacePile" - data-state="closed" role="button" tabindex="0" > diff --git a/test/components/views/location/__snapshots__/LocationViewDialog-test.tsx.snap b/test/components/views/location/__snapshots__/LocationViewDialog-test.tsx.snap index 62847f2dc4..2886a826c8 100644 --- a/test/components/views/location/__snapshots__/LocationViewDialog-test.tsx.snap +++ b/test/components/views/location/__snapshots__/LocationViewDialog-test.tsx.snap @@ -23,22 +23,22 @@ exports[`<LocationViewDialog /> renders map correctly 1`] = ` class="mx_ZoomButtons" > <div + aria-label="Zoom in" class="mx_AccessibleButton mx_ZoomButtons_button" data-testid="map-zoom-in-button" role="button" tabindex="0" - title="Zoom in" > <div class="mx_ZoomButtons_icon" /> </div> <div + aria-label="Zoom out" class="mx_AccessibleButton mx_ZoomButtons_button" data-testid="map-zoom-out-button" role="button" tabindex="0" - title="Zoom out" > <div class="mx_ZoomButtons_icon" diff --git a/test/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap b/test/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap index 6b39c3eeaf..c8998025e0 100644 --- a/test/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap +++ b/test/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap @@ -6,22 +6,22 @@ exports[`<ZoomButtons /> renders buttons 1`] = ` class="mx_ZoomButtons" > <div + aria-label="Zoom in" class="mx_AccessibleButton mx_ZoomButtons_button" data-testid="map-zoom-in-button" role="button" tabindex="0" - title="Zoom in" > <div class="mx_ZoomButtons_icon" /> </div> <div + aria-label="Zoom out" class="mx_AccessibleButton mx_ZoomButtons_button" data-testid="map-zoom-out-button" role="button" tabindex="0" - title="Zoom out" > <div class="mx_ZoomButtons_icon" diff --git a/test/components/views/messages/CallEvent-test.tsx b/test/components/views/messages/CallEvent-test.tsx index 37a26d4bc4..6c9585e7eb 100644 --- a/test/components/views/messages/CallEvent-test.tsx +++ b/test/components/views/messages/CallEvent-test.tsx @@ -19,7 +19,6 @@ import { render, screen, act, cleanup, fireEvent, waitFor } from "@testing-libra import { mocked, Mocked } from "jest-mock"; import { Room, RoomStateEvent, MatrixClient, PendingEventOrdering } from "matrix-js-sdk/src/matrix"; import { ClientWidgetApi, Widget } from "matrix-widget-api"; -import { TooltipProvider } from "@vector-im/compound-web"; import type { RoomMember } from "matrix-js-sdk/src/matrix"; import { @@ -103,7 +102,7 @@ describe("CallEvent", () => { }); const renderEvent = () => { - render(<CallEvent mxEvent={call.event} />, { wrapper: TooltipProvider }); + render(<CallEvent mxEvent={call.event} />); }; it("shows a message and duration if the call was ended", () => { diff --git a/test/components/views/messages/DecryptionFailureBody-test.tsx b/test/components/views/messages/DecryptionFailureBody-test.tsx index e8d4fce56e..6b0177a916 100644 --- a/test/components/views/messages/DecryptionFailureBody-test.tsx +++ b/test/components/views/messages/DecryptionFailureBody-test.tsx @@ -17,13 +17,20 @@ import React from "react"; import { render } from "@testing-library/react"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { mkDecryptionFailureMatrixEvent } from "matrix-js-sdk/src/testing"; +import { DecryptionFailureCode } from "matrix-js-sdk/src/crypto-api"; import { mkEvent } from "../../../test-utils"; import { DecryptionFailureBody } from "../../../../src/components/views/messages/DecryptionFailureBody"; +import { LocalDeviceVerificationStateContext } from "../../../../src/contexts/LocalDeviceVerificationStateContext"; describe("DecryptionFailureBody", () => { - function customRender(event: MatrixEvent) { - return render(<DecryptionFailureBody mxEvent={event} />); + function customRender(event: MatrixEvent, localDeviceVerified: boolean = false) { + return render( + <LocalDeviceVerificationStateContext.Provider value={localDeviceVerified}> + <DecryptionFailureBody mxEvent={event} /> + </LocalDeviceVerificationStateContext.Provider>, + ); } it(`Should display "Unable to decrypt message"`, () => { @@ -60,4 +67,51 @@ describe("DecryptionFailureBody", () => { // Then expect(container).toMatchSnapshot(); }); + + it("should handle historical messages with no key backup", async () => { + // When + const event = await mkDecryptionFailureMatrixEvent({ + code: DecryptionFailureCode.HISTORICAL_MESSAGE_NO_KEY_BACKUP, + msg: "No backup", + roomId: "fakeroom", + sender: "fakesender", + }); + const { container } = customRender(event); + + // Then + expect(container).toHaveTextContent("Historical messages are not available on this device"); + }); + + it.each([true, false])( + "should handle historical messages when there is a backup and device verification is %s", + async (verified) => { + // When + const event = await mkDecryptionFailureMatrixEvent({ + code: DecryptionFailureCode.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED, + msg: "Failure", + roomId: "fakeroom", + sender: "fakesender", + }); + const { container } = customRender(event, verified); + + // Then + expect(container).toHaveTextContent( + verified ? "Unable to decrypt" : "You need to verify this device for access to historical messages", + ); + }, + ); + + it("should handle undecryptable pre-join messages", async () => { + // When + const event = await mkDecryptionFailureMatrixEvent({ + code: DecryptionFailureCode.HISTORICAL_MESSAGE_USER_NOT_JOINED, + msg: "Not joined", + roomId: "fakeroom", + sender: "fakesender", + }); + const { container } = customRender(event); + + // Then + expect(container).toHaveTextContent("You don't have access to this message"); + }); }); diff --git a/test/components/views/messages/MLocationBody-test.tsx b/test/components/views/messages/MLocationBody-test.tsx index 7f3bddaa4c..1cdcb65767 100644 --- a/test/components/views/messages/MLocationBody-test.tsx +++ b/test/components/views/messages/MLocationBody-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { ComponentProps } from "react"; -import { fireEvent, render } from "@testing-library/react"; +import { fireEvent, render, waitFor } from "@testing-library/react"; import { LocationAssetType, ClientEvent, RoomMember, SyncState } from "matrix-js-sdk/src/matrix"; import * as maplibregl from "maplibre-gl"; import { logger } from "matrix-js-sdk/src/logger"; @@ -90,8 +90,13 @@ describe("MLocationBody", () => { jest.spyOn(logger, "error").mockRestore(); }); - it("displays correct fallback content without error style when map_style_url is not configured", () => { + it("displays correct fallback content without error style when map_style_url is not configured", async () => { const component = getComponent(); + + // The map code needs to be lazy loaded so this will take some time to appear + await waitFor(() => + expect(component.container.querySelector(".mx_EventTile_body")).toBeInTheDocument(), + ); expect(component.container.querySelector(".mx_EventTile_body")).toMatchSnapshot(); }); diff --git a/test/components/views/messages/MStickerBody-test.tsx b/test/components/views/messages/MStickerBody-test.tsx index ee0fb5c337..e541149a79 100644 --- a/test/components/views/messages/MStickerBody-test.tsx +++ b/test/components/views/messages/MStickerBody-test.tsx @@ -19,7 +19,6 @@ import { render, screen } from "@testing-library/react"; import { EventType, getHttpUriForMxc, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import fetchMock from "fetch-mock-jest"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import { RoomPermalinkCreator } from "../../../../src/utils/permalinks/Permalinks"; import { @@ -86,7 +85,7 @@ describe("<MStickerBody/>", () => { it("should show a tooltip on hover", async () => { fetchMock.getOnce(url, { status: 200 }); - render(<MStickerBody {...props} mxEvent={mediaEvent} />, { wrapper: TooltipProvider }); + render(<MStickerBody {...props} mxEvent={mediaEvent} />); expect(screen.queryByRole("tooltip")).toBeNull(); await userEvent.hover(screen.getByRole("img")); diff --git a/test/components/views/messages/MessageTimestamp-test.tsx b/test/components/views/messages/MessageTimestamp-test.tsx index 5b8df86d6c..ded0f0c5cd 100644 --- a/test/components/views/messages/MessageTimestamp-test.tsx +++ b/test/components/views/messages/MessageTimestamp-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import MessageTimestamp from "../../../../src/components/views/messages/MessageTimestamp"; @@ -31,23 +30,22 @@ describe("MessageTimestamp", () => { const DAY_MS = HOUR_MS * 24; it("should render HH:MM", () => { - const { asFragment } = render(<MessageTimestamp ts={nowDate.getTime()} />, { wrapper: TooltipProvider }); + const { asFragment } = render(<MessageTimestamp ts={nowDate.getTime()} />); expect(asFragment()).toMatchInlineSnapshot(` - <DocumentFragment> - <span - aria-hidden="true" - aria-live="off" - class="mx_MessageTimestamp" - data-state="closed" - > - 08:09 - </span> - </DocumentFragment> - `); +<DocumentFragment> + <span + aria-hidden="true" + aria-live="off" + class="mx_MessageTimestamp" + > + 08:09 + </span> +</DocumentFragment> +`); }); it("should show full date & time on hover", async () => { - const { container } = render(<MessageTimestamp ts={nowDate.getTime()} />, { wrapper: TooltipProvider }); + const { container } = render(<MessageTimestamp ts={nowDate.getTime()} />); await userEvent.hover(container.querySelector(".mx_MessageTimestamp")!); expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot(`"Fri, Dec 17, 2021, 08:09:00"`); }); @@ -55,7 +53,6 @@ describe("MessageTimestamp", () => { it("should show sent & received time on hover if passed", async () => { const { container } = render( <MessageTimestamp ts={nowDate.getTime()} receivedTs={nowDate.getTime() + DAY_MS} />, - { wrapper: TooltipProvider }, ); await userEvent.hover(container.querySelector(".mx_MessageTimestamp")!); expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot( diff --git a/test/components/views/messages/TextualBody-test.tsx b/test/components/views/messages/TextualBody-test.tsx index 7ef8f1bd0c..2756b8078a 100644 --- a/test/components/views/messages/TextualBody-test.tsx +++ b/test/components/views/messages/TextualBody-test.tsx @@ -198,7 +198,7 @@ describe("<TextualBody />", () => { const { container } = getComponent({ mxEvent: ev }); const content = container.querySelector(".mx_EventTile_body"); expect(content.innerHTML).toMatchInlineSnapshot( - `"Chat with <span><bdi><a class="mx_Pill mx_UserPill mx_UserPill_me" href="https://matrix.to/#/@user:example.com" data-state="closed"><span aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Member</span></a></bdi></span>"`, + `"Chat with <span><bdi><a class="mx_Pill mx_UserPill mx_UserPill_me" href="https://matrix.to/#/@user:example.com"><span aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Member</span></a></bdi></span>"`, ); }); @@ -216,7 +216,7 @@ describe("<TextualBody />", () => { const { container } = getComponent({ mxEvent: ev }); const content = container.querySelector(".mx_EventTile_body"); expect(content.innerHTML).toMatchInlineSnapshot( - `"Visit <span><bdi><a class="mx_Pill mx_RoomPill" href="https://matrix.to/#/#room:example.com" data-state="closed"><div class="mx_Pill_LinkIcon mx_BaseAvatar"></div><span class="mx_Pill_text">#room:example.com</span></a></bdi></span>"`, + `"Visit <span><bdi><a class="mx_Pill mx_RoomPill" href="https://matrix.to/#/#room:example.com"><div class="mx_Pill_LinkIcon mx_BaseAvatar"></div><span class="mx_Pill_text">#room:example.com</span></a></bdi></span>"`, ); }); diff --git a/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap b/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap index ce136ac159..aee9cc6d59 100644 --- a/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap +++ b/test/components/views/messages/__snapshots__/TextualBody-test.tsx.snap @@ -51,7 +51,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for an <bdi> <a class="mx_Pill mx_UserPill" - data-state="closed" href="https://matrix.to/#/@user:example.com" > <span @@ -100,7 +99,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for eve <bdi> <a class="mx_Pill mx_EventPill" - data-state="closed" href="https://matrix.to/#/!ZxbRYPQXDXKGmDnJNg:example.com/$16085560162aNpaH:example.com?via=example.com" > <span @@ -151,7 +149,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills appear for roo <bdi> <a class="mx_Pill mx_RoomPill" - data-state="closed" href="https://matrix.to/#/!ZxbRYPQXDXKGmDnJNg:example.com?via=example.com&via=bob.com" > <span @@ -261,7 +258,6 @@ exports[`<TextualBody /> renders formatted m.text correctly pills get injected c <bdi> <a class="mx_Pill mx_UserPill" - data-state="closed" href="https://matrix.to/#/@user:server" > <span @@ -296,9 +292,9 @@ exports[`<TextualBody /> renders formatted m.text correctly pills get injected c </span> `; -exports[`<TextualBody /> renders plain-text m.text correctly should pillify a permalink to a message in the same room with the label »Message from Member« 1`] = `"Visit <span><bdi><a class="mx_Pill mx_EventPill" href="https://matrix.to/#/!room1:example.com/%event_id%" data-state="closed"><span aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Message from Member</span></a></bdi></span>"`; +exports[`<TextualBody /> renders plain-text m.text correctly should pillify a permalink to a message in the same room with the label »Message from Member« 1`] = `"Visit <span><bdi><a class="mx_Pill mx_EventPill" href="https://matrix.to/#/!room1:example.com/%event_id%"><span aria-label="Profile picture" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/image.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Message from Member</span></a></bdi></span>"`; -exports[`<TextualBody /> renders plain-text m.text correctly should pillify a permalink to an event in another room with the label »Message in Room 2« 1`] = `"Visit <span><bdi><a class="mx_Pill mx_EventPill" href="https://matrix.to/#/!room2:example.com/%event_id%" data-state="closed"><span aria-label="Avatar" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/room.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Message in Room 2</span></a></bdi></span>"`; +exports[`<TextualBody /> renders plain-text m.text correctly should pillify a permalink to an event in another room with the label »Message in Room 2« 1`] = `"Visit <span><bdi><a class="mx_Pill mx_EventPill" href="https://matrix.to/#/!room2:example.com/%event_id%"><span aria-label="Avatar" aria-hidden="true" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar" style="--cpd-avatar-size: 16px;"><img loading="lazy" alt="" src="mxc://avatar.url/room.png" crossorigin="anonymous" referrerpolicy="no-referrer" class="_image_mcap2_50" data-type="round" width="16px" height="16px"></span><span class="mx_Pill_text">Message in Room 2</span></a></bdi></span>"`; exports[`<TextualBody /> renders plain-text m.text correctly should pillify a permalink to an unknown message in the same room with the label »Message« 1`] = ` <span @@ -310,7 +306,6 @@ exports[`<TextualBody /> renders plain-text m.text correctly should pillify a pe <bdi> <a class="mx_Pill mx_EventPill" - data-state="closed" href="https://matrix.to/#/!room1:example.com/!abc123" > <div diff --git a/test/components/views/polls/pollHistory/PollHistory-test.tsx b/test/components/views/polls/pollHistory/PollHistory-test.tsx index 054961cb2e..2a5fc80168 100644 --- a/test/components/views/polls/pollHistory/PollHistory-test.tsx +++ b/test/components/views/polls/pollHistory/PollHistory-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { act, fireEvent, render } from "@testing-library/react"; import { Filter, EventTimeline, Room, MatrixEvent, M_POLL_START } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import { PollHistory } from "../../../../../src/components/views/polls/pollHistory/PollHistory"; import { @@ -68,9 +67,7 @@ describe("<PollHistory />", () => { const getComponent = () => render(<PollHistory {...defaultProps} />, { wrapper: ({ children }) => ( - <MatrixClientContext.Provider value={mockClient}> - <TooltipProvider>{children}</TooltipProvider> - </MatrixClientContext.Provider> + <MatrixClientContext.Provider value={mockClient}>{children}</MatrixClientContext.Provider> ), }); diff --git a/test/components/views/polls/pollHistory/PollListItem-test.tsx b/test/components/views/polls/pollHistory/PollListItem-test.tsx index 1b49ca922b..b48cddb8d8 100644 --- a/test/components/views/polls/pollHistory/PollListItem-test.tsx +++ b/test/components/views/polls/pollHistory/PollListItem-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { fireEvent, render } from "@testing-library/react"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import { PollListItem } from "../../../../../src/components/views/polls/pollHistory/PollListItem"; import { makePollStartEvent, mockIntlDateTimeFormat, unmockIntlDateTimeFormat } from "../../../../test-utils"; @@ -26,8 +25,7 @@ describe("<PollListItem />", () => { const event = makePollStartEvent("Question?", "@me:domain.org"); event.getContent().origin; const defaultProps = { event, onClick: jest.fn() }; - const getComponent = (props = {}) => - render(<PollListItem {...defaultProps} {...props} />, { wrapper: TooltipProvider }); + const getComponent = (props = {}) => render(<PollListItem {...defaultProps} {...props} />); beforeAll(() => { // mock default locale to en-GB and set timezone diff --git a/test/components/views/polls/pollHistory/PollListItemEnded-test.tsx b/test/components/views/polls/pollHistory/PollListItemEnded-test.tsx index 371547e67d..7bf27ee447 100644 --- a/test/components/views/polls/pollHistory/PollListItemEnded-test.tsx +++ b/test/components/views/polls/pollHistory/PollListItemEnded-test.tsx @@ -17,7 +17,6 @@ limitations under the License. import React from "react"; import { render } from "@testing-library/react"; import { MatrixEvent, Poll, Room, M_TEXT } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import { PollListItemEnded } from "../../../../../src/components/views/polls/pollHistory/PollListItemEnded"; import { @@ -61,7 +60,7 @@ describe("<PollListItemEnded />", () => { const pollEndEvent = makePollEndEvent(pollId, roomId, userId, timestamp + 60000); const getComponent = (props: { event: MatrixEvent; poll: Poll }) => - render(<PollListItemEnded {...props} onClick={jest.fn()} />, { wrapper: TooltipProvider }); + render(<PollListItemEnded {...props} onClick={jest.fn()} />); beforeAll(() => { // mock default locale to en-GB and set timezone diff --git a/test/components/views/polls/pollHistory/__snapshots__/PollHistory-test.tsx.snap b/test/components/views/polls/pollHistory/__snapshots__/PollHistory-test.tsx.snap index 0e60b5970e..70f66bb803 100644 --- a/test/components/views/polls/pollHistory/__snapshots__/PollHistory-test.tsx.snap +++ b/test/components/views/polls/pollHistory/__snapshots__/PollHistory-test.tsx.snap @@ -79,7 +79,6 @@ exports[`<PollHistory /> renders a list of active polls when there are polls in data-testid="pollListItem-$2" > <span - data-state="closed" tabindex="0" > <div @@ -104,7 +103,6 @@ exports[`<PollHistory /> renders a list of active polls when there are polls in data-testid="pollListItem-$1" > <span - data-state="closed" tabindex="0" > <div diff --git a/test/components/views/polls/pollHistory/__snapshots__/PollListItem-test.tsx.snap b/test/components/views/polls/pollHistory/__snapshots__/PollListItem-test.tsx.snap index fc15bc34dc..637f79d334 100644 --- a/test/components/views/polls/pollHistory/__snapshots__/PollListItem-test.tsx.snap +++ b/test/components/views/polls/pollHistory/__snapshots__/PollListItem-test.tsx.snap @@ -7,7 +7,6 @@ exports[`<PollListItem /> renders a poll 1`] = ` data-testid="pollListItem-$mypoll" > <span - data-state="closed" tabindex="0" > <div diff --git a/test/components/views/polls/pollHistory/__snapshots__/PollListItemEnded-test.tsx.snap b/test/components/views/polls/pollHistory/__snapshots__/PollListItemEnded-test.tsx.snap index 7bf93571ec..b9dfbcce32 100644 --- a/test/components/views/polls/pollHistory/__snapshots__/PollListItemEnded-test.tsx.snap +++ b/test/components/views/polls/pollHistory/__snapshots__/PollListItemEnded-test.tsx.snap @@ -7,7 +7,6 @@ exports[`<PollListItemEnded /> renders a poll with no responses 1`] = ` data-testid="pollListItem-1" > <span - data-state="closed" tabindex="0" > <div diff --git a/test/components/views/right_panel/RoomSummaryCard-test.tsx b/test/components/views/right_panel/RoomSummaryCard-test.tsx index 8fce2fdf86..b4288dc357 100644 --- a/test/components/views/right_panel/RoomSummaryCard-test.tsx +++ b/test/components/views/right_panel/RoomSummaryCard-test.tsx @@ -19,7 +19,6 @@ import { render, fireEvent, screen } from "@testing-library/react"; import { EventType, MatrixEvent, Room, MatrixClient, JoinRule } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { mocked, MockedObject } from "jest-mock"; -import { TooltipProvider } from "@vector-im/compound-web"; import DMRoomMap from "../../../../src/utils/DMRoomMap"; import RoomSummaryCard from "../../../../src/components/views/right_panel/RoomSummaryCard"; @@ -57,9 +56,7 @@ describe("<RoomSummaryCard />", () => { return render(<RoomSummaryCard {...defaultProps} {...props} />, { wrapper: ({ children }) => ( - <MatrixClientContext.Provider value={mockClient}> - <TooltipProvider>{children}</TooltipProvider> - </MatrixClientContext.Provider> + <MatrixClientContext.Provider value={mockClient}>{children}</MatrixClientContext.Provider> ), }); }; @@ -110,6 +107,40 @@ describe("<RoomSummaryCard />", () => { expect(container).toMatchSnapshot(); }); + it("renders the room topic in the summary", () => { + room.currentState.setStateEvents([ + new MatrixEvent({ + type: "m.room.topic", + room_id: roomId, + sender: userId, + content: { + topic: "This is the room's topic.", + }, + state_key: "", + }), + ]); + const { container } = getComponent(); + expect(container).toMatchSnapshot(); + }); + + it("has button to edit topic when expanded", () => { + room.currentState.setStateEvents([ + new MatrixEvent({ + type: "m.room.topic", + room_id: roomId, + sender: userId, + content: { + topic: "This is the room's topic.", + }, + state_key: "", + }), + ]); + const { container, getByText } = getComponent(); + fireEvent.click(screen.getByText("This is the room's topic.")); + expect(getByText("Edit")).toBeInTheDocument(); + expect(container).toMatchSnapshot(); + }); + it("opens the search", async () => { const onSearchClick = jest.fn(); const { getByLabelText } = getComponent({ diff --git a/test/components/views/right_panel/UserInfo-test.tsx b/test/components/views/right_panel/UserInfo-test.tsx index 7c12efb9d7..1c9e375e04 100644 --- a/test/components/views/right_panel/UserInfo-test.tsx +++ b/test/components/views/right_panel/UserInfo-test.tsx @@ -38,7 +38,6 @@ import { VerificationPhase as Phase, VerificationRequestEvent, } from "matrix-js-sdk/src/crypto-api"; -import { TooltipProvider } from "@vector-im/compound-web"; import UserInfo, { BanToggleButton, @@ -206,11 +205,7 @@ describe("<UserInfo />", () => { const renderComponent = (props = {}) => { const Wrapper = (wrapperProps = {}) => { - return ( - <TooltipProvider> - <MatrixClientContext.Provider value={mockClient} {...wrapperProps} /> - </TooltipProvider> - ); + return <MatrixClientContext.Provider value={mockClient} {...wrapperProps} />; }; return render(<UserInfo {...defaultProps} {...props} />, { @@ -298,7 +293,8 @@ describe("<UserInfo />", () => { it("renders close button correctly when encryption panel with a pending verification request", () => { renderComponent({ phase: RightPanelPhases.EncryptionPanel, verificationRequest }); - expect(screen.getByTestId("base-card-close-button")).toHaveAttribute("title", "Cancel"); + screen.getByTestId("base-card-close-button").focus(); + expect(screen.getByRole("tooltip")).toHaveTextContent("Cancel"); }); }); @@ -392,11 +388,8 @@ describe("<UserInfo />", () => { // click it await userEvent.click(devicesButton); - // there should now be a button with the device id ... - const deviceButton = screen.getByRole("button", { description: "d1" }); - - // ... which should contain the device name - expect(within(deviceButton).getByText("my device")).toBeInTheDocument(); + // there should now be a button with the device id which should contain the device name + expect(screen.getByRole("button", { name: "my device" })).toBeInTheDocument(); }); it("renders <BasicUserInfo />", async () => { @@ -449,10 +442,10 @@ describe("<UserInfo />", () => { }); // there should now be a button with the non-dehydrated device ID - expect(screen.getByRole("button", { description: "d1" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "my device" })).toBeInTheDocument(); // but not for the dehydrated device ID - expect(screen.queryByRole("button", { description: "d2" })).not.toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "dehydrated device" })).not.toBeInTheDocument(); // there should be a line saying that the user has "Offline device" enabled expect(screen.getByText("Offline device enabled")).toBeInTheDocument(); @@ -535,7 +528,7 @@ describe("<UserInfo />", () => { // the dehydrated device should be shown as an unverified device, which means // there should now be a button with the device id ... - const deviceButton = screen.getByRole("button", { description: "d2" }); + const deviceButton = screen.getByRole("button", { name: "dehydrated device" }); // ... which should contain the device name expect(within(deviceButton).getByText("dehydrated device")).toBeInTheDocument(); @@ -577,13 +570,15 @@ describe("<UserInfo />", () => { }); // the dehydrated devices should be shown as an unverified device, which means - // there should now be a button with the first dehydrated device id ... - const device1Button = screen.getByRole("button", { description: "d1" }); + // there should now be a button with the first dehydrated device... + const device1Button = screen.getByRole("button", { name: "dehydrated device 1" }); + expect(device1Button).toBeVisible(); // ... which should contain the device name expect(within(device1Button).getByText("dehydrated device 1")).toBeInTheDocument(); - // and a button with the second dehydrated device id ... - const device2Button = screen.getByRole("button", { description: "d2" }); + // and a button with the second dehydrated device... + const device2Button = screen.getByRole("button", { name: "dehydrated device 2" }); + expect(device2Button).toBeVisible(); // ... which should contain the device name expect(within(device2Button).getByText("dehydrated device 2")).toBeInTheDocument(); @@ -631,11 +626,7 @@ describe("<UserInfoHeader />", () => { const renderComponent = (props = {}) => { const Wrapper = (wrapperProps = {}) => { - return ( - <TooltipProvider> - <MatrixClientContext.Provider value={mockClient} {...wrapperProps} /> - </TooltipProvider> - ); + return <MatrixClientContext.Provider value={mockClient} {...wrapperProps} />; }; return render(<UserInfoHeader {...defaultProps} {...props} />, { @@ -716,7 +707,8 @@ describe("<DeviceItem />", () => { renderComponent({ isUserVerified: true }); await act(flushPromises); - expect(screen.getByRole("button", { name: `${device.displayName} Not trusted` })).toBeInTheDocument(); + const button = screen.getByRole("button", { name: device.displayName }); + expect(button).toHaveTextContent(`${device.displayName}Not trusted`); }); it("with verified device only, displays no button without a label", async () => { diff --git a/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap b/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap index 05590b630c..784be90168 100644 --- a/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap +++ b/test/components/views/right_panel/__snapshots__/RoomSummaryCard-test.tsx.snap @@ -1,5 +1,429 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`<RoomSummaryCard /> has button to edit topic when expanded 1`] = ` +<div> + <div + class="mx_BaseCard mx_RoomSummaryCard" + > + <div + class="mx_AutoHideScrollbar" + tabindex="-1" + > + <header + class="mx_Flex mx_RoomSummaryCard_header" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: space-between; --mx-flex-gap: var(--cpd-space-3x);" + > + <button + aria-label="Search" + class="mx_RoomSummaryCard_searchBtn" + data-testid="summary-search" + > + <div + height="100%" + width="100%" + /> + </button> + <div + aria-label="Close" + class="mx_AccessibleButton mx_BaseCard_close" + data-testid="base-card-close-button" + role="button" + tabindex="0" + /> + </header> + <header + class="mx_RoomSummaryCard_container" + > + <span + class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" + data-color="1" + data-testid="avatar-img" + data-type="round" + role="presentation" + style="--cpd-avatar-size: 80px;" + > + ! + </span> + <h1 + class="_typography_yh5dq_162 _font-heading-md-semibold_yh5dq_121 mx_RoomSummaryCard_roomName text-primary" + title="!room:domain.org" + > + !room:domain.org + </h1> + <div + class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 mx_RoomSummaryCard_alias text-secondary" + title="" + /> + <section + class="mx_Flex mx_RoomSummaryCard_badges" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: center; --mx-flex-gap: var(--cpd-space-2x);" + > + <span + class="_typography_yh5dq_162 _font-body-sm-medium_yh5dq_50 _badge_qipht_17" + data-kind="default" + > + <div + width="1em" + /> + Not encrypted + </span> + </section> + <section + class="mx_Flex mx_RoomSummaryCard_topic" + style="--mx-flex-display: flex; --mx-flex-direction: column; --mx-flex-align: start; --mx-flex-justify: center; --mx-flex-gap: var(--cpd-space-2x);" + > + <div + class="mx_Box mx_RoomSummaryCard_topic_container mx_Box--flex" + style="--mx-box-flex: 1;" + > + <p + class="_typography_yh5dq_162 _font-body-sm-regular_yh5dq_40" + > + <span + dir="auto" + > + This is the room's topic. + </span> + </p> + <button + class="_icon-button_16nk7_17 mx_RoomSummaryCard_topic_chevron" + role="button" + style="--cpd-icon-button-size: 24px;" + tabindex="0" + > + <div + class="_indicator-icon_133tf_26" + style="--cpd-icon-button-size: 100%;" + > + <div /> + </div> + </button> + </div> + <div + class="mx_Box mx_RoomSummaryCard_topic_edit mx_Box--flex" + style="--mx-box-flex: 1;" + > + <a + class="_link_1mzip_17" + data-kind="primary" + rel="noreferrer noopener" + > + <p + class="_typography_yh5dq_162 _font-body-sm-regular_yh5dq_40" + > + Edit + </p> + </a> + </div> + </section> + </header> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <label + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + for=":r3:" + role="menuitemcheckbox" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Favourite + </span> + <div + class="_container_ik1u1_18" + > + <input + class="_input_ik1u1_32" + id=":r3:" + type="checkbox" + /> + <div + class="_ui_ik1u1_42" + /> + </div> + </label> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Invite + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Copy link + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Settings + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + People + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Files + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Poll history + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Export Chat + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="critical" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Leave room + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="mx_BaseCard_Group mx_RoomSummaryCard_appsGroup" + > + <h2> + Widgets + </h2> + <div + class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_link" + role="button" + tabindex="0" + > + Add widgets, bridges & bots + </div> + </div> + </div> + </div> +</div> +`; + exports[`<RoomSummaryCard /> renders the room summary 1`] = ` <div> <div @@ -16,7 +440,6 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` <button aria-label="Search" class="mx_RoomSummaryCard_searchBtn" - data-state="closed" data-testid="summary-search" > <div @@ -25,11 +448,408 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` /> </button> <div + aria-label="Close" + class="mx_AccessibleButton mx_BaseCard_close" + data-testid="base-card-close-button" + role="button" + tabindex="0" + /> + </header> + <header + class="mx_RoomSummaryCard_container" + > + <span + class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" + data-color="1" + data-testid="avatar-img" + data-type="round" + role="presentation" + style="--cpd-avatar-size: 80px;" + > + ! + </span> + <h1 + class="_typography_yh5dq_162 _font-heading-md-semibold_yh5dq_121 mx_RoomSummaryCard_roomName text-primary" + title="!room:domain.org" + > + !room:domain.org + </h1> + <div + class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 mx_RoomSummaryCard_alias text-secondary" + title="" + /> + <section + class="mx_Flex mx_RoomSummaryCard_badges" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: center; --mx-flex-gap: var(--cpd-space-2x);" + > + <span + class="_typography_yh5dq_162 _font-body-sm-medium_yh5dq_50 _badge_qipht_17" + data-kind="default" + > + <div + width="1em" + /> + Not encrypted + </span> + </section> + <section + class="mx_Flex mx_RoomSummaryCard_topic" + style="--mx-flex-display: flex; --mx-flex-direction: column; --mx-flex-align: start; --mx-flex-justify: center; --mx-flex-gap: var(--cpd-space-2x);" + > + <div + class="mx_Box mx_Box--flex" + style="--mx-box-flex: 1;" + > + <a + class="_link_1mzip_17" + data-kind="primary" + rel="noreferrer noopener" + > + <p + class="_typography_yh5dq_162 _font-body-sm-regular_yh5dq_40" + > + Add topic + </p> + </a> + </div> + </section> + </header> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <label + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + for=":r1:" + role="menuitemcheckbox" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Favourite + </span> + <div + class="_container_ik1u1_18" + > + <input + class="_input_ik1u1_32" + id=":r1:" + type="checkbox" + /> + <div + class="_ui_ik1u1_42" + /> + </div> + </label> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Invite + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Copy link + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Settings + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + People + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Files + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Poll history + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="primary" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Export Chat + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="_separator_144s5_17" + data-kind="primary" + data-orientation="horizontal" + role="separator" + /> + <button + class="_item_1gwvj_17 _interactive_1gwvj_36" + data-kind="critical" + role="menuitem" + > + <div + aria-hidden="true" + class="_icon_1gwvj_44" + height="24" + width="24" + /> + <span + class="_typography_yh5dq_162 _font-body-md-medium_yh5dq_69 _label_1gwvj_53" + > + Leave room + </span> + <svg + aria-hidden="true" + class="_nav-hint_1gwvj_60" + fill="currentColor" + height="24" + viewBox="8 0 8 24" + width="8" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.7 17.3a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7l3.9-3.9-3.9-3.9a.948.948 0 0 1-.275-.7.95.95 0 0 1 .275-.7.948.948 0 0 1 .7-.275.95.95 0 0 1 .7.275l4.6 4.6c.1.1.17.208.213.325.041.117.062.242.062.375s-.02.258-.063.375a.876.876 0 0 1-.212.325l-4.6 4.6a.948.948 0 0 1-.7.275.948.948 0 0 1-.7-.275Z" + /> + </svg> + </button> + <div + class="mx_BaseCard_Group mx_RoomSummaryCard_appsGroup" + > + <h2> + Widgets + </h2> + <div + class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_link" + role="button" + tabindex="0" + > + Add widgets, bridges & bots + </div> + </div> + </div> + </div> +</div> +`; + +exports[`<RoomSummaryCard /> renders the room topic in the summary 1`] = ` +<div> + <div + class="mx_BaseCard mx_RoomSummaryCard" + > + <div + class="mx_AutoHideScrollbar" + tabindex="-1" + > + <header + class="mx_Flex mx_RoomSummaryCard_header" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: space-between; --mx-flex-gap: var(--cpd-space-3x);" + > + <button + aria-label="Search" + class="mx_RoomSummaryCard_searchBtn" + data-testid="summary-search" + > + <div + height="100%" + width="100%" + /> + </button> + <div + aria-label="Close" class="mx_AccessibleButton mx_BaseCard_close" data-testid="base-card-close-button" role="button" tabindex="0" - title="Close" /> </header> <header @@ -69,6 +889,38 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` Not encrypted </span> </section> + <section + class="mx_Flex mx_RoomSummaryCard_topic mx_RoomSummaryCard_topic_collapsed" + style="--mx-flex-display: flex; --mx-flex-direction: column; --mx-flex-align: start; --mx-flex-justify: center; --mx-flex-gap: var(--cpd-space-2x);" + > + <div + class="mx_Box mx_RoomSummaryCard_topic_container mx_Box--flex" + style="--mx-box-flex: 1;" + > + <p + class="_typography_yh5dq_162 _font-body-sm-regular_yh5dq_40" + > + <span + dir="auto" + > + This is the room's topic. + </span> + </p> + <button + class="_icon-button_16nk7_17 mx_RoomSummaryCard_topic_chevron" + role="button" + style="--cpd-icon-button-size: 24px;" + tabindex="0" + > + <div + class="_indicator-icon_133tf_26" + style="--cpd-icon-button-size: 100%;" + > + <div /> + </div> + </button> + </div> + </section> </header> <div class="_separator_144s5_17" @@ -79,7 +931,7 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` <label class="_item_1gwvj_17 _interactive_1gwvj_36" data-kind="primary" - for=":r1:" + for=":r2:" role="menuitemcheckbox" > <div @@ -98,7 +950,7 @@ exports[`<RoomSummaryCard /> renders the room summary 1`] = ` > <input class="_input_ik1u1_32" - id=":r1:" + id=":r2:" type="checkbox" /> <div diff --git a/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap b/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap index 04f43699b3..95f75eadc8 100644 --- a/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap +++ b/test/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap @@ -3,10 +3,10 @@ exports[`<DeviceItem /> ambiguous display name 1`] = ` <div> <div + aria-label="my display name (deviceId)" class="mx_AccessibleButton mx_UserInfo_device mx_UserInfo_device_unverified" role="button" tabindex="0" - title="deviceId" > <div class="mx_E2EIcon mx_E2EIcon_normal" @@ -26,10 +26,10 @@ exports[`<DeviceItem /> ambiguous display name 1`] = ` exports[`<DeviceItem /> with display name 1`] = ` <div> <div + aria-label="deviceName" class="mx_AccessibleButton mx_UserInfo_device mx_UserInfo_device_unverified" role="button" tabindex="0" - title="deviceId" > <div class="mx_E2EIcon mx_E2EIcon_normal" @@ -49,10 +49,10 @@ exports[`<DeviceItem /> with display name 1`] = ` exports[`<DeviceItem /> without display name 1`] = ` <div> <div + aria-label="deviceId" class="mx_AccessibleButton mx_UserInfo_device mx_UserInfo_device_unverified" role="button" tabindex="0" - title="deviceId" > <div class="mx_E2EIcon mx_E2EIcon_normal" @@ -78,11 +78,11 @@ exports[`<UserInfo /> with crypto enabled renders <BasicUserInfo /> 1`] = ` class="mx_BaseCard_header" > <div + aria-label="Close" class="mx_AccessibleButton mx_BaseCard_close" data-testid="base-card-close-button" role="button" tabindex="0" - title="Close" /> <div class="mx_BaseCard_headerProp" diff --git a/test/components/views/rooms/EventTile-test.tsx b/test/components/views/rooms/EventTile-test.tsx index 31203d4f85..cb4cbc56f0 100644 --- a/test/components/views/rooms/EventTile-test.tsx +++ b/test/components/views/rooms/EventTile-test.tsx @@ -29,7 +29,6 @@ import { TweakName, } from "matrix-js-sdk/src/matrix"; import { EventEncryptionInfo, EventShieldColour, EventShieldReason } from "matrix-js-sdk/src/crypto-api"; -import { TooltipProvider } from "@vector-im/compound-web"; import { mkEncryptedMatrixEvent } from "matrix-js-sdk/src/testing"; import EventTile, { EventTileProps } from "../../../../src/components/views/rooms/EventTile"; @@ -59,13 +58,11 @@ describe("EventTile", () => { return ( <MatrixClientContext.Provider value={client}> <RoomContext.Provider value={props.roomContext}> - <TooltipProvider> - <EventTile - mxEvent={mxEvent} - replacingEventId={mxEvent.replacingEventId()} - {...(props.eventTilePropertyOverrides ?? {})} - /> - </TooltipProvider> + <EventTile + mxEvent={mxEvent} + replacingEventId={mxEvent.replacingEventId()} + {...(props.eventTilePropertyOverrides ?? {})} + /> </RoomContext.Provider> </MatrixClientContext.Provider> ); diff --git a/test/components/views/rooms/LegacyRoomHeader-test.tsx b/test/components/views/rooms/LegacyRoomHeader-test.tsx index 1642915c23..c01d749eea 100644 --- a/test/components/views/rooms/LegacyRoomHeader-test.tsx +++ b/test/components/views/rooms/LegacyRoomHeader-test.tsx @@ -32,7 +32,6 @@ import { ClientWidgetApi, Widget } from "matrix-widget-api"; import EventEmitter from "events"; import { setupJestCanvasMock } from "jest-canvas-mock"; import { ViewRoomOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle"; -import { TooltipProvider } from "@vector-im/compound-web"; // eslint-disable-next-line no-restricted-imports import { MatrixRTCSessionManagerEvents } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSessionManager"; // eslint-disable-next-line no-restricted-imports @@ -226,7 +225,6 @@ describe("LegacyRoomHeader", () => { {...props} /> </RoomContext.Provider>, - { wrapper: TooltipProvider }, ); }; @@ -870,7 +868,6 @@ function mountHeader(room: Room, propsOverride = {}, roomContext?: Partial<IRoom <RoomContext.Provider value={{ ...roomContext, room } as IRoomState}> <RoomHeader {...props} /> </RoomContext.Provider>, - { wrapper: TooltipProvider }, ); } diff --git a/test/components/views/rooms/MemberList-test.tsx b/test/components/views/rooms/MemberList-test.tsx index 753b247e59..648fa71230 100644 --- a/test/components/views/rooms/MemberList-test.tsx +++ b/test/components/views/rooms/MemberList-test.tsx @@ -21,7 +21,6 @@ import { Room, MatrixClient, RoomState, RoomMember, User, MatrixEvent } from "ma import { KnownMembership } from "matrix-js-sdk/src/types"; import { compare } from "matrix-js-sdk/src/utils"; import { mocked, MockedObject } from "jest-mock"; -import { TooltipProvider } from "@vector-im/compound-web"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; import * as TestUtils from "../../../test-utils"; @@ -93,7 +92,7 @@ describe("MemberList", () => { let prevMember: RoomMember | undefined; for (const tile of memberTiles) { const memberA = prevMember; - const memberB = memberListRoom.currentState.members[tile.getAttribute("title")!.split(" ")[0]]; + const memberB = memberListRoom.currentState.members[tile.getAttribute("aria-label")!.split(" ")[0]]; prevMember = memberB; // just in case an expect fails, set this early if (!memberA) { continue; @@ -231,7 +230,6 @@ describe("MemberList", () => { ref={gatherWrappedRef} /> </SDKContext.Provider>, - { wrapper: TooltipProvider }, ); } @@ -383,7 +381,6 @@ describe("MemberList", () => { roomId={room.roomId} /> </SDKContext.Provider>, - { wrapper: TooltipProvider }, ); }; diff --git a/test/components/views/rooms/MemberTile-test.tsx b/test/components/views/rooms/MemberTile-test.tsx index 555d9f8908..5f96147a50 100644 --- a/test/components/views/rooms/MemberTile-test.tsx +++ b/test/components/views/rooms/MemberTile-test.tsx @@ -21,7 +21,6 @@ import { MatrixClient, RoomMember, Device } from "matrix-js-sdk/src/matrix"; import { UserVerificationStatus, DeviceVerificationStatus } from "matrix-js-sdk/src/crypto-api"; import { mocked } from "jest-mock"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import * as TestUtils from "../../../test-utils"; import MemberTile from "../../../../src/components/views/rooms/MemberTile"; @@ -37,7 +36,7 @@ describe("MemberTile", () => { }); it("should not display an E2EIcon when the e2E status = normal", () => { - const { container } = render(<MemberTile member={member} />, { wrapper: TooltipProvider }); + const { container } = render(<MemberTile member={member} />); expect(container).toMatchSnapshot(); }); @@ -48,7 +47,7 @@ describe("MemberTile", () => { wasCrossSigningVerified: jest.fn().mockReturnValue(true), } as unknown as UserVerificationStatus); - const { container } = render(<MemberTile member={member} />, { wrapper: TooltipProvider }); + const { container } = render(<MemberTile member={member} />); expect(container).toMatchSnapshot(); await waitFor(async () => { @@ -72,7 +71,7 @@ describe("MemberTile", () => { crossSigningVerified: true, } as DeviceVerificationStatus); - const { container } = render(<MemberTile member={member} />, { wrapper: TooltipProvider }); + const { container } = render(<MemberTile member={member} />); expect(container).toMatchSnapshot(); await waitFor(async () => { diff --git a/test/components/views/rooms/MessageComposer-test.tsx b/test/components/views/rooms/MessageComposer-test.tsx index f8c6fa159a..1aea150a8c 100644 --- a/test/components/views/rooms/MessageComposer-test.tsx +++ b/test/components/views/rooms/MessageComposer-test.tsx @@ -18,7 +18,6 @@ import * as React from "react"; import { EventType, MatrixEvent, Room, RoomMember, THREAD_RELATION_TYPE } from "matrix-js-sdk/src/matrix"; import { act, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { TooltipProvider } from "@vector-im/compound-web"; import { clearAllModals, @@ -514,7 +513,6 @@ function wrapAndRender( <MessageComposer {...defaultProps} {...props} /> </RoomContext.Provider> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ), roomContext, }; diff --git a/test/components/views/rooms/MessageComposerButtons-test.tsx b/test/components/views/rooms/MessageComposerButtons-test.tsx index 2ddd8d9b01..21abb2b9c7 100644 --- a/test/components/views/rooms/MessageComposerButtons-test.tsx +++ b/test/components/views/rooms/MessageComposerButtons-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { render, screen } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import RoomContext from "../../../../src/contexts/RoomContext"; @@ -82,7 +82,7 @@ describe("MessageComposerButtons", () => { expect(getButtonLabels()).toEqual(["Emoji", "Attachment", "More options"]); }); - it("Renders other buttons in menu in wide mode", () => { + it("Renders other buttons in menu in wide mode", async () => { wrapAndRender( <MessageComposerButtons {...mockProps} @@ -94,12 +94,16 @@ describe("MessageComposerButtons", () => { false, ); - expect(getButtonLabels()).toEqual([ - "Emoji", - "Attachment", - "More options", - ["Sticker", "Voice Message", "Poll", "Location"], - ]); + // The location code is lazy loaded, so the button will take a little while + // to appear, so we need to wait. + await waitFor(() => { + expect(getButtonLabels()).toEqual([ + "Emoji", + "Attachment", + "More options", + ["Sticker", "Voice Message", "Poll", "Location"], + ]); + }); }); it("Renders only some buttons in narrow mode", () => { diff --git a/test/components/views/rooms/RoomHeader-test.tsx b/test/components/views/rooms/RoomHeader-test.tsx index e215775a0d..21a5cccf2b 100644 --- a/test/components/views/rooms/RoomHeader-test.tsx +++ b/test/components/views/rooms/RoomHeader-test.tsx @@ -40,7 +40,6 @@ import { waitFor, } from "@testing-library/react"; import { ViewRoomOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle"; -import { TooltipProvider } from "@vector-im/compound-web"; import { filterConsole, mkEvent, stubClient } from "../../../test-utils"; import RoomHeader from "../../../../src/components/views/rooms/RoomHeader"; @@ -67,11 +66,7 @@ jest.mock("../../../../src/utils/ShieldUtils"); function getWrapper(): RenderOptions { return { wrapper: ({ children }) => ( - <TooltipProvider> - <MatrixClientContext.Provider value={MatrixClientPeg.safeGet()}> - {children} - </MatrixClientContext.Provider> - </TooltipProvider> + <MatrixClientContext.Provider value={MatrixClientPeg.safeGet()}>{children}</MatrixClientContext.Provider> ), }; } diff --git a/test/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx b/test/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx index 465a4b6770..24524b6587 100644 --- a/test/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx +++ b/test/components/views/rooms/RoomHeader/CallGuestLinkButton-test.tsx @@ -15,7 +15,6 @@ limitations under the License. */ import React from "react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { fireEvent, getByLabelText, getByText, render, screen, waitFor } from "@testing-library/react"; import { EventTimeline, JoinRule, Room } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; @@ -75,11 +74,7 @@ describe("<CallGuestLinkButton />", () => { const getComponent = (room: Room) => render(<CallGuestLinkButton room={room} />, { - wrapper: ({ children }) => ( - <SDKContext.Provider value={sdkContext}> - <TooltipProvider>{children}</TooltipProvider> - </SDKContext.Provider> - ), + wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider>, }); const oldGet = SdkConfig.get; @@ -225,11 +220,7 @@ describe("<CallGuestLinkButton />", () => { const getComponent = (room: Room, canInvite: boolean = true) => render(<JoinRuleDialog room={room} canInvite={canInvite} onFinished={onFinished} />, { - wrapper: ({ children }) => ( - <SDKContext.Provider value={sdkContext}> - <TooltipProvider>{children}</TooltipProvider> - </SDKContext.Provider> - ), + wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider>, }); beforeEach(() => { diff --git a/test/components/views/rooms/RoomHeader/VideoRoomChatButton-test.tsx b/test/components/views/rooms/RoomHeader/VideoRoomChatButton-test.tsx index 222da72764..daf075ce8e 100644 --- a/test/components/views/rooms/RoomHeader/VideoRoomChatButton-test.tsx +++ b/test/components/views/rooms/RoomHeader/VideoRoomChatButton-test.tsx @@ -18,7 +18,6 @@ import React from "react"; import { MockedObject } from "jest-mock"; import { Room } from "matrix-js-sdk/src/matrix"; import { fireEvent, render, screen } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { VideoRoomChatButton } from "../../../../../src/components/views/rooms/RoomHeader/VideoRoomChatButton"; import { SDKContext, SdkContextClass } from "../../../../../src/contexts/SDKContext"; @@ -57,11 +56,7 @@ describe("<VideoRoomChatButton />", () => { const getComponent = (room: Room) => render(<VideoRoomChatButton room={room} />, { - wrapper: ({ children }) => ( - <SDKContext.Provider value={sdkContext}> - <TooltipProvider>{children}</TooltipProvider> - </SDKContext.Provider> - ), + wrapper: ({ children }) => <SDKContext.Provider value={sdkContext}>{children}</SDKContext.Provider>, }); beforeEach(() => { diff --git a/test/components/views/rooms/RoomHeader/__snapshots__/VideoRoomChatButton-test.tsx.snap b/test/components/views/rooms/RoomHeader/__snapshots__/VideoRoomChatButton-test.tsx.snap index 74fa81087a..5595295dae 100644 --- a/test/components/views/rooms/RoomHeader/__snapshots__/VideoRoomChatButton-test.tsx.snap +++ b/test/components/views/rooms/RoomHeader/__snapshots__/VideoRoomChatButton-test.tsx.snap @@ -5,7 +5,6 @@ exports[`<VideoRoomChatButton /> renders button with an unread marker when room aria-label="Chat" class="_icon-button_16nk7_17" data-indicator="default" - data-state="closed" role="button" style="--cpd-icon-button-size: 32px;" tabindex="0" diff --git a/test/components/views/rooms/RoomList-test.tsx b/test/components/views/rooms/RoomList-test.tsx index d5daa43d5c..d92b25e347 100644 --- a/test/components/views/rooms/RoomList-test.tsx +++ b/test/components/views/rooms/RoomList-test.tsx @@ -20,7 +20,6 @@ import { cleanup, queryByRole, render, screen, within } from "@testing-library/r import userEvent from "@testing-library/user-event"; import { mocked } from "jest-mock"; import { Room } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import RoomList from "../../../../src/components/views/rooms/RoomList"; import ResizeNotifier from "../../../../src/utils/ResizeNotifier"; @@ -56,18 +55,16 @@ describe("RoomList", () => { function getComponent(props: Partial<ComponentProps<typeof RoomList>> = {}): JSX.Element { return ( - <TooltipProvider> - <RoomList - onKeyDown={jest.fn()} - onFocus={jest.fn()} - onBlur={jest.fn()} - onResize={jest.fn()} - resizeNotifier={new ResizeNotifier()} - isMinimized={false} - activeSpace={MetaSpace.Home} - {...props} - /> - </TooltipProvider> + <RoomList + onKeyDown={jest.fn()} + onFocus={jest.fn()} + onBlur={jest.fn()} + onResize={jest.fn()} + resizeNotifier={new ResizeNotifier()} + isMinimized={false} + activeSpace={MetaSpace.Home} + {...props} + /> ); } diff --git a/test/components/views/rooms/__snapshots__/MemberTile-test.tsx.snap b/test/components/views/rooms/__snapshots__/MemberTile-test.tsx.snap index f40db566bb..b5d7b87a7e 100644 --- a/test/components/views/rooms/__snapshots__/MemberTile-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/MemberTile-test.tsx.snap @@ -4,10 +4,10 @@ exports[`MemberTile should display an verified E2EIcon when the e2E status = Ver <div> <div> <div + aria-label="@userId:matrix.org (power 0)" class="mx_AccessibleButton mx_EntityTile mx_EntityTile_offline_neveractive" role="button" tabindex="0" - title="@userId:matrix.org (power 0)" > <div class="mx_EntityTile_avatar" @@ -57,10 +57,10 @@ exports[`MemberTile should display an warning E2EIcon when the e2E status = Warn <div> <div> <div + aria-label="@userId:matrix.org (power 0)" class="mx_AccessibleButton mx_EntityTile mx_EntityTile_offline_neveractive" role="button" tabindex="0" - title="@userId:matrix.org (power 0)" > <div class="mx_EntityTile_avatar" @@ -110,10 +110,10 @@ exports[`MemberTile should not display an E2EIcon when the e2E status = normal 1 <div> <div> <div + aria-label="@userId:matrix.org (power 0)" class="mx_AccessibleButton mx_EntityTile mx_EntityTile_offline_neveractive" role="button" tabindex="0" - title="@userId:matrix.org (power 0)" > <div class="mx_EntityTile_avatar" diff --git a/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap b/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap index c2af46d187..b840382b4b 100644 --- a/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap +++ b/test/components/views/rooms/__snapshots__/RoomHeader-test.tsx.snap @@ -55,16 +55,13 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` class="_indicator-icon_133tf_26" style="--cpd-icon-button-size: 100%; --cpd-color-icon-tertiary: var(--cpd-color-icon-disabled);" > - <div - data-state="closed" - /> + <div /> </div> </button> <button aria-disabled="true" aria-label="There's no one here to call" class="_icon-button_16nk7_17" - data-state="closed" role="button" style="--cpd-icon-button-size: 32px;" tabindex="0" @@ -79,7 +76,6 @@ exports[`RoomHeader does not show the face pile for DMs 1`] = ` <button aria-label="Threads" class="_icon-button_16nk7_17" - data-state="closed" role="button" style="--cpd-icon-button-size: 32px;" tabindex="0" diff --git a/test/components/views/rooms/wysiwyg_composer/components/FormattingButtons-test.tsx b/test/components/views/rooms/wysiwyg_composer/components/FormattingButtons-test.tsx index 1e41b57162..6055d6bab7 100644 --- a/test/components/views/rooms/wysiwyg_composer/components/FormattingButtons-test.tsx +++ b/test/components/views/rooms/wysiwyg_composer/components/FormattingButtons-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { cleanup, render, screen } from "@testing-library/react"; +import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { ActionState, ActionTypes, AllActionStates, FormattingFunctions } from "@matrix-org/matrix-wysiwyg"; @@ -135,7 +135,7 @@ describe("FormattingButtons", () => { const { label } = testCase; await userEvent.hover(screen.getByLabelText(label)); - expect(screen.getByText(label)).toBeInTheDocument(); + await waitFor(() => expect(screen.getByText(label)).toBeInTheDocument()); } }); diff --git a/test/components/views/settings/Notifications-test.tsx b/test/components/views/settings/Notifications-test.tsx index b12cf9239e..24a23832c1 100644 --- a/test/components/views/settings/Notifications-test.tsx +++ b/test/components/views/settings/Notifications-test.tsx @@ -30,7 +30,7 @@ import { ThreepidMedium, } from "matrix-js-sdk/src/matrix"; import { randomString } from "matrix-js-sdk/src/randomstring"; -import { act, fireEvent, getByTestId, render, screen, within } from "@testing-library/react"; +import { act, fireEvent, getByTestId, render, screen, waitFor, within } from "@testing-library/react"; import { mocked } from "jest-mock"; import userEvent from "@testing-library/user-event"; @@ -907,6 +907,7 @@ describe("<Notifications />", () => { fireEvent.click(clearNotificationEl); expect(clearNotificationEl.className).toContain("mx_AccessibleButton_disabled"); + await waitFor(() => expect(clearNotificationEl.className).not.toContain("mx_AccessibleButton_disabled")); expect(mockClient.sendReadReceipt).toHaveBeenCalled(); }); }); diff --git a/test/components/views/settings/devices/FilteredDeviceList-test.tsx b/test/components/views/settings/devices/FilteredDeviceList-test.tsx index 53d24de422..c37ea61228 100644 --- a/test/components/views/settings/devices/FilteredDeviceList-test.tsx +++ b/test/components/views/settings/devices/FilteredDeviceList-test.tsx @@ -16,7 +16,6 @@ limitations under the License. import React, { ComponentProps } from "react"; import { act, fireEvent, render } from "@testing-library/react"; -import { TooltipProvider } from "@vector-im/compound-web"; import { FilteredDeviceList } from "../../../../../src/components/views/settings/devices/FilteredDeviceList"; import { DeviceSecurityVariation } from "../../../../../src/components/views/settings/devices/types"; @@ -82,11 +81,7 @@ describe("<FilteredDeviceList />", () => { supportsMSC3881: true, }; - const getComponent = (props = {}) => ( - <TooltipProvider> - <FilteredDeviceList {...defaultProps} {...props} /> - </TooltipProvider> - ); + const getComponent = (props = {}) => <FilteredDeviceList {...defaultProps} {...props} />; afterAll(() => { jest.spyOn(global.Date, "now").mockRestore(); diff --git a/test/components/views/settings/devices/FilteredDeviceListHeader-test.tsx b/test/components/views/settings/devices/FilteredDeviceListHeader-test.tsx index 18649a3f49..05380493d3 100644 --- a/test/components/views/settings/devices/FilteredDeviceListHeader-test.tsx +++ b/test/components/views/settings/devices/FilteredDeviceListHeader-test.tsx @@ -16,7 +16,6 @@ limitations under the License. import { fireEvent, render } from "@testing-library/react"; import React from "react"; -import { TooltipProvider } from "@vector-im/compound-web"; import FilteredDeviceListHeader from "../../../../../src/components/views/settings/devices/FilteredDeviceListHeader"; @@ -28,11 +27,7 @@ describe("<FilteredDeviceListHeader />", () => { children: <div>test</div>, ["data-testid"]: "test123", }; - const getComponent = (props = {}) => ( - <TooltipProvider> - <FilteredDeviceListHeader {...defaultProps} {...props} /> - </TooltipProvider> - ); + const getComponent = (props = {}) => <FilteredDeviceListHeader {...defaultProps} {...props} />; it("renders correctly when no devices are selected", () => { const { container } = render(getComponent()); diff --git a/test/components/views/settings/devices/LoginWithQR-test.tsx b/test/components/views/settings/devices/LoginWithQR-test.tsx index cdbb46a8b6..7a1a269064 100644 --- a/test/components/views/settings/devices/LoginWithQR-test.tsx +++ b/test/components/views/settings/devices/LoginWithQR-test.tsx @@ -20,7 +20,8 @@ import React from "react"; import { MSC3906Rendezvous, RendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; import { HTTPError, LoginTokenPostResponse } from "matrix-js-sdk/src/matrix"; -import LoginWithQR, { Click, Mode, Phase } from "../../../../../src/components/views/auth/LoginWithQR"; +import LoginWithQR from "../../../../../src/components/views/auth/LoginWithQR"; +import { Click, Mode, Phase } from "../../../../../src/components/views/auth/LoginWithQR-types"; import type { MatrixClient } from "matrix-js-sdk/src/matrix"; jest.mock("matrix-js-sdk/src/rendezvous"); diff --git a/test/components/views/settings/devices/LoginWithQRFlow-test.tsx b/test/components/views/settings/devices/LoginWithQRFlow-test.tsx index 614a8d3ffd..21863c84a4 100644 --- a/test/components/views/settings/devices/LoginWithQRFlow-test.tsx +++ b/test/components/views/settings/devices/LoginWithQRFlow-test.tsx @@ -19,12 +19,8 @@ import React from "react"; import { RendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; import LoginWithQRFlow from "../../../../../src/components/views/auth/LoginWithQRFlow"; -import { - Click, - Phase, - LoginWithQRFailureReason, - FailureReason, -} from "../../../../../src/components/views/auth/LoginWithQR"; +import { LoginWithQRFailureReason, FailureReason } from "../../../../../src/components/views/auth/LoginWithQR"; +import { Click, Phase } from "../../../../../src/components/views/auth/LoginWithQR-types"; describe("<LoginWithQRFlow />", () => { const onClick = jest.fn(); diff --git a/test/components/views/settings/devices/__snapshots__/CurrentDeviceSection-test.tsx.snap b/test/components/views/settings/devices/__snapshots__/CurrentDeviceSection-test.tsx.snap index a1b700c003..93f53a7ece 100644 --- a/test/components/views/settings/devices/__snapshots__/CurrentDeviceSection-test.tsx.snap +++ b/test/components/views/settings/devices/__snapshots__/CurrentDeviceSection-test.tsx.snap @@ -139,6 +139,7 @@ exports[`<CurrentDeviceSection /> handles when device is falsy 1`] = ` aria-disabled="true" aria-expanded="false" aria-haspopup="true" + aria-label="Options" class="mx_AccessibleButton mx_AccessibleButton_disabled" data-testid="current-session-menu" disabled="" @@ -174,6 +175,7 @@ exports[`<CurrentDeviceSection /> renders device and correct security card when <div aria-expanded="false" aria-haspopup="true" + aria-label="Options" class="mx_AccessibleButton" data-testid="current-session-menu" role="button" @@ -317,6 +319,7 @@ exports[`<CurrentDeviceSection /> renders device and correct security card when <div aria-expanded="false" aria-haspopup="true" + aria-label="Options" class="mx_AccessibleButton" data-testid="current-session-menu" role="button" diff --git a/test/components/views/settings/devices/__snapshots__/FilteredDeviceListHeader-test.tsx.snap b/test/components/views/settings/devices/__snapshots__/FilteredDeviceListHeader-test.tsx.snap index 8f9e0bb411..dfb8db616b 100644 --- a/test/components/views/settings/devices/__snapshots__/FilteredDeviceListHeader-test.tsx.snap +++ b/test/components/views/settings/devices/__snapshots__/FilteredDeviceListHeader-test.tsx.snap @@ -7,7 +7,6 @@ exports[`<FilteredDeviceListHeader /> renders correctly when all devices are sel data-testid="test123" > <span - data-state="closed" tabindex="0" > <span @@ -52,7 +51,6 @@ exports[`<FilteredDeviceListHeader /> renders correctly when no devices are sele data-testid="test123" > <span - data-state="closed" tabindex="0" > <span diff --git a/test/components/views/settings/devices/__snapshots__/LoginWithQRFlow-test.tsx.snap b/test/components/views/settings/devices/__snapshots__/LoginWithQRFlow-test.tsx.snap index 953e28635e..0698d0363f 100644 --- a/test/components/views/settings/devices/__snapshots__/LoginWithQRFlow-test.tsx.snap +++ b/test/components/views/settings/devices/__snapshots__/LoginWithQRFlow-test.tsx.snap @@ -3,19 +3,28 @@ exports[`<LoginWithQRFlow /> errors renders data_mismatch 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Something went wrong! + </h1> <p data-testid="cancellation-message" > - The request was cancelled. + An unexpected error occurred. The request to connect your other device has been cancelled. </p> </div> <div @@ -45,19 +54,28 @@ exports[`<LoginWithQRFlow /> errors renders data_mismatch 1`] = ` exports[`<LoginWithQRFlow /> errors renders expired 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + The sign in was not completed in time + </h1> <p data-testid="cancellation-message" > - The linking wasn't completed in the required time. + Sign in expired. Please try again. </p> </div> <div @@ -87,19 +105,28 @@ exports[`<LoginWithQRFlow /> errors renders expired 1`] = ` exports[`<LoginWithQRFlow /> errors renders homeserver_lacks_support 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Other device not compatible + </h1> <p data-testid="cancellation-message" > - The homeserver doesn't support signing in another device. + This device does not support signing in to the other device with a QR code. </p> </div> <div @@ -129,20 +156,42 @@ exports[`<LoginWithQRFlow /> errors renders homeserver_lacks_support 1`] = ` exports[`<LoginWithQRFlow /> errors renders invalid_code 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > - <p + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Connection not secure + </h1> + A secure connection could not be made to the new device. Your existing devices are still safe and you don't need to worry about them. + <h2 + class="_typography_yh5dq_162 _font-body-lg-semibold_yh5dq_83" data-testid="cancellation-message" > - The scanned code is invalid. - </p> + Now what? + </h2> + <ol> + <li> + Try signing in to the other device again with a QR code in case this was a network problem + </li> + <li> + If you encounter the same problem, try a different wifi network or use your mobile data instead of wifi + </li> + <li> + If that doesn't work, sign in manually + </li> + </ol> </div> <div class="mx_LoginWithQR_buttons" @@ -171,19 +220,28 @@ exports[`<LoginWithQRFlow /> errors renders invalid_code 1`] = ` exports[`<LoginWithQRFlow /> errors renders other_device_already_signed_in 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Your other device is already signed in + </h1> <p data-testid="cancellation-message" > - The other device is already signed in. + You don’t need to do anything else. </p> </div> <div @@ -213,19 +271,28 @@ exports[`<LoginWithQRFlow /> errors renders other_device_already_signed_in 1`] = exports[`<LoginWithQRFlow /> errors renders other_device_not_signed_in 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Something went wrong! + </h1> <p data-testid="cancellation-message" > - The other device isn't signed in. + An unexpected error occurred. The request to connect your other device has been cancelled. </p> </div> <div @@ -255,15 +322,24 @@ exports[`<LoginWithQRFlow /> errors renders other_device_not_signed_in 1`] = ` exports[`<LoginWithQRFlow /> errors renders rate_limited 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Something went wrong! + </h1> <p data-testid="cancellation-message" > @@ -297,19 +373,28 @@ exports[`<LoginWithQRFlow /> errors renders rate_limited 1`] = ` exports[`<LoginWithQRFlow /> errors renders unknown 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Something went wrong! + </h1> <p data-testid="cancellation-message" > - An unexpected error occurred. + An unexpected error occurred. The request to connect your other device has been cancelled. </p> </div> <div @@ -339,19 +424,28 @@ exports[`<LoginWithQRFlow /> errors renders unknown 1`] = ` exports[`<LoginWithQRFlow /> errors renders unsupported_algorithm 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Other device not compatible + </h1> <p data-testid="cancellation-message" > - Linking with this device is not supported. + This device does not support signing in to the other device with a QR code. </p> </div> <div @@ -381,19 +475,28 @@ exports[`<LoginWithQRFlow /> errors renders unsupported_algorithm 1`] = ` exports[`<LoginWithQRFlow /> errors renders unsupported_transport 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Other device not compatible + </h1> <p data-testid="cancellation-message" > - The request was cancelled. + This device does not support signing in to the other device with a QR code. </p> </div> <div @@ -423,19 +526,28 @@ exports[`<LoginWithQRFlow /> errors renders unsupported_transport 1`] = ` exports[`<LoginWithQRFlow /> errors renders user_cancelled 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Sign in request cancelled + </h1> <p data-testid="cancellation-message" > - The request was cancelled. + The sign in was cancelled on the other device. </p> </div> <div @@ -465,19 +577,28 @@ exports[`<LoginWithQRFlow /> errors renders user_cancelled 1`] = ` exports[`<LoginWithQRFlow /> errors renders user_declined 1`] = ` <div> <div - class="mx_LoginWithQR" + class="mx_LoginWithQR mx_LoginWithQR_error" data-testid="login-with-qr" > - <div - class="mx_LoginWithQR_centreTitle" - /> <div class="mx_LoginWithQR_main" > + <div + class="mx_LoginWithQR_icon mx_LoginWithQR_icon--critical" + > + <div + width="32px" + /> + </div> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > + Sign in declined + </h1> <p data-testid="cancellation-message" > - The request was declined on the other device. + You declined the request from your other device to sign in. </p> </div> <div @@ -511,33 +632,31 @@ exports[`<LoginWithQRFlow /> renders QR code 1`] = ` data-testid="login-with-qr" > <div - class="" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div class="mx_LoginWithQR_main" > - <h1> + <h1 + class="_typography_yh5dq_162 _font-heading-sm-semibold_yh5dq_102" + > Scan the QR code with another device </h1> <div @@ -561,7 +680,7 @@ exports[`<LoginWithQRFlow /> renders QR code 1`] = ` <span> Select " <b> - Scan QR code + Sign in with QR code </b> " </span> @@ -570,7 +689,7 @@ exports[`<LoginWithQRFlow /> renders QR code 1`] = ` Point the camera at the QR code shown here </li> <li> - Follow the remaining instructions to verify your other device + Follow the instructions to link your other device </li> </ol> </div> @@ -587,9 +706,6 @@ exports[`<LoginWithQRFlow /> renders code when connected 1`] = ` class="mx_LoginWithQR" data-testid="login-with-qr" > - <div - class="" - /> <div class="mx_LoginWithQR_main" > @@ -616,20 +732,20 @@ exports[`<LoginWithQRFlow /> renders code when connected 1`] = ` class="mx_LoginWithQR_buttons" > <div - class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline" - data-testid="decline-login-button" + class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary" + data-testid="approve-login-button" role="button" tabindex="0" > - Cancel + Approve </div> <div - class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary" - data-testid="approve-login-button" + class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline" + data-testid="decline-login-button" role="button" tabindex="0" > - Approve + Cancel </div> </div> </div> @@ -643,27 +759,23 @@ exports[`<LoginWithQRFlow /> renders spinner while connecting 1`] = ` data-testid="login-with-qr" > <div - class="" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div @@ -713,27 +825,23 @@ exports[`<LoginWithQRFlow /> renders spinner while loading 1`] = ` data-testid="login-with-qr" > <div - class="" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div @@ -771,27 +879,23 @@ exports[`<LoginWithQRFlow /> renders spinner while signing in 1`] = ` data-testid="login-with-qr" > <div - class="" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div @@ -841,27 +945,23 @@ exports[`<LoginWithQRFlow /> renders spinner while verifying 1`] = ` data-testid="login-with-qr" > <div - class="mx_LoginWithQR_centreTitle" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div @@ -902,27 +1002,23 @@ exports[`<LoginWithQRFlow /> renders spinner whilst QR generating 1`] = ` data-testid="login-with-qr" > <div - class="" + class="mx_LoginWithQR_heading" > <div - class="mx_LoginWithQR_heading" + aria-label="Back" + class="mx_AccessibleButton mx_LoginWithQR_BackButton" + data-testid="back-button" + role="button" + tabindex="0" > - <div - class="mx_AccessibleButton mx_LoginWithQR_BackButton" - data-testid="back-button" - role="button" - tabindex="0" - title="Back" - > - <div /> - </div> - <div - class="mx_LoginWithQR_breadcrumbs" - > - Sessions - / - Link new device - </div> + <div /> + </div> + <div + class="mx_LoginWithQR_breadcrumbs" + > + Sessions + / + Link new device </div> </div> <div diff --git a/test/components/views/settings/notifications/__snapshots__/Notifications2-test.tsx.snap b/test/components/views/settings/notifications/__snapshots__/Notifications2-test.tsx.snap index 84b9188a7c..bb945a5024 100644 --- a/test/components/views/settings/notifications/__snapshots__/Notifications2-test.tsx.snap +++ b/test/components/views/settings/notifications/__snapshots__/Notifications2-test.tsx.snap @@ -8,11 +8,6 @@ exports[`<Notifications /> correctly handles the loading/disabled state 1`] = ` <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Notifications - </h2> <div class="mx_SettingsSection_subSections" > @@ -781,11 +776,6 @@ exports[`<Notifications /> matches the snapshot 1`] = ` <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Notifications - </h2> <div class="mx_SettingsSection_subSections" > diff --git a/test/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap index 81347ce2a6..dc6f7fe4fc 100644 --- a/test/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/room/__snapshots__/PeopleRoomSettingsTab-test.tsx.snap @@ -68,10 +68,10 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests fully 1`] </div> </div> <div + aria-label="Deny" class="mx_AccessibleButton mx_PeopleRoomSettingsTab_action mx_AccessibleButton_hasKind mx_AccessibleButton_kind_icon_primary_outline" role="button" tabindex="0" - title="Deny" > <div height="18" @@ -79,10 +79,10 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests fully 1`] /> </div> <div + aria-label="Approve" class="mx_AccessibleButton mx_PeopleRoomSettingsTab_action mx_AccessibleButton_hasKind mx_AccessibleButton_kind_icon_primary" role="button" tabindex="0" - title="Approve" > <div height="18" @@ -135,10 +135,10 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests reduced 1` </span> </div> <div + aria-label="Deny" class="mx_AccessibleButton mx_PeopleRoomSettingsTab_action mx_AccessibleButton_hasKind mx_AccessibleButton_kind_icon_primary_outline" role="button" tabindex="0" - title="Deny" > <div height="18" @@ -146,10 +146,10 @@ exports[`PeopleRoomSettingsTab with requests to join renders requests reduced 1` /> </div> <div + aria-label="Approve" class="mx_AccessibleButton mx_PeopleRoomSettingsTab_action mx_AccessibleButton_hasKind mx_AccessibleButton_kind_icon_primary" role="button" tabindex="0" - title="Approve" > <div height="18" diff --git a/test/components/views/settings/tabs/user/LabsUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/LabsUserSettingsTab-test.tsx index fd9a92a225..18622d87a1 100644 --- a/test/components/views/settings/tabs/user/LabsUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/LabsUserSettingsTab-test.tsx @@ -15,7 +15,8 @@ limitations under the License. */ import React from "react"; -import { fireEvent, render, screen } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import LabsUserSettingsTab from "../../../../../../src/components/views/settings/tabs/user/LabsUserSettingsTab"; import SettingsStore from "../../../../../../src/settings/SettingsStore"; @@ -60,7 +61,7 @@ describe("<LabsUserSettingsTab />", () => { // non-beta labs section expect(screen.getByText("Early previews")).toBeInTheDocument(); const labsSections = container.getElementsByClassName("mx_SettingsSubsection"); - expect(labsSections).toHaveLength(11); + expect(labsSections).toHaveLength(10); }); describe("Rust crypto setting", () => { @@ -113,12 +114,14 @@ describe("<LabsUserSettingsTab />", () => { expect(toggle.getAttribute("aria-checked")).toEqual("true"); // Hover over the toggle to make it show the tooltip - fireEvent.mouseOver(toggle); - - const tooltip = rendered.getByRole("tooltip"); - expect(tooltip).toHaveTextContent( - "Once enabled, Rust cryptography can only be disabled by logging out and in again", - ); + await userEvent.hover(toggle); + + await waitFor(() => { + const tooltip = screen.getByRole("tooltip"); + expect(tooltip).toHaveTextContent( + "Once enabled, Rust cryptography can only be disabled by logging out and in again", + ); + }); }); }); @@ -150,12 +153,14 @@ describe("<LabsUserSettingsTab />", () => { expect(toggle.getAttribute("aria-checked")).toEqual("true"); // Hover over the toggle to make it show the tooltip - fireEvent.mouseOver(toggle); - - const tooltip = rendered.getByRole("tooltip"); - expect(tooltip).toHaveTextContent( - "Rust cryptography cannot be disabled on this deployment of BrandedClient", - ); + await userEvent.hover(toggle); + + await waitFor(() => { + const tooltip = rendered.getByRole("tooltip"); + expect(tooltip).toHaveTextContent( + "Rust cryptography cannot be disabled on this deployment of BrandedClient", + ); + }); }); }); }); diff --git a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx index 13992b8e15..f62515d04b 100644 --- a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -36,7 +36,6 @@ import { MatrixClient, } from "matrix-js-sdk/src/matrix"; import { mocked, MockedObject } from "jest-mock"; -import { TooltipProvider } from "@vector-im/compound-web"; import { clearAllModals, @@ -129,11 +128,9 @@ describe("<SessionManagerTab />", () => { const defaultProps = {}; const getComponent = (props = {}): React.ReactElement => ( - <TooltipProvider> - <SDKContext.Provider value={sdkContext}> - <SessionManagerTab {...defaultProps} {...props} /> - </SDKContext.Provider> - </TooltipProvider> + <SDKContext.Provider value={sdkContext}> + <SessionManagerTab {...defaultProps} {...props} /> + </SDKContext.Provider> ); const toggleDeviceDetails = ( diff --git a/test/components/views/settings/tabs/user/__snapshots__/AppearanceUserSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/AppearanceUserSettingsTab-test.tsx.snap index f4a0c9100e..b2ab3a6e83 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/AppearanceUserSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/AppearanceUserSettingsTab-test.tsx.snap @@ -12,19 +12,9 @@ exports[`AppearanceUserSettingsTab should render 1`] = ` <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Customise your appearance - </h2> <div class="mx_SettingsSection_subSections" > - <div - class="mx_SettingsSubsection_text" - > - Appearance Settings only affect this Element session. - </div> <div class="mx_SettingsSubsection" data-testid="mx_ThemeChoicePanel" diff --git a/test/components/views/settings/tabs/user/__snapshots__/KeyboardUserSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/KeyboardUserSettingsTab-test.tsx.snap index 515126f1fe..6c905d9d3f 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/KeyboardUserSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/KeyboardUserSettingsTab-test.tsx.snap @@ -11,11 +11,6 @@ exports[`KeyboardUserSettingsTab renders list of keyboard shortcuts 1`] = ` <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Keyboard - </h2> <div class="mx_SettingsSection_subSections" > diff --git a/test/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap index e6e2519ab0..4bdaf3275c 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap @@ -11,11 +11,6 @@ exports[`<MjolnirUserSettingsTab /> renders correctly when user has no ignored u <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Ignored users - </h2> <div class="mx_SettingsSection_subSections" > diff --git a/test/components/views/settings/tabs/user/__snapshots__/PreferencesUserSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/PreferencesUserSettingsTab-test.tsx.snap index 45e1999af6..e9050a94da 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/PreferencesUserSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/PreferencesUserSettingsTab-test.tsx.snap @@ -12,11 +12,6 @@ exports[`PreferencesUserSettingsTab should render 1`] = ` <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Preferences - </h2> <div class="mx_SettingsSection_subSections" > diff --git a/test/components/views/settings/tabs/user/__snapshots__/SessionManagerTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/SessionManagerTab-test.tsx.snap index b871fce465..275f4430c7 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/SessionManagerTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/SessionManagerTab-test.tsx.snap @@ -84,6 +84,7 @@ exports[`<SessionManagerTab /> current session section renders current session s <div aria-expanded="false" aria-haspopup="true" + aria-label="Options" class="mx_AccessibleButton" data-testid="current-session-menu" role="button" @@ -213,6 +214,7 @@ exports[`<SessionManagerTab /> current session section renders current session s <div aria-expanded="false" aria-haspopup="true" + aria-label="Options" class="mx_AccessibleButton" data-testid="current-session-menu" role="button" @@ -343,7 +345,6 @@ exports[`<SessionManagerTab /> goes to filtered list from security recommendatio class="mx_FilteredDeviceListHeader" > <span - data-state="closed" tabindex="0" > <span diff --git a/test/components/views/settings/tabs/user/__snapshots__/SidebarUserSettingsTab-test.tsx.snap b/test/components/views/settings/tabs/user/__snapshots__/SidebarUserSettingsTab-test.tsx.snap index c5315e99bc..f098d80e84 100644 --- a/test/components/views/settings/tabs/user/__snapshots__/SidebarUserSettingsTab-test.tsx.snap +++ b/test/components/views/settings/tabs/user/__snapshots__/SidebarUserSettingsTab-test.tsx.snap @@ -11,11 +11,6 @@ exports[`<SidebarUserSettingsTab /> renders sidebar settings with guest spa url <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Sidebar - </h2> <div class="mx_SettingsSection_subSections" > @@ -257,11 +252,6 @@ exports[`<SidebarUserSettingsTab /> renders sidebar settings without guest spa u <div class="mx_SettingsSection" > - <h2 - class="mx_Heading_h3" - > - Sidebar - </h2> <div class="mx_SettingsSection_subSections" > diff --git a/test/components/views/spaces/ThreadsActivityCentre-test.tsx b/test/components/views/spaces/ThreadsActivityCentre-test.tsx index 9cc47c93f1..bf7defc83d 100644 --- a/test/components/views/spaces/ThreadsActivityCentre-test.tsx +++ b/test/components/views/spaces/ThreadsActivityCentre-test.tsx @@ -20,7 +20,6 @@ import React, { ComponentProps } from "react"; import { getByText, render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { NotificationCountType, PendingEventOrdering, Room } from "matrix-js-sdk/src/matrix"; -import { TooltipProvider } from "@vector-im/compound-web"; import { ThreadsActivityCentre } from "../../../../src/components/views/spaces/threads-activity-centre"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; @@ -49,7 +48,6 @@ describe("ThreadsActivityCentre", () => { <MatrixClientContext.Provider value={cli}> <ThreadsActivityCentre {...props} /> </MatrixClientContext.Provider>, - { wrapper: TooltipProvider }, ); }; @@ -120,6 +118,27 @@ describe("ThreadsActivityCentre", () => { expect(document.body).toMatchSnapshot(); }); + it("should render not display the tooltip when the release announcement is displayed", async () => { + // Enable release announcement + await SettingsStore.setValue("feature_release_announcement", null, SettingLevel.DEVICE, true); + + renderTAC(); + + // The tooltip should not be displayed + await userEvent.hover(getTACButton()); + expect(screen.queryByRole("tooltip")).toBeNull(); + }); + + it("should close the release announcement when the TAC button is clicked", async () => { + // Enable release announcement + await SettingsStore.setValue("feature_release_announcement", null, SettingLevel.DEVICE, true); + + renderTAC(); + await userEvent.click(getTACButton()); + expect(getTACMenu()).toBeInTheDocument(); + expect(document.body).toMatchSnapshot(); + }); + it("should render the threads activity centre button and the display label", async () => { renderTAC({ displayButtonLabel: true }); expect(getTACButton()).toBeInTheDocument(); @@ -251,7 +270,6 @@ describe("ThreadsActivityCentre", () => { <ThreadsActivityCentre /> </MatrixClientContext.Provider> </div>, - { wrapper: TooltipProvider }, ); await userEvent.click(getTACButton()); diff --git a/test/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap b/test/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap index 04c3cbf31f..22735eb9e7 100644 --- a/test/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap +++ b/test/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap @@ -16,7 +16,6 @@ exports[`<SpacePanel /> should show all activated MetaSpaces in the correct orde class="mx_AccessibleButton mx_UserMenu_contextMenuButton" role="button" tabindex="0" - title="User menu" > <div class="mx_UserMenu_userAvatar" @@ -226,6 +225,48 @@ exports[`<SpacePanel /> should show all activated MetaSpaces in the correct orde </div> </li> </ul> + <div + class="mx_ThreadsActivityCentre_container" + > + <button + aria-controls="floating-ui-35" + aria-describedby="floating-ui-35" + aria-expanded="true" + aria-haspopup="dialog" + aria-label="Threads" + class="_icon-button_16nk7_17 mx_ThreadsActivityCentreButton" + role="button" + style="--cpd-icon-button-size: 32px;" + tabindex="0" + > + <div + class="_indicator-icon_133tf_26" + style="--cpd-icon-button-size: 100%;" + > + <div + class="mx_ThreadsActivityCentreButton_Icon" + /> + </div> + </button> + <span + data-floating-ui-focus-guard="" + data-type="outside" + role="button" + style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;" + tabindex="0" + /> + <span + aria-owns="undefined" + style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;" + /> + <span + data-floating-ui-focus-guard="" + data-type="outside" + role="button" + style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;" + tabindex="0" + /> + </div> <div aria-expanded="false" aria-label="Quick settings" diff --git a/test/components/views/spaces/__snapshots__/ThreadsActivityCentre-test.tsx.snap b/test/components/views/spaces/__snapshots__/ThreadsActivityCentre-test.tsx.snap index b9e6d5dc3f..d90b992bcb 100644 --- a/test/components/views/spaces/__snapshots__/ThreadsActivityCentre-test.tsx.snap +++ b/test/components/views/spaces/__snapshots__/ThreadsActivityCentre-test.tsx.snap @@ -2,23 +2,23 @@ exports[`ThreadsActivityCentre renders notifications matching the snapshot 1`] = ` <div - aria-labelledby="radix-21" + aria-labelledby="radix-16" aria-orientation="vertical" class="_menu_1x5h1_17" - data-align="end" + data-align="start" data-orientation="vertical" data-radix-menu-content="" - data-side="right" + data-side="top" data-state="open" dir="ltr" - id="radix-22" + id="radix-17" role="menu" style="outline: none; --radix-dropdown-menu-content-transform-origin: var(--radix-popper-transform-origin); --radix-dropdown-menu-content-available-width: var(--radix-popper-available-width); --radix-dropdown-menu-content-available-height: var(--radix-popper-available-height); --radix-dropdown-menu-trigger-width: var(--radix-popper-anchor-width); --radix-dropdown-menu-trigger-height: var(--radix-popper-anchor-height); pointer-events: auto;" tabindex="-1" > <h3 class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 _title_1x5h1_83" - id=":r5:" + id=":r6:" > Threads activity </h3> @@ -125,25 +125,116 @@ exports[`ThreadsActivityCentre renders notifications matching the snapshot 1`] = </div> `; +exports[`ThreadsActivityCentre should close the release announcement when the TAC button is clicked 1`] = ` +<body + data-scroll-locked="" + style="pointer-events: none;" +> + <span + aria-hidden="true" + data-aria-hidden="true" + data-radix-focus-guard="" + style="outline: none; opacity: 0; position: fixed; pointer-events: none;" + tabindex="0" + /> + <div + aria-hidden="true" + data-aria-hidden="true" + > + <div + class="mx_ThreadsActivityCentre_container" + > + <button + aria-controls="radix-3" + aria-disabled="false" + aria-expanded="true" + aria-haspopup="menu" + aria-label="Threads" + class="_icon-button_16nk7_17 mx_ThreadsActivityCentreButton" + data-state="open" + id="radix-2" + role="button" + style="--cpd-icon-button-size: 32px;" + tabindex="0" + type="button" + > + <div + class="_indicator-icon_133tf_26" + style="--cpd-icon-button-size: 100%;" + > + <div + class="mx_ThreadsActivityCentreButton_Icon" + /> + </div> + </button> + </div> + </div> + <div + data-radix-popper-content-wrapper="" + dir="ltr" + style="position: fixed; left: 0px; top: 0px; transform: translate(0px, -8px); min-width: max-content; --radix-popper-available-width: 0px; --radix-popper-available-height: -8px; --radix-popper-anchor-width: 0px; --radix-popper-anchor-height: 0px; --radix-popper-transform-origin: 0% 0px;" + > + <div + aria-labelledby="radix-2" + aria-orientation="vertical" + class="_menu_1x5h1_17" + data-align="start" + data-orientation="vertical" + data-radix-menu-content="" + data-side="top" + data-state="open" + dir="ltr" + id="radix-3" + role="menu" + style="outline: none; --radix-dropdown-menu-content-transform-origin: var(--radix-popper-transform-origin); --radix-dropdown-menu-content-available-width: var(--radix-popper-available-width); --radix-dropdown-menu-content-available-height: var(--radix-popper-available-height); --radix-dropdown-menu-trigger-width: var(--radix-popper-anchor-width); --radix-dropdown-menu-trigger-height: var(--radix-popper-anchor-height); pointer-events: auto;" + tabindex="-1" + > + <h3 + class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 _title_1x5h1_83" + id=":r1:" + > + Threads activity + </h3> + <div + class="mx_ThreadsActivityCentre_rows" + > + <div + class="mx_ThreadsActivityCentre_emptyCaption" + > + You don't have rooms with thread notifications yet. + </div> + </div> + </div> + </div> + <span + aria-hidden="true" + data-aria-hidden="true" + data-radix-focus-guard="" + style="outline: none; opacity: 0; position: fixed; pointer-events: none;" + tabindex="0" + /> +</body> +`; + exports[`ThreadsActivityCentre should match snapshot when empty 1`] = ` <div - aria-labelledby="radix-29" + aria-labelledby="radix-22" aria-orientation="vertical" class="_menu_1x5h1_17" - data-align="end" + data-align="start" data-orientation="vertical" data-radix-menu-content="" - data-side="right" + data-side="top" data-state="open" dir="ltr" - id="radix-30" + id="radix-23" role="menu" style="outline: none; --radix-dropdown-menu-content-transform-origin: var(--radix-popper-transform-origin); --radix-dropdown-menu-content-available-width: var(--radix-popper-available-width); --radix-dropdown-menu-content-available-height: var(--radix-popper-available-height); --radix-dropdown-menu-trigger-width: var(--radix-popper-anchor-width); --radix-dropdown-menu-trigger-height: var(--radix-popper-anchor-height); pointer-events: auto;" tabindex="-1" > <h3 class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 _title_1x5h1_83" - id=":r7:" + id=":r8:" > Threads activity </h3> @@ -161,23 +252,23 @@ exports[`ThreadsActivityCentre should match snapshot when empty 1`] = ` exports[`ThreadsActivityCentre should order the room with the same notification level by most recent 1`] = ` <div - aria-labelledby="radix-32" + aria-labelledby="radix-24" aria-orientation="vertical" class="_menu_1x5h1_17" - data-align="end" + data-align="start" data-orientation="vertical" data-radix-menu-content="" - data-side="right" + data-side="top" data-state="open" dir="ltr" - id="radix-33" + id="radix-25" role="menu" style="outline: none; --radix-dropdown-menu-content-transform-origin: var(--radix-popper-transform-origin); --radix-dropdown-menu-content-available-width: var(--radix-popper-available-width); --radix-dropdown-menu-content-available-height: var(--radix-popper-available-height); --radix-dropdown-menu-trigger-width: var(--radix-popper-anchor-width); --radix-dropdown-menu-trigger-height: var(--radix-popper-anchor-height); pointer-events: auto;" tabindex="-1" > <h3 class="_typography_yh5dq_162 _font-body-sm-semibold_yh5dq_45 _title_1x5h1_83" - id=":r8:" + id=":r9:" > Threads activity </h3> @@ -341,12 +432,12 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` class="mx_ThreadsActivityCentre_container" > <button - aria-controls="floating-ui-3" + aria-controls="floating-ui-6" + aria-describedby="floating-ui-6" aria-expanded="true" aria-haspopup="dialog" aria-label="Threads" class="_icon-button_16nk7_17 mx_ThreadsActivityCentreButton" - data-state="open" role="button" style="--cpd-icon-button-size: 32px;" tabindex="0" @@ -368,7 +459,7 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` tabindex="0" /> <span - aria-owns="undefined" + aria-owns="floating-ui-12" style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: fixed; white-space: nowrap; width: 1px; top: 0px; left: 0px;" /> <span @@ -382,7 +473,7 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` </div> <div data-floating-ui-portal="" - id="undefined" + id="floating-ui-12" > <span data-floating-ui-focus-guard="" @@ -393,10 +484,10 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` tabindex="0" /> <div - aria-describedby="floating-ui-2" - aria-labelledby="floating-ui-1" + aria-describedby="floating-ui-5" + aria-labelledby="floating-ui-4" class="_content_1oa1y_17" - id="floating-ui-3" + id="floating-ui-6" role="dialog" style="position: absolute; left: 0px; top: 0px; transform: translate(0px, 0px);" tabindex="-1" @@ -414,7 +505,7 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` stroke="none" /> <clippath - id="floating-ui-5" + id="floating-ui-13" > <rect height="20" @@ -426,13 +517,13 @@ exports[`ThreadsActivityCentre should render the release announcement 1`] = ` </svg> <h3 class="_typography_yh5dq_162 _font-body-lg-semibold_yh5dq_83 _header_1oa1y_46" - id="floating-ui-1" + id="floating-ui-4" > Threads Activity Centre </h3> <span class="_typography_yh5dq_162 _font-body-sm-regular_yh5dq_40 _description_1oa1y_52" - id="floating-ui-2" + id="floating-ui-5" > Threads notifications have moved, find them here from now on. </span> diff --git a/test/components/views/voip/CallView-test.tsx b/test/components/views/voip/CallView-test.tsx index 2746200a2f..c193ab4e5b 100644 --- a/test/components/views/voip/CallView-test.tsx +++ b/test/components/views/voip/CallView-test.tsx @@ -20,7 +20,6 @@ import { render, screen, act, fireEvent, waitFor, cleanup } from "@testing-libra import { mocked, Mocked } from "jest-mock"; import { MatrixClient, PendingEventOrdering, Room, RoomStateEvent } from "matrix-js-sdk/src/matrix"; import { Widget } from "matrix-widget-api"; -import { TooltipProvider } from "@vector-im/compound-web"; import type { RoomMember } from "matrix-js-sdk/src/matrix"; import type { ClientWidgetApi } from "matrix-widget-api"; @@ -74,9 +73,7 @@ describe("CallView", () => { }); const renderView = async (skipLobby = false): Promise<void> => { - render(<CallView room={room} resizing={false} waitForCall={false} skipLobby={skipLobby} />, { - wrapper: TooltipProvider, - }); + render(<CallView room={room} resizing={false} waitForCall={false} skipLobby={skipLobby} />); await act(() => Promise.resolve()); // Let effects settle }; diff --git a/test/components/views/voip/LegacyCallView/LegacyCallViewButtons-test.tsx b/test/components/views/voip/LegacyCallView/LegacyCallViewButtons-test.tsx new file mode 100644 index 0000000000..5f0541fccf --- /dev/null +++ b/test/components/views/voip/LegacyCallView/LegacyCallViewButtons-test.tsx @@ -0,0 +1,67 @@ +/* + * + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * / + */ + +import React from "react"; +import { render } from "@testing-library/react"; +import { MatrixCall } from "matrix-js-sdk/src/webrtc/call"; + +import LegacyCallViewButtons from "../../../../../src/components/views/voip/LegacyCallView/LegacyCallViewButtons"; +import { createTestClient } from "../../../../test-utils"; + +describe("LegacyCallViewButtons", () => { + const matrixClient = createTestClient(); + const roomId = "test-room-id"; + + const renderButtons = () => { + const call = new MatrixCall({ + client: matrixClient, + roomId, + }); + + return render( + <LegacyCallViewButtons + call={call} + handlers={{ + onScreenshareClick: jest.fn(), + onToggleSidebarClick: jest.fn(), + onHangupClick: jest.fn(), + onMicMuteClick: jest.fn(), + onVidMuteClick: jest.fn(), + }} + buttonsVisibility={{ + vidMute: true, + screensharing: true, + sidebar: true, + contextMenu: true, + dialpad: true, + }} + buttonsState={{ + micMuted: false, + vidMuted: false, + sidebarShown: false, + screensharing: false, + }} + />, + ); + }; + + it("should render the buttons", () => { + const { container } = renderButtons(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/test/components/views/voip/LegacyCallView/__snapshots__/LegacyCallViewButtons-test.tsx.snap b/test/components/views/voip/LegacyCallView/__snapshots__/LegacyCallViewButtons-test.tsx.snap new file mode 100644 index 0000000000..c773177bd2 --- /dev/null +++ b/test/components/views/voip/LegacyCallView/__snapshots__/LegacyCallViewButtons-test.tsx.snap @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LegacyCallViewButtons should render the buttons 1`] = ` +<div> + <div + class="mx_LegacyCallViewButtons" + > + <div + aria-expanded="false" + aria-haspopup="true" + aria-label="Dialpad" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_dialpad" + role="button" + tabindex="0" + /> + <div + aria-label="Mute microphone" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_mic mx_LegacyCallViewButtons_button_on" + role="button" + tabindex="0" + > + <div + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_dropdownButton mx_LegacyCallViewButtons_dropdownButton_collapsed mx_LegacyCallViewButtons_button_on" + role="button" + tabindex="0" + /> + </div> + <div + aria-label="Turn off camera" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_vid mx_LegacyCallViewButtons_button_on" + role="button" + tabindex="0" + > + <div + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_dropdownButton mx_LegacyCallViewButtons_dropdownButton_collapsed mx_LegacyCallViewButtons_button_on" + role="button" + tabindex="0" + /> + </div> + <div + aria-label="Start sharing your screen" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_screensharing mx_LegacyCallViewButtons_button_off" + role="button" + tabindex="0" + /> + <div + aria-label="Show sidebar" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_sidebar mx_LegacyCallViewButtons_button_off" + role="button" + tabindex="0" + /> + <div + aria-expanded="false" + aria-haspopup="true" + aria-label="More" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_more" + role="button" + tabindex="0" + /> + <div + aria-label="Hangup" + class="mx_AccessibleButton mx_LegacyCallViewButtons_button mx_LegacyCallViewButtons_button_hangup" + role="button" + tabindex="0" + /> + </div> +</div> +`; diff --git a/test/settings/controllers/AnalyticsController-test.ts b/test/settings/controllers/AnalyticsController-test.ts new file mode 100644 index 0000000000..69b624994e --- /dev/null +++ b/test/settings/controllers/AnalyticsController-test.ts @@ -0,0 +1,35 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import PosthogTrackers from "../../../src/PosthogTrackers"; +import AnalyticsController from "../../../src/settings/controllers/AnalyticsController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; + +describe("AnalyticsController", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + it("Tracks a Posthog interaction on change", () => { + const trackInteractionSpy = jest.spyOn(PosthogTrackers, "trackInteraction"); + + const controller = new AnalyticsController("WebSettingsNotificationsTACOnlyNotificationsToggle"); + + controller.onChange(SettingLevel.DEVICE, null, false); + + expect(trackInteractionSpy).toHaveBeenCalledWith("WebSettingsNotificationsTACOnlyNotificationsToggle"); + }); +}); diff --git a/test/setupTests.ts b/test/setupTests.ts index fa99913b56..a7044c0474 100644 --- a/test/setupTests.ts +++ b/test/setupTests.ts @@ -37,13 +37,6 @@ beforeEach(() => { }); }); -// Retry to work around our flaky app & tests -if (process.env.CI) { - jest.retryTimes(2, { - logErrorsBeforeRetry: true, - }); -} - // Very carefully enable the mocks for everything else in // a specific order. We use this order to ensure we properly // establish an application state that actually works. diff --git a/test/stores/room-list/MessagePreviewStore-test.ts b/test/stores/room-list/MessagePreviewStore-test.ts index fb6207ed52..5be2c65fd1 100644 --- a/test/stores/room-list/MessagePreviewStore-test.ts +++ b/test/stores/room-list/MessagePreviewStore-test.ts @@ -15,7 +15,16 @@ limitations under the License. */ import { Mocked, mocked } from "jest-mock"; -import { EventTimeline, EventType, MatrixClient, MatrixEvent, RelationType, Room } from "matrix-js-sdk/src/matrix"; +import { + EventStatus, + EventTimeline, + EventType, + MatrixClient, + MatrixEvent, + PendingEventOrdering, + RelationType, + Room, +} from "matrix-js-sdk/src/matrix"; import { MessagePreviewStore } from "../../../src/stores/room-list/MessagePreviewStore"; import { mkEvent, mkMessage, mkReaction, setupAsyncStoreWithClient, stubClient } from "../../test-utils"; @@ -25,6 +34,7 @@ import { mkThread } from "../../test-utils/threads"; describe("MessagePreviewStore", () => { let client: Mocked<MatrixClient>; let room: Room; + let nonRenderedRoom: Room; let store: MessagePreviewStore; async function addEvent( @@ -46,9 +56,35 @@ describe("MessagePreviewStore", () => { } } + async function addPendingEvent( + store: MessagePreviewStore, + room: Room, + event: MatrixEvent, + fireAction = true, + ): Promise<void> { + room.addPendingEvent(event, "txid"); + if (fireAction) { + // @ts-ignore private access + await store.onLocalEchoUpdated(event, room); + } + } + + async function updatePendingEvent(event: MatrixEvent, eventStatus: EventStatus, fireAction = true): Promise<void> { + room.updatePendingEvent(event, eventStatus); + if (fireAction) { + // @ts-ignore private access + await store.onLocalEchoUpdated(event, room); + } + } + beforeEach(async () => { client = mocked(stubClient()); - room = new Room("!roomId:server", client, client.getSafeUserId()); + room = new Room("!roomId:server", client, client.getSafeUserId(), { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + nonRenderedRoom = new Room("!roomId2:server", client, client.getSafeUserId(), { + pendingEventOrdering: PendingEventOrdering.Detached, + }); mocked(client.getRoom).mockReturnValue(room); store = MessagePreviewStore.testInstance(); @@ -126,6 +162,62 @@ describe("MessagePreviewStore", () => { ); }); + it("should not display a redacted edit", async () => { + const firstMessage = mkMessage({ + user: "@sender:server", + event: true, + room: room.roomId, + msg: "First message", + }); + await addEvent(store, room, firstMessage, false); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: First message"`, + ); + + const secondMessage = mkMessage({ + user: "@sender:server", + event: true, + room: room.roomId, + msg: "Second message", + }); + await addEvent(store, room, secondMessage); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: Second message"`, + ); + + const secondMessageEdit = mkEvent({ + event: true, + type: EventType.RoomMessage, + user: "@sender:server", + room: room.roomId, + content: { + "body": "* Second Message Edit", + "m.new_content": { + body: "Second Message Edit", + }, + "m.relates_to": { + rel_type: RelationType.Replace, + event_id: secondMessage.getId()!, + }, + }, + }); + await addEvent(store, room, secondMessageEdit); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: Second Message Edit"`, + ); + + secondMessage.makeRedacted(secondMessage, room); + + await addEvent(store, room, secondMessage); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: First message"`, + ); + }); + it("should ignore edits to unknown events", async () => { await expect(store.getPreviewForRoom(room, DefaultTagID.DM)).resolves.toBeNull(); @@ -230,4 +322,63 @@ describe("MessagePreviewStore", () => { expect(preview?.isThreadReply).toBe(false); expect(preview?.text).toContain("You reacted 🙃 to root event message"); }); + + it("should handle local echos correctly", async () => { + const firstMessage = mkMessage({ + user: "@sender:server", + event: true, + room: room.roomId, + msg: "First message", + }); + + await addEvent(store, room, firstMessage); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: First message"`, + ); + + const secondMessage = mkMessage({ + user: "@sender:server", + event: true, + room: room.roomId, + msg: "Second message", + }); + secondMessage.status = EventStatus.NOT_SENT; + + await addPendingEvent(store, room, secondMessage); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: Second message"`, + ); + + await updatePendingEvent(secondMessage, EventStatus.CANCELLED); + + expect((await store.getPreviewForRoom(room, DefaultTagID.Untagged))?.text).toMatchInlineSnapshot( + `"@sender:server: First message"`, + ); + }); + + it("should not generate previews for rooms not rendered", async () => { + const firstMessage = mkMessage({ + user: "@sender:server", + event: true, + room: nonRenderedRoom.roomId, + msg: "First message", + }); + + await addEvent(store, room, firstMessage); + + const secondMessage = mkMessage({ + user: "@sender:server", + event: true, + room: nonRenderedRoom.roomId, + msg: "Second message", + }); + secondMessage.status = EventStatus.NOT_SENT; + + await addPendingEvent(store, room, secondMessage); + + // @ts-ignore private access + expect(store.previews.has(nonRenderedRoom.roomId)).toBeFalsy(); + }); }); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts index 8a991b0e9c..03dc475d32 100644 --- a/test/test-utils/client.ts +++ b/test/test-utils/client.ts @@ -17,7 +17,7 @@ limitations under the License. import EventEmitter from "events"; import { MethodLikeKeys, mocked, MockedObject, PropertyLikeKeys } from "jest-mock"; import { Feature, ServerSupport } from "matrix-js-sdk/src/feature"; -import { MatrixClient, User } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, Room, User } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from "../../src/MatrixClientPeg"; @@ -173,4 +173,9 @@ export const mockClientMethodsCrypto = (): Partial< getOwnDeviceKeys: jest.fn(), getCrossSigningKeyId: jest.fn(), }), + getDeviceEd25519Key: jest.fn(), +}); + +export const mockClientMethodsRooms = (rooms: Room[] = []): Partial<Record<MethodLikeKeys<MatrixClient>, unknown>> => ({ + getRooms: jest.fn().mockReturnValue(rooms), }); diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index b124af4ad1..41bb04759c 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -271,6 +271,7 @@ export function createTestClient(): MatrixClient { getMediaConfig: jest.fn(), baseUrl: "https://matrix-client.matrix.org", matrixRTC: createStubMatrixRTC(), + isFallbackICEServerAllowed: jest.fn().mockReturnValue(false), } as unknown as MatrixClient; client.reEmitter = new ReEmitter(client); @@ -622,6 +623,7 @@ export function mkStubRoom( getType: jest.fn().mockReturnValue(undefined), getUnfilteredTimelineSet: jest.fn(), getUnreadNotificationCount: jest.fn(() => 0), + getRoomUnreadNotificationCount: jest.fn().mockReturnValue(0), getVersion: jest.fn().mockReturnValue("1"), hasMembershipState: () => false, isElementVideoRoom: jest.fn().mockReturnValue(false), diff --git a/test/utils/StorageAccess-test.ts b/test/utils/StorageAccess-test.ts new file mode 100644 index 0000000000..41042c486d --- /dev/null +++ b/test/utils/StorageAccess-test.ts @@ -0,0 +1,55 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import "core-js/stable/structured-clone"; // for idb access +import "fake-indexeddb/auto"; + +import { idbDelete, idbLoad, idbSave } from "../../src/utils/StorageAccess"; + +const NONEXISTENT_TABLE = "this_is_not_a_table_we_use_ever_and_so_we_can_use_it_in_tests"; +const KNOWN_TABLES = ["account", "pickleKey"]; + +describe("StorageAccess", () => { + it.each(KNOWN_TABLES)("should save, load, and delete from known table '%s'", async (tableName: string) => { + const key = ["a", "b"]; + const data = { hello: "world" }; + + // Should start undefined + let loaded = await idbLoad(tableName, key); + expect(loaded).toBeUndefined(); + + // ... then define a value + await idbSave(tableName, key, data); + + // ... then check that value + loaded = await idbLoad(tableName, key); + expect(loaded).toEqual(data); + + // ... then set it back to undefined + await idbDelete(tableName, key); + + // ... which we then check again + loaded = await idbLoad(tableName, key); + expect(loaded).toBeUndefined(); + }); + + it("should fail to save, load, and delete from a non-existent table", async () => { + // Regardless of validity on the key/data, or write order, these should all fail. + await expect(() => idbSave(NONEXISTENT_TABLE, "whatever", "value")).rejects.toThrow(); + await expect(() => idbLoad(NONEXISTENT_TABLE, "whatever")).rejects.toThrow(); + await expect(() => idbDelete(NONEXISTENT_TABLE, "whatever")).rejects.toThrow(); + }); +}); diff --git a/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap b/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap index df25083ebe..aca4e162c8 100644 --- a/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap +++ b/test/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap @@ -66,7 +66,7 @@ exports[`HTMLExport should export 1`] = ` <br/> <p> </p> </div> - <li><div class="mx_TimelineSeparator" role="separator" aria-label="Thu, Jan 1, 1970"><hr role="none"/><div class="mx_DateSeparator_dateContent"><h2 class="mx_DateSeparator_dateHeading" aria-hidden="true">Thu, Jan 1, 1970</h2></div><hr role="none"/></div></li><div class="mx_Export_EventWrapper" id="49"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="49" data-layout="group" data-self="false" data-event-id="49" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user49:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user49:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/49" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #49</span></div></div></li></div><div class="mx_Export_EventWrapper" id="48"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="48" data-layout="group" data-self="false" data-event-id="48" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user48:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user48:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/48" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #48</span></div></div></li></div><div class="mx_Export_EventWrapper" id="47"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="47" data-layout="group" data-self="false" data-event-id="47" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user47:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user47:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/47" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #47</span></div></div></li></div><div class="mx_Export_EventWrapper" id="46"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="46" data-layout="group" data-self="false" data-event-id="46" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user46:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user46:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/46" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #46</span></div></div></li></div><div class="mx_Export_EventWrapper" id="45"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="45" data-layout="group" data-self="false" data-event-id="45" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user45:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user45:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/45" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #45</span></div></div></li></div><div class="mx_Export_EventWrapper" id="44"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="44" data-layout="group" data-self="false" data-event-id="44" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user44:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user44:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/44" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #44</span></div></div></li></div><div class="mx_Export_EventWrapper" id="43"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="43" data-layout="group" data-self="false" data-event-id="43" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user43:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user43:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/43" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #43</span></div></div></li></div><div class="mx_Export_EventWrapper" id="42"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="42" data-layout="group" data-self="false" data-event-id="42" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user42:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user42:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/42" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #42</span></div></div></li></div><div class="mx_Export_EventWrapper" id="41"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="41" data-layout="group" data-self="false" data-event-id="41" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user41:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user41:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/41" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #41</span></div></div></li></div><div class="mx_Export_EventWrapper" id="40"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="40" data-layout="group" data-self="false" data-event-id="40" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user40:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user40:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/40" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #40</span></div></div></li></div><div class="mx_Export_EventWrapper" id="39"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="39" data-layout="group" data-self="false" data-event-id="39" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user39:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user39:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/39" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #39</span></div></div></li></div><div class="mx_Export_EventWrapper" id="38"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="38" data-layout="group" data-self="false" data-event-id="38" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user38:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user38:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/38" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #38</span></div></div></li></div><div class="mx_Export_EventWrapper" id="37"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="37" data-layout="group" data-self="false" data-event-id="37" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user37:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user37:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/37" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #37</span></div></div></li></div><div class="mx_Export_EventWrapper" id="36"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="36" data-layout="group" data-self="false" data-event-id="36" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user36:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user36:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/36" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #36</span></div></div></li></div><div class="mx_Export_EventWrapper" id="35"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="35" data-layout="group" data-self="false" data-event-id="35" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user35:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user35:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/35" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #35</span></div></div></li></div><div class="mx_Export_EventWrapper" id="34"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="34" data-layout="group" data-self="false" data-event-id="34" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user34:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user34:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/34" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #34</span></div></div></li></div><div class="mx_Export_EventWrapper" id="33"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="33" data-layout="group" data-self="false" data-event-id="33" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user33:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user33:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/33" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #33</span></div></div></li></div><div class="mx_Export_EventWrapper" id="32"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="32" data-layout="group" data-self="false" data-event-id="32" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user32:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user32:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/32" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #32</span></div></div></li></div><div class="mx_Export_EventWrapper" id="31"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="31" data-layout="group" data-self="false" data-event-id="31" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user31:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user31:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/31" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #31</span></div></div></li></div><div class="mx_Export_EventWrapper" id="30"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="30" data-layout="group" data-self="false" data-event-id="30" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user30:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user30:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/30" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #30</span></div></div></li></div><div class="mx_Export_EventWrapper" id="29"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="29" data-layout="group" data-self="false" data-event-id="29" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user29:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user29:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/29" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #29</span></div></div></li></div><div class="mx_Export_EventWrapper" id="28"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="28" data-layout="group" data-self="false" data-event-id="28" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user28:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user28:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/28" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #28</span></div></div></li></div><div class="mx_Export_EventWrapper" id="27"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="27" data-layout="group" data-self="false" data-event-id="27" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user27:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user27:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/27" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #27</span></div></div></li></div><div class="mx_Export_EventWrapper" id="26"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="26" data-layout="group" data-self="false" data-event-id="26" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user26:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user26:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/26" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #26</span></div></div></li></div><div class="mx_Export_EventWrapper" id="25"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="25" data-layout="group" data-self="false" data-event-id="25" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user25:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user25:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/25" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #25</span></div></div></li></div><div class="mx_Export_EventWrapper" id="24"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="24" data-layout="group" data-self="false" data-event-id="24" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user24:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user24:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/24" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #24</span></div></div></li></div><div class="mx_Export_EventWrapper" id="23"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="23" data-layout="group" data-self="false" data-event-id="23" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user23:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user23:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/23" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #23</span></div></div></li></div><div class="mx_Export_EventWrapper" id="22"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="22" data-layout="group" data-self="false" data-event-id="22" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user22:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user22:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/22" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #22</span></div></div></li></div><div class="mx_Export_EventWrapper" id="21"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="21" data-layout="group" data-self="false" data-event-id="21" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user21:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user21:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/21" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #21</span></div></div></li></div><div class="mx_Export_EventWrapper" id="20"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="20" data-layout="group" data-self="false" data-event-id="20" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user20:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user20:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/20" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #20</span></div></div></li></div><div class="mx_Export_EventWrapper" id="19"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="19" data-layout="group" data-self="false" data-event-id="19" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user19:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user19:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/19" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #19</span></div></div></li></div><div class="mx_Export_EventWrapper" id="18"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="18" data-layout="group" data-self="false" data-event-id="18" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user18:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user18:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/18" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #18</span></div></div></li></div><div class="mx_Export_EventWrapper" id="17"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="17" data-layout="group" data-self="false" data-event-id="17" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user17:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user17:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/17" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #17</span></div></div></li></div><div class="mx_Export_EventWrapper" id="16"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="16" data-layout="group" data-self="false" data-event-id="16" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user16:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user16:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/16" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #16</span></div></div></li></div><div class="mx_Export_EventWrapper" id="15"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="15" data-layout="group" data-self="false" data-event-id="15" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user15:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user15:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/15" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #15</span></div></div></li></div><div class="mx_Export_EventWrapper" id="14"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="14" data-layout="group" data-self="false" data-event-id="14" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user14:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user14:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/14" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #14</span></div></div></li></div><div class="mx_Export_EventWrapper" id="13"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="13" data-layout="group" data-self="false" data-event-id="13" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user13:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user13:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/13" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #13</span></div></div></li></div><div class="mx_Export_EventWrapper" id="12"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="12" data-layout="group" data-self="false" data-event-id="12" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user12:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user12:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/12" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #12</span></div></div></li></div><div class="mx_Export_EventWrapper" id="11"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="11" data-layout="group" data-self="false" data-event-id="11" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user11:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user11:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/11" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #11</span></div></div></li></div><div class="mx_Export_EventWrapper" id="10"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="10" data-layout="group" data-self="false" data-event-id="10" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user10:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user10:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/10" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #10</span></div></div></li></div><div class="mx_Export_EventWrapper" id="9"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="9" data-layout="group" data-self="false" data-event-id="9" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user9:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user9:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/9" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #9</span></div></div></li></div><div class="mx_Export_EventWrapper" id="8"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="8" data-layout="group" data-self="false" data-event-id="8" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user8:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user8:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/8" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #8</span></div></div></li></div><div class="mx_Export_EventWrapper" id="7"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="7" data-layout="group" data-self="false" data-event-id="7" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user7:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user7:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/7" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #7</span></div></div></li></div><div class="mx_Export_EventWrapper" id="6"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="6" data-layout="group" data-self="false" data-event-id="6" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user6:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user6:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/6" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #6</span></div></div></li></div><div class="mx_Export_EventWrapper" id="5"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="5" data-layout="group" data-self="false" data-event-id="5" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user5:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user5:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/5" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #5</span></div></div></li></div><div class="mx_Export_EventWrapper" id="4"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="4" data-layout="group" data-self="false" data-event-id="4" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user4:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user4:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/4" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #4</span></div></div></li></div><div class="mx_Export_EventWrapper" id="3"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="3" data-layout="group" data-self="false" data-event-id="3" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user3:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user3:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/3" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #3</span></div></div></li></div><div class="mx_Export_EventWrapper" id="2"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="2" data-layout="group" data-self="false" data-event-id="2" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user2:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user2:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/2" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #2</span></div></div></li></div><div class="mx_Export_EventWrapper" id="1"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="1" data-layout="group" data-self="false" data-event-id="1" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user1:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user1:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/1" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #1</span></div></div></li></div><div class="mx_Export_EventWrapper" id="0"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="0" data-layout="group" data-self="false" data-event-id="0" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user0:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user0:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/0" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off" data-state="closed">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #0</span></div></div></li></div> + <li><div class="mx_TimelineSeparator" role="separator" aria-label="Thu, Jan 1, 1970"><hr role="none"/><div class="mx_DateSeparator_dateContent"><h2 class="mx_DateSeparator_dateHeading" aria-hidden="true">Thu, Jan 1, 1970</h2></div><hr role="none"/></div></li><div class="mx_Export_EventWrapper" id="49"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="49" data-layout="group" data-self="false" data-event-id="49" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user49:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user49:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/49" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #49</span></div></div></li></div><div class="mx_Export_EventWrapper" id="48"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="48" data-layout="group" data-self="false" data-event-id="48" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user48:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user48:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/48" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #48</span></div></div></li></div><div class="mx_Export_EventWrapper" id="47"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="47" data-layout="group" data-self="false" data-event-id="47" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user47:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user47:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/47" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #47</span></div></div></li></div><div class="mx_Export_EventWrapper" id="46"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="46" data-layout="group" data-self="false" data-event-id="46" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user46:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user46:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/46" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #46</span></div></div></li></div><div class="mx_Export_EventWrapper" id="45"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="45" data-layout="group" data-self="false" data-event-id="45" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user45:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user45:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/45" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #45</span></div></div></li></div><div class="mx_Export_EventWrapper" id="44"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="44" data-layout="group" data-self="false" data-event-id="44" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user44:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user44:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/44" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #44</span></div></div></li></div><div class="mx_Export_EventWrapper" id="43"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="43" data-layout="group" data-self="false" data-event-id="43" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user43:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user43:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/43" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #43</span></div></div></li></div><div class="mx_Export_EventWrapper" id="42"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="42" data-layout="group" data-self="false" data-event-id="42" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user42:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user42:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/42" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #42</span></div></div></li></div><div class="mx_Export_EventWrapper" id="41"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="41" data-layout="group" data-self="false" data-event-id="41" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user41:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user41:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/41" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #41</span></div></div></li></div><div class="mx_Export_EventWrapper" id="40"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="40" data-layout="group" data-self="false" data-event-id="40" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user40:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user40:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/40" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #40</span></div></div></li></div><div class="mx_Export_EventWrapper" id="39"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="39" data-layout="group" data-self="false" data-event-id="39" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user39:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user39:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/39" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #39</span></div></div></li></div><div class="mx_Export_EventWrapper" id="38"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="38" data-layout="group" data-self="false" data-event-id="38" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user38:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user38:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/38" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #38</span></div></div></li></div><div class="mx_Export_EventWrapper" id="37"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="37" data-layout="group" data-self="false" data-event-id="37" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user37:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user37:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/37" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #37</span></div></div></li></div><div class="mx_Export_EventWrapper" id="36"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="36" data-layout="group" data-self="false" data-event-id="36" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user36:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user36:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/36" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #36</span></div></div></li></div><div class="mx_Export_EventWrapper" id="35"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="35" data-layout="group" data-self="false" data-event-id="35" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user35:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user35:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/35" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #35</span></div></div></li></div><div class="mx_Export_EventWrapper" id="34"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="34" data-layout="group" data-self="false" data-event-id="34" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user34:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user34:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/34" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #34</span></div></div></li></div><div class="mx_Export_EventWrapper" id="33"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="33" data-layout="group" data-self="false" data-event-id="33" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user33:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user33:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/33" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #33</span></div></div></li></div><div class="mx_Export_EventWrapper" id="32"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="32" data-layout="group" data-self="false" data-event-id="32" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user32:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user32:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/32" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #32</span></div></div></li></div><div class="mx_Export_EventWrapper" id="31"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="31" data-layout="group" data-self="false" data-event-id="31" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user31:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user31:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/31" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #31</span></div></div></li></div><div class="mx_Export_EventWrapper" id="30"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="30" data-layout="group" data-self="false" data-event-id="30" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user30:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user30:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/30" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #30</span></div></div></li></div><div class="mx_Export_EventWrapper" id="29"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="29" data-layout="group" data-self="false" data-event-id="29" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user29:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user29:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/29" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #29</span></div></div></li></div><div class="mx_Export_EventWrapper" id="28"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="28" data-layout="group" data-self="false" data-event-id="28" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user28:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user28:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/28" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #28</span></div></div></li></div><div class="mx_Export_EventWrapper" id="27"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="27" data-layout="group" data-self="false" data-event-id="27" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user27:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user27:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/27" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #27</span></div></div></li></div><div class="mx_Export_EventWrapper" id="26"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="26" data-layout="group" data-self="false" data-event-id="26" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user26:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user26:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/26" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #26</span></div></div></li></div><div class="mx_Export_EventWrapper" id="25"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="25" data-layout="group" data-self="false" data-event-id="25" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user25:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user25:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/25" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #25</span></div></div></li></div><div class="mx_Export_EventWrapper" id="24"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="24" data-layout="group" data-self="false" data-event-id="24" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user24:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user24:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/24" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #24</span></div></div></li></div><div class="mx_Export_EventWrapper" id="23"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="23" data-layout="group" data-self="false" data-event-id="23" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user23:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user23:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/23" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #23</span></div></div></li></div><div class="mx_Export_EventWrapper" id="22"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="22" data-layout="group" data-self="false" data-event-id="22" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user22:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user22:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/22" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #22</span></div></div></li></div><div class="mx_Export_EventWrapper" id="21"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="21" data-layout="group" data-self="false" data-event-id="21" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user21:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user21:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/21" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #21</span></div></div></li></div><div class="mx_Export_EventWrapper" id="20"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="20" data-layout="group" data-self="false" data-event-id="20" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user20:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user20:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/20" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #20</span></div></div></li></div><div class="mx_Export_EventWrapper" id="19"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="19" data-layout="group" data-self="false" data-event-id="19" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user19:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user19:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/19" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #19</span></div></div></li></div><div class="mx_Export_EventWrapper" id="18"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="18" data-layout="group" data-self="false" data-event-id="18" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user18:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user18:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/18" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #18</span></div></div></li></div><div class="mx_Export_EventWrapper" id="17"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="17" data-layout="group" data-self="false" data-event-id="17" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user17:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user17:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/17" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #17</span></div></div></li></div><div class="mx_Export_EventWrapper" id="16"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="16" data-layout="group" data-self="false" data-event-id="16" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user16:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user16:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/16" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #16</span></div></div></li></div><div class="mx_Export_EventWrapper" id="15"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="15" data-layout="group" data-self="false" data-event-id="15" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user15:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user15:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/15" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #15</span></div></div></li></div><div class="mx_Export_EventWrapper" id="14"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="14" data-layout="group" data-self="false" data-event-id="14" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user14:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user14:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/14" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #14</span></div></div></li></div><div class="mx_Export_EventWrapper" id="13"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="13" data-layout="group" data-self="false" data-event-id="13" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user13:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user13:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/13" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #13</span></div></div></li></div><div class="mx_Export_EventWrapper" id="12"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="12" data-layout="group" data-self="false" data-event-id="12" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user12:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user12:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/12" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #12</span></div></div></li></div><div class="mx_Export_EventWrapper" id="11"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="11" data-layout="group" data-self="false" data-event-id="11" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user11:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user11:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/11" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #11</span></div></div></li></div><div class="mx_Export_EventWrapper" id="10"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="10" data-layout="group" data-self="false" data-event-id="10" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user10:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user10:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/10" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #10</span></div></div></li></div><div class="mx_Export_EventWrapper" id="9"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="9" data-layout="group" data-self="false" data-event-id="9" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user9:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user9:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/9" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #9</span></div></div></li></div><div class="mx_Export_EventWrapper" id="8"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="8" data-layout="group" data-self="false" data-event-id="8" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user8:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user8:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/8" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #8</span></div></div></li></div><div class="mx_Export_EventWrapper" id="7"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="7" data-layout="group" data-self="false" data-event-id="7" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user7:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user7:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/7" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #7</span></div></div></li></div><div class="mx_Export_EventWrapper" id="6"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="6" data-layout="group" data-self="false" data-event-id="6" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user6:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user6:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/6" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #6</span></div></div></li></div><div class="mx_Export_EventWrapper" id="5"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="5" data-layout="group" data-self="false" data-event-id="5" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color2 mx_DisambiguatedProfile_displayName" dir="auto">@user5:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user5:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="2" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/5" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #5</span></div></div></li></div><div class="mx_Export_EventWrapper" id="4"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="4" data-layout="group" data-self="false" data-event-id="4" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color1 mx_DisambiguatedProfile_displayName" dir="auto">@user4:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user4:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="1" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/4" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #4</span></div></div></li></div><div class="mx_Export_EventWrapper" id="3"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="3" data-layout="group" data-self="false" data-event-id="3" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color6 mx_DisambiguatedProfile_displayName" dir="auto">@user3:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user3:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="6" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/3" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #3</span></div></div></li></div><div class="mx_Export_EventWrapper" id="2"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="2" data-layout="group" data-self="false" data-event-id="2" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color5 mx_DisambiguatedProfile_displayName" dir="auto">@user2:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user2:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="5" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/2" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #2</span></div></div></li></div><div class="mx_Export_EventWrapper" id="1"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="1" data-layout="group" data-self="false" data-event-id="1" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color4 mx_DisambiguatedProfile_displayName" dir="auto">@user1:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user1:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="4" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/1" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #1</span></div></div></li></div><div class="mx_Export_EventWrapper" id="0"><li class="mx_EventTile" tabindex="-1" aria-live="off" aria-atomic="true" data-scroll-tokens="0" data-layout="group" data-self="false" data-event-id="0" data-has-reply="false"><div class="mx_DisambiguatedProfile"><span class="mx_Username_color3 mx_DisambiguatedProfile_displayName" dir="auto">@user0:example.com</span></div><div class="mx_EventTile_avatar"><button role="button" aria-label="Profile picture" title="@user0:example.com" aria-live="off" data-testid="avatar-img" data-type="round" data-color="3" class="_avatar_mcap2_17 mx_BaseAvatar _avatar-imageless_mcap2_61" style="--cpd-avatar-size: 30px;">u</button></div><div class="mx_EventTile_line"><a href="https://matrix.to/#/!myroom:example.org/0" aria-label="00:00"><span class="mx_MessageTimestamp" aria-hidden="true" aria-live="off">00:00</span></a><div class="mx_MTextBody mx_EventTile_content"><span class="mx_EventTile_body" dir="auto">Message #0</span></div></div></li></div> </ol> </div> </div> diff --git a/test/utils/oidc/authorize-test.ts b/test/utils/oidc/authorize-test.ts index a323fc95a1..4ee13b55ed 100644 --- a/test/utils/oidc/authorize-test.ts +++ b/test/utils/oidc/authorize-test.ts @@ -115,6 +115,7 @@ describe("OIDC authorization", () => { const tokenResponse: BearerTokenResponse = { access_token: "abc123", refresh_token: "def456", + id_token: "ghi789", scope: "test", token_type: "Bearer", expires_at: 12345, @@ -163,6 +164,7 @@ describe("OIDC authorization", () => { identityServerUrl, issuer, clientId, + idToken: "ghi789", idTokenClaims: result.idTokenClaims, }); }); diff --git a/test/utils/oidc/persistOidcSettings-test.ts b/test/utils/oidc/persistOidcSettings-test.ts index 3585c1576e..2904f38c69 100644 --- a/test/utils/oidc/persistOidcSettings-test.ts +++ b/test/utils/oidc/persistOidcSettings-test.ts @@ -15,14 +15,19 @@ limitations under the License. */ import { IdTokenClaims } from "oidc-client-ts"; +import { decodeIdToken } from "matrix-js-sdk/src/matrix"; +import { mocked } from "jest-mock"; import { getStoredOidcClientId, + getStoredOidcIdToken, getStoredOidcIdTokenClaims, getStoredOidcTokenIssuer, persistOidcAuthenticatedSettings, } from "../../../src/utils/oidc/persistOidcSettings"; +jest.mock("matrix-js-sdk/src/matrix"); + describe("persist OIDC settings", () => { jest.spyOn(Storage.prototype, "getItem"); jest.spyOn(Storage.prototype, "setItem"); @@ -33,6 +38,7 @@ describe("persist OIDC settings", () => { const clientId = "test-client-id"; const issuer = "https://auth.org/"; + const idToken = "test-id-token"; const idTokenClaims: IdTokenClaims = { // audience is this client aud: "123", @@ -44,45 +50,65 @@ describe("persist OIDC settings", () => { }; describe("persistOidcAuthenticatedSettings", () => { - it("should set clientId and issuer in session storage", () => { - persistOidcAuthenticatedSettings(clientId, issuer, idTokenClaims); + it("should set clientId and issuer in localStorage", () => { + persistOidcAuthenticatedSettings(clientId, issuer, idToken); expect(localStorage.setItem).toHaveBeenCalledWith("mx_oidc_client_id", clientId); expect(localStorage.setItem).toHaveBeenCalledWith("mx_oidc_token_issuer", issuer); - expect(localStorage.setItem).toHaveBeenCalledWith("mx_oidc_id_token_claims", JSON.stringify(idTokenClaims)); + expect(localStorage.setItem).toHaveBeenCalledWith("mx_oidc_id_token", idToken); }); }); describe("getStoredOidcTokenIssuer()", () => { - it("should return issuer from session storage", () => { + it("should return issuer from localStorage", () => { localStorage.setItem("mx_oidc_token_issuer", issuer); expect(getStoredOidcTokenIssuer()).toEqual(issuer); expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_token_issuer"); }); - it("should return undefined when no issuer in session storage", () => { + it("should return undefined when no issuer in localStorage", () => { expect(getStoredOidcTokenIssuer()).toBeUndefined(); }); }); describe("getStoredOidcClientId()", () => { - it("should return clientId from session storage", () => { + it("should return clientId from localStorage", () => { localStorage.setItem("mx_oidc_client_id", clientId); expect(getStoredOidcClientId()).toEqual(clientId); expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_client_id"); }); - it("should throw when no clientId in session storage", () => { + it("should throw when no clientId in localStorage", () => { expect(() => getStoredOidcClientId()).toThrow("Oidc client id not found in storage"); }); }); + describe("getStoredOidcIdToken()", () => { + it("should return token from localStorage", () => { + localStorage.setItem("mx_oidc_id_token", idToken); + expect(getStoredOidcIdToken()).toEqual(idToken); + expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_id_token"); + }); + + it("should return undefined when no token in localStorage", () => { + expect(getStoredOidcIdToken()).toBeUndefined(); + }); + }); + describe("getStoredOidcIdTokenClaims()", () => { - it("should return issuer from session storage", () => { + it("should return claims from localStorage", () => { localStorage.setItem("mx_oidc_id_token_claims", JSON.stringify(idTokenClaims)); expect(getStoredOidcIdTokenClaims()).toEqual(idTokenClaims); expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_id_token_claims"); }); - it("should return undefined when no issuer in session storage", () => { + it("should return claims extracted from id_token in localStorage", () => { + localStorage.setItem("mx_oidc_id_token", idToken); + mocked(decodeIdToken).mockReturnValue(idTokenClaims); + expect(getStoredOidcIdTokenClaims()).toEqual(idTokenClaims); + expect(decodeIdToken).toHaveBeenCalledWith(idToken); + expect(localStorage.getItem).toHaveBeenCalledWith("mx_oidc_id_token_claims"); + }); + + it("should return undefined when no claims in localStorage", () => { expect(getStoredOidcIdTokenClaims()).toBeUndefined(); }); }); diff --git a/test/utils/oidc/registerClient-test.ts b/test/utils/oidc/registerClient-test.ts index bf8d179329..6feb4c7e91 100644 --- a/test/utils/oidc/registerClient-test.ts +++ b/test/utils/oidc/registerClient-test.ts @@ -44,7 +44,12 @@ describe("getOidcClientId()", () => { return baseUrl; }, }); - Object.defineProperty(PlatformPeg.get(), "getSSOCallbackUrl", { + Object.defineProperty(PlatformPeg.get(), "defaultOidcClientUri", { + get(): string { + return baseUrl; + }, + }); + Object.defineProperty(PlatformPeg.get(), "getOidcCallbackUrl", { value: () => ({ href: baseUrl, }), diff --git a/yarn.lock b/yarn.lock index ba6d734737..e247a7bbcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,16 +33,16 @@ "@jridgewell/trace-mapping" "^0.3.24" "@axe-core/playwright@^4.8.1": - version "4.8.5" - resolved "https://registry.yarnpkg.com/@axe-core/playwright/-/playwright-4.8.5.tgz#85975b4dce114120c79a248897570a5ee757e155" - integrity sha512-GFdXXAEn9uk0Vyzgl2eEP+VwvgGzas0YSnacoJ/0U237G83zWZ1PhbP/RDymm0cqevoA+xRjMo+ONzh9Q711nw== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@axe-core/playwright/-/playwright-4.9.0.tgz#3538c5af8868f1704eedeb58a6b5a84feb0ccfe1" + integrity sha512-Q1Lz75dNsX38jof+aev7RficDMdH/HLOLySkDdXR0fUoeFcLdw4UNgDO2CNNP4CTpoesEdfYRdd6VmDXjhBgbA== dependencies: - axe-core "~4.8.4" + axe-core "~4.9.0" "@babel/cli@^7.12.10": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.1.tgz#2e11e071e32fe82850b4fe514f56b9c9e1c44911" - integrity sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.5.tgz#9eba21699f289c32e63a28aedf82f888dc134b30" + integrity sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^4.0.1" @@ -55,7 +55,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -84,26 +84,26 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742" - integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== "@babel/core@^7.0.0", "@babel/core@^7.12.10": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3" - integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.1" + "@babel/generator" "^7.24.5" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.1" - "@babel/parser" "^7.24.1" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -132,18 +132,18 @@ semver "^6.3.1" "@babel/eslint-parser@^7.12.10": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz#e27eee93ed1d271637165ef3a86e2b9332395c32" - integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" + integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" "@babel/eslint-plugin@^7.12.10": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.23.5.tgz#77d4703e9f83b81e9fc13382810372beb2f10f94" - integrity sha512-03+E/58Hoo/ui69gR+beFdGpplpoVK0BSIdke2iw4/Bz7eGN0ssRenNlnU4nmbkowNQOPCStKSwFr8H6DiY49g== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.24.5.tgz#6581b9005ab76308e4aef6b50aa1788099393211" + integrity sha512-5n3K9Zv13VOa9SG2ZiX0WV7A0ddApRn6vsV8zBojCsxnCbYKLjCDvzDfVxS7C4STmjQDOXU1uk/ppxxDTC860w== dependencies: eslint-rule-composer "^0.3.0" @@ -167,12 +167,12 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0" - integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A== +"@babel/generator@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.24.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -228,19 +228,19 @@ "@babel/helper-split-export-declaration" "^7.18.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz#db58bf57137b623b916e24874ab7188d93d7f68f" - integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA== +"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" + integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.24.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": @@ -252,10 +252,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd" - integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== +"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" + integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -268,7 +268,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -290,12 +290,12 @@ dependencies: "@babel/types" "^7.21.5" -"@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== +"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" + integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.24.5" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" @@ -315,16 +315,16 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== +"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -340,10 +340,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== "@babel/helper-plugin-utils@^7.20.2": version "7.22.5" @@ -380,12 +380,12 @@ "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" @@ -401,27 +401,34 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.18.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-string-parser@^7.22.5": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-string-parser@^7.23.4": +"@babel/helper-string-parser@^7.23.4", "@babel/helper-string-parser@^7.24.1": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.21.0": version "7.21.0" @@ -434,13 +441,13 @@ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" + integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" + "@babel/helper-function-name" "^7.23.0" + "@babel/template" "^7.24.0" + "@babel/types" "^7.24.5" "@babel/helpers@^7.22.15": version "7.22.15" @@ -451,14 +458,14 @@ "@babel/traverse" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/helpers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94" - integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg== +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" "@babel/highlight@^7.22.13": version "7.23.4" @@ -469,7 +476,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.23.4", "@babel/highlight@^7.24.2": +"@babel/highlight@^7.23.4": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== @@ -479,10 +486,28 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.14.7", "@babel/parser@^7.18.5", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.23.3", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a" - integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg== +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.12.11", "@babel/parser@^7.14.7", "@babel/parser@^7.18.5", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.23.3", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" + integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" @@ -750,12 +775,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-block-scoping@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz#27af183d7f6dad890531256c7a45019df768ac1f" - integrity sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw== +"@babel/plugin-transform-block-scoping@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" + integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-class-properties@^7.24.1": version "7.24.1" @@ -765,27 +790,27 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-class-static-block@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz#4e37efcca1d9f2fcb908d1bae8b56b4b6e9e1cb6" - integrity sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA== +"@babel/plugin-transform-class-static-block@^7.24.4": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" + integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.24.4" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== +"@babel/plugin-transform-classes@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" + integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-split-export-declaration" "^7.24.5" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.24.1": @@ -796,12 +821,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/template" "^7.24.0" -"@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== +"@babel/plugin-transform-destructuring@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" + integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-dotall-regex@^7.24.1": version "7.24.1" @@ -955,15 +980,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== +"@babel/plugin-transform-object-rest-spread@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" + integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-object-super@^7.24.1": version "7.24.1" @@ -981,12 +1006,12 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== +"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" + integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" @@ -997,12 +1022,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== +"@babel/plugin-transform-parameters@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" + integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-private-methods@^7.24.1": version "7.24.1" @@ -1012,14 +1037,14 @@ "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== +"@babel/plugin-transform-private-property-in-object@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" + integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-transform-property-literals@^7.24.1": @@ -1118,12 +1143,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== +"@babel/plugin-transform-typeof-symbol@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" + integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/plugin-transform-typescript@^7.24.1": version "7.24.1" @@ -1167,14 +1192,15 @@ "@babel/helper-plugin-utils" "^7.24.0" "@babel/preset-env@^7.12.11": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.3.tgz#f3f138c844ffeeac372597b29c51b5259e8323a3" - integrity sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" + integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== dependencies: - "@babel/compat-data" "^7.24.1" + "@babel/compat-data" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.5" "@babel/helper-validator-option" "^7.23.5" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" @@ -1201,12 +1227,12 @@ "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.1" + "@babel/plugin-transform-block-scoping" "^7.24.5" "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.1" - "@babel/plugin-transform-classes" "^7.24.1" + "@babel/plugin-transform-class-static-block" "^7.24.4" + "@babel/plugin-transform-classes" "^7.24.5" "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" + "@babel/plugin-transform-destructuring" "^7.24.5" "@babel/plugin-transform-dotall-regex" "^7.24.1" "@babel/plugin-transform-duplicate-keys" "^7.24.1" "@babel/plugin-transform-dynamic-import" "^7.24.1" @@ -1226,13 +1252,13 @@ "@babel/plugin-transform-new-target" "^7.24.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" + "@babel/plugin-transform-object-rest-spread" "^7.24.5" "@babel/plugin-transform-object-super" "^7.24.1" "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-optional-chaining" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.5" "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" + "@babel/plugin-transform-private-property-in-object" "^7.24.5" "@babel/plugin-transform-property-literals" "^7.24.1" "@babel/plugin-transform-regenerator" "^7.24.1" "@babel/plugin-transform-reserved-words" "^7.24.1" @@ -1240,7 +1266,7 @@ "@babel/plugin-transform-spread" "^7.24.1" "@babel/plugin-transform-sticky-regex" "^7.24.1" "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" + "@babel/plugin-transform-typeof-symbol" "^7.24.5" "@babel/plugin-transform-unicode-escapes" "^7.24.1" "@babel/plugin-transform-unicode-property-regex" "^7.24.1" "@babel/plugin-transform-unicode-regex" "^7.24.1" @@ -1301,9 +1327,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" - integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" @@ -1350,19 +1376,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" debug "^4.3.1" globals "^11.1.0" @@ -1375,13 +1401,13 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.4.4": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== +"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" "@babel/types@^7.23.3": @@ -1393,6 +1419,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.23.4": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -1429,7 +1464,7 @@ resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== -"@csstools/selector-specificity@^3.0.2": +"@csstools/selector-specificity@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz#208a3929ee614967a1fc8cd6cb758d9fcbf0caae" integrity sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q== @@ -1446,7 +1481,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.5.1": +"@eslint-community/regexpp@^4.10.0": version "4.10.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== @@ -1849,10 +1884,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -"@matrix-org/analytics-events@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.19.0.tgz#e20e4df54530ed1c755ab728e9c22891e376f9e2" - integrity sha512-wN/hbpTpOxz2u3zHbsJgVMi88oKmK1yqeSZuif3yNW68XQnV2cc0XGUEpl0fgLOl6fj1bZOtxbDg5rCLbqf4CQ== +"@matrix-org/analytics-events@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.20.0.tgz#062a532ddcf0e2e5eb64c5576cd212cb32a11ccf" + integrity sha512-YCRbZrpZU9q+nrB6RsfPZ4NlKs31ySjP2F7GFUZNPKv96GcbihrnMK086td480SJOYpjPv2vttDJC+S67SFe2w== "@matrix-org/emojibase-bindings@^1.1.2": version "1.1.3" @@ -1885,9 +1920,9 @@ "@babel/runtime" "^7.17.9" "@matrix-org/spec@^1.7.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@matrix-org/spec/-/spec-1.9.0.tgz#ac43accc9b081ad443b11acd2d8d1f2919bd0e2f" - integrity sha512-BgPTYFhvjc10XWIEsqKsQOu5cR2BxMqpOhJ/IA/iiUeVOh4M5BjBR+ILZFGr8WV7TgH+h8rFdCy2kbaumRHkVg== + version "1.10.1" + resolved "https://registry.yarnpkg.com/@matrix-org/spec/-/spec-1.10.1.tgz#6c62a7ee4524224c29fe39e67b33983e70c99944" + integrity sha512-ryNSzJkaJi/fwp6AQ6ujS9oqJtw60e+/+llIzwJhbuWTr1V07B6KfUA44+bFrudIFmfghdOuxRfzUnWOQ2K6gw== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -1955,11 +1990,11 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@playwright/test@^1.40.1": - version "1.42.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.42.1.tgz#9eff7417bcaa770e9e9a00439e078284b301f31c" - integrity sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ== + version "1.43.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.43.1.tgz#16728a59eb8ce0f60472f98d8886d6cab0fa3e42" + integrity sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA== dependencies: - playwright "1.42.1" + playwright "1.43.1" "@radix-ui/primitive@1.0.1": version "1.0.1" @@ -2293,76 +2328,87 @@ dependencies: "@babel/runtime" "^7.13.10" -"@sentry-internal/feedback@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.109.0.tgz#4657d7f36a1de3be466f42735d295e212b7eca11" - integrity sha512-EL7N++poxvJP9rYvh6vSu24tsKkOveNCcCj4IM7+irWPjsuD2GLYYlhp/A/Mtt9l7iqO4plvtiQU5HGk7smcTQ== +"@sentry-internal/feedback@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.112.2.tgz#3945ae9e980854e1d53560ed6a28684f02625fbc" + integrity sha512-z+XP8BwB8B3pa+i8xqbrPsbtDWUFUS6wo+FJbmOYUqOusJJbVFDAhBoEdKoo5ZjOcsAZG7XR6cA9zrhJynIWBA== dependencies: - "@sentry/core" "7.109.0" - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" + "@sentry/core" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" -"@sentry-internal/replay-canvas@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.109.0.tgz#9a00857994a9487428296feed4a9ddf2d62bab84" - integrity sha512-Lh/K60kmloR6lkPUcQP0iamw7B/MdEUEx/ImAx4tUSMrLj+IoUEcq/ECgnnVyQkJq59+8nPEKrVLt7x6PUPEjw== +"@sentry-internal/replay-canvas@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.112.2.tgz#a29719ffb816dec01661b81def09d24704476d86" + integrity sha512-BCCCxrZ1wJvN6La5gg1JJbKitAhJI5MATCnhtklsZbUcHkHB9iZoj19J65+P56gwssvHz5xh63AjNiITaetIRg== dependencies: - "@sentry/core" "7.109.0" - "@sentry/replay" "7.109.0" - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" + "@sentry/core" "7.112.2" + "@sentry/replay" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" -"@sentry-internal/tracing@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.109.0.tgz#3effaa132c41a65378fa98146aea61228d528953" - integrity sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw== +"@sentry-internal/tracing@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.112.2.tgz#83460e51875ddb160c060bfee2e21833117f259c" + integrity sha512-fT1Y46J4lfXZkgFkb03YMNeIEs2xS6jdKMoukMFQfRfVvL9fSWEbTgZpHPd/YTT8r2i082XzjtAoQNgklm/0Hw== dependencies: - "@sentry/core" "7.109.0" - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" + "@sentry/core" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" "@sentry/browser@^7.0.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.109.0.tgz#13b2623f43047f292cf7d6070128a7501e008693" - integrity sha512-yx+OFG+Ab9qUDDgV9ZDv8M9O9Mqr0fjKta/LMlWALYLjzkMvxsPlRPFj7oMBlHqOTVLDeg7lFYmsA8wyWQ8Z8g== - dependencies: - "@sentry-internal/feedback" "7.109.0" - "@sentry-internal/replay-canvas" "7.109.0" - "@sentry-internal/tracing" "7.109.0" - "@sentry/core" "7.109.0" - "@sentry/replay" "7.109.0" - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" - -"@sentry/core@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.109.0.tgz#7a02f4af4a676950f6555f552a2a232d4458fcd5" - integrity sha512-xwD4U0IlvvlE/x/g/W1I8b4Cfb16SsCMmiEuBf6XxvAa3OfWBxKoqLifb3GyrbxMC4LbIIZCN/SvLlnGJPgszA== - dependencies: - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" - -"@sentry/replay@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.109.0.tgz#f50fb0140c81fce660c44cc93c35988898b8348b" - integrity sha512-hCDjbTNO7ErW/XsaBXlyHFsUhneyBUdTec1Swf98TFEfVqNsTs6q338aUcaR8dGRLbLrJ9YU9D1qKq++v5h2CA== - dependencies: - "@sentry-internal/tracing" "7.109.0" - "@sentry/core" "7.109.0" - "@sentry/types" "7.109.0" - "@sentry/utils" "7.109.0" - -"@sentry/types@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.109.0.tgz#d8778358114ed05be734661cc9e1e261f4494947" - integrity sha512-egCBnDv3YpVFoNzRLdP0soVrxVLCQ+rovREKJ1sw3rA2/MFH9WJ+DZZexsX89yeAFzy1IFsCp7/dEqudusml6g== - -"@sentry/utils@7.109.0": - version "7.109.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.109.0.tgz#7078e1400197abc1b0c436679bef980639500a86" - integrity sha512-3RjxMOLMBwZ5VSiH84+o/3NY2An4Zldjz0EbfEQNRY9yffRiCPJSQiCJID8EoylCFOh/PAhPimBhqbtWJxX6iw== - dependencies: - "@sentry/types" "7.109.0" + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.112.2.tgz#8c25b8f96257685279cf6837ba4ea6e6cba8c9e2" + integrity sha512-wULwavCch84+d0bueAdFm6CDm1u0TfOjN91VgY+sj/vxUV2vesvDgI8zRZfmbZEor3MYA90zerkZT3ehZQKbYw== + dependencies: + "@sentry-internal/feedback" "7.112.2" + "@sentry-internal/replay-canvas" "7.112.2" + "@sentry-internal/tracing" "7.112.2" + "@sentry/core" "7.112.2" + "@sentry/integrations" "7.112.2" + "@sentry/replay" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" + +"@sentry/core@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.112.2.tgz#d2e6d2acb6947fcb384298a3bd2b0c8183533dd8" + integrity sha512-gHPCcJobbMkk0VR18J65WYQTt3ED4qC6X9lHKp27Ddt63E+MDGkG6lvYBU1LS8cV7CdyBGC1XXDCfor61GvLsA== + dependencies: + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" + +"@sentry/integrations@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.112.2.tgz#2aad01719b1e4a1326f42db78f77fcf1e58d4c63" + integrity sha512-ioC2yyU6DqtLkdmWnm87oNvdn2+9oKctJeA4t+jkS6JaJ10DcezjCwiLscX4rhB9aWJV3IWF7Op0O6K3w0t2Hg== + dependencies: + "@sentry/core" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" + localforage "^1.8.1" + +"@sentry/replay@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.112.2.tgz#4910244b80dabd32a83cc02b9fdd566ff766df34" + integrity sha512-7Ns/8D54WPsht1nlVj93Inf6rXyve2AZoibYN0YfcM2w3lI4NO51gPPHJU0lFEfMwzwK4ZBJWzOeW9098a+uEg== + dependencies: + "@sentry-internal/tracing" "7.112.2" + "@sentry/core" "7.112.2" + "@sentry/types" "7.112.2" + "@sentry/utils" "7.112.2" + +"@sentry/types@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.112.2.tgz#71ff27c668309ccd8d17b7793e044e46f81eca1b" + integrity sha512-kCMLt7yhY5OkWE9MeowlTNmox9pqDxcpvqguMo4BDNZM5+v9SEb1AauAdR78E1a1V8TyCzjBD7JDfXWhvpYBcQ== + +"@sentry/utils@7.112.2": + version "7.112.2" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.112.2.tgz#223f9feee5860459792a43904db4bf38fba73ed3" + integrity sha512-OjLh0hx0t1EcL4ZIjf+4svlmmP+tHUDGcr5qpFWH78tjmkPW4+cqPuZCZfHSuWcDdeiaXi8TnYoVRqDcJKK/eQ== + dependencies: + "@sentry/types" "7.112.2" "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2659,7 +2705,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2736,9 +2782,9 @@ undici-types "~5.26.4" "@types/node@18": - version "18.19.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.29.tgz#e7e9d796c1e195be7e7daf82b4abc50d017fb9db" - integrity sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g== + version "18.19.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.31.tgz#b7d4a00f7cb826b60a543cebdbda5d189aaecdcd" + integrity sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA== dependencies: undici-types "~5.26.4" @@ -2758,9 +2804,9 @@ integrity sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA== "@types/prop-types@*": - version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" - integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/q@^1.5.1": version "1.5.8" @@ -2785,16 +2831,16 @@ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-beautiful-dnd@^13.0.0": - version "13.1.5" - resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.5.tgz#04869f2ec4658aa963e56dc3cbb91f261587dedc" - integrity sha512-mzohmMtV48b0bXF2dP8188LzUv9HAGHKucOORYsd5Sqq830pJ4gseFyDDAH0TR4TeD1ceG9DxTQ0FOFbtCSy4Q== + version "13.1.8" + resolved "https://registry.yarnpkg.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz#f52d3ea07e1e19159d6c3c4a48c8da3d855e60b4" + integrity sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ== dependencies: "@types/react" "*" -"@types/react-dom@17.0.21", "@types/react-dom@<18.0.0": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" - integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== +"@types/react-dom@17.0.25", "@types/react-dom@<18.0.0": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.25.tgz#e0e5b3571e1069625b3a3da2b279379aa33a0cb5" + integrity sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA== dependencies: "@types/react" "^17" @@ -2809,19 +2855,19 @@ redux "^4.0.0" "@types/react-transition-group@^4.4.0": - version "4.4.7" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.7.tgz#bf69f269d74aa78b99097673ca6dd6824a68ef1c" - integrity sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg== + version "4.4.10" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@17.0.68", "@types/react@^17": - version "17.0.68" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" - integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== +"@types/react@*", "@types/react@17.0.80", "@types/react@^17": + version "17.0.80" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" + integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" + "@types/scheduler" "^0.16" csstype "^3.0.2" "@types/retry@0.12.0": @@ -2836,22 +2882,17 @@ dependencies: htmlparser2 "^8.0.0" -"@types/scheduler@*": - version "0.16.4" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" - integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== +"@types/scheduler@^0.16": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/sdp-transform@^2.4.6": version "2.4.9" resolved "https://registry.yarnpkg.com/@types/sdp-transform/-/sdp-transform-2.4.9.tgz#26ef39f487a6909b0512f580b80920a366b27f52" integrity sha512-bVr+/OoZZy7wrHlNcEAAa6PAgKA4BoXPYVN2EijMC5WnGgQ4ZEuixmKnVs2roiAvr7RhIFVH17QD27cojgIZCg== -"@types/semver@^7.3.12": - version "7.5.7" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" - integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== - -"@types/semver@^7.5.0": +"@types/semver@^7.5.0", "@types/semver@^7.5.8": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -2911,138 +2952,138 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz#1dc52fe48454d5b54be2d5f089680452f1628a5a" - integrity sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ== - dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/type-utils" "7.5.0" - "@typescript-eslint/utils" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" + integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/type-utils" "7.8.0" + "@typescript-eslint/utils" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + semver "^7.6.0" + ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.5.0.tgz#1eeff36309ac2253c905dd4a88b4b71b72a358ed" - integrity sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ== - dependencies: - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8" + integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ== + dependencies: + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@typescript-eslint/scope-manager@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz#70f0a7361430ab1043a5f97386da2a0d8b2f4d56" - integrity sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA== +"@typescript-eslint/scope-manager@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" + integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" -"@typescript-eslint/type-utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz#a8faa403232da3a3901655387c7082111f692cf9" - integrity sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw== +"@typescript-eslint/type-utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f" + integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A== dependencies: - "@typescript-eslint/typescript-estree" "7.5.0" - "@typescript-eslint/utils" "7.5.0" + "@typescript-eslint/typescript-estree" "7.8.0" + "@typescript-eslint/utils" "7.8.0" debug "^4.3.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -"@typescript-eslint/types@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.5.0.tgz#0a284bcdef3cb850ec9fd57992df9f29d6bde1bc" - integrity sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg== +"@typescript-eslint/types@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" + integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/typescript-estree@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz#aa5031c511874420f6b5edd90f8e4021525ee776" - integrity sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ== +"@typescript-eslint/typescript-estree@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" + integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== dependencies: - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/visitor-keys" "7.5.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/visitor-keys" "7.8.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.5.0.tgz#bbd963647fbbe9ffea033f42c0fb7e89bb19c858" - integrity sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw== +"@typescript-eslint/utils@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" + integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.8.0" + "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/typescript-estree" "7.8.0" + semver "^7.6.0" + +"@typescript-eslint/utils@^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.5.0" - "@typescript-eslint/types" "7.5.0" - "@typescript-eslint/typescript-estree" "7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" -"@typescript-eslint/utils@^5.10.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" -"@typescript-eslint/visitor-keys@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz#8abcac66f93ef20b093e87a400c2d21e3a6d55ee" - integrity sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA== +"@typescript-eslint/visitor-keys@7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" + integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== dependencies: - "@typescript-eslint/types" "7.5.0" - eslint-visitor-keys "^3.4.1" + "@typescript-eslint/types" "7.8.0" + eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": version "1.2.0" @@ -3056,10 +3097,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-3.3.1.tgz#f5d69255fa62472626e0ed71b7176b09f21cbcaf" - integrity sha512-V9CQfaMyKdsWxC1D4Wz08Xh0ge3SnaOBf5SSIp1+uwoJTPyfEFHKgqbZl536SHBvVBc9M9IYg+3+lPB8xkFRFA== +"@vector-im/compound-web@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.2.0.tgz#16915a5e64c405360fc049ddfa39b5185725f950" + integrity sha512-VSZxIFToDesjiiCGLOj+DrrKv1I0rtpzJbdylarJXY7REnHzVdgaBBtGm403iJ8KkZ2Rn16Mxe+P1/+VS4yiAA== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -3164,14 +3205,14 @@ ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + version "8.13.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" + integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" + uri-js "^4.4.1" another-json@^0.2.0: version "0.2.0" @@ -3415,7 +3456,7 @@ await-lock@^2.1.0: resolved "https://registry.yarnpkg.com/await-lock/-/await-lock-2.2.2.tgz#a95a9b269bfd2f69d22b17a321686f551152bcef" integrity sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw== -axe-core@4.9.0: +axe-core@4.9.0, axe-core@~4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.0.tgz#b18971494551ab39d4ff5f7d4c6411bd20cc7c2a" integrity sha512-H5orY+M2Fr56DWmMFpMrq5Ge93qjNdPVqzBv5gWK3aD1OvjBEJlEzxf09z93dGVQeI0LiW+aCMIx1QtShC/zUw== @@ -3425,11 +3466,6 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axe-core@~4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.4.tgz#90db39a2b316f963f00196434d964e6e23648643" - integrity sha512-CZLSKisu/bhJ2awW4kJndluz2HLZYIHh5Uy1+ZwDRkJi69811xgIXXfdU9HSLX0Th+ILrHj8qfL/5wzamsFtQg== - axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -3472,12 +3508,12 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-plugin-polyfill-corejs2@^0.4.10: - version "0.4.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1" - integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== + version "0.4.11" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" + integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: @@ -3489,11 +3525,11 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: core-js-compat "^3.36.1" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be" - integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== + version "0.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" + integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.1" + "@babel/helper-define-polyfill-provider" "^0.6.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -3687,9 +3723,9 @@ caniuse-lite@^1.0.30001449: integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== caniuse-lite@^1.0.30001587: - version "1.0.30001605" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6" - integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ== + version "1.0.30001614" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" + integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== chalk@5.2.0: version "5.2.0" @@ -3923,9 +3959,9 @@ cookie@0.6.0: integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.36.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8" - integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA== + version "3.37.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" + integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== dependencies: browserslist "^4.23.0" @@ -4011,10 +4047,10 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-functions-list@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" - integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== +css-functions-list@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.2.tgz#9a54c6dd8416ed25c1079cd88234e927526c1922" + integrity sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ== css-select@^4.1.3: version "4.3.0" @@ -4093,9 +4129,9 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" @@ -4262,9 +4298,9 @@ detect-node-es@^1.1.0: integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== diff-dom@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-5.1.2.tgz#951627784bc45e32999f0c97cd42e4cf8c35791f" - integrity sha512-ayOX+pBYzyLdt7iXFd+8jvWzhrcWk+9gQqYk7Zz8/0hpIsqSbtk6MNbtds+Ox6B8ONsdtIcfPmk3NXPdgb3+xQ== + version "5.1.3" + resolved "https://registry.yarnpkg.com/diff-dom/-/diff-dom-5.1.3.tgz#1a00ac023bdc9b7a6de702a51fd6566a34b8d9a4" + integrity sha512-cIQQSQywwn98yIEt1B7BhRRRH+M3tDEbJeV+j7NY0nSM4o3LdP7D3r/kRZDzT2tINX5r9Dpzvk7+RkeSMhzjhA== diff-match-patch@^1.0.5: version "1.0.5" @@ -4408,9 +4444,9 @@ electron-to-chromium@^1.4.284: integrity sha512-L9zlje9bIw0h+CwPQumiuVlfMcV4boxRjFIWDcLfFqTZNbkwOExBzfmswytHawObQX4OUhtNv8gIiB21kOurIg== electron-to-chromium@^1.4.668: - version "1.4.724" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz#e0a86fe4d3d0e05a4d7b032549d79608078f830d" - integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA== + version "1.4.751" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.751.tgz#b5b19742a435c589de02f60c16618150498bbd59" + integrity sha512-2DEPi++qa89SMGRhufWTiLmzqyuGmNF3SK4+PQetW1JKiZdEpF4XQonJXJCzyuYSA6mauiMhbyVhqYAP45Hvfw== emittery@^0.13.1: version "0.13.1" @@ -4864,12 +4900,12 @@ eslint-plugin-import@^2.25.4: semver "^6.3.1" tsconfig-paths "^3.15.0" -eslint-plugin-jest@^27.2.1: - version "27.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" - integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== +eslint-plugin-jest@^28.0.0: + version "28.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.3.0.tgz#d52dea5e4f191fde061cbf1cea44c8a0a23e62ec" + integrity sha512-5LjCSSno8E+IUCOX4hJiIb/upPIgpkaDEcaN/40gOcw26t/5UTLHFc4JdxKjOOvGTh0XdCu+fNr0fpOVNvcxMA== dependencies: - "@typescript-eslint/utils" "^5.10.0" + "@typescript-eslint/utils" "^6.0.0" eslint-plugin-jsx-a11y@^6.5.1: version "6.8.0" @@ -4899,9 +4935,9 @@ eslint-plugin-matrix-org@1.2.1: integrity sha512-A3cDjhG7RHwfCS8o3bOip8hSCsxtmgk2ahvqE5v/Ic2kPEZxixY6w8zLj7hFGsrRmPSEpLWqkVLt8uvQBapiQA== eslint-plugin-react-hooks@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.28.0: version "7.34.1" @@ -4927,10 +4963,10 @@ eslint-plugin-react@^7.28.0: semver "^6.3.1" string.prototype.matchall "^4.0.10" -eslint-plugin-unicorn@^51.0.0: - version "51.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz#3641c5e110324c3739d6cb98fc1b99ada39f477b" - integrity sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw== +eslint-plugin-unicorn@^52.0.0: + version "52.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz#c7a559edd52e3932cf2b3a05c3b0efc604c1eeb8" + integrity sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng== dependencies: "@babel/helper-validator-identifier" "^7.22.20" "@eslint-community/eslint-utils" "^4.4.0" @@ -4954,7 +4990,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5337,10 +5373,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -focus-lock@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-1.3.3.tgz#b26711506025ec1ecdca69bb41fd10f0c15c4ae2" - integrity sha512-hfXkZha7Xt4RQtrL1HBfspAuIj89Y0fb6GX0dfJilb8S2G/lvL4akPAcHq6xoD2NuZnDMCnZL/zQesMyeu6Psg== +focus-lock@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-1.3.5.tgz#aa644576e5ec47d227b57eb14e1efb2abf33914c" + integrity sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ== dependencies: tslib "^2.0.3" @@ -5755,7 +5791,7 @@ ieee754@^1.1.12: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: +ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -6807,6 +6843,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -6848,6 +6891,13 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -7015,10 +7065,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.1.0: - version "32.1.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.1.0.tgz#b5cb79cc838c450d44d01de1ac58b6cda63b20b9" - integrity sha512-+jRCQKOBuMvAz3nWsf5NGWpttByeC/gw1It1gCZLQsWix6jN1bkHiqwk6OOvcGj4I5ML2bOEbYEr46bcqFUouQ== +matrix-js-sdk@32.3.0-rc.0: + version "32.3.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" + integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" @@ -7167,7 +7217,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: +minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -7626,17 +7676,17 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -playwright-core@1.42.1: - version "1.42.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.42.1.tgz#13c150b93c940a3280ab1d3fbc945bc855c9459e" - integrity sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA== +playwright-core@1.43.1: + version "1.43.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.43.1.tgz#0eafef9994c69c02a1a3825a4343e56c99c03b02" + integrity sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg== -playwright@1.42.1: - version "1.42.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.42.1.tgz#79c828b51fe3830211137550542426111dc8239f" - integrity sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg== +playwright@1.43.1: + version "1.43.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.43.1.tgz#8ad08984ac66c9ef3d0db035be54dd7ec9f1c7d9" + integrity sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA== dependencies: - playwright-core "1.42.1" + playwright-core "1.43.1" optionalDependencies: fsevents "2.3.2" @@ -7726,10 +7776,10 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.116.6: - version "1.116.6" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.116.6.tgz#9a5c9f49230a76642f4c44d93b96710f886c2880" - integrity sha512-rvt8HxzJD4c2B/xsUa4jle8ApdqljeBI2Qqjp4XJMohQf18DXRyM6b96H5/UMs8jxYuZG14Er0h/kEIWeU6Fmw== +posthog-js@1.130.1: + version "1.130.1" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.130.1.tgz#e8d037043f801d438f785f441843cce7d8af7ec3" + integrity sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w== dependencies: fflate "^0.4.8" preact "^10.19.3" @@ -7918,9 +7968,9 @@ raw-loader@^4.0.2: schema-utils "^3.0.0" re-resizable@^6.9.0: - version "6.9.11" - resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.11.tgz#f356e27877f12d926d076ab9ad9ff0b95912b475" - integrity sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ== + version "6.9.16" + resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.16.tgz#d040a3ba9ccb25a3cc85b7622d4eafdee48cf2c2" + integrity sha512-D9+ofwgPQRC6PL6cwavCZO9MUR8TKKxV1nHjbutSdNaFHK9v5k8m6DcESMXrw1+mRJn7fBHJRhZpa7EQ1ZWEEA== react-beautiful-dnd@^13.1.0: version "13.1.1" @@ -7964,15 +8014,15 @@ react-error-boundary@^3.1.0: "@babel/runtime" "^7.12.5" react-focus-lock@^2.5.1: - version "2.11.2" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.11.2.tgz#dcc9a0dde630f0b9c694b823066f1b954c024422" - integrity sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ== + version "2.12.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.12.1.tgz#0eaefd5fc34de8998967043d902e426352393349" + integrity sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^1.3.2" + focus-lock "^1.3.5" prop-types "^15.6.2" react-clientside-effect "^1.2.6" - use-callback-ref "^1.3.0" + use-callback-ref "^1.3.2" use-sidecar "^1.1.2" react-is@^16.13.1, react-is@^16.7.0: @@ -8412,13 +8462,6 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.7, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -8426,6 +8469,13 @@ semver@^7.5.3: dependencies: lru-cache "^6.0.0" +semver@^7.5.4, semver@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -8829,19 +8879,19 @@ stylelint-scss@^6.0.0: postcss-value-parser "^4.2.0" stylelint@^16.1.0: - version "16.3.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.3.1.tgz#006cc6cd4bd8e7b3acb1607bb8e8de85121b7847" - integrity sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw== + version "16.4.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.4.0.tgz#8811005be82ca06224bc9bc3b4cf2fce30b347ae" + integrity sha512-uSx7VMuXwLuYcNSIg+0/fFNv0WinsfLAqsVVy7h7p80clKOHiGE8pfY6UjqwylTHiJrRIahTl6a8FPxGezhWoA== dependencies: "@csstools/css-parser-algorithms" "^2.6.1" "@csstools/css-tokenizer" "^2.2.4" "@csstools/media-query-list-parser" "^2.1.9" - "@csstools/selector-specificity" "^3.0.2" + "@csstools/selector-specificity" "^3.0.3" "@dual-bundle/import-meta-resolve" "^4.0.0" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" - css-functions-list "^3.2.1" + css-functions-list "^3.2.2" css-tree "^2.3.1" debug "^4.3.4" fast-glob "^3.3.2" @@ -8870,7 +8920,7 @@ stylelint@^16.1.0: strip-ansi "^7.1.0" supports-hyperlinks "^3.0.0" svg-tags "^1.0.0" - table "^6.8.1" + table "^6.8.2" write-file-atomic "^5.0.1" supercluster@^7.1.5: @@ -8973,7 +9023,7 @@ tabbable@^6.0.0: resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== -table@^6.8.1: +table@^6.8.2: version "6.8.2" resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== @@ -9071,7 +9121,7 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -ts-api-utils@^1.0.1: +ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== @@ -9105,23 +9155,11 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.1, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -9206,10 +9244,10 @@ typed-array-length@^1.0.4, typed-array-length@^1.0.5: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +typescript@5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== ua-parser-js@^1.0.2: version "1.0.37" @@ -9290,7 +9328,7 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" -uri-js@^4.2.2: +uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -9312,6 +9350,13 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" +use-callback-ref@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + use-memo-one@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" From 0b9759b86efe7e8c55c15ebd7204073d0681dec8 Mon Sep 17 00:00:00 2001 From: "marc.sirisak" <marc.sirisak@beta.gouv.fr> Date: Tue, 28 May 2024 17:51:47 +0200 Subject: [PATCH 67/68] chore(update-patch): update js patch to 32.4.0 --- .../{matrix-js-sdk+32.1.0.patch => matrix-js-sdk+32.4.0.patch} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename patches/activate-expired-account-panel/{matrix-js-sdk+32.1.0.patch => matrix-js-sdk+32.4.0.patch} (100%) diff --git a/patches/activate-expired-account-panel/matrix-js-sdk+32.1.0.patch b/patches/activate-expired-account-panel/matrix-js-sdk+32.4.0.patch similarity index 100% rename from patches/activate-expired-account-panel/matrix-js-sdk+32.1.0.patch rename to patches/activate-expired-account-panel/matrix-js-sdk+32.4.0.patch From 0bf90a202a821684987e0630e81859cdfa94b702 Mon Sep 17 00:00:00 2001 From: "marc.sirisak" <marc.sirisak@beta.gouv.fr> Date: Tue, 28 May 2024 17:52:29 +0200 Subject: [PATCH 68/68] chore(translation): remove unable to decrypt translation in file to match new key --- modules/tchap-translations/tchap_translations.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/tchap-translations/tchap_translations.json b/modules/tchap-translations/tchap_translations.json index a88f185ccc..533f5c37c0 100644 --- a/modules/tchap-translations/tchap_translations.json +++ b/modules/tchap-translations/tchap_translations.json @@ -662,10 +662,6 @@ "en": "Tchap is not available at the moment (err:03). View the status of services: https://status.tchap.numerique.gouv.fr", "fr": "La connexion à Tchap n'est pas possible pour le moment (err:03). Voir l'état du service: https://status.tchap.numerique.gouv.fr" }, - "threads|unable_to_decrypt": { - "en": "Decrypting...", - "fr": "Déchiffrement en cours..." - }, "threads|unable_to_decrypt_with_info_message": { "en": "Decrypting... <a>Find out more</a>", "fr": "Déchiffrement en cours... <a>En savoir plus</a>"