DrawerPopup.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _classnames = _interopRequireDefault(require("classnames"));
  13. var _rcMotion = _interopRequireDefault(require("rc-motion"));
  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 _context = _interopRequireDefault(require("./context"));
  18. var _DrawerPanel = _interopRequireDefault(require("./DrawerPanel"));
  19. var _util = require("./util");
  20. var sentinelStyle = {
  21. width: 0,
  22. height: 0,
  23. overflow: 'hidden',
  24. outline: 'none',
  25. position: 'absolute'
  26. };
  27. function DrawerPopup(props, ref) {
  28. var _ref, _pushConfig$distance, _pushConfig;
  29. var prefixCls = props.prefixCls,
  30. open = props.open,
  31. placement = props.placement,
  32. inline = props.inline,
  33. push = props.push,
  34. forceRender = props.forceRender,
  35. autoFocus = props.autoFocus,
  36. keyboard = props.keyboard,
  37. drawerClassNames = props.classNames,
  38. rootClassName = props.rootClassName,
  39. rootStyle = props.rootStyle,
  40. zIndex = props.zIndex,
  41. className = props.className,
  42. id = props.id,
  43. style = props.style,
  44. motion = props.motion,
  45. width = props.width,
  46. height = props.height,
  47. children = props.children,
  48. mask = props.mask,
  49. maskClosable = props.maskClosable,
  50. maskMotion = props.maskMotion,
  51. maskClassName = props.maskClassName,
  52. maskStyle = props.maskStyle,
  53. afterOpenChange = props.afterOpenChange,
  54. onClose = props.onClose,
  55. onMouseEnter = props.onMouseEnter,
  56. onMouseOver = props.onMouseOver,
  57. onMouseLeave = props.onMouseLeave,
  58. onClick = props.onClick,
  59. onKeyDown = props.onKeyDown,
  60. onKeyUp = props.onKeyUp,
  61. styles = props.styles,
  62. drawerRender = props.drawerRender;
  63. // ================================ Refs ================================
  64. var panelRef = React.useRef();
  65. var sentinelStartRef = React.useRef();
  66. var sentinelEndRef = React.useRef();
  67. React.useImperativeHandle(ref, function () {
  68. return panelRef.current;
  69. });
  70. var onPanelKeyDown = function onPanelKeyDown(event) {
  71. var keyCode = event.keyCode,
  72. shiftKey = event.shiftKey;
  73. switch (keyCode) {
  74. // Tab active
  75. case _KeyCode.default.TAB:
  76. {
  77. if (keyCode === _KeyCode.default.TAB) {
  78. if (!shiftKey && document.activeElement === sentinelEndRef.current) {
  79. var _sentinelStartRef$cur;
  80. (_sentinelStartRef$cur = sentinelStartRef.current) === null || _sentinelStartRef$cur === void 0 || _sentinelStartRef$cur.focus({
  81. preventScroll: true
  82. });
  83. } else if (shiftKey && document.activeElement === sentinelStartRef.current) {
  84. var _sentinelEndRef$curre;
  85. (_sentinelEndRef$curre = sentinelEndRef.current) === null || _sentinelEndRef$curre === void 0 || _sentinelEndRef$curre.focus({
  86. preventScroll: true
  87. });
  88. }
  89. }
  90. break;
  91. }
  92. // Close
  93. case _KeyCode.default.ESC:
  94. {
  95. if (onClose && keyboard) {
  96. event.stopPropagation();
  97. onClose(event);
  98. }
  99. break;
  100. }
  101. }
  102. };
  103. // ========================== Control ===========================
  104. // Auto Focus
  105. React.useEffect(function () {
  106. if (open && autoFocus) {
  107. var _panelRef$current;
  108. (_panelRef$current = panelRef.current) === null || _panelRef$current === void 0 || _panelRef$current.focus({
  109. preventScroll: true
  110. });
  111. }
  112. }, [open]);
  113. // ============================ Push ============================
  114. var _React$useState = React.useState(false),
  115. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  116. pushed = _React$useState2[0],
  117. setPushed = _React$useState2[1];
  118. var parentContext = React.useContext(_context.default);
  119. // Merge push distance
  120. var pushConfig;
  121. if (typeof push === 'boolean') {
  122. pushConfig = push ? {} : {
  123. distance: 0
  124. };
  125. } else {
  126. pushConfig = push || {};
  127. }
  128. var pushDistance = (_ref = (_pushConfig$distance = (_pushConfig = pushConfig) === null || _pushConfig === void 0 ? void 0 : _pushConfig.distance) !== null && _pushConfig$distance !== void 0 ? _pushConfig$distance : parentContext === null || parentContext === void 0 ? void 0 : parentContext.pushDistance) !== null && _ref !== void 0 ? _ref : 180;
  129. var mergedContext = React.useMemo(function () {
  130. return {
  131. pushDistance: pushDistance,
  132. push: function push() {
  133. setPushed(true);
  134. },
  135. pull: function pull() {
  136. setPushed(false);
  137. }
  138. };
  139. }, [pushDistance]);
  140. // ========================= ScrollLock =========================
  141. // Tell parent to push
  142. React.useEffect(function () {
  143. if (open) {
  144. var _parentContext$push;
  145. parentContext === null || parentContext === void 0 || (_parentContext$push = parentContext.push) === null || _parentContext$push === void 0 || _parentContext$push.call(parentContext);
  146. } else {
  147. var _parentContext$pull;
  148. parentContext === null || parentContext === void 0 || (_parentContext$pull = parentContext.pull) === null || _parentContext$pull === void 0 || _parentContext$pull.call(parentContext);
  149. }
  150. }, [open]);
  151. // Clean up
  152. React.useEffect(function () {
  153. return function () {
  154. var _parentContext$pull2;
  155. parentContext === null || parentContext === void 0 || (_parentContext$pull2 = parentContext.pull) === null || _parentContext$pull2 === void 0 || _parentContext$pull2.call(parentContext);
  156. };
  157. }, []);
  158. // ============================ Mask ============================
  159. var maskNode = /*#__PURE__*/React.createElement(_rcMotion.default, (0, _extends2.default)({
  160. key: "mask"
  161. }, maskMotion, {
  162. visible: mask && open
  163. }), function (_ref2, maskRef) {
  164. var motionMaskClassName = _ref2.className,
  165. motionMaskStyle = _ref2.style;
  166. return /*#__PURE__*/React.createElement("div", {
  167. className: (0, _classnames.default)("".concat(prefixCls, "-mask"), motionMaskClassName, drawerClassNames === null || drawerClassNames === void 0 ? void 0 : drawerClassNames.mask, maskClassName),
  168. style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, motionMaskStyle), maskStyle), styles === null || styles === void 0 ? void 0 : styles.mask),
  169. onClick: maskClosable && open ? onClose : undefined,
  170. ref: maskRef
  171. });
  172. });
  173. // =========================== Panel ============================
  174. var motionProps = typeof motion === 'function' ? motion(placement) : motion;
  175. var wrapperStyle = {};
  176. if (pushed && pushDistance) {
  177. switch (placement) {
  178. case 'top':
  179. wrapperStyle.transform = "translateY(".concat(pushDistance, "px)");
  180. break;
  181. case 'bottom':
  182. wrapperStyle.transform = "translateY(".concat(-pushDistance, "px)");
  183. break;
  184. case 'left':
  185. wrapperStyle.transform = "translateX(".concat(pushDistance, "px)");
  186. break;
  187. default:
  188. wrapperStyle.transform = "translateX(".concat(-pushDistance, "px)");
  189. break;
  190. }
  191. }
  192. if (placement === 'left' || placement === 'right') {
  193. wrapperStyle.width = (0, _util.parseWidthHeight)(width);
  194. } else {
  195. wrapperStyle.height = (0, _util.parseWidthHeight)(height);
  196. }
  197. var eventHandlers = {
  198. onMouseEnter: onMouseEnter,
  199. onMouseOver: onMouseOver,
  200. onMouseLeave: onMouseLeave,
  201. onClick: onClick,
  202. onKeyDown: onKeyDown,
  203. onKeyUp: onKeyUp
  204. };
  205. var panelNode = /*#__PURE__*/React.createElement(_rcMotion.default, (0, _extends2.default)({
  206. key: "panel"
  207. }, motionProps, {
  208. visible: open,
  209. forceRender: forceRender,
  210. onVisibleChanged: function onVisibleChanged(nextVisible) {
  211. afterOpenChange === null || afterOpenChange === void 0 || afterOpenChange(nextVisible);
  212. },
  213. removeOnLeave: false,
  214. leavedClassName: "".concat(prefixCls, "-content-wrapper-hidden")
  215. }), function (_ref3, motionRef) {
  216. var motionClassName = _ref3.className,
  217. motionStyle = _ref3.style;
  218. var content = /*#__PURE__*/React.createElement(_DrawerPanel.default, (0, _extends2.default)({
  219. id: id,
  220. containerRef: motionRef,
  221. prefixCls: prefixCls,
  222. className: (0, _classnames.default)(className, drawerClassNames === null || drawerClassNames === void 0 ? void 0 : drawerClassNames.content),
  223. style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), styles === null || styles === void 0 ? void 0 : styles.content)
  224. }, (0, _pickAttrs.default)(props, {
  225. aria: true
  226. }), eventHandlers), children);
  227. return /*#__PURE__*/React.createElement("div", (0, _extends2.default)({
  228. className: (0, _classnames.default)("".concat(prefixCls, "-content-wrapper"), drawerClassNames === null || drawerClassNames === void 0 ? void 0 : drawerClassNames.wrapper, motionClassName),
  229. style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, wrapperStyle), motionStyle), styles === null || styles === void 0 ? void 0 : styles.wrapper)
  230. }, (0, _pickAttrs.default)(props, {
  231. data: true
  232. })), drawerRender ? drawerRender(content) : content);
  233. });
  234. // =========================== Render ===========================
  235. var containerStyle = (0, _objectSpread2.default)({}, rootStyle);
  236. if (zIndex) {
  237. containerStyle.zIndex = zIndex;
  238. }
  239. return /*#__PURE__*/React.createElement(_context.default.Provider, {
  240. value: mergedContext
  241. }, /*#__PURE__*/React.createElement("div", {
  242. className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-").concat(placement), rootClassName, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-open"), open), "".concat(prefixCls, "-inline"), inline)),
  243. style: containerStyle,
  244. tabIndex: -1,
  245. ref: panelRef,
  246. onKeyDown: onPanelKeyDown
  247. }, maskNode, /*#__PURE__*/React.createElement("div", {
  248. tabIndex: 0,
  249. ref: sentinelStartRef,
  250. style: sentinelStyle,
  251. "aria-hidden": "true",
  252. "data-sentinel": "start"
  253. }), panelNode, /*#__PURE__*/React.createElement("div", {
  254. tabIndex: 0,
  255. ref: sentinelEndRef,
  256. style: sentinelStyle,
  257. "aria-hidden": "true",
  258. "data-sentinel": "end"
  259. })));
  260. }
  261. var RefDrawerPopup = /*#__PURE__*/React.forwardRef(DrawerPopup);
  262. if (process.env.NODE_ENV !== 'production') {
  263. RefDrawerPopup.displayName = 'DrawerPopup';
  264. }
  265. var _default = exports.default = RefDrawerPopup;