图标点击优化

This commit is contained in:
yj 2024-08-23 13:39:19 +08:00
parent f03f589854
commit d271955812
11 changed files with 125 additions and 38 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 973 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -39,75 +39,96 @@ const Meeting: React.FC = () => {
const [sharedScreenList, setSharedScreenList] = useState<any>([]); const [sharedScreenList, setSharedScreenList] = useState<any>([]);
const [sharedScreenItem, setSharedScreenItem] = useState<any>(''); const [sharedScreenItem, setSharedScreenItem] = useState<any>('');
const [textMsg, setTextMsg] = useState(''); const [textMsg, setTextMsg] = useState('');
const [footerList, setFooterList] = useState([ const [footerList, setFooterList] = useState<any>([
[ [
{ {
title: '静音', title: '静音',
icon: ImageUrl.icon22, icon: ImageUrl.icon22,
iconActive: ImageUrl.icon22Active, iconActive: ImageUrl.icon22Active,
active: false, active: false,
select: false,
}, },
{ {
title: '关闭视频', title: '关闭视频',
icon: ImageUrl.icon23, icon: ImageUrl.icon23,
iconActive: ImageUrl.icon23Active, iconActive: ImageUrl.icon23Active,
active: false, active: false,
select: false,
}, },
{ {
title: '申请发言', title: '申请发言',
icon: ImageUrl.icon47, icon: ImageUrl.icon47,
iconActive: ImageUrl.icon47Active, iconActive: ImageUrl.icon47Active,
active: false, active: false,
select: false,
}, },
], ],
[ [
{ {
title: '共享屏幕', title: '共享屏幕',
icon: ImageUrl.icon24, icon: ImageUrl.icon24,
iconSelect: ImageUrl.icon24Select,
active: false, active: false,
select: false,
}, },
{ {
title: '共享文件', title: '共享文件',
icon: ImageUrl.icon25, icon: ImageUrl.icon25,
iconSelect: ImageUrl.icon25Select,
active: false, active: false,
select: false,
}, },
{ {
title: '邀请人员', title: '邀请人员',
icon: ImageUrl.icon26, icon: ImageUrl.icon26,
iconSelect: ImageUrl.icon26Select,
active: false, active: false,
select: false,
}, },
{ {
title: '会议监控', title: '会议监控',
icon: ImageUrl.icon48, icon: ImageUrl.icon48,
iconSelect: ImageUrl.icon48Select,
active: false, active: false,
select: false,
}, },
{ {
title: '录制', title: '录制',
icon: ImageUrl.icon27, icon: ImageUrl.icon27,
iconSelect: ImageUrl.icon27Select,
iconActive: ImageUrl.icon27Active, iconActive: ImageUrl.icon27Active,
active: false, active: false,
select: false,
}, },
{ {
title: '设置', title: '设置',
icon: ImageUrl.icon28, icon: ImageUrl.icon28,
iconSelect: ImageUrl.icon28Select,
active: false, active: false,
select: false,
}, },
{ {
title: '结束', title: '结束',
icon: ImageUrl.icon29, icon: ImageUrl.icon29,
iconSelect: ImageUrl.icon29Select,
active: false, active: false,
select: false,
}, },
], ],
[ [
{ {
title: '成员列表', title: '成员列表',
icon: ImageUrl.icon30, icon: ImageUrl.icon30,
iconSelect: ImageUrl.icon30Select,
active: false, active: false,
select: false,
}, },
{ {
title: '聊天', title: '聊天',
icon: ImageUrl.icon31, icon: ImageUrl.icon31,
iconSelect: ImageUrl.icon31Select,
active: false, active: false,
select: false,
}, },
], ],
]) ])
@ -754,6 +775,15 @@ const Meeting: React.FC = () => {
const secondsRemaining = duration.seconds(); // 剩余的秒数 const secondsRemaining = duration.seconds(); // 剩余的秒数
return `${hours > 9 ? hours : '0' + hours}:${minutes > 9 ? minutes : '0' + minutes}:${secondsRemaining > 9 ? secondsRemaining : '0' + secondsRemaining}` return `${hours > 9 ? hours : '0' + hours}:${minutes > 9 ? minutes : '0' + minutes}:${secondsRemaining > 9 ? secondsRemaining : '0' + secondsRemaining}`
} }
const changeFooterListSelect = (row: any, itemIndex: number, rowIndex: number, bool: boolean): void => {
let arr = ['静音', '解除静音', '关闭视频', '开启视频']
if (arr.indexOf(row.title) === -1) {
const footerListTemplate = [...footerList]
footerListTemplate[itemIndex][rowIndex].select = bool;
setFooterList(footerListTemplate)
}
}
// 操作按钮 // 操作按钮
const changeStatusList = async (row: any, itemIndex: number, rowIndex: number): Promise<void> => { const changeStatusList = async (row: any, itemIndex: number, rowIndex: number): Promise<void> => {
const footerListTemplate = [...footerList] const footerListTemplate = [...footerList]
@ -823,40 +853,40 @@ const Meeting: React.FC = () => {
}) })
break; break;
case '录制': case '录制':
window.electron.getSources().then((sources: any) => {
const screenId = sources[0].id;
navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: screenId,
}
} as any,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: screenId,
}
} as any
}).then(async (steam) => {
try {
const audioTracks = await navigator.mediaDevices
.getUserMedia({ audio: true, video: false })
.then(audioStream => audioStream.getAudioTracks()[0]);
steam.addTrack(audioTracks);
} catch (error) {
}
setMediaStream(steam)
setRecorder(new MediaRecorder(steam))
})
})
const setting = await JSON.parse(storage.getItem('setting') as string) const setting = await JSON.parse(storage.getItem('setting') as string)
try { try {
await fs.access(setting.recordingFilesPath, fs.constants.F_OK) await fs.access(setting.recordingFilesPath, fs.constants.F_OK)
footerListTemplate[itemIndex][rowIndex].title = '录制中' footerListTemplate[itemIndex][rowIndex].title = '录制中'
footerListTemplate[itemIndex][rowIndex].active = true footerListTemplate[itemIndex][rowIndex].active = true
setFooterList(footerListTemplate) setFooterList(footerListTemplate)
window.electron.getSources().then((sources: any) => {
const screenId = sources[0].id;
navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: screenId,
}
} as any,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: screenId,
}
} as any
}).then(async (steam) => {
try {
const audioTracks = await navigator.mediaDevices
.getUserMedia({ audio: true, video: false })
.then(audioStream => audioStream.getAudioTracks()[0]);
steam.addTrack(audioTracks);
} catch (error) {
}
setMediaStream(steam)
setRecorder(new MediaRecorder(steam))
})
})
} catch (error: any) { } catch (error: any) {
if (error.code === 'ENOENT') { if (error.code === 'ENOENT') {
message.error('文件夹不存在!') message.error('文件夹不存在!')
@ -1723,10 +1753,10 @@ const Meeting: React.FC = () => {
} }
</div> </div>
<div className={styles.meetingContentFooter}> <div className={styles.meetingContentFooter}>
{footerList.map((item, itemIndex) => { {footerList.map((item: any, itemIndex: number) => {
return ( return (
<div key={itemIndex}> <div key={itemIndex}>
{item.map((row, rowIndex) => { {item.map((row: any, rowIndex: number) => {
switch (row.title) { switch (row.title) {
case '结束': case '结束':
return <Popover key={rowIndex} return <Popover key={rowIndex}
@ -1759,8 +1789,13 @@ const Meeting: React.FC = () => {
open={open} open={open}
onOpenChange={() => setOpen(true)} onOpenChange={() => setOpen(true)}
> >
<div className='drag'> <div
<img src={row.active ? row.iconActive : row.icon} alt="" /> className='drag'
onMouseDown={() => changeFooterListSelect(row, itemIndex, rowIndex, true)}
onMouseUp={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
onMouseLeave={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
>
{row.select ? <img src={row.iconSelect} alt="" /> : <img src={row.active ? row.iconActive : row.icon} alt="" />}
<span>{row.title}</span> <span>{row.title}</span>
</div> </div>
</Popover> </Popover>
@ -1797,17 +1832,40 @@ const Meeting: React.FC = () => {
return null return null
case '会议监控': case '会议监控':
if (user.roleId === '1') { if (user.roleId === '1') {
return <div className='drag' onClick={() => changeStatusList(row, itemIndex, rowIndex)} key={rowIndex}> return <div
<img src={row.active ? row.iconActive : row.icon} alt="" /> className='drag'
onClick={() => changeStatusList(row, itemIndex, rowIndex)}
onMouseDown={() => changeFooterListSelect(row, itemIndex, rowIndex, true)}
onMouseUp={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
onMouseLeave={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
key={rowIndex}>
{row.select ? <img src={row.iconSelect} alt="" /> : <img src={row.active ? row.iconActive : row.icon} alt="" />}
<span>{row.title}</span> <span>{row.title}</span>
</div> </div>
} }
return null return null
default: case '成员列表':
return <div className='drag' onClick={() => changeStatusList(row, itemIndex, rowIndex)} key={rowIndex}> return <div
<img src={row.active ? row.iconActive : row.icon} alt="" /> className='drag'
onClick={() => changeStatusList(row, itemIndex, rowIndex)}
onMouseDown={() => changeFooterListSelect(row, itemIndex, rowIndex, true)}
onMouseUp={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
onMouseLeave={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
key={rowIndex}>
{statusList.userList ? <img src={row.iconSelect} alt="" /> : row.select ? <img src={row.iconSelect} alt="" /> : <img src={row.active ? row.iconActive : row.icon} alt="" />}
<span>{row.title}</span> <span>{row.title}</span>
{row.title === '成员列表' ? <div>{roomUserList.filter((item: any) => item.isRoom).length}</div> : null} {row.title === '成员列表' ? <div>{roomUserList.filter((item: any) => item.isRoom).length}</div> : null}
</div>
case '聊天':
return <div
className='drag'
onClick={() => changeStatusList(row, itemIndex, rowIndex)}
onMouseDown={() => changeFooterListSelect(row, itemIndex, rowIndex, true)}
onMouseUp={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
onMouseLeave={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
key={rowIndex}>
{statusList.userChatList ? <img src={row.iconSelect} alt="" /> : row.select ? <img src={row.iconSelect} alt="" /> : <img src={row.active ? row.iconActive : row.icon} alt="" />}
<span>{row.title}</span>
{row.title === '聊天' && noViewChatList > 0 ? <div {row.title === '聊天' && noViewChatList > 0 ? <div
style={{ style={{
backgroundColor: 'red', backgroundColor: 'red',
@ -1815,6 +1873,17 @@ const Meeting: React.FC = () => {
}} }}
>{noViewChatList}</div> : null} >{noViewChatList}</div> : null}
</div> </div>
default:
return <div
className='drag'
onClick={() => changeStatusList(row, itemIndex, rowIndex)}
onMouseDown={() => changeFooterListSelect(row, itemIndex, rowIndex, true)}
onMouseUp={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
onMouseLeave={() => changeFooterListSelect(row, itemIndex, rowIndex, false)}
key={rowIndex}>
{row.select ? <img src={row.iconSelect} alt="" /> : <img src={row.active ? row.iconActive : row.icon} alt="" />}
<span>{row.title}</span>
</div>
} }
})} })}
</div> </div>

View File

@ -30,14 +30,22 @@ import icon22Active from '@/assets/icon22-active.png'
import icon23 from '@/assets/icon23.png' import icon23 from '@/assets/icon23.png'
import icon23Active from '@/assets/icon23-active.png' import icon23Active from '@/assets/icon23-active.png'
import icon24 from '@/assets/icon24.png' import icon24 from '@/assets/icon24.png'
import icon24Select from '@/assets/icon24-select.png'
import icon25 from '@/assets/icon25.png' import icon25 from '@/assets/icon25.png'
import icon25Select from '@/assets/icon25-select.png'
import icon26 from '@/assets/icon26.png' import icon26 from '@/assets/icon26.png'
import icon26Select from '@/assets/icon26-select.png'
import icon27 from '@/assets/icon27.png' import icon27 from '@/assets/icon27.png'
import icon27Active from '@/assets/icon27-active.png' import icon27Active from '@/assets/icon27-active.png'
import icon27Select from '@/assets/icon27-select.png'
import icon28 from '@/assets/icon28.png' import icon28 from '@/assets/icon28.png'
import icon28Select from '@/assets/icon28-select.png'
import icon29 from '@/assets/icon29.png' import icon29 from '@/assets/icon29.png'
import icon29Select from '@/assets/icon29-select.png'
import icon30 from '@/assets/icon30.png' import icon30 from '@/assets/icon30.png'
import icon30Select from '@/assets/icon30-select.png'
import icon31 from '@/assets/icon31.png' import icon31 from '@/assets/icon31.png'
import icon31Select from '@/assets/icon31-select.png'
import icon32 from '@/assets/icon32.png' import icon32 from '@/assets/icon32.png'
import icon33 from '@/assets/icon33.png' import icon33 from '@/assets/icon33.png'
import icon34 from '@/assets/icon34.png' import icon34 from '@/assets/icon34.png'
@ -61,6 +69,7 @@ import icon46 from '@/assets/icon46.png'
import icon47 from '@/assets/icon47.png' import icon47 from '@/assets/icon47.png'
import icon47Active from '@/assets/icon47-active.png' import icon47Active from '@/assets/icon47-active.png'
import icon48 from '@/assets/icon48.png' import icon48 from '@/assets/icon48.png'
import icon48Select from '@/assets/icon48-select.png'
export default { export default {
error, error,
icon, icon,
@ -94,14 +103,22 @@ export default {
icon23, icon23,
icon23Active, icon23Active,
icon24, icon24,
icon24Select,
icon25, icon25,
icon25Select,
icon26, icon26,
icon26Select,
icon27, icon27,
icon27Active, icon27Active,
icon27Select,
icon28, icon28,
icon28Select,
icon29, icon29,
icon29Select,
icon30, icon30,
icon30Select,
icon31, icon31,
icon31Select,
icon32, icon32,
icon33, icon33,
icon34, icon34,
@ -125,4 +142,5 @@ export default {
icon47, icon47,
icon47Active, icon47Active,
icon48, icon48,
icon48Select
} }