diff --git a/sounds/notification_simple-01.ogg b/sounds/notification_simple-01.ogg new file mode 100755 index 0000000000..93b3a0144e Binary files /dev/null and b/sounds/notification_simple-01.ogg differ diff --git a/ts/state/ducks/calling.ts b/ts/state/ducks/calling.ts index 92a2a761ef..89f6f40bfa 100644 --- a/ts/state/ducks/calling.ts +++ b/ts/state/ducks/calling.ts @@ -15,6 +15,7 @@ import * as Errors from '../../types/errors'; import { getPlatform } from '../selectors/user'; import { isConversationTooBigToRing } from '../../conversations/isConversationTooBigToRing'; import { missingCaseError } from '../../util/missingCaseError'; +import { drop } from '../../util/drop'; import { calling } from '../../services/calling'; import { truncateAudioLevel } from '../../calling/truncateAudioLevel'; import type { StateType as RootStateType } from '../reducer'; @@ -974,8 +975,26 @@ function receiveGroupCallReactions( function groupCallRaisedHandsChange( payload: GroupCallRaisedHandsChangeActionPayloadType -): GroupCallRaisedHandsChangeActionType { - return { type: GROUP_CALL_RAISED_HANDS_CHANGE, payload }; +): ThunkAction< + void, + RootStateType, + unknown, + GroupCallRaisedHandsChangeActionType +> { + return async (dispatch, getState) => { + const { conversationId, raisedHands } = payload; + + const existingCall = getGroupCall(conversationId, getState().calling); + const isFirstHandRaised = + existingCall && + !existingCall.raisedHands?.length && + raisedHands.length > 0; + if (isFirstHandRaised) { + drop(callingTones.handRaised()); + } + + dispatch({ type: GROUP_CALL_RAISED_HANDS_CHANGE, payload }); + }; } function groupCallStateChange( diff --git a/ts/util/Sound.ts b/ts/util/Sound.ts index 2bc2085b3e..31d6fba420 100644 --- a/ts/util/Sound.ts +++ b/ts/util/Sound.ts @@ -6,6 +6,7 @@ import { missingCaseError } from './missingCaseError'; export enum SoundType { CallingHangUp, + CallingHandRaised, CallingPresenting, Pop, Ringtone, @@ -103,6 +104,10 @@ export class Sound { } static getSrc(soundStyle: SoundType): string { + if (soundStyle === SoundType.CallingHandRaised) { + return 'sounds/notification_simple-01.ogg'; + } + if (soundStyle === SoundType.CallingHangUp) { return 'sounds/navigation-cancel.ogg'; } diff --git a/ts/util/callingTones.ts b/ts/util/callingTones.ts index c478a51a7f..2339cdb85b 100644 --- a/ts/util/callingTones.ts +++ b/ts/util/callingTones.ts @@ -14,6 +14,19 @@ const ringtoneEventQueue = new PQueue({ class CallingTones { private ringtone?: Sound; + async handRaised() { + const canPlayTone = window.Events.getCallRingtoneNotification(); + if (!canPlayTone) { + return; + } + + const tone = new Sound({ + soundType: SoundType.CallingHandRaised, + }); + + await tone.play(); + } + async playEndCall(): Promise { const canPlayTone = window.Events.getCallRingtoneNotification(); if (!canPlayTone) {