fix: 修复在某些场景没有自动获取历史消息的问题

pull/13/head
moonrailgun 4 years ago
parent 51ad69536c
commit a384d7f926

@ -9,6 +9,7 @@ import {
} from '../../model/message'; } from '../../model/message';
import { chatActions } from '../slices'; import { chatActions } from '../slices';
import { useAppDispatch, useAppSelector } from './useAppSelector'; import { useAppDispatch, useAppSelector } from './useAppSelector';
import _isNil from 'lodash/isNil';
/** /**
* *
@ -48,11 +49,27 @@ export function useConverseMessage(context: ConverseContext) {
// Step 2. 拉取消息 // Step 2. 拉取消息
const messages = await fetchConverseMessage(converseId); const messages = await fetchConverseMessage(converseId);
dispatch( dispatch(
chatActions.appendConverseMessage({ chatActions.initialHistoryMessage({
converseId, converseId,
messages, historyMessages: messages,
}) })
); );
} else {
// 已存在
if (!converse.hasFetchedHistory) {
// 没有获取过历史消息
// 拉取历史消息
const startId = _isNil(converse.messages[0])
? undefined
: converse.messages[0]._id;
const messages = await fetchConverseMessage(converseId, startId);
dispatch(
chatActions.initialHistoryMessage({
converseId,
historyMessages: messages,
})
);
}
} }
}, []); }, []);

@ -5,6 +5,7 @@ import type { FriendRequest } from '../model/friend';
import type { UserDMList } from '../model/user'; import type { UserDMList } from '../model/user';
import { getCachedConverseInfo } from '../cache/cache'; import { getCachedConverseInfo } from '../cache/cache';
import type { GroupInfo } from '../model/group'; import type { GroupInfo } from '../model/group';
import { fetchConverseMessage } from '../model/message';
/** /**
* Redux * Redux
@ -31,6 +32,7 @@ function initial(socket: AppSocket, store: AppStore) {
store.dispatch(userActions.setFriendRequests(data)); store.dispatch(userActions.setFriendRequests(data));
}); });
// 获取所有的当前用户会话列表
socket.request<string[]>('user.dmlist.getAllConverse').then((data) => { socket.request<string[]>('user.dmlist.getAllConverse').then((data) => {
(data ?? []).forEach(async (converseId) => { (data ?? []).forEach(async (converseId) => {
// TODO: 待优化, 可以在后端一次性返回 // TODO: 待优化, 可以在后端一次性返回

@ -6,6 +6,7 @@ import _orderBy from 'lodash/orderBy';
export interface ChatConverseState extends ChatConverseInfo { export interface ChatConverseState extends ChatConverseInfo {
messages: ChatMessage[]; messages: ChatMessage[];
hasFetchedHistory: boolean;
} }
interface ChatState { interface ChatState {
@ -16,7 +17,7 @@ const initialState: ChatState = {
converses: {}, converses: {},
}; };
const userSlice = createSlice({ const chatSlice = createSlice({
name: 'chat', name: 'chat',
initialState, initialState,
reducers: { reducers: {
@ -28,6 +29,7 @@ const userSlice = createSlice({
state.converses[converseId] = { state.converses[converseId] = {
messages: [], messages: [],
hasFetchedHistory: false,
...action.payload, ...action.payload,
}; };
}, },
@ -58,8 +60,33 @@ const userSlice = createSlice({
state.converses[converseId].messages = newMessages; state.converses[converseId].messages = newMessages;
}, },
initialHistoryMessage(
state,
action: PayloadAction<{
converseId: string;
historyMessages: ChatMessage[];
}>
) {
const { converseId, historyMessages } = action.payload;
if (!state.converses[converseId]) {
// 没有会话信息, 请先设置会话信息
console.error('没有会话信息, 请先设置会话信息');
return;
}
chatSlice.caseReducers.appendConverseMessage(
state,
chatSlice.actions.appendConverseMessage({
converseId,
messages: [...historyMessages],
})
);
state.converses[converseId].hasFetchedHistory = true;
},
}, },
}); });
export const chatActions = userSlice.actions; export const chatActions = chatSlice.actions;
export const chatReducer = userSlice.reducer; export const chatReducer = chatSlice.reducer;

Loading…
Cancel
Save