@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
104 lines • 3.63 kB
JavaScript
/**
* WordPress dependencies
*/
import { backup } from '@wordpress/icons';
import { store as coreStore } from '@wordpress/core-data';
import { __, sprintf } from '@wordpress/i18n';
import { store as noticesStore } from '@wordpress/notices';
/**
* Internal dependencies
*/
import { getItemTitle, isTemplateOrTemplatePart } from './utils';
const restorePost = {
id: 'restore',
label: __('Restore'),
isPrimary: true,
icon: backup,
supportsBulk: true,
isEligible(item) {
return !isTemplateOrTemplatePart(item) && item.type !== 'wp_block' && item.status === 'trash' && item.permissions?.update;
},
async callback(posts, {
registry,
onActionPerformed
}) {
const {
createSuccessNotice,
createErrorNotice
} = registry.dispatch(noticesStore);
const {
editEntityRecord,
saveEditedEntityRecord
} = registry.dispatch(coreStore);
await Promise.allSettled(posts.map(post => {
return editEntityRecord('postType', post.type, post.id, {
status: 'draft'
});
}));
const promiseResult = await Promise.allSettled(posts.map(post => {
return saveEditedEntityRecord('postType', post.type, post.id, {
throwOnError: true
});
}));
if (promiseResult.every(({
status
}) => status === 'fulfilled')) {
let successMessage;
if (posts.length === 1) {
successMessage = sprintf( /* translators: The number of posts. */
__('"%s" has been restored.'), getItemTitle(posts[0]));
} else if (posts[0].type === 'page') {
successMessage = sprintf( /* translators: The number of posts. */
__('%d pages have been restored.'), posts.length);
} else {
successMessage = sprintf( /* translators: The number of posts. */
__('%d posts have been restored.'), posts.length);
}
createSuccessNotice(successMessage, {
type: 'snackbar',
id: 'restore-post-action'
});
if (onActionPerformed) {
onActionPerformed(posts);
}
} else {
// If there was at lease one failure.
let errorMessage;
// If we were trying to move a single post to the trash.
if (promiseResult.length === 1) {
const typedError = promiseResult[0];
if (typedError.reason?.message) {
errorMessage = typedError.reason.message;
} else {
errorMessage = __('An error occurred while restoring the post.');
}
// If we were trying to move multiple posts to the trash
} else {
const errorMessages = new Set();
const failedPromises = promiseResult.filter(({
status
}) => status === 'rejected');
for (const failedPromise of failedPromises) {
const typedError = failedPromise;
if (typedError.reason?.message) {
errorMessages.add(typedError.reason.message);
}
}
if (errorMessages.size === 0) {
errorMessage = __('An error occurred while restoring the posts.');
} else if (errorMessages.size === 1) {
errorMessage = sprintf( /* translators: %s: an error message */
__('An error occurred while restoring the posts: %s'), [...errorMessages][0]);
} else {
errorMessage = sprintf( /* translators: %s: a list of comma separated error messages */
__('Some errors occurred while restoring the posts: %s'), [...errorMessages].join(','));
}
}
createErrorNotice(errorMessage, {
type: 'snackbar'
});
}
}
};
export default restorePost;
//# sourceMappingURL=restore-post.js.map