From 1f0c75281f0be203a431a22e7f6d2512f3e6e1f3 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 23:21:11 +0000 Subject: [PATCH 1/2] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/routes/tasks.index.tsx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/routes/tasks.index.tsx b/src/routes/tasks.index.tsx index c826086..46c2c47 100644 --- a/src/routes/tasks.index.tsx +++ b/src/routes/tasks.index.tsx @@ -179,7 +179,20 @@ function TasksPage() { const toggleComplete = async (t: TaskRow, checked: boolean) => { if (!user) return; - await supabase + // Optimistic update so the row moves between lists immediately. + setTasks((prev) => + prev.map((row) => + row.id === t.id + ? { + ...row, + status: checked ? "complete" : "incomplete", + completed_by: checked ? user.id : null, + completed_at: checked ? (new Date().toISOString() as any) : null, + } + : row, + ), + ); + const { error } = await supabase .from("tasks") .update({ status: checked ? "complete" : "incomplete", @@ -187,6 +200,11 @@ function TasksPage() { completed_at: checked ? (new Date().toISOString() as any) : null, }) .eq("id", t.id); + if (error) { + toast.error(error.message); + load(); + return; + } await supabase.from("task_history").insert({ task_id: t.id, actor_id: user.id, @@ -196,6 +214,7 @@ function TasksPage() { if (checked) { await spawnNextWorkflowTask(t.id); } + load(); }; const overdueCount = grouped.Overdue.length; From 17d36d1f3e0e72e1d6b08e2dd5040988c875f26f Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 14 May 2026 23:21:21 +0000 Subject: [PATCH 2/2] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/routes/tasks.index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/tasks.index.tsx b/src/routes/tasks.index.tsx index 46c2c47..cbb6e39 100644 --- a/src/routes/tasks.index.tsx +++ b/src/routes/tasks.index.tsx @@ -24,6 +24,7 @@ import { NewTaskDialog } from "@/components/tasks/new-task-dialog"; import { ApplyWorkflowPickerDialog } from "@/components/tasks/apply-workflow-picker-dialog"; import { cn } from "@/lib/utils"; import { spawnNextWorkflowTask } from "@/lib/workflow-chain"; +import { toast } from "sonner"; import { parseDateOnly } from "@/lib/format"; export const Route = createFileRoute("/tasks/")({