import { BellIcon, EarthIcon, InfoIcon, LibraryIcon, PaperclipIcon, UserCircleIcon } from "lucide-react";
import { NavLink } from "react-router-dom";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import useCurrentUser from "@/hooks/useCurrentUser";
import { useNotifications } from "@/hooks/useUserQueries";
import { cn } from "@/lib/utils";
import { Routes } from "@/router";
import { UserNotification_Status } from "@/types/proto/api/v1/user_service_pb";
import { useTranslate } from "@/utils/i18n";
import MemosLogo from "./MemosLogo";
import UserMenu from "./UserMenu";
interface NavLinkItem {
id: string;
path: string;
title: string;
icon: React.ReactNode;
}
interface Props {
collapsed?: boolean;
className?: string;
}
const Navigation = (props: Props) => {
const { collapsed, className } = props;
const t = useTranslate();
const currentUser = useCurrentUser();
const { data: notifications = [] } = useNotifications();
const homeNavLink: NavLinkItem = {
id: "header-memos",
path: Routes.HOME,
title: t("common.memos"),
icon: ,
};
const exploreNavLink: NavLinkItem = {
id: "header-explore",
path: Routes.EXPLORE,
title: t("common.explore"),
icon: ,
};
const attachmentsNavLink: NavLinkItem = {
id: "header-attachments",
path: Routes.ATTACHMENTS,
title: t("common.attachments"),
icon: ,
};
const unreadCount = notifications.filter((n) => n.status === UserNotification_Status.UNREAD).length;
const inboxNavLink: NavLinkItem = {
id: "header-inbox",
path: Routes.INBOX,
title: t("common.inbox"),
icon: (
{unreadCount > 0 && (
{unreadCount > 99 ? "99+" : unreadCount}
)}
),
};
const signInNavLink: NavLinkItem = {
id: "header-auth",
path: Routes.AUTH,
title: t("common.sign-in"),
icon: ,
};
const primaryNavLinks: NavLinkItem[] = currentUser
? [homeNavLink, exploreNavLink, attachmentsNavLink, inboxNavLink]
: [exploreNavLink, signInNavLink];
const inboxAriaLabel = unreadCount > 0 ? `${t("common.inbox")}, ${unreadCount} unread` : t("common.inbox");
return (
{primaryNavLinks.map((navLink) => (
cn(
"px-2 py-2 rounded-2xl border flex flex-row items-center text-lg text-sidebar-foreground transition-colors",
collapsed ? "" : "w-full px-4",
isActive
? "bg-sidebar-accent text-sidebar-accent-foreground border-sidebar-accent-border drop-shadow"
: "border-transparent hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:border-sidebar-accent-border opacity-80",
)
}
key={navLink.id}
to={navLink.path}
end={navLink.path === Routes.HOME}
id={navLink.id}
aria-label={navLink.id === "header-inbox" ? inboxAriaLabel : undefined}
viewTransition
>
{props.collapsed ? (
{navLink.icon}
{navLink.title}
) : (
navLink.icon
)}
{!props.collapsed && {navLink.title}}
))}
{currentUser && (
)}
);
};
export default Navigation;