| 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: 'http://localhost:7777', |
| 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?.() |
| } |
| } |
| ) |
| ) |
|
|