Pragmatic DnD
Keep the monitor and edge-aware pointer behavior. The official task markup already exposes data-task-id, so the keyboard path can call the same moveTask operation.
useEffect(() => {
return monitorForElements({
onDrop({source, location}) {
const target = location.current.dropTargets[0];
if (
!target ||
!isTaskData(source.data) ||
!isTaskData(target.data)
) return;
moveTask(
source.data.taskId,
target.data.taskId,
extractClosestEdge(target.data),
);
},
});
}, [moveTask]);{
fromElements: '[data-task-id]',
toElements: '[data-task-id]',
callback: (source, target) => {
const sourceId = source.dataset.taskId;
const targetId = target.dataset.taskId;
if (sourceId && targetId) {
moveTask(sourceId, targetId);
}
},
}


