From e746109f5cc3d08bd297afe4c9d76fb3aa3a4e92 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Sat, 3 Feb 2024 15:37:39 +0200 Subject: [PATCH] mix some recent events into the for you feed --- packages/app/src/Pages/Root/ForYouTab.tsx | 50 ++++++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/app/src/Pages/Root/ForYouTab.tsx b/packages/app/src/Pages/Root/ForYouTab.tsx index ba11f090..d8014e5b 100644 --- a/packages/app/src/Pages/Root/ForYouTab.tsx +++ b/packages/app/src/Pages/Root/ForYouTab.tsx @@ -1,4 +1,4 @@ -import { TaggedNostrEvent } from "@snort/system"; +import {EventKind, 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 { getForYouFeed } from "@/Db/getForYouFeed"; import useLogin from "@/Hooks/useLogin"; import messages from "@/Pages/messages"; import { System } from "@/system"; +import useTimelineFeed, {TimelineFeedOptions, TimelineSubject} from "@/Feed/TimelineFeed"; const FollowsHint = () => { const { publicKey: pubKey, follows } = useLogin(); @@ -44,6 +45,24 @@ export const ForYouTab = memo(function ForYouTab() { const [displayAs, setDisplayAs] = useState(displayAsInitial); const { publicKey } = useLogin(); + const login = useLogin(); + const subject = useMemo( + () => + ({ + type: "pubkey", + items: login.follows.item, + discriminator: login.publicKey?.slice(0, 12), + extra: rb => { + if (login.tags.item.length > 0) { + rb.withFilter().kinds([EventKind.TextNote]).tag("t", login.tags.item); + } + }, + }) as TimelineSubject, + [login.follows.item, login.tags.item], + ); + // also get "follows" feed so data is loaded + const latestFeed = useTimelineFeed(subject, { method: "TIME_RANGE" } as TimelineFeedOptions); + const getFeed = () => { if (!publicKey) { return []; @@ -78,10 +97,37 @@ export const ForYouTab = memo(function ForYouTab() { } }, []); + const combinedFeed = useMemo(() => { + // combine feeds: intermittently pick from both feeds + const seen = new Set(); + const combined = []; + let i = 0; + let j = 0; + while (i < notes.length || j < latestFeed.main?.length) { + if (i < notes.length) { + const ev = notes[i]; + if (!seen.has(ev.id)) { + seen.add(ev.id); + combined.push(ev); + } + i++; + } + if (j < latestFeed.main?.length) { + const ev = latestFeed.main[j]; + if (!seen.has(ev.id) && !ev.tags?.some((tag: string[]) => tag[0] === "e")) { + seen.add(ev.id); + combined.push(ev); + } + j++; + } + } + return combined; + }, [notes, latestFeed.main]); + const frags = useMemo(() => { return [ { - events: notes, + events: combinedFeed, refTime: Date.now(), }, ];