diff --git a/packages/block-library/src/utils/poster-image.js b/packages/block-library/src/utils/poster-image.js index eeb694f571a21f..cce9d4ec02ba8c 100644 --- a/packages/block-library/src/utils/poster-image.js +++ b/packages/block-library/src/utils/poster-image.js @@ -6,26 +6,73 @@ import clsx from 'clsx'; /** * WordPress dependencies */ -import { MediaUpload, MediaUploadCheck } from '@wordpress/block-editor'; +import { + MediaUpload, + MediaUploadCheck, + store as blockEditorStore, +} from '@wordpress/block-editor'; +import { store as noticesStore } from '@wordpress/notices'; import { Button, BaseControl, + DropZone, + Spinner, __experimentalHStack as HStack, __experimentalToolsPanelItem as ToolsPanelItem, } from '@wordpress/components'; +import { isBlobURL } from '@wordpress/blob'; import { __, sprintf } from '@wordpress/i18n'; -import { useRef } from '@wordpress/element'; +import { useRef, useState } from '@wordpress/element'; import { useInstanceId } from '@wordpress/compose'; +import { useSelect, useDispatch } from '@wordpress/data'; const POSTER_IMAGE_ALLOWED_MEDIA_TYPES = [ 'image' ]; function PosterImage( { poster, onChange } ) { const posterButtonRef = useRef(); + const [ isLoading, setIsLoading ] = useState( false ); const descriptionId = useInstanceId( PosterImage, 'block-library-poster-image-description' ); + const { getSettings } = useSelect( blockEditorStore ); + const { createErrorNotice } = useDispatch( noticesStore ); + + const onDropFiles = ( filesList ) => { + getSettings().mediaUpload( { + allowedTypes: POSTER_IMAGE_ALLOWED_MEDIA_TYPES, + filesList, + onFileChange: ( [ image ] ) => { + if ( isBlobURL( image?.url ) ) { + setIsLoading( true ); + return; + } + + if ( image ) { + onChange( image ); + } + setIsLoading( false ); + }, + onError: ( message ) => { + createErrorNotice( message, { + id: 'poster-image-upload-notice', + type: 'snackbar', + } ); + setIsLoading( false ); + }, + multiple: false, + } ); + }; + + const getPosterButtonContent = () => { + if ( ! poster && isLoading ) { + return ; + } + + return ! poster ? __( 'Set poster image' ) : __( 'Replace' ); + }; + return ( { + { isLoading && } ) } - { ! poster - ? __( 'Set poster image' ) - : __( 'Replace' ) } + { getPosterButtonContent() }