Files
element-call/src/room/useActiveFocus.ts

46 lines
1.6 KiB
TypeScript
Raw Normal View History

2023-08-18 09:03:21 +01:00
/*
Copyright 2023, 2024 New Vector Ltd.
2023-08-18 09:03:21 +01:00
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
2023-08-18 09:03:21 +01:00
*/
import {
type MatrixRTCSession,
2023-08-18 09:03:21 +01:00
MatrixRTCSessionEvent,
2025-03-13 13:58:43 +01:00
} from "matrix-js-sdk/lib/matrixrtc";
import { useCallback, useRef } from "react";
2025-03-13 16:58:14 +01:00
import { deepCompare } from "matrix-js-sdk/lib/utils";
2025-03-13 13:58:43 +01:00
import { logger } from "matrix-js-sdk/lib/logger";
2025-03-13 16:58:14 +01:00
import { type LivekitFocus, isLivekitFocus } from "matrix-js-sdk/lib/matrixrtc";
2023-08-18 09:03:21 +01:00
import { useTypedEventEmitterState } from "../useEvents";
2023-08-18 09:03:21 +01:00
/**
* Gets the currently active (livekit) focus for a MatrixRTC session
* This logic is specific to livekit foci where the whole call must use one
* and the same focus.
*/
export function useActiveLivekitFocus(
2023-10-11 10:42:04 -04:00
rtcSession: MatrixRTCSession,
2023-08-18 09:03:21 +01:00
): LivekitFocus | undefined {
const prevActiveFocus = useRef<LivekitFocus | undefined>(undefined);
return useTypedEventEmitterState(
rtcSession,
MatrixRTCSessionEvent.MembershipsChanged,
useCallback(() => {
const f = rtcSession.getActiveFocus();
// Only handle foci with type="livekit" for now.
if (f && isLivekitFocus(f) && !deepCompare(f, prevActiveFocus.current)) {
const oldestMembership = rtcSession.getOldestMembership();
logger.info(
`Got new active focus from membership: ${oldestMembership?.sender}/${oldestMembership?.deviceId}.
Updated focus (focus switch) from ${JSON.stringify(prevActiveFocus.current)} to ${JSON.stringify(f)}`,
);
prevActiveFocus.current = f;
}
return prevActiveFocus.current;
}, [rtcSession]),
);
2023-08-18 09:03:21 +01:00
}