You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/state/selectors/call.ts

96 lines
3.0 KiB
TypeScript

import { createSelector } from '@reduxjs/toolkit';
import { CallStateType, CallStatusEnum } from '../ducks/call';
import { ConversationsStateType, ReduxConversationType } from '../ducks/conversations';
import { StateType } from '../reducer';
import { getConversations } from './conversations';
import { getSelectedConversationKey } from './selectedConversation';
const getCallState = (state: StateType): CallStateType => state.call;
// --- INCOMING CALLS
export const getHasIncomingCallFrom = (state: StateType) => {
return state.call.ongoingWith && state.call.ongoingCallStatus === 'incoming'
? state.call.ongoingWith
: undefined;
};
export const getHasIncomingCall = (state: StateType) => !!getHasIncomingCallFrom(state);
// --- ONGOING CALLS
export const getHasOngoingCallWith = createSelector(
getConversations,
getCallState,
(convos: ConversationsStateType, callState: CallStateType): ReduxConversationType | undefined => {
if (
callState.ongoingWith &&
(callState.ongoingCallStatus === 'connecting' ||
callState.ongoingCallStatus === 'offering' ||
callState.ongoingCallStatus === 'ongoing')
) {
return convos.conversationLookup[callState.ongoingWith] || undefined;
}
return undefined;
}
);
export const getHasOngoingCall = createSelector(
getHasOngoingCallWith,
(withConvo: ReduxConversationType | undefined): boolean => !!withConvo
);
export const getHasOngoingCallWithPubkey = createSelector(
getHasOngoingCallWith,
(withConvo: ReduxConversationType | undefined): string | undefined => withConvo?.id
);
export const getHasOngoingCallWithFocusedConvo = createSelector(
getHasOngoingCallWithPubkey,
getSelectedConversationKey,
(withPubkey, selectedPubkey) => {
return withPubkey && withPubkey === selectedPubkey;
}
);
const getCallStateWithFocusedConvo = (state: StateType): CallStatusEnum => {
const selected = state.conversations.selectedConversation;
const ongoingWith = state.call.ongoingWith;
if (selected && ongoingWith && selected === ongoingWith) {
return state.call.ongoingCallStatus;
}
return undefined;
};
export const getCallWithFocusedConvoIsOffering = createSelector(
getCallStateWithFocusedConvo,
(callState: CallStatusEnum): boolean => {
return callState === 'offering';
}
);
export const getCallWithFocusedConvosIsConnecting = createSelector(
getCallStateWithFocusedConvo,
(callState: CallStatusEnum): boolean => {
return callState === 'connecting';
}
);
export const getCallWithFocusedConvosIsConnected = createSelector(
getCallStateWithFocusedConvo,
(callState: CallStatusEnum): boolean => {
return callState === 'ongoing';
}
);
export const getHasOngoingCallWithNonFocusedConvo = createSelector(
getHasOngoingCallWithPubkey,
getSelectedConversationKey,
(withPubkey, selectedPubkey) => {
return withPubkey && withPubkey !== selectedPubkey;
}
);
export const getCallIsInFullScreen = createSelector(
getCallState,
(callState): boolean => callState.callIsInFullScreen
);