import { useEffect, useMemo, useState, type ReactElement } from "react"; import { useNavigate } from "react-router-dom"; import { Layout } from "@/components/layout/Layout"; import { DataTable, Pagination, type Column, } from "@/components/shared"; import { workflowService } from "@/services/workflow-service"; import type { WorkflowTask, WorkflowTaskCounts } from "@/types/workflow"; import { cn } from "@/lib/utils"; import { Inbox, Clock, Calendar, CheckCircle2 } from "lucide-react"; const formatDate = (value?: string | null): string => { if (!value) return "-"; return new Date(value).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", hour: "2-digit", minute: "2-digit" }); }; const StatCard = ({ icon: Icon, label, value, color }: { icon: any, label: string, value: number, color: string }) => (
{value}
{label}
); const Tasks = (): ReactElement => { const navigate = useNavigate(); const [tasks, setTasks] = useState([]); const [counts, setCounts] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [limit, setLimit] = useState(10); const [total, setTotal] = useState(0); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const offset = (currentPage - 1) * limit; const totalPages = Math.max(1, Math.ceil(total / limit)); useEffect(() => { const loadData = async () => { try { setIsLoading(true); const [tasksRes, countsRes] = await Promise.all([ workflowService.listTasks({ limit, offset }), workflowService.getTaskCounts() ]); if (tasksRes.success) { setTasks(tasksRes.data); setTotal(tasksRes.pagination.total); } if (countsRes.success) { setCounts(countsRes.data); } } catch (err: any) { setError(err?.response?.data?.error?.message || "Failed to load tasks"); } finally { setIsLoading(false); } }; loadData(); }, [limit, offset]); const columns: Column[] = useMemo( () => [ { key: "entity_name", label: "Entity", render: (task) => (
{task.entity.name} {task.entity.type}
), }, { key: "workflow_name", label: "Workflow", render: (task) => ( {task.workflow.name} ), }, { key: "step_name", label: "Step", render: (task) => (
{task.step.name}
), }, { key: "assigned_role", label: "Assigned To", render: (task) => ( {task.assignment.assigned_role} ), }, { key: "status", label: "Status", render: (task) => ( {task.is_overdue ? "Overdue" : task.status} ), }, { key: "due_at", label: "Due Date", render: (task) => ( {formatDate(task.due_at)} ), }, { key: "actions", label: "", render: (task) => ( ), }, ], [navigate], ); return (
{/* Count Stats Area */}
{/* Task Table Area */}

Pending Tasks

task.id} emptyMessage="No tasks currently assigned to you" isLoading={isLoading} error={error} /> {total > 0 && (
{ setLimit(value); setCurrentPage(1); }} />
)}
); }; export default Tasks;