1- import { useEffect , useState } from "react" ;
1+ import { useState } from "react" ;
22import Markdown from "react-markdown" ;
33import remarkBreaks from "remark-breaks" ;
44import remarkGfm from "remark-gfm" ;
@@ -32,43 +32,38 @@ async function sendCSATFeedback(queryId: string, positive: boolean) {
3232 }
3333}
3434
35+ function TrackedLink ( {
36+ href,
37+ children,
38+ } : {
39+ href ?: string ;
40+ children ?: React . ReactNode ;
41+ } ) {
42+ return (
43+ < a
44+ href = { href }
45+ target = "_blank"
46+ onClick = { ( ) =>
47+ track ( "click chat link" , {
48+ value : children ?. toString ( ) ?? "" ,
49+ href,
50+ } )
51+ }
52+ >
53+ { children }
54+ </ a >
55+ ) ;
56+ }
57+
3558function Messages ( {
3659 messages,
3760 loading,
3861} : {
3962 messages : Messages ;
4063 loading : boolean ;
4164} ) {
42- const [ listenersAdded , setListenersAdded ] = useState < Set < string > > ( new Set ( ) ) ;
4365 const [ feedbackGiven , setFeedbackGiven ] = useState < Set < string > > ( new Set ( ) ) ;
4466
45- useEffect ( ( ) => {
46- const messages = document . querySelectorAll < HTMLDivElement > (
47- "[data-docs-ai-message]" ,
48- ) ;
49-
50- for ( const message of messages ) {
51- if ( listenersAdded . has ( message . dataset . queryId ?? "" ) ) {
52- continue ;
53- }
54-
55- const links = message . querySelectorAll < HTMLAnchorElement > ( "a" ) ;
56-
57- for ( const link of links ) {
58- link . addEventListener ( "click" , ( ) => {
59- track ( "click chat link" , {
60- value : link . innerText ,
61- href : link . href ,
62- } ) ;
63- } ) ;
64- }
65-
66- setListenersAdded ( ( prev ) =>
67- new Set ( prev ) . add ( message . dataset . queryId ?? "" ) ,
68- ) ;
69- }
70- } , [ messages ] ) ;
71-
7267 const classes = {
7368 base : "w-fit max-w-3/4 rounded p-4" ,
7469 user : "bg-cl1-brand-orange text-cl1-black self-end" ,
@@ -91,10 +86,13 @@ function Messages({
9186 < div key = { index } className = "flex flex-col gap-2" >
9287 < div
9388 className = { `${ classes . base } ${ message . role === "user" ? classes . user : classes . assistant } ` }
94- data-docs-ai-message = { true }
95- data-query-id = { message . queryId }
9689 >
97- < Markdown remarkPlugins = { [ remarkGfm , remarkBreaks ] } >
90+ < Markdown
91+ remarkPlugins = { [ remarkGfm , remarkBreaks ] }
92+ components = { {
93+ a : TrackedLink ,
94+ } }
95+ >
9896 { message . content }
9997 </ Markdown >
10098 { message . sources && (
@@ -106,9 +104,9 @@ function Messages({
106104 < ul >
107105 { message . sources . map ( ( source ) => (
108106 < li key = { source . file_path } >
109- < a href = { source . file_path } target = "_blank" >
107+ < TrackedLink href = { source . file_path } >
110108 { source . title }
111- </ a >
109+ </ TrackedLink >
112110 </ li >
113111 ) ) }
114112 </ ul >
0 commit comments