/** @jsx h */ import { Fragment, h } from "https://esm.sh/preact@10.17.1"; import { tw } from "https://esm.sh/twind@0.16.16"; import { computed, signal } from "https://esm.sh/@preact/signals@1.2.1"; import { CenterClass, inputBorderClass, InputClass, LinearGradientsClass, NoOutlineClass, } from "./components/tw.ts"; import KeyView from "./key-view.tsx"; import { InMemoryAccountContext, NostrAccountContext } from "../lib/nostr-ts/nostr.ts"; import { PrivateKey } from "../lib/nostr-ts/key.ts"; import { DividerBackgroundColor, ErrorColor, HoverButtonBackgroudColor, PrimaryTextColor, SecondaryBackgroundColor, SuccessColor, TitleIconColor, WarnColor, } from "./style/colors.ts"; import { RelayIcon } from "./icons2/relay-icon.tsx"; import { DeleteIcon } from "./icons2/delete-icon.tsx"; import { RelayConfig } from "./setting.ts"; import { ConnectionPool } from "../lib/nostr-ts/relay.ts"; import { emitFunc } from "../event-bus.ts"; export interface SettingProps { logout: () => void; relayConfig: RelayConfig; relayPool: ConnectionPool; myAccountContext: NostrAccountContext; emit: emitFunc; } const colors = { "Connecting": WarnColor, "Open": SuccessColor, "Closing": WarnColor, "Closed": ErrorColor, "Not In Pool": ErrorColor, }; export const Setting = (props: SettingProps) => { let priKey: PrivateKey | undefined; const ctx = props.myAccountContext; if (ctx instanceof InMemoryAccountContext) { priKey = ctx.privateKey; } return (
{RelaySetting(props)}
); }; const error = signal(""); const addRelayInput = signal(""); const relayStatus = signal<{ url: string; status: keyof typeof colors }[]>([]); export type RelayConfigChange = { type: "RelayConfigChange"; }; export function RelaySetting(props: { relayConfig: RelayConfig; relayPool: ConnectionPool; emit: emitFunc; }) { function computeRelayStatus() { const _relayStatus: { url: string; status: keyof typeof colors }[] = []; for (const url of props.relayConfig.getRelayURLs()) { const relay = props.relayPool.getRelay(url); let status: keyof typeof colors = "Not In Pool"; if (relay) { status = relay.ws.status(); } _relayStatus.push({ url, status, }); } return _relayStatus; } (async () => { console.log("relayConfig.syncWithPool", props.relayConfig, props.relayPool); const err = await props.relayConfig.syncWithPool(props.relayPool); if (err != undefined) { error.value = err.map((e) => e.message).join("\n"); } relayStatus.value = computeRelayStatus(); })(); relayStatus.value = computeRelayStatus(); const addRelay = async () => { // props.eventBus.emit({ type: "AddRelay" }); console.log("add", addRelayInput.value); if (addRelayInput.value.length > 0) { props.relayConfig.add(addRelayInput.value); addRelayInput.value = ""; relayStatus.value = computeRelayStatus(); const err = await props.relayConfig.syncWithPool(props.relayPool); if (err != undefined) { error.value = err.map((e) => e.message).join("\n"); } relayStatus.value = computeRelayStatus(); props.emit({ type: "RelayConfigChange" }); } }; return (

Relays

Add Relay

{ addRelayInput.value = e.currentTarget.value; console.log("|", addRelayInput.value); }} value={addRelayInput} placeholder="wss://" type="text" class={tw`${InputClass}`} />
{error.value ?

{error.value}

: undefined}
    {computed(() => { return relayStatus.value.map((r) => { return (
  • {r.status} {r.url}
  • ); }); })}
); }