import styles from '@/components/SharedFilesModel/index.module.scss' import { DeleteOutlined, ProfileOutlined, ReloadOutlined, SearchOutlined, VerticalAlignBottomOutlined } from '@ant-design/icons'; import { Button, Input, message, Modal, Pagination, Popconfirm, Progress, Table } from 'antd'; import { forwardRef, useEffect, useImperativeHandle, useState, useRef } from "react"; import { DeleteRoomFile, GetRoomFile, GetRoomFileDwUrl, GetRoomUpFileurl, GetRoomUserItem, PostRoomFile } from '@/api/Meeting'; import axios from 'axios'; import { useLocation } from 'react-router-dom'; import { storage } from '@/utils'; import StupWizard from '../StupWizard'; import { role } from '@/config/role'; const fs = require('fs').promises; const { exec } = require('child_process'); const { Column } = Table const SharedFilesModel = forwardRef((props: any, ref: any) => { useImperativeHandle(ref, () => ({ getData: () => { setIsSharedFilesModel(true) GetRoomUserItem(state.channelId, user.uid).then((res: any) => { if (res.code === 200) { setRoomUserItem(res.data) } }) getRoomFile() } })) const stupWizardRef = useRef(); const { state } = useLocation(); const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [roomUserItem, setRoomUserItem] = useState({}) const [showRowSelection, setShowRowSelection] = useState(false); const [isUpFile, setIsUpFile] = useState(false); const [isSharedFilesModel, setIsSharedFilesModel] = useState(false); const [user, setUser] = useState({}); const [fileList, setFileList] = useState({ data: [], keyword: '', total: 0, pageIndex: 1, pageSize: 10, }) const [uploadProgress, setUploadProgress] = useState(0); useEffect(() => { let userInfo = JSON.parse(storage.getItem('user') as string) setUser(userInfo) getRoomFile() }, [fileList.pageIndex, fileList.keyword]); // 获取共享文件列表 const getRoomFile = async (): Promise => { await GetRoomFile({ pageIndex: fileList.pageIndex, pageSize: fileList.pageSize, keyword: fileList.keyword, roomId: state.roomId }).then(res => { if (res.code === 200) { setFileList({ ...fileList, data: res.data.items.map((item: any) => { return { ...item, key: item.id, } }), total: res.data.total }) } }) } return ( <> setIsSharedFilesModel(false)} >
共{fileList.total}个文件 {isUpFile ?
上传进度: {/* {uploadProgress === 100 ? '上传完成' : '上传中'} */}
: null}
} onPressEnter={(e: any) => { if (fileList.pageIndex === 1) { setFileList({ ...fileList, keyword: e.target.value, }) } else { setFileList({ ...fileList, keyword: e.target.value, pageIndex: 1 }) } }} onBlur={(e) => { if (fileList.pageIndex === 1) { setFileList({ ...fileList, keyword: e.target.value, }) } else { setFileList({ ...fileList, keyword: e.target.value, pageIndex: 1 }) } }} suffix={ { getRoomFile() }} >搜索 } /> { if (fileList.pageIndex === 1) { getRoomFile() } else { setFileList({ ...fileList, pageIndex: 1 }) } }} /> {roomUserItem && (role.ID.includes(roomUserItem.roleId) || roomUserItem.isRoomManager) && fileList.data.length ? { setShowRowSelection(!showRowSelection) }} style={{ color: showRowSelection ? '#5575F2' : 'white' }} /> : null} {showRowSelection && fileList.data.length && selectedRowKeys.length ? { if (selectedRowKeys.length) { DeleteRoomFile(selectedRowKeys).then(res => { if (res.code === 200) { message.success('删除成功!') if (fileList.pageIndex === 1) { getRoomFile() } else { setFileList({ ...fileList, pageIndex: 1 }) } } }) } else { message.error('请选择文件!') } }} onCancel={() => { }} okText="确认" cancelText="取消" > : null} {roomUserItem && role.ID.includes(roomUserItem.roleId) || roomUserItem.isRoomManager ? : null}
{ setSelectedRowKeys(newSelectedRowKeys); } } : undefined} dataSource={fileList.data} pagination={false} scroll={{ y: '40vh' }} style={{ width: '100%' }} > ( <>
{item.fileName} {item.showPercentComplete ? : null}
)} /> ( <> {item.size / 1024 > 1000 ? (item.size / (1024 * 1024)).toFixed(2) + 'MB' : (item.size / 1024).toFixed(2) + 'KB'} )} /> ( <> {item.downloadCount}次 )} /> ( <> {!item.showPercentComplete ? { storage.setItem('loading', true) GetRoomFileDwUrl(item.fileUrl, item.id).then(res => { if (res.code === 200) { axios({ url: res.data, method: 'GET', onDownloadProgress: (progressEvent: any) => { const totalLength = item.size; if (totalLength !== null) { const percentComplete = (progressEvent.loaded / totalLength * 100).toFixed(2); const fileIndex = fileList.data.findIndex((row: any) => row.id === item.id); let fileItem = [...fileList.data] as any; fileItem[fileIndex].percentComplete = percentComplete fileItem[fileIndex].showPercentComplete = true setFileList({ ...fileList, data: fileItem, }) } } }).then(async () => { const fileIndex = fileList.data.findIndex((row: any) => row.id === item.id); let fileItem = [...fileList.data] as any; fileItem[fileIndex].percentComplete = 100 setTimeout(() => { fileItem[fileIndex].showPercentComplete = false }, 1000) setFileList({ ...fileList, data: fileItem, }) const setting = await JSON.parse(storage.getItem('setting') as string) if (setting.isShareSavePath) { window.electron.selectFilePath({ fileName: fileItem[fileIndex].fileName, filePath: res.data }) } else { try { await fs.access(setting.shareFilesPath, fs.constants.F_OK) const response = await fetch(res.data); const arrayBuffer = await response.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); fs.writeFile(`${setting.shareFilesPath}${fileItem[fileIndex].fileName}`, buffer, {}); message.success(`下载成功!文件已保存至:${setting.shareFilesPath}`) 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}"`); } } catch (error: any) { if (error.code === 'ENOENT') { message.error({ content:
文件夹不存在 { stupWizardRef.current.changeModal(4) }}>前往设置
, }) return } else { message.error(error) } } } setTimeout(() => { getRoomFile() }, 2000) }) } }).finally(() => { storage.setItem('loading', false) }) }} /> : null} {/* */} )} />
{ setFileList({ ...fileList, pageIndex: e }) }} pageSize={fileList.pageSize} current={fileList.pageIndex} hideOnSinglePage={true} showSizeChanger={false} />
) }) export default SharedFilesModel