From 6972e15530578049394e99bd7dd82a8f338433c7 Mon Sep 17 00:00:00 2001 From: Tristan Yang Date: Mon, 3 Apr 2023 22:03:31 +0800 Subject: [PATCH] feat: reconnecting detect --- src/app/slices/voice.ts | 11 +++++++++-- src/common/component/Voice.tsx | 10 ++++++++-- src/routes/chat/RTCWidget.tsx | 6 ++++-- src/routes/chat/VoiceChat/VoiceManagement.tsx | 10 +++++++++- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/app/slices/voice.ts b/src/app/slices/voice.ts index 8930a5d9..fba90f45 100644 --- a/src/app/slices/voice.ts +++ b/src/app/slices/voice.ts @@ -1,5 +1,6 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { KEY_UID } from "../config"; +import { ConnectionState } from "agora-rtc-sdk-ng"; export type VoiceBasicInfo = { context: "channel" | "dm" @@ -10,7 +11,8 @@ export type VoicingInfo = { downlinkNetworkQuality?: number, muted?: boolean, deafen?: boolean, - joining?: boolean + joining?: boolean, + connectionState?: ConnectionState } & VoiceBasicInfo export type VoicingMemberInfo = { @@ -88,6 +90,11 @@ const voiceSlice = createSlice({ } } }, + updateConnectionState(state, { payload }: PayloadAction) { + if (state.voicing) { + state.voicing.connectionState = payload; + } + }, updateVoicingNetworkQuality(state, { payload }: PayloadAction) { if (state.voicing) { state.voicing.downlinkNetworkQuality = payload; @@ -134,5 +141,5 @@ const voiceSlice = createSlice({ }, }); -export const { addVoiceMember, removeVoiceMember, upsertVoiceList, updateVoicingInfo, updateVoicingNetworkQuality, updateMuteStatus, updateVoicingMember, updateDeafenStatus } = voiceSlice.actions; +export const { updateConnectionState, addVoiceMember, removeVoiceMember, upsertVoiceList, updateVoicingInfo, updateVoicingNetworkQuality, updateMuteStatus, updateVoicingMember, updateDeafenStatus } = voiceSlice.actions; export default voiceSlice.reducer; diff --git a/src/common/component/Voice.tsx b/src/common/component/Voice.tsx index d3599faf..7c452075 100644 --- a/src/common/component/Voice.tsx +++ b/src/common/component/Voice.tsx @@ -3,7 +3,7 @@ import { memo, useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { useGetAgoraConfigQuery, useGetAgoraVoicingListQuery, useLazyGetAgoraTokenQuery } from '../../app/services/server'; import { updateChannelVisibleAside } from '../../app/slices/channels'; -import { addVoiceMember, removeVoiceMember, updateDeafenStatus, updateMuteStatus, updateVoicingInfo, updateVoicingMember, updateVoicingNetworkQuality, upsertVoiceList } from '../../app/slices/voice'; +import { addVoiceMember, removeVoiceMember, updateConnectionState, updateDeafenStatus, updateMuteStatus, updateVoicingInfo, updateVoicingMember, updateVoicingNetworkQuality, upsertVoiceList } from '../../app/slices/voice'; import { useAppSelector } from '../../app/store'; import AudioJoin from '../../assets/join.wav'; // type Props = {} @@ -25,7 +25,7 @@ const Voice = () => { secret: agoraConfig?.rtm_secret ?? "", }, { - skip: !isAdmin || !agoraConfig, + skip: !isAdmin || !agoraConfig || !navigator.onLine, pollingInterval: 5000 }); const dispatch = useDispatch(); @@ -43,6 +43,7 @@ const Voice = () => { if (mediaType == "audio") { // 播放远端音频 user.audioTrack?.play(); + // const playing= user.audioTrack?.isPlaying; // const level = user.audioTrack?.getVolumeLevel(); // if (level === 0) { // // 远端静音 @@ -80,6 +81,11 @@ const Voice = () => { const { downlinkNetworkQuality } = qlt; dispatch(updateVoicingNetworkQuality(downlinkNetworkQuality)); }); + // 连接状态有变化 + agoraEngine.on("connection-state-change", (state, prevState, reason) => { + console.log("connection-state-change", state, prevState, reason); + dispatch(updateConnectionState(state)); + }); // 用户状态变化 agoraEngine.on("user-info-updated", (uid, msg) => { console.log("user-info-updated", uid, msg); diff --git a/src/routes/chat/RTCWidget.tsx b/src/routes/chat/RTCWidget.tsx index 779b9f4c..68582d16 100644 --- a/src/routes/chat/RTCWidget.tsx +++ b/src/routes/chat/RTCWidget.tsx @@ -1,4 +1,6 @@ // import React from 'react'; +import { useTranslation } from 'react-i18next'; +import clsx from 'clsx'; import { useAppSelector } from '../../app/store'; import User from '../../common/component/User'; import IconMic from '../../assets/icons/mic.on.svg'; @@ -9,7 +11,6 @@ import IconSoundOff from '../../assets/icons/sound.off.svg'; import { useVoice } from '../../common/component/Voice'; import Signal from '../../common/component/Signal'; import Tooltip from '../../common/component/Tooltip'; -import { useTranslation } from 'react-i18next'; type Props = { id: number, @@ -29,6 +30,7 @@ const RTCWidget = ({ id, context = "channel" }: Props) => { if (!loginUser || !voicingInfo || joining) return null; const name = voicingInfo.context == "channel" ? channelData[voicingInfo.id]?.name : userData[voicingInfo.id]?.name; if (!name) return null; + const isReConnecting = voicingInfo.connectionState == "RECONNECTING"; return (
{/* {voicingInfo && */} @@ -36,7 +38,7 @@ const RTCWidget = ({ id, context = "channel" }: Props) => {
- Voice Connected + {isReConnecting ? `Voice Reconnecting...` : `Voice Connected`} {voicingInfo.context == "channel" ? "Channel" : "DM"} / {voicingInfo.context == "channel" ? channelData[voicingInfo.id].name : userData[voicingInfo.id].name}
diff --git a/src/routes/chat/VoiceChat/VoiceManagement.tsx b/src/routes/chat/VoiceChat/VoiceManagement.tsx index 0cd4d9a8..333e95f9 100644 --- a/src/routes/chat/VoiceChat/VoiceManagement.tsx +++ b/src/routes/chat/VoiceChat/VoiceManagement.tsx @@ -12,7 +12,6 @@ import IconMicOff from '../../../assets/icons/mic.off.svg'; import StyledButton from '../../../common/component/styled/Button'; import IconCallOff from '../../../assets/icons/call.off.svg'; import Tooltip from '../../../common/component/Tooltip'; -import SpeakingAnimate from './SpeakingAnimate'; // import User from '../../../common/component/User'; type Props = { @@ -40,6 +39,14 @@ const VoiceManagement = ({ info, setMute, setDeafen, leave }: Props) => { Connecting to voice channel...
; } + if (info.connectionState == "RECONNECTING") { + return
+ + Reconnecting... + + Please check network connection! +
; + } return (
    @@ -95,6 +102,7 @@ const VoiceManagement = ({ info, setMute, setDeafen, leave }: Props) => {
+ ); };