import { useSession } from "next-auth/react"; import { useMemo } from "react"; import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { useOrgBranding, type OrganizationBranding, } from "@calcom/features/ee/organizations/context/provider"; import { useMobileMoreItems } from "./useMobileMoreItems"; import { useIsStandalone } from "@calcom/lib/hooks/useIsStandalone"; import classNames from "@calcom/ui/classNames"; import { useHasPaidPlan } from "@calcom/web/modules/billing/hooks/useHasPaidPlan"; import UnconfirmedBookingBadge from "../../bookings/components/UnconfirmedBookingBadge"; import { KBarTrigger } from "../Kbar"; 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", }, { name: "routing", href: "/insights/routing", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/routing") ?? false, }, { name: "router_position", href: "/insights/router-position", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/router-position") ?? false, }, { name: "call_history", href: "/insights/call-history", // icon: "phone", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/call-history") ?? false, }, { name: "wrong_routing", href: "/insights/wrong-routing", isCurrent: ({ pathname: path }) => path?.startsWith("/insights/wrong-routing") ?? 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(); const { hasPaidPlan, isPending } = useHasPaidPlan(); 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, }; }, [hasPaidPlan, isPending, isPlatformNavigation, orgBranding]); }; export const Navigation = ({ isPlatformNavigation = false }: { isPlatformNavigation?: boolean }) => { const { desktopNavigationItems } = useNavigationItems(isPlatformNavigation); return ( ); }; export function MobileNavigationContainer({ isPlatformNavigation = false, }: { isPlatformNavigation?: boolean; }) { const { status } = useSession(); const isStandalone = useIsStandalone(); if (status !== "authenticated" || isStandalone) 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(); const bottomItems = useMobileMoreItems(); const allItems = [...mobileNavigationMoreItems, ...bottomItems]; return (
    {allItems.map((item) => ( ))}
); };