From 85207bec98d4a1c262beced7bab893e4e53d2479 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 20:27:43 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(im):=20=E7=BE=A4=E9=80=9A?= =?UTF-8?q?=E8=AF=9D=E5=8F=91=E8=B5=B7/=E6=8E=A5=E5=90=AC=E6=97=B6?= =?UTF-8?q?=E4=B8=BB=E5=8A=A8=E5=90=8C=E6=AD=A5=E8=83=B6=E5=9B=8A=E6=9D=A1?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BE=9D=E8=B5=96=20webhook=20?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/im/home/store/rtcStore.ts | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/views/im/home/store/rtcStore.ts b/src/views/im/home/store/rtcStore.ts index b7e679b27..131ffa34b 100644 --- a/src/views/im/home/store/rtcStore.ts +++ b/src/views/im/home/store/rtcStore.ts @@ -146,6 +146,8 @@ export const useRtcStore = defineStore('imRtc', () => { */ function startInviting(data: ImRtcCallRespVO) { call.value = data + // 群通话场景写入本地胶囊条缓存 + syncGroupActiveCall(data) // 更新 stage 状态 if (data.conversationType === ImConversationType.GROUP) { stage.value = ImRtcCallStage.RUNNING @@ -163,14 +165,55 @@ export const useRtcStore = defineStore('imRtc', () => { function showIncoming(payload: ImRtcCallNotification) { incomingPayload.value = payload stage.value = ImRtcCallStage.INCOMING + // 按 inviter 兜底首次填充胶囊条 + syncGroupActiveCall({ + conversationType: payload.conversationType, + room: payload.room, + groupId: payload.groupId, + mediaType: payload.mediaType, + inviterId: payload.inviterUserId ?? 0, + joinedUserIds: payload.inviterUserId ? [payload.inviterUserId] : [], + inviteeIds: payload.inviteeIds + }) } /** 进入通话中阶段 */ function enterRunning(data: ImRtcCallRespVO) { call.value = data + // 离开 INCOMING 阶段;清空来电载荷 incomingPayload.value = null stage.value = ImRtcCallStage.RUNNING startedAt.value = Date.now() + // 接通后用 RespVO 完整覆盖胶囊条 + syncGroupActiveCall(data) + } + + /** + * 群通话场景同步本地 groupActiveCalls 缓存;非群通话或缺 groupId 直接返回; + * 不依赖后端 webhook 推送的 RTC_PARTICIPANT_CONNECTED 首次填充,避免胶囊条出现延迟; + * 被叫场景通知载荷无 joinedUserIds,调用方按主叫人兜底,后续 getActiveCall / 参与者事件刷新成完整列表 + */ + function syncGroupActiveCall(input: { + conversationType: number + room: string + groupId?: number + mediaType: number + inviterId: number + joinedUserIds?: number[] + inviteeIds?: number[] + }) { + if (input.conversationType !== ImConversationType.GROUP || !input.groupId) { + return + } + // 写入或更新群活跃通话缓存 + setGroupCall({ + room: input.room, + groupId: input.groupId, + mediaType: input.mediaType, + inviterId: input.inviterId, + joinedUserIds: input.joinedUserIds ?? [], + inviteeIds: input.inviteeIds ?? [] + }) } /** 重置;通话结束统一调用 */