"use client"; import { useState, useEffect, useCallback } from "react"; import { Plus, FolderOpen, CheckCircle2, AlertCircle, Clock, ChevronRight, ListTodo, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { fetchProjects, createProject, fetchMyTasks, type ProjectRow, type TaskRow, } from "@/lib/supabase/task-actions"; import PageSkeleton from "./PageSkeleton"; type TabKey = "projects" | "my-tasks"; const PRIORITY_COLORS: Record = { low: "bg-gray-100 text-gray-600 border-gray-200", medium: "bg-blue-50 text-blue-700 border-blue-200", high: "bg-amber-50 text-amber-700 border-amber-200", urgent: "bg-red-50 text-red-700 border-red-200", }; const PROJECT_STATUS_COLORS: Record = { active: "bg-teal-50 text-teal-700 border-teal-200", archived: "bg-gray-100 text-gray-600 border-gray-200", completed: "bg-green-50 text-green-700 border-green-200", }; export default function TasksPage({ onOpenProject, }: { onOpenProject: (projectId: string) => void; }) { const [tab, setTab] = useState("projects"); const [projects, setProjects] = useState([]); const [myTasks, setMyTasks] = useState([]); const [loading, setLoading] = useState(true); const [showNewProject, setShowNewProject] = useState(false); const [newName, setNewName] = useState(""); const [newDesc, setNewDesc] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; Promise.all([fetchProjects(), fetchMyTasks()]) .then(([p, t]) => { if (!cancelled) { setProjects(p); setMyTasks(t); } }) .catch((err) => { console.error("[Tasks] Failed to load:", err); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); const handleCreateProject = async () => { setError(null); if (!newName.trim()) { setError("Project name is required"); return; } setSaving(true); const result = await createProject(newName.trim(), newDesc.trim() || undefined); setSaving(false); if (!result.success) { setError(result.error || "Failed to create project"); return; } setNewName(""); setNewDesc(""); setShowNewProject(false); // Refresh projects const updated = await fetchProjects(); setProjects(updated); }; const isOverdue = (task: TaskRow) => { if (!task.due_date || task.status === "done") return false; return new Date(task.due_date) < new Date(new Date().toDateString()); }; const formatDate = (d: string | null) => { if (!d) return "No due date"; return new Date(d).toLocaleDateString("en-AU", { day: "numeric", month: "short", year: "numeric", }); }; if (loading) return ; return (
{/* Header */}

Tasks

Manage projects and your personal task list

{/* Tabs */}
{/* ── Projects Tab ─────────────────────────────────────── */} {tab === "projects" && ( <> {/* New Project Modal */} {showNewProject && (

New project

{error && (
{error}
)} setNewName(e.target.value)} placeholder="Project name" className="w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" />