import "./Reactions.css"; import { ParsedZap, socialGraphInstance, TaggedNostrEvent } from "@snort/system"; import { useEffect, useMemo, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import CloseButton from "@/Components/Button/CloseButton"; import Icon from "@/Components/Icons/Icon"; import Modal from "@/Components/Modal/Modal"; import { Tab } from "@/Components/Tabs/Tabs"; import Tabs from "@/Components/Tabs/Tabs"; import ProfileImage from "@/Components/User/ProfileImage"; import { formatShort } from "@/Utils/Number"; import messages from "../messages"; interface ReactionsProps { show: boolean; setShow(b: boolean): void; positive: TaggedNostrEvent[]; negative: TaggedNostrEvent[]; reposts: TaggedNostrEvent[]; zaps: ParsedZap[]; } const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: ReactionsProps) => { const { formatMessage } = useIntl(); const onClose = () => setShow(false); const sortEvents = events => events.sort( (a, b) => socialGraphInstance.getFollowDistance(a.pubkey) - socialGraphInstance.getFollowDistance(b.pubkey), ); const likes = useMemo(() => sortEvents([...positive]), [positive]); const dislikes = useMemo(() => sortEvents([...negative]), [negative]); const sortedReposts = useMemo(() => sortEvents([...reposts]), [reposts]); const total = positive.length + negative.length + zaps.length + reposts.length; const createTab = (message, count, value, disabled = false) => ({ text: formatMessage(message, { n: count }), value, disabled, }); const tabs = useMemo(() => { const baseTabs = [ createTab(messages.Likes, likes.length, 0), createTab(messages.Zaps, zaps.length, 1, zaps.length === 0), createTab(messages.Reposts, reposts.length, 2, reposts.length === 0), ]; return dislikes.length !== 0 ? baseTabs.concat(createTab(messages.Dislikes, dislikes.length, 3)) : baseTabs; }, [likes.length, zaps.length, reposts.length, dislikes.length, formatMessage]); const [tab, setTab] = useState(tabs[0]); useEffect(() => { if (!show) { setTab(tabs[0]); } }, [show, tabs]); const renderReactionItem = (ev, icon, size) => (