@@ -18,7 +18,6 @@ import { parseAnswer } from './AnswerParser'
1818import styles from './Answer.module.css'
1919import rehypeRaw from 'rehype-raw'
2020
21-
2221interface Props {
2322 answer : AskResponse
2423 onCitationClicked : ( citedDocument : Citation ) => void
@@ -79,72 +78,73 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
7978 } else {
8079 citationFilename = `${ citation . filepath } - Part ${ part_i } `
8180 }
82- // } else if (citation.filepath && citation.reindex_id) {
83- // citationFilename = `${citation.filepath} - Part ${citation.reindex_id}`
8481 } else {
8582 citationFilename = `Citation ${ index } `
8683 }
8784 return citationFilename
8885 }
8986
9087 const onLikeResponseClicked = async ( ) => {
91- if ( answer . message_id == undefined ) return
88+ if ( answer . message_id ) {
89+ let newFeedbackState = feedbackState
90+ // Set or unset the thumbs up state
91+ if ( feedbackState == Feedback . Positive ) {
92+ newFeedbackState = Feedback . Neutral
93+ } else {
94+ newFeedbackState = Feedback . Positive
95+ }
96+ appStateContext ?. dispatch ( {
97+ type : 'SET_FEEDBACK_STATE' ,
98+ payload : { answerId : answer . message_id , feedback : newFeedbackState }
99+ } )
100+ setFeedbackState ( newFeedbackState )
92101
93- let newFeedbackState = feedbackState
94- // Set or unset the thumbs up state
95- if ( feedbackState == Feedback . Positive ) {
96- newFeedbackState = Feedback . Neutral
97- } else {
98- newFeedbackState = Feedback . Positive
102+ // Update message feedback in db
103+ await historyMessageFeedback ( answer . message_id , newFeedbackState )
99104 }
100- appStateContext ?. dispatch ( {
101- type : 'SET_FEEDBACK_STATE' ,
102- payload : { answerId : answer . message_id , feedback : newFeedbackState }
103- } )
104- setFeedbackState ( newFeedbackState )
105-
106- // Update message feedback in db
107- await historyMessageFeedback ( answer . message_id , newFeedbackState )
108105 }
109106
110107 const onDislikeResponseClicked = async ( ) => {
111- if ( answer . message_id == undefined ) return
112-
113- let newFeedbackState = feedbackState
114- if ( feedbackState === undefined || feedbackState === Feedback . Neutral || feedbackState === Feedback . Positive ) {
115- newFeedbackState = Feedback . Negative
116- setFeedbackState ( newFeedbackState )
117- setIsFeedbackDialogOpen ( true )
118- } else {
119- // Reset negative feedback to neutral
120- newFeedbackState = Feedback . Neutral
121- setFeedbackState ( newFeedbackState )
122- await historyMessageFeedback ( answer . message_id , Feedback . Neutral )
108+ if ( answer . message_id ) {
109+ let newFeedbackState = feedbackState
110+ if ( feedbackState === undefined || feedbackState === Feedback . Neutral || feedbackState === Feedback . Positive ) {
111+ newFeedbackState = Feedback . Negative
112+ setFeedbackState ( newFeedbackState )
113+ setIsFeedbackDialogOpen ( true )
114+ } else {
115+ // Reset negative feedback to neutral
116+ newFeedbackState = Feedback . Neutral
117+ setFeedbackState ( newFeedbackState )
118+ await historyMessageFeedback ( answer . message_id , Feedback . Neutral )
119+ }
120+ appStateContext ?. dispatch ( {
121+ type : 'SET_FEEDBACK_STATE' ,
122+ payload : { answerId : answer . message_id , feedback : newFeedbackState }
123+ } )
123124 }
124- appStateContext ?. dispatch ( {
125- type : 'SET_FEEDBACK_STATE' ,
126- payload : { answerId : answer . message_id , feedback : newFeedbackState }
127- } )
128125 }
129126
130127 const updateFeedbackList = ( ev ?: FormEvent < HTMLElement | HTMLInputElement > , checked ?: boolean ) => {
131- if ( answer . message_id == undefined ) return
132- const selectedFeedback = ( ev ?. target as HTMLInputElement ) ?. id as Feedback
128+ if ( answer . message_id ) {
129+ const selectedFeedback = ( ev ?. target as HTMLInputElement ) ?. id as Feedback
133130
134- let feedbackList = negativeFeedbackList . slice ( )
135- if ( checked ) {
136- feedbackList . push ( selectedFeedback )
137- } else {
138- feedbackList = feedbackList . filter ( f => f !== selectedFeedback )
131+ let feedbackList = negativeFeedbackList . slice ( )
132+ if ( checked ) {
133+ feedbackList . push ( selectedFeedback )
134+ } else {
135+ feedbackList = feedbackList . filter ( f => f !== selectedFeedback )
136+ }
137+
138+ setNegativeFeedbackList ( feedbackList )
139139 }
140-
141- setNegativeFeedbackList ( feedbackList )
140+
142141 }
143142
144143 const onSubmitNegativeFeedback = async ( ) => {
145- if ( answer . message_id == undefined ) return
146- await historyMessageFeedback ( answer . message_id , negativeFeedbackList . join ( ',' ) )
147- resetFeedbackDialog ( )
144+ if ( answer . message_id ) {
145+ await historyMessageFeedback ( answer . message_id , negativeFeedbackList . join ( ',' ) )
146+ resetFeedbackDialog ( )
147+ }
148148 }
149149
150150 const resetFeedbackDialog = ( ) => {
@@ -184,7 +184,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
184184 defaultChecked = { negativeFeedbackList . includes ( Feedback . OtherUnhelpful ) }
185185 onChange = { updateFeedbackList } > </ Checkbox >
186186 </ Stack >
187- < div onClick = { ( ) => setShowReportInappropriateFeedback ( true ) } style = { { color : '#115EA3' , cursor : 'pointer' } } >
187+ < div data-testid = "InappropriateFeedback" onClick = { ( ) => setShowReportInappropriateFeedback ( true ) } style = { { color : '#115EA3' , cursor : 'pointer' } } >
188188 Report inappropriate content
189189 </ div >
190190 </ >
@@ -193,7 +193,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
193193
194194 const ReportInappropriateFeedbackContent = ( ) => {
195195 return (
196- < >
196+ < div data-testid = "ReportInappropriateFeedbackContent" >
197197 < div >
198198 The content is < span style = { { color : 'red' } } > *</ span >
199199 </ div >
@@ -224,12 +224,12 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
224224 defaultChecked = { negativeFeedbackList . includes ( Feedback . OtherHarmful ) }
225225 onChange = { updateFeedbackList } > </ Checkbox >
226226 </ Stack >
227- </ >
227+ </ div >
228228 )
229229 }
230230
231231 const components = {
232- code ( { node, ...props } : { node : any ; [ key : string ] : any } ) {
232+ code ( { node, ...props } : { node : any ; [ key : string ] : any } ) {
233233 let language
234234 if ( props . className ) {
235235 const match = props . className . match ( / l a n g u a g e - ( \w + ) / )
@@ -252,6 +252,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
252252 < ReactMarkdown
253253 linkTarget = "_blank"
254254 remarkPlugins = { [ remarkGfm , supersub ] }
255+ rehypePlugins = { [ rehypeRaw ] }
255256 children = {
256257 SANITIZE_ANSWER
257258 ? DOMPurify . sanitize ( parsedAnswer . markdownFormatText , { ALLOWED_TAGS : XSSAllowTags } )
@@ -270,7 +271,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
270271 onClick = { ( ) => onLikeResponseClicked ( ) }
271272 style = {
272273 feedbackState === Feedback . Positive ||
273- appStateContext ?. state . feedbackState [ answer . message_id ] === Feedback . Positive
274+ appStateContext ?. state . feedbackState [ answer . message_id ] === Feedback . Positive
274275 ? { color : 'darkgreen' , cursor : 'pointer' }
275276 : { color : 'slategray' , cursor : 'pointer' }
276277 }
@@ -281,8 +282,8 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
281282 onClick = { ( ) => onDislikeResponseClicked ( ) }
282283 style = {
283284 feedbackState !== Feedback . Positive &&
284- feedbackState !== Feedback . Neutral &&
285- feedbackState !== undefined
285+ feedbackState !== Feedback . Neutral &&
286+ feedbackState !== undefined
286287 ? { color : 'darkred' , cursor : 'pointer' }
287288 : { color : 'slategray' , cursor : 'pointer' }
288289 }
@@ -294,7 +295,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
294295 </ Stack . Item >
295296 < Stack horizontal className = { styles . answerFooter } >
296297 { ! ! parsedAnswer . citations . length && (
297- < Stack . Item onKeyDown = { e => ( e . key === 'Enter' || e . key === ' ' ? toggleIsRefAccordionOpen ( ) : null ) } >
298+ < Stack . Item data-testid = "stack-item" onKeyDown = { e => ( e . key === 'Enter' || e . key === ' ' ? toggleIsRefAccordionOpen ( ) : null ) } >
298299 < Stack style = { { width : '100%' } } >
299300 < Stack horizontal horizontalAlign = "start" verticalAlign = "center" >
300301 < Text
@@ -310,6 +311,7 @@ export const Answer = ({ answer, onCitationClicked }: Props) => {
310311 </ span >
311312 </ Text >
312313 < FontIcon
314+ data-testid = "ChevronIcon"
313315 className = { styles . accordionIcon }
314316 onClick = { handleChevronClick }
315317 iconName = { chevronIsExpanded ? 'ChevronDown' : 'ChevronRight' }
0 commit comments