import React, { useState, useEffect } from "react"; import { Button } from "@/src/components/ui/button"; import { LockIcon, SquarePen, LoaderCircle } from "lucide-react"; import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger, } from "@/src/components/ui/drawer"; import { api } from "@/src/utils/api"; import Header from "@/src/components/layouts/header"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { AnnotateDrawerContent } from "@/src/features/scores/components/AnnotateDrawerContent"; import { useIsMutating } from "@tanstack/react-query"; import { z } from "zod/v4"; import { type AnnotateDrawerProps } from "@/src/features/scores/types"; import { type ScoreTarget } from "@/src/features/scores/types"; import { formatAnnotateDescription } from "@/src/features/scores/lib/helpers"; const mutationKeySchema = z.array(z.array(z.string())); export function AnnotateDrawer({ scoreTarget, scores, emptySelectedConfigIds, setEmptySelectedConfigIds, projectId, analyticsData = { type: "trace", source: "TraceDetail", }, variant = "button", buttonVariant = "secondary", hasGroupedButton = false, environment, }: AnnotateDrawerProps) { const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [showSaving, setShowSaving] = useState(false); const capture = usePostHogClientCapture(); const hasAccess = useHasProjectAccess({ projectId, scope: "scores:CUD", }); const description = formatAnnotateDescription(scoreTarget); const configsData = api.scoreConfigs.all.useQuery( { projectId, }, { enabled: hasAccess && isDrawerOpen, }, ); const configs = configsData.data?.configs ?? []; // Validate if any of the scores mutations are in progress const isMutating = useIsMutating({ predicate: (mutation) => { const mutationKey = mutation.options.mutationKey; const parsedMutationKey = mutationKeySchema.safeParse(mutationKey); if (!parsedMutationKey.success) return false; for (const key of parsedMutationKey.data) { const parsedKey = key.join("."); if (parsedKey === "scores.createAnnotationScore") return true; if (parsedKey === "scores.updateAnnotationScore") return true; if (parsedKey === "scores.deleteAnnotationScore") return true; } return false; }, }); useEffect(() => { if (isMutating > 0) { setShowSaving(true); } else { // Add delay before setting showSaving to ensure loading state persists for a short time after the mutation key indicates completion, allowing for any pending operations to finish const timer = setTimeout(() => { setShowSaving(false); }, 500); // 500ms delay return () => clearTimeout(timer); } }, [isMutating]); if (!hasAccess && variant === "badge") return null; return ( setIsDrawerOpen(false)}> {variant === "button" ? ( ) : ( )} {configsData.isLoading ? (
Loading annotation data...
) : ( )}
); }