// @ts-expect-error Due to live server dependencies import { combine } from "@atlaskit/pragmatic-drag-and-drop/dist/cjs/entry-point/combine.js"; import { draggable, dropTargetForElements, // @ts-expect-error Due to live server dependencies } from "@atlaskit/pragmatic-drag-and-drop/dist/cjs/entry-point/element/adapter.js"; import { attachClosestEdge, extractClosestEdge, // @ts-expect-error Due to live server dependencies } from "@atlaskit/pragmatic-drag-and-drop-hitbox/dist/cjs/closest-edge.js"; import { isEqual } from "lodash-es"; import React, { useEffect, useRef, useState } from "react"; import { DropIndicator } from "../drop-indicator"; import { cn } from "../utils"; type Props = { children: React.ReactNode; data: any; //@todo make this generic className?: string; }; function Draggable({ children, data, className }: Props) { const ref = useRef(null); const [dragging, setDragging] = useState(false); // NEW const [isDraggedOver, setIsDraggedOver] = useState(false); const [closestEdge, setClosestEdge] = useState(null); useEffect(() => { const el = ref.current; if (el) { combine( draggable({ element: el, onDragStart: () => setDragging(true), // NEW onDrop: () => setDragging(false), // NEW getInitialData: () => data, }), dropTargetForElements({ element: el, // @ts-expect-error Due to live server dependencies onDragEnter: (args) => { setIsDraggedOver(true); setClosestEdge(extractClosestEdge(args.self.data)); }, onDragLeave: () => setIsDraggedOver(false), onDrop: () => { setIsDraggedOver(false); }, // @ts-expect-error Due to live server dependencies canDrop: ({ source }) => !isEqual(source.data, data) && source.data.__uuid__ === data.__uuid__, // @ts-expect-error Due to live server dependencies getData: ({ input, element }) => attachClosestEdge(data, { input, element, allowedEdges: ["top", "bottom"], }), }) ); } }, [data]); return (
{} {children} {}
); } export { Draggable };