@@ -17,11 +17,14 @@ import {
1717} from '@wordpress/components' ;
1818import { __ } from '@wordpress/i18n' ;
1919import { desktop , mobile , tablet , external , check } from '@wordpress/icons' ;
20- import { useSelect , useDispatch } from '@wordpress/data' ;
20+ import { useSelect , useDispatch , useRegistry } from '@wordpress/data' ;
2121import { store as coreStore } from '@wordpress/core-data' ;
2222import { store as preferencesStore } from '@wordpress/preferences' ;
2323import { ActionItem } from '@wordpress/interface' ;
24- import { store as blockEditorStore } from '@wordpress/block-editor' ;
24+ import {
25+ store as blockEditorStore ,
26+ privateApis as blockEditorPrivateApis ,
27+ } from '@wordpress/block-editor' ;
2528
2629/**
2730 * Internal dependencies
@@ -30,6 +33,8 @@ import { store as editorStore } from '../../store';
3033import PostPreviewButton from '../post-preview-button' ;
3134import { unlock } from '../../lock-unlock' ;
3235
36+ const { resolveCurrentViewport } = unlock ( blockEditorPrivateApis ) ;
37+
3338export default function PreviewDropdown ( { forceIsAutosaveable, disabled } ) {
3439 const {
3540 deviceType,
@@ -62,9 +67,46 @@ export default function PreviewDropdown( { forceIsAutosaveable, disabled } ) {
6267 const { setDeviceType, setRenderingMode, setDefaultRenderingMode } = unlock (
6368 useDispatch ( editorStore )
6469 ) ;
65- const { resetZoomLevel } = unlock ( useDispatch ( blockEditorStore ) ) ;
70+ const blockEditorDispatch = useDispatch ( blockEditorStore ) ;
71+ const { clearSelectedBlock } = blockEditorDispatch ;
72+ const { resetZoomLevel } = unlock ( blockEditorDispatch ) ;
73+ const registry = useRegistry ( ) ;
74+
75+ const isLargerThanMobile = useViewportMatch ( 'mobile' , '>=' ) ; // >= 480px
76+ const isLargerThanTablet = useViewportMatch ( 'medium' , '>=' ) ; // >= 782px
6677
6778 const handleDevicePreviewChange = ( newDeviceType ) => {
79+ const isListViewOpened = registry
80+ . select ( editorStore )
81+ . isListViewOpened ( ) ;
82+ const selectedBlockClientId = registry
83+ . select ( blockEditorStore )
84+ . getSelectedBlockClientId ( ) ;
85+
86+ if ( ! isListViewOpened && selectedBlockClientId ) {
87+ const targetViewport = resolveCurrentViewport (
88+ newDeviceType ,
89+ isLargerThanMobile ,
90+ isLargerThanTablet
91+ ) ;
92+ const blockEditorSelectors = unlock (
93+ registry . select ( blockEditorStore )
94+ ) ;
95+ const isSelectedBlockHiddenInTargetViewport =
96+ blockEditorSelectors . isBlockHiddenAtViewport (
97+ selectedBlockClientId ,
98+ targetViewport
99+ ) ||
100+ blockEditorSelectors . isBlockParentHiddenAtViewport (
101+ selectedBlockClientId ,
102+ targetViewport
103+ ) ;
104+
105+ if ( isSelectedBlockHiddenInTargetViewport ) {
106+ clearSelectedBlock ( ) ;
107+ }
108+ }
109+
68110 setDeviceType ( newDeviceType ) ;
69111 resetZoomLevel ( ) ;
70112 } ;
0 commit comments