@wordpress/edit-post
Version:
Edit Post module for WordPress.
184 lines (173 loc) • 4.88 kB
JavaScript
/**
* External dependencies
*/
import classnames from 'classnames';
/**
* WordPress dependencies
*/
import { useViewportMatch } from '@wordpress/compose';
import { useSelect, useDispatch } from '@wordpress/data';
import { __, _x } from '@wordpress/i18n';
import {
BlockToolbar,
NavigableToolbar,
BlockNavigationDropdown,
ToolSelector,
store as blockEditorStore,
} from '@wordpress/block-editor';
import {
TableOfContents,
EditorHistoryRedo,
EditorHistoryUndo,
} from '@wordpress/editor';
import { Button, ToolbarItem } from '@wordpress/components';
import { plus } from '@wordpress/icons';
import { useRef } from '@wordpress/element';
/**
* Internal dependencies
*/
import TemplateTitle from '../template-title';
import { store as editPostStore } from '../../../store';
function HeaderToolbar() {
const inserterButton = useRef();
const { setIsInserterOpened } = useDispatch( editPostStore );
const {
hasFixedToolbar,
isInserterEnabled,
isInserterOpened,
isTextModeEnabled,
previewDeviceType,
showIconLabels,
isTemplateMode,
} = useSelect( ( select ) => {
const {
hasInserterItems,
getBlockRootClientId,
getBlockSelectionEnd,
} = select( blockEditorStore );
return {
hasFixedToolbar: select( editPostStore ).isFeatureActive(
'fixedToolbar'
),
// This setting (richEditingEnabled) should not live in the block editor's setting.
isInserterEnabled:
select( editPostStore ).getEditorMode() === 'visual' &&
select( 'core/editor' ).getEditorSettings()
.richEditingEnabled &&
hasInserterItems(
getBlockRootClientId( getBlockSelectionEnd() )
),
isInserterOpened: select( editPostStore ).isInserterOpened(),
isTextModeEnabled:
select( editPostStore ).getEditorMode() === 'text',
previewDeviceType: select(
editPostStore
).__experimentalGetPreviewDeviceType(),
showIconLabels: select( editPostStore ).isFeatureActive(
'showIconLabels'
),
isTemplateMode: select( editPostStore ).isEditingTemplate(),
};
}, [] );
const isLargeViewport = useViewportMatch( 'medium' );
const isWideViewport = useViewportMatch( 'wide' );
const displayBlockToolbar =
! isLargeViewport || previewDeviceType !== 'Desktop' || hasFixedToolbar;
const toolbarAriaLabel = displayBlockToolbar
? /* translators: accessibility text for the editor toolbar when Top Toolbar is on */
__( 'Document and block tools' )
: /* translators: accessibility text for the editor toolbar when Top Toolbar is off */
__( 'Document tools' );
const overflowItems = (
<>
<ToolbarItem
as={ TableOfContents }
hasOutlineItemsDisabled={ isTextModeEnabled }
repositionDropdown={ showIconLabels && ! isWideViewport }
showTooltip={ ! showIconLabels }
isTertiary={ showIconLabels }
/>
<ToolbarItem
as={ BlockNavigationDropdown }
isDisabled={ isTextModeEnabled }
showTooltip={ ! showIconLabels }
isTertiary={ showIconLabels }
/>
</>
);
return (
<NavigableToolbar
className="edit-post-header-toolbar"
aria-label={ toolbarAriaLabel }
>
<div className="edit-post-header-toolbar__left">
<ToolbarItem
ref={ inserterButton }
as={ Button }
className="edit-post-header-toolbar__inserter-toggle"
isPrimary
isPressed={ isInserterOpened }
onMouseDown={ ( event ) => {
event.preventDefault();
} }
onClick={ () => {
if ( isInserterOpened ) {
// Focusing the inserter button closes the inserter popover
inserterButton.current.focus();
} else {
setIsInserterOpened( true );
}
} }
disabled={ ! isInserterEnabled }
icon={ plus }
/* translators: button label text should, if possible, be under 16
characters. */
label={ _x(
'Toggle block inserter',
'Generic label for block inserter button'
) }
showTooltip={ ! showIconLabels }
>
{ showIconLabels && __( 'Add' ) }
</ToolbarItem>
{ ( isWideViewport || ! showIconLabels ) && (
<>
{ isLargeViewport && (
<ToolbarItem
as={ ToolSelector }
showTooltip={ ! showIconLabels }
isTertiary={ showIconLabels }
disabled={ isTextModeEnabled }
/>
) }
<ToolbarItem
as={ EditorHistoryUndo }
showTooltip={ ! showIconLabels }
isTertiary={ showIconLabels }
/>
<ToolbarItem
as={ EditorHistoryRedo }
showTooltip={ ! showIconLabels }
isTertiary={ showIconLabels }
/>
{ overflowItems }
</>
) }
</div>
<TemplateTitle />
{ displayBlockToolbar && (
<div
className={ classnames(
'edit-post-header-toolbar__block-toolbar',
{
'is-pushed-down': isTemplateMode,
}
) }
>
<BlockToolbar hideDragHandle />
</div>
) }
</NavigableToolbar>
);
}
export default HeaderToolbar;