From edbfa02c5202c5a7035e146d446e7bf4bb3feb84 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Tue, 6 Feb 2024 11:04:15 +0200 Subject: [PATCH] ask relays for some ForYou feed events --- packages/app/src/Pages/Root/ForYouTab.tsx | 30 +++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/app/src/Pages/Root/ForYouTab.tsx b/packages/app/src/Pages/Root/ForYouTab.tsx index cb5cb88a..7c1b4e5e 100644 --- a/packages/app/src/Pages/Root/ForYouTab.tsx +++ b/packages/app/src/Pages/Root/ForYouTab.tsx @@ -1,4 +1,4 @@ -import { EventKind, NostrEvent } from "@snort/system"; +import { EventKind, NostrEvent, RequestBuilder, TaggedNostrEvent } from "@snort/system"; import { memo, useEffect, useMemo, useState } from "react"; import { FormattedMessage } from "react-intl"; import { Link } from "react-router-dom"; @@ -10,6 +10,7 @@ import { TaskList } from "@/Components/Tasks/TaskList"; import useTimelineFeed, { TimelineFeedOptions, TimelineSubject } from "@/Feed/TimelineFeed"; import useLogin from "@/Hooks/useLogin"; import messages from "@/Pages/messages"; +import { System } from "@/system"; const FollowsHint = () => { const { publicKey: pubKey, follows } = useLogin(); @@ -36,14 +37,39 @@ let forYouFeed = { }; let getForYouFeedPromise: Promise | null = null; +let reactionsRequested = false; + +const getReactedByFollows = (follows: string[]) => { + const rb1 = new RequestBuilder("follows:reactions"); + rb1.withFilter().kinds([EventKind.Reaction, EventKind.ZapReceipt]).authors(follows).limit(100); + const q = System.Query(rb1); + setTimeout(() => { + q.cancel(); + const reactedIds = new Set(); + q.snapshot.forEach((ev: TaggedNostrEvent) => { + const reactedTo = ev.tags.find((t: string[]) => t[0] === "e")?.[1]; + if (reactedTo) { + reactedIds.add(reactedTo); + } + }); + const rb2 = new RequestBuilder("follows:reactedEvents"); + rb2.withFilter().ids(Array.from(reactedIds)); + System.Query(rb2); + }, 500); +}; export const ForYouTab = memo(function ForYouTab() { const [notes, setNotes] = useState(forYouFeed.events); - const { feedDisplayAs } = useLogin(); + const { feedDisplayAs, follows } = useLogin(); const displayAsInitial = feedDisplayAs ?? "list"; const [displayAs, setDisplayAs] = useState(displayAsInitial); const { publicKey } = useLogin(); + if (!reactionsRequested && publicKey) { + reactionsRequested = true; + getReactedByFollows(follows.item); + } + const login = useLogin(); const subject = useMemo( () =>