@@ -275,13 +275,37 @@ function BackgroundImageControls( {
275275 displayInPanel,
276276 defaultValues,
277277 containerRef,
278+ useFeaturedImage,
279+ onToggleFeaturedImage,
278280} ) {
279281 const [ isUploading , setIsUploading ] = useState ( false ) ;
280282 const { getSettings } = useSelect ( blockEditorStore ) ;
281283
282- const { id, title, url } = style ?. background ?. backgroundImage || {
284+ const featuredImageData = useSelect ( ( select ) => {
285+ // eslint-disable-next-line @wordpress/data-no-store-string-literals
286+ const { getEditedPostAttribute } = select ( 'core/editor' ) ;
287+ // eslint-disable-next-line @wordpress/data-no-store-string-literals
288+ const { getMedia } = select ( 'core' ) ;
289+
290+ const featuredMediaId = getEditedPostAttribute ( 'featured_media' ) ;
291+
292+ return featuredMediaId ? getMedia ( featuredMediaId ) : null ;
293+ } , [ ] ) ;
294+
295+ const { id, title, url, featuredImage } = style ?. background
296+ ?. backgroundImage || {
283297 ...inheritedValue ?. background ?. backgroundImage ,
284298 } ;
299+ const useFeaturedImageValue =
300+ typeof useFeaturedImage !== 'undefined'
301+ ? useFeaturedImage
302+ : ! ! featuredImage ;
303+
304+ const displayUrl =
305+ useFeaturedImageValue && featuredImageData ?. source_url
306+ ? featuredImageData . source_url
307+ : url ;
308+
285309 const { createErrorNotice } = useDispatch ( noticesStore ) ;
286310 const onUploadError = ( message ) => {
287311 createErrorNotice ( message , { type : 'snackbar' } ) ;
@@ -297,6 +321,39 @@ function BackgroundImageControls( {
297321 )
298322 ) ;
299323
324+ const toggleFeaturedImage = ( ) => {
325+ const currentBackgroundImage =
326+ style ?. background ?. backgroundImage &&
327+ typeof style . background . backgroundImage === 'object'
328+ ? style . background . backgroundImage
329+ : { } ;
330+
331+ const nextValue = ! useFeaturedImageValue ;
332+
333+ if ( nextValue && featuredImageData ?. source_url ) {
334+ onChange (
335+ setImmutably ( style , [ 'background' , 'backgroundImage' ] , {
336+ url : featuredImageData . source_url ,
337+ id : featuredImageData . id ,
338+ source : 'featured' ,
339+ title : featuredImageData . title ?. rendered ,
340+ featuredImage : true ,
341+ } )
342+ ) ;
343+ return ;
344+ }
345+
346+ onChange (
347+ setImmutably ( style , [ 'background' , 'backgroundImage' ] , {
348+ ...currentBackgroundImage ,
349+ featuredImage : false ,
350+ } )
351+ ) ;
352+ } ;
353+
354+ const onToggleFeaturedImageHandler =
355+ onToggleFeaturedImage || toggleFeaturedImage ;
356+
300357 const onSelectMedia = ( media ) => {
301358 if ( ! media || ! media . url ) {
302359 resetBackgroundImage ( ) ;
@@ -375,16 +432,18 @@ function BackgroundImageControls( {
375432 } )
376433 ) ;
377434 const canRemove = ! hasValue && hasBackgroundImageValue ( inheritedValue ) ;
378- const imgLabel = title || getFilename ( url ) || __ ( 'Image' ) ;
435+ const imgLabel = title || getFilename ( displayUrl ) || __ ( 'Image' ) ;
379436
380437 return (
381438 < div className = "block-editor-global-styles-background-panel__image-tools-panel-item" >
382439 { isUploading && < LoadingSpinner /> }
383440 < MediaReplaceFlow
384441 mediaId = { id }
385- mediaURL = { url }
442+ mediaURL = { displayUrl }
386443 allowedTypes = { [ IMAGE_BACKGROUND_TYPE ] }
387444 accept = "image/*"
445+ useFeaturedImage = { useFeaturedImageValue }
446+ onToggleFeaturedImage = { onToggleFeaturedImageHandler }
388447 onSelect = { onSelectMedia }
389448 popoverProps = { {
390449 className : clsx ( {
@@ -394,7 +453,7 @@ function BackgroundImageControls( {
394453 } }
395454 name = {
396455 < InspectorImagePreviewItem
397- imgUrl = { url }
456+ imgUrl = { displayUrl }
398457 filename = { title }
399458 label = { imgLabel }
400459 />
@@ -644,6 +703,8 @@ export default function BackgroundImagePanel( {
644703 inheritedValue = value ,
645704 settings,
646705 defaultValues = { } ,
706+ useFeaturedImage,
707+ onToggleFeaturedImage,
647708} ) {
648709 /*
649710 * Resolve any inherited "ref" pointers.
@@ -739,6 +800,8 @@ export default function BackgroundImagePanel( {
739800 onRemoveImage = { ( ) => setIsDropDownOpen ( false ) }
740801 defaultValues = { defaultValues }
741802 containerRef = { containerRef }
803+ useFeaturedImage = { useFeaturedImage }
804+ onToggleFeaturedImage = { onToggleFeaturedImage }
742805 />
743806 < BackgroundSizeControls
744807 onChange = { onChange }
@@ -760,6 +823,8 @@ export default function BackgroundImagePanel( {
760823 } }
761824 onRemoveImage = { ( ) => setIsDropDownOpen ( false ) }
762825 containerRef = { containerRef }
826+ useFeaturedImage = { useFeaturedImage }
827+ onToggleFeaturedImage = { onToggleFeaturedImage }
763828 />
764829 ) }
765830 </ div >
0 commit comments