import React, { MouseEvent, FC } from "react"; import clsx from "clsx"; 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"; import { useTranslation } from "react-i18next"; 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 { t } = useTranslation("chat"); 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) { const _class1 = `md:dark:bg-gray-800`; const _class2 = `md:bg-gray-100`; msgEle.classList.add(_class1); msgEle.classList.add(_class2); msgEle.scrollIntoView({ behavior: "smooth", block: "center" }); setTimeout(() => { msgEle.classList.remove(_class1); msgEle.classList.remove(_class2); }, 3000); } }; const defaultClass = `w-fit flex items-start flex-col md:flex-row p-2 bg-gray-100 dark:bg-gray-900 rounded-lg gap-2 mb-1`; if (!data) return
{t("reply_msg_del")}
; const currUser = users[data.from_uid || 0]; if (!currUser) return null; return (
{currUser.name} {renderContent(data)} {interactive &&
}
); }; export default React.memo(Reply, (prevs, nexts) => { return prevs.mid == nexts.mid; });