diff --git a/src/components/Content/index.tsx b/src/components/Content/index.tsx index 262ac3f..7e252f8 100644 --- a/src/components/Content/index.tsx +++ b/src/components/Content/index.tsx @@ -27,128 +27,99 @@ 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 Content = memo(({ event, className }: { event: Event; className?: string }) => { + 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 allImages = nodes - .map((node) => { - if (node.type === 'image') { - const imageInfo = imageInfos.find((image) => image.url === node.data) - return imageInfo ?? { url: node.data } - } - 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 } - }) - } - return null - }) - .filter(Boolean) - .flat() as TImageInfo[] - let imageIndex = 0 + const imageInfos = event.tags + .map((tag) => extractImageInfoFromTag(tag)) + .filter(Boolean) as TImageInfo[] + const allImages = nodes + .map((node) => { + if (node.type === 'image') { + const imageInfo = imageInfos.find((image) => image.url === node.data) + return imageInfo ?? { url: node.data } + } + 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 } + }) + } + return null + }) + .filter(Boolean) + .flat() as TImageInfo[] + let imageIndex = 0 - const emojiInfos = extractEmojiInfosFromTags(event.tags) + const emojiInfos = extractEmojiInfosFromTags(event.tags) - const lastNormalUrlNode = nodes.findLast((node) => node.type === 'url') - const lastNormalUrl = - typeof lastNormalUrlNode?.data === 'string' ? lastNormalUrlNode.data : undefined + 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 start = imageIndex - const end = imageIndex + (Array.isArray(node.data) ? node.data.length : 1) - imageIndex = end - 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 && ( - - )} -
- ) - } -) + return ( +
+ {nodes.map((node, index) => { + if (node.type === 'text') { + return node.data + } + if (node.type === 'image' || node.type === 'images') { + const start = imageIndex + const end = imageIndex + (Array.isArray(node.data) ? node.data.length : 1) + imageIndex = end + 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 diff --git a/src/components/ImageGallery/index.tsx b/src/components/ImageGallery/index.tsx index c90e4f4..f2afb33 100644 --- a/src/components/ImageGallery/index.tsx +++ b/src/components/ImageGallery/index.tsx @@ -1,6 +1,5 @@ import { randomString } from '@/lib/random' import { cn } from '@/lib/utils' -import { useScreenSize } from '@/providers/ScreenSizeProvider' import modalManager from '@/services/modal-manager.service' import { TImageInfo } from '@/types' import { ReactNode, useEffect, useMemo, useState } from 'react' @@ -14,19 +13,16 @@ export default function ImageGallery({ className, images, isNsfw = false, - size = 'normal', start = 0, end = images.length }: { className?: string images: TImageInfo[] isNsfw?: boolean - size?: 'normal' | 'small' start?: number end?: number }) { const id = useMemo(() => `image-gallery-${randomString()}`, []) - const { isSmallScreen } = useScreenSize() const [index, setIndex] = useState(-1) useEffect(() => { if (index >= 0) { @@ -50,34 +46,21 @@ export default function ImageGallery({ imageContent = ( handlePhotoClick(e, 0)} /> ) - } else if (size === 'small') { + } else if (displayImages.length === 2 || displayImages.length === 4) { imageContent = ( -
+
{displayImages.map((image, i) => ( handlePhotoClick(e, i)} - /> - ))} -
- ) - } else if (isSmallScreen && (displayImages.length === 2 || displayImages.length === 4)) { - imageContent = ( -
- {displayImages.map((image, i) => ( - handlePhotoClick(e, i)} /> @@ -90,7 +73,7 @@ export default function ImageGallery({ {displayImages.map((image, i) => ( handlePhotoClick(e, i)} /> diff --git a/src/components/NoteCard/MainNoteCard.tsx b/src/components/NoteCard/MainNoteCard.tsx index 309c727..bad1463 100644 --- a/src/components/NoteCard/MainNoteCard.tsx +++ b/src/components/NoteCard/MainNoteCard.tsx @@ -1,7 +1,6 @@ import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' import { toNote } from '@/lib/link' -import { cn } from '@/lib/utils' import { useSecondaryPage } from '@/PageManager' import { Event } from 'nostr-tools' import { useEffect, useRef, useState } from 'react' @@ -35,7 +34,7 @@ export default function MainNoteCard({ const checkHeight = () => { const fullHeight = contentEl.scrollHeight - if (fullHeight > 900) { + if (fullHeight > 1000) { setShouldCollapse(true) } } @@ -91,7 +90,7 @@ export default function MainNoteCard({
)}
- {!embedded && } + {!embedded && } {!embedded && } diff --git a/src/components/ReplyNote/index.tsx b/src/components/ReplyNote/index.tsx index 6265fa7..601d770 100644 --- a/src/components/ReplyNote/index.tsx +++ b/src/components/ReplyNote/index.tsx @@ -55,7 +55,7 @@ export default function ReplyNote({ {parentEvent && ( { e.stopPropagation() @@ -65,7 +65,7 @@ export default function ReplyNote({ )} {show ? ( <> - + ) : ( diff --git a/src/components/VideoPlayer/index.tsx b/src/components/VideoPlayer/index.tsx index 3b67933..ae54943 100644 --- a/src/components/VideoPlayer/index.tsx +++ b/src/components/VideoPlayer/index.tsx @@ -6,13 +6,11 @@ import NsfwOverlay from '../NsfwOverlay' export default function VideoPlayer({ src, className, - isNsfw = false, - size = 'normal' + isNsfw = false }: { src: string className?: string isNsfw?: boolean - size?: 'normal' | 'small' }) { const videoRef = useRef(null) const containerRef = useRef(null) @@ -51,7 +49,7 @@ export default function VideoPlayer({ ref={videoRef} controls playsInline - className={cn('rounded-lg', size === 'small' ? 'max-h-[30vh]' : 'max-h-[50vh]', className)} + className={cn('rounded-lg max-h-[80vh] sm:max-h-[50vh] border', className)} src={src} onClick={(e) => e.stopPropagation()} onPlay={(event) => { diff --git a/src/components/WebPreview/index.tsx b/src/components/WebPreview/index.tsx index e96aaf9..94d0710 100644 --- a/src/components/WebPreview/index.tsx +++ b/src/components/WebPreview/index.tsx @@ -4,15 +4,7 @@ import { useScreenSize } from '@/providers/ScreenSizeProvider' import { useMemo } from 'react' import Image from '../Image' -export default function WebPreview({ - url, - className, - size = 'normal' -}: { - url: string - className?: string - size?: 'normal' | 'small' -}) { +export default function WebPreview({ url, className }: { url: string; className?: string }) { const { isSmallScreen } = useScreenSize() const { title, description, image } = useFetchWebMetadata(url) const hostname = useMemo(() => { @@ -56,20 +48,14 @@ export default function WebPreview({ {image && ( )}
{hostname}
-
- {title} -
-
- {description} -
+
{title}
+
{description}
)