| "use client"; |
|
|
| import { create } from "zustand"; |
| import { CLIENT_STORE_TTL_MS } from "@/shared/constants/config"; |
|
|
| const useProviderStore = create((set, get) => ({ |
| providers: [], |
| loading: false, |
| error: null, |
| lastFetched: 0, |
|
|
| setProviders: (providers) => set({ providers, lastFetched: Date.now() }), |
|
|
| addProvider: (provider) => |
| set((state) => ({ providers: [provider, ...state.providers] })), |
|
|
| updateProvider: (id, updates) => |
| set((state) => ({ |
| providers: state.providers.map((p) => |
| p._id === id ? { ...p, ...updates } : p |
| ), |
| })), |
|
|
| removeProvider: (id) => |
| set((state) => ({ |
| providers: state.providers.filter((p) => p._id !== id), |
| })), |
|
|
| invalidate: () => set({ lastFetched: 0 }), |
|
|
| setLoading: (loading) => set({ loading }), |
|
|
| setError: (error) => set({ error }), |
|
|
| |
| fetchProviders: async ({ force = false } = {}) => { |
| const { lastFetched, providers } = get(); |
| if (!force && providers.length > 0 && Date.now() - lastFetched < CLIENT_STORE_TTL_MS) return; |
| set({ loading: true, error: null }); |
| try { |
| const response = await fetch("/api/providers"); |
| const data = await response.json(); |
| if (response.ok) { |
| set({ providers: data.connections || data.providers || [], loading: false, lastFetched: Date.now() }); |
| } else { |
| set({ error: data.error, loading: false }); |
| } |
| } catch (error) { |
| set({ error: "Failed to fetch providers", loading: false }); |
| } |
| }, |
| })); |
|
|
| export default useProviderStore; |
|
|
|
|