UNPKG

@wordpress/block-editor

Version:
105 lines (94 loc) 2.56 kB
/** * WordPress dependencies */ import { useMemo } from '@wordpress/element'; import { useSelect } from '@wordpress/data'; /** * Internal dependencies */ import { store as blockEditorStore } from '../../store'; // Maximum number of images to display in a list view row. const MAX_IMAGES = 3; const IMAGE_GETTERS = { 'core/image': ( { clientId, attributes } ) => { if ( attributes.url ) { return { url: attributes.url, alt: attributes.alt || '', clientId, }; } }, 'core/cover': ( { clientId, attributes } ) => { if ( attributes.backgroundType === 'image' && attributes.url ) { return { url: attributes.url, alt: attributes.alt || '', clientId, }; } }, 'core/media-text': ( { clientId, attributes } ) => { if ( attributes.mediaType === 'image' && attributes.mediaUrl ) { return { url: attributes.mediaUrl, alt: attributes.mediaAlt || '', clientId, }; } }, 'core/gallery': ( { innerBlocks } ) => { const images = []; const getValues = !! innerBlocks?.length ? IMAGE_GETTERS[ innerBlocks[ 0 ].name ] : undefined; if ( ! getValues ) { return images; } for ( const innerBlock of innerBlocks ) { const img = getValues( innerBlock ); if ( img ) { images.push( img ); } if ( images.length >= MAX_IMAGES ) { return images; } } return images; }, }; function getImagesFromBlock( block, isExpanded ) { const getImages = IMAGE_GETTERS[ block.name ]; const images = !! getImages ? getImages( block ) : undefined; if ( ! images ) { return []; } if ( ! Array.isArray( images ) ) { return [ images ]; } return isExpanded ? [] : images; } /** * Get a block's preview images for display within a list view row. * * TODO: Currently only supports images from the core/image and core/gallery * blocks. This should be expanded to support other blocks that have images, * potentially via an API that blocks can opt into / provide their own logic. * * @param {Object} props Hook properties. * @param {string} props.clientId The block's clientId. * @param {boolean} props.isExpanded Whether or not the block is expanded in the list view. * @return {Array} Images. */ export default function useListViewImages( { clientId, isExpanded } ) { const { block } = useSelect( ( select ) => { return { block: select( blockEditorStore ).getBlock( clientId ) }; }, [ clientId ] ); const images = useMemo( () => { return getImagesFromBlock( block, isExpanded ); }, [ block, isExpanded ] ); return images; }