Files
element-web/src/hooks/useEncryptionStatus.ts
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

47 lines
1.8 KiB
TypeScript
Raw Normal View History

2023-08-31 12:06:14 +01:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2023-08-31 12:06:14 +01:00
Copyright 2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2023-08-31 12:06:14 +01:00
*/
2025-02-05 13:25:06 +00:00
import { type MatrixClient, type Room, RoomStateEvent } from "matrix-js-sdk/src/matrix";
import { useEffect, useMemo, useState } from "react";
import { throttle } from "lodash";
import { CryptoEvent } from "matrix-js-sdk/src/crypto-api";
2023-08-31 12:06:14 +01:00
2025-02-05 13:25:06 +00:00
import { type E2EStatus, shieldStatusForRoom } from "../utils/ShieldUtils";
import { useTypedEventEmitter } from "./useEventEmitter";
2023-08-31 12:06:14 +01:00
export function useEncryptionStatus(client: MatrixClient, room: Room): E2EStatus | null {
const [e2eStatus, setE2eStatus] = useState<E2EStatus | null>(null);
const updateEncryptionStatus = useMemo(
() =>
throttle(
() => {
if (client.getCrypto()) {
shieldStatusForRoom(client, room).then((e2eStatus) => {
setE2eStatus(e2eStatus);
});
}
},
250,
{ leading: true, trailing: true },
),
[client, room],
);
useEffect(updateEncryptionStatus, [updateEncryptionStatus]);
// shieldStatusForRoom depends on the room membership, each member's trust
// status for each member, and each member's devices, so we update the
// status whenever any of those changes.
useTypedEventEmitter(room, RoomStateEvent.Members, updateEncryptionStatus);
useTypedEventEmitter(client, CryptoEvent.UserTrustStatusChanged, updateEncryptionStatus);
useTypedEventEmitter(client, CryptoEvent.DevicesUpdated, updateEncryptionStatus);
2023-08-31 12:06:14 +01:00
return e2eStatus;
}