wix-style-react
Version:
184 lines (145 loc) • 7.72 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _utils = require("wix-ui-core/dist/src/utils");
var _constants = require("./constants");
var _DropzoneSt = require("./Dropzone.st.css");
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/** Defines a region in the page where files can be dropped */
var Dropzone = /*#__PURE__*/function (_React$PureComponent) {
(0, _inherits2["default"])(Dropzone, _React$PureComponent);
var _super = _createSuper(Dropzone);
function Dropzone() {
var _this;
(0, _classCallCheck2["default"])(this, Dropzone);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
isDragActive: false
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_dragEventCounter", 0);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_eventHasFiles", function (event) {
/** DataTransfer object is defined here: https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer */
return event.dataTransfer ? Array.from(event.dataTransfer.items).some(function (item) {
return item.kind === 'file';
}) : !!(event.target && event.target.files);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onDragEnter", function (event) {
Dropzone._overrideEventDefaults(event);
_this._dragEventCounter++;
/** We only want to show the overlay when files are dragged over the dropzone */
return _this._eventHasFiles(event) && _this.setState({
isDragActive: true
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onDragLeave", function (event) {
Dropzone._overrideEventDefaults(event);
_this._dragEventCounter--;
return _this._dragEventCounter === 0 && _this.setState({
isDragActive: false
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onDrop", function (event) {
Dropzone._overrideEventDefaults(event);
_this._dragEventCounter = 0;
if (_this._eventHasFiles(event)) {
var files = event.dataTransfer ? Array.from(event.dataTransfer.items).map(function (item) {
return item.getAsFile();
}) : event.target.files;
_this.setState({
isDragActive: false
});
return _this.props.onDrop(files);
}
});
return _this;
}
(0, _createClass2["default"])(Dropzone, [{
key: "render",
value: function render() {
var _this$props = this.props,
children = _this$props.children,
dataHook = _this$props.dataHook,
className = _this$props.className;
var isDragActive = this.state.isDragActive;
var childrenObj = (0, _utils.buildChildrenObject)(children, {
Content: null,
Overlay: null
});
return /*#__PURE__*/_react["default"].createElement("div", {
"data-hook": dataHook,
className: (0, _DropzoneSt.st)(_DropzoneSt.classes.root, className),
onDrop: this._onDrop,
onDragEnter: this._onDragEnter,
onDragLeave: this._onDragLeave,
onDragOver: Dropzone._overrideEventDefaults
}, isDragActive && childrenObj.Overlay, childrenObj.Content);
}
}]);
return Dropzone;
}(_react["default"].PureComponent);
(0, _defineProperty2["default"])(Dropzone, "displayName", 'Dropzone');
(0, _defineProperty2["default"])(Dropzone, "propTypes", {
/** Applies a data-hook HTML attribute that can be used in the tests. */
dataHook: _propTypes["default"].string,
/** Specifies a CSS class name to be appended to the component’s root element. */
className: _propTypes["default"].string,
/** Defines an event handler which is called when files are dropped over the dropzone. Dropped files are supplied as an argument to the function. */
onDrop: _propTypes["default"].func.isRequired,
/** Accepts `<Dropzone.Overlay />` or `<Dropzone.Content />`. Both of them can contain any required content. */
children: function children(props, propName) {
var childrenArr = _react["default"].Children.toArray(props[propName]);
var childrenObj = (0, _utils.buildChildrenObject)(childrenArr, {
Overlay: null,
Content: null
});
if (!childrenObj.Content) {
return new Error('Invalid children provided, <Dropzone.Content /> must be provided');
}
if (!childrenObj.Overlay) {
return new Error('Invalid children provided, <Dropzone.Overlay /> must be provided');
}
return childrenArr.reduce(function (err, child) {
if (!err && child.type.displayName !== 'Dropzone.Content' && child.type.displayName !== 'Dropzone.Overlay') {
return new Error("Invalid children provided, unknown child <".concat(child.type.displayName || child.type, " /> supplied"));
}
return err;
}, false);
}
});
(0, _defineProperty2["default"])(Dropzone, "Overlay", function (_ref) {
var children = _ref.children;
return /*#__PURE__*/_react["default"].createElement("div", {
"data-hook": _constants.dataHooks.dropzoneOverlay,
className: _DropzoneSt.classes.dropzoneOverlay
}, children);
});
(0, _defineProperty2["default"])(Dropzone, "Content", function (_ref2) {
var children = _ref2.children;
return /*#__PURE__*/_react["default"].createElement("div", {
"data-hook": _constants.dataHooks.dropzoneContent
}, children);
});
(0, _defineProperty2["default"])(Dropzone, "_overrideEventDefaults", function (event) {
event.preventDefault();
event.stopPropagation();
});
Dropzone.Content.displayName = 'Dropzone.Content';
Dropzone.Overlay.displayName = 'Dropzone.Overlay';
var _default = Dropzone;
exports["default"] = _default;