diff --git a/packages/app/src/Components/Relay/Relay.tsx b/packages/app/src/Components/Relay/Relay.tsx index 7d861e9d..98192d46 100644 --- a/packages/app/src/Components/Relay/Relay.tsx +++ b/packages/app/src/Components/Relay/Relay.tsx @@ -40,7 +40,7 @@ export default function Relay(props: RelayProps) {
{name}
- {!connection?.Ephemeral && ( + {!connection?.ephemeral && (
navigate(connection?.Id ?? "")} + onClick={() => navigate(connection?.id ?? "")} />
)} diff --git a/packages/app/src/Hooks/useLoginRelays.tsx b/packages/app/src/Hooks/useLoginRelays.tsx index a2df5b30..f2f8e257 100644 --- a/packages/app/src/Hooks/useLoginRelays.tsx +++ b/packages/app/src/Hooks/useLoginRelays.tsx @@ -24,7 +24,7 @@ export async function updateRelayConnections(system: SystemInterface, relays: Re system.ConnectToRelay(k, v); } for (const [k, v] of system.pool) { - if (!relays[k] && !v.Ephemeral) { + if (!relays[k] && !v.ephemeral) { system.DisconnectRelay(k); } } diff --git a/packages/app/src/Pages/Root/GlobalTab.tsx b/packages/app/src/Pages/Root/GlobalTab.tsx deleted file mode 100644 index 441a0c22..00000000 --- a/packages/app/src/Pages/Root/GlobalTab.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { unixNow } from "@snort/shared"; -import { SnortContext } from "@snort/system-react"; -import { useContext, useEffect, useMemo, useState } from "react"; -import { FormattedMessage } from "react-intl"; - -import Timeline from "@/Components/Feed/Timeline"; -import useHistoryState from "@/Hooks/useHistoryState"; -import useLogin from "@/Hooks/useLogin"; -import { debounce, getRelayName, sha256 } from "@/Utils"; - -interface RelayOption { - url: string; - paid: boolean; -} - -export const GlobalTab = () => { - const { relays } = useLogin(); - const [relay, setRelay] = useHistoryState(undefined, "global-relay"); - const [allRelays, setAllRelays] = useHistoryState(undefined, "global-relay-options"); - const [now] = useState(unixNow()); - const system = useContext(SnortContext); - - function globalRelaySelector() { - if (!allRelays || allRelays.length === 0) return null; - - const paidRelays = allRelays.filter(a => a.paid); - const publicRelays = allRelays.filter(a => !a.paid); - return ( -
-

- -

- -
- ); - } - - useEffect(() => { - return debounce(500, () => { - const ret: RelayOption[] = []; - [...system.pool].forEach(([, v]) => { - if (!v.IsClosed) { - ret.push({ - url: v.Address, - paid: v.Info?.limitation?.payment_required ?? false, - }); - } - }); - ret.sort(a => (a.paid ? -1 : 1)); - - if (ret.length > 0 && !relay) { - setRelay(ret[0]); - } - setAllRelays(ret); - }); - }, [relays, relay]); - - const subject = useMemo( - () => ({ - type: "global", - items: [], - relay: [relay?.url], - discriminator: `all-${sha256(relay?.url ?? "")}`, - }), - [relay?.url], - ); - - return ( - <> - {globalRelaySelector()} - {relay && } - - ); -}; diff --git a/packages/app/src/Pages/Root/RootTabRoutes.tsx b/packages/app/src/Pages/Root/RootTabRoutes.tsx index 08a2bbd6..c61bc97c 100644 --- a/packages/app/src/Pages/Root/RootTabRoutes.tsx +++ b/packages/app/src/Pages/Root/RootTabRoutes.tsx @@ -7,7 +7,6 @@ import { ConversationsTab } from "@/Pages/Root/ConversationsTab"; import { DefaultTab } from "@/Pages/Root/DefaultTab"; import { FollowedByFriendsTab } from "@/Pages/Root/FollowedByFriendsTab"; import { ForYouTab } from "@/Pages/Root/ForYouTab"; -import { GlobalTab } from "@/Pages/Root/GlobalTab"; import { NotesTab } from "@/Pages/Root/NotesTab"; import { TagsTab } from "@/Pages/Root/TagsTab"; import { TopicsPage } from "@/Pages/TopicsPage"; @@ -15,7 +14,6 @@ import { TopicsPage } from "@/Pages/TopicsPage"; export type RootTabRoutePath = | "" | "for-you" - | "global" | "following" | "followed-by-friends" | "conversations" @@ -41,10 +39,6 @@ export const RootTabRoutes: RootTabRoute[] = [ path: "for-you", element: , }, - { - path: "global", - element: , - }, { path: "following", element: , diff --git a/packages/app/src/Pages/ZapPool/ZapPoolPageInner.tsx b/packages/app/src/Pages/ZapPool/ZapPoolPageInner.tsx index 60c92589..6374efc8 100644 --- a/packages/app/src/Pages/ZapPool/ZapPoolPageInner.tsx +++ b/packages/app/src/Pages/ZapPool/ZapPoolPageInner.tsx @@ -30,10 +30,10 @@ export function ZapPoolPageInner() { const relayConnections = useMemo(() => { return [...system.pool] .map(([, a]) => { - if (a.Info?.pubkey && !a.Ephemeral) { + if (a.info?.pubkey && !a.ephemeral) { return { - address: a.Address, - pubkey: a.Info.pubkey, + address: a.address, + pubkey: a.info.pubkey, }; } }) diff --git a/packages/app/src/Pages/settings/RelayInfo.tsx b/packages/app/src/Pages/settings/RelayInfo.tsx index ad0e6ae5..0e8a346f 100644 --- a/packages/app/src/Pages/settings/RelayInfo.tsx +++ b/packages/app/src/Pages/settings/RelayInfo.tsx @@ -1,3 +1,4 @@ +import { Connection } from "@snort/system"; import { FormattedMessage } from "react-intl"; import { useNavigate, useParams } from "react-router-dom"; @@ -16,66 +17,66 @@ const RelayInfo = () => { const login = useLogin(); const { system } = useEventPublisher(); - const conn = [...system.pool].find(([, a]) => a.Id === params.id)?.[1]; + const conn = [...system.pool].find(([, a]) => a.id === params.id)?.[1]; - const stats = useRelayState(conn?.Address ?? ""); + const stats = useRelayState(conn?.address ?? ""); return ( <>

navigate("/settings/relays")}>

-

{stats?.Info?.name}

-

{stats?.Info?.description}

+

{stats?.info?.name}

+

{stats?.info?.description}

- {stats?.Info?.pubkey && ( + {stats?.info?.pubkey && ( <>

- + )} - {stats?.Info?.software && ( + {stats?.info?.software && (

- {stats.Info.software.startsWith("http") ? ( - - {stats.Info.software} + {stats.info.software.startsWith("http") ? ( + + {stats.info.software} ) : ( - <>{stats.Info.software} + <>{stats.info.software} )} - {!stats.Info.version?.startsWith("v") && "v"} - {stats.Info.version} + {!stats.info.version?.startsWith("v") && "v"} + {stats.info.version}
)} - {stats?.Info?.contact && ( + {stats?.info?.contact && ( )} - {stats?.Info?.supported_nips && ( + {stats?.info?.supported_nips && ( <>

- {stats.Info?.supported_nips?.map(a => ( + {stats.info?.supported_nips?.map(a => ( NIP-{a.toString().padStart(2, "0")} @@ -83,30 +84,38 @@ const RelayInfo = () => {
)} -

- -

-
- {[...(stats?.ActiveRequests ?? [])].map(a => ( - - {a} - - ))} -
-

- -

-
- {stats?.PendingRequests?.map(a => ( - - {a.obj[1]} - - ))} -
+ {conn instanceof Connection && ( + <> +

+ +

+
+ {conn.ActiveRequests.map(a => ( + + {a} + + ))} +
+ + )} + {conn instanceof Connection && ( + <> +

+ +

+
+ {conn.PendingRequests.map(a => ( + + {a.obj[1]} + + ))} +
+ + )}
{ - await login.state.removeRelay(unwrap(conn).Address, true); + await login.state.removeRelay(unwrap(conn).address, true); navigate("/settings/relays"); }}> diff --git a/packages/app/src/Pages/settings/Relays.tsx b/packages/app/src/Pages/settings/Relays.tsx index d1f7c161..f161753d 100644 --- a/packages/app/src/Pages/settings/Relays.tsx +++ b/packages/app/src/Pages/settings/Relays.tsx @@ -78,7 +78,7 @@ const RelaySettingsPage = () => {
{otherConnections.map(a => ( - + ))}
diff --git a/packages/app/src/Utils/Zapper.ts b/packages/app/src/Utils/Zapper.ts index 606b5341..6256908d 100644 --- a/packages/app/src/Utils/Zapper.ts +++ b/packages/app/src/Utils/Zapper.ts @@ -104,7 +104,7 @@ export class Zapper { if (!svc) { throw new Error(`Failed to get invoice from ${t.value}`); } - const relays = [...this.system.pool].filter(([, v]) => !v.Ephemeral).map(([k]) => k); + const relays = [...this.system.pool].filter(([, v]) => !v.ephemeral).map(([k]) => k); const pub = t.zap?.anon ?? false ? EventPublisher.privateKey(generateRandomKey().privateKey) : this.publisher; const zap = t.zap && svc.canZap diff --git a/packages/system/src/connection-pool.ts b/packages/system/src/connection-pool.ts index de8a6f5e..0acb084a 100644 --- a/packages/system/src/connection-pool.ts +++ b/packages/system/src/connection-pool.ts @@ -31,6 +31,7 @@ export type ConnectionType = { readonly address: string; readonly info: RelayInfo | undefined; readonly isDown: boolean; + readonly isOpen: boolean; settings: RelaySettings; ephemeral: boolean; diff --git a/packages/system/src/ndk-system.ts b/packages/system/src/ndk-system.ts index a7caf76c..1588af0f 100644 --- a/packages/system/src/ndk-system.ts +++ b/packages/system/src/ndk-system.ts @@ -3,7 +3,14 @@ import { QueryLike, SystemConfig, SystemInterface } from "./system"; import { RelaySettings, SyncCommand } from "./connection"; import { TaggedNostrEvent, NostrEvent, OkResponse, ReqCommand } from "./nostr"; import { BuiltRawReqFilter, RequestBuilder } from "./request-builder"; -import NDK, { NDKConstructorParams, NDKEvent, NDKFilter, NDKRelay, NDKSubscription } from "@nostr-dev-kit/ndk"; +import NDK, { + NDKConstructorParams, + NDKEvent, + NDKFilter, + NDKRelay, + NDKSubscription, + NDKRelayStatus, +} from "@nostr-dev-kit/ndk"; import { SystemBase } from "./system-base"; import { ConnectionPool, ConnectionType, ConnectionTypeEvents, DefaultConnectionPool } from "./connection-pool"; import { RelayMetadataLoader } from "./outbox"; @@ -53,7 +60,11 @@ class NDKConnection extends EventEmitter implements Connec } get isDown() { - return !this.relay.connectivity.isAvailable(); + return this.relay.connectivity.status === NDKRelayStatus.FLAPPING; + } + + get isOpen() { + return this.relay.connectivity.status === NDKRelayStatus.CONNECTED; } info: RelayInfo | undefined;