import { create } from 'zustand'; import { persist } from 'zustand/middleware'; import { CVProject, CVDataset, CVTrainingJob, CVExperiment, CVPrediction, TrainingMode, CVModel } from '../types/cv'; interface CVState { activeProject: CVProject | null; datasets: CVDataset[]; activeDatasetId: string | null; trainingJobs: CVTrainingJob[]; activeJobId: string | null; experiments: CVExperiment[]; models: CVModel[]; predictions: CVPrediction[]; activeTab: 'overview' | 'data' | 'vision_tasks' | 'training' | 'live_training' | 'results' | 'prediction' | 'experiments' | 'deploy' | 'hub' | 'model_hub'; trainingMode: TrainingMode; cvCache: Record; // Actions setActiveProject: (project: CVProject | null) => void; setDatasets: (datasets: CVDataset[]) => void; addDataset: (dataset: CVDataset) => void; deleteDataset: (id: string) => Promise; setActiveDatasetId: (id: string | null) => void; setTrainingJobs: (jobs: CVTrainingJob[]) => void; addTrainingJob: (job: CVTrainingJob) => void; updateTrainingJob: (id: string, updates: Partial) => void; setActiveJobId: (id: string | null) => void; setExperiments: (experiments: CVExperiment[]) => void; setModels: (models: CVModel[]) => void; setPredictions: (predictions: CVPrediction[]) => void; setActiveTab: (tab: CVState['activeTab']) => void; setTrainingMode: (mode: TrainingMode) => void; setCvCache: (key: string, data: any) => void; clearCvCache: (key?: string) => void; } export const useCVStore = create()( persist( (set) => ({ activeProject: null, datasets: [], activeDatasetId: null, trainingJobs: [], activeJobId: null, experiments: [], models: [], predictions: [], activeTab: 'overview', trainingMode: 'fast', cvCache: {}, setActiveProject: (project) => set({ activeProject: project }), setDatasets: (datasets) => set({ datasets }), addDataset: (dataset) => set((state) => ({ datasets: [dataset, ...state.datasets], activeDatasetId: dataset.id })), deleteDataset: async (id: string) => { try { const response = await fetch(`/api/v1/cv/datasets/${id}`, { method: 'DELETE' }); if (response.ok) { set((state) => ({ datasets: state.datasets.filter(d => d.id !== id), activeDatasetId: state.activeDatasetId === id ? null : state.activeDatasetId })); } } catch (error) { console.error("Failed to delete dataset:", error); } }, setActiveDatasetId: (id) => set({ activeDatasetId: id }), setTrainingJobs: (jobs) => set({ trainingJobs: jobs }), addTrainingJob: (job) => set((state) => ({ trainingJobs: [...state.trainingJobs, job] })), updateTrainingJob: (id, updates) => set((state) => ({ trainingJobs: state.trainingJobs.map(job => job.id === id ? { ...job, ...updates } : job ) })), setActiveJobId: (id) => set({ activeJobId: id }), setExperiments: (experiments) => set({ experiments }), setModels: (models) => set({ models }), setPredictions: (predictions) => set({ predictions }), setActiveTab: (tab) => set({ activeTab: tab }), setTrainingMode: (mode) => set({ trainingMode: mode }), setCvCache: (key, data) => set((state) => ({ cvCache: { ...state.cvCache, [key]: data } })), clearCvCache: (key) => set((state) => { if (key) { const newCache = { ...state.cvCache }; delete newCache[key]; return { cvCache: newCache }; } return { cvCache: {} }; }), }), { name: 'datavision-cv-store', partialize: (state) => ({ activeProject: state.activeProject, activeTab: state.activeTab, trainingMode: state.trainingMode, cvCache: state.cvCache, activeDatasetId: state.activeDatasetId, activeJobId: state.activeJobId }), // Persist specific fields } ) );