import { useMemo } from 'react' import { cleanUrl } from '@/lib/url' import { getImetaInfosFromEvent } from '@/lib/event' import { Event } from 'nostr-tools' import Markdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { remarkNostr } from '../Note/LongFormArticle/remarkNostr' import NostrNode from '../Note/LongFormArticle/NostrNode' import { cn } from '@/lib/utils' import ImageWithLightbox from '../ImageWithLightbox' interface SimpleContentProps { event?: Event content?: string className?: string } export default function SimpleContent({ event, content, className }: SimpleContentProps) { const imetaInfos = useMemo(() => event ? getImetaInfosFromEvent(event) : [], [event]) const processedContent = useMemo(() => { const rawContent = content || event?.content || '' // Clean URLs const cleaned = rawContent.replace( /(https?:\/\/[^\s]+)/g, (url) => { try { return cleanUrl(url) } catch { return url } } ) return cleaned }, [content, event?.content]) // Process content to handle images and markdown const { markdownContent, mediaElements } = useMemo(() => { const lines = processedContent.split('\n') const elements: JSX.Element[] = [] const markdownLines: string[] = [] let key = 0 lines.forEach((line) => { // Check if line contains an image URL const imageMatch = line.match(/(https?:\/\/[^\s]+\.(jpg|jpeg|png|gif|webp|heic|svg))/i) if (imageMatch) { const imageUrl = imageMatch[1] const imageInfo = imetaInfos.find((info) => info.url === imageUrl) const imageData = imageInfo || { url: imageUrl, pubkey: event?.pubkey } elements.push(
) // Add the rest of the line as text if there's anything else const beforeImage = line.substring(0, imageMatch.index).trim() const afterImage = line.substring(imageMatch.index! + imageUrl.length).trim() if (beforeImage || afterImage) { markdownLines.push(beforeImage + afterImage) } } else { // Regular text line - add to markdown processing markdownLines.push(line) } }) return { markdownContent: markdownLines.join('\n'), mediaElements: elements } }, [processedContent, imetaInfos, event?.pubkey]) const components = useMemo(() => ({ nostr: ({ rawText, bech32Id }: { rawText: string; bech32Id: string }) => ( ), a: ({ href, children, ...props }: any) => { if (!href) { return } return ( {children} ) }, p: (props: any) =>

, code: (props: any) => , pre: (props: any) =>

,
    blockquote: (props: any) => 
, ul: (props: any) =>
    , ol: (props: any) =>
      , li: (props: any) =>
    1. , h1: (props: any) =>

      , h2: (props: any) =>

      , h3: (props: any) =>

      , strong: (props: any) => , em: (props: any) => }), []) return (
      { if (url.startsWith('nostr:')) { return url.slice(6) // Remove 'nostr:' prefix for rendering } return url }} components={components} > {markdownContent} {mediaElements}
      ) }