in src/hooks/useDrop.ts [56:96]
export function useDrop(stepIndex: number, actionIndex: number) {
const { dragIndex } = useContext(DragAndDropContext);
const { steps, onDropStep, onSplitStep } = useContext(StepsContext);
const [dropzoneOver, setDropzoneOver] = useState(false);
const [enterTarget, setEnterTarget] = useState<EventTarget | undefined>(undefined);
const splitStepAtAction = useCallback(() => {
onSplitStep(stepIndex, actionIndex);
}, [actionIndex, onSplitStep, stepIndex]);
const isDroppable = computeIsDroppable(stepIndex, actionIndex, steps, dragIndex);
const onDropActions: DropProps = {};
if (isDroppable) {
onDropActions.onDrop = e => {
const { initiatorIndex } = JSON.parse(
e.dataTransfer.getData(DRAG_AND_DROP_DATA_TRANSFER_TYPE)
) as StepSeparatorDragDropDataTransfer;
setDropzoneOver(false);
onDropStep(stepIndex, initiatorIndex, actionIndex);
e.preventDefault();
};
onDropActions.onDragEnter = e => {
setEnterTarget(e.target);
setDropzoneOver(true);
e.preventDefault();
};
onDropActions.onDragOver = e => {
e.preventDefault();
};
onDropActions.onDragLeave = e => {
if (e.target === enterTarget) setDropzoneOver(false);
};
}
return {
isDragOver: isDroppable && dropzoneOver,
onDropActions,
splitStepAtAction,
};
}