UNPKG

@wordpress/editor

Version:
152 lines (148 loc) 4.71 kB
/** * WordPress dependencies */ import { __, sprintf } from '@wordpress/i18n'; import { useMemo } from '@wordpress/element'; import { Button, __experimentalText as Text, __experimentalHStack as HStack, __experimentalVStack as VStack } from '@wordpress/components'; import { useDispatch, useSelect } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; import { store as noticesStore } from '@wordpress/notices'; /** * Internal dependencies */ import { getItemTitle } from '../../utils/get-item-title'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; const SetAsHomepageModal = ({ items, closeModal }) => { const [item] = items; const pageTitle = getItemTitle(item); const { showOnFront, currentHomePage, isSaving } = useSelect(select => { const { getEntityRecord, isSavingEntityRecord } = select(coreStore); const siteSettings = getEntityRecord('root', 'site'); const currentHomePageItem = getEntityRecord('postType', 'page', siteSettings?.page_on_front); return { showOnFront: siteSettings?.show_on_front, currentHomePage: currentHomePageItem, isSaving: isSavingEntityRecord('root', 'site') }; }); const { saveEntityRecord } = useDispatch(coreStore); const { createSuccessNotice, createErrorNotice } = useDispatch(noticesStore); async function onSetPageAsHomepage(event) { event.preventDefault(); try { await saveEntityRecord('root', 'site', { page_on_front: item.id, show_on_front: 'page' }); createSuccessNotice(__('Homepage updated.'), { type: 'snackbar' }); } catch (error) { const errorMessage = error.message && error.code !== 'unknown_error' ? error.message : __('An error occurred while setting the homepage.'); createErrorNotice(errorMessage, { type: 'snackbar' }); } finally { closeModal?.(); } } let modalWarning = ''; if ('posts' === showOnFront) { modalWarning = __('This will replace the current homepage which is set to display latest posts.'); } else if (currentHomePage) { modalWarning = sprintf( // translators: %s: title of the current home page. __('This will replace the current homepage: "%s"'), getItemTitle(currentHomePage)); } const modalText = sprintf( // translators: %1$s: title of the page to be set as the homepage, %2$s: homepage replacement warning message. __('Set "%1$s" as the site homepage? %2$s'), pageTitle, modalWarning).trim(); // translators: Button label to confirm setting the specified page as the homepage. const modalButtonLabel = __('Set homepage'); return /*#__PURE__*/_jsx("form", { onSubmit: onSetPageAsHomepage, children: /*#__PURE__*/_jsxs(VStack, { spacing: "5", children: [/*#__PURE__*/_jsx(Text, { children: modalText }), /*#__PURE__*/_jsxs(HStack, { justify: "right", children: [/*#__PURE__*/_jsx(Button, { __next40pxDefaultSize: true, variant: "tertiary", onClick: () => { closeModal?.(); }, disabled: isSaving, accessibleWhenDisabled: true, children: __('Cancel') }), /*#__PURE__*/_jsx(Button, { __next40pxDefaultSize: true, variant: "primary", type: "submit", disabled: isSaving, accessibleWhenDisabled: true, children: modalButtonLabel })] })] }) }); }; export const useSetAsHomepageAction = () => { const { pageOnFront, pageForPosts } = useSelect(select => { const { getEntityRecord, canUser } = select(coreStore); const siteSettings = canUser('read', { kind: 'root', name: 'site' }) ? getEntityRecord('root', 'site') : undefined; return { pageOnFront: siteSettings?.page_on_front, pageForPosts: siteSettings?.page_for_posts }; }); return useMemo(() => ({ id: 'set-as-homepage', label: __('Set as homepage'), isEligible(post) { if (post.status !== 'publish') { return false; } if (post.type !== 'page') { return false; } // Don't show the action if the page is already set as the homepage. if (pageOnFront === post.id) { return false; } // Don't show the action if the page is already set as the page for posts. if (pageForPosts === post.id) { return false; } return true; }, modalFocusOnMount: 'firstContentElement', RenderModal: SetAsHomepageModal }), [pageForPosts, pageOnFront]); }; //# sourceMappingURL=set-as-homepage.js.map