"use client"; import { useEffect, useState } from "react"; import { api } from "@/lib/api"; import { cn } from "@/lib/utils"; import { Plus, Pencil, Trash2, X, Wifi, WifiOff, Zap } from "lucide-react"; export default function RelaysPage() { const [relays, setRelays] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState({ url: "", priority: 0 }); const [saving, setSaving] = useState(false); const [testResults, setTestResults] = useState>({}); const loadRelays = async () => { try { const data = await api.getRelays(); setRelays(data); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { loadRelays(); }, []); const openCreate = () => { setForm({ url: "", priority: 0 }); setEditingId(null); setShowForm(true); }; const openEdit = (relay: any) => { setForm({ url: relay.url, priority: relay.priority || 0 }); setEditingId(relay.id); setShowForm(true); }; const handleSave = async () => { if (!form.url.trim()) return; setSaving(true); setError(""); try { if (editingId) { await api.updateRelay(editingId, form); } else { await api.addRelay(form); } setShowForm(false); setEditingId(null); await loadRelays(); } catch (err: any) { setError(err.message); } finally { setSaving(false); } }; const handleDelete = async (id: string) => { if (!confirm("Delete this relay?")) return; try { await api.deleteRelay(id); await loadRelays(); } catch (err: any) { setError(err.message); } }; const handleTest = async (id: string) => { setTestResults((prev) => ({ ...prev, [id]: null })); try { const result = await api.testRelay(id); setTestResults((prev) => ({ ...prev, [id]: result.success })); } catch { setTestResults((prev) => ({ ...prev, [id]: false })); } }; if (loading) { return (
Loading relays...
); } return (

Relay Configuration

{error &&

{error}

} {showForm && (

{editingId ? "Edit Relay" : "Add Relay"}

setForm({ ...form, url: e.target.value })} className="bg-surface-container-highest text-on-surface rounded-lg px-4 py-3 w-full focus:outline-none focus:ring-1 focus:ring-primary/40 md:col-span-2" /> setForm({ ...form, priority: parseInt(e.target.value) || 0 })} className="bg-surface-container-highest text-on-surface rounded-lg px-4 py-3 w-full focus:outline-none focus:ring-1 focus:ring-primary/40" />
)}
{relays.length === 0 ? (

No relays configured.

) : ( relays.map((relay) => (
{relay.active !== false ? : }

{relay.url}

Priority: {relay.priority ?? 0} {testResults[relay.id] !== undefined && ( {testResults[relay.id] === null ? "Testing..." : testResults[relay.id] ? "Connected" : "Failed"} )}
)) )}
); }