import { BotIcon, BoxIcon, ChevronsUpDownIcon, CreditCardIcon, CircleHelpIcon, HandCoinsIcon, HomeIcon, LogOutIcon, LucideIcon, Plug2Icon, PlugZapIcon, SettingsIcon, SparklesIcon, SquareStackIcon, WalletIcon, } from "lucide-react"; import React from "react"; import { Link, NavLink, useLocation, useNavigate } from "react-router"; import ExternalLink from "src/components/ExternalLink"; import { AlbyIcon } from "src/components/icons/Alby"; import { AlbyHubIcon } from "src/components/icons/AlbyHubIcon"; import { AlbyHubLogo } from "src/components/icons/AlbyHubLogo"; import { ProBadge } from "src/components/ProBadge"; import SidebarHint from "src/components/SidebarHint"; import { Badge } from "src/components/ui/badge"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "src/components/ui/dropdown-menu"; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "src/components/ui/sidebar"; import { UpgradeDialog } from "src/components/UpgradeDialog"; import UserAvatar from "src/components/UserAvatar"; import { useAlbyMe } from "src/hooks/useAlbyMe"; import { useHealthCheck } from "src/hooks/useHealthCheck"; import { useInfo } from "src/hooks/useInfo"; import { deleteAuthToken } from "src/lib/auth"; import { isHttpMode } from "src/utils/isHttpMode"; function isPathActive(pathname: string, url: string) { return pathname === url || pathname.startsWith(`${url}/`); } export function AppSidebar() { const { data: albyMe } = useAlbyMe(); const { data: info, mutate: refetchInfo } = useInfo(); const { isMobile, setOpenMobile } = useSidebar(); const { hasChannelManagement } = useInfo(); const navigate = useNavigate(); const location = useLocation(); const _isHttpMode = isHttpMode(); const logout = React.useCallback(async () => { deleteAuthToken(); await refetchInfo(); if (_isHttpMode) { window.location.href = "/logout"; } else { navigate("/", { replace: true }); } }, [_isHttpMode, navigate, refetchInfo]); const data = { navMain: [ { title: "Home", url: "/home", icon: HomeIcon, }, { title: "Wallet", url: "/wallet", icon: WalletIcon, }, { title: "Sub-wallets", url: "/sub-wallets", icon: SquareStackIcon, }, { title: "Connections", url: "/apps", icon: Plug2Icon, }, { title: "AI & Agents", url: "/ai", icon: BotIcon, }, { title: "Cards", url: "/cards", icon: CreditCardIcon, badge: "NEW", }, ], navSecondary: [ ...(hasChannelManagement ? [ { title: "Node", url: "/channels", icon: BoxIcon, }, ] : []), { title: "Settings", url: "/settings", icon: SettingsIcon, }, { title: "Earn", url: "/earn", icon: HandCoinsIcon, }, ], }; return ( setOpenMobile(false)}> {data.navMain.map((item) => ( { setOpenMobile(false); }} > {item.title} {item.badge && ( {item.badge} )} ))} {info?.albyAccountConnected ? ( <> {albyMe?.name || albyMe?.email} {albyMe?.subscription?.plan_code && } {albyMe?.lightning_address} > ) : ( <> My Alby Hub > )} {info?.albyAccountConnected && ( <> {albyMe?.name || albyMe?.email} {albyMe?.subscription?.plan_code && } {albyMe?.lightning_address} > )} {!info?.albyAccountConnected ? ( Connect Alby Account ) : ( Alby Account Settings )} {!albyMe?.subscription.plan_code && ( <> e.preventDefault()}> Upgrade to Pro > )} {_isHttpMode && ( <> Log out > )} ); } export function NavSecondary({ items, ...props }: { items: { title: string; url: string; icon: LucideIcon; }[]; } & React.ComponentPropsWithoutRef) { const { setOpenMobile } = useSidebar(); const location = useLocation(); return ( {items.map((item) => ( { setOpenMobile(false); }} > {item.title} ))} Help ); } function HealthIndicator() { const { data: health } = useHealthCheck(); const { setOpenMobile } = useSidebar(); if (!health) { return null; } const ok = !health.alarms?.length; if (ok) { return null; } return ( setOpenMobile(false)}> ); }