@wordpress/block-library
Version:
Block library for the WordPress editor.
99 lines (96 loc) • 3 kB
JavaScript
/**
* External dependencies
*/
import memoize from 'memize';
/**
* WordPress dependencies
*/
import { calendar as icon } from '@wordpress/icons';
import { Disabled, Placeholder, Spinner } from '@wordpress/components';
import { useSelect } from '@wordpress/data';
import ServerSideRender from '@wordpress/server-side-render';
import { useBlockProps } from '@wordpress/block-editor';
import { store as coreStore } from '@wordpress/core-data';
import { __ } from '@wordpress/i18n';
/**
* Returns the year and month of a specified date.
*
* @see `WP_REST_Posts_Controller::prepare_date_response()`.
*
* @param {string} date Date in `ISO8601/RFC3339` format.
* @return {Object} Year and date of the specified date.
*/
import { jsx as _jsx } from "react/jsx-runtime";
const getYearMonth = memoize(date => {
if (!date) {
return {};
}
const dateObj = new Date(date);
return {
year: dateObj.getFullYear(),
month: dateObj.getMonth() + 1
};
});
export default function CalendarEdit({
attributes
}) {
const blockProps = useBlockProps();
const {
date,
hasPosts,
hasPostsResolved
} = useSelect(select => {
const {
getEntityRecords,
hasFinishedResolution
} = select(coreStore);
const singlePublishedPostQuery = {
status: 'publish',
per_page: 1
};
const posts = getEntityRecords('postType', 'post', singlePublishedPostQuery);
const postsResolved = hasFinishedResolution('getEntityRecords', ['postType', 'post', singlePublishedPostQuery]);
let _date;
// FIXME: @wordpress/block-library should not depend on @wordpress/editor.
// Blocks can be loaded into a *non-post* block editor.
// eslint-disable-next-line @wordpress/data-no-store-string-literals
const editorSelectors = select('core/editor');
if (editorSelectors) {
const postType = editorSelectors.getEditedPostAttribute('type');
// Dates are used to overwrite year and month used on the calendar.
// This overwrite should only happen for 'post' post types.
// For other post types the calendar always displays the current month.
if (postType === 'post') {
_date = editorSelectors.getEditedPostAttribute('date');
}
}
return {
date: _date,
hasPostsResolved: postsResolved,
hasPosts: postsResolved && posts?.length === 1
};
}, []);
if (!hasPosts) {
return /*#__PURE__*/_jsx("div", {
...blockProps,
children: /*#__PURE__*/_jsx(Placeholder, {
icon: icon,
label: __('Calendar'),
children: !hasPostsResolved ? /*#__PURE__*/_jsx(Spinner, {}) : __('No published posts found.')
})
});
}
return /*#__PURE__*/_jsx("div", {
...blockProps,
children: /*#__PURE__*/_jsx(Disabled, {
children: /*#__PURE__*/_jsx(ServerSideRender, {
block: "core/calendar",
attributes: {
...attributes,
...getYearMonth(date)
}
})
})
});
}
//# sourceMappingURL=edit.js.map