@@ -35,223 +35,8 @@ import {
35
35
ThumbsDownFilled ,
36
36
} from "@carbon/react/icons" ;
37
37
38
- import { generateUUID } from "../../util/uuid" ;
39
- import {
40
- getFeedbacks as getFeedbacksAPI ,
41
- postFeedback as postFeedbackAPI ,
42
- updateFeedback as updateFeedbackAPI ,
43
- } from "../../api/feedbacks" ;
44
- import { addNotification } from "../../components/notifications/notificationsSlice" ;
45
-
46
38
import "./styles.scss" ;
47
39
48
- async function buildAnswersWithFeedback (
49
- question ,
50
- answers ,
51
- setAnswersWithFeedback ,
52
- dispatch
53
- ) {
54
- // Step 1: Build feedbackIdToAnswerIndex map and answersWithFeedback list
55
- let feedbackIdToAnswerIndexMap = new Map ( ) ;
56
- let answersWithFeedback = [ ] ;
57
-
58
- // Step 1.a: Iterate over each answer
59
- answers . forEach ( ( answer , answerIndex ) => {
60
- // Step 1.a.i: Generate feedback_id
61
- const feedback_id = generateUUID (
62
- question +
63
- "::" +
64
- answer . context . replace ( / \s / g, "" ) +
65
- "::" +
66
- answer . text . replace ( / \s / g, "" ) +
67
- "::" +
68
- answer . startCharOffset +
69
- "::" +
70
- answer . endCharOffset
71
- ) ;
72
-
73
- // Step 1.a.ii: Update feedbackIdToAnswerIndexMap
74
- feedbackIdToAnswerIndexMap . set ( feedback_id , answerIndex ) ;
75
-
76
- // Step 1.a.iii: Copy answer over and add feedback information
77
- answersWithFeedback . push ( {
78
- ...answer ,
79
- feedback : { feedback_id : feedback_id } ,
80
- } ) ;
81
- } ) ;
82
-
83
- // Step 2: Trigger [GET] /feedbacks API call for all identified feedback_ids
84
- let feedbacks = [ ] ;
85
- if ( ! _ . isEmpty ( feedbackIdToAnswerIndexMap ) ) {
86
- try {
87
- feedbacks = await getFeedbacksAPI ( [ ...feedbackIdToAnswerIndexMap . keys ( ) ] ) ;
88
- } catch ( err ) {
89
- // Step 1: Dispatch appropriate add error notification event
90
- if ( Object . hasOwn ( err , "name" ) && err . name === "AxiosError" ) {
91
- dispatch (
92
- addNotification ( {
93
- notification : {
94
- notification : {
95
- id : "get_feedbacks--error" ,
96
- type : "Toast" ,
97
- kind : "error" ,
98
- title : err . name + " : " + err . message ,
99
- subtitle : "Feedbacks may not be up-to-date." ,
100
- } ,
101
- } ,
102
- } )
103
- ) ;
104
- } else {
105
- dispatch (
106
- addNotification ( {
107
- notification : {
108
- id : "get_feedbacks--error" ,
109
- type : "Toast" ,
110
- kind : "error" ,
111
- title : err . detail . code + " : " + err . detail . message ,
112
- subtitle : "Feedbacks may not be up-to-date." ,
113
- } ,
114
- } )
115
- ) ;
116
- }
117
- }
118
- }
119
-
120
- // Step 3: If feedbacks exist, update feedback information in answersWithFeedback for appropriate answer
121
- if ( ! _ . isEmpty ( feedbacks ) ) {
122
- // Step 3.a: Iterate over each feedback
123
- feedbacks . forEach ( ( feedback ) => {
124
- const answerIndex = feedbackIdToAnswerIndexMap . get ( feedback . feedback_id ) ;
125
- if ( ! _ . isNil ( answerIndex ) ) {
126
- answersWithFeedback [ answerIndex ] . feedback = { ...feedback } ;
127
- }
128
- } ) ;
129
- }
130
-
131
- // Step 4: Set answersWithFeedback
132
- setAnswersWithFeedback ( answersWithFeedback ) ;
133
- }
134
-
135
- async function updateFeedback (
136
- feedbackId ,
137
- update ,
138
- answersWithFeedback ,
139
- setAnswersWithFeedback ,
140
- dispatch
141
- ) {
142
- try {
143
- // Step 1: Trigger [PATCH] /feedbacks/{feedback_id} API call
144
- const updatedFeedback = await updateFeedbackAPI ( feedbackId , update ) ;
145
-
146
- // Step 2: Copy existing answer index to feedback map
147
- let updatedAnswersWithFeedback = answersWithFeedback . map (
148
- ( answerWithFeedback ) => {
149
- // Step 2.a: If feedback_id of new feedback matches with answerWithFeedback's feedback.feedback_id, update that answersWithFeedback
150
- if (
151
- answerWithFeedback . feedback . feedback_id ===
152
- updatedFeedback . feedback_id
153
- ) {
154
- return { ...answerWithFeedback , feedback : updatedFeedback } ;
155
- } else {
156
- // Step 2.b: Return existing answerWithFeedback
157
- return answerWithFeedback ;
158
- }
159
- }
160
- ) ;
161
-
162
- // Step 3: Set AnswersWithFeedback to new value
163
- setAnswersWithFeedback ( updatedAnswersWithFeedback ) ;
164
- } catch ( err ) {
165
- // Step 1: Dispatch appropriate add error notification event
166
- if ( Object . hasOwn ( err , "name" ) && err . name === "AxiosError" ) {
167
- dispatch (
168
- addNotification ( {
169
- notification : {
170
- notification : {
171
- id : "update_feedback--error" ,
172
- type : "Toast" ,
173
- kind : "error" ,
174
- title : err . name + " : " + err . message ,
175
- subtitle : "Refer: contact us in README." ,
176
- } ,
177
- } ,
178
- } )
179
- ) ;
180
- } else {
181
- dispatch (
182
- addNotification ( {
183
- notification : {
184
- id : "update_feedback--error" ,
185
- type : "Toast" ,
186
- kind : "error" ,
187
- title : err . detail . code + " : " + err . detail . message ,
188
- subtitle : "Refer: contact us in README." ,
189
- } ,
190
- } )
191
- ) ;
192
- }
193
- }
194
- }
195
-
196
- async function postFeedback (
197
- feedback ,
198
- answersWithFeedback ,
199
- setAnswersWithFeedback ,
200
- dispatch
201
- ) {
202
- try {
203
- // Step 1: Trigger [POST] /feedbacks API call
204
- const newFeedback = await postFeedbackAPI ( feedback ) ;
205
-
206
- // Step 2: Copy existing answer index to feedback map
207
- let updatedAnswersWithFeedback = answersWithFeedback . map (
208
- ( answerWithFeedback ) => {
209
- // Step 2.a: If feedback_id of new feedback matches with answerWithFeedback's feedback.feedback_id, update that answersWithFeedback
210
- if (
211
- answerWithFeedback . feedback . feedback_id === newFeedback . feedback_id
212
- ) {
213
- return { ...answerWithFeedback , feedback : newFeedback } ;
214
- } else {
215
- // Step 2.b: Return existing answerWithFeedback
216
- return answerWithFeedback ;
217
- }
218
- }
219
- ) ;
220
-
221
- // Step 3: Set AnswersWithFeedback to new value
222
- setAnswersWithFeedback ( updatedAnswersWithFeedback ) ;
223
- } catch ( err ) {
224
- // Step 1: Dispatch appropriate add error notification event
225
- if ( Object . hasOwn ( err , "name" ) && err . name === "AxiosError" ) {
226
- dispatch (
227
- addNotification ( {
228
- notification : {
229
- notification : {
230
- id : "post_feedback--error" ,
231
- type : "Toast" ,
232
- kind : "error" ,
233
- title : err . name + " : " + err . message ,
234
- subtitle : "Refer: contact us in README." ,
235
- } ,
236
- } ,
237
- } )
238
- ) ;
239
- } else {
240
- dispatch (
241
- addNotification ( {
242
- notification : {
243
- id : "post_feedback--error" ,
244
- type : "Toast" ,
245
- kind : "error" ,
246
- title : err . detail . code + " : " + err . detail . message ,
247
- subtitle : "Refer: contact us in README." ,
248
- } ,
249
- } )
250
- ) ;
251
- }
252
- }
253
- }
254
-
255
40
function Answers ( { question, answers, loading, source } ) {
256
41
const [ answersWithFeedback , setAnswersWithFeedback ] = useState ( [ ] ) ;
257
42
@@ -262,11 +47,13 @@ function Answers({ question, answers, loading, source }) {
262
47
if ( _ . isNil ( answers ) || _ . isEmpty ( answers ) ) {
263
48
setAnswersWithFeedback ( [ ] ) ;
264
49
} else {
265
- buildAnswersWithFeedback (
266
- question ,
267
- answers ,
268
- setAnswersWithFeedback ,
269
- dispatch
50
+ setAnswersWithFeedback (
51
+ answers . map ( ( answer ) => {
52
+ return {
53
+ ...answer ,
54
+ feedback : { thumbs_up : false , thumbs_down : false } ,
55
+ } ;
56
+ } )
270
57
) ;
271
58
}
272
59
} , [ question , answers , dispatch ] ) ;
@@ -358,43 +145,27 @@ function Answers({ question, answers, loading, source }) {
358
145
}
359
146
iconDescription = "Yes"
360
147
onClick = { ( ) => {
361
- // Step 1: If existing feedback exist, update with new information
362
- if (
363
- ! _ . isNil ( answerWithFeedback . feedback . thumbs_up ) ||
364
- ! _ . isNil ( answerWithFeedback . feedback . thumbs_down )
365
- ) {
366
- updateFeedback (
367
- answerWithFeedback . feedback . feedback_id ,
368
- {
369
- thumbs_up : true ,
370
- thumbs_down : false ,
371
- } ,
372
- answersWithFeedback ,
373
- setAnswersWithFeedback ,
374
- dispatch
375
- ) ;
376
- } else {
377
- // Step 2: Create new feedback
378
- postFeedback (
379
- {
380
- feedback_id :
381
- answerWithFeedback . feedback . feedback_id ,
382
- question : question ,
383
- context : answerWithFeedback . context ,
384
- thumbs_up : true ,
385
- thumbs_down : false ,
386
- answer : answerWithFeedback . text ,
387
- start_char_offset :
388
- answerWithFeedback . startCharOffset ,
389
- end_char_offset :
390
- answerWithFeedback . endCharOffset ,
391
- application : source ,
392
- } ,
393
- answersWithFeedback ,
394
- setAnswersWithFeedback ,
395
- dispatch
396
- ) ;
397
- }
148
+ setAnswersWithFeedback (
149
+ answersWithFeedback . map ( ( entry , entry_idx ) => {
150
+ if ( entry_idx === index ) {
151
+ // Step 1.a.i: Create deep copy of the answerWithFeeback object to be updated
152
+ let updatedAnswerWithFeedback =
153
+ _ . cloneDeep ( entry ) ;
154
+
155
+ // Step 1.a.ii: Update "feedback" value
156
+ updatedAnswerWithFeedback . feedback = {
157
+ thumbs_up : true ,
158
+ thumbs_down : false ,
159
+ } ;
160
+
161
+ // Step 1.a.iii: Return updated answerWithFeeback object
162
+ return updatedAnswerWithFeedback ;
163
+ } else {
164
+ // Step 1.b: Return other answerWithFeeback objects as it is
165
+ return entry ;
166
+ }
167
+ } )
168
+ ) ;
398
169
} }
399
170
> </ Button >
400
171
< Button
@@ -407,43 +178,27 @@ function Answers({ question, answers, loading, source }) {
407
178
}
408
179
iconDescription = "Yes"
409
180
onClick = { ( ) => {
410
- // Step 1: If existing feedback exist, update with new information
411
- if (
412
- ! _ . isNil ( answerWithFeedback . feedback . thumbs_up ) ||
413
- ! _ . isNil ( answerWithFeedback . feedback . thumbs_down )
414
- ) {
415
- updateFeedback (
416
- answerWithFeedback . feedback . feedback_id ,
417
- {
418
- thumbs_up : false ,
419
- thumbs_down : true ,
420
- } ,
421
- answersWithFeedback ,
422
- setAnswersWithFeedback ,
423
- dispatch
424
- ) ;
425
- } else {
426
- // Step 2: Create new feedback
427
- postFeedback (
428
- {
429
- feedback_id :
430
- answerWithFeedback . feedback . feedback_id ,
431
- question : question ,
432
- context : answerWithFeedback . context ,
433
- thumbs_up : false ,
434
- thumbs_down : true ,
435
- answer : answerWithFeedback . text ,
436
- start_char_offset :
437
- answerWithFeedback . startCharOffset ,
438
- end_char_offset :
439
- answerWithFeedback . endCharOffset ,
440
- application : source ,
441
- } ,
442
- answersWithFeedback ,
443
- setAnswersWithFeedback ,
444
- dispatch
445
- ) ;
446
- }
181
+ setAnswersWithFeedback (
182
+ answersWithFeedback . map ( ( entry , entry_idx ) => {
183
+ if ( entry_idx === index ) {
184
+ // Step 1.a.i: Create deep copy of the answerWithFeeback object to be updated
185
+ let updatedAnswerWithFeedback =
186
+ _ . cloneDeep ( entry ) ;
187
+
188
+ // Step 1.a.ii: Update "feedback" value
189
+ updatedAnswerWithFeedback . feedback = {
190
+ thumbs_up : false ,
191
+ thumbs_down : true ,
192
+ } ;
193
+
194
+ // Step 1.a.iii: Return updated answerWithFeeback object
195
+ return updatedAnswerWithFeedback ;
196
+ } else {
197
+ // Step 1.b: Return other answerWithFeeback objects as it is
198
+ return entry ;
199
+ }
200
+ } )
201
+ ) ;
447
202
} }
448
203
> </ Button >
449
204
</ div >
0 commit comments