jiti-meet/react/features/toolbox/actions.web.ts

263 lines
7.1 KiB
TypeScript

import { IStore } from '../app/types';
import { overwriteConfig } from '../base/config/actions';
import { isMobileBrowser } from '../base/environment/utils';
import {
CLEAR_TOOLBOX_TIMEOUT,
FULL_SCREEN_CHANGED,
SET_FULL_SCREEN,
SET_HANGUP_MENU_VISIBLE,
SET_OVERFLOW_DRAWER,
SET_OVERFLOW_MENU_VISIBLE,
SET_TOOLBAR_HOVERED,
SET_TOOLBOX_TIMEOUT
} from './actionTypes';
import { setToolboxVisible } from './actions.web';
import { getToolbarTimeout } from './functions.web';
export * from './actions.any';
/**
* Docks/undocks the Toolbox.
*
* @param {boolean} dock - True if dock, false otherwise.
* @returns {Function}
*/
export function dockToolbox(dock: boolean) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { visible } = state['features/toolbox'];
const toolbarTimeout = getToolbarTimeout(state);
if (dock) {
// First make sure the toolbox is shown.
visible || dispatch(showToolbox());
dispatch(clearToolboxTimeout());
} else if (visible) {
dispatch(
setToolboxTimeout(
() => dispatch(hideToolbox()),
toolbarTimeout));
} else {
dispatch(showToolbox());
}
};
}
/**
* Signals that full screen mode has been entered or exited.
*
* @param {boolean} fullScreen - Whether or not full screen mode is currently
* enabled.
* @returns {{
* type: FULL_SCREEN_CHANGED,
* fullScreen: boolean
* }}
*/
export function fullScreenChanged(fullScreen: boolean) {
return {
type: FULL_SCREEN_CHANGED,
fullScreen
};
}
/**
* 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 = false) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { toolbarConfig } = state['features/base/config'];
const alwaysVisible = toolbarConfig?.alwaysVisible;
const autoHideWhileChatIsOpen = toolbarConfig?.autoHideWhileChatIsOpen;
const { hovered } = state['features/toolbox'];
const toolbarTimeout = getToolbarTimeout(state);
if (alwaysVisible) {
return;
}
dispatch(clearToolboxTimeout());
const focusSelector = '.toolbox-content-items:focus-within,.filmstrip:focus-within,.remotevideomenu:hover';
if (!force
&& (hovered
|| state['features/invite'].calleeInfoVisible
|| (state['features/chat'].isOpen && !autoHideWhileChatIsOpen)
|| document.querySelector(focusSelector))) {
dispatch(
setToolboxTimeout(
() => dispatch(hideToolbox()),
toolbarTimeout));
} else {
dispatch(setToolboxVisible(false));
}
};
}
/**
* Signals a request to enter or exit full screen mode.
*
* @param {boolean} fullScreen - True to enter full screen mode, false to exit.
* @returns {{
* type: SET_FULL_SCREEN,
* fullScreen: boolean
* }}
*/
export function setFullScreen(fullScreen: boolean) {
return {
type: SET_FULL_SCREEN,
fullScreen
};
}
/**
* Shows the toolbox for specified timeout.
*
* @param {number} timeout - Timeout for showing the toolbox.
* @returns {Function}
*/
export function showToolbox(timeout = 0) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { toolbarConfig } = state['features/base/config'];
const toolbarTimeout = getToolbarTimeout(state);
const initialTimeout = toolbarConfig?.initialTimeout;
const alwaysVisible = toolbarConfig?.alwaysVisible;
const {
enabled,
visible
} = state['features/toolbox'];
if (enabled && !visible) {
dispatch(setToolboxVisible(true));
// If the Toolbox is always visible, there's no need for a timeout
// to toggle its visibility.
if (!alwaysVisible) {
if (typeof initialTimeout === 'number') {
// reset `initialTimeout` once it is consumed once
dispatch(overwriteConfig({ toolbarConfig: {
...toolbarConfig,
initialTimeout: null
} }));
}
dispatch(
setToolboxTimeout(
() => dispatch(hideToolbox()),
timeout || initialTimeout || toolbarTimeout));
}
}
};
}
/**
* Signals a request to display overflow as drawer.
*
* @param {boolean} displayAsDrawer - True to display overflow as drawer, false to preserve original behaviour.
* @returns {{
* type: SET_OVERFLOW_DRAWER,
* displayAsDrawer: boolean
* }}
*/
export function setOverflowDrawer(displayAsDrawer: boolean) {
return {
type: SET_OVERFLOW_DRAWER,
displayAsDrawer
};
}
/**
* Signals that toolbox timeout should be cleared.
*
* @returns {{
* type: CLEAR_TOOLBOX_TIMEOUT
* }}
*/
export function clearToolboxTimeout() {
return {
type: CLEAR_TOOLBOX_TIMEOUT
};
}
/**
* Shows/hides the hangup menu.
*
* @param {boolean} visible - True to show it or false to hide it.
* @returns {{
* type: SET_HANGUP_MENU_VISIBLE,
* visible: boolean
* }}
*/
export function setHangupMenuVisible(visible: boolean): Object {
return {
type: SET_HANGUP_MENU_VISIBLE,
visible
};
}
/**
* Shows/hides the overflow menu.
*
* @param {boolean} visible - True to show it or false to hide it.
* @returns {{
* type: SET_OVERFLOW_MENU_VISIBLE,
* visible: boolean
* }}
*/
export function setOverflowMenuVisible(visible: boolean): Object {
return {
type: SET_OVERFLOW_MENU_VISIBLE,
visible
};
}
/**
* Signals that toolbar is hovered value should be changed.
*
* @param {boolean} hovered - Flag showing whether toolbar is hovered.
* @returns {{
* type: SET_TOOLBAR_HOVERED,
* hovered: boolean
* }}
*/
export function setToolbarHovered(hovered: boolean): Object {
return {
type: SET_TOOLBAR_HOVERED,
hovered
};
}
/**
* Dispatches an action which sets new timeout for the toolbox visibility and clears the previous one.
* On mobile browsers the toolbox does not hide on timeout. It is toggled on simple tap.
*
* @param {Function} handler - Function to be invoked after the timeout.
* @param {number} timeoutMS - Delay.
* @returns {{
* type: SET_TOOLBOX_TIMEOUT,
* handler: Function,
* timeoutMS: number
* }}
*/
export function setToolboxTimeout(handler: Function, timeoutMS: number) {
return function(dispatch: IStore['dispatch']) {
if (isMobileBrowser()) {
return;
}
dispatch({
type: SET_TOOLBOX_TIMEOUT,
handler,
timeoutMS
});
};
}