@@ -2,7 +2,7 @@ import { ArrowsPointingOutIcon } from "@heroicons/react/20/solid";
22import { Clipboard , ClipboardCheck } from "lucide-react" ;
33import type { Language , PrismTheme } from "prism-react-renderer" ;
44import { Highlight , Prism } from "prism-react-renderer" ;
5- import { forwardRef , ReactNode , useCallback , useEffect , useState } from "react" ;
5+ import { forwardRef , ReactNode , useCallback , useEffect , useRef , useState } from "react" ;
66import { TextWrapIcon } from "~/assets/icons/TextWrapIcon" ;
77import { cn } from "~/utils/cn" ;
88import { highlightSearchText } from "~/utils/logUtils" ;
@@ -217,6 +217,8 @@ export const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(
217217 const [ isModalOpen , setIsModalOpen ] = useState ( false ) ;
218218 const [ isWrapped , setIsWrapped ] = useState ( false ) ;
219219
220+ const restoreRef = useRef < ( ( ) => void ) | null > ( null ) ;
221+
220222 const handleCodeMouseDown = useCallback ( ( e : React . MouseEvent ) => {
221223 if ( e . button !== 0 ) return ;
222224 const el = e . currentTarget as HTMLElement ;
@@ -226,10 +228,16 @@ export const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(
226228 document . documentElement . style . userSelect = "" ;
227229 el . style . userSelect = "" ;
228230 document . removeEventListener ( "mouseup" , restore ) ;
231+ restoreRef . current = null ;
229232 } ;
233+ restoreRef . current = restore ;
230234 document . addEventListener ( "mouseup" , restore ) ;
231235 } , [ ] ) ;
232236
237+ useEffect ( ( ) => {
238+ return ( ) => restoreRef . current ?.( ) ;
239+ } , [ ] ) ;
240+
233241 const onCopied = useCallback (
234242 ( event : React . MouseEvent < HTMLButtonElement > ) => {
235243 event . preventDefault ( ) ;
@@ -405,28 +413,30 @@ export const CodeBlock = forwardRef<HTMLDivElement, CodeBlockProps>(
405413 </ Button >
406414 </ DialogHeader >
407415
408- { shouldHighlight ? (
409- < HighlightCode
410- theme = { theme }
411- code = { code }
412- language = { language }
413- showLineNumbers = { showLineNumbers }
414- highlightLines = { highlightLines }
415- maxLineWidth = { maxLineWidth }
416- className = "min-h-full"
417- preClassName = "text-sm"
418- isWrapped = { isWrapped }
419- />
420- ) : (
421- < div
422- dir = "ltr"
423- className = "overflow-auto px-3 py-3 scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600"
424- >
425- < pre className = "relative mr-2 p-2 font-mono text-base leading-relaxed" dir = "ltr" >
426- { highlightSearchText ( code , searchTerm ) }
427- </ pre >
428- </ div >
429- ) }
416+ < div onMouseDown = { handleCodeMouseDown } >
417+ { shouldHighlight ? (
418+ < HighlightCode
419+ theme = { theme }
420+ code = { code }
421+ language = { language }
422+ showLineNumbers = { showLineNumbers }
423+ highlightLines = { highlightLines }
424+ maxLineWidth = { maxLineWidth }
425+ className = "min-h-full"
426+ preClassName = "text-sm"
427+ isWrapped = { isWrapped }
428+ />
429+ ) : (
430+ < div
431+ dir = "ltr"
432+ className = "overflow-auto px-3 py-3 scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600"
433+ >
434+ < pre className = "relative mr-2 p-2 font-mono text-base leading-relaxed" dir = "ltr" >
435+ { highlightSearchText ( code , searchTerm ) }
436+ </ pre >
437+ </ div >
438+ ) }
439+ </ div >
430440 </ DialogContent >
431441 </ Dialog >
432442 </ >
0 commit comments