InlineSubMenuList.js 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  3. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  4. import * as React from 'react';
  5. import CSSMotion from 'rc-motion';
  6. import { getMotion } from "../utils/motionUtil";
  7. import MenuContextProvider, { MenuContext } from "../context/MenuContext";
  8. import SubMenuList from "./SubMenuList";
  9. export default function InlineSubMenuList(_ref) {
  10. var id = _ref.id,
  11. open = _ref.open,
  12. keyPath = _ref.keyPath,
  13. children = _ref.children;
  14. var fixedMode = 'inline';
  15. var _React$useContext = React.useContext(MenuContext),
  16. prefixCls = _React$useContext.prefixCls,
  17. forceSubMenuRender = _React$useContext.forceSubMenuRender,
  18. motion = _React$useContext.motion,
  19. defaultMotions = _React$useContext.defaultMotions,
  20. mode = _React$useContext.mode;
  21. // Always use latest mode check
  22. var sameModeRef = React.useRef(false);
  23. sameModeRef.current = mode === fixedMode;
  24. // We record `destroy` mark here since when mode change from `inline` to others.
  25. // The inline list should remove when motion end.
  26. var _React$useState = React.useState(!sameModeRef.current),
  27. _React$useState2 = _slicedToArray(_React$useState, 2),
  28. destroy = _React$useState2[0],
  29. setDestroy = _React$useState2[1];
  30. var mergedOpen = sameModeRef.current ? open : false;
  31. // ================================= Effect =================================
  32. // Reset destroy state when mode change back
  33. React.useEffect(function () {
  34. if (sameModeRef.current) {
  35. setDestroy(false);
  36. }
  37. }, [mode]);
  38. // ================================= Render =================================
  39. var mergedMotion = _objectSpread({}, getMotion(fixedMode, motion, defaultMotions));
  40. // No need appear since nest inlineCollapse changed
  41. if (keyPath.length > 1) {
  42. mergedMotion.motionAppear = false;
  43. }
  44. // Hide inline list when mode changed and motion end
  45. var originOnVisibleChanged = mergedMotion.onVisibleChanged;
  46. mergedMotion.onVisibleChanged = function (newVisible) {
  47. if (!sameModeRef.current && !newVisible) {
  48. setDestroy(true);
  49. }
  50. return originOnVisibleChanged === null || originOnVisibleChanged === void 0 ? void 0 : originOnVisibleChanged(newVisible);
  51. };
  52. if (destroy) {
  53. return null;
  54. }
  55. return /*#__PURE__*/React.createElement(MenuContextProvider, {
  56. mode: fixedMode,
  57. locked: !sameModeRef.current
  58. }, /*#__PURE__*/React.createElement(CSSMotion, _extends({
  59. visible: mergedOpen
  60. }, mergedMotion, {
  61. forceRender: forceSubMenuRender,
  62. removeOnLeave: false,
  63. leavedClassName: "".concat(prefixCls, "-hidden")
  64. }), function (_ref2) {
  65. var motionClassName = _ref2.className,
  66. motionStyle = _ref2.style;
  67. return /*#__PURE__*/React.createElement(SubMenuList, {
  68. id: id,
  69. className: motionClassName,
  70. style: motionStyle
  71. }, children);
  72. }));
  73. }