diff --git a/frontend/src/components/RawPacketFeedView.tsx b/frontend/src/components/RawPacketFeedView.tsx index 6b04df4..4dd6a9b 100644 --- a/frontend/src/components/RawPacketFeedView.tsx +++ b/frontend/src/components/RawPacketFeedView.tsx @@ -171,24 +171,17 @@ function isNeighborIdentityResolvable(item: NeighborStat, contacts: Contact[]): return resolveContact(item.key, contacts) !== null; } -function formatStrongestPacketDetail( +function formatStrongestNeighborDetail( stats: ReturnType, contacts: Contact[] ): string | undefined { - if (!stats.strongestPacketPayloadType) { + const strongestNeighbor = stats.strongestNeighbors[0]; + if (!strongestNeighbor || strongestNeighbor.bestRssi === null) { return undefined; } - const resolvedLabel = - resolveContactLabel(stats.strongestPacketSourceKey, contacts) ?? - stats.strongestPacketSourceLabel; - if (resolvedLabel) { - return `${resolvedLabel} · ${stats.strongestPacketPayloadType}`; - } - if (stats.strongestPacketPayloadType === 'GroupText') { - return ' · GroupText'; - } - return stats.strongestPacketPayloadType; + const resolvedNeighbor = resolveNeighbor(strongestNeighbor, contacts); + return `${formatRssi(resolvedNeighbor.bestRssi)} best heard`; } function getCoverageMessage( @@ -450,8 +443,13 @@ export function RawPacketFeedView({ [nowSec, rawPacketStatsSession, selectedWindow] ); const coverageMessage = getCoverageMessage(stats, rawPacketStatsSession); - const strongestPacketDetail = useMemo( - () => formatStrongestPacketDetail(stats, contacts), + const strongestNeighbor = useMemo(() => { + const topNeighbor = stats.strongestNeighbors[0]; + return topNeighbor ? resolveNeighbor(topNeighbor, contacts) : null; + }, [contacts, stats]); + + const strongestNeighborDetail = useMemo( + () => formatStrongestNeighborDetail(stats, contacts), [contacts, stats] ); const strongestNeighbors = useMemo( @@ -578,9 +576,9 @@ export function RawPacketFeedView({ detail={`${formatPercent(stats.pathBearingRate)} path-bearing packets`} /> { it('ignores invalid or embedded channel-like text', () => { expect( - findLinkedChannelReferences('skip #Bad #bad--name abc#ops #ops- #opsRoom #ops_room #good-room,') + findLinkedChannelReferences( + 'skip #Bad #bad--name abc#ops #ops- #opsRoom #ops_room #good-room,' + ) ).toEqual([]); }); }); diff --git a/frontend/src/test/rawPacketFeedView.test.tsx b/frontend/src/test/rawPacketFeedView.test.tsx index 434ad2e..8acb5e5 100644 --- a/frontend/src/test/rawPacketFeedView.test.tsx +++ b/frontend/src/test/rawPacketFeedView.test.tsx @@ -283,6 +283,8 @@ describe('RawPacketFeedView', () => { fireEvent.click(screen.getByRole('button', { name: /show stats/i })); fireEvent.change(screen.getByLabelText('Stats window'), { target: { value: 'session' } }); expect(screen.getAllByText('Alpha').length).toBeGreaterThan(0); + expect(screen.getByText('Strongest Neighbor')).toBeInTheDocument(); + expect(screen.getByText('-70 dBm best heard')).toBeInTheDocument(); }); it('marks unresolved neighbor identities explicitly', () => { diff --git a/frontend/src/utils/rawPacketStats.ts b/frontend/src/utils/rawPacketStats.ts index 66d9d30..86abaac 100644 --- a/frontend/src/utils/rawPacketStats.ts +++ b/frontend/src/utils/rawPacketStats.ts @@ -106,9 +106,6 @@ export interface RawPacketStatsSnapshot { medianRssi: number | null; bestRssi: number | null; rssiBuckets: RankedPacketStat[]; - strongestPacketSourceKey: string | null; - strongestPacketSourceLabel: string | null; - strongestPacketPayloadType: string | null; coverageSeconds: number; windowFullyCovered: boolean; oldestStoredTimestamp: number | null; @@ -377,8 +374,6 @@ export function buildRawPacketStatsSnapshot( ['Weak (<-85 dBm)', 0], ]); - let strongestPacket: RawPacketStatsObservation | null = null; - for (const packet of packets) { payloadCounts.set(packet.payloadType, (payloadCounts.get(packet.payloadType) ?? 0) + 1); routeCounts.set(packet.routeType, (routeCounts.get(packet.routeType) ?? 0) + 1); @@ -436,10 +431,6 @@ export function buildRawPacketStatsSnapshot( } else { rssiBucketCounts.set('Weak (<-85 dBm)', (rssiBucketCounts.get('Weak (<-85 dBm)') ?? 0) + 1); } - - if (!strongestPacket || strongestPacket.rssi === null || packet.rssi > strongestPacket.rssi) { - strongestPacket = packet; - } } } @@ -527,9 +518,6 @@ export function buildRawPacketStatsSnapshot( medianRssi, bestRssi, rssiBuckets: rankedBreakdown(rssiBucketCounts, rssiValues.length), - strongestPacketSourceKey: strongestPacket?.sourceKey ?? null, - strongestPacketSourceLabel: strongestPacket?.sourceLabel ?? null, - strongestPacketPayloadType: strongestPacket?.payloadType ?? null, coverageSeconds, windowFullyCovered, oldestStoredTimestamp,