UNPKG

@wordpress/components

Version:
160 lines (156 loc) 5.05 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _clsx = _interopRequireDefault(require("clsx")); var _element = require("@wordpress/element"); var _deprecated = _interopRequireDefault(require("@wordpress/deprecated")); var _i18n = require("@wordpress/i18n"); var _modal = _interopRequireDefault(require("../modal")); var _button = _interopRequireDefault(require("../button")); var _pageControl = _interopRequireDefault(require("./page-control")); var _jsxRuntime = require("react/jsx-runtime"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * `Guide` is a React component that renders a _user guide_ in a modal. The guide consists of several pages which the user can step through one by one. The guide is finished when the modal is closed or when the user clicks _Finish_ on the last page of the guide. * * ```jsx * function MyTutorial() { * const [ isOpen, setIsOpen ] = useState( true ); * * if ( ! isOpen ) { * return null; * } * * return ( * <Guide * onFinish={ () => setIsOpen( false ) } * pages={ [ * { * content: <p>Welcome to the ACME Store!</p>, * }, * { * image: <img src="https://acmestore.com/add-to-cart.png" />, * content: ( * <p> * Click <i>Add to Cart</i> to buy a product. * </p> * ), * }, * ] } * /> * ); * } * ``` */ function Guide({ children, className, contentLabel, finishButtonText = (0, _i18n.__)('Finish'), nextButtonText = (0, _i18n.__)('Next'), previousButtonText = (0, _i18n.__)('Previous'), onFinish, pages = [] }) { const ref = (0, _element.useRef)(null); const [currentPage, setCurrentPage] = (0, _element.useState)(0); (0, _element.useEffect)(() => { // Place focus at the top of the guide on mount and when the page changes. const frame = ref.current?.querySelector('.components-guide'); if (frame instanceof HTMLElement) { frame.focus(); } }, [currentPage]); (0, _element.useEffect)(() => { if (_element.Children.count(children)) { (0, _deprecated.default)('Passing children to <Guide>', { since: '5.5', alternative: 'the `pages` prop' }); } }, [children]); if (_element.Children.count(children)) { var _Children$map; pages = (_Children$map = _element.Children.map(children, child => ({ content: child }))) !== null && _Children$map !== void 0 ? _Children$map : []; } const canGoBack = currentPage > 0; const canGoForward = currentPage < pages.length - 1; const goBack = () => { if (canGoBack) { setCurrentPage(currentPage - 1); } }; const goForward = () => { if (canGoForward) { setCurrentPage(currentPage + 1); } }; if (pages.length === 0) { return null; } return /*#__PURE__*/(0, _jsxRuntime.jsx)(_modal.default, { className: (0, _clsx.default)('components-guide', className), contentLabel: contentLabel, isDismissible: pages.length > 1, onRequestClose: onFinish, onKeyDown: event => { if (event.code === 'ArrowLeft') { goBack(); // Do not scroll the modal's contents. event.preventDefault(); } else if (event.code === 'ArrowRight') { goForward(); // Do not scroll the modal's contents. event.preventDefault(); } }, ref: ref, children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: "components-guide__container", children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: "components-guide__page", children: [pages[currentPage].image, pages.length > 1 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_pageControl.default, { currentPage: currentPage, numberOfPages: pages.length, setCurrentPage: setCurrentPage }), pages[currentPage].content] }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", { className: "components-guide__footer", children: [canGoBack && /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, { className: "components-guide__back-button", variant: "tertiary", onClick: goBack, __next40pxDefaultSize: true, children: previousButtonText }), canGoForward && /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, { className: "components-guide__forward-button", variant: "primary", onClick: goForward, __next40pxDefaultSize: true, children: nextButtonText }), !canGoForward && /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, { className: "components-guide__finish-button", variant: "primary", onClick: onFinish, __next40pxDefaultSize: true, children: finishButtonText })] })] }) }); } var _default = exports.default = Guide; //# sourceMappingURL=index.js.map