import { create } from 'zustand' import { persist, createJSONStorage } from 'zustand/middleware' import { type PlaygroundChatMessage, type SessionEntry } from '@/types/playground' interface Agent { value: string label: string model: { provider: string } storage?: boolean } interface PlaygroundStore { hydrated: boolean setHydrated: () => void streamingErrorMessage: string setStreamingErrorMessage: (streamingErrorMessage: string) => void endpoints: { endpoint: string id_playground_endpoint: string }[] setEndpoints: ( endpoints: { endpoint: string id_playground_endpoint: string }[] ) => void isStreaming: boolean setIsStreaming: (isStreaming: boolean) => void isEndpointActive: boolean setIsEndpointActive: (isActive: boolean) => void isEndpointLoading: boolean setIsEndpointLoading: (isLoading: boolean) => void messages: PlaygroundChatMessage[] setMessages: ( messages: | PlaygroundChatMessage[] | ((prevMessages: PlaygroundChatMessage[]) => PlaygroundChatMessage[]) ) => void hasStorage: boolean setHasStorage: (hasStorage: boolean) => void chatInputRef: React.RefObject selectedEndpoint: string setSelectedEndpoint: (selectedEndpoint: string) => void agents: Agent[] setAgents: (agents: Agent[]) => void selectedModel: string setSelectedModel: (model: string) => void sessionsData: SessionEntry[] | null setSessionsData: ( sessionsData: | SessionEntry[] | ((prevSessions: SessionEntry[] | null) => SessionEntry[] | null) ) => void isSessionsLoading: boolean setIsSessionsLoading: (isSessionsLoading: boolean) => void } export const usePlaygroundStore = create()( persist( (set) => ({ hydrated: false, setHydrated: () => set({ hydrated: true }), streamingErrorMessage: '', setStreamingErrorMessage: (streamingErrorMessage) => set(() => ({ streamingErrorMessage })), endpoints: [], setEndpoints: (endpoints) => set(() => ({ endpoints })), isStreaming: false, setIsStreaming: (isStreaming) => set(() => ({ isStreaming })), isEndpointActive: false, setIsEndpointActive: (isActive) => set(() => ({ isEndpointActive: isActive })), isEndpointLoading: true, setIsEndpointLoading: (isLoading) => set(() => ({ isEndpointLoading: isLoading })), messages: [], setMessages: (messages) => set((state) => ({ messages: typeof messages === 'function' ? messages(state.messages) : messages })), hasStorage: false, setHasStorage: (hasStorage) => set(() => ({ hasStorage })), chatInputRef: { current: null }, selectedEndpoint: 'https://sifa-classification-agentic-rag-99329044472.asia-south1.run.app', setSelectedEndpoint: (selectedEndpoint) => set(() => ({ selectedEndpoint })), agents: [], setAgents: (agents) => set({ agents }), selectedModel: '', setSelectedModel: (selectedModel) => set(() => ({ selectedModel })), sessionsData: null, setSessionsData: (sessionsData) => set((state) => ({ sessionsData: typeof sessionsData === 'function' ? sessionsData(state.sessionsData) : sessionsData })), isSessionsLoading: false, setIsSessionsLoading: (isSessionsLoading) => set(() => ({ isSessionsLoading })) }), { name: 'endpoint-storage', storage: createJSONStorage(() => localStorage), partialize: (state) => ({ selectedEndpoint: state.selectedEndpoint }), onRehydrateStorage: () => (state) => { state?.setHydrated?.() } } ) )