@wordpress/block-library
Version:
Block library for the WordPress editor.
97 lines (85 loc) • 2.92 kB
JavaScript
import { createElement } from "@wordpress/element";
/**
* 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.
*/
const getYearMonth = memoize(date => {
if (!date) {
return {};
}
const dateObj = new Date(date);
return {
year: dateObj.getFullYear(),
month: dateObj.getMonth() + 1
};
});
export default function CalendarEdit(_ref) {
let {
attributes
} = _ref;
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 === null || posts === void 0 ? void 0 : posts.length) === 1
};
}, []);
if (!hasPosts) {
return createElement("div", blockProps, createElement(Placeholder, {
icon: icon,
label: __('Calendar')
}, !hasPostsResolved ? createElement(Spinner, null) : __('No published posts found.')));
}
return createElement("div", blockProps, createElement(Disabled, null, createElement(ServerSideRender, {
block: "core/calendar",
attributes: { ...attributes,
...getYearMonth(date)
}
})));
}
//# sourceMappingURL=edit.js.map