import React, { useState, useEffect, useMemo, useContext } from 'react'; import { Slider, Result, Tabs, Alert } from 'antd'; import { PieChartOutlined, ExpandOutlined, PlayCircleOutlined, HighlightOutlined, ReloadOutlined, DoubleRightOutlined, DoubleLeftOutlined, } from '@ant-design/icons'; import TextLoop from 'react-text-loop'; import { connect } from 'dva'; import HeaderComponent from './components/Header'; import SourceBox from './SourceBox'; import TargetBox from './TargetBox'; import Calibration from 'components/Calibration'; import DynamicEngine, { componentsType } from 'components/DynamicEngine'; import FormEditor from 'components/PanelComponents/FormEditor'; import template1 from 'components/BasicShop/BasicComponents/template'; import template2 from 'components/BasicPcShop/BasicComponents/template'; import mediaTpl1 from 'components/BasicShop/MediaComponents/template'; import mediaTpl2 from 'components/BasicPcShop/MediaComponents/template'; import graphTpl1 from 'components/BasicShop/VisualComponents/template'; import graphTpl2 from 'components/BasicPcShop/VisualComponents/template'; import schema1 from 'components/BasicShop/schema'; import schema2 from 'components/BasicPcShop/schema'; import { ActionCreators } from 'redux-undo'; import { StateWithHistory } from 'redux-undo'; import styles from './index.less'; import { useGetBall } from 'react-draggable-ball'; import { dooringContext } from '@/layouts'; const { TabPane } = Tabs; const Container = (props: { history?: any; location?: any; pstate?: any; cstate?: any; dispatch?: any; }) => { const [scaleNum, setScale] = useState(1); const [collapsed, setCollapsed] = useState(true); const [rightColla, setRightColla] = useState(true); const { pstate, cstate, dispatch } = props; const pointData = pstate ? pstate.pointData : []; const cpointData = cstate ? cstate.pointData : []; const changeCollapse = useMemo(() => { return (c: boolean) => { setCollapsed(c); }; }, []); const changeRightColla = useMemo(() => { return (c: boolean) => { setRightColla(c); }; }, []); const context = useContext(dooringContext); const curPoint = useMemo(() => { if (context.theme === 'h5') { return pstate ? pstate.curPoint : {}; } else { return cstate ? cstate.curPoint : {}; } }, [context.theme, cstate, pstate]); const schema = useMemo(() => { if (context.theme === 'h5') { return schema1; } else { return schema2; } }, [context.theme]); const template = useMemo(() => { if (context.theme === 'h5') { return template1; } else { return template2; } }, [context.theme]); const mediaTpl = useMemo(() => { if (context.theme === 'h5') { return mediaTpl1; } else { return mediaTpl2; } }, [context.theme]); const graphTpl = useMemo(() => { if (context.theme === 'h5') { return graphTpl1; } else { return graphTpl2; } }, [context.theme]); // 指定画布的id let canvasId = 'js_canvas'; const backSize = () => { setScale(1); }; const CpIcon = { base: , media: , visible: , }; const generateHeader = useMemo(() => { return (type: componentsType, text: string) => { return (
{CpIcon[type]} {text}
); }; }, [CpIcon]); const handleSliderChange = (v: number) => { setScale(prev => (v >= 150 ? 1.5 : v / 100)); }; const handleSlider = (type: any) => { if (type) { setScale(prev => (prev >= 1.5 ? 1.5 : prev + 0.1)); } else { setScale(prev => (prev <= 0.5 ? 0.5 : prev - 0.1)); } }; const handleFormSave = useMemo(() => { if (context.theme === 'h5') { return (data: any) => { dispatch({ type: 'editorModal/modPointData', payload: { ...curPoint, item: { ...curPoint.item, config: data } }, }); }; } else { return (data: any) => { dispatch({ type: 'editorPcModal/modPointData', payload: { ...curPoint, item: { ...curPoint.item, config: data } }, }); }; } }, [context.theme, curPoint, dispatch]); const clearData = useMemo(() => { if (context.theme === 'h5') { dispatch({ type: 'editorModal/clearAll' }); } else { dispatch({ type: 'editorPcModal/clearAll' }); } }, [context.theme, dispatch]); const handleDel = useMemo(() => { if (context.theme === 'h5') { return (id: any) => { dispatch({ type: 'editorModal/delPointData', payload: { id }, }); }; } else { return (id: any) => { dispatch({ type: 'editorPcModal/delPointData', payload: { id }, }); }; } }, [context.theme, dispatch]); const redohandler = () => { dispatch(ActionCreators.redo()); }; const undohandler = () => { dispatch(ActionCreators.undo()); }; useEffect(() => { if (window.innerWidth < 1024) { props.history.push('/mobileTip'); } //待修改 // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const allType = useMemo(() => { let arr: string[] = []; template.forEach(v => { arr.push(v.type); }); mediaTpl.forEach(v => { arr.push(v.type); }); graphTpl.forEach(v => { arr.push(v.type); }); return arr; }, [graphTpl, mediaTpl, template]); const [dragstate, setDragState] = useState({ x: 0, y: 0 }); const [render] = useGetBall(setDragState, { innerStyle: { top: '10px', left: '10px', cursor: 'pointer' }, ratioSpeed: { x: 1.2, y: 1.2 }, intervalDelay: 5, }); const renderRight = useMemo(() => { if (context.theme === 'h5') { return (
{pointData.length && curPoint ? ( <>
属性设置
) : (
)}
); } else { return (
{cpointData.length && curPoint ? ( <>
属性设置
) : (
)}
); } }, [ context.theme, cpointData.length, curPoint, handleDel, handleFormSave, pointData.length, rightColla, ]); const tabRender = useMemo(() => { if (collapsed) { return ( <> ); } else { return ( <>
基础组件
{template.map((value, i) => { return ( ); })}
媒体组件
{mediaTpl.map((value, i) => ( ))}
可视化组件
{graphTpl.map((value, i) => ( ))}
); } }, [canvasId, collapsed, generateHeader, graphTpl, mediaTpl, schema, template]); return (
changeCollapse(false)} defaultActiveKey="1" tabPosition={'left'} > {tabRender}
changeCollapse(!collapsed)} > {collapsed ? : }
setDragState({ x: 0, y: 0 })} />
{render}
+ -
{renderRight}
changeRightColla(!rightColla)} > {!rightColla ? : }
); }; export default connect((state: StateWithHistory) => { return { pstate: state.present.editorModal, cstate: state.present.editorPcModal }; })(Container);