@gechiui/block-editor
Version:
128 lines (119 loc) • 3.28 kB
JavaScript
/**
* 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 );