/** * External dependencies */ import { parseISO, endOfMonth, startOfMonth } from 'date-fns'; /** * WordPress dependencies */ import { getSettings } from '../../../date'; import { _x } from '../../../i18n'; import { useDispatch, useSelect } from '../../../data'; import { __experimentalPublishDateTimePicker as PrivatePublishDateTimePicker } from '../../../block-editor'; import { useState, useMemo } from '../../../element'; import { store as coreStore } from '../../../core-data'; /** * Internal dependencies */ import { store as editorStore } from '../../'; /** * Renders the PostSchedule component. It allows the user to schedule a post. * * @param {Object} props Props. * @param {Function} props.onClose Function to close the component. * * @return {Element} The rendered component. */ export default function PostSchedule( props: PrivatePostScheduleProps ): JSX.Element { return ( ); } type PrivatePostScheduleProps = { onClose?: () => void; showPopoverHeaderActions?: boolean; isCompact?: boolean; }; export function PrivatePostSchedule( { onClose, showPopoverHeaderActions, isCompact, }: PrivatePostScheduleProps ): JSX.Element { const { postDate, postType } = useSelect( ( select ) => ( { postDate: select( editorStore ).getEditedPostAttribute( 'date' ) as string, postType: select( editorStore ).getCurrentPostType(), } ), [] ); const { editPost } = useDispatch( editorStore ); const onUpdateDate = ( date: string ) => editPost( { date }, {} ); const [ previewedMonth, setPreviewedMonth ] = useState( startOfMonth( new Date( postDate ) ) ); // Pick up published and scheduled site posts. const eventsByPostType: Array< { id: number; date: string } > = useSelect( ( select ) => select( coreStore ).getEntityRecords( 'postType', postType, { status: 'publish,future', after: startOfMonth( previewedMonth ).toISOString(), before: endOfMonth( previewedMonth ).toISOString(), exclude: [ select( editorStore ).getCurrentPostId() ], per_page: 100, _fields: 'id,date', } ) as Array< { id: number; date: string } >, [ previewedMonth, postType ] ); const events = useMemo( () => ( eventsByPostType || [] ).map( ( { date: eventDate } ) => ( { date: new Date( eventDate ), } ) ), [ eventsByPostType ] ); const settings = getSettings(); // To know if the current timezone is a 12 hour time with look for "a" in the time format // We also make sure this a is not escaped by a "/" const is12HourTime = /a(?!\\)/i.test( settings.formats.time .toLowerCase() // Test only the lower case a. .replace( /\\\\/g, '' ) // Replace "//" with empty strings. .split( '' ) .reverse() .join( '' ) // Reverse the string and test for "a" not followed by a slash. ); return ( setPreviewedMonth( parseISO( date ) ) } onClose={ onClose } isCompact={ isCompact } showPopoverHeaderActions={ showPopoverHeaderActions } /> ); }