meshai/work/dashboard-frontend/src/App.tsx
malice 486ad1016f
feat(channels): read-only Channels view for Meshtastic + MeshCore (#103)
Add a read-only Channels page listing both transports' channels with the
correct identifier per transport: Meshtastic by channel index (index,
name, role) from /api/channels, and MeshCore by channel name plus the
on-air hash from a new /api/meshcore/channels/detail endpoint. The
MeshCore transport now retains the channel_hash it already fetches at
enumeration (previously discarded); known_channels() and the existing
/api/meshcore/channels endpoint are unchanged. Adds a Channels nav entry
and /channels route.

Co-authored-by: Matt Johnson <mj@k7zvx.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 09:36:31 -06:00

80 lines
3.8 KiB
TypeScript

import { Routes, Route, Navigate } from 'react-router-dom'
import Layout from './components/Layout'
import Dashboard from './pages/Dashboard'
import Mesh from './pages/Mesh'
import Environment from './pages/Environment'
import Config from './pages/Config'
import ActivityLog from './pages/ActivityLog'
import Notifications from './pages/Notifications'
import Reference from './pages/Reference'
import AdapterConfig from './pages/AdapterConfig'
import GaugeSites from './pages/GaugeSites'
import TownAnchors from './pages/TownAnchors'
import MeshCoreRouting from './pages/MeshCoreRouting'
import MeshCoreConnection from './pages/MeshCoreConnection'
import MeshCoreCompanion from './pages/MeshCoreCompanion'
import MeshtasticConnection from './pages/MeshtasticConnection'
import MeshtasticSources from './pages/MeshtasticSources'
import Places from './pages/Places'
import MeshtasticNodes from './pages/MeshtasticNodes'
import MeshCoreContactsCompanion from './pages/MeshCoreContactsCompanion'
import ScheduledBroadcasts from './pages/ScheduledBroadcasts'
import MeshtasticDangerZones from './pages/MeshtasticDangerZones'
import MeshCoreDangerZones from './pages/MeshCoreDangerZones'
import Coverage from './pages/Coverage'
import Channels from './pages/Channels'
import { ToastProvider } from './components/ToastProvider'
import { DirtyProvider } from './context/DirtyContext'
function App() {
return (
<DirtyProvider>
<ToastProvider>
<Layout>
<Routes>
{/* Core routes */}
<Route path="/" element={<Dashboard />} />
<Route path="/environment" element={<Environment />} />
<Route path="/config" element={<Config />} />
<Route path="/alerts" element={<ActivityLog />} />
<Route path="/activity" element={<ActivityLog />} />
<Route path="/meshtastic/routing" element={<Notifications />} />
{/* Legacy /notifications -> Meshtastic Routing */}
<Route path="/notifications" element={<Navigate to="/meshtastic/routing" replace />} />
<Route path="/reference" element={<Reference />} />
<Route path="/adapter-config" element={<AdapterConfig />} />
{/* New aggregated pages */}
<Route path="/places" element={<Places />} />
<Route path="/coverage" element={<Coverage />} />
<Route path="/channels" element={<Channels />} />
{/* Custom sources folded into Data Feeds; keep old bookmark working */}
<Route path="/data-sources" element={<Navigate to="/environment" replace />} />
{/* De-navved routes still work */}
<Route path="/gauge-sites" element={<GaugeSites />} />
<Route path="/town-anchors" element={<TownAnchors />} />
<Route path="/mesh" element={<Mesh />} />
{/* Meshtastic routes */}
<Route path="/meshtastic/connection" element={<MeshtasticConnection />} />
<Route path="/meshtastic/sources" element={<MeshtasticSources />} />
<Route path="/meshtastic/scheduled" element={<ScheduledBroadcasts family="meshtastic" />} />
<Route path="/meshtastic/nodes" element={<MeshtasticNodes />} />
<Route path="/meshtastic/danger-zones" element={<MeshtasticDangerZones />} />
{/* MeshCore routes */}
<Route path="/meshcore/connection" element={<MeshCoreConnection />} />
<Route path="/meshcore/routing" element={<MeshCoreRouting />} />
<Route path="/meshcore/scheduled" element={<ScheduledBroadcasts family="meshcore" />} />
<Route path="/meshcore/contacts" element={<MeshCoreContactsCompanion />} />
<Route path="/meshcore/companion" element={<MeshCoreCompanion />} />
<Route path="/meshcore/danger-zones" element={<MeshCoreDangerZones />} />
</Routes>
</Layout>
</ToastProvider>
</DirtyProvider>
)
}
export default App