|
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<HTMLTextAreaElement | null> |
|
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<PlaygroundStore>()( |
|
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: |
|
process.env.NEXT_PUBLIC_DEFAULT_ENDPOINT || '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?.() |
|
} |
|
} |
|
) |
|
) |
|
|