PreviewGroup.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  3. import _typeof from "@babel/runtime/helpers/esm/typeof";
  4. import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
  5. var _excluded = ["visible", "onVisibleChange", "getContainer", "current", "movable", "minScale", "maxScale", "countRender", "closeIcon", "onChange", "onTransform", "toolbarRender", "imageRender"],
  6. _excluded2 = ["src"];
  7. import useMergedState from "rc-util/es/hooks/useMergedState";
  8. import * as React from 'react';
  9. import { useState } from 'react';
  10. import Preview from "./Preview";
  11. import { PreviewGroupContext } from "./context";
  12. import usePreviewItems from "./hooks/usePreviewItems";
  13. var Group = function Group(_ref) {
  14. var _mergedItems$current;
  15. var _ref$previewPrefixCls = _ref.previewPrefixCls,
  16. previewPrefixCls = _ref$previewPrefixCls === void 0 ? 'rc-image-preview' : _ref$previewPrefixCls,
  17. children = _ref.children,
  18. _ref$icons = _ref.icons,
  19. icons = _ref$icons === void 0 ? {} : _ref$icons,
  20. items = _ref.items,
  21. preview = _ref.preview,
  22. fallback = _ref.fallback;
  23. var _ref2 = _typeof(preview) === 'object' ? preview : {},
  24. previewVisible = _ref2.visible,
  25. onVisibleChange = _ref2.onVisibleChange,
  26. getContainer = _ref2.getContainer,
  27. currentIndex = _ref2.current,
  28. movable = _ref2.movable,
  29. minScale = _ref2.minScale,
  30. maxScale = _ref2.maxScale,
  31. countRender = _ref2.countRender,
  32. closeIcon = _ref2.closeIcon,
  33. onChange = _ref2.onChange,
  34. onTransform = _ref2.onTransform,
  35. toolbarRender = _ref2.toolbarRender,
  36. imageRender = _ref2.imageRender,
  37. dialogProps = _objectWithoutProperties(_ref2, _excluded);
  38. // ========================== Items ===========================
  39. var _usePreviewItems = usePreviewItems(items),
  40. _usePreviewItems2 = _slicedToArray(_usePreviewItems, 3),
  41. mergedItems = _usePreviewItems2[0],
  42. register = _usePreviewItems2[1],
  43. fromItems = _usePreviewItems2[2];
  44. // ========================= Preview ==========================
  45. // >>> Index
  46. var _useMergedState = useMergedState(0, {
  47. value: currentIndex
  48. }),
  49. _useMergedState2 = _slicedToArray(_useMergedState, 2),
  50. current = _useMergedState2[0],
  51. setCurrent = _useMergedState2[1];
  52. var _useState = useState(false),
  53. _useState2 = _slicedToArray(_useState, 2),
  54. keepOpenIndex = _useState2[0],
  55. setKeepOpenIndex = _useState2[1];
  56. // >>> Image
  57. var _ref3 = ((_mergedItems$current = mergedItems[current]) === null || _mergedItems$current === void 0 ? void 0 : _mergedItems$current.data) || {},
  58. src = _ref3.src,
  59. imgCommonProps = _objectWithoutProperties(_ref3, _excluded2);
  60. // >>> Visible
  61. var _useMergedState3 = useMergedState(!!previewVisible, {
  62. value: previewVisible,
  63. onChange: function onChange(val, prevVal) {
  64. onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(val, prevVal, current);
  65. }
  66. }),
  67. _useMergedState4 = _slicedToArray(_useMergedState3, 2),
  68. isShowPreview = _useMergedState4[0],
  69. setShowPreview = _useMergedState4[1];
  70. // >>> Position
  71. var _useState3 = useState(null),
  72. _useState4 = _slicedToArray(_useState3, 2),
  73. mousePosition = _useState4[0],
  74. setMousePosition = _useState4[1];
  75. var onPreviewFromImage = React.useCallback(function (id, imageSrc, mouseX, mouseY) {
  76. var index = fromItems ? mergedItems.findIndex(function (item) {
  77. return item.data.src === imageSrc;
  78. }) : mergedItems.findIndex(function (item) {
  79. return item.id === id;
  80. });
  81. setCurrent(index < 0 ? 0 : index);
  82. setShowPreview(true);
  83. setMousePosition({
  84. x: mouseX,
  85. y: mouseY
  86. });
  87. setKeepOpenIndex(true);
  88. }, [mergedItems, fromItems]);
  89. // Reset current when reopen
  90. React.useEffect(function () {
  91. if (isShowPreview) {
  92. if (!keepOpenIndex) {
  93. setCurrent(0);
  94. }
  95. } else {
  96. setKeepOpenIndex(false);
  97. }
  98. }, [isShowPreview]);
  99. // ========================== Events ==========================
  100. var onInternalChange = function onInternalChange(next, prev) {
  101. setCurrent(next);
  102. onChange === null || onChange === void 0 || onChange(next, prev);
  103. };
  104. var onPreviewClose = function onPreviewClose() {
  105. setShowPreview(false);
  106. setMousePosition(null);
  107. };
  108. // ========================= Context ==========================
  109. var previewGroupContext = React.useMemo(function () {
  110. return {
  111. register: register,
  112. onPreview: onPreviewFromImage
  113. };
  114. }, [register, onPreviewFromImage]);
  115. // ========================== Render ==========================
  116. return /*#__PURE__*/React.createElement(PreviewGroupContext.Provider, {
  117. value: previewGroupContext
  118. }, children, /*#__PURE__*/React.createElement(Preview, _extends({
  119. "aria-hidden": !isShowPreview,
  120. movable: movable,
  121. visible: isShowPreview,
  122. prefixCls: previewPrefixCls,
  123. closeIcon: closeIcon,
  124. onClose: onPreviewClose,
  125. mousePosition: mousePosition,
  126. imgCommonProps: imgCommonProps,
  127. src: src,
  128. fallback: fallback,
  129. icons: icons,
  130. minScale: minScale,
  131. maxScale: maxScale,
  132. getContainer: getContainer,
  133. current: current,
  134. count: mergedItems.length,
  135. countRender: countRender,
  136. onTransform: onTransform,
  137. toolbarRender: toolbarRender,
  138. imageRender: imageRender,
  139. onChange: onInternalChange
  140. }, dialogProps)));
  141. };
  142. export default Group;