From b61a2225b74f13f4b8eab4b292a43b8de5677239 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:28:27 +0000 Subject: [PATCH 01/32] Switch to React18 useId Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/settings/AvatarSetting.tsx | 3 +-- .../views/settings/UserProfileSettings.tsx | 3 +-- src/utils/useId.ts | 16 ---------------- 3 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 src/utils/useId.ts diff --git a/src/components/views/settings/AvatarSetting.tsx b/src/components/views/settings/AvatarSetting.tsx index b6ce541590..ee47094cf9 100644 --- a/src/components/views/settings/AvatarSetting.tsx +++ b/src/components/views/settings/AvatarSetting.tsx @@ -6,7 +6,7 @@ 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, { ReactNode, createRef, useCallback, useEffect, useState } from "react"; +import React, { ReactNode, createRef, useCallback, useEffect, useState, useId } from "react"; import EditIcon from "@vector-im/compound-design-tokens/assets/web/icons/edit"; import UploadIcon from "@vector-im/compound-design-tokens/assets/web/icons/share"; import DeleteIcon from "@vector-im/compound-design-tokens/assets/web/icons/delete"; @@ -16,7 +16,6 @@ import classNames from "classnames"; import { _t } from "../../../languageHandler"; import { mediaFromMxc } from "../../../customisations/Media"; import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds"; -import { useId } from "../../../utils/useId"; import AccessibleButton from "../elements/AccessibleButton"; import BaseAvatar from "../avatars/BaseAvatar"; import Modal from "../../../Modal.tsx"; diff --git a/src/components/views/settings/UserProfileSettings.tsx b/src/components/views/settings/UserProfileSettings.tsx index 403b6349c9..83a00c122d 100644 --- a/src/components/views/settings/UserProfileSettings.tsx +++ b/src/components/views/settings/UserProfileSettings.tsx @@ -6,7 +6,7 @@ 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, { ChangeEvent, ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import React, { ChangeEvent, ReactNode, useCallback, useEffect, useMemo, useState, useId } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import { EditInPlace, Alert, ErrorMessage } from "@vector-im/compound-web"; import PopOutIcon from "@vector-im/compound-design-tokens/assets/web/icons/pop-out"; @@ -20,7 +20,6 @@ import { formatBytes } from "../../../utils/FormattingUtils"; import { useToastContext } from "../../../contexts/ToastContext"; import InlineSpinner from "../elements/InlineSpinner"; import UserIdentifierCustomisations from "../../../customisations/UserIdentifier"; -import { useId } from "../../../utils/useId"; import CopyableText from "../elements/CopyableText"; import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import AccessibleButton from "../elements/AccessibleButton"; diff --git a/src/utils/useId.ts b/src/utils/useId.ts deleted file mode 100644 index 6f7cf79598..0000000000 --- a/src/utils/useId.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2024 The Matrix.org Foundation C.I.C. - -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 from "react"; - -const getUniqueId = (() => { - return () => `:r${Math.random()}:`; -})(); - -// Replace this with React's own useId once we switch to React 18 -export const useId = (): string => React.useMemo(getUniqueId, []); From c8c5ef5e6ecd0ff2618cdb2b43121736edd344ac Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:31:18 +0000 Subject: [PATCH 02/32] Enable react-compiler eslint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .eslintrc.js | 4 +++- package.json | 1 + yarn.lock | 41 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 2b0dd2c186..e302a52673 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = { - plugins: ["matrix-org"], + plugins: ["matrix-org", "eslint-plugin-react-compiler"], extends: ["plugin:matrix-org/babel", "plugin:matrix-org/react", "plugin:matrix-org/a11y"], parserOptions: { project: ["./tsconfig.json"], @@ -170,6 +170,8 @@ module.exports = { "jsx-a11y/role-supports-aria-props": "off", "matrix-org/require-copyright-header": "error", + + "react-compiler/react-compiler": "error", }, overrides: [ { diff --git a/package.json b/package.json index 5a75055510..902852a8ef 100644 --- a/package.json +++ b/package.json @@ -233,6 +233,7 @@ "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-matrix-org": "^2.0.2", "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-compiler": "^19.0.0-beta-df7b47d-20241124", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-unicorn": "^56.0.0", "express": "^4.18.2", diff --git a/yarn.lock b/yarn.lock index 551c5b4d6e..6ed22a8c2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,7 +56,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@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/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/core@^7.24.4": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -303,6 +303,13 @@ dependencies: "@babel/types" "^7.25.8" +"@babel/parser@^7.24.4": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" + "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" @@ -1150,6 +1157,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@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" @@ -5628,6 +5643,18 @@ eslint-plugin-matrix-org@^2.0.2: resolved "https://registry.yarnpkg.com/eslint-plugin-matrix-org/-/eslint-plugin-matrix-org-2.0.2.tgz#95b86b0f16704ab19740f7c3c62eae69e20365e6" integrity sha512-cQy5Rjeq6uyu1mLXlPZwEJdyM0NmclrnEz68y792FSuuxzMyJNNYLGDQ5CkYW8H+PrD825HUFZ34pNXnjMOzOw== +eslint-plugin-react-compiler@^19.0.0-beta-df7b47d-20241124: + version "19.0.0-beta-df7b47d-20241124" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.0.0-beta-df7b47d-20241124.tgz#468751d3a8a6781189405ee56b39b80545306df8" + integrity sha512-82PfnllC8jP/68KdLAbpWuYTcfmtGLzkqy2IW85WopKMTr+4rdQpp+lfliQ/QE79wWrv/dRoADrk3Pdhq25nTw== + dependencies: + "@babel/core" "^7.24.4" + "@babel/parser" "^7.24.4" + "@babel/plugin-transform-private-methods" "^7.25.9" + hermes-parser "^0.25.1" + zod "^3.22.4" + zod-validation-error "^3.0.3" + eslint-plugin-react-hooks@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101" @@ -6574,6 +6601,18 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hermes-estree@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" + integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== + +hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" + integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== + dependencies: + hermes-estree "0.25.1" + highlight.js@^11.3.1: version "11.10.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.10.0.tgz#6e3600dc4b33d6dc23d5bd94fbf72405f5892b92" From e730074e1b3775821fa6a1ca5951111cb26dc9d6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:31:33 +0000 Subject: [PATCH 03/32] Fix an easy one Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/elements/EffectsOverlay.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/elements/EffectsOverlay.tsx b/src/components/views/elements/EffectsOverlay.tsx index 3e5a5ead60..ad7d9c825e 100644 --- a/src/components/views/elements/EffectsOverlay.tsx +++ b/src/components/views/elements/EffectsOverlay.tsx @@ -58,11 +58,10 @@ const EffectsOverlay: FunctionComponent = ({ roomWidth }) => { if (canvas) canvas.height = UIStore.instance.windowHeight; UIStore.instance.on(UI_EVENTS.Resize, resize); + const currentEffects = effectsRef.current; // this is not a react node ref, warning can be safely ignored return () => { dis.unregister(dispatcherRef); UIStore.instance.off(UI_EVENTS.Resize, resize); - // eslint-disable-next-line react-hooks/exhaustive-deps - const currentEffects = effectsRef.current; // this is not a react node ref, warning can be safely ignored for (const effect in currentEffects) { const effectModule: ICanvasEffect = currentEffects.get(effect)!; if (effectModule && effectModule.isRunning) { From eb1a09a91285b77e081a1106caf4b668e4482cd2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:32:36 +0000 Subject: [PATCH 04/32] Disable in tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index e302a52673..a017112b4e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -264,6 +264,7 @@ module.exports = { // These are fine in tests "no-restricted-globals": "off", + "react-compiler/react-compiler": "off", }, }, { From 9443426edba2d3313175a89d9b9222d87538886e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:57:39 +0000 Subject: [PATCH 05/32] Fix usage of useRef as memoization Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/RoomSearchView.tsx | 4 ++-- .../rooms/wysiwyg_composer/EditWysiwygComposer.tsx | 6 +++--- .../rooms/wysiwyg_composer/SendWysiwygComposer.tsx | 6 +++--- src/components/views/settings/ThemeChoicePanel.tsx | 6 +++--- src/contexts/ToastContext.tsx | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/components/structures/RoomSearchView.tsx b/src/components/structures/RoomSearchView.tsx index 82146bcc5e..9e6263bcfb 100644 --- a/src/components/structures/RoomSearchView.tsx +++ b/src/components/structures/RoomSearchView.tsx @@ -6,7 +6,7 @@ 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, { forwardRef, useCallback, useContext, useEffect, useRef, useState } from "react"; +import React, { forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; import { ISearchResults, IThreadBundledRelationship, @@ -58,7 +58,7 @@ export const RoomSearchView = forwardRef( const [results, setResults] = useState(null); const aborted = useRef(false); // A map from room ID to permalink creator - const permalinkCreators = useRef(new Map()).current; + const permalinkCreators = useMemo(() => new Map(), []); const innerRef = useRef(); useEffect(() => { diff --git a/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx b/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx index 98597c7360..a28d274646 100644 --- a/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx +++ b/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx @@ -6,7 +6,7 @@ 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, { ForwardedRef, forwardRef, MutableRefObject, useRef } from "react"; +import React, { ForwardedRef, forwardRef, MutableRefObject, useMemo } from "react"; import classNames from "classnames"; import EditorStateTransfer from "../../../../utils/EditorStateTransfer"; @@ -44,7 +44,7 @@ export default function EditWysiwygComposer({ className, ...props }: EditWysiwygComposerProps): JSX.Element { - const defaultContextValue = useRef(getDefaultContextValue({ editorStateTransfer })); + const defaultContextValue = useMemo(() => getDefaultContextValue({ editorStateTransfer }), []); const initialContent = useInitialContent(editorStateTransfer); const isReady = !editorStateTransfer || initialContent !== undefined; @@ -55,7 +55,7 @@ export default function EditWysiwygComposer({ } return ( - + getDefaultContextValue({ eventRelation: props.eventRelation }), []); return ( - + } diff --git a/src/components/views/settings/ThemeChoicePanel.tsx b/src/components/views/settings/ThemeChoicePanel.tsx index 83f17a2f7b..3355913abd 100644 --- a/src/components/views/settings/ThemeChoicePanel.tsx +++ b/src/components/views/settings/ThemeChoicePanel.tsx @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { ChangeEvent, JSX, useCallback, useMemo, useRef, useState } from "react"; +import React, { ChangeEvent, JSX, useCallback, useMemo, useState } from "react"; import { InlineField, ToggleControl, @@ -39,12 +39,12 @@ import { useSettingValue } from "../../../hooks/useSettings"; */ export function ThemeChoicePanel(): JSX.Element { const themeState = useTheme(); - const themeWatcher = useRef(new ThemeWatcher()); + const themeWatcher = useMemo(() => new ThemeWatcher(), []); const customThemeEnabled = useSettingValue("feature_custom_themes"); return ( - {themeWatcher.current.isSystemThemeSupported() && ( + {themeWatcher.isSystemThemeSupported() && ( )} diff --git a/src/contexts/ToastContext.tsx b/src/contexts/ToastContext.tsx index 4ae4875c96..e9bd392a60 100644 --- a/src/contexts/ToastContext.tsx +++ b/src/contexts/ToastContext.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import { ReactNode, createContext, useCallback, useContext, useEffect, useRef, useState } from "react"; +import { ReactNode, createContext, useCallback, useContext, useEffect, useState, useMemo } from "react"; /** * A ToastContext helps components display any kind of toast message and can be provided @@ -33,19 +33,19 @@ export function useToastContext(): ToastRack { * the ToastRack object that should be provided to the context */ export function useActiveToast(): [ReactNode | undefined, ToastRack] { - const toastRack = useRef(new ToastRack()); + const toastRack = useMemo(() => new ToastRack(), []); - const [activeToast, setActiveToast] = useState(toastRack.current.getActiveToast()); + const [activeToast, setActiveToast] = useState(toastRack.getActiveToast()); const updateCallback = useCallback(() => { - setActiveToast(toastRack.current.getActiveToast()); + setActiveToast(toastRack.getActiveToast()); }, [setActiveToast, toastRack]); useEffect(() => { - toastRack.current.setCallback(updateCallback); + toastRack.setCallback(updateCallback); }, [toastRack, updateCallback]); - return [activeToast, toastRack.current]; + return [activeToast, toastRack]; } interface DisplayedToast { From b597abf56729d20796b5940f55236675d4e6ce3b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:59:35 +0000 Subject: [PATCH 06/32] Fix mutation of external values in hooks Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../settings/tabs/room/VoipRoomSettingsTab.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx index 783ea1bce3..a428b7a148 100644 --- a/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx @@ -47,21 +47,24 @@ const ElementCallSwitch: React.FC = ({ room }) => { (enabled: boolean): void => { setElementCallEnabled(enabled); + // Take a copy to avoid mutating the original + const newEvents = { ...events }; + if (enabled) { - const userLevel = events[EventType.RoomMessage] ?? content.users_default ?? 0; + const userLevel = newEvents[EventType.RoomMessage] ?? content.users_default ?? 0; const moderatorLevel = content.kick ?? 50; - events[ElementCall.CALL_EVENT_TYPE.name] = isPublic ? moderatorLevel : userLevel; - events[ElementCall.MEMBER_EVENT_TYPE.name] = userLevel; + newEvents[ElementCall.CALL_EVENT_TYPE.name] = isPublic ? moderatorLevel : userLevel; + newEvents[ElementCall.MEMBER_EVENT_TYPE.name] = userLevel; } else { - const adminLevel = events[EventType.RoomPowerLevels] ?? content.state_default ?? 100; + const adminLevel = newEvents[EventType.RoomPowerLevels] ?? content.state_default ?? 100; - events[ElementCall.CALL_EVENT_TYPE.name] = adminLevel; - events[ElementCall.MEMBER_EVENT_TYPE.name] = adminLevel; + newEvents[ElementCall.CALL_EVENT_TYPE.name] = adminLevel; + newEvents[ElementCall.MEMBER_EVENT_TYPE.name] = adminLevel; } room.client.sendStateEvent(room.roomId, EventType.RoomPowerLevels, { - events: events, + events: newEvents, ...content, }); }, From 72f155640de204d2412657b508b73cb5ff0abe2e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 12:59:53 +0000 Subject: [PATCH 07/32] Make React compiler happy about some frankly non-issues Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/spaces/QuickThemeSwitcher.tsx | 2 +- .../useUnreadThreadRooms.ts | 16 ++++---- src/utils/location/useMap.ts | 40 +++++++++---------- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/src/components/views/spaces/QuickThemeSwitcher.tsx b/src/components/views/spaces/QuickThemeSwitcher.tsx index 195fcb9899..f4c229ae04 100644 --- a/src/components/views/spaces/QuickThemeSwitcher.tsx +++ b/src/components/views/spaces/QuickThemeSwitcher.tsx @@ -27,7 +27,7 @@ type Props = { const MATCH_SYSTEM_THEME_ID = "MATCH_SYSTEM_THEME_ID"; const QuickThemeSwitcher: React.FC = ({ requestClose }) => { - const orderedThemes = useMemo(getOrderedThemes, []); + const orderedThemes = useMemo(() => getOrderedThemes(), []); const themeState = useTheme(); const nonHighContrast = findNonHighContrastTheme(themeState.theme); diff --git a/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts b/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts index 110c9d51f8..1ea10bed68 100644 --- a/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts +++ b/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { ClientEvent, MatrixClient, MatrixEventEvent, Room } from "matrix-js-sdk/src/matrix"; import { throttle } from "lodash"; @@ -42,14 +42,12 @@ export function useUnreadThreadRooms(forceComputation: boolean): Result { setResult(computeUnreadThreadRooms(mxClient, msc3946ProcessDynamicPredecessor, settingTACOnlyNotifs)); }, [mxClient, msc3946ProcessDynamicPredecessor, settingTACOnlyNotifs]); - // The exhautive deps lint rule can't compute dependencies here since it's not a plain inline func. - // We make this as simple as possible so its only dep is doUpdate itself. - // eslint-disable-next-line react-hooks/exhaustive-deps - const scheduleUpdate = useCallback( - throttle(doUpdate, MIN_UPDATE_INTERVAL_MS, { - leading: false, - trailing: true, - }), + const scheduleUpdate = useMemo( + () => + throttle(doUpdate, MIN_UPDATE_INTERVAL_MS, { + leading: false, + trailing: true, + }), [doUpdate], ); diff --git a/src/utils/location/useMap.ts b/src/utils/location/useMap.ts index 308aedc205..300a15a4ec 100644 --- a/src/utils/location/useMap.ts +++ b/src/utils/location/useMap.ts @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import { useEffect, useState } from "react"; +import { useEffect, useMemo } from "react"; import type { Map as MapLibreMap } from "maplibre-gl"; import { createMap } from "./map"; @@ -26,29 +26,25 @@ interface UseMapProps { */ export const useMap = ({ interactive, bodyId, onError }: UseMapProps): MapLibreMap | undefined => { const cli = useMatrixClientContext(); - const [map, setMap] = useState(); - useEffect( - () => { - try { - setMap(createMap(cli, !!interactive, bodyId, onError)); - } catch (error) { - console.error("Error encountered in useMap", error); - if (error instanceof Error) { - onError?.(error); - } + const map = useMemo(() => { + try { + return createMap(cli, !!interactive, bodyId, onError); + } catch (error) { + console.error("Error encountered in useMap", error); + if (error instanceof Error) { + onError?.(error); } - return () => { - if (map) { - map.remove(); - setMap(undefined); - } - }; - }, - // map is excluded as a dependency - // eslint-disable-next-line react-hooks/exhaustive-deps - [interactive, bodyId, onError], - ); + } + }, [bodyId, cli, interactive, onError]); + + // cleanup + useEffect(() => { + if (!map) return; + return () => { + map.remove(); + }; + }, [map]); return map; }; From c3f3c9364fe1430674b05979aa7cbd74fd6038f2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 13:14:13 +0000 Subject: [PATCH 08/32] Fix MapMock Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- __mocks__/maplibre-gl.js | 1 + 1 file changed, 1 insertion(+) diff --git a/__mocks__/maplibre-gl.js b/__mocks__/maplibre-gl.js index c410e4f24c..b47d4c02f8 100644 --- a/__mocks__/maplibre-gl.js +++ b/__mocks__/maplibre-gl.js @@ -17,6 +17,7 @@ class MockMap extends EventEmitter { setCenter = jest.fn(); setStyle = jest.fn(); fitBounds = jest.fn(); + remove = jest.fn(); } const MockMapInstance = new MockMap(); From 6946b90b11eef70174f7155dcd05abb94e8cac02 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 13:27:34 +0000 Subject: [PATCH 09/32] Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../tabs/room/VoipRoomSettingsTab.tsx | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx index a428b7a148..14de26629b 100644 --- a/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { useCallback, useMemo, useState } from "react"; import { JoinRule, EventType, RoomState, Room } from "matrix-js-sdk/src/matrix"; +import { RoomPowerLevelsEventContent } from "matrix-js-sdk/src/types"; import { _t } from "../../../../../languageHandler"; import LabelledToggleSwitch from "../../../elements/LabelledToggleSwitch"; @@ -24,23 +25,24 @@ interface ElementCallSwitchProps { const ElementCallSwitch: React.FC = ({ room }) => { const isPublic = useMemo(() => room.getJoinRule() === JoinRule.Public, [room]); - const [content, events, maySend] = useRoomState( + const [content, maySend] = useRoomState( room, useCallback( (state: RoomState) => { - const content = state?.getStateEvents(EventType.RoomPowerLevels, "")?.getContent(); + const content = state + ?.getStateEvents(EventType.RoomPowerLevels, "") + ?.getContent(); return [ content ?? {}, - content?.["events"] ?? {}, state?.maySendStateEvent(EventType.RoomPowerLevels, room.client.getSafeUserId()), - ]; + ] as const; }, [room.client], ), ); const [elementCallEnabled, setElementCallEnabled] = useState(() => { - return events[ElementCall.MEMBER_EVENT_TYPE.name] === 0; + return content.events?.[ElementCall.MEMBER_EVENT_TYPE.name] === 0; }); const onChange = useCallback( @@ -48,27 +50,24 @@ const ElementCallSwitch: React.FC = ({ room }) => { setElementCallEnabled(enabled); // Take a copy to avoid mutating the original - const newEvents = { ...events }; + const newContent = { events: {}, ...content }; if (enabled) { - const userLevel = newEvents[EventType.RoomMessage] ?? content.users_default ?? 0; + const userLevel = newContent.events[EventType.RoomMessage] ?? content.users_default ?? 0; const moderatorLevel = content.kick ?? 50; - newEvents[ElementCall.CALL_EVENT_TYPE.name] = isPublic ? moderatorLevel : userLevel; - newEvents[ElementCall.MEMBER_EVENT_TYPE.name] = userLevel; + newContent.events[ElementCall.CALL_EVENT_TYPE.name] = isPublic ? moderatorLevel : userLevel; + newContent.events[ElementCall.MEMBER_EVENT_TYPE.name] = userLevel; } else { - const adminLevel = newEvents[EventType.RoomPowerLevels] ?? content.state_default ?? 100; + const adminLevel = newContent.events[EventType.RoomPowerLevels] ?? content.state_default ?? 100; - newEvents[ElementCall.CALL_EVENT_TYPE.name] = adminLevel; - newEvents[ElementCall.MEMBER_EVENT_TYPE.name] = adminLevel; + newContent.events[ElementCall.CALL_EVENT_TYPE.name] = adminLevel; + newContent.events[ElementCall.MEMBER_EVENT_TYPE.name] = adminLevel; } - room.client.sendStateEvent(room.roomId, EventType.RoomPowerLevels, { - events: newEvents, - ...content, - }); + room.client.sendStateEvent(room.roomId, EventType.RoomPowerLevels, newContent); }, - [room.client, room.roomId, content, events, isPublic], + [room.client, room.roomId, content, isPublic], ); const brand = SdkConfig.get("element_call").brand ?? DEFAULTS.element_call.brand; From 7e03f38a3bc2fa66775b670d3c6e9a67c2c3a7a3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 14:11:03 +0000 Subject: [PATCH 10/32] Switch to React18 useId (#28651) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/settings/AvatarSetting.tsx | 3 +-- .../views/settings/UserProfileSettings.tsx | 3 +-- src/utils/useId.ts | 16 ---------------- 3 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 src/utils/useId.ts diff --git a/src/components/views/settings/AvatarSetting.tsx b/src/components/views/settings/AvatarSetting.tsx index b6ce541590..ee47094cf9 100644 --- a/src/components/views/settings/AvatarSetting.tsx +++ b/src/components/views/settings/AvatarSetting.tsx @@ -6,7 +6,7 @@ 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, { ReactNode, createRef, useCallback, useEffect, useState } from "react"; +import React, { ReactNode, createRef, useCallback, useEffect, useState, useId } from "react"; import EditIcon from "@vector-im/compound-design-tokens/assets/web/icons/edit"; import UploadIcon from "@vector-im/compound-design-tokens/assets/web/icons/share"; import DeleteIcon from "@vector-im/compound-design-tokens/assets/web/icons/delete"; @@ -16,7 +16,6 @@ import classNames from "classnames"; import { _t } from "../../../languageHandler"; import { mediaFromMxc } from "../../../customisations/Media"; import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds"; -import { useId } from "../../../utils/useId"; import AccessibleButton from "../elements/AccessibleButton"; import BaseAvatar from "../avatars/BaseAvatar"; import Modal from "../../../Modal.tsx"; diff --git a/src/components/views/settings/UserProfileSettings.tsx b/src/components/views/settings/UserProfileSettings.tsx index 403b6349c9..83a00c122d 100644 --- a/src/components/views/settings/UserProfileSettings.tsx +++ b/src/components/views/settings/UserProfileSettings.tsx @@ -6,7 +6,7 @@ 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, { ChangeEvent, ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import React, { ChangeEvent, ReactNode, useCallback, useEffect, useMemo, useState, useId } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import { EditInPlace, Alert, ErrorMessage } from "@vector-im/compound-web"; import PopOutIcon from "@vector-im/compound-design-tokens/assets/web/icons/pop-out"; @@ -20,7 +20,6 @@ import { formatBytes } from "../../../utils/FormattingUtils"; import { useToastContext } from "../../../contexts/ToastContext"; import InlineSpinner from "../elements/InlineSpinner"; import UserIdentifierCustomisations from "../../../customisations/UserIdentifier"; -import { useId } from "../../../utils/useId"; import CopyableText from "../elements/CopyableText"; import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import AccessibleButton from "../elements/AccessibleButton"; diff --git a/src/utils/useId.ts b/src/utils/useId.ts deleted file mode 100644 index 6f7cf79598..0000000000 --- a/src/utils/useId.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2024 The Matrix.org Foundation C.I.C. - -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 from "react"; - -const getUniqueId = (() => { - return () => `:r${Math.random()}:`; -})(); - -// Replace this with React's own useId once we switch to React 18 -export const useId = (): string => React.useMemo(getUniqueId, []); From 450cb608ec35da46543d49a03223bcc85da3938a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 14:30:28 +0000 Subject: [PATCH 11/32] Add mergequeue tag to read-receipts tests and skip running them on PR commits (#28648) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .github/workflows/end-to-end-tests.yaml | 6 +++++- docs/playwright.md | 7 +++++++ .../e2e/read-receipts/editing-messages-in-threads.spec.ts | 2 +- .../read-receipts/editing-messages-main-timeline.spec.ts | 2 +- .../read-receipts/editing-messages-thread-roots.spec.ts | 2 +- playwright/e2e/read-receipts/high-level.spec.ts | 2 +- playwright/e2e/read-receipts/message-ordering.spec.ts | 2 +- playwright/e2e/read-receipts/missing-referents.spec.ts | 2 +- .../e2e/read-receipts/new-messages-in-threads.spec.ts | 2 +- .../e2e/read-receipts/new-messages-main-timeline.spec.ts | 2 +- .../e2e/read-receipts/new-messages-thread-roots.spec.ts | 2 +- playwright/e2e/read-receipts/notifications.spec.ts | 2 +- playwright/e2e/read-receipts/reactions-in-threads.spec.ts | 2 +- .../e2e/read-receipts/reactions-main-timeline.spec.ts | 2 +- .../e2e/read-receipts/reactions-thread-roots.spec.ts | 2 +- playwright/e2e/read-receipts/read-receipts.spec.ts | 2 +- playwright/e2e/read-receipts/redactions-in-threads.spec.ts | 2 +- .../e2e/read-receipts/redactions-main-timeline.spec.ts | 2 +- .../e2e/read-receipts/redactions-thread-roots.spec.ts | 2 +- playwright/e2e/read-receipts/room-list-order.spec.ts | 2 +- 20 files changed, 30 insertions(+), 19 deletions(-) diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 1e40d0dfd5..5a75040866 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -130,8 +130,12 @@ jobs: if: steps.playwright-cache.outputs.cache-hit != 'true' run: yarn playwright install --with-deps --no-shell chromium + # We skip tests tagged with @mergequeue when running on PRs, but run them in MQ and everywhere else - name: Run Playwright tests - run: yarn playwright test --shard ${{ matrix.runner }}/${{ strategy.job-total }} + run: | + yarn playwright test \ + --shard "${{ matrix.runner }}/${{ strategy.job-total }}" \ + ${{ github.event_name == 'pull_request' && '--grep-invert @mergequeue' || '' }} - name: Upload blob report to GitHub Actions Artifacts if: always() diff --git a/docs/playwright.md b/docs/playwright.md index 1454c4868f..4af3194220 100644 --- a/docs/playwright.md +++ b/docs/playwright.md @@ -217,3 +217,10 @@ instead of the native `toHaveScreenshot`. If you are running Linux and are unfortunate that the screenshots are not rendering identically, you may wish to specify `--ignore-snapshots` and rely on Docker to render them for you. + +## Test Tags + +We use test tags to categorise tests for running subsets more efficiently. + +- `@mergequeue`: Tests that are slow or flaky and cover areas of the app we update seldom, should not be run on every PR commit but will be run in the Merge Queue. +- `@screenshot`: Tests that use `toMatchScreenshot` to speed up a run of `test:playwright:screenshots`. A test with this tag must not also have the `@mergequeue` tag as this would cause false positives in the stale screenshot detection. diff --git a/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts b/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts index 277de62876..42191831c8 100644 --- a/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts +++ b/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("editing messages", () => { test.describe("in threads", () => { test("An edit of a threaded message makes the room unread", async ({ diff --git a/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts b/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts index 027ab08e2d..a464822305 100644 --- a/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts +++ b/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("editing messages", () => { test.describe("in the main timeline", () => { test("Editing a message leaves a room read", async ({ roomAlpha: room1, roomBeta: room2, util, msg }) => { diff --git a/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts b/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts index e653b5d9bd..506ed603bd 100644 --- a/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts +++ b/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("editing messages", () => { test.describe("thread roots", () => { test("An edit of a thread root leaves the room read", async ({ diff --git a/playwright/e2e/read-receipts/high-level.spec.ts b/playwright/e2e/read-receipts/high-level.spec.ts index 7d4f4eb133..457cf99481 100644 --- a/playwright/e2e/read-receipts/high-level.spec.ts +++ b/playwright/e2e/read-receipts/high-level.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { customEvent, many, test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Ignored events", () => { test("If all events after receipt are unimportant, the room is read", async ({ roomAlpha: room1, diff --git a/playwright/e2e/read-receipts/message-ordering.spec.ts b/playwright/e2e/read-receipts/message-ordering.spec.ts index 65875cf4a9..d7f77fae5f 100644 --- a/playwright/e2e/read-receipts/message-ordering.spec.ts +++ b/playwright/e2e/read-receipts/message-ordering.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Message ordering", () => { test.describe("in the main timeline", () => { test.fixme( diff --git a/playwright/e2e/read-receipts/missing-referents.spec.ts b/playwright/e2e/read-receipts/missing-referents.spec.ts index f798d7d455..a1741851e2 100644 --- a/playwright/e2e/read-receipts/missing-referents.spec.ts +++ b/playwright/e2e/read-receipts/missing-referents.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("messages with missing referents", () => { test.fixme( "A message in an unknown thread is not visible and the room is read", diff --git a/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts b/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts index 91d850fac8..5407f3cb44 100644 --- a/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts +++ b/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { many, test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("new messages", () => { test.describe("in threads", () => { test("Receiving a message makes a room unread", async ({ diff --git a/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts b/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts index 2000e444d6..92f7b10cdd 100644 --- a/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts +++ b/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { many, test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("new messages", () => { test.describe("in the main timeline", () => { test("Receiving a message makes a room unread", async ({ diff --git a/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts b/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts index 878d0d4419..3c8ed7849f 100644 --- a/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts +++ b/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { many, test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("new messages", () => { test.describe("thread roots", () => { test("Reading a thread root does not mark the thread as read", async ({ diff --git a/playwright/e2e/read-receipts/notifications.spec.ts b/playwright/e2e/read-receipts/notifications.spec.ts index 3050987be7..46edc9a7a3 100644 --- a/playwright/e2e/read-receipts/notifications.spec.ts +++ b/playwright/e2e/read-receipts/notifications.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Notifications", () => { test.describe("in the main timeline", () => { test.fixme("A new message that mentions me shows a notification", () => {}); diff --git a/playwright/e2e/read-receipts/reactions-in-threads.spec.ts b/playwright/e2e/read-receipts/reactions-in-threads.spec.ts index bc4a184744..45b5e071ec 100644 --- a/playwright/e2e/read-receipts/reactions-in-threads.spec.ts +++ b/playwright/e2e/read-receipts/reactions-in-threads.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test, expect } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("reactions", () => { test.describe("in threads", () => { test("A reaction to a threaded message does not make the room unread", async ({ diff --git a/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts b/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts index 59d6eaea40..16d5c92eca 100644 --- a/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts +++ b/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("reactions", () => { test.describe("in the main timeline", () => { test("Receiving a reaction to a message does not make a room unread", async ({ diff --git a/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts b/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts index 219a73d5e4..817597a27e 100644 --- a/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts +++ b/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("reactions", () => { test.describe("thread roots", () => { test("A reaction to a thread root does not make the room unread", async ({ diff --git a/playwright/e2e/read-receipts/read-receipts.spec.ts b/playwright/e2e/read-receipts/read-receipts.spec.ts index 3056cc4a54..f6515361f2 100644 --- a/playwright/e2e/read-receipts/read-receipts.spec.ts +++ b/playwright/e2e/read-receipts/read-receipts.spec.ts @@ -13,7 +13,7 @@ import { ElementAppPage } from "../../pages/ElementAppPage"; import { Bot } from "../../pages/bot"; import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.use({ displayName: "Mae", botCreateOpts: { displayName: "Other User" }, diff --git a/playwright/e2e/read-receipts/redactions-in-threads.spec.ts b/playwright/e2e/read-receipts/redactions-in-threads.spec.ts index 715bb4e9fc..25c19a4f97 100644 --- a/playwright/e2e/read-receipts/redactions-in-threads.spec.ts +++ b/playwright/e2e/read-receipts/redactions-in-threads.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("redactions", () => { test.describe("in threads", () => { test("Redacting the threaded message pointed to by my receipt leaves the room read", async ({ diff --git a/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts b/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts index c1dceda6a0..143d9685d8 100644 --- a/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts +++ b/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("redactions", () => { test.describe("in the main timeline", () => { test("Redacting the message pointed to by my receipt leaves the room read", async ({ diff --git a/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts b/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts index a8dc38c47e..01f296075c 100644 --- a/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts +++ b/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("redactions", () => { test.describe("thread roots", () => { test("Redacting a thread root after it was read leaves the room read", async ({ diff --git a/playwright/e2e/read-receipts/room-list-order.spec.ts b/playwright/e2e/read-receipts/room-list-order.spec.ts index 052e2d756a..80dda202a3 100644 --- a/playwright/e2e/read-receipts/room-list-order.spec.ts +++ b/playwright/e2e/read-receipts/room-list-order.spec.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { test } from "."; -test.describe("Read receipts", () => { +test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Room list order", () => { test("Rooms with unread messages appear at the top of room list if 'unread first' is selected", async ({ roomAlpha: room1, From 0c4189f2ed1a62f9f6bd4e20a7fa16df797f841d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 5 Dec 2024 14:42:26 +0000 Subject: [PATCH 12/32] Remove stale webpack configuration (#28649) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- webpack.config.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 8448ca38f6..cfbbd52685 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -187,18 +187,6 @@ module.exports = (env, argv) => { }, resolve: { - // We define an alternative import path so we can safely use src/ across the react-sdk - // and js-sdk. We already import from src/ where possible to ensure our source maps are - // extremely accurate (and because we're capable of compiling the layers manually rather - // than relying on partially-mangled output from babel), though we do need to fix the - // package level import (stuff like `import {Thing} from "matrix-js-sdk"` for example). - // We can't use the aliasing down below to point at src/ because that'll fail to resolve - // the package.json for the dependency. Instead, we rely on the package.json of each - // layer to have our custom alternate fields to load things in the right order. These are - // the defaults of webpack prepended with `matrix_src_`. - mainFields: ["matrix_src_browser", "matrix_src_main", "browser", "main"], - aliasFields: ["matrix_src_browser", "browser"], - // We need to specify that TS can be resolved without an extension extensions: [".js", ".json", ".ts", ".tsx"], alias: { From 5686666ad2556d5ad044526cd8015f469dec9cfd Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Thu, 5 Dec 2024 16:31:16 +0100 Subject: [PATCH 13/32] Fix multiple pinned messages flacky tests by waiting the message to be displayed in the banner when pinned. (#28655) --- playwright/e2e/pinned-messages/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/playwright/e2e/pinned-messages/index.ts b/playwright/e2e/pinned-messages/index.ts index ac50b62294..545d0e3438 100644 --- a/playwright/e2e/pinned-messages/index.ts +++ b/playwright/e2e/pinned-messages/index.ts @@ -129,6 +129,7 @@ export class Helpers { const timelineMessage = this.page.locator(".mx_MTextBody", { hasText: message }); await timelineMessage.click({ button: "right" }); await this.page.getByRole("menuitem", { name: "Pin", exact: true }).click(); + await this.assertMessageInBanner(message); } /** From dbdb23f6bc2669021b5b9191b4aa59f462944749 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Thu, 5 Dec 2024 17:11:40 +0100 Subject: [PATCH 14/32] Notify to resize the timeline when the pinned message banner is displayed or hidden (#28654) --- src/components/structures/RoomView.tsx | 6 ++- .../views/rooms/PinnedMessageBanner.tsx | 34 ++++++++++-- .../views/rooms/PinnedMessageBanner-test.tsx | 52 ++++++++++++++++++- 3 files changed, 86 insertions(+), 6 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 891e6b97f4..772d5698a3 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -2372,7 +2372,11 @@ export class RoomView extends React.Component { ); const pinnedMessageBanner = ( - + ); let messageComposer; diff --git a/src/components/views/rooms/PinnedMessageBanner.tsx b/src/components/views/rooms/PinnedMessageBanner.tsx index f44b4417c9..32000d5792 100644 --- a/src/components/views/rooms/PinnedMessageBanner.tsx +++ b/src/components/views/rooms/PinnedMessageBanner.tsx @@ -6,10 +6,10 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { JSX, useEffect, useState } from "react"; +import React, { JSX, useEffect, useRef, useState } from "react"; import PinIcon from "@vector-im/compound-design-tokens/assets/web/icons/pin-solid"; import { Button } from "@vector-im/compound-web"; -import { Room } from "matrix-js-sdk/src/matrix"; +import { MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import classNames from "classnames"; import { usePinnedEvents, useSortedFetchedPinnedEvents } from "../../../hooks/usePinnedEvents"; @@ -25,6 +25,7 @@ import { Action } from "../../../dispatcher/actions"; import MessageEvent from "../messages/MessageEvent"; import PosthogTrackers from "../../../PosthogTrackers.ts"; import { EventPreview } from "./EventPreview.tsx"; +import ResizeNotifier from "../../../utils/ResizeNotifier"; /** * The props for the {@link PinnedMessageBanner} component. @@ -38,12 +39,20 @@ interface PinnedMessageBannerProps { * The room where the banner is displayed */ room: Room; + /** + * The resize notifier to notify the timeline to resize itself when the banner is displayed or hidden. + */ + resizeNotifier: ResizeNotifier; } /** * A banner that displays the pinned messages in a room. */ -export function PinnedMessageBanner({ room, permalinkCreator }: PinnedMessageBannerProps): JSX.Element | null { +export function PinnedMessageBanner({ + room, + permalinkCreator, + resizeNotifier, +}: PinnedMessageBannerProps): JSX.Element | null { const pinnedEventIds = usePinnedEvents(room); const pinnedEvents = useSortedFetchedPinnedEvents(room, pinnedEventIds); const eventCount = pinnedEvents.length; @@ -56,6 +65,8 @@ export function PinnedMessageBanner({ room, permalinkCreator }: PinnedMessageBan }, [eventCount]); const pinnedEvent = pinnedEvents[currentEventIndex]; + useNotifyTimeline(pinnedEvent, resizeNotifier); + if (!pinnedEvent) return null; const shouldUseMessageEvent = pinnedEvent.isRedacted() || pinnedEvent.isDecryptionFailure(); @@ -128,6 +139,23 @@ export function PinnedMessageBanner({ room, permalinkCreator }: PinnedMessageBan ); } +/** + * When the banner is displayed or hidden, we want to notify the timeline to resize itself. + * @param pinnedEvent + * @param resizeNotifier + */ +function useNotifyTimeline(pinnedEvent: MatrixEvent | null, resizeNotifier: ResizeNotifier): void { + const previousEvent = useRef(null); + useEffect(() => { + // If we switch from a pinned message to no pinned message or the opposite, we want to resize the timeline + if ((previousEvent.current && !pinnedEvent) || (!previousEvent.current && pinnedEvent)) { + resizeNotifier.notifyTimelineHeightChanged(); + } + + previousEvent.current = pinnedEvent; + }, [pinnedEvent, resizeNotifier]); +} + const MAX_INDICATORS = 3; /** diff --git a/test/unit-tests/components/views/rooms/PinnedMessageBanner-test.tsx b/test/unit-tests/components/views/rooms/PinnedMessageBanner-test.tsx index 8d380c76bb..8717762e0d 100644 --- a/test/unit-tests/components/views/rooms/PinnedMessageBanner-test.tsx +++ b/test/unit-tests/components/views/rooms/PinnedMessageBanner-test.tsx @@ -20,6 +20,7 @@ import RightPanelStore from "../../../../../src/stores/right-panel/RightPanelSto import { RightPanelPhases } from "../../../../../src/stores/right-panel/RightPanelStorePhases"; import { UPDATE_EVENT } from "../../../../../src/stores/AsyncStore"; import { Action } from "../../../../../src/dispatcher/actions"; +import ResizeNotifier from "../../../../../src/utils/ResizeNotifier.ts"; describe("", () => { const userId = "@alice:server.org"; @@ -28,10 +29,12 @@ describe("", () => { let mockClient: MatrixClient; let room: Room; let permalinkCreator: RoomPermalinkCreator; + let resizeNotifier: ResizeNotifier; beforeEach(() => { mockClient = stubClient(); room = new Room(roomId, mockClient, userId); permalinkCreator = new RoomPermalinkCreator(room); + resizeNotifier = new ResizeNotifier(); jest.spyOn(dis, "dispatch").mockReturnValue(undefined); }); @@ -77,7 +80,7 @@ describe("", () => { */ function renderBanner() { return render( - , + , withClientContextRenderOptions(mockClient), ); } @@ -145,7 +148,9 @@ describe("", () => { event3.getId()!, ]); jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2, event3]); - rerender(); + rerender( + , + ); await expect(screen.findByText("Third pinned message")).resolves.toBeVisible(); expect(asFragment()).toMatchSnapshot(); }); @@ -206,6 +211,42 @@ describe("", () => { expect(asFragment()).toMatchSnapshot(); }); + describe("Notify the timeline to resize", () => { + beforeEach(() => { + jest.spyOn(resizeNotifier, "notifyTimelineHeightChanged"); + jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([event1.getId()!, event2.getId()!]); + jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2]); + }); + + it("should notify the timeline to resize when we display the banner", async () => { + renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); + // The banner is displayed, so we need to resize the timeline + expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1); + + await userEvent.click(screen.getByRole("button", { name: "View the pinned message in the timeline." })); + await expect(screen.findByText("First pinned message")).resolves.toBeVisible(); + // The banner is already displayed, so we don't need to resize the timeline + expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1); + }); + + it("should notify the timeline to resize when we hide the banner", async () => { + const { rerender } = renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); + // The banner is displayed, so we need to resize the timeline + expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(1); + + // The banner has no event to display and is hidden + jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([]); + jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([]); + rerender( + , + ); + // The timeline should be resized + expect(resizeNotifier.notifyTimelineHeightChanged).toHaveBeenCalledTimes(2); + }); + }); + describe("Right button", () => { beforeEach(() => { jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([event1.getId()!, event2.getId()!]); @@ -217,6 +258,8 @@ describe("", () => { jest.spyOn(RightPanelStore.instance, "isOpenForRoom").mockReturnValue(false); renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); + expect(screen.getByRole("button", { name: "View all" })).toBeVisible(); }); @@ -228,6 +271,8 @@ describe("", () => { }); renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); + expect(screen.getByRole("button", { name: "View all" })).toBeVisible(); }); @@ -239,6 +284,8 @@ describe("", () => { }); renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); + expect(screen.getByRole("button", { name: "Close list" })).toBeVisible(); }); @@ -263,6 +310,7 @@ describe("", () => { }); renderBanner(); + await expect(screen.findByText("Second pinned message")).resolves.toBeVisible(); expect(screen.getByRole("button", { name: "Close list" })).toBeVisible(); jest.spyOn(RightPanelStore.instance, "isOpenForRoom").mockReturnValue(false); From 5c51d179b9c1ca55c60a4cc449a18f3e0bcba786 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 19:28:39 +0000 Subject: [PATCH 15/32] Update linkify to v4.2.0 (#28665) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 8 ++++---- yarn.lock | 32 ++++++++++++++++---------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 5a75055510..5976379ab2 100644 --- a/package.json +++ b/package.json @@ -116,10 +116,10 @@ "jsrsasign": "^11.0.0", "jszip": "^3.7.0", "katex": "^0.16.0", - "linkify-element": "4.1.4", - "linkify-react": "4.1.4", - "linkify-string": "4.1.4", - "linkifyjs": "4.1.4", + "linkify-element": "4.2.0", + "linkify-react": "4.2.0", + "linkify-string": "4.2.0", + "linkifyjs": "4.2.0", "lodash": "^4.17.21", "maplibre-gl": "^4.0.0", "matrix-encrypt-attachment": "^1.0.3", diff --git a/yarn.lock b/yarn.lock index 551c5b4d6e..aa431c0204 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7959,10 +7959,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -linkify-element@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/linkify-element/-/linkify-element-4.1.4.tgz#d4050b41fb47c44871e5eed93bc11865e403cc90" - integrity sha512-XhSTTF7b7OoX4KIkwVG8MET5DSFEHohT0Gp5pjmsByYp+JCyZq5rSZGsar5dYzeuKUV6TqTSLtsH/NzBBwBxgQ== +linkify-element@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/linkify-element/-/linkify-element-4.2.0.tgz#fb5c6d47576487a463fd22a0cc889e15833aa943" + integrity sha512-LahyRMhXAgWTP9TOid7pTv8UUZFDz+saLkIVAoGNmOvISt+uSeBzdGhk3dsvkdzAh1QMhkO+fVJjmkMEITre5g== linkify-it@^4.0.1: version "4.0.1" @@ -7971,20 +7971,20 @@ linkify-it@^4.0.1: dependencies: uc.micro "^1.0.1" -linkify-react@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.1.4.tgz#6c709f3f96543914874982f4b0b00f9c9270ce93" - integrity sha512-UI9nqHtFzHYRUvVRrYeua5GIXkc0Jy3RpLsJBWEht7HwqjAa2qSaIksGmNSLqclNpO/5AkwaxUJv71I/pQsk9Q== +linkify-react@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/linkify-react/-/linkify-react-4.2.0.tgz#d143b2af8efa5e3b09517b66ed442624c3e06bcf" + integrity sha512-dIcDGo+n4FP2FPIHDcqB7cUE+omkcEgQJpc7sNNP4+XZ9FUhFAkKjGnHMzsZM+B4yF93sK166z9K5cKTe/JpzA== -linkify-string@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/linkify-string/-/linkify-string-4.1.4.tgz#89fb814e05c5b22f76d2a2a640bc8b1db4c6694f" - integrity sha512-4z2UEzEi4SxnhWMzzZ8Pa8vIOwX/2U0XWxk/0UIA7lI+Dn0ZRKqTE9ildnO6Jl6K5hqVuLKTeMD8p4bdFW6P8g== +linkify-string@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/linkify-string/-/linkify-string-4.2.0.tgz#e8c5a9d57698e81e7cce7f4915ddbcbde17134c0" + integrity sha512-LqOKk0+RlqibFkxjPAGOL7Mfssqj6/SdG9QWGvzeVDpoWXhaw9OXxseCtFanjIl7C6UyTTZizhyGr4IWLfijiw== -linkifyjs@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.4.tgz#2766605a20078d50c90f35af22275a42dfb7dfc4" - integrity sha512-0/NxkHNpiJ0k9VrYCkAn9OtU1eu8xEr1tCCpDtSsVRm/SF0xAak2Gzv3QimSfgUgqLBCDlfhMbu73XvaEHUTPQ== +linkifyjs@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.2.0.tgz#9dd30222b9cbabec9c950e725ec00031c7fa3f08" + integrity sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw== lint-staged@^15.0.2: version "15.2.10" From 319dab5920a173cc66020a99dad982c25099e215 Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Fri, 6 Dec 2024 06:17:19 +0000 Subject: [PATCH 16/32] [create-pull-request] automated change (#28669) 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 51c2723f30..1922058201 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:48308e18c5b3ad20bc0d090119618f45b6be4ba727522e37fbf7827d1a109531"; +const DOCKER_TAG = "develop@sha256:6ff2b43b7412eb4155c0147441421b31fc4b31acd56be82cf27daf172ababa4d"; async function cfgDirFromTemplate(opts: StartHomeserverOpts): Promise> { const templateDir = path.join(__dirname, "templates", opts.template); From 549300726fee53040d227b70de254d9fdcb2bfc8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 6 Dec 2024 09:18:33 +0000 Subject: [PATCH 17/32] Update CODEOWNERS --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e7a976a7be..af52a6b77d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,6 +13,7 @@ # Ignore translations as those will be updated by GHA for Localazy download /src/i18n/strings +/src/i18n/strings/en_EN.json @element-hq/element-web-reviewers # Ignore the synapse plugin as this is updated by GHA for docker image updating /playwright/plugins/homeserver/synapse/index.ts From 9cc5564d500b3fe72752b5cf71ba0e43770e9e42 Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Fri, 6 Dec 2024 09:38:58 +0000 Subject: [PATCH 18/32] [create-pull-request] automated change (#28670) Co-authored-by: t3chguy --- src/i18n/strings/de_DE.json | 1 + src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/pl.json | 23 ++++++++++++++++++----- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index f8298a28e9..5a4a6043fb 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2936,6 +2936,7 @@ "warning": "WARNUNG: " }, "share": { + "link_copied": "Link kopiert", "permalink_message": "Link zur ausgewählten Nachricht", "permalink_most_recent": "Link zur aktuellsten Nachricht", "share_call": "Konferenzeinladungslink", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index fe5e54e559..e9ac73b48b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -398,7 +398,7 @@ }, "bug_reporting": { "additional_context": "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.", - "before_submitting": "Before submitting logs, you must create a GitHub issue to describe your problem.", + "before_submitting": "We recommend creating a GitHub issue to ensure that your report is reviewed.", "collecting_information": "Collecting app version information", "collecting_logs": "Collecting logs", "create_new_issue": "Please create a new issue on GitHub so that we can investigate this bug.", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 3d5833446c..66ac807080 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -340,7 +340,7 @@ "set_email_prompt": "Czy chcesz ustawić adres e-mail?", "sign_in_description": "Użyj swojego konta, aby kontynuować.", "sign_in_instead": "Zamiast tego zaloguj się", - "sign_in_instead_prompt": "Zamiast tego zaloguj się", + "sign_in_instead_prompt": "Masz już konto? Zaloguj się tutaj", "sign_in_or_register": "Zaloguj się lub utwórz konto", "sign_in_or_register_description": "Użyj konta lub utwórz nowe, aby kontynuować.", "sign_in_prompt": "Posiadasz już konto? Zaloguj się", @@ -505,6 +505,7 @@ "matrix": "Matrix", "message": "Wiadomość", "message_layout": "Wygląd wiadomości", + "message_timestamp_invalid": "Nieprawidłowy znacznik czasu", "microphone": "Mikrofon", "model": "Model", "modern": "Współczesny", @@ -908,6 +909,8 @@ "warning": "Jeżeli nie ustawiłeś nowej metody odzyskiwania, atakujący może uzyskać dostęp do Twojego konta. Zmień hasło konta i natychmiast ustaw nową metodę odzyskiwania w Ustawieniach." }, "not_supported": "", + "pinned_identity_changed": "Tożsamość użytkownika %(displayName)s (%(userId)s) uległa zmianie. Dowiedz się więcej", + "pinned_identity_changed_no_displayname": "Tożsamość użytkownika %(userId)s uległa zmianie Dowiedz się więcej", "recovery_method_removed": { "description_1": "Ta sesja wykryła, że Twoja fraza bezpieczeństwa i klucz dla bezpiecznych wiadomości zostały usunięte.", "description_2": "Jeśli zrobiłeś to przez pomyłkę, możesz ustawić bezpieczne wiadomości w tej sesji, co zaszyfruje ponownie historię wiadomości za pomocą nowej metody odzyskiwania.", @@ -996,7 +999,7 @@ "unverified_sessions_toast_description": "Sprawdź, by upewnić się że Twoje konto jest bezpieczne", "unverified_sessions_toast_reject": "Później", "unverified_sessions_toast_title": "Masz niezweryfikowane sesje", - "verification_description": "Zweryfikuj swoją tożsamość, aby uzyskać dostęp do wiadomości szyfrowanych i potwierdzić swoją tożsamość innym.", + "verification_description": "Zweryfikuj swoją tożsamość, aby uzyskać dostęp do wiadomości szyfrowanych i potwierdzić swoją tożsamość innym. Jeśli korzystasz z urządzenia mobilnego, otwórz na niej aplikację.", "verification_dialog_title_device": "Zweryfikuj drugie urządzenie", "verification_dialog_title_user": "Żądanie weryfikacji", "verification_skip_warning": "Bez weryfikacji, nie będziesz posiadać dostępu do wszystkich swoich wiadomości, a inni będą Cię widzieć jako niezaufanego.", @@ -1102,7 +1105,15 @@ "you": "Dodano reakcję %(reaction)s do %(message)s" }, "m.sticker": "%(senderName)s: %(stickerName)s", - "m.text": "%(senderName)s: %(message)s" + "m.text": "%(senderName)s: %(message)s", + "prefix": { + "audio": "Audio", + "file": "Plik", + "image": "Obraz", + "poll": "Ankieta", + "video": "Wideo" + }, + "preview": "%(prefix)s: %(preview)s" }, "export_chat": { "cancelled": "Eksport został anulowany", @@ -2939,6 +2950,7 @@ "warning": "OSTRZEŻENIE: " }, "share": { + "link_copied": "Skopiowano link", "permalink_message": "Link do zaznaczonej wiadomości", "permalink_most_recent": "Link do najnowszej wiadomości", "share_call": "Link zaproszenia do konferencji", @@ -3247,8 +3259,8 @@ "historical_event_no_key_backup": "Historia wiadomości nie jest dostępna na tym urządzeniu", "historical_event_unverified_device": "Musisz zweryfikować to urządzenie, aby wyświetlić historię wiadomości", "historical_event_user_not_joined": "Nie masz dostępu do tej wiadomości", - "sender_identity_previously_verified": "Zweryfikowana tożsamość uległa zmianie", - "sender_unsigned_device": "Zaszyfrowano przez urządzenie niezweryfikowane przez właściciela.", + "sender_identity_previously_verified": "Zweryfikowana tożsamość nadawcy uległa zmianie", + "sender_unsigned_device": "Wysłano z niezabezpieczonego urządzenia.", "unable_to_decrypt": "Nie można rozszyfrować wiadomości" }, "disambiguated_profile": "%(displayName)s (%(matrixId)s)", @@ -3720,6 +3732,7 @@ "error_files_too_large": "Te pliki są zbyt duże do wysłania. Ograniczenie wielkości plików to %(limit)s.", "error_some_files_too_large": "Niektóre pliki są zbyt duże do wysłania. Ograniczenie wielkości plików to %(limit)s.", "error_title": "Błąd wysyłania", + "not_image": "Wybrany plik nie jest prawidłowym plikiem obrazu.", "title": "Prześlij pliki", "title_progress": "Prześlij pliki (%(current)s z %(total)s)", "upload_all_button": "Prześlij wszystko", From c659afa8db8e0dde59dd96ea43e927b54bf72a11 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 6 Dec 2024 10:26:26 +0000 Subject: [PATCH 19/32] Rename CreateCrossSigningDialog to InitialCryptoSetupDialog (#28658) * Rename CreateCrossSigningDialog to InitialCryptoSetup because it will soon encompass things other than just creating cross signing. * Fix name & tests * Fix import * Remove code creating key backup Because this was split out from my key backup by default PR * Fix comment * Convert to named export --- src/components/structures/auth/E2eSetup.tsx | 4 ++-- ...ialog.tsx => InitialCryptoSetupDialog.tsx} | 24 +++++++++++-------- ....tsx => InitialCryptoSetupDialog-test.tsx} | 14 +++++------ 3 files changed, 23 insertions(+), 19 deletions(-) rename src/components/views/dialogs/security/{CreateCrossSigningDialog.tsx => InitialCryptoSetupDialog.tsx} (83%) rename test/components/views/dialogs/security/{CreateCrossSigningDialog-test.tsx => InitialCryptoSetupDialog-test.tsx} (91%) diff --git a/src/components/structures/auth/E2eSetup.tsx b/src/components/structures/auth/E2eSetup.tsx index 80a135fe19..265905db10 100644 --- a/src/components/structures/auth/E2eSetup.tsx +++ b/src/components/structures/auth/E2eSetup.tsx @@ -11,7 +11,7 @@ import { MatrixClient } from "matrix-js-sdk/src/matrix"; import AuthPage from "../../views/auth/AuthPage"; import CompleteSecurityBody from "../../views/auth/CompleteSecurityBody"; -import CreateCrossSigningDialog from "../../views/dialogs/security/CreateCrossSigningDialog"; +import { InitialCryptoSetupDialog } from "../../views/dialogs/security/InitialCryptoSetupDialog"; interface IProps { matrixClient: MatrixClient; @@ -25,7 +25,7 @@ export default class E2eSetup extends React.Component { return ( - = ({ matrixClient, accountPassword, tokenLogin, onFinished }) => { +export const InitialCryptoSetupDialog: React.FC = ({ + matrixClient, + accountPassword, + tokenLogin, + onFinished, +}) => { const [error, setError] = useState(false); - const bootstrapCrossSigning = useCallback(async () => { + const doSetup = useCallback(async () => { const cryptoApi = matrixClient.getCrypto(); if (!cryptoApi) return; @@ -40,6 +45,7 @@ const CreateCrossSigningDialog: React.FC = ({ matrixClient, accountPasswo try { await createCrossSigning(matrixClient, tokenLogin, accountPassword); + onFinished(true); } catch (e) { if (tokenLogin) { @@ -58,8 +64,8 @@ const CreateCrossSigningDialog: React.FC = ({ matrixClient, accountPasswo }, [onFinished]); useEffect(() => { - bootstrapCrossSigning(); - }, [bootstrapCrossSigning]); + doSetup(); + }, [doSetup]); let content; if (error) { @@ -69,7 +75,7 @@ const CreateCrossSigningDialog: React.FC = ({ matrixClient, accountPasswo
@@ -95,5 +101,3 @@ const CreateCrossSigningDialog: React.FC = ({ matrixClient, accountPasswo ); }; - -export default CreateCrossSigningDialog; diff --git a/test/components/views/dialogs/security/CreateCrossSigningDialog-test.tsx b/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx similarity index 91% rename from test/components/views/dialogs/security/CreateCrossSigningDialog-test.tsx rename to test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx index 3e5dc4eb94..4d3d495a38 100644 --- a/test/components/views/dialogs/security/CreateCrossSigningDialog-test.tsx +++ b/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx @@ -12,14 +12,14 @@ import { mocked } from "jest-mock"; import { MatrixClient } from "matrix-js-sdk/src/matrix"; import { createCrossSigning } from "../../../../../src/CreateCrossSigning"; -import CreateCrossSigningDialog from "../../../../../src/components/views/dialogs/security/CreateCrossSigningDialog"; +import { InitialCryptoSetupDialog } from "../../../../../src/components/views/dialogs/security/InitialCryptoSetupDialog"; import { createTestClient } from "../../../../test-utils"; jest.mock("../../../../../src/CreateCrossSigning", () => ({ createCrossSigning: jest.fn(), })); -describe("CreateCrossSigningDialog", () => { +describe("InitialCryptoSetupDialog", () => { let client: MatrixClient; let createCrossSigningResolve: () => void; let createCrossSigningReject: (e: Error) => void; @@ -43,7 +43,7 @@ describe("CreateCrossSigningDialog", () => { const onFinished = jest.fn(); render( - { it("should display an error if createCrossSigning fails", async () => { render( - { const onFinished = jest.fn(); render( - { const onFinished = jest.fn(); render( - { it("should retry when the retry button is clicked", async () => { render( - Date: Fri, 6 Dec 2024 17:49:32 +0000 Subject: [PATCH 20/32] Make tsc faster again (#28678) * Stash initial work to bring TSC from over 6 mins to under 1 minute Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Stabilise types Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix incorrect props to AccessibleButton Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Swap AccessibleButton element types to match the props they provide Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Changed my mind, remove spurious previously ignored props Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update snapshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../context_menu/ContextMenuButton.tsx | 13 ++-- .../context_menu/ContextMenuTooltipButton.tsx | 13 ++-- .../roving/RovingAccessibleButton.tsx | 22 +++---- src/components/structures/auth/SoftLogout.tsx | 7 +-- .../auth/InteractiveAuthEntryComponents.tsx | 2 +- .../dialogs/devtools/SettingExplorer.tsx | 2 +- .../dialogs/spotlight/SpotlightDialog.tsx | 2 +- .../views/dialogs/spotlight/TooltipOption.tsx | 7 +-- .../views/directory/NetworkDropdown.tsx | 2 +- .../views/elements/AccessibleButton.tsx | 63 ++++++++++--------- .../views/elements/EditableItemList.tsx | 7 +-- src/components/views/emojipicker/Emoji.tsx | 2 +- .../views/messages/MPollEndBody.tsx | 2 +- .../views/messages/MessageActionBar.tsx | 2 +- src/components/views/settings/SetIdServer.tsx | 1 - .../devices/DeviceExpandDetailsButton.tsx | 15 ++--- .../tabs/user/MjolnirUserSettingsTab.tsx | 8 +-- .../views/spaces/SpaceBasicSettings.tsx | 1 - src/components/views/spaces/SpacePanel.tsx | 2 +- .../views/spaces/SpaceTreeLevel.tsx | 14 ++--- .../LegacyCallView/LegacyCallViewButtons.tsx | 2 +- .../__snapshots__/MatrixChat-test.tsx.snap | 1 - .../settings/SetIntegrationManager-test.tsx | 2 +- .../MjolnirUserSettingsTab-test.tsx.snap | 2 - 24 files changed, 83 insertions(+), 111 deletions(-) diff --git a/src/accessibility/context_menu/ContextMenuButton.tsx b/src/accessibility/context_menu/ContextMenuButton.tsx index d8c7d912c1..9d8b5585e3 100644 --- a/src/accessibility/context_menu/ContextMenuButton.tsx +++ b/src/accessibility/context_menu/ContextMenuButton.tsx @@ -8,25 +8,24 @@ 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, { ComponentProps, forwardRef, Ref } from "react"; +import React, { forwardRef, Ref } from "react"; -import AccessibleButton from "../../components/views/elements/AccessibleButton"; +import AccessibleButton, { ButtonProps } from "../../components/views/elements/AccessibleButton"; -type Props = ComponentProps> & { +type Props = ButtonProps & { label?: string; // whether the context menu is currently open isExpanded: boolean; }; // Semantic component for representing the AccessibleButton which launches a -export const ContextMenuButton = forwardRef(function ( - { label, isExpanded, children, onClick, onContextMenu, element, ...props }: Props, - ref: Ref, +export const ContextMenuButton = forwardRef(function ( + { label, isExpanded, children, onClick, onContextMenu, ...props }: Props, + ref: Ref, ) { return ( = ComponentProps> & { +type Props = ButtonProps & { // whether the context menu is currently open isExpanded: boolean; }; // Semantic component for representing the AccessibleButton which launches a -export const ContextMenuTooltipButton = forwardRef(function ( - { isExpanded, children, onClick, onContextMenu, element, ...props }: Props, - ref: Ref, +export const ContextMenuTooltipButton = forwardRef(function ( + { isExpanded, children, onClick, onContextMenu, ...props }: Props, + ref: Ref, ) { return ( = Omit< - ComponentProps>, - "inputRef" | "tabIndex" -> & { - inputRef?: Ref; +type Props = Omit, "tabIndex"> & { + inputRef?: RefObject; focusOnMouseOver?: boolean; }; // Wrapper to allow use of useRovingTabIndex for simple AccessibleButtons outside of React Functional Components. -export const RovingAccessibleButton = ({ +export const RovingAccessibleButton = ({ inputRef, onFocus, onMouseOver, focusOnMouseOver, - element, ...props }: Props): JSX.Element => { - const [onFocusInternal, isActive, ref] = useRovingTabIndex(inputRef); + const [onFocusInternal, isActive, ref] = useRovingTabIndex(inputRef); return ( { + onFocus={(event: React.FocusEvent) => { onFocusInternal(); onFocus?.(event); }} - onMouseOver={(event: React.MouseEvent) => { + onMouseOver={(event: React.MouseEvent) => { if (focusOnMouseOver) onFocusInternal(); onMouseOver?.(event); }} diff --git a/src/components/structures/auth/SoftLogout.tsx b/src/components/structures/auth/SoftLogout.tsx index db72a0a04b..9c7a900643 100644 --- a/src/components/structures/auth/SoftLogout.tsx +++ b/src/components/structures/auth/SoftLogout.tsx @@ -235,12 +235,7 @@ export default class SoftLogout extends React.Component { value={this.state.password} disabled={this.state.busy} /> - + {_t("action|sign_in")} diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index b1360f5560..ae5c07e348 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -910,7 +910,7 @@ export class SSOAuthEntry extends React.Component extends React.Component { protected popupWindow: Window | null; - protected fallbackButton = createRef(); + protected fallbackButton = createRef(); public constructor(props: IAuthEntryProps & T) { super(props); diff --git a/src/components/views/dialogs/devtools/SettingExplorer.tsx b/src/components/views/dialogs/devtools/SettingExplorer.tsx index ed4b64d870..ae37fa3e1c 100644 --- a/src/components/views/dialogs/devtools/SettingExplorer.tsx +++ b/src/components/views/dialogs/devtools/SettingExplorer.tsx @@ -298,7 +298,7 @@ const SettingsList: React.FC = ({ onBack, onView, onEdit }) {i} onEdit(i)} className="mx_DevTools_SettingsExplorer_edit" > diff --git a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx index 20d6825b9b..a87b7341e7 100644 --- a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx +++ b/src/components/views/dialogs/spotlight/SpotlightDialog.tsx @@ -1253,7 +1253,7 @@ const SpotlightDialog: React.FC = ({ initialText = "", initialFilter = n {filterToLabel(filter)} = ButtonProps & { +type TooltipOptionProps = ButtonProps & { + className?: string; endAdornment?: ReactNode; inputRef?: Ref; }; -export const TooltipOption = ({ +export const TooltipOption = ({ inputRef, className, - element, ...props }: TooltipOptionProps): JSX.Element => { const [onFocus, isActive, ref] = useRovingTabIndex(inputRef); @@ -34,7 +34,6 @@ export const TooltipOption = ({ tabIndex={-1} aria-selected={isActive} role="option" - element={element as keyof JSX.IntrinsicElements} /> ); }; diff --git a/src/components/views/directory/NetworkDropdown.tsx b/src/components/views/directory/NetworkDropdown.tsx index 43d123676b..a1b1986f47 100644 --- a/src/components/views/directory/NetworkDropdown.tsx +++ b/src/components/views/directory/NetworkDropdown.tsx @@ -168,7 +168,7 @@ export const NetworkDropdown: React.FC = ({ protocols, config, setConfig adornment: ( setUserDefinedServers(without(userDefinedServers, roomServer))} /> ), diff --git a/src/components/views/elements/AccessibleButton.tsx b/src/components/views/elements/AccessibleButton.tsx index b8b5297384..8b58f251c3 100644 --- a/src/components/views/elements/AccessibleButton.tsx +++ b/src/components/views/elements/AccessibleButton.tsx @@ -6,7 +6,15 @@ 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, { ComponentProps, forwardRef, FunctionComponent, HTMLAttributes, InputHTMLAttributes, Ref } from "react"; +import React, { + ComponentProps, + ComponentPropsWithoutRef, + forwardRef, + FunctionComponent, + ReactElement, + KeyboardEvent, + Ref, +} from "react"; import classnames from "classnames"; import { Tooltip } from "@vector-im/compound-web"; @@ -38,20 +46,8 @@ export type AccessibleButtonKind = | "icon_primary" | "icon_primary_outline"; -/** - * This type construct allows us to specifically pass those props down to the element we’re creating that the element - * actually supports. - * - * e.g., if element is set to "a", we’ll support href and target, if it’s set to "input", we support type. - * - * To remain compatible with existing code, we’ll continue to support InputHTMLAttributes - */ -type DynamicHtmlElementProps = - JSX.IntrinsicElements[T] extends HTMLAttributes<{}> ? DynamicElementProps : DynamicElementProps<"div">; -type DynamicElementProps = Partial< - Omit -> & - Omit, "onClick">; +type ElementType = keyof HTMLElementTagNameMap; +const defaultElement = "div"; type TooltipProps = ComponentProps; @@ -60,7 +56,7 @@ type TooltipProps = ComponentProps; * * Extends props accepted by the underlying element specified using the `element` prop. */ -type Props = DynamicHtmlElementProps & { +type Props = { /** * The base element type. "div" by default. */ @@ -105,14 +101,12 @@ type Props = DynamicHtmlElementProps & disableTooltip?: TooltipProps["disabled"]; }; -export type ButtonProps = Props; +export type ButtonProps = Props & Omit, keyof Props>; /** * Type of the props passed to the element that is rendered by AccessibleButton. */ -interface RenderedElementProps extends React.InputHTMLAttributes { - ref?: React.Ref; -} +type RenderedElementProps = React.InputHTMLAttributes & RefProp; /** * AccessibleButton is a generic wrapper for any element that should be treated @@ -124,9 +118,9 @@ interface RenderedElementProps extends React.InputHTMLAttributes { * @param {Object} props react element properties * @returns {Object} rendered react */ -const AccessibleButton = forwardRef(function ( +const AccessibleButton = forwardRef(function ( { - element = "div" as T, + element, onClick, children, kind, @@ -141,10 +135,10 @@ const AccessibleButton = forwardRef(function , - ref: Ref, + }: ButtonProps, + ref: Ref, ): JSX.Element { - const newProps: RenderedElementProps = restProps; + const newProps = restProps as RenderedElementProps; newProps["aria-label"] = newProps["aria-label"] ?? title; if (disabled) { newProps["aria-disabled"] = true; @@ -162,7 +156,7 @@ const AccessibleButton = forwardRef(function { + newProps.onKeyDown = (e: KeyboardEvent) => { const action = getKeyBindingsManager().getAccessibilityAction(e); switch (action) { @@ -178,7 +172,7 @@ const AccessibleButton = forwardRef(function { + newProps.onKeyUp = (e: KeyboardEvent) => { const action = getKeyBindingsManager().getAccessibilityAction(e); switch (action) { @@ -207,7 +201,7 @@ const AccessibleButton = forwardRef(function { + ref?: Ref; +} + +interface ButtonComponent { + // With the explicit `element` prop + (props: { element?: C } & ButtonProps & RefProp): ReactElement; + // Without the explicit `element` prop + (props: ButtonProps<"div"> & RefProp<"div">): ReactElement; +} + +export default AccessibleButton as ButtonComponent; diff --git a/src/components/views/elements/EditableItemList.tsx b/src/components/views/elements/EditableItemList.tsx index dc6e6c09a1..ad2d9aceee 100644 --- a/src/components/views/elements/EditableItemList.tsx +++ b/src/components/views/elements/EditableItemList.tsx @@ -133,12 +133,7 @@ export default class EditableItemList

extends React.PureComponent - + {_t("action|add")} diff --git a/src/components/views/emojipicker/Emoji.tsx b/src/components/views/emojipicker/Emoji.tsx index c3dfb24bd1..a852122b75 100644 --- a/src/components/views/emojipicker/Emoji.tsx +++ b/src/components/views/emojipicker/Emoji.tsx @@ -31,7 +31,7 @@ class Emoji extends React.PureComponent { return ( onClick(ev, emoji)} + onClick={(ev: ButtonEvent) => onClick(ev, emoji)} onMouseEnter={() => onMouseEnter(emoji)} onMouseLeave={() => onMouseLeave(emoji)} className="mx_EmojiPicker_item_wrapper" diff --git a/src/components/views/messages/MPollEndBody.tsx b/src/components/views/messages/MPollEndBody.tsx index 94671fea12..1129b3538e 100644 --- a/src/components/views/messages/MPollEndBody.tsx +++ b/src/components/views/messages/MPollEndBody.tsx @@ -90,7 +90,7 @@ export const MPollEndBody = React.forwardRef(({ mxEvent, ...pro const { pollStartEvent, isLoadingPollStartEvent } = usePollStartEvent(mxEvent); if (!pollStartEvent) { - const pollEndFallbackMessage = M_TEXT.findIn(mxEvent.getContent()) || textForEvent(mxEvent, cli); + const pollEndFallbackMessage = M_TEXT.findIn(mxEvent.getContent()) || textForEvent(mxEvent, cli); return ( <> diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index 9d21b8fa45..579db054e9 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -435,7 +435,7 @@ export default class MessageActionBar extends React.PureComponent this.onPinClick(e, isPinned)} + onClick={(e: ButtonEvent) => this.onPinClick(e, isPinned)} onContextMenu={(e: ButtonEvent) => this.onPinClick(e, isPinned)} key="pin" placement="left" diff --git a/src/components/views/settings/SetIdServer.tsx b/src/components/views/settings/SetIdServer.tsx index 8ed6461d0a..6dc3ae48a2 100644 --- a/src/components/views/settings/SetIdServer.tsx +++ b/src/components/views/settings/SetIdServer.tsx @@ -407,7 +407,6 @@ export default class SetIdServer extends React.Component { forceValidity={this.state.error ? false : undefined} /> = Omit< - ComponentProps>, - "aria-label" | "title" | "kind" | "className" | "onClick" | "element" +type Props = Omit< + ButtonProps, + "aria-label" | "title" | "kind" | "className" | "element" > & { isExpanded: boolean; - onClick: () => void; }; -export const DeviceExpandDetailsButton = ({ +export const DeviceExpandDetailsButton = ({ isExpanded, - onClick, ...rest }: Props): JSX.Element => { const label = isExpanded ? _t("settings|sessions|hide_details") : _t("settings|sessions|show_details"); @@ -36,7 +34,6 @@ export const DeviceExpandDetailsButton = className={classNames("mx_DeviceExpandDetailsButton", { mx_DeviceExpandDetailsButton_expanded: isExpanded, })} - onClick={onClick} > diff --git a/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx b/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx index 9ad7df31e9..3e86d779ff 100644 --- a/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx @@ -268,7 +268,6 @@ export default class MjolnirUserSettingsTab extends React.Component<{}, IState> onChange={this.onPersonalRuleChanged} /> value={this.state.newList} onChange={this.onNewListChanged} /> - + {_t("action|subscribe")} diff --git a/src/components/views/spaces/SpaceBasicSettings.tsx b/src/components/views/spaces/SpaceBasicSettings.tsx index 8311e6728e..63a70a97cd 100644 --- a/src/components/views/spaces/SpaceBasicSettings.tsx +++ b/src/components/views/spaces/SpaceBasicSettings.tsx @@ -71,7 +71,6 @@ export const SpaceAvatar: React.FC avatarUploadRef.current?.click()} - alt="" /> avatarUploadRef.current?.click()} diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx index af484445b4..73bb66af38 100644 --- a/src/components/views/spaces/SpacePanel.tsx +++ b/src/components/views/spaces/SpacePanel.tsx @@ -221,7 +221,7 @@ const CreateSpaceButton: React.FC { - const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(); + const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(); useEffect(() => { if (!isPanelCollapsed && menuDisplayed) { diff --git a/src/components/views/spaces/SpaceTreeLevel.tsx b/src/components/views/spaces/SpaceTreeLevel.tsx index cee4cf54ec..38329c39b7 100644 --- a/src/components/views/spaces/SpaceTreeLevel.tsx +++ b/src/components/views/spaces/SpaceTreeLevel.tsx @@ -30,7 +30,7 @@ import defaultDispatcher from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; import { toRightOf, useContextMenu } from "../../structures/ContextMenu"; -import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent, ButtonProps as AccessibleButtonProps } from "../elements/AccessibleButton"; import { StaticNotificationState } from "../../../stores/notifications/StaticNotificationState"; import { NotificationLevel } from "../../../stores/notifications/NotificationLevel"; import { getKeyBindingsManager } from "../../../KeyBindingsManager"; @@ -39,8 +39,8 @@ import SpaceContextMenu from "../context_menus/SpaceContextMenu"; import { useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; -type ButtonProps = Omit< - ComponentProps>, +type ButtonProps = Omit< + AccessibleButtonProps, "title" | "onClick" | "size" | "element" > & { space?: Room; @@ -52,12 +52,12 @@ type ButtonProps = Omit< notificationState?: NotificationState; isNarrow?: boolean; size: string; - innerRef?: RefObject; + innerRef?: RefObject; ContextMenuComponent?: ComponentType>; onClick?(ev?: ButtonEvent): void; }; -export const SpaceButton = ({ +export const SpaceButton = ({ space, spaceKey: _spaceKey, className, @@ -72,8 +72,8 @@ export const SpaceButton = ({ ContextMenuComponent, ...props }: ButtonProps): JSX.Element => { - const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(innerRef); - const [onFocus, isActive, ref] = useRovingTabIndex(handle); + const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(innerRef); + const [onFocus, isActive, ref] = useRovingTabIndex(handle); const tabIndex = isActive ? 0 : -1; const spaceKey = _spaceKey ?? space?.roomId; diff --git a/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx b/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx index bdcd3713cb..105736d04e 100644 --- a/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx +++ b/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx @@ -69,7 +69,7 @@ interface IDropdownButtonProps extends ButtonProps { } const LegacyCallViewDropdownButton: React.FC = ({ state, deviceKinds, ...props }) => { - const [menuDisplayed, buttonRef, openMenu, closeMenu] = useContextMenu(); + const [menuDisplayed, buttonRef, openMenu, closeMenu] = useContextMenu(); const [hoveringDropdown, setHoveringDropdown] = useState(false); const classes = classNames("mx_LegacyCallViewButtons_button", "mx_LegacyCallViewButtons_dropdownButton", { diff --git a/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap b/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap index 94c2678388..1bdbe016d4 100644 --- a/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap +++ b/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap @@ -314,7 +314,6 @@ exports[` with a soft-logged-out session should show the soft-logo class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary" role="button" tabindex="0" - type="submit" > Sign in diff --git a/test/unit-tests/components/views/settings/SetIntegrationManager-test.tsx b/test/unit-tests/components/views/settings/SetIntegrationManager-test.tsx index 888499d524..5c77e88d93 100644 --- a/test/unit-tests/components/views/settings/SetIntegrationManager-test.tsx +++ b/test/unit-tests/components/views/settings/SetIntegrationManager-test.tsx @@ -35,7 +35,7 @@ describe("SetIntegrationManager", () => { deleteThreePid: jest.fn(), }); - let stores: SdkContextClass; + let stores!: SdkContextClass; const getComponent = () => ( diff --git a/test/unit-tests/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap b/test/unit-tests/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap index 4bdaf3275c..17986bd3bc 100644 --- a/test/unit-tests/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap +++ b/test/unit-tests/components/views/settings/tabs/user/__snapshots__/MjolnirUserSettingsTab-test.tsx.snap @@ -85,7 +85,6 @@ exports[` renders correctly when user has no ignored u class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary" role="button" tabindex="0" - type="submit" > Ignore @@ -150,7 +149,6 @@ exports[` renders correctly when user has no ignored u class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary" role="button" tabindex="0" - type="submit" > Subscribe From 2b4000d47fd967583f7aa914b545069a3e5b15ae Mon Sep 17 00:00:00 2001 From: Hubert Chathi Date: Mon, 9 Dec 2024 16:02:29 -0500 Subject: [PATCH 21/32] Add delay in test to allow Alice to fetch Bob's device keys (#28668) * add delay in test to allow Alice to fetch Bob's device keys * wait until we see bob's device, rather than hard-coding a timeout * Fix comment Co-authored-by: Florian Duros * fix lint --------- Co-authored-by: Florian Duros --- playwright/e2e/crypto/user-verification.spec.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/playwright/e2e/crypto/user-verification.spec.ts b/playwright/e2e/crypto/user-verification.spec.ts index 4c8d641e6f..bd3d859526 100644 --- a/playwright/e2e/crypto/user-verification.spec.ts +++ b/playwright/e2e/crypto/user-verification.spec.ts @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import { type Preset, type Visibility } from "matrix-js-sdk/src/matrix"; +import type { Page } from "@playwright/test"; import { test, expect } from "../../element-web-test"; import { doTwoWaySasVerification, awaitVerifier } from "./utils"; import { Client } from "../../pages/client"; @@ -38,6 +39,8 @@ test.describe("User verification", () => { toasts, room: { roomId: dmRoomId }, }) => { + await waitForDeviceKeys(page); + // once Alice has joined, Bob starts the verification const bobVerificationRequest = await bob.evaluateHandle( async (client, { dmRoomId, aliceCredentials }) => { @@ -87,6 +90,8 @@ test.describe("User verification", () => { toasts, room: { roomId: dmRoomId }, }) => { + await waitForDeviceKeys(page); + // once Alice has joined, Bob starts the verification const bobVerificationRequest = await bob.evaluateHandle( async (client, { dmRoomId, aliceCredentials }) => { @@ -149,3 +154,15 @@ async function createDMRoom(client: Client, userId: string): Promise { ], }); } + +/** + * Wait until we get the other user's device keys. + * In newer rust-crypto versions, the verification request will be ignored if we + * don't have the sender's device keys. + */ +async function waitForDeviceKeys(page: Page): Promise { + await expect(page.getByRole("button", { name: "Avatar" })).toBeVisible(); + const avatar = await page.getByRole("button", { name: "Avatar" }); + await avatar.click(); + await expect(page.getByText("1 session")).toBeVisible(); +} From a4e8bb3f9ad823ef0197c1b019f0ecc9951a3458 Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Tue, 10 Dec 2024 06:17:13 +0000 Subject: [PATCH 22/32] [create-pull-request] automated change (#28696) 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 1922058201..078ca2848f 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:6ff2b43b7412eb4155c0147441421b31fc4b31acd56be82cf27daf172ababa4d"; +const DOCKER_TAG = "develop@sha256:6b82dba715fa7ae641010b4cc5e71edaeb9cc05a50ac5b9e4ff09afa9cd2a80d"; async function cfgDirFromTemplate(opts: StartHomeserverOpts): Promise> { const templateDir = path.join(__dirname, "templates", opts.template); From 6b7c94905f06f5eae307ae2469e13f0eeba82105 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Tue, 10 Dec 2024 12:05:30 +0000 Subject: [PATCH 23/32] Allow trusted Element Call widget to send and receive media encryption key to-device messages (#28316) --- src/stores/widgets/StopGapWidgetDriver.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 5bc2ac7fc0..de7a71fa80 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -194,6 +194,7 @@ export class StopGapWidgetDriver extends WidgetDriver { EventType.CallSDPStreamMetadataChanged, EventType.CallSDPStreamMetadataChangedPrefix, EventType.CallReplaces, + EventType.CallEncryptionKeysPrefix, ]; for (const eventType of sendRecvToDevice) { this.allowedCapabilities.add( From e835cab1398979cbd0c3aba93b5e08095dd36cb0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 17:20:18 +0000 Subject: [PATCH 24/32] Update all non-major dependencies (#28703) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 279 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 181 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index 5976379ab2..6ab08023e8 100644 --- a/package.json +++ b/package.json @@ -269,7 +269,7 @@ "postcss-preset-env": "^10.0.0", "postcss-scss": "^4.0.4", "postcss-simple-vars": "^7.0.1", - "prettier": "3.4.1", + "prettier": "3.4.2", "process": "^0.11.10", "raw-loader": "^4.0.2", "rimraf": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index aa431c0204..759939eca9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,7 +34,7 @@ dependencies: axe-core "~4.10.2" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -51,11 +51,16 @@ "@babel/highlight" "^7.25.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.0": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== +"@babel/compat-data@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== + "@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": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" @@ -103,13 +108,13 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -303,12 +308,12 @@ dependencies: "@babel/types" "^7.25.8" -"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -1121,15 +1126,15 @@ globals "^11.1.0" "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" @@ -1142,7 +1147,7 @@ "@babel/helper-validator-identifier" "^7.25.7" to-fast-properties "^2.0.0" -"@babel/types@^7.25.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.4.4": +"@babel/types@^7.25.7", "@babel/types@^7.4.4": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== @@ -1150,6 +1155,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@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" @@ -2419,10 +2432,10 @@ "@sentry/core" "8.40.0" "@sentry/types" "8.40.0" -"@sentry/babel-plugin-component-annotate@2.22.6": - version "2.22.6" - resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.6.tgz#829d6caf2c95c1c46108336de4e1049e6521435e" - integrity sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ== +"@sentry/babel-plugin-component-annotate@2.22.7": + version "2.22.7" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.7.tgz#604c7e33d48528a13477e7af597c4d5fca51b8bd" + integrity sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ== "@sentry/browser@^8.0.0": version "8.40.0" @@ -2436,14 +2449,14 @@ "@sentry/core" "8.40.0" "@sentry/types" "8.40.0" -"@sentry/bundler-plugin-core@2.22.6": - version "2.22.6" - resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.6.tgz#a1ea1fd43700a3ece9e7db016997e79a2782b87d" - integrity sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg== +"@sentry/bundler-plugin-core@2.22.7": + version "2.22.7" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.7.tgz#28204a224cd1fef58d157e5beeb2493947a9bc35" + integrity sha512-ouQh5sqcB8vsJ8yTTe0rf+iaUkwmeUlGNFi35IkCFUQlWJ22qS6OfvNjOqFI19e6eGUXks0c/2ieFC4+9wJ+1g== dependencies: "@babel/core" "^7.18.5" - "@sentry/babel-plugin-component-annotate" "2.22.6" - "@sentry/cli" "^2.36.1" + "@sentry/babel-plugin-component-annotate" "2.22.7" + "@sentry/cli" "2.39.1" dotenv "^16.3.1" find-up "^5.0.0" glob "^9.3.2" @@ -2485,7 +2498,7 @@ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.39.1.tgz#1a874a5570c6d162b35d9d001c96e5389d07d2cb" integrity sha512-xv0R2CMf/X1Fte3cMWie1NXuHmUyQPDBfCyIt6k6RPFPxAYUgcqgMPznYwVMwWEA1W43PaOkSn3d8ZylsDaETw== -"@sentry/cli@^2.36.1": +"@sentry/cli@2.39.1": version "2.39.1" resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.39.1.tgz#916bb5b7567ccf7fdf94ef6cf8a2b9ab78370d29" integrity sha512-JIb3e9vh0+OmQ0KxmexMXg9oZsR/G7HMwxt5BUIKAXZ9m17Xll4ETXTRnRUBT3sf7EpNGAmlQk1xEmVN9pYZYQ== @@ -2517,11 +2530,11 @@ integrity sha512-nuCf3U3deolPM9BjNnwCc33UtFl9ec15/r74ngAkNccn+A2JXdIAsDkGJMO/9mgSFykLe1QyeJ0pQFRisCGOiA== "@sentry/webpack-plugin@^2.7.1": - version "2.22.6" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.22.6.tgz#8c9d27d5cd89153a5b6e08cc9dcb3048b122ffbc" - integrity sha512-BiLhAzQYAz/9kCXKj2LeUKWf/9GBVn2dD0DeYK89s+sjDEaxjbcLBBiLlLrzT7eC9QVj2tUZRKOi6puCfc8ysw== + version "2.22.7" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-2.22.7.tgz#992c6c782c736f22e72eb318745e28cc24aabad7" + integrity sha512-j5h5LZHWDlm/FQCCmEghQ9FzYXwfZdlOf3FE/X6rK6lrtx0JCAkq+uhMSasoyP4XYKL4P4vRS6WFSos4jxf/UA== dependencies: - "@sentry/bundler-plugin-core" "2.22.6" + "@sentry/bundler-plugin-core" "2.22.7" unplugin "1.0.1" uuid "^9.0.0" @@ -3410,7 +3423,7 @@ dependencies: eslint-plugin-unicorn "^54.0.0" -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -3476,7 +3489,7 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -"@webassemblyjs/wasm-edit@^1.12.1": +"@webassemblyjs/wasm-edit@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== @@ -3511,7 +3524,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -4197,7 +4210,15 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -4208,6 +4229,16 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bind@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -4789,11 +4820,11 @@ css-tree@^2.3.1: source-map-js "^1.0.1" css-tree@^3.0.0, css-tree@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.0.1.tgz#bea6deaea60bb5bcf416adfb1ecf607a8d9471f6" - integrity sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" + integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== dependencies: - mdn-data "2.12.1" + mdn-data "2.12.2" source-map-js "^1.0.1" css-tree@~2.2.0: @@ -4970,10 +5001,10 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@~4.3.6: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== +debug@4, debug@^4.1.0, debug@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -4984,6 +5015,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@~4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5241,9 +5279,18 @@ dot-case@^3.0.4: tslib "^2.0.3" dotenv@^16.0.2, dotenv@^16.3.1: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.0.tgz#c2fce098b3c8f8899554905f4377b6d85dabaa80" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" duplexer@^0.1.2: version "0.1.2" @@ -5282,9 +5329,9 @@ ejs@^3.1.8: jake "^10.8.5" electron-to-chromium@^1.5.41: - version "1.5.67" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz#66ebd2be4a77469ac2760ef5e9e460ba9a43a845" - integrity sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ== + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== emittery@^0.13.1: version "0.13.1" @@ -5433,12 +5480,10 @@ es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23 unbox-primitive "^1.0.2" which-typed-array "^1.1.15" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" @@ -5921,9 +5966,9 @@ expect@^29.0.0, expect@^29.7.0: jest-util "^29.7.0" express@^4.18.2, express@^4.19.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -5944,7 +5989,7 @@ express@^4.18.2, express@^4.19.2: methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.13.0" range-parser "~1.2.1" @@ -6305,7 +6350,7 @@ get-east-asian-width@^1.0.0: resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -6316,6 +6361,20 @@ get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz#dfe7dd1b30761b464fe51bf4bb00ac7c37b681e7" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== + dependencies: + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -6492,7 +6551,12 @@ globjoin@^0.1.4: resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== -gopd@^1.0.1, gopd@^1.1.0: +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +gopd@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.1.0.tgz#df8f0839c2d48caefc32a025a49294d39606c912" integrity sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA== @@ -6543,18 +6607,30 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: +has-proto@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-proto@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.1.0.tgz#deb10494cbbe8809bce168a3b961f42969f5ed43" integrity sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q== dependencies: call-bind "^1.0.7" -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" @@ -7878,9 +7954,9 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== knip@^5.36.2: - version "5.38.3" - resolved "https://registry.yarnpkg.com/knip/-/knip-5.38.3.tgz#a139e0c6215c9958d213ce1a9e3985cf5de2774e" - integrity sha512-pg3CMzWlZy4mnuwxieGoK74oOgzFPvsUR/aE8NSqx2oQr56soXTzmw8GsHR277pU52Fe0h4/pho2PMhVeEvj8g== + version "5.39.2" + resolved "https://registry.yarnpkg.com/knip/-/knip-5.39.2.tgz#1faacd8d8ef36b509b2f6e396cce85b645abb04e" + integrity sha512-BuvuWRllLWV/r2G4m9ggNH+DZ6gouP/dhtJPXVlMbWNF++w9/EfrF6k2g7YBKCwjzCC+PXmYtpH8S2t8RjnY4Q== dependencies: "@nodelib/fs.walk" "1.2.8" "@snyk/github-codeowners" "1.1.0" @@ -8286,12 +8362,7 @@ mdn-data@2.0.30: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== -mdn-data@2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.1.tgz#10cb462215c13d95c92ff60d0fb3becac1bbb924" - integrity sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q== - -mdn-data@^2.12.2: +mdn-data@2.12.2, mdn-data@^2.12.2: version "2.12.2" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== @@ -8575,9 +8646,9 @@ node-int64@^0.4.0: integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-package-data@^2.5.0: version "2.5.0" @@ -8963,10 +9034,10 @@ path-scurry@^2.0.0: lru-cache "^11.0.0" minipass "^7.1.2" -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-to-regexp@^2.2.1: version "2.4.0" @@ -9704,10 +9775,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" - integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== +prettier@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== pretty-error@^4.0.0: version "4.0.0" @@ -10520,7 +10591,7 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.1, set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -11180,7 +11251,7 @@ terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: serialize-javascript "^6.0.1" terser "^5.26.0" -terser@^5.10.0, terser@^5.26.0: +terser@^5.10.0: version "5.36.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== @@ -11190,6 +11261,16 @@ terser@^5.10.0, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -11885,15 +11966,15 @@ webpack-virtual-modules@^0.5.0: integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== webpack@^5.89.0: - version "5.96.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" - integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== + version "5.97.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.97.1.tgz#972a8320a438b56ff0f1d94ade9e82eac155fa58" + integrity sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6" - "@webassemblyjs/ast" "^1.12.1" - "@webassemblyjs/wasm-edit" "^1.12.1" - "@webassemblyjs/wasm-parser" "^1.12.1" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.14.0" browserslist "^4.24.0" chrome-trace-event "^1.0.2" @@ -12232,6 +12313,6 @@ zod-validation-error@^3.0.3: integrity sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ== zod@^3.22.4: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + version "3.24.0" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.0.tgz#babb32313f7c5f4a99812feee806d186b4f76bde" + integrity sha512-Hz+wiY8yD0VLA2k/+nsg2Abez674dDGTai33SwNvMPuf9uIrBC9eFgIMQxBBbHFxVXi8W+5nX9DcAh9YNSQm/w== From b86bb5cc2f897229891ad839ccdc12604773dbf9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 02:01:31 +0000 Subject: [PATCH 25/32] Update guibranco/github-status-action-v2 digest to d469d49 (#28702) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0c531f89b4..35803a60f1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -104,7 +104,7 @@ jobs: - name: Skip SonarCloud in merge queue if: github.event_name == 'merge_group' || inputs.disable_coverage == 'true' - uses: guibranco/github-status-action-v2@66088c44e212a906c32a047529a213d81809ec1c + uses: guibranco/github-status-action-v2@d469d49426f5a7b8a1fbcac20ad274d3e4892321 with: authToken: ${{ secrets.GITHUB_TOKEN }} state: success From b330de5d6e64798dafd7915cc440d956c9b55a22 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 11 Dec 2024 13:10:27 +0000 Subject: [PATCH 26/32] Factor out crypto setup process into a store (#28675) * Factor out crypto setup process into a store To make components pure and avoid react 18 dev mode problems due to components making requests when mounted. * fix test * test for the store * Add comment --- src/@types/global.d.ts | 2 + src/components/structures/MatrixChat.tsx | 16 +- src/components/structures/auth/E2eSetup.tsx | 11 +- .../security/InitialCryptoSetupDialog.tsx | 54 ++----- src/stores/InitialCryptoSetupStore.ts | 140 ++++++++++++++++++ src/stores/SetupEncryptionStore.ts | 5 + .../InitialCryptoSetupDialog-test.tsx | 114 +++----------- .../stores/InitialCryptoSetupStore-test.ts | 85 +++++++++++ 8 files changed, 274 insertions(+), 153 deletions(-) create mode 100644 src/stores/InitialCryptoSetupStore.ts create mode 100644 test/unit-tests/stores/InitialCryptoSetupStore-test.ts diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index be36c5b689..f921cd291f 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -44,6 +44,7 @@ import { IConfigOptions } from "../IConfigOptions"; import { MatrixDispatcher } from "../dispatcher/dispatcher"; import { DeepReadonly } from "./common"; import MatrixChat from "../components/structures/MatrixChat"; +import { InitialCryptoSetupStore } from "../stores/InitialCryptoSetupStore"; /* eslint-disable @typescript-eslint/naming-convention */ @@ -117,6 +118,7 @@ declare global { mxPerformanceEntryNames: any; mxUIStore: UIStore; mxSetupEncryptionStore?: SetupEncryptionStore; + mxInitialCryptoStore?: InitialCryptoSetupStore; mxRoomScrollStateStore?: RoomScrollStateStore; mxActiveWidgetStore?: ActiveWidgetStore; mxOnRecaptchaLoaded?: () => void; diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 548dbff983..ee120c430a 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -132,6 +132,7 @@ import { SessionLockStolenView } from "./auth/SessionLockStolenView"; import { ConfirmSessionLockTheftView } from "./auth/ConfirmSessionLockTheftView"; import { LoginSplashView } from "./auth/LoginSplashView"; import { cleanUpDraftsIfRequired } from "../../DraftCleaner"; +import { InitialCryptoSetupStore } from "../../stores/InitialCryptoSetupStore"; // legacy export export { default as Views } from "../../Views"; @@ -428,6 +429,12 @@ export default class MatrixChat extends React.PureComponent { !(await shouldSkipSetupEncryption(cli)) ) { // if cross-signing is not yet set up, do so now if possible. + InitialCryptoSetupStore.sharedInstance().startInitialCryptoSetup( + cli, + Boolean(this.tokenLogin), + this.stores, + this.onCompleteSecurityE2eSetupFinished, + ); this.setStateForNewView({ view: Views.E2E_SETUP }); } else { this.onLoggedIn(); @@ -2073,14 +2080,7 @@ export default class MatrixChat extends React.PureComponent { } else if (this.state.view === Views.COMPLETE_SECURITY) { view = ; } else if (this.state.view === Views.E2E_SETUP) { - view = ( - - ); + view = ; } else if (this.state.view === Views.LOGGED_IN) { // `ready` and `view==LOGGED_IN` may be set before `page_type` (because the // latter is set via the dispatcher). If we don't yet have a `page_type`, diff --git a/src/components/structures/auth/E2eSetup.tsx b/src/components/structures/auth/E2eSetup.tsx index 265905db10..3b064d6134 100644 --- a/src/components/structures/auth/E2eSetup.tsx +++ b/src/components/structures/auth/E2eSetup.tsx @@ -7,17 +7,13 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; -import { MatrixClient } from "matrix-js-sdk/src/matrix"; import AuthPage from "../../views/auth/AuthPage"; import CompleteSecurityBody from "../../views/auth/CompleteSecurityBody"; import { InitialCryptoSetupDialog } from "../../views/dialogs/security/InitialCryptoSetupDialog"; interface IProps { - matrixClient: MatrixClient; onFinished: () => void; - accountPassword?: string; - tokenLogin: boolean; } export default class E2eSetup extends React.Component { @@ -25,12 +21,7 @@ export default class E2eSetup extends React.Component { return ( - + ); diff --git a/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx b/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx index 4ee69f17a4..22635662ce 100644 --- a/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx +++ b/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx @@ -7,20 +7,15 @@ 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, { useCallback, useEffect, useState } from "react"; -import { logger } from "matrix-js-sdk/src/logger"; -import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import React, { useCallback } from "react"; import { _t } from "../../../../languageHandler"; import DialogButtons from "../../elements/DialogButtons"; import BaseDialog from "../BaseDialog"; import Spinner from "../../elements/Spinner"; -import { createCrossSigning } from "../../../../CreateCrossSigning"; +import { InitialCryptoSetupStore, useInitialCryptoSetupStatus } from "../../../../stores/InitialCryptoSetupStore"; interface Props { - matrixClient: MatrixClient; - accountPassword?: string; - tokenLogin: boolean; onFinished: (success?: boolean) => void; } @@ -29,54 +24,27 @@ interface Props { * In most cases, only a spinner is shown, but for more * complex auth like SSO, the user may need to complete some steps to proceed. */ -export const InitialCryptoSetupDialog: React.FC = ({ - matrixClient, - accountPassword, - tokenLogin, - onFinished, -}) => { - const [error, setError] = useState(false); +export const InitialCryptoSetupDialog: React.FC = ({ onFinished }) => { + const onRetryClick = useCallback(() => { + InitialCryptoSetupStore.sharedInstance().retry(); + }, []); - const doSetup = useCallback(async () => { - const cryptoApi = matrixClient.getCrypto(); - if (!cryptoApi) return; - - setError(false); - - try { - await createCrossSigning(matrixClient, tokenLogin, accountPassword); - - onFinished(true); - } catch (e) { - if (tokenLogin) { - // ignore any failures, we are relying on grace period here - onFinished(false); - return; - } - - setError(true); - logger.error("Error bootstrapping cross-signing", e); - } - }, [matrixClient, tokenLogin, accountPassword, onFinished]); - - const onCancel = useCallback(() => { + const onCancelClick = useCallback(() => { onFinished(false); }, [onFinished]); - useEffect(() => { - doSetup(); - }, [doSetup]); + const status = useInitialCryptoSetupStatus(InitialCryptoSetupStore.sharedInstance()); let content; - if (error) { + if (status === "error") { content = (

{_t("encryption|unable_to_setup_keys_error")}

diff --git a/src/stores/InitialCryptoSetupStore.ts b/src/stores/InitialCryptoSetupStore.ts new file mode 100644 index 0000000000..0c2e49f5ca --- /dev/null +++ b/src/stores/InitialCryptoSetupStore.ts @@ -0,0 +1,140 @@ +/* +Copyright 2024 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only +Please see LICENSE files in the repository root for full details. +*/ + +import EventEmitter from "events"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { logger } from "matrix-js-sdk/src/logger"; +import { useEffect, useState } from "react"; + +import { createCrossSigning } from "../CreateCrossSigning"; +import { SdkContextClass } from "../contexts/SDKContext"; + +type Status = "in_progress" | "complete" | "error" | undefined; + +export const useInitialCryptoSetupStatus = (store: InitialCryptoSetupStore): Status => { + const [status, setStatus] = useState(store.getStatus()); + + useEffect(() => { + const update = (): void => { + setStatus(store.getStatus()); + }; + + store.on("update", update); + + return () => { + store.off("update", update); + }; + }, [store]); + + return status; +}; + +/** + * Logic for setting up crypto state that's done immediately after + * a user registers. Should be transparent to the user, not requiring + * interaction in most cases. + * As distinct from SetupEncryptionStore which is for setting up + * 4S or verifying the device, will always require interaction + * from the user in some form. + */ +export class InitialCryptoSetupStore extends EventEmitter { + private status: Status = undefined; + + private client?: MatrixClient; + private isTokenLogin?: boolean; + private stores?: SdkContextClass; + private onFinished?: (success: boolean) => void; + + public static sharedInstance(): InitialCryptoSetupStore { + if (!window.mxInitialCryptoStore) window.mxInitialCryptoStore = new InitialCryptoSetupStore(); + return window.mxInitialCryptoStore; + } + + public getStatus(): Status { + return this.status; + } + + /** + * Start the initial crypto setup process. + * + * @param {MatrixClient} client The client to use for the setup + * @param {boolean} isTokenLogin True if the user logged in via a token login, otherwise false + * @param {SdkContextClass} stores The stores to use for the setup + */ + public startInitialCryptoSetup( + client: MatrixClient, + isTokenLogin: boolean, + stores: SdkContextClass, + onFinished: (success: boolean) => void, + ): void { + this.client = client; + this.isTokenLogin = isTokenLogin; + this.stores = stores; + this.onFinished = onFinished; + + // We just start this process: it's progress is tracked by the events rather + // than returning a promise, so we don't bother. + this.doSetup().catch(() => logger.error("Initial crypto setup failed")); + } + + /** + * Retry the initial crypto setup process. + * + * If no crypto setup is currently in process, this will return false. + * + * @returns {boolean} True if a retry was initiated, otherwise false + */ + public retry(): boolean { + if (this.client === undefined || this.isTokenLogin === undefined || this.stores == undefined) return false; + + this.doSetup().catch(() => logger.error("Initial crypto setup failed")); + + return true; + } + + private reset(): void { + this.client = undefined; + this.isTokenLogin = undefined; + this.stores = undefined; + } + + private async doSetup(): Promise { + if (this.client === undefined || this.isTokenLogin === undefined || this.stores == undefined) { + throw new Error("No setup is in progress"); + } + + const cryptoApi = this.client.getCrypto(); + if (!cryptoApi) throw new Error("No crypto module found!"); + + this.status = "in_progress"; + this.emit("update"); + + try { + await createCrossSigning(this.client, this.isTokenLogin, this.stores.accountPasswordStore.getPassword()); + + this.reset(); + + this.status = "complete"; + this.emit("update"); + this.onFinished?.(true); + } catch (e) { + if (this.isTokenLogin) { + // ignore any failures, we are relying on grace period here + this.reset(); + + this.status = "complete"; + this.emit("update"); + this.onFinished?.(true); + + return; + } + logger.error("Error bootstrapping cross-signing", e); + this.status = "error"; + this.emit("update"); + } + } +} diff --git a/src/stores/SetupEncryptionStore.ts b/src/stores/SetupEncryptionStore.ts index 70c721b1ca..a13ba26f72 100644 --- a/src/stores/SetupEncryptionStore.ts +++ b/src/stores/SetupEncryptionStore.ts @@ -33,6 +33,11 @@ export enum Phase { ConfirmReset = 6, } +/** + * Logic for setting up 4S and/or verifying the user's device: a process requiring + * ongoing interaction with the user, as distinct from InitialCryptoSetupStore which + * a (usually) non-interactive process that happens immediately after registration. + */ export class SetupEncryptionStore extends EventEmitter { private started?: boolean; public phase?: Phase; diff --git a/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx b/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx index 4d3d495a38..a589b55289 100644 --- a/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx +++ b/test/components/views/dialogs/security/InitialCryptoSetupDialog-test.tsx @@ -7,31 +7,22 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; -import { render, screen, waitFor } from "jest-matrix-react"; -import { mocked } from "jest-mock"; -import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { render, screen } from "jest-matrix-react"; +import userEvent from "@testing-library/user-event"; -import { createCrossSigning } from "../../../../../src/CreateCrossSigning"; import { InitialCryptoSetupDialog } from "../../../../../src/components/views/dialogs/security/InitialCryptoSetupDialog"; -import { createTestClient } from "../../../../test-utils"; - -jest.mock("../../../../../src/CreateCrossSigning", () => ({ - createCrossSigning: jest.fn(), -})); +import { InitialCryptoSetupStore } from "../../../../../src/stores/InitialCryptoSetupStore"; describe("InitialCryptoSetupDialog", () => { - let client: MatrixClient; - let createCrossSigningResolve: () => void; - let createCrossSigningReject: (e: Error) => void; + const storeMock = { + getStatus: jest.fn(), + retry: jest.fn(), + on: jest.fn(), + off: jest.fn(), + }; beforeEach(() => { - client = createTestClient(); - mocked(createCrossSigning).mockImplementation(() => { - return new Promise((resolve, reject) => { - createCrossSigningResolve = resolve; - createCrossSigningReject = reject; - }); - }); + jest.spyOn(InitialCryptoSetupStore, "sharedInstance").mockReturnValue(storeMock as any); }); afterEach(() => { @@ -39,93 +30,32 @@ describe("InitialCryptoSetupDialog", () => { jest.restoreAllMocks(); }); - it("should call createCrossSigning and show a spinner while it runs", async () => { + it("should show a spinner while the setup is in progress", async () => { const onFinished = jest.fn(); - render( - , - ); + storeMock.getStatus.mockReturnValue("in_progress"); + + render(); - expect(createCrossSigning).toHaveBeenCalledWith(client, false, "hunter2"); expect(screen.getByTestId("spinner")).toBeInTheDocument(); - - createCrossSigningResolve!(); - - await waitFor(() => expect(onFinished).toHaveBeenCalledWith(true)); }); - it("should display an error if createCrossSigning fails", async () => { - render( - , - ); + it("should display an error if setup has failed", async () => { + storeMock.getStatus.mockReturnValue("error"); - createCrossSigningReject!(new Error("generic error message")); + render(); await expect(await screen.findByRole("button", { name: "Retry" })).toBeInTheDocument(); }); - it("ignores failures when tokenLogin is true", async () => { + it("calls retry when retry button pressed", async () => { const onFinished = jest.fn(); + storeMock.getStatus.mockReturnValue("error"); - render( - , - ); + render(); - createCrossSigningReject!(new Error("generic error message")); + await userEvent.click(await screen.findByRole("button", { name: "Retry" })); - await waitFor(() => expect(onFinished).toHaveBeenCalledWith(false)); - }); - - it("cancels the dialog when the cancel button is clicked", async () => { - const onFinished = jest.fn(); - - render( - , - ); - - createCrossSigningReject!(new Error("generic error message")); - - const cancelButton = await screen.findByRole("button", { name: "Cancel" }); - cancelButton.click(); - - expect(onFinished).toHaveBeenCalledWith(false); - }); - - it("should retry when the retry button is clicked", async () => { - render( - , - ); - - createCrossSigningReject!(new Error("generic error message")); - - const retryButton = await screen.findByRole("button", { name: "Retry" }); - retryButton.click(); - - expect(createCrossSigning).toHaveBeenCalledTimes(2); + expect(storeMock.retry).toHaveBeenCalled(); }); }); diff --git a/test/unit-tests/stores/InitialCryptoSetupStore-test.ts b/test/unit-tests/stores/InitialCryptoSetupStore-test.ts new file mode 100644 index 0000000000..64b81bade2 --- /dev/null +++ b/test/unit-tests/stores/InitialCryptoSetupStore-test.ts @@ -0,0 +1,85 @@ +/* +Copyright 2024 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only +Please see LICENSE files in the repository root for full details. +*/ + +import { mocked } from "jest-mock"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { waitFor } from "jest-matrix-react"; + +import { createCrossSigning } from "../../../src/CreateCrossSigning"; +import { InitialCryptoSetupStore } from "../../../src/stores/InitialCryptoSetupStore"; +import { SdkContextClass } from "../../../src/contexts/SDKContext"; +import { createTestClient } from "../../test-utils"; +import { AccountPasswordStore } from "../../../src/stores/AccountPasswordStore"; + +jest.mock("../../../src/CreateCrossSigning", () => ({ + createCrossSigning: jest.fn(), +})); + +describe("InitialCryptoSetupStore", () => { + let testStore: InitialCryptoSetupStore; + let client: MatrixClient; + let stores: SdkContextClass; + + let createCrossSigningResolve: () => void; + let createCrossSigningReject: (e: Error) => void; + + beforeEach(() => { + testStore = new InitialCryptoSetupStore(); + client = createTestClient(); + stores = { + accountPasswordStore: { + getPassword: jest.fn(), + } as unknown as AccountPasswordStore, + } as unknown as SdkContextClass; + + mocked(createCrossSigning).mockImplementation(() => { + return new Promise((resolve, reject) => { + createCrossSigningResolve = resolve; + createCrossSigningReject = reject; + }); + }); + }); + + it("should call createCrossSigning when startInitialCryptoSetup is called", async () => { + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + + await waitFor(() => expect(createCrossSigning).toHaveBeenCalled()); + }); + + it("emits an update event when createCrossSigning resolves", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + createCrossSigningResolve(); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("complete"); + }); + + it("emits an update event when createCrossSigning rejects", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + createCrossSigningReject(new Error("Test error")); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("error"); + }); + + it("should ignore failures if tokenLogin is true", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, true, stores, jest.fn()); + createCrossSigningReject(new Error("Test error")); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("complete"); + }); +}); From ba98c2085d5239e168c825b7d5683890e2882728 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:13:09 +0000 Subject: [PATCH 27/32] Update dependency @formatjs/intl-segmenter to v11.7.5 (#28713) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 759939eca9..73c74ed8ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1608,36 +1608,37 @@ resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-5.1.0.tgz#ab629b2c662457022d2d6a29854b8dc8ba538c47" integrity sha512-zKZR3kf1G0noIes1frLfOHP5EXVVm0M7sV/l9f/AaYf+M/DId35FO4LkigWjqWYjTJZGgplhdv4cB+ssvCqr5A== -"@formatjs/ecma402-abstract@2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz#355e42d375678229d46dc8ad7a7139520dd03e7b" - integrity sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg== +"@formatjs/ecma402-abstract@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz#cdeb3ffe1aeea9c4284b85b7e37e8e8615314c39" + integrity sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw== dependencies: - "@formatjs/fast-memoize" "2.2.3" - "@formatjs/intl-localematcher" "0.5.8" + "@formatjs/fast-memoize" "2.2.5" + "@formatjs/intl-localematcher" "0.5.9" + decimal.js "10" tslib "2" -"@formatjs/fast-memoize@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz#74e64109279d5244f9fc281f3ae90c407cece823" - integrity sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA== +"@formatjs/fast-memoize@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz#54a4a1793d773b72c372d3dcab3595149aee7880" + integrity sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g== dependencies: tslib "2" -"@formatjs/intl-localematcher@0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz#b11bbd04bd3551f7cadcb1ef1e231822d0e3c97e" - integrity sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg== +"@formatjs/intl-localematcher@0.5.9": + version "0.5.9" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz#43c6ee22be85b83340bcb09bdfed53657a2720db" + integrity sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA== dependencies: tslib "2" "@formatjs/intl-segmenter@^11.5.7": - version "11.7.4" - resolved "https://registry.yarnpkg.com/@formatjs/intl-segmenter/-/intl-segmenter-11.7.4.tgz#f99d87ee3f98515069285438a4913681fc243252" - integrity sha512-pyHgFO86/CReKl20oK9jgaTMzSaG/nIMteMW8YuwUcS22EoMI1qbGTZ65oQ38KMT05SiHiMee2CP3WZvCi8YSQ== + version "11.7.7" + resolved "https://registry.yarnpkg.com/@formatjs/intl-segmenter/-/intl-segmenter-11.7.7.tgz#8a5aaa316e11ca2d31b99222e6fcf1ab539b085e" + integrity sha512-610J5xz5DxtEpa16zNR89CrvA9qWHxQFkUB3FKiGao0Nwn7i8cl+oyBhuH9SvtXF9j2LUOM9VMdVCMzJkVANNw== dependencies: - "@formatjs/ecma402-abstract" "2.2.4" - "@formatjs/intl-localematcher" "0.5.8" + "@formatjs/ecma402-abstract" "2.3.1" + "@formatjs/intl-localematcher" "0.5.9" tslib "2" "@humanwhocodes/config-array@^0.13.0": @@ -5027,7 +5028,7 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.4.2: +decimal.js@10, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== From cf3bdbdc7aa9174228eb91a7a7b7658103f3d48e Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 11 Dec 2024 14:25:56 +0000 Subject: [PATCH 28/32] Fix Read Receipt Test (#28719) * Update test snapshot as the date formatting appears to have gained a comma, and somehow got through the merge tests on the dependency bump. * Actually this was the problem --- .../components/views/rooms/ReadReceiptGroup-test.tsx | 8 ++++++++ .../rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/unit-tests/components/views/rooms/ReadReceiptGroup-test.tsx b/test/unit-tests/components/views/rooms/ReadReceiptGroup-test.tsx index ff89aa6942..13500f9b1f 100644 --- a/test/unit-tests/components/views/rooms/ReadReceiptGroup-test.tsx +++ b/test/unit-tests/components/views/rooms/ReadReceiptGroup-test.tsx @@ -10,6 +10,7 @@ import React, { ComponentProps } from "react"; import { render, screen, waitFor } from "jest-matrix-react"; import { RoomMember } from "matrix-js-sdk/src/matrix"; import userEvent from "@testing-library/user-event"; +import { mocked } from "jest-mock"; import { determineAvatarPosition, @@ -20,6 +21,9 @@ import * as languageHandler from "../../../../../src/languageHandler"; import { stubClient } from "../../../../test-utils"; import dispatcher from "../../../../../src/dispatcher/dispatcher"; import { Action } from "../../../../../src/dispatcher/actions"; +import { formatDate } from "../../../../../src/DateUtils"; + +jest.mock("../../../../../src/DateUtils"); describe("ReadReceiptGroup", () => { describe("TooltipText", () => { @@ -87,6 +91,10 @@ describe("ReadReceiptGroup", () => { describe("", () => { stubClient(); + // We pick a fixed time but this can still vary depending on the locale + // the tests are run in. We are not testing date formatting here, so stub it out. + mocked(formatDate).mockReturnValue("==MOCK FORMATTED DATE=="); + const ROOM_ID = "roomId"; const USER_ID = "@alice:example.org"; diff --git a/test/unit-tests/components/views/rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap b/test/unit-tests/components/views/rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap index b0ba944a66..60e8f844af 100644 --- a/test/unit-tests/components/views/rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap +++ b/test/unit-tests/components/views/rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap @@ -84,7 +84,7 @@ exports[`ReadReceiptGroup should render 1`] = `

- Wed, 15 May, 0:00 + ==MOCK FORMATTED DATE==

From 8dff7581538af28e4e65e63d7228d0bfeb64282e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:02:47 +0000 Subject: [PATCH 29/32] Update definitelyTyped (#28704) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 73c74ed8ff..c5ea5cdf7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3048,9 +3048,9 @@ "@types/node" "*" "@types/jsrsasign@^10.5.4": - version "10.5.14" - resolved "https://registry.yarnpkg.com/@types/jsrsasign/-/jsrsasign-10.5.14.tgz#61d1dbd791ecd11db556c1ca5d82453fc7207338" - integrity sha512-lppSlfK6etu+cuKs40K4rg8As79PH6hzIB+v55zSqImbSH3SE6Fm8MBHCiI91cWlAP3Z4igtJK1VL3fSN09blQ== + version "10.5.15" + resolved "https://registry.yarnpkg.com/@types/jsrsasign/-/jsrsasign-10.5.15.tgz#5cf1ee506b2fa2435b6e1786a873285c7110eb82" + integrity sha512-3stUTaSRtN09PPzVWR6aySD9gNnuymz+WviNHoTb85dKu+BjaV4uBbWWGykBBJkfwPtcNZVfTn2lbX00U+yhpQ== "@types/katex@^0.16.0": version "0.16.7" @@ -3114,9 +3114,9 @@ undici-types "~6.20.0" "@types/node@18": - version "18.19.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.66.tgz#0937a47904ceba5994eedf5cf4b6d503d8d6136c" - integrity sha512-14HmtUdGxFUalGRfLLn9Gc1oNWvWh5zNbsyOLo5JV6WARSeN1QcEBKRnZm9QqNfrutgsl/hY4eJW63aZ44aBCg== + version "18.19.68" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.68.tgz#f4f10d9927a7eaf3568c46a6d739cc0967ccb701" + integrity sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw== dependencies: undici-types "~5.26.4" From a755e399cf818834a5ae403c6a1ea4ad2b38951e Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 11 Dec 2024 19:00:24 +0000 Subject: [PATCH 30/32] Change to en-US locale for date tests (#28723) * Change to en-US locale for date tests As per comment. Fixes the tests. * Spell locale right Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --------- Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- test/unit-tests/utils/DateUtils-test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/unit-tests/utils/DateUtils-test.ts b/test/unit-tests/utils/DateUtils-test.ts index 6112c19e4a..2007c8a05a 100644 --- a/test/unit-tests/utils/DateUtils-test.ts +++ b/test/unit-tests/utils/DateUtils-test.ts @@ -178,22 +178,26 @@ describe("formatDate", () => { it("should return time string if date is within same day", () => { const date = new Date(REPEATABLE_DATE.getTime() + 2 * HOUR_MS + 12 * MINUTE_MS); - expect(formatDate(date, false, "en-GB")).toMatchInlineSnapshot(`"19:10"`); + // We use en-US for these tests because there was a change in Node 22.12 which removed + // the comma after the weekday for en-GB which makes the test output different things + // on different node versions. I'm not sure what a better fix would be, so let's just use + // a locale that happens to have a more stable formatting right now. + expect(formatDate(date, false, "en-US")).toMatchInlineSnapshot(`"19:10"`); }); it("should return time string with weekday if date is within last 6 days", () => { const date = new Date(REPEATABLE_DATE.getTime() - 6 * DAY_MS + 2 * HOUR_MS + 12 * MINUTE_MS); - expect(formatDate(date, false, "en-GB")).toMatchInlineSnapshot(`"Fri 19:10"`); + expect(formatDate(date, false, "en-US")).toMatchInlineSnapshot(`"Fri 19:10"`); }); it("should return time & date string without year if it is within the same year", () => { const date = new Date(REPEATABLE_DATE.getTime() - 66 * DAY_MS + 2 * HOUR_MS + 12 * MINUTE_MS); - expect(formatDate(date, false, "en-GB")).toMatchInlineSnapshot(`"Mon, 12 Sept, 19:10"`); + expect(formatDate(date, false, "en-US")).toMatchInlineSnapshot(`"Mon, Sep 12, 19:10"`); }); it("should return full time & date string otherwise", () => { const date = new Date(REPEATABLE_DATE.getTime() - 666 * DAY_MS + 2 * HOUR_MS + 12 * MINUTE_MS); - expect(formatDate(date, false, "en-GB")).toMatchInlineSnapshot(`"Wed, 20 Jan 2021, 19:10"`); + expect(formatDate(date, false, "en-US")).toMatchInlineSnapshot(`"Wed, Jan 20, 2021, 19:10"`); }); }); From 2aa72bb40b3fd2625f51bc717693e5affa18e7b2 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Wed, 11 Dec 2024 20:35:59 +0100 Subject: [PATCH 31/32] Update `@vector-im/compound-web` to `7.5.0` (#28700) Co-authored-by: David Baker --- package.json | 2 +- .../window-12px-linux.png | Bin 68062 -> 68174 bytes .../theme-panel-custom-theme-added-linux.png | Bin 20261 -> 20516 bytes .../theme-panel-custom-theme-linux.png | Bin 16873 -> 17114 bytes ...theme-panel-custom-theme-removed-linux.png | Bin 18941 -> 19259 bytes .../theme-panel-dark-linux.png | Bin 9712 -> 9957 bytes .../theme-panel-light-linux.png | Bin 10197 -> 10445 bytes ...theme-panel-match-system-enabled-linux.png | Bin 9332 -> 9698 bytes .../RoomSummaryCard-test.tsx.snap | 9 +- .../LayoutSwitcher-test.tsx.snap | 26 ++-- .../ThemeChoicePanel-test.tsx.snap | 140 +++++++++--------- .../AppearanceUserSettingsTab-test.tsx.snap | 52 +++---- .../__snapshots__/SpacePanel-test.tsx.snap | 6 + .../ThreadsActivityCentre-test.tsx.snap | 9 +- yarn.lock | 18 +-- 15 files changed, 135 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index 6ab08023e8..9cd0163945 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@matrix-org/spec": "^1.7.0", "@sentry/browser": "^8.0.0", "@vector-im/compound-design-tokens": "^2.0.1", - "@vector-im/compound-web": "^7.4.0", + "@vector-im/compound-web": "^7.5.0", "@vector-im/matrix-wysiwyg": "2.37.13", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png index b2b71375bd2a908c3259d5e057e265270f2aae12..41ffca6c93d9911ffc82ea687b1727d9f37563d5 100644 GIT binary patch delta 48589 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 GKK>80P9j+V delta 48459 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 literal 20261 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 diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png index 1ec17661fe4f561d5a51eee6e3e608f0e6c0f20c..23b88c022c86abef6e6066cb04d5670690862e5a 100644 GIT binary patch literal 19259 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%0AC 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 literal 18941 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 Gp$P!0#0GEx diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png index 75db794a1a38b5be82ba6db5bd57581c47540ec3..6378098d7ac99bc2cec0392e7fa1aa096a1faec4 100644 GIT binary patch literal 9957 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 Ze0J=cBE5k!01<;ga?;9g5Ku$E{{=?k98UlM literal 10197 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 literal 9332 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 has button to edit topic 1`] = ` style="--mx-box-flex: 1;" >

renders the room summary 1`] = ` style="--mx-box-flex: 1;" >

renders the room topic in the summary 1`] = ` style="--mx-box-flex: 1;" >

should render 1`] = ` class="mx_SettingsSubsection_content mx_SettingsSubsection_content_newUi" >