mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-13 12:52:35 +00:00
Saúl Ibarra Corretgé reported that Recording shows an error dialog
stating "There was an error connecting to your camera". Hristo Terezov
and Yana Stamcheva traced that the problem originates in
da4425b5c0
and, more specifically, is caused by a different order of execution due
to the move of the invocation of the function Recording.init.
The solution is to bring back the execution location of Recording.init.
282 lines
7.5 KiB
JavaScript
282 lines
7.5 KiB
JavaScript
/* @flow */
|
|
|
|
import Recording from '../../../modules/UI/recording/Recording';
|
|
import SideContainerToggler
|
|
from '../../../modules/UI/side_pannels/SideContainerToggler';
|
|
import UIUtil from '../../../modules/UI/util/UIUtil';
|
|
import UIEvents from '../../../service/UI/UIEvents';
|
|
|
|
import {
|
|
clearToolboxTimeout,
|
|
setSubjectSlideIn,
|
|
setToolbarButton,
|
|
setToolboxTimeout,
|
|
setToolboxTimeoutMS,
|
|
setToolboxVisible,
|
|
toggleToolbarButton
|
|
} from './actions.native';
|
|
|
|
export * from './actions.native';
|
|
|
|
declare var $: Function;
|
|
declare var APP: Object;
|
|
declare var config: Object;
|
|
declare var interfaceConfig: Object;
|
|
|
|
/**
|
|
* Checks whether desktop sharing is enabled and whether
|
|
* we have params to start automatically sharing.
|
|
*
|
|
* @returns {Function}
|
|
*/
|
|
export function checkAutoEnableDesktopSharing(): Function {
|
|
return () => {
|
|
// XXX Should use dispatcher to toggle screensharing but screensharing
|
|
// hasn't been React-ified yet.
|
|
|
|
if (UIUtil.isButtonEnabled('desktop')
|
|
&& config.autoEnableDesktopSharing) {
|
|
APP.UI.eventEmitter.emit(UIEvents.TOGGLE_SCREENSHARING);
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Docks/undocks the Toolbox.
|
|
*
|
|
* @param {boolean} dock - True if dock, false otherwise.
|
|
* @returns {Function}
|
|
*/
|
|
export function dockToolbox(dock: boolean): Function {
|
|
return (dispatch: Dispatch<*>, getState: Function) => {
|
|
if (interfaceConfig.filmStripOnly) {
|
|
return;
|
|
}
|
|
|
|
const state = getState();
|
|
const { timeoutMS, visible } = state['features/toolbox'];
|
|
|
|
if (dock) {
|
|
// First make sure the toolbox is shown.
|
|
visible || dispatch(showToolbox());
|
|
|
|
dispatch(clearToolboxTimeout());
|
|
} else if (visible) {
|
|
dispatch(
|
|
setToolboxTimeout(
|
|
() => dispatch(hideToolbox()),
|
|
timeoutMS));
|
|
} else {
|
|
dispatch(showToolbox());
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Hides the toolbox.
|
|
*
|
|
* @param {boolean} force - True to force the hiding of the toolbox without
|
|
* caring about the extended toolbar side panels.
|
|
* @returns {Function}
|
|
*/
|
|
export function hideToolbox(force: boolean = false): Function {
|
|
return (dispatch: Dispatch<*>, getState: Function) => {
|
|
const state = getState();
|
|
const {
|
|
alwaysVisible,
|
|
hovered,
|
|
timeoutMS
|
|
} = state['features/toolbox'];
|
|
|
|
if (alwaysVisible) {
|
|
return;
|
|
}
|
|
|
|
dispatch(clearToolboxTimeout());
|
|
|
|
if (!force
|
|
&& (hovered
|
|
|| APP.UI.isRingOverlayVisible()
|
|
|| SideContainerToggler.isVisible())) {
|
|
dispatch(
|
|
setToolboxTimeout(
|
|
() => dispatch(hideToolbox()),
|
|
timeoutMS));
|
|
} else {
|
|
dispatch(setToolboxVisible(false));
|
|
dispatch(setSubjectSlideIn(false));
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Signals that unclickable property of profile button should change its value.
|
|
*
|
|
* @param {boolean} unclickable - Shows whether button is unclickable.
|
|
* @returns {Function}
|
|
*/
|
|
export function setProfileButtonUnclickable(unclickable: boolean): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
const buttonName = 'profile';
|
|
|
|
dispatch(setToolbarButton(buttonName, {
|
|
unclickable
|
|
}));
|
|
|
|
UIUtil.removeTooltip(document.getElementById('toolbar_button_profile'));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows desktop sharing button.
|
|
*
|
|
* @returns {Function}
|
|
*/
|
|
export function showDesktopSharingButton(): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
const buttonName = 'desktop';
|
|
const visible
|
|
= APP.conference.isDesktopSharingEnabled
|
|
&& UIUtil.isButtonEnabled(buttonName);
|
|
|
|
dispatch(setToolbarButton(buttonName, {
|
|
hidden: !visible
|
|
}));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows or hides the dialpad button.
|
|
*
|
|
* @param {boolean} show - Flag showing whether to show button or not.
|
|
* @returns {Function}
|
|
*/
|
|
export function showDialPadButton(show: boolean): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
const buttonName = 'dialpad';
|
|
const shouldShow = UIUtil.isButtonEnabled(buttonName) && show;
|
|
|
|
if (shouldShow) {
|
|
dispatch(setToolbarButton(buttonName, {
|
|
hidden: false
|
|
}));
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows recording button.
|
|
*
|
|
* @returns {Function}
|
|
*/
|
|
export function showRecordingButton(): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
dispatch(setToolbarButton('recording', {
|
|
hidden: false
|
|
}));
|
|
|
|
Recording.initRecordingButton();
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows or hides the 'shared video' button.
|
|
*
|
|
* @returns {Function}
|
|
*/
|
|
export function showSharedVideoButton(): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
const buttonName = 'sharedvideo';
|
|
const shouldShow
|
|
= UIUtil.isButtonEnabled(buttonName)
|
|
&& !config.disableThirdPartyRequests;
|
|
|
|
if (shouldShow) {
|
|
dispatch(setToolbarButton(buttonName, {
|
|
hidden: false
|
|
}));
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows SIP call button if it's required and appropriate
|
|
* flag is passed.
|
|
*
|
|
* @param {boolean} show - Flag showing whether to show button or not.
|
|
* @returns {Function}
|
|
*/
|
|
export function showSIPCallButton(show: boolean): Function {
|
|
return (dispatch: Dispatch<*>) => {
|
|
const buttonName = 'sip';
|
|
const shouldShow
|
|
= APP.conference.sipGatewayEnabled()
|
|
&& UIUtil.isButtonEnabled(buttonName)
|
|
&& show;
|
|
|
|
if (shouldShow) {
|
|
dispatch(setToolbarButton(buttonName, {
|
|
hidden: !shouldShow
|
|
}));
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Shows the toolbox for specified timeout.
|
|
*
|
|
* @param {number} timeout - Timeout for showing the toolbox.
|
|
* @returns {Function}
|
|
*/
|
|
export function showToolbox(timeout: number = 0): Object {
|
|
return (dispatch: Dispatch<*>, getState: Function) => {
|
|
const state = getState();
|
|
const {
|
|
alwaysVisible,
|
|
enabled,
|
|
timeoutMS,
|
|
visible
|
|
} = state['features/toolbox'];
|
|
|
|
if (enabled && !visible) {
|
|
dispatch(setToolboxVisible(true));
|
|
dispatch(setSubjectSlideIn(true));
|
|
|
|
// If the Toolbox is always visible, there's no need for a timeout
|
|
// to toggle its visibility.
|
|
if (!alwaysVisible) {
|
|
dispatch(
|
|
setToolboxTimeout(
|
|
() => dispatch(hideToolbox()),
|
|
timeout || timeoutMS));
|
|
dispatch(setToolboxTimeoutMS(interfaceConfig.TOOLBAR_TIMEOUT));
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Event handler for side toolbar container toggled event.
|
|
*
|
|
* @param {string} containerId - ID of the container.
|
|
* @returns {Function}
|
|
*/
|
|
export function toggleSideToolbarContainer(containerId: string): Function {
|
|
return (dispatch: Dispatch, getState: Function) => {
|
|
const state = getState();
|
|
const { secondaryToolbarButtons } = state['features/toolbox'];
|
|
|
|
for (const key of secondaryToolbarButtons.keys()) {
|
|
const isButtonEnabled = UIUtil.isButtonEnabled(key);
|
|
const button = secondaryToolbarButtons.get(key);
|
|
|
|
if (isButtonEnabled
|
|
&& button.sideContainerId
|
|
&& button.sideContainerId === containerId) {
|
|
dispatch(toggleToolbarButton(key));
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
}
|