"use client" import type { Children, Classname } from "@/core/types/common"; import { useRef, MouseEvent as ReactMouseEvent, useState, Fragment, useEffect, type JSX, } from "react"; type Size = { width: number; height: number }; interface DraggableProps extends Children, Classname { start?: () => void; end?: () => void; dataTransfer: string; disabled?: boolean; } export default function Draggable(props: Readonly): JSX.Element { const element = useRef(null); const float = useRef(null); const [dragMoving, setDragMoving] = useState(false); const [size, setSize] = useState(null); const onMoving = (event: MouseEvent) => { if (element.current && float.current) { setDragMoving(true); const x = event.clientX; const y = event.clientY; float.current.style.top = y - (element.current.offsetHeight) + "px"; float.current.style.left = x - element.current.offsetWidth + "px"; } } const onMovingEnd = (event: MouseEvent) => { event.preventDefault(); document.removeEventListener("mousemove", onMoving); setDragMoving(false); if (element.current && float.current) { float.current.style.top = "auto"; float.current.style.left = "auto"; document.addEventListener("mouseup", onMovingEnd); if (props.end) props.end(); } } const onMouseDown = (event: ReactMouseEvent) => { event.preventDefault(); if (props.disabled) return; if (props.start) props.start(); if (element.current && float.current) { document.addEventListener("mousemove", onMoving); document.addEventListener("mouseup", onMovingEnd); } } useEffect(() => { if (element.current) { setSize({ width: element.current.offsetWidth + 20, height: element.current.offsetHeight + 20 }) } return () => { document.removeEventListener("mousemove", onMoving); document.removeEventListener("mouseup", onMovingEnd); } // eslint-disable-next-line }, []); return (
{props.children}
); }