import React, { memo, useEffect, useState } from 'react'; import { useDrop } from 'react-dnd'; import Draggable from 'react-draggable'; import GridLayout from 'react-grid-layout'; import { Tooltip } from 'antd'; import { connect } from 'dva'; import DynamicEngine from 'components/DynamicEngine'; import styles from './index.less'; import { uuid } from '@/utils/tool'; const SourceBox = memo(props => { const { pstate, scaleNum, canvasId, allType, dispatch } = props; const pointData = pstate ? pstate.pointData : {}; const [canvasRect, setCanvasRect] = useState([]); const [isShowTip, setIsShowTip] = useState(true); const [{ isOver }, drop] = useDrop({ accept: allType, drop: (item, monitor) => { let parentDiv = document.getElementById(canvasId), pointRect = parentDiv.getBoundingClientRect(), top = pointRect.top, pointEnd = monitor.getSourceClientOffset(), y = pointEnd.y < top ? 0 : pointEnd.y - top, col = 24, // 网格列数 cellHeight = 2, w = item.type === 'Icon' ? 3 : col; // 转换成网格规则的坐标和大小 let gridY = Math.ceil(y / cellHeight); dispatch({ type: 'editorModal/addPointData', payload: { id: uuid(6, 10), item, point: { i: `x-${pointData.length}`, x: 0, y: gridY, w, h: item.h, isBounded: true }, }, }); }, collect: monitor => ({ isOver: monitor.isOver(), canDrop: monitor.canDrop(), item: monitor.getItem(), }), }); const dragStop = (layout, oldItem, newItem, placeholder, e, element) => { const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', payload: { ...curPointData, point: newItem }, }); }; const onDragStart = (layout, oldItem, newItem, placeholder, e, element) => { const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', payload: { ...curPointData }, }); }; const onResizeStop = (layout, oldItem, newItem, placeholder, e, element) => { const curPointData = pointData.filter(item => item.id === newItem.i)[0]; dispatch({ type: 'editorModal/modPointData', payload: { ...curPointData, point: newItem }, }); }; useEffect(() => { let { width, height } = document.getElementById(canvasId).getBoundingClientRect(); setCanvasRect([width, height]); }, [canvasId]); useEffect(() => { let timer = window.setTimeout(() => { setIsShowTip(false); }, 3000); return () => { window.clearTimeout(timer); }; }, []); const opacity = isOver ? 0.7 : 1; const backgroundColor = isOver ? 1 : 0.7; return (
{pointData.length > 0 ? ( {pointData.map(value => (
))}
) : null}
); }); export default connect(state => ({ pstate: state.present.editorModal }))(SourceBox);