mirror of https://github.com/msgbyte/tailchat
refactor: redux chat状态
parent
d05f7da169
commit
06fc8083ff
@ -0,0 +1,65 @@
|
||||
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
||||
import type { ChatConverseInfo } from '../../model/converse';
|
||||
import type { ChatMessage } from '../../model/message';
|
||||
import _uniqBy from 'lodash/uniqBy';
|
||||
import _orderBy from 'lodash/orderBy';
|
||||
|
||||
interface ChatConverseState extends ChatConverseInfo {
|
||||
messages: ChatMessage[];
|
||||
}
|
||||
|
||||
interface ChatState {
|
||||
converses: Record<string, ChatConverseState>;
|
||||
}
|
||||
|
||||
const initialState: ChatState = {
|
||||
converses: {},
|
||||
};
|
||||
|
||||
const userSlice = createSlice({
|
||||
name: 'chat',
|
||||
initialState,
|
||||
reducers: {
|
||||
/**
|
||||
* 设置会话信息
|
||||
*/
|
||||
setConverseInfo(state, action: PayloadAction<ChatConverseInfo>) {
|
||||
const converseId = action.payload._id;
|
||||
|
||||
state.converses[converseId] = {
|
||||
messages: [],
|
||||
...action.payload,
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* 追加消息
|
||||
*/
|
||||
appendConverseMessage(
|
||||
state,
|
||||
action: PayloadAction<{
|
||||
converseId: string;
|
||||
messages: ChatMessage[];
|
||||
}>
|
||||
) {
|
||||
const { converseId, messages } = action.payload;
|
||||
|
||||
if (!state.converses[converseId]) {
|
||||
// 没有会话信息, 请先设置会话信息
|
||||
console.error('没有会话信息, 请先设置会话信息');
|
||||
return;
|
||||
}
|
||||
|
||||
const newMessages = _orderBy(
|
||||
_uniqBy([...state.converses[converseId].messages, ...messages], '_id'),
|
||||
'createdAt',
|
||||
'asc'
|
||||
);
|
||||
|
||||
state.converses[converseId].messages = newMessages;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const chatActions = userSlice.actions;
|
||||
export const chatReducer = userSlice.reducer;
|
@ -1,10 +1,13 @@
|
||||
import { combineReducers } from '@reduxjs/toolkit';
|
||||
import { userReducer } from './user';
|
||||
import { chatReducer } from './chat';
|
||||
|
||||
export const appReducer = combineReducers({
|
||||
user: userReducer,
|
||||
chat: chatReducer,
|
||||
});
|
||||
|
||||
export type AppState = ReturnType<typeof appReducer>;
|
||||
|
||||
export { userActions } from './user';
|
||||
export { chatActions } from './chat';
|
||||
|
Loading…
Reference in New Issue