Merge branch 'develop' into travis/remove-skinning

pull/21282/head
Travis Ralston 2022-04-05 10:42:48 -06:00
commit d39ae8a91b
4 changed files with 31 additions and 10 deletions

View File

@ -183,6 +183,6 @@ Threads can be access by clicking their summary below the root event on the room
This feature might work in degraded mode if the homeserver a user is connected to does not advertise support for the unstable feature `org.matrix.msc3440` when calling the `/versions` API endpoint. This feature might work in degraded mode if the homeserver a user is connected to does not advertise support for the unstable feature `org.matrix.msc3440` when calling the `/versions` API endpoint.
## Voice & video rooms (`feature_voice_rooms`) [In Development] ## Voice & video rooms (`feature_video_rooms`) [In Development]
Enables support for creating and joining voice & video rooms, which are persistent voice chats that users can jump in and out of. Enables support for creating and joining video rooms, which are persistent video chats that users can jump in and out of.

View File

@ -62,4 +62,4 @@ You can use inside the translation field "Review needed" checkbox. It will be sh
### Further reading ### Further reading
The official Weblate doc provides some more in-deepth explanation on how to do translations and talks about do and don'ts. You can find it at: https://docs.weblate.org/en/latest/user/translating.html The official Weblate doc provides some more in-depth explanation on how to do translations and talks about do and don'ts. You can find it at: https://docs.weblate.org/en/latest/user/translating.html

View File

@ -56,6 +56,10 @@ body, html {
position: absolute; position: absolute;
height: 100%; height: 100%;
width: 100%; width: 100%;
// Hidden by default to avoid flashing the prejoin screen at the user when
// we're supposed to skip it anyways
visibility: hidden;
} }
.joinConferenceFloating { .joinConferenceFloating {

View File

@ -51,6 +51,7 @@ let roomId: string;
let openIdToken: IOpenIDCredentials; let openIdToken: IOpenIDCredentials;
let roomName: string; let roomName: string;
let startAudioOnly: boolean; let startAudioOnly: boolean;
let isVideoChannel: boolean;
let widgetApi: WidgetApi; let widgetApi: WidgetApi;
let meetApi: any; // JitsiMeetExternalAPI let meetApi: any; // JitsiMeetExternalAPI
@ -120,18 +121,17 @@ const ack = (ev: CustomEvent<IWidgetApiRequest>) => widgetApi.transport.reply(ev
roomId = qsParam('roomId', true); roomId = qsParam('roomId', true);
roomName = qsParam('roomName', true); roomName = qsParam('roomName', true);
startAudioOnly = qsParam('isAudioOnly', true) === "true"; startAudioOnly = qsParam('isAudioOnly', true) === "true";
isVideoChannel = qsParam('isVideoChannel', true) === "true";
// We've reached the point where we have to wait for the config, so do that then parse it. // We've reached the point where we have to wait for the config, so do that then parse it.
const instanceConfig = new SnakedObject<IConfigOptions>((await configPromise) ?? <IConfigOptions>{}); const instanceConfig = new SnakedObject<IConfigOptions>((await configPromise) ?? <IConfigOptions>{});
const jitsiConfig = instanceConfig.get("jitsi_widget") ?? {}; const jitsiConfig = instanceConfig.get("jitsi_widget") ?? {};
skipOurWelcomeScreen = (new SnakedObject<IConfigOptions["jitsi_widget"]>(jitsiConfig)) skipOurWelcomeScreen = (new SnakedObject<IConfigOptions["jitsi_widget"]>(jitsiConfig))
.get("skip_built_in_welcome_screen") || false; .get("skip_built_in_welcome_screen") || isVideoChannel;
// If we're meant to skip our screen, skip to the part where we show Jitsi instead of us. // Either reveal the prejoin screen, or skip straight to Jitsi depending on the config.
// We don't set up the call yet though as this might lead to failure without the widget API. // We don't set up the call yet though as this might lead to failure without the widget API.
if (skipOurWelcomeScreen) { toggleConferenceVisibility(skipOurWelcomeScreen);
toggleConferenceVisibility(true);
}
if (widgetApi) { if (widgetApi) {
await readyPromise; await readyPromise;
@ -300,6 +300,7 @@ function joinConference() { // event handler bound in HTML
"they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " + "they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " +
"our fragment values and not recognizing the options.", "our fragment values and not recognizing the options.",
); );
const options = { const options = {
width: "100%", width: "100%",
height: "100%", height: "100%",
@ -313,10 +314,23 @@ function joinConference() { // event handler bound in HTML
}, },
configOverwrite: { configOverwrite: {
startAudioOnly, startAudioOnly,
}, } as any,
jwt: jwt, jwt: jwt,
}; };
// Video channel widgets need some more tailored config options
if (isVideoChannel) {
// Ensure that we start on Jitsi Meet's native prejoin screen, for
// deployments that skip straight to the conference by default
options.configOverwrite.prejoinConfig = { enabled: true };
// Use a simplified set of toolbar buttons
options.configOverwrite.toolbarButtons = [
"microphone", "camera", "desktop", "tileview", "hangup",
];
// Hide all top bar elements
options.configOverwrite.conferenceInfo = { autoHide: [] };
}
meetApi = new JitsiMeetExternalAPI(jitsiDomain, options); meetApi = new JitsiMeetExternalAPI(jitsiDomain, options);
if (displayName) meetApi.executeCommand("displayName", displayName); if (displayName) meetApi.executeCommand("displayName", displayName);
if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl); if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl);
@ -332,6 +346,9 @@ function joinConference() { // event handler bound in HTML
widgetApi.setAlwaysOnScreen(true); widgetApi.setAlwaysOnScreen(true);
widgetApi.transport.send(ElementWidgetActions.JoinCall, {}); widgetApi.transport.send(ElementWidgetActions.JoinCall, {});
} }
// Video rooms should start in tile mode
if (isVideoChannel) meetApi.executeCommand("setTileView", true);
}); });
meetApi.on("readyToClose", () => { meetApi.on("readyToClose", () => {
@ -342,7 +359,7 @@ function joinConference() { // event handler bound in HTML
// can cause the receiving side to instantly stop listening. // can cause the receiving side to instantly stop listening.
// ignored promise because we don't care if it works // ignored promise because we don't care if it works
// noinspection JSIgnoredPromiseFromCall // noinspection JSIgnoredPromiseFromCall
widgetApi.transport.send(ElementWidgetActions.HangupCall, {}).then(() => widgetApi.transport.send(ElementWidgetActions.HangupCall, {}).finally(() =>
widgetApi.setAlwaysOnScreen(false), widgetApi.setAlwaysOnScreen(false),
); );
} }