import React, { useState, useEffect } from 'react'; import { Row, Col, Button, Form, Switch, Input, Modal, Badge } 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.DEV; const DevComponent: 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_POLYFILL: true, HMR: true, BABEL_CACHE: true, MOCK: true, BROWSER: true, CLEAR_CONSOLE: true, PORT: null, FORK_TS_CHECKER: false, }); // Mount: 获取 task detail const { detail } = useTaskDetail(taskType); useEffect( () => { setTaskDetail(detail as any); }, [detail], ); // Mount: 监听 task state 改变 useEffect( () => { 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 dev() { const { triggerState, errMsg } = await exec(taskType, env); if (triggerState === TriggerState.FAIL) { api.notify({ type: 'error', title: intl({ id: 'org.umi.ui.tasks.dev.startError' }), message: errMsg, }); } } async function cancelDev() { const { triggerState, errMsg } = await cancel(taskType); if (triggerState === TriggerState.FAIL) { api.notify({ title: intl({ id: 'org.umi.ui.tasks.dev.cancelError' }), message: errMsg, }); } } const openModal = () => { setModalVisible(true); }; const handleOk = () => { form .validateFields() .then(values => { setEnv(values as any); setModalVisible(false); }) .catch(_ => {}); }; 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 && [TaskState.ING, TaskState.SUCCESS].indexOf(taskDetail.state) > -1; const outputRunningInfo = ({ state, localUrl }) => { if (!state || state === TaskState.INIT) { return null; } const map = { [TaskState.ING]: { status: 'processing', text: {intl({ id: 'org.umi.ui.tasks.dev.state.starting' })}, }, [TaskState.SUCCESS]: { status: 'success', text: ( {localUrl ? ( <> {intl({ id: 'org.umi.ui.tasks.dev.state.success' })} {localUrl} ) : null} ), }, [TaskState.FAIL]: { status: 'error', text: {intl({ id: 'org.umi.ui.tasks.dev.state.fail' })}, }, }; return (
{map[state].text}
); }; return ( <>

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

<> {outputRunningInfo(taskDetail)}
} name="BABEL_POLYFILL" valuePropName="checked" > } name="HMR" valuePropName="checked" > } name="BABEL_CACHE" valuePropName="checked" > } name="MOCK" valuePropName="checked" > } name="BROWSER" valuePropName="checked" > } name="CLEAR_CONSOLE" valuePropName="checked" > } name="FORK_TS_CHECKER" valuePropName="checked" >
{/* 输出 */}
{({ size }) => ( { clearLog(taskType); }} /> )}
); }; export default DevComponent;