diff --git a/packages/web/src/app/[domain]/components/navigationMenu/index.tsx b/packages/web/src/app/[domain]/components/navigationMenu/index.tsx index 6cab2a68..400481c2 100644 --- a/packages/web/src/app/[domain]/components/navigationMenu/index.tsx +++ b/packages/web/src/app/[domain]/components/navigationMenu/index.tsx @@ -1,24 +1,22 @@ import { getRepos, getReposStats } from "@/actions"; import { SourcebotLogo } from "@/app/components/sourcebotLogo"; import { auth } from "@/auth"; -import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import { NavigationMenu as NavigationMenuBase, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, navigationMenuTriggerStyle } from "@/components/ui/navigation-menu"; +import { NavigationMenu as NavigationMenuBase } from "@/components/ui/navigation-menu"; import { Separator } from "@/components/ui/separator"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { getSubscriptionInfo } from "@/ee/features/billing/actions"; import { IS_BILLING_ENABLED } from "@/ee/features/billing/stripe"; import { env } from "@/env.mjs"; import { ServiceErrorException } from "@/lib/serviceError"; -import { cn, getShortenedNumberDisplayString, isServiceError } from "@/lib/utils"; +import { isServiceError } from "@/lib/utils"; import { DiscordLogoIcon, GitHubLogoIcon } from "@radix-ui/react-icons"; import { RepoJobStatus, RepoJobType } from "@sourcebot/db"; -import { BookMarkedIcon, CircleIcon, MessageCircleIcon, SearchIcon, SettingsIcon } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { OrgSelector } from "../orgSelector"; import { SettingsDropdown } from "../settingsDropdown"; import WhatsNewIndicator from "../whatsNewIndicator"; +import { NavigationItems } from "./navigationItems"; import { ProgressIndicator } from "./progressIndicator"; import { TrialIndicator } from "./trialIndicator"; @@ -70,7 +68,7 @@ export const NavigationMenu = async ({ return (
-
+
- - - - - Search - - - - - - Ask - - - - - - - - Repositories - - {getShortenedNumberDisplayString(numberOfRepos)} - {numberOfReposWithFirstTimeIndexingJobsInProgress > 0 && ( - - )} - - - - -

{numberOfRepos} total {numberOfRepos === 1 ? 'repository' : 'repositories'}

-
-
-
- {isAuthenticated && ( - <> - - - - Settings - - - - )} -
+
diff --git a/packages/web/src/app/[domain]/components/navigationMenu/navigationItems.tsx b/packages/web/src/app/[domain]/components/navigationMenu/navigationItems.tsx new file mode 100644 index 00000000..055c8b10 --- /dev/null +++ b/packages/web/src/app/[domain]/components/navigationMenu/navigationItems.tsx @@ -0,0 +1,90 @@ +"use client"; + +import { NavigationMenuItem, NavigationMenuLink, NavigationMenuList, navigationMenuTriggerStyle } from "@/components/ui/navigation-menu"; +import { Badge } from "@/components/ui/badge"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; +import { cn, getShortenedNumberDisplayString } from "@/lib/utils"; +import { SearchIcon, MessageCircleIcon, BookMarkedIcon, SettingsIcon, CircleIcon } from "lucide-react"; +import { usePathname } from "next/navigation"; + +interface NavigationItemsProps { + domain: string; + numberOfRepos: number; + numberOfReposWithFirstTimeIndexingJobsInProgress: number; + isAuthenticated: boolean; +} + +export const NavigationItems = ({ + domain, + numberOfRepos, + numberOfReposWithFirstTimeIndexingJobsInProgress, + isAuthenticated, +}: NavigationItemsProps) => { + const pathname = usePathname(); + + const isActive = (href: string) => { + if (href === `/${domain}`) { + return pathname === `/${domain}`; + } + return pathname.startsWith(href); + }; + + return ( + + + + + Search + + {isActive(`/${domain}`) && } + + + + + Ask + + {isActive(`/${domain}/chat`) && } + + + + + Repositories + + {getShortenedNumberDisplayString(numberOfRepos)} + {numberOfReposWithFirstTimeIndexingJobsInProgress > 0 && ( + + )} + + + {isActive(`/${domain}/repos`) && } + + {isAuthenticated && ( + + + + Settings + + {isActive(`/${domain}/settings`) && } + + )} + + ); +}; + +const ActiveIndicator = () => { + return ( +
+ ); +}; \ No newline at end of file