import React, { useMemo, useRef, useState, useEffect } from "react"; import MarkdownPreview from "@uiw/react-markdown-preview"; import katex from "katex"; import { checkForLUDS, convertDate, getParsedRepEvent, minimizeKey, detectDirection, } from "@/Helpers/Encryptions"; import { getComponent } from "@/Helpers/ClientHelpers"; import { getContentTranslationConfig, shuffleArray } from "@/Helpers/Helpers"; import UserProfilePic from "@/Components/UserProfilePic"; import Date_ from "@/Components/Date_"; import Follow from "@/Components/Follow"; import ZapTip from "@/Components/ZapTip"; import ShowUsersList from "@/Components/ShowUsersList"; import ArrowUp from "@/Components/ArrowUp"; import CheckNOSTRClient from "@/Components/CheckNOSTRClient"; import { useDispatch, useSelector } from "react-redux"; import TopicsTags from "@/Content/TopicsTags"; import DynamicIndicator from "@/Components/DynamicIndicator"; import useRepEventStats from "@/Hooks/useRepEventStats"; import RepEventCommentsSection from "@/Components/RepEventCommentsSection"; import Backbar from "@/Components/Backbar"; import { useTranslation } from "react-i18next"; import { translate } from "@/Helpers/Controlers"; import LoadingDots from "@/Components/LoadingDots"; import { setToast } from "@/Store/Slides/Publishers"; import PagePlaceholder from "@/Components/PagePlaceholder"; import bannedList from "@/Content/BannedList"; import ZapAd from "@/Components/ZapAd"; import useUserProfile from "@/Hooks/useUsersProfile"; import { saveUsers } from "@/Helpers/DB"; import useIsMute from "@/Hooks/useIsMute"; import EventOptions from "@/Components/ElementOptions/EventOptions"; import { getSubData } from "@/Helpers/Controlers"; import Link from "next/link"; import { customHistory } from "@/Helpers/History"; import PostReaction from "@/Components/PostReaction"; import { useTheme } from "next-themes"; import LoadingLogo from "@/Components/LoadingLogo"; import Icon from "@/Components/Icon"; export default function Article({ event, userProfile, naddrData }) { const { t } = useTranslation(); const dispatch = useDispatch(); const userKeys = useSelector((state) => state.userKeys); const { resolvedTheme } = useTheme(); const isDarkMode = ["dark", "gray", "system"].includes(resolvedTheme); const [isLoading, setIsLoading] = useState(event ? false : true); const [post, setPost] = useState(event); const [usersList, setUsersList] = useState(false); const [showPreview, setShowPreview] = useState(false); const [showCommentsSection, setShowCommentsSections] = useState(false); const [translatedTitle, setTranslatedTitle] = useState(""); const [translatedDescription, setTranslatedDescription] = useState(""); const [translatedDir, setTranslatedDir] = useState(false); const [translatedContent, setTranslatedContent] = useState(""); const [showTranslation, setShowTranslation] = useState(false); const [isContentTranslating, setIsContentTranslating] = useState(false); const containerRef = useRef(null); const { muteUnmute, isMuted } = useIsMute( naddrData ? naddrData.pubkey : null, ); const customService = getContentTranslationConfig(); useEffect(() => { const handleScroll = () => { if (containerRef.current) { setShowPreview(containerRef.current.scrollTop >= 200); } }; const observer = new MutationObserver((mutations) => { for (let mutation of mutations) { if (mutation.type === "childList") { const container = document.querySelector(".page-container"); if (container) { containerRef.current = container; container.addEventListener("scroll", handleScroll); observer.disconnect(); } } } }); observer.observe(document.body, { childList: true, subtree: true }); return () => { if (containerRef.current) { containerRef.current.removeEventListener("scroll", handleScroll); } observer.disconnect(); }; }, []); useEffect(() => { const fetchPost = async () => { setIsLoading(true); const res = await getSubData( [ { authors: naddrData.pubkey ? [naddrData.pubkey] : undefined, kinds: [naddrData.kind], "#d": [naddrData.identifier], }, ], 5000, naddrData.relays || undefined, undefined, 1, ); if (res.data.length === 0) { setIsLoading(false); return; } let post_ = { ...res.data[0], }; let parsedPost = getParsedRepEvent(post_); saveUsers([post_.pubkey]); setPost(parsedPost); setIsLoading(false); }; if (!event && naddrData) fetchPost(); if (!event && !naddrData) setIsLoading(false); }, []); useEffect(() => { if (post && customService?.autoTranslate) translateArticle(); }, [post]); const translateArticle = async () => { setIsContentTranslating(true); if (translatedContent) { setShowTranslation(true); setIsContentTranslating(false); return; } try { let res = await translate( [post.title, post.description || " ", post.content].join(" ABCAF "), ); if (res.status === 500) { dispatch( setToast({ type: 2, desc: t("AZ5VQXL"), }), ); } if (res.status === 400) { dispatch( setToast({ type: 2, desc: t("AJeHuH1"), }), ); } if (res.status === 200) { setTranslatedTitle(res.res.split("ABCAF")[0]); setTranslatedDescription(res.res.split("ABCAF")[1]); setTranslatedContent(res.res.split("ABCAF")[2]); setTranslatedDir(detectDirection(res.res.split("ABCAF")[2])); setShowTranslation(true); } setIsContentTranslating(false); } catch (err) { setShowTranslation(false); setIsContentTranslating(false); dispatch( setToast({ type: 2, desc: t("AZ5VQXL"), }), ); } }; if (bannedList.includes(post?.pubkey)) { customHistory("/"); return; } if (isLoading) return (
{t("Agge1Vg")}
{t("AsXpL4b", { name: userProfile.display_name || userProfile.name || minimizeKey(post.pubkey), })}
•
{t("AHhPGax", { date: "" })}
•
);
}
return (
);
}
if (
typeof txt === "string" &&
typeof className === "string" &&
/^language-katex/.test(
className.toLocaleLowerCase(),
)
) {
const html = katex.renderToString(txt, {
throwOnError: false,
});
return (
);
}
return (
{children}
);
},
}}
/>
{t("AwARx3K")}
{t("AVG3Uga")}
{userProfile.display_name || userProfile.name}
{isNip05Verified &&{t("AArGqN7")}
{readMore.map((post) => { if (post.image) return ({post.title}