diff --git a/src/components/note/preview/messageImage.tsx b/src/components/note/preview/messageImage.tsx new file mode 100644 index 00000000..1ed79684 --- /dev/null +++ b/src/components/note/preview/messageImage.tsx @@ -0,0 +1,18 @@ +import Image from 'next/image'; +import { memo } from 'react'; + +export const MessageImagePreview = memo(function MesssageImagePreview({ url }: { url: string }) { + return ( +
+ {url} +
+ ); +}); diff --git a/src/utils/hooks/useDecryptMessage.tsx b/src/utils/hooks/useDecryptMessage.tsx index e6fa43d2..2a3a4a55 100644 --- a/src/utils/hooks/useDecryptMessage.tsx +++ b/src/utils/hooks/useDecryptMessage.tsx @@ -1,3 +1,5 @@ +import { messageParser } from '@utils/parser'; + import { nip04 } from 'nostr-tools'; import { useCallback, useEffect, useState } from 'react'; @@ -30,5 +32,5 @@ export const useDecryptMessage = ( decrypt().catch(console.error); }, [decrypt]); - return content; + return content.length > 0 ? messageParser(content) : ''; }; diff --git a/src/utils/parser.tsx b/src/utils/parser.tsx index 3c9944a9..3cf80a9a 100644 --- a/src/utils/parser.tsx +++ b/src/utils/parser.tsx @@ -1,4 +1,5 @@ import { ImagePreview } from '@components/note/preview/image'; +import { MessageImagePreview } from '@components/note/preview/messageImage'; import { VideoPreview } from '@components/note/preview/video'; import { NoteQuote } from '@components/note/quote'; import { UserMention } from '@components/user/mention'; @@ -53,3 +54,35 @@ export const contentParser = (noteContent, noteTags) => { return parsedContent; }; + +export const messageParser = (noteContent) => { + let parsedContent = noteContent; + + // handle urls + parsedContent = reactStringReplace(parsedContent, /(https?:\/\/\S+)/g, (match, i) => { + if (match.match(/\.(jpg|jpeg|gif|png|webp)$/i)) { + // image url + return ; + } else if (match.match(/(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/i)) { + // youtube + return ; + } else if (match.match(/\.(mp4|webm)$/i)) { + // video + return ; + } else { + return ( + + {match} + + ); + } + }); + // handle #-hashtags + parsedContent = reactStringReplace(parsedContent, /#(\w+)/g, (match, i) => ( + + #{match} + + )); + + return parsedContent; +};