import { useSecondaryPage } from '@/PageManager' import { ExtendedKind, SUPPORTED_KINDS } from '@/constants' import { getParentBech32Id, isNsfwEvent } from '@/lib/event' import { toNote } from '@/lib/link' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import { useMuteList } from '@/providers/MuteListProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { Event, kinds } from 'nostr-tools' import { useMemo, useState } from 'react' import AudioPlayer from '../AudioPlayer' import ClientTag from '../ClientTag' import Content from '../Content' import { FormattedTimestamp } from '../FormattedTimestamp' import Nip05 from '../Nip05' import NoteOptions from '../NoteOptions' import ParentNotePreview from '../ParentNotePreview' import TranslateButton from '../TranslateButton' import UserAvatar from '../UserAvatar' import Username from '../Username' import { MessageSquare } from 'lucide-react' import CommunityDefinition from './CommunityDefinition' import DiscussionContent from './DiscussionContent' import GroupMetadata from './GroupMetadata' import Highlight from './Highlight' import IValue from './IValue' import LiveEvent from './LiveEvent' import LongFormArticle from './LongFormArticle' import LongFormArticlePreview from './LongFormArticlePreview' import MutedNote from './MutedNote' import NsfwNote from './NsfwNote' import PictureNote from './PictureNote' import Poll from './Poll' import UnknownNote from './UnknownNote' import VideoNote from './VideoNote' import RelayReview from './RelayReview' import Zap from './Zap' export default function Note({ event, originalNoteId, size = 'normal', className, hideParentNotePreview = false, showFull = false }: { event: Event originalNoteId?: string size?: 'normal' | 'small' className?: string hideParentNotePreview?: boolean showFull?: boolean }) { const { push } = useSecondaryPage() const { isSmallScreen } = useScreenSize() const parentEventId = useMemo( () => (hideParentNotePreview ? undefined : getParentBech32Id(event)), [event, hideParentNotePreview] ) const { defaultShowNsfw } = useContentPolicy() const [showNsfw, setShowNsfw] = useState(false) const { mutePubkeySet } = useMuteList() const [showMuted, setShowMuted] = useState(false) let content: React.ReactNode const supportedKindsList = [ ...SUPPORTED_KINDS, kinds.CommunityDefinition, kinds.LiveEvent, ExtendedKind.GROUP_METADATA, ExtendedKind.PUBLIC_MESSAGE, ExtendedKind.ZAP_REQUEST, ExtendedKind.ZAP_RECEIPT ] if (!supportedKindsList.includes(event.kind)) { console.log('Note component - rendering UnknownNote for unsupported kind:', event.kind) content = } else if (mutePubkeySet.has(event.pubkey) && !showMuted) { content = setShowMuted(true)} /> } else if (!defaultShowNsfw && isNsfwEvent(event) && !showNsfw) { content = setShowNsfw(true)} /> } else if (event.kind === kinds.Highlights) { // Try to render the Highlight component with error boundary try { content = } catch (error) { console.error('Note component - Error rendering Highlight component:', error) content =
HIGHLIGHT ERROR:
Error: {String(error)}
Content: {event.content}
Context: {event.tags.find(tag => tag[0] === 'context')?.[1] || 'No context found'}
} } else if (event.kind === kinds.LongFormArticle) { content = showFull ? ( ) : ( ) } else if (event.kind === kinds.LiveEvent) { content = } else if (event.kind === ExtendedKind.GROUP_METADATA) { content = } else if (event.kind === kinds.CommunityDefinition) { content = } else if (event.kind === ExtendedKind.DISCUSSION) { const titleTag = event.tags.find(tag => tag[0] === 'title') const title = titleTag?.[1] || 'Untitled Discussion' content = ( <>

{title}

) } else if (event.kind === ExtendedKind.POLL) { content = ( <> ) } else if (event.kind === ExtendedKind.VOICE || event.kind === ExtendedKind.VOICE_COMMENT) { content = } else if (event.kind === ExtendedKind.PICTURE) { content = } else if (event.kind === ExtendedKind.VIDEO || event.kind === ExtendedKind.SHORT_VIDEO) { content = } else if (event.kind === ExtendedKind.RELAY_REVIEW) { content = } else if (event.kind === ExtendedKind.PUBLIC_MESSAGE) { content = } else if (event.kind === ExtendedKind.ZAP_REQUEST || event.kind === ExtendedKind.ZAP_RECEIPT) { content = } else { content = } return (
{event.kind === ExtendedKind.DISCUSSION && ( )} {size === 'normal' && ( )}
{parentEventId && ( { e.stopPropagation() push(toNote(parentEventId)) }} /> )} {content}
) }