diff --git a/src/UrlParams.ts b/src/UrlParams.ts index d155fbcf..45353239 100644 --- a/src/UrlParams.ts +++ b/src/UrlParams.ts @@ -112,6 +112,12 @@ interface UrlParams { * Token for a user for instance login. This is used for bridge gosts. */ token: string | null; + /** + * Setting this flag skips the lobby and brings you in the call directly. + * In the widget this can be combined with preload to pass the device settings + * with the join widget action. + */ + skipLobby: boolean; } // This is here as a stopgap, but what would be far nicer is a function that @@ -205,6 +211,7 @@ export const getUrlParams = ( analyticsID: parser.getParam("analyticsID"), allowIceFallback: parser.getFlagParam("allowIceFallback"), token: parser.getParam("token"), + skipLobby: parser.getFlagParam("skipLobby"), }; }; diff --git a/src/room/GroupCallView.tsx b/src/room/GroupCallView.tsx index ab96926a..9ed63490 100644 --- a/src/room/GroupCallView.tsx +++ b/src/room/GroupCallView.tsx @@ -60,6 +60,7 @@ interface Props { isPasswordlessUser: boolean; confineToRoom: boolean; preload: boolean; + skipLobby: boolean; hideHeader: boolean; rtcSession: MatrixRTCSession; } @@ -69,6 +70,7 @@ export function GroupCallView({ isPasswordlessUser, confineToRoom, preload, + skipLobby, hideHeader, rtcSession, }: Props) { @@ -133,18 +135,17 @@ export function GroupCallView({ latestMuteStates.current = muteStates; useEffect(() => { - if (widget && preload) { - // In preload mode, wait for a join action before entering - const onJoin = async (ev: CustomEvent) => { + if (skipLobby) { + // widget && preload + const defaultDeviceSetup = async ( + requestedDeviceData: JoinCallData + ): Promise => { // XXX: I think this is broken currently - LiveKit *won't* request // permissions and give you device names unless you specify a kind, but // here we want all kinds of devices. This needs a fix in livekit-client // for the following name-matching logic to do anything useful. const devices = await Room.getLocalDevices(undefined, true); - - const { audioInput, videoInput } = ev.detail - .data as unknown as JoinCallData; - + const { audioInput, videoInput } = requestedDeviceData; if (audioInput === null) { latestMuteStates.current!.audio.setEnabled?.(false); } else { @@ -184,27 +185,27 @@ export function GroupCallView({ latestMuteStates.current!.video.setEnabled?.(true); } } - + }; + // In preload mode, wait for a join action before entering + if (widget && preload) { + const onJoin = async (ev: CustomEvent) => { + defaultDeviceSetup(ev.detail.data as unknown as JoinCallData); + enterRTCSession(rtcSession); + await Promise.all([ + widget!.api.setAlwaysOnScreen(true), + widget!.api.transport.reply(ev.detail, {}), + ]); + }; + widget.lazyActions.on(ElementWidgetActions.JoinCall, onJoin); + return () => { + widget!.lazyActions.off(ElementWidgetActions.JoinCall, onJoin); + }; + } else { + defaultDeviceSetup({ audioInput: null, videoInput: null }); enterRTCSession(rtcSession); - - PosthogAnalytics.instance.eventCallEnded.cacheStartCall(new Date()); - // we only have room sessions right now, so call ID is the emprty string - we use the room ID - PosthogAnalytics.instance.eventCallStarted.track( - rtcSession.room.roomId - ); - - await Promise.all([ - widget!.api.setAlwaysOnScreen(true), - widget!.api.transport.reply(ev.detail, {}), - ]); - }; - - widget.lazyActions.on(ElementWidgetActions.JoinCall, onJoin); - return () => { - widget!.lazyActions.off(ElementWidgetActions.JoinCall, onJoin); - }; + } } - }, [rtcSession, preload]); + }, [rtcSession, preload, skipLobby]); const [left, setLeft] = useState(false); const [leaveError, setLeaveError] = useState(undefined); diff --git a/src/room/RoomPage.tsx b/src/room/RoomPage.tsx index 1a53dc49..b09a6054 100644 --- a/src/room/RoomPage.tsx +++ b/src/room/RoomPage.tsx @@ -30,8 +30,14 @@ import { platform } from "../Platform"; import { AppSelectionModal } from "./AppSelectionModal"; export const RoomPage: FC = () => { - const { confineToRoom, appPrompt, preload, hideHeader, displayName } = - useUrlParams(); + const { + confineToRoom, + appPrompt, + preload, + hideHeader, + displayName, + skipLobby, + } = useUrlParams(); const { roomAlias, roomId, viaServers } = useRoomIdentifier(); @@ -77,10 +83,11 @@ export const RoomPage: FC = () => { isPasswordlessUser={passwordlessUser} confineToRoom={confineToRoom} preload={preload} + skipLobby={skipLobby} hideHeader={hideHeader} /> ), - [client, passwordlessUser, confineToRoom, preload, hideHeader] + [client, passwordlessUser, confineToRoom, preload, hideHeader, skipLobby] ); let content: ReactNode;