import { useAppStore } from "@core/stores/appStore.ts"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@components/UI/Accordion.tsx"; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@components/UI/Dialog.tsx"; import { Protobuf } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { DeviceImage } from "@components/generic/DeviceImage.tsx"; import { TimeAgo } from "@components/generic/TimeAgo.tsx"; import { Uptime } from "@components/generic/Uptime.tsx"; export interface NodeDetailsDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export const NodeDetailsDialog = ({ open, onOpenChange, }: NodeDetailsDialogProps) => { const { getNode } = useDevice(); const { nodeNumDetails } = useAppStore(); const device = getNode(nodeNumDetails); if (!device) return null; const deviceMetricsMap = [ { key: "airUtilTx", label: "Air TX utilization", value: device.deviceMetrics?.airUtilTx, format: (val: number) => `${val.toFixed(2)}%`, }, { key: "channelUtilization", label: "Channel utilization", value: device.deviceMetrics?.channelUtilization, format: (val: number) => `${val.toFixed(2)}%`, }, { key: "batteryLevel", label: "Battery level", value: device.deviceMetrics?.batteryLevel, format: (val: number) => `${val.toFixed(2)}%`, }, { key: "voltage", label: "Voltage", value: device.deviceMetrics?.voltage, format: (val: number) => `${val.toFixed(2)}V`, }, ]; return ( Node Details for {device.user?.longName ?? "UNKNOWN"} ( {device.user?.shortName ?? "UNK"})

Details:

Hardware:{" "} {Protobuf.Mesh.HardwareModel[device.user?.hwModel ?? 0]}

Node Number: {device.num}

Node Hex: !{numberToHexUnpadded(device.num)}

Role: {Protobuf.Config.Config_DeviceConfig_Role[ device.user?.role ?? 0 ]}

Last Heard: {device.lastHeard === 0 ? "Never" : }

{device.position && (

Position:

{device.position.latitudeI && device.position.longitudeI && (

Coordinates:{" "} {device.position.latitudeI / 1e7},{" "} {device.position.longitudeI / 1e7}

)} {device.position.altitude && (

Altitude: {device.position.altitude}m

)}
)} {device.deviceMetrics && (

Device Metrics:

{deviceMetricsMap.map( (metric) => metric.value !== undefined && (

{metric.label}: {metric.format(metric.value)}

), )} {device.deviceMetrics.uptimeSeconds && (

Uptime:{" "}

)}
)}

All Raw Metrics:

                      {JSON.stringify(device, null, 2)}
                    
); };