From 2b5937b9e987c99784356ee3ffbd19b3f2b13e18 Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Wed, 1 Apr 2026 20:45:10 -0700 Subject: [PATCH] Always show on logged-in pane --- frontend/src/components/RepeaterDashboard.tsx | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/RepeaterDashboard.tsx b/frontend/src/components/RepeaterDashboard.tsx index 400a68c..760cfc5 100644 --- a/frontend/src/components/RepeaterDashboard.tsx +++ b/frontend/src/components/RepeaterDashboard.tsx @@ -1,5 +1,6 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import { api } from '../api'; import { toast } from './ui/sonner'; import { Button } from './ui/button'; import { Bell, Route, Star, Trash2 } from 'lucide-react'; @@ -12,7 +13,7 @@ import { isFavorite } from '../utils/favorites'; import { handleKeyboardActivate } from '../utils/a11y'; import { isValidLocation } from '../utils/pathUtils'; import { ContactStatusInfo } from './ContactStatusInfo'; -import type { Contact, Conversation, Favorite, PathDiscoveryResponse } from '../types'; +import type { Contact, Conversation, Favorite, PathDiscoveryResponse, TelemetryHistoryEntry } from '../types'; import { cn } from '../lib/utils'; import { TelemetryPane } from './repeater/RepeaterTelemetryPane'; import { NeighborsPane } from './repeater/RepeaterNeighborsPane'; @@ -65,6 +66,7 @@ export function RepeaterDashboard({ onDeleteContact, }: RepeaterDashboardProps) { const [pathDiscoveryOpen, setPathDiscoveryOpen] = useState(false); + const [telemetryHistory, setTelemetryHistory] = useState([]); const contact = contacts.find((c) => c.public_key === conversation.id) ?? null; const hasAdvertLocation = isValidLocation(contact?.lat ?? null, contact?.lon ?? null); const { @@ -89,6 +91,19 @@ export function RepeaterDashboard({ const { password, setPassword, rememberPassword, setRememberPassword, persistAfterLogin } = useRememberedServerPassword('repeater', conversation.id); + // Auto-fetch stored telemetry history from DB (no mesh traffic) + useEffect(() => { + api.repeaterTelemetryHistory(conversation.id).then(setTelemetryHistory).catch(() => {}); + }, [conversation.id]); + + // Refresh when a live status fetch returns newer data + const statusHistory = paneData.status?.telemetry_history; + useEffect(() => { + if (statusHistory && statusHistory.length > 0) { + setTelemetryHistory(statusHistory); + } + }, [statusHistory]); + const isFav = isFavorite(favorites, 'contact', conversation.id); const handleRepeaterLogin = async (nextPassword: string) => { @@ -340,7 +355,7 @@ export function RepeaterDashboard({ /> {/* Telemetry history chart — full width, below console */} - + )}