import { create } from 'zustand'; import type { CalendarTask } from '@/lib/jmap/types'; import type { IJMAPClient } from '@/lib/jmap/client-interface'; export type TaskViewFilter = 'all' | 'pending' | 'completed' | 'overdue'; interface TaskStore { tasks: CalendarTask[]; selectedTaskId: string | null; filter: TaskViewFilter; showCompleted: boolean; isLoading: boolean; error: string | null; setTasks: (tasks: CalendarTask[]) => void; setSelectedTaskId: (id: string | null) => void; setFilter: (filter: TaskViewFilter) => void; setShowCompleted: (show: boolean) => void; fetchTasks: (client: IJMAPClient, calendarIds?: string[]) => Promise; createTask: (client: IJMAPClient, task: Partial) => Promise; updateTask: (client: IJMAPClient, id: string, updates: Partial) => Promise; deleteTask: (client: IJMAPClient, id: string) => Promise; toggleTaskComplete: (client: IJMAPClient, task: CalendarTask) => Promise; clearTasks: () => void; } export const useTaskStore = create((set, get) => ({ tasks: [], selectedTaskId: null, filter: 'all', showCompleted: false, isLoading: false, error: null, setTasks: (tasks) => set({ tasks }), setSelectedTaskId: (id) => set({ selectedTaskId: id }), setFilter: (filter) => set({ filter }), setShowCompleted: (show) => set({ showCompleted: show }), fetchTasks: async (client, calendarIds) => { set({ isLoading: true, error: null }); try { const tasks = await client.getCalendarTasks(calendarIds); set({ tasks, isLoading: false }); } catch (error) { console.error('Failed to fetch tasks:', error); set({ isLoading: false, error: 'Failed to fetch tasks' }); } }, createTask: async (client, task) => { const created = await client.createCalendarTask(task); set({ tasks: [...get().tasks, created] }); return created; }, updateTask: async (client, id, updates) => { await client.updateCalendarTask(id, updates); set({ tasks: get().tasks.map(t => t.id === id ? { ...t, ...updates, updated: new Date().toISOString() } : t), }); }, deleteTask: async (client, id) => { await client.deleteCalendarTask(id); set({ tasks: get().tasks.filter(t => t.id !== id), selectedTaskId: get().selectedTaskId === id ? null : get().selectedTaskId, }); }, toggleTaskComplete: async (client, task) => { const newProgress = task.progress === 'completed' ? 'needs-action' : 'completed'; const updates: Partial = { progress: newProgress, progressUpdated: new Date().toISOString(), }; await client.updateCalendarTask(task.id, updates); set({ tasks: get().tasks.map(t => t.id === task.id ? { ...t, ...updates, updated: new Date().toISOString() } : t), }); }, clearTasks: () => set({ tasks: [], selectedTaskId: null, error: null }), }));