From 5c7c04e2966f795af5f9744b6c3deaf1d4c62a5f Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Wed, 23 Mar 2022 14:34:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E6=96=AD?= =?UTF-8?q?=E7=BA=BF=E9=87=8D=E8=BF=9E=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B8=85?= =?UTF-8?q?=E7=90=86=E7=BC=93=E5=AD=98=E4=BC=9A=E8=AF=9D=E5=B9=B6=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/api/socket.ts | 7 +++++++ shared/redux/hooks/useConverseMessage.ts | 5 +++-- shared/redux/setup.ts | 6 ++++++ shared/redux/slices/chat.ts | 7 +++++++ shared/redux/slices/global.ts | 5 +++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/shared/api/socket.ts b/shared/api/socket.ts index cc999680..b991623e 100644 --- a/shared/api/socket.ts +++ b/shared/api/socket.ts @@ -91,6 +91,13 @@ export class AppSocket { this.socket.io.on('reconnect', cb); } + /** + * 断开连接 + */ + disconnect() { + this.socket.disconnect(); + } + /** * 初始Socket状态管理提示 */ diff --git a/shared/redux/hooks/useConverseMessage.ts b/shared/redux/hooks/useConverseMessage.ts index 019307e5..945fcabc 100644 --- a/shared/redux/hooks/useConverseMessage.ts +++ b/shared/redux/hooks/useConverseMessage.ts @@ -81,6 +81,7 @@ export function useConverseMessage(context: ConverseContext) { const converse = useAppSelector( (state) => state.chat.converses[converseId] ); + const reconnectNum = useAppSelector((state) => state.global.reconnectNum); const hasMoreMessage = converse?.hasMoreMessage ?? true; const dispatch = useAppDispatch(); const messages = converse?.messages ?? []; @@ -93,7 +94,7 @@ export function useConverseMessage(context: ConverseContext) { }; }, [converseId]); - // NOTICE: 该hook只会在converseId变化时执行 + // NOTICE: 该hook只会在converseId变化和重新链接时执行 const { loading, error } = useAsync(async () => { if (!converse) { // 如果是一个新会话(或者当前会话列表中没有) @@ -140,7 +141,7 @@ export function useConverseMessage(context: ConverseContext) { ); } } - }, [converseId]); + }, [converseId, reconnectNum]); // 加载更多消息 const [{ loading: isLoadingMore }, handleFetchMoreMessage] = diff --git a/shared/redux/setup.ts b/shared/redux/setup.ts index 041b2fee..f5ae9760 100644 --- a/shared/redux/setup.ts +++ b/shared/redux/setup.ts @@ -38,6 +38,12 @@ export function setupRedux(socket: AppSocket, store: AppStore) { socket.onReconnect(() => { console.warn('因为断线重连触发重新同步远程数据'); initial(socket, store); + /** + * 重置会话列表 + * 如果当前已经打开了一个会话列表则会让该会话自行更新(由useConverseMessage保障) + */ + store.dispatch(chatActions.clearAllConverses()); + store.dispatch(globalActions.incReconnectNum()); }); sharedEvent.on('updateNetworkStatus', (status) => { diff --git a/shared/redux/slices/chat.ts b/shared/redux/slices/chat.ts index 89d441eb..1a5097a8 100644 --- a/shared/redux/slices/chat.ts +++ b/shared/redux/slices/chat.ts @@ -149,6 +149,13 @@ const chatSlice = createSlice({ state.converses[converseId].hasFetchedHistory = true; }, + /** + * 清理所有会话信息 + */ + clearAllConverses(state) { + state.converses = {}; + }, + /** * 设置已读消息 */ diff --git a/shared/redux/slices/global.ts b/shared/redux/slices/global.ts index dcb35895..2d735170 100644 --- a/shared/redux/slices/global.ts +++ b/shared/redux/slices/global.ts @@ -5,10 +5,12 @@ export interface GlobalState { * 网络状态 */ networkStatus: 'initial' | 'connected' | 'reconnecting' | 'disconnected'; + reconnectNum: number; } const initialState: GlobalState = { networkStatus: 'initial', + reconnectNum: 0, }; const globalSlice = createSlice({ @@ -21,6 +23,9 @@ const globalSlice = createSlice({ ) { state.networkStatus = action.payload; }, + incReconnectNum(state) { + state.reconnectNum += 1; + }, }, });