Files
ThreadNet-Web/src/components/views/voip/CallView.tsx
T

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

96 lines
3.1 KiB
TypeScript
Raw Normal View History

2022-04-20 11:03:33 -04:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2022-04-20 11:03:33 -04:00
Copyright 2022 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.
2022-04-20 11:03:33 -04:00
*/
2025-02-05 13:25:06 +00:00
import React, { type FC, useContext, useEffect, type AriaRole, useCallback } from "react";
2022-04-20 11:03:33 -04:00
import type { Room } from "matrix-js-sdk/src/matrix";
2025-03-05 15:41:26 -05:00
import { type Call, CallEvent } from "../../../models/Call";
import MatrixClientContext from "../../../contexts/MatrixClientContext";
import AppTile from "../elements/AppTile";
import { CallStore } from "../../../stores/CallStore";
import { SdkContextClass } from "../../../contexts/SDKContext";
2025-03-05 15:41:26 -05:00
import { useTypedEventEmitter } from "../../../hooks/useEventEmitter";
import { useCall } from "../../../hooks/useCall";
interface JoinCallViewProps {
room: Room;
resizing: boolean;
call: Call;
skipLobby?: boolean;
role?: AriaRole;
2025-03-05 15:41:26 -05:00
onClose: () => void;
}
2025-03-05 15:41:26 -05:00
const JoinCallView: FC<JoinCallViewProps> = ({ room, resizing, call, skipLobby, role, onClose }) => {
const cli = useContext(MatrixClientContext);
2025-03-05 15:41:26 -05:00
useTypedEventEmitter(call, CallEvent.Close, onClose);
useEffect(() => {
// We'll take this opportunity to tidy up our room state
call.clean();
}, [call]);
useEffect(() => {
// Always update the widget data so that we don't ignore "skipLobby" accidentally.
call.widget.data ??= {};
call.widget.data.skipLobby = skipLobby;
}, [call.widget, skipLobby]);
const disconnectAllOtherCalls: () => Promise<void> = useCallback(async () => {
// The stickyPromise has to resolve before the widget actually becomes sticky.
// We only let the widget become sticky after disconnecting all other active calls.
const calls = [...CallStore.instance.connectedCalls].filter(
(call) => SdkContextClass.instance.roomViewStore.getRoomId() !== call.roomId,
2022-10-07 22:16:35 +02:00
);
await Promise.all(calls.map(async (call) => await call.disconnect()));
}, []);
2025-03-05 15:41:26 -05:00
return (
<div className="mx_CallView" role={role}>
<AppTile
app={call.widget}
room={room}
userId={cli.credentials.userId!}
creatorUserId={call.widget.creatorUserId}
waitForIframeLoad={call.widget.waitForIframeLoad}
showMenubar={false}
pointerEvents={resizing ? "none" : undefined}
stickyPromise={disconnectAllOtherCalls}
/>
</div>
);
};
interface CallViewProps {
room: Room;
resizing: boolean;
skipLobby?: boolean;
role?: AriaRole;
2025-03-05 15:41:26 -05:00
/**
* Callback for when the user closes the call.
*/
onClose: () => void;
}
2025-03-05 15:41:26 -05:00
export const CallView: FC<CallViewProps> = ({ room, resizing, skipLobby, role, onClose }) => {
const call = useCall(room.roomId);
2025-03-05 15:41:26 -05:00
return (
call && (
<JoinCallView
room={room}
resizing={resizing}
call={call}
skipLobby={skipLobby}
role={role}
onClose={onClose}
/>
)
);
};