mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
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';
|
|
|
|
export 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;
|