jitsi-meet/react/features/prejoin/functions.any.ts
theluyuan 38ba663466
Some checks failed
Close stale issues and PRs / stale (push) Has been cancelled
init
2025-09-02 14:49:16 +08:00

216 lines
6.7 KiB
TypeScript

import { IReduxState } from '../app/types';
import { getRoomName } from '../base/conference/functions';
import { getDialOutStatusUrl, getDialOutUrl } from '../base/config/functions.any';
import {
MEETING_NAME_ENABLED,
UNSAFE_ROOM_WARNING
} from '../base/flags/constants';
import { getFeatureFlag } from '../base/flags/functions';
import { isAudioMuted, isVideoMutedByUser } from '../base/media/functions';
import { getLobbyConfig } from '../lobby/functions';
/**
* Selector for the visibility of the 'join by phone' button.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isJoinByPhoneButtonVisible(state: IReduxState): boolean {
return Boolean(getDialOutUrl(state) && getDialOutStatusUrl(state));
}
/**
* Selector for determining if the device status strip is visible or not.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isDeviceStatusVisible(state: IReduxState): boolean {
return !(isAudioMuted(state) && isVideoMutedByUser(state))
&& !state['features/base/config'].startSilent
// This handles the case where disableInitialGUM=true and we haven't yet tried to create any tracks. In this
// case we shouldn't display the the device status indicator. But once we create some tracks we can show it
// because we would know if we created the tracks successfully or not.
&& (!state['features/base/config'].disableInitialGUM || state['features/base/tracks']?.length > 0);
}
/**
* Selector for determining if the display name is mandatory.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isDisplayNameRequired(state: IReduxState): boolean {
return Boolean(state['features/lobby']?.isDisplayNameRequiredError
|| state['features/base/config']?.requireDisplayName);
}
/**
* Selector for determining if the prejoin page is enabled in config. Defaults to `true`.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isPrejoinEnabledInConfig(state: IReduxState): boolean {
return state['features/base/config'].prejoinConfig?.enabled ?? true;
}
/**
* Selector for determining if the prejoin display name field is visible.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isPrejoinDisplayNameVisible(state: IReduxState): boolean {
return !state['features/base/config'].prejoinConfig?.hideDisplayName;
}
/**
* Returns the text for the prejoin status bar.
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getDeviceStatusText(state: IReduxState): string {
return state['features/prejoin']?.deviceStatusText;
}
/**
* Returns the type of the prejoin status bar: 'ok'|'warning'.
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getDeviceStatusType(state: IReduxState): string {
return state['features/prejoin']?.deviceStatusType;
}
/**
* Returns the 'conferenceUrl' used for dialing out.
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getDialOutConferenceUrl(state: IReduxState): string {
return `${getRoomName(state)}@${state['features/base/config'].hosts?.muc}`;
}
/**
* Selector for getting the dial out country.
*
* @param {IReduxState} state - The state of the app.
* @returns {Object}
*/
export function getDialOutCountry(state: IReduxState) {
return state['features/prejoin'].dialOutCountry;
}
/**
* Selector for getting the dial out number (without prefix).
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getDialOutNumber(state: IReduxState): string {
return state['features/prejoin'].dialOutNumber;
}
/**
* Selector for getting the dial out status while calling.
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getDialOutStatus(state: IReduxState): string {
return state['features/prejoin'].dialOutStatus;
}
/**
* Returns the full dial out number (containing country code and +).
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getFullDialOutNumber(state: IReduxState): string {
const dialOutNumber = getDialOutNumber(state);
const country = getDialOutCountry(state);
return `+${country.dialCode}${dialOutNumber}`;
}
/**
* Selector for getting the error if any while creating streams.
*
* @param {IReduxState} state - The state of the app.
* @returns {string}
*/
export function getRawError(state: IReduxState): string {
return state['features/prejoin']?.rawError;
}
/**
* Selector for getting the visibility state for the 'JoinByPhoneDialog'.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isJoinByPhoneDialogVisible(state: IReduxState): boolean {
return state['features/prejoin']?.showJoinByPhoneDialog;
}
/**
* Returns true if the prejoin page is enabled and no flag
* to bypass showing the page is present.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isPrejoinPageVisible(state: IReduxState): boolean {
return Boolean(navigator.product !== 'ReactNative'
&& isPrejoinEnabledInConfig(state)
&& state['features/prejoin']?.showPrejoin
&& !(state['features/base/config'].enableForcedReload && state['features/prejoin'].skipPrejoinOnReload));
}
/**
* Returns true if we should auto-knock in case lobby is enabled for the room.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function shouldAutoKnock(state: IReduxState): boolean {
const { iAmRecorder, iAmSipGateway } = state['features/base/config'];
const { autoKnock } = getLobbyConfig(state);
return Boolean(((isPrejoinEnabledInConfig(state))
|| autoKnock || (iAmRecorder && iAmSipGateway))
&& !state['features/lobby'].knocking);
}
/**
* Returns true if the unsafe room warning flag is enabled.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isUnsafeRoomWarningEnabled(state: IReduxState): boolean {
const { enableInsecureRoomNameWarning = false } = state['features/base/config'];
return getFeatureFlag(state, UNSAFE_ROOM_WARNING, enableInsecureRoomNameWarning);
}
/**
* Returns true if the room name is enabled.
*
* @param {IReduxState} state - The state of the app.
* @returns {boolean}
*/
export function isRoomNameEnabled(state: IReduxState): boolean {
const { hideConferenceSubject = false } = state['features/base/config'];
return getFeatureFlag(state, MEETING_NAME_ENABLED, true)
&& !hideConferenceSubject;
}