yangjie #51

Open
yangqiang wants to merge 34 commits from yangjie into master
5 changed files with 230 additions and 37 deletions
Showing only changes of commit 2c11b8e726 - Show all commits

BIN
src/assets/icon57.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

View File

@ -53,14 +53,14 @@ const SpeakerModeModal = forwardRef((props: any, ref: any) => {
}) })
const FreedomMode: React.FC<Props> = ({ onClick, meetingMode }) => { const FreedomMode: React.FC<Props> = ({ onClick, meetingMode }) => {
// 自由者模式 // 宫格模式
return ( return (
<> <>
<div className={styles.freedomMode} onClick={onClick}> <div className={styles.freedomMode} onClick={onClick}>
<div className={`${meetingMode === 'FreedomMode' ? styles.active : ''}`}> <div className={`${meetingMode === 'FreedomMode' ? styles.active : ''}`}>
{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].map(item => <div key={item}></div>)} {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16].map(item => <div key={item}></div>)}
</div> </div>
<span></span> <span></span>
</div> </div>
</> </>
) )

View File

@ -10,7 +10,7 @@
.meetingContentUserName { .meetingContentUserName {
display: flex; display: flex;
align-items: center; align-items: center;
background-color: #0000009E; background-color: rgba(0, 0, 0, 0.62);
border-radius: 6px; border-radius: 6px;
height: 24px; height: 24px;
padding: 0 4px; padding: 0 4px;
@ -285,14 +285,126 @@
} }
} }
// 宫格模式
// 1
.meetingContentBodyLeftFreedomModeOne {
width: 100%;
height: 100%;
// 自由者模式 .meetingContentSwiperCard {
.meetingContentBodyLeftFreedomMode { width: 100%;
height: 100%;
}
}
// 2
.meetingContentBodyLeftFreedomModeTwo {
width: 100%;
height: 100%;
display: flex;
.meetingContentSwiperCard {
width: 50%;
height: 100%;
}
}
// 3 4
.meetingContentBodyLeftFreedomModeThree {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
overflow-y: auto; justify-content: center;
.meetingContentSwiperCard {
width: 50%;
height: 50%;
}
}
//5 6
.meetingContentBodyLeftFreedomModeFour {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 3);
height: 50%;
}
}
// 7
.meetingContentBodyLeftFreedomModeFive {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 4);
height: 50%;
}
}
//8 9
.meetingContentBodyLeftFreedomModeSix {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 3);
height: calc(100% / 3);
}
}
// 10 11 12
.meetingContentBodyLeftFreedomModeSeven {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 4);
height: calc(100% / 3);
}
}
// 13 14 15 16
.meetingContentBodyLeftFreedomModeEight {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 4);
height: calc(100% / 4);
}
}
// 17 18 19 20
.meetingContentBodyLeftFreedomModeNine {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
.meetingContentSwiperCard {
width: calc(100% / 5);
height: calc(100% / 4);
}
} }
// 标准模式 // 标准模式
@ -309,9 +421,6 @@
.meetingContentSwiperCard { .meetingContentSwiperCard {
width: 100%; width: 100%;
}
.meetingContentSwiperCard {
height: 160px; height: 160px;
} }
} }

View File

@ -184,7 +184,7 @@ const Meeting: React.FC = () => {
const [isClickLock, setIsClickLock] = useState(false) const [isClickLock, setIsClickLock] = useState(false)
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [modeOpen, setModeOpen] = useState(false) const [modeOpen, setModeOpen] = useState(false)
const [meetingMode, setMeetingMode] = useState('') const [meetingMode, setMeetingMode] = useState('FreedomMode')
const [userSearchValue, setUserSearchValue] = useState('') const [userSearchValue, setUserSearchValue] = useState('')
const [noViewChatList, setNoViewChatList] = useState(0) const [noViewChatList, setNoViewChatList] = useState(0)
const [currentLookUserAccount, setCurrentLookUserAccount] = useState<any>('') const [currentLookUserAccount, setCurrentLookUserAccount] = useState<any>('')
@ -235,7 +235,6 @@ const Meeting: React.FC = () => {
} }
}) })
setKeyOpenChildWindow('shareScreenWindow', false) setKeyOpenChildWindow('shareScreenWindow', false)
setMeetingMode('StandardMode');
agoraInit() agoraInit()
storage.setItem('noViewChatList', 0) storage.setItem('noViewChatList', 0)
window.addEventListener('customStorageChange', handleCustomStorageChange); window.addEventListener('customStorageChange', handleCustomStorageChange);
@ -639,18 +638,23 @@ const Meeting: React.FC = () => {
if (isShare) { if (isShare) {
const item = roomUserList.find((item: any) => item.screenShareId === String(isShare)) const item = roomUserList.find((item: any) => item.screenShareId === String(isShare))
setIsShareUser(item || null) setIsShareUser(item || null)
setMeetingMode('StandardMode')
} }
}, [isShare, roomUserList]); }, [isShare, roomUserList]);
useEffect(() => { useEffect(() => {
roomUserList.forEach(async (item: any) => { roomUserList.forEach(async (item: any) => {
if (item.uid === currentVideoId) { if (meetingMode === "FreedomMode") {
await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamHigh, true) await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamHigh, true)
} else { } else {
await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamLow, true) if (item.uid === currentVideoId) {
await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamHigh, true)
} else {
await agora.setRemoteVideoStreamType(item.uid, VideoStreamType.VideoStreamLow, true)
}
} }
}); });
}, [currentVideoId, roomUserList]); }, [currentVideoId, roomUserList, meetingMode]);
useEffect(() => { useEffect(() => {
let item = roomUserList.find((item: any) => currentVideoId == item.uid) let item = roomUserList.find((item: any) => currentVideoId == item.uid)
@ -739,7 +743,7 @@ const Meeting: React.FC = () => {
break; break;
// 更新视图模式 // 更新视图模式
case 'RefreshView': case 'RefreshView':
setMeetingMode(item.type)
break; break;
// 全员看他 // 全员看他
case 'ShowUser': case 'ShowUser':
@ -752,6 +756,7 @@ const Meeting: React.FC = () => {
} }
} }
} }
setMeetingMode('StandardMode')
getShowUser() getShowUser()
break; break;
// 用户加入频道回调 // 用户加入频道回调
@ -990,12 +995,15 @@ const Meeting: React.FC = () => {
uid: temp.uid, uid: temp.uid,
enableMicr: temp.enableMicr enableMicr: temp.enableMicr
}) })
} else { } else if (temp.type === 'video') {
await PostOpenCamera({ await PostOpenCamera({
roomNum: temp.roomNum, roomNum: temp.roomNum,
uid: temp.uid, uid: temp.uid,
enableCamera: temp.enableCamera enableCamera: temp.enableCamera
}) })
} else if (temp.type === 'mode') {
message.success(`管理员已将会议室显示模式更新为${getMeetingContentBodyLeftModeText(temp.mode)}`)
setMeetingMode(temp.mode)
} }
} catch (error) { } catch (error) {
@ -1581,7 +1589,11 @@ const Meeting: React.FC = () => {
item.isShow = true; item.isShow = true;
} }
}); });
setIsAdmin(res.filter((item: any) => (role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom).length) const peoPleLength = res.filter((item: any) => (role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom).length
setIsAdmin(peoPleLength)
if (peoPleLength >= 6) {
setMeetingMode('StandardMode')
}
return res return res
}) })
} }
@ -2236,6 +2248,9 @@ const Meeting: React.FC = () => {
const handleCustomStorageChange = async (e: any): Promise<void> => { const handleCustomStorageChange = async (e: any): Promise<void> => {
switch (e.key) { switch (e.key) {
case 'meetingMode': case 'meetingMode':
if (e.value !== 'FreedomMode') {
await getShowUser()
}
setMeetingMode(e.value) setMeetingMode(e.value)
break; break;
case 'quitMeeting': case 'quitMeeting':
@ -2456,10 +2471,37 @@ const Meeting: React.FC = () => {
}) })
} }
// 获取当前模式样式 // 获取当前模式样式
const getMeetingContentBodyLeftModeClass = (): string => { const getMeetingContentBodyLeftModeClass = (people: Number): string => {
switch (meetingMode) { switch (meetingMode) {
case 'FreedomMode': case 'FreedomMode':
return styles.meetingContentBodyLeftFreedomMode switch (people) {
case 1:
return styles.meetingContentBodyLeftFreedomModeOne;
case 2:
return styles.meetingContentBodyLeftFreedomModeTwo;
case 3:
case 4:
return styles.meetingContentBodyLeftFreedomModeThree;
case 5:
case 6:
return styles.meetingContentBodyLeftFreedomModeFour;
case 7:
return styles.meetingContentBodyLeftFreedomModeFive;
case 8:
case 9:
return styles.meetingContentBodyLeftFreedomModeSix;
case 10:
case 11:
case 12:
return styles.meetingContentBodyLeftFreedomModeSeven;
case 13:
case 14:
case 15:
case 16:
return styles.meetingContentBodyLeftFreedomModeEight;
default:
return styles.meetingContentBodyLeftFreedomModeNine;
}
case 'StandardMode': case 'StandardMode':
return styles.meetingContentBodyLeftStandardMode return styles.meetingContentBodyLeftStandardMode
case 'SpeakerMode': case 'SpeakerMode':
@ -2474,10 +2516,10 @@ const Meeting: React.FC = () => {
return '' return ''
} }
// 获取当前模式文字 // 获取当前模式文字
const getMeetingContentBodyLeftModeText = (): string => { const getMeetingContentBodyLeftModeText = (mode?: string): string => {
switch (meetingMode) { switch (mode || meetingMode) {
case 'FreedomMode': case 'FreedomMode':
return '自由者模式' return '宫格模式'
case 'StandardMode': case 'StandardMode':
return '标准模式' return '标准模式'
case 'SpeakerMode': case 'SpeakerMode':
@ -2575,6 +2617,32 @@ const Meeting: React.FC = () => {
} }
message.success('操作成功') message.success('操作成功')
} }
// 设置模式
const setSyncView = (mode: string) => {
confirm({
title: '提示',
icon: <ExclamationCircleFilled />,
content: `是否将当前房间切换为${getMeetingContentBodyLeftModeText(mode)}?`,
centered: true,
okText: '确定',
cancelText: '取消',
async onOk() {
await window.electron.onInvoke('sendOper2User', {
uid: userInfo.uid,
contentString: JSON.stringify({
mode,
type: 'mode'
})
})
setModeOpen(false)
storage.setItem('meetingMode', mode)
},
onCancel() {
setModeOpen(false)
storage.setItem('meetingMode', mode)
}
})
}
// 判断是否出现滚动条 // 判断是否出现滚动条
const hasScrollbar = () => { const hasScrollbar = () => {
let element = document.getElementById('videoView') as HTMLDivElement let element = document.getElementById('videoView') as HTMLDivElement
@ -2773,19 +2841,23 @@ const Meeting: React.FC = () => {
<span className='drag' style={{ marginTop: '2px', marginLeft: '4px' }}><Code roomNum={state.channelId}></Code></span> <span className='drag' style={{ marginTop: '2px', marginLeft: '4px' }}><Code roomNum={state.channelId}></Code></span>
</div> </div>
<div className='drag'> <div className='drag'>
<Popover {role.ID.includes(userInfo.roleId) ? <Popover
content={ content={
<div className='modePopover'> <div className='modePopover'>
<div onClick={() => { <div onClick={() => {
setModeOpen(false) setSyncView('FreedomMode')
storage.setItem('meetingMode', 'StandardMode') }}>
<img src={ImageUrl.icon57} alt="" />
<span></span>
</div>
<div onClick={() => {
setSyncView('StandardMode')
}}> }}>
<img src={ImageUrl.icon43} alt="" /> <img src={ImageUrl.icon43} alt="" />
<span></span> <span></span>
</div> </div>
<div onClick={() => { <div onClick={() => {
setModeOpen(false) setSyncView('SpeakerMode')
storage.setItem('meetingMode', 'SpeakerMode')
}}> }}>
<img src={ImageUrl.icon44} alt="" /> <img src={ImageUrl.icon44} alt="" />
<span></span> <span></span>
@ -2803,10 +2875,14 @@ const Meeting: React.FC = () => {
onOpenChange={() => setModeOpen(true)} onOpenChange={() => setModeOpen(true)}
> >
<div className={styles.meetingGrayButton}> <div className={styles.meetingGrayButton}>
{meetingMode === 'StandardMode' ? <img src={ImageUrl.icon43} alt="" /> : <img src={ImageUrl.icon44} alt="" />} {meetingMode === 'StandardMode' ?
<img src={ImageUrl.icon43} alt="" /> :
meetingMode === 'FreedomMode' ?
<img src={ImageUrl.icon57} alt="" /> :
<img src={ImageUrl.icon44} alt="" />}
<span>{getMeetingContentBodyLeftModeText()}</span> <span>{getMeetingContentBodyLeftModeText()}</span>
</div> </div>
</Popover> </Popover> : null}
<Operation></Operation> <Operation></Operation>
</div> </div>
</div> </div>
@ -2814,7 +2890,7 @@ const Meeting: React.FC = () => {
<div className={styles.meetingContentBody}> <div className={styles.meetingContentBody}>
<div className={`${styles.meetingContentBodyLeft} drag`}> <div className={`${styles.meetingContentBodyLeft} drag`}>
{isAdmin && currentLookUserAccount ? getSettingIcon() : null} {isAdmin && currentLookUserAccount ? getSettingIcon() : null}
<div className={getMeetingContentBodyLeftModeClass()} id='videoView' style={meetingMode === 'SpeakerMode' && isVideoFullScreen ? { width: '0' } : {}}> <div className={getMeetingContentBodyLeftModeClass(isAdmin)} id='videoView' style={meetingMode === 'SpeakerMode' && isVideoFullScreen ? { width: '0' } : {}}>
{roomUserList.map((item: any, index: number) => { {roomUserList.map((item: any, index: number) => {
return (item.isRoom && item.isAdmin ? <div return (item.isRoom && item.isAdmin ? <div
id={item.uid} id={item.uid}
@ -2939,7 +3015,13 @@ const Meeting: React.FC = () => {
</div> : null) </div> : null)
} }
)} )}
{hasScrollbar() ? <div> {/* <div className={`${styles.meetingContentSwiperCard}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`}>
<div className={styles.meetingContentSwiperCardVdeioLoading}>
</div>
</div>
</div> */}
{meetingMode !== "FreedomMode" && hasScrollbar() ? <div>
{meetingMode === "StandardMode" ? <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: '20px', top: '66px' }} onClick={() => { {meetingMode === "StandardMode" ? <div className={`${styles.meetingContentSwiperCaret}`} style={{ left: '20px', top: '66px' }} onClick={() => {
const container = document.getElementById('videoView') as HTMLElement; const container = document.getElementById('videoView') as HTMLElement;
container.scrollLeft -= 100 container.scrollLeft -= 100
@ -2963,7 +3045,7 @@ const Meeting: React.FC = () => {
<CaretDownOutlined /> <CaretDownOutlined />
</div>} </div>}
</div> : null} </div> : null}
{currentLookUserStatus === 0 ? {meetingMode !== "FreedomMode" && currentLookUserStatus === 0 ?
<div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}> <div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-camera-primary'> <div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-camera-primary'>
{<div className={styles.meetingContentSwiperCardVdeioLoading}> {<div className={styles.meetingContentSwiperCardVdeioLoading}>
@ -2974,7 +3056,7 @@ const Meeting: React.FC = () => {
<FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />} <FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />}
{meetingContentUser(currentLookUserAccount, true)} {meetingContentUser(currentLookUserAccount, true)}
</div> : null} </div> : null}
{currentLookUserStatus === 1 ? {meetingMode !== "FreedomMode" && currentLookUserStatus === 1 ?
<div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}> <div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-camera-primary'> <div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-camera-primary'>
{<div className={styles.meetingContentSwiperCardVdeioLoading}> {<div className={styles.meetingContentSwiperCardVdeioLoading}>
@ -2986,7 +3068,7 @@ const Meeting: React.FC = () => {
{meetingContentUser(currentLookUserAccount, true)} {meetingContentUser(currentLookUserAccount, true)}
{currentLookUserAccount.enableCamera ? null : meetingContentError(currentLookUserAccount)} {currentLookUserAccount.enableCamera ? null : meetingContentError(currentLookUserAccount)}
</div> : null} </div> : null}
{currentLookUserStatus === 2 ? {meetingMode !== "FreedomMode" && currentLookUserStatus === 2 ?
<div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}> <div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-screen'> <div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-screen'>
<div className={styles.meetingContentSwiperCardVdeioLoading}> <div className={styles.meetingContentSwiperCardVdeioLoading}>
@ -2997,7 +3079,7 @@ const Meeting: React.FC = () => {
<FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />} <FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />}
{meetingContentUser(currentLookUserAccount, true)} {meetingContentUser(currentLookUserAccount, true)}
</div> : null} </div> : null}
{currentLookUserStatus === 3 ? {meetingMode !== "FreedomMode" && currentLookUserStatus === 3 ?
<div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}> <div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-remote-screen'> <div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-remote-screen'>
<div className={styles.meetingContentSwiperCardVdeioLoading}> <div className={styles.meetingContentSwiperCardVdeioLoading}>
@ -3008,7 +3090,7 @@ const Meeting: React.FC = () => {
<FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />} <FullscreenOutlined className={styles.meetingContentSwiperCardFullScreenIcon} title='全屏' onClick={() => setIsVideoFullScreen(true)} />}
{meetingContentUser(currentLookUserAccount, true)} {meetingContentUser(currentLookUserAccount, true)}
</div> : null} </div> : null}
{currentLookUserStatus === 4 ? {meetingMode !== "FreedomMode" && currentLookUserStatus === 4 ?
<div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}> <div className={`${styles.meetingContentSwiperCard} ${setMeetingContentSwiperCardClass()} ${setMeetingContentSwiperCardFullScreenClass()}`}>
<div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-remote-camera'> <div className={`${styles.meetingContentSwiperCardVdeio}`} id='video-source-remote-camera'>
<div className={styles.meetingContentSwiperCardVdeioLoading}> <div className={styles.meetingContentSwiperCardVdeioLoading}>

View File

@ -86,6 +86,7 @@ import icon54 from '@/assets/icon54.png'
import icon55 from '@/assets/icon55.png' import icon55 from '@/assets/icon55.png'
import icon56 from '@/assets/icon56.png' import icon56 from '@/assets/icon56.png'
import icon56Active from '@/assets/icon56-active.png' import icon56Active from '@/assets/icon56-active.png'
import icon57 from '@/assets/icon57.png'
export default { export default {
loading, loading,
icon, icon,
@ -174,5 +175,6 @@ export default {
icon54, icon54,
icon55, icon55,
icon56, icon56,
icon56Active icon56Active,
icon57,
} }