1- import { useState } from "react" ;
1+ import { useEffect , useState } from "react" ;
22import Markdown from "react-markdown" ;
33import remarkBreaks from "remark-breaks" ;
44import remarkGfm from "remark-gfm" ;
55import { fetchEventSource } from "@microsoft/fetch-event-source" ;
66import { Ring } from "ldrs/react" ;
77import { MdOutlineThumbUp , MdOutlineThumbDown } from "react-icons/md" ;
8+ import { track } from "~/util/zaraz" ;
89import "ldrs/react/Ring.css" ;
910
1011type Messages = {
@@ -38,15 +39,46 @@ function Messages({
3839 messages : Messages ;
3940 loading : boolean ;
4041} ) {
42+ const [ listenersAdded , setListenersAdded ] = useState < Set < string > > ( new Set ( ) ) ;
4143 const [ feedbackGiven , setFeedbackGiven ] = useState < Set < string > > ( new Set ( ) ) ;
4244
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+
4372 const classes = {
4473 base : "w-fit max-w-3/4 rounded p-4" ,
4574 user : "bg-cl1-brand-orange text-cl1-black self-end" ,
4675 assistant : "self-start bg-(--sl-color-bg-nav)" ,
4776 } ;
4877
4978 const handleFeedback = async ( queryId : string , positive : boolean ) => {
79+ track ( "submit chat feedback" , {
80+ value : positive . toString ( ) ,
81+ } ) ;
5082 await sendCSATFeedback ( queryId , positive ) ;
5183 setFeedbackGiven ( ( prev ) => new Set ( prev ) . add ( queryId ) ) ;
5284 } ;
@@ -59,6 +91,8 @@ function Messages({
5991 < div key = { index } className = "flex flex-col gap-2" >
6092 < div
6193 className = { `${ classes . base } ${ message . role === "user" ? classes . user : classes . assistant } ` }
94+ data-docs-ai-message = { true }
95+ data-query-id = { message . queryId }
6296 >
6397 < Markdown remarkPlugins = { [ remarkGfm , remarkBreaks ] } >
6498 { message . content }
@@ -71,7 +105,7 @@ function Messages({
71105 </ p >
72106 < ul >
73107 { message . sources . map ( ( source ) => (
74- < li >
108+ < li key = { source . file_path } >
75109 < a href = { source . file_path } target = "_blank" >
76110 { source . title }
77111 </ a >
@@ -124,6 +158,10 @@ export default function SupportAI() {
124158 const [ messages , setMessages ] = useState < Messages > ( [ ] ) ;
125159
126160 async function handleSubmit ( ) {
161+ track ( "submit chat" , {
162+ value : question ,
163+ } ) ;
164+
127165 setLoading ( true ) ;
128166 setMessages ( ( messages ) => [
129167 ...messages ,
0 commit comments