@kwiz/fluentui
Version:
KWIZ common controls for FluentUI
48 lines (43 loc) • 1.37 kB
text/typescript
import { useEffect } from 'react';
import { ConnectDragSource, DragSourceMonitor, useDrag } from 'react-dnd';
import { useDragDropContextInternal } from './drag-drop-context-internal';
import { iDraggableProps, iDraggedItemType } from './drag-drop.types';
export function useDraggable<ItemType extends iDraggedItemType<string>>(props?: iDraggableProps<ItemType>): {
isDragging: boolean;
dragRef: ConnectDragSource
} {
const {
item,
onBeginDrag,
onEndDrag,
} = props || {
item: {
type: "~invalid~"
}
};
const dragDropContext = useDragDropContextInternal();
const [{ isDragging }, dragRef] = useDrag(
() => ({
type: item.type,
item,
collect: (monitor: DragSourceMonitor) => ({
isDragging: monitor.isDragging(),
}),
end: (item, monitor) => {
dragDropContext.setDragItem(null);
onEndDrag && onEndDrag(monitor.getDropResult());
},
}),
[item, item.type]
);
useEffect(() => {
if (isDragging) {
dragDropContext.setDragItem(item);
onBeginDrag && onBeginDrag();
}
}, [isDragging, onBeginDrag])
return {
isDragging,
dragRef,
};
}