| Key | +Action | +
|---|---|
| {shortcut.keys} | +{shortcut.description} | +
{packet.raw}
| Time | ++ | Source | +Destination | ++ | Comment | +
|---|---|---|---|---|---|
| {packet.timestamp.toLocaleTimeString()} | +
+ |
+
+ |
+
+ |
+
+ {packet.symbol && |
+ {packet.comment || '-'} | +
| Time | -Source | -Destination | -Position | -Comment | -
|---|---|---|---|---|
| {packet.timestamp.toLocaleTimeString()} | -- {packet.frame.source.call} - {packet.frame.source.ssid && -{packet.frame.source.ssid}} - | -- {packet.frame.destination.call} - {packet.frame.destination.ssid && -{packet.frame.destination.ssid}} - | -{packet.latitude && packet.longitude ? '✓' : '-'} | -{packet.comment || '-'} | -
| Node | diff --git a/ui/src/pages/meshcore/MeshCorePacketDetailsPane.tsx b/ui/src/pages/meshcore/MeshCorePacketDetailsPane.tsx new file mode 100644 index 0000000..9fd3244 --- /dev/null +++ b/ui/src/pages/meshcore/MeshCorePacketDetailsPane.tsx @@ -0,0 +1,424 @@ +import React, { useMemo, useState } from 'react'; +import { bytesToHex } from '@noble/hashes/utils.js'; + +import { Badge, Card, Stack } from 'react-bootstrap'; + +import type { MeshCorePacketRecord } from './MeshCoreContext'; +import { + payloadDisplayByValue, + routeDisplayByValue, +} from './MeshCoreData'; + +const HeaderFact: React.FC<{ label: string; value: React.ReactNode }> = ({ label, value }) => ( +|||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + {hasDuplicates && ( + + )} + | ++ {packet.timestamp.toLocaleTimeString()} + {hasDuplicates && ( + + {' '}×{group.packets.length} + + )} + | ++ + | +
+ |
+ {packet.payloadSummary} | +|||||||||||||||||||||||||||||
| + | {duplicatePacket.timestamp.toLocaleTimeString()} | ++ + | +
+ |
+ + {getPathInfo(duplicatePacket).prefixes} + | +
| + | Time | +Hash | +Type | +Info | +
|---|
{asHex(packet.raw)}
- {JSON.stringify(payload as Payload)}
- | - | Time | -Hash | -Node | -Payload | -Info | -
|---|---|---|---|---|---|
| - {hasDuplicates && ( - - )} - | -- {packet.timestamp.toLocaleTimeString()} - {hasDuplicates && ( - - {' '}×{group.packets.length} - - )} - | -- - | -- {getNodeTypeIcon(packet.nodeType)} - | -{payloadDisplayByValue[packet.payloadType] ?? `0x${packet.payloadType.toString(16)}`} | -{packet.payloadSummary} | -
| - | {dupPacket.timestamp.toLocaleTimeString()} | -- - | -- {getNodeTypeIcon(dupPacket.nodeType)} - | -{payloadDisplayByValue[dupPacket.payloadType] ?? `0x${dupPacket.payloadType.toString(16)}`} | -- {dupPacket.payloadSummary} - {dupPacket.radioName && ({dupPacket.radioName})} - | -