Modal.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. "use strict";
  2. "use client";
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  5. Object.defineProperty(exports, "__esModule", {
  6. value: true
  7. });
  8. exports.default = void 0;
  9. var React = _interopRequireWildcard(require("react"));
  10. var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons/CloseOutlined"));
  11. var _classnames = _interopRequireDefault(require("classnames"));
  12. var _rcDialog = _interopRequireDefault(require("rc-dialog"));
  13. var _ref = require("rc-util/lib/ref");
  14. var _ContextIsolator = _interopRequireDefault(require("../_util/ContextIsolator"));
  15. var _useClosable = _interopRequireWildcard(require("../_util/hooks/useClosable"));
  16. var _useZIndex = require("../_util/hooks/useZIndex");
  17. var _motion = require("../_util/motion");
  18. var _styleChecker = require("../_util/styleChecker");
  19. var _warning = require("../_util/warning");
  20. var _zindexContext = _interopRequireDefault(require("../_util/zindexContext"));
  21. var _configProvider = require("../config-provider");
  22. var _useCSSVarCls = _interopRequireDefault(require("../config-provider/hooks/useCSSVarCls"));
  23. var _skeleton = _interopRequireDefault(require("../skeleton"));
  24. var _context = require("../watermark/context");
  25. var _shared = require("./shared");
  26. var _style = _interopRequireDefault(require("./style"));
  27. var __rest = void 0 && (void 0).__rest || function (s, e) {
  28. var t = {};
  29. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  30. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  31. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  32. }
  33. return t;
  34. };
  35. let mousePosition;
  36. // ref: https://github.com/ant-design/ant-design/issues/15795
  37. const getClickPosition = e => {
  38. mousePosition = {
  39. x: e.pageX,
  40. y: e.pageY
  41. };
  42. // 100ms 内发生过点击事件,则从点击位置动画展示
  43. // 否则直接 zoom 展示
  44. // 这样可以兼容非点击方式展开
  45. setTimeout(() => {
  46. mousePosition = null;
  47. }, 100);
  48. };
  49. // 只有点击事件支持从鼠标位置动画展开
  50. if ((0, _styleChecker.canUseDocElement)()) {
  51. document.documentElement.addEventListener('click', getClickPosition, true);
  52. }
  53. const Modal = props => {
  54. const {
  55. prefixCls: customizePrefixCls,
  56. className,
  57. rootClassName,
  58. open,
  59. wrapClassName,
  60. centered,
  61. getContainer,
  62. focusTriggerAfterClose = true,
  63. style,
  64. // Deprecated
  65. visible,
  66. width = 520,
  67. footer,
  68. classNames: modalClassNames,
  69. styles: modalStyles,
  70. children,
  71. loading,
  72. confirmLoading,
  73. zIndex: customizeZIndex,
  74. mousePosition: customizeMousePosition,
  75. onOk,
  76. onCancel,
  77. destroyOnHidden,
  78. destroyOnClose,
  79. panelRef = null
  80. } = props,
  81. restProps = __rest(props, ["prefixCls", "className", "rootClassName", "open", "wrapClassName", "centered", "getContainer", "focusTriggerAfterClose", "style", "visible", "width", "footer", "classNames", "styles", "children", "loading", "confirmLoading", "zIndex", "mousePosition", "onOk", "onCancel", "destroyOnHidden", "destroyOnClose", "panelRef"]);
  82. const {
  83. getPopupContainer: getContextPopupContainer,
  84. getPrefixCls,
  85. direction,
  86. modal: modalContext
  87. } = React.useContext(_configProvider.ConfigContext);
  88. const handleCancel = e => {
  89. if (confirmLoading) {
  90. return;
  91. }
  92. onCancel === null || onCancel === void 0 ? void 0 : onCancel(e);
  93. };
  94. const handleOk = e => {
  95. onOk === null || onOk === void 0 ? void 0 : onOk(e);
  96. };
  97. if (process.env.NODE_ENV !== 'production') {
  98. const warning = (0, _warning.devUseWarning)('Modal');
  99. [['visible', 'open'], ['bodyStyle', 'styles.body'], ['maskStyle', 'styles.mask'], ['destroyOnClose', 'destroyOnHidden']].forEach(([deprecatedName, newName]) => {
  100. warning.deprecated(!(deprecatedName in props), deprecatedName, newName);
  101. });
  102. }
  103. const prefixCls = getPrefixCls('modal', customizePrefixCls);
  104. const rootPrefixCls = getPrefixCls();
  105. // Style
  106. const rootCls = (0, _useCSSVarCls.default)(prefixCls);
  107. const [wrapCSSVar, hashId, cssVarCls] = (0, _style.default)(prefixCls, rootCls);
  108. const wrapClassNameExtended = (0, _classnames.default)(wrapClassName, {
  109. [`${prefixCls}-centered`]: centered !== null && centered !== void 0 ? centered : modalContext === null || modalContext === void 0 ? void 0 : modalContext.centered,
  110. [`${prefixCls}-wrap-rtl`]: direction === 'rtl'
  111. });
  112. const dialogFooter = footer !== null && !loading ? (/*#__PURE__*/React.createElement(_shared.Footer, Object.assign({}, props, {
  113. onOk: handleOk,
  114. onCancel: handleCancel
  115. }))) : null;
  116. const [mergedClosable, mergedCloseIcon, closeBtnIsDisabled, ariaProps] = (0, _useClosable.default)((0, _useClosable.pickClosable)(props), (0, _useClosable.pickClosable)(modalContext), {
  117. closable: true,
  118. closeIcon: /*#__PURE__*/React.createElement(_CloseOutlined.default, {
  119. className: `${prefixCls}-close-icon`
  120. }),
  121. closeIconRender: icon => (0, _shared.renderCloseIcon)(prefixCls, icon)
  122. });
  123. // ============================ Refs ============================
  124. // Select `ant-modal-content` by `panelRef`
  125. const innerPanelRef = (0, _context.usePanelRef)(`.${prefixCls}-content`);
  126. const mergedPanelRef = (0, _ref.composeRef)(panelRef, innerPanelRef);
  127. // ============================ zIndex ============================
  128. const [zIndex, contextZIndex] = (0, _useZIndex.useZIndex)('Modal', customizeZIndex);
  129. // =========================== Width ============================
  130. const [numWidth, responsiveWidth] = React.useMemo(() => {
  131. if (width && typeof width === 'object') {
  132. return [undefined, width];
  133. }
  134. return [width, undefined];
  135. }, [width]);
  136. const responsiveWidthVars = React.useMemo(() => {
  137. const vars = {};
  138. if (responsiveWidth) {
  139. Object.keys(responsiveWidth).forEach(breakpoint => {
  140. const breakpointWidth = responsiveWidth[breakpoint];
  141. if (breakpointWidth !== undefined) {
  142. vars[`--${prefixCls}-${breakpoint}-width`] = typeof breakpointWidth === 'number' ? `${breakpointWidth}px` : breakpointWidth;
  143. }
  144. });
  145. }
  146. return vars;
  147. }, [responsiveWidth]);
  148. // =========================== Render ===========================
  149. return wrapCSSVar(/*#__PURE__*/React.createElement(_ContextIsolator.default, {
  150. form: true,
  151. space: true
  152. }, /*#__PURE__*/React.createElement(_zindexContext.default.Provider, {
  153. value: contextZIndex
  154. }, /*#__PURE__*/React.createElement(_rcDialog.default, Object.assign({
  155. width: numWidth
  156. }, restProps, {
  157. zIndex: zIndex,
  158. getContainer: getContainer === undefined ? getContextPopupContainer : getContainer,
  159. prefixCls: prefixCls,
  160. rootClassName: (0, _classnames.default)(hashId, rootClassName, cssVarCls, rootCls),
  161. footer: dialogFooter,
  162. visible: open !== null && open !== void 0 ? open : visible,
  163. mousePosition: customizeMousePosition !== null && customizeMousePosition !== void 0 ? customizeMousePosition : mousePosition,
  164. onClose: handleCancel,
  165. closable: mergedClosable ? Object.assign({
  166. disabled: closeBtnIsDisabled,
  167. closeIcon: mergedCloseIcon
  168. }, ariaProps) : mergedClosable,
  169. closeIcon: mergedCloseIcon,
  170. focusTriggerAfterClose: focusTriggerAfterClose,
  171. transitionName: (0, _motion.getTransitionName)(rootPrefixCls, 'zoom', props.transitionName),
  172. maskTransitionName: (0, _motion.getTransitionName)(rootPrefixCls, 'fade', props.maskTransitionName),
  173. className: (0, _classnames.default)(hashId, className, modalContext === null || modalContext === void 0 ? void 0 : modalContext.className),
  174. style: Object.assign(Object.assign(Object.assign({}, modalContext === null || modalContext === void 0 ? void 0 : modalContext.style), style), responsiveWidthVars),
  175. classNames: Object.assign(Object.assign(Object.assign({}, modalContext === null || modalContext === void 0 ? void 0 : modalContext.classNames), modalClassNames), {
  176. wrapper: (0, _classnames.default)(wrapClassNameExtended, modalClassNames === null || modalClassNames === void 0 ? void 0 : modalClassNames.wrapper)
  177. }),
  178. styles: Object.assign(Object.assign({}, modalContext === null || modalContext === void 0 ? void 0 : modalContext.styles), modalStyles),
  179. panelRef: mergedPanelRef,
  180. // TODO: In the future, destroyOnClose in rc-dialog needs to be upgrade to destroyOnHidden
  181. destroyOnClose: destroyOnHidden !== null && destroyOnHidden !== void 0 ? destroyOnHidden : destroyOnClose
  182. }), loading ? (/*#__PURE__*/React.createElement(_skeleton.default, {
  183. active: true,
  184. title: false,
  185. paragraph: {
  186. rows: 4
  187. },
  188. className: `${prefixCls}-body-skeleton`
  189. })) : children))));
  190. };
  191. var _default = exports.default = Modal;