@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
152 lines (146 loc) • 3.82 kB
JavaScript
/**
* WordPress dependencies
*/
import {
PanelBody,
Button,
__experimentalHStack as HStack,
__experimentalVStack as VStack,
privateApis as componentsPrivateApis,
} from '@wordpress/components';
import { store as coreStore } from '@wordpress/core-data';
import { DataViews } from '@wordpress/dataviews';
import { dateI18n, getDate, humanTimeDiff, getSettings } from '@wordpress/date';
import { useSelect, useDispatch } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import { authorField } from '@wordpress/fields';
/**
* Internal dependencies
*/
import PostLastRevisionCheck from '../post-last-revision/check';
import { store as editorStore } from '../../store';
import { unlock } from '../../lock-unlock';
const { Badge } = unlock( componentsPrivateApis );
const DAY_IN_MILLISECONDS = 86400000;
const EMPTY_ARRAY = [];
const REVISIONS_QUERY = {
per_page: 3,
orderby: 'date',
order: 'desc',
context: 'embed',
_fields: 'id,date,author',
};
const defaultLayouts = { activity: {} };
const view = {
type: 'activity',
titleField: 'date',
fields: [ 'author' ],
layout: {
density: 'compact',
},
};
const fields = [
{
id: 'date',
label: __( 'Date' ),
render: ( { item } ) => {
const dateNowInMs = getDate( null ).getTime();
const date = getDate( item.date ?? null );
const displayDate =
dateNowInMs - date.getTime() > DAY_IN_MILLISECONDS
? dateI18n(
getSettings().formats.datetimeAbbreviated,
date
)
: humanTimeDiff( date );
return (
<time
className="editor-post-revisions-panel__revision-date"
dateTime={ item.date }
>
{ displayDate }
</time>
);
},
enableSorting: false,
enableHiding: false,
},
authorField,
];
const noop = () => {};
const paginationInfo = {};
function PostRevisionsPanelContent() {
const { setCurrentRevisionId } = unlock( useDispatch( editorStore ) );
const { revisionsCount, revisions, isLoading, lastRevisionId } = useSelect(
( select ) => {
const { getCurrentPostId, getCurrentPostType } =
select( editorStore );
const {
getCurrentPostRevisionsCount,
getCurrentPostLastRevisionId,
} = select( editorStore );
const { getRevisions, isResolving } = select( coreStore );
const query = [
'postType',
getCurrentPostType(),
getCurrentPostId(),
REVISIONS_QUERY,
];
const _revisions = getRevisions( ...query );
return {
revisionsCount: getCurrentPostRevisionsCount(),
lastRevisionId: getCurrentPostLastRevisionId(),
revisions: _revisions,
isLoading: isResolving( 'getRevisions', query ),
};
},
[]
);
return (
<PanelBody
title={
<HStack justify="space-between" align="center" as="span">
<span>{ __( 'Revisions' ) }</span>
<Badge className="editor-post-revisions-panel__revisions-count">
{ revisionsCount }
</Badge>
</HStack>
}
initialOpen={ false }
>
<VStack className="editor-post-revisions-panel">
<DataViews
view={ view }
onChangeView={ noop }
fields={ fields }
data={ revisions || EMPTY_ARRAY }
isLoading={ isLoading }
paginationInfo={ paginationInfo }
defaultLayouts={ defaultLayouts }
getItemId={ ( item ) => item.id }
isItemClickable={ () => true }
onClickItem={ ( item ) => {
setCurrentRevisionId( item.id );
} }
>
<DataViews.Layout />
</DataViews>
<Button
className="editor-post-revisions-panel__view-all"
__next40pxDefaultSize
variant="secondary"
onClick={ () => setCurrentRevisionId( lastRevisionId ) }
>
{ __( 'View all revisions' ) }
</Button>
</VStack>
</PanelBody>
);
}
export default function PostRevisionsPanel() {
return (
<PostLastRevisionCheck>
<PostRevisionsPanelContent />
</PostLastRevisionCheck>
);
}