/** * Cron State Store * Manages scheduled task state */ import { create } from 'zustand'; import type { CronJob, CronJobCreateInput, CronJobUpdateInput } from '../types/cron'; import { invokeIpc } from '@/lib/api-client'; interface CronState { jobs: CronJob[]; loading: boolean; error: string | null; // Actions fetchJobs: () => Promise; createJob: (input: CronJobCreateInput) => Promise; updateJob: (id: string, input: CronJobUpdateInput) => Promise; deleteJob: (id: string) => Promise; toggleJob: (id: string, enabled: boolean) => Promise; triggerJob: (id: string) => Promise; setJobs: (jobs: CronJob[]) => void; } export const useCronStore = create((set) => ({ jobs: [], loading: false, error: null, fetchJobs: async () => { set({ loading: true, error: null }); try { const result = await invokeIpc('cron:list'); set({ jobs: result, loading: false }); } catch (error) { set({ error: String(error), loading: false }); } }, createJob: async (input) => { try { const job = await invokeIpc('cron:create', input); set((state) => ({ jobs: [...state.jobs, job] })); return job; } catch (error) { console.error('Failed to create cron job:', error); throw error; } }, updateJob: async (id, input) => { try { await invokeIpc('cron:update', id, input); set((state) => ({ jobs: state.jobs.map((job) => job.id === id ? { ...job, ...input, updatedAt: new Date().toISOString() } : job ), })); } catch (error) { console.error('Failed to update cron job:', error); throw error; } }, deleteJob: async (id) => { try { await invokeIpc('cron:delete', id); set((state) => ({ jobs: state.jobs.filter((job) => job.id !== id), })); } catch (error) { console.error('Failed to delete cron job:', error); throw error; } }, toggleJob: async (id, enabled) => { try { await invokeIpc('cron:toggle', id, enabled); set((state) => ({ jobs: state.jobs.map((job) => job.id === id ? { ...job, enabled } : job ), })); } catch (error) { console.error('Failed to toggle cron job:', error); throw error; } }, triggerJob: async (id) => { try { const result = await invokeIpc('cron:trigger', id); console.log('Cron trigger result:', result); // Refresh jobs after trigger to update lastRun/nextRun state try { const jobs = await invokeIpc('cron:list'); set({ jobs }); } catch { // Ignore refresh error } } catch (error) { console.error('Failed to trigger cron job:', error); throw error; } }, setJobs: (jobs) => set({ jobs }), }));