diff --git a/ts/services/calling.ts b/ts/services/calling.ts index 6ea52fb304..7d7f70ff41 100644 --- a/ts/services/calling.ts +++ b/ts/services/calling.ts @@ -158,6 +158,7 @@ import type { } from '../types/CallLink'; import { CallLinkRestrictions } from '../types/CallLink'; import { getConversationIdForLogging } from '../util/idForLogging'; +import { sendCallLinkUpdateSync } from '../util/sendCallLinkUpdateSync'; const { wasGroupCallRingPreviouslyCanceled } = DataReader; const { @@ -671,12 +672,16 @@ export class CallingClass { log.info(`${logId}: success`); const state = callLinkStateFromRingRTC(result.value); - return { + const callLink: CallLinkType = { roomId: roomIdHex, rootKey: rootKey.toString(), adminKey: adminKey.toString('base64'), ...state, }; + + drop(sendCallLinkUpdateSync(callLink)); + + return callLink; } async updateCallLinkName( @@ -711,6 +716,8 @@ export class CallingClass { throw new Error(message); } + drop(sendCallLinkUpdateSync(callLink)); + log.info(`${logId}: success`); return callLinkStateFromRingRTC(result.value); } @@ -754,6 +761,8 @@ export class CallingClass { throw new Error(message); } + drop(sendCallLinkUpdateSync(callLink)); + log.info(`${logId}: success`); return callLinkStateFromRingRTC(result.value); } diff --git a/ts/state/ducks/calling.ts b/ts/state/ducks/calling.ts index 104b63cbb9..31ade45325 100644 --- a/ts/state/ducks/calling.ts +++ b/ts/state/ducks/calling.ts @@ -13,7 +13,6 @@ import { GroupCallEndReason, type Reaction as CallReaction, } from '@signalapp/ringrtc'; -import { v4 as generateUuid } from 'uuid'; import { getOwn } from '../../util/getOwn'; import * as Errors from '../../types/errors'; import { getIntl, getPlatform } from '../selectors/user'; @@ -55,6 +54,7 @@ import { getRoomIdFromRootKey, isCallLinksCreateEnabled, toAdminKeyBytes, + toCallHistoryFromUnusedCallLink, } from '../../util/callLinks'; import { sendCallLinkUpdateSync } from '../../util/sendCallLinkUpdateSync'; import { sleep } from '../../util/sleep'; @@ -88,15 +88,10 @@ import { ButtonVariant } from '../../components/Button'; import { getConversationIdForLogging } from '../../util/idForLogging'; import { DataReader, DataWriter } from '../../sql/Client'; import { isAciString } from '../../util/isAciString'; -import type { CallHistoryDetails } from '../../types/CallDisposition'; -import { - AdhocCallStatus, - CallDirection, - CallType, -} from '../../types/CallDisposition'; import type { CallHistoryAdd } from './callHistory'; import { addCallHistory } from './callHistory'; import { saveDraftRecordingIfNeeded } from './composer'; +import type { CallHistoryDetails } from '../../types/CallDisposition'; // State @@ -1396,7 +1391,12 @@ function groupCallStateChange( // From sync messages, to notify us that another device joined or changed a call link. function handleCallLinkUpdate( payload: HandleCallLinkUpdateType -): ThunkAction { +): ThunkAction< + void, + RootStateType, + unknown, + HandleCallLinkUpdateActionType | CallHistoryAdd +> { return async dispatch => { const { rootKey, adminKey } = payload; const callLinkRootKey = CallLinkRootKey.parse(rootKey); @@ -1432,6 +1432,8 @@ function handleCallLinkUpdate( adminKey, }; + let callHistory: CallHistoryDetails | null = null; + if (existingCallLink) { if (adminKey && adminKey !== existingCallLink.adminKey) { await DataWriter.updateCallLinkAdminKeyByRoomId(roomId, adminKey); @@ -1444,6 +1446,10 @@ function handleCallLinkUpdate( } } else { await DataWriter.insertCallLink(callLink); + if (adminKey != null) { + callHistory = toCallHistoryFromUnusedCallLink(callLink); + await DataWriter.saveCallHistory(callHistory); + } log.info(`${logId}: Saved new call link`); } @@ -1451,6 +1457,10 @@ function handleCallLinkUpdate( type: HANDLE_CALL_LINK_UPDATE, payload: { callLink }, }); + + if (callHistory != null) { + dispatch(addCallHistory(callHistory)); + } }; } @@ -1974,16 +1984,7 @@ function createCallLink( strictAssert(isCallLinksCreateEnabled(), 'Call links creation is disabled'); const callLink = await calling.createCallLink(); - const callHistory: CallHistoryDetails = { - callId: generateUuid(), - peerId: callLink.roomId, - ringerId: null, - mode: CallMode.Adhoc, - type: CallType.Adhoc, - direction: CallDirection.Incoming, - timestamp: Date.now(), - status: AdhocCallStatus.Pending, - }; + const callHistory = toCallHistoryFromUnusedCallLink(callLink); await Promise.all([ DataWriter.insertCallLink(callLink), DataWriter.saveCallHistory(callHistory), diff --git a/ts/util/callLinks.ts b/ts/util/callLinks.ts index 54a33ecee1..60b356901a 100644 --- a/ts/util/callLinks.ts +++ b/ts/util/callLinks.ts @@ -7,6 +7,7 @@ import { } from '@signalapp/ringrtc'; import { Aci } from '@signalapp/libsignal-client'; import { z } from 'zod'; +import { v4 as generateUuid } from 'uuid'; import * as RemoteConfig from '../RemoteConfig'; import type { CallLinkAuthCredentialPresentation } from './zkgroup'; import { @@ -31,6 +32,13 @@ import { import type { LocalizerType } from '../types/Util'; import { isTestOrMockEnvironment } from '../environment'; import { getColorForCallLink } from './getColorForCallLink'; +import { + AdhocCallStatus, + CallDirection, + CallType, + type CallHistoryDetails, +} from '../types/CallDisposition'; +import { CallMode } from '../types/Calling'; export const CALL_LINK_DEFAULT_STATE = { name: '', @@ -204,3 +212,18 @@ export function callLinkFromRecord(record: CallLinkRecord): CallLinkType { expiration: record.expiration, }; } + +export function toCallHistoryFromUnusedCallLink( + callLink: CallLinkType +): CallHistoryDetails { + return { + callId: generateUuid(), + peerId: callLink.roomId, + ringerId: null, + mode: CallMode.Adhoc, + type: CallType.Adhoc, + direction: CallDirection.Incoming, + timestamp: Date.now(), + status: AdhocCallStatus.Pending, + }; +}