You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = wrapConnectorHooks;
|
|
|
|
var _react = require("react");
|
|
|
|
var _cloneWithRef = require("../utils/cloneWithRef");
|
|
|
|
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 (!(0, _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 (0, _cloneWithRef.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;
|
|
} |