import useLocalState from "@/state/state"; import { useState } from "react"; import toast from "react-hot-toast"; import { ThemeSwitcher } from "@/styles/ThemeSwitcher"; import Icon from "@/components/Icon"; import "@/styles/Settings.css"; function Settings() { const { key, relays, api } = useLocalState((s) => ({ key: s.key, relays: s.relays, api: s.api, })); const [newRelay, setNewRelay] = useState(""); const [isAddingRelay, setIsAddingRelay] = useState(false); const [isCyclingKey, setIsCyclingKey] = useState(false); async function removeRelay(url: string) { try { await api?.deleteRelay(url); toast.success("Relay removed"); } catch (error) { toast.error("Failed to remove relay"); console.error("Remove relay error:", error); } } async function addNewRelay() { if (!newRelay.trim()) { toast.error("Please enter a relay URL"); return; } setIsAddingRelay(true); try { const valid = ["wss:", "ws:"]; const url = new URL(newRelay); if (!valid.includes(url.protocol)) { toast.error("Invalid Relay URL - must use wss:// or ws://"); return; } await api?.addRelay(newRelay); toast.success("Relay added"); setNewRelay(""); } catch (error) { toast.error("Invalid relay URL or failed to add relay"); console.error("Add relay error:", error); } finally { setIsAddingRelay(false); } } async function cycleKey() { setIsCyclingKey(true); try { await api?.cycleKeys(); toast.success("Key cycled successfully"); } catch (error) { toast.error("Failed to cycle key"); console.error("Cycle key error:", error); } finally { setIsCyclingKey(false); } } const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === "Enter") { addNewRelay(); } }; return (
Manage your Nostrill configuration and preferences
Choose your preferred color theme
Your unique identifier on the Nostr network
{key || "No key generated"}
Manage your Nostr relay connections
No relays configured