// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import { createSelector } from 'reselect'; import { StateType } from '../reducer'; import { CallingStateType, CallsByConversationType, DirectCallStateType, getActiveCall, } from '../ducks/calling'; import { CallMode, CallState } from '../../types/Calling'; import { getOwn } from '../../util/getOwn'; const getCalling = (state: StateType): CallingStateType => state.calling; export const isInCall = createSelector( getCalling, (state: CallingStateType): boolean => Boolean(getActiveCall(state)) ); export const getCallsByConversation = createSelector( getCalling, (state: CallingStateType): CallsByConversationType => state.callsByConversation ); export const getCallSelector = createSelector( getCallsByConversation, (callsByConversation: CallsByConversationType) => (conversationId: string) => getOwn(callsByConversation, conversationId) ); // In theory, there could be multiple incoming calls. In practice, neither RingRTC nor the // UI are ready to handle this. export const getIncomingCall = createSelector( getCallsByConversation, ( callsByConversation: CallsByConversationType ): undefined | DirectCallStateType => { const result = Object.values(callsByConversation).find( call => call.callMode === CallMode.Direct && call.isIncoming && call.callState === CallState.Ringing ); // TypeScript needs a little help to be sure that this is a direct call. return result?.callMode === CallMode.Direct ? result : undefined; } );