react-beautiful-dnd
Version:
Beautiful, accessible drag and drop for lists with React.js
52 lines (42 loc) • 1.23 kB
Flow
// @flow
import memoizeOne from 'memoize-one';
import rafSchedule from 'raf-schd';
import type { Position } from '../../../types';
import type { Callbacks } from '../drag-handle-types';
export default (callbacks: Callbacks, isDraggingFn: () => boolean) => {
const ifDragging = (fn: Function) => {
if (isDraggingFn()) {
fn();
}
};
const memoizedMove = memoizeOne((x: number, y: number) => {
const point: Position = { x, y };
callbacks.onMove(point);
});
const move = rafSchedule((point: Position) => {
ifDragging(() => memoizedMove(point.x, point.y));
});
const moveForward = rafSchedule(() => {
ifDragging(callbacks.onMoveForward);
});
const moveBackward = rafSchedule(() => {
ifDragging(callbacks.onMoveBackward);
});
const crossAxisMoveForward = rafSchedule(() => {
ifDragging(callbacks.onCrossAxisMoveForward);
});
const crossAxisMoveBackward = rafSchedule(() => {
ifDragging(callbacks.onCrossAxisMoveBackward);
});
const windowScrollMove = rafSchedule(() => {
ifDragging(callbacks.onWindowScroll);
});
return {
move,
moveForward,
moveBackward,
crossAxisMoveForward,
crossAxisMoveBackward,
windowScrollMove,
};
};