import { ChevronDown, CopyIcon, LockIcon, PlusIcon } from "lucide-react";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
} from "@/src/components/ui/dialog";
import { api } from "@/src/utils/api";
import { cn } from "@/src/utils/tailwind";
import { useState } from "react";
import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenu,
DropdownMenuContent,
DropdownMenuTrigger,
} from "@/src/components/ui/dropdown-menu";
import Link from "next/link";
import { NewDatasetItemForm } from "@/src/features/datasets/components/NewDatasetItemForm";
import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess";
import { Button } from "@/src/components/ui/button";
import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture";
import { useIsAuthenticatedAndProjectMember } from "@/src/features/auth/hooks";
import { parseJsonPrioritised } from "@langfuse/shared";
import { ActionButton } from "@/src/components/ActionButton";
import { type MetadataDomainClient } from "@/src/utils/clientSideDomainTypes";
/**
* Component for creating a new dataset item from an existing object.
*
* This component can be used in two different contexts:
* 1. From a trace/observation: Creates a dataset item using data from a trace or observation
* (requires traceId and optionally observationId)
* 2. From an existing dataset item: Creates a new dataset item based on an existing one
* (requires fromDatasetId) -> isCopyItem
*/
export const NewDatasetItemFromExistingObject = (props: {
projectId: string;
traceId?: string;
observationId?: string;
fromDatasetId?: string;
input: string | null;
output: string | null;
metadata: MetadataDomainClient;
isCopyItem?: boolean;
buttonVariant?: "outline" | "secondary";
size?: "default" | "sm" | "xs" | "lg" | "icon" | "icon-xs" | "icon-sm";
}) => {
const parsedInput =
props.input && typeof props.input === "string"
? (parseJsonPrioritised(props.input) ?? null)
: null;
const parsedOutput =
props.output && typeof props.output === "string"
? (parseJsonPrioritised(props.output) ?? null)
: null;
const [isFormOpen, setIsFormOpen] = useState(false);
const isAuthenticatedAndProjectMember = useIsAuthenticatedAndProjectMember(
props.projectId,
);
const observationInDatasets =
api.datasets.datasetItemsBasedOnTraceOrObservation.useQuery(
{
projectId: props.projectId,
traceId: props.traceId as string,
observationId: props.observationId,
},
{
enabled: isAuthenticatedAndProjectMember && !!props.traceId,
},
);
const hasAccess = useHasProjectAccess({
projectId: props.projectId,
scope: "datasets:CUD",
});
const capture = usePostHogClientCapture();
const buttonVariant = props.buttonVariant || "secondary";
const buttonSize = props.size || "default";
return (
<>
{props.isCopyItem ? (