You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.7 KiB
54 lines
1.7 KiB
import { useMemo } from 'react' |
|
import { rewritePlainTextHttpUrls } from '@/lib/url' |
|
import { Event } from 'nostr-tools' |
|
import { logContentSpacing, reprString } from '@/lib/content-spacing-debug' |
|
import { parseNostrContent, renderNostrContent } from '@/lib/nostr-parser.tsx' |
|
import { cn } from '@/lib/utils' |
|
|
|
interface SimpleContentProps { |
|
event?: Event |
|
content?: string |
|
className?: string |
|
} |
|
|
|
export default function SimpleContent({ |
|
event, |
|
content, |
|
className |
|
}: SimpleContentProps) { |
|
const processedContent = useMemo(() => { |
|
const rawContent = content || event?.content || '' |
|
|
|
// Clean URLs to remove tracking parameters |
|
const cleaned = rewritePlainTextHttpUrls(rawContent) |
|
|
|
if (rawContent.includes('nostr:')) { |
|
logContentSpacing('SimpleContent:processedContent', { |
|
rawRepr: reprString(rawContent), |
|
cleanedRepr: reprString(cleaned), |
|
same: rawContent === cleaned |
|
}) |
|
} |
|
return cleaned |
|
}, [content, event?.content]) |
|
|
|
// Parse content for nostr addresses and media |
|
const parsedContent = useMemo(() => { |
|
const parsed = parseNostrContent(processedContent, event) |
|
if (processedContent.includes('nostr:')) { |
|
logContentSpacing('SimpleContent:parsedContent', { |
|
elementCount: parsed.elements.length, |
|
tail: parsed.elements.slice(-3).map((e) => |
|
e.type === 'text' ? { type: 'text', repr: reprString(e.content) } : { type: e.type } |
|
) |
|
}) |
|
} |
|
return parsed |
|
}, [processedContent, event]) |
|
|
|
return ( |
|
<div className={cn('prose prose-sm prose-zinc max-w-none break-words dark:prose-invert w-full', className)}> |
|
{renderNostrContent(parsedContent)} |
|
</div> |
|
) |
|
} |