* Refactor ElementCall to use the widget lobby. - expose skip lobby - use the widget.data to build the widget url Signed-off-by: Timo K <toger5@hotmail.de> * Use shiftKey click to skip the lobby Signed-off-by: Timo K <toger5@hotmail.de> * remove Lobby component Signed-off-by: Timo K <toger5@hotmail.de> * update tests + remove EW lobby related tests Signed-off-by: Timo K <toger5@hotmail.de> * remove lobby device button tests Signed-off-by: Timo K <toger5@hotmail.de> * i18n Signed-off-by: Timo K <toger5@hotmail.de> * use voip participant label Signed-off-by: Timo K <toger5@hotmail.de> * update tests Signed-off-by: Timo K <toger5@hotmail.de> * fix rounded corners in pip Signed-off-by: Timo K <toger5@hotmail.de> * allow joining call in legacy room header (without banner) Signed-off-by: Timo K <toger5@hotmail.de> * Introduce new connection states for calls. And use them for integrated lobby. Signed-off-by: Timo K <toger5@hotmail.de> * New room header call join Fix broken top container element call. Signed-off-by: Timo K <toger5@hotmail.de> * i18n Signed-off-by: Timo K <toger5@hotmail.de> * Fix closing element call in lobby view. (should destroy call if there the user never managed to connect (not clicked join in lobby) Signed-off-by: Timo K <toger5@hotmail.de> * all cases for connection state Signed-off-by: Timo K <toger5@hotmail.de> * add correct LiveContentSummary labels Signed-off-by: Timo K <toger5@hotmail.de> * Theme widget loading (no rounded corner) destroy call when switching room while a call is loading. Signed-off-by: Timo K <toger5@hotmail.de> * temp Signed-off-by: Timo K <toger5@hotmail.de> * usei view room dispatcher instead of emitter Signed-off-by: Timo K <toger5@hotmail.de> * tidy up Signed-off-by: Timo K <toger5@hotmail.de> * returnToLobby + remove StartCallView Signed-off-by: Timo K <toger5@hotmail.de> * comment cleanup Signed-off-by: Timo K <toger5@hotmail.de> * disconnect ongoing calls before making widget sticky. Signed-off-by: Timo K <toger5@hotmail.de> * linter + jitsi as videoChannel Signed-off-by: Timo K <toger5@hotmail.de> * stickyPromise type Signed-off-by: Timo K <toger5@hotmail.de> * fix legacy call (jistsi, cisco, bbb) reopen when clicking call button Signed-off-by: Timo K <toger5@hotmail.de> * fix tests and connect resolves Signed-off-by: Timo K <toger5@hotmail.de> * fix "waits for messaging when connecting" test Signed-off-by: Timo K <toger5@hotmail.de> * Allow to skip awaiting Call session events. This option is used in tests to spare mocking the events emitted when EC updates the room state Signed-off-by: Timo K <toger5@hotmail.de> * add sticky test Signed-off-by: Timo K <toger5@hotmail.de> * add test for looby tile rendering Signed-off-by: Timo K <toger5@hotmail.de> * fix flaky test Signed-off-by: Timo K <toger5@hotmail.de> * add reconnect after disconnect test (video room) Signed-off-by: Timo K <toger5@hotmail.de> * add shift click test to call toast Signed-off-by: Timo K <toger5@hotmail.de> * test for allowVoipWithNoMedia in widget url Signed-off-by: Timo K <toger5@hotmail.de> * fix e2e tests to search for the right element Signed-off-by: Timo K <toger5@hotmail.de> * destroy call after test so next test does not fail Signed-off-by: Timo K <toger5@hotmail.de> * new call test (connection failed) Signed-off-by: Timo K <toger5@hotmail.de> * reset to real timers Signed-off-by: Timo K <toger5@hotmail.de> * dont use skipSessionAwait for tests Signed-off-by: Timo K <toger5@hotmail.de> * code quality (sonar) Signed-off-by: Timo K <toger5@hotmail.de> * refactor call.disconnect tests (dont use skipSessionAwait) Signed-off-by: Timo K <toger5@hotmail.de> * miscellaneous cleanup Signed-off-by: Timo K <toger5@hotmail.de> * only send call notify after the call has been joined (not when just opening the lobby) Signed-off-by: Timo K <toger5@hotmail.de> * update call notify tests to expect notify on connect. Not on widget creation. Signed-off-by: Timo K <toger5@hotmail.de> * Update playwright/e2e/room/room-header.spec.ts Co-authored-by: Robin <robin@robin.town> * Update src/components/views/voip/CallView.tsx Co-authored-by: Robin <robin@robin.town> * review rename connect -> start isVideoRoom not dependant on feature flags rename allOtherCallsDisconnected -> disconnectAllOtherCalls Signed-off-by: Timo K <toger5@hotmail.de> * check for EC widget Signed-off-by: Timo K <toger5@hotmail.de> * dep array Signed-off-by: Timo K <toger5@hotmail.de> * rename in spyOn Signed-off-by: Timo K <toger5@hotmail.de> --------- Signed-off-by: Timo K <toger5@hotmail.de> Co-authored-by: Robin <robin@robin.town>
110 lines
3.9 KiB
TypeScript
110 lines
3.9 KiB
TypeScript
/*
|
|
Copyright 2022 The Matrix.org Foundation C.I.C.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
import React, { FC, useContext, useEffect, AriaRole, useCallback } from "react";
|
|
|
|
import type { Room } from "matrix-js-sdk/src/matrix";
|
|
import { Call, ConnectionState, ElementCall } from "../../../models/Call";
|
|
import { useCall } from "../../../hooks/useCall";
|
|
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
|
import AppTile from "../elements/AppTile";
|
|
import { CallStore } from "../../../stores/CallStore";
|
|
import { SdkContextClass } from "../../../contexts/SDKContext";
|
|
|
|
interface JoinCallViewProps {
|
|
room: Room;
|
|
resizing: boolean;
|
|
call: Call;
|
|
skipLobby?: boolean;
|
|
role?: AriaRole;
|
|
}
|
|
|
|
const JoinCallView: FC<JoinCallViewProps> = ({ room, resizing, call, skipLobby, role }) => {
|
|
const cli = useContext(MatrixClientContext);
|
|
|
|
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]);
|
|
|
|
useEffect(() => {
|
|
if (call.connectionState === ConnectionState.Disconnected) {
|
|
// immediately start the call
|
|
// (this will start the lobby view in the widget and connect to all required widget events)
|
|
call.start();
|
|
}
|
|
return (): void => {
|
|
// If we are connected the widget is sticky and we do not want to destroy the call.
|
|
if (!call.connected) call.destroy();
|
|
};
|
|
}, [call]);
|
|
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.activeCalls].filter(
|
|
(call) => SdkContextClass.instance.roomViewStore.getRoomId() !== call.roomId,
|
|
);
|
|
await Promise.all(calls.map(async (call) => await call.disconnect()));
|
|
}, []);
|
|
return (
|
|
<div className="mx_CallView">
|
|
<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;
|
|
/**
|
|
* If true, the view will be blank until a call appears. Otherwise, the join
|
|
* button will create a call if there isn't already one.
|
|
*/
|
|
waitForCall: boolean;
|
|
skipLobby?: boolean;
|
|
role?: AriaRole;
|
|
}
|
|
|
|
export const CallView: FC<CallViewProps> = ({ room, resizing, waitForCall, skipLobby, role }) => {
|
|
const call = useCall(room.roomId);
|
|
|
|
useEffect(() => {
|
|
if (call === null && !waitForCall) {
|
|
ElementCall.create(room, skipLobby);
|
|
}
|
|
}, [call, room, skipLobby, waitForCall]);
|
|
if (call === null) {
|
|
return null;
|
|
} else {
|
|
return <JoinCallView room={room} resizing={resizing} call={call} skipLobby={skipLobby} role={role} />;
|
|
}
|
|
};
|