From 2c751a813ebbfab1332218e2bcdfa083ef5b2056 Mon Sep 17 00:00:00 2001 From: florian <> Date: Tue, 19 Dec 2023 15:03:56 +0100 Subject: [PATCH] fix: Used Text component and snort transform instead of custom code --- src/element/rich-text-content.tsx | 73 ------------------------------- src/element/text.tsx | 14 +++--- src/element/torrent-list.tsx | 2 +- src/page/torrent.tsx | 28 +++++++----- 4 files changed, 25 insertions(+), 92 deletions(-) delete mode 100644 src/element/rich-text-content.tsx diff --git a/src/element/rich-text-content.tsx b/src/element/rich-text-content.tsx deleted file mode 100644 index db77a99..0000000 --- a/src/element/rich-text-content.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react'; - -interface RichTextContentProps { - text: string; -} - -// Helper function to check if a string is an image URL -const isImageUrl = (string: string): boolean => /\.(jpeg|jpg|gif|png)$/.test(string); - -// Helper function to check if a string is a web URL -const isWebUrl = (string: string): boolean => { - const urlPattern = new RegExp('^(https?:\\/\\/)' + // protocol - '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name - '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR IP (v4) address - '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path - '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string - '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator - return !!urlPattern.test(string); -}; - -// Function to split the text into segments -const getSegments = (text: string): { type: 'text' | 'image' | 'link', content: string }[] => { - const words = text.match(/(\S+|\s+)/g) || []; - const segments: { type: 'text' | 'image' | 'link', content: string }[] = []; - let currentTextSegment = ''; - - words.forEach(word => { - const trimmedWord = word.trim(); - if (isImageUrl(trimmedWord)) { - if (currentTextSegment) { - segments.push({ type: 'text', content: currentTextSegment }); - currentTextSegment = ''; - } - segments.push({ type: 'image', content: trimmedWord }); - } else if (isWebUrl(trimmedWord)) { - if (currentTextSegment) { - segments.push({ type: 'text', content: currentTextSegment }); - currentTextSegment = ''; - } - segments.push({ type: 'link', content: trimmedWord }); - } else { - currentTextSegment += word; - } - }); - - if (currentTextSegment) { - segments.push({ type: 'text', content: currentTextSegment }); - } - - return segments; -}; - -const RichTextContent: React.FC = ({ text }) => { - const segments = getSegments(text); - - return ( -
- {segments.map((segment, index) => { - switch(segment.type) { - case 'image': - return ; - case 'link': - return {segment.content}; - default: - return {segment.content}; - } - })} -
- ); -}; - -export default RichTextContent; - diff --git a/src/element/text.tsx b/src/element/text.tsx index 5590979..0566b49 100644 --- a/src/element/text.tsx +++ b/src/element/text.tsx @@ -6,23 +6,25 @@ import { Link } from "react-router-dom"; export function Text({ content, tags }: { content: string; tags: Array> }) { const frags = useMemo(() => transformText(content, tags), [content, tags]); - function renderFrag(f: ParsedFragment) { + function renderFrag(f: ParsedFragment, index: number) { switch (f.type) { + case "media": + return ; case "mention": case "link": { - const link = tryParseNostrLink(f.content); - if (link) { - return ; + const nostrLink = tryParseNostrLink(f.content); + if (nostrLink) { + return ; } else { return ( - + {f.content} ); } } default: { - return {f.content}; + return {f.content}; } } } diff --git a/src/element/torrent-list.tsx b/src/element/torrent-list.tsx index 21e9959..2a78252 100644 --- a/src/element/torrent-list.tsx +++ b/src/element/torrent-list.tsx @@ -10,7 +10,7 @@ export function TorrentList({ items }: { items: Array }) { return ( - + diff --git a/src/page/torrent.tsx b/src/page/torrent.tsx index b18e2ad..06cbb29 100644 --- a/src/page/torrent.tsx +++ b/src/page/torrent.tsx @@ -9,7 +9,7 @@ import { useLogin } from "../login"; import { Button } from "../element/button"; import { Comments } from "../element/comments"; import { useMemo } from "react"; -import RichTextContent from "../element/rich-text-content"; +import { Text } from "../element/text"; export function TorrentPage() { const location = useLocation(); @@ -62,8 +62,8 @@ export function TorrentDetail({ item }: { item: TaggedNostrEvent }) {
Tags:{" "}
- {tags.map((a) => ( -
+ {tags.map((a, i) => ( +
#{a}
))} @@ -89,7 +89,7 @@ export function TorrentDetail({ item }: { item: TaggedNostrEvent }) { <>

Description

-            
+            
           
)} @@ -97,19 +97,23 @@ export function TorrentDetail({ item }: { item: TaggedNostrEvent }) {
Category Name Uploaded
- - - - {sortedFiles.map((a) => ( + + + + + + {sortedFiles.map((a, i) => ( + ))} +
- Filename - - Size -
+ Filename + + Size +
{a[1]} {FormatBytes(Number(a[2]))}

Comments