import { EmbeddedEmojiParser, EmbeddedEventParser, EmbeddedHashtagParser, EmbeddedImageParser, EmbeddedMentionParser, EmbeddedNormalUrlParser, EmbeddedVideoParser, EmbeddedWebsocketUrlParser, parseContent } from '@/lib/content-parser' import { extractEmojiInfosFromTags, isNsfwEvent } from '@/lib/event' import { extractImageInfoFromTag } from '@/lib/tag' import { cn } from '@/lib/utils' import { TImageInfo } from '@/types' import { Event } from 'nostr-tools' import { memo } from 'react' import { EmbeddedHashtag, EmbeddedMention, EmbeddedNormalUrl, EmbeddedNote, EmbeddedWebsocketUrl } from '../Embedded' import Emoji from '../Emoji' import ImageGallery from '../ImageGallery' import VideoPlayer from '../VideoPlayer' import WebPreview from '../WebPreview' const Content = memo( ({ event, className, size = 'normal' }: { event: Event className?: string size?: 'normal' | 'small' }) => { const nodes = parseContent(event.content, [ EmbeddedImageParser, EmbeddedVideoParser, EmbeddedNormalUrlParser, EmbeddedWebsocketUrlParser, EmbeddedEventParser, EmbeddedMentionParser, EmbeddedHashtagParser, EmbeddedEmojiParser ]) const imageInfos = event.tags .map((tag) => extractImageInfoFromTag(tag)) .filter(Boolean) as TImageInfo[] const emojiInfos = extractEmojiInfosFromTags(event.tags) const lastNormalUrlNode = nodes.findLast((node) => node.type === 'url') const lastNormalUrl = typeof lastNormalUrlNode?.data === 'string' ? lastNormalUrlNode.data : undefined return (
{nodes.map((node, index) => { if (node.type === 'text') { return node.data } if (node.type === 'image' || node.type === 'images') { const imageUrls = Array.isArray(node.data) ? node.data : [node.data] const images = imageUrls.map( (url) => imageInfos.find((image) => image.url === url) ?? { url } ) return ( ) } if (node.type === 'video') { return ( ) } if (node.type === 'url') { return } if (node.type === 'websocket-url') { return } if (node.type === 'event') { const id = node.data.split(':')[1] return ( ) } if (node.type === 'mention') { return } if (node.type === 'hashtag') { return } if (node.type === 'emoji') { const shortcode = node.data.split(':')[1] const emoji = emojiInfos.find((e) => e.shortcode === shortcode) if (!emoji) return node.data return } return null })} {lastNormalUrl && ( )}
) } ) Content.displayName = 'Content' export default Content