'use client' import { useFlag, useParams } from 'common' import { Home } from 'icons' import { ChevronLeft } from 'lucide-react' import { useRouter } from 'next/router' import React, { useMemo } from 'react' import { Button, cn, Separator, SidebarGroup, SidebarMenu } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { resolveSectionDisplay } from './MobileMenuContent.utils' import { getProductMenuComponent } from './mobileProductMenuRegistry' import { TopLevelRouteItem } from './TopLevelRouteItem' import { routeHasSubmenu, useMobileMenuNavigation } from './useMobileMenuNavigation' import { useUnifiedLogsPreview } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { ICON_SIZE, ICON_STROKE_WIDTH } from '@/components/interfaces/Sidebar' import { generateOtherRoutes, generateProductRoutes, generateSettingsRoutes, generateToolRoutes, } from '@/components/layouts/Navigation/NavigationBar/NavigationBar.utils' import type { Route } from '@/components/ui/ui.types' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { getPathnameWithoutQuery, getPathSegment } from '@/lib/pathname.utils' export interface MobileMenuContentProps { currentProductMenu: React.ReactNode currentProduct: string currentSectionKey: string | null onCloseSheet?: () => void } export function MobileMenuContent({ currentProductMenu, currentProduct, currentSectionKey, onCloseSheet, }: MobileMenuContentProps) { const router = useRouter() const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const pathname = getPathnameWithoutQuery(router.asPath, router.pathname) const activeRoute = getPathSegment(pathname, 3) const { viewLevel, selectedSectionKey, handleTopLevelClick, handleBackToTop } = useMobileMenuNavigation({ currentSectionKey, hasCurrentProductMenu: !!currentProductMenu, onCloseSheet, }) const { projectAuthAll: authEnabled, projectEdgeFunctionAll: edgeFunctionsEnabled, projectStorageAll: storageEnabled, realtimeAll: realtimeEnabled, } = useIsFeatureEnabled([ 'project_auth:all', 'project_edge_function:all', 'project_storage:all', 'realtime:all', ]) const authOverviewPageEnabled = useFlag('authOverviewPage') const showReports = useIsFeatureEnabled('reports:all') const { isEnabled: isUnifiedLogsEnabled } = useUnifiedLogsPreview() const toolRoutes = useMemo(() => generateToolRoutes(ref, project), [ref, project]) const productRoutes = useMemo( () => generateProductRoutes(ref, project, { auth: authEnabled, edgeFunctions: edgeFunctionsEnabled, storage: storageEnabled, realtime: realtimeEnabled, authOverviewPage: authOverviewPageEnabled, }), [ ref, project, authEnabled, edgeFunctionsEnabled, storageEnabled, realtimeEnabled, authOverviewPageEnabled, ] ) const otherRoutes = useMemo( () => generateOtherRoutes(ref, project, { unifiedLogs: isUnifiedLogsEnabled, showReports, }), [ref, project, isUnifiedLogsEnabled, showReports] ) const settingsRoutes = useMemo(() => generateSettingsRoutes(ref), [ref]) const homeRoute: Route = useMemo( () => ({ key: 'HOME', label: 'Project Overview', icon: , link: ref ? `/project/${ref}` : undefined, }), [ref] ) const allTopLevelRoutes = useMemo( () => [homeRoute, ...toolRoutes, ...productRoutes, ...otherRoutes, ...settingsRoutes], [homeRoute, toolRoutes, productRoutes, otherRoutes, settingsRoutes] ) const { sectionKey: sectionKeyToShow, sectionLabel } = resolveSectionDisplay({ viewLevel, selectedSectionKey, currentSectionKey, currentProduct, routes: allTopLevelRoutes, }) const SectionMenuContent = sectionKeyToShow ? getProductMenuComponent(sectionKeyToShow) : null const pageSegment = getPathSegment(pathname, 4) const renderRoute = (route: Route, isActive: boolean) => ( ) return (
{viewLevel === 'section' && sectionLabel && (
)}
{viewLevel === 'top' && ( )} {viewLevel === 'section' && sectionKeyToShow && (
{sectionKeyToShow === currentSectionKey && currentProductMenu ? ( currentProductMenu ) : SectionMenuContent ? ( }> {sectionKeyToShow === 'advisors' ? ( )} /> ) : ( )} ) : null}
)}
) }