import { useState, type DragEvent } from "react"; import { type PromptVariant } from "../OutputsTable/types"; import { api } from "~/utils/api"; import { RiDraggable } from "react-icons/ri"; import { useExperimentAccess, useHandledAsyncCallback } from "~/utils/hooks"; import { HStack, Icon, Text, GridItem, type GridItemProps } from "@chakra-ui/react"; // Changed here import { cellPadding, headerMinHeight } from "../constants"; import AutoResizeTextArea from "../AutoResizeTextArea"; import VariantHeaderMenuButton from "./VariantHeaderMenuButton"; export default function VariantHeader( allProps: { variant: PromptVariant; canHide: boolean; } & GridItemProps, ) { const { variant, canHide, ...gridItemProps } = allProps; const { canModify } = useExperimentAccess(); const utils = api.useContext(); const [isDragTarget, setIsDragTarget] = useState(false); const [isInputHovered, setIsInputHovered] = useState(false); const [label, setLabel] = useState(variant.label); const updateMutation = api.promptVariants.update.useMutation(); const [onSaveLabel] = useHandledAsyncCallback(async () => { if (label && label !== variant.label) { await updateMutation.mutateAsync({ id: variant.id, updates: { label: label }, }); } }, [updateMutation, variant.id, variant.label, label]); const reorderMutation = api.promptVariants.reorder.useMutation(); const [onReorder] = useHandledAsyncCallback( async (e: DragEvent) => { e.preventDefault(); setIsDragTarget(false); const draggedId = e.dataTransfer.getData("text/plain"); const droppedId = variant.id; if (!draggedId || !droppedId || draggedId === droppedId) return; await reorderMutation.mutateAsync({ draggedId, droppedId, }); await utils.promptVariants.list.invalidate(); }, [reorderMutation, variant.id], ); const [menuOpen, setMenuOpen] = useState(false); if (!canModify) { return ( {variant.label} ); } return ( { e.dataTransfer.setData("text/plain", variant.id); e.currentTarget.style.opacity = "0.4"; }} onDragEnd={(e) => { e.currentTarget.style.opacity = "1"; }} onDragOver={(e) => { e.preventDefault(); setIsDragTarget(true); }} onDragLeave={() => { setIsDragTarget(false); }} onDrop={onReorder} backgroundColor={isDragTarget ? "gray.200" : "gray.100"} h="full" > setLabel(e.target.value)} onBlur={onSaveLabel} placeholder="Variant Name" borderWidth={1} borderColor="transparent" fontWeight="bold" fontSize={16} _hover={{ borderColor: "gray.300" }} _focus={{ borderColor: "blue.500", outline: "none" }} flex={1} px={cellPadding.x} onMouseEnter={() => setIsInputHovered(true)} onMouseLeave={() => setIsInputHovered(false)} /> ); }