import styles from '@/page/Home/Index/index.module.scss' import { useEffect, useState, useRef } from "react"; import Operation from '@/components/Operation'; import { Button, Input, Modal, Pagination, Empty, message, Popover, Popconfirm, DatePicker, Select, Radio } from "antd"; import { GetRoom, PostRoom, GetCheckoutRoomNum, GetRoomRtcToken, DeleteRoom, GetRecord, PostRoomInfo, GetQrcode } from '@/api/Home/Index'; import ImageUrl from '@/utils/package/imageUrl' import { ExclamationCircleFilled, ReloadOutlined } from '@ant-design/icons'; import JoinSetting from '@/components/JoinSetting'; import { storage } from '@/utils'; import { PostRefresh } from '@/api/Login'; import { useNavigate } from 'react-router-dom'; import { role } from '@/config/role'; import dayjs from 'dayjs'; import StupWizard from '@/components/StupWizard'; import { GetSubDpList } from '@/api/Home/User'; const { setInterval, clearInterval } = require('timers'); const fs = require('fs').promises; const { exec } = require('child_process'); const { RangePicker } = DatePicker; const { confirm } = Modal; const Index: React.FC = () => { const navigate = useNavigate(); const [list, setList] = useState({ data: [], total: 0, pageIndex: 1, pageSize: 12, }) const [createRoomModal, setCreateRoomModal] = useState(false) const [timeSelectModal, setTimeSelectModal] = useState(false) const [createRoomFrom, setCreateRoomFrom] = useState<{ id: string, roomName: string, roomNum: string, subject: number, year: string }>({ id: "", roomName: "", roomNum: "", subject: 0, year: "0" }) const joinSettingRef = useRef(); const stupWizardRef = useRef(); const [user, setUser] = useState({}); const [currentRoomInfo, setCurrentRoomInfo] = useState({}); const [subjectList, setSubjectList] = useState([]); const [timeData, setTimeData] = useState([]); const [isCreateRoom, setIsCreateRoom] = useState(false); const [allowAnonymous, setAllowAnonymous] = useState(true); const [baseImage, setBaseImage] = useState(''); const userInfo = JSON.parse(storage.getItem('user') as string) useEffect(() => { setUser(userInfo) }, []) useEffect(() => { let time = null as any if (time) { clearInterval(time) } else { time = setInterval(() => { getRoomList() }, 1000 * 30) } getRoomList() return () => { clearInterval(time) } }, [list.pageIndex]); const getRoomList = async (): Promise => { await GetRoom({ pageIndex: list.pageIndex, pageSize: list.pageSize, }).then(res => { if (res.code === 200) { setList({ ...list, total: res.data.total, data: res.data.items.map((item: any) => { return { ...item, open: false } }), }) } }) } const copyRoomNum = (roomNum: string): void => { window.electron.setWriteText(roomNum) message.success('复制成功') } const isGetCheckoutRoomNum = async (roomNum: string, callBack: Function): Promise => { await GetCheckoutRoomNum(roomNum).then(res => { if (res.code === 200) { callBack(res.data) } }) } const getSubDpList = async (): Promise => { await GetSubDpList().then(res => { if (res.code === 200) { setSubjectList(res.data.map((item: any) => { return { value: item.value, label: item.name } })) } }) } const getRoomRtcToken = async (roomNum: string, callBack: Function): Promise => { Promise.all([GetRoomRtcToken(roomNum), GetRoomRtcToken(roomNum + 'a')]).then(res => { if (res[0].code === 200 && res[1].code === 200) { callBack({ token: res[0].data, tokenA: res[1].data, }) } }).finally(() => { storage.setItem('loading', false) }) } const postRefresh = async (callBack: Function): Promise => { await PostRefresh(user.refresh_token).then(res => { if (res.code === 200) { storage.setItem('user', JSON.stringify(res.data)) storage.setItem('userLogin', true) callBack(res.data) } else { storage.setItem('loading', false) } }).catch(() => { storage.setItem('loading', false) }) } const changeOpen = (index: number, bool: boolean): void => { const newList = [...list.data] as any; newList[index].open = bool setList({ ...list, data: newList }) } const fileUpLoad = async (data: { url: string, content: string, fileName: string }): Promise => { const setting = await JSON.parse(storage.getItem('setting') as string) try { const response = await fetch(data.url); const arrayBuffer = await response.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); await fs.writeFile(`${setting.shareFilesPath}\\${data.fileName}`, buffer, {}); confirm({ title: '提示', icon: , content: data.content, centered: true, okText: '打开文件夹', cancelText: '关闭', async onOk() { await fs.access(setting.shareFilesPath, fs.constants.F_OK); if (process.platform === 'win32') { exec(`explorer "${setting.shareFilesPath}"`); } else if (process.platform === 'darwin') { exec(`open "${setting.shareFilesPath}"`); } }, onCancel() { } }) } catch (error: any) { if (error.code === 'ENOENT') { message.error({ content:
文件夹不存在 { stupWizardRef.current.changeModal(4) }}>前往设置
}) return } else { message.error(error) } } } return ( <>
{user?.roleId === '1' ? : null}
会议室列表 { message.success('刷新成功') getRoomList() }} />
{list.data.length ?
{list.data.map((item: any, index: number) => { return (
{item.roomName}
{item.onlineUserCount}人
copyRoomNum(item.roomNum)} title='复制房间号'> {item.roomNum}
{ setBaseImage('') if (e) { GetQrcode(item.roomNum, import.meta.env.VITE_ENV === 'development' ? 'trial' : 'release').then(res => { if (res.code === 200) { setBaseImage(res.data) } }) } }} content={ baseImage ?
微信中长按图片识别小程序码
加入会议
:
} >
{role.ID.includes(userInfo.roleId) ? {userInfo.roleId === '1' ? { DeleteRoom(item.id).then((res) => { if (res.code === 200) { message.success('删除成功') changeOpen(index, false) getRoomList() } }) }} onCancel={() => { changeOpen(index, false) }} okText="确定" cancelText="取消" >
删除会议室
: null}
{ changeOpen(index, false) setTimeSelectModal(true) }}>导出参会记录
{ changeOpen(index, false) setCreateRoomFrom({ roomName: item.roomName, roomNum: item.roomNum, subject: item.subject, year: item.year, id: item.id, }) setAllowAnonymous(item.allowAnonymous) getSubDpList() setIsCreateRoom(false) setCreateRoomModal(true) }}>修改设置
{ changeOpen(index, false) }}>取消
} title="" trigger="click" open={item.open} onOpenChange={() => { setCurrentRoomInfo(list.data[index]) changeOpen(index, true) }} > : null}
) })}
:
}
{ setList({ ...list, pageIndex: e }) }} pageSize={list.pageSize} showSizeChanger={false} />
{isCreateRoom ?
房间号: { const regex = /^[0-9]*$/; if (regex.test(e.target.value)) { setCreateRoomFrom({ ...createRoomFrom, roomNum: e.target.value }) } }} suffix={ { function generateTimestampWithRandom(): string { const timestamp = new Date().getTime(); const lastSixDigits = timestamp.toString().slice(-6); const randomTwoDigits = ('0' + Math.floor(Math.random() * 100)).slice(-2); return lastSixDigits + randomTwoDigits; } setCreateRoomFrom({ ...createRoomFrom, roomNum: generateTimestampWithRandom(), }) }} >获取随机房间号 } />
: null}
房间名字: { setCreateRoomFrom({ ...createRoomFrom, roomName: e.target.value }) }} autoSize />
届: { const regex = /^[0-9]*$/; if (regex.test(e.target.value)) { setCreateRoomFrom({ ...createRoomFrom, year: e.target.value }) } }} />
学科: