UNPKG

react-beautiful-dnd

Version:

Beautiful, accessible drag and drop for lists with React.js

206 lines (154 loc) 5.83 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeSelector = undefined; var _memoizeOne = require('memoize-one'); var _memoizeOne2 = _interopRequireDefault(_memoizeOne); var _reactRedux = require('react-redux'); var _reselect = require('reselect'); var _draggable = require('./draggable'); var _draggable2 = _interopRequireDefault(_draggable); var _contextKeys = require('../context-keys'); var _position = require('../../state/position'); var _getDisplacementMap = require('../../state/get-displacement-map'); var _getDisplacementMap2 = _interopRequireDefault(_getDisplacementMap); var _actionCreators = require('../../state/action-creators'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var origin = { x: 0, y: 0 }; var defaultMapProps = { isDropAnimating: false, isDragging: false, offset: origin, shouldAnimateDragMovement: false, shouldAnimateDisplacement: true, dimension: null, direction: null }; var makeSelector = exports.makeSelector = function makeSelector() { var memoizedOffset = (0, _memoizeOne2.default)(function (x, y) { return { x: x, y: y }; }); var getNotDraggingProps = (0, _memoizeOne2.default)(function (offset, shouldAnimateDisplacement) { return { isDropAnimating: false, isDragging: false, offset: offset, shouldAnimateDisplacement: shouldAnimateDisplacement, shouldAnimateDragMovement: false, dimension: null, direction: null }; }); var getDraggingProps = (0, _memoizeOne2.default)(function (offset, shouldAnimateDragMovement, dimension, direction) { return { isDragging: true, isDropAnimating: false, shouldAnimateDisplacement: false, offset: offset, shouldAnimateDragMovement: shouldAnimateDragMovement, dimension: dimension, direction: direction }; }); var draggingSelector = function draggingSelector(state, ownProps) { if (state.phase !== 'DRAGGING' && state.phase !== 'DROP_ANIMATING') { return null; } if (state.phase === 'DRAGGING') { if (!state.drag) { console.error('invalid drag state found in selector'); return null; } if (state.drag.initial.descriptor.id !== ownProps.draggableId) { return null; } var offset = state.drag.current.client.offset; var dimension = state.dimension.draggable[ownProps.draggableId]; var direction = state.drag.impact.direction; var shouldAnimateDragMovement = state.drag.current.shouldAnimate; return getDraggingProps(memoizedOffset(offset.x, offset.y), shouldAnimateDragMovement, dimension, direction); } if (!state.drop || !state.drop.pending) { console.error('cannot provide props for dropping item when there is invalid state'); return null; } if (state.drop.pending.result.draggableId !== ownProps.draggableId) { return null; } return { isDragging: false, isDropAnimating: true, offset: state.drop.pending.newHomeOffset, dimension: state.dimension.draggable[ownProps.draggableId], direction: null, shouldAnimateDragMovement: false, shouldAnimateDisplacement: false }; }; var getOutOfTheWayMovement = function getOutOfTheWayMovement(id, movement) { var map = (0, _getDisplacementMap2.default)(movement.displaced); var displacement = map[id]; if (!displacement) { return null; } if (!displacement.isVisible) { return null; } var amount = movement.isBeyondStartPosition ? (0, _position.negate)(movement.amount) : movement.amount; return getNotDraggingProps(memoizedOffset(amount.x, amount.y), displacement.shouldAnimate); }; var movingOutOfTheWaySelector = function movingOutOfTheWaySelector(state, ownProps) { if (state.phase !== 'DRAGGING' && state.phase !== 'DROP_ANIMATING') { return null; } if (state.phase === 'DRAGGING') { if (!state.drag) { console.error('cannot correctly move item out of the way when there is invalid state'); return null; } if (state.drag.initial.descriptor.id === ownProps.draggableId) { return null; } return getOutOfTheWayMovement(ownProps.draggableId, state.drag.impact.movement); } if (!state.drop || !state.drop.pending) { console.error('cannot provide props for dropping item when there is invalid state'); return null; } if (state.drop.pending.result.draggableId === ownProps.draggableId) { return null; } return getOutOfTheWayMovement(ownProps.draggableId, state.drop.pending.impact.movement); }; return (0, _reselect.createSelector)([draggingSelector, movingOutOfTheWaySelector], function (dragging, movingOutOfTheWay) { if (dragging) { return dragging; } if (movingOutOfTheWay) { return movingOutOfTheWay; } return defaultMapProps; }); }; var makeMapStateToProps = function makeMapStateToProps() { var selector = makeSelector(); return function (state, props) { return selector(state, props); }; }; var mapDispatchToProps = { lift: _actionCreators.lift, move: _actionCreators.move, moveForward: _actionCreators.moveForward, moveBackward: _actionCreators.moveBackward, crossAxisMoveForward: _actionCreators.crossAxisMoveForward, crossAxisMoveBackward: _actionCreators.crossAxisMoveBackward, moveByWindowScroll: _actionCreators.moveByWindowScroll, drop: _actionCreators.drop, dropAnimationFinished: _actionCreators.dropAnimationFinished, cancel: _actionCreators.cancel }; exports.default = (0, _reactRedux.connect)(makeMapStateToProps, mapDispatchToProps, null, { storeKey: _contextKeys.storeKey })(_draggable2.default);