From f3ee0dfedff6183e3209649626555356a7dd5b94 Mon Sep 17 00:00:00 2001 From: Eugene Date: Tue, 14 Jul 2026 06:21:13 +0000 Subject: [PATCH 1/3] fix: prevent initial send failed live region crash --- CHANGELOG.md | 4 ++ .../Transcript/LiveRegion/SendFailed.spec.tsx | 49 +++++++++++++++++++ .../src/Transcript/LiveRegion/SendFailed.tsx | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 packages/component/src/Transcript/LiveRegion/SendFailed.spec.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e89adc708..7ee447df14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,10 @@ Legends: - Added `styleOptions.richCardTitleOmitHeadingRole` (default `false`) to opt out of `style: 'heading'` on rich card titles, in PR [#5839](https://github.com/microsoft/BotFramework-WebChat/pull/5839), by [@cjennison](https://github.com/cjennison) +### Fixed + +- Fixed an error when a failed activity is present when Web Chat mounts, resolving [#5812](https://github.com/microsoft/BotFramework-WebChat/issues/5812), by [@OEvgeny](https://github.com/OEvgeny) + ## [4.19.1] - 2026-06-09 diff --git a/packages/component/src/Transcript/LiveRegion/SendFailed.spec.tsx b/packages/component/src/Transcript/LiveRegion/SendFailed.spec.tsx new file mode 100644 index 0000000000..5ef35ace34 --- /dev/null +++ b/packages/component/src/Transcript/LiveRegion/SendFailed.spec.tsx @@ -0,0 +1,49 @@ +/** @jest-environment @happy-dom/jest-environment */ + +import React from 'react'; +import { render } from 'react-dom'; +import { act } from 'react-dom/test-utils'; + +import { hooks } from 'botframework-webchat-api'; + +import LiveRegionSendFailed from './SendFailed'; +import { useLiveRegion } from '../../providers/LiveRegionTwin'; + +jest.mock('botframework-webchat-api', () => ({ + hooks: { + useGetActivityByKey: jest.fn(), + useLocalizer: jest.fn(), + useSendStatusByActivityKey: jest.fn() + } +})); +jest.mock('../../providers/LiveRegionTwin', () => ({ useLiveRegion: jest.fn() })); + +const mockUseGetActivityByKey = hooks.useGetActivityByKey as jest.Mock; +const mockUseLiveRegion = useLiveRegion as jest.Mock; +const mockUseLocalizer = hooks.useLocalizer as jest.Mock; +const mockUseSendStatusByActivityKey = hooks.useSendStatusByActivityKey as jest.Mock; + +describe('LiveRegionSendFailed', () => { + let container: HTMLDivElement; + + beforeEach(() => { + container = document.createElement('div'); + + mockUseGetActivityByKey.mockReturnValue(() => ({ channelData: {}, text: 'Hello, World!', type: 'message' })); + mockUseLocalizer.mockReturnValue(() => 'Failed to send message.'); + mockUseSendStatusByActivityKey.mockReturnValue([new Map([['activity', 'send failed']])]); + }); + + afterEach(() => { + container.remove(); + jest.clearAllMocks(); + }); + + test('renders when the initial send status is failed', () => { + act(() => { + render(, container); + }); + + expect(mockUseLiveRegion.mock.calls[0][0]()).toBe(false); + }); +}); diff --git a/packages/component/src/Transcript/LiveRegion/SendFailed.tsx b/packages/component/src/Transcript/LiveRegion/SendFailed.tsx index 3af37838ad..54252f9c2e 100644 --- a/packages/component/src/Transcript/LiveRegion/SendFailed.tsx +++ b/packages/component/src/Transcript/LiveRegion/SendFailed.tsx @@ -48,7 +48,7 @@ const LiveRegionSendFailed = () => { /** True, if one or more non-presentational activities start appears as "send failed", otherwise, false. */ const hasNewSendFailed = useMemo(() => { - if (activityKeysOfSendFailed === prevActivityKeysOfSendFailed) { + if (!prevActivityKeysOfSendFailed || activityKeysOfSendFailed === prevActivityKeysOfSendFailed) { return false; } From ebadc18a36b69ecd06541f709ca27fb05f562a79 Mon Sep 17 00:00:00 2001 From: Eugene Date: Tue, 14 Jul 2026 06:27:16 +0000 Subject: [PATCH 2/3] docs: add changelog PR reference --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ee447df14..9205393585 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ Legends: ### Fixed -- Fixed an error when a failed activity is present when Web Chat mounts, resolving [#5812](https://github.com/microsoft/BotFramework-WebChat/issues/5812), by [@OEvgeny](https://github.com/OEvgeny) +- Fixed an error when a failed activity is present when Web Chat mounts, resolving [#5812](https://github.com/microsoft/BotFramework-WebChat/issues/5812), in PR [#5848](https://github.com/microsoft/BotFramework-WebChat/pull/5848), by [@OEvgeny](https://github.com/OEvgeny) ## [4.19.1] - 2026-06-09 From db72c924ce65ccc723109700e0b4b5d1b7611630 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 14 Jul 2026 20:56:40 +0000 Subject: [PATCH 3/3] Add test --- .../rehydrateSendFailedRetry.html | 86 ++++++++++++++++++ .../rehydrateSendFailedRetry.html.snap-1.png | Bin 0 -> 8058 bytes .../rehydrateSendFailedRetry.html.snap-2.png | Bin 0 -> 8058 bytes .../Transcript/LiveRegion/SendFailed.spec.tsx | 49 ---------- .../testHelpers/createDirectLineEmulator.js | 4 +- 5 files changed, 88 insertions(+), 51 deletions(-) create mode 100644 __tests__/html2/activityStatus/rehydrateSendFailedRetry.html create mode 100644 __tests__/html2/activityStatus/rehydrateSendFailedRetry.html.snap-1.png create mode 100644 __tests__/html2/activityStatus/rehydrateSendFailedRetry.html.snap-2.png delete mode 100644 packages/component/src/Transcript/LiveRegion/SendFailed.spec.tsx diff --git a/__tests__/html2/activityStatus/rehydrateSendFailedRetry.html b/__tests__/html2/activityStatus/rehydrateSendFailedRetry.html new file mode 100644 index 0000000000..fc022a50dd --- /dev/null +++ b/__tests__/html2/activityStatus/rehydrateSendFailedRetry.html @@ -0,0 +1,86 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/html2/activityStatus/rehydrateSendFailedRetry.html.snap-1.png b/__tests__/html2/activityStatus/rehydrateSendFailedRetry.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c90f04e022fe8cad0e32981d9481511982e8c6 GIT binary patch literal 8058 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 ({ - hooks: { - useGetActivityByKey: jest.fn(), - useLocalizer: jest.fn(), - useSendStatusByActivityKey: jest.fn() - } -})); -jest.mock('../../providers/LiveRegionTwin', () => ({ useLiveRegion: jest.fn() })); - -const mockUseGetActivityByKey = hooks.useGetActivityByKey as jest.Mock; -const mockUseLiveRegion = useLiveRegion as jest.Mock; -const mockUseLocalizer = hooks.useLocalizer as jest.Mock; -const mockUseSendStatusByActivityKey = hooks.useSendStatusByActivityKey as jest.Mock; - -describe('LiveRegionSendFailed', () => { - let container: HTMLDivElement; - - beforeEach(() => { - container = document.createElement('div'); - - mockUseGetActivityByKey.mockReturnValue(() => ({ channelData: {}, text: 'Hello, World!', type: 'message' })); - mockUseLocalizer.mockReturnValue(() => 'Failed to send message.'); - mockUseSendStatusByActivityKey.mockReturnValue([new Map([['activity', 'send failed']])]); - }); - - afterEach(() => { - container.remove(); - jest.clearAllMocks(); - }); - - test('renders when the initial send status is failed', () => { - act(() => { - render(, container); - }); - - expect(mockUseLiveRegion.mock.calls[0][0]()).toBe(false); - }); -}); diff --git a/packages/test/page-object/src/globals/testHelpers/createDirectLineEmulator.js b/packages/test/page-object/src/globals/testHelpers/createDirectLineEmulator.js index c29e9bdc27..642fc719c0 100644 --- a/packages/test/page-object/src/globals/testHelpers/createDirectLineEmulator.js +++ b/packages/test/page-object/src/globals/testHelpers/createDirectLineEmulator.js @@ -16,9 +16,9 @@ function uniqueId() { return random().toString(36).substring(2, 7); } -export default function createDirectLineEmulator({ autoConnect = true, ponyfill = {} } = {}) { +export default function createDirectLineEmulator({ autoConnect = true, initialState, ponyfill = {} } = {}) { const { Date = window.Date } = ponyfill; - const store = createStoreWithOptions({ ponyfill }); + const store = createStoreWithOptions({ ponyfill }, initialState); if (!isNativeClock()) { throw new Error('Fake timer is detected at global-level. You must pass it via the "ponyfill" option.');