fix: 🐛

This commit is contained in:
codytseng
2025-10-09 23:18:20 +08:00
parent 6eb3bccd38
commit 0444c887f4
3 changed files with 92 additions and 97 deletions

View File

@@ -15,7 +15,7 @@ import { cn } from '@/lib/utils'
import mediaUpload from '@/services/media-upload.service' import mediaUpload from '@/services/media-upload.service'
import { TImetaInfo } from '@/types' import { TImetaInfo } from '@/types'
import { Event } from 'nostr-tools' import { Event } from 'nostr-tools'
import { memo } from 'react' import { useMemo } from 'react'
import { import {
EmbeddedHashtag, EmbeddedHashtag,
EmbeddedLNInvoice, EmbeddedLNInvoice,
@@ -30,8 +30,7 @@ import MediaPlayer from '../MediaPlayer'
import WebPreview from '../WebPreview' import WebPreview from '../WebPreview'
import YoutubeEmbeddedPlayer from '../YoutubeEmbeddedPlayer' import YoutubeEmbeddedPlayer from '../YoutubeEmbeddedPlayer'
const Content = memo( export default function Content({
({
event, event,
content, content,
className, className,
@@ -41,10 +40,11 @@ const Content = memo(
content?: string content?: string
className?: string className?: string
mustLoadMedia?: boolean mustLoadMedia?: boolean
}) => { }) {
const translatedEvent = useTranslatedEvent(event?.id) const translatedEvent = useTranslatedEvent(event?.id)
const { nodes, allImages, lastNormalUrl, emojiInfos } = useMemo(() => {
const _content = translatedEvent?.content ?? event?.content ?? content const _content = translatedEvent?.content ?? event?.content ?? content
if (!_content) return null if (!_content) return {}
const nodes = parseContent(_content, [ const nodes = parseContent(_content, [
EmbeddedUrlParser, EmbeddedUrlParser,
@@ -80,7 +80,6 @@ const Content = memo(
}) })
.filter(Boolean) .filter(Boolean)
.flat() as TImetaInfo[] .flat() as TImetaInfo[]
let imageIndex = 0
const emojiInfos = getEmojiInfosFromEmojiTags(event?.tags) const emojiInfos = getEmojiInfosFromEmojiTags(event?.tags)
@@ -88,6 +87,14 @@ const Content = memo(
const lastNormalUrl = const lastNormalUrl =
typeof lastNormalUrlNode?.data === 'string' ? lastNormalUrlNode.data : undefined typeof lastNormalUrlNode?.data === 'string' ? lastNormalUrlNode.data : undefined
return { nodes, allImages, emojiInfos, lastNormalUrl }
}, [event])
if (!nodes || nodes.length === 0) {
return null
}
let imageIndex = 0
return ( return (
<div className={cn('text-wrap break-words whitespace-pre-wrap', className)}> <div className={cn('text-wrap break-words whitespace-pre-wrap', className)}>
{nodes.map((node, index) => { {nodes.map((node, index) => {
@@ -155,6 +162,3 @@ const Content = memo(
</div> </div>
) )
} }
)
Content.displayName = 'Content'
export default Content

View File

@@ -71,6 +71,7 @@ export default function YoutubeEmbeddedPlayer({
}) })
} catch (error) { } catch (error) {
console.error('Failed to initialize YouTube player:', error) console.error('Failed to initialize YouTube player:', error)
setError(true)
return return
} }
} }
@@ -101,18 +102,8 @@ export default function YoutubeEmbeddedPlayer({
} }
if (!videoId && !initSuccess) { if (!videoId && !initSuccess) {
return ( return <ExternalLink url={url} />
<a
href={url}
className="text-primary hover:underline"
target="_blank"
rel="noopener noreferrer"
>
{url}
</a>
)
} }
return ( return (
<div <div
className={cn( className={cn(

View File

@@ -94,7 +94,7 @@ export const EmbeddedUrlParser: TContentParser = (content: string) => {
type = 'image' type = 'image'
} else if (isMedia(url)) { } else if (isMedia(url)) {
type = 'media' type = 'media'
} else if (YOUTUBE_URL_REGEX.test(url)) { } else if (url.match(YOUTUBE_URL_REGEX)) {
type = 'youtube' type = 'youtube'
} }