diff --git a/webview-ui/src/components/ChatTextArea.tsx b/webview-ui/src/components/ChatTextArea.tsx index aaaa848..a874712 100644 --- a/webview-ui/src/components/ChatTextArea.tsx +++ b/webview-ui/src/components/ChatTextArea.tsx @@ -40,7 +40,6 @@ const ChatTextArea = forwardRef( const [showContextMenu, setShowContextMenu] = useState(false) const [cursorPosition, setCursorPosition] = useState(0) const [searchQuery, setSearchQuery] = useState("") - const containerRef = useRef(null) const textAreaRef = useRef(null) const [isMouseDownOnMenu, setIsMouseDownOnMenu] = useState(false) const highlightLayerRef = useRef(null) @@ -48,6 +47,27 @@ const ChatTextArea = forwardRef( const [selectedType, setSelectedType] = useState(null) const [justDeletedSpaceAfterMention, setJustDeletedSpaceAfterMention] = useState(false) const [intendedCursorPosition, setIntendedCursorPosition] = useState(null) + const contextMenuContainerRef = useRef(null) + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + contextMenuContainerRef.current && + !contextMenuContainerRef.current.contains(event.target as Node) + ) { + setShowContextMenu(false) + } + } + + if (showContextMenu) { + document.addEventListener("mousedown", handleClickOutside) + } + + return () => { + document.removeEventListener("mousedown", handleClickOutside) + } + }, [showContextMenu, setShowContextMenu]) + const handleMentionSelect = useCallback( (type: string, value: string) => { if (value === "File" || value === "Folder") { @@ -297,7 +317,6 @@ const ChatTextArea = forwardRef( return (
( display: "flex", }}> {showContextMenu && ( - +
+ +
)} {!isTextAreaFocused && (
void searchQuery: string onMouseDown: () => void @@ -12,7 +11,6 @@ interface ContextMenuProps { } const ContextMenu: React.FC = ({ - containerWidth, onSelect, searchQuery, onMouseDown,