"use client"; import { Cloud } from "lucide-react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { LighthouseV2SidebarChat } from "@/app/(prowler)/lighthouse/_components/navigation"; import { InfoIcon, ProwlerShort } from "@/components/icons"; import { CollapsibleMenu } from "@/components/layout/sidebar/collapsible-menu"; import { MenuItem } from "@/components/layout/sidebar/menu-item"; import { Separator } from "@/components/shadcn"; import { Button } from "@/components/shadcn/button/button"; import { ScrollArea } from "@/components/shadcn/scroll-area/scroll-area"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/shadcn/tooltip"; import { SidebarNavigationModeToggle } from "@/components/sidebar/navigation-mode-toggle"; import { useAuth } from "@/hooks"; import { useRuntimeConfig } from "@/hooks/use-runtime-config"; import { SIDEBAR_NAVIGATION_MODE, useSidebar } from "@/hooks/use-sidebar"; import { getMenuList } from "@/lib/menu-list"; import { LAUNCH_SCAN_HREF } from "@/lib/scans-navigation"; import { isCloud } from "@/lib/shared/env"; import { cn } from "@/lib/utils"; import { useCloudUpgradeStore, useScansStore } from "@/store"; import { GroupProps, type MenuSelectionHandler } from "@/types"; import { CLOUD_UPGRADE_FEATURE } from "@/types/cloud-upgrade"; import { RolePermissionAttributes } from "@/types/users"; interface MenuHideRule { label: string; condition: (permissions: RolePermissionAttributes) => boolean; } const MENU_HIDE_RULES: MenuHideRule[] = [ { label: "Billing", condition: (permissions) => permissions?.manage_billing === false, }, { label: "Integrations", condition: (permissions) => permissions?.manage_integrations === false, }, ]; const filterMenus = (menuGroups: GroupProps[], labelsToHide: string[]) => { return menuGroups .map((group) => ({ ...group, menus: group.menus .filter((menu) => !labelsToHide.includes(menu.label)) .map((menu) => ({ ...menu, submenus: menu.submenus?.filter( (submenu) => !labelsToHide.includes(submenu.label), ), })), })) .filter((group) => group.menus.length > 0); }; interface SidebarMenuProps { isOpen: boolean; onSelect?: MenuSelectionHandler; } export const Menu = ({ isOpen, onSelect }: SidebarMenuProps) => { const pathname = usePathname(); const { permissions } = useAuth(); const openLaunchScanModal = useScansStore( (state) => state.openLaunchScanModal, ); const isScansPage = pathname.startsWith("/scans"); const { apiDocsUrl } = useRuntimeConfig(); const isCloudEnv = isCloud(); const openCloudUpgrade = useCloudUpgradeStore( (state) => state.openCloudUpgrade, ); const navigationMode = useSidebar((state) => state.navigationMode); const setNavigationMode = useSidebar((state) => state.setNavigationMode); const menuList = getMenuList({ pathname, apiDocsUrl, }); const labelsToHide = MENU_HIDE_RULES.filter((rule) => rule.condition(permissions), ).map((rule) => rule.label); const filteredMenuList = filterMenus(menuList, labelsToHide); return (
{/* Launch Scan Button — mt-1 aligns its top with the main content panel (navbar 72px + py-4 = 88px), matching the fixed-height logo block. */}
{isScansPage ? ( ) : ( )} {!isOpen && Launch Scan}
{/* Menu Items */}
{isCloudEnv && navigationMode === SIDEBAR_NAVIGATION_MODE.CHAT ? ( ) : ( )}
{!isCloudEnv && (
{!isOpen && ( Explore Prowler Cloud )}
)} {/* Footer */}
{isOpen ? ( <> {process.env.NEXT_PUBLIC_PROWLER_RELEASE_VERSION} {isCloudEnv && ( <> Service Status )} ) : ( isCloudEnv && ( Service Status ) )}
); }; function LaunchScanButtonContent({ isOpen }: { isOpen: boolean }) { return ( ); }