-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathuse-navigation-entities.js
144 lines (130 loc) · 3.81 KB
/
use-navigation-entities.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* WordPress dependencies
*/
import { useSelect } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';
/**
* @typedef {Object} NavigationEntitiesData
* @property {Array|undefined} pages - a collection of WP Post entity objects of post type "Page".
* @property {boolean} isResolvingPages - indicates whether the request to fetch pages is currently resolving.
* @property {boolean} hasResolvedPages - indicates whether the request to fetch pages has finished resolving.
* @property {Array|undefined} menus - a collection of Menu entity objects.
* @property {boolean} isResolvingMenus - indicates whether the request to fetch menus is currently resolving.
* @property {boolean} hasResolvedMenus - indicates whether the request to fetch menus has finished resolving.
* @property {Array|undefined} menusItems - a collection of Menu Item entity objects for the current menuId.
* @property {boolean} hasResolvedMenuItems - indicates whether the request to fetch menuItems has finished resolving.
* @property {boolean} hasPages - indicates whether there is currently any data for pages.
* @property {boolean} hasMenus - indicates whether there is currently any data for menus.
*/
/**
* Manages fetching and resolution state for all entities required
* for the Navigation block.
*
* @param {number} menuId the menu for which to retrieve menuItem data.
* @return { NavigationEntitiesData } the entity data.
*/
export default function useNavigationEntities( menuId ) {
return {
...usePageEntities(),
...useMenuEntities(),
...useMenuItemEntities( menuId ),
};
}
function useMenuEntities() {
const { menus, isResolvingMenus, hasResolvedMenus } = useSelect(
( select ) => {
const { getMenus, isResolving, hasFinishedResolution } = select(
coreStore
);
const menusParameters = [ { per_page: -1, context: 'view' } ];
return {
menus: getMenus( ...menusParameters ),
isResolvingMenus: isResolving( 'getMenus', menusParameters ),
hasResolvedMenus: hasFinishedResolution(
'getMenus',
menusParameters
),
};
},
[]
);
return {
menus,
isResolvingMenus,
hasResolvedMenus,
hasMenus: !! ( hasResolvedMenus && menus?.length ),
};
}
function useMenuItemEntities( menuId ) {
const { menuItems, hasResolvedMenuItems } = useSelect(
( select ) => {
const { getMenuItems, hasFinishedResolution } = select( coreStore );
const hasSelectedMenu = menuId !== undefined;
const menuItemsParameters = hasSelectedMenu
? [
{
menus: menuId,
per_page: -1,
context: 'view',
},
]
: undefined;
return {
menuItems: hasSelectedMenu
? getMenuItems( ...menuItemsParameters )
: undefined,
hasResolvedMenuItems: hasSelectedMenu
? hasFinishedResolution(
'getMenuItems',
menuItemsParameters
)
: false,
};
},
[ menuId ]
);
return {
menuItems,
hasResolvedMenuItems,
};
}
function usePageEntities() {
const { pages, isResolvingPages, hasResolvedPages } = useSelect(
( select ) => {
const {
getEntityRecords,
isResolving,
hasFinishedResolution,
} = select( coreStore );
const pagesParameters = [
'postType',
'page',
{
parent: 0,
order: 'asc',
orderby: 'id',
per_page: -1,
context: 'view',
},
];
return {
pages: getEntityRecords( ...pagesParameters ) || null,
isResolvingPages: isResolving(
'getEntityRecords',
pagesParameters
),
hasResolvedPages: hasFinishedResolution(
'getEntityRecords',
pagesParameters
),
};
},
[]
);
return {
pages,
isResolvingPages,
hasResolvedPages,
hasPages: !! ( hasResolvedPages && pages?.length ),
};
}