import intl from 'react-intl-universal'; import React, { useEffect, useState, useRef, useCallback, useReducer, } from 'react'; import { Drawer, Button, Tabs, Badge, Select, TreeSelect } from 'antd'; import { request } from '@/utils/http'; import config from '@/utils/config'; import SplitPane from 'react-split-pane'; import Editor from '@monaco-editor/react'; import SaveModal from './saveModal'; import SettingModal from './setting'; import { useTheme } from '@/utils/hooks'; import { getEditorMode, logEnded } from '@/utils'; import WebSocketManager from '@/utils/websocket'; import Ansi from 'ansi-to-react'; const { Option } = Select; const EditModal = ({ treeData, currentNode, content, handleCancel, visible, }: { treeData?: any; content?: string; visible: boolean; currentNode: any; handleCancel: () => void; }) => { const [value, setValue] = useState(''); const [language, setLanguage] = useState(); const [cNode, setCNode] = useState(); const [selectedKey, setSelectedKey] = useState(); const [saveModalVisible, setSaveModalVisible] = useState(false); const [settingModalVisible, setSettingModalVisible] = useState(false); const [log, setLog] = useState(''); const { theme } = useTheme(); const editorRef = useRef(null); const [isRunning, setIsRunning] = useState(false); const [currentPid, setCurrentPid] = useState(null); const cancel = () => { handleCancel(); }; const onSelect = (value: any, node: any) => { if (node.key === selectedKey || !value) { return; } if (node.type === 'directory') { return; } const newMode = getEditorMode(value); setCNode(node); setLanguage(newMode); getDetail(node); setSelectedKey(node.key); }; const getDetail = (node: any) => { request .get( `${config.apiPrefix}scripts/detail?file=${node.title}&path=${ node.parent || '' }`, ) .then(({ code, data }) => { if (code === 200) { setValue(data); } }); }; const run = () => { setLog(''); const content = editorRef.current.getValue().replace(/\r\n/g, '\n'); request .put(`${config.apiPrefix}scripts/run`, { filename: cNode.title, path: cNode.parent || '', content, }) .then(({ code, data }) => { if (code === 200) { setIsRunning(true); setCurrentPid(data); } }); }; const stop = () => { if (!cNode || !cNode.title || !currentPid) { return; } request .put(`${config.apiPrefix}scripts/stop`, { filename: cNode.title, path: cNode.parent || '', pid: currentPid, }) .then(({ code, data }) => { if (code === 200) { setIsRunning(false); } }); }; const handleMessage = useCallback((payload: any) => { let { message: _message } = payload; if (logEnded(_message)) { setTimeout(() => { setIsRunning(false); }, 300); } setLog((p) => `${p}${_message}`); }, []); useEffect(() => { const ws = WebSocketManager.getInstance(); ws.subscribe('manuallyRunScript', handleMessage); return () => { ws.unsubscribe('manuallyRunScript', handleMessage); }; }, []); useEffect(() => { setLog(''); if (currentNode) { setCNode(currentNode); setValue(content as string); setSelectedKey(currentNode.key); const newMode = getEditorMode(currentNode.title); setLanguage(newMode); } }, [content, currentNode]); return ( {/* */} } width={'100%'} headerStyle={{ padding: '11px 24px' }} onClose={cancel} open={visible} > {/* @ts-ignore */} { editorRef.current = editor; }} />
          {log}
        
{ setSaveModalVisible(false); }} file={{ content: editorRef.current && editorRef.current.getValue().replace(/\r\n/g, '\n'), ...cNode, }} /> { setSettingModalVisible(false); }} />
); }; export default EditModal;