shineout
Version:
Shein 前端组件库
162 lines (128 loc) • 6.01 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _immer = _interopRequireDefault(require("immer"));
var _styles = require("./styles");
var _uid = require("../utils/uid");
var _default = function _default(Origin) {
var _temp;
return _temp =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2.default)(Resizable, _React$Component);
function Resizable(props) {
var _this;
_this = _React$Component.call(this, props) || this;
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resizableId", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handlers", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "active", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "appended", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "size", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "el", void 0);
_this.state = {
x: 0,
y: 0
};
_this.resizableId = (0, _uid.getUidStr)();
_this.handleMouseUp = _this.handleMouseUp.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleMouseMove = _this.handleMouseMove.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
return _this;
}
var _proto = Resizable.prototype;
_proto.componentDidMount = function componentDidMount() {
this.appendHandler();
};
_proto.componentDidUpdate = function componentDidUpdate() {
if (this.props.resizable) {
this.appendHandler();
}
};
_proto.componentWillUnmount = function componentWillUnmount() {
if (this.handlers) {
this.handlers.forEach(function (action, handler) {
return handler.removeEventListener('mousedown', action);
});
}
};
_proto.getStyle = function getStyle() {
var _this$state = this.state,
x = _this$state.x,
y = _this$state.y;
if (!this.size) return undefined;
return {
width: this.size.width + x,
height: this.size.height + y
};
};
_proto.handleMouseMove = function handleMouseMove(e) {
var _this2 = this;
var x = e.movementX;
var y = e.movementY;
if (!this.active) return;
this.setState((0, _immer.default)(function (draft) {
x += draft.x;
y += draft.y;
if (_this2.active.indexOf('x') >= 0) draft.x = x;
if (_this2.active.indexOf('y') >= 0) draft.y = y;
}));
};
_proto.handleMouseDown = function handleMouseDown(dir) {
this.active = dir;
document.addEventListener('mousemove', this.handleMouseMove);
document.addEventListener('mouseup', this.handleMouseUp);
document.addEventListener('mouseleave', this.handleMouseUp);
};
_proto.handleMouseUp = function handleMouseUp() {
this.active = undefined;
document.removeEventListener('mousemove', this.handleMouseMove);
document.removeEventListener('mouseup', this.handleMouseUp);
document.removeEventListener('mouseleave', this.handleMouseUp);
};
_proto.appendHandler = function appendHandler() {
var _this3 = this;
var resizable = this.props.resizable;
if (!resizable || this.appended) return;
this.appended = true;
this.el = document.querySelector("." + (0, _styles.resizableClass)(this.resizableId));
if (!this.el) return;
this.size = {
width: this.el.clientWidth,
height: this.el.clientHeight
};
this.handlers = new Map();
['x', 'y', 'xy'].forEach(function (dir) {
if (typeof resizable === 'string' && resizable !== dir) return;
var handler = document.createElement('div');
var action = _this3.handleMouseDown.bind(_this3, dir);
handler.className = (0, _styles.resizableClass)('handler', "handler-" + dir);
handler.addEventListener('mousedown', action);
_this3.el.appendChild(handler);
_this3.handlers.set(handler, action);
});
};
_proto.render = function render() {
var _this$props = this.props,
resizable = _this$props.resizable,
className = _this$props.className,
style = _this$props.style,
others = (0, _objectWithoutPropertiesLoose2.default)(_this$props, ["resizable", "className", "style"]);
if (!resizable) return _react.default.createElement(Origin, this.props);
var ms = Object.assign({}, style, this.getStyle());
var mc = (0, _classnames.default)(className, (0, _styles.resizableClass)('_', this.resizableId));
return _react.default.createElement(Origin, (0, _extends2.default)({}, others, {
style: ms,
className: mc
}));
};
return Resizable;
}(_react.default.Component), _temp;
};
exports.default = _default;