import { FormattedMessage } from "react-intl"; import { ReactNode, useCallback, useMemo } from "react"; import type { NostrEvent, TaggedNostrEvent } from "@snort/system"; import { VideoTile } from "@/element/video-tile"; import { useLogin } from "@/hooks/login"; import { getHost, getTagValues } from "@/utils"; import { useStreamsFeed } from "@/hooks/live-streams"; import VideoGrid from "@/element/video-grid"; export function RootPage() { const login = useLogin(); const { live, planned, ended } = useStreamsFeed(); const mutedHosts = new Set(getTagValues(login?.muted.tags ?? [], "p")); const tags = login?.follows.tags ?? []; const followsHost = useCallback( (ev: NostrEvent) => { return tags.find(t => t.at(1) === getHost(ev)); }, [tags] ); const hashtags = getTagValues(tags, "t"); const following = live.filter(followsHost); const liveNow = live.filter(e => !following.includes(e)); const hasFollowingLive = following.length > 0; const plannedEvents = planned.filter(e => !mutedHosts.has(getHost(e))).filter(followsHost); const endedEvents = ended.filter(e => !mutedHosts.has(getHost(e))); const liveByHashtag = useMemo(() => { return hashtags .map(t => ({ tag: t, live: live .filter(e => !mutedHosts.has(getHost(e))) .filter(e => { const evTags = getTagValues(e.tags, "t"); return evTags.includes(t); }), })) .filter(t => t.live.length > 0); }, [live, hashtags]); return (