import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.tsx"; import { SidebarButton } from "@components/UI/Sidebar/sidebarButton.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 { BatteryMediumIcon, CpuIcon, EditIcon, LayersIcon, type LucideIcon, MapIcon, MessageSquareIcon, SettingsIcon, SidebarCloseIcon, SidebarOpenIcon, UsersIcon, ZapIcon, } from "lucide-react"; import { useState } from "react"; export interface SidebarProps { children?: React.ReactNode; } export const Sidebar = ({ children }: SidebarProps) => { const { hardware, nodes, metadata } = useDevice(); const myNode = nodes.get(hardware.myNodeNum); const myMetadata = metadata.get(0); const { activePage, setActivePage, setDialogOpen } = useDevice(); const [showSidebar, setShowSidebar] = useState(true); interface NavLink { name: string; icon: LucideIcon; page: Page; } const pages: NavLink[] = [ { name: "Messages", icon: MessageSquareIcon, page: "messages", }, { name: "Map", icon: MapIcon, page: "map", }, { name: "Config", icon: SettingsIcon, page: "config", }, { name: "Channels", icon: LayersIcon, page: "channels", }, { name: `Nodes (${Math.max(nodes.size - 1, 0)})`, icon: UsersIcon, page: "nodes", }, ]; return showSidebar ? (
{myNode === undefined ? (
Loading device info...
) : ( <>
{myNode.user?.shortName ?? "UNK"} {myNode.user?.longName ?? "UNK"}
{myNode.deviceMetrics?.batteryLevel ? myNode.deviceMetrics.batteryLevel > 100 ? "Charging" : `${myNode.deviceMetrics.batteryLevel}%` : "UNK"}
{myNode.deviceMetrics?.voltage?.toPrecision(3) ?? "UNK"} volts
v{myMetadata?.firmwareVersion ?? "UNK"}
)} {pages.map((link) => ( { if (myNode !== undefined) { setActivePage(link.page); } }} active={link.page === activePage} disabled={myNode === undefined} /> ))} {children}
) : (
); };