import React from "react"; import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.tsx"; import { Subtle } from "@components/UI/Typography/Subtle.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import type { Page } from "@core/stores/deviceStore.ts"; import { Spinner } from "@components/UI/Spinner.tsx"; import { Avatar } from "@components/UI/Avatar.tsx"; import { CircleChevronLeft, CpuIcon, LayersIcon, type LucideIcon, MapIcon, MessageSquareIcon, PenLine, SearchIcon, SettingsIcon, UsersIcon, ZapIcon, } from "lucide-react"; import { cn } from "@core/utils/cn.ts"; import { useSidebar } from "@core/stores/sidebarStore.tsx"; import ThemeSwitcher from "@components/ThemeSwitcher.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import BatteryStatus from "@components/BatteryStatus.tsx"; import { SidebarButton } from "@components/UI/Sidebar/SidebarButton.tsx"; import { useTranslation } from "react-i18next"; // Import useTranslation export interface SidebarProps { children?: React.ReactNode; } interface NavLink { name: string; icon: LucideIcon; page: Page; count?: number; } const CollapseToggleButton = () => { const { isCollapsed, toggleSidebar } = useSidebar(); const { t } = useTranslation(); const buttonLabel = isCollapsed ? t("sidebar_collapseToggle-button_open") : t("sidebar_collapseToggle_button_close"); return ( ); }; export const Sidebar = ({ children }: SidebarProps) => { const { hardware, getNode, getNodesLength, metadata, activePage, unreadCounts, setActivePage, setDialogOpen, } = useDevice(); const { setCommandPaletteOpen } = useAppStore(); const myNode = getNode(hardware.myNodeNum); const { isCollapsed } = useSidebar(); const { t } = useTranslation(); const myMetadata = metadata.get(0); const numUnread = [...unreadCounts.values()].reduce((sum, v) => sum + v, 0); const pages: NavLink[] = [ { name: t("navigation_title_messages"), icon: MessageSquareIcon, page: "messages", count: numUnread ? numUnread : undefined, }, { name: t("navigation_title_map"), icon: MapIcon, page: "map" }, { name: t("navigation_title_radioConfig"), icon: SettingsIcon, page: "config", }, { name: t("navigation_title_channels"), icon: LayersIcon, page: "channels", }, { name: `${t("navigation_title_nodes")} (${ Math.max(getNodesLength() - 1, 0) })`, icon: UsersIcon, page: "nodes", }, ]; return (
{t("sidebar_app_title_alt")}

{t("common_header")}

{pages.map((link) => ( { if (myNode !== undefined) { setActivePage(link.page); } }} active={link.page === activePage} disabled={myNode === undefined} /> ))}
{children}
{myNode === undefined ? (
{t("common_loading")}
) : ( <>

{myNode.user?.longName}

{t("sidebar_deviceInfo.volts", { voltage: myNode.deviceMetrics?.voltage?.toPrecision(3) ?? t("common_unknown"), })}
{t("sidebar_deviceInfo.firmwareVersion", { version: myMetadata?.firmwareVersion ?? t("common_unknown"), })}
)}
); };