@wordpress/block-library
Version:
Block library for the WordPress editor.
169 lines (168 loc) • 5.71 kB
JavaScript
// packages/block-library/src/navigation/edit/navigation-menu-selector.js
import {
MenuGroup,
MenuItem,
MenuItemsChoice,
DropdownMenu
} from "@wordpress/components";
import { moreVertical } from "@wordpress/icons";
import { __, sprintf } from "@wordpress/i18n";
import { decodeEntities } from "@wordpress/html-entities";
import { useEffect, useMemo, useState } from "@wordpress/element";
import { useEntityProp } from "@wordpress/core-data";
import useNavigationMenu from "../use-navigation-menu";
import useNavigationEntities from "../use-navigation-entities";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
function buildMenuLabel(title, id, status) {
if (!title) {
return sprintf(__("(no title %s)"), id);
}
if (status === "publish") {
return decodeEntities(title);
}
return sprintf(
// translators: 1: title of the menu. 2: status of the menu (draft, pending, etc.).
__("%1$s (%2$s)"),
decodeEntities(title),
status
);
}
function NavigationMenuSelector({
currentMenuId,
onSelectNavigationMenu,
onSelectClassicMenu,
onCreateNew,
actionLabel,
createNavigationMenuIsSuccess,
createNavigationMenuIsError
}) {
const createActionLabel = __("Create from '%s'");
const [isUpdatingMenuRef, setIsUpdatingMenuRef] = useState(false);
actionLabel = actionLabel || createActionLabel;
const { menus: classicMenus } = useNavigationEntities();
const {
navigationMenus,
isResolvingNavigationMenus,
hasResolvedNavigationMenus,
canUserCreateNavigationMenus,
canSwitchNavigationMenu,
isNavigationMenuMissing
} = useNavigationMenu(currentMenuId);
const [currentTitle] = useEntityProp(
"postType",
"wp_navigation",
"title"
);
const menuChoices = useMemo(() => {
return navigationMenus?.map(({ id, title, status }, index) => {
const label = buildMenuLabel(
title?.rendered,
index + 1,
status
);
return {
value: id,
label,
ariaLabel: sprintf(actionLabel, label),
disabled: isUpdatingMenuRef || isResolvingNavigationMenus || !hasResolvedNavigationMenus
};
}) || [];
}, [
navigationMenus,
actionLabel,
isResolvingNavigationMenus,
hasResolvedNavigationMenus,
isUpdatingMenuRef
]);
const hasNavigationMenus = !!navigationMenus?.length;
const hasClassicMenus = !!classicMenus?.length;
const showNavigationMenus = !!canSwitchNavigationMenu;
const showClassicMenus = !!canUserCreateNavigationMenus;
const noMenuSelected = hasNavigationMenus && !currentMenuId;
const noBlockMenus = !hasNavigationMenus && hasResolvedNavigationMenus;
const menuUnavailable = hasResolvedNavigationMenus && currentMenuId === null;
const navMenuHasBeenDeleted = currentMenuId && isNavigationMenuMissing;
let selectorLabel = "";
if (isResolvingNavigationMenus) {
selectorLabel = __("Loading\u2026");
} else if (noMenuSelected || noBlockMenus || menuUnavailable || navMenuHasBeenDeleted) {
selectorLabel = __("Choose or create a Navigation Menu");
} else {
selectorLabel = currentTitle;
}
useEffect(() => {
if (isUpdatingMenuRef && (createNavigationMenuIsSuccess || createNavigationMenuIsError)) {
setIsUpdatingMenuRef(false);
}
}, [
hasResolvedNavigationMenus,
createNavigationMenuIsSuccess,
canUserCreateNavigationMenus,
createNavigationMenuIsError,
isUpdatingMenuRef,
menuUnavailable,
noBlockMenus,
noMenuSelected
]);
const NavigationMenuSelectorDropdown = /* @__PURE__ */ jsx(
DropdownMenu,
{
label: selectorLabel,
icon: moreVertical,
toggleProps: { size: "small" },
children: ({ onClose }) => /* @__PURE__ */ jsxs(Fragment, { children: [
showNavigationMenus && hasNavigationMenus && /* @__PURE__ */ jsx(MenuGroup, { label: __("Menus"), children: /* @__PURE__ */ jsx(
MenuItemsChoice,
{
value: currentMenuId,
onSelect: (menuId) => {
onSelectNavigationMenu(menuId);
onClose();
},
choices: menuChoices
}
) }),
showClassicMenus && hasClassicMenus && /* @__PURE__ */ jsx(MenuGroup, { label: __("Import Classic Menus"), children: classicMenus?.map((menu) => {
const label = decodeEntities(menu.name);
return /* @__PURE__ */ jsx(
MenuItem,
{
onClick: async () => {
setIsUpdatingMenuRef(true);
await onSelectClassicMenu(menu);
setIsUpdatingMenuRef(false);
onClose();
},
"aria-label": sprintf(
createActionLabel,
label
),
disabled: isUpdatingMenuRef || isResolvingNavigationMenus || !hasResolvedNavigationMenus,
children: label
},
menu.id
);
}) }),
canUserCreateNavigationMenus && /* @__PURE__ */ jsx(MenuGroup, { label: __("Tools"), children: /* @__PURE__ */ jsx(
MenuItem,
{
onClick: async () => {
setIsUpdatingMenuRef(true);
await onCreateNew();
setIsUpdatingMenuRef(false);
onClose();
},
disabled: isUpdatingMenuRef || isResolvingNavigationMenus || !hasResolvedNavigationMenus,
children: __("Create new Menu")
}
) })
] })
}
);
return NavigationMenuSelectorDropdown;
}
var navigation_menu_selector_default = NavigationMenuSelector;
export {
navigation_menu_selector_default as default
};
//# sourceMappingURL=navigation-menu-selector.js.map