import React, { useState, useEffect } from 'react'; import { Row, Col, Button, Modal, Form, Switch } 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'; import { ITaskDetail } from '../../../server/core/types'; interface IProps { detail: ITaskDetail; api: IUiApi; state?: TaskState; } const { SizeMe } = withSize; const taskType = TaskType.BUILD; const BuildComponent: React.FC = ({ api }) => { const { intl } = api; const isEnglish = api.getLocale() === 'en-US'; const [taskDetail, setTaskDetail] = useState({ state: TaskState.INIT, type: taskType, log: '' }); const [form] = Form.useForm(); const [modalVisible, setModalVisible] = useState(false); const [env, setEnv] = useState({ BABEL_CACHE: true, BABEL_POLYFILL: true, COMPRESS: true, CSS_COMPRESS: true, HTML: true, FORK_TS_CHECKER: false, }); // 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 () => { form.resetFields(); const terminal = getTerminalIns(taskType); terminal && terminal.clear(); }; }, []); async function build() { const { triggerState, errMsg } = await exec(taskType, env); if (triggerState === TriggerState.FAIL) { api.notify({ type: 'error', title: `${api.currentProject.name} ${intl({ id: 'org.umi.ui.tasks.build.buildError' })}`, message: errMsg, }); } } async function cancelBuild() { const { triggerState, errMsg } = await cancel(taskType); if (triggerState === TriggerState.FAIL) { api.notify({ title: `${api.currentProject.name} ${intl({ id: 'org.umi.ui.tasks.build.cancelError' })}`, message: errMsg, }); return; } } const openModal = () => { setModalVisible(true); }; const handleOk = () => { form .validateFields() .then(values => { setEnv(values as any); setModalVisible(false); }) .catch(info => { setModalVisible(false); }); }; const handleCancel = () => { setModalVisible(false); }; const stopEventPop = e => { e && e.stopPropagation(); e && e.preventDefault(); }; const EnvLabel = props => (
{intl({ id: props.title })}
{intl({ id: props.desc })} {intl({ id: 'org.umi.ui.tasks.env.detail' })}
); const isTaskRunning = taskDetail && taskDetail.state === TaskState.ING; return ( <>

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

<>
} name="COMPRESS" valuePropName="checked" > } name="CSS_COMPRESS" valuePropName="checked" > } name="BABEL_POLYFILL" valuePropName="checked" > } name="BABEL_CACHE" valuePropName="checked" > } name="HTML" valuePropName="checked" > } name="FORK_TS_CHECKER" valuePropName="checked" >
{/* 输出 */}
{({ size }) => ( { clearLog(taskType); }} /> )}
); }; export default BuildComponent;