WGShare.Client.Electron/src/components/UserVideo/index.tsx

158 lines
5.1 KiB
TypeScript

import styles from '@/components/UserVideo/index.module.scss'
import { GetPolling } from '@/api/Meeting';
import { agora } from '@/utils/package/agora';
import { Button, Empty, Select, message } from 'antd';
import { useEffect, useState, memo } from "react";
import { useLocation } from 'react-router';
import { VideoStreamType } from 'agora-electron-sdk';
const { setInterval, clearInterval } = require('timers');
const UserVideo: React.FC = () => {
const { state } = useLocation();
const [from, setFrom] = useState<any>({
cycleIntervalList: [
{ value: 30, label: '30秒' },
{ value: 60, label: '1分钟' },
{ value: 120, label: '2分钟' },
{ value: 180, label: '3分钟' },
],
cycleIntervalValue: 30,
viewPeople: [
{ value: 6, label: '6人' },
{ value: 12, label: '12人' },
// { value: 20, label: '20人' },
],
viewPeopleValue: 6,
})
const [timeNumber, setTimeNumber] = useState(30);
const [timeStatus, setTimeStatus] = useState(false);
const [userList, setUserList] = useState([]);
useEffect(() => {
window.addEventListener('customStorageChange', handleCustomStorageChange);
return () => {
window.removeEventListener('customStorageChange', handleCustomStorageChange);
}
}, []);
useEffect(() => {
let time = null as any;
if (timeStatus) {
time = setInterval(() => {
setTimeNumber((timeNumber: number) => {
if (timeNumber === 1) {
getPolling()
message.success('刷新成功!')
return from.cycleIntervalValue
} else {
return timeNumber - 1
}
})
}, 1000)
} else {
clearInterval(time)
}
return () => {
clearInterval(time)
}
}, [timeStatus])
useEffect(() => {
getPolling()
}, [from.viewPeopleValue])
useEffect(() => {
userList.forEach(async (item: any) => {
await agora.destroyRendererByConfig(Number('1' + item.screenShareId), state.channelId + 'a')
await agora.setupRemoteVideoEx({
uid: Number('1' + item.screenShareId),
view: document.getElementById(`video-${item.screenShareId}`),
channelId: state.channelId + 'a',
})
await agora.setRemoteVideoStreamType(Number('1' + item.screenShareId), VideoStreamType.VideoStreamLow, false)
})
}, [userList])
// 监听缓存变化
const handleCustomStorageChange = async (e: any): Promise<void> => {
switch (e.key) {
}
};
// 获取轮训用户
const getPolling = async (): Promise<void> => {
setUserList([])
setFrom((res: any) => {
GetPolling(state.channelId?.split('a')[0] as string, res.viewPeopleValue).then((res: any) => {
if (res.code === 200) {
setUserList(res.data)
}
})
return res
})
};
return (
<>
<div className={styles.userVideo}>
<div className={`${styles.userVideoContent}`}>
<div className={styles.userVideoContentHeader}>
<div>
<div>
<span></span>
<Select
placeholder='请选择循环间隔'
options={from.cycleIntervalList}
size={'small'}
value={from.cycleIntervalValue} onChange={(e) => {
setFrom({ ...from, cycleIntervalValue: e })
setTimeNumber(e)
}} />
</div>
<div>
<span></span>
<Select
placeholder='请选择查看人数'
options={from.viewPeople}
size={'small'}
value={from.viewPeopleValue} onChange={(e) => {
setFrom({ ...from, viewPeopleValue: e })
}} />
</div>
</div>
<div>
<span>{timeNumber}</span>
{timeStatus ? <Button
type="primary"
size={'small'}
onClick={() => {
setTimeStatus(!timeStatus)
}}
style={{ backgroundColor: '#EC3C3C' }}
></Button> :
<Button
type="primary"
className='m-ant-btn'
size={'small'}
onClick={() => {
setTimeStatus(!timeStatus)
}}
></Button>}
</div>
</div>
{userList.length ? <div className={styles.userVideoContentList}>
{
userList.map((item: any, index: number) => {
return <div className={styles.userVideoContentListItem} key={index}>
<div className={styles.userVideoContentListItemVideo} id={`video-${item.screenShareId}`}>
<div>{item.userName}{item.isRoomManager ? '(发言中)' : ''}</div>
</div>
</div>
})
}
</div> :
<Empty style={{ margin: 'auto' }} />}
</div>
</div>
</>
)
}
export default memo(UserVideo)