@@ -21,9 +21,6 @@ interface MessageListProps {
21
21
interface ProcessedMessageProps {
22
22
messageContent : string ;
23
23
index : number ;
24
- modifierPressed : boolean ;
25
- urlRegex : RegExp ;
26
- handleClick : ( e : React . MouseEvent < HTMLAnchorElement > , url : string ) => void ;
27
24
}
28
25
29
26
export default function MessageList ( { messages} : MessageListProps ) {
@@ -46,20 +43,14 @@ export default function MessageList({messages}: MessageListProps) {
46
43
return scrollTop + clientHeight >= scrollHeight - 10 ; // 10px tolerance
47
44
} , [ ] ) ;
48
45
49
- // Regex to find URLs
50
- // https://stackoverflow.com/a/17773849
51
- const urlRegex = useMemo < RegExp > ( ( ) => / ( h t t p s ? : \/ \/ (?: w w w \. | (? ! w w w ) ) [ a - z A - Z 0 - 9 ] [ a - z A - Z 0 - 9 - ] + [ a - z A - Z 0 - 9 ] \. [ ^ \s ] { 2 , } | w w w \. [ a - z A - Z 0 - 9 ] [ a - z A - Z 0 - 9 - ] + [ a - z A - Z 0 - 9 ] \. [ ^ \s ] { 2 , } | h t t p s ? : \/ \/ (?: w w w \. | (? ! w w w ) ) [ a - z A - Z 0 - 9 ] + \. [ ^ \s ] { 2 , } | w w w \. [ a - z A - Z 0 - 9 ] + \. [ ^ \s ] { 2 , } ) / g, [ ] ) ;
52
-
53
- const [ modifierPressed , setModifierPressed ] = useState ( false ) ;
54
-
55
46
// Track Ctrl (Windows/Linux) or Cmd (Mac) key state
56
47
// This is so that underline is only visible when hover + cmd/ctrl
57
48
useEffect ( ( ) => {
58
49
const handleKeyDown = ( e : KeyboardEvent ) => {
59
- if ( e . ctrlKey || e . metaKey ) setModifierPressed ( true ) ;
50
+ if ( e . ctrlKey || e . metaKey ) document . documentElement . classList . add ( 'modifier-pressed' ) ;
60
51
} ;
61
52
const handleKeyUp = ( e : KeyboardEvent ) => {
62
- if ( ! e . ctrlKey && ! e . metaKey ) setModifierPressed ( false ) ;
53
+ if ( ! e . ctrlKey && ! e . metaKey ) document . documentElement . classList . remove ( 'modifier-pressed' ) ;
63
54
} ;
64
55
65
56
window . addEventListener ( "keydown" , handleKeyDown ) ;
@@ -68,6 +59,8 @@ export default function MessageList({messages}: MessageListProps) {
68
59
return ( ) => {
69
60
window . removeEventListener ( "keydown" , handleKeyDown ) ;
70
61
window . removeEventListener ( "keyup" , handleKeyUp ) ;
62
+ document . documentElement . classList . remove ( 'modifier-pressed' ) ;
63
+
71
64
} ;
72
65
} , [ ] ) ;
73
66
@@ -125,14 +118,6 @@ export default function MessageList({messages}: MessageListProps) {
125
118
lastScrollHeightRef . current = currentScrollHeight ;
126
119
} , [ messages ] ) ;
127
120
128
- const handleClick = useCallback ( ( ) => ( e : React . MouseEvent < HTMLAnchorElement > , url : string ) => {
129
- if ( e . metaKey || e . ctrlKey ) {
130
- window . open ( url , "_blank" ) ;
131
- } else {
132
- e . preventDefault ( ) ; // disable normal click to emulate terminal behaviour
133
- }
134
- } , [ ] ) ;
135
-
136
121
// If no messages, show a placeholder
137
122
if ( messages . length === 0 ) {
138
123
return (
@@ -171,9 +156,6 @@ export default function MessageList({messages}: MessageListProps) {
171
156
< ProcessedMessage
172
157
messageContent = { message . content }
173
158
index = { index }
174
- modifierPressed = { modifierPressed }
175
- urlRegex = { urlRegex }
176
- handleClick = { handleClick }
177
159
/>
178
160
) }
179
161
</ div >
@@ -207,29 +189,37 @@ const LoadingDots = () => (
207
189
const ProcessedMessage = React . memo ( function ProcessedMessage ( {
208
190
messageContent,
209
191
index,
210
- modifierPressed,
211
- urlRegex,
212
- handleClick
213
192
} : ProcessedMessageProps ) {
193
+ // Regex to find URLs
194
+ // https://stackoverflow.com/a/17773849
195
+ const urlRegex = useMemo < RegExp > ( ( ) => / ( h t t p s ? : \/ \/ (?: w w w \. | (? ! w w w ) ) [ a - z A - Z 0 - 9 ] [ a - z A - Z 0 - 9 - ] + [ a - z A - Z 0 - 9 ] \. [ ^ \s ] { 2 , } | w w w \. [ a - z A - Z 0 - 9 ] [ a - z A - Z 0 - 9 - ] + [ a - z A - Z 0 - 9 ] \. [ ^ \s ] { 2 , } | h t t p s ? : \/ \/ (?: w w w \. | (? ! w w w ) ) [ a - z A - Z 0 - 9 ] + \. [ ^ \s ] { 2 , } | w w w \. [ a - z A - Z 0 - 9 ] + \. [ ^ \s ] { 2 , } ) / g, [ ] ) ;
196
+
197
+ const handleClick = ( e : React . MouseEvent < HTMLAnchorElement > , url : string ) => {
198
+ if ( e . metaKey || e . ctrlKey ) {
199
+ window . open ( url , "_blank" ) ;
200
+ } else {
201
+ e . preventDefault ( ) ; // disable normal click to emulate terminal behaviour
202
+ }
203
+ }
204
+
214
205
const linkedContent = useMemo ( ( ) => {
215
206
return messageContent . split ( urlRegex ) . map ( ( content , idx ) => {
207
+ console . log ( content )
216
208
if ( urlRegex . test ( content ) ) {
217
209
return (
218
210
< a
219
211
key = { `${ index } -${ idx } ` }
220
212
href = { content }
221
213
onClick = { ( e ) => handleClick ( e , content ) }
222
- className = { `${
223
- modifierPressed ? "hover:underline cursor-pointer" : "cursor-default"
224
- } `}
214
+ className = "cursor-default [.modifier-pressed_&]:hover:underline [.modifier-pressed_&]:hover:cursor-pointer"
225
215
>
226
216
{ content }
227
217
</ a >
228
218
) ;
229
219
}
230
220
return < span key = { `${ index } -${ idx } ` } > { content } </ span > ;
231
221
} ) ;
232
- } , [ handleClick , index , messageContent , modifierPressed , urlRegex ] ) ;
222
+ } , [ index , messageContent , urlRegex ] ) ;
233
223
234
224
return < > { linkedContent } </ > ;
235
225
} ) ;
0 commit comments