From 5057668705bc672b4abfe84e0bac235a0029599c Mon Sep 17 00:00:00 2001 From: Timo <16718859+toger5@users.noreply.github.com> Date: Wed, 6 Nov 2024 21:15:19 +0100 Subject: [PATCH 1/7] Auto approvoce `io.element.call.reaction` capability for element call widgets (#28401) --- src/stores/widgets/StopGapWidgetDriver.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 07fca154e8..09553b40ce 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -127,12 +127,6 @@ export class StopGapWidgetDriver extends WidgetDriver { this.allowedCapabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent); this.allowedCapabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent); - this.allowedCapabilities.add( - WidgetEventCapability.forRoomEvent(EventDirection.Send, "org.matrix.rageshake_request").raw, - ); - this.allowedCapabilities.add( - WidgetEventCapability.forRoomEvent(EventDirection.Receive, "org.matrix.rageshake_request").raw, - ); this.allowedCapabilities.add( WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomMember).raw, ); @@ -175,7 +169,13 @@ export class StopGapWidgetDriver extends WidgetDriver { WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomCreate).raw, ); - const sendRecvRoomEvents = ["io.element.call.encryption_keys", EventType.Reaction, EventType.RoomRedaction]; + const sendRecvRoomEvents = [ + "io.element.call.encryption_keys", + "org.matrix.rageshake_request", + EventType.Reaction, + EventType.RoomRedaction, + "io.element.call.reaction", + ]; for (const eventType of sendRecvRoomEvents) { this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Send, eventType).raw); this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Receive, eventType).raw); From b92101a3da886b2304b97a9f53d4298f138a3437 Mon Sep 17 00:00:00 2001 From: ElementRobot <releases@riot.im> Date: Thu, 7 Nov 2024 09:34:13 +0000 Subject: [PATCH 2/7] [create-pull-request] automated change (#28403) Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com> --- playwright/plugins/homeserver/synapse/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright/plugins/homeserver/synapse/index.ts b/playwright/plugins/homeserver/synapse/index.ts index 6434e70f48..6dfd4b5ef5 100644 --- a/playwright/plugins/homeserver/synapse/index.ts +++ b/playwright/plugins/homeserver/synapse/index.ts @@ -20,7 +20,7 @@ import { randB64Bytes } from "../../utils/rand"; // Docker tag to use for synapse docker image. // We target a specific digest as every now and then a Synapse update will break our CI. // This digest is updated by the playwright-image-updates.yaml workflow periodically. -const DOCKER_TAG = "develop@sha256:6c33604ee62f009f3b34454a3c3e85f7e3ff5de63e45011fcd79e0ddc54a4e51"; +const DOCKER_TAG = "develop@sha256:5bae9c459793f800db51bf8ec5e606ae49f7497f081cdbf83ee637885f9f8f7e"; async function cfgDirFromTemplate(opts: StartHomeserverOpts): Promise<Omit<HomeserverConfig, "dockerUrl">> { const templateDir = path.join(__dirname, "templates", opts.template); From 74a919cb65e5d83b4007e6b012a8f68e7b3fb498 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 Nov 2024 11:39:18 +0000 Subject: [PATCH 3/7] Deduplicate icons using Compound Design Tokens (#28381) * Deduplicate icons using Compound Design Tokens Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unused test images Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update snapshots & screenshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../forgot-password-verify-email-linux.png | Bin 22161 -> 22130 bytes res/css/structures/_RoomStatusBar.pcss | 2 +- res/css/structures/_SpaceHierarchy.pcss | 2 +- .../context_menus/_MessageContextMenu.pcss | 4 +- .../dialogs/_AddExistingToSpaceDialog.pcss | 2 +- .../security/_AccessSecretStorageDialog.pcss | 4 +- res/css/views/elements/_InfoTooltip.pcss | 2 +- res/css/views/messages/_MessageActionBar.pcss | 4 ++ res/css/views/rooms/_EntityTile.pcss | 3 +- res/css/views/rooms/_ThreadSummary.pcss | 8 ++-- res/img/compound/chevron-right-12px.svg | 10 ----- res/img/compound/retry-16px.svg | 3 -- res/img/element-icons/retry.svg | 7 ---- res/img/element-icons/warning-badge.svg | 32 -------------- res/img/element-icons/warning.svg | 3 -- res/img/member_chevron.png | Bin 271 -> 0 bytes .../auth/forgot-password/CheckEmail.tsx | 4 +- .../auth/forgot-password/VerifyEmailModal.tsx | 4 +- .../dialogs/AddExistingToSpaceDialog.tsx | 4 +- .../views/dialogs/ModalWidgetDialog.tsx | 4 +- src/components/views/location/MapError.tsx | 4 +- .../views/messages/MessageActionBar.tsx | 6 +-- .../__snapshots__/MapError-test.tsx.snap | 39 +++++++++++++++--- .../__snapshots__/MBeaconBody-test.tsx.snap | 13 +++++- test/unit-tests/img/edit.png | Bin 460 -> 0 bytes test/unit-tests/img/icon_context_message.svg | 15 ------- 26 files changed, 75 insertions(+), 104 deletions(-) delete mode 100644 res/img/compound/chevron-right-12px.svg delete mode 100644 res/img/compound/retry-16px.svg delete mode 100644 res/img/element-icons/retry.svg delete mode 100644 res/img/element-icons/warning-badge.svg delete mode 100644 res/img/element-icons/warning.svg delete mode 100644 res/img/member_chevron.png delete mode 100644 test/unit-tests/img/edit.png delete mode 100644 test/unit-tests/img/icon_context_message.svg diff --git a/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png b/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png index b43d78bec854278054c0787d867486ed00587eb7..5fa7969c5743b0e1270c952cbc31092f445c237e 100644 GIT binary patch literal 22130 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 literal 22161 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 UoRQ?-V5LbkRJB#g;g+xe2SLK2^8f$< diff --git a/res/css/structures/_RoomStatusBar.pcss b/res/css/structures/_RoomStatusBar.pcss index b131009868..0f30401a6b 100644 --- a/res/css/structures/_RoomStatusBar.pcss +++ b/res/css/structures/_RoomStatusBar.pcss @@ -125,7 +125,7 @@ Please see LICENSE files in the repository root for full details. padding-left: 34px; /* 28px from above, but +6px to account for the wider icon */ &::before { - mask-image: url("$(res)/img/element-icons/retry.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/restart.svg"); } } } diff --git a/res/css/structures/_SpaceHierarchy.pcss b/res/css/structures/_SpaceHierarchy.pcss index d91d5b8d9b..812b5474a3 100644 --- a/res/css/structures/_SpaceHierarchy.pcss +++ b/res/css/structures/_SpaceHierarchy.pcss @@ -77,7 +77,7 @@ Please see LICENSE files in the repository root for full details. height: 16px; width: 16px; left: 0; - background-image: url("$(res)/img/element-icons/warning-badge.svg"); + background-image: url("@vector-im/compound-design-tokens/icons/error.svg"); background-size: cover; background-repeat: no-repeat; } diff --git a/res/css/views/context_menus/_MessageContextMenu.pcss b/res/css/views/context_menus/_MessageContextMenu.pcss index 20d7ed1d13..e06782ebe9 100644 --- a/res/css/views/context_menus/_MessageContextMenu.pcss +++ b/res/css/views/context_menus/_MessageContextMenu.pcss @@ -29,7 +29,7 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageContextMenu_iconReport::before { - mask-image: url("$(res)/img/element-icons/warning-badge.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/error.svg"); } .mx_MessageContextMenu_iconLink::before { @@ -61,7 +61,7 @@ Please see LICENSE files in the repository root for full details. } .mx_MessageContextMenu_iconResend::before { - mask-image: url("$(res)/img/element-icons/retry.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/restart.svg"); } .mx_MessageContextMenu_iconSource::before { diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss b/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss index 6ac9bc3975..1656ca7e67 100644 --- a/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss +++ b/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss @@ -125,7 +125,7 @@ Please see LICENSE files in the repository root for full details. mask-repeat: no-repeat; mask-position: center; mask-size: contain; - mask-image: url("$(res)/img/element-icons/retry.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/restart.svg"); width: 18px; height: 18px; left: 0; diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss index 0b42281e3e..e5abc1e48b 100644 --- a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss +++ b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss @@ -21,7 +21,7 @@ Please see LICENSE files in the repository root for full details. &.mx_AccessSecretStorageDialog_resetBadge::before { /* The image isn't capable of masking, so we use a background instead. */ - background-image: url("$(res)/img/element-icons/warning-badge.svg"); + background-image: url("@vector-im/compound-design-tokens/icons/error.svg"); background-size: 24px; background-color: transparent; } @@ -120,7 +120,7 @@ Please see LICENSE files in the repository root for full details. width: 16px; left: 0; top: 2px; /* alignment */ - background-image: url("$(res)/img/element-icons/warning-badge.svg"); + background-image: url("@vector-im/compound-design-tokens/icons/error.svg"); background-size: contain; } diff --git a/res/css/views/elements/_InfoTooltip.pcss b/res/css/views/elements/_InfoTooltip.pcss index a9a4dd42e6..0329f6a63b 100644 --- a/res/css/views/elements/_InfoTooltip.pcss +++ b/res/css/views/elements/_InfoTooltip.pcss @@ -29,5 +29,5 @@ Please see LICENSE files in the repository root for full details. } .mx_InfoTooltip_icon_warning::before { - mask-image: url("$(res)/img/element-icons/warning.svg"); + mask-image: url("@vector-im/compound-design-tokens/icons/error.svg"); } diff --git a/res/css/views/messages/_MessageActionBar.pcss b/res/css/views/messages/_MessageActionBar.pcss index 4fe68f08d0..3768bfb021 100644 --- a/res/css/views/messages/_MessageActionBar.pcss +++ b/res/css/views/messages/_MessageActionBar.pcss @@ -108,6 +108,10 @@ Please see LICENSE files in the repository root for full details. color: var(--cpd-color-icon-primary); } + &.mx_MessageActionBar_retryButton { + --MessageActionBar-icon-size: 16px; + } + &.mx_MessageActionBar_downloadButton { --MessageActionBar-icon-size: 14px; diff --git a/res/css/views/rooms/_EntityTile.pcss b/res/css/views/rooms/_EntityTile.pcss index 7b23cde43c..979d5bb5d4 100644 --- a/res/css/views/rooms/_EntityTile.pcss +++ b/res/css/views/rooms/_EntityTile.pcss @@ -31,8 +31,9 @@ Please see LICENSE files in the repository root for full details. position: absolute; top: calc(50% - 8px); /* center */ right: -8px; - mask: url("$(res)/img/member_chevron.png"); + mask: url("@vector-im/compound-design-tokens/icons/chevron-right.svg"); mask-repeat: no-repeat; + mask-position: center; width: 16px; height: 16px; background-color: $header-panel-text-primary-color; diff --git a/res/css/views/rooms/_ThreadSummary.pcss b/res/css/views/rooms/_ThreadSummary.pcss index b07c747d29..118ee51283 100644 --- a/res/css/views/rooms/_ThreadSummary.pcss +++ b/res/css/views/rooms/_ThreadSummary.pcss @@ -53,11 +53,11 @@ Please see LICENSE files in the repository root for full details. content: ""; position: absolute; top: 50%; - right: $spacing-12; + right: var(--cpd-space-1x); transform: translateY(-50%); - width: 12px; - height: 12px; - mask-image: url("$(res)/img/compound/chevron-right-12px.svg"); + width: 24px; + height: 24px; + mask-image: url("@vector-im/compound-design-tokens/icons/chevron-right.svg"); mask-position: center; mask-size: contain; mask-repeat: no-repeat; diff --git a/res/img/compound/chevron-right-12px.svg b/res/img/compound/chevron-right-12px.svg deleted file mode 100644 index 02f61f36ff..0000000000 --- a/res/img/compound/chevron-right-12px.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_1692_80)"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M3.96967 10.7197C3.67678 10.4268 3.67601 9.95114 3.96795 9.6573L7.66823 5.933L3.95592 2.22069C3.66303 1.92779 3.66226 1.45215 3.9542 1.15831C4.24615 0.864473 4.72025 0.863706 5.01315 1.1566L9.25579 5.39924C9.54868 5.69213 9.54945 6.16777 9.2575 6.46161L5.02861 10.718C4.73667 11.0118 4.26256 11.0126 3.96967 10.7197Z" fill="#737D8C"/> -</g> -<defs> -<clipPath id="clip0_1692_80"> -<rect width="12" height="12" fill="white"/> -</clipPath> -</defs> -</svg> diff --git a/res/img/compound/retry-16px.svg b/res/img/compound/retry-16px.svg deleted file mode 100644 index 443a0d7b85..0000000000 --- a/res/img/compound/retry-16px.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M4.02266 2.96455C5.11589 2.10004 6.49866 1.5835 8 1.5835C11.3187 1.5835 14.049 4.10294 14.3825 7.3335H15.6723C15.9336 7.3335 16.0894 7.62498 15.9445 7.8426L13.9388 10.8543C13.8094 11.0488 13.524 11.0488 13.3945 10.8543L11.3888 7.8426C11.2439 7.62498 11.3997 7.3335 11.661 7.3335H12.8719C12.5465 4.93343 10.4893 3.0835 8 3.0835C6.84828 3.0835 5.79092 3.47857 4.95308 4.14112C4.8969 4.18555 4.84851 4.22129 4.81295 4.24673C4.7951 4.2595 4.78032 4.26979 4.7692 4.27743L4.75529 4.28689L4.75051 4.2901L4.74868 4.29132L4.74791 4.29183L4.74756 4.29206L4.74739 4.29217L4.74731 4.29223L4.33341 3.66694L4.74723 4.29228C4.40181 4.52087 3.93648 4.42616 3.70788 4.08073C3.47976 3.736 3.57362 3.27185 3.91734 3.04277L3.92021 3.04081L3.94013 3.02682C3.95912 3.01323 3.988 2.99197 4.02266 2.96455ZM3.12815 8.66683H4.33901C4.60027 8.66683 4.7561 8.37534 4.61118 8.15772L2.60551 5.14598C2.47603 4.95156 2.19064 4.95156 2.06116 5.14598L0.0554881 8.15772C-0.0894338 8.37534 0.0663988 8.66683 0.327661 8.66683H1.61755C1.95103 11.8974 4.68129 14.4168 8 14.4168C9.56831 14.4168 11.0069 13.8532 12.1215 12.9184C12.4388 12.6522 12.4803 12.1791 12.2141 11.8617C11.9479 11.5444 11.4749 11.5029 11.1575 11.7691C10.303 12.4859 9.20281 12.9168 8 12.9168C5.51071 12.9168 3.4535 11.0669 3.12815 8.66683Z" fill="currentColor"/> -</svg> diff --git a/res/img/element-icons/retry.svg b/res/img/element-icons/retry.svg deleted file mode 100644 index 6e5b8651fc..0000000000 --- a/res/img/element-icons/retry.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="17" height="16" fill="none"> -<path - fill="currentColor" - fill-rule="evenodd" - d="M4.523 2.964a6.418 6.418 0 0 1 10.36 4.369h1.29c.26 0 .416.292.272.51l-2.006 3.011a.327.327 0 0 1-.544 0l-2.006-3.012a.327.327 0 0 1 .272-.509h1.21a4.918 4.918 0 0 0-7.918-3.192 3.684 3.684 0 0 1-.184.136l-.014.01-.004.003-.002.001h-.001v.001l-.415-.625.414.625a.75.75 0 0 1-.83-1.25l.003-.001.02-.014c.02-.014.048-.035.083-.063Zm-.895 5.703H4.84a.327.327 0 0 0 .272-.51L3.106 5.146a.327.327 0 0 0-.545 0L.555 8.157c-.144.218.011.51.273.51h1.29a6.418 6.418 0 0 0 10.503 4.251.75.75 0 0 0-.963-1.15 4.918 4.918 0 0 1-8.03-3.102Z" - clip-rule="evenodd"/> -</svg> diff --git a/res/img/element-icons/warning-badge.svg b/res/img/element-icons/warning-badge.svg deleted file mode 100644 index 09e0944bdb..0000000000 --- a/res/img/element-icons/warning-badge.svg +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - id="svg8" - version="1.1" - fill="none" - viewBox="0 0 24 24" - height="24" - width="24"> - <metadata - id="metadata14"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs12" /> - <path - id="path2" - d="M 12 2 C 6.47715 2 2 6.47715 2 12 C 2 17.5228 6.47715 22 12 22 C 17.5228 22 22 17.5228 22 12 C 22 6.47715 17.5228 2 12 2 z M 11.880859 5.5039062 C 12.720859 5.4439063 13.470547 6.0746875 13.560547 6.9296875 L 13.560547 7.1699219 L 13.080078 13.169922 C 13.035078 13.724922 12.570625 14.144531 12.015625 14.144531 L 11.925781 14.144531 C 11.400781 14.099531 10.996172 13.694922 10.951172 13.169922 L 10.470703 7.1699219 C 10.395703 6.3149219 11.025859 5.5639064 11.880859 5.5039062 z M 12 15.763672 C 12.729 15.763672 13.320312 16.354884 13.320312 17.083984 C 13.320313 17.812984 12.729 18.404297 12 18.404297 C 11.271 18.404297 10.679688 17.812984 10.679688 17.083984 C 10.679688 16.354884 11.271 15.763672 12 15.763672 z " - style="fill:#ff5b55;fill-opacity:1" /> -</svg> diff --git a/res/img/element-icons/warning.svg b/res/img/element-icons/warning.svg deleted file mode 100644 index eef5193140..0000000000 --- a/res/img/element-icons/warning.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16ZM6.9806 4.5101C6.9306 3.9401 7.3506 3.4401 7.9206 3.4001C8.4806 3.3601 8.9806 3.7801 9.0406 4.3501V4.5101L8.7206 8.5101C8.6906 8.8801 8.3806 9.1601 8.0106 9.1601H7.9506C7.6006 9.1301 7.3306 8.8601 7.3006 8.5101L6.9806 4.5101ZM8.88012 11.1202C8.88012 11.6062 8.48613 12.0002 8.00012 12.0002C7.51411 12.0002 7.12012 11.6062 7.12012 11.1202C7.12012 10.6342 7.51411 10.2402 8.00012 10.2402C8.48613 10.2402 8.88012 10.6342 8.88012 11.1202Z" fill="#8D99A5"/> -</svg> diff --git a/res/img/member_chevron.png b/res/img/member_chevron.png deleted file mode 100644 index cbbd289dcf4a780581a0227433a1a9278c34bc49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmV+q0r38bP)<h;3K|Lk000e1NJLTq000O8000aK1^@s6U!MG(00001b5ch_0Itp) z=>Px#$w@>(R2Ug!V1NQ`ZEZFf8<}PTa+r*bjTf@BvtQ8B(Gf?M1hE+n4Go={n3(o} zIRF3uzy9mjFUKoauDk^CL4f(iix>ALB_$bwzyXLwnVFfrg@uLJyn6NOD_8-Dc>etP z0bGihK?*<smm-iO;Q(m=bRg#qNC0S^CMzqe8(aa%2W)I?`+;&IAO%1NH=aL#ela76 z1Cs>lf=Qk`cdh}%26<ByC~***BuD`h&?sr3q&$cNG8U#2#D@c*DfYn7%!dmgF#x8v VPh0W_a%BJj002ovPDHLkV1j7yWrY9$ diff --git a/src/components/structures/auth/forgot-password/CheckEmail.tsx b/src/components/structures/auth/forgot-password/CheckEmail.tsx index feca331894..dbc667c07e 100644 --- a/src/components/structures/auth/forgot-password/CheckEmail.tsx +++ b/src/components/structures/auth/forgot-password/CheckEmail.tsx @@ -8,10 +8,10 @@ Please see LICENSE files in the repository root for full details. import React, { ReactNode } from "react"; import { Tooltip } from "@vector-im/compound-web"; +import { RestartIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import AccessibleButton from "../../../views/elements/AccessibleButton"; import { Icon as EMailPromptIcon } from "../../../../../res/img/element-icons/email-prompt.svg"; -import { Icon as RetryIcon } from "../../../../../res/img/compound/retry-16px.svg"; import { _t } from "../../../../languageHandler"; import { useTimeoutToggle } from "../../../../hooks/useTimeoutToggle"; import { ErrorMessage } from "../../ErrorMessage"; @@ -60,7 +60,7 @@ export const CheckEmail: React.FC<CheckEmailProps> = ({ <span className="mx_VerifyEMailDialog_text-light">{_t("auth|check_email_resend_prompt")}</span> <Tooltip description={_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" /> + <RestartIcon className="mx_Icon mx_Icon_16" /> {_t("action|resend")} </AccessibleButton> </Tooltip> diff --git a/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx b/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx index d883177d0c..24caa2b13d 100644 --- a/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx +++ b/src/components/structures/auth/forgot-password/VerifyEmailModal.tsx @@ -8,10 +8,10 @@ Please see LICENSE files in the repository root for full details. import React, { ReactNode } from "react"; import { Tooltip } from "@vector-im/compound-web"; +import { RestartIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t } from "../../../../languageHandler"; import AccessibleButton from "../../../views/elements/AccessibleButton"; -import { Icon as RetryIcon } from "../../../../../res/img/compound/retry-16px.svg"; import { Icon as EmailPromptIcon } from "../../../../../res/img/element-icons/email-prompt.svg"; import { useTimeoutToggle } from "../../../../hooks/useTimeoutToggle"; import { ErrorMessage } from "../../ErrorMessage"; @@ -59,7 +59,7 @@ export const VerifyEmailModal: React.FC<Props> = ({ <span className="mx_VerifyEMailDialog_text-light">{_t("auth|check_email_resend_prompt")}</span> <Tooltip description={_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" /> + <RestartIcon className="mx_Icon mx_Icon_16" /> {_t("action|resend")} </AccessibleButton> </Tooltip> diff --git a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx index ce60b76d2e..31162b45f4 100644 --- a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx +++ b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx @@ -12,6 +12,7 @@ import { Room, EventType } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; import { sleep } from "matrix-js-sdk/src/utils"; import { logger } from "matrix-js-sdk/src/logger"; +import { ErrorIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t, _td, TranslationKey } from "../../../languageHandler"; import BaseDialog from "./BaseDialog"; @@ -34,7 +35,6 @@ import LazyRenderList from "../elements/LazyRenderList"; import { useSettingValue } from "../../../hooks/useSettings"; import { filterBoolean } from "../../../utils/arrays"; import { NonEmptyArray } from "../../../@types/common"; -import WarningBadgeSvg from "../../../../res/img/element-icons/warning-badge.svg"; // These values match CSS const ROW_HEIGHT = 32 + 12; @@ -229,7 +229,7 @@ export const AddExistingToSpace: React.FC<IAddExistingToSpaceProps> = ({ if (error) { footer = ( <> - <img src={WarningBadgeSvg} height="24" width="24" alt="" /> + <ErrorIcon height="24px" width="24px" /> <span className="mx_AddExistingToSpaceDialog_error"> <div className="mx_AddExistingToSpaceDialog_errorHeading"> diff --git a/src/components/views/dialogs/ModalWidgetDialog.tsx b/src/components/views/dialogs/ModalWidgetDialog.tsx index 90f330c625..7df9130a7a 100644 --- a/src/components/views/dialogs/ModalWidgetDialog.tsx +++ b/src/components/views/dialogs/ModalWidgetDialog.tsx @@ -22,6 +22,7 @@ import { WidgetApiFromWidgetAction, WidgetKind, } from "matrix-widget-api"; +import { ErrorIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import BaseDialog from "./BaseDialog"; import { _t, getUserLanguage } from "../../../languageHandler"; @@ -33,7 +34,6 @@ import { arrayFastClone } from "../../../utils/arrays"; import { ElementWidget } from "../../../stores/widgets/StopGapWidget"; import { ELEMENT_CLIENT_ID } from "../../../identifiers"; import SettingsStore from "../../../settings/SettingsStore"; -import WarningBadgeSvg from "../../../../res/img/element-icons/warning-badge.svg"; interface IProps { widgetDefinition: IModalWidgetOpenRequestData; @@ -186,7 +186,7 @@ export default class ModalWidgetDialog extends React.PureComponent<IProps, IStat onFinished={this.props.onFinished} > <div className="mx_ModalWidgetDialog_warning"> - <img src={WarningBadgeSvg} height="16" width="16" alt="" /> + <ErrorIcon width="16px" height="16px" /> {_t("widget|modal_data_warning", { widgetDomain: parsed.hostname, })} diff --git a/src/components/views/location/MapError.tsx b/src/components/views/location/MapError.tsx index 5b19d10522..319223d3f9 100644 --- a/src/components/views/location/MapError.tsx +++ b/src/components/views/location/MapError.tsx @@ -8,8 +8,8 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import classNames from "classnames"; +import { ErrorIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import { Icon as WarningBadge } from "../../../../res/img/element-icons/warning-badge.svg"; import { _t } from "../../../languageHandler"; import { getLocationShareErrorMessage, LocationShareError } from "../../../utils/location"; import AccessibleButton from "../elements/AccessibleButton"; @@ -29,7 +29,7 @@ export const MapError: React.FC<MapErrorProps> = ({ error, isMinimised, classNam className={classNames("mx_MapError", className, { mx_MapError_isMinimised: isMinimised })} onClick={onClick} > - <WarningBadge className="mx_MapError_icon" /> + <ErrorIcon className="mx_MapError_icon" /> <Heading className="mx_MapError_heading" size="3"> {_t("location_sharing|failed_load_map")} </Heading> diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index ddf637dee2..2f3c73a429 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -27,11 +27,11 @@ import { OverflowHorizontalIcon, ReplyIcon, DeleteIcon, + RestartIcon, } from "@vector-im/compound-design-tokens/assets/web/icons"; import { Icon as EditIcon } from "../../../../res/img/element-icons/room/message-bar/edit.svg"; import { Icon as EmojiIcon } from "../../../../res/img/element-icons/room/message-bar/emoji.svg"; -import { Icon as ResendIcon } from "../../../../res/img/element-icons/retry.svg"; import { Icon as ThreadIcon } from "../../../../res/img/element-icons/message/thread.svg"; import { Icon as ExpandMessageIcon } from "../../../../res/img/element-icons/expand-message.svg"; import { Icon as CollapseMessageIcon } from "../../../../res/img/element-icons/collapse-message.svg"; @@ -475,14 +475,14 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction 0, 0, <RovingAccessibleButton - className="mx_MessageActionBar_iconButton" + className="mx_MessageActionBar_iconButton mx_MessageActionBar_retryButton" title={_t("action|retry")} onClick={this.onResendClick} onContextMenu={this.onResendClick} key="resend" placement="left" > - <ResendIcon /> + <RestartIcon /> </RovingAccessibleButton>, ); diff --git a/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap b/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap index 427da8ffef..238097d995 100644 --- a/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap +++ b/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap @@ -6,9 +6,18 @@ exports[`<MapError /> applies class when isMinimised is truthy 1`] = ` class="mx_MapError test mx_MapError_isMinimised" data-testid="map-rendering-error" > - <div + <svg class="mx_MapError_icon" - /> + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12 17a.97.97 0 0 0 .713-.288A.968.968 0 0 0 13 16a.968.968 0 0 0-.287-.713A.968.968 0 0 0 12 15a.968.968 0 0 0-.713.287A.968.968 0 0 0 11 16c0 .283.096.52.287.712.192.192.43.288.713.288Zm0-4c.283 0 .52-.096.713-.287A.968.968 0 0 0 13 12V8a.967.967 0 0 0-.287-.713A.968.968 0 0 0 12 7a.968.968 0 0 0-.713.287A.967.967 0 0 0 11 8v4c0 .283.096.52.287.713.192.191.43.287.713.287Zm0 9a9.738 9.738 0 0 1-3.9-.788 10.099 10.099 0 0 1-3.175-2.137c-.9-.9-1.612-1.958-2.137-3.175A9.738 9.738 0 0 1 2 12a9.74 9.74 0 0 1 .788-3.9 10.099 10.099 0 0 1 2.137-3.175c.9-.9 1.958-1.612 3.175-2.137A9.738 9.738 0 0 1 12 2a9.74 9.74 0 0 1 3.9.788 10.098 10.098 0 0 1 3.175 2.137c.9.9 1.613 1.958 2.137 3.175A9.738 9.738 0 0 1 22 12a9.738 9.738 0 0 1-.788 3.9 10.098 10.098 0 0 1-2.137 3.175c-.9.9-1.958 1.613-3.175 2.137A9.738 9.738 0 0 1 12 22Z" + /> + </svg> <h3 class="mx_Heading_h3 mx_MapError_heading" > @@ -36,9 +45,18 @@ exports[`<MapError /> renders correctly for MapStyleUrlNotConfigured 1`] = ` class="mx_MapError test" data-testid="map-rendering-error" > - <div + <svg class="mx_MapError_icon" - /> + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12 17a.97.97 0 0 0 .713-.288A.968.968 0 0 0 13 16a.968.968 0 0 0-.287-.713A.968.968 0 0 0 12 15a.968.968 0 0 0-.713.287A.968.968 0 0 0 11 16c0 .283.096.52.287.712.192.192.43.288.713.288Zm0-4c.283 0 .52-.096.713-.287A.968.968 0 0 0 13 12V8a.967.967 0 0 0-.287-.713A.968.968 0 0 0 12 7a.968.968 0 0 0-.713.287A.967.967 0 0 0 11 8v4c0 .283.096.52.287.713.192.191.43.287.713.287Zm0 9a9.738 9.738 0 0 1-3.9-.788 10.099 10.099 0 0 1-3.175-2.137c-.9-.9-1.612-1.958-2.137-3.175A9.738 9.738 0 0 1 2 12a9.74 9.74 0 0 1 .788-3.9 10.099 10.099 0 0 1 2.137-3.175c.9-.9 1.958-1.612 3.175-2.137A9.738 9.738 0 0 1 12 2a9.74 9.74 0 0 1 3.9.788 10.098 10.098 0 0 1 3.175 2.137c.9.9 1.613 1.958 2.137 3.175A9.738 9.738 0 0 1 22 12a9.738 9.738 0 0 1-.788 3.9 10.098 10.098 0 0 1-2.137 3.175c-.9.9-1.958 1.613-3.175 2.137A9.738 9.738 0 0 1 12 22Z" + /> + </svg> <h3 class="mx_Heading_h3 mx_MapError_heading" > @@ -66,9 +84,18 @@ exports[`<MapError /> renders correctly for MapStyleUrlNotReachable 1`] = ` class="mx_MapError test" data-testid="map-rendering-error" > - <div + <svg class="mx_MapError_icon" - /> + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12 17a.97.97 0 0 0 .713-.288A.968.968 0 0 0 13 16a.968.968 0 0 0-.287-.713A.968.968 0 0 0 12 15a.968.968 0 0 0-.713.287A.968.968 0 0 0 11 16c0 .283.096.52.287.712.192.192.43.288.713.288Zm0-4c.283 0 .52-.096.713-.287A.968.968 0 0 0 13 12V8a.967.967 0 0 0-.287-.713A.968.968 0 0 0 12 7a.968.968 0 0 0-.713.287A.967.967 0 0 0 11 8v4c0 .283.096.52.287.713.192.191.43.287.713.287Zm0 9a9.738 9.738 0 0 1-3.9-.788 10.099 10.099 0 0 1-3.175-2.137c-.9-.9-1.612-1.958-2.137-3.175A9.738 9.738 0 0 1 2 12a9.74 9.74 0 0 1 .788-3.9 10.099 10.099 0 0 1 2.137-3.175c.9-.9 1.958-1.612 3.175-2.137A9.738 9.738 0 0 1 12 2a9.74 9.74 0 0 1 3.9.788 10.098 10.098 0 0 1 3.175 2.137c.9.9 1.613 1.958 2.137 3.175A9.738 9.738 0 0 1 22 12a9.738 9.738 0 0 1-.788 3.9 10.098 10.098 0 0 1-2.137 3.175c-.9.9-1.958 1.613-3.175 2.137A9.738 9.738 0 0 1 12 22Z" + /> + </svg> <h3 class="mx_Heading_h3 mx_MapError_heading" > diff --git a/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap index 73b2570165..de31628ec3 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap @@ -5,9 +5,18 @@ exports[`<MBeaconBody /> when map display is not configured renders maps unavail class="mx_MapError mx_MBeaconBody_mapError mx_MBeaconBody_mapErrorInteractive mx_MapError_isMinimised" data-testid="map-rendering-error" > - <div + <svg class="mx_MapError_icon" - /> + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12 17a.97.97 0 0 0 .713-.288A.968.968 0 0 0 13 16a.968.968 0 0 0-.287-.713A.968.968 0 0 0 12 15a.968.968 0 0 0-.713.287A.968.968 0 0 0 11 16c0 .283.096.52.287.712.192.192.43.288.713.288Zm0-4c.283 0 .52-.096.713-.287A.968.968 0 0 0 13 12V8a.967.967 0 0 0-.287-.713A.968.968 0 0 0 12 7a.968.968 0 0 0-.713.287A.967.967 0 0 0 11 8v4c0 .283.096.52.287.713.192.191.43.287.713.287Zm0 9a9.738 9.738 0 0 1-3.9-.788 10.099 10.099 0 0 1-3.175-2.137c-.9-.9-1.612-1.958-2.137-3.175A9.738 9.738 0 0 1 2 12a9.74 9.74 0 0 1 .788-3.9 10.099 10.099 0 0 1 2.137-3.175c.9-.9 1.958-1.612 3.175-2.137A9.738 9.738 0 0 1 12 2a9.74 9.74 0 0 1 3.9.788 10.098 10.098 0 0 1 3.175 2.137c.9.9 1.613 1.958 2.137 3.175A9.738 9.738 0 0 1 22 12a9.738 9.738 0 0 1-.788 3.9 10.098 10.098 0 0 1-2.137 3.175c-.9.9-1.958 1.613-3.175 2.137A9.738 9.738 0 0 1 12 22Z" + /> + </svg> <h3 class="mx_Heading_h3 mx_MapError_heading" > diff --git a/test/unit-tests/img/edit.png b/test/unit-tests/img/edit.png deleted file mode 100644 index 6f373d3f3dc7dfbb4186e4347fad43920bd04279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmV;-0W<!IP)<h;3K|Lk000e1NJLTq000gE000gM1^@s6A4o0H00001b5ch_0Itp) z=>Px$hDk(0R45gVlCf&SP!xv$Tx)R<B%3%0jY1+0U3HR9ox2tK2udHp!Dp~<U{~!M zh?6c3MFayH7eNa`6hxt7()*{qA&3;ukbA@VzjMw#=V*vnu~@vV)oRsbGWnuunn{=M z`}S_Pdv7+IZ{zX!Tgf$bX*3%5hGBH_`TSijmqRL*3S8Um7PHw5)9G~XIL=eOUjI}K z2({a7Z@FB`1ec9IYN#c6!}6G^TrO+rbUF;CE~nE8gTVl@bWpS3?>myQVlu+3ygXZ$ zrL^HmsMqUZu~<OYbrcE(91aIPo6Wj{jo_QkO+m6mWHK3)N~J(TEg8Y?sYWRH9I8|* z5JCiQYRUZmDMFtAK@k~*?4iw;)2@N2B_lXo&WR>x1@)$Ad4coqLoFF_9IaN%;hfg% zwLh6me3|*;FsY%IjNlq^Bl`Wme>@&xnr7IDXr|R_1!|}z6Qi@+?S9E9ADhkQk#kBU z5{Sp+@H`K$>tZw-VK^MlZQFiOD;Mr61F(c^m;46@h9Cq<lTzpa0000<MNUMnLSTYK Ck<2du diff --git a/test/unit-tests/img/icon_context_message.svg b/test/unit-tests/img/icon_context_message.svg deleted file mode 100644 index f2ceccfa78..0000000000 --- a/test/unit-tests/img/icon_context_message.svg +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg width="19px" height="19px" viewBox="0 0 19 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> - <!-- Generator: sketchtool 39.1 (31720) - http://www.bohemiancoding.com/sketch --> - <title>ED5D3E59-2561-4AC1-9B43-82FBC51767FC</title> - <desc>Created with sketchtool.</desc> - <defs></defs> - <g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> - <g id="icon_context"> - <g> - <path d="M9.5,19 C14.7467051,19 19,14.7467051 19,9.5 C19,4.25329488 14.7467051,0 9.5,0 C4.25329488,0 0,4.25329488 0,9.5 C0,14.7467051 4.25329488,19 9.5,19 Z" id="Oval-69" fill="#ECECEC"></path> - <path d="M4.5,9.50063771 C4.5,9.13148623 4.59887838,8.85242947 4.7966381,8.66345907 C4.99439782,8.47448867 5.28224377,8.38000488 5.66018457,8.38000488 C6.0249414,8.38000488 6.3072941,8.47668596 6.50725115,8.67005103 C6.70720821,8.86341609 6.80718523,9.14027555 6.80718523,9.50063771 C6.80718523,9.84781589 6.70610956,10.1213794 6.50395517,10.3213365 C6.30180079,10.5212935 6.02054674,10.6212705 5.66018457,10.6212705 C5.29103309,10.6212705 5.00538444,10.5234908 4.80323006,10.3279284 C4.60107568,10.132366 4.5,9.85660521 4.5,9.50063771 L4.5,9.50063771 Z M8.3431114,9.50063771 C8.3431114,9.13148623 8.44198978,8.85242947 8.63974951,8.66345907 C8.83750923,8.47448867 9.12755247,8.38000488 9.50988794,8.38000488 C9.87464476,8.38000488 10.1569975,8.47668596 10.3569545,8.67005103 C10.5569116,8.86341609 10.6568886,9.14027555 10.6568886,9.50063771 C10.6568886,9.84781589 10.5558129,10.1213794 10.3536585,10.3213365 C10.1515042,10.5212935 9.8702501,10.6212705 9.50988794,10.6212705 C9.13634179,10.6212705 8.84849585,10.5234908 8.64634146,10.3279284 C8.44418708,10.132366 8.3431114,9.85660521 8.3431114,9.50063771 L8.3431114,9.50063771 Z M12.1928148,9.50063771 C12.1928148,9.13148623 12.2916931,8.85242947 12.4894529,8.66345907 C12.6872126,8.47448867 12.9750585,8.38000488 13.3529993,8.38000488 C13.7177562,8.38000488 14.0001089,8.47668596 14.2000659,8.67005103 C14.400023,8.86341609 14.5,9.14027555 14.5,9.50063771 C14.5,9.84781589 14.3989243,10.1213794 14.1967699,10.3213365 C13.9946156,10.5212935 13.7133615,10.6212705 13.3529993,10.6212705 C12.9838479,10.6212705 12.6981992,10.5234908 12.4960448,10.3279284 C12.2938904,10.132366 12.1928148,9.85660521 12.1928148,9.50063771 L12.1928148,9.50063771 Z" id="…" fill="#9B9B9B"></path> - </g> - </g> - </g> -</svg> From da4672d715ad3188c44a26ec4f078a2287bd4c57 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 Nov 2024 11:43:33 +0000 Subject: [PATCH 4/7] Handle authenticated media when downloading from ImageView (#28379) * Handle authenticated media when downloading from ImageView Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/ImageView.tsx | 80 +++++++++++++++---- .../views/elements/ImageView-test.tsx | 46 ++++++++++- 2 files changed, 109 insertions(+), 17 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 8032f07b6e..711a221994 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -8,9 +8,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import React, { createRef, CSSProperties } from "react"; +import React, { createRef, CSSProperties, useRef, useState } from "react"; import FocusLock from "react-focus-lock"; -import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { MatrixEvent, parseErrorResponse } from "matrix-js-sdk/src/matrix"; import { _t } from "../../../languageHandler"; import MemberAvatar from "../avatars/MemberAvatar"; @@ -30,6 +30,9 @@ import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { presentableTextForFile } from "../../../utils/FileUtils"; import AccessibleButton from "./AccessibleButton"; +import Modal from "../../../Modal"; +import ErrorDialog from "../dialogs/ErrorDialog"; +import { FileDownloader } from "../../../utils/FileDownloader"; // Max scale to keep gaps around the image const MAX_SCALE = 0.95; @@ -309,15 +312,6 @@ export default class ImageView extends React.Component<IProps, IState> { this.setZoomAndRotation(cur + 90); }; - private onDownloadClick = (): void => { - const a = document.createElement("a"); - a.href = this.props.src; - if (this.props.name) a.download = this.props.name; - a.target = "_blank"; - a.rel = "noreferrer noopener"; - a.click(); - }; - private onOpenContextMenu = (): void => { this.setState({ contextMenuDisplayed: true, @@ -555,11 +549,7 @@ export default class ImageView extends React.Component<IProps, IState> { title={_t("lightbox|rotate_right")} onClick={this.onRotateClockwiseClick} /> - <AccessibleButton - className="mx_ImageView_button mx_ImageView_button_download" - title={_t("action|download")} - onClick={this.onDownloadClick} - /> + <DownloadButton url={this.props.src} fileName={this.props.name} /> {contextMenuButton} <AccessibleButton className="mx_ImageView_button mx_ImageView_button_close" @@ -591,3 +581,61 @@ export default class ImageView extends React.Component<IProps, IState> { ); } } + +function DownloadButton({ url, fileName }: { url: string; fileName?: string }): JSX.Element { + const downloader = useRef(new FileDownloader()).current; + const [loading, setLoading] = useState(false); + const blobRef = useRef<Blob>(); + + function showError(e: unknown): void { + Modal.createDialog(ErrorDialog, { + title: _t("timeline|download_failed"), + description: ( + <> + <div>{_t("timeline|download_failed_description")}</div> + <div>{e instanceof Error ? e.toString() : ""}</div> + </> + ), + }); + setLoading(false); + } + + const onDownloadClick = async (): Promise<void> => { + try { + if (loading) return; + setLoading(true); + + if (blobRef.current) { + // Cheat and trigger a download, again. + return downloadBlob(blobRef.current); + } + + const res = await fetch(url); + if (!res.ok) { + throw parseErrorResponse(res, await res.text()); + } + const blob = await res.blob(); + blobRef.current = blob; + await downloadBlob(blob); + } catch (e) { + showError(e); + } + }; + + async function downloadBlob(blob: Blob): Promise<void> { + await downloader.download({ + blob, + name: fileName ?? _t("common|image"), + }); + setLoading(false); + } + + return ( + <AccessibleButton + className="mx_ImageView_button mx_ImageView_button_download" + title={loading ? _t("timeline|download_action_downloading") : _t("action|download")} + onClick={onDownloadClick} + disabled={loading} + /> + ); +} diff --git a/test/unit-tests/components/views/elements/ImageView-test.tsx b/test/unit-tests/components/views/elements/ImageView-test.tsx index 48a312ed3a..4a23d847cb 100644 --- a/test/unit-tests/components/views/elements/ImageView-test.tsx +++ b/test/unit-tests/components/views/elements/ImageView-test.tsx @@ -7,13 +7,57 @@ */ import React from "react"; -import { render } from "jest-matrix-react"; +import { mocked } from "jest-mock"; +import { render, fireEvent, waitFor } from "jest-matrix-react"; +import fetchMock from "fetch-mock-jest"; import ImageView from "../../../../../src/components/views/elements/ImageView"; +import { FileDownloader } from "../../../../../src/utils/FileDownloader"; +import Modal from "../../../../../src/Modal"; +import ErrorDialog from "../../../../../src/components/views/dialogs/ErrorDialog"; + +jest.mock("../../../../../src/utils/FileDownloader"); describe("<ImageView />", () => { + beforeEach(() => { + jest.resetAllMocks(); + fetchMock.reset(); + }); + it("renders correctly", () => { const { container } = render(<ImageView src="https://example.com/image.png" onFinished={jest.fn()} />); expect(container).toMatchSnapshot(); }); + + it("should download on click", async () => { + fetchMock.get("https://example.com/image.png", "TESTFILE"); + const { getByRole } = render( + <ImageView src="https://example.com/image.png" name="filename.png" onFinished={jest.fn()} />, + ); + fireEvent.click(getByRole("button", { name: "Download" })); + await waitFor(() => + expect(mocked(FileDownloader).mock.instances[0].download).toHaveBeenCalledWith({ + blob: expect.anything(), + name: "filename.png", + }), + ); + expect(fetchMock).toHaveFetched("https://example.com/image.png"); + }); + + it("should handle download errors", async () => { + const modalSpy = jest.spyOn(Modal, "createDialog"); + fetchMock.get("https://example.com/image.png", { status: 500 }); + const { getByRole } = render( + <ImageView src="https://example.com/image.png" name="filename.png" onFinished={jest.fn()} />, + ); + fireEvent.click(getByRole("button", { name: "Download" })); + await waitFor(() => + expect(modalSpy).toHaveBeenCalledWith( + ErrorDialog, + expect.objectContaining({ + title: "Download failed", + }), + ), + ); + }); }); From b604a6ea8cdb3c86c2c42a4c405c127091add527 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 7 Nov 2024 11:58:17 +0000 Subject: [PATCH 5/7] Enable enable_authenticated_media in Playwright tests (#28395) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../homeserver/synapse/templates/default/homeserver.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml b/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml index bc3ecd7c9b..539a917b20 100644 --- a/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml +++ b/playwright/plugins/homeserver/synapse/templates/default/homeserver.yaml @@ -102,3 +102,5 @@ experimental_features: # messages > non-joined historical messages. # Can be removed after Synapse enables it by default msc4115_membership_on_events: true + +enable_authenticated_media: true From 536d6ad360bf8a41f24a38ca2442faf44c6df902 Mon Sep 17 00:00:00 2001 From: ElementRobot <releases@riot.im> Date: Fri, 8 Nov 2024 06:24:40 +0000 Subject: [PATCH 6/7] [create-pull-request] automated change (#28409) Co-authored-by: t3chguy <t3chguy@users.noreply.github.com> --- src/i18n/strings/fr.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 905aa11fa7..7d209a8a45 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1624,7 +1624,7 @@ "download_f_droid": "Récupérez-le sur F-Droid", "download_google_play": "Récupérez-le sur Google Play", "enable_notifications": "Activer les notifications", - "enable_notifications_action": "Activer les notifications", + "enable_notifications_action": "Ouvrir les paramètres", "enable_notifications_description": "Ne ratez pas une réponse ou un message important", "explore_rooms": "Explorez les salons publics", "find_community_members": "Trouvez et invitez les membres de votre communauté", @@ -1803,7 +1803,7 @@ "restore_failed_error": "Impossible de restaurer la sauvegarde" }, "right_panel": { - "add_integrations": "Ajouter des widgets, passerelles et robots", + "add_integrations": "Ajouter des extensions", "add_topic": "Ajouter un sujet", "files_button": "Fichiers", "pinned_messages": { @@ -1823,7 +1823,7 @@ "button": "Désépingler tous les messages" } }, - "pinned_messages_button": "Épinglé", + "pinned_messages_button": "Messages épinglés", "poll": { "active_heading": "Sondages en cours", "empty_active": "Il n’y a aucun sondage en cours dans ce salon", @@ -1848,7 +1848,7 @@ "view_in_timeline": "Consulter la chronologie des sondages", "view_poll": "Voir le sondage" }, - "polls_button": "Historique des sondages", + "polls_button": "Sondages", "room_summary_card": { "title": "Information du salon" }, @@ -3252,7 +3252,7 @@ }, "m.file": { "error_decrypting": "Erreur lors du déchiffrement de la pièce jointe", - "error_invalid": "Fichier %(extra)s non valide" + "error_invalid": "Fichier invalide" }, "m.image": { "error": "Impossible d’afficher l’image à cause d’une erreur", @@ -3988,7 +3988,7 @@ "title": "Autoriser ce widget à vérifier votre identité" }, "popout": "Détacher le widget", - "set_room_layout": "Définir ma disposition de salon pour tout le monde", + "set_room_layout": "Définir la mise en page pour tout le monde", "shared_data_avatar": "Votre URL d’image de profil", "shared_data_device_id": "Votre ID d’appareil", "shared_data_lang": "Votre langue", From 9a6be72c100fe99306395b4fc06eb10ba2b9686f Mon Sep 17 00:00:00 2001 From: ElementRobot <releases@riot.im> Date: Fri, 8 Nov 2024 09:31:14 +0000 Subject: [PATCH 7/7] [create-pull-request] automated change (#28408) Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com> --- playwright/plugins/homeserver/synapse/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright/plugins/homeserver/synapse/index.ts b/playwright/plugins/homeserver/synapse/index.ts index 6dfd4b5ef5..5e5728a0b5 100644 --- a/playwright/plugins/homeserver/synapse/index.ts +++ b/playwright/plugins/homeserver/synapse/index.ts @@ -20,7 +20,7 @@ import { randB64Bytes } from "../../utils/rand"; // Docker tag to use for synapse docker image. // We target a specific digest as every now and then a Synapse update will break our CI. // This digest is updated by the playwright-image-updates.yaml workflow periodically. -const DOCKER_TAG = "develop@sha256:5bae9c459793f800db51bf8ec5e606ae49f7497f081cdbf83ee637885f9f8f7e"; +const DOCKER_TAG = "develop@sha256:d1a89bd0fcdc2bf2900dac30696d53bb9e44da1231faacd5c2d3b9f539ce9586"; async function cfgDirFromTemplate(opts: StartHomeserverOpts): Promise<Omit<HomeserverConfig, "dockerUrl">> { const templateDir = path.join(__dirname, "templates", opts.template);