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

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

@ -9,6 +9,7 @@ import {
} from '../../model/message';
import { chatActions } from '../slices';
import { useAppDispatch, useAppSelector } from './useAppSelector';
import _isNil from 'lodash/isNil';
/**
*
@ -48,11 +49,27 @@ export function useConverseMessage(context: ConverseContext) {
// Step 2. 拉取消息
const messages = await fetchConverseMessage(converseId);
dispatch(
chatActions.appendConverseMessage({
chatActions.initialHistoryMessage({
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 { getCachedConverseInfo } from '../cache/cache';
import type { GroupInfo } from '../model/group';
import { fetchConverseMessage } from '../model/message';
/**
* Redux
@ -31,6 +32,7 @@ function initial(socket: AppSocket, store: AppStore) {
store.dispatch(userActions.setFriendRequests(data));
});
// 获取所有的当前用户会话列表
socket.request<string[]>('user.dmlist.getAllConverse').then((data) => {
(data ?? []).forEach(async (converseId) => {
// TODO: 待优化, 可以在后端一次性返回

@ -6,6 +6,7 @@ import _orderBy from 'lodash/orderBy';
export interface ChatConverseState extends ChatConverseInfo {
messages: ChatMessage[];
hasFetchedHistory: boolean;
}
interface ChatState {
@ -16,7 +17,7 @@ const initialState: ChatState = {
converses: {},
};
const userSlice = createSlice({
const chatSlice = createSlice({
name: 'chat',
initialState,
reducers: {
@ -28,6 +29,7 @@ const userSlice = createSlice({
state.converses[converseId] = {
messages: [],
hasFetchedHistory: false,
...action.payload,
};
},
@ -58,8 +60,33 @@ const userSlice = createSlice({
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 chatReducer = userSlice.reducer;
export const chatActions = chatSlice.actions;
export const chatReducer = chatSlice.reducer;

Loading…
Cancel
Save