summaryrefslogtreecommitdiff
path: root/extension/react-app/src/redux/slices/chatSlice.ts
diff options
context:
space:
mode:
authorNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
committerNate Sesti <sestinj@gmail.com>2023-05-23 23:45:12 -0400
commitf53768612b1e2268697b5444e502032ef9f3fb3c (patch)
tree4ed49b73e6bd3c2f8fceffa9643973033f87af95 /extension/react-app/src/redux/slices/chatSlice.ts
downloadsncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.tar.gz
sncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.tar.bz2
sncontinue-f53768612b1e2268697b5444e502032ef9f3fb3c.zip
copying from old repo
Diffstat (limited to 'extension/react-app/src/redux/slices/chatSlice.ts')
-rw-r--r--extension/react-app/src/redux/slices/chatSlice.ts93
1 files changed, 93 insertions, 0 deletions
diff --git a/extension/react-app/src/redux/slices/chatSlice.ts b/extension/react-app/src/redux/slices/chatSlice.ts
new file mode 100644
index 00000000..848cccd4
--- /dev/null
+++ b/extension/react-app/src/redux/slices/chatSlice.ts
@@ -0,0 +1,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;