ref(TS) Convert some features to TS (#12523)
This commit is contained in:
parent
817d7f0c0d
commit
4bd27730ce
|
@ -2,7 +2,7 @@ import { NativeModules } from 'react-native';
|
|||
|
||||
import { IStateful } from '../base/app/types';
|
||||
import { toState } from '../base/redux/functions';
|
||||
import { getServerURL } from '../base/settings/functions';
|
||||
import { getServerURL } from '../base/settings/functions.native';
|
||||
|
||||
export * from './functions.any';
|
||||
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
// @flow
|
||||
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import { appNavigate } from '../app/actions';
|
||||
import { IStore } from '../app/types';
|
||||
import { conferenceLeft } from '../base/conference/actions';
|
||||
import { connectionFailed } from '../base/connection/actions.native';
|
||||
import { set } from '../base/redux';
|
||||
import { set } from '../base/redux/functions';
|
||||
|
||||
import { CANCEL_LOGIN } from './actionTypes';
|
||||
import { stopWaitForOwner } from './actions.any';
|
||||
|
@ -20,7 +17,7 @@ export * from './actions.any';
|
|||
* }}
|
||||
*/
|
||||
export function cancelLogin() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
dispatch({ type: CANCEL_LOGIN });
|
||||
|
||||
// XXX The error associated with CONNECTION_FAILED was marked as
|
||||
|
@ -36,8 +33,8 @@ export function cancelLogin() {
|
|||
passwordRequired
|
||||
&& dispatch(
|
||||
connectionFailed(
|
||||
passwordRequired,
|
||||
set(error, 'recoverable', false)));
|
||||
passwordRequired, // @ts-ignore
|
||||
set(error, 'recoverable', false) as any));
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -47,7 +44,7 @@ export function cancelLogin() {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function cancelWaitForOwner() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
dispatch(stopWaitForOwner());
|
||||
|
||||
// XXX The error associated with CONFERENCE_FAILED was marked as
|
|
@ -1,6 +1,5 @@
|
|||
// @flow
|
||||
|
||||
import JitsiMeetJS from '../../../react/features/base/lib-jitsi-meet';
|
||||
import { IConfig } from '../base/config/configType';
|
||||
import JitsiMeetJS from '../base/lib-jitsi-meet';
|
||||
|
||||
|
||||
/**
|
||||
|
@ -9,7 +8,7 @@ import JitsiMeetJS from '../../../react/features/base/lib-jitsi-meet';
|
|||
* @param {Object} config - Configuration state object from store.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export const isTokenAuthEnabled = (config: Object) =>
|
||||
export const isTokenAuthEnabled = (config: IConfig) =>
|
||||
typeof config.tokenAuthUrl === 'string'
|
||||
&& config.tokenAuthUrl.length;
|
||||
|
||||
|
@ -20,6 +19,6 @@ export const isTokenAuthEnabled = (config: Object) =>
|
|||
* @param {Object} config - Configuration state object from store.
|
||||
* @returns {string}
|
||||
*/
|
||||
export const getTokenAuthUrl = (config: Object) =>
|
||||
export const getTokenAuthUrl = (config: IConfig) =>
|
||||
JitsiMeetJS.util.AuthUtil.getTokenAuthUrl.bind(null,
|
||||
config.tokenAuthUrl);
|
|
@ -1,20 +1,18 @@
|
|||
// @flow
|
||||
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import { appNavigate } from '../app/actions';
|
||||
import { appNavigate } from '../app/actions.native';
|
||||
import { IStore } from '../app/types';
|
||||
import {
|
||||
CONFERENCE_FAILED,
|
||||
CONFERENCE_JOINED,
|
||||
CONFERENCE_LEFT
|
||||
} from '../base/conference';
|
||||
import { CONNECTION_ESTABLISHED, CONNECTION_FAILED } from '../base/connection';
|
||||
import { hideDialog, isDialogOpen } from '../base/dialog';
|
||||
} from '../base/conference/actionTypes';
|
||||
import { CONNECTION_ESTABLISHED, CONNECTION_FAILED } from '../base/connection/actionTypes';
|
||||
import { hideDialog } from '../base/dialog/actions';
|
||||
import { isDialogOpen } from '../base/dialog/functions';
|
||||
import {
|
||||
JitsiConferenceErrors,
|
||||
JitsiConnectionErrors
|
||||
} from '../base/lib-jitsi-meet';
|
||||
import { MiddlewareRegistry } from '../base/redux';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
|
||||
import {
|
||||
CANCEL_LOGIN,
|
||||
|
@ -26,7 +24,7 @@ import {
|
|||
openLoginDialog,
|
||||
openWaitForOwnerDialog,
|
||||
stopWaitForOwner,
|
||||
waitForOwner } from './actions.native';
|
||||
waitForOwner } from './actions.native'; // @ts-ignore
|
||||
import { LoginDialog, WaitForOwnerDialog } from './components';
|
||||
|
||||
/**
|
||||
|
@ -44,7 +42,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
const { dispatch, getState } = store;
|
||||
const { thenableWithCancel } = getState()['features/authentication'];
|
||||
|
||||
thenableWithCancel && thenableWithCancel.cancel();
|
||||
thenableWithCancel?.cancel();
|
||||
|
||||
// The LoginDialog can be opened on top of "wait for owner". The app
|
||||
// should navigate only if LoginDialog was open without the
|
||||
|
@ -142,7 +140,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
case WAIT_FOR_OWNER: {
|
||||
_clearExistingWaitForOwnerTimeout(store);
|
||||
|
||||
const { handler, timeoutMs } = action;
|
||||
const { handler, timeoutMs }: { handler: () => void; timeoutMs: number; } = action;
|
||||
|
||||
action.waitForOwnerTimeoutID = setTimeout(handler, timeoutMs);
|
||||
|
||||
|
@ -165,7 +163,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
* @returns {void}
|
||||
*/
|
||||
function _clearExistingWaitForOwnerTimeout(
|
||||
{ getState }: { getState: Function }) {
|
||||
{ getState }: IStore) {
|
||||
const { waitForOwnerTimeoutID } = getState()['features/authentication'];
|
||||
|
||||
waitForOwnerTimeoutID && clearTimeout(waitForOwnerTimeoutID);
|
||||
|
@ -177,7 +175,7 @@ function _clearExistingWaitForOwnerTimeout(
|
|||
* @param {Object} store - The redux store.
|
||||
* @returns {void}
|
||||
*/
|
||||
function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<any> }) {
|
||||
function _hideLoginDialog({ dispatch }: IStore) {
|
||||
dispatch(hideDialog(LoginDialog));
|
||||
}
|
||||
|
||||
|
@ -187,6 +185,6 @@ function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<any> }) {
|
|||
* @param {Object} store - The redux store.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function _isWaitingForOwner({ getState }: { getState: Function }) {
|
||||
function _isWaitingForOwner({ getState }: IStore) {
|
||||
return Boolean(getState()['features/authentication'].waitForOwnerTimeoutID);
|
||||
}
|
|
@ -1,17 +1,17 @@
|
|||
// @flow
|
||||
|
||||
import { maybeRedirectToWelcomePage } from '../app/actions';
|
||||
import { maybeRedirectToWelcomePage } from '../app/actions.web';
|
||||
import { IStore } from '../app/types';
|
||||
import {
|
||||
CONFERENCE_FAILED,
|
||||
CONFERENCE_JOINED,
|
||||
CONFERENCE_LEFT
|
||||
} from '../base/conference';
|
||||
import { CONNECTION_ESTABLISHED } from '../base/connection';
|
||||
import { hideDialog, isDialogOpen } from '../base/dialog';
|
||||
} from '../base/conference/actionTypes';
|
||||
import { CONNECTION_ESTABLISHED } from '../base/connection/actionTypes';
|
||||
import { hideDialog } from '../base/dialog/actions';
|
||||
import { isDialogOpen } from '../base/dialog/functions';
|
||||
import {
|
||||
JitsiConferenceErrors
|
||||
} from '../base/lib-jitsi-meet';
|
||||
import { MiddlewareRegistry } from '../base/redux';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
|
||||
import {
|
||||
CANCEL_LOGIN,
|
||||
|
@ -24,6 +24,8 @@ import {
|
|||
openWaitForOwnerDialog,
|
||||
stopWaitForOwner
|
||||
} from './actions.web';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { LoginDialog, WaitForOwnerDialog } from './components';
|
||||
|
||||
/**
|
||||
|
@ -113,7 +115,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
case WAIT_FOR_OWNER: {
|
||||
_clearExistingWaitForOwnerTimeout(store);
|
||||
|
||||
const { handler, timeoutMs } = action;
|
||||
const { handler, timeoutMs }: { handler: () => void; timeoutMs: number; } = action;
|
||||
|
||||
action.waitForOwnerTimeoutID = setTimeout(handler, timeoutMs);
|
||||
|
||||
|
@ -134,7 +136,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
* @returns {void}
|
||||
*/
|
||||
function _clearExistingWaitForOwnerTimeout(
|
||||
{ getState }: { getState: Function }) {
|
||||
{ getState }: IStore) {
|
||||
const { waitForOwnerTimeoutID } = getState()['features/authentication'];
|
||||
|
||||
waitForOwnerTimeoutID && clearTimeout(waitForOwnerTimeoutID);
|
||||
|
@ -146,6 +148,6 @@ function _clearExistingWaitForOwnerTimeout(
|
|||
* @param {Object} store - The redux store.
|
||||
* @returns {void}
|
||||
*/
|
||||
function _isWaitingForOwner({ getState }: { getState: Function }) {
|
||||
function _isWaitingForOwner({ getState }: IStore) {
|
||||
return getState()['features/authentication'].waitForOwnerTimeoutID;
|
||||
}
|
|
@ -12,7 +12,9 @@ import {
|
|||
export interface IAuthenticationState {
|
||||
error?: Object | undefined;
|
||||
progress?: number | undefined;
|
||||
thenableWithCancel?: Object | undefined;
|
||||
thenableWithCancel?: {
|
||||
cancel: Function;
|
||||
};
|
||||
waitForOwnerTimeoutID?: number;
|
||||
}
|
||||
|
||||
|
|
|
@ -377,7 +377,7 @@ export function conferenceJoinInProgress(conference: IJitsiConference) {
|
|||
* conference: JitsiConference
|
||||
* }}
|
||||
*/
|
||||
export function conferenceLeft(conference: IJitsiConference) {
|
||||
export function conferenceLeft(conference: Partial<IJitsiConference>) {
|
||||
return {
|
||||
type: CONFERENCE_LEFT,
|
||||
conference
|
||||
|
|
|
@ -456,6 +456,7 @@ export interface IConfig {
|
|||
tileView?: {
|
||||
numberOfVisibleTiles?: number;
|
||||
};
|
||||
tokenAuthUrl?: string;
|
||||
toolbarButtons?: Array<ToolbarButtons>;
|
||||
toolbarConfig?: {
|
||||
alwaysVisible?: boolean;
|
||||
|
|
|
@ -286,3 +286,23 @@ export function setConfigFromURLParams(
|
|||
}
|
||||
|
||||
/* eslint-enable max-params */
|
||||
|
||||
/**
|
||||
* Returns the dial out url.
|
||||
*
|
||||
* @param {Object} state - The state of the app.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getDialOutStatusUrl(state: IReduxState) {
|
||||
return state['features/base/config'].guestDialOutStatusUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the dial out status url.
|
||||
*
|
||||
* @param {Object} state - The state of the app.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getDialOutUrl(state: IReduxState) {
|
||||
return state['features/base/config'].guestDialOutUrl;
|
||||
}
|
||||
|
|
|
@ -14,26 +14,6 @@ export * from './functions.any';
|
|||
export function _cleanupConfig(config: IConfig) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the dial out url.
|
||||
*
|
||||
* @param {Object} state - The state of the app.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getDialOutStatusUrl(state: IReduxState): string | undefined {
|
||||
return state['features/base/config'].guestDialOutStatusUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the dial out status url.
|
||||
*
|
||||
* @param {Object} state - The state of the app.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getDialOutUrl(state: IReduxState): string | undefined {
|
||||
return state['features/base/config'].guestDialOutUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the replaceParticipant config.
|
||||
*
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import JitsiMeetJS from '../lib-jitsi-meet';
|
||||
import Platform from '../react/Platform.web';
|
||||
import Platform from '../react/Platform';
|
||||
|
||||
import { isMobileBrowser } from './utils';
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { IStateful } from '../app/types';
|
||||
import { toState } from '../redux/functions';
|
||||
import { getPropertyValue } from '../settings/functions.any';
|
||||
import { getPropertyValue } from '../settings/functions';
|
||||
|
||||
import { VIDEO_MUTISM_AUTHORITY } from './constants';
|
||||
|
||||
|
|
|
@ -540,7 +540,7 @@ export function participantKicked(kicker: any, kicked: any) {
|
|||
* }
|
||||
* }}
|
||||
*/
|
||||
export function pinParticipant(id: string | null) {
|
||||
export function pinParticipant(id?: string | null) {
|
||||
return {
|
||||
type: PIN_PARTICIPANT,
|
||||
participant: {
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
// @flow
|
||||
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import {
|
||||
AlertDialog,
|
||||
openDialog
|
||||
} from '../base/dialog';
|
||||
import { getParticipantDisplayName } from '../base/participants';
|
||||
import { IStore } from '../app/types';
|
||||
import { openDialog } from '../base/dialog/actions';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { AlertDialog } from '../base/dialog/components/native';
|
||||
import { getParticipantDisplayName } from '../base/participants/functions';
|
||||
|
||||
/**
|
||||
* Notify that we've been kicked out of the conference.
|
||||
|
@ -16,10 +13,10 @@ import { getParticipantDisplayName } from '../base/participants';
|
|||
* @param {?Function} submit - The function to execute after submiting the dialog.
|
||||
* @returns {Function}
|
||||
*/
|
||||
export function notifyKickedOut(participant: Object, submit: ?Function) {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
if (!participant || (participant.isReplaced && participant.isReplaced())) {
|
||||
submit && submit();
|
||||
export function notifyKickedOut(participant: any, submit?: Function) {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
if (!participant || participant?.isReplaced?.()) {
|
||||
submit?.();
|
||||
|
||||
return;
|
||||
}
|
|
@ -1,13 +1,7 @@
|
|||
// @flow
|
||||
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import { getParticipantDisplayName } from '../base/participants';
|
||||
import {
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
NOTIFICATION_TYPE,
|
||||
showNotification
|
||||
} from '../notifications';
|
||||
import { IStore } from '../app/types';
|
||||
import { getParticipantDisplayName } from '../base/participants/functions';
|
||||
import { showNotification } from '../notifications/actions';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE, NOTIFICATION_TYPE } from '../notifications/constants';
|
||||
|
||||
/**
|
||||
* Notify that we've been kicked out of the conference.
|
||||
|
@ -17,9 +11,9 @@ import {
|
|||
* @param {?Function} _ - Used only in native code.
|
||||
* @returns {Function}
|
||||
*/
|
||||
export function notifyKickedOut(participant: Object, _: ?Function) { // eslint-disable-line no-unused-vars
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
if (!participant || (participant.isReplaced && participant.isReplaced())) {
|
||||
export function notifyKickedOut(participant: any, _?: Function) {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
if (!participant || participant?.isReplaced()) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
import { toState } from '../base/redux';
|
||||
import { areThereNotifications } from '../notifications';
|
||||
import { getOverlayToRender } from '../overlay';
|
||||
import { IStateful } from '../base/app/types';
|
||||
import { toState } from '../base/redux/functions';
|
||||
import { areThereNotifications } from '../notifications/functions';
|
||||
import { getOverlayToRender } from '../overlay/functions';
|
||||
|
||||
/**
|
||||
* Tells whether or not the notifications should be displayed within
|
||||
|
@ -9,7 +10,7 @@ import { getOverlayToRender } from '../overlay';
|
|||
* @param {Object|Function} stateful - The redux store state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function shouldDisplayNotifications(stateful) {
|
||||
export function shouldDisplayNotifications(stateful: IStateful) {
|
||||
const state = toState(stateful);
|
||||
const isAnyOverlayVisible = Boolean(getOverlayToRender(state));
|
||||
const { calleeInfoVisible } = state['features/invite'];
|
|
@ -1,6 +1,5 @@
|
|||
// @flow
|
||||
|
||||
import { toState } from '../base/redux';
|
||||
import { IStateful } from '../base/app/types';
|
||||
import { toState } from '../base/redux/functions';
|
||||
|
||||
export * from './functions.any';
|
||||
|
||||
|
@ -14,7 +13,7 @@ export * from './functions.any';
|
|||
* features/base/config.
|
||||
* @returns {boolean}.
|
||||
*/
|
||||
export function getDisablePolls(stateful: Object) {
|
||||
export function getDisablePolls(stateful: IStateful) {
|
||||
const state = toState(stateful)['features/base/config'];
|
||||
|
||||
return state.disablePolls;
|
|
@ -1,6 +1,8 @@
|
|||
import { isSuboptimalBrowser } from '../base/environment';
|
||||
import { translateToHTML } from '../base/i18n';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE, showWarningNotification } from '../notifications';
|
||||
import { IStore } from '../app/types';
|
||||
import { isSuboptimalBrowser } from '../base/environment/environment';
|
||||
import { translateToHTML } from '../base/i18n/functions';
|
||||
import { showWarningNotification } from '../notifications/actions';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE } from '../notifications/constants';
|
||||
|
||||
export * from './functions.any';
|
||||
|
||||
|
@ -11,7 +13,7 @@ export * from './functions.any';
|
|||
* @param {Function} t - The translation function.
|
||||
* @returns {void}
|
||||
*/
|
||||
export function maybeShowSuboptimalExperienceNotification(dispatch, t) {
|
||||
export function maybeShowSuboptimalExperienceNotification(dispatch: IStore['dispatch'], t: Function) {
|
||||
if (isSuboptimalBrowser()) {
|
||||
dispatch(
|
||||
showWarningNotification(
|
|
@ -1,5 +1,3 @@
|
|||
// @flow
|
||||
|
||||
import { getLogger } from '../base/logging/functions';
|
||||
|
||||
export default getLogger('features/conference');
|
|
@ -1,17 +1,18 @@
|
|||
// @flow
|
||||
import { appNavigate } from '../app/actions';
|
||||
import {
|
||||
CONFERENCE_JOINED,
|
||||
KICKED_OUT,
|
||||
conferenceLeft,
|
||||
getCurrentConference
|
||||
} from '../base/conference';
|
||||
import { hideDialog, isDialogOpen } from '../base/dialog';
|
||||
import { pinParticipant } from '../base/participants';
|
||||
import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
|
||||
import { SET_REDUCED_UI } from '../base/responsive-ui';
|
||||
import { IStore } from '../app/types';
|
||||
import { CONFERENCE_JOINED, KICKED_OUT } from '../base/conference/actionTypes';
|
||||
import { conferenceLeft } from '../base/conference/actions';
|
||||
import { getCurrentConference } from '../base/conference/functions';
|
||||
import { hideDialog } from '../base/dialog/actions';
|
||||
import { isDialogOpen } from '../base/dialog/functions';
|
||||
import { pinParticipant } from '../base/participants/actions';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
import { SET_REDUCED_UI } from '../base/responsive-ui/actionTypes';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { FeedbackDialog } from '../feedback';
|
||||
import { setFilmstripEnabled } from '../filmstrip';
|
||||
import { setFilmstripEnabled } from '../filmstrip/actions';
|
||||
import { showSalesforceNotification } from '../salesforce/actions';
|
||||
import { setToolboxEnabled } from '../toolbox/actions';
|
||||
|
||||
|
@ -90,7 +91,7 @@ StateListenerRegistry.register(
|
|||
* @private
|
||||
* @returns {void}
|
||||
*/
|
||||
function _setReducedUI({ dispatch, getState }) {
|
||||
function _setReducedUI({ dispatch, getState }: IStore) {
|
||||
const { reducedUI } = getState()['features/base/responsive-ui'];
|
||||
|
||||
dispatch(setToolboxEnabled(!reducedUI));
|
||||
|
@ -106,7 +107,7 @@ function _setReducedUI({ dispatch, getState }) {
|
|||
* @private
|
||||
* @returns {void}
|
||||
*/
|
||||
function _conferenceJoined({ dispatch, getState }) {
|
||||
function _conferenceJoined({ dispatch, getState }: IStore) {
|
||||
_setReducedUI({
|
||||
dispatch,
|
||||
getState
|
|
@ -7,7 +7,7 @@ import { ITrack } from '../base/tracks/types';
|
|||
* @param {Object} videoTrack - Track reference.
|
||||
* @returns {boolean} - Is streaming status active.
|
||||
*/
|
||||
export function isTrackStreamingStatusActive(videoTrack: ITrack) {
|
||||
export function isTrackStreamingStatusActive(videoTrack?: ITrack) {
|
||||
const streamingStatus = videoTrack?.streamingStatus;
|
||||
|
||||
return streamingStatus === JitsiTrackStreamingStatus.ACTIVE;
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
// @flow
|
||||
import { UPDATE_DROPBOX_TOKEN } from './actionTypes';
|
||||
import { _authorizeDropbox } from './functions';
|
||||
import logger from './logger';
|
|
@ -1,4 +1,3 @@
|
|||
// @flow
|
||||
export * from './functions';
|
||||
|
||||
import { getDisplayName, getSpaceUsage } from './functions';
|
||||
|
@ -12,12 +11,12 @@ type DropboxUserData = {
|
|||
/**
|
||||
* The available space left in MB into the user's Dropbox account.
|
||||
*/
|
||||
spaceLeft: number,
|
||||
spaceLeft: number;
|
||||
|
||||
/**
|
||||
* The display name of the user in Dropbox.
|
||||
*/
|
||||
userName: string
|
||||
userName: string;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -30,7 +29,7 @@ type DropboxUserData = {
|
|||
export function getDropboxData(
|
||||
token: string,
|
||||
appKey: string
|
||||
): Promise<?DropboxUserData> {
|
||||
): Promise<DropboxUserData | undefined> {
|
||||
return Promise.all(
|
||||
[ getDisplayName(token, appKey), getSpaceUsage(token, appKey) ]
|
||||
).then(([ userName, space ]) => {
|
|
@ -1,18 +1,21 @@
|
|||
// @flow
|
||||
|
||||
import { NativeModules } from 'react-native';
|
||||
|
||||
const { Dropbox } = NativeModules;
|
||||
|
||||
import { IReduxState } from '../app/types';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { setPictureInPictureEnabled } from '../mobile/picture-in-picture/functions';
|
||||
|
||||
const { Dropbox } = NativeModules;
|
||||
|
||||
/**
|
||||
* Action to authorize the Jitsi Recording app in dropbox.
|
||||
*
|
||||
* @param {any} _appKey - Used on web.
|
||||
* @param {any} _redirectURI - Used on web.
|
||||
* @returns {Promise<Object>} - The promise will be resolved with the dropbox
|
||||
* access token or rejected with an error.
|
||||
*/
|
||||
export async function _authorizeDropbox(): Promise<Object> {
|
||||
export async function _authorizeDropbox(_appKey?: any, _redirectURI?: any): Promise<any> {
|
||||
setPictureInPictureEnabled(false);
|
||||
|
||||
try {
|
||||
|
@ -35,10 +38,11 @@ export function getNewAccessToken() {
|
|||
* Returns the display name for the current dropbox account.
|
||||
*
|
||||
* @param {string} token - The dropbox access token.
|
||||
* @param {any} _appKey - Used on web.
|
||||
* @returns {Promise<string>} - The promise will be resolved with the display
|
||||
* name or rejected with an error.
|
||||
*/
|
||||
export function getDisplayName(token: string) {
|
||||
export function getDisplayName(token: string, _appKey?: any) {
|
||||
return Dropbox.getDisplayName(token);
|
||||
}
|
||||
|
||||
|
@ -46,12 +50,13 @@ export function getDisplayName(token: string) {
|
|||
* Returns information about the space usage for the current dropbox account.
|
||||
*
|
||||
* @param {string} token - The dropbox access token.
|
||||
* @param {any} _appKey - Used on web.
|
||||
* @returns {Promise<{ used: number, allocated: number}>} - The promise will be
|
||||
* resolved with the object with information about the space usage (the used
|
||||
* space and the allocated space) for the current dropbox account or rejected
|
||||
* with an error.
|
||||
*/
|
||||
export function getSpaceUsage(token: string) {
|
||||
export function getSpaceUsage(token: string, _appKey?: any) {
|
||||
return Dropbox.getSpaceUsage(token);
|
||||
}
|
||||
|
||||
|
@ -62,8 +67,9 @@ export function getSpaceUsage(token: string) {
|
|||
* @param {Object} state - The redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isEnabled(state: Object) {
|
||||
export function isEnabled(state: IReduxState) {
|
||||
const { dropbox = {} } = state['features/base/config'];
|
||||
|
||||
// @ts-ignore
|
||||
return Boolean(Dropbox?.ENABLED && typeof dropbox.appKey === 'string');
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
// @flow
|
||||
|
||||
import { Dropbox, DropboxAuth } from 'dropbox';
|
||||
|
||||
import { IReduxState } from '../app/types';
|
||||
|
||||
/**
|
||||
* Executes the oauth flow.
|
||||
*
|
||||
|
@ -13,8 +13,8 @@ function authorize(authUrl: string): Promise<string> {
|
|||
|
||||
return new Promise(resolve => {
|
||||
// eslint-disable-next-line prefer-const
|
||||
let popup;
|
||||
const handleAuth = ({ data }) => {
|
||||
let popup: any;
|
||||
const handleAuth = ({ data }: { data: { type: string; url: string; windowName: string; }; }) => {
|
||||
if (data && data.type === 'dropbox-login' && data.windowName === windowName) {
|
||||
if (popup) {
|
||||
popup.close();
|
||||
|
@ -49,18 +49,20 @@ function getTokenExpiresAtTimestamp(expiresIn: number) {
|
|||
export function _authorizeDropbox(
|
||||
appKey: string,
|
||||
redirectURI: string
|
||||
): Promise<Object> {
|
||||
): Promise<any> {
|
||||
const dropbox = new DropboxAuth({ clientId: appKey });
|
||||
|
||||
return dropbox.getAuthenticationUrl(redirectURI, undefined, 'code', 'offline', undefined, undefined, true)
|
||||
|
||||
// @ts-ignore
|
||||
.then(authorize)
|
||||
.then(returnUrl => {
|
||||
const params = new URLSearchParams(new URL(returnUrl).search);
|
||||
const code = params.get('code');
|
||||
|
||||
return dropbox.getAccessTokenFromCode(redirectURI, code);
|
||||
return dropbox.getAccessTokenFromCode(redirectURI, code ?? '');
|
||||
})
|
||||
.then(resp => {
|
||||
.then((resp: any) => {
|
||||
return {
|
||||
token: resp.result.access_token,
|
||||
rToken: resp.result.refresh_token,
|
||||
|
@ -82,7 +84,7 @@ export function getNewAccessToken(appKey: string, rToken: string) {
|
|||
|
||||
dropbox.setRefreshToken(rToken);
|
||||
|
||||
return dropbox.refreshAccessToken()
|
||||
return dropbox.refreshAccessToken() // @ts-ignore
|
||||
.then(() => {
|
||||
return {
|
||||
token: dropbox.getAccessToken(),
|
||||
|
@ -125,6 +127,8 @@ export function getSpaceUsage(token: string, appKey: string) {
|
|||
|
||||
return dropboxAPI.usersGetSpaceUsage().then(space => {
|
||||
const { allocation, used } = space.result;
|
||||
|
||||
// @ts-ignore
|
||||
const { allocated } = allocation;
|
||||
|
||||
return {
|
||||
|
@ -141,8 +145,9 @@ export function getSpaceUsage(token: string, appKey: string) {
|
|||
* @param {Object} state - The redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isEnabled(state: Object) {
|
||||
export function isEnabled(state: IReduxState) {
|
||||
const { dropbox = {} } = state['features/base/config'];
|
||||
|
||||
// @ts-ignore
|
||||
return typeof dropbox.appKey === 'string';
|
||||
}
|
|
@ -1,5 +1,3 @@
|
|||
// @flow
|
||||
|
||||
import { getLogger } from '../base/logging/functions';
|
||||
|
||||
export default getLogger('features/dropbox');
|
|
@ -1,5 +1,3 @@
|
|||
// @flow
|
||||
|
||||
import {
|
||||
SET_FILMSTRIP_ENABLED,
|
||||
SET_FILMSTRIP_VISIBLE,
|
|
@ -1,12 +1,12 @@
|
|||
// @flow
|
||||
|
||||
// @ts-ignore
|
||||
import conferenceStyles from '../conference/components/native/styles';
|
||||
|
||||
import { SET_TILE_VIEW_DIMENSIONS } from './actionTypes';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { styles } from './components';
|
||||
import { SQUARE_TILE_ASPECT_RATIO, TILE_MARGIN } from './constants';
|
||||
import { getColumnCount } from './functions';
|
||||
import { getTileViewParticipantCount } from './functions.native';
|
||||
import { getColumnCount, getTileViewParticipantCount } from './functions.native';
|
||||
|
||||
export * from './actions.any';
|
||||
|
|
@ -1,14 +1,12 @@
|
|||
// @flow
|
||||
import type { Dispatch } from 'redux';
|
||||
|
||||
import { IStore } from '../app/types';
|
||||
import { pinParticipant } from '../base/participants/actions';
|
||||
import {
|
||||
getLocalParticipant,
|
||||
getParticipantById,
|
||||
getRemoteParticipantCount,
|
||||
pinParticipant
|
||||
} from '../base/participants';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.any';
|
||||
import { getMaxColumnCount } from '../video-layout';
|
||||
getRemoteParticipantCount
|
||||
} from '../base/participants/functions';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.web';
|
||||
import { getMaxColumnCount } from '../video-layout/functions.web';
|
||||
|
||||
import {
|
||||
ADD_STAGE_PARTICIPANT,
|
||||
|
@ -54,10 +52,9 @@ import {
|
|||
getNumberOfPartipantsForTileView,
|
||||
getVerticalViewMaxWidth,
|
||||
isFilmstripResizable,
|
||||
isStageFilmstripTopPanel,
|
||||
showGridInVerticalView
|
||||
} from './functions';
|
||||
import { isStageFilmstripAvailable } from './functions.web';
|
||||
isStageFilmstripAvailable,
|
||||
isStageFilmstripTopPanel
|
||||
, showGridInVerticalView } from './functions.web';
|
||||
|
||||
export * from './actions.any';
|
||||
|
||||
|
@ -71,7 +68,7 @@ export * from './actions.any';
|
|||
* width: number,
|
||||
* }}
|
||||
*/
|
||||
export function resizeFilmStrip(width) {
|
||||
export function resizeFilmStrip(width: number) {
|
||||
return {
|
||||
type: RESIZE_FILMSTRIP,
|
||||
width
|
||||
|
@ -84,7 +81,7 @@ export function resizeFilmStrip(width) {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function setTileViewDimensions() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
|
||||
const {
|
||||
|
@ -111,11 +108,12 @@ export function setTileViewDimensions() {
|
|||
numberOfParticipants,
|
||||
desiredNumberOfVisibleTiles: numberOfVisibleTiles
|
||||
});
|
||||
const thumbnailsTotalHeight = rows * (TILE_VERTICAL_MARGIN + height);
|
||||
const thumbnailsTotalHeight = (rows ?? 1) * (TILE_VERTICAL_MARGIN + (height ?? 0));
|
||||
const availableHeight = clientHeight - TILE_VIEW_GRID_VERTICAL_MARGIN;
|
||||
const hasScroll = availableHeight < thumbnailsTotalHeight;
|
||||
const filmstripWidth
|
||||
= Math.min(clientWidth - TILE_VIEW_GRID_HORIZONTAL_MARGIN, columns * (TILE_HORIZONTAL_MARGIN + width))
|
||||
= Math.min(clientWidth - TILE_VIEW_GRID_HORIZONTAL_MARGIN,
|
||||
(columns ?? 1) * (TILE_HORIZONTAL_MARGIN + (width ?? 0)))
|
||||
+ (hasScroll ? SCROLL_SIZE : 0);
|
||||
const filmstripHeight = Math.min(availableHeight, thumbnailsTotalHeight);
|
||||
|
||||
|
@ -144,7 +142,7 @@ export function setTileViewDimensions() {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function setVerticalViewDimensions() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { clientHeight = 0, clientWidth = 0 } = state['features/base/responsive-ui'];
|
||||
const { width: filmstripWidth } = state['features/filmstrip'];
|
||||
|
@ -155,7 +153,7 @@ export function setVerticalViewDimensions() {
|
|||
const { localScreenShare } = state['features/base/participants'];
|
||||
|
||||
let gridView = {};
|
||||
let thumbnails = {};
|
||||
let thumbnails: any = {};
|
||||
let filmstripDimensions = {};
|
||||
let hasScroll = false;
|
||||
let remoteVideosContainerWidth;
|
||||
|
@ -177,7 +175,7 @@ export function setVerticalViewDimensions() {
|
|||
columns,
|
||||
rows
|
||||
} = calculateResponsiveTileViewDimensions({
|
||||
clientWidth: filmstripWidth.current,
|
||||
clientWidth: filmstripWidth.current ?? 0,
|
||||
clientHeight,
|
||||
disableTileEnlargement: false,
|
||||
maxColumns,
|
||||
|
@ -185,10 +183,11 @@ export function setVerticalViewDimensions() {
|
|||
numberOfParticipants,
|
||||
desiredNumberOfVisibleTiles: numberOfVisibleTiles
|
||||
});
|
||||
const thumbnailsTotalHeight = rows * (TILE_VERTICAL_MARGIN + height);
|
||||
const thumbnailsTotalHeight = (rows ?? 1) * (TILE_VERTICAL_MARGIN + (height ?? 0));
|
||||
|
||||
hasScroll = clientHeight < thumbnailsTotalHeight;
|
||||
const widthOfFilmstrip = (columns * (TILE_HORIZONTAL_MARGIN + width)) + (hasScroll ? SCROLL_SIZE : 0);
|
||||
const widthOfFilmstrip = ((columns ?? 1) * (TILE_HORIZONTAL_MARGIN + (width ?? 0)))
|
||||
+ (hasScroll ? SCROLL_SIZE : 0);
|
||||
const filmstripHeight = Math.min(clientHeight - TILE_VIEW_GRID_VERTICAL_MARGIN, thumbnailsTotalHeight);
|
||||
|
||||
gridView = {
|
||||
|
@ -208,7 +207,8 @@ export function setVerticalViewDimensions() {
|
|||
width: widthOfFilmstrip
|
||||
};
|
||||
} else {
|
||||
thumbnails = calculateThumbnailSizeForVerticalView(clientWidth, filmstripWidth.current, resizableFilmstrip);
|
||||
thumbnails = calculateThumbnailSizeForVerticalView(clientWidth, filmstripWidth.current ?? 0,
|
||||
resizableFilmstrip);
|
||||
|
||||
remoteVideosContainerWidth
|
||||
= thumbnails?.local?.width + TILE_VERTICAL_CONTAINER_HORIZONTAL_MARGIN + SCROLL_SIZE;
|
||||
|
@ -252,7 +252,7 @@ export function setVerticalViewDimensions() {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function setHorizontalViewDimensions() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { clientHeight = 0, clientWidth = 0 } = state['features/base/responsive-ui'];
|
||||
const disableSelfView = shouldHideSelfView(state);
|
||||
|
@ -286,7 +286,7 @@ export function setHorizontalViewDimensions() {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function setStageFilmstripViewDimensions() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
|
||||
const {
|
||||
|
@ -316,13 +316,14 @@ export function setStageFilmstripViewDimensions() {
|
|||
maxColumns,
|
||||
noHorizontalContainerMargin: verticalWidth > 0,
|
||||
numberOfParticipants,
|
||||
numberOfVisibleTiles,
|
||||
desiredNumberOfVisibleTiles: numberOfVisibleTiles,
|
||||
minTileHeight: topPanel ? TILE_MIN_HEIGHT_SMALL : null
|
||||
});
|
||||
const thumbnailsTotalHeight = rows * (TILE_VERTICAL_MARGIN + height);
|
||||
const thumbnailsTotalHeight = (rows ?? 1) * (TILE_VERTICAL_MARGIN + (height ?? 0));
|
||||
const hasScroll = clientHeight < thumbnailsTotalHeight;
|
||||
const filmstripWidth
|
||||
= Math.min(clientWidth - TILE_VIEW_GRID_HORIZONTAL_MARGIN, columns * (TILE_HORIZONTAL_MARGIN + width))
|
||||
= Math.min(clientWidth - TILE_VIEW_GRID_HORIZONTAL_MARGIN,
|
||||
(columns ?? 1) * (TILE_HORIZONTAL_MARGIN + (width ?? 0)))
|
||||
+ (hasScroll ? SCROLL_SIZE : 0);
|
||||
const filmstripHeight = Math.min(clientHeight - TILE_VIEW_GRID_VERTICAL_MARGIN, thumbnailsTotalHeight);
|
||||
|
||||
|
@ -352,9 +353,9 @@ export function setStageFilmstripViewDimensions() {
|
|||
* @returns {Function}
|
||||
*/
|
||||
export function clickOnVideo(n: number) {
|
||||
return (dispatch: Function, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { id: localId } = getLocalParticipant(state);
|
||||
const { id: localId } = getLocalParticipant(state) ?? {};
|
||||
|
||||
// Use the list that correctly represents the current order of the participants as visible in the UI.
|
||||
const { remoteParticipants } = state['features/filmstrip'];
|
||||
|
@ -363,10 +364,10 @@ export function clickOnVideo(n: number) {
|
|||
if (participants.length - 1 < n) {
|
||||
return;
|
||||
}
|
||||
const { id, pinned } = getParticipantById(state, participants[n]);
|
||||
const { id, pinned } = getParticipantById(state, participants[n] ?? '') ?? {};
|
||||
|
||||
if (isStageFilmstripAvailable(state)) {
|
||||
dispatch(togglePinStageParticipant(id));
|
||||
dispatch(togglePinStageParticipant(id ?? ''));
|
||||
} else {
|
||||
dispatch(pinParticipant(pinned ? null : id));
|
||||
}
|
||||
|
@ -476,7 +477,7 @@ export function setUserIsResizing(resizing: boolean) {
|
|||
* @param {boolean?} pinned - Whether the participant is pinned or not.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function addStageParticipant(participantId, pinned = false) {
|
||||
export function addStageParticipant(participantId: string, pinned = false) {
|
||||
return {
|
||||
type: ADD_STAGE_PARTICIPANT,
|
||||
participantId,
|
||||
|
@ -490,7 +491,7 @@ export function addStageParticipant(participantId, pinned = false) {
|
|||
* @param {string} participantId - The Id of the participant to be removed.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function removeStageParticipant(participantId) {
|
||||
export function removeStageParticipant(participantId: string) {
|
||||
return {
|
||||
type: REMOVE_STAGE_PARTICIPANT,
|
||||
participantId
|
||||
|
@ -503,7 +504,7 @@ export function removeStageParticipant(participantId) {
|
|||
* @param {Array<Object>} queue - The new list.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function setStageParticipants(queue) {
|
||||
export function setStageParticipants(queue: Object[]) {
|
||||
return {
|
||||
type: SET_STAGE_PARTICIPANTS,
|
||||
queue
|
||||
|
@ -516,7 +517,7 @@ export function setStageParticipants(queue) {
|
|||
* @param {string} participantId - The id of the participant to be toggled.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function togglePinStageParticipant(participantId) {
|
||||
export function togglePinStageParticipant(participantId: string) {
|
||||
return {
|
||||
type: TOGGLE_PIN_STAGE_PARTICIPANT,
|
||||
participantId
|
||||
|
@ -540,7 +541,7 @@ export function clearStageParticipants() {
|
|||
* @returns {Object}
|
||||
*/
|
||||
export function setScreensharingTileDimensions() {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
const state = getState();
|
||||
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
|
||||
const { visible, topPanelHeight, topPanelVisible } = state['features/filmstrip'];
|
||||
|
@ -569,7 +570,7 @@ export function setScreensharingTileDimensions() {
|
|||
* @param {boolean} visible - Whether it should be visible or not.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function setTopPanelVisible(visible) {
|
||||
export function setTopPanelVisible(visible: boolean) {
|
||||
return {
|
||||
type: SET_TOP_PANEL_VISIBILITY,
|
||||
visible
|
||||
|
@ -582,7 +583,7 @@ export function setTopPanelVisible(visible) {
|
|||
* @param {string|undefined} participantId - The id of the participant to be set.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function setScreenshareFilmstripParticipant(participantId) {
|
||||
export function setScreenshareFilmstripParticipant(participantId?: string) {
|
||||
return {
|
||||
type: SET_SCREENSHARE_FILMSTRIP_PARTICIPANT,
|
||||
participantId
|
|
@ -16,7 +16,7 @@ import Icon from '../../../base/icons/components/Icon';
|
|||
import { IconArrowDown, IconArrowUp } from '../../../base/icons/svg';
|
||||
import { IParticipant } from '../../../base/participants/types';
|
||||
import { connect } from '../../../base/redux/functions';
|
||||
import { shouldHideSelfView } from '../../../base/settings/functions.any';
|
||||
import { shouldHideSelfView } from '../../../base/settings/functions.web';
|
||||
// @ts-ignore
|
||||
import { showToolbox } from '../../../toolbox/actions.web';
|
||||
import { isButtonEnabled, isToolboxVisible } from '../../../toolbox/functions.web';
|
||||
|
|
|
@ -57,7 +57,7 @@ const PinnedIndicator = ({
|
|||
}: IProps) => {
|
||||
const stageFilmstrip = useSelector(isStageFilmstripAvailable);
|
||||
const pinned = useSelector((state: IReduxState) => getParticipantById(state, participantId))?.pinned;
|
||||
const activePinnedParticipants: Array<{ participantId: string; pinned: boolean; }>
|
||||
const activePinnedParticipants: Array<{ participantId: string; pinned?: boolean; }>
|
||||
= useSelector(getPinnedActiveParticipants);
|
||||
const isPinned = activePinnedParticipants.find(p => p.participantId === participantId);
|
||||
const { classes: styles } = useStyles();
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
import { getActiveSpeakersToBeDisplayed, getVirtualScreenshareParticipantOwnerId } from '../base/participants';
|
||||
import { IStore } from '../app/types';
|
||||
import {
|
||||
getActiveSpeakersToBeDisplayed,
|
||||
getVirtualScreenshareParticipantOwnerId
|
||||
} from '../base/participants/functions';
|
||||
|
||||
import { setRemoteParticipants } from './actions';
|
||||
import { isFilmstripScrollVisible } from './functions';
|
||||
|
@ -11,7 +15,7 @@ import { isFilmstripScrollVisible } from './functions';
|
|||
* @returns {void}
|
||||
* @private
|
||||
*/
|
||||
export function updateRemoteParticipants(store: Object, participantId: ?number) {
|
||||
export function updateRemoteParticipants(store: IStore, participantId?: string) {
|
||||
const state = store.getState();
|
||||
let reorderedParticipants = [];
|
||||
const { sortedRemoteVirtualScreenshareParticipants } = state['features/base/participants'];
|
||||
|
@ -53,7 +57,7 @@ export function updateRemoteParticipants(store: Object, participantId: ?number)
|
|||
}
|
||||
|
||||
// Always update the order of the thumnails.
|
||||
const participantsWithScreenShare = screenShareParticipants.reduce((acc, screenshare) => {
|
||||
const participantsWithScreenShare = screenShareParticipants.reduce<string[]>((acc, screenshare) => {
|
||||
const ownerId = getVirtualScreenshareParticipantOwnerId(screenshare);
|
||||
|
||||
acc.push(ownerId);
|
||||
|
@ -80,7 +84,7 @@ export function updateRemoteParticipants(store: Object, participantId: ?number)
|
|||
* @returns {void}
|
||||
* @private
|
||||
*/
|
||||
export function updateRemoteParticipantsOnLeave(store: Object, participantId: ?string = null) {
|
||||
export function updateRemoteParticipantsOnLeave(store: IStore, participantId: string | null = null) {
|
||||
if (!participantId) {
|
||||
return;
|
||||
}
|
|
@ -1,18 +1,22 @@
|
|||
// @flow
|
||||
|
||||
import { FILMSTRIP_ENABLED, getFeatureFlag } from '../base/flags';
|
||||
import { IReduxState } from '../app/types';
|
||||
import { IStateful } from '../base/app/types';
|
||||
import { FILMSTRIP_ENABLED } from '../base/flags/constants';
|
||||
import { getFeatureFlag } from '../base/flags/functions';
|
||||
import {
|
||||
getLocalParticipant,
|
||||
getParticipantCountWithFake,
|
||||
getPinnedParticipant
|
||||
} from '../base/participants';
|
||||
import { Platform } from '../base/react';
|
||||
import { toState } from '../base/redux';
|
||||
} from '../base/participants/functions';
|
||||
import Platform from '../base/react/Platform.native';
|
||||
import { toState } from '../base/redux/functions';
|
||||
import { ASPECT_RATIO_NARROW } from '../base/responsive-ui/constants';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.any';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.native';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import conferenceStyles from '../conference/components/native/styles';
|
||||
import { shouldDisplayTileView } from '../video-layout';
|
||||
import { shouldDisplayTileView } from '../video-layout/functions.native';
|
||||
|
||||
// @ts-ignore
|
||||
import { styles } from './components';
|
||||
|
||||
export * from './functions.any';
|
||||
|
@ -27,7 +31,7 @@ export * from './functions.any';
|
|||
* resolved to a Redux state object with the toState function.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isFilmstripVisible(stateful: Object | Function) {
|
||||
export function isFilmstripVisible(stateful: IStateful) {
|
||||
const state = toState(stateful);
|
||||
|
||||
const enabled = getFeatureFlag(state, FILMSTRIP_ENABLED, true);
|
||||
|
@ -47,7 +51,7 @@ export function isFilmstripVisible(stateful: Object | Function) {
|
|||
* @returns {boolean} - If remote video thumbnails should be displayed/visible
|
||||
* in the filmstrip, then {@code true}; otherwise, {@code false}.
|
||||
*/
|
||||
export function shouldRemoteVideosBeVisible(state: Object) {
|
||||
export function shouldRemoteVideosBeVisible(state: IReduxState) {
|
||||
if (state['features/invite'].calleeInfoVisible) {
|
||||
return false;
|
||||
}
|
||||
|
@ -74,9 +78,10 @@ export function shouldRemoteVideosBeVisible(state: Object) {
|
|||
/**
|
||||
* Not implemented on mobile.
|
||||
*
|
||||
* @param {any} _state - Used on web.
|
||||
* @returns {Array<string>}
|
||||
*/
|
||||
export function getActiveParticipantsIds() {
|
||||
export function getActiveParticipantsIds(_state: any) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
@ -87,7 +92,7 @@ export function getActiveParticipantsIds() {
|
|||
* resolved to a Redux state object with the toState function.
|
||||
* @returns {number} - The number of participants displayed in tile view.
|
||||
*/
|
||||
export function getTileViewParticipantCount(stateful: Object | Function) {
|
||||
export function getTileViewParticipantCount(stateful: IStateful) {
|
||||
const state = toState(stateful);
|
||||
const disableSelfView = shouldHideSelfView(state);
|
||||
const localParticipant = getLocalParticipant(state);
|
||||
|
@ -104,7 +109,7 @@ export function getTileViewParticipantCount(stateful: Object | Function) {
|
|||
* @returns {number} - The number of columns to be rendered in tile view.
|
||||
* @private
|
||||
*/
|
||||
export function getColumnCount(stateful: Object | Function) {
|
||||
export function getColumnCount(stateful: IStateful) {
|
||||
const state = toState(stateful);
|
||||
const participantCount = getTileViewParticipantCount(state);
|
||||
const { aspectRatio } = state['features/base/responsive-ui'];
|
||||
|
@ -130,7 +135,7 @@ export function getColumnCount(stateful: Object | Function) {
|
|||
* @param {Object} state - The redux state.
|
||||
* @returns {boolean} - True if the scroll is displayed and false otherwise.
|
||||
*/
|
||||
export function isFilmstripScrollVisible(state) {
|
||||
export function isFilmstripScrollVisible(state: IReduxState) {
|
||||
if (shouldDisplayTileView(state)) {
|
||||
return state['features/filmstrip']?.tileViewDimensions?.hasScroll;
|
||||
}
|
||||
|
@ -162,28 +167,31 @@ export function isFilmstripScrollVisible(state) {
|
|||
/**
|
||||
* Whether the stage filmstrip is available or not.
|
||||
*
|
||||
* @param {Object} state - Redux state.
|
||||
* @param {any} _state - Used on web.
|
||||
* @param {any} _count - Used on web.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isStageFilmstripAvailable() {
|
||||
export function isStageFilmstripAvailable(_state: any, _count?: any) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the stage filmstrip is enabled.
|
||||
*
|
||||
* @param {any} _state - Used on web.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isStageFilmstripEnabled() {
|
||||
export function isStageFilmstripEnabled(_state: any) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the top panel is enabled.
|
||||
*
|
||||
* @param {any} _state - Used on web.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isTopPanelEnabled() {
|
||||
export function isTopPanelEnabled(_state: any) {
|
||||
return false;
|
||||
|
||||
}
|
||||
|
@ -200,6 +208,17 @@ export function getFilmstripDimensions({
|
|||
clientHeight,
|
||||
insets = {},
|
||||
localParticipantVisible = true
|
||||
}: {
|
||||
aspectRatio: Symbol;
|
||||
clientHeight: number;
|
||||
clientWidth: number;
|
||||
insets: {
|
||||
bottom?: number;
|
||||
left?: number;
|
||||
right?: number;
|
||||
top?: number;
|
||||
};
|
||||
localParticipantVisible?: boolean;
|
||||
}) {
|
||||
const { height, width, margin } = styles.thumbnail;
|
||||
const conferenceBorder = conferenceStyles.conference.borderWidth || 0;
|
||||
|
@ -254,9 +273,10 @@ export function shouldDisplayLocalThumbnailSeparately() {
|
|||
/**
|
||||
* Not implemented on mobile.
|
||||
*
|
||||
* @param {any} _state - Used on web.
|
||||
* @returns {undefined}
|
||||
*/
|
||||
export function getScreenshareFilmstripParticipantId() {
|
||||
export function getScreenshareFilmstripParticipantId(_state: any) {
|
||||
return undefined;
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
// @flow
|
||||
|
||||
import { IReduxState } from '../app/types';
|
||||
import { IStateful } from '../base/app/types';
|
||||
import { isMobileBrowser } from '../base/environment/utils';
|
||||
import { MEDIA_TYPE } from '../base/media';
|
||||
import { MEDIA_TYPE } from '../base/media/constants';
|
||||
import {
|
||||
getLocalParticipant,
|
||||
getParticipantById,
|
||||
|
@ -9,9 +9,9 @@ import {
|
|||
getParticipantCountWithFake,
|
||||
getPinnedParticipant,
|
||||
isScreenShareParticipant
|
||||
} from '../base/participants';
|
||||
import { toState } from '../base/redux';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.any';
|
||||
} from '../base/participants/functions';
|
||||
import { toState } from '../base/redux/functions';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.web';
|
||||
import {
|
||||
getVideoTrackByParticipant,
|
||||
isLocalTrackMuted,
|
||||
|
@ -19,11 +19,8 @@ import {
|
|||
} from '../base/tracks/functions';
|
||||
import { isTrackStreamingStatusActive } from '../connection-indicator/functions';
|
||||
import { isSharingStatus } from '../shared-video/functions';
|
||||
import {
|
||||
LAYOUTS,
|
||||
getCurrentLayout,
|
||||
getNotResponsiveTileViewGridDimensions
|
||||
} from '../video-layout';
|
||||
import { LAYOUTS } from '../video-layout/constants';
|
||||
import { getCurrentLayout, getNotResponsiveTileViewGridDimensions } from '../video-layout/functions.web';
|
||||
|
||||
import {
|
||||
ASPECT_RATIO_BREAKPOINT,
|
||||
|
@ -51,8 +48,6 @@ import {
|
|||
|
||||
export * from './functions.any';
|
||||
|
||||
declare var interfaceConfig: Object;
|
||||
|
||||
/**
|
||||
* Returns true if the filmstrip on mobile is visible, false otherwise.
|
||||
*
|
||||
|
@ -60,11 +55,11 @@ declare var interfaceConfig: Object;
|
|||
* function lies here only for the sake of consistency and to avoid flow errors
|
||||
* on import.
|
||||
*
|
||||
* @param {Object | Function} stateful - The Object or Function that can be
|
||||
* @param {IStateful} stateful - The Object or Function that can be
|
||||
* resolved to a Redux state object with the toState function.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isFilmstripVisible(stateful: Object | Function) {
|
||||
export function isFilmstripVisible(stateful: IStateful) {
|
||||
return toState(stateful)['features/filmstrip'].visible;
|
||||
}
|
||||
|
||||
|
@ -72,11 +67,11 @@ export function isFilmstripVisible(stateful: Object | Function) {
|
|||
* Determines whether the remote video thumbnails should be displayed/visible in
|
||||
* the filmstrip.
|
||||
*
|
||||
* @param {Object} state - The full redux state.
|
||||
* @param {IReduxState} state - The full redux state.
|
||||
* @returns {boolean} - If remote video thumbnails should be displayed/visible
|
||||
* in the filmstrip, then {@code true}; otherwise, {@code false}.
|
||||
*/
|
||||
export function shouldRemoteVideosBeVisible(state: Object) {
|
||||
export function shouldRemoteVideosBeVisible(state: IReduxState) {
|
||||
if (state['features/invite'].calleeInfoVisible) {
|
||||
return false;
|
||||
}
|
||||
|
@ -107,13 +102,13 @@ export function shouldRemoteVideosBeVisible(state: Object) {
|
|||
/**
|
||||
* Checks whether there is a playable video stream available for the user associated with the passed ID.
|
||||
*
|
||||
* @param {Object | Function} stateful - The Object or Function that can be
|
||||
* @param {IStateful} stateful - The Object or Function that can be
|
||||
* resolved to a Redux state object with the toState function.
|
||||
* @param {string} id - The id of the participant.
|
||||
* @returns {boolean} <tt>true</tt> if there is a playable video stream available
|
||||
* or <tt>false</tt> otherwise.
|
||||
*/
|
||||
export function isVideoPlayable(stateful: Object | Function, id: String) {
|
||||
export function isVideoPlayable(stateful: IStateful, id: string) {
|
||||
const state = toState(stateful);
|
||||
const tracks = state['features/base/tracks'];
|
||||
const participant = id ? getParticipantById(state, id) : getLocalParticipant(state);
|
||||
|
@ -142,7 +137,7 @@ export function isVideoPlayable(stateful: Object | Function, id: String) {
|
|||
* @param {number} clientHeight - The height of the app window.
|
||||
* @returns {{local: {height, width}, remote: {height, width}}}
|
||||
*/
|
||||
export function calculateThumbnailSizeForHorizontalView(clientHeight: number = 0) {
|
||||
export function calculateThumbnailSizeForHorizontalView(clientHeight = 0) {
|
||||
const topBottomMargin = 15;
|
||||
const availableHeight = Math.min(clientHeight,
|
||||
(interfaceConfig.FILM_STRIP_MAX_HEIGHT || DEFAULT_FILMSTRIP_WIDTH) + topBottomMargin);
|
||||
|
@ -168,8 +163,7 @@ export function calculateThumbnailSizeForHorizontalView(clientHeight: number = 0
|
|||
* @param {boolean} isResizable - Whether the filmstrip is resizable or not.
|
||||
* @returns {{local: {height, width}, remote: {height, width}}}
|
||||
*/
|
||||
export function calculateThumbnailSizeForVerticalView(clientWidth: number = 0,
|
||||
filmstripWidth: number = 0, isResizable = false) {
|
||||
export function calculateThumbnailSizeForVerticalView(clientWidth = 0, filmstripWidth = 0, isResizable = false) {
|
||||
const availableWidth = Math.min(
|
||||
Math.max(clientWidth - VERTICAL_VIEW_HORIZONTAL_MARGIN, 0),
|
||||
(isResizable ? filmstripWidth : interfaceConfig.FILM_STRIP_MAX_HEIGHT) || DEFAULT_FILMSTRIP_WIDTH);
|
||||
|
@ -195,7 +189,7 @@ export function calculateThumbnailSizeForVerticalView(clientWidth: number = 0,
|
|||
* @param {number} clientWidth - The width of the window.
|
||||
* @returns {number} The minimum height of a thumbnail.
|
||||
*/
|
||||
export function getThumbnailMinHeight(clientWidth) {
|
||||
export function getThumbnailMinHeight(clientWidth: number) {
|
||||
return clientWidth < ASPECT_RATIO_BREAKPOINT ? TILE_MIN_HEIGHT_SMALL : TILE_MIN_HEIGHT_LARGE;
|
||||
}
|
||||
|
||||
|
@ -207,7 +201,8 @@ export function getThumbnailMinHeight(clientWidth) {
|
|||
* @param {number} clientWidth - The width of the window.
|
||||
* @returns {number} The default aspect ratio for a tile.
|
||||
*/
|
||||
export function getTileDefaultAspectRatio(disableResponsiveTiles, disableTileEnlargement, clientWidth) {
|
||||
export function getTileDefaultAspectRatio(disableResponsiveTiles: boolean,
|
||||
disableTileEnlargement: boolean, clientWidth: number) {
|
||||
if (!disableResponsiveTiles && disableTileEnlargement && clientWidth < ASPECT_RATIO_BREAKPOINT) {
|
||||
return SQUARE_TILE_ASPECT_RATIO;
|
||||
}
|
||||
|
@ -221,7 +216,7 @@ export function getTileDefaultAspectRatio(disableResponsiveTiles, disableTileEnl
|
|||
* @param {Object} state - The redux store state.
|
||||
* @returns {number} The number of participants that will be displayed in tile view.
|
||||
*/
|
||||
export function getNumberOfPartipantsForTileView(state) {
|
||||
export function getNumberOfPartipantsForTileView(state: IReduxState) {
|
||||
const { iAmRecorder } = state['features/base/config'];
|
||||
const disableSelfView = shouldHideSelfView(state);
|
||||
const { localScreenShare } = state['features/base/participants'];
|
||||
|
@ -240,7 +235,7 @@ export function getNumberOfPartipantsForTileView(state) {
|
|||
* @param {Object} state - The redux store state.
|
||||
* @returns {Object} - The dimensions.
|
||||
*/
|
||||
export function calculateNonResponsiveTileViewDimensions(state) {
|
||||
export function calculateNonResponsiveTileViewDimensions(state: IReduxState) {
|
||||
const { clientHeight, clientWidth } = state['features/base/responsive-ui'];
|
||||
const { disableTileEnlargement } = state['features/base/config'];
|
||||
const { columns: c, minVisibleRows, rows: r } = getNotResponsiveTileViewGridDimensions(state);
|
||||
|
@ -292,16 +287,35 @@ export function calculateResponsiveTileViewDimensions({
|
|||
numberOfParticipants,
|
||||
desiredNumberOfVisibleTiles = TILE_VIEW_DEFAULT_NUMBER_OF_VISIBLE_TILES,
|
||||
minTileHeight
|
||||
}: {
|
||||
clientHeight: number;
|
||||
clientWidth: number;
|
||||
desiredNumberOfVisibleTiles: number;
|
||||
disableTileEnlargement?: boolean;
|
||||
maxColumns: number;
|
||||
minTileHeight?: number | null;
|
||||
noHorizontalContainerMargin?: boolean;
|
||||
numberOfParticipants: number;
|
||||
}) {
|
||||
let height, width;
|
||||
let columns, rows;
|
||||
let dimensions = {
|
||||
|
||||
interface IDimensions {
|
||||
columns?: number;
|
||||
height?: number;
|
||||
maxArea: number;
|
||||
numberOfVisibleParticipants?: number;
|
||||
rows?: number;
|
||||
width?: number;
|
||||
}
|
||||
|
||||
let dimensions: IDimensions = {
|
||||
maxArea: 0
|
||||
};
|
||||
let minHeightEnforcedDimensions = {
|
||||
let minHeightEnforcedDimensions: IDimensions = {
|
||||
maxArea: 0
|
||||
};
|
||||
let zeroVisibleRowsDimensions = {
|
||||
let zeroVisibleRowsDimensions: IDimensions = {
|
||||
maxArea: 0
|
||||
};
|
||||
|
||||
|
@ -411,7 +425,16 @@ export function calculateThumbnailSizeForTileView({
|
|||
disableTileEnlargement = false,
|
||||
noHorizontalContainerMargin = false,
|
||||
minTileHeight
|
||||
}: Object) {
|
||||
}: {
|
||||
clientHeight: number;
|
||||
clientWidth: number;
|
||||
columns: number;
|
||||
disableResponsiveTiles: boolean;
|
||||
disableTileEnlargement?: boolean;
|
||||
minTileHeight?: number | null;
|
||||
minVisibleRows: number;
|
||||
noHorizontalContainerMargin?: boolean;
|
||||
}) {
|
||||
const aspectRatio = getTileDefaultAspectRatio(disableResponsiveTiles, disableTileEnlargement, clientWidth);
|
||||
const minHeight = minTileHeight || getThumbnailMinHeight(clientWidth);
|
||||
const viewWidth = clientWidth - (columns * TILE_HORIZONTAL_MARGIN)
|
||||
|
@ -501,7 +524,7 @@ export function getVerticalFilmstripVisibleAreaWidth() {
|
|||
* the thumbnail.
|
||||
* @returns {number} - One of <tt>DISPLAY_VIDEO</tt> or <tt>DISPLAY_AVATAR</tt>.
|
||||
*/
|
||||
export function computeDisplayModeFromInput(input: Object) {
|
||||
export function computeDisplayModeFromInput(input: any) {
|
||||
const {
|
||||
filmstripType,
|
||||
isActiveParticipant,
|
||||
|
@ -550,7 +573,7 @@ export function computeDisplayModeFromInput(input: Object) {
|
|||
* @param {Object} state - The Thumbnail component's state.
|
||||
* @returns {Object}
|
||||
*/
|
||||
export function getDisplayModeInput(props: Object, state: Object) {
|
||||
export function getDisplayModeInput(props: any, state: { canPlayEventReceived: boolean; }) {
|
||||
const {
|
||||
_currentLayout,
|
||||
_isActiveParticipant,
|
||||
|
@ -600,7 +623,7 @@ export function getIndicatorsTooltipPosition(thumbnailType: string) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isFilmstripResizable(state: Object) {
|
||||
export function isFilmstripResizable(state: IReduxState) {
|
||||
const { filmstrip } = state['features/base/config'];
|
||||
const _currentLayout = getCurrentLayout(state);
|
||||
|
||||
|
@ -614,7 +637,7 @@ export function isFilmstripResizable(state: Object) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function showGridInVerticalView(state) {
|
||||
export function showGridInVerticalView(state: IReduxState) {
|
||||
const resizableFilmstrip = isFilmstripResizable(state);
|
||||
const { width } = state['features/filmstrip'];
|
||||
|
||||
|
@ -627,7 +650,7 @@ export function showGridInVerticalView(state) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getVerticalViewMaxWidth(state) {
|
||||
export function getVerticalViewMaxWidth(state: IReduxState) {
|
||||
const { width } = state['features/filmstrip'];
|
||||
const _resizableFilmstrip = isFilmstripResizable(state);
|
||||
const _verticalViewGrid = showGridInVerticalView(state);
|
||||
|
@ -649,13 +672,13 @@ export function getVerticalViewMaxWidth(state) {
|
|||
* @param {Object} state - The redux state.
|
||||
* @returns {boolean} - True if the scroll is displayed and false otherwise.
|
||||
*/
|
||||
export function isFilmstripScrollVisible(state) {
|
||||
export function isFilmstripScrollVisible(state: IReduxState) {
|
||||
const _currentLayout = getCurrentLayout(state);
|
||||
let hasScroll = false;
|
||||
|
||||
switch (_currentLayout) {
|
||||
case LAYOUTS.TILE_VIEW:
|
||||
({ hasScroll = false } = state['features/filmstrip'].tileViewDimensions);
|
||||
({ hasScroll = false } = state['features/filmstrip'].tileViewDimensions ?? {});
|
||||
break;
|
||||
case LAYOUTS.VERTICAL_FILMSTRIP_VIEW:
|
||||
case LAYOUTS.STAGE_FILMSTRIP_VIEW: {
|
||||
|
@ -677,7 +700,7 @@ export function isFilmstripScrollVisible(state) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {Array<string>}
|
||||
*/
|
||||
export function getActiveParticipantsIds(state) {
|
||||
export function getActiveParticipantsIds(state: IReduxState) {
|
||||
const { activeParticipants } = state['features/filmstrip'];
|
||||
|
||||
return activeParticipants.map(p => p.participantId);
|
||||
|
@ -689,7 +712,7 @@ export function getActiveParticipantsIds(state) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {Array<Object>}
|
||||
*/
|
||||
export function getPinnedActiveParticipants(state) {
|
||||
export function getPinnedActiveParticipants(state: IReduxState) {
|
||||
const { activeParticipants } = state['features/filmstrip'];
|
||||
|
||||
return activeParticipants.filter(p => p.pinned);
|
||||
|
@ -703,10 +726,10 @@ export function getPinnedActiveParticipants(state) {
|
|||
* to be displayed.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isStageFilmstripAvailable(state, minParticipantCount = 0) {
|
||||
export function isStageFilmstripAvailable(state: IReduxState, minParticipantCount = 0) {
|
||||
const { activeParticipants } = state['features/filmstrip'];
|
||||
const { remoteScreenShares } = state['features/video-layout'];
|
||||
const sharedVideo = isSharingStatus(state['features/shared-video']?.status);
|
||||
const sharedVideo = isSharingStatus(state['features/shared-video']?.status ?? '');
|
||||
|
||||
return isStageFilmstripEnabled(state) && !sharedVideo
|
||||
&& activeParticipants.length >= minParticipantCount
|
||||
|
@ -721,7 +744,7 @@ export function isStageFilmstripAvailable(state, minParticipantCount = 0) {
|
|||
* to be displayed.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isStageFilmstripTopPanel(state, minParticipantCount = 0) {
|
||||
export function isStageFilmstripTopPanel(state: IReduxState, minParticipantCount = 0) {
|
||||
const { remoteScreenShares } = state['features/video-layout'];
|
||||
|
||||
return isTopPanelEnabled(state)
|
||||
|
@ -734,7 +757,7 @@ export function isStageFilmstripTopPanel(state, minParticipantCount = 0) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isStageFilmstripEnabled(state) {
|
||||
export function isStageFilmstripEnabled(state: IReduxState) {
|
||||
const { filmstrip } = state['features/base/config'];
|
||||
|
||||
return !filmstrip?.disableStageFilmstrip && interfaceConfig.VERTICAL_FILMSTRIP;
|
||||
|
@ -747,7 +770,7 @@ export function isStageFilmstripEnabled(state) {
|
|||
* @param {string} filmstripType - The current filmstrip type.
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getThumbnailTypeFromLayout(currentLayout, filmstripType) {
|
||||
export function getThumbnailTypeFromLayout(currentLayout: string, filmstripType: string) {
|
||||
switch (currentLayout) {
|
||||
case LAYOUTS.TILE_VIEW:
|
||||
return THUMBNAIL_TYPE.TILE;
|
||||
|
@ -770,7 +793,7 @@ export function getThumbnailTypeFromLayout(currentLayout, filmstripType) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {string} - The participant id.
|
||||
*/
|
||||
export function getScreenshareFilmstripParticipantId(state) {
|
||||
export function getScreenshareFilmstripParticipantId(state: IReduxState) {
|
||||
const { screenshareFilmstripParticipantId } = state['features/filmstrip'];
|
||||
const screenshares = state['features/video-layout'].remoteScreenShares;
|
||||
let id = screenshares.find(sId => sId === screenshareFilmstripParticipantId);
|
||||
|
@ -788,7 +811,7 @@ export function getScreenshareFilmstripParticipantId(state) {
|
|||
* @param {Object} state - Redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isTopPanelEnabled(state) {
|
||||
export function isTopPanelEnabled(state: IReduxState) {
|
||||
const { filmstrip } = state['features/base/config'];
|
||||
const participantsCount = getParticipantCount(state);
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
// @flow
|
||||
|
||||
import { getLogger } from '../base/logging/functions';
|
||||
|
||||
export default getLogger('features/filmstrip');
|
|
@ -1,12 +1,10 @@
|
|||
// @flow
|
||||
import { PARTICIPANT_JOINED, PARTICIPANT_LEFT } from '../base/participants/actionTypes';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import { CLIENT_RESIZED, SAFE_AREA_INSETS_CHANGED, SET_ASPECT_RATIO } from '../base/responsive-ui/actionTypes';
|
||||
|
||||
import { PARTICIPANT_JOINED, PARTICIPANT_LEFT } from '../base/participants';
|
||||
import { MiddlewareRegistry } from '../base/redux';
|
||||
import { CLIENT_RESIZED, SAFE_AREA_INSETS_CHANGED, SET_ASPECT_RATIO } from '../base/responsive-ui';
|
||||
|
||||
import { setTileViewDimensions } from './actions';
|
||||
import { updateRemoteParticipants, updateRemoteParticipantsOnLeave } from './functions';
|
||||
import './subscriber';
|
||||
import { setTileViewDimensions } from './actions.native';
|
||||
import { updateRemoteParticipants, updateRemoteParticipantsOnLeave } from './functions.native';
|
||||
import './subscriber.native';
|
||||
|
||||
/**
|
||||
* The middleware of the feature Filmstrip.
|
|
@ -1,25 +1,24 @@
|
|||
// @flow
|
||||
|
||||
import { batch } from 'react-redux';
|
||||
|
||||
// @ts-expect-error
|
||||
import VideoLayout from '../../../modules/UI/videolayout/VideoLayout';
|
||||
import {
|
||||
DOMINANT_SPEAKER_CHANGED,
|
||||
PARTICIPANT_JOINED,
|
||||
PARTICIPANT_LEFT,
|
||||
PARTICIPANT_LEFT
|
||||
} from '../base/participants/actionTypes';
|
||||
import {
|
||||
getDominantSpeakerParticipant,
|
||||
getLocalParticipant,
|
||||
getLocalScreenShareParticipant,
|
||||
isScreenShareParticipant
|
||||
} from '../base/participants';
|
||||
import { MiddlewareRegistry } from '../base/redux';
|
||||
import { CLIENT_RESIZED } from '../base/responsive-ui';
|
||||
import { SETTINGS_UPDATED } from '../base/settings';
|
||||
import {
|
||||
LAYOUTS,
|
||||
getCurrentLayout,
|
||||
setTileView
|
||||
} from '../video-layout';
|
||||
} from '../base/participants/functions';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import { CLIENT_RESIZED } from '../base/responsive-ui/actionTypes';
|
||||
import { SETTINGS_UPDATED } from '../base/settings/actionTypes';
|
||||
import { setTileView } from '../video-layout/actions.web';
|
||||
import { LAYOUTS } from '../video-layout/constants';
|
||||
import { getCurrentLayout } from '../video-layout/functions.web';
|
||||
|
||||
import {
|
||||
ADD_STAGE_PARTICIPANT,
|
||||
|
@ -54,7 +53,7 @@ import {
|
|||
updateRemoteParticipants,
|
||||
updateRemoteParticipantsOnLeave
|
||||
} from './functions.web';
|
||||
import './subscriber';
|
||||
import './subscriber.web';
|
||||
|
||||
/**
|
||||
* Map of timers.
|
||||
|
@ -87,19 +86,19 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
const { clientWidth, clientHeight } = action;
|
||||
let height, width;
|
||||
|
||||
if (filmstripWidth.current > clientWidth - MIN_STAGE_VIEW_WIDTH) {
|
||||
if ((filmstripWidth.current ?? 0) > clientWidth - MIN_STAGE_VIEW_WIDTH) {
|
||||
width = Math.max(clientWidth - MIN_STAGE_VIEW_WIDTH, DEFAULT_FILMSTRIP_WIDTH);
|
||||
} else {
|
||||
width = Math.min(clientWidth - MIN_STAGE_VIEW_WIDTH, filmstripWidth.userSet);
|
||||
width = Math.min(clientWidth - MIN_STAGE_VIEW_WIDTH, filmstripWidth.userSet ?? 0);
|
||||
}
|
||||
if (width !== filmstripWidth.current) {
|
||||
store.dispatch(setFilmstripWidth(width));
|
||||
}
|
||||
|
||||
if (topPanelHeight.current > clientHeight - MIN_STAGE_VIEW_HEIGHT) {
|
||||
if ((topPanelHeight.current ?? 0) > clientHeight - MIN_STAGE_VIEW_HEIGHT) {
|
||||
height = Math.max(clientHeight - MIN_STAGE_VIEW_HEIGHT, TOP_FILMSTRIP_HEIGHT);
|
||||
} else {
|
||||
height = Math.min(clientHeight - MIN_STAGE_VIEW_HEIGHT, topPanelHeight.userSet);
|
||||
height = Math.min(clientHeight - MIN_STAGE_VIEW_HEIGHT, topPanelHeight.userSet ?? 0);
|
||||
}
|
||||
if (height !== topPanelHeight.current) {
|
||||
store.dispatch(setFilmstripHeight(height));
|
||||
|
@ -127,8 +126,8 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
const localScreenShare = getLocalScreenShareParticipant(state);
|
||||
const activeParticipantsIds = getActiveParticipantsIds(state);
|
||||
|
||||
if (activeParticipantsIds.find(id => id === local.id)) {
|
||||
store.dispatch(removeStageParticipant(local.id));
|
||||
if (activeParticipantsIds.find(id => id === local?.id)) {
|
||||
store.dispatch(removeStageParticipant(local?.id ?? ''));
|
||||
}
|
||||
|
||||
if (localScreenShare) {
|
||||
|
@ -181,7 +180,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
|
||||
clearTimeout(tid);
|
||||
timers.delete(participantId);
|
||||
} else if (activeParticipants.length < maxStageParticipants) {
|
||||
} else if (activeParticipants.length < (maxStageParticipants ?? 0)) {
|
||||
queue = [ ...activeParticipants, {
|
||||
participantId,
|
||||
pinned
|
||||
|
@ -252,7 +251,7 @@ MiddlewareRegistry.register(store => next => action => {
|
|||
const currentLayout = getCurrentLayout(state);
|
||||
const dominantSpeaker = getDominantSpeakerParticipant(state);
|
||||
|
||||
if (dominantSpeaker?.id === id || id === local.id || currentLayout === LAYOUTS.TILE_VIEW) {
|
||||
if (dominantSpeaker?.id === id || id === local?.id || currentLayout === LAYOUTS.TILE_VIEW) {
|
||||
break;
|
||||
}
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
// @flow
|
||||
|
||||
import { StateListenerRegistry } from '../base/redux';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
|
||||
import { isFilmstripScrollVisible, updateRemoteParticipants } from './functions';
|
||||
|
|
@ -1,10 +1,8 @@
|
|||
// @flow
|
||||
|
||||
import { getCurrentConference } from '../base/conference/functions';
|
||||
import { StateListenerRegistry } from '../base/redux';
|
||||
import { shouldDisplayTileView } from '../video-layout';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
import { shouldDisplayTileView } from '../video-layout/functions.native';
|
||||
|
||||
import { setRemoteParticipants, setTileViewDimensions } from './actions';
|
||||
import { setRemoteParticipants, setTileViewDimensions } from './actions.native';
|
||||
import { getTileViewParticipantCount } from './functions.native';
|
||||
import './subscriber.any';
|
||||
|
|
@ -1,18 +1,19 @@
|
|||
// @flow
|
||||
|
||||
import { isMobileBrowser } from '../base/environment/utils';
|
||||
import { getParticipantCountWithFake, pinParticipant } from '../base/participants';
|
||||
import { StateListenerRegistry } from '../base/redux';
|
||||
import { clientResized } from '../base/responsive-ui';
|
||||
import { shouldHideSelfView } from '../base/settings';
|
||||
import { setFilmstripVisible } from '../filmstrip/actions';
|
||||
import { pinParticipant } from '../base/participants/actions';
|
||||
import { getParticipantCountWithFake } from '../base/participants/functions';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
import { clientResized } from '../base/responsive-ui/actions';
|
||||
import { shouldHideSelfView } from '../base/settings/functions.web';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { selectParticipantInLargeVideo } from '../large-video/actions.any';
|
||||
import { getParticipantsPaneOpen } from '../participants-pane/functions';
|
||||
import { setOverflowDrawer } from '../toolbox/actions.web';
|
||||
import { LAYOUTS, getCurrentLayout, shouldDisplayTileView } from '../video-layout';
|
||||
import { LAYOUTS } from '../video-layout/constants';
|
||||
import { getCurrentLayout, shouldDisplayTileView } from '../video-layout/functions.web';
|
||||
|
||||
import {
|
||||
clearStageParticipants,
|
||||
import { clearStageParticipants,
|
||||
setFilmstripVisible,
|
||||
setHorizontalViewDimensions,
|
||||
setScreenshareFilmstripParticipant,
|
||||
setScreensharingTileDimensions,
|
|
@ -7,7 +7,7 @@ import {
|
|||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { getPinnedActiveParticipants, isStageFilmstripEnabled } from '../filmstrip/functions.web';
|
||||
import { getPinnedActiveParticipants, isStageFilmstripEnabled } from '../filmstrip/functions';
|
||||
import { shouldDisplayTileView } from '../video-layout/functions';
|
||||
|
||||
import { FOLLOW_ME_COMMAND } from './constants';
|
||||
|
|
|
@ -8,6 +8,7 @@ export interface INotificationProps {
|
|||
description?: string | React.ReactNode;
|
||||
descriptionArguments?: Object;
|
||||
descriptionKey?: string;
|
||||
hideErrorSupportLink?: boolean;
|
||||
icon?: string;
|
||||
maxLines?: number;
|
||||
sticky?: boolean;
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
// @flow
|
||||
import { IReduxState } from '../app/types';
|
||||
|
||||
import { getOverlays } from './overlays';
|
||||
|
||||
/**
|
||||
* Returns the overlay to be currently rendered.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @param {IReduxState} state - The Redux state.
|
||||
* @returns {?React$ComponentType<*>}
|
||||
*/
|
||||
export function getOverlayToRender(state: Object) {
|
||||
export function getOverlayToRender(state: IReduxState) {
|
||||
for (const overlay of getOverlays()) {
|
||||
// react-i18n / react-redux wrap components and thus we cannot access
|
||||
// the wrapped component's static methods directly.
|
||||
// @ts-ignore
|
||||
const component = overlay.WrappedComponent || overlay;
|
||||
|
||||
if (component.needsRender(state)) {
|
||||
|
@ -25,9 +26,9 @@ export function getOverlayToRender(state: Object) {
|
|||
/**
|
||||
* Returns the visibility of the media permissions prompt.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @param {IReduxState} state - The Redux state.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function getMediaPermissionPromptVisibility(state: Object) {
|
||||
export function getMediaPermissionPromptVisibility(state: IReduxState) {
|
||||
return state['features/overlay'].isMediaPermissionPromptVisible;
|
||||
}
|
|
@ -1,5 +1,3 @@
|
|||
// @flow
|
||||
|
||||
import { getLogger } from '../base/logging/functions';
|
||||
|
||||
export default getLogger('features/overlay');
|
|
@ -1,36 +1,33 @@
|
|||
// @flow
|
||||
|
||||
import { IStore } from '../app/types';
|
||||
import { JitsiConferenceErrors } from '../base/lib-jitsi-meet';
|
||||
import {
|
||||
isFatalJitsiConferenceError,
|
||||
isFatalJitsiConnectionError
|
||||
} from '../base/lib-jitsi-meet/functions';
|
||||
import { StateListenerRegistry } from '../base/redux';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
|
||||
import { setFatalError } from './actions';
|
||||
|
||||
declare var APP: Object;
|
||||
|
||||
/**
|
||||
* Error type. Basically like Error, but augmented with a recoverable property.
|
||||
*/
|
||||
type ErrorType = {|
|
||||
type ErrorType = {
|
||||
|
||||
/**
|
||||
* Error message.
|
||||
*/
|
||||
message?: string,
|
||||
message?: string;
|
||||
|
||||
/**
|
||||
* Error name.
|
||||
*/
|
||||
name: string,
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* Indicates whether this event is recoverable or not.
|
||||
*/
|
||||
recoverable?: boolean
|
||||
|};
|
||||
recoverable?: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* List of errors that are not fatal (or handled differently) so then the overlays won't kick in.
|
||||
|
@ -54,7 +51,7 @@ const ERROR_TYPES = {
|
|||
* @param {Object|string} error - The error to process.
|
||||
* @returns {void}
|
||||
*/
|
||||
const getErrorExtraInfo = (getState, error) => {
|
||||
const getErrorExtraInfo = (getState: IStore['getState'], error: ErrorType) => {
|
||||
const state = getState();
|
||||
const { error: conferenceError } = state['features/base/conference'];
|
||||
const { error: configError } = state['features/base/config'];
|
||||
|
@ -62,7 +59,7 @@ const getErrorExtraInfo = (getState, error) => {
|
|||
|
||||
if (error === conferenceError) {
|
||||
return {
|
||||
type: ERROR_TYPES.CONFERENCE,
|
||||
type: ERROR_TYPES.CONFERENCE, // @ts-ignore
|
||||
isFatal: isFatalJitsiConferenceError(error.name || error)
|
||||
};
|
||||
}
|
||||
|
@ -76,7 +73,7 @@ const getErrorExtraInfo = (getState, error) => {
|
|||
|
||||
if (error === connectionError) {
|
||||
return {
|
||||
type: ERROR_TYPES.CONNECTION,
|
||||
type: ERROR_TYPES.CONNECTION, // @ts-ignore
|
||||
isFatal: isFatalJitsiConnectionError(error.name || error)
|
||||
};
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
// @flow
|
||||
|
||||
import {
|
||||
PageReloadOverlay
|
||||
} from './components/native';
|
||||
|
||||
/**
|
||||
* Returns the list of available platform specific overlays.
|
||||
*
|
||||
* @returns {Array<React$Element>}
|
||||
*/
|
||||
export function getOverlays(): Array<React$Element<*>> {
|
||||
return [
|
||||
PageReloadOverlay
|
||||
];
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { ReactElement } from 'react';
|
||||
|
||||
// @ts-ignore
|
||||
import { PageReloadOverlay } from './components/native';
|
||||
|
||||
/**
|
||||
* Returns the list of available platform specific overlays.
|
||||
*
|
||||
* @returns {Array<ReactElement>}
|
||||
*/
|
||||
export function getOverlays(): Array<ReactElement> {
|
||||
return [
|
||||
PageReloadOverlay
|
||||
];
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
// @flow
|
||||
|
||||
import {
|
||||
PageReloadOverlay,
|
||||
SuspendedOverlay,
|
||||
UserMediaPermissionsOverlay
|
||||
|
||||
// @ts-ignore
|
||||
} from './components/web';
|
||||
|
||||
/**
|
|
@ -1,6 +1,6 @@
|
|||
import { IReduxState } from '../app/types';
|
||||
import { getRoomName } from '../base/conference/functions';
|
||||
import { getDialOutStatusUrl, getDialOutUrl } from '../base/config/functions.web';
|
||||
import { getDialOutStatusUrl, getDialOutUrl } from '../base/config/functions';
|
||||
import { isAudioMuted, isVideoMutedByUser } from '../base/media/functions';
|
||||
|
||||
/**
|
||||
|
|
|
@ -4,7 +4,8 @@ import {
|
|||
FLUSH_REACTION_BUFFER,
|
||||
PUSH_REACTIONS,
|
||||
SEND_REACTIONS,
|
||||
SET_REACTION_QUEUE
|
||||
SET_REACTION_QUEUE,
|
||||
SHOW_SOUNDS_NOTIFICATION
|
||||
} from './actionTypes';
|
||||
import { IReactionEmojiProps } from './constants';
|
||||
import { IReactionsAction } from './reducer';
|
||||
|
@ -98,3 +99,14 @@ export function pushReactions(reactions: Array<string>): IReactionsAction {
|
|||
reactions
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the disable sounds notification.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
export function displayReactionSoundsNotification(): IReactionsAction {
|
||||
return {
|
||||
type: SHOW_SOUNDS_NOTIFICATION
|
||||
};
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
export * from './actions.any';
|
|
@ -1,9 +1,10 @@
|
|||
import {
|
||||
SHOW_SOUNDS_NOTIFICATION,
|
||||
TOGGLE_REACTIONS_VISIBLE
|
||||
} from './actionTypes';
|
||||
import { IReactionsAction } from './reducer';
|
||||
|
||||
export * from './actions.any';
|
||||
|
||||
/**
|
||||
* Toggles the visibility of the reactions menu.
|
||||
*
|
||||
|
@ -14,14 +15,3 @@ export function toggleReactionsMenuVisibility(): IReactionsAction {
|
|||
type: TOGGLE_REACTIONS_VISIBLE
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the disable sounds notification.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
export function displayReactionSoundsNotification(): IReactionsAction {
|
||||
return {
|
||||
type: SHOW_SOUNDS_NOTIFICATION
|
||||
};
|
||||
}
|
||||
|
|
|
@ -28,12 +28,12 @@ import {
|
|||
} from './actionTypes';
|
||||
import {
|
||||
addReactionsToChat,
|
||||
displayReactionSoundsNotification,
|
||||
flushReactionBuffer,
|
||||
pushReactions,
|
||||
sendReactions,
|
||||
setReactionQueue
|
||||
} from './actions.any';
|
||||
import { displayReactionSoundsNotification } from './actions.web';
|
||||
} from './actions';
|
||||
import {
|
||||
ENDPOINT_REACTION_NAME,
|
||||
IMuteCommandAttributes,
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { IStore } from '../app/types';
|
||||
import { openDialog } from '../base/dialog/actions';
|
||||
import { browser } from '../base/lib-jitsi-meet';
|
||||
import { shouldHideShareAudioHelper } from '../base/settings/functions';
|
||||
import { toggleScreensharing } from '../base/tracks/actions';
|
||||
import { shouldHideShareAudioHelper } from '../base/settings/functions.web';
|
||||
import { toggleScreensharing } from '../base/tracks/actions.web';
|
||||
|
||||
import {
|
||||
SET_SCREENSHARE_TRACKS,
|
||||
|
|
|
@ -5,8 +5,8 @@ import { IReduxState, IStore } from '../../../app/types';
|
|||
import { translate } from '../../../base/i18n/functions';
|
||||
import { connect } from '../../../base/redux/functions';
|
||||
import { updateSettings } from '../../../base/settings/actions';
|
||||
import { shouldHideShareAudioHelper } from '../../../base/settings/functions.any';
|
||||
import { toggleScreensharing } from '../../../base/tracks/actions';
|
||||
import { shouldHideShareAudioHelper } from '../../../base/settings/functions.web';
|
||||
import { toggleScreensharing } from '../../../base/tracks/actions.web';
|
||||
import Checkbox from '../../../base/ui/components/web/Checkbox';
|
||||
import Dialog from '../../../base/ui/components/web/Dialog';
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import { SETTINGS_UPDATED } from '../base/settings/actionTypes';
|
||||
import { getHideSelfView } from '../base/settings/functions';
|
||||
import { getHideSelfView } from '../base/settings/functions.web';
|
||||
import { showNotification } from '../notifications/actions';
|
||||
import { DISABLE_SELF_VIEW_NOTIFICATION_ID, NOTIFICATION_TIMEOUT_TYPE } from '../notifications/constants';
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ import {
|
|||
* enabled: boolean
|
||||
* }}
|
||||
*/
|
||||
export function setToolboxEnabled(enabled: boolean): Object {
|
||||
export function setToolboxEnabled(enabled: boolean) {
|
||||
return {
|
||||
type: SET_TOOLBOX_ENABLED,
|
||||
enabled
|
||||
|
|
|
@ -26,7 +26,7 @@ export * from './functions.any';
|
|||
* @returns {number}
|
||||
*/
|
||||
export function getMaxColumnCount(state: IReduxState, options: {
|
||||
disableResponsiveTiles?: boolean; disableTileEnlargement?: boolean; width?: number; } = {}) {
|
||||
disableResponsiveTiles?: boolean; disableTileEnlargement?: boolean; width?: number | null; } = {}) {
|
||||
if (typeof interfaceConfig === 'undefined') {
|
||||
return DEFAULT_MAX_COLUMNS;
|
||||
}
|
||||
|
|
|
@ -2,8 +2,8 @@ import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
|||
import { equals } from '../base/redux/functions';
|
||||
import { isFollowMeActive } from '../follow-me/functions';
|
||||
|
||||
import { virtualScreenshareParticipantsUpdated } from './actions.web';
|
||||
import { getAutoPinSetting, updateAutoPinnedParticipant } from './functions.web';
|
||||
import { virtualScreenshareParticipantsUpdated } from './actions';
|
||||
import { getAutoPinSetting, updateAutoPinnedParticipant } from './functions';
|
||||
|
||||
StateListenerRegistry.register(
|
||||
/* selector */ state => state['features/base/participants'].sortedRemoteVirtualScreenshareParticipants,
|
||||
|
|
|
@ -16,12 +16,13 @@ import {
|
|||
} from '../filmstrip/functions';
|
||||
import { LAYOUTS } from '../video-layout/constants';
|
||||
import {
|
||||
getCurrentLayout,
|
||||
getVideoQualityForLargeVideo,
|
||||
getVideoQualityForResizableFilmstripThumbnails,
|
||||
getVideoQualityForScreenSharingFilmstrip,
|
||||
getVideoQualityForStageThumbnails,
|
||||
shouldDisplayTileView
|
||||
} from '../video-layout/functions';
|
||||
import { getCurrentLayout, getVideoQualityForScreenSharingFilmstrip } from '../video-layout/functions.any';
|
||||
|
||||
import {
|
||||
setMaxReceiverVideoQualityForLargeVideo,
|
||||
|
|
Loading…
Reference in New Issue