From 99a2c636984706c324754965961d574886f09fc9 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Sat, 17 Sep 2022 20:13:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9C=AA=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=9A=84=E4=BC=9A=E8=AF=9D=E6=A0=87=E8=AE=B0=E5=B7=B2?= =?UTF-8?q?=E8=AF=BB=E4=BC=9A=E6=9C=89=E9=97=AE=E9=A2=98=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/shared/redux/setup.ts | 17 +++++++++++++--- client/shared/redux/slices/chat.ts | 7 ++++++- client/web/src/components/Avatar.tsx | 2 +- .../src/components/ChatBox/useMessageAck.ts | 20 ++++++++++++++----- client/web/src/components/Icon.tsx | 7 ++++++- .../web/src/routes/Main/Navbar/GroupNav.tsx | 3 +-- .../src/routes/Main/Navbar/PersonalNav.tsx | 5 ++--- 7 files changed, 45 insertions(+), 16 deletions(-) diff --git a/client/shared/redux/setup.ts b/client/shared/redux/setup.ts index 25e46a80..71163bb9 100644 --- a/client/shared/redux/setup.ts +++ b/client/shared/redux/setup.ts @@ -161,16 +161,18 @@ function listenNotify(socket: AppSocket, store: AppStore) { const appendMessage = () => { store.dispatch( chatActions.appendConverseMessage({ - converseId: message.converseId, + converseId, messages: [message], }) ); }; if (converse) { + // 如果该会话已经加载(群组面板) appendMessage(); } else if (!message.groupId) { - // 获取会话信息后添加到会话消息中 + // 如果会话没有加载, 但是是私信消息 + // 则获取会话信息后添加到会话消息中 getCachedConverseInfo(converseId).then((converse) => { if (converse.type === ChatConverseType.DM) { // 如果是私人会话, 则添加到dmlist @@ -182,7 +184,16 @@ function listenNotify(socket: AppSocket, store: AppStore) { appendMessage(); }); } else { - console.warn('无法处理的新增会话内容', message); + // 是群组未加载的消息面板的消息 + // 设置会话信息 + store.dispatch( + chatActions.setLastMessageMap([ + { + converseId, + lastMessageId: message._id, + }, + ]) + ); } }); diff --git a/client/shared/redux/slices/chat.ts b/client/shared/redux/slices/chat.ts index 44758c0b..1229e9cb 100644 --- a/client/shared/redux/slices/chat.ts +++ b/client/shared/redux/slices/chat.ts @@ -19,7 +19,12 @@ export interface ChatState { currentConverseId: string | null; // 当前活跃的会话id converses: Record; // <会话Id, 会话信息> ack: Record; // <会话Id, 本地最后一条会话Id> - lastMessageMap: Record; // <会话Id, 远程会话列表最后一条会话Id> + + /** + * 会话最新消息mapping + * <会话Id, 远程会话列表最后一条会话Id> + */ + lastMessageMap: Record; } const initialState: ChatState = { diff --git a/client/web/src/components/Avatar.tsx b/client/web/src/components/Avatar.tsx index 94ba4e96..6f5a7952 100644 --- a/client/web/src/components/Avatar.tsx +++ b/client/web/src/components/Avatar.tsx @@ -1,6 +1,6 @@ export { /** - * @deprecated please import it from tailchat-design + * @deprecated please import it from `tailchat-design` */ Avatar, } from 'tailchat-design'; diff --git a/client/web/src/components/ChatBox/useMessageAck.ts b/client/web/src/components/ChatBox/useMessageAck.ts index 7aa24faa..d136f305 100644 --- a/client/web/src/components/ChatBox/useMessageAck.ts +++ b/client/web/src/components/ChatBox/useMessageAck.ts @@ -1,12 +1,19 @@ import { useEffect } from 'react'; -import { ChatMessage, useConverseAck, useUpdateRef } from 'tailchat-shared'; -import _debounce from 'lodash/debounce'; +import { + ChatMessage, + useConverseAck, + useMemoizedFn, + useUpdateRef, +} from 'tailchat-shared'; import _last from 'lodash/last'; +/** + * 消息已读的回调 + */ export function useMessageAck(converseId: string, messages: ChatMessage[]) { const { updateConverseAck } = useConverseAck(converseId); const messagesRef = useUpdateRef(messages); - const updateConverseAckRef = useUpdateRef(updateConverseAck); + const updateConverseAckMemo = useMemoizedFn(updateConverseAck); useEffect(() => { // 设置当前 @@ -14,8 +21,11 @@ export function useMessageAck(converseId: string, messages: ChatMessage[]) { return; } - const lastMessageId = _last(messagesRef.current)!._id; - updateConverseAckRef.current(lastMessageId); + const lastMessage = _last(messagesRef.current); + if (lastMessage) { + const lastMessageId = lastMessage?._id; + updateConverseAckMemo(lastMessageId); + } }, [converseId]); return { updateConverseAck }; diff --git a/client/web/src/components/Icon.tsx b/client/web/src/components/Icon.tsx index a2749f20..6c98cace 100644 --- a/client/web/src/components/Icon.tsx +++ b/client/web/src/components/Icon.tsx @@ -1 +1,6 @@ -export { Icon } from 'tailchat-design'; +export { + /** + * @deprecated please import it from `tailchat-design` + */ + Icon, +} from 'tailchat-design'; diff --git a/client/web/src/routes/Main/Navbar/GroupNav.tsx b/client/web/src/routes/Main/Navbar/GroupNav.tsx index 956a96d2..80211bd9 100644 --- a/client/web/src/routes/Main/Navbar/GroupNav.tsx +++ b/client/web/src/routes/Main/Navbar/GroupNav.tsx @@ -1,7 +1,6 @@ -import { Avatar } from '@/components/Avatar'; +import { Avatar, Icon } from 'tailchat-design'; import { openModal } from '@/components/Modal'; import { ModalCreateGroup } from '@/components/modals/CreateGroup'; -import { Icon } from '@/components/Icon'; import React, { useCallback, useMemo } from 'react'; import { GroupInfo, t, useAppSelector, useGroupUnread } from 'tailchat-shared'; import { NavbarNavItem } from './NavItem'; diff --git a/client/web/src/routes/Main/Navbar/PersonalNav.tsx b/client/web/src/routes/Main/Navbar/PersonalNav.tsx index 33b45685..5905fbf1 100644 --- a/client/web/src/routes/Main/Navbar/PersonalNav.tsx +++ b/client/web/src/routes/Main/Navbar/PersonalNav.tsx @@ -1,7 +1,6 @@ -import { Avatar } from '@/components/Avatar'; +import { Avatar } from 'tailchat-design'; import React from 'react'; -import { t, useDMConverseList, useUserInfo } from 'tailchat-shared'; -import { useUnread } from 'tailchat-shared/redux/hooks/useUnread'; +import { t, useDMConverseList, useUserInfo, useUnread } from 'tailchat-shared'; import { NavbarNavItem } from './NavItem'; function usePersonalUnread(): boolean {