@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
202 lines (194 loc) • 7.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = PostPreviewButton;
var _element = require("@wordpress/element");
var _components = require("@wordpress/components");
var _i18n = require("@wordpress/i18n");
var _data = require("@wordpress/data");
var _hooks = require("@wordpress/hooks");
var _coreData = require("@wordpress/core-data");
var _store = require("../../store");
var _jsxRuntime = require("react/jsx-runtime");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function writeInterstitialMessage(targetDocument) {
let markup = (0, _element.renderToString)( /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "editor-post-preview-button__interstitial-message",
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_components.SVG, {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 96 96",
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Path, {
className: "outer",
d: "M48 12c19.9 0 36 16.1 36 36S67.9 84 48 84 12 67.9 12 48s16.1-36 36-36",
fill: "none"
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Path, {
className: "inner",
d: "M69.5 46.4c0-3.9-1.4-6.7-2.6-8.8-1.6-2.6-3.1-4.9-3.1-7.5 0-2.9 2.2-5.7 5.4-5.7h.4C63.9 19.2 56.4 16 48 16c-11.2 0-21 5.7-26.7 14.4h2.1c3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3L40 67.5l7-20.9L42 33c-1.7-.1-3.3-.3-3.3-.3-1.7-.1-1.5-2.7.2-2.6 0 0 5.3.4 8.4.4 3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3l11.5 34.3 3.3-10.4c1.6-4.5 2.4-7.8 2.4-10.5zM16.1 48c0 12.6 7.3 23.5 18 28.7L18.8 35c-1.7 4-2.7 8.4-2.7 13zm32.5 2.8L39 78.6c2.9.8 5.9 1.3 9 1.3 3.7 0 7.3-.6 10.6-1.8-.1-.1-.2-.3-.2-.4l-9.8-26.9zM76.2 36c0 3.2-.6 6.9-2.4 11.4L64 75.6c9.5-5.5 15.9-15.8 15.9-27.6 0-5.5-1.4-10.8-3.9-15.3.1 1 .2 2.1.2 3.3z",
fill: "none"
})]
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
children: (0, _i18n.__)('Generating preview…')
})]
}));
markup += `
<style>
body {
margin: 0;
}
.editor-post-preview-button__interstitial-message {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
width: 100vw;
}
@-webkit-keyframes paint {
0% {
stroke-dashoffset: 0;
}
}
@-moz-keyframes paint {
0% {
stroke-dashoffset: 0;
}
}
@-o-keyframes paint {
0% {
stroke-dashoffset: 0;
}
}
@keyframes paint {
0% {
stroke-dashoffset: 0;
}
}
.editor-post-preview-button__interstitial-message svg {
width: 192px;
height: 192px;
stroke: #555d66;
stroke-width: 0.75;
}
.editor-post-preview-button__interstitial-message svg .outer,
.editor-post-preview-button__interstitial-message svg .inner {
stroke-dasharray: 280;
stroke-dashoffset: 280;
-webkit-animation: paint 1.5s ease infinite alternate;
-moz-animation: paint 1.5s ease infinite alternate;
-o-animation: paint 1.5s ease infinite alternate;
animation: paint 1.5s ease infinite alternate;
}
p {
text-align: center;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
</style>
`;
/**
* Filters the interstitial message shown when generating previews.
*
* @param {string} markup The preview interstitial markup.
*/
markup = (0, _hooks.applyFilters)('editor.PostPreview.interstitialMarkup', markup);
targetDocument.write(markup);
targetDocument.title = (0, _i18n.__)('Generating preview…');
targetDocument.close();
}
/**
* Renders a button that opens a new window or tab for the preview,
* writes the interstitial message to this window, and then navigates
* to the actual preview link. The button is not rendered if the post
* is not viewable and disabled if the post is not saveable.
*
* @param {Object} props The component props.
* @param {string} props.className The class name for the button.
* @param {string} props.textContent The text content for the button.
* @param {boolean} props.forceIsAutosaveable Whether to force autosave.
* @param {string} props.role The role attribute for the button.
* @param {Function} props.onPreview The callback function for preview event.
*
* @return {JSX.Element|null} The rendered button component.
*/
function PostPreviewButton({
className,
textContent,
forceIsAutosaveable,
role,
onPreview
}) {
const {
postId,
currentPostLink,
previewLink,
isSaveable,
isViewable
} = (0, _data.useSelect)(select => {
var _postType$viewable;
const editor = select(_store.store);
const core = select(_coreData.store);
const postType = core.getPostType(editor.getCurrentPostType('type'));
return {
postId: editor.getCurrentPostId(),
currentPostLink: editor.getCurrentPostAttribute('link'),
previewLink: editor.getEditedPostPreviewLink(),
isSaveable: editor.isEditedPostSaveable(),
isViewable: (_postType$viewable = postType?.viewable) !== null && _postType$viewable !== void 0 ? _postType$viewable : false
};
}, []);
const {
__unstableSaveForPreview
} = (0, _data.useDispatch)(_store.store);
if (!isViewable) {
return null;
}
const targetId = `wp-preview-${postId}`;
const openPreviewWindow = async event => {
// Our Preview button has its 'href' and 'target' set correctly for a11y
// purposes. Unfortunately, though, we can't rely on the default 'click'
// handler since sometimes it incorrectly opens a new tab instead of reusing
// the existing one.
// https://github.com/WordPress/gutenberg/pull/8330
event.preventDefault();
// Open up a Preview tab if needed. This is where we'll show the preview.
const previewWindow = window.open('', targetId);
// Focus the Preview tab. This might not do anything, depending on the browser's
// and user's preferences.
// https://html.spec.whatwg.org/multipage/interaction.html#dom-window-focus
previewWindow.focus();
writeInterstitialMessage(previewWindow.document);
const link = await __unstableSaveForPreview({
forceIsAutosaveable
});
previewWindow.location = link;
onPreview?.();
};
// Link to the `?preview=true` URL if we have it, since this lets us see
// changes that were autosaved since the post was last published. Otherwise,
// just link to the post's URL.
const href = previewLink || currentPostLink;
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Button, {
variant: !className ? 'tertiary' : undefined,
className: className || 'editor-post-preview',
href: href,
target: targetId,
accessibleWhenDisabled: true,
disabled: !isSaveable,
onClick: openPreviewWindow,
role: role,
size: "compact",
children: textContent || /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [(0, _i18n._x)('Preview', 'imperative verb'), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.VisuallyHidden, {
as: "span",
children: /* translators: accessibility text */
(0, _i18n.__)('(opens in a new tab)')
})]
})
});
}
//# sourceMappingURL=index.js.map