diff --git a/public/nostr.json b/public/nostr.json deleted file mode 100644 index bd01230..0000000 --- a/public/nostr.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "names":{ - "_": "cf45a6ba1363ad7ed213a078e710d24115ae721c9b47bd1ebf4458eaefb4c2a5" - } -} \ No newline at end of file diff --git a/src/hooks/current-stream-feed.ts b/src/hooks/current-stream-feed.ts new file mode 100644 index 0000000..c6cb142 --- /dev/null +++ b/src/hooks/current-stream-feed.ts @@ -0,0 +1,51 @@ +import { unwrap } from "@snort/shared"; +import { + NostrLink, + NostrPrefix, + NoteCollection, + RequestBuilder, +} from "@snort/system"; +import { useRequestBuilder } from "@snort/system-react"; +import { LIVE_STREAM } from "const"; +import { System } from "index"; +import { useMemo } from "react"; + +export function useCurrentStreamFeed(link: NostrLink, leaveOpen = false) { + const author = + link.type === NostrPrefix.Address ? unwrap(link.author) : link.id; + const sub = useMemo(() => { + const b = new RequestBuilder(`current-event:${link.id}`); + b.withOptions({ + leaveOpen, + }); + if ( + link.type === NostrPrefix.PublicKey || + link.type === NostrPrefix.Profile + ) { + b.withFilter().authors([link.id]).kinds([LIVE_STREAM]).limit(1); + b.withFilter().tag("p", [link.id]).kinds([LIVE_STREAM]).limit(1); + } else if (link.type === NostrPrefix.Address) { + const f = b.withFilter().tag("d", [link.id]); + if (link.author) { + f.authors([link.author]); + } + if (link.kind) { + f.kinds([link.kind]); + } + } + return b; + }, [link.id, leaveOpen]); + + const q = useRequestBuilder(System, NoteCollection, sub); + + return useMemo(() => { + const hosting = q.data?.filter( + (a) => + a.pubkey === author || + a.tags.some((b) => b[0] === "p" && b[1] === author && b[3] === "host") + ); + return [...(hosting ?? [])] + .sort((a, b) => (b.created_at > a.created_at ? 1 : -1)) + .at(0); + }, [q.data]); +} diff --git a/src/pages/chat-popout.tsx b/src/pages/chat-popout.tsx index 6862eba..4898af5 100644 --- a/src/pages/chat-popout.tsx +++ b/src/pages/chat-popout.tsx @@ -1,20 +1,22 @@ import "./chat-popout.css"; import { LiveChat } from "element/live-chat"; import { useParams } from "react-router-dom"; -import { parseNostrLink } from "@snort/system"; -import useEventFeed from "../hooks/event-feed"; +import { NostrPrefix, encodeTLV, parseNostrLink } from "@snort/system"; +import { useCurrentStreamFeed } from "hooks/current-stream-feed"; +import { findTag } from "utils"; export function ChatPopout() { const params = useParams(); const link = parseNostrLink(params.id!); - const { data: ev } = useEventFeed(link, true); + const ev = useCurrentStreamFeed(link, true); + const lnk = parseNostrLink(encodeTLV(NostrPrefix.Address, findTag(ev, "d") ?? "", undefined, ev?.kind, ev?.pubkey)); const chat = Boolean(new URL(window.location.href).searchParams.get("chat")); return (