import './Text.css' import { useMemo, useCallback } from "react"; import { Link } from "react-router-dom"; import ReactMarkdown from "react-markdown"; import { visit, SKIP } from "unist-util-visit"; import { UrlRegex, MentionRegex, InvoiceRegex, HashtagRegex } from "Const"; import { eventLink, hexToBech32 } from "Util"; import Invoice from "Element/Invoice"; import Hashtag from "Element/Hashtag"; import Tag from "Nostr/Tag"; import { MetadataCache } from "State/Users"; import Mention from "Element/Mention"; import HyperText from 'Element/HyperText'; import { HexKey } from 'Nostr'; export type Fragment = string | JSX.Element; export interface TextFragment { body: Fragment[], tags: Tag[], users: Map } export interface TextProps { content: string, creator: HexKey, tags: Tag[], users: Map } export default function Text({ content, tags, creator, users }: TextProps) { function extractLinks(fragments: Fragment[]) { return fragments.map(f => { if (typeof f === "string") { return f.split(UrlRegex).map(a => { if (a.startsWith("http")) { return } return a; }); } return f; }).flat(); } function extractMentions(frag: TextFragment) { return frag.body.map(f => { if (typeof f === "string") { return f.split(MentionRegex).map((match) => { let matchTag = match.match(/#\[(\d+)\]/); if (matchTag && matchTag.length === 2) { let idx = parseInt(matchTag[1]); let ref = frag.tags?.find(a => a.Index === idx); if (ref) { switch (ref.Key) { case "p": { return } case "e": { let eText = hexToBech32("note", ref.Event!).substring(0, 12); return e.stopPropagation()}>#{eText}; } case "t": { return } } } return {matchTag[0]}?; } else { return match; } }); } return f; }).flat(); } function extractInvoices(fragments: Fragment[]) { return fragments.map(f => { if (typeof f === "string") { return f.split(InvoiceRegex).map(i => { if (i.toLowerCase().startsWith("lnbc")) { return } else { return i; } }); } return f; }).flat(); } function extractHashtags(fragments: Fragment[]) { return fragments.map(f => { if (typeof f === "string") { return f.split(HashtagRegex).map(i => { if (i.toLowerCase().startsWith("#")) { return } else { return i; } }); } return f; }).flat(); } function transformLi(frag: TextFragment) { let fragments = transformText(frag) return
  • {fragments}
  • } function transformParagraph(frag: TextFragment) { const fragments = transformText(frag) if (fragments.every(f => typeof f === 'string')) { return

    {fragments}

    } return <>{fragments} } function transformText(frag: TextFragment) { if (frag.body === undefined) { debugger; } let fragments = extractMentions(frag); fragments = extractLinks(fragments); fragments = extractInvoices(fragments); fragments = extractHashtags(fragments); return fragments; } const components = useMemo(() => { return { p: (x: any) => transformParagraph({ body: x.children ?? [], tags, users }), a: (x: any) => , li: (x: any) => transformLi({ body: x.children ?? [], tags, users }), }; }, [content]); const disableMarkdownLinks = useCallback(() => (tree: any) => { visit(tree, (node, index, parent) => { if ( parent && typeof index === 'number' && (node.type === 'link' || node.type === 'linkReference' || node.type === 'image' || node.type === 'imageReference' || node.type === 'definition') ) { node.type = 'text'; node.value = content.slice(node.position.start.offset, node.position.end.offset).replace(/\)$/, ' )'); return SKIP; } }) }, [content]); return {content} }