- Game categories - Move stream setup/config to dashboard - Reorg files / cleanup - NSFW improvements
39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import { unwrap } from "@snort/shared";
|
|
import { NostrLink, NostrPrefix, RequestBuilder, TaggedNostrEvent } from "@snort/system";
|
|
import { useRequestBuilder } from "@snort/system-react";
|
|
import { useMemo } from "react";
|
|
|
|
import { LIVE_STREAM } from "@/const";
|
|
|
|
export function useCurrentStreamFeed(link: NostrLink, leaveOpen = false, evPreload?: TaggedNostrEvent) {
|
|
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(sub);
|
|
|
|
return useMemo(() => {
|
|
const hosting = [...q, ...(evPreload ? [evPreload] : [])].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]);
|
|
}
|