'use client' import { useIsMFAEnabled, useParams } from 'common' import { Blocks, Boxes, ChartArea, ChevronLeft, Receipt, Settings, Users } from 'lucide-react' import { useRouter } from 'next/router' import React, { useMemo } from 'react' import { Button, cn, SidebarGroup, SidebarMenu } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { getOrgMenuComponent } from './mobileOrgMenuRegistry' import type { OrgNavItem } from './OrgMenuContent.utils' import { getOrgActiveRoute, getOrgSectionKeyFromPathname, isOrgMenuActive, } from './OrgMenuContent.utils' import { OrgMenuItem } from './OrgMenuItem' import { orgItemHasSubmenu, useOrgMenuNavigation } from './useOrgMenuNavigation' import { ICON_SIZE, ICON_STROKE_WIDTH } from '@/components/interfaces/Sidebar' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { getPathnameWithoutQuery } from '@/lib/pathname.utils' import { useTrack } from '@/lib/telemetry/track' export interface OrgMenuContentProps { onCloseSheet?: () => void } export function OrgMenuContent({ onCloseSheet }: OrgMenuContentProps) { const router = useRouter() const { slug } = useParams() const organizationSlug: string = slug ?? (router.query.orgSlug as string) ?? '' const { data: org } = useSelectedOrganizationQuery() const isUserMFAEnabled = useIsMFAEnabled() const disableAccessMfa = org?.organization_requires_mfa && !isUserMFAEnabled const showBilling = useIsFeatureEnabled('billing:all') const pathname = getPathnameWithoutQuery(router.asPath, router.pathname) const activeRoute = getOrgActiveRoute(pathname) const initialSectionKey = getOrgSectionKeyFromPathname(activeRoute) const track = useTrack() const { viewLevel, selectedSectionKey, handleSubmenuClick: navigateToSubmenu, handleBackToTop: navigateBackToTop, } = useOrgMenuNavigation({ initialSectionKey }) const handleSubmenuClick = (item: OrgNavItem) => { track('org_submenu_opened', { itemKey: item.key, itemLabel: item.label }) navigateToSubmenu(item) } const handleBackToTop = () => { track('org_menu_back_clicked') navigateBackToTop() } const navMenuItems: OrgNavItem[] = useMemo( () => [ { label: 'Projects', href: `/org/${organizationSlug}`, key: 'projects', icon: , }, { label: 'Team', href: `/org/${organizationSlug}/team`, key: 'team', icon: , }, { label: 'Integrations', href: `/org/${organizationSlug}/integrations`, key: 'integrations', icon: , }, { label: 'Usage', href: `/org/${organizationSlug}/usage`, key: 'usage', icon: , }, ...(showBilling ? [ { label: 'Billing', href: `/org/${organizationSlug}/billing`, key: 'billing', icon: , }, ] : []), { label: 'Organization settings', href: `/org/${organizationSlug}/general`, key: 'settings', icon: , }, ], [organizationSlug, showBilling] ) const sectionKeyToShow = viewLevel === 'section' ? selectedSectionKey : null const sectionLabel = sectionKeyToShow && navMenuItems.find((item) => item.key === sectionKeyToShow)?.label const SectionMenuContent = sectionKeyToShow ? getOrgMenuComponent(sectionKeyToShow) : null if (!organizationSlug) return null if (viewLevel === 'section' && sectionKeyToShow && SectionMenuContent) { return (
}>
) } return (
) }