mirror of https://github.com/vector-im/riot-web
Merge branch 'develop' into travis/remove-skinning
commit
d39ae8a91b
|
@ -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.
|
||||||
|
|
|
@ -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
|
|
@ -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 {
|
||||||
|
|
|
@ -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),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue