UNPKG

@wordpress/block-editor

Version:
108 lines (96 loc) 2.54 kB
/** * External dependencies */ import classnames from 'classnames'; /** * WordPress dependencies */ import { __ } from '@wordpress/i18n'; import { compose } from '@wordpress/compose'; import { decodeEntities } from '@wordpress/html-entities'; import { withSelect, withDispatch } from '@wordpress/data'; import { ENTER, SPACE } from '@wordpress/keycodes'; /** * Internal dependencies */ import Inserter from '../inserter'; import { store as blockEditorStore } from '../../store'; /** * Zero width non-breaking space, used as padding for the paragraph when it is * empty. */ export const ZWNBSP = '\ufeff'; export function DefaultBlockAppender( { isLocked, onAppend, showPrompt, placeholder, rootClientId, } ) { if ( isLocked ) { return null; } const value = decodeEntities( placeholder ) || __( 'Type / to choose a block' ); return ( <div data-root-client-id={ rootClientId || '' } className={ classnames( 'block-editor-default-block-appender', { 'has-visible-prompt': showPrompt, } ) } > <p tabIndex="0" // We want this element to be styled as a paragraph by themes. // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role role="button" aria-label={ __( 'Add default block' ) } // A wrapping container for this one already has the wp-block className. className="block-editor-default-block-appender__content" onKeyDown={ ( event ) => { if ( ENTER === event.keyCode || SPACE === event.keyCode ) { onAppend(); } } } onClick={ () => onAppend() } onFocus={ () => { if ( showPrompt ) { onAppend(); } } } > { showPrompt ? value : ZWNBSP } </p> <Inserter rootClientId={ rootClientId } position="bottom right" isAppender __experimentalIsQuick /> </div> ); } export default compose( withSelect( ( select, ownProps ) => { const { getBlockCount, getSettings, getTemplateLock } = select( blockEditorStore ); const isEmpty = ! getBlockCount( ownProps.rootClientId ); const { bodyPlaceholder } = getSettings(); return { showPrompt: isEmpty, isLocked: !! getTemplateLock( ownProps.rootClientId ), placeholder: bodyPlaceholder, }; } ), withDispatch( ( dispatch, ownProps ) => { const { insertDefaultBlock, startTyping } = dispatch( blockEditorStore ); return { onAppend() { const { rootClientId } = ownProps; insertDefaultBlock( undefined, rootClientId ); startTyping(); }, }; } ) )( DefaultBlockAppender );