Skip to content

Commit 0e1898f

Browse files
author
Jon Q
committed
Revert "Revert "Fullscreen Mode: Change the "Back" button to toggle the sidebar (#21121)" (#21929)"
This reverts commit caf52c1.
1 parent 12e43ba commit 0e1898f

File tree

14 files changed

+227
-85
lines changed

14 files changed

+227
-85
lines changed

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/e2e-tests/specs/editor/various/fullscreen-mode.test.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,5 @@ describe( 'Fullscreen Mode', () => {
2121
} );
2222

2323
expect( isFullscreenEnabled ).toBe( true );
24-
25-
const fullscreenCloseButton = await page.$(
26-
'.edit-post-fullscreen-mode-close'
27-
);
28-
29-
expect( fullscreenCloseButton ).not.toBeNull();
3024
} );
3125
} );

packages/edit-post/src/components/header/fullscreen-mode-close/index.js

Lines changed: 0 additions & 44 deletions
This file was deleted.

packages/edit-post/src/components/header/fullscreen-mode-close/style.scss

Lines changed: 0 additions & 29 deletions
This file was deleted.

packages/edit-post/src/components/header/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
/**
1515
* Internal dependencies
1616
*/
17-
import FullscreenModeClose from './fullscreen-mode-close';
1817
import HeaderToolbar from './header-toolbar';
1918
import MoreMenu from './more-menu';
2019
import PostPublishButtonOrToggle from './post-publish-button-or-toggle';
@@ -32,6 +31,7 @@ function Header( {
3231
isPublishSidebarOpened,
3332
isSaving,
3433
getBlockSelectionStart,
34+
isFullscreenActive,
3535
} = useSelect(
3636
( select ) => ( {
3737
shortcut: select(
@@ -48,6 +48,9 @@ function Header( {
4848
getBlockSelectionStart: select( 'core/block-editor' )
4949
.getBlockSelectionStart,
5050
isPostSaveable: select( 'core/editor' ).isEditedPostSaveable(),
51+
isFullscreenActive: select( 'core/edit-post' ).isFeatureActive(
52+
'fullscreenMode'
53+
),
5154
deviceType: select(
5255
'core/edit-post'
5356
).__experimentalGetPreviewDeviceType(),

packages/edit-post/src/style.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ $footer-height: $button-size-small;
33
@import "../../interface/src/style.scss";
44

55
@import "./components/header/style.scss";
6-
@import "./components/header/fullscreen-mode-close/style.scss";
76
@import "./components/header/header-toolbar/style.scss";
87
@import "./components/header/more-menu/style.scss";
98
@import "./components/keyboard-shortcut-help-modal/style.scss";

packages/edit-site/src/components/header/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@ export default function Header( { openEntitiesSavedStates } ) {
9595
} catch ( err ) {}
9696
}, [] );
9797

98+
const { isFullscreenActive } = useSelect(
99+
( select ) => ( {
100+
isFullscreenActive: select( 'core/edit-site' ).isFeatureActive(
101+
'fullscreenMode'
102+
),
103+
} ),
104+
[]
105+
);
106+
98107
const deviceType = useSelect( ( select ) => {
99108
return select( 'core/edit-site' ).__experimentalGetPreviewDeviceType();
100109
}, [] );

packages/edit-site/src/style.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
@import "./components/block-editor/style.scss";
44
@import "./components/header/style.scss";
5-
@import "./components/header/fullscreen-mode-close/style.scss";
65
@import "./components/header/more-menu/style.scss";
76
@import "./components/notices/style.scss";
87
@import "./components/sidebar/style.scss";

packages/interface/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"@wordpress/element": "file:../element",
3333
"@wordpress/i18n": "file:../i18n",
3434
"@wordpress/icons": "file:../icons",
35+
"@wordpress/keycodes": "file:../keycodes",
3536
"@wordpress/plugins": "file:../plugins",
3637
"classnames": "^2.2.5",
3738
"lodash": "^4.17.15"
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* WordPress dependencies
3+
*/
4+
import { Button } from '@wordpress/components';
5+
import { useRef, useEffect, useState } from '@wordpress/element';
6+
import { ESCAPE, TAB } from '@wordpress/keycodes';
7+
import { __ } from '@wordpress/i18n';
8+
import { wordpress } from '@wordpress/icons';
9+
10+
function AdminMenuToggle() {
11+
const buttonRef = useRef();
12+
const toggleMenu = useToggle( { ref: buttonRef } );
13+
14+
return (
15+
<Button
16+
className="interface-admin-menu-toggle"
17+
icon={ wordpress }
18+
iconSize={ 36 }
19+
onClick={ toggleMenu }
20+
label={ __( 'Show sidebar menu' ) }
21+
ref={ buttonRef }
22+
/>
23+
);
24+
}
25+
26+
function useToggle( { ref } ) {
27+
const [ isActive, setIsActive ] = useState( false );
28+
const buttonNode = ref?.current;
29+
30+
const adminMenuNode = document.querySelector( '#adminmenumain' );
31+
32+
const toggleClassName = 'is-showing-admin-menu';
33+
34+
const toggleAdminMenu = () => setIsActive( ! isActive );
35+
const closeAdminMenu = () => setIsActive( false );
36+
37+
const focusFirstAdminMenuItem = () => {
38+
if ( ! buttonNode ) return;
39+
40+
const isButtonFocused = buttonNode.matches( ':focus' );
41+
const item = adminMenuNode.querySelector( '#adminmenu > li > a' );
42+
43+
if ( isButtonFocused && item ) {
44+
item.focus();
45+
}
46+
};
47+
48+
// Renders the open/closed UI for the admin menu
49+
useEffect( () => {
50+
if ( isActive ) {
51+
document.body.classList.add( toggleClassName );
52+
} else {
53+
document.body.classList.remove( toggleClassName );
54+
}
55+
}, [ isActive ] );
56+
57+
// Handles closing the admin menu when clicking outside
58+
useEffect( () => {
59+
const handleOnClickOutside = ( event ) => {
60+
if ( ! isActive ) return;
61+
62+
const { target } = event;
63+
64+
const didClickOutside =
65+
! adminMenuNode.contains( target ) && target !== buttonNode;
66+
67+
if ( didClickOutside ) {
68+
closeAdminMenu();
69+
}
70+
};
71+
72+
document.body.addEventListener( 'click', handleOnClickOutside );
73+
74+
return () => {
75+
document.body.removeEventListener( 'click', handleOnClickOutside );
76+
};
77+
}, [ isActive, buttonNode ] );
78+
79+
// Handles admin menu keyboard interactions
80+
useEffect( () => {
81+
const handleOnKeyDown = ( event ) => {
82+
if ( ! isActive ) return;
83+
84+
const { keyCode } = event;
85+
86+
if ( keyCode === ESCAPE ) {
87+
closeAdminMenu();
88+
}
89+
90+
if ( keyCode === TAB ) {
91+
focusFirstAdminMenuItem();
92+
}
93+
};
94+
95+
document.body.addEventListener( 'keydown', handleOnKeyDown );
96+
97+
return () => {
98+
document.body.removeEventListener( 'keydown', handleOnKeyDown );
99+
};
100+
}, [ isActive ] );
101+
102+
return toggleAdminMenu;
103+
}
104+
105+
export default AdminMenuToggle;

0 commit comments

Comments
 (0)