-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
dropdown.js
92 lines (86 loc) · 2.05 KB
/
dropdown.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
* WordPress dependencies
*/
import { Button, Dropdown } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { useSelect } from '@wordpress/data';
import {
useShortcut,
store as keyboardShortcutsStore,
} from '@wordpress/keyboard-shortcuts';
import { useCallback, forwardRef } from '@wordpress/element';
import { listView } from '@wordpress/icons';
/**
* Internal dependencies
*/
import BlockNavigation from './';
import { store as blockEditorStore } from '../../store';
function BlockNavigationDropdownToggle( {
isEnabled,
onToggle,
isOpen,
innerRef,
...props
} ) {
useShortcut(
'core/edit-post/toggle-block-navigation',
useCallback( onToggle, [ onToggle ] ),
{
bindGlobal: true,
isDisabled: ! isEnabled,
}
);
const shortcut = useSelect(
( select ) =>
select( keyboardShortcutsStore ).getShortcutRepresentation(
'core/edit-post/toggle-block-navigation'
),
[]
);
return (
<Button
{ ...props }
ref={ innerRef }
icon={ listView }
aria-expanded={ isOpen }
aria-haspopup="true"
onClick={ isEnabled ? onToggle : undefined }
/* translators: button label text should, if possible, be under 16 characters. */
label={ __( 'List view' ) }
className="block-editor-block-navigation"
shortcut={ shortcut }
aria-disabled={ ! isEnabled }
/>
);
}
function BlockNavigationDropdown(
{ isDisabled, __experimentalFeatures, ...props },
ref
) {
const hasBlocks = useSelect(
( select ) => !! select( blockEditorStore ).getBlockCount(),
[]
);
const isEnabled = hasBlocks && ! isDisabled;
return (
<Dropdown
contentClassName="block-editor-block-navigation__popover"
position="bottom right"
renderToggle={ ( { isOpen, onToggle } ) => (
<BlockNavigationDropdownToggle
{ ...props }
innerRef={ ref }
isOpen={ isOpen }
onToggle={ onToggle }
isEnabled={ isEnabled }
/>
) }
renderContent={ () => (
<BlockNavigation
__experimentalFeatures={ __experimentalFeatures }
/>
) }
/>
);
}
export default forwardRef( BlockNavigationDropdown );