/** * External dependencies */ import type { Properties } from 'csstype'; import type { Dispatch, SetStateAction } from 'react'; /** * WordPress dependencies */ import { __ } from '@wordpress/i18n'; import { BlockControls, RichText } from '@wordpress/block-editor'; import { createBlock, type BlockInstance } from '@wordpress/blocks'; import { ToolbarButton } from '@wordpress/components'; import { caption as captionIcon } from '@wordpress/icons'; import { useState, useEffect, useCallback } from '@wordpress/element'; import { usePrevious } from '@wordpress/compose'; /** * Internal dependencies */ import type { BlockAttributes } from '../BlockAttributes'; import type { VSelectedCells, VSelectedLine } from '../utils/table-state'; type Props = { attributes: BlockAttributes; setAttributes: ( attrs: Partial< BlockAttributes > ) => void; insertBlocksAfter: ( blocks: BlockInstance[] ) => void; setSelectedLine: Dispatch< SetStateAction< VSelectedLine > >; setSelectedCells: Dispatch< SetStateAction< VSelectedCells > >; captionStylesObj: Properties; isSelected?: boolean; }; export default function TableCaption( { attributes, setAttributes, insertBlocksAfter, setSelectedLine, setSelectedCells, captionStylesObj, isSelected, }: Props ) { const { caption = '' } = attributes; const prevCaption = usePrevious( caption ); const isCaptionEmpty = RichText.isEmpty( caption ); const isPrevCaptionEmpty = RichText.isEmpty( prevCaption || '' ); const [ showCaption, setShowCaption ] = useState( ! isCaptionEmpty ); const onChange = ( value: string | undefined ) => setAttributes( { caption: value } ); useEffect( () => { if ( ! isCaptionEmpty && isPrevCaptionEmpty ) { setShowCaption( true ); } }, [ isCaptionEmpty, isPrevCaptionEmpty ] ); useEffect( () => { if ( ! isSelected && isCaptionEmpty ) { setShowCaption( false ); } }, [ isSelected, isCaptionEmpty ] ); const ref = useCallback( ( node: any ) => { if ( node && isCaptionEmpty ) { node?.focus(); } }, [ isCaptionEmpty ] ); return ( <> { isSelected && ( { setShowCaption( ! showCaption ); if ( showCaption && caption ) { onChange( undefined ); } } } icon={ captionIcon } isPressed={ showCaption } label={ showCaption ? __( 'Remove caption', 'flexible-table-block' ) : __( 'Add caption', 'flexible-table-block' ) } /> ) } { showCaption && ( ! RichText.isEmpty( caption ) || isSelected ) && ( { setSelectedLine( undefined ); setSelectedCells( undefined ); } } // @ts-ignore: `__unstableOnSplitAtEnd` prop is not exist at @types __unstableOnSplitAtEnd={ () => insertBlocksAfter( createBlock( 'core/paragraph' ) ) } /> ) } ); }