import React, { MouseEvent, FC } from "react"; import MarkdownRender from "../MarkdownRender"; import { ContentTypes } from "../../../app/config"; import { getFileIcon, isImage } from "../../utils"; import LinkifyText from '../LinkifyText'; import Avatar from "../Avatar"; import { useAppSelector } from "../../../app/store"; import { MessagePayload } from "../../../app/slices/message"; const renderContent = (data: MessagePayload) => { const { content_type, content, thumbnail, properties } = data; let res = null; switch (content_type) { case ContentTypes.text: res = ( ); break; case ContentTypes.markdown: res = (
); break; case ContentTypes.file: { const { content_type = "", name, size } = properties || {}; const icon = getFileIcon(content_type, name, "w-4 h-5"); if (isImage(content_type, size)) { res = ; } else { res = ( <> {icon} {name} ); } } break; default: break; } return res; }; interface ReplyProps { mid: number; interactive?: boolean; } const Reply: FC = ({ mid, interactive = true }) => { const { data, users } = useAppSelector((store) => { return { data: store.message[mid], users: store.users.byId }; }); const handleClick = (evt: MouseEvent) => { const { mid } = evt.currentTarget.dataset; const msgEle = document.querySelector(`[data-msg-mid='${mid}']`); if (msgEle) { msgEle.dataset.highlight = "true"; msgEle.scrollIntoView({ behavior: "smooth", block: "center" }); setTimeout(() => { msgEle.dataset.highlight = "false"; }, 3000); } }; if (!data) return null; const currUser = users[data.from_uid || 0]; if (!currUser) return null; return (
{currUser.name}
{renderContent(data)}
); }; export default React.memo(Reply, (prevs, nexts) => { return prevs.mid == nexts.mid; });