@redocly/theme
Version:
Shared UI components lib
109 lines (89 loc) • 3.31 kB
text/typescript
import { useLocation } from 'react-router-dom';
import type { ResolvedNavItem } from '@redocly/config';
import { useThemeHooks } from '../use-theme-hooks';
import { useThemeConfig } from '../use-theme-config';
import { MobileMenuType } from '../../constants/common';
import { buildLanguagesGroup, buildVersionSection, mapNavbarItems } from '../../utils/menu';
const MENU_SEPARATOR: ResolvedNavItem = {
type: 'separator',
separatorLine: true,
};
export const useMobileMenuItems = (menuType: MobileMenuType) => {
const { useTranslate, useL10nConfig, useCurrentProduct, usePageVersions, useSidebarItems } =
useThemeHooks();
const { versions = [] } = usePageVersions() || {};
const { defaultLocale, currentLocale, locales } = useL10nConfig();
const { translate } = useTranslate();
const activeVersion = versions.find((version) => version.active);
const {
currentItems: sidebarItems,
pushDrilldownState,
popDrilldownState,
backLink,
} = useSidebarItems(activeVersion);
const location = useLocation();
const currentProduct = useCurrentProduct();
const hasProductNavbarOverride = currentProduct?.configOverride?.navbar;
const productThemeConfig = useThemeConfig();
const baseThemeConfig = useThemeConfig(false);
const baseNavItems = (baseThemeConfig.navbar?.items || []) as ResolvedNavItem[];
const productNavItems = (
hasProductNavbarOverride ? productThemeConfig.navbar?.items || [] : []
) as ResolvedNavItem[];
const menuItems: ResolvedNavItem[] = [];
if (menuType === MobileMenuType.PAGE) {
if (activeVersion) {
// eslint-disable-next-line no-warning-comments
// TODO: consider to refactor
const versionsSection = buildVersionSection(translate, versions, activeVersion);
menuItems.push(...versionsSection);
}
if (menuItems.length && sidebarItems.length) {
menuItems.push(MENU_SEPARATOR);
}
menuItems.push(...(sidebarItems as ResolvedNavItem[]));
} else if (menuType === MobileMenuType.PRODUCT) {
menuItems.push(...productNavItems);
if (menuItems.length && baseNavItems.length) {
menuItems.push(MENU_SEPARATOR);
}
if (baseNavItems.length) {
menuItems.push(...baseNavItems);
}
} else if (menuType === MobileMenuType.MAIN_MENU) {
const productMenuItems: ResolvedNavItem[] = Object.values(baseThemeConfig.products || {}).map(
(product) => ({
label: product.name,
link: product.link,
icon: product.icon,
type: 'link',
}),
);
if (productMenuItems.length) {
menuItems.push({
type: 'separator',
label: translate('mobileMenu.products', 'Products'),
});
menuItems.push(...productMenuItems);
}
if (menuItems.length && baseNavItems.length) {
menuItems.push(MENU_SEPARATOR);
}
if (baseNavItems.length) {
menuItems.push(...baseNavItems);
}
}
const languagesMenu = buildLanguagesGroup(locales, defaultLocale, currentLocale);
if (menuItems.length && languagesMenu) {
menuItems.push(MENU_SEPARATOR);
}
if (languagesMenu) {
menuItems.push(languagesMenu);
}
return {
items: mapNavbarItems(menuItems, defaultLocale, currentLocale, locales, location),
popDrilldownState,
pushDrilldownState,
backLink,
};
};