Merge pull request 'yangjie' (#11) from yangjie into master

Reviewed-on: #11
This commit is contained in:
yangqiang 2024-09-25 11:45:54 +08:00
commit 80150cabdb
4 changed files with 70 additions and 97 deletions

View File

@ -57,8 +57,6 @@ const App: React.FC = () => {
toSrc('/login') toSrc('/login')
} }
window.addEventListener('resize', handleResize); window.addEventListener('resize', handleResize);
window.addEventListener('online', handleNetworkChange);
window.addEventListener('offline', handleNetworkChange);
const originalSetItem = window.localStorage.setItem; const originalSetItem = window.localStorage.setItem;
window.localStorage.setItem = function (key, value) { window.localStorage.setItem = function (key, value) {
originalSetItem.call(this, key, value); originalSetItem.call(this, key, value);
@ -71,8 +69,6 @@ const App: React.FC = () => {
return () => { return () => {
window.removeEventListener('resize', handleResize); window.removeEventListener('resize', handleResize);
window.removeEventListener('customStorageChange', handleCustomStorageChange); window.removeEventListener('customStorageChange', handleCustomStorageChange);
window.removeEventListener('online', handleNetworkChange);
window.removeEventListener('offline', handleNetworkChange);
}; };
}, []); }, []);
useEffect(() => { useEffect(() => {
@ -238,19 +234,6 @@ const App: React.FC = () => {
} }
} }
}; };
const handleNetworkChange = (): void => {
if (location.hash.indexOf('/meeting') === -1) {
if (navigator.onLine) {
message.success('网络已恢复。')
setTimeout(async () => {
await onStart()
}, 1000)
} else {
message.error('网络已断开!')
}
}
}
return ( return (
<> <>
<Routes> <Routes>

View File

@ -11,10 +11,10 @@ import { storage } from '@/utils';
import { GetRoomUser, PostOpenMicr, PostOpenCamera, GetLeaveAll, PostRoomManager, DeleteRoomManager, GetRoomKickout, GetShowUser, PostShowUser, PostMuteAll, GetRoomUserItem, GetApplySpeak } from '@/api/Meeting'; import { GetRoomUser, PostOpenMicr, PostOpenCamera, GetLeaveAll, PostRoomManager, DeleteRoomManager, GetRoomKickout, GetShowUser, PostShowUser, PostMuteAll, GetRoomUserItem, GetApplySpeak } from '@/api/Meeting';
import ImageUrl from '@/utils/package/imageUrl' import ImageUrl from '@/utils/package/imageUrl'
import { agora } from '@/utils/package/agora' import { agora } from '@/utils/package/agora'
import { onInvoke, onSignalr, offSignalr, onStart } from '@/utils/package/signalr'; import { onInvoke, onSignalr, offSignalr } from '@/utils/package/signalr';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import durationPlugin from 'dayjs/plugin/duration'; import durationPlugin from 'dayjs/plugin/duration';
import { AudioVolumeInfo, QualityType, RtcConnection, RtcStats, UserOfflineReasonType, VideoSourceType, VideoStreamType } from 'agora-electron-sdk'; import { AudioVolumeInfo, ConnectionChangedReasonType, ConnectionStateType, QualityType, RtcConnection, RtcStats, UserOfflineReasonType, VideoSourceType, VideoStreamType } from 'agora-electron-sdk';
import Avatar from '@/components/Avatar'; import Avatar from '@/components/Avatar';
import SharedFilesModel from '@/components/SharedFilesModel'; import SharedFilesModel from '@/components/SharedFilesModel';
import StupWizard from '@/components/StupWizard'; import StupWizard from '@/components/StupWizard';
@ -147,13 +147,11 @@ const Meeting: React.FC = () => {
const [currentVideoId, setCurrentVideoId] = useState('') const [currentVideoId, setCurrentVideoId] = useState('')
let [currentSeconds, setCurrentSeconds] = useState(0) let [currentSeconds, setCurrentSeconds] = useState(0)
const [currentEffective, setCurrentEffective] = useState(4) const [currentEffective, setCurrentEffective] = useState(4)
const [currentNetworkInfo, setCurrentNetworkInfo] = useState({ const [networkQuality, setNetworkQuality] = useState({
networkQuality: { level: '佳',
level: '佳', text: '网络质量极好。'
text: '网络质量极好。'
},
networkOther: {} as RtcStats
}) })
const [networkOther, setNetworkOther] = useState<RtcStats>({})
const [isComputerAudio, setIsComputerAudio] = useState(true) const [isComputerAudio, setIsComputerAudio] = useState(true)
const [isFluencyPriority, setIsFluencyPriority] = useState(false) const [isFluencyPriority, setIsFluencyPriority] = useState(false)
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
@ -203,8 +201,6 @@ const Meeting: React.FC = () => {
agoraInit() agoraInit()
storage.setItem('noViewChatList', 0) storage.setItem('noViewChatList', 0)
window.addEventListener('customStorageChange', handleCustomStorageChange); window.addEventListener('customStorageChange', handleCustomStorageChange);
window.addEventListener('online', handleNetworkChange);
window.addEventListener('offline', handleNetworkChange);
const container = document.getElementById('videoView') as HTMLElement; const container = document.getElementById('videoView') as HTMLElement;
container.addEventListener('wheel', handleWheelChange); container.addEventListener('wheel', handleWheelChange);
time = setInterval(() => { time = setInterval(() => {
@ -229,8 +225,6 @@ const Meeting: React.FC = () => {
// }, 3000) // }, 3000)
return () => { return () => {
window.removeEventListener('customStorageChange', handleCustomStorageChange); window.removeEventListener('customStorageChange', handleCustomStorageChange);
window.removeEventListener('online', handleNetworkChange);
window.removeEventListener('offline', handleNetworkChange);
window.removeEventListener('wheel', handleWheelChange); window.removeEventListener('wheel', handleWheelChange);
clearInterval(time) clearInterval(time)
// clearInterval(getDesktopCapturerVideoTime) // clearInterval(getDesktopCapturerVideoTime)
@ -240,48 +234,33 @@ const Meeting: React.FC = () => {
useEffect(() => { useEffect(() => {
switch (currentEffective) { switch (currentEffective) {
case 0: case 0:
setCurrentNetworkInfo({ setNetworkQuality({
...currentNetworkInfo, level: '断开连接',
networkQuality: { text: '网络连接断开。'
level: '断开连接',
text: '网络连接断开。'
}
}) })
break; break;
case 1: case 1:
setCurrentNetworkInfo({ setNetworkQuality({
...currentNetworkInfo, level: '非常差',
networkQuality: { text: '完全无法沟通。'
level: '非常差',
text: '完全无法沟通。'
}
}) })
break; break;
case 2: case 2:
setCurrentNetworkInfo({ setNetworkQuality({
...currentNetworkInfo, level: '差',
networkQuality: { text: '勉强能沟通但不顺畅,网络质量非常差,基本不能沟通。'
level: '差',
text: '勉强能沟通但不顺畅,网络质量非常差,基本不能沟通。'
}
}) })
break; break;
case 3: case 3:
setCurrentNetworkInfo({ setNetworkQuality({
...currentNetworkInfo, level: '良好',
networkQuality: { text: ' 用户主观感受有瑕疵但不影响沟通。'
level: '良好',
text: ' 用户主观感受有瑕疵但不影响沟通。'
}
}) })
break; break;
case 4: case 4:
setCurrentNetworkInfo({ setNetworkQuality({
...currentNetworkInfo, level: '佳',
networkQuality: { text: '网络质量极好。'
level: '佳',
text: '网络质量极好。'
}
}) })
break; break;
} }
@ -764,24 +743,30 @@ const Meeting: React.FC = () => {
setCurrentEffective(3) setCurrentEffective(3)
break; break;
case 4: case 4:
case 5:
setCurrentEffective(2) setCurrentEffective(2)
break; break;
case 6: case 5:
setCurrentEffective(1) setCurrentEffective(1)
break; break;
case 6:
setCurrentEffective(0)
break;
default: default:
setCurrentEffective(navigator.onLine ? 4 : 0) setCurrentEffective(storage.getItem('reconnect') ? 4 : 0)
break; break;
} }
} }
}, },
onRtcStats: async (stats: RtcStats) => { onRtcStats: async (stats: RtcStats) => {
setCurrentNetworkInfo({ setNetworkOther(stats)
...currentNetworkInfo, },
networkOther: stats onConnectionStateChanged: async (_connection: RtcConnection, stateNumber: ConnectionStateType, reason: ConnectionChangedReasonType) => {
}) const reconnectingCode = [2, 16, 11, 13, 14, 12]
} if (stateNumber === 4 && reconnectingCode.indexOf(reason) >= 0) {
storage.setItem('reconnect', false)
message.error('网络断开,请检查网络')
}
},
}) })
if (state.enableCamera) { if (state.enableCamera) {
await agora.startCameraCapture() await agora.startCameraCapture()
@ -935,23 +920,6 @@ const Meeting: React.FC = () => {
} }
changeAgoraDevice() changeAgoraDevice()
} }
// 网络
const handleNetworkChange = (): void => {
if (navigator.onLine) {
message.success('网络已恢复。')
setTimeout(async () => {
await onStart(async () => {
await onInvoke('joinChannel', {
roomNum: state.channelId,
enableMicr: !footerList[0][0].active,
enableCamera: !footerList[0][1].active
})
})
}, 1000)
} else {
message.error('网络已断开!')
}
}
// 滚动 // 滚动
const handleWheelChange = (e: any): void => { const handleWheelChange = (e: any): void => {
const container = document.getElementById('videoView') as HTMLElement; const container = document.getElementById('videoView') as HTMLElement;
@ -1327,12 +1295,24 @@ const Meeting: React.FC = () => {
break; break;
case 'reconnect': case 'reconnect':
if (e.value == true) { if (e.value == true) {
storage.setItem('reconnect', false)
await onInvoke('joinChannel', { await onInvoke('joinChannel', {
roomNum: state.channelId, roomNum: state.channelId,
enableMicr: !footerList[0][0].active, enableMicr: !footerList[0][0].active,
enableCamera: !footerList[0][1].active enableCamera: !footerList[0][1].active
}) })
message.success('网络已连接。')
setRoomUserList((res: any) => {
let userItem = res.find((item: any) => item.uid === userInfo.uid)
if (userItem.isRoomManager) {
DeleteRoomManager({
roomId: state.roomId,
roomNum: state.channelId,
userId: userInfo.uid
})
}
return res
})
} }
break; break;
} }
@ -1631,13 +1611,13 @@ const Meeting: React.FC = () => {
<div style={{ color: 'white' }}> <div style={{ color: 'white' }}>
<div> <div>
<span></span> <span></span>
<span>{currentNetworkInfo.networkQuality.level}</span> <span>{networkQuality.level}</span>
<span> <span>
<Popover <Popover
content={ content={
<span <span
style={{ color: 'white' }}> style={{ color: 'white' }}>
{currentNetworkInfo.networkQuality.text} {networkQuality.text}
</span> </span>
} }
title="" title=""
@ -1651,15 +1631,15 @@ const Meeting: React.FC = () => {
</div> </div>
<div> <div>
<span></span> <span></span>
<span>{currentNetworkInfo.networkOther.txKBitRate}kbps {currentNetworkInfo.networkOther.rxKBitRate}kbps</span> <span>{networkOther.txKBitRate}kbps {networkOther.rxKBitRate}kbps</span>
</div> </div>
<div> <div>
<span></span> <span></span>
<span>{currentNetworkInfo.networkOther.txPacketLossRate}% {currentNetworkInfo.networkOther.rxPacketLossRate}%</span> <span>{networkOther.txPacketLossRate}% {networkOther.rxPacketLossRate}%</span>
</div> </div>
<div> <div>
<span></span> <span></span>
<span>{currentNetworkInfo.networkOther.lastmileDelay}ms</span> <span>{networkOther.lastmileDelay}ms</span>
</div> </div>
</div> </div>
} }
@ -2457,7 +2437,7 @@ const meetingContentError = (item: any) => {
const networkIcon = (network: number) => { const networkIcon = (network: number) => {
switch (network) { switch (network) {
case 0: case 0:
return <svg width="33" height="33" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg"> return <svg width="16" height="16" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_5499_5160)"> <g clip-path="url(#clip0_5499_5160)">
<path d="M2.01914 32.4824C0.969141 32.4824 0.119141 31.6324 0.119141 30.5824V22.9824C0.119141 21.9324 0.969141 21.0824 2.01914 21.0824C3.06914 21.0824 3.91914 21.9324 3.91914 22.9824V30.5824C3.91914 31.6324 3.06914 32.4824 2.01914 32.4824ZM11.4191 32.4824C10.3691 32.4824 9.51914 31.6324 9.51914 30.5824V15.7824C9.51914 14.7324 10.3691 13.8824 11.4191 13.8824C12.4691 13.8824 13.3191 14.7324 13.3191 15.7824V30.5824C13.3191 31.6324 12.4691 32.4824 11.4191 32.4824ZM20.8191 32.4824C19.7691 32.4824 18.9191 31.6324 18.9191 30.5824V9.38242C18.9191 8.33242 19.7691 7.48242 20.8191 7.48242C21.8691 7.48242 22.7191 8.33242 22.7191 9.38242V30.5824C22.7191 31.6324 21.8691 32.4824 20.8191 32.4824ZM30.2191 32.4824C29.1691 32.4824 28.3191 31.6324 28.3191 30.5824V2.38242C28.3191 1.33242 29.1691 0.482422 30.2191 0.482422C31.2691 0.482422 32.1191 1.33242 32.1191 2.38242V30.5824C32.1191 31.6324 31.2691 32.4824 30.2191 32.4824Z" fill="#7C8280" /> <path d="M2.01914 32.4824C0.969141 32.4824 0.119141 31.6324 0.119141 30.5824V22.9824C0.119141 21.9324 0.969141 21.0824 2.01914 21.0824C3.06914 21.0824 3.91914 21.9324 3.91914 22.9824V30.5824C3.91914 31.6324 3.06914 32.4824 2.01914 32.4824ZM11.4191 32.4824C10.3691 32.4824 9.51914 31.6324 9.51914 30.5824V15.7824C9.51914 14.7324 10.3691 13.8824 11.4191 13.8824C12.4691 13.8824 13.3191 14.7324 13.3191 15.7824V30.5824C13.3191 31.6324 12.4691 32.4824 11.4191 32.4824ZM20.8191 32.4824C19.7691 32.4824 18.9191 31.6324 18.9191 30.5824V9.38242C18.9191 8.33242 19.7691 7.48242 20.8191 7.48242C21.8691 7.48242 22.7191 8.33242 22.7191 9.38242V30.5824C22.7191 31.6324 21.8691 32.4824 20.8191 32.4824ZM30.2191 32.4824C29.1691 32.4824 28.3191 31.6324 28.3191 30.5824V2.38242C28.3191 1.33242 29.1691 0.482422 30.2191 0.482422C31.2691 0.482422 32.1191 1.33242 32.1191 2.38242V30.5824C32.1191 31.6324 31.2691 32.4824 30.2191 32.4824Z" fill="#7C8280" />
<path d="M8.98179 2.67253L6.22791 5.42641L3.47403 2.67253C3.11639 2.31489 2.52627 2.31489 2.16863 2.67253C1.81098 3.03018 1.81098 3.62029 2.16863 3.97794L4.9225 6.73182L2.16863 9.48569C1.81098 9.84334 1.81098 10.4335 2.16863 10.7911C2.52627 11.1488 3.11639 11.1488 3.47403 10.7911L6.22791 8.03723L8.98179 10.7911C9.33943 11.1488 9.92955 11.1488 10.2872 10.7911C10.6448 10.4335 10.6448 9.84334 10.2872 9.48569L7.53332 6.73182L10.2872 3.97794C10.6448 3.62029 10.6448 3.03018 10.2872 2.67253C9.92955 2.31489 9.33943 2.31489 8.98179 2.67253Z" fill="#F90000" /> <path d="M8.98179 2.67253L6.22791 5.42641L3.47403 2.67253C3.11639 2.31489 2.52627 2.31489 2.16863 2.67253C1.81098 3.03018 1.81098 3.62029 2.16863 3.97794L4.9225 6.73182L2.16863 9.48569C1.81098 9.84334 1.81098 10.4335 2.16863 10.7911C2.52627 11.1488 3.11639 11.1488 3.47403 10.7911L6.22791 8.03723L8.98179 10.7911C9.33943 11.1488 9.92955 11.1488 10.2872 10.7911C10.6448 10.4335 10.6448 9.84334 10.2872 9.48569L7.53332 6.73182L10.2872 3.97794C10.6448 3.62029 10.6448 3.03018 10.2872 2.67253C9.92955 2.31489 9.33943 2.31489 8.98179 2.67253Z" fill="#F90000" />
@ -2469,14 +2449,14 @@ const networkIcon = (network: number) => {
</defs> </defs>
</svg> </svg>
case 1: case 1:
return <svg width="33" height="33" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg"> return <svg width="16" height="16" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.01914 32.482C0.969141 32.482 0.119141 31.632 0.119141 30.582V22.982C0.119141 21.932 0.969141 21.082 2.01914 21.082C3.06914 21.082 3.91914 21.932 3.91914 22.982V30.582C3.91914 31.632 3.06914 32.482 2.01914 32.482Z" fill="#FF800B" /> <path d="M2.01914 32.482C0.969141 32.482 0.119141 31.632 0.119141 30.582V22.982C0.119141 21.932 0.969141 21.082 2.01914 21.082C3.06914 21.082 3.91914 21.932 3.91914 22.982V30.582C3.91914 31.632 3.06914 32.482 2.01914 32.482Z" fill="#FF800B" />
<path d="M28.3184 30.5824C28.3184 31.6324 29.1684 32.4824 30.2184 32.4824C31.2684 32.4824 32.1184 31.6324 32.1184 30.5824V2.38242C32.1184 1.33242 31.2684 0.482422 30.2184 0.482422C29.1684 0.482422 28.3184 1.33242 28.3184 2.38242V30.5824Z" fill="#7C8280" /> <path d="M28.3184 30.5824C28.3184 31.6324 29.1684 32.4824 30.2184 32.4824C31.2684 32.4824 32.1184 31.6324 32.1184 30.5824V2.38242C32.1184 1.33242 31.2684 0.482422 30.2184 0.482422C29.1684 0.482422 28.3184 1.33242 28.3184 2.38242V30.5824Z" fill="#7C8280" />
<path d="M18.9199 30.5824C18.9199 31.6324 19.7699 32.4824 20.8199 32.4824C21.8699 32.4824 22.7199 31.6324 22.7199 30.5824V9.38242C22.7199 8.33242 21.8699 7.48242 20.8199 7.48242C19.7699 7.48242 18.9199 8.33242 18.9199 9.38242V30.5824Z" fill="#7C8280" /> <path d="M18.9199 30.5824C18.9199 31.6324 19.7699 32.4824 20.8199 32.4824C21.8699 32.4824 22.7199 31.6324 22.7199 30.5824V9.38242C22.7199 8.33242 21.8699 7.48242 20.8199 7.48242C19.7699 7.48242 18.9199 8.33242 18.9199 9.38242V30.5824Z" fill="#7C8280" />
<path d="M9.51953 30.5828C9.51953 31.6328 10.3695 32.4828 11.4195 32.4828C12.4695 32.4828 13.3195 31.6328 13.3195 30.5828V15.7828C13.3195 14.7328 12.4695 13.8828 11.4195 13.8828C10.3695 13.8828 9.51953 14.7328 9.51953 15.7828V30.5828Z" fill="#7C8280" /> <path d="M9.51953 30.5828C9.51953 31.6328 10.3695 32.4828 11.4195 32.4828C12.4695 32.4828 13.3195 31.6328 13.3195 30.5828V15.7828C13.3195 14.7328 12.4695 13.8828 11.4195 13.8828C10.3695 13.8828 9.51953 14.7328 9.51953 15.7828V30.5828Z" fill="#7C8280" />
</svg> </svg>
case 2: case 2:
return <svg width="33" height="33" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg"> return <svg width="16" height="16" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.01914 32.482C0.969141 32.482 0.119141 31.632 0.119141 30.582V22.982C0.119141 21.932 0.969141 21.082 2.01914 21.082C3.06914 21.082 3.91914 21.932 3.91914 22.982V30.582C3.91914 31.632 3.06914 32.482 2.01914 32.482Z" fill="#FF800B" /> <path d="M2.01914 32.482C0.969141 32.482 0.119141 31.632 0.119141 30.582V22.982C0.119141 21.932 0.969141 21.082 2.01914 21.082C3.06914 21.082 3.91914 21.932 3.91914 22.982V30.582C3.91914 31.632 3.06914 32.482 2.01914 32.482Z" fill="#FF800B" />
<path d="M28.3184 30.5824C28.3184 31.6324 29.1684 32.4824 30.2184 32.4824C31.2684 32.4824 32.1184 31.6324 32.1184 30.5824V2.38242C32.1184 1.33242 31.2684 0.482422 30.2184 0.482422C29.1684 0.482422 28.3184 1.33242 28.3184 2.38242V30.5824Z" fill="#7C8280" /> <path d="M28.3184 30.5824C28.3184 31.6324 29.1684 32.4824 30.2184 32.4824C31.2684 32.4824 32.1184 31.6324 32.1184 30.5824V2.38242C32.1184 1.33242 31.2684 0.482422 30.2184 0.482422C29.1684 0.482422 28.3184 1.33242 28.3184 2.38242V30.5824Z" fill="#7C8280" />
<path d="M18.9199 30.5824C18.9199 31.6324 19.7699 32.4824 20.8199 32.4824C21.8699 32.4824 22.7199 31.6324 22.7199 30.5824V9.38242C22.7199 8.33242 21.8699 7.48242 20.8199 7.48242C19.7699 7.48242 18.9199 8.33242 18.9199 9.38242V30.5824Z" fill="#7C8280" /> <path d="M18.9199 30.5824C18.9199 31.6324 19.7699 32.4824 20.8199 32.4824C21.8699 32.4824 22.7199 31.6324 22.7199 30.5824V9.38242C22.7199 8.33242 21.8699 7.48242 20.8199 7.48242C19.7699 7.48242 18.9199 8.33242 18.9199 9.38242V30.5824Z" fill="#7C8280" />

View File

@ -13,7 +13,9 @@ import {
RtcConnection, RtcConnection,
RtcStats, RtcStats,
AudioVolumeInfo, AudioVolumeInfo,
UserOfflineReasonType UserOfflineReasonType,
ConnectionStateType,
ConnectionChangedReasonType
} from "agora-electron-sdk"; } from "agora-electron-sdk";
import { GetRoomRtcToken, GetAgoraConf } from "@/api/Home/Index"; import { GetRoomRtcToken, GetAgoraConf } from "@/api/Home/Index";
import { storage } from '@/utils'; import { storage } from '@/utils';
@ -109,7 +111,7 @@ export const agora = {
}, 1000); }, 1000);
}, },
// 事件回调 // 事件回调
registerEventHandler: ({ onJoinChannelSuccess, onUserJoined, onUserOffline, onAudioVolumeIndication, onNetworkQuality, onRtcStats }: any) => { registerEventHandler: ({ onJoinChannelSuccess, onUserJoined, onUserOffline, onAudioVolumeIndication, onNetworkQuality, onRtcStats, onConnectionStateChanged }: any) => {
rtcEngine.registerEventHandler({ rtcEngine.registerEventHandler({
// 监听本地用户加入频道事件 // 监听本地用户加入频道事件
onJoinChannelSuccess: async (connection: RtcConnection, elapsed: number) => { onJoinChannelSuccess: async (connection: RtcConnection, elapsed: number) => {
@ -147,6 +149,10 @@ export const agora = {
onRtcStats: async (_connection: RtcConnection, stats: RtcStats) => { onRtcStats: async (_connection: RtcConnection, stats: RtcStats) => {
await onRtcStats(stats) await onRtcStats(stats)
}, },
// 网络连接状态已改变回调。
onConnectionStateChanged: async (connection: RtcConnection, state: ConnectionStateType, reason: ConnectionChangedReasonType) => {
await onConnectionStateChanged(connection, state, reason)
},
}); });
}, },
// 获取视图模式 // 获取视图模式

View File

@ -68,7 +68,9 @@ export default defineConfig({
RtcConnection, RtcConnection,
RtcStats, RtcStats,
AudioVolumeInfo, AudioVolumeInfo,
UserOfflineReasonType UserOfflineReasonType,
ConnectionStateType,
ConnectionChangedReasonType
} = require("agora-electron-sdk") } = require("agora-electron-sdk")
export { export {
createAgoraRtcEngine, createAgoraRtcEngine,
@ -85,7 +87,9 @@ export default defineConfig({
RtcConnection, RtcConnection,
RtcStats, RtcStats,
AudioVolumeInfo, AudioVolumeInfo,
UserOfflineReasonType UserOfflineReasonType,
ConnectionStateType,
ConnectionChangedReasonType
} }
`, `,
}) })