UNPKG

qtsd-fork

Version:

Do not use this please

231 lines (192 loc) 7.06 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _matchesType = require('./utils/matchesType'); var _matchesType2 = _interopRequireDefault(_matchesType); var _HandlerRegistry = require('./HandlerRegistry'); var _HandlerRegistry2 = _interopRequireDefault(_HandlerRegistry); var _dragOffset = require('./reducers/dragOffset'); var _dirtyHandlerIds = require('./reducers/dirtyHandlerIds'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DragDropMonitor = function () { function DragDropMonitor(store) { _classCallCheck(this, DragDropMonitor); this.store = store; this.registry = new _HandlerRegistry2.default(store); } _createClass(DragDropMonitor, [{ key: 'subscribeToStateChange', value: function subscribeToStateChange(listener) { var _this = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var handlerIds = options.handlerIds; (0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.'); (0, _invariant2.default)(typeof handlerIds === 'undefined' || (0, _isArray2.default)(handlerIds), 'handlerIds, when specified, must be an array of strings.'); var prevStateId = this.store.getState().stateId; var handleChange = function handleChange() { var state = _this.store.getState(); var currentStateId = state.stateId; try { var canSkipListener = currentStateId === prevStateId || currentStateId === prevStateId + 1 && !(0, _dirtyHandlerIds.areDirty)(state.dirtyHandlerIds, handlerIds); if (!canSkipListener) { listener(); } } finally { prevStateId = currentStateId; } }; return this.store.subscribe(handleChange); } }, { key: 'subscribeToOffsetChange', value: function subscribeToOffsetChange(listener) { var _this2 = this; (0, _invariant2.default)(typeof listener === 'function', 'listener must be a function.'); var previousState = this.store.getState().dragOffset; var handleChange = function handleChange() { var nextState = _this2.store.getState().dragOffset; if (nextState === previousState) { return; } previousState = nextState; listener(); }; return this.store.subscribe(handleChange); } }, { key: 'canDragSource', value: function canDragSource(sourceId) { var source = this.registry.getSource(sourceId); (0, _invariant2.default)(source, 'Expected to find a valid source.'); if (this.isDragging()) { return false; } return source.canDrag(this, sourceId); } }, { key: 'canDropOnTarget', value: function canDropOnTarget(targetId) { var target = this.registry.getTarget(targetId); (0, _invariant2.default)(target, 'Expected to find a valid target.'); if (!this.isDragging() || this.didDrop()) { return false; } var targetType = this.registry.getTargetType(targetId); var draggedItemType = this.getItemType(); return (0, _matchesType2.default)(targetType, draggedItemType) && target.canDrop(this, targetId); } }, { key: 'isDragging', value: function isDragging() { return Boolean(this.getItemType()); } }, { key: 'isDraggingSource', value: function isDraggingSource(sourceId) { var source = this.registry.getSource(sourceId, true); (0, _invariant2.default)(source, 'Expected to find a valid source.'); if (!this.isDragging() || !this.isSourcePublic()) { return false; } var sourceType = this.registry.getSourceType(sourceId); var draggedItemType = this.getItemType(); if (sourceType !== draggedItemType) { return false; } return source.isDragging(this, sourceId); } }, { key: 'isOverTarget', value: function isOverTarget(targetId) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { shallow: false }; var shallow = options.shallow; if (!this.isDragging()) { return false; } var targetType = this.registry.getTargetType(targetId); var draggedItemType = this.getItemType(); if (!(0, _matchesType2.default)(targetType, draggedItemType)) { return false; } var targetIds = this.getTargetIds(); if (!targetIds.length) { return false; } var index = targetIds.indexOf(targetId); if (shallow) { return index === targetIds.length - 1; } else { return index > -1; } } }, { key: 'getItemType', value: function getItemType() { return this.store.getState().dragOperation.itemType; } }, { key: 'getItem', value: function getItem() { return this.store.getState().dragOperation.item; } }, { key: 'getSourceId', value: function getSourceId() { return this.store.getState().dragOperation.sourceId; } }, { key: 'getTargetIds', value: function getTargetIds() { return this.store.getState().dragOperation.targetIds; } }, { key: 'getDropResult', value: function getDropResult() { return this.store.getState().dragOperation.dropResult; } }, { key: 'didDrop', value: function didDrop() { return this.store.getState().dragOperation.didDrop; } }, { key: 'isSourcePublic', value: function isSourcePublic() { return this.store.getState().dragOperation.isSourcePublic; } }, { key: 'getInitialClientOffset', value: function getInitialClientOffset() { return this.store.getState().dragOffset.initialClientOffset; } }, { key: 'getInitialSourceClientOffset', value: function getInitialSourceClientOffset() { return this.store.getState().dragOffset.initialSourceClientOffset; } }, { key: 'getClientOffset', value: function getClientOffset() { return this.store.getState().dragOffset.clientOffset; } }, { key: 'getSourceClientOffset', value: function getSourceClientOffset() { return (0, _dragOffset.getSourceClientOffset)(this.store.getState().dragOffset); } }, { key: 'getDifferenceFromInitialOffset', value: function getDifferenceFromInitialOffset() { return (0, _dragOffset.getDifferenceFromInitialOffset)(this.store.getState().dragOffset); } }]); return DragDropMonitor; }(); exports.default = DragDropMonitor;