/** * WordPress dependencies */ import { useSelect } from '@safe-wordpress/data'; /** * External dependencies */ import { mapValues, orderBy, pick, toPairs, isEqual, keys } from 'lodash'; import { store as NC_DATA } from '@nelio-content/data'; import { extractDateTimeValues, isDefined } from '@nelio-content/utils'; import type { TaxonomySlug, Term } from '@nelio-content/types'; /** * Internal dependencies */ import { EditActions } from './edit-actions'; import { ViewActions } from './view-actions'; import { store as NC_POST_EDITOR } from '../../store'; import { useCanEditPost } from '../../hooks'; export const Actions = (): JSX.Element => { const canEditPost = useCanEditPost(); const isDirty = useIsDirty(); return canEditPost && isDirty ? : ; }; // ===== // HOOKS // ===== const useIsDirty = () => useSelect( ( select ) => { select( NC_DATA ); select( NC_POST_EDITOR ); const { isNewPost } = select( NC_POST_EDITOR ); if ( isNewPost() ) { return true; } const { isSaving } = select( NC_POST_EDITOR ); if ( isSaving() ) { return true; } const postId = select( NC_POST_EDITOR ).getId(); const post = select( NC_DATA ).getPost( postId ); if ( ! post ) { return true; } const oldTasks = select( NC_DATA ).getTasksRelatedToPost( postId ); if ( select( NC_POST_EDITOR ).areTasksDirty( oldTasks ) ) { return true; } const { arePremiumItemsDirty: check } = select( NC_POST_EDITOR ); const arePremiumItemsDirty = toPairs( select( NC_DATA ).getAllPremiumItemsRelatedToPost( postId ) ) .map( ( [ type, items ] ) => items ? ( [ type, items ] as const ) : undefined ) .filter( isDefined ) .map( ( [ type, items ] ) => check( type, items ) ) .some( ( x ) => x ); if ( arePremiumItemsDirty ) { return true; } const oldRefs = select( NC_DATA ).getSuggestedReferences( postId ); if ( select( NC_POST_EDITOR ).areReferencesDirty( oldRefs ) ) { return true; } const newComments = select( NC_POST_EDITOR ).getNewComments(); if ( !! newComments.length ) { return true; } const oldSeries = post.series; if ( select( NC_POST_EDITOR ).areSeriesDirty( oldSeries ) ) { return true; } const { getTitle, getAuthorId, getDateValue, getTimeValue, getPostStatus, getPostTermsByTaxonomy, isSticky, } = select( NC_POST_EDITOR ); const stringifyTaxos = ( taxos: Record< TaxonomySlug, readonly Term[] > ) => JSON.stringify( mapValues( taxos, ( ts ) => orderBy( ts, 'id' ) ) ); const newPost = { title: getTitle(), status: getPostStatus(), author: getAuthorId(), dateValue: getDateValue() ?? '', timeValue: getTimeValue() ?? '', taxonomies: stringifyTaxos( getPostTermsByTaxonomy() ), isSticky: isSticky(), }; const dtv = extractDateTimeValues( post.date ); const originalPost = { ...pick( post, keys( newPost ) ), taxonomies: stringifyTaxos( post.taxonomies ), dateValue: dtv?.dateValue ?? '', timeValue: dtv?.timeValue ?? '', }; return ! isEqual( newPost, originalPost ); }, [] );