import { commands } from "@/commands.gen"; import { isValidRelayUrl } from "@/commons"; import { Plus, X } from "@phosphor-icons/react"; import { createLazyFileRoute } from "@tanstack/react-router"; import { message } from "@tauri-apps/plugin-dialog"; import { useEffect, useState, useTransition } from "react"; export const Route = createLazyFileRoute("/settings/relays")({ component: Screen, }); function Screen() { const { allRelays } = Route.useRouteContext(); const [relays, setRelays] = useState([]); const [newRelay, setNewRelay] = useState(""); const [isPending, startTransition] = useTransition(); const removeRelay = async (relay: string) => { const res = await commands.removeRelay(relay); if (res.status === "ok") { return res.data; } else { throw new Error(res.error); } }; const addNewRelay = () => { startTransition(async () => { if (!isValidRelayUrl(newRelay)) { await message("Relay URL is not valid", { kind: "error" }); return; } const res = await commands.connectRelay(newRelay); if (res.status === "ok") { setRelays((prev) => [...prev, newRelay]); setNewRelay(""); } else { await message(res.error, { title: "Relay", kind: "error" }); return; } }); }; useEffect(() => { if (allRelays) setRelays(allRelays); }, [allRelays]); return (

Connected Relays

Learn more about Relays{" "} here

setNewRelay(e.target.value)} name="url" placeholder="wss://..." disabled={isPending} spellCheck={false} className="flex-1 px-3 bg-transparent rounded-lg h-9 border-neutral-400/50 placeholder:text-neutral-500 focus:border-blue-500 focus:ring-0 dark:border-neutral-800/50 dark:placeholder:text-neutral-400" />
{relays.map((relay) => (
{relay}
))}
); }