import React, { useCallback, useRef, useState, useEffect } from 'react'; import { Button, message, Modal, Table, Tag, Space, Typography, Tooltip, Input, Tabs, } from 'antd'; import { EditOutlined, DeleteOutlined, SyncOutlined, CheckCircleOutlined, DeleteFilled, BugOutlined, FileTextOutlined, } from '@ant-design/icons'; import config from '@/utils/config'; import { PageContainer } from '@ant-design/pro-layout'; import { request } from '@/utils/http'; import DependenceModal from './modal'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import './index.less'; import { getTableScroll } from '@/utils/index'; import DependenceLogModal from './logModal'; const { Text } = Typography; const { Search } = Input; enum Status { '安装中', '已安装', '安装失败', '删除中', '已删除', '删除失败', } enum StatusColor { 'processing', 'success', 'error', } const Dependence = ({ headerStyle, isPhone, socketMessage }: any) => { const columns: any = [ { title: '序号', align: 'center' as const, width: 50, render: (text: string, record: any, index: number) => { return {index + 1} ; }, }, { title: '名称', dataIndex: 'name', key: 'name', align: 'center' as const, }, { title: '状态', key: 'status', dataIndex: 'status', align: 'center' as const, render: (text: string, record: any, index: number) => { return ( {Status[record.status]} ); }, }, { title: '备注', dataIndex: 'remark', key: 'remark', align: 'center' as const, }, { title: '创建时间', key: 'timestamp', dataIndex: 'timestamp', align: 'center' as const, render: (text: string, record: any) => { const language = navigator.language || navigator.languages[0]; const time = record.createdAt || record.timestamp; const date = new Date(time) .toLocaleString(language, { hour12: false, }) .replace(' 24:', ' 00:'); return ( {date} ); }, }, { title: '操作', key: 'action', align: 'center' as const, render: (text: string, record: any, index: number) => { const isPc = !isPhone; return ( { setLogDependence({ ...record, timestamp: Date.now() }); }} > {record.status !== Status.安装中 && record.status !== Status.删除中 && ( <> reInstallDependence(record, index)}> deleteDependence(record, index)}> deleteDependence(record, index, true)}> )} ); }, }, ]; const [value, setValue] = useState([]); const [loading, setLoading] = useState(true); const [isModalVisible, setIsModalVisible] = useState(false); const [editedDependence, setEditedDependence] = useState(); const [selectedRowIds, setSelectedRowIds] = useState([]); const [searchText, setSearchText] = useState(''); const [tableScrollHeight, setTableScrollHeight] = useState(); const [logDependence, setLogDependence] = useState(); const [isLogModalVisible, setIsLogModalVisible] = useState(false); const [type, setType] = useState('nodejs'); const getDependencies = () => { setLoading(true); request .get( `${config.apiPrefix}dependencies?searchValue=${searchText}&type=${type}`, ) .then((data: any) => { setValue(data.data); }) .finally(() => setLoading(false)); }; const addDependence = () => { setEditedDependence(null as any); setIsModalVisible(true); }; const editDependence = (record: any, index: number) => { setEditedDependence(record); setIsModalVisible(true); }; const deleteDependence = ( record: any, index: number, force: boolean = false, ) => { Modal.confirm({ title: '确认删除', content: ( <> 确认删除依赖{' '} {record.name} {' '} 吗 ), onOk() { request .delete(`${config.apiPrefix}dependencies${force ? '/force' : ''}`, { data: [record.id], }) .then((data: any) => { if (data.code === 200) { if (force) { const i = value.findIndex((x) => x.id === data.data[0].id); if (i !== -1) { const result = [...value]; result.splice(i, 1); setValue(result); } } } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const reInstallDependence = (record: any, index: number) => { Modal.confirm({ title: '确认重新安装', content: ( <> 确认重新安装{' '} {record.name} {' '} 吗 ), onOk() { request .put(`${config.apiPrefix}dependencies/reinstall`, { data: [record.id], }) .then((data: any) => { if (data.code === 200) { handleDependence(data.data[0]); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const handleCancel = (dependence?: any[]) => { setIsModalVisible(false); dependence && handleDependence(dependence); }; const handleDependence = (dependence: any) => { const result = [...value]; if (Array.isArray(dependence)) { result.push(...dependence); } else { const index = value.findIndex((x) => x.id === dependence.id); result.splice(index, 1, { ...dependence, }); } setValue(result); }; const onSelectChange = (selectedIds: any[]) => { setSelectedRowIds(selectedIds); setTimeout(() => { if (selectedRowIds.length === 0 || selectedIds.length === 0) { setTableScrollHeight(getTableScroll({ extraHeight: 87 })); } }); }; const rowSelection = { selectedRowIds, onChange: onSelectChange, }; const delDependencies = (force: boolean) => { const forceUrl = force ? '/force' : ''; Modal.confirm({ title: '确认删除', content: <>确认删除选中的依赖吗, onOk() { request .delete(`${config.apiPrefix}dependencies${forceUrl}`, { data: selectedRowIds, }) .then((data: any) => { if (data.code === 200) { setSelectedRowIds([]); getDependencies(); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const getDependenceDetail = (dependence: any) => { request .get(`${config.apiPrefix}dependencies/${dependence.id}`) .then((data: any) => { const index = value.findIndex((x) => x.id === dependence.id); const result = [...value]; result.splice(index, 1, { ...dependence, ...data.data, }); setValue(result); }) .finally(() => setLoading(false)); }; const onSearch = (value: string) => { setSearchText(value.trim()); }; useEffect(() => { getDependencies(); }, [searchText, type]); useEffect(() => { setTimeout(() => { setTableScrollHeight(getTableScroll({ extraHeight: 87 })); }); }, []); useEffect(() => { if (logDependence) { localStorage.setItem('logDependence', logDependence.id); setIsLogModalVisible(true); } }, [logDependence]); useEffect(() => { if (!socketMessage) return; const { type, message, references } = socketMessage; if ( type === 'installDependence' && message.includes('结束时间') && references.length > 0 ) { let status; if (message.includes('安装')) { status = message.includes('成功') ? Status.已安装 : Status.安装失败; } else { status = message.includes('成功') ? Status.已删除 : Status.删除失败; } const result = [...value]; for (let i = 0; i < references.length; i++) { const index = value.findIndex((x) => x.id === references[i]); result.splice(index, 1, { ...result[index], status, }); } setValue(result); if (status === Status.已删除) { setTimeout(() => { const _result = [...value]; for (let i = 0; i < references.length; i++) { const index = value.findIndex((x) => x.id === references[i]); _result.splice(index, 1); } setValue(_result); }, 5000); } } }, [socketMessage]); const panelContent = () => ( <> {selectedRowIds.length > 0 && (
已选择 {selectedRowIds?.length}
)} ); const onTabChange = (activeKey: string) => { setType(activeKey); }; return ( , , ]} header={{ style: headerStyle, }} > {panelContent()} {panelContent()} {panelContent()} { setIsLogModalVisible(false); if (needRemove) { const index = value.findIndex((x) => x.id === logDependence.id); const result = [...value]; result.splice(index, 1); setValue(result); } else if ([...value].map((x) => x.id).includes(logDependence.id)) { getDependenceDetail(logDependence); } }} socketMessage={socketMessage} dependence={logDependence} /> ); }; export default Dependence;