"use client"; import { useState, useCallback, useRef, useEffect } from "react"; import { IconPlus, IconGripHorizontal, IconPlayerPlay } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; import { Textarea } from "@kandev/ui/textarea"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@kandev/ui/tooltip"; import { cn } from "@/lib/utils"; type EditorCommentPopoverProps = { selectedText: string; lineRange: { start: number; end: number }; position: { x: number; y: number }; onSubmit: (comment: string) => void; onSubmitAndRun?: (comment: string) => void; onClose: () => void; }; type DragState = { startX: number; startY: number; origLeft: number; origTop: number }; function computeInitialPos(position: { x: number; y: number }, width: number, height: number) { let left = position.x; let top = position.y; if (left + width > window.innerWidth - 16) left = Math.max(16, window.innerWidth - width - 16); if (top + height > window.innerHeight - 16) top = Math.max(16, position.y - height); return { left, top }; } function useDraggablePos(position: { x: number; y: number }, width: number, height: number) { const [pos, setPos] = useState(() => computeInitialPos(position, width, height)); const dragRef = useRef(null); const onDragStart = useCallback( (e: React.MouseEvent) => { e.preventDefault(); dragRef.current = { startX: e.clientX, startY: e.clientY, origLeft: pos.left, origTop: pos.top, }; const onMove = (ev: MouseEvent) => { if (!dragRef.current) return; const dx = ev.clientX - dragRef.current.startX; const dy = ev.clientY - dragRef.current.startY; setPos({ left: dragRef.current.origLeft + dx, top: dragRef.current.origTop + dy }); }; const onUp = () => { dragRef.current = null; document.removeEventListener("mousemove", onMove); document.removeEventListener("mouseup", onUp); }; document.addEventListener("mousemove", onMove); document.addEventListener("mouseup", onUp); }, [pos.left, pos.top], ); return { pos, onDragStart }; } function usePopoverDismiss( onClose: () => void, popoverRef: React.RefObject, ) { useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) onClose(); }; const timer = setTimeout(() => { document.addEventListener("mousedown", handleClickOutside); }, 100); return () => { clearTimeout(timer); document.removeEventListener("mousedown", handleClickOutside); }; }, [onClose, popoverRef]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { e.stopPropagation(); onClose(); } }; document.addEventListener("keydown", handleKeyDown, true); return () => document.removeEventListener("keydown", handleKeyDown, true); }, [onClose]); } function PopoverBody({ selectedText, comment, setComment, handleSubmit, handleSubmitAndRun, textareaRef, }: { selectedText: string; comment: string; setComment: (v: string) => void; handleSubmit: () => void; handleSubmitAndRun?: () => void; textareaRef: React.RefObject; }) { const previewText = selectedText.length > 100 ? selectedText.slice(0, 100).trim() + "…" : selectedText; const isDisabled = !comment.trim(); const isMac = typeof navigator !== "undefined" && navigator.platform?.includes("Mac"); const modKey = isMac ? "\u2318" : "Ctrl"; const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); if (e.shiftKey && handleSubmitAndRun) { handleSubmitAndRun(); } else { handleSubmit(); } } }, [handleSubmit, handleSubmitAndRun], ); return (
        {previewText}