UNPKG

@wordpress/editor

Version:
213 lines (185 loc) 6.82 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = PostLockedModal; var _element = require("@wordpress/element"); var _lodash = require("lodash"); var _i18n = require("@wordpress/i18n"); var _components = require("@wordpress/components"); var _data = require("@wordpress/data"); var _url = require("@wordpress/url"); var _hooks = require("@wordpress/hooks"); var _compose = require("@wordpress/compose"); var _url2 = require("../../utils/url"); var _postPreviewButton = _interopRequireDefault(require("../post-preview-button")); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function PostLockedModal() { const instanceId = (0, _compose.useInstanceId)(PostLockedModal); const hookName = 'core/editor/post-locked-modal-' + instanceId; const { autosave, updatePostLock } = (0, _data.useDispatch)('core/editor'); const { isLocked, isTakeover, user, postId, postLockUtils, activePostLock, postType } = (0, _data.useSelect)(select => { const { isPostLocked, isPostLockTakeover, getPostLockUser, getCurrentPostId, getActivePostLock, getEditedPostAttribute, getEditorSettings } = select('core/editor'); const { getPostType } = select('core'); return { isLocked: isPostLocked(), isTakeover: isPostLockTakeover(), user: getPostLockUser(), postId: getCurrentPostId(), postLockUtils: getEditorSettings().postLockUtils, activePostLock: getActivePostLock(), postType: getPostType(getEditedPostAttribute('type')) }; }); (0, _element.useEffect)(() => { /** * Keep the lock refreshed. * * When the user does not send a heartbeat in a heartbeat-tick * the user is no longer editing and another user can start editing. * * @param {Object} data Data to send in the heartbeat request. */ function sendPostLock(data) { if (isLocked) { return; } data['wp-refresh-post-lock'] = { lock: activePostLock, post_id: postId }; } /** * Refresh post locks: update the lock string or show the dialog if somebody has taken over editing. * * @param {Object} data Data received in the heartbeat request */ function receivePostLock(data) { if (!data['wp-refresh-post-lock']) { return; } const received = data['wp-refresh-post-lock']; if (received.lock_error) { // Auto save and display the takeover modal. autosave(); updatePostLock({ isLocked: true, isTakeover: true, user: { avatar: received.lock_error.avatar_src } }); } else if (received.new_lock) { updatePostLock({ isLocked: false, activePostLock: received.new_lock }); } } /** * Unlock the post before the window is exited. */ function releasePostLock() { if (isLocked || !activePostLock) { return; } const data = new window.FormData(); data.append('action', 'wp-remove-post-lock'); data.append('_wpnonce', postLockUtils.unlockNonce); data.append('post_ID', postId); data.append('active_post_lock', activePostLock); if (window.navigator.sendBeacon) { window.navigator.sendBeacon(postLockUtils.ajaxUrl, data); } else { const xhr = new window.XMLHttpRequest(); xhr.open('POST', postLockUtils.ajaxUrl, false); xhr.send(data); } } // Details on these events on the Heartbeat API docs // https://developer.wordpress.org/plugins/javascript/heartbeat-api/ (0, _hooks.addAction)('heartbeat.send', hookName, sendPostLock); (0, _hooks.addAction)('heartbeat.tick', hookName, receivePostLock); window.addEventListener('beforeunload', releasePostLock); return () => { (0, _hooks.removeAction)('heartbeat.send', hookName); (0, _hooks.removeAction)('heartbeat.tick', hookName); window.removeEventListener('beforeunload', releasePostLock); }; }, []); if (!isLocked) { return null; } const userDisplayName = user.name; const userAvatar = user.avatar; const unlockUrl = (0, _url.addQueryArgs)('post.php', { 'get-post-lock': '1', lockKey: true, post: postId, action: 'edit', _wpnonce: postLockUtils.nonce }); const allPostsUrl = (0, _url2.getWPAdminURL)('edit.php', { post_type: (0, _lodash.get)(postType, ['slug']) }); const allPostsLabel = (0, _i18n.__)('Exit the Editor'); return (0, _element.createElement)(_components.Modal, { title: isTakeover ? (0, _i18n.__)('Someone else has taken over this post.') : (0, _i18n.__)('This post is already being edited.'), focusOnMount: true, shouldCloseOnClickOutside: false, shouldCloseOnEsc: false, isDismissible: false, className: "editor-post-locked-modal" }, !!userAvatar && (0, _element.createElement)("img", { src: userAvatar, alt: (0, _i18n.__)('Avatar'), className: "editor-post-locked-modal__avatar" }), !!isTakeover && (0, _element.createElement)("div", null, (0, _element.createElement)("div", null, userDisplayName ? (0, _i18n.sprintf)( /* translators: %s: user's display name */ (0, _i18n.__)('%s now has editing control of this post. Don’t worry, your changes up to this moment have been saved.'), userDisplayName) : (0, _i18n.__)('Another user now has editing control of this post. Don’t worry, your changes up to this moment have been saved.')), (0, _element.createElement)("div", { className: "editor-post-locked-modal__buttons" }, (0, _element.createElement)(_components.Button, { isPrimary: true, href: allPostsUrl }, allPostsLabel))), !isTakeover && (0, _element.createElement)("div", null, (0, _element.createElement)("div", null, userDisplayName ? (0, _i18n.sprintf)( /* translators: %s: user's display name */ (0, _i18n.__)('%s is currently working on this post, which means you cannot make changes, unless you take over.'), userDisplayName) : (0, _i18n.__)('Another user is currently working on this post, which means you cannot make changes, unless you take over.')), (0, _element.createElement)("div", { className: "editor-post-locked-modal__buttons" }, (0, _element.createElement)(_components.Button, { isSecondary: true, href: allPostsUrl }, allPostsLabel), (0, _element.createElement)(_postPreviewButton.default, null), (0, _element.createElement)(_components.Button, { isPrimary: true, href: unlockUrl }, (0, _i18n.__)('Take Over'))))); } //# sourceMappingURL=index.js.map