import { StatusBadge } from "@/src/components/layouts/status-badge";
import { Button } from "@/src/components/ui/button";
import {
DropdownMenuItem,
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuSeparator,
DropdownMenuCheckboxItem,
DropdownMenuLabel,
} from "@/src/components/ui/dropdown-menu";
import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess";
import { api } from "@/src/utils/api";
import { type AnnotationQueueObjectType } from "@langfuse/shared";
import { ChevronDown, ExternalLink } from "lucide-react";
import { useSession } from "next-auth/react";
import Link from "next/link";
import { useState, useCallback } from "react";
export const CreateNewAnnotationQueueItem = ({
projectId,
objectId,
objectType,
variant = "secondary",
size = "default",
}: {
projectId: string;
objectId: string;
objectType: AnnotationQueueObjectType;
variant?: "outline" | "secondary";
size?: "default" | "sm" | "xs" | "lg" | "icon" | "icon-xs" | "icon-sm";
}) => {
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
const session = useSession();
const hasAccess = useHasProjectAccess({
projectId: projectId,
scope: "annotationQueues:CUD",
});
const queues = api.annotationQueues.byObjectId.useQuery(
{
projectId,
objectId,
objectType,
},
{ enabled: session.status === "authenticated" },
);
const utils = api.useUtils();
const addToQueueMutation = api.annotationQueueItems.createMany.useMutation();
const removeFromQueueMutation =
api.annotationQueueItems.deleteMany.useMutation();
const handleQueueItemToggle = useCallback(
async (queueId: string, queueName: string, itemId?: string) => {
try {
if (!itemId) {
await addToQueueMutation.mutateAsync({
projectId,
objectIds: [objectId],
objectType,
queueId,
});
} else {
const confirmRemoval = confirm(
`Are you sure you want to remove this item from the queue "${queueName}"?`,
);
if (confirmRemoval) {
await removeFromQueueMutation.mutateAsync({
projectId,
itemIds: [itemId],
});
}
}
// Manually invalidate the query to refresh the data
await utils.annotationQueues.byObjectId.invalidate({
projectId,
objectId,
objectType,
});
} catch (error) {
console.error("Error toggling queue item:", error);
}
},
[
addToQueueMutation,
removeFromQueueMutation,
projectId,
objectId,
objectType,
utils.annotationQueues,
],
);
if (session.status !== "authenticated" || queues.isLoading) {
return (
);
}
return (
{
if (hasAccess) {
setIsDropdownOpen(!isDropdownOpen);
}
}}
>
In queue(s)
{queues.data?.queues.length ? (
queues.data?.queues.map((queue) => (
{
event.preventDefault();
}}
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
handleQueueItemToggle(queue.id, queue.name, queue.itemId);
}}
>
{queue.name}
{queue.status && (
)}
))
) : (
{
event.preventDefault();
event.stopPropagation();
}}
>
No queues defined
)}
Manage queues
);
};