refactor: redux chat状态

pull/13/head
moonrailgun 4 years ago
parent d05f7da169
commit 06fc8083ff

@ -1,6 +1,6 @@
import { request } from '../api/request';
interface ConverseInfo {
export interface ChatConverseInfo {
_id: string;
name: string;
type: 'DM' | 'Group';
@ -13,7 +13,7 @@ interface ConverseInfo {
*/
export async function createDMConverse(
targetId: string
): Promise<ConverseInfo> {
): Promise<ChatConverseInfo> {
const { data } = await request.post('/api/chat/converse/createDMConverse', {
targetId,
});

@ -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';

@ -8,7 +8,11 @@ interface UserState {
friendRequests: FriendRequest[];
}
const initialState: UserState = { info: null, friends: [], friendRequests: [] };
const initialState: UserState = {
info: null,
friends: [],
friendRequests: [],
};
const userSlice = createSlice({
name: 'user',

Loading…
Cancel
Save