// ConversationActions.tsx import type React from 'react'; import { Fragment, useCallback, useLayoutEffect, useMemo, useState } from 'react'; import { ConversationMarkType, ReceiveMessageOption } from 'tuikit-atomicx-react/chat'; import { useUIKit } from '@tencentcloud/uikit-base-component-react'; import cs from 'classnames'; import { useChatContext } from 'tuikit-atomicx-react/chat'; import { ContextMenu, Dialog } from '../../../baseComp'; import styles from './ConversationActions.module.scss'; import type { ConversationActionItem, ConversationActionsProps, } from '../../../types/conversation'; import type { ConversationInfo } from 'tuikit-atomicx-react/chat'; export const ConversationActions = (props: ConversationActionsProps) => { const { conversation, enablePin, enableMute, enableDelete, enableMarkUnread, onMarkConversationUnread, onConversationPin, onConversationMute, onConversationDelete, customConversationActions, PopupElements, onClick, className, style, onClose, children, } = props; const { t, direction } = useUIKit(); const [markUnreadStatus, setMarkUnreadStatus] = useState(true); const { pinConversation, setReceiveMessageOpt, deleteConversation, markConversation, clearConversationUnreadCount, setActiveConversation, } = useChatContext(); const isMuted = conversation.receiveOption !== ReceiveMessageOption.Receive; const openMarkConversationErrorDialog = useCallback(() => { Dialog.open({ title: t('ConversationList.tip'), content: (
{t('ConversationList.mark_conversation_error_3122_content')}
{t('ConversationList.view_details')} {t('ConversationList.how_to_remove_conversation_mark_feature')}
), }); }, [t]); useLayoutEffect(() => { if (conversation.unreadCount > 0) { setMarkUnreadStatus(true); } else { const unreadStatus = conversation.conversationMarkList?.includes(ConversationMarkType.Unread); setMarkUnreadStatus(unreadStatus); } }, [conversation]); const markConversationUnread = useCallback(async (targetConversation: ConversationInfo, isUnread: boolean) => { const hasUnreadCount = targetConversation.unreadCount > 0; if (hasUnreadCount && !isUnread) { clearConversationUnreadCount(targetConversation.conversationID); markConversation([targetConversation.conversationID], ConversationMarkType.Unread, false).catch((err) => { if (err.code === 3122) { openMarkConversationErrorDialog(); } }); } else { await markConversation([targetConversation.conversationID], ConversationMarkType.Unread, isUnread).catch((err) => { if (err.code === 3122) { openMarkConversationErrorDialog(); } }); } }, [clearConversationUnreadCount, markConversation, openMarkConversationErrorDialog]); const conversationActions = useMemo>(() => ({ pin: { enable: !!enablePin, label: t(conversation.isPinned ? 'TUIConversation.Unpin' : 'TUIConversation.Pin'), onClick: (_conversation: ConversationInfo) => { pinConversation(_conversation.conversationID, !_conversation.isPinned); onConversationPin?.(_conversation); }, }, mute: { enable: !!enableMute, label: t(isMuted ? 'TUIConversation.Unmute' : 'TUIConversation.Mute'), onClick: (_conversation: ConversationInfo) => { setReceiveMessageOpt( _conversation.conversationID, isMuted ? ReceiveMessageOption.Receive : ReceiveMessageOption.NotNotify, ); onConversationMute?.(_conversation); }, }, markUnread: { enable: !!enableMarkUnread, label: markUnreadStatus ? t('TUIConversation.MarkRead') : t('TUIConversation.MarkUnRead'), onClick: (_conversation: ConversationInfo) => { markConversationUnread(_conversation, !markUnreadStatus); onMarkConversationUnread?.(_conversation); }, }, delete: { enable: !!enableDelete, label: t('TUIConversation.Delete'), onClick: (_conversation: ConversationInfo) => { deleteConversation(_conversation.conversationID).then(() => { setActiveConversation(undefined); }); onConversationDelete?.(_conversation); }, }, ...customConversationActions, }), [ enablePin, enableMute, enableDelete, enableMarkUnread, t, conversation.isPinned, isMuted, markUnreadStatus, onConversationPin, onConversationMute, onMarkConversationUnread, onConversationDelete, pinConversation, setReceiveMessageOpt, deleteConversation, markConversationUnread, customConversationActions, setActiveConversation, ]); const onClickMenuItem = (e: React.MouseEvent, key: string) => { onClick?.(e, key, conversation); conversationActions[key]?.onClick(conversation, e); onClose?.(); }; const enabledActionKeys = Object.keys(conversationActions).filter( key => conversationActions[key].enable !== false, ); return ( {children || (
)} {PopupElements} {enabledActionKeys.map((key: string) => { const shouldSeparateDangerAction = false; return ( {shouldSeparateDangerAction && ( )} onClickMenuItem(e, key)} > {conversationActions[key].label} ); })} ); }; export default ConversationActions;