import type { ConnectionStatus } from "@app/core/stores/deviceStore/types.ts";
import { cn } from "@core/utils/cn.ts";
import type { Protobuf } from "@meshtastic/sdk";
import { useNavigate } from "@tanstack/react-router";
import {
ChevronRight,
CpuIcon,
Languages,
type LucideIcon,
Palette,
Search as SearchIcon,
ZapIcon,
} from "lucide-react";
import type React from "react";
import { Fragment } from "react";
import { useTranslation } from "react-i18next";
import BatteryStatus from "./BatteryStatus.tsx";
import LanguageSwitcher from "./LanguageSwitcher.tsx";
import ThemeSwitcher from "./ThemeSwitcher.tsx";
import type { DeviceMetrics } from "./types.ts";
import { Avatar } from "./UI/Avatar.tsx";
import { Button } from "./UI/Button.tsx";
import { Subtle } from "./UI/Typography/Subtle.tsx";
interface DeviceInfoPanelProps {
isCollapsed: boolean;
deviceMetrics: DeviceMetrics;
firmwareVersion: string;
user?: Protobuf.Mesh.User;
setDialogOpen: () => void;
setCommandPaletteOpen: () => void;
disableHover?: boolean;
connectionStatus?: ConnectionStatus;
connectionName?: string;
}
interface InfoDisplayItem {
id: string;
label: string;
icon?: LucideIcon;
customComponent?: React.ReactNode;
value?: string | number | null;
}
interface ActionButtonConfig {
id: string;
label: string;
icon: LucideIcon;
onClick?: () => void;
render?: () => React.ReactNode;
}
export const DeviceInfoPanel = ({
deviceMetrics,
firmwareVersion,
user,
isCollapsed,
setCommandPaletteOpen,
disableHover = false,
connectionStatus,
connectionName,
}: DeviceInfoPanelProps) => {
const { t } = useTranslation();
const navigate = useNavigate({ from: "/" });
const { batteryLevel, voltage } = deviceMetrics;
const getStatusColor = (status?: ConnectionStatus): string => {
if (!status) {
return "bg-gray-400";
}
switch (status) {
case "connected":
case "configured":
case "online":
return "bg-emerald-500";
case "connecting":
case "configuring":
case "disconnecting":
return "bg-amber-500";
case "error":
return "bg-red-500";
default:
return "bg-gray-400";
}
};
const getStatusLabel = (status?: ConnectionStatus): string => {
if (!status) {
return t("unknown.notAvailable", "N/A");
}
// Show "connected" for configured state
if (status === "configured") {
return t("toasts.connected", { ns: "connections" });
}
return status;
};
const deviceInfoItems: InfoDisplayItem[] = [
{
id: "battery",
label: t("batteryStatus.title"),
customComponent:
{user.longName}
)}