import { useSession } from "next-auth/react"; import { useMemo } from "react"; import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import UnconfirmedBookingBadge from "@calcom/features/bookings/UnconfirmedBookingBadge"; import { useOrgBranding, type OrganizationBranding, } from "@calcom/features/ee/organizations/context/provider"; import { KBarTrigger } from "@calcom/features/kbar/Kbar"; import { classNames } from "@calcom/lib"; import { TeamInviteBadge } from "../TeamInviteBadge"; import type { NavigationItemType } from "./NavigationItem"; import { NavigationItem, MobileNavigationItem, MobileNavigationMoreItem } from "./NavigationItem"; export const MORE_SEPARATOR_NAME = "more"; const getNavigationItems = (orgBranding: OrganizationBranding): NavigationItemType[] => [ { name: "event_types_page_title", href: "/event-types", icon: "link", }, { name: "bookings", href: "/bookings/upcoming", icon: "calendar", badge: , isCurrent: ({ pathname }) => pathname?.startsWith("/bookings") ?? false, }, { name: "availability", href: "/availability", icon: "clock", }, ...(orgBranding ? [ { name: "members", href: `/settings/organizations/${orgBranding.slug}/members`, icon: "building", moreOnMobile: true, } satisfies NavigationItemType, ] : []), { name: "teams", href: "/teams", icon: "users", badge: , moreOnMobile: true, }, { name: "apps", href: "/apps", icon: "grid-3x3", moreOnMobile: true, isCurrent: ({ pathname: path, item }) => { // During Server rendering path is /v2/apps but on client it becomes /apps(weird..) return (path?.startsWith(item.href) ?? false) && !(path?.includes("routing-forms/") ?? false); }, child: [ { name: "app_store", href: "/apps", isCurrent: ({ pathname: path, item }) => { // During Server rendering path is /v2/apps but on client it becomes /apps(weird..) return ( (path?.startsWith(item.href) ?? false) && !(path?.includes("routing-forms/") ?? false) && !(path?.includes("/installed") ?? false) ); }, }, { name: "installed_apps", href: "/apps/installed/calendar", isCurrent: ({ pathname: path }) => (path?.startsWith("/apps/installed/") ?? false) || (path?.startsWith("/v2/apps/installed/") ?? false), }, ], }, { name: MORE_SEPARATOR_NAME, href: "/more", icon: "ellipsis", }, { name: "routing", href: "/routing", icon: "split", isCurrent: ({ pathname }) => pathname?.startsWith("/routing") ?? false, moreOnMobile: true, }, { name: "workflows", href: "/workflows", icon: "zap", moreOnMobile: true, }, { name: "insights", href: "/insights", icon: "chart-bar", isCurrent: ({ pathname: path, item }) => path?.startsWith(item.href) ?? false, moreOnMobile: true, child: [ { name: "bookings", href: "/insights", isCurrent: ({ pathname: path }) => path == "/insights" ?? false, }, { name: "routing", href: "/insights/routing", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/routing") ?? false, }, { name: "router_position", href: "/insights/virtual-queues", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/virtual-queues") ?? false, }, ], }, ]; const platformNavigationItems: NavigationItemType[] = [ { name: "Dashboard", href: "/settings/platform/", icon: "layout-dashboard", }, { name: "Documentation", href: "https://docs.cal.com/docs/platform", icon: "chart-bar", target: "_blank", }, { name: "API reference", href: "https://api.cal.com/v2/docs#/", icon: "terminal", target: "_blank", }, { name: "Atoms", href: "https://docs.cal.com/docs/platform#atoms", icon: "atom", target: "_blank", }, { name: MORE_SEPARATOR_NAME, href: "https://docs.cal.com/docs/platform/faq", icon: "ellipsis", target: "_blank", }, { name: "Billing", href: "/settings/platform/billing", icon: "credit-card", moreOnMobile: true, }, { name: "Members", href: "/settings/platform/members", icon: "users", moreOnMobile: true, }, { name: "Managed Users", href: "/settings/platform/managed-users", icon: "users", moreOnMobile: true, }, ]; const useNavigationItems = (isPlatformNavigation = false) => { const orgBranding = useOrgBranding(); return useMemo(() => { const items = !isPlatformNavigation ? getNavigationItems(orgBranding) : platformNavigationItems; const desktopNavigationItems = items.filter((item) => item.name !== MORE_SEPARATOR_NAME); const mobileNavigationBottomItems = items.filter( (item) => (!item.moreOnMobile && !item.onlyDesktop) || item.name === MORE_SEPARATOR_NAME ); const mobileNavigationMoreItems = items.filter( (item) => item.moreOnMobile && !item.onlyDesktop && item.name !== MORE_SEPARATOR_NAME ); return { desktopNavigationItems, mobileNavigationBottomItems, mobileNavigationMoreItems }; }, [isPlatformNavigation, orgBranding]); }; export const Navigation = ({ isPlatformNavigation = false }: { isPlatformNavigation?: boolean }) => { const { desktopNavigationItems } = useNavigationItems(isPlatformNavigation); return ( ); }; export function MobileNavigationContainer({ isPlatformNavigation = false, }: { isPlatformNavigation?: boolean; }) { const { status } = useSession(); if (status !== "authenticated") return null; return ; } const MobileNavigation = ({ isPlatformNavigation = false }: { isPlatformNavigation?: boolean }) => { const isEmbed = useIsEmbed(); const { mobileNavigationBottomItems } = useNavigationItems(isPlatformNavigation); return ( <> {/* add padding to content for mobile navigation*/}
); }; export const MobileNavigationMoreItems = () => { const { mobileNavigationMoreItems } = useNavigationItems(); return (
    {mobileNavigationMoreItems.map((item) => ( ))}
); };