/** * WordPress dependencies */ import { SelectControl } from '@safe-wordpress/components'; import { useSelect, useDispatch } from '@safe-wordpress/data'; import { useEffect, useMemo } from '@safe-wordpress/element'; import { _x } from '@safe-wordpress/i18n'; /** * External dependencies */ import { map } from 'lodash'; import { EMPTY_ARRAY } from '@nelio-content/constants'; import { store as NC_DATA } from '@nelio-content/data'; import { hasHead, PUBLISHED } from '@nelio-content/utils'; import type { PostStatusSlug } from '@nelio-content/types'; /** * Internal dependencies */ import { useIsDisabled } from '../hooks'; import { store as NC_POST_EDITOR } from '../store'; export const StatusSelector = (): JSX.Element => { const [ status, setStatus ] = usePostStatus(); const options = usePostStatuses(); const disabled = useIsDisabled(); const published = useIsAlreadyPublished(); return (
); }; // ===== // HOOKS // ===== const usePostStatus = () => { const statuses = map( usePostStatuses(), 'value' ); const status = useSelect( ( select ) => select( NC_POST_EDITOR ).getPostStatus(), [] ); const { setPostStatus } = useDispatch( NC_POST_EDITOR ); useEffect( () => { if ( ! hasHead( statuses ) ) { return; } if ( ! status || ! statuses.includes( status ) ) { void setPostStatus( statuses[ 0 ] ); } }, [ statuses, status, setPostStatus ] ); return [ status, setPostStatus ] as const; }; const usePostStatuses = (): ReadonlyArray< { readonly value: PostStatusSlug; readonly label: string; readonly disabled?: boolean; } > => { const published = useIsAlreadyPublished(); const { rawStatuses, canPublish } = useSelect( ( select ) => { const postType = select( NC_POST_EDITOR ).getPostType(); const post = select( NC_DATA ).getPost( select( NC_POST_EDITOR ).getId() ); return { rawStatuses: postType ? select( NC_DATA ).getPostStatuses( postType ) : EMPTY_ARRAY, canPublish: select( NC_DATA ).canCurrentUserPublishPost( post ), }; }, [] ); return useMemo( () => { const validStatuses = rawStatuses.filter( ( { slug } ) => slug !== 'nelio-content-unscheduled' ); const statuses = validStatuses.map( ( { slug, name, available, flags = [] } ) => ( { value: slug, label: name, disabled: ! available || flags.includes( 'disabled-in-editor' ) || ( slug === 'future' && ! canPublish ), } ) ); if ( published ) { return [ statuses.find( ( s ) => s.value === PUBLISHED ) ?? { value: PUBLISHED, label: _x( 'Published', 'text', 'nelio-content' ), disabled: true, }, ]; } return statuses.filter( ( { value } ) => value !== 'publish' && value !== 'trash' ); }, [ rawStatuses, canPublish, published ] ); }; const useIsAlreadyPublished = () => useSelect( ( select ) => { const postId = select( NC_POST_EDITOR ).getId(); const post = select( NC_DATA ).getPost( postId ); return 'publish' === post?.status; }, [] );