diff --git a/ts/components/conversation/Timeline.dom.stories.tsx b/ts/components/conversation/Timeline.dom.stories.tsx index ceedfd4bcd..7bd932c9e7 100644 --- a/ts/components/conversation/Timeline.dom.stories.tsx +++ b/ts/components/conversation/Timeline.dom.stories.tsx @@ -348,8 +348,7 @@ const actions = () => ({ closeContactSpoofingReview: action('closeContactSpoofingReview'), reviewConversationNameCollision: action('reviewConversationNameCollision'), - peekGroupCallForTheFirstTime: action('peekGroupCallForTheFirstTime'), - peekGroupCallIfItHasMembers: action('peekGroupCallIfItHasMembers'), + maybePeekGroupCall: action('maybePeekGroupCall'), viewStory: action('viewStory'), diff --git a/ts/components/conversation/Timeline.dom.tsx b/ts/components/conversation/Timeline.dom.tsx index 4351d6dd97..8a6dbb52f2 100644 --- a/ts/components/conversation/Timeline.dom.tsx +++ b/ts/components/conversation/Timeline.dom.tsx @@ -165,14 +165,13 @@ export type PropsActionsType = { setFocus?: boolean ) => unknown; markMessageRead: (conversationId: string, messageId: string) => unknown; + maybePeekGroupCall: (conversationId: string) => unknown; targetMessage: (messageId: string, conversationId: string) => unknown; setCenterMessage: ( conversationId: string, messageId: string | undefined ) => void; setIsNearBottom: (conversationId: string, isNearBottom: boolean) => void; - peekGroupCallForTheFirstTime: (conversationId: string) => unknown; - peekGroupCallIfItHasMembers: (conversationId: string) => unknown; reviewConversationNameCollision: () => void; scrollToOldestUnreadMention: (conversationId: string) => unknown; }; @@ -590,15 +589,14 @@ export class Timeline extends React.Component< this.#cleanupGroupCallPeekTimeouts(); this.#delayedPeekTimeout = setTimeout(() => { - const { id, peekGroupCallForTheFirstTime } = this.props; + const { id, maybePeekGroupCall } = this.props; this.#delayedPeekTimeout = undefined; - peekGroupCallForTheFirstTime(id); - }, 500); + maybePeekGroupCall(id); - this.#peekInterval = setInterval(() => { - const { id, peekGroupCallIfItHasMembers } = this.props; - peekGroupCallIfItHasMembers(id); - }, MINUTE); + this.#peekInterval = setInterval(() => { + maybePeekGroupCall(id); + }, MINUTE); + }, 500); } #cleanupGroupCallPeekTimeouts(): void { diff --git a/ts/state/ducks/calling.preload.ts b/ts/state/ducks/calling.preload.ts index ee56dcf43d..fdd3cbc150 100644 --- a/ts/state/ducks/calling.preload.ts +++ b/ts/state/ducks/calling.preload.ts @@ -1880,41 +1880,33 @@ function joinedAdhocCall( }; } -function peekGroupCallForTheFirstTime( +function maybePeekGroupCall( conversationId: string ): ThunkAction { return (dispatch, getState) => { const call = getOwn(getState().calling.callsByConversation, conversationId); - const shouldPeek = - !call || (isGroupOrAdhocCallState(call) && !call.peekInfo); - const callMode = call?.callMode ?? CallMode.Group; - if (callMode === CallMode.Direct) { + + if (call && !isGroupOrAdhocCallState(call)) { return; } - if (shouldPeek) { + const existingPeekInfo = call?.peekInfo; + + // We peek if: + // 1. this is the first time since app has started that we've peeked, or + // 2. we've peeked prior and there is an ongoing group call + if (existingPeekInfo == null) { doGroupCallPeek({ conversationId, - callMode, + callMode: call?.callMode ?? CallMode.Group, dispatch, getState, }); - } - }; -} - -function peekGroupCallIfItHasMembers( - conversationId: string -): ThunkAction { - return (dispatch, getState) => { - const call = getOwn(getState().calling.callsByConversation, conversationId); - const shouldPeek = + } else if ( call && - isGroupOrAdhocCallState(call) && call.joinState === GroupCallJoinState.NotJoined && - call.peekInfo && - call.peekInfo.deviceCount > 0; - if (shouldPeek) { + existingPeekInfo.deviceCount > 0 + ) { doGroupCallPeek({ conversationId, callMode: call.callMode, @@ -3088,13 +3080,12 @@ export const actions = { handleCallLinkDelete, joinedAdhocCall, leaveCurrentCallAndStartCallingLobby, + maybePeekGroupCall, onObservedRemoteMute, onOutgoingVideoCallInConversation, onOutgoingAudioCallInConversation, openSystemPreferencesAction, outgoingCall, - peekGroupCallForTheFirstTime, - peekGroupCallIfItHasMembers, peekNotConnectedGroupCall, receiveGroupCallReactions, receiveIncomingDirectCall, diff --git a/ts/state/smart/Timeline.preload.tsx b/ts/state/smart/Timeline.preload.tsx index 9a592a389a..dd7ad193b5 100644 --- a/ts/state/smart/Timeline.preload.tsx +++ b/ts/state/smart/Timeline.preload.tsx @@ -209,8 +209,7 @@ export const SmartTimeline = memo(function SmartTimeline({ setIsNearBottom, targetMessage, } = useConversationsActions(); - const { peekGroupCallForTheFirstTime, peekGroupCallIfItHasMembers } = - useCallingActions(); + const { maybePeekGroupCall } = useCallingActions(); const getTimestampForMessage = useCallback( (messageId: string): undefined | number => { @@ -282,14 +281,13 @@ export const SmartTimeline = memo(function SmartTimeline({ loadNewestMessages={loadNewestMessages} loadOlderMessages={loadOlderMessages} markMessageRead={markMessageRead} + maybePeekGroupCall={maybePeekGroupCall} messageChangeCounter={messageChangeCounter} messageLoadingState={messageLoadingState} updateVisibleMessages={ AttachmentDownloadManager.updateVisibleTimelineMessages } oldestUnseenIndex={oldestUnseenIndex} - peekGroupCallForTheFirstTime={peekGroupCallForTheFirstTime} - peekGroupCallIfItHasMembers={peekGroupCallIfItHasMembers} renderCollidingAvatars={renderCollidingAvatars} renderContactSpoofingReviewDialog={renderContactSpoofingReviewDialog} renderHeroRow={renderHeroRow}