import { useEditorState } from '@designcombo/core'; import React, { useState, cloneElement, ReactElement, useRef } from 'react'; import { createPortal } from 'react-dom'; interface DraggableProps { children: ReactElement; shouldDisplayPreview?: boolean; renderCustomPreview?: ReactElement; data?: Record; } const Draggable: React.FC = ({ children, renderCustomPreview, data = {}, shouldDisplayPreview = true, }) => { const [isDragging, setIsDragging] = useState(false); const [position, setPosition] = useState({ x: 0, y: 0 }); const previewRef = useRef(null); const handleDragStart = (e: React.DragEvent) => { setIsDragging(true); e.dataTransfer.setDragImage(new Image(), 0, 0); // Hides default preview // set drag data e.dataTransfer.setData('transition', JSON.stringify(data)); setPosition({ x: e.clientX, y: e.clientY, }); }; const handleDragEnd = () => { setIsDragging(false); }; const handleDrag = (e: React.DragEvent) => { if (isDragging) { setPosition({ x: e.clientX, y: e.clientY, }); } }; const childWithProps = cloneElement(children, { draggable: true, onDragStart: handleDragStart, onDragEnd: handleDragEnd, onDrag: handleDrag, style: { ...children.props.style, cursor: 'grab', }, }); return ( <> {childWithProps} {isDragging && shouldDisplayPreview && renderCustomPreview ? createPortal(
{renderCustomPreview}
, document.body, ) : null} ); }; export default Draggable;