import { NOSTR_MENTIONS } from "@lume/utils"; import { ReactNode, useMemo } from "react"; import { useTranslation } from "react-i18next"; import reactStringReplace from "react-string-replace"; import { User } from "../../user"; import { Hashtag } from "./hashtag"; import { MentionUser } from "./user"; import { useArk, useEvent } from "@lume/ark"; import { LinkIcon } from "@lume/icons"; import { stripHtml } from "string-strip-html"; export function MentionNote({ eventId, openable = true, }: { eventId: string; openable?: boolean; }) { const { t } = useTranslation(); const { isLoading, isError, data } = useEvent(eventId); const ark = useArk(); const content = useMemo(() => { if (!data) return ""; const text = stripHtml(data.content.trim()).result; const words = text.split(/( |\n)/); // @ts-ignore, kaboom !!! let parsedContent: ReactNode[] = text; const hashtags = words.filter((word) => word.startsWith("#")); const mentions = words.filter((word) => NOSTR_MENTIONS.some((el) => word.startsWith(el)), ); try { if (hashtags.length) { for (const hashtag of hashtags) { parsedContent = reactStringReplace( parsedContent, hashtag, (match, i) => { return ; }, ); } } if (mentions.length) { for (const mention of mentions) { parsedContent = reactStringReplace( parsedContent, mention, (match, i) => , ); } } parsedContent = reactStringReplace( parsedContent, /(https?:\/\/\S+)/g, (match, i) => { const url = new URL(match); return ( {url.toString()} ); }, ); return parsedContent; } catch (e) { return text; } }, [data]); if (isLoading) { return (

Loading...

); } if (isError || !data) { return (
{t("note.error")}
); } return (
ยท
{content}
{openable ? (
) : (
)}
); }