From 92b27ad04411c546782c2e4ef28620df67997ef6 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 24 Mar 2023 10:25:21 +0000 Subject: [PATCH 1/7] Support for MSC3882 revision 1 Availability of MSC3882 is now via /capabilities not /versions --- .../settings/devices/LoginWithQRSection.tsx | 5 ++- .../tabs/user/SecurityUserSettingsTab.tsx | 7 +++- .../settings/tabs/user/SessionManagerTab.tsx | 3 +- .../devices/LoginWithQRSection-test.tsx | 26 ++++++++++++ .../LoginWithQRSection-test.tsx.snap | 42 +++++++++++++++++++ .../user/SecurityUserSettingsTab-test.tsx | 6 ++- .../tabs/user/SessionManagerTab-test.tsx | 7 +++- 7 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/src/components/views/settings/devices/LoginWithQRSection.tsx index 356084dec73..efaae0427d2 100644 --- a/src/components/views/settings/devices/LoginWithQRSection.tsx +++ b/src/components/views/settings/devices/LoginWithQRSection.tsx @@ -24,6 +24,8 @@ import SettingsSubsection from "../shared/SettingsSubsection"; interface IProps { onShowQr: () => void; versions?: IServerVersions; + // we can't use the capabilities type from the js-sdk because it isn't exported + capabilities?: Record; } export default class LoginWithQRSection extends React.Component { @@ -33,7 +35,8 @@ export default class LoginWithQRSection extends React.Component { public render(): JSX.Element | null { // Needs server support for MSC3882 and MSC3886: - const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"]; + // in r0 of MSC3882 it is exposed as a feature flag, but in r1 it is a capability + const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || !!this.props.capabilities?.["org.matrix.msc3882.get_logintoken"]?.enabled; const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"]; const offerShowQr = msc3882Supported && msc3886Supported; diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx index 9697af802b6..b3c2846a993 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx @@ -82,6 +82,8 @@ interface IState { invitedRoomIds: Set; showLoginWithQR: Mode | null; versions?: IServerVersions; + // we can't use the capabilities type from the js-sdk because it isn't exported + capabilities?: Record; } export default class SecurityUserSettingsTab extends React.Component { @@ -116,6 +118,9 @@ export default class SecurityUserSettingsTab extends React.Component this.setState({ versions })); + MatrixClientPeg.get() + .getCapabilities() + .then((capabilities) => this.setState({ capabilities })); } public componentWillUnmount(): void { @@ -393,7 +398,7 @@ export default class SecurityUserSettingsTab extends React.Component - + ); diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/src/components/views/settings/tabs/user/SessionManagerTab.tsx index 4e66da4ea2c..b2447e3b4c4 100644 --- a/src/components/views/settings/tabs/user/SessionManagerTab.tsx +++ b/src/components/views/settings/tabs/user/SessionManagerTab.tsx @@ -132,6 +132,7 @@ const SessionManagerTab: React.FC = () => { const userId = matrixClient.getUserId(); const currentUserMember = (userId && matrixClient.getUser(userId)) || undefined; const clientVersions = useAsyncMemo(() => matrixClient.getVersions(), [matrixClient]); + const capabilities = useAsyncMemo(() => matrixClient.getCapabilities(), [matrixClient]); const onDeviceExpandToggle = (deviceId: ExtendedDevice["device_id"]): void => { if (expandedDeviceIds.includes(deviceId)) { @@ -279,7 +280,7 @@ const SessionManagerTab: React.FC = () => { /> )} - + ); }; diff --git a/test/components/views/settings/devices/LoginWithQRSection-test.tsx b/test/components/views/settings/devices/LoginWithQRSection-test.tsx index 2f272acdec5..12831383e41 100644 --- a/test/components/views/settings/devices/LoginWithQRSection-test.tsx +++ b/test/components/views/settings/devices/LoginWithQRSection-test.tsx @@ -69,6 +69,17 @@ describe("", () => { const { container } = render(getComponent({ versions: makeVersions({ "org.matrix.msc3882": true }) })); expect(container).toMatchSnapshot(); }); + + it("only MSC3882 r1 enabled", async () => { + const { container } = render(getComponent({ capabilities: {"org.matrix.msc3882": { enabled: true } } })); + expect(container).toMatchSnapshot(); + }); + + it("MSC3886 + MSC3882 r1 disabled", async () => { + const { container } = render(getComponent({ versions: makeVersions({ "org.matrix.msc3886": true }), capabilities: {"org.matrix.msc3882": { enabled: false } } })); + expect(container).toMatchSnapshot(); + }); + }); describe("should render panel", () => { @@ -83,5 +94,20 @@ describe("", () => { ); expect(container).toMatchSnapshot(); }); + + it("MSC3882 r1 + MSC3886", async () => { + const { container } = render( + getComponent({ + versions: makeVersions({ + "org.matrix.msc3886": true, + }), + capabilities: { + "org.matrix.msc3882": { enabled: true }, + }, + }), + ); + expect(container).toMatchSnapshot(); + }); }); + }); diff --git a/test/components/views/settings/devices/__snapshots__/LoginWithQRSection-test.tsx.snap b/test/components/views/settings/devices/__snapshots__/LoginWithQRSection-test.tsx.snap index ccf2e4ccb51..ffdaff5f4e7 100644 --- a/test/components/views/settings/devices/__snapshots__/LoginWithQRSection-test.tsx.snap +++ b/test/components/views/settings/devices/__snapshots__/LoginWithQRSection-test.tsx.snap @@ -1,9 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[` should not render MSC3886 + MSC3882 r1 disabled 1`] = `
`; + exports[` should not render no support at all 1`] = `
`; exports[` should not render only MSC3882 enabled 1`] = `
`; +exports[` should not render only MSC3882 r1 enabled 1`] = `
`; + exports[` should render panel MSC3882 + MSC3886 1`] = `
should render panel MSC3882 + MSC3886 1`] = `
`; + +exports[` should render panel MSC3882 r1 + MSC3886 1`] = ` +
+
+
+

+ Sign in with QR code +

+
+
+
+

+ You can use this device to sign in a new device with a QR code. You will need to scan the QR code shown on this device with your device that's signed out. +

+
+ Show QR code +
+
+
+
+
+`; diff --git a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx index 9c8777016cc..f5296324b13 100644 --- a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx @@ -45,10 +45,14 @@ describe("", () => { getIgnoredUsers: jest.fn(), getVersions: jest.fn().mockResolvedValue({ unstable_features: { - "org.matrix.msc3882": true, "org.matrix.msc3886": true, }, }), + getCapabilities: jest.fn().mockResolvedValue({ + "org.matrix.msc3882.get_logintoken": { + "enabled": true, + }, + }), }); const getComponent = () => ( diff --git a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx index 70e87485bb2..84fc7d99cf8 100644 --- a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -97,6 +97,7 @@ describe("", () => { setPusher: jest.fn(), setLocalNotificationSettings: jest.fn(), getVersions: jest.fn().mockResolvedValue({}), + getCapabilities: jest.fn().mockResolvedValue({}), }); const defaultProps = {}; @@ -1375,10 +1376,14 @@ describe("", () => { mockClient.getVersions.mockResolvedValue({ versions: [], unstable_features: { - "org.matrix.msc3882": true, "org.matrix.msc3886": true, }, }); + mockClient.getCapabilities.mockResolvedValue({ + "org.matrix.msc3882.get_logintoken": { + "enabled": true, + }, + }); }); it("renders qr code login section", async () => { From f6cbc7adb359f64b73720c333e481504c0fc6162 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 24 Mar 2023 10:36:15 +0000 Subject: [PATCH 2/7] Lint --- .../views/settings/devices/LoginWithQRSection.tsx | 4 +++- .../settings/tabs/user/SecurityUserSettingsTab.tsx | 6 +++++- .../settings/devices/LoginWithQRSection-test.tsx | 11 +++++++---- .../tabs/user/SecurityUserSettingsTab-test.tsx | 2 +- .../settings/tabs/user/SessionManagerTab-test.tsx | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/src/components/views/settings/devices/LoginWithQRSection.tsx index efaae0427d2..0aebc76fa7d 100644 --- a/src/components/views/settings/devices/LoginWithQRSection.tsx +++ b/src/components/views/settings/devices/LoginWithQRSection.tsx @@ -36,7 +36,9 @@ export default class LoginWithQRSection extends React.Component { public render(): JSX.Element | null { // Needs server support for MSC3882 and MSC3886: // in r0 of MSC3882 it is exposed as a feature flag, but in r1 it is a capability - const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || !!this.props.capabilities?.["org.matrix.msc3882.get_logintoken"]?.enabled; + const msc3882Supported = + !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || + !!this.props.capabilities?.["org.matrix.msc3882.get_logintoken"]?.enabled; const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"]; const offerShowQr = msc3882Supported && msc3886Supported; diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx index b3c2846a993..9fe4528f5a8 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx @@ -398,7 +398,11 @@ export default class SecurityUserSettingsTab extends React.Component
- + ); diff --git a/test/components/views/settings/devices/LoginWithQRSection-test.tsx b/test/components/views/settings/devices/LoginWithQRSection-test.tsx index 12831383e41..b0ff5afcde6 100644 --- a/test/components/views/settings/devices/LoginWithQRSection-test.tsx +++ b/test/components/views/settings/devices/LoginWithQRSection-test.tsx @@ -71,15 +71,19 @@ describe("", () => { }); it("only MSC3882 r1 enabled", async () => { - const { container } = render(getComponent({ capabilities: {"org.matrix.msc3882": { enabled: true } } })); + const { container } = render(getComponent({ capabilities: { "org.matrix.msc3882": { enabled: true } } })); expect(container).toMatchSnapshot(); }); it("MSC3886 + MSC3882 r1 disabled", async () => { - const { container } = render(getComponent({ versions: makeVersions({ "org.matrix.msc3886": true }), capabilities: {"org.matrix.msc3882": { enabled: false } } })); + const { container } = render( + getComponent({ + versions: makeVersions({ "org.matrix.msc3886": true }), + capabilities: { "org.matrix.msc3882": { enabled: false } }, + }), + ); expect(container).toMatchSnapshot(); }); - }); describe("should render panel", () => { @@ -109,5 +113,4 @@ describe("", () => { expect(container).toMatchSnapshot(); }); }); - }); diff --git a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx index f5296324b13..1ceffbe0197 100644 --- a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx @@ -50,7 +50,7 @@ describe("", () => { }), getCapabilities: jest.fn().mockResolvedValue({ "org.matrix.msc3882.get_logintoken": { - "enabled": true, + enabled: true, }, }), }); diff --git a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx index 84fc7d99cf8..94c9e04690c 100644 --- a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -1381,7 +1381,7 @@ describe("", () => { }); mockClient.getCapabilities.mockResolvedValue({ "org.matrix.msc3882.get_logintoken": { - "enabled": true, + enabled: true, }, }); }); From 46c0d9e34c0691862cd2759bb3713061375c04bd Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 24 Mar 2023 11:11:31 +0000 Subject: [PATCH 3/7] Make mocking work with current release of js-sdk as well as anticipated future --- test/components/views/settings/devices/LoginWithQR-test.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/components/views/settings/devices/LoginWithQR-test.tsx b/test/components/views/settings/devices/LoginWithQR-test.tsx index 25e8b50f381..e350c76dfba 100644 --- a/test/components/views/settings/devices/LoginWithQR-test.tsx +++ b/test/components/views/settings/devices/LoginWithQR-test.tsx @@ -18,6 +18,7 @@ import { cleanup, render, waitFor } from "@testing-library/react"; import { mocked } from "jest-mock"; import React from "react"; import { MSC3906Rendezvous, RendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; +import { LoginTokenPostResponse } from "matrix-js-sdk/src/@types/auth"; import LoginWithQR, { Click, Mode, Phase } from "../../../../../src/components/views/auth/LoginWithQR"; import type { MatrixClient } from "matrix-js-sdk/src/matrix"; @@ -87,8 +88,9 @@ describe("", () => { jest.spyOn(MSC3906Rendezvous.prototype, "verifyNewDeviceOnExistingDevice").mockResolvedValue(undefined); client.requestLoginToken.mockResolvedValue({ login_token: "token", - expires_in: 1000, - }); + expires_in: 1000, // this is as per MSC3882 r0 + expires_in_ms: 1000 * 1000, // this is as per MSC3882 r1 + } as LoginTokenPostResponse); // we force the type here so that it works with versions of js-sdk that don't have r1 support yet }); afterEach(() => { From a781808a6e19565d3a793a67ad8f4b9f33b5b44f Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Sat, 1 Apr 2023 16:52:21 +0100 Subject: [PATCH 4/7] Use UnstableValue for MSC3882 capability --- .../views/settings/devices/LoginWithQRSection.tsx | 5 +++-- .../views/settings/devices/LoginWithQRSection-test.tsx | 8 ++++---- .../settings/tabs/user/SecurityUserSettingsTab-test.tsx | 3 ++- .../views/settings/tabs/user/SessionManagerTab-test.tsx | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/src/components/views/settings/devices/LoginWithQRSection.tsx index 0aebc76fa7d..7a1be76422a 100644 --- a/src/components/views/settings/devices/LoginWithQRSection.tsx +++ b/src/components/views/settings/devices/LoginWithQRSection.tsx @@ -15,8 +15,8 @@ limitations under the License. */ import React from "react"; +import { IMSC3882GetLoginTokenCapability, IServerVersions, UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk/src/matrix"; -import type { IServerVersions } from "matrix-js-sdk/src/matrix"; import { _t } from "../../../../languageHandler"; import AccessibleButton from "../../elements/AccessibleButton"; import SettingsSubsection from "../shared/SettingsSubsection"; @@ -36,9 +36,10 @@ export default class LoginWithQRSection extends React.Component { public render(): JSX.Element | null { // Needs server support for MSC3882 and MSC3886: // in r0 of MSC3882 it is exposed as a feature flag, but in r1 it is a capability + const capability = UNSTABLE_MSC3882_CAPABILITY.findIn(this.props.capabilities); const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || - !!this.props.capabilities?.["org.matrix.msc3882.get_logintoken"]?.enabled; + !!capability?.enabled; const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"]; const offerShowQr = msc3882Supported && msc3886Supported; diff --git a/test/components/views/settings/devices/LoginWithQRSection-test.tsx b/test/components/views/settings/devices/LoginWithQRSection-test.tsx index b0ff5afcde6..1b9a6ba2b8f 100644 --- a/test/components/views/settings/devices/LoginWithQRSection-test.tsx +++ b/test/components/views/settings/devices/LoginWithQRSection-test.tsx @@ -16,7 +16,7 @@ limitations under the License. import { render } from "@testing-library/react"; import { mocked } from "jest-mock"; -import { IServerVersions, MatrixClient } from "matrix-js-sdk/src/matrix"; +import { IServerVersions, MatrixClient, UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk/src/matrix"; import React from "react"; import LoginWithQRSection from "../../../../../src/components/views/settings/devices/LoginWithQRSection"; @@ -71,7 +71,7 @@ describe("", () => { }); it("only MSC3882 r1 enabled", async () => { - const { container } = render(getComponent({ capabilities: { "org.matrix.msc3882": { enabled: true } } })); + const { container } = render(getComponent({ capabilities: { [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true } } })); expect(container).toMatchSnapshot(); }); @@ -79,7 +79,7 @@ describe("", () => { const { container } = render( getComponent({ versions: makeVersions({ "org.matrix.msc3886": true }), - capabilities: { "org.matrix.msc3882": { enabled: false } }, + capabilities: { [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: false } }, }), ); expect(container).toMatchSnapshot(); @@ -106,7 +106,7 @@ describe("", () => { "org.matrix.msc3886": true, }), capabilities: { - "org.matrix.msc3882": { enabled: true }, + [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true }, }, }), ); diff --git a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx index 1ceffbe0197..1943142ac5e 100644 --- a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import { fireEvent, render } from "@testing-library/react"; +import { UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk"; import React from "react"; import SecurityUserSettingsTab from "../../../../../../src/components/views/settings/tabs/user/SecurityUserSettingsTab"; @@ -49,7 +50,7 @@ describe("", () => { }, }), getCapabilities: jest.fn().mockResolvedValue({ - "org.matrix.msc3882.get_logintoken": { + [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true, }, }), diff --git a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx index 94c9e04690c..bb96fe4e006 100644 --- a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -29,6 +29,7 @@ import { PUSHER_DEVICE_ID, PUSHER_ENABLED, IAuthData, + UNSTABLE_MSC3882_CAPABILITY, } from "matrix-js-sdk/src/matrix"; import { clearAllModals } from "../../../../../test-utils"; @@ -1380,7 +1381,7 @@ describe("", () => { }, }); mockClient.getCapabilities.mockResolvedValue({ - "org.matrix.msc3882.get_logintoken": { + [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true, }, }); From 636f1e652a7ac3d1a344627cd6d0ad4e1fd2b4ce Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Sat, 1 Apr 2023 17:00:40 +0100 Subject: [PATCH 5/7] Lint --- src/components/views/settings/tabs/user/SessionManagerTab.tsx | 2 +- .../views/settings/tabs/user/SecurityUserSettingsTab-test.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/src/components/views/settings/tabs/user/SessionManagerTab.tsx index b2447e3b4c4..8184cab8eaa 100644 --- a/src/components/views/settings/tabs/user/SessionManagerTab.tsx +++ b/src/components/views/settings/tabs/user/SessionManagerTab.tsx @@ -132,7 +132,7 @@ const SessionManagerTab: React.FC = () => { const userId = matrixClient.getUserId(); const currentUserMember = (userId && matrixClient.getUser(userId)) || undefined; const clientVersions = useAsyncMemo(() => matrixClient.getVersions(), [matrixClient]); - const capabilities = useAsyncMemo(() => matrixClient.getCapabilities(), [matrixClient]); + const capabilities = useAsyncMemo(() => matrixClient?.getCapabilities(), [matrixClient]); const onDeviceExpandToggle = (deviceId: ExtendedDevice["device_id"]): void => { if (expandedDeviceIds.includes(deviceId)) { diff --git a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx index 1943142ac5e..72fd4a6d9c0 100644 --- a/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/SecurityUserSettingsTab-test.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import { fireEvent, render } from "@testing-library/react"; -import { UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk"; +import { UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk/src/matrix"; import React from "react"; import SecurityUserSettingsTab from "../../../../../../src/components/views/settings/tabs/user/SecurityUserSettingsTab"; From d1fa0ed07bdcdbef4683494dac6a08ab119ba0da Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Mon, 3 Apr 2023 10:27:45 +0100 Subject: [PATCH 6/7] Lint --- .../views/settings/devices/LoginWithQRSection.tsx | 9 ++++++--- .../views/settings/tabs/user/SessionManagerTab.tsx | 2 +- .../views/settings/devices/LoginWithQRSection-test.tsx | 4 +++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/src/components/views/settings/devices/LoginWithQRSection.tsx index 7a1be76422a..1f10272690e 100644 --- a/src/components/views/settings/devices/LoginWithQRSection.tsx +++ b/src/components/views/settings/devices/LoginWithQRSection.tsx @@ -15,7 +15,11 @@ limitations under the License. */ import React from "react"; -import { IMSC3882GetLoginTokenCapability, IServerVersions, UNSTABLE_MSC3882_CAPABILITY } from "matrix-js-sdk/src/matrix"; +import { + IMSC3882GetLoginTokenCapability, + IServerVersions, + UNSTABLE_MSC3882_CAPABILITY, +} from "matrix-js-sdk/src/matrix"; import { _t } from "../../../../languageHandler"; import AccessibleButton from "../../elements/AccessibleButton"; @@ -38,8 +42,7 @@ export default class LoginWithQRSection extends React.Component { // in r0 of MSC3882 it is exposed as a feature flag, but in r1 it is a capability const capability = UNSTABLE_MSC3882_CAPABILITY.findIn(this.props.capabilities); const msc3882Supported = - !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || - !!capability?.enabled; + !!this.props.versions?.unstable_features?.["org.matrix.msc3882"] || !!capability?.enabled; const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"]; const offerShowQr = msc3882Supported && msc3886Supported; diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/src/components/views/settings/tabs/user/SessionManagerTab.tsx index 8184cab8eaa..4ae313c642c 100644 --- a/src/components/views/settings/tabs/user/SessionManagerTab.tsx +++ b/src/components/views/settings/tabs/user/SessionManagerTab.tsx @@ -132,7 +132,7 @@ const SessionManagerTab: React.FC = () => { const userId = matrixClient.getUserId(); const currentUserMember = (userId && matrixClient.getUser(userId)) || undefined; const clientVersions = useAsyncMemo(() => matrixClient.getVersions(), [matrixClient]); - const capabilities = useAsyncMemo(() => matrixClient?.getCapabilities(), [matrixClient]); + const capabilities = useAsyncMemo(() => matrixClient?.getCapabilities(), [matrixClient], undefined); const onDeviceExpandToggle = (deviceId: ExtendedDevice["device_id"]): void => { if (expandedDeviceIds.includes(deviceId)) { diff --git a/test/components/views/settings/devices/LoginWithQRSection-test.tsx b/test/components/views/settings/devices/LoginWithQRSection-test.tsx index 1b9a6ba2b8f..3f3957eeb20 100644 --- a/test/components/views/settings/devices/LoginWithQRSection-test.tsx +++ b/test/components/views/settings/devices/LoginWithQRSection-test.tsx @@ -71,7 +71,9 @@ describe("", () => { }); it("only MSC3882 r1 enabled", async () => { - const { container } = render(getComponent({ capabilities: { [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true } } })); + const { container } = render( + getComponent({ capabilities: { [UNSTABLE_MSC3882_CAPABILITY.name]: { enabled: true } } }), + ); expect(container).toMatchSnapshot(); }); From eeae1e0808b7c40547491632940c04eb1b2a42bc Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Mon, 3 Apr 2023 10:58:49 +0100 Subject: [PATCH 7/7] Lint --- src/components/views/settings/tabs/user/SessionManagerTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/src/components/views/settings/tabs/user/SessionManagerTab.tsx index 4ae313c642c..62646c9ca9c 100644 --- a/src/components/views/settings/tabs/user/SessionManagerTab.tsx +++ b/src/components/views/settings/tabs/user/SessionManagerTab.tsx @@ -132,7 +132,7 @@ const SessionManagerTab: React.FC = () => { const userId = matrixClient.getUserId(); const currentUserMember = (userId && matrixClient.getUser(userId)) || undefined; const clientVersions = useAsyncMemo(() => matrixClient.getVersions(), [matrixClient]); - const capabilities = useAsyncMemo(() => matrixClient?.getCapabilities(), [matrixClient], undefined); + const capabilities = useAsyncMemo(async () => matrixClient?.getCapabilities(), [matrixClient]); const onDeviceExpandToggle = (deviceId: ExtendedDevice["device_id"]): void => { if (expandedDeviceIds.includes(deviceId)) {