diff --git a/client/shared/event/index.ts b/client/shared/event/index.ts index 41181df0..d67b131e 100644 --- a/client/shared/event/index.ts +++ b/client/shared/event/index.ts @@ -43,12 +43,7 @@ export interface SharedEventMap { replyMessage: (payload: ChatMessage | null) => void; /** - * 消息已读(消息出现在界面上) - */ - readMessage: (payload: ChatMessage | null) => void; - - /** - * 接受到消息(所有的) + * 接受到消息(所有的(相对receiveUnmutedMessage来说)) */ receiveMessage: (payload: ChatMessage) => void; diff --git a/client/web/src/components/ChatBox/ChatMessageList/Item.tsx b/client/web/src/components/ChatBox/ChatMessageList/Item.tsx index b8bdb559..5af7d6dd 100644 --- a/client/web/src/components/ChatBox/ChatMessageList/Item.tsx +++ b/client/web/src/components/ChatBox/ChatMessageList/Item.tsx @@ -7,7 +7,6 @@ import { t, useCachedUserInfo, MessageHelper, - sharedEvent, showMessageTime, useUserInfoList, } from 'tailchat-shared'; @@ -22,7 +21,7 @@ import { TcPopover } from '@/components/TcPopover'; import { useMessageReactions } from './useMessageReactions'; import { stopPropagation } from '@/utils/dom-helper'; import { AutoFolder, Avatar, Icon } from 'tailchat-design'; -import { Intersection } from '@/components/Intersection'; +import { MessageAckContainer } from './MessageAckContainer'; import './Item.less'; /** @@ -288,11 +287,12 @@ export function buildMessageItemRow(messages: ChatMessage[], index: number) { )} - sharedEvent.emit('readMessage', message)} + - + ); } diff --git a/client/web/src/components/ChatBox/ChatMessageList/MessageAckContainer.tsx b/client/web/src/components/ChatBox/ChatMessageList/MessageAckContainer.tsx new file mode 100644 index 00000000..68643abf --- /dev/null +++ b/client/web/src/components/ChatBox/ChatMessageList/MessageAckContainer.tsx @@ -0,0 +1,27 @@ +import { Intersection } from '@/components/Intersection'; +import React from 'react'; +import { useConverseAck, useMemoizedFn } from 'tailchat-shared'; + +/** + * 消息已读回调容器 + * 套在消息体外面可以实现消息出现在视野内就发送已读提示 + */ +interface MessageAckContainerProps extends React.PropsWithChildren { + converseId: string; + messageId: string; +} +export const MessageAckContainer: React.FC = + React.memo((props) => { + const { updateConverseAck } = useConverseAck(props.converseId); + + const handleIntersection = useMemoizedFn(() => { + updateConverseAck(props.messageId); + }); + + return ( + + {props.children} + + ); + }); +MessageAckContainer.displayName = 'MessageAckContainer'; diff --git a/client/web/src/components/ChatBox/index.tsx b/client/web/src/components/ChatBox/index.tsx index b4f75e7d..c2bf3b12 100644 --- a/client/web/src/components/ChatBox/index.tsx +++ b/client/web/src/components/ChatBox/index.tsx @@ -6,7 +6,6 @@ import { ChatInputBox } from './ChatInputBox'; import { ChatMessageList } from './ChatMessageList'; import { ChatReply } from './ChatReply'; import { preprocessMessage } from './preprocessMessage'; -import { useMessageAck } from './useMessageAck'; type ChatBoxProps = | { @@ -35,7 +34,6 @@ const ChatBoxInner: React.FC = React.memo((props) => { converseId, isGroup, }); - useMessageAck(converseId); if (loading) { return ; diff --git a/client/web/src/components/ChatBox/useMessageAck.ts b/client/web/src/components/ChatBox/useMessageAck.ts deleted file mode 100644 index 601a6026..00000000 --- a/client/web/src/components/ChatBox/useMessageAck.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useEffect } from 'react'; -import { ChatMessage, sharedEvent, useConverseAck } from 'tailchat-shared'; - -/** - * 消息已读的回调 - */ -export function useMessageAck(converseId: string) { - const { updateConverseAck } = useConverseAck(converseId); - - useEffect(() => { - const handleReadMessage = (message: ChatMessage | null) => { - const messageId = message?._id; - if (messageId && converseId === message.converseId) { - updateConverseAck(messageId); - } - }; - - sharedEvent.on('readMessage', handleReadMessage); - - return () => { - sharedEvent.off('readMessage', handleReadMessage); - }; - }, [converseId]); -} diff --git a/server/packages/sdk/src/services/base.ts b/server/packages/sdk/src/services/base.ts index 443d0570..2699f478 100644 --- a/server/packages/sdk/src/services/base.ts +++ b/server/packages/sdk/src/services/base.ts @@ -323,7 +323,8 @@ export abstract class TcService extends Service { */ getPanelNamesWithFeature(panelFeature: PanelFeature) { const map = - this.getGlobalConfig>('panelFeature'); + this.getGlobalConfig>('panelFeature') ?? + {}; const matched = Object.entries(map).filter(([panelName, panelFeatures]) => panelFeatures.includes(panelFeature)