import { useEffect, useState } from "react"; import { useNavigate, useLocation } from "@/lib/router"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { approvalsApi } from "../api/approvals"; import { agentsApi } from "../api/agents"; import { useCompany } from "../context/CompanyContext"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { queryKeys } from "../lib/queryKeys"; import { cn } from "../lib/utils"; import { PageTabBar } from "../components/PageTabBar"; import { Tabs } from "@/components/ui/tabs"; import { ShieldCheck } from "lucide-react"; import { ApprovalCard } from "../components/ApprovalCard"; import { PageSkeleton } from "../components/PageSkeleton"; type StatusFilter = "pending" | "all"; export function Approvals() { const { selectedCompanyId } = useCompany(); const { setBreadcrumbs } = useBreadcrumbs(); const queryClient = useQueryClient(); const navigate = useNavigate(); const location = useLocation(); const pathSegment = location.pathname.split("/").pop() ?? "pending"; const statusFilter: StatusFilter = pathSegment === "all" ? "all" : "pending"; const [actionError, setActionError] = useState(null); useEffect(() => { setBreadcrumbs([{ label: "Approvals" }]); }, [setBreadcrumbs]); const { data, isLoading, error } = useQuery({ queryKey: queryKeys.approvals.list(selectedCompanyId!), queryFn: () => approvalsApi.list(selectedCompanyId!), enabled: !!selectedCompanyId, }); const { data: agents } = useQuery({ queryKey: queryKeys.agents.list(selectedCompanyId!), queryFn: () => agentsApi.list(selectedCompanyId!), enabled: !!selectedCompanyId, }); const approveMutation = useMutation({ mutationFn: (id: string) => approvalsApi.approve(id), onSuccess: (_approval, id) => { setActionError(null); queryClient.invalidateQueries({ queryKey: queryKeys.approvals.list(selectedCompanyId!) }); navigate(`/approvals/${id}?resolved=approved`); }, onError: (err) => { setActionError(err instanceof Error ? err.message : "Failed to approve"); }, }); const rejectMutation = useMutation({ mutationFn: (id: string) => approvalsApi.reject(id), onSuccess: () => { setActionError(null); queryClient.invalidateQueries({ queryKey: queryKeys.approvals.list(selectedCompanyId!) }); }, onError: (err) => { setActionError(err instanceof Error ? err.message : "Failed to reject"); }, }); const filtered = (data ?? []) .filter( (a) => statusFilter === "all" || a.status === "pending" || a.status === "revision_requested", ) .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); const pendingCount = (data ?? []).filter( (a) => a.status === "pending" || a.status === "revision_requested", ).length; if (!selectedCompanyId) { return

Select a company first.

; } if (isLoading) { return ; } return (
navigate(`/approvals/${v}`)}> Pending{pendingCount > 0 && ( {pendingCount} )} }, { value: "all", label: "All" }, ]} />
{error &&

{error.message}

} {actionError &&

{actionError}

} {filtered.length === 0 && (

{statusFilter === "pending" ? "No pending approvals." : "No approvals yet."}

)} {filtered.length > 0 && (
{filtered.map((approval) => ( a.id === approval.requestedByAgentId) ?? null : null} onApprove={() => approveMutation.mutate(approval.id)} onReject={() => rejectMutation.mutate(approval.id)} detailLink={`/approvals/${approval.id}`} isPending={approveMutation.isPending || rejectMutation.isPending} /> ))}
)}
); }