Tour.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  13. var React = _interopRequireWildcard(require("react"));
  14. var _portal = _interopRequireDefault(require("@rc-component/portal"));
  15. var _trigger = _interopRequireDefault(require("@rc-component/trigger"));
  16. var _classnames = _interopRequireDefault(require("classnames"));
  17. var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
  18. var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
  19. var _useClosable = require("./hooks/useClosable");
  20. var _useTarget3 = _interopRequireDefault(require("./hooks/useTarget"));
  21. var _Mask = _interopRequireDefault(require("./Mask"));
  22. var _placements = require("./placements");
  23. var _TourStep = _interopRequireDefault(require("./TourStep"));
  24. var _util = require("./util");
  25. var _excluded = ["prefixCls", "steps", "defaultCurrent", "current", "onChange", "onClose", "onFinish", "open", "mask", "arrow", "rootClassName", "placement", "renderPanel", "gap", "animated", "scrollIntoViewOptions", "zIndex", "closeIcon", "closable", "builtinPlacements", "disabledInteraction"];
  26. var CENTER_PLACEHOLDER = {
  27. left: '50%',
  28. top: '50%',
  29. width: 1,
  30. height: 1
  31. };
  32. var defaultScrollIntoViewOptions = {
  33. block: 'center',
  34. inline: 'center'
  35. };
  36. var Tour = function Tour(props) {
  37. var _props$prefixCls = props.prefixCls,
  38. prefixCls = _props$prefixCls === void 0 ? 'rc-tour' : _props$prefixCls,
  39. _props$steps = props.steps,
  40. steps = _props$steps === void 0 ? [] : _props$steps,
  41. defaultCurrent = props.defaultCurrent,
  42. current = props.current,
  43. onChange = props.onChange,
  44. onClose = props.onClose,
  45. _onFinish = props.onFinish,
  46. open = props.open,
  47. _props$mask = props.mask,
  48. mask = _props$mask === void 0 ? true : _props$mask,
  49. _props$arrow = props.arrow,
  50. arrow = _props$arrow === void 0 ? true : _props$arrow,
  51. rootClassName = props.rootClassName,
  52. placement = props.placement,
  53. renderPanel = props.renderPanel,
  54. gap = props.gap,
  55. animated = props.animated,
  56. _props$scrollIntoView = props.scrollIntoViewOptions,
  57. scrollIntoViewOptions = _props$scrollIntoView === void 0 ? defaultScrollIntoViewOptions : _props$scrollIntoView,
  58. _props$zIndex = props.zIndex,
  59. zIndex = _props$zIndex === void 0 ? 1001 : _props$zIndex,
  60. closeIcon = props.closeIcon,
  61. closable = props.closable,
  62. builtinPlacements = props.builtinPlacements,
  63. disabledInteraction = props.disabledInteraction,
  64. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  65. var triggerRef = React.useRef();
  66. var _useMergedState = (0, _useMergedState5.default)(0, {
  67. value: current,
  68. defaultValue: defaultCurrent
  69. }),
  70. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  71. mergedCurrent = _useMergedState2[0],
  72. setMergedCurrent = _useMergedState2[1];
  73. var _useMergedState3 = (0, _useMergedState5.default)(undefined, {
  74. value: open,
  75. postState: function postState(origin) {
  76. return mergedCurrent < 0 || mergedCurrent >= steps.length ? false : origin !== null && origin !== void 0 ? origin : true;
  77. }
  78. }),
  79. _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
  80. mergedOpen = _useMergedState4[0],
  81. setMergedOpen = _useMergedState4[1];
  82. // Record if already rended in the DOM to avoid `findDOMNode` issue
  83. var _React$useState = React.useState(mergedOpen),
  84. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  85. hasOpened = _React$useState2[0],
  86. setHasOpened = _React$useState2[1];
  87. var openRef = React.useRef(mergedOpen);
  88. (0, _useLayoutEffect.default)(function () {
  89. if (mergedOpen) {
  90. if (!openRef.current) {
  91. setMergedCurrent(0);
  92. }
  93. setHasOpened(true);
  94. }
  95. openRef.current = mergedOpen;
  96. }, [mergedOpen]);
  97. var _ref = steps[mergedCurrent] || {},
  98. target = _ref.target,
  99. stepPlacement = _ref.placement,
  100. stepStyle = _ref.style,
  101. stepArrow = _ref.arrow,
  102. stepClassName = _ref.className,
  103. stepMask = _ref.mask,
  104. _ref$scrollIntoViewOp = _ref.scrollIntoViewOptions,
  105. stepScrollIntoViewOptions = _ref$scrollIntoViewOp === void 0 ? defaultScrollIntoViewOptions : _ref$scrollIntoViewOp,
  106. stepCloseIcon = _ref.closeIcon,
  107. stepClosable = _ref.closable;
  108. var mergedClosable = (0, _useClosable.useClosable)(stepClosable, stepCloseIcon, closable, closeIcon);
  109. var mergedMask = mergedOpen && (stepMask !== null && stepMask !== void 0 ? stepMask : mask);
  110. var mergedScrollIntoViewOptions = stepScrollIntoViewOptions !== null && stepScrollIntoViewOptions !== void 0 ? stepScrollIntoViewOptions : scrollIntoViewOptions;
  111. var _useTarget = (0, _useTarget3.default)(target, open, gap, mergedScrollIntoViewOptions),
  112. _useTarget2 = (0, _slicedToArray2.default)(_useTarget, 2),
  113. posInfo = _useTarget2[0],
  114. targetElement = _useTarget2[1];
  115. var mergedPlacement = (0, _util.getPlacement)(targetElement, placement, stepPlacement);
  116. // ========================= arrow =========================
  117. var mergedArrow = targetElement ? typeof stepArrow === 'undefined' ? arrow : stepArrow : false;
  118. var arrowPointAtCenter = (0, _typeof2.default)(mergedArrow) === 'object' ? mergedArrow.pointAtCenter : false;
  119. (0, _useLayoutEffect.default)(function () {
  120. var _triggerRef$current;
  121. (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.forceAlign();
  122. }, [arrowPointAtCenter, mergedCurrent]);
  123. // ========================= Change =========================
  124. var onInternalChange = function onInternalChange(nextCurrent) {
  125. setMergedCurrent(nextCurrent);
  126. onChange === null || onChange === void 0 ? void 0 : onChange(nextCurrent);
  127. };
  128. var mergedBuiltinPlacements = (0, React.useMemo)(function () {
  129. if (builtinPlacements) {
  130. return typeof builtinPlacements === 'function' ? builtinPlacements({
  131. arrowPointAtCenter: arrowPointAtCenter
  132. }) : builtinPlacements;
  133. }
  134. return (0, _placements.getPlacements)(arrowPointAtCenter);
  135. }, [builtinPlacements, arrowPointAtCenter]);
  136. // ========================= Render =========================
  137. // Skip if not init yet
  138. if (targetElement === undefined || !hasOpened) {
  139. return null;
  140. }
  141. var handleClose = function handleClose() {
  142. setMergedOpen(false);
  143. onClose === null || onClose === void 0 ? void 0 : onClose(mergedCurrent);
  144. };
  145. var getPopupElement = function getPopupElement() {
  146. return /*#__PURE__*/React.createElement(_TourStep.default, (0, _extends2.default)({
  147. arrow: mergedArrow,
  148. key: "content",
  149. prefixCls: prefixCls,
  150. total: steps.length,
  151. renderPanel: renderPanel,
  152. onPrev: function onPrev() {
  153. onInternalChange(mergedCurrent - 1);
  154. },
  155. onNext: function onNext() {
  156. onInternalChange(mergedCurrent + 1);
  157. },
  158. onClose: handleClose,
  159. current: mergedCurrent,
  160. onFinish: function onFinish() {
  161. handleClose();
  162. _onFinish === null || _onFinish === void 0 ? void 0 : _onFinish();
  163. }
  164. }, steps[mergedCurrent], {
  165. closable: mergedClosable
  166. }));
  167. };
  168. var mergedShowMask = typeof mergedMask === 'boolean' ? mergedMask : !!mergedMask;
  169. var mergedMaskStyle = typeof mergedMask === 'boolean' ? undefined : mergedMask;
  170. // when targetElement is not exist, use body as triggerDOMNode
  171. var getTriggerDOMNode = function getTriggerDOMNode(node) {
  172. return node || targetElement || document.body;
  173. };
  174. return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_Mask.default, {
  175. zIndex: zIndex,
  176. prefixCls: prefixCls,
  177. pos: posInfo,
  178. showMask: mergedShowMask,
  179. style: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.style,
  180. fill: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.color,
  181. open: mergedOpen,
  182. animated: animated,
  183. rootClassName: rootClassName,
  184. disabledInteraction: disabledInteraction
  185. }), /*#__PURE__*/React.createElement(_trigger.default, (0, _extends2.default)({}, restProps, {
  186. builtinPlacements: mergedBuiltinPlacements,
  187. ref: triggerRef,
  188. popupStyle: stepStyle,
  189. popupPlacement: mergedPlacement,
  190. popupVisible: mergedOpen,
  191. popupClassName: (0, _classnames.default)(rootClassName, stepClassName),
  192. prefixCls: prefixCls,
  193. popup: getPopupElement,
  194. forceRender: false,
  195. destroyPopupOnHide: true,
  196. zIndex: zIndex,
  197. getTriggerDOMNode: getTriggerDOMNode,
  198. arrow: !!mergedArrow
  199. }), /*#__PURE__*/React.createElement(_portal.default, {
  200. open: mergedOpen,
  201. autoLock: true
  202. }, /*#__PURE__*/React.createElement("div", {
  203. className: (0, _classnames.default)(rootClassName, "".concat(prefixCls, "-target-placeholder")),
  204. style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, posInfo || CENTER_PLACEHOLDER), {}, {
  205. position: 'fixed',
  206. pointerEvents: 'none'
  207. })
  208. }))));
  209. };
  210. var _default = Tour;
  211. exports.default = _default;