48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
// Copyright 2021 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { useEffect, useMemo } from 'react';
|
|
import type { AciString } from '../types/ServiceId';
|
|
import { usePrevious } from './usePrevious';
|
|
|
|
type RemoteParticipant = {
|
|
hasRemoteVideo: boolean;
|
|
presenting: boolean;
|
|
title: string;
|
|
aci?: AciString;
|
|
};
|
|
|
|
export function usePresenter(
|
|
remoteParticipants: ReadonlyArray<RemoteParticipant>
|
|
): AciString | undefined {
|
|
return useMemo(
|
|
() => remoteParticipants.find(participant => participant.presenting)?.aci,
|
|
[remoteParticipants]
|
|
);
|
|
}
|
|
|
|
export function useActivateSpeakerViewOnPresenting({
|
|
remoteParticipants,
|
|
switchToPresentationView,
|
|
switchFromPresentationView,
|
|
}: {
|
|
remoteParticipants: ReadonlyArray<RemoteParticipant>;
|
|
switchToPresentationView: () => void;
|
|
switchFromPresentationView: () => void;
|
|
}): void {
|
|
const presenterAci = usePresenter(remoteParticipants);
|
|
const prevPresenterAci = usePrevious(presenterAci, presenterAci);
|
|
|
|
useEffect(() => {
|
|
if (prevPresenterAci !== presenterAci && presenterAci) {
|
|
switchToPresentationView();
|
|
} else if (prevPresenterAci && !presenterAci) {
|
|
switchFromPresentationView();
|
|
}
|
|
}, [
|
|
presenterAci,
|
|
prevPresenterAci,
|
|
switchToPresentationView,
|
|
switchFromPresentationView,
|
|
]);
|
|
}
|