import Link from "next/link"; import { usePathname } from "next/navigation"; import React, { Fragment } from "react"; import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Tooltip, Icon, SkeletonText } from "@calcom/ui"; import type { IconName } from "@calcom/ui"; import { useShouldDisplayNavigationItem } from "./useShouldDisplayNavigationItem"; export type NavigationItemType = { name: string; href: string; isLoading?: boolean; onClick?: React.MouseEventHandler; target?: HTMLAnchorElement["target"]; badge?: React.ReactNode; icon?: IconName; child?: NavigationItemType[]; pro?: true; onlyMobile?: boolean; onlyDesktop?: boolean; moreOnMobile?: boolean; isCurrent?: ({ item, isChild, pathname, }: { item: Pick; isChild?: boolean; pathname: string | null; }) => boolean; }; const defaultIsCurrent: NavigationItemType["isCurrent"] = ({ isChild, item, pathname }) => { return isChild ? item.href === pathname : item.href ? pathname?.startsWith(item.href) ?? false : false; }; export const NavigationItem: React.FC<{ index?: number; item: NavigationItemType; isChild?: boolean; }> = (props) => { const { item, isChild } = props; const { t, isLocaleReady } = useLocale(); const pathname = usePathname(); const isCurrent: NavigationItemType["isCurrent"] = item.isCurrent || defaultIsCurrent; const current = isCurrent({ isChild: !!isChild, item, pathname }); const shouldDisplayNavigationItem = useShouldDisplayNavigationItem(props.item); if (!shouldDisplayNavigationItem) return null; return ( {item.icon && ( {item.child && isCurrent({ pathname, isChild, item }) && item.child.map((item, index) => )} ); }; export const MobileNavigationItem: React.FC<{ item: NavigationItemType; isChild?: boolean; }> = (props) => { const { item, isChild } = props; const pathname = usePathname(); const { t, isLocaleReady } = useLocale(); const isCurrent: NavigationItemType["isCurrent"] = item.isCurrent || defaultIsCurrent; const current = isCurrent({ isChild: !!isChild, item, pathname }); const shouldDisplayNavigationItem = useShouldDisplayNavigationItem(props.item); if (!shouldDisplayNavigationItem) return null; return ( {item.badge &&
{item.badge}
} {item.icon && (