/**
* WordPress dependencies
*/
import { __, sprintf } from '@wordpress/i18n';
import {
__experimentalConfirmDialog as ConfirmDialog,
Spinner,
useNavigator,
} from '@wordpress/components';
import { useContext, useState, useMemo } from '@wordpress/element';
import { areGlobalStylesEqual } from '@wordpress/global-styles-engine';
/**
* Internal dependencies
*/
import { ScreenHeader } from '../screen-header';
import { GlobalStylesContext } from '../context';
import useGlobalStylesRevisions from './use-global-styles-revisions';
import RevisionsButtons from './revisions-buttons';
import Pagination from '../pagination';
const PAGE_SIZE = 10;
interface ScreenRevisionsProps {
onClose?: () => void;
}
function ScreenRevisions( { onClose }: ScreenRevisionsProps = {} ) {
const { user: currentEditorGlobalStyles, onChange: setUserConfig } =
useContext( GlobalStylesContext );
const { params, goTo } = useNavigator();
const { revisionId } = params;
const [ currentPage, setCurrentPage ] = useState( 1 );
const { revisions, isLoading, hasUnsavedChanges, revisionsCount } =
useGlobalStylesRevisions( {
query: {
per_page: PAGE_SIZE,
page: currentPage,
},
} );
const numPages = Math.ceil( revisionsCount / PAGE_SIZE );
const [
isLoadingRevisionWithUnsavedChanges,
setIsLoadingRevisionWithUnsavedChanges,
] = useState( false );
// Derive the currently selected revision from the path parameter
const currentlySelectedRevision = useMemo( () => {
if ( ! revisionId ) {
return currentEditorGlobalStyles;
}
const revision = revisions.find(
( rev ) => String( rev.id ) === String( revisionId )
);
return revision || currentEditorGlobalStyles;
}, [ revisionId, revisions, currentEditorGlobalStyles ] );
const selectedRevisionMatchesEditorStyles = areGlobalStylesEqual(
currentlySelectedRevision,
currentEditorGlobalStyles
);
const onCloseRevisions = () => {
if ( onClose ) {
onClose();
}
};
const restoreRevision = ( revision: any ) => {
setUserConfig( revision );
setIsLoadingRevisionWithUnsavedChanges( false );
onCloseRevisions();
};
const handleRevisionSelect = ( revision: any ) => {
goTo( `/revisions/${ revision.id }` );
};
const currentlySelectedRevisionId =
// @ts-expect-error: revision id is not present in the fallback (default object).
currentlySelectedRevision?.id ?? revisions[ 0 ]?.id;
// Only display load button if there is a revision to load,
// and it is different from the current editor styles.
const isLoadButtonEnabled =
!! currentlySelectedRevisionId &&
currentlySelectedRevisionId !== 'unsaved' &&
! selectedRevisionMatchesEditorStyles;
const hasRevisions = !! revisions.length;
return (
<>
{ ! hasRevisions && (
) }
hasUnsavedChanges
? setIsLoadingRevisionWithUnsavedChanges( true )
: restoreRevision( currentlySelectedRevision )
}
/>
{ numPages > 1 && (
) }
{ isLoadingRevisionWithUnsavedChanges && (
restoreRevision( currentlySelectedRevision )
}
onCancel={ () =>
setIsLoadingRevisionWithUnsavedChanges( false )
}
size="medium"
>
{ __(
'Are you sure you want to apply this revision? Any unsaved changes will be lost.'
) }
) }
>
);
}
export default ScreenRevisions;