diff --git a/packages/app/src/Element/Feed/RootTabs.tsx b/packages/app/src/Element/Feed/RootTabs.tsx
index 20e24ec6..3f535bf2 100644
--- a/packages/app/src/Element/Feed/RootTabs.tsx
+++ b/packages/app/src/Element/Feed/RootTabs.tsx
@@ -10,6 +10,7 @@ import { Newest } from "@/Login";
export type RootTab =
| "following"
+ | "followed-by-friends"
| "conversations"
| "trending-notes"
| "trending-people"
@@ -53,13 +54,13 @@ export function rootTabItems(base: string, pubKey: string | undefined, tags: New
),
},
{
- tab: "trending-people",
- path: `${base}/trending/people`,
- show: true,
+ tab: "followed-by-friends",
+ path: `${base}/followed-by-friends`,
+ show: Boolean(pubKey),
element: (
<>
-
-
+
+
>
),
},
diff --git a/packages/app/src/Element/Feed/Timeline.tsx b/packages/app/src/Element/Feed/Timeline.tsx
index 65299574..76a74296 100644
--- a/packages/app/src/Element/Feed/Timeline.tsx
+++ b/packages/app/src/Element/Feed/Timeline.tsx
@@ -1,7 +1,7 @@
import "./Timeline.css";
import { FormattedMessage } from "react-intl";
import { useCallback, useMemo, useState } from "react";
-import { TaggedNostrEvent, EventKind } from "@snort/system";
+import { TaggedNostrEvent, EventKind, socialGraphInstance } from "@snort/system";
import { dedupeByPubkey, findTag } from "@/SnortUtils";
import useTimelineFeed, { TimelineFeed, TimelineSubject } from "@/Feed/TimelineFeed";
@@ -16,6 +16,7 @@ export interface TimelineProps {
postsOnly: boolean;
subject: TimelineSubject;
method: "TIME_RANGE" | "LIMIT_UNTIL";
+ followDistance?: number;
ignoreModeration?: boolean;
window?: number;
now?: number;
@@ -44,13 +45,20 @@ const Timeline = (props: TimelineProps) => {
const { muted, isEventMuted } = useModeration();
const filterPosts = useCallback(
(nts: readonly TaggedNostrEvent[]) => {
+ const checkFollowDistance = (a: TaggedNostrEvent) => {
+ if (props.followDistance === undefined) {
+ return true;
+ }
+ const followDistance = socialGraphInstance.getFollowDistance(a.pubkey);
+ return followDistance === props.followDistance;
+ };
const a = [...nts.filter(a => a.kind !== EventKind.LiveEvent)];
props.noSort || a.sort((a, b) => b.created_at - a.created_at);
return a
?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true))
- .filter(a => props.ignoreModeration || !isEventMuted(a));
+ .filter(a => (props.ignoreModeration || !isEventMuted(a)) && checkFollowDistance(a));
},
- [props.postsOnly, muted, props.ignoreModeration],
+ [props.postsOnly, muted, props.ignoreModeration, props.followDistance],
);
const mainFeed = useMemo(() => {
diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx
index 06b52972..6fe082ec 100644
--- a/packages/app/src/Pages/Root.tsx
+++ b/packages/app/src/Pages/Root.tsx
@@ -10,7 +10,6 @@ import { TimelineSubject } from "@/Feed/TimelineFeed";
import { debounce, getCurrentRefCode, getRelayName, sha256 } from "@/SnortUtils";
import useLogin from "@/Hooks/useLogin";
import Discover from "@/Pages/Discover";
-import TrendingUsers from "@/Element/Trending/TrendingUsers";
import TrendingNotes from "@/Element/Trending/TrendingPosts";
import HashTagsPage from "@/Pages/HashTagsPage";
import SuggestedProfiles from "@/Element/SuggestedProfiles";
@@ -147,6 +146,18 @@ export const GlobalTab = () => {
);
};
+export const FollowedByFriendsTab = () => {
+ const { publicKey } = useLogin();
+ const subject: TimelineSubject = {
+ type: "global",
+ items: [],
+ discriminator: `followed-by-friends-${publicKey}`,
+ streams: true,
+ };
+
+ return ;
+};
+
export const NotesTab = () => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const deckContext = useContext(DeckContext);
@@ -209,6 +220,10 @@ export const RootTabRoutes = [
path: "notes",
element: ,
},
+ {
+ path: "followed-by-friends",
+ element: ,
+ },
{
path: "conversations",
element: ,
@@ -225,14 +240,6 @@ export const RootTabRoutes = [
path: "trending/notes",
element: ,
},
- {
- path: "trending/people",
- element: (
-
-
-
- ),
- },
{
path: "trending/hashtags",
element: ,
diff --git a/packages/app/src/lang.json b/packages/app/src/lang.json
index 59cdba51..762d092b 100644
--- a/packages/app/src/lang.json
+++ b/packages/app/src/lang.json
@@ -1489,6 +1489,9 @@
"vlbWtt": {
"defaultMessage": "Get a free one"
},
+ "voxBKC": {
+ "defaultMessage": "Followed by friends"
+ },
"vrTOHJ": {
"defaultMessage": "{amount} sats"
},
diff --git a/packages/app/src/translations/en.json b/packages/app/src/translations/en.json
index 7d943be0..0469d0ca 100644
--- a/packages/app/src/translations/en.json
+++ b/packages/app/src/translations/en.json
@@ -491,6 +491,7 @@
"vZ4quW": "NIP-05 is a DNS based verification spec which helps to validate you as a real user.",
"vhlWFg": "Poll Options",
"vlbWtt": "Get a free one",
+ "voxBKC": "Followed by friends",
"vrTOHJ": "{amount} sats",
"vxwnbh": "Amount of work to apply to all published events",
"w1Fanr": "Business",