signal-desktop/ts/state/ducks/callingHelpers.ts

63 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-07-18 23:57:38 +00:00
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// Note that this file should not important any binary addons or Node.js modules
// because it can be imported by storybook
import { CallState, GroupCallConnectionState } from '../../types/Calling';
import { CallMode } from '../../types/CallDisposition';
import type { AciString } from '../../types/ServiceId';
2023-07-18 23:57:38 +00:00
import { missingCaseError } from '../../util/missingCaseError';
import type {
DirectCallStateType,
CallsByConversationType,
GroupCallPeekInfoType,
GroupCallStateType,
} from './calling';
export const MAX_CALL_PARTICIPANTS_FOR_DEFAULT_MUTE = 8;
2023-07-18 23:57:38 +00:00
// In theory, there could be multiple incoming calls, or an incoming call while there's
// an active call. In practice, the UI is not ready for this, and RingRTC doesn't
// support it for direct calls.
export const getIncomingCall = (
callsByConversation: Readonly<CallsByConversationType>,
ourAci: AciString
2023-07-18 23:57:38 +00:00
): undefined | DirectCallStateType | GroupCallStateType =>
Object.values(callsByConversation).find(call => {
switch (call.callMode) {
case CallMode.Direct:
return call.isIncoming && call.callState === CallState.Ringing;
case CallMode.Group:
return (
call.ringerAci &&
2023-07-18 23:57:38 +00:00
call.connectionState === GroupCallConnectionState.NotConnected &&
isAnybodyElseInGroupCall(call.peekInfo, ourAci)
2023-07-18 23:57:38 +00:00
);
2024-02-22 21:19:50 +00:00
case CallMode.Adhoc:
// Adhoc calls cannot be incoming.
return;
2023-07-18 23:57:38 +00:00
default:
throw missingCaseError(call);
}
});
export const isAnybodyElseInGroupCall = (
peekInfo: undefined | Readonly<Pick<GroupCallPeekInfoType, 'acis'>>,
ourAci: AciString
): boolean => Boolean(peekInfo?.acis.some(id => id !== ourAci));
export const isAnybodyInGroupCall = (
peekInfo: undefined | Readonly<Pick<GroupCallPeekInfoType, 'acis'>>
): boolean => {
if (!peekInfo?.acis) {
return false;
}
return peekInfo.acis.length > 0;
};
export const isGroupCallActiveOnServer = (
peekInfo: undefined | Readonly<Pick<GroupCallPeekInfoType, 'eraId'>>
): boolean => {
return Boolean(peekInfo?.eraId);
};