perf: 优化消息已读容器逻辑,方便第三方复用

pull/70/head
moonrailgun 2 years ago
parent b938fcb12c
commit 66a67bf02b

@ -43,12 +43,7 @@ export interface SharedEventMap {
replyMessage: (payload: ChatMessage | null) => void;
/**
* ()
*/
readMessage: (payload: ChatMessage | null) => void;
/**
* ()
* ((receiveUnmutedMessage))
*/
receiveMessage: (payload: ChatMessage) => void;

@ -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) {
</Divider>
)}
<Intersection
onIntersection={() => sharedEvent.emit('readMessage', message)}
<MessageAckContainer
converseId={message.converseId}
messageId={message._id}
>
<ChatMessageItem showAvatar={showAvatar} payload={message} />
</Intersection>
</MessageAckContainer>
</div>
);
}

@ -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<MessageAckContainerProps> =
React.memo((props) => {
const { updateConverseAck } = useConverseAck(props.converseId);
const handleIntersection = useMemoizedFn(() => {
updateConverseAck(props.messageId);
});
return (
<Intersection onIntersection={handleIntersection}>
{props.children}
</Intersection>
);
});
MessageAckContainer.displayName = 'MessageAckContainer';

@ -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<ChatBoxProps> = React.memo((props) => {
converseId,
isGroup,
});
useMessageAck(converseId);
if (loading) {
return <ChatBoxPlaceholder />;

@ -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]);
}

@ -323,7 +323,8 @@ export abstract class TcService extends Service {
*/
getPanelNamesWithFeature(panelFeature: PanelFeature) {
const map =
this.getGlobalConfig<Record<string, PanelFeature[]>>('panelFeature');
this.getGlobalConfig<Record<string, PanelFeature[]>>('panelFeature') ??
{};
const matched = Object.entries(map).filter(([panelName, panelFeatures]) =>
panelFeatures.includes(panelFeature)

Loading…
Cancel
Save