@@ -233,6 +233,7 @@ const CodeBlock = memo(
233233 const codeBlockRef = useRef < HTMLDivElement > ( null )
234234 const preRef = useRef < HTMLDivElement > ( null )
235235 const copyButtonWrapperRef = useRef < HTMLDivElement > ( null )
236+ // Copy button ref no longer needed since we're using onClick
236237 const { showCopyFeedback, copyWithFeedback } = useCopyToClipboard ( )
237238 const { t } = useAppTranslation ( )
238239 const isMountedRef = useRef ( true )
@@ -647,38 +648,23 @@ const CodeBlock = memo(
647648 const [ isSelecting , setIsSelecting ] = useState ( false )
648649
649650 useEffect ( ( ) => {
650- if ( ! preRef . current ) return
651-
652- const handleMouseDown = ( e : MouseEvent ) => {
653- // Only trigger if clicking the pre element directly
654- if ( e . currentTarget === preRef . current ) {
655- setIsSelecting ( true )
656- }
651+ const handleSelectionChange = ( ) => {
652+ const selection = window . getSelection ( )
653+ const newIsSelecting = selection ? ! selection . isCollapsed : false
654+ console . log ( "Selection changed, isSelecting:" , newIsSelecting )
655+ setIsSelecting ( newIsSelecting )
657656 }
658657
659- const handleMouseUp = ( ) => {
660- setIsSelecting ( false )
661- }
662-
663- const preElement = preRef . current
664- preElement . addEventListener ( "mousedown" , handleMouseDown )
665- document . addEventListener ( "mouseup" , handleMouseUp )
658+ document . addEventListener ( "selectionchange" , handleSelectionChange )
666659
667660 return ( ) => {
668- preElement . removeEventListener ( "mousedown" , handleMouseDown )
669- document . removeEventListener ( "mouseup" , handleMouseUp )
661+ document . removeEventListener ( "selectionchange" , handleSelectionChange )
670662 }
671663 } , [ ] )
672664
673665 const handleCopy = useCallback (
674666 ( e : React . MouseEvent ) => {
675667 e . stopPropagation ( )
676-
677- // Check if code block is partially visible before allowing copy
678- const codeBlock = codeBlockRef . current
679- if ( ! codeBlock || codeBlock . getAttribute ( "data-partially-visible" ) !== "true" ) {
680- return
681- }
682668 const textToCopy = rawSource !== undefined ? rawSource : source || ""
683669 if ( textToCopy ) {
684670 copyWithFeedback ( textToCopy , e )
@@ -691,6 +677,7 @@ const CodeBlock = memo(
691677 return null
692678 }
693679
680+ console . log ( "Rendering CodeBlock, isSelecting:" , isSelecting )
694681 return (
695682 < CodeBlockContainer ref = { codeBlockRef } >
696683 < MemoizedStyledPre
@@ -795,7 +782,7 @@ const CodeBlock = memo(
795782 </ CodeBlockButton >
796783 </ StandardTooltip >
797784 < StandardTooltip content = { t ( "chat:codeblock.tooltips.copy_code" ) } side = "top" >
798- < CodeBlockButton onClick = { handleCopy } >
785+ < CodeBlockButton onClick = { handleCopy } data-testid = "codeblock-copy-button" >
799786 { showCopyFeedback ? < Check size = { 16 } /> : < Copy size = { 16 } /> }
800787 </ CodeBlockButton >
801788 </ StandardTooltip >
0 commit comments