UNPKG

@zhangmmm/ming-ui

Version:
377 lines (318 loc) 12 kB
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck'; import _createClass from '@babel/runtime/helpers/esm/createClass'; import _possibleConstructorReturn from '@babel/runtime/helpers/esm/possibleConstructorReturn'; import _getPrototypeOf from '@babel/runtime/helpers/esm/getPrototypeOf'; import _inherits from '@babel/runtime/helpers/esm/inherits'; import React from 'react'; import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties'; import { createPortal } from 'react-dom'; import classNames from 'classnames'; import { CloseCircleOutlined, ZoomInOutlined, ZoomOutOutlined, ExpandOutlined, CompressOutlined, RotateLeftOutlined, RotateRightOutlined } from '@ant-design/icons'; var ConfigContext = React.createContext({ getPrefixCls: function getPrefixCls(suffixCls, customizePrefixCls) { if (customizePrefixCls) return customizePrefixCls; return "ming-".concat(suffixCls); } }); var ConfigConsumer = ConfigContext.Consumer; var SizeContext = React.createContext(undefined); var SizeContextProvider = function SizeContextProvider(_ref) { var children = _ref.children, size = _ref.size; return React.createElement(SizeContext.Consumer, null, function (originSize) { return React.createElement(SizeContext.Provider, { value: size || originSize }, children); }); }; 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; } var ConfigProvider = /*#__PURE__*/function (_React$Component) { _inherits(ConfigProvider, _React$Component); function ConfigProvider() { var _this; _classCallCheck(this, ConfigProvider); _this = _possibleConstructorReturn(this, _getPrototypeOf(ConfigProvider).apply(this, arguments)); _this.getPrefixCls = function (suffixCls, customizePrefixCls) { var _this$props$prefixCls = _this.props.prefixCls, prefixCls = _this$props$prefixCls === void 0 ? 'ming' : _this$props$prefixCls; if (customizePrefixCls) return customizePrefixCls; return suffixCls ? "".concat(prefixCls, "-").concat(suffixCls) : prefixCls; }; _this.renderProvider = function (context) { var _this$props = _this.props, componentSize = _this$props.componentSize, children = _this$props.children; var config = _objectSpread({}, context, { getPrefixCls: _this.getPrefixCls }); return React.createElement(SizeContextProvider, { size: componentSize }, React.createElement(ConfigContext.Provider, { value: config }, children)); }; return _this; } _createClass(ConfigProvider, [{ key: "render", value: function render() { var _this2 = this; return React.createElement(ConfigConsumer, null, function (context) { return _this2.renderProvider(context); }); } }]); return ConfigProvider; }(React.Component); var Mode = { CONTAIN: { name: 'contain', icon: 'el-icon-full-screen' }, ORIGINAL: { name: 'original', icon: 'el-icon-c-scale-to-original' } }; var Preview = /*#__PURE__*/function (_React$Component) { _inherits(Preview, _React$Component); function Preview(props) { var _this; _classCallCheck(this, Preview); _this = _possibleConstructorReturn(this, _getPrototypeOf(Preview).call(this, props)); _this.toggleMode = function (isContain) { _this.reset(); _this.setState({ mode: isContain ? Mode.ORIGINAL : Mode.CONTAIN }); }; _this.reset = function () { _this.setState({ mode: Mode.CONTAIN, transform: { scale: 1, deg: 0 } }); }; _this.handleActions = function (type) { var _this$state$transform = _this.state.transform, scale = _this$state$transform.scale, deg = _this$state$transform.deg; var ZOOM_RARE = 0.2; var ROTATE_DEG = 90; switch (type) { case 'zoomIn': scale = parseFloat((scale + ZOOM_RARE).toFixed(3)); break; case 'zoomOut': if (scale > 0.2) scale = parseFloat((scale - ZOOM_RARE).toFixed(3)); break; case 'turnLeft': deg -= ROTATE_DEG; break; case 'turnRight': deg += ROTATE_DEG; break; } _this.setState({ transform: { scale: scale, deg: deg } }); }; _this.handleClose = function () { _this.props.changePreviewState(false); _this.reset(); }; _this.state = { mode: Mode.CONTAIN, transform: { scale: 1, deg: 0 } }; return _this; } _createClass(Preview, [{ key: "render", value: function render() { var _this2 = this; var getPrefixCls = this.context.getPrefixCls; var _this$props = this.props, src = _this$props.src, show = _this$props.show, zIndex = _this$props.zIndex; var _this$state = this.state, mode = _this$state.mode, transform = _this$state.transform; var body = document.getElementsByTagName('body')[0]; var isContain = mode === Mode.CONTAIN; var imgCls = getPrefixCls('image-preview-img'); return createPortal(React.createElement("div", { className: getPrefixCls('image-preview'), style: { display: show ? 'block' : 'none', zIndex: zIndex } }, React.createElement("div", { className: getPrefixCls('image-preview-mask') }), React.createElement(CloseCircleOutlined, { className: getPrefixCls('image-preview-close'), onClick: this.handleClose }), React.createElement("div", { className: getPrefixCls('image-preview-viewer') }, React.createElement("img", { src: src, className: classNames(imgCls, _defineProperty({}, "".concat(imgCls, "-").concat(mode.name), mode.name)), style: { transform: "scale(".concat(transform.scale, ") rotate(").concat(transform.deg, "deg)") }, alt: "" })), React.createElement("div", { className: getPrefixCls('image-preview-actions') }, React.createElement(ZoomInOutlined, { onClick: function onClick() { return _this2.handleActions('zoomIn'); } }), React.createElement(ZoomOutOutlined, { onClick: function onClick() { return _this2.handleActions('zoomOut'); } }), isContain ? React.createElement(ExpandOutlined, { onClick: function onClick() { _this2.toggleMode(isContain); } }) : React.createElement(CompressOutlined, { onClick: function onClick() { _this2.toggleMode(isContain); } }), React.createElement(RotateLeftOutlined, { onClick: function onClick() { return _this2.handleActions('turnLeft'); } }), React.createElement(RotateRightOutlined, { onClick: function onClick() { return _this2.handleActions('turnRight'); } }))), body); } }]); return Preview; }(React.Component); Preview.contextType = ConfigContext; var Img = /*#__PURE__*/function (_React$Component) { _inherits(Img, _React$Component); function Img(props) { var _this; _classCallCheck(this, Img); _this = _possibleConstructorReturn(this, _getPrototypeOf(Img).call(this, props)); _this.handleLoad = function (e, img) { _this.setState({ loading: false, imageWidth: img.width, imageHeight: img.height }); }; _this.handleError = function () { _this.setState({ isError: true, loading: false }); }; // check validity of image url before showing _this.loadImage = function () { var img = new Image(); img.onload = function (e) { return _this.handleLoad(e, img); }; img.onerror = function () { return _this.handleError(); }; img.src = _this.props.src; }; _this.changePreviewState = function (state) { // lock screen when previewing document.documentElement.style.overflow = state ? 'hidden' : 'auto'; _this.setState({ isPreview: state }); }; _this.handlePreview = function () { return _this.changePreviewState(true); }; _this.renderImage = function (_ref) { var getPrefixCls = _ref.getPrefixCls; var _this$props = _this.props, src = _this$props.src, alt = _this$props.alt, _this$props$fit = _this$props.fit, fit = _this$props$fit === void 0 ? 'fill' : _this$props$fit, _this$props$preview = _this$props.preview, preview = _this$props$preview === void 0 ? false : _this$props$preview, _this$props$zIndex = _this$props.zIndex, zIndex = _this$props$zIndex === void 0 ? 2000 : _this$props$zIndex, _this$props$placehold = _this$props.placeholder, placeholder = _this$props$placehold === void 0 ? '加载中...' : _this$props$placehold, _this$props$error = _this$props.error, error = _this$props$error === void 0 ? '加载失败' : _this$props$error, rest = _objectWithoutProperties(_this$props, ["src", "alt", "fit", "preview", "zIndex", "placeholder", "error"]); var _this$state = _this.state, loading = _this$state.loading, isError = _this$state.isError, isPreview = _this$state.isPreview; var canPreview = preview === true; var imageStyle = { objectFit: fit, cursor: canPreview ? 'pointer' : 'default' }; return React.createElement("div", Object.assign({ className: getPrefixCls('image') }, rest), loading && React.createElement("div", { className: getPrefixCls('image-placeholder') }, placeholder), isError && React.createElement("div", { className: getPrefixCls('image-error') }, error), !loading && !isError && React.createElement("img", { src: src, className: getPrefixCls('image-inner'), style: imageStyle, alt: alt, onClick: _this.handlePreview }), canPreview && React.createElement(Preview, { src: src, show: isPreview, zIndex: zIndex, changePreviewState: _this.changePreviewState })); }; _this.state = { isError: false, loading: true, imageWidth: 0, imageHeight: 0, isPreview: false }; return _this; } _createClass(Img, [{ key: "componentDidMount", value: function componentDidMount() { this.loadImage(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { // remove document style before unmounting document.documentElement.style.overflow = ''; } }, { key: "render", value: function render() { return React.createElement(ConfigConsumer, null, this.renderImage); } }]); return Img; }(React.Component); export { ConfigProvider, Img as Image };