UNPKG

@gechiui/block-editor

Version:
128 lines (119 loc) 3.28 kB
/** * GeChiUI dependencies */ import { __, _x } from '@gechiui/i18n'; import { Button, Modal } from '@gechiui/components'; import { useState, useCallback, useMemo } from '@gechiui/element'; import { getBlockType, createBlock, rawHandler } from '@gechiui/blocks'; import { compose } from '@gechiui/compose'; import { withDispatch, withSelect } from '@gechiui/data'; /** * Internal dependencies */ import Warning from '../warning'; import BlockCompare from '../block-compare'; import { store as blockEditorStore } from '../../store'; export function BlockInvalidWarning( { convertToHTML, convertToBlocks, convertToClassic, attemptBlockRecovery, block, } ) { const hasHTMLBlock = !! getBlockType( 'core/html' ); const [ compare, setCompare ] = useState( false ); const onCompare = useCallback( () => setCompare( true ), [] ); const onCompareClose = useCallback( () => setCompare( false ), [] ); // We memo the array here to prevent the children components from being updated unexpectedly const hiddenActions = useMemo( () => [ { // translators: Button to fix block content title: _x( 'Resolve', 'imperative verb' ), onClick: onCompare, }, hasHTMLBlock && { title: __( '转换为HTML' ), onClick: convertToHTML, }, { title: __( '转换为经典区块' ), onClick: convertToClassic, }, ].filter( Boolean ), [ onCompare, convertToHTML, convertToClassic ] ); return ( <> <Warning actions={ [ <Button key="recover" onClick={ attemptBlockRecovery } variant="primary" > { __( '尝试恢复区块' ) } </Button>, ] } secondaryActions={ hiddenActions } > { __( '此区块包含未预料的或无效的内容。' ) } </Warning> { compare && ( <Modal title={ // translators: Dialog title to fix block content __( '解析区块' ) } onRequestClose={ onCompareClose } className="block-editor-block-compare" > <BlockCompare block={ block } onKeep={ convertToHTML } onConvert={ convertToBlocks } convertor={ blockToBlocks } convertButtonText={ __( '转换为区块' ) } /> </Modal> ) } </> ); } const blockToClassic = ( block ) => createBlock( 'core/freeform', { content: block.originalContent, } ); const blockToHTML = ( block ) => createBlock( 'core/html', { content: block.originalContent, } ); const blockToBlocks = ( block ) => rawHandler( { HTML: block.originalContent, } ); const recoverBlock = ( { name, attributes, innerBlocks } ) => createBlock( name, attributes, innerBlocks ); export default compose( [ withSelect( ( select, { clientId } ) => ( { block: select( blockEditorStore ).getBlock( clientId ), } ) ), withDispatch( ( dispatch, { block } ) => { const { replaceBlock } = dispatch( blockEditorStore ); return { convertToClassic() { replaceBlock( block.clientId, blockToClassic( block ) ); }, convertToHTML() { replaceBlock( block.clientId, blockToHTML( block ) ); }, convertToBlocks() { replaceBlock( block.clientId, blockToBlocks( block ) ); }, attemptBlockRecovery() { replaceBlock( block.clientId, recoverBlock( block ) ); }, }; } ), ] )( BlockInvalidWarning );