in src/app-nav-bar/app-nav-bar.tsx [118:249]
export default function AppNavBar(props: AppNavBarProps) {
const [css, theme] = useStyletron();
const {
title,
mapItemToNode = defaultMapItemToNode,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onMainItemSelect = (item) => {},
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onUserItemSelect = (item) => {},
overrides = {},
userItems = [],
username,
usernameSubtitle,
userImgUrl,
} = props;
const mainItems = React.useMemo(() => {
if (props.isMainItemActive) {
return mapItemsActive(props.mainItems || [], props.isMainItemActive);
}
return props.mainItems || [];
}, [props.mainItems, props.isMainItemActive]);
const [Root, rootProps] = getOverrides(overrides.Root, StyledRoot);
const [Spacing, spacingProps] = getOverrides(overrides.Spacing, StyledSpacing);
const [AppName, appNameProps] = getOverrides(overrides.AppName, StyledAppName);
const [PrimaryMenuContainer, primaryMenuContainerProps] = getOverrides(
overrides.PrimaryMenuContainer,
StyledPrimaryMenuContainer
);
const [DesktopMenuContainer, desktopMenuContainerProps] = getOverrides(
overrides.DesktopMenuContainer,
StyledDesktopMenuContainer
);
const [DesktopMenu, desktopMenuProps] = getOverrides(overrides.DesktopMenu, StyledDesktopMenu);
let secondaryMenu;
let desktopSubNavPosition: (typeof POSITION)[keyof typeof POSITION] = POSITION.horizontal;
let mobileSubNavPosition: (typeof POSITION)[keyof typeof POSITION] = POSITION.vertical;
return (
<Root {...rootProps} data-baseweb="app-nav-bar">
{/* Mobile Nav Experience */}
<div
className={css({
[`@media screen and (min-width: ${theme.breakpoints.large}px)`]: {
display: 'none',
},
})}
>
<Spacing {...spacingProps}>
{mainItems.length || userItems.length ? <MobileNav {...props} /> : null}
<AppName {...appNameProps}>{title}</AppName>
</Spacing>
{secondaryMenu &&
// @ts-expect-error todo(flow->ts) always false
mobileSubNavPosition === POSITION.horizontal && (
<SecondaryMenu
items={secondaryMenu}
mapItemToNode={mapItemToNode}
onSelect={onMainItemSelect}
overrides={overrides}
/>
)}
</div>
{/* Desktop Nav Experience */}
<div
className={css({
[`@media screen and (max-width: ${theme.breakpoints.large - 1}px)`]: {
display: 'none',
},
})}
>
<DesktopMenuContainer {...desktopMenuContainerProps}>
<DesktopMenu {...desktopMenuProps}>
{/* Replace with a Logo renderer */}
<AppName {...appNameProps}>{title}</AppName>
<PrimaryMenuContainer
role="navigation"
aria-label="Main navigation"
{...primaryMenuContainerProps}
>
{mainItems.map((item, index) => {
// For an active top level menu get the secondary navigation and its positioning
if (item.active && item.children && item.children.length) {
secondaryMenu = item.children;
if (item.navPosition) {
desktopSubNavPosition = item.navPosition.desktop || desktopSubNavPosition;
mobileSubNavPosition = item.navPosition.mobile || mobileSubNavPosition;
}
}
return (
<MainMenuItem
item={item}
key={index}
mapItemToNode={mapItemToNode}
onSelect={onMainItemSelect}
overrides={overrides}
/>
);
})}
</PrimaryMenuContainer>
{userItems.length ? (
<UserMenu
mapItemToNode={mapItemToNode}
onItemSelect={onUserItemSelect}
overrides={overrides}
username={username}
usernameSubtitle={usernameSubtitle}
userImgUrl={userImgUrl}
userItems={userItems}
/>
) : null}
</DesktopMenu>
</DesktopMenuContainer>
{secondaryMenu && desktopSubNavPosition === POSITION.horizontal && (
<SecondaryMenu
items={secondaryMenu}
mapItemToNode={mapItemToNode}
onSelect={onMainItemSelect}
overrides={overrides}
/>
)}
</div>
</Root>
);
}