import { api } from "@/src/utils/api"; import { MoreHorizontal, X } from "lucide-react"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { Button } from "@/src/components/ui/button"; import { MultiSelectCombobox } from "@/src/components/ui/multi-select-combobox"; import { useUserSearch } from "@/src/features/annotation-queues/hooks/useUserSearch"; import { useSelectedUsers } from "@/src/features/annotation-queues/hooks/useSelectedUsers"; import { showSuccessToast } from "@/src/features/notifications/showSuccessToast"; interface UserAssignmentSectionProps { projectId: string; selectedUserIds: string[]; onChange: (userIds: string[]) => void; queueId?: string; } export const UserAssignmentSection = ({ projectId, selectedUserIds, onChange, queueId, }: UserAssignmentSectionProps) => { const hasQueueAssignmentsReadAccess = useHasProjectAccess({ projectId: projectId, scope: "annotationQueueAssignments:read", }); const hasQueueAssignmentWriteAccess = useHasProjectAccess({ projectId: projectId, scope: "annotationQueueAssignments:CUD", }); const utils = api.useUtils(); // Get current assigned users const queueAssignmentsQuery = api.annotationQueueAssignments.byQueueId.useQuery( { projectId, queueId: queueId as string }, { enabled: !!queueId && hasQueueAssignmentsReadAccess }, ); const deleteQueueAssignmentMutation = api.annotationQueueAssignments.delete.useMutation({ onSuccess: () => { utils.annotationQueueAssignments.invalidate(); utils.annotationQueues.invalidate(); showSuccessToast({ title: "Removed assignment", description: "User removed from queue successfully", }); }, }); // Combine selected users and assigned users for exclusion const assignedUserIds = queueAssignmentsQuery.data?.assignments.map((user: any) => user.id) || []; const excludeUserIds = [...new Set([...selectedUserIds, ...assignedUserIds])]; const userSearch = useUserSearch({ projectId, excludeUserIds, }); const { selectedUsers } = useSelectedUsers({ projectId, selectedUserIds, }); // Handle user selection changes const handleUsersChange = (users: typeof userSearch.searchResults) => { const userIds = users.map((user) => user.id); onChange(userIds); }; // Handle user removal const handleUserRemove = (userId: string) => { if (!!queueId) deleteQueueAssignmentMutation.mutate({ projectId, queueId, userId, }); }; // Check if there are more assigned users than shown const hasMoreAssignedUsers = queueAssignmentsQuery.data && queueAssignmentsQuery.data.totalCount > queueAssignmentsQuery.data.assignments.length; return (
{user.name || "Unnamed User"}
{user.email}
{user.name || "Unnamed User"}
{user.email}
{queueAssignmentsQuery.data.totalCount - queueAssignmentsQuery.data.assignments.length}{" "} more assigned users