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 }) => (
);
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;