diff --git a/src/components/imageWithFallback.tsx b/src/components/imageWithFallback.tsx
index 268b908f..97831cc3 100644
--- a/src/components/imageWithFallback.tsx
+++ b/src/components/imageWithFallback.tsx
@@ -30,7 +30,14 @@ export const ImageWithFallback = memo(function ImageWithFallback({
colors={['#FEE2E2', '#FEF3C7', '#F59E0B', '#EC4899', '#D946EF', '#8B5CF6']}
/>
) : (
-
+
)}
>
);
diff --git a/src/components/note/content/index.tsx b/src/components/note/content/index.tsx
index 55df8dad..d3099a66 100644
--- a/src/components/note/content/index.tsx
+++ b/src/components/note/content/index.tsx
@@ -1,11 +1,9 @@
import NoteMetadata from '@components/note/content/metadata';
-import { ImageCard } from '@components/note/content/preview/imageCard';
-import { Video } from '@components/note/content/preview/video';
+import NotePreview from '@components/note/content/preview';
import { UserExtend } from '@components/user/extend';
import dynamic from 'next/dynamic';
-import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
-import ReactPlayer from 'react-player';
+import { memo } from 'react';
const MarkdownPreview = dynamic(() => import('@uiw/react-markdown-preview'), {
ssr: false,
@@ -13,53 +11,6 @@ const MarkdownPreview = dynamic(() => import('@uiw/react-markdown-preview'), {
});
export const Content = memo(function Content({ data }: { data: any }) {
- const [preview, setPreview] = useState({});
-
- const content = useRef(data.content);
- const urls = useMemo(
- () =>
- content.current.match(
- /((http|ftp|https):\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi
- ),
- []
- );
-
- useEffect(() => {
- if (urls !== null && urls.length > 0) {
- // #TODO: support multiple url
- let url = urls[0];
- // make sure url alway have http://
- if (!/^https?:\/\//i.test(url)) {
- url = 'http://' + url;
- }
- // parse url with new URL();
- const parseURL = new URL(url, 'https://uselume.xyz');
- // #TODO performance test
- if (parseURL.pathname.toLowerCase().match(/\.(jpg|jpeg|gif|png|webp)$/)) {
- // add image to preview
- setPreview({ image: parseURL.href, type: 'image' });
- content.current = content.current.replace(parseURL.href, '');
- } else if (ReactPlayer.canPlay(parseURL.href)) {
- // add video to preview
- setPreview({ url: parseURL.href, type: 'video' });
- content.current = content.current.replace(parseURL.href, '');
- } // #TODO: support multiple preview
- }
- }, [urls]);
-
- const previewAttachment = useCallback(() => {
- if (Object.keys(preview).length > 0) {
- switch (preview['type']) {
- case 'image':
- return ;
- case 'video':
- return ;
- default:
- return null;
- }
- }
- }, [preview]);
-
return (
@@ -68,7 +19,7 @@ export const Content = memo(function Content({ data }: { data: any }) {
- <>{previewAttachment()}>
+
{
+ const urls = content.match(
+ /((http|ftp|https):\/\/)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi
+ );
+
+ if (urls !== null && urls.length > 0) {
+ urls.forEach((url) => {
+ // make sure url alway have http://
+ if (!/^https?:\/\//i.test(url)) {
+ url = 'http://' + url;
+ }
+ // parse url with new URL();
+ const parseURL = new URL(url, 'https://uselume.xyz');
+ // parse image url
+ if (parseURL.pathname.toLowerCase().match(/\.(jpg|jpeg|gif|png|webp)$/)) {
+ // add image to preview
+ setImages((images) => [...images, parseURL.href]);
+ } else if (ReactPlayer.canPlay(parseURL.href)) {
+ // add video to preview
+ setVideo(parseURL.href);
+ }
+ });
+ }
+ }, [content]);
+
+ if (video) {
+ return ;
+ } else if (images.length > 0) {
+ return ;
+ } else {
+ return <>>;
+ }
+}
diff --git a/src/components/note/content/preview/imageCard.tsx b/src/components/note/content/preview/imageCard.tsx
deleted file mode 100644
index 10f76931..00000000
--- a/src/components/note/content/preview/imageCard.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import Image from 'next/image';
-import { memo } from 'react';
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export const ImageCard = memo(function ImageCard({ data }: { data: object }) {
- return (
-
- );
-});
diff --git a/src/components/note/content/preview/video.tsx b/src/components/note/content/preview/video.tsx
deleted file mode 100644
index edab45d7..00000000
--- a/src/components/note/content/preview/video.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { memo } from 'react';
-import ReactPlayer from 'react-player/lazy';
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export const Video = memo(function Video({ data }: { data: object }) {
- return (
-
-
-
- );
-});
diff --git a/src/components/note/preview/image.tsx b/src/components/note/preview/image.tsx
new file mode 100644
index 00000000..59db107d
--- /dev/null
+++ b/src/components/note/preview/image.tsx
@@ -0,0 +1,23 @@
+import Image from 'next/image';
+import { memo } from 'react';
+
+export const ImagePreview = memo(function ImagePreview({ data }: { data: any }) {
+ return (
+
+ {data.map((image: string, index: number) => (
+
+
+
+ ))}
+
+ );
+});
diff --git a/src/components/note/content/preview/linkCard.tsx b/src/components/note/preview/link.tsx
similarity index 81%
rename from src/components/note/content/preview/linkCard.tsx
rename to src/components/note/preview/link.tsx
index 468fc9ce..e2a1c33d 100644
--- a/src/components/note/content/preview/linkCard.tsx
+++ b/src/components/note/preview/link.tsx
@@ -1,13 +1,12 @@
import Image from 'next/image';
import Link from 'next/link';
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export default function LinkCard({ data }: { data: object }) {
+export default function LinkCard({ data }: { data: any }) {
return (
diff --git a/src/components/note/preview/video.tsx b/src/components/note/preview/video.tsx
new file mode 100644
index 00000000..ced7fdfa
--- /dev/null
+++ b/src/components/note/preview/video.tsx
@@ -0,0 +1,10 @@
+import { memo } from 'react';
+import ReactPlayer from 'react-player/lazy';
+
+export const VideoPreview = memo(function VideoPreview({ data }: { data: string }) {
+ return (
+
+
+
+ );
+});