1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import { createSlice } from "@reduxjs/toolkit";
import { ChatMessage, RootStore } from "../store";
export const chatSlice = createSlice({
name: "chat",
initialState: {
messages: [],
isStreaming: false,
} as RootStore["chat"],
reducers: {
addMessage: (
state,
action: {
type: string;
payload: ChatMessage;
}
) => {
return {
...state,
messages: [...state.messages, action.payload],
};
},
setIsStreaming: (state, action) => {
return {
...state,
isStreaming: action.payload,
};
},
streamUpdate: (state, action) => {
if (!state.isStreaming) {
return {
...state,
messages: [
...state.messages,
{
role: "assistant",
content: action.payload,
},
],
isStreaming: true,
};
} else {
let lastMessage = state.messages[state.messages.length - 1];
if (lastMessage.role !== "assistant") {
return {
...state,
messages: [
...state.messages,
{
role: "assistant",
content: action.payload,
},
],
isStreaming: true,
};
}
return {
...state,
messages: [
...state.messages.slice(0, state.messages.length - 1),
{
...lastMessage,
content: lastMessage.content + action.payload,
},
],
isStreaming: true,
};
}
},
closeStream: (state) => {
return {
...state,
isStreaming: false,
};
},
clearChat: (state) => {
return {
...state,
messages: [],
isStreaming: false,
};
},
},
});
export const {
addMessage,
streamUpdate,
closeStream,
clearChat,
setIsStreaming,
} = chatSlice.actions;
export default chatSlice.reducer;
|