UNPKG

wix-style-react

Version:
183 lines (139 loc) • 6.88 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactDnd = require("react-dnd"); var _types = require("../types"); var _constants = require("../constants"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /* eslint-disable new-cap */ var target = { drop: function drop(props, monitor) { /** if drop was already done(on child), we skip this drop call */ if (monitor.getDropResult()) { return; } /** after drop released we send containerId and index of dropped item to dropResult, so endDrag inside of drag source can use this data */ return { containerId: props.containerId, index: props.index, groupName: props.groupName }; }, canDrop: function canDrop(props) { return props.droppable; }, hover: function hover(props, monitor, component) { var monitorItem = monitor.getItem(); var dragIndex = monitorItem.index; // position of item that we drag var hoverIndex = props.index; // position of item that we hover(want to put draggable item on it) var isSameGroup = props.groupName && monitorItem.groupName && props.groupName === monitorItem.groupName; // check that items from same group var isSameContainer = props.containerId === monitorItem.realTime.containerId; // check that items from same container /** in case that item not in same group and not from same container - do nothing */ if (!isSameContainer && !isSameGroup) { return; } /** in case that we hover over itself - do nothing */ if (!props.droppable || !component || hoverIndex === dragIndex && isSameContainer) { return; } /** if item is from same group but different container, that's mean that we move item from one container to another, and we need to move out item from previous container */ if (isSameGroup && !isSameContainer) { monitorItem.realTime.onMoveOut(monitorItem.id); } /** as react-dnd store same snapshot in monitor(so containerId of item will be same, even if we moved it with hover to another container) after any hovers, we need to save also real position of monitor, with real links to current container */ monitorItem.realTime.onMoveOut = props.onMoveOut; monitorItem.realTime.onDrop = props.onDrop; monitorItem.realTime.containerId = props.containerId; /** call callback, to ask parent to do some action, for example swap items or add new one, we send original position of item and new one, also id of item and original item state( it required for case, when we moving item from 1 container to another ) */ props.onHover({ removedIndex: dragIndex, addedIndex: hoverIndex, id: monitorItem.id, item: monitorItem.originalItem }); /** set new index for item */ monitorItem.index = hoverIndex; } }; var collect = function collect(connect) { return { connectDropTarget: connect.dropTarget() }; }; var DraggableTarget = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(DraggableTarget, _React$PureComponent); var _super = _createSuper(DraggableTarget); function DraggableTarget() { var _this; (0, _classCallCheck2["default"])(this, DraggableTarget); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "registerNode", function (node) { _this.props.setWrapperNode(node, _this.props.index, _this.props.item); }); return _this; } (0, _createClass2["default"])(DraggableTarget, [{ key: "render", value: function render() { var _this$props = this.props, children = _this$props.children, connectDropTarget = _this$props.connectDropTarget; if (!connectDropTarget) return null; return connectDropTarget( /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({ ref: this.registerNode }, (0, _defineProperty2["default"])({}, _constants.dataAttributes.draggableTarget, true)), children)); } }]); return DraggableTarget; }(_react["default"].PureComponent); DraggableTarget.defaultProps = { droppable: true }; DraggableTarget.propTypes = { dataHook: _propTypes["default"].string, children: _propTypes["default"].any, connectDropTarget: _propTypes["default"].func, // from react-dnd containerId: _propTypes["default"].string, droppable: _propTypes["default"].bool, groupName: _propTypes["default"].string, index: _propTypes["default"].number, onMoveOut: _propTypes["default"].func, onDrop: _propTypes["default"].func, onHover: _propTypes["default"].func, setWrapperNode: _propTypes["default"].func, item: _propTypes["default"].object }; var _default = (0, _reactDnd.DropTarget)(_types.ItemTypes.DRAGGABLE, target, collect)(DraggableTarget); exports["default"] = _default;