Skip to content

Commit c60591a

Browse files
authored
fix: Preserve chatbot feedback after data change #2442 (#2443)
1 parent f186811 commit c60591a

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

ui/src/chatbot.test.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,29 @@ describe('XChatbot', () => {
267267
expect(emitMock).toHaveBeenCalledTimes(1)
268268
})
269269

270+
it('Preserve feedback on data change', () => {
271+
const { container, getByRole, getByTestId, rerender } = render(<XChatbot {...{ ...model, data, events: ['feedback'] }} />)
272+
const likeButton = container.querySelector("i[data-icon-name='Like']") as HTMLLIElement
273+
expect(likeButton).toBeInTheDocument()
274+
275+
fireEvent.click(likeButton)
276+
const likeSolidButton = container.querySelector("i[data-icon-name='LikeSolid']") as HTMLLIElement
277+
expect(likeSolidButton).toBeInTheDocument()
278+
279+
const input = getByRole('textbox')
280+
fireEvent.change(input, { target: { value: 'Woohoo' } })
281+
fireEvent.click(getByTestId(`${name}-submit`))
282+
283+
// TODO: "rerender" does not append new message
284+
rerender(<XChatbot {...{
285+
...model, data: [...data,
286+
{ content: 'I like it!', from_user: false }
287+
], events: ['feedback']
288+
}} />)
289+
290+
expect(container.querySelector("i[data-icon-name='LikeSolid']") as HTMLLIElement).toBeInTheDocument()
291+
})
292+
270293
it('Renders suggestions when specified', () => {
271294
const { getByText } = render(<XChatbot {...{ ...model, suggestions }} />)
272295

ui/src/chatbot.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,9 @@ export const XChatbot = (props: Chatbot) => {
191191
setIsInfiniteLoading(true)
192192
}
193193
}, [props.events, props.name]),
194-
onDataChange = React.useCallback(() => { if (props.data) setMsgs(processData(props.data)) }, [props.data]),
194+
onDataChange = React.useCallback(() => {
195+
if (props.data) setMsgs(prevMsgs => processData(props.data).map((msg, idx) => ({ ...msg, positive: prevMsgs?.[idx]?.positive })))
196+
}, [props.data]),
195197
handlePositive = (id: I) => {
196198
setMsgs(messages => {
197199
if (messages[id]?.positive) return messages

0 commit comments

Comments
 (0)