From 6350ddc2244084cf7c4b0d04aef27e1bc79ba846 Mon Sep 17 00:00:00 2001 From: codytseng Date: Sat, 16 Aug 2025 22:33:19 +0800 Subject: [PATCH] feat: improve highlight source display and navigation --- src/components/Note/Highlight.tsx | 32 +++++++++-------------- src/lib/tag.ts | 8 +++++- src/pages/secondary/NotePage/NotFound.tsx | 13 +++++++++ src/pages/secondary/NotePage/index.tsx | 10 +++++-- 4 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 src/pages/secondary/NotePage/NotFound.tsx diff --git a/src/components/Note/Highlight.tsx b/src/components/Note/Highlight.tsx index 11b3f7e..eca44c6 100644 --- a/src/components/Note/Highlight.tsx +++ b/src/components/Note/Highlight.tsx @@ -1,8 +1,8 @@ import { useFetchEvent, useTranslatedEvent } from '@/hooks' import { createFakeEvent } from '@/lib/event' -import { toNjump, toNote } from '@/lib/link' +import { toNote } from '@/lib/link' import { isValidPubkey } from '@/lib/pubkey' -import { generateBech32IdFromATag } from '@/lib/tag' +import { generateBech32IdFromATag, generateBech32IdFromETag } from '@/lib/tag' import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { Event } from 'nostr-tools' @@ -62,7 +62,13 @@ function HighlightSource({ event }: { event: Event }) { return sourceTag }, [event]) const { event: referenceEvent } = useFetchEvent( - sourceTag && sourceTag[0] === 'e' ? sourceTag[1] : undefined + sourceTag + ? sourceTag[0] === 'e' + ? generateBech32IdFromETag(sourceTag) + : sourceTag[0] === 'a' + ? generateBech32IdFromATag(sourceTag) + : undefined + : undefined ) const referenceEventId = useMemo(() => { if (!sourceTag || sourceTag[0] === 'r') return @@ -110,29 +116,17 @@ function HighlightSource({ event }: { event: Event }) {
{t('From')}
{pubkey && } - {referenceEvent ? ( + {referenceEventId && (
{ e.stopPropagation() - push(toNote(referenceEvent)) + push(toNote(referenceEvent ?? referenceEventId)) }} > - + {referenceEvent ? : referenceEventId}
- ) : referenceEventId ? ( -
- e.stopPropagation()} - > - {toNjump(referenceEventId)} - -
- ) : null} + )}
) } diff --git a/src/lib/tag.ts b/src/lib/tag.ts index 1554ff1..95dbb32 100644 --- a/src/lib/tag.ts +++ b/src/lib/tag.ts @@ -18,7 +18,13 @@ export function tagNameEquals(tagName: string) { export function generateBech32IdFromETag(tag: string[]) { try { - const [, id, relay, , author] = tag + const [, id, relay, markerOrPubkey, pubkey] = tag + let author: string | undefined + if (markerOrPubkey && isValidPubkey(markerOrPubkey)) { + author = markerOrPubkey + } else if (pubkey && isValidPubkey(pubkey)) { + author = pubkey + } return nip19.neventEncode({ id, relays: relay ? [relay] : undefined, author }) } catch { return undefined diff --git a/src/pages/secondary/NotePage/NotFound.tsx b/src/pages/secondary/NotePage/NotFound.tsx new file mode 100644 index 0000000..99c3acc --- /dev/null +++ b/src/pages/secondary/NotePage/NotFound.tsx @@ -0,0 +1,13 @@ +import ClientSelect from '@/components/ClientSelect' +import { useTranslation } from 'react-i18next' + +export default function NotFound({ bech32Id }: { bech32Id?: string }) { + const { t } = useTranslation() + + return ( +
+
{t('Note not found')}
+ +
+ ) +} diff --git a/src/pages/secondary/NotePage/index.tsx b/src/pages/secondary/NotePage/index.tsx index 025c57c..fcc99db 100644 --- a/src/pages/secondary/NotePage/index.tsx +++ b/src/pages/secondary/NotePage/index.tsx @@ -18,7 +18,7 @@ import { Ellipsis } from 'lucide-react' import { Event } from 'nostr-tools' import { forwardRef, useMemo } from 'react' import { useTranslation } from 'react-i18next' -import NotFoundPage from '../NotFoundPage' +import NotFound from './NotFound' const NotePage = forwardRef(({ id, index }: { id?: string; index?: number }, ref) => { const { t } = useTranslation() @@ -59,7 +59,13 @@ const NotePage = forwardRef(({ id, index }: { id?: string; index?: number }, ref ) } - if (!event) return + if (!event) { + return ( + + + + ) + } return (