|
|
(function (global, factory) {
|
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
|
|
|
typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
|
|
|
(global = global || self, factory(global.ReactDnD = {}, global.React));
|
|
|
}(this, (function (exports, React) { 'use strict';
|
|
|
|
|
|
var HandlerRole;
|
|
|
|
|
|
(function (HandlerRole) {
|
|
|
HandlerRole["SOURCE"] = "SOURCE";
|
|
|
HandlerRole["TARGET"] = "TARGET";
|
|
|
})(HandlerRole || (HandlerRole = {}));
|
|
|
|
|
|
function symbolObservablePonyfill(root) {
|
|
|
var result;
|
|
|
var Symbol = root.Symbol;
|
|
|
|
|
|
if (typeof Symbol === 'function') {
|
|
|
if (Symbol.observable) {
|
|
|
result = Symbol.observable;
|
|
|
} else {
|
|
|
result = Symbol('observable');
|
|
|
Symbol.observable = result;
|
|
|
}
|
|
|
} else {
|
|
|
result = '@@observable';
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
/* global window */
|
|
|
|
|
|
var root;
|
|
|
|
|
|
if (typeof self !== 'undefined') {
|
|
|
root = self;
|
|
|
} else if (typeof window !== 'undefined') {
|
|
|
root = window;
|
|
|
} else if (typeof global !== 'undefined') {
|
|
|
root = global;
|
|
|
} else if (typeof module !== 'undefined') {
|
|
|
root = module;
|
|
|
} else {
|
|
|
root = Function('return this')();
|
|
|
}
|
|
|
|
|
|
var result = symbolObservablePonyfill(root);
|
|
|
|
|
|
/**
|
|
|
* These are private action types reserved by Redux.
|
|
|
* For any unknown actions, you must return the current state.
|
|
|
* If the current state is undefined, you must return the initial state.
|
|
|
* Do not reference these action types directly in your code.
|
|
|
*/
|
|
|
var randomString = function randomString() {
|
|
|
return Math.random().toString(36).substring(7).split('').join('.');
|
|
|
};
|
|
|
|
|
|
var ActionTypes = {
|
|
|
INIT: "@@redux/INIT" + randomString(),
|
|
|
REPLACE: "@@redux/REPLACE" + randomString(),
|
|
|
PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {
|
|
|
return "@@redux/PROBE_UNKNOWN_ACTION" + randomString();
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* @param {any} obj The object to inspect.
|
|
|
* @returns {boolean} True if the argument appears to be a plain object.
|
|
|
*/
|
|
|
function isPlainObject(obj) {
|
|
|
if (typeof obj !== 'object' || obj === null) return false;
|
|
|
var proto = obj;
|
|
|
|
|
|
while (Object.getPrototypeOf(proto) !== null) {
|
|
|
proto = Object.getPrototypeOf(proto);
|
|
|
}
|
|
|
|
|
|
return Object.getPrototypeOf(obj) === proto;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Creates a Redux store that holds the state tree.
|
|
|
* The only way to change the data in the store is to call `dispatch()` on it.
|
|
|
*
|
|
|
* There should only be a single store in your app. To specify how different
|
|
|
* parts of the state tree respond to actions, you may combine several reducers
|
|
|
* into a single reducer function by using `combineReducers`.
|
|
|
*
|
|
|
* @param {Function} reducer A function that returns the next state tree, given
|
|
|
* the current state tree and the action to handle.
|
|
|
*
|
|
|
* @param {any} [preloadedState] The initial state. You may optionally specify it
|
|
|
* to hydrate the state from the server in universal apps, or to restore a
|
|
|
* previously serialized user session.
|
|
|
* If you use `combineReducers` to produce the root reducer function, this must be
|
|
|
* an object with the same shape as `combineReducers` keys.
|
|
|
*
|
|
|
* @param {Function} [enhancer] The store enhancer. You may optionally specify it
|
|
|
* to enhance the store with third-party capabilities such as middleware,
|
|
|
* time travel, persistence, etc. The only store enhancer that ships with Redux
|
|
|
* is `applyMiddleware()`.
|
|
|
*
|
|
|
* @returns {Store} A Redux store that lets you read the state, dispatch actions
|
|
|
* and subscribe to changes.
|
|
|
*/
|
|
|
|
|
|
function createStore(reducer, preloadedState, enhancer) {
|
|
|
var _ref2;
|
|
|
|
|
|
if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {
|
|
|
throw new Error('It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function.');
|
|
|
}
|
|
|
|
|
|
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
|
|
|
enhancer = preloadedState;
|
|
|
preloadedState = undefined;
|
|
|
}
|
|
|
|
|
|
if (typeof enhancer !== 'undefined') {
|
|
|
if (typeof enhancer !== 'function') {
|
|
|
throw new Error('Expected the enhancer to be a function.');
|
|
|
}
|
|
|
|
|
|
return enhancer(createStore)(reducer, preloadedState);
|
|
|
}
|
|
|
|
|
|
if (typeof reducer !== 'function') {
|
|
|
throw new Error('Expected the reducer to be a function.');
|
|
|
}
|
|
|
|
|
|
var currentReducer = reducer;
|
|
|
var currentState = preloadedState;
|
|
|
var currentListeners = [];
|
|
|
var nextListeners = currentListeners;
|
|
|
var isDispatching = false;
|
|
|
/**
|
|
|
* This makes a shallow copy of currentListeners so we can use
|
|
|
* nextListeners as a temporary list while dispatching.
|
|
|
*
|
|
|
* This prevents any bugs around consumers calling
|
|
|
* subscribe/unsubscribe in the middle of a dispatch.
|
|
|
*/
|
|
|
|
|
|
function ensureCanMutateNextListeners() {
|
|
|
if (nextListeners === currentListeners) {
|
|
|
nextListeners = currentListeners.slice();
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Reads the state tree managed by the store.
|
|
|
*
|
|
|
* @returns {any} The current state tree of your application.
|
|
|
*/
|
|
|
|
|
|
|
|
|
function getState() {
|
|
|
if (isDispatching) {
|
|
|
throw new Error('You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');
|
|
|
}
|
|
|
|
|
|
return currentState;
|
|
|
}
|
|
|
/**
|
|
|
* Adds a change listener. It will be called any time an action is dispatched,
|
|
|
* and some part of the state tree may potentially have changed. You may then
|
|
|
* call `getState()` to read the current state tree inside the callback.
|
|
|
*
|
|
|
* You may call `dispatch()` from a change listener, with the following
|
|
|
* caveats:
|
|
|
*
|
|
|
* 1. The subscriptions are snapshotted just before every `dispatch()` call.
|
|
|
* If you subscribe or unsubscribe while the listeners are being invoked, this
|
|
|
* will not have any effect on the `dispatch()` that is currently in progress.
|
|
|
* However, the next `dispatch()` call, whether nested or not, will use a more
|
|
|
* recent snapshot of the subscription list.
|
|
|
*
|
|
|
* 2. The listener should not expect to see all state changes, as the state
|
|
|
* might have been updated multiple times during a nested `dispatch()` before
|
|
|
* the listener is called. It is, however, guaranteed that all subscribers
|
|
|
* registered before the `dispatch()` started will be called with the latest
|
|
|
* state by the time it exits.
|
|
|
*
|
|
|
* @param {Function} listener A callback to be invoked on every dispatch.
|
|
|
* @returns {Function} A function to remove this change listener.
|
|
|
*/
|
|
|
|
|
|
|
|
|
function subscribe(listener) {
|
|
|
if (typeof listener !== 'function') {
|
|
|
throw new Error('Expected the listener to be a function.');
|
|
|
}
|
|
|
|
|
|
if (isDispatching) {
|
|
|
throw new Error('You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
|
|
|
}
|
|
|
|
|
|
var isSubscribed = true;
|
|
|
ensureCanMutateNextListeners();
|
|
|
nextListeners.push(listener);
|
|
|
return function unsubscribe() {
|
|
|
if (!isSubscribed) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (isDispatching) {
|
|
|
throw new Error('You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');
|
|
|
}
|
|
|
|
|
|
isSubscribed = false;
|
|
|
ensureCanMutateNextListeners();
|
|
|
var index = nextListeners.indexOf(listener);
|
|
|
nextListeners.splice(index, 1);
|
|
|
};
|
|
|
}
|
|
|
/**
|
|
|
* Dispatches an action. It is the only way to trigger a state change.
|
|
|
*
|
|
|
* The `reducer` function, used to create the store, will be called with the
|
|
|
* current state tree and the given `action`. Its return value will
|
|
|
* be considered the **next** state of the tree, and the change listeners
|
|
|
* will be notified.
|
|
|
*
|
|
|
* The base implementation only supports plain object actions. If you want to
|
|
|
* dispatch a Promise, an Observable, a thunk, or something else, you need to
|
|
|
* wrap your store creating function into the corresponding middleware. For
|
|
|
* example, see the documentation for the `redux-thunk` package. Even the
|
|
|
* middleware will eventually dispatch plain object actions using this method.
|
|
|
*
|
|
|
* @param {Object} action A plain object representing “what changed”. It is
|
|
|
* a good idea to keep actions serializable so you can record and replay user
|
|
|
* sessions, or use the time travelling `redux-devtools`. An action must have
|
|
|
* a `type` property which may not be `undefined`. It is a good idea to use
|
|
|
* string constants for action types.
|
|
|
*
|
|
|
* @returns {Object} For convenience, the same action object you dispatched.
|
|
|
*
|
|
|
* Note that, if you use a custom middleware, it may wrap `dispatch()` to
|
|
|
* return something else (for example, a Promise you can await).
|
|
|
*/
|
|
|
|
|
|
|
|
|
function dispatch(action) {
|
|
|
if (!isPlainObject(action)) {
|
|
|
throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.');
|
|
|
}
|
|
|
|
|
|
if (typeof action.type === 'undefined') {
|
|
|
throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?');
|
|
|
}
|
|
|
|
|
|
if (isDispatching) {
|
|
|
throw new Error('Reducers may not dispatch actions.');
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
isDispatching = true;
|
|
|
currentState = currentReducer(currentState, action);
|
|
|
} finally {
|
|
|
isDispatching = false;
|
|
|
}
|
|
|
|
|
|
var listeners = currentListeners = nextListeners;
|
|
|
|
|
|
for (var i = 0; i < listeners.length; i++) {
|
|
|
var listener = listeners[i];
|
|
|
listener();
|
|
|
}
|
|
|
|
|
|
return action;
|
|
|
}
|
|
|
/**
|
|
|
* Replaces the reducer currently used by the store to calculate the state.
|
|
|
*
|
|
|
* You might need this if your app implements code splitting and you want to
|
|
|
* load some of the reducers dynamically. You might also need this if you
|
|
|
* implement a hot reloading mechanism for Redux.
|
|
|
*
|
|
|
* @param {Function} nextReducer The reducer for the store to use instead.
|
|
|
* @returns {void}
|
|
|
*/
|
|
|
|
|
|
|
|
|
function replaceReducer(nextReducer) {
|
|
|
if (typeof nextReducer !== 'function') {
|
|
|
throw new Error('Expected the nextReducer to be a function.');
|
|
|
}
|
|
|
|
|
|
currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.
|
|
|
// Any reducers that existed in both the new and old rootReducer
|
|
|
// will receive the previous state. This effectively populates
|
|
|
// the new state tree with any relevant data from the old one.
|
|
|
|
|
|
dispatch({
|
|
|
type: ActionTypes.REPLACE
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* Interoperability point for observable/reactive libraries.
|
|
|
* @returns {observable} A minimal observable of state changes.
|
|
|
* For more information, see the observable proposal:
|
|
|
* https://github.com/tc39/proposal-observable
|
|
|
*/
|
|
|
|
|
|
|
|
|
function observable() {
|
|
|
var _ref;
|
|
|
|
|
|
var outerSubscribe = subscribe;
|
|
|
return _ref = {
|
|
|
/**
|
|
|
* The minimal observable subscription method.
|
|
|
* @param {Object} observer Any object that can be used as an observer.
|
|
|
* The observer object should have a `next` method.
|
|
|
* @returns {subscription} An object with an `unsubscribe` method that can
|
|
|
* be used to unsubscribe the observable from the store, and prevent further
|
|
|
* emission of values from the observable.
|
|
|
*/
|
|
|
subscribe: function subscribe(observer) {
|
|
|
if (typeof observer !== 'object' || observer === null) {
|
|
|
throw new TypeError('Expected the observer to be an object.');
|
|
|
}
|
|
|
|
|
|
function observeState() {
|
|
|
if (observer.next) {
|
|
|
observer.next(getState());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
observeState();
|
|
|
var unsubscribe = outerSubscribe(observeState);
|
|
|
return {
|
|
|
unsubscribe: unsubscribe
|
|
|
};
|
|
|
}
|
|
|
}, _ref[result] = function () {
|
|
|
return this;
|
|
|
}, _ref;
|
|
|
} // When a store is created, an "INIT" action is dispatched so that every
|
|
|
// reducer returns their initial state. This effectively populates
|
|
|
// the initial state tree.
|
|
|
|
|
|
|
|
|
dispatch({
|
|
|
type: ActionTypes.INIT
|
|
|
});
|
|
|
return _ref2 = {
|
|
|
dispatch: dispatch,
|
|
|
subscribe: subscribe,
|
|
|
getState: getState,
|
|
|
replaceReducer: replaceReducer
|
|
|
}, _ref2[result] = observable, _ref2;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Prints a warning in the console if it exists.
|
|
|
*
|
|
|
* @param {String} message The warning message.
|
|
|
* @returns {void}
|
|
|
*/
|
|
|
function warning(message) {
|
|
|
/* eslint-disable no-console */
|
|
|
if (typeof console !== 'undefined' && typeof console.error === 'function') {
|
|
|
console.error(message);
|
|
|
}
|
|
|
/* eslint-enable no-console */
|
|
|
|
|
|
|
|
|
try {
|
|
|
// This error was thrown as a convenience so that if you enable
|
|
|
// "break on all exceptions" in your console,
|
|
|
// it would pause the execution at this line.
|
|
|
throw new Error(message);
|
|
|
} catch (e) {} // eslint-disable-line no-empty
|
|
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* This is a dummy function to check if the function name has been altered by minification.
|
|
|
* If the function has been minified and NODE_ENV !== 'production', warn the user.
|
|
|
*/
|
|
|
|
|
|
function isCrushed() {}
|
|
|
|
|
|
if ("development" !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {
|
|
|
warning('You are currently using minified code outside of NODE_ENV === "production". ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) ' + 'to ensure you have the correct code for your production build.');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Use invariant() to assert state which your program assumes to be true.
|
|
|
*
|
|
|
* Provide sprintf-style format (only %s is supported) and arguments
|
|
|
* to provide information about what broke and what you were
|
|
|
* expecting.
|
|
|
*
|
|
|
* The invariant message will be stripped in production, but the invariant
|
|
|
* will remain to ensure logic does not differ in production.
|
|
|
*/
|
|
|
function invariant(condition, format) {
|
|
|
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
|
args[_key - 2] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
if ("development" !== 'production') {
|
|
|
if (format === undefined) {
|
|
|
throw new Error('invariant requires an error message argument');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!condition) {
|
|
|
var error;
|
|
|
|
|
|
if (format === undefined) {
|
|
|
error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
|
|
|
} else {
|
|
|
var argIndex = 0;
|
|
|
error = new Error(format.replace(/%s/g, function () {
|
|
|
return args[argIndex++];
|
|
|
}));
|
|
|
error.name = 'Invariant Violation';
|
|
|
}
|
|
|
|
|
|
error.framesToPop = 1; // we don't care about invariant's own frame
|
|
|
|
|
|
throw error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var INIT_COORDS = 'dnd-core/INIT_COORDS';
|
|
|
var BEGIN_DRAG = 'dnd-core/BEGIN_DRAG';
|
|
|
var PUBLISH_DRAG_SOURCE = 'dnd-core/PUBLISH_DRAG_SOURCE';
|
|
|
var HOVER = 'dnd-core/HOVER';
|
|
|
var DROP = 'dnd-core/DROP';
|
|
|
var END_DRAG = 'dnd-core/END_DRAG';
|
|
|
|
|
|
function setClientOffset(clientOffset, sourceClientOffset) {
|
|
|
return {
|
|
|
type: INIT_COORDS,
|
|
|
payload: {
|
|
|
sourceClientOffset: sourceClientOffset || null,
|
|
|
clientOffset: clientOffset || null
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
|
|
|
|
// cheap lodash replacements
|
|
|
|
|
|
/**
|
|
|
* drop-in replacement for _.get
|
|
|
* @param obj
|
|
|
* @param path
|
|
|
* @param defaultValue
|
|
|
*/
|
|
|
function get(obj, path, defaultValue) {
|
|
|
return path.split('.').reduce(function (a, c) {
|
|
|
return a && a[c] ? a[c] : defaultValue || null;
|
|
|
}, obj);
|
|
|
}
|
|
|
/**
|
|
|
* drop-in replacement for _.without
|
|
|
*/
|
|
|
|
|
|
function without(items, item) {
|
|
|
return items.filter(function (i) {
|
|
|
return i !== item;
|
|
|
});
|
|
|
}
|
|
|
/**
|
|
|
* drop-in replacement for _.isString
|
|
|
* @param input
|
|
|
*/
|
|
|
|
|
|
function isObject(input) {
|
|
|
return _typeof(input) === 'object';
|
|
|
}
|
|
|
/**
|
|
|
* repalcement for _.xor
|
|
|
* @param itemsA
|
|
|
* @param itemsB
|
|
|
*/
|
|
|
|
|
|
function xor(itemsA, itemsB) {
|
|
|
var map = new Map();
|
|
|
|
|
|
var insertItem = function insertItem(item) {
|
|
|
return map.set(item, map.has(item) ? map.get(item) + 1 : 1);
|
|
|
};
|
|
|
|
|
|
itemsA.forEach(insertItem);
|
|
|
itemsB.forEach(insertItem);
|
|
|
var result = [];
|
|
|
map.forEach(function (count, key) {
|
|
|
if (count === 1) {
|
|
|
result.push(key);
|
|
|
}
|
|
|
});
|
|
|
return result;
|
|
|
}
|
|
|
/**
|
|
|
* replacement for _.intersection
|
|
|
* @param itemsA
|
|
|
* @param itemsB
|
|
|
*/
|
|
|
|
|
|
function intersection(itemsA, itemsB) {
|
|
|
return itemsA.filter(function (t) {
|
|
|
return itemsB.indexOf(t) > -1;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
var ResetCoordinatesAction = {
|
|
|
type: INIT_COORDS,
|
|
|
payload: {
|
|
|
clientOffset: null,
|
|
|
sourceClientOffset: null
|
|
|
}
|
|
|
};
|
|
|
function createBeginDrag(manager) {
|
|
|
return function beginDrag() {
|
|
|
var sourceIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
|
publishSource: true
|
|
|
};
|
|
|
var _options$publishSourc = options.publishSource,
|
|
|
publishSource = _options$publishSourc === void 0 ? true : _options$publishSourc,
|
|
|
clientOffset = options.clientOffset,
|
|
|
getSourceClientOffset = options.getSourceClientOffset;
|
|
|
var monitor = manager.getMonitor();
|
|
|
var registry = manager.getRegistry(); // Initialize the coordinates using the client offset
|
|
|
|
|
|
manager.dispatch(setClientOffset(clientOffset));
|
|
|
verifyInvariants(sourceIds, monitor, registry); // Get the draggable source
|
|
|
|
|
|
var sourceId = getDraggableSource(sourceIds, monitor);
|
|
|
|
|
|
if (sourceId === null) {
|
|
|
manager.dispatch(ResetCoordinatesAction);
|
|
|
return;
|
|
|
} // Get the source client offset
|
|
|
|
|
|
|
|
|
var sourceClientOffset = null;
|
|
|
|
|
|
if (clientOffset) {
|
|
|
verifyGetSourceClientOffsetIsFunction(getSourceClientOffset);
|
|
|
sourceClientOffset = getSourceClientOffset(sourceId);
|
|
|
} // Initialize the full coordinates
|
|
|
|
|
|
|
|
|
manager.dispatch(setClientOffset(clientOffset, sourceClientOffset));
|
|
|
var source = registry.getSource(sourceId);
|
|
|
var item = source.beginDrag(monitor, sourceId);
|
|
|
verifyItemIsObject(item);
|
|
|
registry.pinSource(sourceId);
|
|
|
var itemType = registry.getSourceType(sourceId);
|
|
|
return {
|
|
|
type: BEGIN_DRAG,
|
|
|
payload: {
|
|
|
itemType: itemType,
|
|
|
item: item,
|
|
|
sourceId: sourceId,
|
|
|
clientOffset: clientOffset || null,
|
|
|
sourceClientOffset: sourceClientOffset || null,
|
|
|
isSourcePublic: !!publishSource
|
|
|
}
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function verifyInvariants(sourceIds, monitor, registry) {
|
|
|
invariant(!monitor.isDragging(), 'Cannot call beginDrag while dragging.');
|
|
|
sourceIds.forEach(function (sourceId) {
|
|
|
invariant(registry.getSource(sourceId), 'Expected sourceIds to be registered.');
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function verifyGetSourceClientOffsetIsFunction(getSourceClientOffset) {
|
|
|
invariant(typeof getSourceClientOffset === 'function', 'When clientOffset is provided, getSourceClientOffset must be a function.');
|
|
|
}
|
|
|
|
|
|
function verifyItemIsObject(item) {
|
|
|
invariant(isObject(item), 'Item must be an object.');
|
|
|
}
|
|
|
|
|
|
function getDraggableSource(sourceIds, monitor) {
|
|
|
var sourceId = null;
|
|
|
|
|
|
for (var i = sourceIds.length - 1; i >= 0; i--) {
|
|
|
if (monitor.canDragSource(sourceIds[i])) {
|
|
|
sourceId = sourceIds[i];
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return sourceId;
|
|
|
}
|
|
|
|
|
|
function createPublishDragSource(manager) {
|
|
|
return function publishDragSource() {
|
|
|
var monitor = manager.getMonitor();
|
|
|
|
|
|
if (monitor.isDragging()) {
|
|
|
return {
|
|
|
type: PUBLISH_DRAG_SOURCE
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function matchesType(targetType, draggedItemType) {
|
|
|
if (draggedItemType === null) {
|
|
|
return targetType === null;
|
|
|
}
|
|
|
|
|
|
return Array.isArray(targetType) ? targetType.some(function (t) {
|
|
|
return t === draggedItemType;
|
|
|
}) : targetType === draggedItemType;
|
|
|
}
|
|
|
|
|
|
function createHover(manager) {
|
|
|
return function hover(targetIdsArg) {
|
|
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
|
clientOffset = _ref.clientOffset;
|
|
|
|
|
|
verifyTargetIdsIsArray(targetIdsArg);
|
|
|
var targetIds = targetIdsArg.slice(0);
|
|
|
var monitor = manager.getMonitor();
|
|
|
var registry = manager.getRegistry();
|
|
|
checkInvariants(targetIds, monitor, registry);
|
|
|
var draggedItemType = monitor.getItemType();
|
|
|
removeNonMatchingTargetIds(targetIds, registry, draggedItemType);
|
|
|
hoverAllTargets(targetIds, monitor, registry);
|
|
|
return {
|
|
|
type: HOVER,
|
|
|
payload: {
|
|
|
targetIds: targetIds,
|
|
|
clientOffset: clientOffset || null
|
|
|
}
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function verifyTargetIdsIsArray(targetIdsArg) {
|
|
|
invariant(Array.isArray(targetIdsArg), 'Expected targetIds to be an array.');
|
|
|
}
|
|
|
|
|
|
function checkInvariants(targetIds, monitor, registry) {
|
|
|
invariant(monitor.isDragging(), 'Cannot call hover while not dragging.');
|
|
|
invariant(!monitor.didDrop(), 'Cannot call hover after drop.');
|
|
|
|
|
|
for (var i = 0; i < targetIds.length; i++) {
|
|
|
var targetId = targetIds[i];
|
|
|
invariant(targetIds.lastIndexOf(targetId) === i, 'Expected targetIds to be unique in the passed array.');
|
|
|
var target = registry.getTarget(targetId);
|
|
|
invariant(target, 'Expected targetIds to be registered.');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function removeNonMatchingTargetIds(targetIds, registry, draggedItemType) {
|
|
|
// Remove those targetIds that don't match the targetType. This
|
|
|
// fixes shallow isOver which would only be non-shallow because of
|
|
|
// non-matching targets.
|
|
|
for (var i = targetIds.length - 1; i >= 0; i--) {
|
|
|
var targetId = targetIds[i];
|
|
|
var targetType = registry.getTargetType(targetId);
|
|
|
|
|
|
if (!matchesType(targetType, draggedItemType)) {
|
|
|
targetIds.splice(i, 1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function hoverAllTargets(targetIds, monitor, registry) {
|
|
|
// Finally call hover on all matching targets.
|
|
|
targetIds.forEach(function (targetId) {
|
|
|
var target = registry.getTarget(targetId);
|
|
|
target.hover(monitor, targetId);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
|
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
|
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
function createDrop(manager) {
|
|
|
return function drop() {
|
|
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
var monitor = manager.getMonitor();
|
|
|
var registry = manager.getRegistry();
|
|
|
verifyInvariants$1(monitor);
|
|
|
var targetIds = getDroppableTargets(monitor); // Multiple actions are dispatched here, which is why this doesn't return an action
|
|
|
|
|
|
targetIds.forEach(function (targetId, index) {
|
|
|
var dropResult = determineDropResult(targetId, index, registry, monitor);
|
|
|
var action = {
|
|
|
type: DROP,
|
|
|
payload: {
|
|
|
dropResult: _objectSpread({}, options, {}, dropResult)
|
|
|
}
|
|
|
};
|
|
|
manager.dispatch(action);
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function verifyInvariants$1(monitor) {
|
|
|
invariant(monitor.isDragging(), 'Cannot call drop while not dragging.');
|
|
|
invariant(!monitor.didDrop(), 'Cannot call drop twice during one drag operation.');
|
|
|
}
|
|
|
|
|
|
function determineDropResult(targetId, index, registry, monitor) {
|
|
|
var target = registry.getTarget(targetId);
|
|
|
var dropResult = target ? target.drop(monitor, targetId) : undefined;
|
|
|
verifyDropResultType(dropResult);
|
|
|
|
|
|
if (typeof dropResult === 'undefined') {
|
|
|
dropResult = index === 0 ? {} : monitor.getDropResult();
|
|
|
}
|
|
|
|
|
|
return dropResult;
|
|
|
}
|
|
|
|
|
|
function verifyDropResultType(dropResult) {
|
|
|
invariant(typeof dropResult === 'undefined' || isObject(dropResult), 'Drop result must either be an object or undefined.');
|
|
|
}
|
|
|
|
|
|
function getDroppableTargets(monitor) {
|
|
|
var targetIds = monitor.getTargetIds().filter(monitor.canDropOnTarget, monitor);
|
|
|
targetIds.reverse();
|
|
|
return targetIds;
|
|
|
}
|
|
|
|
|
|
function createEndDrag(manager) {
|
|
|
return function endDrag() {
|
|
|
var monitor = manager.getMonitor();
|
|
|
var registry = manager.getRegistry();
|
|
|
verifyIsDragging(monitor);
|
|
|
var sourceId = monitor.getSourceId();
|
|
|
var source = registry.getSource(sourceId, true);
|
|
|
source.endDrag(monitor, sourceId);
|
|
|
registry.unpinSource();
|
|
|
return {
|
|
|
type: END_DRAG
|
|
|
};
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function verifyIsDragging(monitor) {
|
|
|
invariant(monitor.isDragging(), 'Cannot call endDrag while not dragging.');
|
|
|
}
|
|
|
|
|
|
function createDragDropActions(manager) {
|
|
|
return {
|
|
|
beginDrag: createBeginDrag(manager),
|
|
|
publishDragSource: createPublishDragSource(manager),
|
|
|
hover: createHover(manager),
|
|
|
drop: createDrop(manager),
|
|
|
endDrag: createEndDrag(manager)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var strictEquality = function strictEquality(a, b) {
|
|
|
return a === b;
|
|
|
};
|
|
|
/**
|
|
|
* Determine if two cartesian coordinate offsets are equal
|
|
|
* @param offsetA
|
|
|
* @param offsetB
|
|
|
*/
|
|
|
|
|
|
function areCoordsEqual(offsetA, offsetB) {
|
|
|
if (!offsetA && !offsetB) {
|
|
|
return true;
|
|
|
} else if (!offsetA || !offsetB) {
|
|
|
return false;
|
|
|
} else {
|
|
|
return offsetA.x === offsetB.x && offsetA.y === offsetB.y;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Determines if two arrays of items are equal
|
|
|
* @param a The first array of items
|
|
|
* @param b The second array of items
|
|
|
*/
|
|
|
|
|
|
function areArraysEqual(a, b) {
|
|
|
var isEqual = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : strictEquality;
|
|
|
|
|
|
if (a.length !== b.length) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
for (var i = 0; i < a.length; ++i) {
|
|
|
if (!isEqual(a[i], b[i])) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
|
|
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
|
|
function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
var initialState = {
|
|
|
initialSourceClientOffset: null,
|
|
|
initialClientOffset: null,
|
|
|
clientOffset: null
|
|
|
};
|
|
|
function dragOffset() {
|
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
|
|
|
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
|
var payload = action.payload;
|
|
|
|
|
|
switch (action.type) {
|
|
|
case INIT_COORDS:
|
|
|
case BEGIN_DRAG:
|
|
|
return {
|
|
|
initialSourceClientOffset: payload.sourceClientOffset,
|
|
|
initialClientOffset: payload.clientOffset,
|
|
|
clientOffset: payload.clientOffset
|
|
|
};
|
|
|
|
|
|
case HOVER:
|
|
|
if (areCoordsEqual(state.clientOffset, payload.clientOffset)) {
|
|
|
return state;
|
|
|
}
|
|
|
|
|
|
return _objectSpread$1({}, state, {
|
|
|
clientOffset: payload.clientOffset
|
|
|
});
|
|
|
|
|
|
case END_DRAG:
|
|
|
case DROP:
|
|
|
return initialState;
|
|
|
|
|
|
default:
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var ADD_SOURCE = 'dnd-core/ADD_SOURCE';
|
|
|
var ADD_TARGET = 'dnd-core/ADD_TARGET';
|
|
|
var REMOVE_SOURCE = 'dnd-core/REMOVE_SOURCE';
|
|
|
var REMOVE_TARGET = 'dnd-core/REMOVE_TARGET';
|
|
|
function addSource(sourceId) {
|
|
|
return {
|
|
|
type: ADD_SOURCE,
|
|
|
payload: {
|
|
|
sourceId: sourceId
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
function addTarget(targetId) {
|
|
|
return {
|
|
|
type: ADD_TARGET,
|
|
|
payload: {
|
|
|
targetId: targetId
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
function removeSource(sourceId) {
|
|
|
return {
|
|
|
type: REMOVE_SOURCE,
|
|
|
payload: {
|
|
|
sourceId: sourceId
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
function removeTarget(targetId) {
|
|
|
return {
|
|
|
type: REMOVE_TARGET,
|
|
|
payload: {
|
|
|
targetId: targetId
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
|
|
function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
|
|
function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
var initialState$1 = {
|
|
|
itemType: null,
|
|
|
item: null,
|
|
|
sourceId: null,
|
|
|
targetIds: [],
|
|
|
dropResult: null,
|
|
|
didDrop: false,
|
|
|
isSourcePublic: null
|
|
|
};
|
|
|
function dragOperation() {
|
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState$1;
|
|
|
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
|
var payload = action.payload;
|
|
|
|
|
|
switch (action.type) {
|
|
|
case BEGIN_DRAG:
|
|
|
return _objectSpread$2({}, state, {
|
|
|
itemType: payload.itemType,
|
|
|
item: payload.item,
|
|
|
sourceId: payload.sourceId,
|
|
|
isSourcePublic: payload.isSourcePublic,
|
|
|
dropResult: null,
|
|
|
didDrop: false
|
|
|
});
|
|
|
|
|
|
case PUBLISH_DRAG_SOURCE:
|
|
|
return _objectSpread$2({}, state, {
|
|
|
isSourcePublic: true
|
|
|
});
|
|
|
|
|
|
case HOVER:
|
|
|
return _objectSpread$2({}, state, {
|
|
|
targetIds: payload.targetIds
|
|
|
});
|
|
|
|
|
|
case REMOVE_TARGET:
|
|
|
if (state.targetIds.indexOf(payload.targetId) === -1) {
|
|
|
return state;
|
|
|
}
|
|
|
|
|
|
return _objectSpread$2({}, state, {
|
|
|
targetIds: without(state.targetIds, payload.targetId)
|
|
|
});
|
|
|
|
|
|
case DROP:
|
|
|
return _objectSpread$2({}, state, {
|
|
|
dropResult: payload.dropResult,
|
|
|
didDrop: true,
|
|
|
targetIds: []
|
|
|
});
|
|
|
|
|
|
case END_DRAG:
|
|
|
return _objectSpread$2({}, state, {
|
|
|
itemType: null,
|
|
|
item: null,
|
|
|
sourceId: null,
|
|
|
dropResult: null,
|
|
|
didDrop: false,
|
|
|
isSourcePublic: null,
|
|
|
targetIds: []
|
|
|
});
|
|
|
|
|
|
default:
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function refCount() {
|
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
|
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
|
|
|
|
switch (action.type) {
|
|
|
case ADD_SOURCE:
|
|
|
case ADD_TARGET:
|
|
|
return state + 1;
|
|
|
|
|
|
case REMOVE_SOURCE:
|
|
|
case REMOVE_TARGET:
|
|
|
return state - 1;
|
|
|
|
|
|
default:
|
|
|
return state;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var NONE = [];
|
|
|
var ALL = [];
|
|
|
NONE.__IS_NONE__ = true;
|
|
|
ALL.__IS_ALL__ = true;
|
|
|
/**
|
|
|
* Determines if the given handler IDs are dirty or not.
|
|
|
*
|
|
|
* @param dirtyIds The set of dirty handler ids
|
|
|
* @param handlerIds The set of handler ids to check
|
|
|
*/
|
|
|
|
|
|
function areDirty(dirtyIds, handlerIds) {
|
|
|
if (dirtyIds === NONE) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (dirtyIds === ALL || typeof handlerIds === 'undefined') {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var commonIds = intersection(handlerIds, dirtyIds);
|
|
|
return commonIds.length > 0;
|
|
|
}
|
|
|
|
|
|
function dirtyHandlerIds() {
|
|
|
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
|
|
|
|
switch (action.type) {
|
|
|
case HOVER:
|
|
|
break;
|
|
|
|
|
|
case ADD_SOURCE:
|
|
|
case ADD_TARGET:
|
|
|
case REMOVE_TARGET:
|
|
|
case REMOVE_SOURCE:
|
|
|
return NONE;
|
|
|
|
|
|
case BEGIN_DRAG:
|
|
|
case PUBLISH_DRAG_SOURCE:
|
|
|
case END_DRAG:
|
|
|
case DROP:
|
|
|
default:
|
|
|
return ALL;
|
|
|
}
|
|
|
|
|
|
var _action$payload = action.payload,
|
|
|
_action$payload$targe = _action$payload.targetIds,
|
|
|
targetIds = _action$payload$targe === void 0 ? [] : _action$payload$targe,
|
|
|
_action$payload$prevT = _action$payload.prevTargetIds,
|
|
|
prevTargetIds = _action$payload$prevT === void 0 ? [] : _action$payload$prevT;
|
|
|
var result = xor(targetIds, prevTargetIds);
|
|
|
var didChange = result.length > 0 || !areArraysEqual(targetIds, prevTargetIds);
|
|
|
|
|
|
if (!didChange) {
|
|
|
return NONE;
|
|
|
} // Check the target ids at the innermost position. If they are valid, add them
|
|
|
// to the result
|
|
|
|
|
|
|
|
|
var prevInnermostTargetId = prevTargetIds[prevTargetIds.length - 1];
|
|
|
var innermostTargetId = targetIds[targetIds.length - 1];
|
|
|
|
|
|
if (prevInnermostTargetId !== innermostTargetId) {
|
|
|
if (prevInnermostTargetId) {
|
|
|
result.push(prevInnermostTargetId);
|
|
|
}
|
|
|
|
|
|
if (innermostTargetId) {
|
|
|
result.push(innermostTargetId);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
function stateId() {
|
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
|
return state + 1;
|
|
|
}
|
|
|
|
|
|
function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
|
|
|
|
function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty$3(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
|
|
|
|
function _defineProperty$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
function reduce() {
|
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
var action = arguments.length > 1 ? arguments[1] : undefined;
|
|
|
return {
|
|
|
dirtyHandlerIds: dirtyHandlerIds(state.dirtyHandlerIds, {
|
|
|
type: action.type,
|
|
|
payload: _objectSpread$3({}, action.payload, {
|
|
|
prevTargetIds: get(state, 'dragOperation.targetIds', [])
|
|
|
})
|
|
|
}),
|
|
|
dragOffset: dragOffset(state.dragOffset, action),
|
|
|
refCount: refCount(state.refCount, action),
|
|
|
dragOperation: dragOperation(state.dragOperation, action),
|
|
|
stateId: stateId(state.stateId)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Coordinate addition
|
|
|
* @param a The first coordinate
|
|
|
* @param b The second coordinate
|
|
|
*/
|
|
|
function add(a, b) {
|
|
|
return {
|
|
|
x: a.x + b.x,
|
|
|
y: a.y + b.y
|
|
|
};
|
|
|
}
|
|
|
/**
|
|
|
* Coordinate subtraction
|
|
|
* @param a The first coordinate
|
|
|
* @param b The second coordinate
|
|
|
*/
|
|
|
|
|
|
function subtract(a, b) {
|
|
|
return {
|
|
|
x: a.x - b.x,
|
|
|
y: a.y - b.y
|
|
|
};
|
|
|
}
|
|
|
/**
|
|
|
* Returns the cartesian distance of the drag source component's position, based on its position
|
|
|
* at the time when the current drag operation has started, and the movement difference.
|
|
|
*
|
|
|
* Returns null if no item is being dragged.
|
|
|
*
|
|
|
* @param state The offset state to compute from
|
|
|
*/
|
|
|
|
|
|
function getSourceClientOffset(state) {
|
|
|
var clientOffset = state.clientOffset,
|
|
|
initialClientOffset = state.initialClientOffset,
|
|
|
initialSourceClientOffset = state.initialSourceClientOffset;
|
|
|
|
|
|
if (!clientOffset || !initialClientOffset || !initialSourceClientOffset) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return subtract(add(clientOffset, initialSourceClientOffset), initialClientOffset);
|
|
|
}
|
|
|
/**
|
|
|
* Determines the x,y offset between the client offset and the initial client offset
|
|
|
*
|
|
|
* @param state The offset state to compute from
|
|
|
*/
|
|
|
|
|
|
function getDifferenceFromInitialOffset(state) {
|
|
|
var clientOffset = state.clientOffset,
|
|
|
initialClientOffset = state.initialClientOffset;
|
|
|
|
|
|
if (!clientOffset || !initialClientOffset) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return subtract(clientOffset, initialClientOffset);
|
|
|
}
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
|
|
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
|
|
|
|
var DragDropMonitorImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function DragDropMonitorImpl(store, registry) {
|
|
|
_classCallCheck(this, DragDropMonitorImpl);
|
|
|
|
|
|
this.store = store;
|
|
|
this.registry = registry;
|
|
|
}
|
|
|
|
|
|
_createClass(DragDropMonitorImpl, [{
|
|
|
key: "subscribeToStateChange",
|
|
|
value: function subscribeToStateChange(listener) {
|
|
|
var _this = this;
|
|
|
|
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
|
handlerIds: undefined
|
|
|
};
|
|
|
var handlerIds = options.handlerIds;
|
|
|
invariant(typeof listener === 'function', 'listener must be a function.');
|
|
|
invariant(typeof handlerIds === 'undefined' || Array.isArray(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 && !areDirty(state.dirtyHandlerIds, handlerIds);
|
|
|
|
|
|
if (!canSkipListener) {
|
|
|
listener();
|
|
|
}
|
|
|
} finally {
|
|
|
prevStateId = currentStateId;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
return this.store.subscribe(handleChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "subscribeToOffsetChange",
|
|
|
value: function subscribeToOffsetChange(listener) {
|
|
|
var _this2 = this;
|
|
|
|
|
|
invariant(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) {
|
|
|
if (!sourceId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var source = this.registry.getSource(sourceId);
|
|
|
invariant(source, 'Expected to find a valid source.');
|
|
|
|
|
|
if (this.isDragging()) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return source.canDrag(this, sourceId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDropOnTarget",
|
|
|
value: function canDropOnTarget(targetId) {
|
|
|
// undefined on initial render
|
|
|
if (!targetId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var target = this.registry.getTarget(targetId);
|
|
|
invariant(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 matchesType(targetType, draggedItemType) && target.canDrop(this, targetId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "isDragging",
|
|
|
value: function isDragging() {
|
|
|
return Boolean(this.getItemType());
|
|
|
}
|
|
|
}, {
|
|
|
key: "isDraggingSource",
|
|
|
value: function isDraggingSource(sourceId) {
|
|
|
// undefined on initial render
|
|
|
if (!sourceId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var source = this.registry.getSource(sourceId, true);
|
|
|
invariant(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
|
|
|
};
|
|
|
|
|
|
// undefined on initial render
|
|
|
if (!targetId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var shallow = options.shallow;
|
|
|
|
|
|
if (!this.isDragging()) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var targetType = this.registry.getTargetType(targetId);
|
|
|
var draggedItemType = this.getItemType();
|
|
|
|
|
|
if (draggedItemType && !matchesType(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$1() {
|
|
|
return getSourceClientOffset(this.store.getState().dragOffset);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDifferenceFromInitialOffset",
|
|
|
value: function getDifferenceFromInitialOffset$1() {
|
|
|
return getDifferenceFromInitialOffset(this.store.getState().dragOffset);
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DragDropMonitorImpl;
|
|
|
}();
|
|
|
|
|
|
var nextUniqueId = 0;
|
|
|
function getNextUniqueId() {
|
|
|
return nextUniqueId++;
|
|
|
}
|
|
|
|
|
|
function _typeof$1(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$1 = function _typeof(obj) { return typeof obj; }; } else { _typeof$1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$1(obj); }
|
|
|
function validateSourceContract(source) {
|
|
|
invariant(typeof source.canDrag === 'function', 'Expected canDrag to be a function.');
|
|
|
invariant(typeof source.beginDrag === 'function', 'Expected beginDrag to be a function.');
|
|
|
invariant(typeof source.endDrag === 'function', 'Expected endDrag to be a function.');
|
|
|
}
|
|
|
function validateTargetContract(target) {
|
|
|
invariant(typeof target.canDrop === 'function', 'Expected canDrop to be a function.');
|
|
|
invariant(typeof target.hover === 'function', 'Expected hover to be a function.');
|
|
|
invariant(typeof target.drop === 'function', 'Expected beginDrag to be a function.');
|
|
|
}
|
|
|
function validateType(type, allowArray) {
|
|
|
if (allowArray && Array.isArray(type)) {
|
|
|
type.forEach(function (t) {
|
|
|
return validateType(t, false);
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
invariant(typeof type === 'string' || _typeof$1(type) === 'symbol', allowArray ? 'Type can only be a string, a symbol, or an array of either.' : 'Type can only be a string or a symbol.');
|
|
|
}
|
|
|
|
|
|
// Use the fastest means possible to execute a task in its own turn, with
|
|
|
// priority over other events including IO, animation, reflow, and redraw
|
|
|
// events in browsers.
|
|
|
//
|
|
|
// An exception thrown by a task will permanently interrupt the processing of
|
|
|
// subsequent tasks. The higher level `asap` function ensures that if an
|
|
|
// exception is thrown by a task, that the task queue will continue flushing as
|
|
|
// soon as possible, but if you use `rawAsap` directly, you are responsible to
|
|
|
// either ensure that no exceptions are thrown from your task, or to manually
|
|
|
// call `rawAsap.requestFlush` if an exception is thrown.
|
|
|
function rawAsap(task) {
|
|
|
if (!queue.length) {
|
|
|
requestFlush();
|
|
|
} // Equivalent to push, but avoids a function call.
|
|
|
|
|
|
|
|
|
queue[queue.length] = task;
|
|
|
}
|
|
|
var queue = []; // Once a flush has been requested, no further calls to `requestFlush` are
|
|
|
// off a `flush` event as quickly as possible. `flush` will attempt to exhaust
|
|
|
// the event queue before yielding to the browser's own event loop.
|
|
|
|
|
|
var requestFlush; // The position of the next task to execute in the task queue. This is
|
|
|
// preserved between calls to `flush` so that it can be resumed if
|
|
|
// a task throws an exception.
|
|
|
|
|
|
var index = 0; // If a task schedules additional tasks recursively, the task queue can grow
|
|
|
// unbounded. To prevent memory exhaustion, the task queue will periodically
|
|
|
// truncate already-completed tasks.
|
|
|
|
|
|
var capacity = 1024; // The flush function processes all tasks that have been scheduled with
|
|
|
// `rawAsap` unless and until one of those tasks throws an exception.
|
|
|
// If a task throws an exception, `flush` ensures that its state will remain
|
|
|
// consistent and will resume where it left off when called again.
|
|
|
// However, `flush` does not make any arrangements to be called again if an
|
|
|
// exception is thrown.
|
|
|
|
|
|
function flush() {
|
|
|
while (index < queue.length) {
|
|
|
var currentIndex = index; // Advance the index before calling the task. This ensures that we will
|
|
|
// begin flushing on the next task the task throws an error.
|
|
|
|
|
|
index = index + 1;
|
|
|
queue[currentIndex].call(); // Prevent leaking memory for long chains of recursive calls to `asap`.
|
|
|
// If we call `asap` within tasks scheduled by `asap`, the queue will
|
|
|
// grow, but to avoid an O(n) walk for every task we execute, we don't
|
|
|
// shift tasks off the queue after they have been executed.
|
|
|
// Instead, we periodically shift 1024 tasks off the queue.
|
|
|
|
|
|
if (index > capacity) {
|
|
|
// Manually shift all values starting at the index back to the
|
|
|
// beginning of the queue.
|
|
|
for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {
|
|
|
queue[scan] = queue[scan + index];
|
|
|
}
|
|
|
|
|
|
queue.length -= index;
|
|
|
index = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
queue.length = 0;
|
|
|
index = 0;
|
|
|
} // `requestFlush` is implemented using a strategy based on data collected from
|
|
|
// every available SauceLabs Selenium web driver worker at time of writing.
|
|
|
// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
|
|
|
// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
|
|
|
// have WebKitMutationObserver but not un-prefixed MutationObserver.
|
|
|
// Must use `global` or `self` instead of `window` to work in both frames and web
|
|
|
// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
|
|
|
|
|
|
/* globals self */
|
|
|
|
|
|
|
|
|
var scope = typeof global !== 'undefined' ? global : self;
|
|
|
var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; // MutationObservers are desirable because they have high priority and work
|
|
|
// reliably everywhere they are implemented.
|
|
|
// They are implemented in all modern browsers.
|
|
|
//
|
|
|
// - Android 4-4.3
|
|
|
// - Chrome 26-34
|
|
|
// - Firefox 14-29
|
|
|
// - Internet Explorer 11
|
|
|
// - iPad Safari 6-7.1
|
|
|
// - iPhone Safari 7-7.1
|
|
|
// - Safari 6-7
|
|
|
|
|
|
if (typeof BrowserMutationObserver === 'function') {
|
|
|
requestFlush = makeRequestCallFromMutationObserver(flush); // MessageChannels are desirable because they give direct access to the HTML
|
|
|
// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
|
|
|
// 11-12, and in web workers in many engines.
|
|
|
// Although message channels yield to any queued rendering and IO tasks, they
|
|
|
// would be better than imposing the 4ms delay of timers.
|
|
|
// However, they do not work reliably in Internet Explorer or Safari.
|
|
|
// Internet Explorer 10 is the only browser that has setImmediate but does
|
|
|
// not have MutationObservers.
|
|
|
// Although setImmediate yields to the browser's renderer, it would be
|
|
|
// preferrable to falling back to setTimeout since it does not have
|
|
|
// the minimum 4ms penalty.
|
|
|
// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
|
|
|
// Desktop to a lesser extent) that renders both setImmediate and
|
|
|
// MessageChannel useless for the purposes of ASAP.
|
|
|
// https://github.com/kriskowal/q/issues/396
|
|
|
// Timers are implemented universally.
|
|
|
// We fall back to timers in workers in most engines, and in foreground
|
|
|
// contexts in the following browsers.
|
|
|
// However, note that even this simple case requires nuances to operate in a
|
|
|
// broad spectrum of browsers.
|
|
|
//
|
|
|
// - Firefox 3-13
|
|
|
// - Internet Explorer 6-9
|
|
|
// - iPad Safari 4.3
|
|
|
// - Lynx 2.8.7
|
|
|
} else {
|
|
|
requestFlush = makeRequestCallFromTimer(flush);
|
|
|
} // `requestFlush` requests that the high priority event queue be flushed as
|
|
|
// soon as possible.
|
|
|
// This is useful to prevent an error thrown in a task from stalling the event
|
|
|
// queue if the exception handled by Node.js’s
|
|
|
// `process.on("uncaughtException")` or by a domain.
|
|
|
|
|
|
|
|
|
rawAsap.requestFlush = requestFlush; // To request a high priority event, we induce a mutation observer by toggling
|
|
|
// the text of a text node between "1" and "-1".
|
|
|
|
|
|
function makeRequestCallFromMutationObserver(callback) {
|
|
|
var toggle = 1;
|
|
|
var observer = new BrowserMutationObserver(callback);
|
|
|
var node = document.createTextNode('');
|
|
|
observer.observe(node, {
|
|
|
characterData: true
|
|
|
});
|
|
|
return function requestCall() {
|
|
|
toggle = -toggle;
|
|
|
node.data = toggle;
|
|
|
};
|
|
|
} // The message channel technique was discovered by Malte Ubl and was the
|
|
|
// original foundation for this library.
|
|
|
// http://www.nonblocking.io/2011/06/windownexttick.html
|
|
|
// Safari 6.0.5 (at least) intermittently fails to create message ports on a
|
|
|
// page's first load. Thankfully, this version of Safari supports
|
|
|
// MutationObservers, so we don't need to fall back in that case.
|
|
|
// function makeRequestCallFromMessageChannel(callback) {
|
|
|
// var channel = new MessageChannel();
|
|
|
// channel.port1.onmessage = callback;
|
|
|
// return function requestCall() {
|
|
|
// channel.port2.postMessage(0);
|
|
|
// };
|
|
|
// }
|
|
|
// For reasons explained above, we are also unable to use `setImmediate`
|
|
|
// under any circumstances.
|
|
|
// Even if we were, there is another bug in Internet Explorer 10.
|
|
|
// It is not sufficient to assign `setImmediate` to `requestFlush` because
|
|
|
// `setImmediate` must be called *by name* and therefore must be wrapped in a
|
|
|
// closure.
|
|
|
// Never forget.
|
|
|
// function makeRequestCallFromSetImmediate(callback) {
|
|
|
// return function requestCall() {
|
|
|
// setImmediate(callback);
|
|
|
// };
|
|
|
// }
|
|
|
// Safari 6.0 has a problem where timers will get lost while the user is
|
|
|
// scrolling. This problem does not impact ASAP because Safari 6.0 supports
|
|
|
// mutation observers, so that implementation is used instead.
|
|
|
// However, if we ever elect to use timers in Safari, the prevalent work-around
|
|
|
// is to add a scroll event listener that calls for a flush.
|
|
|
// `setTimeout` does not call the passed callback if the delay is less than
|
|
|
// approximately 7 in web workers in Firefox 8 through 18, and sometimes not
|
|
|
// even then.
|
|
|
|
|
|
|
|
|
function makeRequestCallFromTimer(callback) {
|
|
|
return function requestCall() {
|
|
|
// We dispatch a timeout with a specified delay of 0 for engines that
|
|
|
// can reliably accommodate that request. This will usually be snapped
|
|
|
// to a 4 milisecond delay, but once we're flushing, there's no delay
|
|
|
// between events.
|
|
|
var timeoutHandle = setTimeout(handleTimer, 0); // However, since this timer gets frequently dropped in Firefox
|
|
|
// workers, we enlist an interval handle that will try to fire
|
|
|
// an event 20 times per second until it succeeds.
|
|
|
|
|
|
var intervalHandle = setInterval(handleTimer, 50);
|
|
|
|
|
|
function handleTimer() {
|
|
|
// Whichever timer succeeds will cancel both timers and
|
|
|
// execute the callback.
|
|
|
clearTimeout(timeoutHandle);
|
|
|
clearInterval(intervalHandle);
|
|
|
callback();
|
|
|
}
|
|
|
};
|
|
|
} // This is for `asap.js` only.
|
|
|
// Its name will be periodically randomized to break any code that depends on
|
|
|
// its existence.
|
|
|
|
|
|
|
|
|
rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; // ASAP was originally a nextTick shim included in Q. This was factored out
|
|
|
// into this ASAP package. It was later adapted to RSVP which made further
|
|
|
// amendments. These decisions, particularly to marginalize MessageChannel and
|
|
|
// to capture the MutationObserver implementation in a closure, were integrated
|
|
|
// back into ASAP proper.
|
|
|
// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
|
|
|
|
|
|
// RawTasks are recycled to reduce GC churn.
|
|
|
|
|
|
var freeTasks = []; // We queue errors to ensure they are thrown in right order (FIFO).
|
|
|
// Array-as-queue is good enough here, since we are just dealing with exceptions.
|
|
|
|
|
|
var pendingErrors = [];
|
|
|
var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);
|
|
|
|
|
|
function throwFirstError() {
|
|
|
if (pendingErrors.length) {
|
|
|
throw pendingErrors.shift();
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Calls a task as soon as possible after returning, in its own event, with priority
|
|
|
* over other events like animation, reflow, and repaint. An error thrown from an
|
|
|
* event will not interrupt, nor even substantially slow down the processing of
|
|
|
* other events, but will be rather postponed to a lower priority event.
|
|
|
* @param {{call}} task A callable object, typically a function that takes no
|
|
|
* arguments.
|
|
|
*/
|
|
|
|
|
|
|
|
|
function asap(task) {
|
|
|
var rawTask;
|
|
|
|
|
|
if (freeTasks.length) {
|
|
|
rawTask = freeTasks.pop();
|
|
|
} else {
|
|
|
rawTask = new RawTask();
|
|
|
}
|
|
|
|
|
|
rawTask.task = task;
|
|
|
rawAsap(rawTask);
|
|
|
} // We wrap tasks with recyclable task objects. A task object implements
|
|
|
// `call`, just like a function.
|
|
|
|
|
|
var RawTask =
|
|
|
/** @class */
|
|
|
function () {
|
|
|
function RawTask() {}
|
|
|
|
|
|
RawTask.prototype.call = function () {
|
|
|
try {
|
|
|
this.task.call();
|
|
|
} catch (error) {
|
|
|
if (asap.onerror) {
|
|
|
// This hook exists purely for testing purposes.
|
|
|
// Its name will be periodically randomized to break any code that
|
|
|
// depends on its existence.
|
|
|
asap.onerror(error);
|
|
|
} else {
|
|
|
// In a web browser, exceptions are not fatal. However, to avoid
|
|
|
// slowing down the queue of pending tasks, we rethrow the error in a
|
|
|
// lower priority turn.
|
|
|
pendingErrors.push(error);
|
|
|
requestErrorThrow();
|
|
|
}
|
|
|
} finally {
|
|
|
this.task = null;
|
|
|
freeTasks[freeTasks.length] = this;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
return RawTask;
|
|
|
}();
|
|
|
|
|
|
function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$1(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); } }
|
|
|
|
|
|
function _createClass$1(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$1(Constructor.prototype, protoProps); if (staticProps) _defineProperties$1(Constructor, staticProps); return Constructor; }
|
|
|
|
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
|
|
|
|
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
|
|
|
function getNextHandlerId(role) {
|
|
|
var id = getNextUniqueId().toString();
|
|
|
|
|
|
switch (role) {
|
|
|
case HandlerRole.SOURCE:
|
|
|
return "S".concat(id);
|
|
|
|
|
|
case HandlerRole.TARGET:
|
|
|
return "T".concat(id);
|
|
|
|
|
|
default:
|
|
|
throw new Error("Unknown Handler Role: ".concat(role));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function parseRoleFromHandlerId(handlerId) {
|
|
|
switch (handlerId[0]) {
|
|
|
case 'S':
|
|
|
return HandlerRole.SOURCE;
|
|
|
|
|
|
case 'T':
|
|
|
return HandlerRole.TARGET;
|
|
|
|
|
|
default:
|
|
|
invariant(false, "Cannot parse handler ID: ".concat(handlerId));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function mapContainsValue(map, searchValue) {
|
|
|
var entries = map.entries();
|
|
|
var isDone = false;
|
|
|
|
|
|
do {
|
|
|
var _entries$next = entries.next(),
|
|
|
done = _entries$next.done,
|
|
|
_entries$next$value = _slicedToArray(_entries$next.value, 2),
|
|
|
value = _entries$next$value[1];
|
|
|
|
|
|
if (value === searchValue) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
isDone = !!done;
|
|
|
} while (!isDone);
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var HandlerRegistryImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function HandlerRegistryImpl(store) {
|
|
|
_classCallCheck$1(this, HandlerRegistryImpl);
|
|
|
|
|
|
this.types = new Map();
|
|
|
this.dragSources = new Map();
|
|
|
this.dropTargets = new Map();
|
|
|
this.pinnedSourceId = null;
|
|
|
this.pinnedSource = null;
|
|
|
this.store = store;
|
|
|
}
|
|
|
|
|
|
_createClass$1(HandlerRegistryImpl, [{
|
|
|
key: "addSource",
|
|
|
value: function addSource$1(type, source) {
|
|
|
validateType(type);
|
|
|
validateSourceContract(source);
|
|
|
var sourceId = this.addHandler(HandlerRole.SOURCE, type, source);
|
|
|
this.store.dispatch(addSource(sourceId));
|
|
|
return sourceId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "addTarget",
|
|
|
value: function addTarget$1(type, target) {
|
|
|
validateType(type, true);
|
|
|
validateTargetContract(target);
|
|
|
var targetId = this.addHandler(HandlerRole.TARGET, type, target);
|
|
|
this.store.dispatch(addTarget(targetId));
|
|
|
return targetId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "containsHandler",
|
|
|
value: function containsHandler(handler) {
|
|
|
return mapContainsValue(this.dragSources, handler) || mapContainsValue(this.dropTargets, handler);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSource",
|
|
|
value: function getSource(sourceId) {
|
|
|
var includePinned = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
|
invariant(this.isSourceId(sourceId), 'Expected a valid source ID.');
|
|
|
var isPinned = includePinned && sourceId === this.pinnedSourceId;
|
|
|
var source = isPinned ? this.pinnedSource : this.dragSources.get(sourceId);
|
|
|
return source;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getTarget",
|
|
|
value: function getTarget(targetId) {
|
|
|
invariant(this.isTargetId(targetId), 'Expected a valid target ID.');
|
|
|
return this.dropTargets.get(targetId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSourceType",
|
|
|
value: function getSourceType(sourceId) {
|
|
|
invariant(this.isSourceId(sourceId), 'Expected a valid source ID.');
|
|
|
return this.types.get(sourceId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getTargetType",
|
|
|
value: function getTargetType(targetId) {
|
|
|
invariant(this.isTargetId(targetId), 'Expected a valid target ID.');
|
|
|
return this.types.get(targetId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "isSourceId",
|
|
|
value: function isSourceId(handlerId) {
|
|
|
var role = parseRoleFromHandlerId(handlerId);
|
|
|
return role === HandlerRole.SOURCE;
|
|
|
}
|
|
|
}, {
|
|
|
key: "isTargetId",
|
|
|
value: function isTargetId(handlerId) {
|
|
|
var role = parseRoleFromHandlerId(handlerId);
|
|
|
return role === HandlerRole.TARGET;
|
|
|
}
|
|
|
}, {
|
|
|
key: "removeSource",
|
|
|
value: function removeSource$1(sourceId) {
|
|
|
var _this = this;
|
|
|
|
|
|
invariant(this.getSource(sourceId), 'Expected an existing source.');
|
|
|
this.store.dispatch(removeSource(sourceId));
|
|
|
asap(function () {
|
|
|
_this.dragSources.delete(sourceId);
|
|
|
|
|
|
_this.types.delete(sourceId);
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "removeTarget",
|
|
|
value: function removeTarget$1(targetId) {
|
|
|
invariant(this.getTarget(targetId), 'Expected an existing target.');
|
|
|
this.store.dispatch(removeTarget(targetId));
|
|
|
this.dropTargets.delete(targetId);
|
|
|
this.types.delete(targetId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "pinSource",
|
|
|
value: function pinSource(sourceId) {
|
|
|
var source = this.getSource(sourceId);
|
|
|
invariant(source, 'Expected an existing source.');
|
|
|
this.pinnedSourceId = sourceId;
|
|
|
this.pinnedSource = source;
|
|
|
}
|
|
|
}, {
|
|
|
key: "unpinSource",
|
|
|
value: function unpinSource() {
|
|
|
invariant(this.pinnedSource, 'No source is pinned at the time.');
|
|
|
this.pinnedSourceId = null;
|
|
|
this.pinnedSource = null;
|
|
|
}
|
|
|
}, {
|
|
|
key: "addHandler",
|
|
|
value: function addHandler(role, type, handler) {
|
|
|
var id = getNextHandlerId(role);
|
|
|
this.types.set(id, type);
|
|
|
|
|
|
if (role === HandlerRole.SOURCE) {
|
|
|
this.dragSources.set(id, handler);
|
|
|
} else if (role === HandlerRole.TARGET) {
|
|
|
this.dropTargets.set(id, handler);
|
|
|
}
|
|
|
|
|
|
return id;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return HandlerRegistryImpl;
|
|
|
}();
|
|
|
|
|
|
function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$2(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); } }
|
|
|
|
|
|
function _createClass$2(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$2(Constructor.prototype, protoProps); if (staticProps) _defineProperties$2(Constructor, staticProps); return Constructor; }
|
|
|
|
|
|
function makeStoreInstance(debugMode) {
|
|
|
// TODO: if we ever make a react-native version of this,
|
|
|
// we'll need to consider how to pull off dev-tooling
|
|
|
var reduxDevTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
|
return createStore(reduce, debugMode && reduxDevTools && reduxDevTools({
|
|
|
name: 'dnd-core',
|
|
|
instanceId: 'dnd-core'
|
|
|
}));
|
|
|
}
|
|
|
|
|
|
var DragDropManagerImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function DragDropManagerImpl() {
|
|
|
var _this = this;
|
|
|
|
|
|
var debugMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
|
|
|
|
_classCallCheck$2(this, DragDropManagerImpl);
|
|
|
|
|
|
this.isSetUp = false;
|
|
|
|
|
|
this.handleRefCountChange = function () {
|
|
|
var shouldSetUp = _this.store.getState().refCount > 0;
|
|
|
|
|
|
if (_this.backend) {
|
|
|
if (shouldSetUp && !_this.isSetUp) {
|
|
|
_this.backend.setup();
|
|
|
|
|
|
_this.isSetUp = true;
|
|
|
} else if (!shouldSetUp && _this.isSetUp) {
|
|
|
_this.backend.teardown();
|
|
|
|
|
|
_this.isSetUp = false;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
var store = makeStoreInstance(debugMode);
|
|
|
this.store = store;
|
|
|
this.monitor = new DragDropMonitorImpl(store, new HandlerRegistryImpl(store));
|
|
|
store.subscribe(this.handleRefCountChange);
|
|
|
}
|
|
|
|
|
|
_createClass$2(DragDropManagerImpl, [{
|
|
|
key: "receiveBackend",
|
|
|
value: function receiveBackend(backend) {
|
|
|
this.backend = backend;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getMonitor",
|
|
|
value: function getMonitor() {
|
|
|
return this.monitor;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getBackend",
|
|
|
value: function getBackend() {
|
|
|
return this.backend;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getRegistry",
|
|
|
value: function getRegistry() {
|
|
|
return this.monitor.registry;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getActions",
|
|
|
value: function getActions() {
|
|
|
/* eslint-disable-next-line @typescript-eslint/no-this-alias */
|
|
|
var manager = this;
|
|
|
var dispatch = this.store.dispatch;
|
|
|
|
|
|
function bindActionCreator(actionCreator) {
|
|
|
return function () {
|
|
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
args[_key] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
var action = actionCreator.apply(manager, args);
|
|
|
|
|
|
if (typeof action !== 'undefined') {
|
|
|
dispatch(action);
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var actions = createDragDropActions(this);
|
|
|
return Object.keys(actions).reduce(function (boundActions, key) {
|
|
|
var action = actions[key];
|
|
|
boundActions[key] = bindActionCreator(action);
|
|
|
return boundActions;
|
|
|
}, {});
|
|
|
}
|
|
|
}, {
|
|
|
key: "dispatch",
|
|
|
value: function dispatch(action) {
|
|
|
this.store.dispatch(action);
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DragDropManagerImpl;
|
|
|
}();
|
|
|
|
|
|
function createDragDropManager(backendFactory, globalContext, backendOptions, debugMode) {
|
|
|
var manager = new DragDropManagerImpl(debugMode);
|
|
|
var backend = backendFactory(manager, globalContext, backendOptions);
|
|
|
manager.receiveBackend(backend);
|
|
|
return manager;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Create the React Context
|
|
|
*/
|
|
|
|
|
|
var DndContext = React.createContext({
|
|
|
dragDropManager: undefined
|
|
|
});
|
|
|
/**
|
|
|
* Creates the context object we're providing
|
|
|
* @param backend
|
|
|
* @param context
|
|
|
*/
|
|
|
|
|
|
function createDndContext(backend, context, options, debugMode) {
|
|
|
return {
|
|
|
dragDropManager: createDragDropManager(backend, context, options, debugMode)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$1(arr, i) { return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _nonIterableRest$1(); }
|
|
|
|
|
|
function _nonIterableRest$1() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$1(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$1(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
|
|
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
|
|
|
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
|
var refCount$1 = 0;
|
|
|
/**
|
|
|
* A React component that provides the React-DnD context
|
|
|
*/
|
|
|
|
|
|
var DndProvider = React.memo(function (_ref) {
|
|
|
var children = _ref.children,
|
|
|
props = _objectWithoutProperties(_ref, ["children"]);
|
|
|
|
|
|
var _getDndContextValue = getDndContextValue(props),
|
|
|
_getDndContextValue2 = _slicedToArray$1(_getDndContextValue, 2),
|
|
|
manager = _getDndContextValue2[0],
|
|
|
isGlobalInstance = _getDndContextValue2[1]; // memoized from props
|
|
|
|
|
|
/**
|
|
|
* If the global context was used to store the DND context
|
|
|
* then where theres no more references to it we should
|
|
|
* clean it up to avoid memory leaks
|
|
|
*/
|
|
|
|
|
|
|
|
|
React.useEffect(function () {
|
|
|
if (isGlobalInstance) {
|
|
|
refCount$1++;
|
|
|
}
|
|
|
|
|
|
return function () {
|
|
|
if (isGlobalInstance) {
|
|
|
refCount$1--;
|
|
|
|
|
|
if (refCount$1 === 0) {
|
|
|
var context = getGlobalContext();
|
|
|
context[instanceSymbol] = null;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}, []);
|
|
|
return React.createElement(DndContext.Provider, {
|
|
|
value: manager
|
|
|
}, children);
|
|
|
});
|
|
|
DndProvider.displayName = 'DndProvider';
|
|
|
|
|
|
function getDndContextValue(props) {
|
|
|
if ('manager' in props) {
|
|
|
var _manager = {
|
|
|
dragDropManager: props.manager
|
|
|
};
|
|
|
return [_manager, false];
|
|
|
}
|
|
|
|
|
|
var manager = createSingletonDndContext(props.backend, props.context, props.options, props.debugMode);
|
|
|
var isGlobalInstance = !props.context;
|
|
|
return [manager, isGlobalInstance];
|
|
|
}
|
|
|
|
|
|
var instanceSymbol = Symbol.for('__REACT_DND_CONTEXT_INSTANCE__');
|
|
|
|
|
|
function createSingletonDndContext(backend) {
|
|
|
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getGlobalContext();
|
|
|
var options = arguments.length > 2 ? arguments[2] : undefined;
|
|
|
var debugMode = arguments.length > 3 ? arguments[3] : undefined;
|
|
|
var ctx = context;
|
|
|
|
|
|
if (!ctx[instanceSymbol]) {
|
|
|
ctx[instanceSymbol] = createDndContext(backend, context, options, debugMode);
|
|
|
}
|
|
|
|
|
|
return ctx[instanceSymbol];
|
|
|
}
|
|
|
|
|
|
function getGlobalContext() {
|
|
|
return typeof global !== 'undefined' ? global : window;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* A utility for rendering a drag preview image
|
|
|
*/
|
|
|
|
|
|
var DragPreviewImage = React.memo(function (_ref) {
|
|
|
var connect = _ref.connect,
|
|
|
src = _ref.src;
|
|
|
|
|
|
if (typeof Image !== 'undefined') {
|
|
|
var img = new Image();
|
|
|
img.src = src;
|
|
|
|
|
|
img.onload = function () {
|
|
|
return connect(img);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
});
|
|
|
DragPreviewImage.displayName = 'DragPreviewImage';
|
|
|
|
|
|
var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
|
|
|
|
function shallowEqual(objA, objB, compare, compareContext) {
|
|
|
var compareResult = compare ? compare.call(compareContext, objA, objB) : void 0;
|
|
|
|
|
|
if (compareResult !== void 0) {
|
|
|
return !!compareResult;
|
|
|
}
|
|
|
|
|
|
if (objA === objB) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var keysA = Object.keys(objA);
|
|
|
var keysB = Object.keys(objB);
|
|
|
|
|
|
if (keysA.length !== keysB.length) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); // Test for A's keys different from B.
|
|
|
|
|
|
for (var idx = 0; idx < keysA.length; idx++) {
|
|
|
var key = keysA[idx];
|
|
|
|
|
|
if (!bHasOwnProperty(key)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var valueA = objA[key];
|
|
|
var valueB = objB[key];
|
|
|
compareResult = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;
|
|
|
|
|
|
if (compareResult === false || compareResult === void 0 && valueA !== valueB) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$2(arr, i) { return _arrayWithHoles$2(arr) || _iterableToArrayLimit$2(arr, i) || _nonIterableRest$2(); }
|
|
|
|
|
|
function _nonIterableRest$2() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$2(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$2(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
/**
|
|
|
*
|
|
|
* @param monitor The monitor to collect state from
|
|
|
* @param collect The collecting function
|
|
|
* @param onUpdate A method to invoke when updates occur
|
|
|
*/
|
|
|
|
|
|
function useCollector(monitor, collect, onUpdate) {
|
|
|
var _useState = React.useState(function () {
|
|
|
return collect(monitor);
|
|
|
}),
|
|
|
_useState2 = _slicedToArray$2(_useState, 2),
|
|
|
collected = _useState2[0],
|
|
|
setCollected = _useState2[1];
|
|
|
|
|
|
var updateCollected = React.useCallback(function () {
|
|
|
var nextValue = collect(monitor);
|
|
|
|
|
|
if (!shallowEqual(collected, nextValue)) {
|
|
|
setCollected(nextValue);
|
|
|
|
|
|
if (onUpdate) {
|
|
|
onUpdate();
|
|
|
}
|
|
|
}
|
|
|
}, [collected, monitor, onUpdate]); // update the collected properties after the first render
|
|
|
// and the components are attached to dnd-core
|
|
|
|
|
|
useIsomorphicLayoutEffect(updateCollected, []);
|
|
|
return [collected, updateCollected];
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$3(arr, i) { return _arrayWithHoles$3(arr) || _iterableToArrayLimit$3(arr, i) || _nonIterableRest$3(); }
|
|
|
|
|
|
function _nonIterableRest$3() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$3(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$3(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
function useMonitorOutput(monitor, collect, onCollect) {
|
|
|
var _useCollector = useCollector(monitor, collect, onCollect),
|
|
|
_useCollector2 = _slicedToArray$3(_useCollector, 2),
|
|
|
collected = _useCollector2[0],
|
|
|
updateCollected = _useCollector2[1];
|
|
|
|
|
|
useIsomorphicLayoutEffect(function subscribeToMonitorStateChange() {
|
|
|
var handlerId = monitor.getHandlerId();
|
|
|
|
|
|
if (handlerId == null) {
|
|
|
return undefined;
|
|
|
}
|
|
|
|
|
|
return monitor.subscribeToStateChange(updateCollected, {
|
|
|
handlerIds: [handlerId]
|
|
|
});
|
|
|
}, [monitor, updateCollected]);
|
|
|
return collected;
|
|
|
}
|
|
|
|
|
|
function registerTarget(type, target, manager) {
|
|
|
var registry = manager.getRegistry();
|
|
|
var targetId = registry.addTarget(type, target);
|
|
|
return [targetId, function () {
|
|
|
return registry.removeTarget(targetId);
|
|
|
}];
|
|
|
}
|
|
|
function registerSource(type, source, manager) {
|
|
|
var registry = manager.getRegistry();
|
|
|
var sourceId = registry.addSource(type, source);
|
|
|
return [sourceId, function () {
|
|
|
return registry.removeSource(sourceId);
|
|
|
}];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* A hook to retrieve the DragDropManager from Context
|
|
|
*/
|
|
|
|
|
|
function useDragDropManager() {
|
|
|
var _useContext = React.useContext(DndContext),
|
|
|
dragDropManager = _useContext.dragDropManager;
|
|
|
|
|
|
invariant(dragDropManager != null, 'Expected drag drop context');
|
|
|
return dragDropManager;
|
|
|
}
|
|
|
|
|
|
function _classCallCheck$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$3(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); } }
|
|
|
|
|
|
function _createClass$3(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$3(Constructor.prototype, protoProps); if (staticProps) _defineProperties$3(Constructor, staticProps); return Constructor; }
|
|
|
var isCallingCanDrag = false;
|
|
|
var isCallingIsDragging = false;
|
|
|
var DragSourceMonitorImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function DragSourceMonitorImpl(manager) {
|
|
|
_classCallCheck$3(this, DragSourceMonitorImpl);
|
|
|
|
|
|
this.sourceId = null;
|
|
|
this.internalMonitor = manager.getMonitor();
|
|
|
}
|
|
|
|
|
|
_createClass$3(DragSourceMonitorImpl, [{
|
|
|
key: "receiveHandlerId",
|
|
|
value: function receiveHandlerId(sourceId) {
|
|
|
this.sourceId = sourceId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getHandlerId",
|
|
|
value: function getHandlerId() {
|
|
|
return this.sourceId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDrag",
|
|
|
value: function canDrag() {
|
|
|
invariant(!isCallingCanDrag, 'You may not call monitor.canDrag() inside your canDrag() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor');
|
|
|
|
|
|
try {
|
|
|
isCallingCanDrag = true;
|
|
|
return this.internalMonitor.canDragSource(this.sourceId);
|
|
|
} finally {
|
|
|
isCallingCanDrag = false;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "isDragging",
|
|
|
value: function isDragging() {
|
|
|
if (!this.sourceId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
invariant(!isCallingIsDragging, 'You may not call monitor.isDragging() inside your isDragging() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor');
|
|
|
|
|
|
try {
|
|
|
isCallingIsDragging = true;
|
|
|
return this.internalMonitor.isDraggingSource(this.sourceId);
|
|
|
} finally {
|
|
|
isCallingIsDragging = false;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "subscribeToStateChange",
|
|
|
value: function subscribeToStateChange(listener, options) {
|
|
|
return this.internalMonitor.subscribeToStateChange(listener, options);
|
|
|
}
|
|
|
}, {
|
|
|
key: "isDraggingSource",
|
|
|
value: function isDraggingSource(sourceId) {
|
|
|
return this.internalMonitor.isDraggingSource(sourceId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "isOverTarget",
|
|
|
value: function isOverTarget(targetId, options) {
|
|
|
return this.internalMonitor.isOverTarget(targetId, options);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getTargetIds",
|
|
|
value: function getTargetIds() {
|
|
|
return this.internalMonitor.getTargetIds();
|
|
|
}
|
|
|
}, {
|
|
|
key: "isSourcePublic",
|
|
|
value: function isSourcePublic() {
|
|
|
return this.internalMonitor.isSourcePublic();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSourceId",
|
|
|
value: function getSourceId() {
|
|
|
return this.internalMonitor.getSourceId();
|
|
|
}
|
|
|
}, {
|
|
|
key: "subscribeToOffsetChange",
|
|
|
value: function subscribeToOffsetChange(listener) {
|
|
|
return this.internalMonitor.subscribeToOffsetChange(listener);
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDragSource",
|
|
|
value: function canDragSource(sourceId) {
|
|
|
return this.internalMonitor.canDragSource(sourceId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDropOnTarget",
|
|
|
value: function canDropOnTarget(targetId) {
|
|
|
return this.internalMonitor.canDropOnTarget(targetId);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getItemType",
|
|
|
value: function getItemType() {
|
|
|
return this.internalMonitor.getItemType();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getItem",
|
|
|
value: function getItem() {
|
|
|
return this.internalMonitor.getItem();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDropResult",
|
|
|
value: function getDropResult() {
|
|
|
return this.internalMonitor.getDropResult();
|
|
|
}
|
|
|
}, {
|
|
|
key: "didDrop",
|
|
|
value: function didDrop() {
|
|
|
return this.internalMonitor.didDrop();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getInitialClientOffset",
|
|
|
value: function getInitialClientOffset() {
|
|
|
return this.internalMonitor.getInitialClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getInitialSourceClientOffset",
|
|
|
value: function getInitialSourceClientOffset() {
|
|
|
return this.internalMonitor.getInitialSourceClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSourceClientOffset",
|
|
|
value: function getSourceClientOffset() {
|
|
|
return this.internalMonitor.getSourceClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getClientOffset",
|
|
|
value: function getClientOffset() {
|
|
|
return this.internalMonitor.getClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDifferenceFromInitialOffset",
|
|
|
value: function getDifferenceFromInitialOffset() {
|
|
|
return this.internalMonitor.getDifferenceFromInitialOffset();
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DragSourceMonitorImpl;
|
|
|
}();
|
|
|
|
|
|
function setRef(ref, node) {
|
|
|
if (typeof ref === 'function') {
|
|
|
ref(node);
|
|
|
} else {
|
|
|
ref.current = node;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function cloneWithRef(element, newRef) {
|
|
|
var previousRef = element.ref;
|
|
|
invariant(typeof previousRef !== 'string', 'Cannot connect React DnD to an element with an existing string ref. ' + 'Please convert it to use a callback ref instead, or wrap it into a <span> or <div>. ' + 'Read more: https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute');
|
|
|
|
|
|
if (!previousRef) {
|
|
|
// When there is no ref on the element, use the new ref directly
|
|
|
return React.cloneElement(element, {
|
|
|
ref: newRef
|
|
|
});
|
|
|
} else {
|
|
|
return React.cloneElement(element, {
|
|
|
ref: function ref(node) {
|
|
|
setRef(previousRef, node);
|
|
|
setRef(newRef, node);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function throwIfCompositeComponentElement(element) {
|
|
|
// Custom components can no longer be wrapped directly in React DnD 2.0
|
|
|
// so that we don't need to depend on findDOMNode() from react-dom.
|
|
|
if (typeof element.type === 'string') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var displayName = element.type.displayName || element.type.name || 'the component';
|
|
|
throw new Error('Only native element nodes can now be passed to React DnD connectors.' + "You can either wrap ".concat(displayName, " into a <div>, or turn it into a ") + 'drag source or a drop target itself.');
|
|
|
}
|
|
|
|
|
|
function wrapHookToRecognizeElement(hook) {
|
|
|
return function () {
|
|
|
var elementOrNode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
|
|
|
// When passed a node, call the hook straight away.
|
|
|
if (!React.isValidElement(elementOrNode)) {
|
|
|
var node = elementOrNode;
|
|
|
hook(node, options); // return the node so it can be chained (e.g. when within callback refs
|
|
|
// <div ref={node => connectDragSource(connectDropTarget(node))}/>
|
|
|
|
|
|
return node;
|
|
|
} // If passed a ReactElement, clone it and attach this function as a ref.
|
|
|
// This helps us achieve a neat API where user doesn't even know that refs
|
|
|
// are being used under the hood.
|
|
|
|
|
|
|
|
|
var element = elementOrNode;
|
|
|
throwIfCompositeComponentElement(element); // When no options are passed, use the hook directly
|
|
|
|
|
|
var ref = options ? function (node) {
|
|
|
return hook(node, options);
|
|
|
} : hook;
|
|
|
return cloneWithRef(element, ref);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function wrapConnectorHooks(hooks) {
|
|
|
var wrappedHooks = {};
|
|
|
Object.keys(hooks).forEach(function (key) {
|
|
|
var hook = hooks[key]; // ref objects should be passed straight through without wrapping
|
|
|
|
|
|
if (key.endsWith('Ref')) {
|
|
|
wrappedHooks[key] = hooks[key];
|
|
|
} else {
|
|
|
var wrappedHook = wrapHookToRecognizeElement(hook);
|
|
|
|
|
|
wrappedHooks[key] = function () {
|
|
|
return wrappedHook;
|
|
|
};
|
|
|
}
|
|
|
});
|
|
|
return wrappedHooks;
|
|
|
}
|
|
|
|
|
|
function _typeof$2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$2 = function _typeof(obj) { return typeof obj; }; } else { _typeof$2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$2(obj); }
|
|
|
|
|
|
function isRef(obj) {
|
|
|
return (// eslint-disable-next-line no-prototype-builtins
|
|
|
obj !== null && _typeof$2(obj) === 'object' && obj.hasOwnProperty('current')
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function _classCallCheck$4(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$4(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); } }
|
|
|
|
|
|
function _createClass$4(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$4(Constructor.prototype, protoProps); if (staticProps) _defineProperties$4(Constructor, staticProps); return Constructor; }
|
|
|
var SourceConnector =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function SourceConnector(backend) {
|
|
|
var _this = this;
|
|
|
|
|
|
_classCallCheck$4(this, SourceConnector);
|
|
|
|
|
|
this.hooks = wrapConnectorHooks({
|
|
|
dragSource: function dragSource(node, options) {
|
|
|
_this.clearDragSource();
|
|
|
|
|
|
_this.dragSourceOptions = options || null;
|
|
|
|
|
|
if (isRef(node)) {
|
|
|
_this.dragSourceRef = node;
|
|
|
} else {
|
|
|
_this.dragSourceNode = node;
|
|
|
}
|
|
|
|
|
|
_this.reconnectDragSource();
|
|
|
},
|
|
|
dragPreview: function dragPreview(node, options) {
|
|
|
_this.clearDragPreview();
|
|
|
|
|
|
_this.dragPreviewOptions = options || null;
|
|
|
|
|
|
if (isRef(node)) {
|
|
|
_this.dragPreviewRef = node;
|
|
|
} else {
|
|
|
_this.dragPreviewNode = node;
|
|
|
}
|
|
|
|
|
|
_this.reconnectDragPreview();
|
|
|
}
|
|
|
});
|
|
|
this.handlerId = null; // The drop target may either be attached via ref or connect function
|
|
|
|
|
|
this.dragSourceRef = null;
|
|
|
this.dragSourceOptionsInternal = null; // The drag preview may either be attached via ref or connect function
|
|
|
|
|
|
this.dragPreviewRef = null;
|
|
|
this.dragPreviewOptionsInternal = null;
|
|
|
this.lastConnectedHandlerId = null;
|
|
|
this.lastConnectedDragSource = null;
|
|
|
this.lastConnectedDragSourceOptions = null;
|
|
|
this.lastConnectedDragPreview = null;
|
|
|
this.lastConnectedDragPreviewOptions = null;
|
|
|
this.backend = backend;
|
|
|
}
|
|
|
|
|
|
_createClass$4(SourceConnector, [{
|
|
|
key: "receiveHandlerId",
|
|
|
value: function receiveHandlerId(newHandlerId) {
|
|
|
if (this.handlerId === newHandlerId) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.handlerId = newHandlerId;
|
|
|
this.reconnect();
|
|
|
}
|
|
|
}, {
|
|
|
key: "reconnect",
|
|
|
value: function reconnect() {
|
|
|
this.reconnectDragSource();
|
|
|
this.reconnectDragPreview();
|
|
|
}
|
|
|
}, {
|
|
|
key: "reconnectDragSource",
|
|
|
value: function reconnectDragSource() {
|
|
|
var dragSource = this.dragSource; // if nothing has changed then don't resubscribe
|
|
|
|
|
|
var didChange = this.didHandlerIdChange() || this.didConnectedDragSourceChange() || this.didDragSourceOptionsChange();
|
|
|
|
|
|
if (didChange) {
|
|
|
this.disconnectDragSource();
|
|
|
}
|
|
|
|
|
|
if (!this.handlerId) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!dragSource) {
|
|
|
this.lastConnectedDragSource = dragSource;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (didChange) {
|
|
|
this.lastConnectedHandlerId = this.handlerId;
|
|
|
this.lastConnectedDragSource = dragSource;
|
|
|
this.lastConnectedDragSourceOptions = this.dragSourceOptions;
|
|
|
this.dragSourceUnsubscribe = this.backend.connectDragSource(this.handlerId, dragSource, this.dragSourceOptions);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "reconnectDragPreview",
|
|
|
value: function reconnectDragPreview() {
|
|
|
var dragPreview = this.dragPreview; // if nothing has changed then don't resubscribe
|
|
|
|
|
|
var didChange = this.didHandlerIdChange() || this.didConnectedDragPreviewChange() || this.didDragPreviewOptionsChange();
|
|
|
|
|
|
if (!this.handlerId) {
|
|
|
this.disconnectDragPreview();
|
|
|
} else if (this.dragPreview && didChange) {
|
|
|
this.lastConnectedHandlerId = this.handlerId;
|
|
|
this.lastConnectedDragPreview = dragPreview;
|
|
|
this.lastConnectedDragPreviewOptions = this.dragPreviewOptions;
|
|
|
this.disconnectDragPreview();
|
|
|
this.dragPreviewUnsubscribe = this.backend.connectDragPreview(this.handlerId, dragPreview, this.dragPreviewOptions);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "didHandlerIdChange",
|
|
|
value: function didHandlerIdChange() {
|
|
|
return this.lastConnectedHandlerId !== this.handlerId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "didConnectedDragSourceChange",
|
|
|
value: function didConnectedDragSourceChange() {
|
|
|
return this.lastConnectedDragSource !== this.dragSource;
|
|
|
}
|
|
|
}, {
|
|
|
key: "didConnectedDragPreviewChange",
|
|
|
value: function didConnectedDragPreviewChange() {
|
|
|
return this.lastConnectedDragPreview !== this.dragPreview;
|
|
|
}
|
|
|
}, {
|
|
|
key: "didDragSourceOptionsChange",
|
|
|
value: function didDragSourceOptionsChange() {
|
|
|
return !shallowEqual(this.lastConnectedDragSourceOptions, this.dragSourceOptions);
|
|
|
}
|
|
|
}, {
|
|
|
key: "didDragPreviewOptionsChange",
|
|
|
value: function didDragPreviewOptionsChange() {
|
|
|
return !shallowEqual(this.lastConnectedDragPreviewOptions, this.dragPreviewOptions);
|
|
|
}
|
|
|
}, {
|
|
|
key: "disconnectDragSource",
|
|
|
value: function disconnectDragSource() {
|
|
|
if (this.dragSourceUnsubscribe) {
|
|
|
this.dragSourceUnsubscribe();
|
|
|
this.dragSourceUnsubscribe = undefined;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "disconnectDragPreview",
|
|
|
value: function disconnectDragPreview() {
|
|
|
if (this.dragPreviewUnsubscribe) {
|
|
|
this.dragPreviewUnsubscribe();
|
|
|
this.dragPreviewUnsubscribe = undefined;
|
|
|
this.dragPreviewNode = null;
|
|
|
this.dragPreviewRef = null;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "clearDragSource",
|
|
|
value: function clearDragSource() {
|
|
|
this.dragSourceNode = null;
|
|
|
this.dragSourceRef = null;
|
|
|
}
|
|
|
}, {
|
|
|
key: "clearDragPreview",
|
|
|
value: function clearDragPreview() {
|
|
|
this.dragPreviewNode = null;
|
|
|
this.dragPreviewRef = null;
|
|
|
}
|
|
|
}, {
|
|
|
key: "connectTarget",
|
|
|
get: function get() {
|
|
|
return this.dragSource;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dragSourceOptions",
|
|
|
get: function get() {
|
|
|
return this.dragSourceOptionsInternal;
|
|
|
},
|
|
|
set: function set(options) {
|
|
|
this.dragSourceOptionsInternal = options;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dragPreviewOptions",
|
|
|
get: function get() {
|
|
|
return this.dragPreviewOptionsInternal;
|
|
|
},
|
|
|
set: function set(options) {
|
|
|
this.dragPreviewOptionsInternal = options;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dragSource",
|
|
|
get: function get() {
|
|
|
return this.dragSourceNode || this.dragSourceRef && this.dragSourceRef.current;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dragPreview",
|
|
|
get: function get() {
|
|
|
return this.dragPreviewNode || this.dragPreviewRef && this.dragPreviewRef.current;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return SourceConnector;
|
|
|
}();
|
|
|
|
|
|
function _slicedToArray$4(arr, i) { return _arrayWithHoles$4(arr) || _iterableToArrayLimit$4(arr, i) || _nonIterableRest$4(); }
|
|
|
|
|
|
function _nonIterableRest$4() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$4(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$4(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
|
|
|
function _typeof$3(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$3(obj); }
|
|
|
function useDragSourceMonitor() {
|
|
|
var manager = useDragDropManager();
|
|
|
var monitor = React.useMemo(function () {
|
|
|
return new DragSourceMonitorImpl(manager);
|
|
|
}, [manager]);
|
|
|
var connector = React.useMemo(function () {
|
|
|
return new SourceConnector(manager.getBackend());
|
|
|
}, [manager]);
|
|
|
return [monitor, connector];
|
|
|
}
|
|
|
function useDragHandler(spec, monitor, connector) {
|
|
|
var manager = useDragDropManager();
|
|
|
var handler = React.useMemo(function () {
|
|
|
return {
|
|
|
beginDrag: function beginDrag() {
|
|
|
var _spec$current = spec.current,
|
|
|
begin = _spec$current.begin,
|
|
|
item = _spec$current.item;
|
|
|
|
|
|
if (begin) {
|
|
|
var beginResult = begin(monitor);
|
|
|
invariant(beginResult == null || _typeof$3(beginResult) === 'object', 'dragSpec.begin() must either return an object, undefined, or null');
|
|
|
return beginResult || item || {};
|
|
|
}
|
|
|
|
|
|
return item || {};
|
|
|
},
|
|
|
canDrag: function canDrag() {
|
|
|
if (typeof spec.current.canDrag === 'boolean') {
|
|
|
return spec.current.canDrag;
|
|
|
} else if (typeof spec.current.canDrag === 'function') {
|
|
|
return spec.current.canDrag(monitor);
|
|
|
} else {
|
|
|
return true;
|
|
|
}
|
|
|
},
|
|
|
isDragging: function isDragging(globalMonitor, target) {
|
|
|
var isDragging = spec.current.isDragging;
|
|
|
return isDragging ? isDragging(monitor) : target === globalMonitor.getSourceId();
|
|
|
},
|
|
|
endDrag: function endDrag() {
|
|
|
var end = spec.current.end;
|
|
|
|
|
|
if (end) {
|
|
|
end(monitor.getItem(), monitor);
|
|
|
}
|
|
|
|
|
|
connector.reconnect();
|
|
|
}
|
|
|
};
|
|
|
}, []);
|
|
|
useIsomorphicLayoutEffect(function registerHandler() {
|
|
|
var _registerSource = registerSource(spec.current.item.type, handler, manager),
|
|
|
_registerSource2 = _slicedToArray$4(_registerSource, 2),
|
|
|
handlerId = _registerSource2[0],
|
|
|
unregister = _registerSource2[1];
|
|
|
|
|
|
monitor.receiveHandlerId(handlerId);
|
|
|
connector.receiveHandlerId(handlerId);
|
|
|
return unregister;
|
|
|
}, []);
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$5(arr, i) { return _arrayWithHoles$5(arr) || _iterableToArrayLimit$5(arr, i) || _nonIterableRest$5(); }
|
|
|
|
|
|
function _nonIterableRest$5() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$5(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$5(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
/**
|
|
|
* useDragSource hook
|
|
|
* @param sourceSpec The drag source specification *
|
|
|
*/
|
|
|
|
|
|
function useDrag(spec) {
|
|
|
var specRef = React.useRef(spec);
|
|
|
specRef.current = spec; // TODO: wire options into createSourceConnector
|
|
|
|
|
|
invariant(spec.item != null, 'item must be defined');
|
|
|
invariant(spec.item.type != null, 'item type must be defined');
|
|
|
|
|
|
var _useDragSourceMonitor = useDragSourceMonitor(),
|
|
|
_useDragSourceMonitor2 = _slicedToArray$5(_useDragSourceMonitor, 2),
|
|
|
monitor = _useDragSourceMonitor2[0],
|
|
|
connector = _useDragSourceMonitor2[1];
|
|
|
|
|
|
useDragHandler(specRef, monitor, connector);
|
|
|
var result = useMonitorOutput(monitor, specRef.current.collect || function () {
|
|
|
return {};
|
|
|
}, function () {
|
|
|
return connector.reconnect();
|
|
|
});
|
|
|
var connectDragSource = React.useMemo(function () {
|
|
|
return connector.hooks.dragSource();
|
|
|
}, [connector]);
|
|
|
var connectDragPreview = React.useMemo(function () {
|
|
|
return connector.hooks.dragPreview();
|
|
|
}, [connector]);
|
|
|
useIsomorphicLayoutEffect(function () {
|
|
|
connector.dragSourceOptions = specRef.current.options || null;
|
|
|
connector.reconnect();
|
|
|
}, [connector]);
|
|
|
useIsomorphicLayoutEffect(function () {
|
|
|
connector.dragPreviewOptions = specRef.current.previewOptions || null;
|
|
|
connector.reconnect();
|
|
|
}, [connector]);
|
|
|
return [result, connectDragSource, connectDragPreview];
|
|
|
}
|
|
|
|
|
|
function _classCallCheck$5(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$5(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); } }
|
|
|
|
|
|
function _createClass$5(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$5(Constructor.prototype, protoProps); if (staticProps) _defineProperties$5(Constructor, staticProps); return Constructor; }
|
|
|
var TargetConnector =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function TargetConnector(backend) {
|
|
|
var _this = this;
|
|
|
|
|
|
_classCallCheck$5(this, TargetConnector);
|
|
|
|
|
|
this.hooks = wrapConnectorHooks({
|
|
|
dropTarget: function dropTarget(node, options) {
|
|
|
_this.clearDropTarget();
|
|
|
|
|
|
_this.dropTargetOptions = options;
|
|
|
|
|
|
if (isRef(node)) {
|
|
|
_this.dropTargetRef = node;
|
|
|
} else {
|
|
|
_this.dropTargetNode = node;
|
|
|
}
|
|
|
|
|
|
_this.reconnect();
|
|
|
}
|
|
|
});
|
|
|
this.handlerId = null; // The drop target may either be attached via ref or connect function
|
|
|
|
|
|
this.dropTargetRef = null;
|
|
|
this.dropTargetOptionsInternal = null;
|
|
|
this.lastConnectedHandlerId = null;
|
|
|
this.lastConnectedDropTarget = null;
|
|
|
this.lastConnectedDropTargetOptions = null;
|
|
|
this.backend = backend;
|
|
|
}
|
|
|
|
|
|
_createClass$5(TargetConnector, [{
|
|
|
key: "reconnect",
|
|
|
value: function reconnect() {
|
|
|
// if nothing has changed then don't resubscribe
|
|
|
var didChange = this.didHandlerIdChange() || this.didDropTargetChange() || this.didOptionsChange();
|
|
|
|
|
|
if (didChange) {
|
|
|
this.disconnectDropTarget();
|
|
|
}
|
|
|
|
|
|
var dropTarget = this.dropTarget;
|
|
|
|
|
|
if (!this.handlerId) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!dropTarget) {
|
|
|
this.lastConnectedDropTarget = dropTarget;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (didChange) {
|
|
|
this.lastConnectedHandlerId = this.handlerId;
|
|
|
this.lastConnectedDropTarget = dropTarget;
|
|
|
this.lastConnectedDropTargetOptions = this.dropTargetOptions;
|
|
|
this.unsubscribeDropTarget = this.backend.connectDropTarget(this.handlerId, dropTarget, this.dropTargetOptions);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveHandlerId",
|
|
|
value: function receiveHandlerId(newHandlerId) {
|
|
|
if (newHandlerId === this.handlerId) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.handlerId = newHandlerId;
|
|
|
this.reconnect();
|
|
|
}
|
|
|
}, {
|
|
|
key: "didHandlerIdChange",
|
|
|
value: function didHandlerIdChange() {
|
|
|
return this.lastConnectedHandlerId !== this.handlerId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "didDropTargetChange",
|
|
|
value: function didDropTargetChange() {
|
|
|
return this.lastConnectedDropTarget !== this.dropTarget;
|
|
|
}
|
|
|
}, {
|
|
|
key: "didOptionsChange",
|
|
|
value: function didOptionsChange() {
|
|
|
return !shallowEqual(this.lastConnectedDropTargetOptions, this.dropTargetOptions);
|
|
|
}
|
|
|
}, {
|
|
|
key: "disconnectDropTarget",
|
|
|
value: function disconnectDropTarget() {
|
|
|
if (this.unsubscribeDropTarget) {
|
|
|
this.unsubscribeDropTarget();
|
|
|
this.unsubscribeDropTarget = undefined;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "clearDropTarget",
|
|
|
value: function clearDropTarget() {
|
|
|
this.dropTargetRef = null;
|
|
|
this.dropTargetNode = null;
|
|
|
}
|
|
|
}, {
|
|
|
key: "connectTarget",
|
|
|
get: function get() {
|
|
|
return this.dropTarget;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dropTargetOptions",
|
|
|
get: function get() {
|
|
|
return this.dropTargetOptionsInternal;
|
|
|
},
|
|
|
set: function set(options) {
|
|
|
this.dropTargetOptionsInternal = options;
|
|
|
}
|
|
|
}, {
|
|
|
key: "dropTarget",
|
|
|
get: function get() {
|
|
|
return this.dropTargetNode || this.dropTargetRef && this.dropTargetRef.current;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return TargetConnector;
|
|
|
}();
|
|
|
|
|
|
function _classCallCheck$6(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$6(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); } }
|
|
|
|
|
|
function _createClass$6(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$6(Constructor.prototype, protoProps); if (staticProps) _defineProperties$6(Constructor, staticProps); return Constructor; }
|
|
|
var isCallingCanDrop = false;
|
|
|
var DropTargetMonitorImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function DropTargetMonitorImpl(manager) {
|
|
|
_classCallCheck$6(this, DropTargetMonitorImpl);
|
|
|
|
|
|
this.targetId = null;
|
|
|
this.internalMonitor = manager.getMonitor();
|
|
|
}
|
|
|
|
|
|
_createClass$6(DropTargetMonitorImpl, [{
|
|
|
key: "receiveHandlerId",
|
|
|
value: function receiveHandlerId(targetId) {
|
|
|
this.targetId = targetId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getHandlerId",
|
|
|
value: function getHandlerId() {
|
|
|
return this.targetId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "subscribeToStateChange",
|
|
|
value: function subscribeToStateChange(listener, options) {
|
|
|
return this.internalMonitor.subscribeToStateChange(listener, options);
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDrop",
|
|
|
value: function canDrop() {
|
|
|
// Cut out early if the target id has not been set. This should prevent errors
|
|
|
// where the user has an older version of dnd-core like in
|
|
|
// https://github.com/react-dnd/react-dnd/issues/1310
|
|
|
if (!this.targetId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
invariant(!isCallingCanDrop, 'You may not call monitor.canDrop() inside your canDrop() implementation. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor');
|
|
|
|
|
|
try {
|
|
|
isCallingCanDrop = true;
|
|
|
return this.internalMonitor.canDropOnTarget(this.targetId);
|
|
|
} finally {
|
|
|
isCallingCanDrop = false;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "isOver",
|
|
|
value: function isOver(options) {
|
|
|
if (!this.targetId) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return this.internalMonitor.isOverTarget(this.targetId, options);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getItemType",
|
|
|
value: function getItemType() {
|
|
|
return this.internalMonitor.getItemType();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getItem",
|
|
|
value: function getItem() {
|
|
|
return this.internalMonitor.getItem();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDropResult",
|
|
|
value: function getDropResult() {
|
|
|
return this.internalMonitor.getDropResult();
|
|
|
}
|
|
|
}, {
|
|
|
key: "didDrop",
|
|
|
value: function didDrop() {
|
|
|
return this.internalMonitor.didDrop();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getInitialClientOffset",
|
|
|
value: function getInitialClientOffset() {
|
|
|
return this.internalMonitor.getInitialClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getInitialSourceClientOffset",
|
|
|
value: function getInitialSourceClientOffset() {
|
|
|
return this.internalMonitor.getInitialSourceClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getSourceClientOffset",
|
|
|
value: function getSourceClientOffset() {
|
|
|
return this.internalMonitor.getSourceClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getClientOffset",
|
|
|
value: function getClientOffset() {
|
|
|
return this.internalMonitor.getClientOffset();
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDifferenceFromInitialOffset",
|
|
|
value: function getDifferenceFromInitialOffset() {
|
|
|
return this.internalMonitor.getDifferenceFromInitialOffset();
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DropTargetMonitorImpl;
|
|
|
}();
|
|
|
|
|
|
function _slicedToArray$6(arr, i) { return _arrayWithHoles$6(arr) || _iterableToArrayLimit$6(arr, i) || _nonIterableRest$6(); }
|
|
|
|
|
|
function _nonIterableRest$6() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$6(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$6(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
function useDropTargetMonitor() {
|
|
|
var manager = useDragDropManager();
|
|
|
var monitor = React.useMemo(function () {
|
|
|
return new DropTargetMonitorImpl(manager);
|
|
|
}, [manager]);
|
|
|
var connector = React.useMemo(function () {
|
|
|
return new TargetConnector(manager.getBackend());
|
|
|
}, [manager]);
|
|
|
return [monitor, connector];
|
|
|
}
|
|
|
function useDropHandler(spec, monitor, connector) {
|
|
|
var manager = useDragDropManager();
|
|
|
var handler = React.useMemo(function () {
|
|
|
return {
|
|
|
canDrop: function canDrop() {
|
|
|
var canDrop = spec.current.canDrop;
|
|
|
return canDrop ? canDrop(monitor.getItem(), monitor) : true;
|
|
|
},
|
|
|
hover: function hover() {
|
|
|
var hover = spec.current.hover;
|
|
|
|
|
|
if (hover) {
|
|
|
hover(monitor.getItem(), monitor);
|
|
|
}
|
|
|
},
|
|
|
drop: function drop() {
|
|
|
var drop = spec.current.drop;
|
|
|
|
|
|
if (drop) {
|
|
|
return drop(monitor.getItem(), monitor);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}, [monitor]);
|
|
|
useIsomorphicLayoutEffect(function registerHandler() {
|
|
|
var _registerTarget = registerTarget(spec.current.accept, handler, manager),
|
|
|
_registerTarget2 = _slicedToArray$6(_registerTarget, 2),
|
|
|
handlerId = _registerTarget2[0],
|
|
|
unregister = _registerTarget2[1];
|
|
|
|
|
|
monitor.receiveHandlerId(handlerId);
|
|
|
connector.receiveHandlerId(handlerId);
|
|
|
return unregister;
|
|
|
}, [monitor, connector]);
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$7(arr, i) { return _arrayWithHoles$7(arr) || _iterableToArrayLimit$7(arr, i) || _nonIterableRest$7(); }
|
|
|
|
|
|
function _nonIterableRest$7() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$7(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$7(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
/**
|
|
|
* useDropTarget Hook
|
|
|
* @param spec The drop target specification
|
|
|
*/
|
|
|
|
|
|
function useDrop(spec) {
|
|
|
var specRef = React.useRef(spec);
|
|
|
specRef.current = spec;
|
|
|
invariant(spec.accept != null, 'accept must be defined');
|
|
|
|
|
|
var _useDropTargetMonitor = useDropTargetMonitor(),
|
|
|
_useDropTargetMonitor2 = _slicedToArray$7(_useDropTargetMonitor, 2),
|
|
|
monitor = _useDropTargetMonitor2[0],
|
|
|
connector = _useDropTargetMonitor2[1];
|
|
|
|
|
|
useDropHandler(specRef, monitor, connector);
|
|
|
var result = useMonitorOutput(monitor, specRef.current.collect || function () {
|
|
|
return {};
|
|
|
}, function () {
|
|
|
return connector.reconnect();
|
|
|
});
|
|
|
var connectDropTarget = React.useMemo(function () {
|
|
|
return connector.hooks.dropTarget();
|
|
|
}, [connector]);
|
|
|
useIsomorphicLayoutEffect(function () {
|
|
|
connector.dropTargetOptions = spec.options || null;
|
|
|
connector.reconnect();
|
|
|
}, [spec.options]);
|
|
|
return [result, connectDropTarget];
|
|
|
}
|
|
|
|
|
|
function _slicedToArray$8(arr, i) { return _arrayWithHoles$8(arr) || _iterableToArrayLimit$8(arr, i) || _nonIterableRest$8(); }
|
|
|
|
|
|
function _nonIterableRest$8() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$8(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$8(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
/**
|
|
|
* useDragLayer Hook
|
|
|
* @param collector The property collector
|
|
|
*/
|
|
|
|
|
|
function useDragLayer(collect) {
|
|
|
var dragDropManager = useDragDropManager();
|
|
|
var monitor = dragDropManager.getMonitor();
|
|
|
|
|
|
var _useCollector = useCollector(monitor, collect),
|
|
|
_useCollector2 = _slicedToArray$8(_useCollector, 2),
|
|
|
collected = _useCollector2[0],
|
|
|
updateCollected = _useCollector2[1];
|
|
|
|
|
|
React.useEffect(function () {
|
|
|
return monitor.subscribeToOffsetChange(updateCollected);
|
|
|
});
|
|
|
React.useEffect(function () {
|
|
|
return monitor.subscribeToStateChange(updateCollected);
|
|
|
});
|
|
|
return collected;
|
|
|
}
|
|
|
|
|
|
function _typeof$4(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$4 = function _typeof(obj) { return typeof obj; }; } else { _typeof$4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$4(obj); }
|
|
|
|
|
|
// cheap lodash replacements
|
|
|
function isFunction(input) {
|
|
|
return typeof input === 'function';
|
|
|
}
|
|
|
function noop() {// noop
|
|
|
}
|
|
|
|
|
|
function isObjectLike(input) {
|
|
|
return _typeof$4(input) === 'object' && input !== null;
|
|
|
}
|
|
|
|
|
|
function isPlainObject$1(input) {
|
|
|
if (!isObjectLike(input)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (Object.getPrototypeOf(input) === null) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var proto = input;
|
|
|
|
|
|
while (Object.getPrototypeOf(proto) !== null) {
|
|
|
proto = Object.getPrototypeOf(proto);
|
|
|
}
|
|
|
|
|
|
return Object.getPrototypeOf(input) === proto;
|
|
|
}
|
|
|
|
|
|
function getDecoratedComponent(instanceRef) {
|
|
|
var currentRef = instanceRef.current;
|
|
|
|
|
|
if (currentRef == null) {
|
|
|
return null;
|
|
|
} else if (currentRef.decoratedRef) {
|
|
|
// go through the private field in decorateHandler to avoid the invariant hit
|
|
|
return currentRef.decoratedRef.current;
|
|
|
} else {
|
|
|
return currentRef;
|
|
|
}
|
|
|
}
|
|
|
function isClassComponent(Component) {
|
|
|
return Component && Component.prototype && typeof Component.prototype.render === 'function';
|
|
|
}
|
|
|
function isRefForwardingComponent(C) {
|
|
|
return C && C.$$typeof && C.$$typeof.toString() === 'Symbol(react.forward_ref)';
|
|
|
}
|
|
|
function isRefable(C) {
|
|
|
return isClassComponent(C) || isRefForwardingComponent(C);
|
|
|
}
|
|
|
function checkDecoratorArguments(functionName, signature) {
|
|
|
if ("development" !== 'production') {
|
|
|
for (var i = 0; i < (arguments.length <= 2 ? 0 : arguments.length - 2); i++) {
|
|
|
var arg = i + 2 < 2 || arguments.length <= i + 2 ? undefined : arguments[i + 2];
|
|
|
|
|
|
if (arg && arg.prototype && arg.prototype.render) {
|
|
|
// eslint-disable-next-line no-console
|
|
|
console.error('You seem to be applying the arguments in the wrong order. ' + "It should be ".concat(functionName, "(").concat(signature, ")(Component), not the other way around. ") + 'Read more: http://react-dnd.github.io/react-dnd/docs/troubleshooting#you-seem-to-be-applying-the-arguments-in-the-wrong-order');
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function unwrapExports (x) {
|
|
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
|
}
|
|
|
|
|
|
function createCommonjsModule(fn, module) {
|
|
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
|
}
|
|
|
|
|
|
var reactIs_production_min = createCommonjsModule(function (module, exports) {
|
|
|
Object.defineProperty(exports,"__esModule",{value:!0});
|
|
|
var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?Symbol.for("react.suspense_list"):
|
|
|
60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.fundamental"):60117,w=b?Symbol.for("react.responder"):60118,x=b?Symbol.for("react.scope"):60119;function y(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function z(a){return y(a)===m}
|
|
|
exports.typeOf=y;exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;
|
|
|
exports.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===v||a.$$typeof===w||a.$$typeof===x)};exports.isAsyncMode=function(a){return z(a)||y(a)===l};exports.isConcurrentMode=z;exports.isContextConsumer=function(a){return y(a)===k};exports.isContextProvider=function(a){return y(a)===h};
|
|
|
exports.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return y(a)===n};exports.isFragment=function(a){return y(a)===e};exports.isLazy=function(a){return y(a)===t};exports.isMemo=function(a){return y(a)===r};exports.isPortal=function(a){return y(a)===d};exports.isProfiler=function(a){return y(a)===g};exports.isStrictMode=function(a){return y(a)===f};exports.isSuspense=function(a){return y(a)===p};
|
|
|
});
|
|
|
|
|
|
unwrapExports(reactIs_production_min);
|
|
|
var reactIs_production_min_1 = reactIs_production_min.typeOf;
|
|
|
var reactIs_production_min_2 = reactIs_production_min.AsyncMode;
|
|
|
var reactIs_production_min_3 = reactIs_production_min.ConcurrentMode;
|
|
|
var reactIs_production_min_4 = reactIs_production_min.ContextConsumer;
|
|
|
var reactIs_production_min_5 = reactIs_production_min.ContextProvider;
|
|
|
var reactIs_production_min_6 = reactIs_production_min.Element;
|
|
|
var reactIs_production_min_7 = reactIs_production_min.ForwardRef;
|
|
|
var reactIs_production_min_8 = reactIs_production_min.Fragment;
|
|
|
var reactIs_production_min_9 = reactIs_production_min.Lazy;
|
|
|
var reactIs_production_min_10 = reactIs_production_min.Memo;
|
|
|
var reactIs_production_min_11 = reactIs_production_min.Portal;
|
|
|
var reactIs_production_min_12 = reactIs_production_min.Profiler;
|
|
|
var reactIs_production_min_13 = reactIs_production_min.StrictMode;
|
|
|
var reactIs_production_min_14 = reactIs_production_min.Suspense;
|
|
|
var reactIs_production_min_15 = reactIs_production_min.isValidElementType;
|
|
|
var reactIs_production_min_16 = reactIs_production_min.isAsyncMode;
|
|
|
var reactIs_production_min_17 = reactIs_production_min.isConcurrentMode;
|
|
|
var reactIs_production_min_18 = reactIs_production_min.isContextConsumer;
|
|
|
var reactIs_production_min_19 = reactIs_production_min.isContextProvider;
|
|
|
var reactIs_production_min_20 = reactIs_production_min.isElement;
|
|
|
var reactIs_production_min_21 = reactIs_production_min.isForwardRef;
|
|
|
var reactIs_production_min_22 = reactIs_production_min.isFragment;
|
|
|
var reactIs_production_min_23 = reactIs_production_min.isLazy;
|
|
|
var reactIs_production_min_24 = reactIs_production_min.isMemo;
|
|
|
var reactIs_production_min_25 = reactIs_production_min.isPortal;
|
|
|
var reactIs_production_min_26 = reactIs_production_min.isProfiler;
|
|
|
var reactIs_production_min_27 = reactIs_production_min.isStrictMode;
|
|
|
var reactIs_production_min_28 = reactIs_production_min.isSuspense;
|
|
|
|
|
|
var reactIs_development = createCommonjsModule(function (module, exports) {
|
|
|
|
|
|
|
|
|
|
|
|
if ("development" !== "production") {
|
|
|
(function() {
|
|
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
|
|
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
|
|
// nor polyfill, then a plain number is used for performance.
|
|
|
var hasSymbol = typeof Symbol === 'function' && Symbol.for;
|
|
|
var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
|
|
|
var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
|
|
|
var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
|
|
|
var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
|
|
|
var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
|
|
|
var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
|
|
|
var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
|
|
|
// (unstable) APIs that have been removed. Can we remove the symbols?
|
|
|
|
|
|
var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
|
|
|
var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
|
|
|
var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
|
|
|
var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
|
|
|
var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
|
|
|
var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
|
|
|
var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
|
|
|
var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
|
|
|
var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
|
|
|
var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
|
|
|
|
|
|
function isValidElementType(type) {
|
|
|
return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
|
|
|
type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Forked from fbjs/warning:
|
|
|
* https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
|
|
|
*
|
|
|
* Only change is we use console.warn instead of console.error,
|
|
|
* and do nothing when 'console' is not supported.
|
|
|
* This really simplifies the code.
|
|
|
* ---
|
|
|
* Similar to invariant but only logs a warning if the condition is not met.
|
|
|
* This can be used to log issues in development environments in critical
|
|
|
* paths. Removing the logging code for production environments will keep the
|
|
|
* same logic and follow the same code paths.
|
|
|
*/
|
|
|
var lowPriorityWarningWithoutStack = function () {};
|
|
|
|
|
|
{
|
|
|
var printWarning = function (format) {
|
|
|
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
|
args[_key - 1] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
var argIndex = 0;
|
|
|
var message = 'Warning: ' + format.replace(/%s/g, function () {
|
|
|
return args[argIndex++];
|
|
|
});
|
|
|
|
|
|
if (typeof console !== 'undefined') {
|
|
|
console.warn(message);
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
// --- Welcome to debugging React ---
|
|
|
// This error was thrown as a convenience so that you can use this stack
|
|
|
// to find the callsite that caused this warning to fire.
|
|
|
throw new Error(message);
|
|
|
} catch (x) {}
|
|
|
};
|
|
|
|
|
|
lowPriorityWarningWithoutStack = function (condition, format) {
|
|
|
if (format === undefined) {
|
|
|
throw new Error('`lowPriorityWarningWithoutStack(condition, format, ...args)` requires a warning ' + 'message argument');
|
|
|
}
|
|
|
|
|
|
if (!condition) {
|
|
|
for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
|
|
args[_key2 - 2] = arguments[_key2];
|
|
|
}
|
|
|
|
|
|
printWarning.apply(void 0, [format].concat(args));
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var lowPriorityWarningWithoutStack$1 = lowPriorityWarningWithoutStack;
|
|
|
|
|
|
function typeOf(object) {
|
|
|
if (typeof object === 'object' && object !== null) {
|
|
|
var $$typeof = object.$$typeof;
|
|
|
|
|
|
switch ($$typeof) {
|
|
|
case REACT_ELEMENT_TYPE:
|
|
|
var type = object.type;
|
|
|
|
|
|
switch (type) {
|
|
|
case REACT_ASYNC_MODE_TYPE:
|
|
|
case REACT_CONCURRENT_MODE_TYPE:
|
|
|
case REACT_FRAGMENT_TYPE:
|
|
|
case REACT_PROFILER_TYPE:
|
|
|
case REACT_STRICT_MODE_TYPE:
|
|
|
case REACT_SUSPENSE_TYPE:
|
|
|
return type;
|
|
|
|
|
|
default:
|
|
|
var $$typeofType = type && type.$$typeof;
|
|
|
|
|
|
switch ($$typeofType) {
|
|
|
case REACT_CONTEXT_TYPE:
|
|
|
case REACT_FORWARD_REF_TYPE:
|
|
|
case REACT_LAZY_TYPE:
|
|
|
case REACT_MEMO_TYPE:
|
|
|
case REACT_PROVIDER_TYPE:
|
|
|
return $$typeofType;
|
|
|
|
|
|
default:
|
|
|
return $$typeof;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
case REACT_PORTAL_TYPE:
|
|
|
return $$typeof;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return undefined;
|
|
|
} // AsyncMode is deprecated along with isAsyncMode
|
|
|
|
|
|
var AsyncMode = REACT_ASYNC_MODE_TYPE;
|
|
|
var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
|
|
|
var ContextConsumer = REACT_CONTEXT_TYPE;
|
|
|
var ContextProvider = REACT_PROVIDER_TYPE;
|
|
|
var Element = REACT_ELEMENT_TYPE;
|
|
|
var ForwardRef = REACT_FORWARD_REF_TYPE;
|
|
|
var Fragment = REACT_FRAGMENT_TYPE;
|
|
|
var Lazy = REACT_LAZY_TYPE;
|
|
|
var Memo = REACT_MEMO_TYPE;
|
|
|
var Portal = REACT_PORTAL_TYPE;
|
|
|
var Profiler = REACT_PROFILER_TYPE;
|
|
|
var StrictMode = REACT_STRICT_MODE_TYPE;
|
|
|
var Suspense = REACT_SUSPENSE_TYPE;
|
|
|
var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated
|
|
|
|
|
|
function isAsyncMode(object) {
|
|
|
{
|
|
|
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
|
|
|
hasWarnedAboutDeprecatedIsAsyncMode = true;
|
|
|
lowPriorityWarningWithoutStack$1(false, 'The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
|
|
|
}
|
|
|
function isConcurrentMode(object) {
|
|
|
return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
|
|
|
}
|
|
|
function isContextConsumer(object) {
|
|
|
return typeOf(object) === REACT_CONTEXT_TYPE;
|
|
|
}
|
|
|
function isContextProvider(object) {
|
|
|
return typeOf(object) === REACT_PROVIDER_TYPE;
|
|
|
}
|
|
|
function isElement(object) {
|
|
|
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
|
}
|
|
|
function isForwardRef(object) {
|
|
|
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
|
|
}
|
|
|
function isFragment(object) {
|
|
|
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
|
|
}
|
|
|
function isLazy(object) {
|
|
|
return typeOf(object) === REACT_LAZY_TYPE;
|
|
|
}
|
|
|
function isMemo(object) {
|
|
|
return typeOf(object) === REACT_MEMO_TYPE;
|
|
|
}
|
|
|
function isPortal(object) {
|
|
|
return typeOf(object) === REACT_PORTAL_TYPE;
|
|
|
}
|
|
|
function isProfiler(object) {
|
|
|
return typeOf(object) === REACT_PROFILER_TYPE;
|
|
|
}
|
|
|
function isStrictMode(object) {
|
|
|
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
|
|
}
|
|
|
function isSuspense(object) {
|
|
|
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
|
|
}
|
|
|
|
|
|
exports.typeOf = typeOf;
|
|
|
exports.AsyncMode = AsyncMode;
|
|
|
exports.ConcurrentMode = ConcurrentMode;
|
|
|
exports.ContextConsumer = ContextConsumer;
|
|
|
exports.ContextProvider = ContextProvider;
|
|
|
exports.Element = Element;
|
|
|
exports.ForwardRef = ForwardRef;
|
|
|
exports.Fragment = Fragment;
|
|
|
exports.Lazy = Lazy;
|
|
|
exports.Memo = Memo;
|
|
|
exports.Portal = Portal;
|
|
|
exports.Profiler = Profiler;
|
|
|
exports.StrictMode = StrictMode;
|
|
|
exports.Suspense = Suspense;
|
|
|
exports.isValidElementType = isValidElementType;
|
|
|
exports.isAsyncMode = isAsyncMode;
|
|
|
exports.isConcurrentMode = isConcurrentMode;
|
|
|
exports.isContextConsumer = isContextConsumer;
|
|
|
exports.isContextProvider = isContextProvider;
|
|
|
exports.isElement = isElement;
|
|
|
exports.isForwardRef = isForwardRef;
|
|
|
exports.isFragment = isFragment;
|
|
|
exports.isLazy = isLazy;
|
|
|
exports.isMemo = isMemo;
|
|
|
exports.isPortal = isPortal;
|
|
|
exports.isProfiler = isProfiler;
|
|
|
exports.isStrictMode = isStrictMode;
|
|
|
exports.isSuspense = isSuspense;
|
|
|
})();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
unwrapExports(reactIs_development);
|
|
|
var reactIs_development_1 = reactIs_development.typeOf;
|
|
|
var reactIs_development_2 = reactIs_development.AsyncMode;
|
|
|
var reactIs_development_3 = reactIs_development.ConcurrentMode;
|
|
|
var reactIs_development_4 = reactIs_development.ContextConsumer;
|
|
|
var reactIs_development_5 = reactIs_development.ContextProvider;
|
|
|
var reactIs_development_6 = reactIs_development.Element;
|
|
|
var reactIs_development_7 = reactIs_development.ForwardRef;
|
|
|
var reactIs_development_8 = reactIs_development.Fragment;
|
|
|
var reactIs_development_9 = reactIs_development.Lazy;
|
|
|
var reactIs_development_10 = reactIs_development.Memo;
|
|
|
var reactIs_development_11 = reactIs_development.Portal;
|
|
|
var reactIs_development_12 = reactIs_development.Profiler;
|
|
|
var reactIs_development_13 = reactIs_development.StrictMode;
|
|
|
var reactIs_development_14 = reactIs_development.Suspense;
|
|
|
var reactIs_development_15 = reactIs_development.isValidElementType;
|
|
|
var reactIs_development_16 = reactIs_development.isAsyncMode;
|
|
|
var reactIs_development_17 = reactIs_development.isConcurrentMode;
|
|
|
var reactIs_development_18 = reactIs_development.isContextConsumer;
|
|
|
var reactIs_development_19 = reactIs_development.isContextProvider;
|
|
|
var reactIs_development_20 = reactIs_development.isElement;
|
|
|
var reactIs_development_21 = reactIs_development.isForwardRef;
|
|
|
var reactIs_development_22 = reactIs_development.isFragment;
|
|
|
var reactIs_development_23 = reactIs_development.isLazy;
|
|
|
var reactIs_development_24 = reactIs_development.isMemo;
|
|
|
var reactIs_development_25 = reactIs_development.isPortal;
|
|
|
var reactIs_development_26 = reactIs_development.isProfiler;
|
|
|
var reactIs_development_27 = reactIs_development.isStrictMode;
|
|
|
var reactIs_development_28 = reactIs_development.isSuspense;
|
|
|
|
|
|
var reactIs = createCommonjsModule(function (module) {
|
|
|
|
|
|
if ("development" === 'production') {
|
|
|
module.exports = reactIs_production_min;
|
|
|
} else {
|
|
|
module.exports = reactIs_development;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
/**
|
|
|
* Copyright 2015, Yahoo! Inc.
|
|
|
* Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
|
|
*/
|
|
|
var REACT_STATICS = {
|
|
|
childContextTypes: true,
|
|
|
contextType: true,
|
|
|
contextTypes: true,
|
|
|
defaultProps: true,
|
|
|
displayName: true,
|
|
|
getDefaultProps: true,
|
|
|
getDerivedStateFromError: true,
|
|
|
getDerivedStateFromProps: true,
|
|
|
mixins: true,
|
|
|
propTypes: true,
|
|
|
type: true
|
|
|
};
|
|
|
var KNOWN_STATICS = {
|
|
|
name: true,
|
|
|
length: true,
|
|
|
prototype: true,
|
|
|
caller: true,
|
|
|
callee: true,
|
|
|
arguments: true,
|
|
|
arity: true
|
|
|
};
|
|
|
var FORWARD_REF_STATICS = {
|
|
|
'$$typeof': true,
|
|
|
render: true,
|
|
|
defaultProps: true,
|
|
|
displayName: true,
|
|
|
propTypes: true
|
|
|
};
|
|
|
var MEMO_STATICS = {
|
|
|
'$$typeof': true,
|
|
|
compare: true,
|
|
|
defaultProps: true,
|
|
|
displayName: true,
|
|
|
propTypes: true,
|
|
|
type: true
|
|
|
};
|
|
|
var TYPE_STATICS = {};
|
|
|
TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;
|
|
|
|
|
|
function getStatics(component) {
|
|
|
if (reactIs.isMemo(component)) {
|
|
|
return MEMO_STATICS;
|
|
|
}
|
|
|
|
|
|
return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;
|
|
|
}
|
|
|
|
|
|
var defineProperty = Object.defineProperty;
|
|
|
var getOwnPropertyNames = Object.getOwnPropertyNames;
|
|
|
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
|
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
|
var getPrototypeOf = Object.getPrototypeOf;
|
|
|
var objectPrototype = Object.prototype;
|
|
|
function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
|
|
|
if (typeof sourceComponent !== 'string') {
|
|
|
// don't hoist over string (html) components
|
|
|
if (objectPrototype) {
|
|
|
var inheritedComponent = getPrototypeOf(sourceComponent);
|
|
|
|
|
|
if (inheritedComponent && inheritedComponent !== objectPrototype) {
|
|
|
hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var keys = getOwnPropertyNames(sourceComponent);
|
|
|
|
|
|
if (getOwnPropertySymbols) {
|
|
|
keys = keys.concat(getOwnPropertySymbols(sourceComponent));
|
|
|
}
|
|
|
|
|
|
var targetStatics = getStatics(targetComponent);
|
|
|
var sourceStatics = getStatics(sourceComponent);
|
|
|
|
|
|
for (var i = 0; i < keys.length; ++i) {
|
|
|
var key = keys[i];
|
|
|
|
|
|
if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
|
|
|
var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
|
|
|
|
|
|
try {
|
|
|
// Avoid failures from read-only properties
|
|
|
defineProperty(targetComponent, key, descriptor);
|
|
|
} catch (e) {}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return targetComponent;
|
|
|
}
|
|
|
|
|
|
var hoistNonReactStatics_cjs = hoistNonReactStatics;
|
|
|
|
|
|
function _classCallCheck$7(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$7(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); } }
|
|
|
|
|
|
function _createClass$7(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$7(Constructor.prototype, protoProps); if (staticProps) _defineProperties$7(Constructor, staticProps); return Constructor; }
|
|
|
/**
|
|
|
* Provides a set of static methods for creating Disposables.
|
|
|
* @param {Function} action Action to run during the first call to dispose.
|
|
|
* The action is guaranteed to be run at most once.
|
|
|
*/
|
|
|
|
|
|
var Disposable =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function Disposable(action) {
|
|
|
_classCallCheck$7(this, Disposable);
|
|
|
|
|
|
this.isDisposed = false;
|
|
|
this.action = isFunction(action) ? action : noop;
|
|
|
}
|
|
|
/**
|
|
|
* Validates whether the given object is a disposable
|
|
|
* @param {Object} Object to test whether it has a dispose method
|
|
|
* @returns {Boolean} true if a disposable object, else false.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass$7(Disposable, [{
|
|
|
key: "dispose",
|
|
|
|
|
|
/** Performs the task of cleaning up resources. */
|
|
|
value: function dispose() {
|
|
|
if (!this.isDisposed) {
|
|
|
this.action();
|
|
|
this.isDisposed = true;
|
|
|
}
|
|
|
}
|
|
|
}], [{
|
|
|
key: "isDisposable",
|
|
|
value: function isDisposable(d) {
|
|
|
return d && isFunction(d.dispose);
|
|
|
}
|
|
|
}, {
|
|
|
key: "_fixup",
|
|
|
value: function _fixup(result) {
|
|
|
return Disposable.isDisposable(result) ? result : Disposable.empty;
|
|
|
}
|
|
|
/**
|
|
|
* Creates a disposable object that invokes the specified action when disposed.
|
|
|
* @param {Function} dispose Action to run during the first call to dispose.
|
|
|
* The action is guaranteed to be run at most once.
|
|
|
* @return {Disposable} The disposable object that runs the given action upon disposal.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: "create",
|
|
|
value: function create(action) {
|
|
|
return new Disposable(action);
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return Disposable;
|
|
|
}();
|
|
|
/**
|
|
|
* Gets the disposable that does nothing when disposed.
|
|
|
*/
|
|
|
|
|
|
Disposable.empty = {
|
|
|
dispose: noop
|
|
|
};
|
|
|
/**
|
|
|
* Represents a group of disposable resources that are disposed together.
|
|
|
* @constructor
|
|
|
*/
|
|
|
|
|
|
var CompositeDisposable =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function CompositeDisposable() {
|
|
|
_classCallCheck$7(this, CompositeDisposable);
|
|
|
|
|
|
this.isDisposed = false;
|
|
|
|
|
|
for (var _len = arguments.length, disposables = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
disposables[_key] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
this.disposables = disposables;
|
|
|
}
|
|
|
/**
|
|
|
* Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.
|
|
|
* @param {Any} item Disposable to add.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass$7(CompositeDisposable, [{
|
|
|
key: "add",
|
|
|
value: function add(item) {
|
|
|
if (this.isDisposed) {
|
|
|
item.dispose();
|
|
|
} else {
|
|
|
this.disposables.push(item);
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Removes and disposes the first occurrence of a disposable from the CompositeDisposable.
|
|
|
* @param {Any} item Disposable to remove.
|
|
|
* @returns {Boolean} true if found; false otherwise.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: "remove",
|
|
|
value: function remove(item) {
|
|
|
var shouldDispose = false;
|
|
|
|
|
|
if (!this.isDisposed) {
|
|
|
var idx = this.disposables.indexOf(item);
|
|
|
|
|
|
if (idx !== -1) {
|
|
|
shouldDispose = true;
|
|
|
this.disposables.splice(idx, 1);
|
|
|
item.dispose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return shouldDispose;
|
|
|
}
|
|
|
/**
|
|
|
* Disposes all disposables in the group and removes them from the group but
|
|
|
* does not dispose the CompositeDisposable.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: "clear",
|
|
|
value: function clear() {
|
|
|
if (!this.isDisposed) {
|
|
|
var len = this.disposables.length;
|
|
|
var currentDisposables = new Array(len);
|
|
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
|
currentDisposables[i] = this.disposables[i];
|
|
|
}
|
|
|
|
|
|
this.disposables = [];
|
|
|
|
|
|
for (var _i = 0; _i < len; _i++) {
|
|
|
currentDisposables[_i].dispose();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* Disposes all disposables in the group and removes them from the group.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: "dispose",
|
|
|
value: function dispose() {
|
|
|
if (!this.isDisposed) {
|
|
|
this.isDisposed = true;
|
|
|
var len = this.disposables.length;
|
|
|
var currentDisposables = new Array(len);
|
|
|
|
|
|
for (var i = 0; i < len; i++) {
|
|
|
currentDisposables[i] = this.disposables[i];
|
|
|
}
|
|
|
|
|
|
this.disposables = [];
|
|
|
|
|
|
for (var _i2 = 0; _i2 < len; _i2++) {
|
|
|
currentDisposables[_i2].dispose();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return CompositeDisposable;
|
|
|
}();
|
|
|
/**
|
|
|
* Represents a disposable resource whose underlying disposable resource can
|
|
|
* be replaced by another disposable resource, causing automatic disposal of
|
|
|
* the previous underlying disposable resource.
|
|
|
*/
|
|
|
|
|
|
var SerialDisposable =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function SerialDisposable() {
|
|
|
_classCallCheck$7(this, SerialDisposable);
|
|
|
|
|
|
this.isDisposed = false;
|
|
|
}
|
|
|
/**
|
|
|
* Gets the underlying disposable.
|
|
|
* @returns {Any} the underlying disposable.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass$7(SerialDisposable, [{
|
|
|
key: "getDisposable",
|
|
|
value: function getDisposable() {
|
|
|
return this.current;
|
|
|
}
|
|
|
}, {
|
|
|
key: "setDisposable",
|
|
|
value: function setDisposable(value) {
|
|
|
var shouldDispose = this.isDisposed;
|
|
|
|
|
|
if (!shouldDispose) {
|
|
|
var old = this.current;
|
|
|
this.current = value;
|
|
|
|
|
|
if (old) {
|
|
|
old.dispose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (shouldDispose && value) {
|
|
|
value.dispose();
|
|
|
}
|
|
|
}
|
|
|
/** Performs the task of cleaning up resources. */
|
|
|
|
|
|
}, {
|
|
|
key: "dispose",
|
|
|
value: function dispose() {
|
|
|
if (!this.isDisposed) {
|
|
|
this.isDisposed = true;
|
|
|
var old = this.current;
|
|
|
this.current = undefined;
|
|
|
|
|
|
if (old) {
|
|
|
old.dispose();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return SerialDisposable;
|
|
|
}();
|
|
|
|
|
|
function _typeof$5(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$5 = function _typeof(obj) { return typeof obj; }; } else { _typeof$5 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$5(obj); }
|
|
|
|
|
|
function _slicedToArray$9(arr, i) { return _arrayWithHoles$9(arr) || _iterableToArrayLimit$9(arr, i) || _nonIterableRest$9(); }
|
|
|
|
|
|
function _nonIterableRest$9() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
|
|
|
|
|
|
function _iterableToArrayLimit$9(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
|
|
|
|
function _arrayWithHoles$9(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
|
|
|
function _classCallCheck$8(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$8(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); } }
|
|
|
|
|
|
function _createClass$8(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$8(Constructor.prototype, protoProps); if (staticProps) _defineProperties$8(Constructor, staticProps); return Constructor; }
|
|
|
|
|
|
function _possibleConstructorReturn(self, call) { if (call && (_typeof$5(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
|
|
|
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
|
|
|
|
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
|
|
|
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
|
|
|
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
|
function decorateHandler(_ref) {
|
|
|
var DecoratedComponent = _ref.DecoratedComponent,
|
|
|
createHandler = _ref.createHandler,
|
|
|
createMonitor = _ref.createMonitor,
|
|
|
createConnector = _ref.createConnector,
|
|
|
registerHandler = _ref.registerHandler,
|
|
|
containerDisplayName = _ref.containerDisplayName,
|
|
|
getType = _ref.getType,
|
|
|
collect = _ref.collect,
|
|
|
options = _ref.options;
|
|
|
var _options$arePropsEqua = options.arePropsEqual,
|
|
|
arePropsEqual = _options$arePropsEqua === void 0 ? shallowEqual : _options$arePropsEqua;
|
|
|
var Decorated = DecoratedComponent;
|
|
|
var displayName = DecoratedComponent.displayName || DecoratedComponent.name || 'Component';
|
|
|
|
|
|
var DragDropContainer =
|
|
|
/*#__PURE__*/
|
|
|
function (_React$Component) {
|
|
|
_inherits(DragDropContainer, _React$Component);
|
|
|
|
|
|
function DragDropContainer(props) {
|
|
|
var _this;
|
|
|
|
|
|
_classCallCheck$8(this, DragDropContainer);
|
|
|
|
|
|
_this = _possibleConstructorReturn(this, _getPrototypeOf(DragDropContainer).call(this, props));
|
|
|
_this.decoratedRef = React.createRef();
|
|
|
|
|
|
_this.handleChange = function () {
|
|
|
var nextState = _this.getCurrentState();
|
|
|
|
|
|
if (!shallowEqual(nextState, _this.state)) {
|
|
|
_this.setState(nextState);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
_this.disposable = new SerialDisposable();
|
|
|
|
|
|
_this.receiveProps(props);
|
|
|
|
|
|
_this.dispose();
|
|
|
|
|
|
return _this;
|
|
|
}
|
|
|
|
|
|
_createClass$8(DragDropContainer, [{
|
|
|
key: "getHandlerId",
|
|
|
value: function getHandlerId() {
|
|
|
return this.handlerId;
|
|
|
}
|
|
|
}, {
|
|
|
key: "getDecoratedComponentInstance",
|
|
|
value: function getDecoratedComponentInstance() {
|
|
|
invariant(this.decoratedRef.current, 'In order to access an instance of the decorated component, it must either be a class component or use React.forwardRef()');
|
|
|
return this.decoratedRef.current;
|
|
|
}
|
|
|
}, {
|
|
|
key: "shouldComponentUpdate",
|
|
|
value: function shouldComponentUpdate(nextProps, nextState) {
|
|
|
return !arePropsEqual(nextProps, this.props) || !shallowEqual(nextState, this.state);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
this.disposable = new SerialDisposable();
|
|
|
this.currentType = undefined;
|
|
|
this.receiveProps(this.props);
|
|
|
this.handleChange();
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidUpdate",
|
|
|
value: function componentDidUpdate(prevProps) {
|
|
|
if (!arePropsEqual(this.props, prevProps)) {
|
|
|
this.receiveProps(this.props);
|
|
|
this.handleChange();
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.dispose();
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveProps",
|
|
|
value: function receiveProps(props) {
|
|
|
if (!this.handler) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.handler.receiveProps(props);
|
|
|
this.receiveType(getType(props));
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveType",
|
|
|
value: function receiveType(type) {
|
|
|
if (!this.handlerMonitor || !this.manager || !this.handlerConnector) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (type === this.currentType) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.currentType = type;
|
|
|
|
|
|
var _registerHandler = registerHandler(type, this.handler, this.manager),
|
|
|
_registerHandler2 = _slicedToArray$9(_registerHandler, 2),
|
|
|
handlerId = _registerHandler2[0],
|
|
|
unregister = _registerHandler2[1];
|
|
|
|
|
|
this.handlerId = handlerId;
|
|
|
this.handlerMonitor.receiveHandlerId(handlerId);
|
|
|
this.handlerConnector.receiveHandlerId(handlerId);
|
|
|
var globalMonitor = this.manager.getMonitor();
|
|
|
var unsubscribe = globalMonitor.subscribeToStateChange(this.handleChange, {
|
|
|
handlerIds: [handlerId]
|
|
|
});
|
|
|
this.disposable.setDisposable(new CompositeDisposable(new Disposable(unsubscribe), new Disposable(unregister)));
|
|
|
}
|
|
|
}, {
|
|
|
key: "dispose",
|
|
|
value: function dispose() {
|
|
|
this.disposable.dispose();
|
|
|
|
|
|
if (this.handlerConnector) {
|
|
|
this.handlerConnector.receiveHandlerId(null);
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "getCurrentState",
|
|
|
value: function getCurrentState() {
|
|
|
if (!this.handlerConnector) {
|
|
|
return {};
|
|
|
}
|
|
|
|
|
|
var nextState = collect(this.handlerConnector.hooks, this.handlerMonitor, this.props);
|
|
|
|
|
|
if ("development" !== 'production') {
|
|
|
invariant(isPlainObject$1(nextState), 'Expected `collect` specified as the second argument to ' + '%s for %s to return a plain object of props to inject. ' + 'Instead, received %s.', containerDisplayName, displayName, nextState);
|
|
|
}
|
|
|
|
|
|
return nextState;
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this2 = this;
|
|
|
|
|
|
return React.createElement(DndContext.Consumer, null, function (_ref2) {
|
|
|
var dragDropManager = _ref2.dragDropManager;
|
|
|
|
|
|
_this2.receiveDragDropManager(dragDropManager);
|
|
|
|
|
|
if (typeof requestAnimationFrame !== 'undefined') {
|
|
|
requestAnimationFrame(function () {
|
|
|
return _this2.handlerConnector.reconnect();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return React.createElement(Decorated, Object.assign({}, _this2.props, _this2.getCurrentState(), {
|
|
|
// NOTE: if Decorated is a Function Component, decoratedRef will not be populated unless it's a refforwarding component.
|
|
|
ref: isRefable(Decorated) ? _this2.decoratedRef : null
|
|
|
}));
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveDragDropManager",
|
|
|
value: function receiveDragDropManager(dragDropManager) {
|
|
|
if (this.manager !== undefined) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
invariant(dragDropManager !== undefined, 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to render a DndProvider component in your top-level component. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/troubleshooting#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);
|
|
|
|
|
|
if (dragDropManager === undefined) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.manager = dragDropManager;
|
|
|
this.handlerMonitor = createMonitor(dragDropManager);
|
|
|
this.handlerConnector = createConnector(dragDropManager.getBackend());
|
|
|
this.handler = createHandler(this.handlerMonitor, this.decoratedRef);
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DragDropContainer;
|
|
|
}(React.Component);
|
|
|
|
|
|
DragDropContainer.DecoratedComponent = DecoratedComponent;
|
|
|
DragDropContainer.displayName = "".concat(containerDisplayName, "(").concat(displayName, ")");
|
|
|
return hoistNonReactStatics_cjs(DragDropContainer, DecoratedComponent);
|
|
|
}
|
|
|
|
|
|
function _typeof$6(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$6 = function _typeof(obj) { return typeof obj; }; } else { _typeof$6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$6(obj); }
|
|
|
|
|
|
function isValidType(type, allowArray) {
|
|
|
return typeof type === 'string' || _typeof$6(type) === 'symbol' || !!allowArray && Array.isArray(type) && type.every(function (t) {
|
|
|
return isValidType(t, false);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function _classCallCheck$9(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$9(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); } }
|
|
|
|
|
|
function _createClass$9(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$9(Constructor.prototype, protoProps); if (staticProps) _defineProperties$9(Constructor, staticProps); return Constructor; }
|
|
|
var ALLOWED_SPEC_METHODS = ['canDrag', 'beginDrag', 'isDragging', 'endDrag'];
|
|
|
var REQUIRED_SPEC_METHODS = ['beginDrag'];
|
|
|
|
|
|
var SourceImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function SourceImpl(spec, monitor, ref) {
|
|
|
var _this = this;
|
|
|
|
|
|
_classCallCheck$9(this, SourceImpl);
|
|
|
|
|
|
this.props = null;
|
|
|
|
|
|
this.beginDrag = function () {
|
|
|
if (!_this.props) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var item = _this.spec.beginDrag(_this.props, _this.monitor, _this.ref.current);
|
|
|
|
|
|
if ("development" !== 'production') {
|
|
|
invariant(isPlainObject$1(item), 'beginDrag() must return a plain object that represents the dragged item. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', item);
|
|
|
}
|
|
|
|
|
|
return item;
|
|
|
};
|
|
|
|
|
|
this.spec = spec;
|
|
|
this.monitor = monitor;
|
|
|
this.ref = ref;
|
|
|
}
|
|
|
|
|
|
_createClass$9(SourceImpl, [{
|
|
|
key: "receiveProps",
|
|
|
value: function receiveProps(props) {
|
|
|
this.props = props;
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDrag",
|
|
|
value: function canDrag() {
|
|
|
if (!this.props) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (!this.spec.canDrag) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
return this.spec.canDrag(this.props, this.monitor);
|
|
|
}
|
|
|
}, {
|
|
|
key: "isDragging",
|
|
|
value: function isDragging(globalMonitor, sourceId) {
|
|
|
if (!this.props) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (!this.spec.isDragging) {
|
|
|
return sourceId === globalMonitor.getSourceId();
|
|
|
}
|
|
|
|
|
|
return this.spec.isDragging(this.props, this.monitor);
|
|
|
}
|
|
|
}, {
|
|
|
key: "endDrag",
|
|
|
value: function endDrag() {
|
|
|
if (!this.props) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (!this.spec.endDrag) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.spec.endDrag(this.props, this.monitor, getDecoratedComponent(this.ref));
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return SourceImpl;
|
|
|
}();
|
|
|
|
|
|
function createSourceFactory(spec) {
|
|
|
Object.keys(spec).forEach(function (key) {
|
|
|
invariant(ALLOWED_SPEC_METHODS.indexOf(key) > -1, 'Expected the drag source specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected "%s" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', ALLOWED_SPEC_METHODS.join(', '), key);
|
|
|
invariant(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', key, key, spec[key]);
|
|
|
});
|
|
|
REQUIRED_SPEC_METHODS.forEach(function (key) {
|
|
|
invariant(typeof spec[key] === 'function', 'Expected %s in the drag source specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', key, key, spec[key]);
|
|
|
});
|
|
|
return function createSource(monitor, ref) {
|
|
|
return new SourceImpl(spec, monitor, ref);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Decorates a component as a dragsource
|
|
|
* @param type The dragsource type
|
|
|
* @param spec The drag source specification
|
|
|
* @param collect The props collector function
|
|
|
* @param options DnD options
|
|
|
*/
|
|
|
|
|
|
function DragSource(type, spec, collect) {
|
|
|
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
|
checkDecoratorArguments('DragSource', 'type, spec, collect[, options]', type, spec, collect, options);
|
|
|
var getType = type;
|
|
|
|
|
|
if (typeof type !== 'function') {
|
|
|
invariant(isValidType(type), 'Expected "type" provided as the first argument to DragSource to be ' + 'a string, or a function that returns a string given the current props. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', type);
|
|
|
|
|
|
getType = function getType() {
|
|
|
return type;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
invariant(isPlainObject$1(spec), 'Expected "spec" provided as the second argument to DragSource to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', spec);
|
|
|
var createSource = createSourceFactory(spec);
|
|
|
invariant(typeof collect === 'function', 'Expected "collect" provided as the third argument to DragSource to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', collect);
|
|
|
invariant(isPlainObject$1(options), 'Expected "options" provided as the fourth argument to DragSource to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source', collect);
|
|
|
return function decorateSource(DecoratedComponent) {
|
|
|
return decorateHandler({
|
|
|
containerDisplayName: 'DragSource',
|
|
|
createHandler: createSource,
|
|
|
registerHandler: registerSource,
|
|
|
createConnector: function createConnector(backend) {
|
|
|
return new SourceConnector(backend);
|
|
|
},
|
|
|
createMonitor: function createMonitor(manager) {
|
|
|
return new DragSourceMonitorImpl(manager);
|
|
|
},
|
|
|
DecoratedComponent: DecoratedComponent,
|
|
|
getType: getType,
|
|
|
collect: collect,
|
|
|
options: options
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function _classCallCheck$a(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$a(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); } }
|
|
|
|
|
|
function _createClass$a(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$a(Constructor.prototype, protoProps); if (staticProps) _defineProperties$a(Constructor, staticProps); return Constructor; }
|
|
|
var ALLOWED_SPEC_METHODS$1 = ['canDrop', 'hover', 'drop'];
|
|
|
|
|
|
var TargetImpl =
|
|
|
/*#__PURE__*/
|
|
|
function () {
|
|
|
function TargetImpl(spec, monitor, ref) {
|
|
|
_classCallCheck$a(this, TargetImpl);
|
|
|
|
|
|
this.props = null;
|
|
|
this.spec = spec;
|
|
|
this.monitor = monitor;
|
|
|
this.ref = ref;
|
|
|
}
|
|
|
|
|
|
_createClass$a(TargetImpl, [{
|
|
|
key: "receiveProps",
|
|
|
value: function receiveProps(props) {
|
|
|
this.props = props;
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveMonitor",
|
|
|
value: function receiveMonitor(monitor) {
|
|
|
this.monitor = monitor;
|
|
|
}
|
|
|
}, {
|
|
|
key: "canDrop",
|
|
|
value: function canDrop() {
|
|
|
if (!this.spec.canDrop) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
return this.spec.canDrop(this.props, this.monitor);
|
|
|
}
|
|
|
}, {
|
|
|
key: "hover",
|
|
|
value: function hover() {
|
|
|
if (!this.spec.hover) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.spec.hover(this.props, this.monitor, getDecoratedComponent(this.ref));
|
|
|
}
|
|
|
}, {
|
|
|
key: "drop",
|
|
|
value: function drop() {
|
|
|
if (!this.spec.drop) {
|
|
|
return undefined;
|
|
|
}
|
|
|
|
|
|
var dropResult = this.spec.drop(this.props, this.monitor, this.ref.current);
|
|
|
|
|
|
if ("development" !== 'production') {
|
|
|
invariant(typeof dropResult === 'undefined' || isPlainObject$1(dropResult), 'drop() must either return undefined, or an object that represents the drop result. ' + 'Instead received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', dropResult);
|
|
|
}
|
|
|
|
|
|
return dropResult;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return TargetImpl;
|
|
|
}();
|
|
|
|
|
|
function createTargetFactory(spec) {
|
|
|
Object.keys(spec).forEach(function (key) {
|
|
|
invariant(ALLOWED_SPEC_METHODS$1.indexOf(key) > -1, 'Expected the drop target specification to only have ' + 'some of the following keys: %s. ' + 'Instead received a specification with an unexpected "%s" key. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', ALLOWED_SPEC_METHODS$1.join(', '), key);
|
|
|
invariant(typeof spec[key] === 'function', 'Expected %s in the drop target specification to be a function. ' + 'Instead received a specification with %s: %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', key, key, spec[key]);
|
|
|
});
|
|
|
return function createTarget(monitor, ref) {
|
|
|
return new TargetImpl(spec, monitor, ref);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function DropTarget(type, spec, collect) {
|
|
|
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
|
checkDecoratorArguments('DropTarget', 'type, spec, collect[, options]', type, spec, collect, options);
|
|
|
var getType = type;
|
|
|
|
|
|
if (typeof type !== 'function') {
|
|
|
invariant(isValidType(type, true), 'Expected "type" provided as the first argument to DropTarget to be ' + 'a string, an array of strings, or a function that returns either given ' + 'the current props. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', type);
|
|
|
|
|
|
getType = function getType() {
|
|
|
return type;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
invariant(isPlainObject$1(spec), 'Expected "spec" provided as the second argument to DropTarget to be ' + 'a plain object. Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', spec);
|
|
|
var createTarget = createTargetFactory(spec);
|
|
|
invariant(typeof collect === 'function', 'Expected "collect" provided as the third argument to DropTarget to be ' + 'a function that returns a plain object of props to inject. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', collect);
|
|
|
invariant(isPlainObject$1(options), 'Expected "options" provided as the fourth argument to DropTarget to be ' + 'a plain object when specified. ' + 'Instead, received %s. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target', collect);
|
|
|
return function decorateTarget(DecoratedComponent) {
|
|
|
return decorateHandler({
|
|
|
containerDisplayName: 'DropTarget',
|
|
|
createHandler: createTarget,
|
|
|
registerHandler: registerTarget,
|
|
|
createMonitor: function createMonitor(manager) {
|
|
|
return new DropTargetMonitorImpl(manager);
|
|
|
},
|
|
|
createConnector: function createConnector(backend) {
|
|
|
return new TargetConnector(backend);
|
|
|
},
|
|
|
DecoratedComponent: DecoratedComponent,
|
|
|
getType: getType,
|
|
|
collect: collect,
|
|
|
options: options
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function _typeof$7(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$7 = function _typeof(obj) { return typeof obj; }; } else { _typeof$7 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$7(obj); }
|
|
|
|
|
|
function _classCallCheck$b(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _defineProperties$b(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); } }
|
|
|
|
|
|
function _createClass$b(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties$b(Constructor.prototype, protoProps); if (staticProps) _defineProperties$b(Constructor, staticProps); return Constructor; }
|
|
|
|
|
|
function _possibleConstructorReturn$1(self, call) { if (call && (_typeof$7(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized$1(self); }
|
|
|
|
|
|
function _assertThisInitialized$1(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
|
|
|
|
function _getPrototypeOf$1(o) { _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf$1(o); }
|
|
|
|
|
|
function _inherits$1(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf$1(subClass, superClass); }
|
|
|
|
|
|
function _setPrototypeOf$1(o, p) { _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf$1(o, p); }
|
|
|
function DragLayer(collect) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
|
checkDecoratorArguments('DragLayer', 'collect[, options]', collect, options);
|
|
|
invariant(typeof collect === 'function', 'Expected "collect" provided as the first argument to DragLayer to be a function that collects props to inject into the component. ', 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-layer', collect);
|
|
|
invariant(isPlainObject$1(options), 'Expected "options" provided as the second argument to DragLayer to be a plain object when specified. ' + 'Instead, received %s. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-layer', options);
|
|
|
return function decorateLayer(DecoratedComponent) {
|
|
|
var Decorated = DecoratedComponent;
|
|
|
var _options$arePropsEqua = options.arePropsEqual,
|
|
|
arePropsEqual = _options$arePropsEqua === void 0 ? shallowEqual : _options$arePropsEqua;
|
|
|
var displayName = Decorated.displayName || Decorated.name || 'Component';
|
|
|
|
|
|
var DragLayerContainer =
|
|
|
/*#__PURE__*/
|
|
|
function (_React$Component) {
|
|
|
_inherits$1(DragLayerContainer, _React$Component);
|
|
|
|
|
|
function DragLayerContainer() {
|
|
|
var _this;
|
|
|
|
|
|
_classCallCheck$b(this, DragLayerContainer);
|
|
|
|
|
|
_this = _possibleConstructorReturn$1(this, _getPrototypeOf$1(DragLayerContainer).apply(this, arguments));
|
|
|
_this.isCurrentlyMounted = false;
|
|
|
_this.ref = React.createRef();
|
|
|
|
|
|
_this.handleChange = function () {
|
|
|
if (!_this.isCurrentlyMounted) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var nextState = _this.getCurrentState();
|
|
|
|
|
|
if (!shallowEqual(nextState, _this.state)) {
|
|
|
_this.setState(nextState);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
return _this;
|
|
|
}
|
|
|
|
|
|
_createClass$b(DragLayerContainer, [{
|
|
|
key: "getDecoratedComponentInstance",
|
|
|
value: function getDecoratedComponentInstance() {
|
|
|
invariant(this.ref.current, 'In order to access an instance of the decorated component, it must either be a class component or use React.forwardRef()');
|
|
|
return this.ref.current;
|
|
|
}
|
|
|
}, {
|
|
|
key: "shouldComponentUpdate",
|
|
|
value: function shouldComponentUpdate(nextProps, nextState) {
|
|
|
return !arePropsEqual(nextProps, this.props) || !shallowEqual(nextState, this.state);
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentDidMount",
|
|
|
value: function componentDidMount() {
|
|
|
this.isCurrentlyMounted = true;
|
|
|
this.handleChange();
|
|
|
}
|
|
|
}, {
|
|
|
key: "componentWillUnmount",
|
|
|
value: function componentWillUnmount() {
|
|
|
this.isCurrentlyMounted = false;
|
|
|
|
|
|
if (this.unsubscribeFromOffsetChange) {
|
|
|
this.unsubscribeFromOffsetChange();
|
|
|
this.unsubscribeFromOffsetChange = undefined;
|
|
|
}
|
|
|
|
|
|
if (this.unsubscribeFromStateChange) {
|
|
|
this.unsubscribeFromStateChange();
|
|
|
this.unsubscribeFromStateChange = undefined;
|
|
|
}
|
|
|
}
|
|
|
}, {
|
|
|
key: "render",
|
|
|
value: function render() {
|
|
|
var _this2 = this;
|
|
|
|
|
|
return React.createElement(DndContext.Consumer, null, function (_ref) {
|
|
|
var dragDropManager = _ref.dragDropManager;
|
|
|
|
|
|
if (dragDropManager === undefined) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
_this2.receiveDragDropManager(dragDropManager); // Let componentDidMount fire to initialize the collected state
|
|
|
|
|
|
|
|
|
if (!_this2.isCurrentlyMounted) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return React.createElement(Decorated, Object.assign({}, _this2.props, _this2.state, {
|
|
|
ref: isRefable(Decorated) ? _this2.ref : null
|
|
|
}));
|
|
|
});
|
|
|
}
|
|
|
}, {
|
|
|
key: "receiveDragDropManager",
|
|
|
value: function receiveDragDropManager(dragDropManager) {
|
|
|
if (this.manager !== undefined) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
this.manager = dragDropManager;
|
|
|
invariant(_typeof$7(dragDropManager) === 'object', 'Could not find the drag and drop manager in the context of %s. ' + 'Make sure to render a DndProvider component in your top-level component. ' + 'Read more: http://react-dnd.github.io/react-dnd/docs/troubleshooting#could-not-find-the-drag-and-drop-manager-in-the-context', displayName, displayName);
|
|
|
var monitor = this.manager.getMonitor();
|
|
|
this.unsubscribeFromOffsetChange = monitor.subscribeToOffsetChange(this.handleChange);
|
|
|
this.unsubscribeFromStateChange = monitor.subscribeToStateChange(this.handleChange);
|
|
|
}
|
|
|
}, {
|
|
|
key: "getCurrentState",
|
|
|
value: function getCurrentState() {
|
|
|
if (!this.manager) {
|
|
|
return {};
|
|
|
}
|
|
|
|
|
|
var monitor = this.manager.getMonitor();
|
|
|
return collect(monitor, this.props);
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DragLayerContainer;
|
|
|
}(React.Component);
|
|
|
|
|
|
DragLayerContainer.displayName = "DragLayer(".concat(displayName, ")");
|
|
|
DragLayerContainer.DecoratedComponent = DecoratedComponent;
|
|
|
return hoistNonReactStatics_cjs(DragLayerContainer, DecoratedComponent);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
exports.DndContext = DndContext;
|
|
|
exports.DndProvider = DndProvider;
|
|
|
exports.DragLayer = DragLayer;
|
|
|
exports.DragPreviewImage = DragPreviewImage;
|
|
|
exports.DragSource = DragSource;
|
|
|
exports.DropTarget = DropTarget;
|
|
|
exports.createDndContext = createDndContext;
|
|
|
exports.useDrag = useDrag;
|
|
|
exports.useDragLayer = useDragLayer;
|
|
|
exports.useDrop = useDrop;
|
|
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
|
|
})));
|