import type { ConversationItem as ConversationItemType, MessageItem, } from "@openim/wasm-client-sdk/lib/types/entity"; import { Badge, Dropdown } from "antd"; import clsx from "clsx"; import { t } from "i18next"; import { memo, useMemo } from "react"; import { useNavigate } from "react-router-dom"; import OIMAvatar from "@/components/OIMAvatar"; import { IMSDK } from "@/layout/MainContentWrap"; import { useConversationStore, useUserStore } from "@/store"; import { feedbackToast } from "@/utils/common"; import { formatConversionTime, getConversationContent } from "@/utils/imCommon"; import styles from "./conversation-item.module.scss"; interface IConversationProps { isActive: boolean; conversation: ConversationItemType; } const ConversationItem = ({ isActive, conversation }: IConversationProps) => { const navigate = useNavigate(); const updateCurrentConversation = useConversationStore( (state) => state.updateCurrentConversation, ); const currentUser = useUserStore((state) => state.selfInfo.userID); const toSpecifiedConversation = async () => { if (isActive) { return; } await updateCurrentConversation({ ...conversation }); navigate(`/chat/${conversation.conversationID}`); }; const latestMessageContent = useMemo(() => { let content = ""; if (!conversation.latestMsg) { return ""; } try { content = getConversationContent( JSON.parse(conversation.latestMsg) as MessageItem, ); } catch (error) { content = t("messageDescription.catchMessage"); } return content; }, [conversation.draftText, conversation.latestMsg, isActive, currentUser]); const latestMessageTime = formatConversionTime(conversation.latestMsgSendTime); const onMenuClick = async ({ key }: { key: string }) => { try { if (key === "pin") { await IMSDK.pinConversation({ conversationID: conversation.conversationID, isPinned: !conversation.isPinned, }); return; } if (key === "delete") { await IMSDK.deleteConversationAndDeleteAllMsg(conversation.conversationID); if (isActive) { navigate("/chat"); } } } catch (error) { feedbackToast({ error, msg: key === "pin" ? t("toast.pinConversationFailed") : t("toast.deleteConversationFailed"), }); } }; return (
{conversation.showName}
{latestMessageTime}
); }; export default memo(ConversationItem);