From 8a756b592c233284945e797774c17db3c1e3f38d Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Wed, 13 Nov 2024 11:32:35 +0100 Subject: [PATCH] Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `useIsEncrypted` (#28282) * Replace `MatrixClient.isRoomEncrypted` by `MatrixClient.CryptoApi.isEncryptionEnabledInRoom` in `useIsEncrypted` * Catch error * Return `null` when computed * Use `useRoomState` & `useAsyncMemo` --- src/hooks/useIsEncrypted.ts | 33 ++++++++++--------- .../right_panel/RoomSummaryCard-test.tsx | 13 ++------ .../views/right_panel/UserInfo-test.tsx | 4 +-- 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/hooks/useIsEncrypted.ts b/src/hooks/useIsEncrypted.ts index a90b795a85..c9d3ed3bc8 100644 --- a/src/hooks/useIsEncrypted.ts +++ b/src/hooks/useIsEncrypted.ts @@ -6,24 +6,25 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ -import { useCallback, useState } from "react"; -import { MatrixClient, MatrixEvent, Room, RoomStateEvent, EventType } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, MatrixEvent, Room, EventType } from "matrix-js-sdk/src/matrix"; -import { useTypedEventEmitter } from "./useEventEmitter"; +import { useRoomState } from "./useRoomState.ts"; +import { useAsyncMemo } from "./useAsyncMemo.ts"; -// Hook to simplify watching whether a Matrix room is encrypted, returns undefined if room is undefined -export function useIsEncrypted(cli: MatrixClient, room?: Room): boolean | undefined { - const [isEncrypted, setIsEncrypted] = useState(room ? cli.isRoomEncrypted(room.roomId) : undefined); - - const update = useCallback( - (event: MatrixEvent) => { - if (room && event.getType() === EventType.RoomEncryption) { - setIsEncrypted(cli.isRoomEncrypted(room.roomId)); - } - }, - [cli, room], +// Hook to simplify watching whether a Matrix room is encrypted, returns null if room is undefined or the state is loading +export function useIsEncrypted(cli: MatrixClient, room?: Room): boolean | null { + const encryptionStateEvent: MatrixEvent | undefined = useRoomState( + room, + (roomState) => roomState.getStateEvents(EventType.RoomEncryption)?.[0], ); - useTypedEventEmitter(room?.currentState, RoomStateEvent.Events, update); + return useAsyncMemo( + async () => { + const crypto = cli.getCrypto(); + if (!room || !crypto) return null; - return isEncrypted; + return crypto.isEncryptionEnabledInRoom(room.roomId); + }, + [room, encryptionStateEvent], + null, + ); } diff --git a/test/unit-tests/components/views/right_panel/RoomSummaryCard-test.tsx b/test/unit-tests/components/views/right_panel/RoomSummaryCard-test.tsx index a98552ea07..4026149f98 100644 --- a/test/unit-tests/components/views/right_panel/RoomSummaryCard-test.tsx +++ b/test/unit-tests/components/views/right_panel/RoomSummaryCard-test.tsx @@ -23,7 +23,7 @@ import * as settingsHooks from "../../../../../src/hooks/useSettings"; import Modal from "../../../../../src/Modal"; import RightPanelStore from "../../../../../src/stores/right-panel/RightPanelStore"; import { RightPanelPhases } from "../../../../../src/stores/right-panel/RightPanelStorePhases"; -import { flushPromises, getMockClientWithEventEmitter, mockClientMethodsUser } from "../../../../test-utils"; +import { flushPromises, stubClient } from "../../../../test-utils"; import { PollHistoryDialog } from "../../../../../src/components/views/dialogs/PollHistoryDialog"; import { RoomPermalinkCreator } from "../../../../../src/utils/permalinks/Permalinks"; import { _t } from "../../../../../src/languageHandler"; @@ -56,16 +56,7 @@ describe("", () => { }; beforeEach(() => { - mockClient = getMockClientWithEventEmitter({ - ...mockClientMethodsUser(userId), - getAccountData: jest.fn(), - isRoomEncrypted: jest.fn(), - getOrCreateFilter: jest.fn().mockResolvedValue({ filterId: 1 }), - getRoom: jest.fn(), - isGuest: jest.fn().mockReturnValue(false), - deleteRoomTag: jest.fn().mockResolvedValue({}), - setRoomTag: jest.fn().mockResolvedValue({}), - }); + mockClient = mocked(stubClient()); room = new Room(roomId, mockClient, userId); const roomCreateEvent = new MatrixEvent({ type: "m.room.create", diff --git a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx index c9996d7d67..dbf5645ca8 100644 --- a/test/unit-tests/components/views/right_panel/UserInfo-test.tsx +++ b/test/unit-tests/components/views/right_panel/UserInfo-test.tsx @@ -134,6 +134,7 @@ beforeEach(() => { getUserDeviceInfo: jest.fn(), userHasCrossSigningKeys: jest.fn().mockResolvedValue(false), getUserVerificationStatus: jest.fn(), + isEncryptionEnabledInRoom: jest.fn().mockResolvedValue(false), } as unknown as CryptoApi); mockClient = mocked({ @@ -148,7 +149,6 @@ beforeEach(() => { on: jest.fn(), off: jest.fn(), isSynapseAdministrator: jest.fn().mockResolvedValue(false), - isRoomEncrypted: jest.fn().mockReturnValue(false), doesServerSupportUnstableFeature: jest.fn().mockReturnValue(false), doesServerSupportExtendedProfiles: jest.fn().mockResolvedValue(false), getExtendedProfileProperty: jest.fn().mockRejectedValue(new Error("Not supported")), @@ -660,7 +660,7 @@ describe("", () => { describe("with an encrypted room", () => { beforeEach(() => { - mockClient.isRoomEncrypted.mockReturnValue(true); + jest.spyOn(mockClient.getCrypto()!, "isEncryptionEnabledInRoom").mockResolvedValue(true); }); it("renders unverified user info", async () => {