/** * WordPress dependencies */ import { _x } from '@safe-wordpress/i18n'; /** * External dependencies */ import { isEqual, trim } from 'lodash'; import type { Maybe, PostStatus, PostStatusSlug } from '@nelio-content/types'; /** * Internal dependencies */ import type { State } from './types'; export function getStatuses( state: State ): ReadonlyArray< PostStatusSlug > { return state.statuses.allSlugs; } export function getStatus( state: State, slug: Maybe< PostStatusSlug > ): Maybe< PostStatus > { return slug ? state.statuses.bySlug[ slug ] : undefined; } export function isStatusEditorOpen( state: State ): boolean { return !! state.editor; } export function getEditingStatus( state: State ): PostStatus { return state.editor?.attrs || DEFAULT_ATTRS; } export function isEditingStatusDirty( state: State ): boolean { if ( ! state.editor ) { return false; } const { source } = state.editor; const attrs = { ...state.editor.attrs, }; return ! isEqual( source, attrs ); } export function isEditingStatusNew( state: State ): boolean { if ( ! state.editor ) { return false; } return state.editor.isNew; } export function getEditingStatusError( state: State ): Maybe< string > { if ( ! state.editor ) { return undefined; } const { attrs } = state.editor; if ( trim( attrs.slug ) === '' ) { return _x( 'Please write a valid slug', 'user', 'nelio-content' ); } if ( trim( attrs.slug ).length > 20 ) { return _x( 'Please write a shorter slug', 'user', 'nelio-content' ); } if ( state.editor.source.slug !== trim( attrs.slug ) && state.statuses.allSlugs.includes( trim( attrs.slug ) ) ) { return _x( 'There is another status with the same slug', 'user', 'nelio-content' ); } if ( attrs.postTypes !== 'all-types' && ! attrs.postTypes.length ) { return _x( 'Please select at least one post type', 'user', 'nelio-content' ); } if ( attrs.roles !== 'all-roles' && ! attrs.roles.length ) { return _x( 'Please select at least one role', 'user', 'nelio-content' ); } if ( trim( state.editor.source.slug ) === '' && state.statuses.allSlugs.includes( trim( attrs.slug ) ) ) { return _x( 'There is another status with the same slug', 'user', 'nelio-content' ); } if ( trim( attrs.name ) === '' ) { return _x( 'Please write a valid status label', 'user', 'nelio-content' ); } return undefined; } export function isSavingStatuses( state: State ): boolean { return state.saving; } // ======= // HELPERS // ======= const DEFAULT_ATTRS: PostStatus = { slug: '' as PostStatusSlug, name: 'none', available: true, postTypes: 'all-types', roles: 'all-roles', };