diff --git a/src/hooks/useIsEncrypted.ts b/src/hooks/useIsEncrypted.ts index a90b795a858..c9d3ed3bc80 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); +// 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], + ); + return useAsyncMemo( + async () => { + const crypto = cli.getCrypto(); + if (!room || !crypto) return null; - const update = useCallback( - (event: MatrixEvent) => { - if (room && event.getType() === EventType.RoomEncryption) { - setIsEncrypted(cli.isRoomEncrypted(room.roomId)); - } + return crypto.isEncryptionEnabledInRoom(room.roomId); }, - [cli, room], + [room, encryptionStateEvent], + null, ); - useTypedEventEmitter(room?.currentState, RoomStateEvent.Events, update); - - return isEncrypted; } 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 a98552ea078..4026149f984 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 c9996d7d67b..dbf5645ca8e 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 () => {