UNPKG

shineout

Version:

Shein 前端组件库

160 lines (132 loc) 4.91 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; 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 _immer = _interopRequireDefault(require("immer")); var _Spin = _interopRequireDefault(require("../Spin")); var _styles = require("./styles"); var _component = require("../component"); var Magnify = /*#__PURE__*/ function (_PureComponent) { (0, _inheritsLoose2.default)(Magnify, _PureComponent); function Magnify(props) { var _this; _this = _PureComponent.call(this, props) || this; (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "element", void 0); _this.state = { loading: true, status: 0, style: { maxHeight: props.maxHeight, maxWidth: props.maxWidth } }; _this.handleMove = _this.handleMove.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.handleResize = _this.handleResize.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); _this.handleLoaded = _this.handleLoaded.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); return _this; } var _proto = Magnify.prototype; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { if (prevProps.src !== this.props.src && this.state.status === 1) { // eslint-disable-next-line this.setState({ loading: true, status: 0, style: { maxHeight: this.props.maxHeight, maxWidth: this.props.maxWidth } }); this.props.lockScroll(false); } }; _proto.move = function move(clientX, clientY) { var rect = this.element.getBoundingClientRect(); var image = this.element.querySelector('img'); var width = rect.width - 100; var height = rect.height - 100; var x = (clientX - rect.left - 50) / width; var y = (clientY - rect.top - 50) / height; this.element.scrollTop = (image.offsetHeight - height) * y; this.element.scrollLeft = (image.offsetWidth - width) * x; }; _proto.handleLoaded = function handleLoaded() { this.setState({ loading: false }); }; _proto.handleMove = function handleMove(e) { this.move(e.clientX, e.clientY); }; _proto.handleResize = function handleResize(e) { var _this2 = this; var _this$props = this.props, maxHeight = _this$props.maxHeight, maxWidth = _this$props.maxWidth, position = _this$props.position; if (position !== 'center') return; var status = this.state.status === 1 ? 0 : 1; var clientX = e.clientX, clientY = e.clientY; this.setState((0, _immer.default)(function (state) { state.status = status; state.style = status === 0 ? { maxHeight: maxHeight, maxWidth: maxWidth } : undefined; }), function () { if (status === 0) return; _this2.move(clientX, clientY); }); this.props.lockScroll(status === 1); }; _proto.render = function render() { var _this3 = this; var _this$props2 = this.props, maxHeight = _this$props2.maxHeight, maxWidth = _this$props2.maxWidth, src = _this$props2.src; var _this$state = this.state, status = _this$state.status, loading = _this$state.loading; // eslint-disable-next-line var cursor = this.props.position === 'center' ? status === 1 ? 'zoom-out' : 'zoom-in' : 'pointer'; var style = { maxHeight: maxHeight, maxWidth: maxWidth, cursor: cursor }; if (status === 1) { style.overflow = 'scroll'; style.borderRightWidth = 0; style.borderBottomWidth = 0; } var onMouseMove = status === 1 ? this.handleMove : undefined; return _react.default.createElement("div", { onClick: this.handleResize, onMouseMove: onMouseMove, ref: function ref(el) { _this3.element = el; }, style: style, className: (0, _styles.imageClass)('magnify') }, _react.default.createElement("img", { onLoad: this.handleLoaded, src: src, alt: "", style: this.state.style }), loading && _react.default.createElement("div", { className: (0, _styles.imageClass)('magnify-loading') }, _react.default.createElement(_Spin.default, { size: 30 }))); }; return Magnify; }(_component.PureComponent); var _default = Magnify; exports.default = _default;