From 0ede795475b8b7a5d11055fe813e43226a22fa65 Mon Sep 17 00:00:00 2001 From: Andrei Draganescu Date: Mon, 29 Aug 2022 18:00:56 +0300 Subject: [PATCH] Implements handling focus persistence in the Navigation Selector according to #42956 Switching between menus keeps the menu open and focused on the current selection. Importing classic menus or creating new ones focuses the current navigation block. Co-authored-by: Daniel Richards <677833+talldan@users.noreply.github.com> --- .../src/navigation/edit/index.js | 67 +++++-------------- .../edit/navigation-menu-selector.js | 28 +++----- 2 files changed, 29 insertions(+), 66 deletions(-) diff --git a/packages/block-library/src/navigation/edit/index.js b/packages/block-library/src/navigation/edit/index.js index 08e1378394a52..e19964c6626fc 100644 --- a/packages/block-library/src/navigation/edit/index.js +++ b/packages/block-library/src/navigation/edit/index.js @@ -133,6 +133,10 @@ function Navigation( { isError: createNavigationMenuIsError, } = useCreateNavigationMenu( clientId ); + const createUntitledEmptyNavigationMenu = () => { + createNavigationMenu( '' ); + }; + useEffect( () => { hideNavigationMenuStatusNotice(); @@ -141,8 +145,7 @@ function Navigation( { } if ( createNavigationMenuIsSuccess ) { - setRef( createNavigationMenuPost.id ); - selectBlock( clientId ); + handleUpdateMenu( createNavigationMenuPost.id, true ); showNavigationMenuStatusNotice( __( `Navigation Menu successfully created.` ) @@ -155,7 +158,6 @@ function Navigation( { ); } }, [ - createNavigationMenu, createNavigationMenuStatus, createNavigationMenuError, createNavigationMenuPost, @@ -191,7 +193,6 @@ function Navigation( { isNavigationMenuResolved, isNavigationMenuMissing, navigationMenus, - navigationMenu, canUserUpdateNavigationMenu, hasResolvedCanUserUpdateNavigationMenu, canUserDeleteNavigationMenu, @@ -240,8 +241,6 @@ function Navigation( { const navRef = useRef(); - const isDraftNavigationMenu = navigationMenu?.status === 'draft'; - const { convert: convertClassicMenu, status: classicMenuConversionStatus, @@ -331,9 +330,11 @@ function Navigation( { ] = useState(); const [ detectedOverlayColor, setDetectedOverlayColor ] = useState(); - const handleUpdateMenu = ( menuId ) => { + const handleUpdateMenu = ( menuId, focusNavigationBlock = false ) => { setRef( menuId ); - selectBlock( clientId ); + if ( focusNavigationBlock ) { + selectBlock( clientId ); + } }; useEffect( () => { @@ -428,27 +429,6 @@ function Navigation( { const hasManagePermissions = canUserCreateNavigationMenu || canUserUpdateNavigationMenu; - const navigationSelectorRef = useRef(); - const [ shouldFocusNavigationSelector, setShouldFocusNavigationSelector ] = - useState( false ); - - // Focus support after menu selection. - useEffect( () => { - if ( - isDraftNavigationMenu || - ! isEntityAvailable || - ! shouldFocusNavigationSelector - ) { - return; - } - navigationSelectorRef?.current?.focus(); - setShouldFocusNavigationSelector( false ); - }, [ - isDraftNavigationMenu, - isEntityAvailable, - shouldFocusNavigationSelector, - ] ); - const isResponsive = 'never' !== overlayMenu; const overlayMenuPreviewClasses = classnames( @@ -610,12 +590,10 @@ function Navigation( { { handleUpdateMenu( menuId ); - setShouldFocusNavigationSelector( true ); } } onSelectClassicMenu={ async ( classicMenu ) => { const navMenu = await convertClassicMenu( @@ -623,11 +601,10 @@ function Navigation( { classicMenu.name ); if ( navMenu ) { - handleUpdateMenu( navMenu.id ); - setShouldFocusNavigationSelector( true ); + handleUpdateMenu( navMenu.id, true ); } } } - onCreateNew={ () => createNavigationMenu( '', [] ) } + onCreateNew={ createUntitledEmptyNavigationMenu } /* translators: %s: The name of a menu. */ actionLabel={ __( "Switch to '%s'" ) } /> @@ -685,12 +662,10 @@ function Navigation( { { handleUpdateMenu( menuId ); - setShouldFocusNavigationSelector( true ); } } onSelectClassicMenu={ async ( classicMenu ) => { const navMenu = await convertClassicMenu( @@ -698,11 +673,10 @@ function Navigation( { classicMenu.name ); if ( navMenu ) { - handleUpdateMenu( navMenu.id ); - setShouldFocusNavigationSelector( true ); + handleUpdateMenu( navMenu.id, true ); } } } - onCreateNew={ () => createNavigationMenu( '', [] ) } + onCreateNew={ createUntitledEmptyNavigationMenu } /* translators: %s: The name of a menu. */ actionLabel={ __( "Switch to '%s'" ) } /> @@ -723,7 +697,7 @@ function Navigation( { 'Navigation menu has been deleted or is unavailable. ' ) }