Team Ai
Modelpublic

shihuojian/nodecloud

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes58downloads
index.js244 linesDownload Raw Back to routeCode
1import { makeStyles } from 'mui-styles';2const useStyles = makeStyles({3    root: {4        width: "100%",5        overflow: "hidden",whiteSpace: "nowrap",6        display: "flex",flexDirection: "column",7        '& .react-monaco-editor-container':{8            position:'relative'9        },10        '& .monaco-editor':{11            width:'100% !important'12        },13        '& .routeTips':{14            position:'absolute',15            height: 40,16            width: 150,17            background: "#3c3c3c",18            bottom: 15,19            right: 25,20            borderRadius: 15,21            display: "flex",22            justifyContent: "center",23            alignItems: "center",24            fontSize: 14,25            cursor:"pointer",26            color:"#cfc8c8"27        }28    }29});30import Tabs from '../tabs';31import {useState,useEffect} from 'react';32import dynamic from 'next/dynamic';33const MonacoEditor = dynamic(() => import('react-monaco-editor'), { ssr: false });34import CodeHistory from '../codeHistory';35const io = require('socket.io-client');36 37function App(props={}) {38    39    const classes = useStyles();40    const {thisData,listRequest,tabsRequest} = props;41    const children = thisData.children;42    const data = _.find(listRequest.state.data,{_id:listRequest.selected[0]});43 44    let {_id,parentId,path} = data ? data : {_id:'all'};45 46    let query = _id !== 'all' ? {_id} : {};47    const collection = listRequest.url.split('/')[2];48    const url = `/common/${collection}/findOne?_id=${_id}`;49 50    let type = ['cssHistory','webCssHistory'].includes(tabsRequest.model.collection) ? 'cssCode' : 'code';51    if(_.includes(["jsCssHistory","webJsCssHistory"],tabsRequest.model.collection)){52        type = 'jsCssCode'53    }54    if(_.includes(["apiRoute","webRoute"],props.tabsRequest.model.collection)){55        type = 'route';56    }57    58    // console.log(data,'routeCode');59    60    const [reloadPage,setReloadPage] = useState(false);61 62    //删除监听事件63    const deleteSocketOne = ()=>{64        if(props.socket.routeCode){65            props.socket.routeCode.off("update");66            props.socket.routeCode.off(_id);67        }68    }69 70    const RenderEditor = ()=>{71 72        const [value, setValue] = useState(data ? data[type] : "");73        const [reload, setReload] = useState(true);74        useEffect(() => {75            setSocket()76        },[]);77 78        //设置socket79        const setSocket = ()=>{80            if(!props.socket.routeCode){81                const {protocol,host} = window.location;82                const url = `${protocol}//${host}`;83                props.socket.routeCode =  io.connect(url, {84                    path:"/code/update",85                    transports: ['websocket']86                });87            }88 89            //会多次触发需要处理,切换需要删除90            props.socket.routeCode.on('update',({field,code})=>{91                data[field] = code;92                setValue(data[type]);93            });94            props.socket.routeCode.on(_id,({statusCode,message})=>{95                if(statusCode){96                    props.alert(message).error();97                }98            });99            100        }101 102        //每分钟存储修改历史103        const saveHistory = (code)=>{104            const key = _.toBase64(tabsRequest.model.collection+_id);105            const date = sessionStorage.getItem(key);106            const nowDate = _.date('YYYY-MM-DD HH:mm',new Date());107            let data = {date:nowDate,code,type};108            data[`${collection}Id`] = _id;109            if(date === null || _.Moment(nowDate).diff(_.Moment(date), 'minutes') >= 1){110                sessionStorage.setItem(key,nowDate);111                _.post(`/common/${collection}History/insertOne`,{data}).then(res=>{112                    // console.log(`/common/${collection}History/insertOne`,res,data,'=-==')113                }).catch(e=>{114                    props.alert(e.message).error();115                });116            }117        };118 119        const onChange = (value,reload)=>{120            if(_id !== 'all'){121 122                let updateFile = type === 'route' ? {type:'updateRoute'} : {type:'updateCode'};123                const url = listRequest.url.replace('find','updateOne');124                value = type === 'route' ? JSON.parse(value) : value;125                data[type] = value;126                const updateData = {parentId};127                updateData[type] = value;128                // console.log(updateData)129                let params = {130                    source:"web",131                    field:type,132                    callback_id:_id,133                    collection,134                    action:'updateOne',135                    filePath:path,136                    query:{_id},137                    data:{$set:updateData},138                }139                if(_.includes(['code','jsCssCode','cssCode'],type)){140                    params.updateFile = {type:'updateCode'}141                }else if(type === "route"){142                    params.updateFile = {type:'updateRouteCode'}143                }144                if(reload){145                    params.updateFile = updateFile;146                }147                props.socket.routeCode.emit('post',{148                    url:'/code/update',149                    callback_id:_id,150                    data:params151                })152                saveHistory(value);153                // props.socket.routeCode.emit('db',params);154                // _.post(url,params).then(res=>{155                //     saveHistory(value);156                // }).catch(e=>{157                //     props.alert(e.message.indexOf('insertCode:') !== -1 ? e.message.split('insertCode:')[1] : e.message).error();158                // });159            }160        };161 162        return (163            <div style={{height:'100%',position: "relative"}}>164                <MonacoEditor165                    language={type === 'code' || type === 'jsCssCode' ? 'javascript' : type === "route" ? "json" : 'scss'}166                    // width={window.innerWidth}167                    // height={window.innerHeight}168                    theme="vs-dark"169                    value={_id ===  'all' ? '' : type === 'route' && typeof value === "object" ? JSON.stringify(value,null,"\t") : value}170                    onChange={(value)=>{171                        if(_id !== 'all'){ 172                            // setValue(value);173                        }174                        onChange(value)175                    }}176            />177                {178                    reload ?179                        type === "route" ? <div className='routeTips' onClick={()=>{180                            onChange(value,'reload')181                            setReload(false);182                            setTimeout(()=>{183                                props.alert("success").success();184                                setReload(true);185                            },1000)186                        }}>重启进程生效</div> : ''187                    : <div className='routeTips'>进程重启中</div>    188                }189            </div>190        )191    };192 193    const History = ()=>{194        const [state,setState] = useState({195            _id,196            collection,197            open:false198        });199        props.listRequest.codeHistory = ()=>{200            setState({...state,open:true})201        };202        return (203            <CodeHistory state={state} {...props} close={()=>{204                setState({...state,open:false})205            }}/>206        )207    };208 209    //获取预览接口210    const getUrl = ()=>{211        const thisRoute = data.route ? data.route : {};212        let url = "";213        if(thisRoute.path){214            url = thisRoute.path;215        }else{216            if(collection === 'page'){  url = `?id=/admin/${data.shortId}`; }217            if(collection === 'webPage'){ url = `/${data.shortId}`; }218            if(collection === 'api' ){ url = `/api/${data.shortId}`;  }219        }220        return `http://${window.location.hostname}:3001${url}`;221    }222 223 224    if(_.isEmpty(data)){225        return false226    }227 228    const preview = getUrl();229 230    return (231        <div className={classes.root}>232            <History/>233            {!_.isEmpty(children) ? <Tabs onClick={(collection)=>{234                deleteSocketOne();235                setReloadPage(!reloadPage)236            }} preview={preview} {...props}/> : false}237            <RenderEditor/>238        </div>239    )240 241}242 243 244export default App;