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 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> { 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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 eumjfPQ?Q`%vGu>gCBeCr5N!` 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 @@ - - - - - - - - - - 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 @@ - - - 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 @@ - - - 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 @@ - - - - - - image/svg+xml - - - - - - - - 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 @@ - - - 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)Px#$w@>(R2Ug!V1NQ`ZEZFf8<}PTa+r*bjTf@BvtQ8B(Gf?M1hE+n4Go={n3(o} zIRF3uzy9mjFUKoauDk^CL4f(iix>ALB_$bwzyXLwnVFfrg@uLJyn6NOD_8-Dc>etP z0bGihK?*lf=Qk`cdh}%26 = ({ {_t("auth|check_email_resend_prompt")} - + {_t("action|resend")} 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 = ({ {_t("auth|check_email_resend_prompt")} - + {_t("action|resend")} 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 = ({ if (error) { footer = ( <> - +
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
- + {_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 = ({ error, isMinimised, classNam className={classNames("mx_MapError", className, { mx_MapError_isMinimised: isMinimised })} onClick={onClick} > - + {_t("location_sharing|failed_load_map")} 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 - + , ); 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[` applies class when isMinimised is truthy 1`] = ` class="mx_MapError test mx_MapError_isMinimised" data-testid="map-rendering-error" > -
+ fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + +

@@ -36,9 +45,18 @@ exports[` renders correctly for MapStyleUrlNotConfigured 1`] = ` class="mx_MapError test" data-testid="map-rendering-error" > -
+ fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + +

@@ -66,9 +84,18 @@ exports[` renders correctly for MapStyleUrlNotReachable 1`] = ` class="mx_MapError test" data-testid="map-rendering-error" > -
+ fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + +

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[` 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" > -
+ fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + +

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;-0WPx$hDk(0R45gVlCf&SP!xv$Tx)RmyQVlu+3ygXZ$ zrL^HmsMqUZu~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 - - - ED5D3E59-2561-4AC1-9B43-82FBC51767FC - Created with sketchtool. - - - - - - - - - - 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 { 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 { title={_t("lightbox|rotate_right")} onClick={this.onRotateClockwiseClick} /> - + {contextMenuButton} { ); } } + +function DownloadButton({ url, fileName }: { url: string; fileName?: string }): JSX.Element { + const downloader = useRef(new FileDownloader()).current; + const [loading, setLoading] = useState(false); + const blobRef = useRef(); + + function showError(e: unknown): void { + Modal.createDialog(ErrorDialog, { + title: _t("timeline|download_failed"), + description: ( + <> +
{_t("timeline|download_failed_description")}
+
{e instanceof Error ? e.toString() : ""}
+ + ), + }); + setLoading(false); + } + + const onDownloadClick = async (): Promise => { + 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 { + await downloader.download({ + blob, + name: fileName ?? _t("common|image"), + }); + setLoading(false); + } + + return ( + + ); +} 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("", () => { + beforeEach(() => { + jest.resetAllMocks(); + fetchMock.reset(); + }); + it("renders correctly", () => { const { container } = render(); expect(container).toMatchSnapshot(); }); + + it("should download on click", async () => { + fetchMock.get("https://example.com/image.png", "TESTFILE"); + const { getByRole } = render( + , + ); + 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( + , + ); + 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 Date: Fri, 8 Nov 2024 06:24:40 +0000 Subject: [PATCH 6/7] [create-pull-request] automated change (#28409) Co-authored-by: t3chguy --- 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 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> { const templateDir = path.join(__dirname, "templates", opts.template);