Image.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  3. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  4. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  5. import _typeof from "@babel/runtime/helpers/esm/typeof";
  6. import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
  7. var _excluded = ["src", "alt", "onPreviewClose", "prefixCls", "previewPrefixCls", "placeholder", "fallback", "width", "height", "style", "preview", "className", "onClick", "onError", "wrapperClassName", "wrapperStyle", "rootClassName"],
  8. _excluded2 = ["src", "visible", "onVisibleChange", "getContainer", "mask", "maskClassName", "movable", "icons", "scaleStep", "minScale", "maxScale", "imageRender", "toolbarRender"];
  9. import cn from 'classnames';
  10. import { getOffset } from "rc-util/es/Dom/css";
  11. import useMergedState from "rc-util/es/hooks/useMergedState";
  12. import * as React from 'react';
  13. import { useContext, useMemo, useState } from 'react';
  14. import Preview from "./Preview";
  15. import PreviewGroup from "./PreviewGroup";
  16. import { COMMON_PROPS } from "./common";
  17. import { PreviewGroupContext } from "./context";
  18. import useRegisterImage from "./hooks/useRegisterImage";
  19. import useStatus from "./hooks/useStatus";
  20. var ImageInternal = function ImageInternal(props) {
  21. var imgSrc = props.src,
  22. alt = props.alt,
  23. onInitialPreviewClose = props.onPreviewClose,
  24. _props$prefixCls = props.prefixCls,
  25. prefixCls = _props$prefixCls === void 0 ? 'rc-image' : _props$prefixCls,
  26. _props$previewPrefixC = props.previewPrefixCls,
  27. previewPrefixCls = _props$previewPrefixC === void 0 ? "".concat(prefixCls, "-preview") : _props$previewPrefixC,
  28. placeholder = props.placeholder,
  29. fallback = props.fallback,
  30. width = props.width,
  31. height = props.height,
  32. style = props.style,
  33. _props$preview = props.preview,
  34. preview = _props$preview === void 0 ? true : _props$preview,
  35. className = props.className,
  36. onClick = props.onClick,
  37. onError = props.onError,
  38. wrapperClassName = props.wrapperClassName,
  39. wrapperStyle = props.wrapperStyle,
  40. rootClassName = props.rootClassName,
  41. otherProps = _objectWithoutProperties(props, _excluded);
  42. var isCustomPlaceholder = placeholder && placeholder !== true;
  43. var _ref = _typeof(preview) === 'object' ? preview : {},
  44. previewSrc = _ref.src,
  45. _ref$visible = _ref.visible,
  46. previewVisible = _ref$visible === void 0 ? undefined : _ref$visible,
  47. _ref$onVisibleChange = _ref.onVisibleChange,
  48. onPreviewVisibleChange = _ref$onVisibleChange === void 0 ? onInitialPreviewClose : _ref$onVisibleChange,
  49. _ref$getContainer = _ref.getContainer,
  50. getPreviewContainer = _ref$getContainer === void 0 ? undefined : _ref$getContainer,
  51. previewMask = _ref.mask,
  52. maskClassName = _ref.maskClassName,
  53. movable = _ref.movable,
  54. icons = _ref.icons,
  55. scaleStep = _ref.scaleStep,
  56. minScale = _ref.minScale,
  57. maxScale = _ref.maxScale,
  58. imageRender = _ref.imageRender,
  59. toolbarRender = _ref.toolbarRender,
  60. dialogProps = _objectWithoutProperties(_ref, _excluded2);
  61. var src = previewSrc !== null && previewSrc !== void 0 ? previewSrc : imgSrc;
  62. var _useMergedState = useMergedState(!!previewVisible, {
  63. value: previewVisible,
  64. onChange: onPreviewVisibleChange
  65. }),
  66. _useMergedState2 = _slicedToArray(_useMergedState, 2),
  67. isShowPreview = _useMergedState2[0],
  68. setShowPreview = _useMergedState2[1];
  69. var _useStatus = useStatus({
  70. src: imgSrc,
  71. isCustomPlaceholder: isCustomPlaceholder,
  72. fallback: fallback
  73. }),
  74. _useStatus2 = _slicedToArray(_useStatus, 3),
  75. getImgRef = _useStatus2[0],
  76. srcAndOnload = _useStatus2[1],
  77. status = _useStatus2[2];
  78. var _useState = useState(null),
  79. _useState2 = _slicedToArray(_useState, 2),
  80. mousePosition = _useState2[0],
  81. setMousePosition = _useState2[1];
  82. var groupContext = useContext(PreviewGroupContext);
  83. var canPreview = !!preview;
  84. var onPreviewClose = function onPreviewClose() {
  85. setShowPreview(false);
  86. setMousePosition(null);
  87. };
  88. var wrapperClass = cn(prefixCls, wrapperClassName, rootClassName, _defineProperty({}, "".concat(prefixCls, "-error"), status === 'error'));
  89. // ========================= ImageProps =========================
  90. var imgCommonProps = useMemo(function () {
  91. var obj = {};
  92. COMMON_PROPS.forEach(function (prop) {
  93. if (props[prop] !== undefined) {
  94. obj[prop] = props[prop];
  95. }
  96. });
  97. return obj;
  98. }, COMMON_PROPS.map(function (prop) {
  99. return props[prop];
  100. }));
  101. // ========================== Register ==========================
  102. var registerData = useMemo(function () {
  103. return _objectSpread(_objectSpread({}, imgCommonProps), {}, {
  104. src: src
  105. });
  106. }, [src, imgCommonProps]);
  107. var imageId = useRegisterImage(canPreview, registerData);
  108. // ========================== Preview ===========================
  109. var onPreview = function onPreview(e) {
  110. var _getOffset = getOffset(e.target),
  111. left = _getOffset.left,
  112. top = _getOffset.top;
  113. if (groupContext) {
  114. groupContext.onPreview(imageId, src, left, top);
  115. } else {
  116. setMousePosition({
  117. x: left,
  118. y: top
  119. });
  120. setShowPreview(true);
  121. }
  122. onClick === null || onClick === void 0 || onClick(e);
  123. };
  124. // =========================== Render ===========================
  125. return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", _extends({}, otherProps, {
  126. className: wrapperClass,
  127. onClick: canPreview ? onPreview : onClick,
  128. style: _objectSpread({
  129. width: width,
  130. height: height
  131. }, wrapperStyle)
  132. }), /*#__PURE__*/React.createElement("img", _extends({}, imgCommonProps, {
  133. className: cn("".concat(prefixCls, "-img"), _defineProperty({}, "".concat(prefixCls, "-img-placeholder"), placeholder === true), className),
  134. style: _objectSpread({
  135. height: height
  136. }, style),
  137. ref: getImgRef
  138. }, srcAndOnload, {
  139. width: width,
  140. height: height,
  141. onError: onError
  142. })), status === 'loading' && /*#__PURE__*/React.createElement("div", {
  143. "aria-hidden": "true",
  144. className: "".concat(prefixCls, "-placeholder")
  145. }, placeholder), previewMask && canPreview && /*#__PURE__*/React.createElement("div", {
  146. className: cn("".concat(prefixCls, "-mask"), maskClassName),
  147. style: {
  148. display: (style === null || style === void 0 ? void 0 : style.display) === 'none' ? 'none' : undefined
  149. }
  150. }, previewMask)), !groupContext && canPreview && /*#__PURE__*/React.createElement(Preview, _extends({
  151. "aria-hidden": !isShowPreview,
  152. visible: isShowPreview,
  153. prefixCls: previewPrefixCls,
  154. onClose: onPreviewClose,
  155. mousePosition: mousePosition,
  156. src: src,
  157. alt: alt,
  158. imageInfo: {
  159. width: width,
  160. height: height
  161. },
  162. fallback: fallback,
  163. getContainer: getPreviewContainer,
  164. icons: icons,
  165. movable: movable,
  166. scaleStep: scaleStep,
  167. minScale: minScale,
  168. maxScale: maxScale,
  169. rootClassName: rootClassName,
  170. imageRender: imageRender,
  171. imgCommonProps: imgCommonProps,
  172. toolbarRender: toolbarRender
  173. }, dialogProps)));
  174. };
  175. ImageInternal.PreviewGroup = PreviewGroup;
  176. if (process.env.NODE_ENV !== 'production') {
  177. ImageInternal.displayName = 'Image';
  178. }
  179. export default ImageInternal;