signal-desktop/ts/state/selectors/calling.ts

97 lines
2.7 KiB
TypeScript
Raw Normal View History

2023-01-03 19:55:46 +00:00
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { createSelector } from 'reselect';
import type { StateType } from '../reducer';
import type {
ActiveCallStateType,
CallingStateType,
CallsByConversationType,
DirectCallStateType,
GroupCallStateType,
} from '../ducks/calling';
2023-07-18 23:57:38 +00:00
import { getIncomingCall as getIncomingCallHelper } from '../ducks/callingHelpers';
2022-07-08 20:46:25 +00:00
import { getUserACI } from './user';
import { getOwn } from '../../util/getOwn';
import { CallViewMode } from '../../types/Calling';
import type { AciString } from '../../types/ServiceId';
export type CallStateType = DirectCallStateType | GroupCallStateType;
const getCalling = (state: StateType): CallingStateType => state.calling;
export const getActiveCallState = createSelector(
2021-01-29 22:58:28 +00:00
getCalling,
(state: CallingStateType) => state.activeCallState
2021-01-29 22:58:28 +00:00
);
export const getCallsByConversation = createSelector(
getCalling,
(state: CallingStateType): CallsByConversationType =>
state.callsByConversation
);
export type CallSelectorType = (
conversationId: string
) => CallStateType | undefined;
export const getCallSelector = createSelector(
getCallsByConversation,
2021-11-11 22:43:05 +00:00
(callsByConversation: CallsByConversationType): CallSelectorType =>
(conversationId: string) =>
getOwn(callsByConversation, conversationId)
);
export const getActiveCall = createSelector(
getActiveCallState,
getCallSelector,
(activeCallState, callSelector): undefined | CallStateType => {
if (activeCallState && activeCallState.conversationId) {
return callSelector(activeCallState.conversationId);
}
return undefined;
}
);
export const isInCall = createSelector(
getActiveCall,
(call: CallStateType | undefined): boolean => Boolean(call)
);
export const isInFullScreenCall = createSelector(
getCalling,
(state: CallingStateType): boolean =>
Boolean(state.activeCallState && !state.activeCallState.pip)
);
export const getIncomingCall = createSelector(
getCallsByConversation,
2022-07-08 20:46:25 +00:00
getUserACI,
(
2021-08-20 16:06:15 +00:00
callsByConversation: CallsByConversationType,
ourAci: AciString | undefined
): undefined | DirectCallStateType | GroupCallStateType => {
if (!ourAci) {
return undefined;
}
return getIncomingCallHelper(callsByConversation, ourAci);
}
);
export const areAnyCallsActiveOrRinging = createSelector(
getActiveCall,
getIncomingCall,
(activeCall, incomingCall): boolean => Boolean(activeCall || incomingCall)
);
export const isInSpeakerView = (
call: Pick<ActiveCallStateType, 'viewMode'> | undefined
): boolean => {
return Boolean(
call?.viewMode === CallViewMode.Presentation ||
call?.viewMode === CallViewMode.Speaker
);
};