import { useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { UserPlus2 } from "lucide-react"; import { accessApi } from "@/api/access"; import { ApiError } from "@/api/client"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { useBreadcrumbs } from "@/context/BreadcrumbContext"; import { useCompany } from "@/context/CompanyContext"; import { useToast } from "@/context/ToastContext"; import { queryKeys } from "@/lib/queryKeys"; export function JoinRequestQueue() { const { selectedCompany, selectedCompanyId } = useCompany(); const { setBreadcrumbs } = useBreadcrumbs(); const { pushToast } = useToast(); const queryClient = useQueryClient(); const [status, setStatus] = useState<"pending_approval" | "approved" | "rejected">("pending_approval"); const [requestType, setRequestType] = useState<"all" | "human" | "agent">("all"); useEffect(() => { setBreadcrumbs([ { label: selectedCompany?.name ?? "Company", href: "/dashboard" }, { label: "Inbox", href: "/inbox" }, { label: "Join Requests" }, ]); }, [selectedCompany?.name, setBreadcrumbs]); const requestsQuery = useQuery({ queryKey: queryKeys.access.joinRequests(selectedCompanyId ?? "", `${status}:${requestType}`), queryFn: () => accessApi.listJoinRequests( selectedCompanyId!, status, requestType === "all" ? undefined : requestType, ), enabled: !!selectedCompanyId, }); const approveMutation = useMutation({ mutationFn: (requestId: string) => accessApi.approveJoinRequest(selectedCompanyId!, requestId), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: queryKeys.access.joinRequests(selectedCompanyId!, `${status}:${requestType}`) }); await queryClient.invalidateQueries({ queryKey: queryKeys.access.companyMembers(selectedCompanyId!) }); await queryClient.invalidateQueries({ queryKey: queryKeys.access.companyUserDirectory(selectedCompanyId!) }); pushToast({ title: "Join request approved", tone: "success" }); }, }); const rejectMutation = useMutation({ mutationFn: (requestId: string) => accessApi.rejectJoinRequest(selectedCompanyId!, requestId), onSuccess: async () => { await queryClient.invalidateQueries({ queryKey: queryKeys.access.joinRequests(selectedCompanyId!, `${status}:${requestType}`) }); pushToast({ title: "Join request rejected", tone: "success" }); }, }); if (!selectedCompanyId) { return
Review human and agent join requests outside the mixed inbox feed. This queue uses the same approval mutations as the inline inbox cards.