diff --git a/src/app/api/tasks/route.ts b/src/app/api/tasks/route.ts index e307a9b..08cd911 100644 --- a/src/app/api/tasks/route.ts +++ b/src/app/api/tasks/route.ts @@ -87,21 +87,30 @@ export async function GET() { // POST - create or update tasks, projects, or sprints export async function POST(request: Request) { try { - const { task, projects, sprints } = await request.json(); + const body = await request.json(); + console.log('>>> API POST: received body keys:', Object.keys(body)); + console.log('>>> API POST: has task?', !!body.task, '| has tasks?', !!body.tasks, '| has projects?', !!body.projects, '| has sprints?', !!body.sprints); + console.log('>>> API POST: tasks array length:', body.tasks?.length); + + const { task, tasks, projects, sprints } = body; const data = getData(); + console.log('>>> API POST: current data in file - tasks:', data.tasks?.length, 'projects:', data.projects?.length, 'sprints:', data.sprints?.length); // Update projects if provided if (projects) { + console.log('>>> API POST: updating projects:', projects.length); data.projects = projects; } // Update sprints if provided if (sprints) { + console.log('>>> API POST: updating sprints:', sprints.length); data.sprints = sprints; } - // Update or add task + // Update or add single task if (task) { + console.log('>>> API POST: updating single task:', task.id); const existingIndex = data.tasks.findIndex((t) => t.id === task.id); if (existingIndex >= 0) { data.tasks[existingIndex] = { ...task, updatedAt: new Date().toISOString() }; @@ -115,9 +124,17 @@ export async function POST(request: Request) { } } + // Update all tasks if tasks array provided + if (tasks && Array.isArray(tasks)) { + console.log('>>> API POST: updating ALL tasks array:', tasks.length); + data.tasks = tasks; + } + saveData(data); + console.log('>>> API POST: saved! New task count:', data.tasks.length); return NextResponse.json({ success: true, data }); } catch (error) { + console.error('>>> API POST: error:', error); return NextResponse.json({ error: "Failed to save" }, { status: 500 }); } } diff --git a/src/app/page.tsx b/src/app/page.tsx index 37157e4..fa51a40 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -56,6 +56,7 @@ const sprintColumns: { key: string; label: string; statuses: TaskStatus[] }[] = ] export default function Home() { + console.log('>>> PAGE: Component rendering') const { projects, tasks, @@ -95,9 +96,19 @@ export default function Home() { // Sync from server on mount useEffect(() => { - syncFromServer() + console.log('>>> PAGE: useEffect for syncFromServer running') + console.log('>>> PAGE: tasks count before sync:', tasks.length) + syncFromServer().then(() => { + console.log('>>> PAGE: syncFromServer completed') + console.log('>>> PAGE: tasks count after sync:', tasks.length) + }) }, [syncFromServer]) + // Log when tasks change + useEffect(() => { + console.log('>>> PAGE: tasks changed, new count:', tasks.length) + }, [tasks]) + const selectedProject = projects.find((p) => p.id === selectedProjectId) const selectedTask = tasks.find((t) => t.id === selectedTaskId) diff --git a/src/stores/useTaskStore.ts b/src/stores/useTaskStore.ts index a491a03..37d81ee 100644 --- a/src/stores/useTaskStore.ts +++ b/src/stores/useTaskStore.ts @@ -377,22 +377,25 @@ const defaultTasks: Task[] = [ // Helper to sync to server async function syncToServer(projects: Project[], tasks: Task[], sprints: Sprint[]) { - console.log('syncToServer: saving', tasks.length, 'tasks') + console.log('>>> syncToServer: saving', tasks.length, 'tasks,', projects.length, 'projects,', sprints.length, 'sprints') const t2 = tasks.find(t => t.id === '2') - if (t2) console.log('syncToServer: task 2 sprintId:', t2.sprintId) + if (t2) console.log('>>> syncToServer: task 2 sprintId:', t2.sprintId) try { + const body = JSON.stringify({ projects, tasks, sprints }) + console.log('>>> syncToServer: sending body with keys:', Object.keys(JSON.parse(body))) const res = await fetch('/api/tasks', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ projects, tasks, sprints }), + body: body, }) if (res.ok) { - console.log('syncToServer: saved successfully') + const responseData = await res.json() + console.log('>>> syncToServer: saved successfully, server now has', responseData.data?.tasks?.length, 'tasks') } else { - console.error('syncToServer: failed with status', res.status) + console.error('>>> syncToServer: failed with status', res.status) } } catch (error) { - console.error('Failed to sync to server:', error) + console.error('>>> syncToServer: Failed to sync to server:', error) } } @@ -409,12 +412,21 @@ export const useTaskStore = create()( lastSynced: null, syncFromServer: async () => { + console.log('>>> syncFromServer START') set({ isLoading: true }) try { const res = await fetch('/api/tasks') + console.log('>>> syncFromServer: API response status:', res.status) if (res.ok) { const data = await res.json() - console.log('syncFromServer: fetched', data.tasks?.length, 'tasks') + console.log('>>> syncFromServer: fetched data:', { + projectsCount: data.projects?.length, + tasksCount: data.tasks?.length, + sprintsCount: data.sprints?.length, + firstTaskTitle: data.tasks?.[0]?.title, + lastUpdated: data.lastUpdated, + }) + console.log('>>> syncFromServer: current store tasks count BEFORE set:', get().tasks.length) // ALWAYS use server data if API returns successfully set({ projects: data.projects || [], @@ -422,14 +434,16 @@ export const useTaskStore = create()( sprints: data.sprints || [], lastSynced: Date.now(), }) + console.log('>>> syncFromServer: store tasks count AFTER set:', get().tasks.length) } else { - console.error('syncFromServer: API returned', res.status) + console.error('>>> syncFromServer: API returned error status:', res.status) } } catch (error) { - console.error('Failed to sync from server:', error) + console.error('>>> syncFromServer: Failed to sync from server:', error) // Keep local data if server fails } finally { set({ isLoading: false }) + console.log('>>> syncFromServer END') } }, @@ -617,6 +631,20 @@ export const useTaskStore = create()( selectedTaskId: state.selectedTaskId, selectedSprintId: state.selectedSprintId, }), + onRehydrateStorage: () => { + console.log('>>> PERSIST: onRehydrateStorage called') + return (state, error) => { + if (error) { + console.log('>>> PERSIST: Rehydration error:', error) + } else { + console.log('>>> PERSIST: Rehydrated state:', { + selectedProjectId: state?.selectedProjectId, + selectedTaskId: state?.selectedTaskId, + tasksCount: state?.tasks?.length, + }) + } + } + }, } ) )