import { useTranslatedEvent } from '@/hooks' import { EmbeddedEmojiParser, EmbeddedEventParser, EmbeddedHashtagParser, EmbeddedImageParser, EmbeddedLNInvoiceParser, EmbeddedMediaParser, EmbeddedMentionParser, EmbeddedNormalUrlParser, EmbeddedWebsocketUrlParser, parseContent } from '@/lib/content-parser' import { getImageInfosFromEvent } from '@/lib/event' import { getEmojiInfosFromEmojiTags, getImageInfoFromImetaTag } from '@/lib/tag' import { cn } from '@/lib/utils' import mediaUpload from '@/services/media-upload.service' import { TImageInfo } from '@/types' import { Event } from 'nostr-tools' import { memo } from 'react' import { EmbeddedHashtag, EmbeddedLNInvoice, EmbeddedMention, EmbeddedNormalUrl, EmbeddedNote, EmbeddedWebsocketUrl } from '../Embedded' import Emoji from '../Emoji' import ImageGallery from '../ImageGallery' import MediaPlayer from '../MediaPlayer' import WebPreview from '../WebPreview' const Content = memo(({ event, className }: { event: Event; className?: string }) => { const translatedEvent = useTranslatedEvent(event.id) const nodes = parseContent(translatedEvent?.content ?? event.content, [ EmbeddedImageParser, EmbeddedMediaParser, EmbeddedNormalUrlParser, EmbeddedLNInvoiceParser, EmbeddedWebsocketUrlParser, EmbeddedEventParser, EmbeddedMentionParser, EmbeddedHashtagParser, EmbeddedEmojiParser ]) const imageInfos = getImageInfosFromEvent(event) const allImages = nodes .map((node) => { if (node.type === 'image') { const imageInfo = imageInfos.find((image) => image.url === node.data) if (imageInfo) { return imageInfo } const tag = mediaUpload.getImetaTagByUrl(node.data) return tag ? getImageInfoFromImetaTag(tag, event.pubkey) : { url: node.data, pubkey: event.pubkey } } if (node.type === 'images') { const urls = Array.isArray(node.data) ? node.data : [node.data] return urls.map((url) => { const imageInfo = imageInfos.find((image) => image.url === url) return imageInfo ?? { url, pubkey: event.pubkey } }) } return null }) .filter(Boolean) .flat() as TImageInfo[] let imageIndex = 0 const emojiInfos = getEmojiInfosFromEmojiTags(event.tags) const lastNormalUrlNode = nodes.findLast((node) => node.type === 'url') const lastNormalUrl = typeof lastNormalUrlNode?.data === 'string' ? lastNormalUrlNode.data : undefined return (