diff --git a/packages/block-editor/src/components/block-settings-menu/block-edit-visually-button.js b/packages/block-editor/src/components/block-settings-menu/block-edit-visually-button.js new file mode 100644 index 0000000000000..87b28cb2ae26f --- /dev/null +++ b/packages/block-editor/src/components/block-settings-menu/block-edit-visually-button.js @@ -0,0 +1,52 @@ +/** + * WordPress dependencies + */ +import { rawHandler, getBlockContent } from '@wordpress/blocks'; +import { ToolbarButton, ToolbarGroup } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { useCallback } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { store as blockEditorStore } from '../../store'; + +export default function BlockEditVisuallyButton( { clientIds, ...props } ) { + const { block, shouldRender } = useSelect( + ( select ) => { + const firstBlockClientId = clientIds[ 0 ]; + const { isBlockMultiSelected, getBlockMode, getBlock } = + select( blockEditorStore ); + const isSingleSelected = + ! isBlockMultiSelected( firstBlockClientId ); + const isHtmlMode = getBlockMode( firstBlockClientId ) === 'html'; + + return { + block: getBlock( firstBlockClientId ), + shouldRender: isSingleSelected && isHtmlMode, + }; + }, + [ clientIds[ 0 ] ] + ); + + const { replaceBlocks } = useDispatch( blockEditorStore ); + const onClick = useCallback( () => { + replaceBlocks( + block.clientId, + rawHandler( { HTML: getBlockContent( block ) } ) + ); + }, [ block ] ); + + if ( ! shouldRender ) { + return null; + } + + return ( + + + { __( 'Edit visually' ) } + + + ); +} diff --git a/packages/block-editor/src/components/block-settings-menu/index.js b/packages/block-editor/src/components/block-settings-menu/index.js index 0b0b1a775e736..1b3f5fe0aa349 100644 --- a/packages/block-editor/src/components/block-settings-menu/index.js +++ b/packages/block-editor/src/components/block-settings-menu/index.js @@ -7,20 +7,24 @@ import { ToolbarGroup, ToolbarItem } from '@wordpress/components'; * Internal dependencies */ import BlockSettingsDropdown from './block-settings-dropdown'; +import BlockEditVisuallyButton from './block-edit-visually-button'; export function BlockSettingsMenu( { clientIds, ...props } ) { return ( - - - { ( toggleProps ) => ( - - ) } - - + <> + + + + { ( toggleProps ) => ( + + ) } + + + ); }