index.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. var _typeof = require("@babel/runtime/helpers/typeof");
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  11. var _classnames = _interopRequireDefault(require("classnames"));
  12. var _contains = _interopRequireDefault(require("rc-util/lib/Dom/contains"));
  13. var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
  14. var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode"));
  15. var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs"));
  16. var _react = _interopRequireWildcard(require("react"));
  17. var React = _react;
  18. var _util = require("../util");
  19. var _Content = _interopRequireDefault(require("./Content"));
  20. var _Mask = _interopRequireDefault(require("./Mask"));
  21. var _warning = require("rc-util/lib/warning");
  22. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
  23. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  24. var Dialog = function Dialog(props) {
  25. var _props$prefixCls = props.prefixCls,
  26. prefixCls = _props$prefixCls === void 0 ? 'rc-dialog' : _props$prefixCls,
  27. zIndex = props.zIndex,
  28. _props$visible = props.visible,
  29. visible = _props$visible === void 0 ? false : _props$visible,
  30. _props$keyboard = props.keyboard,
  31. keyboard = _props$keyboard === void 0 ? true : _props$keyboard,
  32. _props$focusTriggerAf = props.focusTriggerAfterClose,
  33. focusTriggerAfterClose = _props$focusTriggerAf === void 0 ? true : _props$focusTriggerAf,
  34. wrapStyle = props.wrapStyle,
  35. wrapClassName = props.wrapClassName,
  36. wrapProps = props.wrapProps,
  37. onClose = props.onClose,
  38. afterOpenChange = props.afterOpenChange,
  39. afterClose = props.afterClose,
  40. transitionName = props.transitionName,
  41. animation = props.animation,
  42. _props$closable = props.closable,
  43. closable = _props$closable === void 0 ? true : _props$closable,
  44. _props$mask = props.mask,
  45. mask = _props$mask === void 0 ? true : _props$mask,
  46. maskTransitionName = props.maskTransitionName,
  47. maskAnimation = props.maskAnimation,
  48. _props$maskClosable = props.maskClosable,
  49. maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable,
  50. maskStyle = props.maskStyle,
  51. maskProps = props.maskProps,
  52. rootClassName = props.rootClassName,
  53. modalClassNames = props.classNames,
  54. modalStyles = props.styles;
  55. if (process.env.NODE_ENV !== 'production') {
  56. ['wrapStyle', 'bodyStyle', 'maskStyle'].forEach(function (prop) {
  57. // (prop in props) && console.error(`Warning: ${prop} is deprecated, please use styles instead.`)
  58. (0, _warning.warning)(!(prop in props), "".concat(prop, " is deprecated, please use styles instead."));
  59. });
  60. if ('wrapClassName' in props) {
  61. (0, _warning.warning)(false, "wrapClassName is deprecated, please use classNames instead.");
  62. }
  63. }
  64. var lastOutSideActiveElementRef = (0, _react.useRef)();
  65. var wrapperRef = (0, _react.useRef)();
  66. var contentRef = (0, _react.useRef)();
  67. var _React$useState = React.useState(visible),
  68. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  69. animatedVisible = _React$useState2[0],
  70. setAnimatedVisible = _React$useState2[1];
  71. // ========================== Init ==========================
  72. var ariaId = (0, _useId.default)();
  73. function saveLastOutSideActiveElementRef() {
  74. if (!(0, _contains.default)(wrapperRef.current, document.activeElement)) {
  75. lastOutSideActiveElementRef.current = document.activeElement;
  76. }
  77. }
  78. function focusDialogContent() {
  79. if (!(0, _contains.default)(wrapperRef.current, document.activeElement)) {
  80. var _contentRef$current;
  81. (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 || _contentRef$current.focus();
  82. }
  83. }
  84. // ========================= Events =========================
  85. function onDialogVisibleChanged(newVisible) {
  86. // Try to focus
  87. if (newVisible) {
  88. focusDialogContent();
  89. } else {
  90. // Clean up scroll bar & focus back
  91. setAnimatedVisible(false);
  92. if (mask && lastOutSideActiveElementRef.current && focusTriggerAfterClose) {
  93. try {
  94. lastOutSideActiveElementRef.current.focus({
  95. preventScroll: true
  96. });
  97. } catch (e) {
  98. // Do nothing
  99. }
  100. lastOutSideActiveElementRef.current = null;
  101. }
  102. // Trigger afterClose only when change visible from true to false
  103. if (animatedVisible) {
  104. afterClose === null || afterClose === void 0 || afterClose();
  105. }
  106. }
  107. afterOpenChange === null || afterOpenChange === void 0 || afterOpenChange(newVisible);
  108. }
  109. function onInternalClose(e) {
  110. onClose === null || onClose === void 0 || onClose(e);
  111. }
  112. // >>> Content
  113. var contentClickRef = (0, _react.useRef)(false);
  114. var contentTimeoutRef = (0, _react.useRef)();
  115. // We need record content click incase content popup out of dialog
  116. var onContentMouseDown = function onContentMouseDown() {
  117. clearTimeout(contentTimeoutRef.current);
  118. contentClickRef.current = true;
  119. };
  120. var onContentMouseUp = function onContentMouseUp() {
  121. contentTimeoutRef.current = setTimeout(function () {
  122. contentClickRef.current = false;
  123. });
  124. };
  125. // >>> Wrapper
  126. // Close only when element not on dialog
  127. var onWrapperClick = null;
  128. if (maskClosable) {
  129. onWrapperClick = function onWrapperClick(e) {
  130. if (contentClickRef.current) {
  131. contentClickRef.current = false;
  132. } else if (wrapperRef.current === e.target) {
  133. onInternalClose(e);
  134. }
  135. };
  136. }
  137. function onWrapperKeyDown(e) {
  138. if (keyboard && e.keyCode === _KeyCode.default.ESC) {
  139. e.stopPropagation();
  140. onInternalClose(e);
  141. return;
  142. }
  143. // keep focus inside dialog
  144. if (visible && e.keyCode === _KeyCode.default.TAB) {
  145. contentRef.current.changeActive(!e.shiftKey);
  146. }
  147. }
  148. // ========================= Effect =========================
  149. (0, _react.useEffect)(function () {
  150. if (visible) {
  151. setAnimatedVisible(true);
  152. saveLastOutSideActiveElementRef();
  153. }
  154. }, [visible]);
  155. // Remove direct should also check the scroll bar update
  156. (0, _react.useEffect)(function () {
  157. return function () {
  158. clearTimeout(contentTimeoutRef.current);
  159. };
  160. }, []);
  161. var mergedStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
  162. zIndex: zIndex
  163. }, wrapStyle), modalStyles === null || modalStyles === void 0 ? void 0 : modalStyles.wrapper), {}, {
  164. display: !animatedVisible ? 'none' : null
  165. });
  166. // ========================= Render =========================
  167. return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
  168. className: (0, _classnames.default)("".concat(prefixCls, "-root"), rootClassName)
  169. }, (0, _pickAttrs.default)(props, {
  170. data: true
  171. })), /*#__PURE__*/React.createElement(_Mask.default, {
  172. prefixCls: prefixCls,
  173. visible: mask && visible,
  174. motionName: (0, _util.getMotionName)(prefixCls, maskTransitionName, maskAnimation),
  175. style: (0, _objectSpread2.default)((0, _objectSpread2.default)({
  176. zIndex: zIndex
  177. }, maskStyle), modalStyles === null || modalStyles === void 0 ? void 0 : modalStyles.mask),
  178. maskProps: maskProps,
  179. className: modalClassNames === null || modalClassNames === void 0 ? void 0 : modalClassNames.mask
  180. }), /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
  181. tabIndex: -1,
  182. onKeyDown: onWrapperKeyDown,
  183. className: (0, _classnames.default)("".concat(prefixCls, "-wrap"), wrapClassName, modalClassNames === null || modalClassNames === void 0 ? void 0 : modalClassNames.wrapper),
  184. ref: wrapperRef,
  185. onClick: onWrapperClick,
  186. style: mergedStyle
  187. }, wrapProps), /*#__PURE__*/React.createElement(_Content.default, (0, _extends2.default)({}, props, {
  188. onMouseDown: onContentMouseDown,
  189. onMouseUp: onContentMouseUp,
  190. ref: contentRef,
  191. closable: closable,
  192. ariaId: ariaId,
  193. prefixCls: prefixCls,
  194. visible: visible && animatedVisible,
  195. onClose: onInternalClose,
  196. onVisibleChanged: onDialogVisibleChanged,
  197. motionName: (0, _util.getMotionName)(prefixCls, transitionName, animation)
  198. }))));
  199. };
  200. var _default = exports.default = Dialog;