import React, { useCallback, useContext, useEffect, useMemo, useState, } from 'react'; import { useInView } from 'react-intersection-observer'; import { MessageDisplay } from './MessageDisplay'; import { Avatar, Box, Button, ButtonBase, List, ListItem, ListItemText, Popover, Tooltip, Typography, useTheme, } from '@mui/material'; import { formatTimestamp } from '../../utils/time'; import { MyContext, getBaseApiReact } from '../../App'; import { generateHTML } from '@tiptap/react'; import Highlight from '@tiptap/extension-highlight'; import Mention from '@tiptap/extension-mention'; import StarterKit from '@tiptap/starter-kit'; import Underline from '@tiptap/extension-underline'; import { WrapperUserAction } from '../WrapperUserAction'; import ReplyIcon from '@mui/icons-material/Reply'; import { Spacer } from '../../common/Spacer'; import { ReactionPicker } from '../ReactionPicker'; import KeyOffIcon from '@mui/icons-material/KeyOff'; import EditIcon from '@mui/icons-material/Edit'; import TextStyle from '@tiptap/extension-text-style'; import level0Img from '../../assets/badges/level-0.png'; import level1Img from '../../assets/badges/level-1.png'; import level2Img from '../../assets/badges/level-2.png'; import level3Img from '../../assets/badges/level-3.png'; import level4Img from '../../assets/badges/level-4.png'; import level5Img from '../../assets/badges/level-5.png'; import level6Img from '../../assets/badges/level-6.png'; import level7Img from '../../assets/badges/level-7.png'; import level8Img from '../../assets/badges/level-8.png'; import level9Img from '../../assets/badges/level-9.png'; import level10Img from '../../assets/badges/level-10.png'; const getBadgeImg = (level) => { switch (level?.toString()) { case '0': return level0Img; case '1': return level1Img; case '2': return level2Img; case '3': return level3Img; case '4': return level4Img; case '5': return level5Img; case '6': return level6Img; case '7': return level7Img; case '8': return level8Img; case '9': return level9Img; case '10': return level10Img; default: return level0Img; } }; export const MessageItem = React.memo( ({ message, onSeen, isLast, isTemp, myAddress, onReply, isShowingAsReply, reply, replyIndex, scrollToItem, handleReaction, reactions, isUpdating, lastSignature, onEdit, isPrivate, }) => { const { getIndividualUserInfo } = useContext(MyContext); const [anchorEl, setAnchorEl] = useState(null); const [selectedReaction, setSelectedReaction] = useState(null); const [userInfo, setUserInfo] = useState(null); useEffect(() => { const getInfo = async () => { if (!message?.sender) return; try { const res = await getIndividualUserInfo(message?.sender); if (!res) return null; setUserInfo(res); } catch (error) { // } }; getInfo(); }, [message?.sender, getIndividualUserInfo]); const htmlText = useMemo(() => { if (message?.messageText) { return generateHTML(message?.messageText, [ StarterKit, Underline, Highlight, Mention, TextStyle, ]); } }, [message?.editTimestamp]); const htmlReply = useMemo(() => { if (reply?.messageText) { return generateHTML(reply?.messageText, [ StarterKit, Underline, Highlight, Mention, TextStyle, ]); } }, [reply?.editTimestamp]); const userAvatarUrl = useMemo(() => { return message?.senderName ? `${getBaseApiReact()}/arbitrary/THUMBNAIL/${ message?.senderName }/qortal_avatar?async=true` : ''; }, []); const onSeenFunc = useCallback(() => { onSeen(message.id); }, [message?.id]); const theme = useTheme(); return ( <> {message?.divide && (