import React, { useState, useEffect } from 'react'; import { Row, Col, Button } from 'antd'; import { CaretRight, Pause } from '@ant-design/icons'; import { IUiApi } from 'umi-types'; import withSize from 'react-sizeme'; import styles from '../../ui.module.less'; import { TaskType, TaskState } from '../../../server/core/enums'; import { exec, cancel, isCaredEvent, getTerminalIns, TriggerState, clearLog } from '../../util'; import { useTaskDetail } from '../../hooks'; import Terminal from '../Terminal'; interface IProps { api: IUiApi; state?: TaskState; } const { SizeMe } = withSize; const taskType = TaskType.TEST; const TestComponent: React.FC = ({ api }) => { const { intl } = api; const [taskDetail, setTaskDetail] = useState({ state: TaskState.INIT, type: taskType, log: '' }); // Mount: 获取 task detail const { detail } = useTaskDetail(taskType); // Mount: 监听 task state 改变 useEffect( () => { setTaskDetail(detail as any); const unsubscribe = api.listenRemote({ type: 'org.umi.task.state', onMessage: ({ detail: result, taskType: type }) => { if (!isCaredEvent(type, taskType)) { return null; } if (result) { setTaskDetail(result); } }, }); return () => { unsubscribe && unsubscribe(); }; }, [detail], ); // UnMount: reset form useEffect(() => { return () => { const terminal = getTerminalIns(taskType); terminal && terminal.clear(); }; }, []); async function test() { const { triggerState, errMsg } = await exec(taskType); if (triggerState === TriggerState.FAIL) { api.notify({ type: 'error', title: intl({ id: 'org.umi.ui.tasks.test.testError' }), message: errMsg, }); } } async function cancelTest() { const { triggerState, errMsg } = await cancel(taskType); if (triggerState === TriggerState.FAIL) { api.notify({ title: intl({ id: 'org.umi.ui.tasks.test.cancelError' }), message: errMsg, }); return; } } const isTaskRunning = taskDetail && taskDetail.state === TaskState.ING; return ( <>

{intl({ id: 'org.umi.ui.tasks.test' })}

<>
{({ size }) => ( { clearLog(taskType); }} /> )}
); }; export default TestComponent;