@hello-pangea/dnd
Version:
Beautiful and accessible drag and drop for lists with React
69 lines (58 loc) • 1.51 kB
text/typescript
import type { Position } from 'css-box-model';
import type {
DragImpact,
DraggableDimension,
DroppableDimension,
DraggableDimensionMap,
ImpactLocation,
LiftEffect,
} from '../../../types';
import whenCombining from './when-combining';
import whenReordering from './when-reordering';
import withDroppableDisplacement from '../../with-scroll-change/with-droppable-displacement';
interface Args {
impact: DragImpact;
afterCritical: LiftEffect;
draggable: DraggableDimension;
droppable: DroppableDimension | null;
draggables: DraggableDimensionMap;
}
const getResultWithoutDroppableDisplacement = ({
impact,
draggable,
droppable,
draggables,
afterCritical,
}: Args): Position => {
const original: Position = draggable.page.borderBox.center;
const at: ImpactLocation | null = impact.at;
if (!droppable) {
return original;
}
if (!at) {
return original;
}
if (at.type === 'REORDER') {
return whenReordering({
impact,
draggable,
draggables,
droppable,
afterCritical,
});
}
return whenCombining({
impact,
draggables,
afterCritical,
});
};
export default (args: Args): Position => {
const withoutDisplacement: Position =
getResultWithoutDroppableDisplacement(args);
const droppable: DroppableDimension | null = args.droppable;
const withDisplacement: Position = droppable
? withDroppableDisplacement(droppable, withoutDisplacement)
: withoutDisplacement;
return withDisplacement;
};