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/hooks/useUserSearch"; import { useSelectedUsers } from "@/src/features/annotation-queues/hooks/useSelectedUsers"; import { showSuccessToast } from "@/src/features/notifications/showSuccessToast"; import { useRef } from "react"; interface UserAssignmentSectionProps { projectId: string; selectedUserIds: string[]; onChange: (userIds: string[]) => void; queueId?: string; } export const UserAssignmentSection = ({ projectId, selectedUserIds, onChange, queueId, }: UserAssignmentSectionProps) => { const containerRef = useRef(null); 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 Selection Combobox */} user.id} onOpenChange={(open) => { if (open) { setTimeout(() => { containerRef.current?.scrollIntoView({ behavior: "smooth", block: "center", }); }, 100); } }} renderSelectedItem={(user, onRemove) => (
{user.name || user.email}
)} renderItem={(user, isSelected, onToggle) => (

{user.name || "Unnamed User"}

{user.email}

{isSelected && (
)}
)} /> {/* Assigned Users Section */} {queueAssignmentsQuery.data && queueAssignmentsQuery.data?.totalCount > 0 && (

Assigned to ({queueAssignmentsQuery.data?.totalCount})

{queueAssignmentsQuery.data?.assignments.map( (user: any, index: number) => (

{user.name || "Unnamed User"}

{user.email}

{(index < queueAssignmentsQuery.data?.assignments.length - 1 || hasMoreAssignedUsers) && (
)}
), )} {hasMoreAssignedUsers && (

{queueAssignmentsQuery.data.totalCount - queueAssignmentsQuery.data.assignments.length}{" "} more assigned users

)}
)}
); };