react-beautiful-dnd-next
Version:
Beautiful and accessible drag and drop for lists with React
50 lines (43 loc) • 1.19 kB
JavaScript
// @flow
import type {
Viewport,
DraggableDimension,
DroppableDimension,
DisplacedBy,
} from '../../../types';
import getDisplacedBy from '../../get-displaced-by';
import offsetDraggable from './offset-draggable';
type Args = {|
additions: DraggableDimension[],
dragging: DraggableDimension,
home: DroppableDimension,
viewport: Viewport,
|};
export default ({
additions,
dragging,
home,
viewport,
}: Args): DraggableDimension[] => {
const displacedBy: DisplacedBy = getDisplacedBy(
home.axis,
dragging.displaceBy,
);
return additions.map((draggable: DraggableDimension): DraggableDimension => {
// not in the home list, nothing to worry about there
if (draggable.descriptor.droppableId !== home.descriptor.id) {
return draggable;
}
// appears before the draggable - no need to shift
if (draggable.descriptor.index < dragging.descriptor.index) {
return draggable;
}
// item occurs after dragging item
// need to shift it to account for collapsed home item
return offsetDraggable({
draggable,
offset: displacedBy.point,
initialWindowScroll: viewport.scroll.initial,
});
});
};