stores/useConversationStore.ts (71 lines of code) (raw):
import { create } from "zustand";
import { ChatMessage, Item } from "@/lib/assistant";
import { ChatCompletionMessageParam } from "openai/resources/chat/completions";
import { INITIAL_MESSAGE } from "@/config/constants";
import { DEFAULT_ACTION } from "@/config/demoData";
export interface Action {
name: string;
parameters: any;
}
interface ConversationState {
// Items displayed in the chat
chatMessages: Item[];
// Items sent to the Responses API
conversationItems: any[];
annotations: any[];
// Actions suggested by the assistant to the human agent
recommendedActions: Action[];
// Message suggested by the assistant to the human agent
suggestedMessage: ChatMessage | null;
suggestedMessageDone: boolean;
composerText: string;
setComposerText: (text: string) => void;
userTyping: boolean;
setUserTyping: (typing: boolean) => void;
agentTyping: boolean;
setAgentTyping: (typing: boolean) => void;
setChatMessages: (items: Item[]) => void;
setConversationItems: (messages: any[]) => void;
addChatMessage: (item: Item) => void;
addConversationItem: (message: ChatCompletionMessageParam) => void;
setRecommendedActions: (actions: Action[]) => void;
setSuggestedMessage: (message: ChatMessage | null) => void;
setSuggestedMessageDone: (done: boolean) => void;
removeRecommendedAction: (actionName: string) => void;
setAnnotations: (annotations: any[]) => void;
}
const useConversationStore = create<ConversationState>((set) => ({
chatMessages: [
{
type: "message",
role: "agent",
content: [{ type: "output_text", text: INITIAL_MESSAGE }],
},
],
conversationItems: [],
annotations: [],
recommendedActions: [DEFAULT_ACTION],
suggestedMessage: null,
suggestedMessageDone: false,
userTyping: false,
agentTyping: false,
composerText: "",
setUserTyping: (typing) => set({ userTyping: typing }),
setAgentTyping: (typing) => set({ agentTyping: typing }),
setComposerText: (text) => set({ composerText: text }),
setChatMessages: (items) => set({ chatMessages: items }),
setConversationItems: (messages) => set({ conversationItems: messages }),
addChatMessage: (item) =>
set((state) => ({ chatMessages: [...state.chatMessages, item] })),
addConversationItem: (message) =>
set((state) => ({
conversationItems: [...state.conversationItems, message],
})),
setRecommendedActions: (actions) => set({ recommendedActions: actions }),
setSuggestedMessage: (message) => set({ suggestedMessage: message }),
setSuggestedMessageDone: (done) => set({ suggestedMessageDone: done }),
removeRecommendedAction: (actionName) =>
set((state) => ({
recommendedActions: state.recommendedActions.filter(
(a) => a.name !== actionName
),
})),
setAnnotations: (annotations) => set({ annotations }),
}));
export default useConversationStore;