From b07961802c7508e6c8be66106d537ab35e32e65f Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Wed, 7 Feb 2024 10:36:17 +0200 Subject: [PATCH] reactions tab --- .../app/src/Components/Event/Note/Note.tsx | 26 +++++++++++++++++-- packages/app/src/Feed/TimelineFeed.ts | 17 ++++++------ packages/app/src/Pages/ErrorPage.tsx | 2 +- .../app/src/Pages/Profile/ProfilePage.tsx | 13 +++++++--- .../Pages/Profile/ProfileTabComponents.tsx | 16 ++++++++++++ .../src/Pages/Profile/ProfileTabSelectors.tsx | 2 +- packages/app/src/lang.json | 3 +++ packages/app/src/translations/en.json | 1 + 8 files changed, 65 insertions(+), 15 deletions(-) diff --git a/packages/app/src/Components/Event/Note/Note.tsx b/packages/app/src/Components/Event/Note/Note.tsx index d51f2e28..6a0f639d 100644 --- a/packages/app/src/Components/Event/Note/Note.tsx +++ b/packages/app/src/Components/Event/Note/Note.tsx @@ -1,4 +1,4 @@ -import { EventKind, NostrLink } from "@snort/system"; +import { EventKind, NostrLink, TaggedNostrEvent } from "@snort/system"; import classNames from "classnames"; import React, { useCallback, useEffect, useState } from "react"; import { useInView } from "react-intersection-observer"; @@ -8,8 +8,10 @@ import { LRUCache } from "typescript-lru-cache"; import { Relay } from "@/Cache"; import NoteHeader from "@/Components/Event/Note/NoteHeader"; +import NoteQuote from "@/Components/Event/Note/NoteQuote"; import { NoteText } from "@/Components/Event/Note/NoteText"; import { TranslationInfo } from "@/Components/Event/Note/TranslationInfo"; +import Username from "@/Components/User/Username"; import useModeration from "@/Hooks/useModeration"; import { findTag } from "@/Utils"; import { chainKey } from "@/Utils/Thread/ChainKey"; @@ -146,7 +148,25 @@ function useGoToEvent(props, options) { ); } -function handleNonTextNote(ev) { +function Reaction({ ev }: { ev: TaggedNostrEvent }) { + const reactedToTag = ev.tags.find((tag: string[]) => tag[0] === "e"); + const link = NostrLink.fromTag(reactedToTag); + if (!reactedToTag) { + return null; + } + return ( +
+
+ {}} /> + + +
+ +
+ ); +} + +function handleNonTextNote(ev: TaggedNostrEvent) { const alt = findTag(ev, "alt"); if (alt) { return ( @@ -154,6 +174,8 @@ function handleNonTextNote(ev) { ); + } else if (ev.kind === EventKind.Reaction) { + return ; } else { return ( <> diff --git a/packages/app/src/Feed/TimelineFeed.ts b/packages/app/src/Feed/TimelineFeed.ts index 419ff0c8..02c35b5c 100644 --- a/packages/app/src/Feed/TimelineFeed.ts +++ b/packages/app/src/Feed/TimelineFeed.ts @@ -20,6 +20,7 @@ export interface TimelineSubject { items: string[]; relay?: Array; extra?: (rb: RequestBuilder) => void; + kinds?: EventKind[]; } export type TimelineFeed = ReturnType; @@ -37,14 +38,14 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel return null; } + const kinds = + subject.kinds ?? + (subject.type === "profile_keyword" + ? [EventKind.SetMetadata] + : [EventKind.TextNote, EventKind.Repost, EventKind.Polls]); + const b = new RequestBuilder(`timeline:${subject.type}:${subject.discriminator}`); - const f = b - .withFilter() - .kinds( - subject.type === "profile_keyword" - ? [EventKind.SetMetadata] - : [EventKind.TextNote, EventKind.Repost, EventKind.Polls], - ); + const f = b.withFilter().kinds(kinds); if (subject.relay) { subject.relay.forEach(r => f.relay(r)); @@ -75,7 +76,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel } subject.extra?.(b); return b; - }, [subject.type, subject.items, subject.discriminator, subject.extra]); + }, [subject]); const sub = useMemo(() => { const rb = createBuilder(); diff --git a/packages/app/src/Pages/ErrorPage.tsx b/packages/app/src/Pages/ErrorPage.tsx index 65538d3d..8ccf210f 100644 --- a/packages/app/src/Pages/ErrorPage.tsx +++ b/packages/app/src/Pages/ErrorPage.tsx @@ -1,9 +1,9 @@ +import debug from "debug"; import { FormattedMessage } from "react-intl"; import { useRouteError } from "react-router-dom"; import AsyncButton from "@/Components/Button/AsyncButton"; import { db } from "@/Db"; -import debug from "debug"; const log = debug("ErrorPage"); diff --git a/packages/app/src/Pages/Profile/ProfilePage.tsx b/packages/app/src/Pages/Profile/ProfilePage.tsx index 3c3ab4c7..d93cb653 100644 --- a/packages/app/src/Pages/Profile/ProfilePage.tsx +++ b/packages/app/src/Pages/Profile/ProfilePage.tsx @@ -24,6 +24,7 @@ import { FollowersTab, FollowsTab, ProfileNotesTab, + ReactionsTab, RelaysTab, ZapsProfileTab, } from "@/Pages/Profile/ProfileTabComponents"; @@ -139,6 +140,9 @@ export default function ProfilePage({ id: propId, state }: ProfilePageProps) { case ProfileTabType.BOOKMARKS: { return ; } + case ProfileTabType.REACTIONS: { + return ; + } } } @@ -175,9 +179,12 @@ export default function ProfilePage({ id: propId, state }: ProfilePageProps) {
- {[ProfileTabSelectors.Notes, ProfileTabSelectors.Followers, ProfileTabSelectors.Follows].map( - renderTabSelector, - )} + {[ + ProfileTabSelectors.Notes, + ProfileTabSelectors.Reactions, + ProfileTabSelectors.Followers, + ProfileTabSelectors.Follows, + ].map(renderTabSelector)} {optionalTabs.map(renderTabSelector)} {isMe && blocked.length > 0 && renderTabSelector(ProfileTabSelectors.Blocked)}
diff --git a/packages/app/src/Pages/Profile/ProfileTabComponents.tsx b/packages/app/src/Pages/Profile/ProfileTabComponents.tsx index 70b9a9a2..dfaf2448 100644 --- a/packages/app/src/Pages/Profile/ProfileTabComponents.tsx +++ b/packages/app/src/Pages/Profile/ProfileTabComponents.tsx @@ -52,6 +52,22 @@ export function BookMarksTab({ id }: { id: HexKey }) { return ; } +export function ReactionsTab({ id }: { id: HexKey }) { + const subject = useMemo( + () => + ({ + type: "pubkey", + items: [id], + discriminator: `reactions:${id.slice(0, 12)}`, + kinds: [EventKind.Reaction], + }) as TimelineSubject, + [id], + ); + return ( + + ); +} + export function ProfileNotesTab({ id, relays, isMe }: { id: HexKey; relays?: Array; isMe: boolean }) { const pinned = usePinList(id); const options = useMemo(() => ({ showTime: false, showPinned: true, canUnpin: isMe }), [isMe]); diff --git a/packages/app/src/Pages/Profile/ProfileTabSelectors.tsx b/packages/app/src/Pages/Profile/ProfileTabSelectors.tsx index ce8426a3..482d55d8 100644 --- a/packages/app/src/Pages/Profile/ProfileTabSelectors.tsx +++ b/packages/app/src/Pages/Profile/ProfileTabSelectors.tsx @@ -17,7 +17,7 @@ const ProfileTabSelectors = { Reactions: { text: ( <> - + ), diff --git a/packages/app/src/lang.json b/packages/app/src/lang.json index 36b1d9a6..178a97e8 100644 --- a/packages/app/src/lang.json +++ b/packages/app/src/lang.json @@ -924,6 +924,9 @@ "Tpy00S": { "defaultMessage": "People" }, + "TvKqBp": { + "defaultMessage": "liked" + }, "TwyMau": { "defaultMessage": "Account" }, diff --git a/packages/app/src/translations/en.json b/packages/app/src/translations/en.json index c8302b0f..1fcf83a4 100644 --- a/packages/app/src/translations/en.json +++ b/packages/app/src/translations/en.json @@ -304,6 +304,7 @@ "TdtZQ5": "Crypto", "TpgeGw": "Hex Salt..", "Tpy00S": "People", + "TvKqBp": "liked", "TwyMau": "Account", "U1aPPi": "Stop listening", "UDYlxu": "Pending Subscriptions",