@wordpress/block-library 6.0.23 → 6.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,18 +11,47 @@ import { addQueryArgs } from '@wordpress/url';
11
11
  * Internal dependencies
12
12
  */
13
13
  import useNavigationMenu from '../use-navigation-menu';
14
+ import useNavigationEntities from '../use-navigation-entities';
15
+ import useConvertClassicMenu from '../use-convert-classic-menu';
16
+ import useCreateNavigationMenu from './use-create-navigation-menu';
14
17
 
15
18
  export default function NavigationMenuSelector( {
19
+ clientId,
16
20
  onSelect,
17
21
  onCreateNew,
18
- showCreate = false,
22
+ canUserCreateNavigation = false,
19
23
  } ) {
24
+ const {
25
+ menus: classicMenus,
26
+ hasMenus: hasClassicMenus,
27
+ } = useNavigationEntities();
20
28
  const { navigationMenus } = useNavigationMenu();
21
29
  const ref = useEntityId( 'postType', 'wp_navigation' );
22
30
 
31
+ const createNavigationMenu = useCreateNavigationMenu( clientId );
32
+
33
+ const onFinishMenuCreation = async (
34
+ blocks,
35
+ navigationMenuTitle = null
36
+ ) => {
37
+ if ( ! canUserCreateNavigation ) {
38
+ return;
39
+ }
40
+
41
+ const navigationMenu = await createNavigationMenu(
42
+ navigationMenuTitle,
43
+ blocks
44
+ );
45
+ onSelect( navigationMenu );
46
+ };
47
+
48
+ const convertClassicMenuToBlocks = useConvertClassicMenu(
49
+ onFinishMenuCreation
50
+ );
51
+
23
52
  return (
24
53
  <>
25
- <MenuGroup>
54
+ <MenuGroup label={ __( 'Menus' ) }>
26
55
  <MenuItemsChoice
27
56
  value={ ref }
28
57
  onSelect={ ( selectedId ) =>
@@ -46,19 +75,40 @@ export default function NavigationMenuSelector( {
46
75
  } ) }
47
76
  />
48
77
  </MenuGroup>
49
- { showCreate && (
50
- <MenuGroup>
51
- <MenuItem onClick={ onCreateNew }>
52
- { __( 'Create new menu' ) }
53
- </MenuItem>
54
- <MenuItem
55
- href={ addQueryArgs( 'edit.php', {
56
- post_type: 'wp_navigation',
57
- } ) }
58
- >
59
- { __( 'Manage menus' ) }
60
- </MenuItem>
61
- </MenuGroup>
78
+ { canUserCreateNavigation && (
79
+ <>
80
+ { hasClassicMenus && (
81
+ <MenuGroup label={ __( 'Classic Menus' ) }>
82
+ { classicMenus.map( ( menu ) => {
83
+ return (
84
+ <MenuItem
85
+ onClick={ () => {
86
+ convertClassicMenuToBlocks(
87
+ menu.id,
88
+ menu.name
89
+ );
90
+ } }
91
+ key={ menu.id }
92
+ >
93
+ { decodeEntities( menu.name ) }
94
+ </MenuItem>
95
+ );
96
+ } ) }
97
+ </MenuGroup>
98
+ ) }
99
+ <MenuGroup label={ __( 'Tools' ) }>
100
+ <MenuItem onClick={ onCreateNew }>
101
+ { __( 'Create new menu' ) }
102
+ </MenuItem>
103
+ <MenuItem
104
+ href={ addQueryArgs( 'edit.php', {
105
+ post_type: 'wp_navigation',
106
+ } ) }
107
+ >
108
+ { __( 'Manage menus' ) }
109
+ </MenuItem>
110
+ </MenuGroup>
111
+ </>
62
112
  ) }
63
113
  </>
64
114
  );
@@ -9,7 +9,6 @@ import {
9
9
  MenuGroup,
10
10
  MenuItem,
11
11
  } from '@wordpress/components';
12
- import { useCallback, useState, useEffect } from '@wordpress/element';
13
12
  import { __ } from '@wordpress/i18n';
14
13
  import { navigation, Icon } from '@wordpress/icons';
15
14
  import { decodeEntities } from '@wordpress/html-entities';
@@ -20,14 +19,13 @@ import { decodeEntities } from '@wordpress/html-entities';
20
19
 
21
20
  import useNavigationEntities from '../../use-navigation-entities';
22
21
  import PlaceholderPreview from './placeholder-preview';
23
- import menuItemsToBlocks from '../../menu-items-to-blocks';
24
22
  import useNavigationMenu from '../../use-navigation-menu';
25
23
  import useCreateNavigationMenu from '../use-create-navigation-menu';
24
+ import useConvertClassicMenu from '../../use-convert-classic-menu';
26
25
 
27
26
  const ExistingMenusDropdown = ( {
28
27
  canSwitchNavigationMenu,
29
28
  navigationMenus,
30
- setSelectedMenu,
31
29
  onFinish,
32
30
  menus,
33
31
  onCreateFromMenu,
@@ -53,7 +51,6 @@ const ExistingMenusDropdown = ( {
53
51
  return (
54
52
  <MenuItem
55
53
  onClick={ () => {
56
- setSelectedMenu( menu.id );
57
54
  onFinish( menu );
58
55
  } }
59
56
  onClose={ onClose }
@@ -72,8 +69,10 @@ const ExistingMenusDropdown = ( {
72
69
  return (
73
70
  <MenuItem
74
71
  onClick={ () => {
75
- setSelectedMenu( menu.id );
76
- onCreateFromMenu( menu.name );
72
+ onCreateFromMenu(
73
+ menu.id,
74
+ menu.name
75
+ );
77
76
  } }
78
77
  onClose={ onClose }
79
78
  key={ menu.id }
@@ -97,9 +96,6 @@ export default function NavigationPlaceholder( {
97
96
  hasResolvedNavigationMenus,
98
97
  canUserCreateNavigation = false,
99
98
  } ) {
100
- const [ selectedMenu, setSelectedMenu ] = useState();
101
- const [ isCreatingFromMenu, setIsCreatingFromMenu ] = useState( false );
102
- const [ menuName, setMenuName ] = useState( '' );
103
99
  const createNavigationMenu = useCreateNavigationMenu( clientId );
104
100
 
105
101
  const onFinishMenuCreation = async (
@@ -117,39 +113,18 @@ export default function NavigationPlaceholder( {
117
113
  onFinish( navigationMenu, blocks );
118
114
  };
119
115
 
116
+ const convertClassicMenu = useConvertClassicMenu( onFinishMenuCreation );
117
+
120
118
  const {
121
119
  isResolvingPages,
122
120
  menus,
123
121
  isResolvingMenus,
124
- menuItems,
125
- hasResolvedMenuItems,
126
122
  hasPages,
127
123
  hasMenus,
128
- } = useNavigationEntities( selectedMenu );
124
+ } = useNavigationEntities();
129
125
 
130
126
  const isStillLoading = isResolvingPages || isResolvingMenus;
131
127
 
132
- const createFromMenu = useCallback(
133
- ( name ) => {
134
- const { innerBlocks: blocks } = menuItemsToBlocks( menuItems );
135
- onFinishMenuCreation( blocks, name );
136
- },
137
- [ menuItems, menuItemsToBlocks, onFinish ]
138
- );
139
-
140
- const onCreateFromMenu = ( name ) => {
141
- // If we have menu items, create the block right away.
142
- if ( hasResolvedMenuItems ) {
143
- createFromMenu( name );
144
- return;
145
- }
146
-
147
- // Otherwise, create the block when resolution finishes.
148
- setIsCreatingFromMenu( true );
149
- // Store the name to use later.
150
- setMenuName( name );
151
- };
152
-
153
128
  const onCreateEmptyMenu = () => {
154
129
  onFinishMenuCreation( [] );
155
130
  };
@@ -159,15 +134,6 @@ export default function NavigationPlaceholder( {
159
134
  onFinishMenuCreation( block );
160
135
  };
161
136
 
162
- useEffect( () => {
163
- // If the user selected a menu but we had to wait for menu items to
164
- // finish resolving, then create the block once resolution finishes.
165
- if ( isCreatingFromMenu && hasResolvedMenuItems ) {
166
- createFromMenu( menuName );
167
- setIsCreatingFromMenu( false );
168
- }
169
- }, [ isCreatingFromMenu, hasResolvedMenuItems, menuName ] );
170
-
171
137
  const { navigationMenus } = useNavigationMenu();
172
138
 
173
139
  return (
@@ -194,10 +160,9 @@ export default function NavigationPlaceholder( {
194
160
  canSwitchNavigationMenu
195
161
  }
196
162
  navigationMenus={ navigationMenus }
197
- setSelectedMenu={ setSelectedMenu }
198
163
  onFinish={ onFinish }
199
164
  menus={ menus }
200
- onCreateFromMenu={ onCreateFromMenu }
165
+ onCreateFromMenu={ convertClassicMenu }
201
166
  showClassicMenus={
202
167
  canUserCreateNavigation
203
168
  }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useCallback, useState, useEffect } from '@wordpress/element';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import useNavigationEntities from './use-navigation-entities';
10
+ import menuItemsToBlocks from './menu-items-to-blocks';
11
+
12
+ export default function useConvertClassicMenu( onFinish ) {
13
+ const [ selectedMenu, setSelectedMenu ] = useState();
14
+ const [
15
+ isAwaitingMenuItemResolution,
16
+ setIsAwaitingMenuItemResolution,
17
+ ] = useState( false );
18
+ const [ menuName, setMenuName ] = useState( '' );
19
+
20
+ const { menuItems, hasResolvedMenuItems } = useNavigationEntities(
21
+ selectedMenu
22
+ );
23
+
24
+ const createFromMenu = useCallback(
25
+ ( name ) => {
26
+ const { innerBlocks: blocks } = menuItemsToBlocks( menuItems );
27
+ onFinish( blocks, name );
28
+ },
29
+ [ menuItems, menuItemsToBlocks, onFinish ]
30
+ );
31
+
32
+ useEffect( () => {
33
+ // If the user selected a menu but we had to wait for menu items to
34
+ // finish resolving, then create the block once resolution finishes.
35
+ if ( isAwaitingMenuItemResolution && hasResolvedMenuItems ) {
36
+ createFromMenu( menuName );
37
+ setIsAwaitingMenuItemResolution( false );
38
+ }
39
+ }, [ isAwaitingMenuItemResolution, hasResolvedMenuItems, menuName ] );
40
+
41
+ return useCallback(
42
+ ( id, name ) => {
43
+ setSelectedMenu( id );
44
+
45
+ // If we have menu items, create the block right away.
46
+ if ( hasResolvedMenuItems ) {
47
+ createFromMenu( name );
48
+ return;
49
+ }
50
+
51
+ // Otherwise, create the block when resolution finishes.
52
+ setIsAwaitingMenuItemResolution( true );
53
+ // Store the name to use later.
54
+ setMenuName( name );
55
+ },
56
+ [ hasResolvedMenuItems, createFromMenu ]
57
+ );
58
+ }