import React, { useEffect, useMemo, useState } from "react"; import { Button } from "@/src/components/ui/button"; import { MessageCircleMore, MessageCircle, X, Archive, Loader2, Check, Trash, } from "lucide-react"; import { useFieldArray, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/src/components/ui/form"; import { isPresent, type ScoreConfigDomain, type ScoreConfigCategoryDomain, type UpdateAnnotationScoreData, type CreateAnnotationScoreData, } from "@langfuse/shared"; import { Input } from "@/src/components/ui/input"; import { Popover, PopoverClose, PopoverContent, PopoverTrigger, } from "@/src/components/ui/popover"; import { Combobox } from "@/src/components/ui/combobox"; import { Textarea } from "@/src/components/ui/textarea"; import { HoverCardContent } from "@radix-ui/react-hover-card"; import { HoverCard, HoverCardTrigger } from "@/src/components/ui/hover-card"; import { formatAnnotateDescription, isNumericDataType, isScoreUnsaved, } from "@/src/features/scores/lib/helpers"; import { ToggleGroup, ToggleGroupItem } from "@/src/components/ui/toggle-group"; import Header from "@/src/components/layouts/header"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { cn } from "@/src/utils/tailwind"; import { type AnnotationScoreFormData, type InnerAnnotationFormProps, type ScoreTarget, type AnnotationForm as AnnotationFormType, } from "@/src/features/scores/types"; import { AnnotateFormSchema } from "@/src/features/scores/schema"; import { ScoreConfigDetails } from "@/src/features/score-configs/components/ScoreConfigDetails"; import { enrichCategoryOptionsWithStaleScoreValue, resolveConfigValue, validateNumericScore, } from "@/src/features/scores/lib/annotationFormHelpers"; import { useMergedAnnotationScores } from "@/src/features/scores/lib/useMergedAnnotationScores"; import { transformToAnnotationScores } from "@/src/features/scores/lib/transformScores"; import { v4 as uuid } from "uuid"; import { useScoreMutations } from "@/src/features/scores/hooks/useScoreMutations"; import { MultiSelectKeyValues } from "@/src/features/scores/components/multi-select-key-values"; import { DropdownMenuItem } from "@/src/components/ui/dropdown-menu"; import { useScoreConfigSelection } from "@/src/features/scores/hooks/useScoreConfigSelection"; import { useRouter } from "next/router"; import { useAnnotationScoreConfigs } from "@/src/features/scores/hooks/useScoreConfigs"; import { Skeleton } from "@/src/components/ui/skeleton"; const CHAR_CUTOFF = 6; function CommentField({ savedComment, disabled, loading, onSave, }: { savedComment: string | null; disabled: boolean; loading: boolean; onSave: (comment: string | null) => void; }) { const [localValue, setLocalValue] = useState(savedComment || ""); // Reset local value when saved comment changes (after mutation completes) useEffect(() => { setLocalValue(savedComment || ""); }, [savedComment]); const hasChanges = localValue.trim() !== (savedComment || ""); return (
Score Comment
{savedComment && ( )}