From 1ace22201d13f0a5c946e2cbc773516e1aa574bb Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Sat, 11 Sep 2021 15:58:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=BD=93=E6=8E=A5=E5=8F=97?= =?UTF-8?q?=E5=88=B0=E8=BF=9C=E7=A8=8B=E6=B6=88=E6=81=AF=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9C=AC=E5=9C=B0=E6=9C=AA=E8=AF=BB=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/redux/hooks/useConverseMessage.ts | 10 +++++++++- shared/redux/slices/chat.ts | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/shared/redux/hooks/useConverseMessage.ts b/shared/redux/hooks/useConverseMessage.ts index 18d0b245..149f4804 100644 --- a/shared/redux/hooks/useConverseMessage.ts +++ b/shared/redux/hooks/useConverseMessage.ts @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useEffect } from 'react'; import { ensureDMConverse } from '../../helper/converse-helper'; import { useAsync } from '../../hooks/useAsync'; import { showErrorToasts } from '../../manager/ui'; @@ -24,6 +24,14 @@ export function useConverseMessage(context: ConverseContext) { const dispatch = useAppDispatch(); const messages = converse?.messages ?? []; + useEffect(() => { + dispatch(chatActions.updateCurrentConverseId(converseId)); + + return () => { + dispatch(chatActions.updateCurrentConverseId(null)); + }; + }, [converseId]); + // NOTICE: 该hook只会在converseId变化时执行 const { loading, error } = useAsync(async () => { if (!converse) { diff --git a/shared/redux/slices/chat.ts b/shared/redux/slices/chat.ts index 4e05c68e..488eb3ab 100644 --- a/shared/redux/slices/chat.ts +++ b/shared/redux/slices/chat.ts @@ -3,6 +3,8 @@ import type { ChatConverseInfo } from '../../model/converse'; import type { ChatMessage } from '../../model/message'; import _uniqBy from 'lodash/uniqBy'; import _orderBy from 'lodash/orderBy'; +import _last from 'lodash/last'; +import { isValidStr } from '../../utils/string-helper'; export interface ChatConverseState extends ChatConverseInfo { messages: ChatMessage[]; @@ -10,12 +12,14 @@ export interface ChatConverseState extends ChatConverseInfo { } interface ChatState { + currentConverseId: string | null; // 当前活跃的会话id converses: Record; // <会话Id, 会话信息> ack: Record; // <会话Id, 本地最后一条会话Id> lastMessageMap: Record; // <会话Id, 远程最后一条会话Id> } const initialState: ChatState = { + currentConverseId: null, converses: {}, ack: {}, lastMessageMap: {}, @@ -25,6 +29,10 @@ const chatSlice = createSlice({ name: 'chat', initialState, reducers: { + updateCurrentConverseId(state, action: PayloadAction) { + state.currentConverseId = action.payload; + }, + /** * 设置会话信息 */ @@ -58,11 +66,18 @@ const chatSlice = createSlice({ const newMessages = _orderBy( _uniqBy([...state.converses[converseId].messages, ...messages], '_id'), - 'createdAt', + '_id', 'asc' ); state.converses[converseId].messages = newMessages; + + if (state.currentConverseId !== converseId) { + const lastMessageId = _last(messages)?._id; + if (isValidStr(lastMessageId)) { + state.lastMessageMap[converseId] = lastMessageId; + } + } }, initialHistoryMessage(