react-beautiful-dnd
Version:
Beautiful, accessible drag and drop for lists with React.js
62 lines (52 loc) • 1.54 kB
Flow
// @flow
import type {
DraggableId,
DroppableId,
DragMovement,
DraggableDimension,
DroppableDimension,
DragImpact,
Axis,
Position,
} from '../../types';
import { add, subtract, patch } from '../position';
type Args = {|
pageCenter: Position,
draggable: DraggableDimension,
destination: DroppableDimension,
insideDestination: DraggableDimension[],
|}
export default ({
pageCenter,
draggable,
destination,
insideDestination,
}: Args): DragImpact => {
const axis: Axis = destination.axis;
const destinationScrollDiff: Position = subtract(
destination.container.scroll.current, destination.container.scroll.initial
);
const currentCenter: Position = add(pageCenter, destinationScrollDiff);
const moved: DraggableId[] = insideDestination
.filter((child: DraggableDimension): boolean => {
// Items will be displaced forward if they sit ahead of the dragging item
const threshold: number = child.page.withoutMargin[axis.end];
return threshold > currentCenter[axis.line];
})
.map((dimension: DraggableDimension): DroppableId => dimension.id);
const newIndex: number = insideDestination.length - moved.length;
const movement: DragMovement = {
amount: patch(axis.line, draggable.page.withMargin[axis.size]),
draggables: moved,
isBeyondStartPosition: false,
};
const impact: DragImpact = {
movement,
direction: axis.direction,
destination: {
droppableId: destination.id,
index: newIndex,
},
};
return impact;
};