import { useSecondaryPage } from '@/PageManager' import ContentPreview from '@/components/ContentPreview' import Note from '@/components/Note' import NoteInteractions from '@/components/NoteInteractions' import NoteStats from '@/components/NoteStats' import UserAvatar from '@/components/UserAvatar' import { Card } from '@/components/ui/card' import { Separator } from '@/components/ui/separator' import { Skeleton } from '@/components/ui/skeleton' import { ExtendedKind } from '@/constants' import { useFetchEvent } from '@/hooks' import SecondaryPageLayout from '@/layouts/SecondaryPageLayout' import { getParentBech32Id, getParentETag, getRootBech32Id } from '@/lib/event' import { toNote, toNoteList } from '@/lib/link' import { tagNameEquals } from '@/lib/tag' import { cn } from '@/lib/utils' import { Ellipsis } from 'lucide-react' import { Event } from 'nostr-tools' import { forwardRef, useMemo } from 'react' import { useTranslation } from 'react-i18next' import NotFoundPage from '../NotFoundPage' const NotePage = forwardRef(({ id, index }: { id?: string; index?: number }, ref) => { const { t } = useTranslation() const { event, isFetching } = useFetchEvent(id) const parentEventId = useMemo(() => getParentBech32Id(event), [event]) const rootEventId = useMemo(() => getRootBech32Id(event), [event]) const rootITag = useMemo( () => (event?.kind === ExtendedKind.COMMENT ? event.tags.find(tagNameEquals('I')) : undefined), [event] ) const { isFetching: isFetchingRootEvent, event: rootEvent } = useFetchEvent(rootEventId) const { isFetching: isFetchingParentEvent, event: parentEvent } = useFetchEvent(parentEventId) if (!event && isFetching) { return (
) } if (!event) return return (
{rootITag && } {rootEventId !== parentEventId && ( )}
) }) NotePage.displayName = 'NotePage' export default NotePage function ExternalRoot({ value }: { value: string }) { const { push } = useSecondaryPage() return (
push(toNoteList({ externalContentId: value }))} >
{value}
) } function ParentNote({ event, isFetching, isConsecutive = true }: { event?: Event isFetching: boolean isConsecutive?: boolean }) { const { push } = useSecondaryPage() if (isFetching) { return (
) } if (!event) return null return (
{ if (!event) return push(toNote(event)) }} > {event && } {isConsecutive ? (
) : ( )}
) } function isConsecutive(rootEvent?: Event, parentEvent?: Event) { const eTag = getParentETag(parentEvent) if (!eTag) return false return rootEvent?.id === eTag[1] }