From 6ec76f10de86a9220c49354189411db609e073aa Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 25 Feb 2025 06:52:29 +0000 Subject: [PATCH 01/54] Upgrade tests to html2 --- ...estreaming-should-layout-properly-1-snap.png | Bin 10801 -> 0 bytes ...estreaming-should-layout-properly-2-snap.png | Bin 9742 -> 0 bytes ...estreaming-should-layout-properly-3-snap.png | Bin 12267 -> 0 bytes __tests__/html/typing/activityOrder.js | 5 ----- __tests__/html/typing/chunk.js | 5 ----- __tests__/html/typing/concludedLivestream.js | 5 ----- __tests__/html/typing/informative.js | 5 ----- __tests__/html/typing/layout.js | 5 ----- __tests__/html/typing/outOfOrder.js | 5 ----- .../html/typing/outOfOrder.sequenceNumber.js | 5 ----- .../html/typing/perActivityStyleOptions.js | 5 ----- __tests__/html/typing/simultaneous.js | 5 ----- .../typing/typingIndicator.shouldNotRevive.js | 5 ----- .../{html => html2}/typing/activityOrder.html | 10 +++++----- .../typing/activityOrder.html.snap-1.png} | Bin .../typing/activityOrder.html.snap-2.png} | Bin .../typing/activityOrder.html.snap-3.png} | Bin .../typing/activityOrder.html.snap-4.png} | Bin .../typing/activityOrder.html.snap-5.png} | Bin __tests__/{html => html2}/typing/chunk.html | 8 ++++---- .../typing/chunk.html.snap-1.png} | Bin .../typing/chunk.html.snap-2.png} | Bin .../typing/chunk.html.snap-3.png} | Bin .../typing/chunk.html.snap-4.png} | Bin .../typing/concludedLivestream.html | 8 ++++---- .../typing/concludedLivestream.html.snap-1.png} | Bin .../typing/concludedLivestream.html.snap-2.png} | Bin .../typing/concludedLivestream.html.snap-3.png} | Bin .../typing/concludedLivestream.html.snap-4.png} | Bin .../{html => html2}/typing/informative.html | 2 +- .../typing/informative.html.snap-1.png} | Bin __tests__/{html => html2}/typing/layout.html | 6 +++--- __tests__/html2/typing/layout.html.snap-1.png | Bin 0 -> 10798 bytes __tests__/html2/typing/layout.html.snap-2.png | Bin 0 -> 9742 bytes __tests__/html2/typing/layout.html.snap-3.png | Bin 0 -> 12264 bytes .../{html => html2}/typing/outOfOrder.html | 8 ++++---- .../typing/outOfOrder.html.snap-1.png} | Bin .../typing/outOfOrder.html.snap-2.png} | Bin .../typing/outOfOrder.html.snap-3.png} | Bin .../typing/outOfOrder.html.snap-4.png} | Bin .../typing/outOfOrder.sequenceNumber.html | 8 ++++---- .../outOfOrder.sequenceNumber.html.snap-1.png} | Bin .../outOfOrder.sequenceNumber.html.snap-2.png} | Bin .../outOfOrder.sequenceNumber.html.snap-3.png} | Bin .../outOfOrder.sequenceNumber.html.snap-4.png} | Bin .../typing/perActivityStyleOptions.html | 0 .../{html => html2}/typing/simultaneous.html | 12 ++++++------ .../typing/simultaneous.html.snap-1.png} | Bin .../typing/simultaneous.html.snap-2.png} | Bin .../typing/simultaneous.html.snap-3.png} | Bin .../typing/simultaneous.html.snap-4.png} | Bin .../typing/simultaneous.html.snap-5.png} | Bin .../typing/simultaneous.html.snap-6.png} | Bin .../typing/typingIndicator.shouldNotRevive.html | 0 54 files changed, 31 insertions(+), 81 deletions(-) delete mode 100644 __tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-1-snap.png delete mode 100644 __tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-2-snap.png delete mode 100644 __tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-3-snap.png delete mode 100644 __tests__/html/typing/activityOrder.js delete mode 100644 __tests__/html/typing/chunk.js delete mode 100644 __tests__/html/typing/concludedLivestream.js delete mode 100644 __tests__/html/typing/informative.js delete mode 100644 __tests__/html/typing/layout.js delete mode 100644 __tests__/html/typing/outOfOrder.js delete mode 100644 __tests__/html/typing/outOfOrder.sequenceNumber.js delete mode 100644 __tests__/html/typing/perActivityStyleOptions.js delete mode 100644 __tests__/html/typing/simultaneous.js delete mode 100644 __tests__/html/typing/typingIndicator.shouldNotRevive.js rename __tests__/{html => html2}/typing/activityOrder.html (97%) rename __tests__/{__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-1-snap.png => html2/typing/activityOrder.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-2-snap.png => html2/typing/activityOrder.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-3-snap.png => html2/typing/activityOrder.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-4-snap.png => html2/typing/activityOrder.html.snap-4.png} (100%) rename __tests__/{__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-5-snap.png => html2/typing/activityOrder.html.snap-5.png} (100%) rename __tests__/{html => html2}/typing/chunk.html (97%) rename __tests__/{__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-1-snap.png => html2/typing/chunk.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-2-snap.png => html2/typing/chunk.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-3-snap.png => html2/typing/chunk.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-4-snap.png => html2/typing/chunk.html.snap-4.png} (100%) rename __tests__/{html => html2}/typing/concludedLivestream.html (97%) rename __tests__/{__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-1-snap.png => html2/typing/concludedLivestream.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-2-snap.png => html2/typing/concludedLivestream.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-3-snap.png => html2/typing/concludedLivestream.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-4-snap.png => html2/typing/concludedLivestream.html.snap-4.png} (100%) rename __tests__/{html => html2}/typing/informative.html (98%) rename __tests__/{__image_snapshots__/html/informative-js-informative-typing-message-should-be-shown-as-typing-indicator-1-snap.png => html2/typing/informative.html.snap-1.png} (100%) rename __tests__/{html => html2}/typing/layout.html (97%) create mode 100644 __tests__/html2/typing/layout.html.snap-1.png create mode 100644 __tests__/html2/typing/layout.html.snap-2.png create mode 100644 __tests__/html2/typing/layout.html.snap-3.png rename __tests__/{html => html2}/typing/outOfOrder.html (98%) rename __tests__/{__image_snapshots__/html/out-of-order-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-in-its-original-order-1-snap.png => html2/typing/outOfOrder.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-in-its-original-order-2-snap.png => html2/typing/outOfOrder.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-in-its-original-order-3-snap.png => html2/typing/outOfOrder.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-in-its-original-order-4-snap.png => html2/typing/outOfOrder.html.snap-4.png} (100%) rename __tests__/{html => html2}/typing/outOfOrder.sequenceNumber.html (98%) rename __tests__/{__image_snapshots__/html/out-of-order-sequence-number-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-based-on-channel-data-sequence-number-1-snap.png => html2/typing/outOfOrder.sequenceNumber.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-sequence-number-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-based-on-channel-data-sequence-number-2-snap.png => html2/typing/outOfOrder.sequenceNumber.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-sequence-number-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-based-on-channel-data-sequence-number-3-snap.png => html2/typing/outOfOrder.sequenceNumber.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/out-of-order-sequence-number-js-bot-typing-message-in-out-of-order-fashion-should-sort-typing-activity-based-on-channel-data-sequence-number-4-snap.png => html2/typing/outOfOrder.sequenceNumber.html.snap-4.png} (100%) rename __tests__/{html => html2}/typing/perActivityStyleOptions.html (100%) rename __tests__/{html => html2}/typing/simultaneous.html (97%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-1-snap.png => html2/typing/simultaneous.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-2-snap.png => html2/typing/simultaneous.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-3-snap.png => html2/typing/simultaneous.html.snap-3.png} (100%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-4-snap.png => html2/typing/simultaneous.html.snap-4.png} (100%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-5-snap.png => html2/typing/simultaneous.html.snap-5.png} (100%) rename __tests__/{__image_snapshots__/html/simultaneous-js-bot-typing-multiple-messages-should-work-properly-6-snap.png => html2/typing/simultaneous.html.snap-6.png} (100%) rename __tests__/{html => html2}/typing/typingIndicator.shouldNotRevive.html (100%) diff --git a/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-1-snap.png b/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-1-snap.png deleted file mode 100644 index 9299540e8129c672b28417645a54333dd99121d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10801 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 diff --git a/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-2-snap.png b/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-2-snap.png deleted file mode 100644 index d73a87ed0d9b3d9644e6c1609b5efab79303a9c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9742 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 diff --git a/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-3-snap.png b/__tests__/__image_snapshots__/html/layout-js-livestreaming-should-layout-properly-3-snap.png deleted file mode 100644 index 172c91d0a3a6bb72a604542ce0f4bc03ecf3e3f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12267 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 { - test('should sort typing activity in its original order', () => runHTML('typing/activityOrder')); -}); diff --git a/__tests__/html/typing/chunk.js b/__tests__/html/typing/chunk.js deleted file mode 100644 index cb795c1f3b..0000000000 --- a/__tests__/html/typing/chunk.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot typing with chunks', () => { - test('should display partial message', () => runHTML('typing/chunk')); -}); diff --git a/__tests__/html/typing/concludedLivestream.js b/__tests__/html/typing/concludedLivestream.js deleted file mode 100644 index 2eff87886c..0000000000 --- a/__tests__/html/typing/concludedLivestream.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot reusing concluded livestream session ID', () => { - test('should be ignored', () => runHTML('typing/concludedLivestream')); -}); diff --git a/__tests__/html/typing/informative.js b/__tests__/html/typing/informative.js deleted file mode 100644 index 742379c45e..0000000000 --- a/__tests__/html/typing/informative.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('informative typing message', () => { - test('should be shown as typing indicator', () => runHTML('typing/informative')); -}); diff --git a/__tests__/html/typing/layout.js b/__tests__/html/typing/layout.js deleted file mode 100644 index 0c0f1677ff..0000000000 --- a/__tests__/html/typing/layout.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('Livestreaming', () => { - test('should layout properly', () => runHTML('typing/layout')); -}); diff --git a/__tests__/html/typing/outOfOrder.js b/__tests__/html/typing/outOfOrder.js deleted file mode 100644 index 5e5d8ab0f0..0000000000 --- a/__tests__/html/typing/outOfOrder.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot typing message in out-of-order fashion', () => { - test('should sort typing activity in its original order', () => runHTML('typing/outOfOrder')); -}); diff --git a/__tests__/html/typing/outOfOrder.sequenceNumber.js b/__tests__/html/typing/outOfOrder.sequenceNumber.js deleted file mode 100644 index ac2e421ac2..0000000000 --- a/__tests__/html/typing/outOfOrder.sequenceNumber.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot typing message in out-of-order fashion', () => { - test('should sort typing activity based on channelData.sequenceNumber', () => runHTML('typing/outOfOrder.sequenceNumber')); -}); diff --git a/__tests__/html/typing/perActivityStyleOptions.js b/__tests__/html/typing/perActivityStyleOptions.js deleted file mode 100644 index 2175f83b8f..0000000000 --- a/__tests__/html/typing/perActivityStyleOptions.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot typing message with a custom typing indicator in channelData', () => { - test('should only show/hide typing indicator accordingly', () => runHTML('typing/perActivityStyleOptions')); -}); diff --git a/__tests__/html/typing/simultaneous.js b/__tests__/html/typing/simultaneous.js deleted file mode 100644 index c467feadc0..0000000000 --- a/__tests__/html/typing/simultaneous.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('bot typing multiple messages', () => { - test('should work properly', () => runHTML('typing/simultaneous')); -}); diff --git a/__tests__/html/typing/typingIndicator.shouldNotRevive.js b/__tests__/html/typing/typingIndicator.shouldNotRevive.js deleted file mode 100644 index a506e9bf39..0000000000 --- a/__tests__/html/typing/typingIndicator.shouldNotRevive.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('expired typing indicator', () => { - test('should not revive when an OOO message is received', () => runHTML('typing/typingIndicator.shouldNotRevive')); -}); diff --git a/__tests__/html/typing/activityOrder.html b/__tests__/html2/typing/activityOrder.html similarity index 97% rename from __tests__/html/typing/activityOrder.html rename to __tests__/html2/typing/activityOrder.html index 6bff57fbd0..df1ef452d0 100644 --- a/__tests__/html/typing/activityOrder.html +++ b/__tests__/html2/typing/activityOrder.html @@ -79,7 +79,7 @@ 'Adipisicing cupidatat eu Lorem anim ut aute magna occaecat id cillum.' ); expect(pageElements.activityContents()[1]).toHaveProperty('textContent', 'A quick'); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 2 activity keys. expect(currentActivityKeysWithId).toEqual([ @@ -111,7 +111,7 @@ 'textContent', 'Amet consequat enim incididunt excepteur aliquip magna duis et tempor.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 3 activity keys only. expect(currentActivityKeysWithId).toEqual([ @@ -143,7 +143,7 @@ 'textContent', 'Amet consequat enim incididunt excepteur aliquip magna duis et tempor.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 3 activity keys only. expect(currentActivityKeysWithId).toEqual([ @@ -175,7 +175,7 @@ 'textContent', 'Amet consequat enim incididunt excepteur aliquip magna duis et tempor.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 3 activity keys only. expect(currentActivityKeysWithId).toEqual([ @@ -210,7 +210,7 @@ 'Amet consequat enim incididunt excepteur aliquip magna duis et tempor.' ); expect(pageElements.typingIndicator()).toBeFalsy(); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 3 activity keys. expect(currentActivityKeysWithId).toEqual([ diff --git a/__tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-1-snap.png b/__tests__/html2/typing/activityOrder.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-1-snap.png rename to __tests__/html2/typing/activityOrder.html.snap-1.png diff --git a/__tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-2-snap.png b/__tests__/html2/typing/activityOrder.html.snap-2.png similarity index 100% rename from __tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-2-snap.png rename to __tests__/html2/typing/activityOrder.html.snap-2.png diff --git a/__tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-3-snap.png b/__tests__/html2/typing/activityOrder.html.snap-3.png similarity index 100% rename from __tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-3-snap.png rename to __tests__/html2/typing/activityOrder.html.snap-3.png diff --git a/__tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-4-snap.png b/__tests__/html2/typing/activityOrder.html.snap-4.png similarity index 100% rename from __tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-4-snap.png rename to __tests__/html2/typing/activityOrder.html.snap-4.png diff --git a/__tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-5-snap.png b/__tests__/html2/typing/activityOrder.html.snap-5.png similarity index 100% rename from __tests__/__image_snapshots__/html/activity-order-js-bot-sending-multiple-messages-should-sort-typing-activity-in-its-original-order-5-snap.png rename to __tests__/html2/typing/activityOrder.html.snap-5.png diff --git a/__tests__/html/typing/chunk.html b/__tests__/html2/typing/chunk.html similarity index 97% rename from __tests__/html/typing/chunk.html rename to __tests__/html2/typing/chunk.html index 9c0d9040db..1939c4ed00 100644 --- a/__tests__/html/typing/chunk.html +++ b/__tests__/html2/typing/chunk.html @@ -79,7 +79,7 @@ 'Adipisicing cupidatat eu Lorem anim ut aute magna occaecat id cillum.' ); expect(pageElements.activityContents()[1]).toHaveProperty('textContent', 'A quick'); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 2 activity keys. expect(currentActivityKeysWithId).toEqual([ @@ -106,7 +106,7 @@ 'Adipisicing cupidatat eu Lorem anim ut aute magna occaecat id cillum.' ); expect(pageElements.activityContents()[1]).toHaveProperty('textContent', 'A quick brown fox'); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 2 activity keys only. expect(currentActivityKeysWithId).toEqual([ @@ -133,7 +133,7 @@ 'Adipisicing cupidatat eu Lorem anim ut aute magna occaecat id cillum.' ); expect(pageElements.activityContents()[1]).toHaveProperty('textContent', 'A quick brown fox jumped over'); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 2 activity keys. expect(currentActivityKeysWithId).toEqual([ @@ -161,7 +161,7 @@ 'textContent', 'A quick brown fox jumped over the lazy dogs.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 2 activity keys. expect(currentActivityKeysWithId).toEqual([ diff --git a/__tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-1-snap.png b/__tests__/html2/typing/chunk.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-1-snap.png rename to __tests__/html2/typing/chunk.html.snap-1.png diff --git a/__tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-2-snap.png b/__tests__/html2/typing/chunk.html.snap-2.png similarity index 100% rename from __tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-2-snap.png rename to __tests__/html2/typing/chunk.html.snap-2.png diff --git a/__tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-3-snap.png b/__tests__/html2/typing/chunk.html.snap-3.png similarity index 100% rename from __tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-3-snap.png rename to __tests__/html2/typing/chunk.html.snap-3.png diff --git a/__tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-4-snap.png b/__tests__/html2/typing/chunk.html.snap-4.png similarity index 100% rename from __tests__/__image_snapshots__/html/chunk-js-bot-typing-with-chunks-should-display-partial-message-4-snap.png rename to __tests__/html2/typing/chunk.html.snap-4.png diff --git a/__tests__/html/typing/concludedLivestream.html b/__tests__/html2/typing/concludedLivestream.html similarity index 97% rename from __tests__/html/typing/concludedLivestream.html rename to __tests__/html2/typing/concludedLivestream.html index 54f64681fc..bb87df41f3 100644 --- a/__tests__/html/typing/concludedLivestream.html +++ b/__tests__/html2/typing/concludedLivestream.html @@ -70,7 +70,7 @@ await pageConditions.numActivitiesShown(1); expect(pageElements.typingIndicator()).toBeFalsy(); expect(pageElements.activityContents()[0]).toHaveProperty('textContent', 'A quick'); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 1 activity key. expect(currentActivityKeysWithId).toEqual([[firstTypingActivityKey, ['t-00001']]]); @@ -104,7 +104,7 @@ 'textContent', 'A quick brown fox jumped over the lazy dogs.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 1 activity key only. expect(currentActivityKeysWithId).toEqual([[firstTypingActivityKey, ['t-00001', 't-00002']]]); @@ -133,7 +133,7 @@ 'textContent', 'A quick brown fox jumped over the lazy dogs.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 1 activity key associated with 2 activity IDs only. expect(currentActivityKeysWithId).toEqual([[firstTypingActivityKey, ['t-00001', 't-00002']]]); @@ -162,7 +162,7 @@ 'textContent', 'A quick brown fox jumped over the lazy dogs.' ); - await host.snapshot(); + await host.snapshot('local'); // THEN: Should have 1 activity key associated with 2 activity IDs only. expect(currentActivityKeysWithId).toEqual([[firstTypingActivityKey, ['t-00001', 't-00002']]]); diff --git a/__tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-1-snap.png b/__tests__/html2/typing/concludedLivestream.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-1-snap.png rename to __tests__/html2/typing/concludedLivestream.html.snap-1.png diff --git a/__tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-2-snap.png b/__tests__/html2/typing/concludedLivestream.html.snap-2.png similarity index 100% rename from __tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-2-snap.png rename to __tests__/html2/typing/concludedLivestream.html.snap-2.png diff --git a/__tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-3-snap.png b/__tests__/html2/typing/concludedLivestream.html.snap-3.png similarity index 100% rename from __tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-3-snap.png rename to __tests__/html2/typing/concludedLivestream.html.snap-3.png diff --git a/__tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-4-snap.png b/__tests__/html2/typing/concludedLivestream.html.snap-4.png similarity index 100% rename from __tests__/__image_snapshots__/html/concluded-livestream-js-bot-reusing-concluded-livestream-session-id-should-be-ignored-4-snap.png rename to __tests__/html2/typing/concludedLivestream.html.snap-4.png diff --git a/__tests__/html/typing/informative.html b/__tests__/html2/typing/informative.html similarity index 98% rename from __tests__/html/typing/informative.html rename to __tests__/html2/typing/informative.html index 351f13ca42..a16e1f93b8 100644 --- a/__tests__/html/typing/informative.html +++ b/__tests__/html2/typing/informative.html @@ -68,7 +68,7 @@ expect(pageElements.activityContents()[1]).toHaveProperty('textContent', 'Nisi elit quis nisi consectetur.'); await pageConditions.numActivitiesShown(2); - await host.snapshot(); + await host.snapshot('local'); }); diff --git a/__tests__/__image_snapshots__/html/informative-js-informative-typing-message-should-be-shown-as-typing-indicator-1-snap.png b/__tests__/html2/typing/informative.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/html/informative-js-informative-typing-message-should-be-shown-as-typing-indicator-1-snap.png rename to __tests__/html2/typing/informative.html.snap-1.png diff --git a/__tests__/html/typing/layout.html b/__tests__/html2/typing/layout.html similarity index 97% rename from __tests__/html/typing/layout.html rename to __tests__/html2/typing/layout.html index f8e81ef639..c15f62b759 100644 --- a/__tests__/html/typing/layout.html +++ b/__tests__/html2/typing/layout.html @@ -108,7 +108,7 @@ // THEN: Should show the informative message with blue bottom border. // THEN: Should not show typing indicator. - await host.snapshot(); + await host.snapshot('local'); // WHEN: Interim activity arrives. await directLine.emulateIncomingActivity({ @@ -137,7 +137,7 @@ // THEN: Should show the informative message with blue bottom border. // THEN: Should not show typing indicator. - await host.snapshot(); + await host.snapshot('local'); // WHEN: Final activity arrives. await directLine.emulateIncomingActivity({ @@ -165,7 +165,7 @@ // THEN: Should show the informative message with blue bottom border. // THEN: Should not show typing indicator. - await host.snapshot(); + await host.snapshot('local'); }); diff --git a/__tests__/html2/typing/layout.html.snap-1.png b/__tests__/html2/typing/layout.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8277f10c10c0c88b5850fcb1416f628fcb8afc0 GIT binary patch literal 10798 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 bkNL;4!~GhHR4lvziqh85yHcX|_r3oBHDs={ literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/layout.html.snap-2.png b/__tests__/html2/typing/layout.html.snap-2.png new file mode 100644 index 0000000000000000000000000000000000000000..da3fe3709a556266d13a9bb10d730e98332141b9 GIT binary patch literal 9742 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 I%D0~U2Nr;B+W-In literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/layout.html.snap-3.png b/__tests__/html2/typing/layout.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1264ce946499a777a78d00890503775183b8475 GIT binary patch literal 12264 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 Date: Tue, 25 Feb 2025 11:32:03 +0000 Subject: [PATCH 02/54] Support regretting a livestream --- __tests__/html2/typing/backtrackToEmpty.html | 266 ++++++++++++++++++ .../typing/backtrackToEmpty.html.snap-1.png | Bin 0 -> 8881 bytes .../typing/backtrackToEmpty.html.snap-2.png | Bin 0 -> 10393 bytes .../typing/backtrackToEmpty.html.snap-3.png | Bin 0 -> 11459 bytes .../typing/backtrackToEmpty.html.snap-4.png | Bin 0 -> 10393 bytes .../typing/backtrackToEmpty.html.snap-5.png | Bin 0 -> 8881 bytes .../typing/backtrackToEmpty.html.snap-6.png | Bin 0 -> 10026 bytes docs/LIVESTREAMING.md | 227 +++++++++------ .../decorator/private/ActivityDecorator.tsx | 4 +- .../ActivityKeyer/ActivityKeyerComposer.tsx | 18 +- .../ActivityTyping/ActivityTypingComposer.tsx | 4 +- .../Activity/createCoreMiddleware.tsx | 8 +- packages/core/src/types/WebChatActivity.ts | 4 +- .../getActivityLivestreamingMetadata.spec.ts | 37 ++- .../utils/getActivityLivestreamingMetadata.ts | 54 +++- 15 files changed, 499 insertions(+), 123 deletions(-) create mode 100644 __tests__/html2/typing/backtrackToEmpty.html create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-1.png create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-2.png create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-3.png create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-4.png create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-5.png create mode 100644 __tests__/html2/typing/backtrackToEmpty.html.snap-6.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html b/__tests__/html2/typing/backtrackToEmpty.html new file mode 100644 index 0000000000..c2a15520c8 --- /dev/null +++ b/__tests__/html2/typing/backtrackToEmpty.html @@ -0,0 +1,266 @@ + + + + + + + + + + + + +
+ + + diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-1.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d67efda15de8f9502af3b03d210a513004c0791 GIT binary patch literal 8881 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 NT0`$z@s(Q-{tMr(*t-A# literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-3.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e2bb27b1af6f663953fda4a63b64996223d4da GIT binary patch literal 11459 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 NT0`$z@s(Q-{tMr(*t-A# literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-5.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-5.png new file mode 100644 index 0000000000000000000000000000000000000000..6d67efda15de8f9502af3b03d210a513004c0791 GIT binary patch literal 8881 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 G{r>_Ml@I3t literal 0 HcmV?d00001 diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index 211830dd87..7c6b39371b 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -81,9 +81,9 @@ Then, send the following activity to start the livestream. Notes: -- `text` field is required but can be an empty string - - In this example, the bot is sending "A quick" as its being prepared by LLMs -- `type` field must be `typing` +- `text` field is required but can be an empty string + - In this example, the bot is sending "A quick" as its being prepared by LLMs +- `type` field must be `typing` After sending the activity, the bot must wait until the service will return the activity ID. This will be the session ID of the livestream. @@ -105,13 +105,13 @@ Subsequently, send the following interim activity. Notes: -- `channelData.streamId` field is the session ID, i.e. the activity ID of the first activity - - In this example, the first activity ID is assumed `"a-00001"` - - The session ID must be unique within the conversation -- `channelData.streamSequence` field should be incremented by 1 for every activity sent in the livestream -- `text` field should contains partial content from past interim activities - - `text` field in latter interim activities will replace `text` field in former interim activities - - Bot can use this capability to backtrack or erase response +- `channelData.streamId` field is the session ID, i.e. the activity ID of the first activity + - In this example, the first activity ID is assumed `"a-00001"` + - The session ID must be unique within the conversation +- `channelData.streamSequence` field should be incremented by 1 for every activity sent in the livestream +- `text` field should contains partial content from past interim activities + - `text` field in latter interim activities will replace `text` field in former interim activities + - Bot can use this capability to backtrack or erase response Bots can send as much interim activities as it needs. @@ -130,13 +130,13 @@ To conclude the livestream, send the following activity. Notes: -- `channelData.streamType` field is `final` -- `channelData.streamSequence` field should not be present, and assumed `Infinity` -- `text` field should contains the complete message -- `type` field must be `message` -- After the livestream has concluded, future activities for the livestream will be ignored -- This must not be the first activity in the livestream -- For best compatibility, do not send attachments or anything other than the `text` field +- `channelData.streamType` field is `final` +- `channelData.streamSequence` field should not be present, and assumed `Infinity` +- `text` field should contains the complete message +- `type` field must be `message` +- After the livestream has concluded, future activities for the livestream will be ignored +- This must not be the first activity in the livestream +- For best compatibility, do not send attachments or anything other than the `text` field ### Scenario 2: With informative message @@ -156,21 +156,67 @@ To send an [informative message](#informative-message), send the following activ Notes: -- `channelData.streamType` field is `informative` -- `text` field should describes how the bot is preparing the livestream -- `type` field must be `typing` -- The activity can be send as the first activity or interleaved with other interim activities - - Some clients may not show informative messages while interleaved with other interim activities - - For best compatibility, send informative messages before any other interim activities -- Latter informative messages will replace former informative messages +- `channelData.streamType` field is `informative` +- `text` field should describes how the bot is preparing the livestream +- `type` field must be `typing` +- The activity can be send as the first activity or interleaved with other interim activities + - Some clients may not show informative messages while interleaved with other interim activities + - For best compatibility, send informative messages before any other interim activities +- Latter informative messages will replace former informative messages + +### Scenario 3: Interim activities with no content + +> New since 2025-02-25. + +Interim activities can be empty. Web Chat will show typing indicator in lieu of message bubble. + +Empty interim activities can appear in all phase of a livestream, including: start, middle, and end of the livestream. + +```json +{ + "channelData": { + "streamSequence": 1, + "streamType": "streaming" + }, + "type": "typing" +} +``` + +Notes: + +- `text` field can be either unset or an empty string +- Web Chat will show a typing indicator + - The typing indicator will always appear until this livestream is concluded + +Interim activities can appear as the final activity of the livestream. Upon the conclusion of a livestream with an empty activity, Web Chat will remove the message bubble if it was previously shown. + +```json +{ + "channelData": { + "streamSequence": "a-00001", + "streamType": "final" + }, + "type": "typing" +} +``` + +Notes: + +- `text` field can be either unset or an empty string +- `type` should be `typing` + - In some systems, activities with `type` of `message` requires `text` field to also be set + - For best compatibility, we recommend setting the `type` to `typing` +- If message bubble was shown for this livestream, it will be removed + - Traditionally, no bubbles will show when activities do not have visible contents +- If typing indicator was shown for this livestream, it will be removed ## Supportability End-to-end support of livestreaming relies on the following components: -- [Bot code](#bot-code-support) -- [Channel](#channel-support) -- [Client](#client-support) +- [Bot code](#bot-code-support) +- [Channel](#channel-support) +- [Client](#client-support) ### Bot code support @@ -182,23 +228,23 @@ If you already have a Bot Framework bot, most existing Bot SDK versions support Channel support depends on the following factors: -- Channel must support typing activity -- Channel must return activity ID of the sent activity -- Proactive messaging is optional but highly recommended - - Enabling proactive messaging will prevent client timeouts which may occur while the bot is generating the response +- Channel must support typing activity +- Channel must return activity ID of the sent activity +- Proactive messaging is optional but highly recommended + - Enabling proactive messaging will prevent client timeouts which may occur while the bot is generating the response Known channels which supports livestreaming: -- Direct Line (Web Socket) -- Teams +- Direct Line (Web Socket) +- Teams Known channels which does not support livestreaming: -- Direct Line (REST): ignores typing activity -- Direct Line ASE: does not return activity ID -- Direct Line Speech: does not return activity ID -- Email: ignores typing activity -- SMS: ignores typing activity +- Direct Line (REST): ignores typing activity +- Direct Line ASE: does not return activity ID +- Direct Line Speech: does not return activity ID +- Email: ignores typing activity +- SMS: ignores typing activity ### Client support @@ -210,29 +256,29 @@ Web Chat introduced livestreaming support since version [4.17.0](../CHANGELOG.md #### Background -- Assumption: interim activities can be sent as frequently as every 10 ms (100 Hz) -- ABS is a distributed system and may receive bot activity in an out-of-order fashion - - Every interim activities could send to a different HTTP endpoints - - In a distributed environment, the time receiving the HTTP request could differs +- Assumption: interim activities can be sent as frequently as every 10 ms (100 Hz) +- ABS is a distributed system and may receive bot activity in an out-of-order fashion + - Every interim activities could send to a different HTTP endpoints + - In a distributed environment, the time receiving the HTTP request could differs #### Solutions -- `channelData.streamSequence` will be used to identify obsoleted (outdated) activities -- Once the livestream has concluded, all future activities should be ignored +- `channelData.streamSequence` will be used to identify obsoleted (outdated) activities +- Once the livestream has concluded, all future activities should be ignored ### Packet loss or join after livestream started #### Background -- Client may join the conversation after livestream started -- Some services may drop typing activities as it has a lower quality-of-service (QoS) priority +- Client may join the conversation after livestream started +- Some services may drop typing activities as it has a lower quality-of-service (QoS) priority #### Solutions -- Content in interim activities should be overlapping - - Former interim activities will be obsoleted by latter interim activities - - The latest round of interim activities is sufficient to catchup the livestream -- Side benefits: bot can backtrack and erase response +- Content in interim activities should be overlapping + - Former interim activities will be obsoleted by latter interim activities + - The latest round of interim activities is sufficient to catchup the livestream +- Side benefits: bot can backtrack and erase response Bottomline: we understand the bandwidth usage could be large. But the benefits outweighted the shortcomings. Transports are free to implement their own mechanisms to save bandwidth. @@ -240,81 +286,92 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o #### Background -- Reduce/eliminate the need to update existing channel/transport/service - - 3P channel devs may have existing channel adapter that could be impacted by livestreaming -- Resource-heavy channels should not handle livestream - - Livestream should be ignored by SMS channel and Direct Line (REST) channel -- Unsupported channels should ignore livestream +- Reduce/eliminate the need to update existing channel/transport/service + - 3P channel devs may have existing channel adapter that could be impacted by livestreaming +- Resource-heavy channels should not handle livestream + - Livestream should be ignored by SMS channel and Direct Line (REST) channel +- Unsupported channels should ignore livestream #### Solutions -- Typing activity is being used to send interim activities - - According to [Direct Line specification](https://github.com/Microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md#typing-activity): "Typing activities represent ongoing input from a user or a bot." - - We are leveraging existing typing activity to send interims, channel/transport/service would not need an update -- Typing activity is naturally ignored by SMS, email, and other plain text channels -- Direct Line (REST) is a resource-heavy channel and livestreaming should be ignored - - Typing activity is naturally ignored by Direct Line (REST) channel to save resources -- Final activity in the livestream is sent as a normal message activity - - Channels that does not support livestreaming will be able to handle the final activity -- Side benefits: bot do not need a major update to use the livestreaming feature +- Typing activity is being used to send interim activities + - According to [Direct Line specification](https://github.com/Microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md#typing-activity): "Typing activities represent ongoing input from a user or a bot." + - We are leveraging existing typing activity to send interims, channel/transport/service would not need an update +- Typing activity is naturally ignored by SMS, email, and other plain text channels +- Direct Line (REST) is a resource-heavy channel and livestreaming should be ignored + - Typing activity is naturally ignored by Direct Line (REST) channel to save resources +- Final activity in the livestream is sent as a normal message activity + - Channels that does not support livestreaming will be able to handle the final activity +- Side benefits: bot do not need a major update to use the livestreaming feature ### Guaranteed start of livestream #### Background -- Some services requires a very clear signal to start a livestream -- Out-of-order delivery could affect this start of livestream signal +- Some services requires a very clear signal to start a livestream +- Out-of-order delivery could affect this start of livestream signal #### Solutions -- Bot would need to wait until the service replies with an activity ID - - The response from the service is a clear signal that the service has created a livestream -- Side benefits: the activity ID is an opaque string and can be used as the session ID +- Bot would need to wait until the service replies with an activity ID + - The response from the service is a clear signal that the service has created a livestream +- Side benefits: the activity ID is an opaque string and can be used as the session ID ### Storing of interim activities #### Background -- Some services may need to store every interim activities being sent - - Service implementation which concatenate interim activities in an out-of-order fashion could be very complex +- Some services may need to store every interim activities being sent + - Service implementation which concatenate interim activities in an out-of-order fashion could be very complex #### Solutions -- Interim activities will send overlapping content - - Services would not need to concatenate content itself +- Interim activities will send overlapping content + - Services would not need to concatenate content itself ### No replay #### Background -- Restoring chat history should not replay the livestreaming - - The final activity should be displayed instantly, interim activities should be skipped +- Restoring chat history should not replay the livestreaming + - The final activity should be displayed instantly, interim activities should be skipped #### Solutions -- Typing activity for all activities during a livestream - - Direct Line channel saves chat history without typing activities +- Typing activity for all activities during a livestream + - Direct Line channel saves chat history without typing activities ### Text format change #### Background -- Text format could change during interim activities - - This could cause layout to change rapidly and degrade UX +- Text format could change during interim activities + - This could cause layout to change rapidly and degrade UX #### Solutions -- Text format is assumed to be Markdown during the livestream +- Text format is assumed to be Markdown during the livestream ### Adding attachments during livestream #### Background -- Some clients may have difficulties handling attachments during livestream +- Some clients may have difficulties handling attachments during livestream + +#### Solutions + +- As of this writing, no consensus has been reached on this issue + - "We don't want to show file attachments in interim activities." +- In the meanwhile, we are issuing best practices and discourage sending attachments in interim activities + - Bot should only send attachments in final activity + +### Concluding the livestream without content + +#### Background + +- Some bots may regret that they opened a livestream and prefer to conclude it without any contents +- Some systems requires `text` to be set to a non-empty string for activities with `type` of `activity` #### Solutions -- As of this writing, no consensus has been reached on this issue - - "We don't want to show file attachments in interim activities." -- In the meanwhile, we are issuing best practices and discourage sending attachments in interim activities - - Bot should only send attachments in final activity +- To conclude a livestream without any contents, send the final message with `type` set to `typing`, instead of `message` diff --git a/packages/api/src/decorator/private/ActivityDecorator.tsx b/packages/api/src/decorator/private/ActivityDecorator.tsx index 2662e45adf..63294621a3 100644 --- a/packages/api/src/decorator/private/ActivityDecorator.tsx +++ b/packages/api/src/decorator/private/ActivityDecorator.tsx @@ -21,7 +21,9 @@ function ActivityDecorator({ activity, children }: Readonly<{ activity?: WebChat ? 'preparing' : type === 'interim activity' ? 'ongoing' - : undefined, + : type === 'indicator only' + ? undefined // No bubble is shown for "indicator only" livestream, should not decorate. + : undefined, from: supportedActivityRoles.includes(activity?.from?.role) ? activity?.from?.role : undefined }; }, [activity]); diff --git a/packages/api/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx b/packages/api/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx index dc74afed28..a6724c246f 100644 --- a/packages/api/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx +++ b/packages/api/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx @@ -1,4 +1,4 @@ -import type { WebChatActivity } from 'botframework-webchat-core'; +import { getActivityLivestreamingMetadata, type WebChatActivity } from 'botframework-webchat-core'; import React, { useCallback, useMemo, useRef, type ReactNode } from 'react'; import reduceIterable from '../../hooks/private/reduceIterable'; @@ -17,20 +17,6 @@ type ActivityToKeyMap = Map; type ClientActivityIdToKeyMap = Map; type KeyToActivitiesMap = Map; -function getTypingActivityId(activity: WebChatActivity): string | undefined { - const { type } = activity; - - if ( - (type === 'message' || type === 'typing') && - 'text' in activity && - typeof activity.text === 'string' && - 'streamId' in activity.channelData && - activity.channelData.streamId - ) { - return activity.channelData.streamId; - } -} - /** * React context composer component to assign a perma-key to every activity. * This will support both `useGetActivityByKey` and `useGetKeyByActivity` custom hooks. @@ -72,7 +58,7 @@ const ActivityKeyerComposer = ({ children }: Readonly<{ children?: ReactNode | u activities.forEach(activity => { const activityId = getActivityId(activity); const clientActivityId = getClientActivityId(activity); - const typingActivityId = getTypingActivityId(activity); + const typingActivityId = getActivityLivestreamingMetadata(activity)?.sessionId; const key = (clientActivityId && diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index e8408e0edb..cc2b4f2139 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -40,7 +40,7 @@ const ActivityTypingComposer = ({ children }: Props) => { const livestreamingMetadata = getActivityLivestreamingMetadata(activity); - if (type === 'message' || livestreamingMetadata?.type === 'final activity') { + if (livestreamingMetadata?.type === 'final activity') { nextTyping.delete(id); changed = true; } else if (type === 'typing' && (role === 'bot' || role === 'user')) { @@ -56,7 +56,7 @@ const ActivityTypingComposer = ({ children }: Props) => { lastReceivedAt: receivedAt, name: from.name, role, - type: livestreamingMetadata ? 'livestream' : 'busy' + type: livestreamingMetadata && livestreamingMetadata.type !== 'indicator only' ? 'livestream' : 'busy' }); changed = true; diff --git a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx index ca3e01002b..ffec259198 100644 --- a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx +++ b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx @@ -1,7 +1,7 @@ import { ActivityMiddleware } from 'botframework-webchat-api'; +import { getActivityLivestreamingMetadata } from 'botframework-webchat-core'; import React from 'react'; -import { getActivityLivestreamingMetadata } from 'botframework-webchat-core'; import CarouselLayout from '../../Activity/CarouselLayout'; import StackedLayout from '../../Activity/StackedLayout'; @@ -21,8 +21,10 @@ export default function createCoreMiddleware(): ActivityMiddleware[] { type === 'conversationUpdate' || type === 'event' || type === 'invoke' || - // Do not show typing indicator except when it is livestreaming session - (type === 'typing' && !getActivityLivestreamingMetadata(activity)) || + // Do not show livestream interims of "indicator only", or + // livestream interims without content (i.e. finalized activity without content.) + (type === 'typing' && + (getActivityLivestreamingMetadata(activity).type === 'indicator only' || !activity['text'])) || (type === 'message' && // Do not show postback (activity.channelData?.postBack || diff --git a/packages/core/src/types/WebChatActivity.ts b/packages/core/src/types/WebChatActivity.ts index b3d19bb8f7..9900ec0ee0 100644 --- a/packages/core/src/types/WebChatActivity.ts +++ b/packages/core/src/types/WebChatActivity.ts @@ -175,9 +175,9 @@ type TypingActivityEssence = channelData: { streamId?: string | undefined; streamSequence: number; - streamType: 'informative' | 'streaming'; + streamType: 'informative' | 'streaming' | 'final'; }; - text: string; + text?: string | undefined; type: 'typing'; }; diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts index 739b1cac50..4b7e77b084 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts @@ -13,7 +13,7 @@ describe.each([['with "streamId"' as const], ['without "streamId"' as const]])(' streamType: 'streaming' }, id: 'a-00002', - text: '', + text: 'Hello, World!', type: 'typing' } as any; }); @@ -43,7 +43,7 @@ describe.each([['with "streamId"' as const], ['without "streamId"' as const]])(' streamType: 'informative' }, id: 'a-00002', - text: '', + text: 'Hello, World!', type: 'typing' } as any; }); @@ -72,7 +72,7 @@ describe.each([['with "streamId"' as const], ['without "streamId"' as const]])(' streamType: 'final' }, id: 'a-00002', - text: '', + text: 'Hello, World!', type: 'message' } as any; }); @@ -122,12 +122,33 @@ describe.each([ } }); -test('activity with "streamType" of "final" but "type" of "typing" should return undefined', () => +describe('"typing" activity with "streamType" of "final"', () => { + test('should return undefined if "text" field is defined', () => + expect( + getActivityLivestreamingMetadata({ + channelData: { streamId: 'a-00001', streamType: 'final' }, + id: 'a-00002', + text: 'Final "typing" activity, must not have "text".', + type: 'typing' + } as any) + ).toBeUndefined()); + + test('should return truthy if "text" field is not defined', () => + expect( + getActivityLivestreamingMetadata({ + channelData: { streamId: 'a-00001', streamType: 'final' }, + id: 'a-00002', + // Final activity can be "typing" if it does not have "text". + type: 'typing' + } as any) + ).toHaveProperty('type', 'final activity')); +}); + +test('activity with "streamType" of "streaming" without "content" should return type of "interim activity"', () => expect( getActivityLivestreamingMetadata({ - channelData: { streamType: 'final' }, - text: '', - // Final activity must be "message", not "typing". + channelData: { streamSequence: 1, streamType: 'streaming' }, + id: 'a-00001', type: 'typing' } as any) - ).toBeUndefined()); + ).toHaveProperty('type', 'indicator only')); diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.ts index cfa40ae099..8fc2f8e6d4 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.ts @@ -1,30 +1,67 @@ -import { integer, literal, minValue, number, object, optional, pipe, safeParse, string, union } from 'valibot'; +import { + integer, + literal, + minValue, + nonEmpty, + number, + object, + optional, + pipe, + safeParse, + string, + union +} from 'valibot'; import { type WebChatActivity } from '../types/WebChatActivity'; const streamSequenceSchema = pipe(number(), integer(), minValue(1)); const livestreamingActivitySchema = union([ + // Interim can have optional "text". object({ channelData: object({ // "streamId" is optional for the very first activity in the session. streamId: optional(string()), streamSequence: streamSequenceSchema, - streamType: union([literal('informative'), literal('streaming')]) + streamType: literal('streaming') + }), + id: string(), + text: optional(string()), + type: literal('typing') + }), + // Informative must have a "text". + object({ + channelData: object({ + // "streamId" is optional for the very first activity in the session. + streamId: optional(string()), + streamSequence: streamSequenceSchema, + streamType: literal('informative') }), id: string(), text: string(), type: literal('typing') }), + // Final with a message. object({ channelData: object({ // "streamId" is required for the final activity in the session. The final activity must not be the sole activity in the session. - streamId: string(), + streamId: pipe(string(), nonEmpty()), streamType: literal('final') }), id: string(), text: string(), type: literal('message') + }), + // Final without a message. + object({ + channelData: object({ + // "streamId" is required for the final activity in the session. The final activity must not be the sole activity in the session. + streamId: pipe(string(), nonEmpty()), + streamType: literal('final') + }), + id: string(), + text: optional(literal('')), // "text" field must be empty or undefined. + type: literal('typing') }) ]); @@ -34,7 +71,8 @@ const livestreamingActivitySchema = union([ * - `sessionId` - ID of the livestreaming session * - `sequenceNumber` - sequence number of the activity * - `type` - * - `"interim activity"` - current response, could be empty, partial-from-start, or complete response. + * - `"indicator only"` - ongoing but empty response, should show indicator only + * - `"interim activity"` - current response, could be partial-from-start, or complete response. * More activities are expected. Future interim activities always replace past interim activities, enable erasing or backtracking response. * - `"informative message"` - optional side-channel informative message describing the current response, e.g. "Searching your document library". * Always replace past informative messages. May interleave with interim activities. @@ -48,7 +86,7 @@ export default function getActivityLivestreamingMetadata(activity: WebChatActivi | Readonly<{ sessionId: string; sequenceNumber: number; - type: 'final activity' | 'informative message' | 'interim activity'; + type: 'final activity' | 'informative message' | 'interim activity' | 'indicator only'; }> | undefined { const result = safeParse(livestreamingActivitySchema, activity); @@ -69,7 +107,11 @@ export default function getActivityLivestreamingMetadata(activity: WebChatActivi : { sequenceNumber: output.channelData.streamSequence, sessionId, - type: output.channelData.streamType === 'informative' ? 'informative message' : 'interim activity' + type: !output.text + ? 'indicator only' + : output.channelData.streamType === 'informative' + ? 'informative message' + : 'interim activity' } ); } From 2dafb36a5bb6b437128dd106e843eefeb8032484 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 25 Feb 2025 11:41:39 +0000 Subject: [PATCH 03/54] More comments --- __tests__/html2/typing/backtrackToEmpty.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/__tests__/html2/typing/backtrackToEmpty.html b/__tests__/html2/typing/backtrackToEmpty.html index c2a15520c8..cd0a462737 100644 --- a/__tests__/html2/typing/backtrackToEmpty.html +++ b/__tests__/html2/typing/backtrackToEmpty.html @@ -127,6 +127,10 @@ // TBD: Add more tests. Having a normal typing indicator, while having a livestream-based typing indicator, the typing indicator must be kept // TBD: Add more tests. Concluding a livestream with "message" activity with empty "text" field. + // TBD: Add more tests. 2 simultaneous livestream is ongoing. One is empty, one is contentful. + // - While both is going, it should not show typing indicator + // - When the contentful livestream concluded, it should show the typing indicator + // - In other words, typing indicator is the "last resort" to show the bot is progressing // --- From 10529afd9672a747c996bde50248b88880ee88f0 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 4 Mar 2025 20:10:44 +0000 Subject: [PATCH 04/54] Move to another folder --- .../{typing => livestream}/backtrackToEmpty.html | 0 .../backtrackToEmpty.html.snap-1.png | Bin .../backtrackToEmpty.html.snap-2.png | Bin .../backtrackToEmpty.html.snap-3.png | Bin .../backtrackToEmpty.html.snap-4.png | Bin .../backtrackToEmpty.html.snap-5.png | Bin .../backtrackToEmpty.html.snap-6.png | Bin 7 files changed, 0 insertions(+), 0 deletions(-) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-5.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-6.png (100%) diff --git a/__tests__/html2/typing/backtrackToEmpty.html b/__tests__/html2/livestream/backtrackToEmpty.html similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html rename to __tests__/html2/livestream/backtrackToEmpty.html diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-1.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-1.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-1.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-2.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-2.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-2.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-3.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-3.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-3.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-4.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-4.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-4.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-5.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-5.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-5.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-5.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-6.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-6.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-6.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-6.png From 1147bc65b04168b9d34f85add5f093d3ce8be273 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 06:00:43 +0000 Subject: [PATCH 05/54] Add livestream with attachments test --- .../backtrackToEmpty.html | 0 .../backtrackToEmpty.html.snap-1.png | Bin .../backtrackToEmpty.html.snap-2.png | Bin .../backtrackToEmpty.html.snap-3.png | Bin .../backtrackToEmpty.html.snap-4.png | Bin .../backtrackToEmpty.html.snap-5.png | Bin .../backtrackToEmpty.html.snap-6.png | Bin .../batchedActivities.html | 0 .../batchedActivities.html.snap-1.png | Bin .../typing/withAttachment.carouselLayout.html | 9 + __tests__/html2/typing/withAttachment.html | 159 ++++++++++++++++++ .../component/src/Activity/StackedLayout.tsx | 10 +- .../Activity/createCoreMiddleware.tsx | 7 +- packages/core/src/types/WebChatActivity.ts | 5 + .../src/globals/pageElements/activities.js | 2 +- .../pageElements/activityAttachments.js | 9 + .../src/globals/pageElements/index.js | 2 + 17 files changed, 192 insertions(+), 11 deletions(-) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-1.png (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-2.png (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-3.png (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-4.png (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-5.png (100%) rename __tests__/html2/{livestream => typing}/backtrackToEmpty.html.snap-6.png (100%) rename __tests__/html2/{livestream => typing}/batchedActivities.html (100%) rename __tests__/html2/{livestream => typing}/batchedActivities.html.snap-1.png (100%) create mode 100644 __tests__/html2/typing/withAttachment.carouselLayout.html create mode 100644 __tests__/html2/typing/withAttachment.html create mode 100644 packages/test/page-object/src/globals/pageElements/activityAttachments.js diff --git a/__tests__/html2/livestream/backtrackToEmpty.html b/__tests__/html2/typing/backtrackToEmpty.html similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html rename to __tests__/html2/typing/backtrackToEmpty.html diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-1.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-1.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-1.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-1.png diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-2.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-2.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-2.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-2.png diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-3.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-3.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-3.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-3.png diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-4.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-4.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-4.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-4.png diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-5.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-5.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-5.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-5.png diff --git a/__tests__/html2/livestream/backtrackToEmpty.html.snap-6.png b/__tests__/html2/typing/backtrackToEmpty.html.snap-6.png similarity index 100% rename from __tests__/html2/livestream/backtrackToEmpty.html.snap-6.png rename to __tests__/html2/typing/backtrackToEmpty.html.snap-6.png diff --git a/__tests__/html2/livestream/batchedActivities.html b/__tests__/html2/typing/batchedActivities.html similarity index 100% rename from __tests__/html2/livestream/batchedActivities.html rename to __tests__/html2/typing/batchedActivities.html diff --git a/__tests__/html2/livestream/batchedActivities.html.snap-1.png b/__tests__/html2/typing/batchedActivities.html.snap-1.png similarity index 100% rename from __tests__/html2/livestream/batchedActivities.html.snap-1.png rename to __tests__/html2/typing/batchedActivities.html.snap-1.png diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html b/__tests__/html2/typing/withAttachment.carouselLayout.html new file mode 100644 index 0000000000..8384053e03 --- /dev/null +++ b/__tests__/html2/typing/withAttachment.carouselLayout.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/html2/typing/withAttachment.html b/__tests__/html2/typing/withAttachment.html new file mode 100644 index 0000000000..a8070c682a --- /dev/null +++ b/__tests__/html2/typing/withAttachment.html @@ -0,0 +1,159 @@ + + + + + + + + + + + +
+ + + + diff --git a/packages/component/src/Activity/StackedLayout.tsx b/packages/component/src/Activity/StackedLayout.tsx index 66591c34ad..7f91b43b4b 100644 --- a/packages/component/src/Activity/StackedLayout.tsx +++ b/packages/component/src/Activity/StackedLayout.tsx @@ -8,9 +8,9 @@ import React, { memo } from 'react'; import ScreenReaderText from '../ScreenReaderText'; import isZeroOrPositive from '../Utils/isZeroOrPositive'; import textFormatToContentType from '../Utils/textFormatToContentType'; -import useStyleSet from '../hooks/useStyleSet'; import { useStyleToEmotionObject } from '../hooks/internal/styleToEmotionObject'; import useUniqueId from '../hooks/internal/useUniqueId'; +import useStyleSet from '../hooks/useStyleSet'; import Bubble from './Bubble'; import type { RenderAttachment } from 'botframework-webchat-api'; @@ -95,14 +95,14 @@ const StackedLayout = ({ const { bubbleNubOffset, bubbleNubSize, bubbleFromUserNubOffset, bubbleFromUserNubSize } = styleOptions; - const isMessage = activity.type === 'message'; + const isMessageOrTyping = activity.type === 'message' || activity.type === 'typing'; - const attachments = (isMessage && activity.attachments) || []; + const attachments = (isMessageOrTyping && activity.attachments) || []; const fromUser = activity.from.role === 'user'; - const messageBackDisplayText: string = (isMessage && activity.channelData?.messageBack?.displayText) || ''; + const messageBackDisplayText: string = (isMessageOrTyping && activity.channelData?.messageBack?.displayText) || ''; const isLivestreaming = !!getActivityLivestreamingMetadata(activity); - const activityDisplayText = isMessage + const activityDisplayText = isMessageOrTyping ? messageBackDisplayText || activity.text : isLivestreaming && 'text' in activity ? activity.text diff --git a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx index ffec259198..80036e763d 100644 --- a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx +++ b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx @@ -35,11 +35,8 @@ export default function createCoreMiddleware(): ActivityMiddleware[] { ) { return false; } else if (type === 'message' || type === 'typing') { - if ( - type === 'message' && - (activity.attachments?.length || 0) > 1 && - activity.attachmentLayout === 'carousel' - ) { + // TODO: Add tests for "typing indicator only in attachmentLayout of carousel". + if ((activity.attachments?.length || 0) > 1 && activity.attachmentLayout === 'carousel') { // The following line is not a React functional component, it's a render function called by useCreateActivityRenderer() hook. // The function signature need to be compatible with older version of activity middleware, which was: // diff --git a/packages/core/src/types/WebChatActivity.ts b/packages/core/src/types/WebChatActivity.ts index 9900ec0ee0..4575569e7b 100644 --- a/packages/core/src/types/WebChatActivity.ts +++ b/packages/core/src/types/WebChatActivity.ts @@ -169,9 +169,14 @@ type MessageActivityEssence = { // https://github.com/Microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md#typing-activity type TypingActivityEssence = | { + attachmentLayout?: 'carousel' | 'stacked'; + attachments?: DirectLineAttachment[]; + text?: undefined; type: 'typing'; } | { + attachmentLayout?: 'carousel' | 'stacked'; + attachments?: DirectLineAttachment[]; channelData: { streamId?: string | undefined; streamSequence: number; diff --git a/packages/test/page-object/src/globals/pageElements/activities.js b/packages/test/page-object/src/globals/pageElements/activities.js index ddf400d559..888c8674c0 100644 --- a/packages/test/page-object/src/globals/pageElements/activities.js +++ b/packages/test/page-object/src/globals/pageElements/activities.js @@ -1,5 +1,5 @@ import transcript from './transcript'; export default function activities() { - return transcript().querySelectorAll('.webchat__basic-transcript__activity'); + return Object.freeze(Array.from(transcript()?.querySelectorAll('.webchat__basic-transcript__activity') || [])); } diff --git a/packages/test/page-object/src/globals/pageElements/activityAttachments.js b/packages/test/page-object/src/globals/pageElements/activityAttachments.js new file mode 100644 index 0000000000..0b8c8bdb7e --- /dev/null +++ b/packages/test/page-object/src/globals/pageElements/activityAttachments.js @@ -0,0 +1,9 @@ +import activities from './activities'; + +export default function getActivityAttachments() { + return Object.freeze( + activities().map(element => + Object.freeze(Array.from(element.querySelectorAll('[aria-roledescription="attachment"]'))) + ) + ); +} diff --git a/packages/test/page-object/src/globals/pageElements/index.js b/packages/test/page-object/src/globals/pageElements/index.js index 83ea7e8a8c..f4eec34f6b 100644 --- a/packages/test/page-object/src/globals/pageElements/index.js +++ b/packages/test/page-object/src/globals/pageElements/index.js @@ -1,6 +1,7 @@ import activeActivity from './activeActivity'; import activities from './activities'; import activityActiveDescendantLabels from './activityActiveDescendantLabels'; +import activityAttachments from './activityAttachments'; import activityContents from './activityContents'; import activityStatuses from './activityStatuses'; import byTestId from './byTestId'; @@ -27,6 +28,7 @@ export { activeActivity, activities, activityActiveDescendantLabels, + activityAttachments, activityContents, activityStatuses, byTestId, From cb2548ce7dea349cacf3d681eb4b347d79513aa7 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 06:02:07 +0000 Subject: [PATCH 06/54] Add screenshots --- ...ithAttachment.carouselLayout.html.snap-1.png | Bin 0 -> 10350 bytes ...ithAttachment.carouselLayout.html.snap-2.png | Bin 0 -> 12808 bytes ...ithAttachment.carouselLayout.html.snap-3.png | Bin 0 -> 13167 bytes .../html2/typing/withAttachment.html.snap-1.png | Bin 0 -> 10350 bytes .../html2/typing/withAttachment.html.snap-2.png | Bin 0 -> 13744 bytes .../html2/typing/withAttachment.html.snap-3.png | Bin 0 -> 13167 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 __tests__/html2/typing/withAttachment.carouselLayout.html.snap-1.png create mode 100644 __tests__/html2/typing/withAttachment.carouselLayout.html.snap-2.png create mode 100644 __tests__/html2/typing/withAttachment.carouselLayout.html.snap-3.png create mode 100644 __tests__/html2/typing/withAttachment.html.snap-1.png create mode 100644 __tests__/html2/typing/withAttachment.html.snap-2.png create mode 100644 __tests__/html2/typing/withAttachment.html.snap-3.png diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-1.png b/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..450f5055756a128076d088eee46241aa6c6226a3 GIT binary patch literal 10350 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-3.png b/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb GIT binary patch literal 13167 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/typing/withAttachment.html.snap-3.png b/__tests__/html2/typing/withAttachment.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb GIT binary patch literal 13167 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 Date: Wed, 5 Mar 2025 10:50:33 +0000 Subject: [PATCH 07/54] Fix tests --- .../html2/{typing => livestream}/activityOrder.html | 2 +- .../activityOrder.html.snap-1.png | Bin .../activityOrder.html.snap-2.png | Bin .../activityOrder.html.snap-3.png | Bin .../activityOrder.html.snap-4.png | Bin .../activityOrder.html.snap-5.png | Bin .../{typing => livestream}/backtrackToEmpty.html | 1 - .../backtrackToEmpty.html.snap-1.png | Bin .../backtrackToEmpty.html.snap-2.png | Bin .../backtrackToEmpty.html.snap-3.png | Bin .../backtrackToEmpty.html.snap-4.png | Bin .../backtrackToEmpty.html.snap-5.png | Bin .../backtrackToEmpty.html.snap-6.png | Bin __tests__/html2/{typing => livestream}/chunk.html | 2 +- .../{typing => livestream}/chunk.html.snap-1.png | Bin .../{typing => livestream}/chunk.html.snap-2.png | Bin .../{typing => livestream}/chunk.html.snap-3.png | Bin .../{typing => livestream}/chunk.html.snap-4.png | Bin .../{typing => livestream}/concludedLivestream.html | 0 .../concludedLivestream.html.snap-1.png | Bin .../concludedLivestream.html.snap-2.png | Bin .../concludedLivestream.html.snap-3.png | Bin .../concludedLivestream.html.snap-4.png | Bin .../html2/{typing => livestream}/informative.html | 0 .../informative.html.snap-1.png | Bin __tests__/html2/{typing => livestream}/layout.html | 0 .../{typing => livestream}/layout.html.snap-1.png | Bin .../{typing => livestream}/layout.html.snap-2.png | Bin .../{typing => livestream}/layout.html.snap-3.png | Bin .../html2/{typing => livestream}/outOfOrder.html | 2 +- .../outOfOrder.html.snap-1.png | Bin .../outOfOrder.html.snap-2.png | Bin .../outOfOrder.html.snap-3.png | Bin .../outOfOrder.html.snap-4.png | Bin .../outOfOrder.sequenceNumber.html | 2 +- .../outOfOrder.sequenceNumber.html.snap-1.png | Bin .../outOfOrder.sequenceNumber.html.snap-2.png | Bin .../outOfOrder.sequenceNumber.html.snap-3.png | Bin .../outOfOrder.sequenceNumber.html.snap-4.png | Bin .../html2/{typing => livestream}/simultaneous.html | 4 ++-- .../simultaneous.html.snap-1.png | Bin .../simultaneous.html.snap-2.png | Bin .../simultaneous.html.snap-3.png | Bin .../simultaneous.html.snap-4.png | Bin .../simultaneous.html.snap-5.png | Bin .../simultaneous.html.snap-6.png | Bin .../withAttachment.carouselLayout.html | 0 .../withAttachment.carouselLayout.html.snap-1.png | Bin .../withAttachment.carouselLayout.html.snap-2.png | Bin .../withAttachment.carouselLayout.html.snap-3.png | Bin .../{typing => livestream}/withAttachment.html | 0 .../withAttachment.html.snap-1.png | Bin .../withAttachment.html.snap-2.png | Bin .../withAttachment.html.snap-3.png | Bin .../Middleware/Activity/createCoreMiddleware.tsx | 2 +- 55 files changed, 7 insertions(+), 8 deletions(-) rename __tests__/html2/{typing => livestream}/activityOrder.html (99%) rename __tests__/html2/{typing => livestream}/activityOrder.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/activityOrder.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/activityOrder.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/activityOrder.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/activityOrder.html.snap-5.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html (99%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-5.png (100%) rename __tests__/html2/{typing => livestream}/backtrackToEmpty.html.snap-6.png (100%) rename __tests__/html2/{typing => livestream}/chunk.html (99%) rename __tests__/html2/{typing => livestream}/chunk.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/chunk.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/chunk.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/chunk.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/concludedLivestream.html (100%) rename __tests__/html2/{typing => livestream}/concludedLivestream.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/concludedLivestream.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/concludedLivestream.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/concludedLivestream.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/informative.html (100%) rename __tests__/html2/{typing => livestream}/informative.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/layout.html (100%) rename __tests__/html2/{typing => livestream}/layout.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/layout.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/layout.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.html (99%) rename __tests__/html2/{typing => livestream}/outOfOrder.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.sequenceNumber.html (99%) rename __tests__/html2/{typing => livestream}/outOfOrder.sequenceNumber.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.sequenceNumber.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.sequenceNumber.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/outOfOrder.sequenceNumber.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html (98%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-4.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-5.png (100%) rename __tests__/html2/{typing => livestream}/simultaneous.html.snap-6.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.carouselLayout.html (100%) rename __tests__/html2/{typing => livestream}/withAttachment.carouselLayout.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.carouselLayout.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.carouselLayout.html.snap-3.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.html (100%) rename __tests__/html2/{typing => livestream}/withAttachment.html.snap-1.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.html.snap-2.png (100%) rename __tests__/html2/{typing => livestream}/withAttachment.html.snap-3.png (100%) diff --git a/__tests__/html2/typing/activityOrder.html b/__tests__/html2/livestream/activityOrder.html similarity index 99% rename from __tests__/html2/typing/activityOrder.html rename to __tests__/html2/livestream/activityOrder.html index df1ef452d0..7444577eec 100644 --- a/__tests__/html2/typing/activityOrder.html +++ b/__tests__/html2/livestream/activityOrder.html @@ -188,7 +188,7 @@ // WHEN: Bot finished typing the message. await directLine.emulateIncomingActivity({ - channelData: { streamId: firstTypingActivityId, streamSequence: 4, streamType: 'streaming' }, + channelData: { streamId: firstTypingActivityId, streamType: 'final' }, from: { id: 'u-00001', name: 'Bot', role: 'bot' }, id: 'a-00002', text: 'A quick brown fox jumped over the lazy dogs.', diff --git a/__tests__/html2/typing/activityOrder.html.snap-1.png b/__tests__/html2/livestream/activityOrder.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/activityOrder.html.snap-1.png rename to __tests__/html2/livestream/activityOrder.html.snap-1.png diff --git a/__tests__/html2/typing/activityOrder.html.snap-2.png b/__tests__/html2/livestream/activityOrder.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/activityOrder.html.snap-2.png rename to __tests__/html2/livestream/activityOrder.html.snap-2.png diff --git a/__tests__/html2/typing/activityOrder.html.snap-3.png b/__tests__/html2/livestream/activityOrder.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/activityOrder.html.snap-3.png rename to __tests__/html2/livestream/activityOrder.html.snap-3.png diff --git a/__tests__/html2/typing/activityOrder.html.snap-4.png b/__tests__/html2/livestream/activityOrder.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/activityOrder.html.snap-4.png rename to __tests__/html2/livestream/activityOrder.html.snap-4.png diff --git a/__tests__/html2/typing/activityOrder.html.snap-5.png b/__tests__/html2/livestream/activityOrder.html.snap-5.png similarity index 100% rename from __tests__/html2/typing/activityOrder.html.snap-5.png rename to __tests__/html2/livestream/activityOrder.html.snap-5.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html b/__tests__/html2/livestream/backtrackToEmpty.html similarity index 99% rename from __tests__/html2/typing/backtrackToEmpty.html rename to __tests__/html2/livestream/backtrackToEmpty.html index cd0a462737..8b97e4a489 100644 --- a/__tests__/html2/typing/backtrackToEmpty.html +++ b/__tests__/html2/livestream/backtrackToEmpty.html @@ -135,7 +135,6 @@ // --- // WHEN: Bot is typing a message. - await directLine.emulateIncomingActivity({ channelData: { streamId: 't-00001', streamSequence: 2, streamType: 'streaming' }, from: { id: 'u-00001', name: 'Bot', role: 'bot' }, diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-1.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-1.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-1.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-2.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-2.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-2.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-3.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-3.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-3.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-4.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-4.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-4.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-5.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-5.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-5.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-5.png diff --git a/__tests__/html2/typing/backtrackToEmpty.html.snap-6.png b/__tests__/html2/livestream/backtrackToEmpty.html.snap-6.png similarity index 100% rename from __tests__/html2/typing/backtrackToEmpty.html.snap-6.png rename to __tests__/html2/livestream/backtrackToEmpty.html.snap-6.png diff --git a/__tests__/html2/typing/chunk.html b/__tests__/html2/livestream/chunk.html similarity index 99% rename from __tests__/html2/typing/chunk.html rename to __tests__/html2/livestream/chunk.html index 1939c4ed00..eafd7bbf61 100644 --- a/__tests__/html2/typing/chunk.html +++ b/__tests__/html2/livestream/chunk.html @@ -143,7 +143,7 @@ // WHEN: Bot finished typing the message. await directLine.emulateIncomingActivity({ - channelData: { streamId: firstTypingActivityId, streamSequence: 4, streamType: 'streaming' }, + channelData: { streamId: firstTypingActivityId, streamType: 'final' }, from: { id: 'u-00001', name: 'Bot', role: 'bot' }, id: 'a-00002', text: 'A quick brown fox jumped over the lazy dogs.', diff --git a/__tests__/html2/typing/chunk.html.snap-1.png b/__tests__/html2/livestream/chunk.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/chunk.html.snap-1.png rename to __tests__/html2/livestream/chunk.html.snap-1.png diff --git a/__tests__/html2/typing/chunk.html.snap-2.png b/__tests__/html2/livestream/chunk.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/chunk.html.snap-2.png rename to __tests__/html2/livestream/chunk.html.snap-2.png diff --git a/__tests__/html2/typing/chunk.html.snap-3.png b/__tests__/html2/livestream/chunk.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/chunk.html.snap-3.png rename to __tests__/html2/livestream/chunk.html.snap-3.png diff --git a/__tests__/html2/typing/chunk.html.snap-4.png b/__tests__/html2/livestream/chunk.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/chunk.html.snap-4.png rename to __tests__/html2/livestream/chunk.html.snap-4.png diff --git a/__tests__/html2/typing/concludedLivestream.html b/__tests__/html2/livestream/concludedLivestream.html similarity index 100% rename from __tests__/html2/typing/concludedLivestream.html rename to __tests__/html2/livestream/concludedLivestream.html diff --git a/__tests__/html2/typing/concludedLivestream.html.snap-1.png b/__tests__/html2/livestream/concludedLivestream.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/concludedLivestream.html.snap-1.png rename to __tests__/html2/livestream/concludedLivestream.html.snap-1.png diff --git a/__tests__/html2/typing/concludedLivestream.html.snap-2.png b/__tests__/html2/livestream/concludedLivestream.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/concludedLivestream.html.snap-2.png rename to __tests__/html2/livestream/concludedLivestream.html.snap-2.png diff --git a/__tests__/html2/typing/concludedLivestream.html.snap-3.png b/__tests__/html2/livestream/concludedLivestream.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/concludedLivestream.html.snap-3.png rename to __tests__/html2/livestream/concludedLivestream.html.snap-3.png diff --git a/__tests__/html2/typing/concludedLivestream.html.snap-4.png b/__tests__/html2/livestream/concludedLivestream.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/concludedLivestream.html.snap-4.png rename to __tests__/html2/livestream/concludedLivestream.html.snap-4.png diff --git a/__tests__/html2/typing/informative.html b/__tests__/html2/livestream/informative.html similarity index 100% rename from __tests__/html2/typing/informative.html rename to __tests__/html2/livestream/informative.html diff --git a/__tests__/html2/typing/informative.html.snap-1.png b/__tests__/html2/livestream/informative.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/informative.html.snap-1.png rename to __tests__/html2/livestream/informative.html.snap-1.png diff --git a/__tests__/html2/typing/layout.html b/__tests__/html2/livestream/layout.html similarity index 100% rename from __tests__/html2/typing/layout.html rename to __tests__/html2/livestream/layout.html diff --git a/__tests__/html2/typing/layout.html.snap-1.png b/__tests__/html2/livestream/layout.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/layout.html.snap-1.png rename to __tests__/html2/livestream/layout.html.snap-1.png diff --git a/__tests__/html2/typing/layout.html.snap-2.png b/__tests__/html2/livestream/layout.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/layout.html.snap-2.png rename to __tests__/html2/livestream/layout.html.snap-2.png diff --git a/__tests__/html2/typing/layout.html.snap-3.png b/__tests__/html2/livestream/layout.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/layout.html.snap-3.png rename to __tests__/html2/livestream/layout.html.snap-3.png diff --git a/__tests__/html2/typing/outOfOrder.html b/__tests__/html2/livestream/outOfOrder.html similarity index 99% rename from __tests__/html2/typing/outOfOrder.html rename to __tests__/html2/livestream/outOfOrder.html index 5969e37c60..83c41df732 100644 --- a/__tests__/html2/typing/outOfOrder.html +++ b/__tests__/html2/livestream/outOfOrder.html @@ -186,7 +186,7 @@ // WHEN: Bot finished typing the message. await directLine.emulateIncomingActivity({ - channelData: { streamId: firstTypingActivityId, streamSequence: 4, streamType: 'streaming' }, + channelData: { streamId: firstTypingActivityId, streamType: 'final' }, from: { id: 'u-00001', name: 'Bot', role: 'bot' }, id: 'a-00002', text: 'A quick brown fox jumped over the lazy dogs.', diff --git a/__tests__/html2/typing/outOfOrder.html.snap-1.png b/__tests__/html2/livestream/outOfOrder.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.html.snap-1.png rename to __tests__/html2/livestream/outOfOrder.html.snap-1.png diff --git a/__tests__/html2/typing/outOfOrder.html.snap-2.png b/__tests__/html2/livestream/outOfOrder.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.html.snap-2.png rename to __tests__/html2/livestream/outOfOrder.html.snap-2.png diff --git a/__tests__/html2/typing/outOfOrder.html.snap-3.png b/__tests__/html2/livestream/outOfOrder.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.html.snap-3.png rename to __tests__/html2/livestream/outOfOrder.html.snap-3.png diff --git a/__tests__/html2/typing/outOfOrder.html.snap-4.png b/__tests__/html2/livestream/outOfOrder.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.html.snap-4.png rename to __tests__/html2/livestream/outOfOrder.html.snap-4.png diff --git a/__tests__/html2/typing/outOfOrder.sequenceNumber.html b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html similarity index 99% rename from __tests__/html2/typing/outOfOrder.sequenceNumber.html rename to __tests__/html2/livestream/outOfOrder.sequenceNumber.html index 83b85571e8..1042948782 100644 --- a/__tests__/html2/typing/outOfOrder.sequenceNumber.html +++ b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html @@ -188,7 +188,7 @@ // WHEN: Bot finished typing the message. await directLine.emulateIncomingActivity({ - channelData: { streamId: firstTypingActivityId, streamSequence: 4, streamType: 'streaming' }, + channelData: { streamId: firstTypingActivityId, streamType: 'final' }, from: { id: 'u-00001', name: 'Bot', role: 'bot' }, id: 'a-00002', text: 'A quick brown fox jumped over the lazy dogs.', diff --git a/__tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-1.png b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-1.png rename to __tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-1.png diff --git a/__tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-2.png b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-2.png rename to __tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-2.png diff --git a/__tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-3.png b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-3.png rename to __tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-3.png diff --git a/__tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-4.png b/__tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/outOfOrder.sequenceNumber.html.snap-4.png rename to __tests__/html2/livestream/outOfOrder.sequenceNumber.html.snap-4.png diff --git a/__tests__/html2/typing/simultaneous.html b/__tests__/html2/livestream/simultaneous.html similarity index 98% rename from __tests__/html2/typing/simultaneous.html rename to __tests__/html2/livestream/simultaneous.html index 9ea2055321..bf06f75359 100644 --- a/__tests__/html2/typing/simultaneous.html +++ b/__tests__/html2/livestream/simultaneous.html @@ -177,7 +177,7 @@ // WHEN: Bot finished typing the second message. await directLine.emulateIncomingActivity({ - channelData: { streamSequence: 3, streamId: 't-00001', streamType: 'streaming' }, + channelData: { streamId: 't-00001', streamType: 'final' }, from: { name: 'Bot', role: 'bot' }, id: 'a-00002', text: 'A quick brown fox jumped over the lazy dogs.', @@ -209,7 +209,7 @@ // WHEN: Bot finished typing the third message. await directLine.emulateIncomingActivity({ - channelData: { streamSequence: 3, streamId: 't-10001', streamType: 'streaming' }, + channelData: { streamId: 't-10001', streamType: 'final' }, from: { name: 'Bot', role: 'bot' }, id: 'a-00003', text: 'Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.', diff --git a/__tests__/html2/typing/simultaneous.html.snap-1.png b/__tests__/html2/livestream/simultaneous.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-1.png rename to __tests__/html2/livestream/simultaneous.html.snap-1.png diff --git a/__tests__/html2/typing/simultaneous.html.snap-2.png b/__tests__/html2/livestream/simultaneous.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-2.png rename to __tests__/html2/livestream/simultaneous.html.snap-2.png diff --git a/__tests__/html2/typing/simultaneous.html.snap-3.png b/__tests__/html2/livestream/simultaneous.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-3.png rename to __tests__/html2/livestream/simultaneous.html.snap-3.png diff --git a/__tests__/html2/typing/simultaneous.html.snap-4.png b/__tests__/html2/livestream/simultaneous.html.snap-4.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-4.png rename to __tests__/html2/livestream/simultaneous.html.snap-4.png diff --git a/__tests__/html2/typing/simultaneous.html.snap-5.png b/__tests__/html2/livestream/simultaneous.html.snap-5.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-5.png rename to __tests__/html2/livestream/simultaneous.html.snap-5.png diff --git a/__tests__/html2/typing/simultaneous.html.snap-6.png b/__tests__/html2/livestream/simultaneous.html.snap-6.png similarity index 100% rename from __tests__/html2/typing/simultaneous.html.snap-6.png rename to __tests__/html2/livestream/simultaneous.html.snap-6.png diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html b/__tests__/html2/livestream/withAttachment.carouselLayout.html similarity index 100% rename from __tests__/html2/typing/withAttachment.carouselLayout.html rename to __tests__/html2/livestream/withAttachment.carouselLayout.html diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-1.png b/__tests__/html2/livestream/withAttachment.carouselLayout.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/withAttachment.carouselLayout.html.snap-1.png rename to __tests__/html2/livestream/withAttachment.carouselLayout.html.snap-1.png diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-2.png b/__tests__/html2/livestream/withAttachment.carouselLayout.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/withAttachment.carouselLayout.html.snap-2.png rename to __tests__/html2/livestream/withAttachment.carouselLayout.html.snap-2.png diff --git a/__tests__/html2/typing/withAttachment.carouselLayout.html.snap-3.png b/__tests__/html2/livestream/withAttachment.carouselLayout.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/withAttachment.carouselLayout.html.snap-3.png rename to __tests__/html2/livestream/withAttachment.carouselLayout.html.snap-3.png diff --git a/__tests__/html2/typing/withAttachment.html b/__tests__/html2/livestream/withAttachment.html similarity index 100% rename from __tests__/html2/typing/withAttachment.html rename to __tests__/html2/livestream/withAttachment.html diff --git a/__tests__/html2/typing/withAttachment.html.snap-1.png b/__tests__/html2/livestream/withAttachment.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/withAttachment.html.snap-1.png rename to __tests__/html2/livestream/withAttachment.html.snap-1.png diff --git a/__tests__/html2/typing/withAttachment.html.snap-2.png b/__tests__/html2/livestream/withAttachment.html.snap-2.png similarity index 100% rename from __tests__/html2/typing/withAttachment.html.snap-2.png rename to __tests__/html2/livestream/withAttachment.html.snap-2.png diff --git a/__tests__/html2/typing/withAttachment.html.snap-3.png b/__tests__/html2/livestream/withAttachment.html.snap-3.png similarity index 100% rename from __tests__/html2/typing/withAttachment.html.snap-3.png rename to __tests__/html2/livestream/withAttachment.html.snap-3.png diff --git a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx index 80036e763d..38627e7b6e 100644 --- a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx +++ b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx @@ -24,7 +24,7 @@ export default function createCoreMiddleware(): ActivityMiddleware[] { // Do not show livestream interims of "indicator only", or // livestream interims without content (i.e. finalized activity without content.) (type === 'typing' && - (getActivityLivestreamingMetadata(activity).type === 'indicator only' || !activity['text'])) || + (getActivityLivestreamingMetadata(activity)?.type === 'indicator only' || !activity['text'])) || (type === 'message' && // Do not show postback (activity.channelData?.postBack || From 3f271ed9db2d815d6b242a9445611e10f0c92dcf Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 10:51:16 +0000 Subject: [PATCH 08/54] Don't show PNGs --- serve-test.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/serve-test.json b/serve-test.json index f926ca3e2f..73e2081de7 100644 --- a/serve-test.json +++ b/serve-test.json @@ -114,6 +114,7 @@ "/**/*.ico", "/**/*.js", "/**/*.json", - "/**/*.map" + "/**/*.map", + "/**/*.png" ] } From 6e76ad9f2ccfb2579cf38e29fd7c60544acf9e06 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 11:06:11 +0000 Subject: [PATCH 09/54] Fix message activity should remove typing indicator --- .../src/providers/ActivityTyping/ActivityTypingComposer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index cc2b4f2139..9ed3ab6de0 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -40,7 +40,8 @@ const ActivityTypingComposer = ({ children }: Props) => { const livestreamingMetadata = getActivityLivestreamingMetadata(activity); - if (livestreamingMetadata?.type === 'final activity') { + if (type === 'message' || livestreamingMetadata?.type === 'final activity') { + // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. nextTyping.delete(id); changed = true; } else if (type === 'typing' && (role === 'bot' || role === 'user')) { From 81176174189330d63636865f8a3539df931d33ae Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 11:22:24 +0000 Subject: [PATCH 10/54] Fix tests --- packages/core/src/reducers/createActivitiesReducer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/reducers/createActivitiesReducer.ts b/packages/core/src/reducers/createActivitiesReducer.ts index 4cd7a2ab79..5f3014cad1 100644 --- a/packages/core/src/reducers/createActivitiesReducer.ts +++ b/packages/core/src/reducers/createActivitiesReducer.ts @@ -145,7 +145,7 @@ function upsertActivityWithSort( const isLivestreamConcluded = activities.find(targetActivity => { const targetMetadata = getActivityLivestreamingMetadata(targetActivity); - return targetMetadata?.sessionId === sessionId && targetMetadata.type === 'final activity'; + return targetMetadata && targetMetadata.sessionId === sessionId && targetMetadata.type === 'final activity'; }); if (isLivestreamConcluded) { From 5be2cb4b9b1bb106e6b1b363aadf3882f7ab11c2 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 11:46:40 +0000 Subject: [PATCH 11/54] Upgrade a test --- __tests__/html2/typing/simple.html | 76 ++++++++++++++++++++++++++++++ __tests__/sendTypingIndicator.js | 15 ------ 2 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 __tests__/html2/typing/simple.html diff --git a/__tests__/html2/typing/simple.html b/__tests__/html2/typing/simple.html new file mode 100644 index 0000000000..705157afbe --- /dev/null +++ b/__tests__/html2/typing/simple.html @@ -0,0 +1,76 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/sendTypingIndicator.js b/__tests__/sendTypingIndicator.js index 535c1365a2..b8ce9b5584 100644 --- a/__tests__/sendTypingIndicator.js +++ b/__tests__/sendTypingIndicator.js @@ -13,21 +13,6 @@ import uiConnected from './setup/conditions/uiConnected'; jest.setTimeout(timeouts.test); -test('Send typing indicator', async () => { - const { driver, pageObjects } = await setupWebDriver({ props: { sendTypingIndicator: true } }); - - await pageObjects.sendMessageViaSendBox('echo-typing', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - - const input = await driver.findElement(By.css('input[type="text"]')); - - await input.sendKeys('ABC'); - - // Typing indicator takes longer to come back - await driver.wait(typingActivityReceived(), timeouts.directLine); -}); - test('typing indicator should display in SendBox', async () => { const { driver, pageObjects } = await setupWebDriver({ props: { styleOptions: { typingAnimationBackgroundImage } } }); From 0d21f9fb4d3e04cdcb4eb5485f1daa932995d632 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 11:51:08 +0000 Subject: [PATCH 12/54] Upgrade a test --- .../html2/typing/showTypingIndicator.html | 53 ++++++++++++++++++ .../showTypingIndicator.html.snap-1.png} | Bin __tests__/sendTypingIndicator.js | 17 ------ 3 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 __tests__/html2/typing/showTypingIndicator.html rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-display-in-send-box-1-snap.png => html2/typing/showTypingIndicator.html.snap-1.png} (100%) diff --git a/__tests__/html2/typing/showTypingIndicator.html b/__tests__/html2/typing/showTypingIndicator.html new file mode 100644 index 0000000000..80fe727262 --- /dev/null +++ b/__tests__/html2/typing/showTypingIndicator.html @@ -0,0 +1,53 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-display-in-send-box-1-snap.png b/__tests__/html2/typing/showTypingIndicator.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-display-in-send-box-1-snap.png rename to __tests__/html2/typing/showTypingIndicator.html.snap-1.png diff --git a/__tests__/sendTypingIndicator.js b/__tests__/sendTypingIndicator.js index b8ce9b5584..2265c32cf6 100644 --- a/__tests__/sendTypingIndicator.js +++ b/__tests__/sendTypingIndicator.js @@ -1,5 +1,3 @@ -import { By } from 'selenium-webdriver'; - import { imageSnapshotOptions, timeouts } from './constants.json'; import minNumActivitiesShown from './setup/conditions/minNumActivitiesShown'; import negationOf from './setup/conditions/negationOf'; @@ -13,21 +11,6 @@ import uiConnected from './setup/conditions/uiConnected'; jest.setTimeout(timeouts.test); -test('typing indicator should display in SendBox', async () => { - const { driver, pageObjects } = await setupWebDriver({ props: { styleOptions: { typingAnimationBackgroundImage } } }); - - await driver.wait(uiConnected(), timeouts.directLine); - - await pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: true }); - - // Typing indicator takes longer to come back - await driver.wait(typingActivityReceived(), timeouts.directLine); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - test('typing indicator should not display after second activity', async () => { const { driver, pageObjects } = await setupWebDriver({ props: { From 175da6023da66e23d92b542b71be804d3f911a50 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 11:52:52 +0000 Subject: [PATCH 13/54] Rename --- .../typing/shouldShowTypingIndicator.html | 53 ++++++++++++++++++ ...shouldShowTypingIndicator.html.snap-1.png} | Bin 2 files changed, 53 insertions(+) create mode 100644 __tests__/html2/typing/shouldShowTypingIndicator.html rename __tests__/html2/typing/{showTypingIndicator.html.snap-1.png => shouldShowTypingIndicator.html.snap-1.png} (100%) diff --git a/__tests__/html2/typing/shouldShowTypingIndicator.html b/__tests__/html2/typing/shouldShowTypingIndicator.html new file mode 100644 index 0000000000..80fe727262 --- /dev/null +++ b/__tests__/html2/typing/shouldShowTypingIndicator.html @@ -0,0 +1,53 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/html2/typing/showTypingIndicator.html.snap-1.png b/__tests__/html2/typing/shouldShowTypingIndicator.html.snap-1.png similarity index 100% rename from __tests__/html2/typing/showTypingIndicator.html.snap-1.png rename to __tests__/html2/typing/shouldShowTypingIndicator.html.snap-1.png From bddca6d84244b835d31c1440facf95842df2d484 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:04:43 +0000 Subject: [PATCH 14/54] Upgrade a test --- ...tor.html => shouldHideTypingIndicator.html} | 17 +++++++++++++++-- .../shouldHideTypingIndicator.html.snap-1.png} | Bin 2 files changed, 15 insertions(+), 2 deletions(-) rename __tests__/html2/typing/{showTypingIndicator.html => shouldHideTypingIndicator.html} (80%) rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-not-display-after-second-activity-1-snap.png => html2/typing/shouldHideTypingIndicator.html.snap-1.png} (100%) diff --git a/__tests__/html2/typing/showTypingIndicator.html b/__tests__/html2/typing/shouldHideTypingIndicator.html similarity index 80% rename from __tests__/html2/typing/showTypingIndicator.html rename to __tests__/html2/typing/shouldHideTypingIndicator.html index 80fe727262..dffa6ceaf2 100644 --- a/__tests__/html2/typing/showTypingIndicator.html +++ b/__tests__/html2/typing/shouldHideTypingIndicator.html @@ -40,12 +40,25 @@ // THEN: Typing indicator should not be shown. expect(pageElements.typingIndicator()).toBeFalsy(); - // WHEN: After sending "typing 1" to the bot. - await pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: true }); + // WHEN: After sending "typing" to the bot. + await pageObjects.sendMessageViaSendBox('typing', { waitForSend: false }); + + // THEN: Should receive a bot message. + await waitFor(() => expect(pageElements.activities()).toHaveLength(2)); // THEN: Bot should send a typing indicator and shown on the screen. await waitFor(() => expect(pageElements.typingIndicator()).toBeTruthy()); + // --- + + // WHEN: After 2 seconds. + + // THEN: Bot should send another message. + await waitFor(() => expect(pageElements.activities()).toHaveLength(3), { timeout: 3_000 }); + + // THEN: Typing indicator should be hidden. + expect(pageElements.typingIndicator()).toBeFalsy(); + await host.snapshot('local'); }); diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-not-display-after-second-activity-1-snap.png b/__tests__/html2/typing/shouldHideTypingIndicator.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-typing-indicator-should-not-display-after-second-activity-1-snap.png rename to __tests__/html2/typing/shouldHideTypingIndicator.html.snap-1.png From 94365d9fdc4812a26f00c5b3cdc0424bece9fcbc Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:04:48 +0000 Subject: [PATCH 15/54] Remove upgraded test --- __tests__/sendTypingIndicator.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/__tests__/sendTypingIndicator.js b/__tests__/sendTypingIndicator.js index 2265c32cf6..2ba4da31b6 100644 --- a/__tests__/sendTypingIndicator.js +++ b/__tests__/sendTypingIndicator.js @@ -11,20 +11,6 @@ import uiConnected from './setup/conditions/uiConnected'; jest.setTimeout(timeouts.test); -test('typing indicator should not display after second activity', async () => { - const { driver, pageObjects } = await setupWebDriver({ - props: { - styleOptions: { typingAnimationBackgroundImage, typingAnimationDuration: 10000 } - } - }); - - await pageObjects.sendMessageViaSendBox('typing', { waitForSend: true }); - await driver.wait(minNumActivitiesShown(3), timeouts.directLine); - - const base64PNG = await driver.takeScreenshot(); - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - test('changing typing indicator duration on-the-fly', async () => { const { driver, pageObjects } = await setupWebDriver({ props: { From dbb2e578086b04836cdfc33f24a9baf5f32a707b Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:11:02 +0000 Subject: [PATCH 16/54] Upgrade a test --- .../html2/typing/noUserTypingIndicator.html | 63 ++++++++++++++++++ .../noUserTypingIndicator.html.snap-1.png} | Bin __tests__/sendTypingIndicator.js | 13 ---- 3 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 __tests__/html2/typing/noUserTypingIndicator.html rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-should-not-show-typing-indicator-for-user-1-snap.png => html2/typing/noUserTypingIndicator.html.snap-1.png} (100%) diff --git a/__tests__/html2/typing/noUserTypingIndicator.html b/__tests__/html2/typing/noUserTypingIndicator.html new file mode 100644 index 0000000000..a706b0106b --- /dev/null +++ b/__tests__/html2/typing/noUserTypingIndicator.html @@ -0,0 +1,63 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-should-not-show-typing-indicator-for-user-1-snap.png b/__tests__/html2/typing/noUserTypingIndicator.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-should-not-show-typing-indicator-for-user-1-snap.png rename to __tests__/html2/typing/noUserTypingIndicator.html.snap-1.png diff --git a/__tests__/sendTypingIndicator.js b/__tests__/sendTypingIndicator.js index 2ba4da31b6..572ab7504a 100644 --- a/__tests__/sendTypingIndicator.js +++ b/__tests__/sendTypingIndicator.js @@ -1,7 +1,6 @@ import { imageSnapshotOptions, timeouts } from './constants.json'; import minNumActivitiesShown from './setup/conditions/minNumActivitiesShown'; import negationOf from './setup/conditions/negationOf'; -import typingActivityReceived from './setup/conditions/typingActivityReceived'; import typingAnimationBackgroundImage from './setup/assets/typingIndicator'; import typingIndicatorShown from './setup/conditions/typingIndicatorShown'; import uiConnected from './setup/conditions/uiConnected'; @@ -38,15 +37,3 @@ test('changing typing indicator duration on-the-fly', async () => { expect(await driver.takeScreenshot()).toMatchImageSnapshot(imageSnapshotOptions); }); - -test('should not show typing indicator for user', async () => { - const { driver, pageObjects } = await setupWebDriver({ props: { sendTypingIndicator: true } }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.typeInSendBox('Hello, World!'); - await driver.wait(negationOf(typingIndicatorShown()), 2000); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); From b8e89e64d23d93f242e7fccbd7218c47bc0b69f7 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:24:09 +0000 Subject: [PATCH 17/54] Upgrade the last test --- .../typing/changeTypingAnimationDuration.html | 76 ++++++++++++++++++ ...geTypingAnimationDuration.html.snap-1.png} | Bin ...geTypingAnimationDuration.html.snap-2.png} | Bin ...geTypingAnimationDuration.html.snap-3.png} | Bin __tests__/sendTypingIndicator.js | 39 --------- 5 files changed, 76 insertions(+), 39 deletions(-) create mode 100644 __tests__/html2/typing/changeTypingAnimationDuration.html rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-1-snap.png => html2/typing/changeTypingAnimationDuration.html.snap-1.png} (100%) rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-2-snap.png => html2/typing/changeTypingAnimationDuration.html.snap-2.png} (100%) rename __tests__/{__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-3-snap.png => html2/typing/changeTypingAnimationDuration.html.snap-3.png} (100%) delete mode 100644 __tests__/sendTypingIndicator.js diff --git a/__tests__/html2/typing/changeTypingAnimationDuration.html b/__tests__/html2/typing/changeTypingAnimationDuration.html new file mode 100644 index 0000000000..72e8755fd1 --- /dev/null +++ b/__tests__/html2/typing/changeTypingAnimationDuration.html @@ -0,0 +1,76 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-1-snap.png b/__tests__/html2/typing/changeTypingAnimationDuration.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-1-snap.png rename to __tests__/html2/typing/changeTypingAnimationDuration.html.snap-1.png diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-2-snap.png b/__tests__/html2/typing/changeTypingAnimationDuration.html.snap-2.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-2-snap.png rename to __tests__/html2/typing/changeTypingAnimationDuration.html.snap-2.png diff --git a/__tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-3-snap.png b/__tests__/html2/typing/changeTypingAnimationDuration.html.snap-3.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/send-typing-indicator-js-changing-typing-indicator-duration-on-the-fly-3-snap.png rename to __tests__/html2/typing/changeTypingAnimationDuration.html.snap-3.png diff --git a/__tests__/sendTypingIndicator.js b/__tests__/sendTypingIndicator.js deleted file mode 100644 index 572ab7504a..0000000000 --- a/__tests__/sendTypingIndicator.js +++ /dev/null @@ -1,39 +0,0 @@ -import { imageSnapshotOptions, timeouts } from './constants.json'; -import minNumActivitiesShown from './setup/conditions/minNumActivitiesShown'; -import negationOf from './setup/conditions/negationOf'; -import typingAnimationBackgroundImage from './setup/assets/typingIndicator'; -import typingIndicatorShown from './setup/conditions/typingIndicatorShown'; -import uiConnected from './setup/conditions/uiConnected'; - -// selenium-webdriver API doc: -// https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html - -jest.setTimeout(timeouts.test); - -test('changing typing indicator duration on-the-fly', async () => { - const { driver, pageObjects } = await setupWebDriver({ - props: { - styleOptions: { typingAnimationBackgroundImage, typingAnimationDuration: 1000 } - } - }); - - await driver.wait(uiConnected(), timeouts.directLine); - - await pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: true }); - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(typingIndicatorShown(), timeouts.ui); - - expect(await driver.takeScreenshot()).toMatchImageSnapshot(imageSnapshotOptions); - - await driver.wait(negationOf(typingIndicatorShown()), 2000); - - expect(await driver.takeScreenshot()).toMatchImageSnapshot(imageSnapshotOptions); - - await pageObjects.updateProps({ - styleOptions: { typingAnimationBackgroundImage, typingAnimationDuration: 5000 } - }); - - await driver.wait(typingIndicatorShown(), timeouts.ui); - - expect(await driver.takeScreenshot()).toMatchImageSnapshot(imageSnapshotOptions); -}); From 85dd97b3f0288995419834f2983efdd80f256d77 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:34:03 +0000 Subject: [PATCH 18/54] Use emulator --- .../typing/changeTypingAnimationDuration.html | 31 +++++++++++++-- .../typing/shouldHideTypingIndicator.html | 38 +++++++++++++++++-- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/__tests__/html2/typing/changeTypingAnimationDuration.html b/__tests__/html2/typing/changeTypingAnimationDuration.html index 72e8755fd1..6745303cd1 100644 --- a/__tests__/html2/typing/changeTypingAnimationDuration.html +++ b/__tests__/html2/typing/changeTypingAnimationDuration.html @@ -21,14 +21,15 @@ const typingAnimationBackgroundImage = `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')`; run(async function () { - const directLine = WebChat.createDirectLine({ token: await testHelpers.token.fetchDirectLineToken() }); - const store = testHelpers.createStore(); + const ponyfill = lolex.createClock(); + const { directLine, store } = testHelpers.createDirectLineEmulator({ ponyfill }); const render = props => WebChat.renderWebChat( { ...props, directLine, + ponyfill, store }, document.querySelector('main') @@ -36,13 +37,35 @@ render({ styleOptions: { typingAnimationBackgroundImage, typingAnimationDuration: 1_000 } }); + await pageConditions.webChatRendered(); + + // Wait for "Connecting..." message to dismiss + ponyfill.tick(600); + await pageConditions.uiConnected(); // THEN: Should not show typing indicator initially. expect(pageElements.typingIndicator()).toBeFalsy(); // WHEN: Send "typing 1" to the bot. - await pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: true }); + await ( + await directLine.actPostActivity(() => pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: false })) + ).resolveAll(); + + // WHEN: The bot send a message activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + text: 'Typing indicator should go away after 5 seconds.', + type: 'message' + }); + + // WHEN: The bot send a typing activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + type: 'typing' + }); // THEN: Should receive a bot message. await waitFor(() => expect(pageElements.activities()).toHaveLength(2)); @@ -54,7 +77,7 @@ await host.snapshot('local'); // WHEN: After 1 second. - await new Promise(resolve => setTimeout(resolve, 1_000)); + ponyfill.tick(1_000); // THEN: Should not show typing indicator. expect(pageElements.typingIndicator()).toBeFalsy(); diff --git a/__tests__/html2/typing/shouldHideTypingIndicator.html b/__tests__/html2/typing/shouldHideTypingIndicator.html index dffa6ceaf2..dd20e8358d 100644 --- a/__tests__/html2/typing/shouldHideTypingIndicator.html +++ b/__tests__/html2/typing/shouldHideTypingIndicator.html @@ -19,12 +19,13 @@ import { waitFor } from '@testduet/wait-for'; run(async function () { - const directLine = WebChat.createDirectLine({ token: await testHelpers.token.fetchDirectLineToken() }); - const store = testHelpers.createStore(); + const ponyfill = lolex.createClock(); + const { directLine, store } = testHelpers.createDirectLineEmulator({ ponyfill }); WebChat.renderWebChat( { directLine, + ponyfill, sendTypingIndicator: true, store, styleOptions: { @@ -34,6 +35,11 @@ document.querySelector('main') ); + await pageConditions.webChatRendered(); + + // Wait for "Connecting..." message to dismiss + ponyfill.tick(600); + await pageConditions.uiConnected(); // WHEN: Initially. @@ -41,7 +47,22 @@ expect(pageElements.typingIndicator()).toBeFalsy(); // WHEN: After sending "typing" to the bot. - await pageObjects.sendMessageViaSendBox('typing', { waitForSend: false }); + await (await directLine.emulateOutgoingActivity('typing')).resolveAll(); + + // WHEN: The bot send a message activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + text: 'I am sending typing, will send another message 2 seconds afterward.', + type: 'message' + }); + + // WHEN: The bot send a typing activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + type: 'typing' + }); // THEN: Should receive a bot message. await waitFor(() => expect(pageElements.activities()).toHaveLength(2)); @@ -52,9 +73,18 @@ // --- // WHEN: After 2 seconds. + ponyfill.tick(2_000); + + // WHEN: The bot send another message activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + text: 'This message should stop the typing indicator.', + type: 'message' + }); // THEN: Bot should send another message. - await waitFor(() => expect(pageElements.activities()).toHaveLength(3), { timeout: 3_000 }); + await waitFor(() => expect(pageElements.activities()).toHaveLength(3)); // THEN: Typing indicator should be hidden. expect(pageElements.typingIndicator()).toBeFalsy(); From f96199bbaa13807daca0085ddce399a904092840 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 5 Mar 2025 12:35:18 +0000 Subject: [PATCH 19/54] Use emulator --- .../typing/shouldShowTypingIndicator.html | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/__tests__/html2/typing/shouldShowTypingIndicator.html b/__tests__/html2/typing/shouldShowTypingIndicator.html index 80fe727262..eebc020320 100644 --- a/__tests__/html2/typing/shouldShowTypingIndicator.html +++ b/__tests__/html2/typing/shouldShowTypingIndicator.html @@ -19,12 +19,13 @@ import { waitFor } from '@testduet/wait-for'; run(async function () { - const directLine = WebChat.createDirectLine({ token: await testHelpers.token.fetchDirectLineToken() }); - const store = testHelpers.createStore(); + const ponyfill = lolex.createClock(); + const { directLine, store } = testHelpers.createDirectLineEmulator({ ponyfill }); WebChat.renderWebChat( { directLine, + ponyfill, sendTypingIndicator: true, store, styleOptions: { @@ -34,6 +35,11 @@ document.querySelector('main') ); + await pageConditions.webChatRendered(); + + // Wait for "Connecting..." message to dismiss + ponyfill.tick(600); + await pageConditions.uiConnected(); // WHEN: Initially. @@ -41,7 +47,22 @@ expect(pageElements.typingIndicator()).toBeFalsy(); // WHEN: After sending "typing 1" to the bot. - await pageObjects.sendMessageViaSendBox('typing 1', { waitForSend: true }); + await (await directLine.emulateOutgoingActivity('typing 1')).resolveAll(); + + // WHEN: The bot send a message activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + text: 'Typing indicator should go away after 5 seconds.', + type: 'message' + }); + + // WHEN: The bot send a typing activity. + await directLine.emulateIncomingActivity({ + from: { id: 'bot', role: 'bot' }, + id: crypto.randomUUID(), + type: 'typing' + }); // THEN: Bot should send a typing indicator and shown on the screen. await waitFor(() => expect(pageElements.typingIndicator()).toBeTruthy()); From 06ea56f38d76e9e89f43a7cdea58e91b65d3448f Mon Sep 17 00:00:00 2001 From: William Wong Date: Fri, 7 Mar 2025 22:15:46 +0000 Subject: [PATCH 20/54] Add test for batched activities --- .../html2/livestream/batchedActivities.html | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 __tests__/html2/livestream/batchedActivities.html diff --git a/__tests__/html2/livestream/batchedActivities.html b/__tests__/html2/livestream/batchedActivities.html new file mode 100644 index 0000000000..973f5c93de --- /dev/null +++ b/__tests__/html2/livestream/batchedActivities.html @@ -0,0 +1,85 @@ + + + + + + + + + + + +
+ + + From 6117bd91af354a6cd41ed0964c1776a544de4cad Mon Sep 17 00:00:00 2001 From: William Wong Date: Fri, 7 Mar 2025 22:16:21 +0000 Subject: [PATCH 21/54] Add test for typing indicator and livestream simultaneously --- .../livestreamAndTypingIndicator.html | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 __tests__/html2/livestream/livestreamAndTypingIndicator.html diff --git a/__tests__/html2/livestream/livestreamAndTypingIndicator.html b/__tests__/html2/livestream/livestreamAndTypingIndicator.html new file mode 100644 index 0000000000..9736050e7a --- /dev/null +++ b/__tests__/html2/livestream/livestreamAndTypingIndicator.html @@ -0,0 +1,132 @@ + + + + + + + + + + + + +
+ + + From e0e965bc9e8ed354574cb6f690fb82a8deccacde Mon Sep 17 00:00:00 2001 From: William Wong Date: Mon, 10 Mar 2025 19:09:02 +0000 Subject: [PATCH 22/54] Add tests --- .../html2/livestream/asTypingIndicator.html | 57 ++++++++++ .../asTypingIndicator.html.snap-1.png | Bin 0 -> 7623 bytes .../html2/livestream/backtrackToEmpty.html | 8 +- .../backtrackToTypingIndicator.html | 79 +++++++++++++ ...backtrackToTypingIndicator.html.snap-1.png | Bin 0 -> 9733 bytes ...backtrackToTypingIndicator.html.snap-2.png | Bin 0 -> 7623 bytes .../html2/livestream/batchedActivities.html | 85 -------------- .../livestream/raceBetweenChunkAndEmpty.html | 107 ++++++++++++++++++ .../raceBetweenChunkAndEmpty.html.snap-1.png | Bin 0 -> 7623 bytes .../raceBetweenChunkAndEmpty.html.snap-2.png | Bin 0 -> 9733 bytes ...eBetweenLivestreamAndTypingIndicator.html} | 85 ++++++-------- ...vestreamAndTypingIndicator.html.snap-1.png | Bin 0 -> 7623 bytes ...vestreamAndTypingIndicator.html.snap-2.png | Bin 0 -> 9733 bytes ...vestreamAndTypingIndicator.html.snap-3.png | Bin 0 -> 13167 bytes .../livestream/regretWithEmptyMessage.html | 77 +++++++++++++ .../regretWithEmptyMessage.html.snap-1.png | Bin 0 -> 9733 bytes .../regretWithEmptyMessage.html.snap-2.png | Bin 0 -> 5987 bytes 17 files changed, 360 insertions(+), 138 deletions(-) create mode 100644 __tests__/html2/livestream/asTypingIndicator.html create mode 100644 __tests__/html2/livestream/asTypingIndicator.html.snap-1.png create mode 100644 __tests__/html2/livestream/backtrackToTypingIndicator.html create mode 100644 __tests__/html2/livestream/backtrackToTypingIndicator.html.snap-1.png create mode 100644 __tests__/html2/livestream/backtrackToTypingIndicator.html.snap-2.png delete mode 100644 __tests__/html2/livestream/batchedActivities.html create mode 100644 __tests__/html2/livestream/raceBetweenChunkAndEmpty.html create mode 100644 __tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-1.png create mode 100644 __tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-2.png rename __tests__/html2/livestream/{livestreamAndTypingIndicator.html => raceBetweenLivestreamAndTypingIndicator.html} (61%) create mode 100644 __tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-1.png create mode 100644 __tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-2.png create mode 100644 __tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-3.png create mode 100644 __tests__/html2/livestream/regretWithEmptyMessage.html create mode 100644 __tests__/html2/livestream/regretWithEmptyMessage.html.snap-1.png create mode 100644 __tests__/html2/livestream/regretWithEmptyMessage.html.snap-2.png diff --git a/__tests__/html2/livestream/asTypingIndicator.html b/__tests__/html2/livestream/asTypingIndicator.html new file mode 100644 index 0000000000..94c2dd3415 --- /dev/null +++ b/__tests__/html2/livestream/asTypingIndicator.html @@ -0,0 +1,57 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/html2/livestream/asTypingIndicator.html.snap-1.png b/__tests__/html2/livestream/asTypingIndicator.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 + + + + + + + + +
+ + + + diff --git a/__tests__/html2/livestream/backtrackToTypingIndicator.html.snap-1.png b/__tests__/html2/livestream/backtrackToTypingIndicator.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..57a9b96ab23beeed7fcad43d231572a138e975f7 GIT binary patch literal 9733 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/backtrackToTypingIndicator.html.snap-2.png b/__tests__/html2/livestream/backtrackToTypingIndicator.html.snap-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 - - - - - - - - - - -
- - - diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html new file mode 100644 index 0000000000..146fce2619 --- /dev/null +++ b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html @@ -0,0 +1,107 @@ + + + + + + + + + +
+ + + + diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-1.png b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/livestreamAndTypingIndicator.html b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html similarity index 61% rename from __tests__/html2/livestream/livestreamAndTypingIndicator.html rename to __tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html index 9736050e7a..024e254575 100644 --- a/__tests__/html2/livestream/livestreamAndTypingIndicator.html +++ b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html @@ -2,64 +2,35 @@ - - -
- + diff --git a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-1.png b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-3.png b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb GIT binary patch literal 13167 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 + + + + + + + + +
+ + + + diff --git a/__tests__/html2/livestream/regretWithEmptyMessage.html.snap-1.png b/__tests__/html2/livestream/regretWithEmptyMessage.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..57a9b96ab23beeed7fcad43d231572a138e975f7 GIT binary patch literal 9733 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/regretWithEmptyMessage.html.snap-2.png b/__tests__/html2/livestream/regretWithEmptyMessage.html.snap-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ef517bd0361f706538fd9ed7d0cc5a30ed113203 GIT binary patch literal 5987 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 Hc Date: Tue, 11 Mar 2025 03:47:11 +0000 Subject: [PATCH 23/54] Add useReduceActivities --- .eslintrc.yml | 26 ++- __tests__/hooks/useEmitTypingIndicator.js | 23 --- __tests__/hooks/useSendTypingIndicator.js | 25 --- .../typingIndicator.liveRegion.multiple.html | 19 +- .../typingIndicator.liveRegion.simple.html | 31 ++- __tests__/html2/hooks/private/renderHook.js | 7 +- .../html2/hooks/useEmitTypingIndicator.html | 63 ++++++ ...useSendTypingIndicator.propsSetToTrue.html | 53 +++++ .../useSendTypingIndicator.propsUnset.html | 48 +++++ .../src/hooks/private/reduceIterable.spec.ts | 2 - .../private/someIterable.spec.ts | 2 - .../ActivityTyping/ActivityTypingComposer.tsx | 94 ++++----- .../private/useReduceActivities.spec.tsx | 193 ++++++++++++++++++ .../private/useReduceActivities.ts | 46 +++++ 14 files changed, 491 insertions(+), 141 deletions(-) delete mode 100644 __tests__/hooks/useEmitTypingIndicator.js delete mode 100644 __tests__/hooks/useSendTypingIndicator.js create mode 100644 __tests__/html2/hooks/useEmitTypingIndicator.html create mode 100644 __tests__/html2/hooks/useSendTypingIndicator.propsSetToTrue.html create mode 100644 __tests__/html2/hooks/useSendTypingIndicator.propsUnset.html create mode 100644 packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx create mode 100644 packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts diff --git a/.eslintrc.yml b/.eslintrc.yml index ec1d65cde0..e06098c99a 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -19,14 +19,6 @@ parserOptions: sourceType: module overrides: - - files: - - '__tests__/**/*.js' - - '*.spec.js' - - '*.test.js' - - env: - jest: true - - files: - 'jest.config.js' - 'jest.*.config.js' @@ -85,6 +77,24 @@ overrides: # Shorthanding if-condition with && and ||. '@typescript-eslint/no-unused-expressions': off + - files: + - '__tests__/**/*.js' + - '**/*.spec.js' + - '**/*.spec.jsx' + - '**/*.spec.ts' + - '**/*.spec.tsx' + - '**/*.test.js' + - '**/*.test.jsx' + - '**/*.test.ts' + - '**/*.test.tsx' + + env: + jest: true + + rules: + '@typescript-eslint/no-require-imports': off + no-magic-numbers: off + rules: # Only list rules that are not in *:recommended set # If rules are set to disable the one in *:recommended, please elaborate the reason diff --git a/__tests__/hooks/useEmitTypingIndicator.js b/__tests__/hooks/useEmitTypingIndicator.js deleted file mode 100644 index 0eaee6a1f9..0000000000 --- a/__tests__/hooks/useEmitTypingIndicator.js +++ /dev/null @@ -1,23 +0,0 @@ -import { timeouts } from '../constants.json'; - -import minNumActivitiesShown from '../setup/conditions/minNumActivitiesShown'; -import typingActivityReceived from '../setup/conditions/typingActivityReceived'; -import uiConnected from '../setup/conditions/uiConnected'; - -// selenium-webdriver API doc: -// https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html - -jest.setTimeout(timeouts.test); - -test('calling emitTypingIndicator should send a typing activity', async () => { - const { driver, pageObjects } = await setupWebDriver(); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('echo-typing', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - - await pageObjects.runHook('useEmitTypingIndicator', [], fn => fn()); - - await driver.wait(typingActivityReceived(), timeouts.directLine); -}); diff --git a/__tests__/hooks/useSendTypingIndicator.js b/__tests__/hooks/useSendTypingIndicator.js deleted file mode 100644 index 7df44dc1a1..0000000000 --- a/__tests__/hooks/useSendTypingIndicator.js +++ /dev/null @@ -1,25 +0,0 @@ -import { timeouts } from '../constants.json'; - -// selenium-webdriver API doc: -// https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/index_exports_WebDriver.html - -jest.setTimeout(timeouts.test); - -test('getter should get sendTypingIndicator from props', async () => { - const { pageObjects } = await setupWebDriver({ props: { sendTypingIndicator: true } }); - - await expect(pageObjects.runHook('useSendTypingIndicator', [], result => result[0])).resolves.toBeTruthy(); -}); - -test('getter should get default value if not set in props', async () => { - const { pageObjects } = await setupWebDriver(); - - await expect(pageObjects.runHook('useSendTypingIndicator', [], result => result[0])).resolves.toBeFalsy(); -}); - -test('setter should be falsy', async () => { - const { pageObjects } = await setupWebDriver(); - const [_, setSendTypingIndicator] = await pageObjects.runHook('useSendTypingIndicator'); - - expect(setSendTypingIndicator).toBeFalsy(); -}); diff --git a/__tests__/html/typingIndicator.liveRegion.multiple.html b/__tests__/html/typingIndicator.liveRegion.multiple.html index 2e87d1fa7b..9b1ed6fd69 100644 --- a/__tests__/html/typingIndicator.liveRegion.multiple.html +++ b/__tests__/html/typingIndicator.liveRegion.multiple.html @@ -1,4 +1,4 @@ - + @@ -8,7 +8,16 @@
- + + + + + + + + +
+ + + + diff --git a/__tests__/html2/hooks/useSendTypingIndicator.propsSetToTrue.html b/__tests__/html2/hooks/useSendTypingIndicator.propsSetToTrue.html new file mode 100644 index 0000000000..ce93d67b76 --- /dev/null +++ b/__tests__/html2/hooks/useSendTypingIndicator.propsSetToTrue.html @@ -0,0 +1,53 @@ + + + + + + + + + + + +
+ + + + diff --git a/__tests__/html2/hooks/useSendTypingIndicator.propsUnset.html b/__tests__/html2/hooks/useSendTypingIndicator.propsUnset.html new file mode 100644 index 0000000000..336e8997b2 --- /dev/null +++ b/__tests__/html2/hooks/useSendTypingIndicator.propsUnset.html @@ -0,0 +1,48 @@ + + + + + + + + + + + +
+ + + + diff --git a/packages/api/src/hooks/private/reduceIterable.spec.ts b/packages/api/src/hooks/private/reduceIterable.spec.ts index 3e7b70a84f..bb92634a29 100644 --- a/packages/api/src/hooks/private/reduceIterable.spec.ts +++ b/packages/api/src/hooks/private/reduceIterable.spec.ts @@ -1,5 +1,3 @@ -/* eslint-disable no-magic-numbers */ - import reduceIterable from './reduceIterable'; describe('when called with a summation reducer', () => { diff --git a/packages/api/src/providers/ActivityKeyer/private/someIterable.spec.ts b/packages/api/src/providers/ActivityKeyer/private/someIterable.spec.ts index 0bfc7187cf..124b6c4002 100644 --- a/packages/api/src/providers/ActivityKeyer/private/someIterable.spec.ts +++ b/packages/api/src/providers/ActivityKeyer/private/someIterable.spec.ts @@ -1,5 +1,3 @@ -/* eslint-disable no-magic-numbers */ - import someIterable from './someIterable'; describe('when predicate return true should return true', () => { diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index 9ed3ab6de0..24f4709c46 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -1,74 +1,58 @@ -import { getActivityLivestreamingMetadata } from 'botframework-webchat-core'; -import React, { memo, useMemo, type ReactNode } from 'react'; -import { useRefFrom } from 'use-ref-from'; +import { getActivityLivestreamingMetadata, type WebChatActivity } from 'botframework-webchat-core'; +import React, { memo, useCallback, useMemo, type ReactNode } from 'react'; import numberWithInfinity from '../../hooks/private/numberWithInfinity'; -import useActivities from '../../hooks/useActivities'; import usePonyfill from '../../hooks/usePonyfill'; -import useUpsertedActivities from '../../providers/ActivityListener/useUpsertedActivities'; import ActivityTypingContext, { ActivityTypingContextType } from './private/Context'; -import useMemoWithPrevious from './private/useMemoWithPrevious'; +import useReduceActivities from './private/useReduceActivities'; import { type AllTyping } from './types/AllTyping'; -const INITIAL_ALL_TYPING_STATE = Object.freeze([Object.freeze(new Map())] as const); - type Props = Readonly<{ children?: ReactNode | undefined }>; const ActivityTypingComposer = ({ children }: Props) => { const [{ Date }] = usePonyfill(); - const [activities] = useActivities(); - const [upsertedActivities] = useUpsertedActivities(); - const activitiesRef = useRefFrom(activities); - - const allTypingState = useMemoWithPrevious]>( - (prevAllTypingState = INITIAL_ALL_TYPING_STATE) => { - const { current: activities } = activitiesRef; - const nextTyping = new Map(prevAllTypingState[0]); - let changed = false; - - const firstIndex = upsertedActivities.reduce( - (firstIndex, upsertedActivity) => Math.min(firstIndex, activities.indexOf(upsertedActivity)), - Infinity - ); - - for (const activity of activities.slice(firstIndex)) { - const { - from, - from: { id, role }, - type - } = activity; - - const livestreamingMetadata = getActivityLivestreamingMetadata(activity); - if (type === 'message' || livestreamingMetadata?.type === 'final activity') { - // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. - nextTyping.delete(id); - changed = true; - } else if (type === 'typing' && (role === 'bot' || role === 'user')) { - const currentTyping = nextTyping.get(id); - // TODO: When we rework on types of DLActivity, we will make sure all activities has "webChat.receivedAt", this coalesces can be removed. - const receivedAt = activity.channelData.webChat?.receivedAt || Date.now(); - - nextTyping.set(id, { - firstReceivedAt: currentTyping?.firstReceivedAt || receivedAt, - lastActivityDuration: numberWithInfinity( - activity.channelData.webChat?.styleOptions?.typingAnimationDuration - ), - lastReceivedAt: receivedAt, - name: from.name, - role, - type: livestreamingMetadata && livestreamingMetadata.type !== 'indicator only' ? 'livestream' : 'busy' - }); - - changed = true; - } + const reducer = useCallback( + ( + prevTypingState: ReadonlyMap | undefined, + activity: WebChatActivity + ): ReadonlyMap | undefined => { + const { + from, + from: { id, role }, + type + } = activity; + + const livestreamingMetadata = getActivityLivestreamingMetadata(activity); + const typingState = new Map(prevTypingState); + + if (type === 'message' || livestreamingMetadata?.type === 'final activity') { + // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. + typingState.delete(id); + } else if (type === 'typing' && (role === 'bot' || role === 'user')) { + const currentTyping = typingState.get(id); + // TODO: When we rework on types of DLActivity, we will make sure all activities has "webChat.receivedAt", this coalesces can be removed. + const receivedAt = activity.channelData.webChat?.receivedAt || Date.now(); + + typingState.set(id, { + firstReceivedAt: currentTyping?.firstReceivedAt || receivedAt, + lastActivityDuration: numberWithInfinity(activity.channelData.webChat?.styleOptions?.typingAnimationDuration), + lastReceivedAt: receivedAt, + name: from.name, + role, + type: livestreamingMetadata && livestreamingMetadata.type !== 'indicator only' ? 'livestream' : 'busy' + }); } - return changed ? Object.freeze([nextTyping]) : prevAllTypingState; + return Object.freeze(typingState); }, - [activitiesRef, upsertedActivities] + [Date] ); + const allTyping: ReadonlyMap = useReduceActivities(reducer) || Object.freeze(new Map()); + + const allTypingState = useMemo(() => Object.freeze([allTyping] as const), [allTyping]); + const context = useMemo(() => ({ allTypingState }), [allTypingState]); return {children}; diff --git a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx new file mode 100644 index 0000000000..b2ba918e01 --- /dev/null +++ b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx @@ -0,0 +1,193 @@ +/** @jest-environment @happy-dom/jest-environment */ + +import { render, type RenderResult } from '@testing-library/react'; +import type { WebChatActivity } from 'botframework-webchat-core'; +import React, { type ComponentType } from 'react'; +import { type useActivities as UseActivitiesType } from '../../../hooks'; +import type UseReduceActivitiesType from './useReduceActivities'; + +type UseReduceActivitiesFn = Parameters[0]; + +const ACTIVITY_TEMPLATE = { + channelData: { + 'webchat:sequence-id': 0, + 'webchat:send-status': undefined + }, + from: { id: 'bot', role: 'bot' }, + id: 'a-00001', + text: '', + timestamp: '2025-03-10T12:34:56.789Z', + type: 'message' +} satisfies WebChatActivity & { type: 'message' }; + +describe('setup', () => { + let HookApp: ComponentType<{ fn: UseReduceActivitiesFn }>; + let useActivities: jest.Mock, Parameters>; + let useReduceActivities: jest.Mock< + ReturnType, + Parameters + >; + let fn: jest.Mock, Parameters>; + let renderResult: RenderResult; + + beforeEach(() => { + jest.mock('../../../hooks', () => ({ __esModule: true, useActivities: jest.fn(() => [[]]) })); + + ({ useActivities } = require('../../../hooks')); + + useReduceActivities = jest.fn(require('./useReduceActivities').default); + + fn = jest.fn().mockImplementation((prevResult, activity) => ({ + maxText: prevResult?.maxText > activity['text'] ? prevResult?.maxText : activity['text'] + })); + + HookApp = ({ fn }) => { + useReduceActivities(fn); + + return null; + }; + }); + + test('reduce nothing', () => { + render(); + + expect(fn).toHaveBeenCalledTimes(0); + }); + + describe('when the first activity is received', () => { + let firstActivity: WebChatActivity; + + beforeEach(() => { + firstActivity = { ...ACTIVITY_TEMPLATE, id: 'a-00001', text: 'Aloha!' }; + + useActivities.mockImplementationOnce(() => [[firstActivity]]); + + renderResult = render(); + }); + + describe('fn() should have been called', () => { + test('once', () => expect(fn).toHaveBeenCalledTimes(1)); + test('with the activity', () => + expect(fn).toHaveBeenLastCalledWith(undefined, firstActivity, 0, expect.arrayContaining([]))); + }); + + test('return value should be derived from the first activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Aloha!' })); + + describe('when the second activity is received', () => { + let secondActivity: WebChatActivity; + + beforeEach(() => { + secondActivity = { ...ACTIVITY_TEMPLATE, id: 'a-00002', text: 'Hello, World!' }; + + useActivities.mockImplementationOnce(() => [[firstActivity, secondActivity]]); + + renderResult.rerender(); + }); + + describe('fn() should have been called', () => { + test('twice in total', () => expect(fn).toHaveBeenCalledTimes(2)); + test('with the second activity', () => + expect(fn).toHaveBeenLastCalledWith({ maxText: 'Aloha!' }, secondActivity, 1, expect.arrayContaining([]))); + + test('return value should be derived from the second activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Hello, World!' })); + }); + + describe('when the third activity is inserted between the first and second activity', () => { + let thirdActivity: WebChatActivity; + + beforeEach(() => { + thirdActivity = { ...ACTIVITY_TEMPLATE, id: 'a-00003', text: 'Morning!' }; + + useActivities.mockImplementationOnce(() => [[firstActivity, thirdActivity, secondActivity]]); + + renderResult.rerender(); + }); + + describe('fn() should have been called', () => { + // It should call 2 more times because the first one should be from cache. + test('4 times in total', () => expect(fn).toHaveBeenCalledTimes(4)); + + test('with the third activity on 3rd call', () => + expect(fn).toHaveBeenNthCalledWith(3, { maxText: 'Aloha!' }, thirdActivity, 1, expect.arrayContaining([]))); + test('with the second activity on 4th call', () => + expect(fn).toHaveBeenNthCalledWith( + 4, + { maxText: 'Morning!' }, + secondActivity, + 2, + expect.arrayContaining([]) + )); + }); + + test('return value should be derived from the third activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Morning!' })); + + describe('when all activities are removed', () => { + beforeEach(() => { + useActivities.mockImplementationOnce(() => [[]]); + + renderResult.rerender(); + }); + + test('should not call fn()', () => expect(fn).toHaveBeenCalledTimes(4)); + test('return value should be undefined', () => expect(useReduceActivities).toHaveLastReturnedWith(undefined)); + }); + }); + + describe('when the first activity is removed', () => { + beforeEach(() => { + useActivities.mockImplementationOnce(() => [[secondActivity]]); + + renderResult.rerender(); + }); + + describe('should call fn', () => { + test('3 times in total', () => expect(fn).toHaveBeenCalledTimes(3)); + test('with the second activity only', () => + expect(fn).toHaveBeenLastCalledWith(undefined, secondActivity, 0, expect.arrayContaining([]))); + }); + + test('return value should be derived from the second activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Hello, World!' })); + }); + + describe('when the second activity is removed', () => { + beforeEach(() => { + useActivities.mockImplementationOnce(() => [[firstActivity]]); + + renderResult.rerender(); + }); + + describe('should not call fn()', () => test('once', () => expect(fn).toHaveBeenCalledTimes(2))); + + test('return value should be derived from the first activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Aloha!' })); + }); + }); + + describe('when all activities are removed', () => { + beforeEach(() => { + useActivities.mockImplementationOnce(() => [[]]); + + renderResult.rerender(); + }); + + test('should not call fn()', () => expect(fn).toHaveBeenCalledTimes(1)); + test('return value should be undefined', () => expect(useReduceActivities).toHaveLastReturnedWith(undefined)); + }); + + describe('when activities are unchanged', () => { + beforeEach(() => { + useActivities.mockImplementationOnce(() => [[firstActivity]]); + + renderResult.rerender(); + }); + + test('should not call fn()', () => expect(fn).toHaveBeenCalledTimes(1)); + test('return value should be derived from the first activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Aloha!' })); + }); + }); +}); diff --git a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts new file mode 100644 index 0000000000..2d956277ff --- /dev/null +++ b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts @@ -0,0 +1,46 @@ +import { type WebChatActivity } from 'botframework-webchat-core'; +import { useActivities } from '../../../hooks'; +import useMemoWithPrevious from './useMemoWithPrevious'; + +type Entry = Readonly<{ + activity: WebChatActivity; + value: T | undefined; +}>; + +export default function useReduceActivities( + fn: (prevValue: T, activity: WebChatActivity, index: number, activities: Readonly) => T +): T { + const [activities] = useActivities(); + + const state = useMemoWithPrevious[]>( + (state = Object.freeze([])) => { + let changed = activities.length !== state.length; + let prevValue: T | undefined; + + const nextState = activities.map>((activity, index) => { + const entry = state[+index]; + + if (Object.is(entry?.activity, activity)) { + prevValue = entry?.value; + + // Skips the activity if it has been reduced in the past render loop. + return entry; + } + + changed = true; + + return Object.freeze({ + activity, + value: (prevValue = fn(prevValue, activity, index, activities)) + }); + }); + + // Returns the original array if nothing changed. + return changed ? nextState : state; + }, + [activities, fn] + ); + + // eslint-disable-next-line no-magic-numbers + return state.at(-1)?.value; +} From 36ce1244c60051626a2b25f687cc8f892c64e354 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 06:11:54 +0000 Subject: [PATCH 24/54] Supports typing from multiple livestreams --- .../hooks.useActiveTyping.livestream.html | 2 +- .../raceBetweenChunkAndEmpty.html.snap-3.png | Bin 0 -> 14684 bytes package-lock.json | 13 ++ packages/api/package.json | 1 + .../ActivityTyping/ActivityTypingComposer.tsx | 147 +++++++++++++++--- 5 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 __tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-3.png diff --git a/__tests__/html/hooks.useActiveTyping.livestream.html b/__tests__/html/hooks.useActiveTyping.livestream.html index a191e61881..64c96c3df0 100644 --- a/__tests__/html/hooks.useActiveTyping.livestream.html +++ b/__tests__/html/hooks.useActiveTyping.livestream.html @@ -74,7 +74,7 @@ { bot: { at: 600, - expireAt: 5600, + expireAt: Infinity, name: 'Bot', role: 'bot', type: 'livestream' diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-3.png b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a94ff685036ff6e0a841bdeb4cebfd31b556e33c GIT binary patch literal 14684 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 Lb|&l8)jR(IU;Pot literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 3cd753cda7..515579dbca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13099,6 +13099,18 @@ "url": "https://bevry.me/fund" } }, + "node_modules/iter-fest": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/iter-fest/-/iter-fest-0.2.1.tgz", + "integrity": "sha512-e6pj1pYuem1/UO/OkTBP7q9v7WMIRmw8fHT8Jld+099bGp8Hfq7Rg2g8A+esjPdj1JJ9vTvAPgIwJJj5frQe1A==", + "license": "MIT", + "dependencies": { + "iter-fest": "^0.2.1" + }, + "peerDependencies": { + "core-js-pure": "^3.37.1" + } + }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -24325,6 +24337,7 @@ "dependencies": { "botframework-webchat-core": "0.0.0-0", "globalize": "1.7.0", + "iter-fest": "^0.2.1", "math-random": "2.0.1", "prop-types": "15.8.1", "react-chain-of-responsibility": "0.2.0", diff --git a/packages/api/package.json b/packages/api/package.json index bfd78f1ae4..2b30b169fe 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -131,6 +131,7 @@ "dependencies": { "botframework-webchat-core": "0.0.0-0", "globalize": "1.7.0", + "iter-fest": "^0.2.1", "math-random": "2.0.1", "prop-types": "15.8.1", "react-chain-of-responsibility": "0.2.0", diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index 24f4709c46..47d1445fab 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -1,4 +1,5 @@ import { getActivityLivestreamingMetadata, type WebChatActivity } from 'botframework-webchat-core'; +import { iteratorFind } from 'iter-fest'; import React, { memo, useCallback, useMemo, type ReactNode } from 'react'; import numberWithInfinity from '../../hooks/private/numberWithInfinity'; @@ -7,6 +8,28 @@ import ActivityTypingContext, { ActivityTypingContextType } from './private/Cont import useReduceActivities from './private/useReduceActivities'; import { type AllTyping } from './types/AllTyping'; +type Entry = { + livestreamActivities: Map< + string, + { + activity: WebChatActivity; + contentful: boolean; + firstReceivedAt: number; + lastReceivedAt: number; + } + >; + name: string | undefined; + role: 'bot' | 'user'; + typingIndicator: + | { + activity: WebChatActivity; + duration: number; + firstReceivedAt: number; + lastReceivedAt: number; + } + | undefined; +}; + type Props = Readonly<{ children?: ReactNode | undefined }>; const ActivityTypingComposer = ({ children }: Props) => { @@ -14,42 +37,126 @@ const ActivityTypingComposer = ({ children }: Props) => { const reducer = useCallback( ( - prevTypingState: ReadonlyMap | undefined, + prevTypingState: ReadonlyMap> | undefined, activity: WebChatActivity - ): ReadonlyMap | undefined => { + ): ReadonlyMap> | undefined => { const { - from, - from: { id, role }, + from: { id, name, role }, type } = activity; + if (role === 'channel') { + return prevTypingState; + } + + // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. + const receivedAt = activity.channelData.webChat.receivedAt || Date.now(); + const livestreamingMetadata = getActivityLivestreamingMetadata(activity); const typingState = new Map(prevTypingState); + const existingEntry = typingState.get(id); + const mutableEntry: Entry = { + typingIndicator: undefined, + ...existingEntry, + livestreamActivities: new Map(existingEntry?.livestreamActivities), + name, + role + }; + + if (livestreamingMetadata) { + mutableEntry.typingIndicator = undefined; + + const { sessionId } = livestreamingMetadata; - if (type === 'message' || livestreamingMetadata?.type === 'final activity') { - // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. - typingState.delete(id); - } else if (type === 'typing' && (role === 'bot' || role === 'user')) { - const currentTyping = typingState.get(id); - // TODO: When we rework on types of DLActivity, we will make sure all activities has "webChat.receivedAt", this coalesces can be removed. - const receivedAt = activity.channelData.webChat?.receivedAt || Date.now(); - - typingState.set(id, { - firstReceivedAt: currentTyping?.firstReceivedAt || receivedAt, - lastActivityDuration: numberWithInfinity(activity.channelData.webChat?.styleOptions?.typingAnimationDuration), - lastReceivedAt: receivedAt, - name: from.name, - role, - type: livestreamingMetadata && livestreamingMetadata.type !== 'indicator only' ? 'livestream' : 'busy' + if (livestreamingMetadata.type === 'final activity') { + mutableEntry.livestreamActivities.delete(sessionId); + } else { + mutableEntry.livestreamActivities.set( + sessionId, + Object.freeze({ + firstReceivedAt: Date.now(), + ...mutableEntry.livestreamActivities.get(sessionId), + activity, + contentful: livestreamingMetadata.type !== 'indicator only', + lastReceivedAt: receivedAt + }) + ); + } + } else if (type === 'message') { + mutableEntry.typingIndicator = undefined; + } else if (type === 'typing') { + mutableEntry.typingIndicator = Object.freeze({ + activity, + duration: numberWithInfinity(activity.channelData.webChat?.styleOptions?.typingAnimationDuration), + firstReceivedAt: mutableEntry.typingIndicator?.firstReceivedAt || Date.now(), + lastReceivedAt: receivedAt }); } + typingState.set(id, Object.freeze(mutableEntry)); + return Object.freeze(typingState); }, [Date] ); - const allTyping: ReadonlyMap = useReduceActivities(reducer) || Object.freeze(new Map()); + const state: ReadonlyMap = useReduceActivities(reducer) || Object.freeze(new Map()); + + const allTyping = useMemo(() => { + const map = new Map(); + + for (const [id, entry] of state.entries()) { + const firstContentfulLivestream = iteratorFind( + entry.livestreamActivities.values(), + ({ contentful }) => contentful + ); + + const firstContentlessLivestream = iteratorFind( + entry.livestreamActivities.values(), + ({ contentful }) => !contentful + ); + + if (firstContentfulLivestream) { + map.set( + id, + Object.freeze({ + firstReceivedAt: firstContentfulLivestream.firstReceivedAt, + lastActivityDuration: Infinity, + lastReceivedAt: firstContentfulLivestream.lastReceivedAt, + name: entry.name, + role: entry.role, + type: 'livestream' + } satisfies AllTyping) + ); + } else if (firstContentlessLivestream) { + map.set( + id, + Object.freeze({ + firstReceivedAt: firstContentlessLivestream.firstReceivedAt, + lastActivityDuration: Infinity, + lastReceivedAt: firstContentlessLivestream.lastReceivedAt, + name: entry.name, + role: entry.role, + type: 'busy' + } satisfies AllTyping) + ); + } else if (entry.typingIndicator) { + map.set( + id, + Object.freeze({ + firstReceivedAt: entry.typingIndicator.firstReceivedAt, + lastActivityDuration: entry.typingIndicator.duration, + lastReceivedAt: entry.typingIndicator.lastReceivedAt, + name: entry.name, + role: entry.role, + type: 'busy' + } satisfies AllTyping) + ); + } + } + + return map; + }, [state]); const allTypingState = useMemo(() => Object.freeze([allTyping] as const), [allTyping]); From 774ac06d92ea05538dd91a34b0bb7be6a507cd77 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 06:14:19 +0000 Subject: [PATCH 25/54] Fix test --- __tests__/html/hooks.useActiveTyping.html | 38 +++++++++++++---------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/__tests__/html/hooks.useActiveTyping.html b/__tests__/html/hooks.useActiveTyping.html index 26f07fc6ba..49897719fc 100644 --- a/__tests__/html/hooks.useActiveTyping.html +++ b/__tests__/html/hooks.useActiveTyping.html @@ -90,22 +90,28 @@ await pageObjects.typeInSendBox('.'); // THEN: `useActiveTyping` should return both. - await expect(renderWithFunction(() => Object.values(useActiveTyping()[0]))).resolves.toEqual([ - { - at: 600, - expireAt: 5600, - name: expect.any(String), - role: 'bot', - type: 'busy' - }, - { - at: 600, - expireAt: 5600, - name: expect.any(String), - role: 'user', - type: 'busy' - } - ]); + const hookResult = await renderWithFunction(() => Object.values(useActiveTyping()[0])); + + expect(hookResult).toHaveLength(2); + + expect(hookResult).toEqual( + expect.arrayContaining([ + { + at: 600, + expireAt: 5600, + name: expect.any(String), + role: 'bot', + type: 'busy' + }, + { + at: 600, + expireAt: 5600, + name: expect.any(String), + role: 'user', + type: 'busy' + } + ]) + ); }); From 3b66bdcf820f03063d65c06abb8025bc7c51ec7f Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 07:27:05 +0000 Subject: [PATCH 26/54] Add test --- .../contentlessLivestreamForever.html | 77 ++++++++++++++++++ ...ntentlessLivestreamForever.html.snap-1.png | Bin 0 -> 7623 bytes ...ntentlessLivestreamForever.html.snap-2.png | Bin 0 -> 7623 bytes 3 files changed, 77 insertions(+) create mode 100644 __tests__/html2/livestream/contentlessLivestreamForever.html create mode 100644 __tests__/html2/livestream/contentlessLivestreamForever.html.snap-1.png create mode 100644 __tests__/html2/livestream/contentlessLivestreamForever.html.snap-2.png diff --git a/__tests__/html2/livestream/contentlessLivestreamForever.html b/__tests__/html2/livestream/contentlessLivestreamForever.html new file mode 100644 index 0000000000..19e69f0741 --- /dev/null +++ b/__tests__/html2/livestream/contentlessLivestreamForever.html @@ -0,0 +1,77 @@ + + + + + + + + + + + +
+ + + + diff --git a/__tests__/html2/livestream/contentlessLivestreamForever.html.snap-1.png b/__tests__/html2/livestream/contentlessLivestreamForever.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 Date: Tue, 11 Mar 2025 07:35:00 +0000 Subject: [PATCH 27/54] Upgrade tests --- .../hooks/useActiveTyping.variable.html} | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) rename __tests__/{html/hooks.useActiveTyping.variable.html => html2/hooks/useActiveTyping.variable.html} (84%) diff --git a/__tests__/html/hooks.useActiveTyping.variable.html b/__tests__/html2/hooks/useActiveTyping.variable.html similarity index 84% rename from __tests__/html/hooks.useActiveTyping.variable.html rename to __tests__/html2/hooks/useActiveTyping.variable.html index 51eb270eaa..82e3d39df2 100644 --- a/__tests__/html/hooks.useActiveTyping.variable.html +++ b/__tests__/html2/hooks/useActiveTyping.variable.html @@ -13,6 +13,7 @@
+ + + + +
+ + + + diff --git a/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html.snap-1.png b/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9415f63a05fefc0a60067df4b29c19414d08f2e6 GIT binary patch literal 7623 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 Hc Date: Tue, 11 Mar 2025 19:23:33 +0000 Subject: [PATCH 30/54] Rename to contentless --- .../livestream/raceBetweenLivestreamAndTypingIndicator.html | 2 +- packages/api/src/decorator/private/ActivityDecorator.tsx | 4 ++-- .../src/providers/ActivityTyping/ActivityTypingComposer.tsx | 2 +- .../src/Middleware/Activity/createCoreMiddleware.tsx | 5 ++--- .../core/src/utils/getActivityLivestreamingMetadata.spec.ts | 5 ++--- packages/core/src/utils/getActivityLivestreamingMetadata.ts | 6 +++--- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html index 024e254575..4d7fb4c721 100644 --- a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html +++ b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html @@ -49,7 +49,7 @@ // SETUP: Should display no message. expect(pageElements.activities()).toHaveLength(0); - // WHEN: Receive a livestream message with typing indicator only. + // WHEN: Receive a contentless livestream message. const streamId = crypto.randomUUID(); await directLine.emulateIncomingActivity({ diff --git a/packages/api/src/decorator/private/ActivityDecorator.tsx b/packages/api/src/decorator/private/ActivityDecorator.tsx index 63294621a3..ec28cf77f9 100644 --- a/packages/api/src/decorator/private/ActivityDecorator.tsx +++ b/packages/api/src/decorator/private/ActivityDecorator.tsx @@ -21,8 +21,8 @@ function ActivityDecorator({ activity, children }: Readonly<{ activity?: WebChat ? 'preparing' : type === 'interim activity' ? 'ongoing' - : type === 'indicator only' - ? undefined // No bubble is shown for "indicator only" livestream, should not decorate. + : type === 'contentless' + ? undefined // No bubble is shown for "contentless" livestream, should not decorate. : undefined, from: supportedActivityRoles.includes(activity?.from?.role) ? activity?.from?.role : undefined }; diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index 47d1445fab..dfd7471515 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -77,7 +77,7 @@ const ActivityTypingComposer = ({ children }: Props) => { firstReceivedAt: Date.now(), ...mutableEntry.livestreamActivities.get(sessionId), activity, - contentful: livestreamingMetadata.type !== 'indicator only', + contentful: livestreamingMetadata.type !== 'contentless', lastReceivedAt: receivedAt }) ); diff --git a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx index 38627e7b6e..bd1025c262 100644 --- a/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx +++ b/packages/component/src/Middleware/Activity/createCoreMiddleware.tsx @@ -21,10 +21,9 @@ export default function createCoreMiddleware(): ActivityMiddleware[] { type === 'conversationUpdate' || type === 'event' || type === 'invoke' || - // Do not show livestream interims of "indicator only", or - // livestream interims without content (i.e. finalized activity without content.) + // Do not show content for contentless livestream interims, or finalized activity without content. (type === 'typing' && - (getActivityLivestreamingMetadata(activity)?.type === 'indicator only' || !activity['text'])) || + (getActivityLivestreamingMetadata(activity)?.type === 'contentless' || !activity['text'])) || (type === 'message' && // Do not show postback (activity.channelData?.postBack || diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts index 4b7e77b084..4969bfdc76 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.spec.ts @@ -105,7 +105,6 @@ test('activity with "streamType" of "streaming" without critical fields should r describe.each([ ['integer', 1, true], ['zero', 0, false], - // eslint-disable-next-line no-magic-numbers ['decimal', 1.234, false] ])('activity with %s "streamSequence" should return undefined', (_, streamSequence, isValid) => { const activity = { @@ -144,11 +143,11 @@ describe('"typing" activity with "streamType" of "final"', () => { ).toHaveProperty('type', 'final activity')); }); -test('activity with "streamType" of "streaming" without "content" should return type of "interim activity"', () => +test('activity with "streamType" of "streaming" without "content" should return type of "contentless"', () => expect( getActivityLivestreamingMetadata({ channelData: { streamSequence: 1, streamType: 'streaming' }, id: 'a-00001', type: 'typing' } as any) - ).toHaveProperty('type', 'indicator only')); + ).toHaveProperty('type', 'contentless')); diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.ts index 8fc2f8e6d4..eeed1599eb 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.ts @@ -71,7 +71,7 @@ const livestreamingActivitySchema = union([ * - `sessionId` - ID of the livestreaming session * - `sequenceNumber` - sequence number of the activity * - `type` - * - `"indicator only"` - ongoing but empty response, should show indicator only + * - `"contentless"` - ongoing but no content, should show indicator * - `"interim activity"` - current response, could be partial-from-start, or complete response. * More activities are expected. Future interim activities always replace past interim activities, enable erasing or backtracking response. * - `"informative message"` - optional side-channel informative message describing the current response, e.g. "Searching your document library". @@ -86,7 +86,7 @@ export default function getActivityLivestreamingMetadata(activity: WebChatActivi | Readonly<{ sessionId: string; sequenceNumber: number; - type: 'final activity' | 'informative message' | 'interim activity' | 'indicator only'; + type: 'contentless' | 'final activity' | 'informative message' | 'interim activity'; }> | undefined { const result = safeParse(livestreamingActivitySchema, activity); @@ -108,7 +108,7 @@ export default function getActivityLivestreamingMetadata(activity: WebChatActivi sequenceNumber: output.channelData.streamSequence, sessionId, type: !output.text - ? 'indicator only' + ? 'contentless' : output.channelData.streamType === 'informative' ? 'informative message' : 'interim activity' From c76536485ae9aac8b7791d338fc46ad42bef5256 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 19:24:52 +0000 Subject: [PATCH 31/54] Remove upgraded test --- __tests__/html/hooks.useActiveTyping.variable.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 __tests__/html/hooks.useActiveTyping.variable.js diff --git a/__tests__/html/hooks.useActiveTyping.variable.js b/__tests__/html/hooks.useActiveTyping.variable.js deleted file mode 100644 index d750821f8b..0000000000 --- a/__tests__/html/hooks.useActiveTyping.variable.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ - -describe('useActiveTyping', () => { - test('should support variable timing', () => runHTML('hooks.useActiveTyping.variable.html')); -}); From 6e6d0a1a4f752306b8a4e72553292587b4aa4035 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 19:28:01 +0000 Subject: [PATCH 32/54] Fix ESLint --- packages/component/src/hooks/internal/useMemoized.spec.jsx | 4 ++-- packages/core/src/utils/dateToLocaleISOString.chatham.spec.js | 1 - packages/core/src/utils/dateToLocaleISOString.japan.spec.js | 1 - .../core/src/utils/dateToLocaleISOString.newfoundland.spec.js | 1 - packages/core/src/utils/dateToLocaleISOString.pacific.spec.js | 1 - packages/core/src/utils/dateToLocaleISOString.utc.spec.js | 2 -- packages/test/harness/src/common/marshal.spec.js | 1 - packages/test/harness/src/common/unmarshal.spec.js | 1 - 8 files changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/component/src/hooks/internal/useMemoized.spec.jsx b/packages/component/src/hooks/internal/useMemoized.spec.jsx index be9478cf76..8ae3b994a6 100644 --- a/packages/component/src/hooks/internal/useMemoized.spec.jsx +++ b/packages/component/src/hooks/internal/useMemoized.spec.jsx @@ -1,7 +1,7 @@ /** @jest-environment @happy-dom/jest-environment */ -/* eslint-disable react/prop-types */ -/* eslint-disable no-undef */ + /* eslint no-magic-numbers: "off" */ + import React from 'react'; import { render } from 'react-dom'; import { act } from 'react-dom/test-utils'; diff --git a/packages/core/src/utils/dateToLocaleISOString.chatham.spec.js b/packages/core/src/utils/dateToLocaleISOString.chatham.spec.js index cc084c5300..d1c8071e25 100644 --- a/packages/core/src/utils/dateToLocaleISOString.chatham.spec.js +++ b/packages/core/src/utils/dateToLocaleISOString.chatham.spec.js @@ -6,7 +6,6 @@ import dateToLocaleISOString from './dateToLocaleISOString'; test('formatting a time in Chatham Islands timezone', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 567)); const actual = dateToLocaleISOString(date); diff --git a/packages/core/src/utils/dateToLocaleISOString.japan.spec.js b/packages/core/src/utils/dateToLocaleISOString.japan.spec.js index a5174a33ab..6304e26739 100644 --- a/packages/core/src/utils/dateToLocaleISOString.japan.spec.js +++ b/packages/core/src/utils/dateToLocaleISOString.japan.spec.js @@ -6,7 +6,6 @@ import dateToLocaleISOString from './dateToLocaleISOString'; test('formatting a time in Japan timezone', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 567)); const actual = dateToLocaleISOString(date); diff --git a/packages/core/src/utils/dateToLocaleISOString.newfoundland.spec.js b/packages/core/src/utils/dateToLocaleISOString.newfoundland.spec.js index 0f783d687a..154b100758 100644 --- a/packages/core/src/utils/dateToLocaleISOString.newfoundland.spec.js +++ b/packages/core/src/utils/dateToLocaleISOString.newfoundland.spec.js @@ -6,7 +6,6 @@ import dateToLocaleISOString from './dateToLocaleISOString'; test('formatting a time in Cananda, Newfoundland timezone', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 567)); const actual = dateToLocaleISOString(date); diff --git a/packages/core/src/utils/dateToLocaleISOString.pacific.spec.js b/packages/core/src/utils/dateToLocaleISOString.pacific.spec.js index 7bf3549774..78e7632967 100644 --- a/packages/core/src/utils/dateToLocaleISOString.pacific.spec.js +++ b/packages/core/src/utils/dateToLocaleISOString.pacific.spec.js @@ -6,7 +6,6 @@ import dateToLocaleISOString from './dateToLocaleISOString'; test('formatting a time in Pacific Standard Time timezone', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 567)); const actual = dateToLocaleISOString(date); diff --git a/packages/core/src/utils/dateToLocaleISOString.utc.spec.js b/packages/core/src/utils/dateToLocaleISOString.utc.spec.js index 610f0b2d85..5e3615826f 100644 --- a/packages/core/src/utils/dateToLocaleISOString.utc.spec.js +++ b/packages/core/src/utils/dateToLocaleISOString.utc.spec.js @@ -6,7 +6,6 @@ import dateToLocaleISOString from './dateToLocaleISOString'; test('formatting a time in UTC timezone', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 567)); const actual = dateToLocaleISOString(date); @@ -14,7 +13,6 @@ test('formatting a time in UTC timezone', () => { }); test('formatting a time in UTC timezone with zero milliseconds', () => { - // eslint-disable-next-line no-magic-numbers const date = new Date(Date.UTC(2000, 0, 1, 0, 12, 34, 0)); const actual = dateToLocaleISOString(date); diff --git a/packages/test/harness/src/common/marshal.spec.js b/packages/test/harness/src/common/marshal.spec.js index 1e224cb6fc..08595a8d08 100644 --- a/packages/test/harness/src/common/marshal.spec.js +++ b/packages/test/harness/src/common/marshal.spec.js @@ -44,7 +44,6 @@ describe('Marshalling value of', () => { }); test('array', () => { - // eslint-disable-next-line no-magic-numbers expect(marshal([true, ERROR, 123, null, 'string', undefined])).toMatchInlineSnapshot(` Array [ true, diff --git a/packages/test/harness/src/common/unmarshal.spec.js b/packages/test/harness/src/common/unmarshal.spec.js index 189442496a..a690516cb2 100644 --- a/packages/test/harness/src/common/unmarshal.spec.js +++ b/packages/test/harness/src/common/unmarshal.spec.js @@ -40,7 +40,6 @@ describe('Unmarshalling value of', () => { expect( unmarshal([ true, - // eslint-disable-next-line no-magic-numbers 123, null, 'string', From fd16f908bcc8b5515b0c8f8f1eb1bf8c59fa4873 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 19:29:21 +0000 Subject: [PATCH 33/54] Fix flaky tests --- __tests__/html/conversationStartProperties.noLocaleIsSent.html | 2 +- __tests__/html/conversationStartProperties.sendEnUs.html | 2 +- __tests__/html/conversationStartProperties.sendInvalidType.html | 2 +- __tests__/html/conversationStartProperties.sendNonExisting.html | 2 +- .../html/conversationStartProperties.sendNonISOFormat.html | 2 +- __tests__/html/conversationStartProperties.sendZhCn.html | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/__tests__/html/conversationStartProperties.noLocaleIsSent.html b/__tests__/html/conversationStartProperties.noLocaleIsSent.html index 3b5ded88c6..b673b24242 100644 --- a/__tests__/html/conversationStartProperties.noLocaleIsSent.html +++ b/__tests__/html/conversationStartProperties.noLocaleIsSent.html @@ -24,7 +24,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); diff --git a/__tests__/html/conversationStartProperties.sendEnUs.html b/__tests__/html/conversationStartProperties.sendEnUs.html index 8083d75c27..74821374f9 100644 --- a/__tests__/html/conversationStartProperties.sendEnUs.html +++ b/__tests__/html/conversationStartProperties.sendEnUs.html @@ -27,7 +27,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); diff --git a/__tests__/html/conversationStartProperties.sendInvalidType.html b/__tests__/html/conversationStartProperties.sendInvalidType.html index a9ff9bff46..4dceace762 100644 --- a/__tests__/html/conversationStartProperties.sendInvalidType.html +++ b/__tests__/html/conversationStartProperties.sendInvalidType.html @@ -27,7 +27,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); diff --git a/__tests__/html/conversationStartProperties.sendNonExisting.html b/__tests__/html/conversationStartProperties.sendNonExisting.html index 8437c39037..84d28b24ea 100644 --- a/__tests__/html/conversationStartProperties.sendNonExisting.html +++ b/__tests__/html/conversationStartProperties.sendNonExisting.html @@ -27,7 +27,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); diff --git a/__tests__/html/conversationStartProperties.sendNonISOFormat.html b/__tests__/html/conversationStartProperties.sendNonISOFormat.html index 2de71308d8..edab8d154c 100644 --- a/__tests__/html/conversationStartProperties.sendNonISOFormat.html +++ b/__tests__/html/conversationStartProperties.sendNonISOFormat.html @@ -27,7 +27,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); diff --git a/__tests__/html/conversationStartProperties.sendZhCn.html b/__tests__/html/conversationStartProperties.sendZhCn.html index 5a806c1e1b..7cbcc79306 100644 --- a/__tests__/html/conversationStartProperties.sendZhCn.html +++ b/__tests__/html/conversationStartProperties.sendZhCn.html @@ -27,7 +27,7 @@ await pageConditions.uiConnected(); await pageObjects.sendMessageViaSendBox('conversationstart'); - await pageConditions.minNumActivitiesShown(1); + await pageConditions.minNumActivitiesShown(2); await host.snapshot(); }); From dd35b787d7ac25a1a2580d8a3de53e342fb19e70 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 20:09:56 +0000 Subject: [PATCH 34/54] Add test --- .../livestream/contentless.carouselLayout.html | 9 +++++++++ ...> contentless.carouselLayout.html.snap-1.png} | Bin .../{asTypingIndicator.html => contentless.html} | 5 ++++- .../html2/livestream/contentless.html.snap-1.png | Bin 0 -> 7623 bytes 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 __tests__/html2/livestream/contentless.carouselLayout.html rename __tests__/html2/livestream/{asTypingIndicator.html.snap-1.png => contentless.carouselLayout.html.snap-1.png} (100%) rename __tests__/html2/livestream/{asTypingIndicator.html => contentless.html} (92%) create mode 100644 __tests__/html2/livestream/contentless.html.snap-1.png diff --git a/__tests__/html2/livestream/contentless.carouselLayout.html b/__tests__/html2/livestream/contentless.carouselLayout.html new file mode 100644 index 0000000000..43a17b9fbb --- /dev/null +++ b/__tests__/html2/livestream/contentless.carouselLayout.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/html2/livestream/asTypingIndicator.html.snap-1.png b/__tests__/html2/livestream/contentless.carouselLayout.html.snap-1.png similarity index 100% rename from __tests__/html2/livestream/asTypingIndicator.html.snap-1.png rename to __tests__/html2/livestream/contentless.carouselLayout.html.snap-1.png diff --git a/__tests__/html2/livestream/asTypingIndicator.html b/__tests__/html2/livestream/contentless.html similarity index 92% rename from __tests__/html2/livestream/asTypingIndicator.html rename to __tests__/html2/livestream/contentless.html index 94c2dd3415..db0d840832 100644 --- a/__tests__/html2/livestream/asTypingIndicator.html +++ b/__tests__/html2/livestream/contentless.html @@ -18,6 +18,8 @@ From 29c3e833752f11e0179377bb0f1771c17e8dbec3 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 20:28:04 +0000 Subject: [PATCH 37/54] Add snapshot --- .../raceBetweenChunkAndEmpty.html.snap-4.png | Bin 0 -> 13167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 __tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-4.png diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-4.png b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-4.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb GIT binary patch literal 13167 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 Date: Tue, 11 Mar 2025 22:58:29 +0000 Subject: [PATCH 38/54] Add decorator --- __tests__/html2/livestream/activityOrder.html | 22 ++++----- .../livestream/activityOrder.html.snap-5.png | Bin 26765 -> 27401 bytes .../html2/livestream/backtrackToEmpty.html | 27 ++++++----- .../backtrackToTypingIndicator.html | 23 ++++++++- .../html2/livestream/batchedActivities.html | 30 +++++++----- .../batchedActivities.html.snap-1.png | Bin 13398 -> 13980 bytes __tests__/html2/livestream/chunk.html | 30 +++++++----- .../html2/livestream/chunk.html.snap-4.png | Bin 19846 -> 20442 bytes .../html2/livestream/concludedLivestream.html | 30 +++++++----- .../concludedLivestream.html.snap-2.png | Bin 13167 -> 13766 bytes .../concludedLivestream.html.snap-3.png | Bin 13167 -> 13766 bytes .../concludedLivestream.html.snap-4.png | Bin 13167 -> 13766 bytes __tests__/html2/livestream/contentless.html | 27 ++++++++++- .../html2/livestream/css/pauseAnimation.css | 5 ++ __tests__/html2/livestream/informative.html | 36 +++++++++----- .../livestream/informative.html.snap-1.png | Bin 17141 -> 17569 bytes __tests__/html2/livestream/outOfOrder.html | 28 +++++++---- .../livestream/outOfOrder.html.snap-4.png | Bin 19846 -> 20442 bytes .../livestream/outOfOrder.sequenceNumber.html | 30 +++++++----- .../outOfOrder.sequenceNumber.html.snap-4.png | Bin 19846 -> 20442 bytes .../livestream/raceBetweenChunkAndEmpty.html | 25 +++++++++- .../raceBetweenChunkAndEmpty.html.snap-3.png | Bin 14684 -> 15257 bytes .../raceBetweenChunkAndEmpty.html.snap-4.png | Bin 13167 -> 13766 bytes ...ceBetweenLivestreamAndTypingIndicator.html | 23 ++++++++- ...vestreamAndTypingIndicator.html.snap-3.png | Bin 13167 -> 13766 bytes ...BetweenTypingAndContentlessLivestream.html | 23 ++++++++- .../livestream/regretWithEmptyMessage.html | 27 ++++++++--- __tests__/html2/livestream/simultaneous.html | 35 ++++++++++---- .../livestream/simultaneous.html.snap-5.png | Bin 24141 -> 24807 bytes .../livestream/simultaneous.html.snap-6.png | Bin 26931 -> 28138 bytes ...hAttachment.carouselLayout.html.snap-3.png | Bin 13167 -> 13766 bytes .../html2/livestream/withAttachment.html | 44 ++++++------------ .../livestream/withAttachment.html.snap-3.png | Bin 13167 -> 13766 bytes 33 files changed, 320 insertions(+), 145 deletions(-) create mode 100644 __tests__/html2/livestream/css/pauseAnimation.css diff --git a/__tests__/html2/livestream/activityOrder.html b/__tests__/html2/livestream/activityOrder.html index 7444577eec..72c1fdcd29 100644 --- a/__tests__/html2/livestream/activityOrder.html +++ b/__tests__/html2/livestream/activityOrder.html @@ -2,7 +2,7 @@ - + @@ -11,15 +11,15 @@
- + @@ -11,15 +11,15 @@
- + @@ -20,7 +23,12 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + Components: { ReactWebChat }, + decorator: { WebChatDecorator } + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); @@ -30,7 +38,18 @@ typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` }; - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store, + styleOptions + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/batchedActivities.html b/__tests__/html2/livestream/batchedActivities.html index 4be25c5c1d..d4e8f72e24 100644 --- a/__tests__/html2/livestream/batchedActivities.html +++ b/__tests__/html2/livestream/batchedActivities.html @@ -2,6 +2,7 @@ + @@ -15,7 +16,10 @@ const { React: { createElement }, ReactDOM: { render }, - WebChat: { ReactWebChat } + WebChat: { + Components: { ReactWebChat }, + decorator: { WebChatDecorator } + } } = window; // Imports in UMD fashion. const streamId = crypto.randomUUID(); @@ -63,17 +67,21 @@ } }); - const App = () => - createElement(ReactWebChat, { - directLine, - store, - styleOptions: { - typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` - } - }); - // WHEN: Web Chat is rendered with 2 activities in the store. - render(createElement(App), document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store, + styleOptions: { + typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` + } + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/batchedActivities.html.snap-1.png b/__tests__/html2/livestream/batchedActivities.html.snap-1.png index 2b96991cd0f962701f79ba18f94ace62e01b9b2c..707d1bbf27cdfd33dba746f00d2ffd01da225e9c 100644 GIT binary patch literal 13980 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 literal 13398 zcmeHuXH=8fw>MVCL1b(&ihu=CsUuw?#R7;l=^a!cbWtFL8peu>fKsJ|-mCN)qN36} zp%)b}gaDz15(vEeng4sg+z3hY`je2|O(?@r9`fbK< zy;S?{-Ye(geVV8LP*TeITmO&FV*7NG>EW{bWqqc^c}t%%)7*;V$B%#IPD|$;I@_q5 za{RBCw+8l^9J~4U^vlOe*H_nQ9Jni3fdhY?5$2NK5AA5x zU|}Ke#Zz~&u*|3=?fR&*_aw_H<$wS1?$ zv70H_6ZQUm)`bMG>tQRO*~BjL^MAKi#bXLWwZjB7-Y1D#RL4{AeLwhK$|=fEA+c`b zSDd^2vEY+Zx8WhK_See_wNLM?m%9wlOhsE2EEi8sPD*(9kE5b3eX=cmDCs^H!}u>`JtF{`~ovc&ch>pH#njD)RfwmoNK}@mNQfpR$ANxRq2sO0djWXK%LN z)bd8D=bR~Xqa(mjL*vc(dn|2CB(WnCJLXNUT(gLl_g%Gbe0v7@&YlcS`gCe&pJ_&I zt$C;dBTLS6b~^Y`cbXcmrFM15X{I|pC?zE&0*>$9IaNnk;@H&Y8m*t+Z&ldas}DPr zZB%G!TI*GW-S`&F4c{z@oi|TUProE2q^^6Hx?@wATAff|JvlW+$y8)!pOkr!_w3o; z;1d$xXqRWl2xk4}?!oOS+STWQfmA4s-W5s@p+%9oqPO9vAYxj2YtR0Jcg)S>b@lY< z6-1^cU%*yTadGi6ZtmPSZw}_0S9QB?b;z&9e+%U+{PN}I*Mm2(Ciu_GpGB*u&!T)*?D2|`k&$S$=XB>8r>>Oequ6nOG

( z+SJ3Nl(7CYsDUu|t1ZrK`B$4ubHpV>Lql|p=Uj0_#Ic&W^5I(Bl+@HYN@n6}&6uXl zs7*{v%oqip#CL14p{>>V=a*NUr%ugUNPA4*aT+eq7cnXRQtmu>zmT|Hy^oc3n7G5F zO@ug2Hoohtd}Lii?=zd5?n;eHOmuz9%25s{nVXgMmqbZsB5vsO=g+gWfSnqb(P|Qu zxJ_G}Oa+Qo+f##w4Qhw_us5>wPDj1~X;hz3+V@XSqhewl`YnC)=f;WS%`Gj+I?Jc0 z?TMFZLuD=egCkY$p}ymo6MxnnB8Q&(4Cj;exB7Zwz3 z&d|a;4wt)>sD%rd7#qJQKoO$R;leE1%>v@<+UzF9>qKeaDEPBTXQYhR%i-vUE%keXFM{*X~zEZ)-C z_<>j6XTX<6uv3o~Et?;$8Gg=XX%C-gsH=OQ2jyA1vf^P@Z1W1)3tsQZ!{IirL}qzR zjLUF&8^4L6VU$0El4)pZ`Jmqdih%^JNAw(pviI~RQo;xcOp z;SrIL=-E`I)$!sB%5(k0Ipk%|Fm=De(|f0j$_%?`(+&Z&l!?%K0oa=Ho? zJ=4=IanfF`foW3ZmR>Pi>%A;2EZi#XI_8|J5?s8^+~mWakK^&Zcj%OCC#}|Mdnvjv zRh5J0abpj`WmtN+&c9}yUW1|jT2oKTfG;uy4C0aZ=|#B?7TXFmA*U}P(bCegd{%dA zzJ|8yyDNkT)pz~Ijk%AH_l$XGiq|E``wp?ojC{u*;_t+aVl`{9G-)*)@urZFP`>}> zs$~)fkDSfDd-qlw&xNjAU`Hw+^%Yp4BqV$(>CwWlodEBI7QiYes1vAy=WJZD{JuNP zHA0J!pkUsOz(djxMr3K;Z*7RoIalWVg-)f!S&aVjl{|;86lH;?&FA;f<>xTqN>VpTWN+A1zC?)>HDVVreSd%Lt+RCu^G8qH_gIXR=go7p)jOsILfAwrm0F_33YRnWGPTCsZoD|y_5QN8q~H3(wnRlM1QGlc z#t*n|rUZ#Dp?LWC3b(eldZbt1zyFgtB^IFL<5L|g<&=@38RrPp##kM8)%GH2;pHx! zJ^LADQ8v0>(xDLU;oR|V9~);DfWPBlaeAz@OAdkxeRBYB*MOA99QdqGYk7_*;uzWd z-f>6yK@Du+Eo(gU;cPI_1Dh6Ws)~$v3Y)VMJXhRqMq7Bs0QHMjO&-xqxN2hMxA;6P zJe)9WQgr|M=lXgQ)Hsa+n=sQ~XqDf_PVik*NN*VG?ALklpy2G;vsg?pA^bdY9=B|5 zZB24AZK#)S9Z=6qQZoJ7VY}aqtTwAt*hWPC&DOW^-!Mg>}1gjqjFV@%knvF$k|L zExG-(-O%92j~q!kd`=~PrCO?DQAJf%J?s$g)r)G?6Co%`ICRZeNi~1QiVkRj1fQ8p zZSODF(|jI1dSqwg_gJ>eU%mTBec*YLB`b-~_u93`Y1Y1p`a8B}CMK8EhH9{davsx3 zQ!UX{?EpqNbelpjpQ0tuQ!fad!n{1;Czlr`S1=KYiM0HQ z>SM=_T@(<==;IDi2|nrFVI5hG7S7pjsVi6{k>x;;^Afl?k=L68XI4fK>es@ zpY)v3y>ll?%BipSq?Ln1_R`W)Z4V|tJg4E|)y$<4e=gY~YZqJFblh6axI<^swdVHr zzJTpzK6c)#mDegv`cVrYa`tu zrsd9;CLe-Hz+#7Bbfp)A`%w9!!>4Lz!+)L z(5p)?$9$+FPysiBxWxLBu08drXP3DZ#wlu^1#mH)xU-d6?mAvj=F~p}p2R5EFh3$T zHs|pk)*Pq)0;C}_&Z|dF2Z_~nzBwV$3oi=~se!|*j_tUo3A(xyS|aPw#5aWWnwy%s z))yx*E7Lj{KyV}TN6+Q3^LfBXCPGF9y-+b2;7=hL86%LbSVBY3owX77P>`#cAjb?* z*!kW~8nF;$q8@W|ZLR#w&Pt{t30zBlQ}_jHxVA! zm+Wk>5iw()pp@qxv+^#WXkZQU%Up*0P>2Ab4p$UHXPO0Zip+MY@|A7Q*K|~S&drFp zrx0YJ_3i;b6gM{BqV^Xi=35cRIE9Vxf^fpsgc-=VP2S>`eV9aG%;fgv7znYkv6TQw zZh~hc*n-Azg5yNgB_a(?O3;JQ19?#Wec%s=i>w2|R`fAeC==LW5HTCeWV7qnpTJ6n zKR;({Yn|l?SbqvNZS3rvN2l~O^yQgMRJ0gbfFXmA8~A(I9^tE3M`9%%?sF(^eUM-H zxCiH(8W9;ec!NXU1}q}y$&-#yWu>sIqd;eq7C1N&-wp#^-7v&vNV^P8j(+R63UE=} z+2{~CbLJE9Vjd`f)!C8`M!ua|6dpe(Q>WAyaQYuh7V9}b;s7r610cHzV5tR$WUvY% z#w!}p?C?WdKtoPWPV{Isrev_hE^*;aX+6lAR z@i6C4Pxg&@7ZO%u5sn2tCvxdh6Nn#jg`M)FM@7NhGVS-RtwjU`z7BhUc`R^7v{0>{Tcxdn(T9t<&;5Ulw1+}NtQd@kN2~vUMY$jUHh76QqoTU zgT*g&;n080ne2o+Np?a9zF_Zt`y<|0Tb>>PKwoS9y!Wa_Vn3c*Sf%uh+^umzmg&VB zTylS9x{Ey_GOe^!pF?3isi1mBP{gvfvd=-y=U0rKq)p@7zaP-_(b-qx+NajF8W`8> zt2S46jSE3jc6TP<;P&7SKS;Ft7VDu?3n-DM&8YjQwQQqeODN_cG><$n z$q^G@R(b1h2Qkz>O^85r@83^(!NFJ1p|~^RdIC&5nDkpvg}_sHz%Oi}6W(em1l_QZ zc(PYKyfIBJyf;nlD6GsF(Drpmh#{!CzI?OHY`x4JP|gtfklvoTQ5vwbeN>?jekdp+ zq6t!I2EvUouZdtE`4>v)NT5>=53mjhI5_rZy+hD1T|L?-npHfm$;iros_k`mo{5C~ z>VP#PV28Hj-7wVH))v`8UXDAgBIhaF=sRE4fWpVcGEYANGh6}o0m3=LpsPk zz&suk!7>aU$KnjzmMBV?x~Pu6egvc^9)q^g-X(Wy;T&&kXhe88^8`MBzJV{0b2Dkv zJOx^Q;Xw(!qk3)3mvBR?Z{*n@jm|Ps%#NL{&?85Vl-hTlMS=$b0Ttjr@RdEaww8X2 z%I7a!KsfTYmR27Pw}w)?km!*9YkhYNh5s!bR~%!r+rmngt^G^?(Y7t33KN(w4iJWw z*XyGKq!63ny5_po#mc}4x^BEWdcoA*K8rp(*n@ZiK*mxC1in3a@}%}@GOPH1j=?R7 z0icIiH4ERlGQ?tUY;5!;-(Yp>$p~itGWBvh0rR}a%RRkFdYL{-Cm7s%NMk>2- zOsbU`BoLr~hFiC3EIUUpXkDGZ$$}VA@G~{wzrp=t${&o%aVz*$A|}^!ZpapPx*P~C z+(s`$qo}s_DzV2vf~X%b3T#z>Qp(YWxc*hld1Gm6wJ?C$a^&by!k(f2Er#FelF?p$ z3^!Pss=2|EhSxzsbIF0c#lZH%wcaH$F$nO&Q`sVz4*)t0#Iq;%znzzfl`KZ9HA|PN z*qnSLP*_H$ABwBCh1?o5u{OF5XB5jHC*zt>(Te;QAa$O&gOgx$<_xSx?>!*d8RksN zF&GmkZnU{-gv||Cbf8?Jx23%nzQaKPSq`X#oT6aIKukD6vSd!+t$&4%8~{O}Rt%m0 zv8FaJua#5G(i!CMt~Rt=t%(juIN1O0-CYwng&uXLz1r2 zQL(!Y+LXt|=2%vc`jyqxUVZ)YWdI=r^v>E)j!%A!iIPNq@2T-7wA=w3LLA;tAV#T= zOA9X{k)!_#njM-Au<4I7haMH+DSG+wzW7~fjKyGUYikfk8IbMtJ8=evxBa${XD5w? z<=9^2E`ZxvDLZtQ+*LGvS<7SVmqD%}Np9q)p0<2C5PXSc=#QHvw@Y2eEx|f<4is6_ zC&RTJ=`*CUA95gpcgMD+IT}VlI!AL$?BH71%Vq#nU|?#RbKs~z7Vyz+HMOpNT;`{< zSF7dU!DnBRkkCs`P9F0Hl$hyEu76}VEgJ((007uV8|XsVOv-y{QZAaqqdczK1Ae-R zh2|P6b0W8;=%q9A#ON^&%DPGt_`Strx$%?}uO9luM=B8^<2ottQ|hxin+;CY9*jJO zw{)1iOp<$ug?j&;jg2Z5bmPXMXO`~h7mU{CJNo)*KmZf%A9NBM9;TR_fAaJx9aN@$ z>-)>GSG|kHB_yD5ga{CNg>BhMyn6X^0r#MGQAMo*Es4nm9U4MmyJHcsvYgUrzxAw#oHzURviFjWh3BBH59lSr@=WaL z=T;ApZbYsQ$XkE`!u1lqUX$}Jak{Cjd`VC+r|-{P$;r#T5fKq-5b>F6D>6$#FQnNe zc&mV7Ab`|6)#)rST;Up>X3F=sK>!z~*85DZBG#2akAgf;3iyZ?JqTTUVqqfd2;za3 z4Z-69%8)i!)2utX7WFLY*71j-h2+Y;tF$%nv3hAjK;HJXHWcc533PTZkOr=?HM~sDf4nmIs%|2K4 zF8DCqa>H>hE+IL&A(~ilj{ITAg5jft8`LpEjhnkWl;#W`3;Mxjtac;9j+Zi2mJ4?1 zN1M_)HP^b03?!3qeegw)9Y2@BkW++}La_Q%#=$|8j(0f!Hb!f=361^l@7)jiZ+>^TE}#M?Ov{CnRV~v+ z;GNReFBu}p@t_q*wl0F&1~Ber6RZ91GAvJOxHAeTkPRn11L;#2q!6VTs-gVim!n{Q zbZKLRJ+W<*pj7)o#pNNx7H~|xU`3Dt#OA2Bqhk)>Faj%)(a}^0ZIOIotDLqrJE(_5 z`beY=Ku%ccR%Za~kw8ZPk7|L}MYINl4^hG+`o8F9!WTn0W| zLn2VnchoXhcTB~ITM&Sge2ix}UvxVd3HC@c1?wLYzEg0)WJ9Cr+F|w5-ce>Ei0%EVp8l zQz0_v8k^8ZvKeUvMuGrhwxnFgMrfW7swo1H+L90OZ9*UAK@oED@;(5bs6fU|pF)#= zJ9f{C$H$LdpSyhltyBF)A27 zCYy>OTcSit9*kBafjUGeL#`IR^dWK7hK7(-16SjJHX0q4T~!BG=#G=?@%WQy{ZE&W z(FhP-o;I|XImZ<02l&NKsMq72=3#$-c_YZOKu|*Fg3do#{w{f`d5UF0{-3}9FBiFv zKTNuD{d(=-+g&VlBVFB}GJ2a$d$$Z|5Ql?d{yWuk*T+l0A2^@`Gt2ymcYN9(LBz*f zI6nm`f7qVo;W0$h{||q74x=VK^)lQl`)EY?&+7ii*CQXL|GlS$w*gY;6-dY&VS0yf z6!`6ks3=dlZ~Ivk?b&@;@rj9rka0rQE1v|52#u8id6@&eI@8IIW#K6)3EMe1IEVyD z`4wX`*ln14cyqC{u=m0*#&MhZkd4e^Ez#(VrR8OA$%`xxzgEqfJgvBvcnjRm>g-@D z$l8me%OYy-k7O|{vzn8EJf%lRKzF0))DkyB{jjlPcd3bty z=3{$6We%0tbx^8uAY-`$6N>7euZ4QSX3Ejlfc--O=rRI%eQqHlVdKh`E2bar zKIZjXxTdV4;s`?yBp`%B)WjiS`P*e{1hZ0f-~IO7DVRC$o>N5^oONEXK5hm z2Ld{Sc8Qc9fqaJ0cjI12EQT(r>F|WJ>!I%N0oogedprDglLQh>ufnhKO zB4(KLzWe#}XK$u9ACd>ugo@RzUxyO}+}K2>^+>z~pqT(Oc@H|tD6v~^cgO{Caa}wL zYX}uHUriNtWqk?zov>)Ule8Nj8JQj_<31i~yY$e||kF z?fhOPls6w}O(pz-b{|wIX0EKixpjp>EzE`75k{Lj;4`ActO_paWlV>l=I;R3QESJM z#03e(x_f#E%QDUbNf6c``wzGbg&Ku}A$cwc89Bf858L#@0PhOw^2TnTH)qbAF@@w@ z4l|Pm!=;PD!g+n-pFVvGOH&TwbO2oiHm?`rpmcCS<1nZt!O$luE9)YXmmz~T$mdS0 z#e$Yc;>p~?I#Wn)x}h*6?b=U0fA%a(HIx?&ED2#Q(3`=huIQpOAUwH)%s6A9mBZw~#6jxb=e-~m5W^@a zEUaIGZsVs!^c{Y9)_|6>yu3_U&qzDgCgBckh1S`)j@3 zZPDmv@-o!18cYv3t-17P-4zjZ&hTda)gDiA$ zdOcTGUfu%c1v+=`yoIBJY$yd#O;B3e5Kf|c;WL|o)Ol0LVvqxdoL2~>H)Oywq}=Fg z3^ikIJisapNm7s&HLG~w*q!zY*%O$gGnb-?`nPU1s)G5x)}a(AIV0HL z2s}RjLZY88GR23j&~k8n%h!vV1|&h!R>W4IpX6YRNHTjQ5q|b*YHEV)yC1yW3aCFp zh~Hg(YdXk!5VUxtZ19v67q6@lcPt=a)BzZfb{_cda;`8ds}q`%IcA}*3#lMK&t^Fq zUcVa`4;mGx)B;Z2d*=`bN8xfUjAcL`35khmgN$?>uOp1Rl)4NXg4Krucm+6sJn{(% z^goj?_%)Y~+697n7!1uoR7q#;A|<89z=eB{5y zR=C3oL~W`1IEq=+bF%OJ3PP%|fu1W3qL3nXfW9&uXu{%HoL=n!;h zc>x1HxAdKpGB7lBTwnMxRGofe1&WnQ74}`% zA&uyP3hRaLfZfRkQH5*iJ$Ro)f!+id5#;B;2|~>-e^{aG*R${6?;_zB#Ir^!Dlb40 zCWGX?Ew{?{5h9VpdEP{WPx($L4-=EYCf+3n9jO;ig@p2UmrBSh!$O|BO?M`rl=H}{ z+h#b4SXApH76wAq6u8O|zW}o+x4F?8qlz(~+_mIn58-VCnluQF8NXIo*BDV7!?UZw z9h?*tuNuN6U>>w9ok^?HIoKigL0;xlwo;E-3lA-=5V-un?P}(Z0n@aGf;q{9=PzF5 zAb}Z-L%}lHqHzIeGMVh_Yj#Q-CL2)NE5Jw>rKCukCGxVe#()oupFv_=5X&iM5j_(4!naoqP1R4dd<8eF2fc;?Kt?jnL5m|g-^(uQXjCj0f=;-Pyw z^38}JV-0a?41A{8sDzyxGJsTF59ZGERpbQIXf7B4qEKcKI1W{~CL*u_K#M>x9HC=h zUJS(PKl~REuhW(wZ-yx3anXlTARL6Gqzr%%=$@>(-7vg`q2&!ezlF!u9+VV7c0>1H ztvY}o1eY!(f`Aeu6Z}7$4(i7U5Ck0_STjkB3a;^s~5j< zW01%f%=k%ho0mW^{A#9YWQYI3nd?ONo7^qI()+X*(4n5XyfoH&sUtdo+ zI`}IKk1k~#+0Mo$3*M|ACET^Ou}t7N4-@Jc5eeskznBwzJDq&n3#?F($R#S+`Z3-^ zc0(WT)gOa(Kq!_A438wkaGi+`FE$SA&CukA8&xVuk^tTjhPG*--bNqRvm?_zUES^j zfZCU>zu7}TZ(8OUiQFhdE;7Mor+;iX61r7G=t?h1WNLsQB)NCUXF>_G^C_51*tM^0 zhuKfd?FPv3o^ZZdC6_35H)svUW_hqDjxfMwfLtwHoM=!Fv-GDM$kTiE5DScq*{Jqd zvgy5h$q9Z-YH-D&+VCQu@9bsz+^`V{Fxj~^C$tYRF*348rVp9S)qsnyU%x)a$@yzv z)&IYb_Tu1)6bR+kPlX;Dm#M0%ioN2Vfn}iR1~ixw`|OOt)Mflad;t%sAS>(ExZiT{ zuXcPcJiUe2kLPw%IGB5SfK!CIi3Y;|9WZDvaU+haLe=}sWM}pQ6(jYbkf;qu0j$|+ zVwSjmFMFtV5sxy~MF1M&R%9QbiS#`^%lW;>n~`Y{UQW~lG#G-9pd+0iK-?98DojQ| zhX6E-Fej1?xrVa#S^)__foHkl zcTb+OrwkaqD=8^~uunh@sSYXo&eOE-QY?QnP$Gzl!uipT|L<3dclhdT!^>hENY?N_ Q3bCjuYuzlke)q}$1Ds%5BLDyZ diff --git a/__tests__/html2/livestream/chunk.html b/__tests__/html2/livestream/chunk.html index eafd7bbf61..20aee0d85d 100644 --- a/__tests__/html2/livestream/chunk.html +++ b/__tests__/html2/livestream/chunk.html @@ -2,7 +2,7 @@ - + @@ -11,15 +11,15 @@

- + @@ -11,15 +11,15 @@
- + @@ -22,7 +25,12 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + Components: { BasicWebChat, Composer }, + decorator: { WebChatDecorator } + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); @@ -32,7 +40,22 @@ typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` }; - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement( + Composer, + { + directLine, + store, + styleOptions + }, + createElement(BasicWebChat) + ) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/css/pauseAnimation.css b/__tests__/html2/livestream/css/pauseAnimation.css new file mode 100644 index 0000000000..e47cbe4153 --- /dev/null +++ b/__tests__/html2/livestream/css/pauseAnimation.css @@ -0,0 +1,5 @@ +#webchat .border-loader__loader, +#webchat .border-flair { + animation-delay: -1s !important; + animation-play-state: paused !important; +} diff --git a/__tests__/html2/livestream/informative.html b/__tests__/html2/livestream/informative.html index a16e1f93b8..e1bf3ba066 100644 --- a/__tests__/html2/livestream/informative.html +++ b/__tests__/html2/livestream/informative.html @@ -2,6 +2,7 @@ + @@ -10,26 +11,39 @@
- + @@ -11,15 +11,15 @@
- + @@ -11,15 +11,15 @@
- + @@ -20,7 +23,12 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + decorator: { WebChatDecorator }, + ReactWebChat + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); @@ -30,7 +38,20 @@ typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` }; - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + // renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store, + styleOptions + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-3.png b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-3.png index a94ff685036ff6e0a841bdeb4cebfd31b556e33c..11123790b727f1705248ebe835f484669767e151 100644 GIT binary patch literal 15257 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 Lb|&l8)jR(IU;Pot diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-4.png b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html.snap-4.png index d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb..f57d0319acbf1d3ba07000753f0e2367b0b002a7 100644 GIT binary patch literal 13766 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

lFfD?vCH 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 + + + @@ -20,7 +23,12 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + decorator: { WebChatDecorator }, + ReactWebChat + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); @@ -30,7 +38,18 @@ typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` }; - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store, + styleOptions + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-3.png b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html.snap-3.png index d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb..f57d0319acbf1d3ba07000753f0e2367b0b002a7 100644 GIT binary patch literal 13766 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

lFfD?vCH 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 + + + @@ -20,7 +23,12 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + decorator: { WebChatDecorator }, + ReactWebChat + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); @@ -30,7 +38,18 @@ typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` }; - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store, + styleOptions + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/regretWithEmptyMessage.html b/__tests__/html2/livestream/regretWithEmptyMessage.html index 1cc1cf2b97..8f9c394df9 100644 --- a/__tests__/html2/livestream/regretWithEmptyMessage.html +++ b/__tests__/html2/livestream/regretWithEmptyMessage.html @@ -2,6 +2,9 @@ + + + @@ -20,17 +23,27 @@ run(async function () { const { - WebChat: { renderWebChat } + React: { createElement }, + ReactDOM: { render }, + WebChat: { + decorator: { WebChatDecorator }, + ReactWebChat + } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); - const styleOptions = { - // Non-animated typing indicator. - typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` - }; - - renderWebChat({ directLine, store, styleOptions }, document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/simultaneous.html b/__tests__/html2/livestream/simultaneous.html index bf06f75359..ba294ae24d 100644 --- a/__tests__/html2/livestream/simultaneous.html +++ b/__tests__/html2/livestream/simultaneous.html @@ -2,7 +2,7 @@ - + @@ -11,15 +11,22 @@

- + @@ -28,44 +29,25 @@ React: { createElement }, ReactDOM: { render }, WebChat: { - Components: { BasicWebChat, Composer }, + decorator: { WebChatDecorator }, hooks: { useActiveTyping, useActivityKeys, useGetActivitiesByKey }, ReactWebChat } } = window; // Imports in UMD fashion. const { directLine, store } = testHelpers.createDirectLineEmulator(); - let currentActivityKeysWithId = []; - let currentActiveTyping = {}; - const Monitor = () => { - const [activityKeys] = useActivityKeys(); - const [activeTyping] = useActiveTyping(); - const getActivitiesByKey = useGetActivitiesByKey(); - - currentActivityKeysWithId = Object.freeze( - activityKeys.map(key => [key, getActivitiesByKey(key).map(({ id }) => id)]) - ); - - currentActiveTyping = activeTyping; - - return false; - }; - - const styleOptions = { - // Non-animated typing indicator. - typingAnimationBackgroundImage: `url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACgDASIAAhEBAxEB/8QAGgABAQACAwAAAAAAAAAAAAAAAAYCBwMFCP/EACsQAAECBQIEBQUAAAAAAAAAAAECAwAEBQYRBxITIjFBMlFhccFScoGh8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwD0lctx023JVD9UeKOIcNoSNylkdcCMbauSmXHLOPUx8r4ZAcQtO1SM9Mj5iO1gtWo1syc7S2zMKYSptbIPNgnII8/5HBpRZ9RpaKjNVVCpUzLPAQ1nmA7qPl6fmAondRrcaqhkVTiiQrYXgglsH7vnpHc3DcNNoEimaqT4Q2s4bCRuUs+gEaLd05uNFVMmiS3o3YEwFDhlP1Z7e3WLzUuzahUKHRk0zM07TmeApvOFLGEjcM9+Xp6wFnbN0Uu5GnF0x4qW1je2tO1Sc9Djy9oRD6QWlU6PPzVSqjRlgtksttKPMcqBKiO3h/cIDacIQgEIQgEIQgP/2Q==')` - }; - - const App = () => - React.createElement( - Composer, - { directLine, store, styleOptions }, - React.createElement(BasicWebChat), - React.createElement(Monitor) - ); - - render(React.createElement(App), document.getElementById('webchat')); + render( + createElement( + WebChatDecorator, + {}, + createElement(ReactWebChat, { + directLine, + store + }) + ), + document.getElementById('webchat') + ); await pageConditions.uiConnected(); diff --git a/__tests__/html2/livestream/withAttachment.html.snap-3.png b/__tests__/html2/livestream/withAttachment.html.snap-3.png index d9b90f37b904aa846bd03eac54b56d1a2a1a7cdb..f57d0319acbf1d3ba07000753f0e2367b0b002a7 100644 GIT binary patch literal 13766 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

lFfD?vCH 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 Date: Tue, 11 Mar 2025 23:11:48 +0000 Subject: [PATCH 39/54] Update docs --- docs/LIVESTREAMING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index 7c6b39371b..4145313b9c 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -168,9 +168,9 @@ Notes: > New since 2025-02-25. -Interim activities can be empty. Web Chat will show typing indicator in lieu of message bubble. +Activities in a livestream can be empty (a.k.a. contentless activity). Web Chat will show typing indicator in lieu of message bubble. -Empty interim activities can appear in all phase of a livestream, including: start, middle, and end of the livestream. +Contentless activities can appear in all phase of a livestream, including: start, middle, and end of the livestream. ```json { @@ -188,7 +188,7 @@ Notes: - Web Chat will show a typing indicator - The typing indicator will always appear until this livestream is concluded -Interim activities can appear as the final activity of the livestream. Upon the conclusion of a livestream with an empty activity, Web Chat will remove the message bubble if it was previously shown. +Final activity can be contentless. Upon the conclusion of a livestream with a contentless activity, Web Chat will remove the message bubble if it was previously shown. ```json { @@ -207,7 +207,7 @@ Notes: - In some systems, activities with `type` of `message` requires `text` field to also be set - For best compatibility, we recommend setting the `type` to `typing` - If message bubble was shown for this livestream, it will be removed - - Traditionally, no bubbles will show when activities do not have visible contents + - Traditionally, no bubbles will show when activities do not contains any visible contents - If typing indicator was shown for this livestream, it will be removed ## Supportability @@ -361,9 +361,7 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o #### Solutions - As of this writing, no consensus has been reached on this issue - - "We don't want to show file attachments in interim activities." -- In the meanwhile, we are issuing best practices and discourage sending attachments in interim activities - - Bot should only send attachments in final activity +- For best compatibility, bot should only send attachments in final activity ### Concluding the livestream without content @@ -374,4 +372,6 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o #### Solutions -- To conclude a livestream without any contents, send the final message with `type` set to `typing`, instead of `message` +- To conclude a livestream without any contents, send the final message with `type` set to `typing` and without `text` field + - For best compatibility, bot should not use `type` of `message` with empty `text` field + - Some systems does not support handling message activity without content From 046f0ccb55c8126ebe8ece588290905f0e0a14c8 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 23:12:08 +0000 Subject: [PATCH 40/54] Typo --- docs/LIVESTREAMING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index 4145313b9c..6c277c9c42 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -368,7 +368,7 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o #### Background - Some bots may regret that they opened a livestream and prefer to conclude it without any contents -- Some systems requires `text` to be set to a non-empty string for activities with `type` of `activity` +- Some systems requires `text` to be set to a non-empty string for activities with `type` of `message` #### Solutions From 360766d0f4f9d61d2ca1d34c70371229f0b69b68 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 23:12:49 +0000 Subject: [PATCH 41/54] Clarity --- docs/LIVESTREAMING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index 6c277c9c42..fa5aa1dbf3 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -372,6 +372,6 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o #### Solutions -- To conclude a livestream without any contents, send the final message with `type` set to `typing` and without `text` field +- To conclude a livestream without any contents, send the final message with `type` set to `typing`, with `text` either unset or set to an empty string - For best compatibility, bot should not use `type` of `message` with empty `text` field - - Some systems does not support handling message activity without content + - Some systems cannot handle message activity without content From 046bb358c820229c32fd68861390d41861403017 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 23:30:25 +0000 Subject: [PATCH 42/54] Revert unneeded change --- packages/core/src/reducers/createActivitiesReducer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/reducers/createActivitiesReducer.ts b/packages/core/src/reducers/createActivitiesReducer.ts index 5f3014cad1..4cd7a2ab79 100644 --- a/packages/core/src/reducers/createActivitiesReducer.ts +++ b/packages/core/src/reducers/createActivitiesReducer.ts @@ -145,7 +145,7 @@ function upsertActivityWithSort( const isLivestreamConcluded = activities.find(targetActivity => { const targetMetadata = getActivityLivestreamingMetadata(targetActivity); - return targetMetadata && targetMetadata.sessionId === sessionId && targetMetadata.type === 'final activity'; + return targetMetadata?.sessionId === sessionId && targetMetadata.type === 'final activity'; }); if (isLivestreamConcluded) { From f47808a0285df61d5988dc3d668cf64dc446c7b3 Mon Sep 17 00:00:00 2001 From: William Wong Date: Tue, 11 Mar 2025 23:34:22 +0000 Subject: [PATCH 43/54] Allow `undefinedable` --- .../utils/getActivityLivestreamingMetadata.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.ts index eeed1599eb..1138fba9de 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.ts @@ -9,6 +9,7 @@ import { pipe, safeParse, string, + undefinedable, union } from 'valibot'; @@ -17,50 +18,56 @@ import { type WebChatActivity } from '../types/WebChatActivity'; const streamSequenceSchema = pipe(number(), integer(), minValue(1)); const livestreamingActivitySchema = union([ - // Interim can have optional "text". + // Interim. object({ channelData: object({ // "streamId" is optional for the very first activity in the session. - streamId: optional(string()), + streamId: optional(undefinedable(string())), streamSequence: streamSequenceSchema, streamType: literal('streaming') }), id: string(), - text: optional(string()), + // "text" is optional. If not set or empty, it presents a contentless activity. + text: optional(undefinedable(string())), type: literal('typing') }), - // Informative must have a "text". + // Informative message. object({ channelData: object({ // "streamId" is optional for the very first activity in the session. - streamId: optional(string()), + streamId: optional(undefinedable(string())), streamSequence: streamSequenceSchema, streamType: literal('informative') }), id: string(), + // Informative message must have "text". text: string(), type: literal('typing') }), - // Final with a message. + // Conclude with a message. object({ channelData: object({ - // "streamId" is required for the final activity in the session. The final activity must not be the sole activity in the session. + // "streamId" is required for the final activity in the session. + // The final activity must not be the sole activity in the session. streamId: pipe(string(), nonEmpty()), streamType: literal('final') }), id: string(), + // If "text" is empty, it represents "regretting" the livestream. text: string(), type: literal('message') }), - // Final without a message. + // Conclude without a message. object({ channelData: object({ - // "streamId" is required for the final activity in the session. The final activity must not be the sole activity in the session. + // "streamId" is required for the final activity in the session. + // The final activity must not be the sole activity in the session. streamId: pipe(string(), nonEmpty()), streamType: literal('final') }), id: string(), - text: optional(literal('')), // "text" field must be empty or undefined. + // If "text" is not set or empty, it represents "regretting" the livestream. + text: optional(undefinedable(literal(''))), type: literal('typing') }) ]); From b5345596757af0f26e10d481e196fe5845fb8bb6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 02:35:45 +0000 Subject: [PATCH 44/54] Fix activity without text but attachments --- .../attachmentWithoutText.carousel.html | 9 ++ ...chmentWithoutText.carousel.html.snap-1.png | Bin 0 -> 8217 bytes ...chmentWithoutText.carousel.html.snap-2.png | Bin 0 -> 8552 bytes ...chmentWithoutText.carousel.html.snap-3.png | Bin 0 -> 8713 bytes .../livestream/attachmentWithoutText.html | 152 ++++++++++++++++++ .../attachmentWithoutText.html.snap-1.png | Bin 0 -> 8217 bytes .../attachmentWithoutText.html.snap-2.png | Bin 0 -> 9468 bytes .../attachmentWithoutText.html.snap-3.png | Bin 0 -> 9623 bytes .../Activity/createCoreMiddleware.tsx | 3 +- .../utils/getActivityLivestreamingMetadata.ts | 12 +- 10 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 __tests__/html2/livestream/attachmentWithoutText.carousel.html create mode 100644 __tests__/html2/livestream/attachmentWithoutText.carousel.html.snap-1.png create mode 100644 __tests__/html2/livestream/attachmentWithoutText.carousel.html.snap-2.png create mode 100644 __tests__/html2/livestream/attachmentWithoutText.carousel.html.snap-3.png create mode 100644 __tests__/html2/livestream/attachmentWithoutText.html create mode 100644 __tests__/html2/livestream/attachmentWithoutText.html.snap-1.png create mode 100644 __tests__/html2/livestream/attachmentWithoutText.html.snap-2.png create mode 100644 __tests__/html2/livestream/attachmentWithoutText.html.snap-3.png diff --git a/__tests__/html2/livestream/attachmentWithoutText.carousel.html b/__tests__/html2/livestream/attachmentWithoutText.carousel.html new file mode 100644 index 0000000000..3063030fd3 --- /dev/null +++ b/__tests__/html2/livestream/attachmentWithoutText.carousel.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/html2/livestream/attachmentWithoutText.carousel.html.snap-1.png b/__tests__/html2/livestream/attachmentWithoutText.carousel.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..832ffa2931f810a8edab79da3b6df1e069f4080f GIT binary patch literal 8217 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 literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/attachmentWithoutText.html b/__tests__/html2/livestream/attachmentWithoutText.html new file mode 100644 index 0000000000..d9d25042f8 --- /dev/null +++ b/__tests__/html2/livestream/attachmentWithoutText.html @@ -0,0 +1,152 @@ + + + + + + + + + + + + +

+ + + + diff --git a/__tests__/html2/livestream/attachmentWithoutText.html.snap-1.png b/__tests__/html2/livestream/attachmentWithoutText.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..832ffa2931f810a8edab79da3b6df1e069f4080f GIT binary patch literal 8217 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 s9;AQOCI*eNF%0&OfA+1P>5Di11C2kJy#N3J literal 0 HcmV?d00001 diff --git a/__tests__/html2/livestream/attachmentWithoutText.html.snap-3.png b/__tests__/html2/livestream/attachmentWithoutText.html.snap-3.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9b5883e0a6e3e2bd4e9fbd70eb16b7f5f7621d GIT binary patch literal 9623 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 w)5)BLOo&Bw<8OAz`| 0))) || (type === 'message' && // Do not show postback (activity.channelData?.postBack || diff --git a/packages/core/src/utils/getActivityLivestreamingMetadata.ts b/packages/core/src/utils/getActivityLivestreamingMetadata.ts index 1138fba9de..ae18142bdb 100644 --- a/packages/core/src/utils/getActivityLivestreamingMetadata.ts +++ b/packages/core/src/utils/getActivityLivestreamingMetadata.ts @@ -1,4 +1,6 @@ import { + any, + array, integer, literal, minValue, @@ -15,11 +17,14 @@ import { import { type WebChatActivity } from '../types/WebChatActivity'; +const EMPTY_ARRAY = Object.freeze([]); + const streamSequenceSchema = pipe(number(), integer(), minValue(1)); const livestreamingActivitySchema = union([ // Interim. object({ + attachments: optional(array(any()), EMPTY_ARRAY), channelData: object({ // "streamId" is optional for the very first activity in the session. streamId: optional(undefinedable(string())), @@ -33,6 +38,7 @@ const livestreamingActivitySchema = union([ }), // Informative message. object({ + attachments: optional(array(any()), EMPTY_ARRAY), channelData: object({ // "streamId" is optional for the very first activity in the session. streamId: optional(undefinedable(string())), @@ -46,6 +52,7 @@ const livestreamingActivitySchema = union([ }), // Conclude with a message. object({ + attachments: optional(array(any()), EMPTY_ARRAY), channelData: object({ // "streamId" is required for the final activity in the session. // The final activity must not be the sole activity in the session. @@ -54,11 +61,12 @@ const livestreamingActivitySchema = union([ }), id: string(), // If "text" is empty, it represents "regretting" the livestream. - text: string(), + text: optional(undefinedable(string())), type: literal('message') }), // Conclude without a message. object({ + attachments: optional(array(any()), EMPTY_ARRAY), channelData: object({ // "streamId" is required for the final activity in the session. // The final activity must not be the sole activity in the session. @@ -114,7 +122,7 @@ export default function getActivityLivestreamingMetadata(activity: WebChatActivi : { sequenceNumber: output.channelData.streamSequence, sessionId, - type: !output.text + type: !(output.text || output.attachments?.length) ? 'contentless' : output.channelData.streamType === 'informative' ? 'informative message' From 2e449b479016c9b57243a744eca453a8f4b7679e Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 02:39:13 +0000 Subject: [PATCH 45/54] Wordings --- docs/LIVESTREAMING.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index fa5aa1dbf3..fa6a35e7a2 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -168,7 +168,7 @@ Notes: > New since 2025-02-25. -Activities in a livestream can be empty (a.k.a. contentless activity). Web Chat will show typing indicator in lieu of message bubble. +Traditionally, no bubbles will show for activities which do not have any text content or attachments, they are called contentless activity. For contentless activity in livestream, Web Chat will show typing indicator in lieu of message bubble. Contentless activities can appear in all phase of a livestream, including: start, middle, and end of the livestream. @@ -185,10 +185,11 @@ Contentless activities can appear in all phase of a livestream, including: start Notes: - `text` field can be either unset or an empty string +- `attachments` field is not set or is an empty array - Web Chat will show a typing indicator - The typing indicator will always appear until this livestream is concluded -Final activity can be contentless. Upon the conclusion of a livestream with a contentless activity, Web Chat will remove the message bubble if it was previously shown. +Final activity can be contentless. Upon the conclusion of the livestream with a contentless activity, message bubble related to the livestream will be removed. This is also called "regretting the livestream" and allows the bot to erase the response before concluding it. ```json { @@ -205,10 +206,10 @@ Notes: - `text` field can be either unset or an empty string - `type` should be `typing` - In some systems, activities with `type` of `message` requires `text` field to also be set - - For best compatibility, we recommend setting the `type` to `typing` -- If message bubble was shown for this livestream, it will be removed - - Traditionally, no bubbles will show when activities do not contains any visible contents -- If typing indicator was shown for this livestream, it will be removed + - For best compatibility, we recommend setting the `type` to `typing` and `text` field unset +- If message bubble was shown, it will be removed + - Traditionally, no bubbles will show for contentless activity +- If typing indicator was shown, it will be removed ## Supportability From ae53e1d54771d0ffe48f82a904dc35cb743910db Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 05:38:08 +0000 Subject: [PATCH 46/54] Wordings --- docs/LIVESTREAMING.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index fa6a35e7a2..e6f79c8535 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -46,6 +46,12 @@ For better UX, the informative message should be a prepared message with very lo Ephemeral message means the content should only be available for a limited time and should not be considered final. Interim activities are naturally ephemeral message. +### Concluded livestream + +> Also known as: finalized livestream. + +When a livestream is finished, it will be closed for future updates. The said livestream is a concluded livestream. + ### Bot vs. copilot > This is _not_ an official statement from Microsoft. @@ -188,6 +194,9 @@ Notes: - `attachments` field is not set or is an empty array - Web Chat will show a typing indicator - The typing indicator will always appear until this livestream is concluded +- Only activity without `text` and `attachments` are considered contentless activity + - Activities filtered out by activity and attachment middleware are not considered contentless and will not show typing indicators + - This behavior may change in the future, middleware may be taken into account when considering an activity is contentless or not Final activity can be contentless. Upon the conclusion of the livestream with a contentless activity, message bubble related to the livestream will be removed. This is also called "regretting the livestream" and allows the bot to erase the response before concluding it. From 698a0326d69382db2bcdba1ff5a986018c4fb082 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 05:44:02 +0000 Subject: [PATCH 47/54] Add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0cf52355c..00ca1c2746 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ Notes: web developers are advised to use [`~` (tilde range)](https://github.com/ - Added dedicated loading animation for messages in preparing state for Fluent theme, in PR [#5423](https://github.com/microsoft/BotFramework-WebChat/pull/5423), by [@OEvgeny](https://github.com/OEvgeny) - Resolved [#2661](https://github.com/microsoft/BotFramework-WebChat/issues/2661) and [#5352](https://github.com/microsoft/BotFramework-WebChat/issues/5352). Added speech recognition continuous mode with barge-in support, in PR [#5426](https://github.com/microsoft/BotFramework-WebChat/pull/5426), by [@RushikeshGavali](https://github.com/RushikeshGavali) and [@compulim](https://github.com/compulim) - Set `styleOptions.speechRecognitionContinuous` to `true` with a Web Speech API provider with continuous mode support +- Added support of [contentless activity in livestream](https://github.com/microsoft/BotFramework-WebChat/blob/main/docs/LIVESTREAMING.md#scenario-3-interim-activities-with-no-content), in PR [#5430](https://github.com/microsoft/BotFramework-WebChat/pull/5430), by [@compulim](https://github.com/compulim) ### Changed From d9984dc9a2342a3198c41d1241537617f39426a6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 06:21:16 +0000 Subject: [PATCH 48/54] Fix optional channelData --- .../api/src/providers/ActivityTyping/ActivityTypingComposer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx index dfd7471515..709df6a7b1 100644 --- a/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx +++ b/packages/api/src/providers/ActivityTyping/ActivityTypingComposer.tsx @@ -50,7 +50,7 @@ const ActivityTypingComposer = ({ children }: Props) => { } // A normal message activity, or final activity (which could be "message" or "typing"), will remove the typing indicator. - const receivedAt = activity.channelData.webChat.receivedAt || Date.now(); + const receivedAt = activity.channelData?.webChat?.receivedAt || Date.now(); const livestreamingMetadata = getActivityLivestreamingMetadata(activity); const typingState = new Map(prevTypingState); From 59035311fd15d9096e1b5c9eb9e587eaad6ceec6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 06:45:14 +0000 Subject: [PATCH 49/54] Upgrade tests --- __tests__/basic.js | 181 ------------------ __tests__/html2/basic/absoluteTimestamp.html | 81 ++++++++ .../basic/absoluteTimestamp.html.snap-1.png} | Bin __tests__/html2/basic/assets/surface1.jpg | Bin 0 -> 247289 bytes .../html2/basic/avatarBackgroundColor.html | 64 +++++++ .../avatarBackgroundColor.html.snap-1.png} | Bin __tests__/html2/basic/heroCard.wrapTitle.html | 89 +++++++++ .../basic/heroCard.wrapTitle.html.snap-1.png} | Bin .../html2/basic/heroCard.wrapTitle.wrap.html | 9 + .../heroCard.wrapTitle.wrap.html.snap-1.png} | Bin __tests__/html2/basic/longURL.breakAll.html | 9 + .../basic/longURL.breakAll.html.snap-1.png} | Bin __tests__/html2/basic/longURL.html | 58 ++++++ .../basic/longURL.html.snap-1.png} | Bin __tests__/html2/basic/longURL.keepAll.html | 9 + .../basic/longURL.keepAll.html.snap-1.png} | Bin .../html2/basic/thumbnailCard.wrapTitle.html | 72 +++++++ .../thumbnailCard.wrapTitle.html.snap-1.png} | Bin .../basic/thumbnailCard.wrapTitle.wrap.html | 9 + ...mbnailCard.wrapTitle.wrap.html.snap-1.png} | Bin 20 files changed, 400 insertions(+), 181 deletions(-) create mode 100644 __tests__/html2/basic/absoluteTimestamp.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-absolute-timestamp-1-snap.png => html2/basic/absoluteTimestamp.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/assets/surface1.jpg create mode 100644 __tests__/html2/basic/avatarBackgroundColor.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-avatar-background-color-1-snap.png => html2/basic/avatarBackgroundColor.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/heroCard.wrapTitle.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png => html2/basic/heroCard.wrapTitle.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/heroCard.wrapTitle.wrap.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png => html2/basic/heroCard.wrapTitle.wrap.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/longURL.breakAll.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-all-1-snap.png => html2/basic/longURL.breakAll.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/longURL.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-word-1-snap.png => html2/basic/longURL.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/longURL.keepAll.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-keep-all-1-snap.png => html2/basic/longURL.keepAll.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/thumbnailCard.wrapTitle.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png => html2/basic/thumbnailCard.wrapTitle.html.snap-1.png} (100%) create mode 100644 __tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html rename __tests__/{__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png => html2/basic/thumbnailCard.wrapTitle.wrap.html.snap-1.png} (100%) diff --git a/__tests__/basic.js b/__tests__/basic.js index 10812eceab..03caed7c29 100644 --- a/__tests__/basic.js +++ b/__tests__/basic.js @@ -22,184 +22,3 @@ test('setup', async () => { expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); }); - -test('long URLs with break-word', async () => { - const { driver, pageObjects } = await setupWebDriver(); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox( - 'https://subdomain.domain.com/pathname0/pathname1/pathname2/pathname3/pathname4/', - { waitForSend: true } - ); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('long URLs with break-all', async () => { - const WEB_CHAT_PROPS = { styleOptions: { messageActivityWordBreak: 'break-all' } }; - - const { driver, pageObjects } = await setupWebDriver({ props: WEB_CHAT_PROPS }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox( - 'https://subdomain.domain.com/pathname0/pathname1/pathname2/pathname3/pathname4/', - { waitForSend: true } - ); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('long URLs with keep-all', async () => { - const WEB_CHAT_PROPS = { styleOptions: { messageActivityWordBreak: 'keep-all' } }; - - const { driver, pageObjects } = await setupWebDriver({ props: WEB_CHAT_PROPS }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('箸より重いものを持ったことがない箸より重いものを持ったことがない', { - waitForSend: true - }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('hero card with a long title and richCardWrapTitle set to true', async () => { - const { driver, pageObjects } = await setupWebDriver({ props: { styleOptions: { richCardWrapTitle: true } } }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('herocard long title', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('hero card with a long title and richCardWrapTitle set to default value', async () => { - const { driver, pageObjects } = await setupWebDriver(); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('herocard long title', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('thumbnail card with a long title and richCardWrapTitle set to true', async () => { - const { driver, pageObjects } = await setupWebDriver({ props: { styleOptions: { richCardWrapTitle: true } } }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('thumbnailcard long title', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('thumbnail card with a long title and richCardWrapTitle set to default value', async () => { - const { driver, pageObjects } = await setupWebDriver(); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('thumbnailcard long title', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(2), timeouts.directLine); - await driver.wait(allImagesLoaded(), timeouts.fetchImage); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('absolute timestamp', async () => { - const activities = [ - { - channelData: {}, - type: 'message', - id: '6266x5ZXhXkBfuIH0fNx0h-o|0000000', - timestamp: '2019-08-08T16:41:12.9397263Z', - from: { - id: 'dl_654b35e09ab4149595a70aa6f1af6f50', - name: '', - role: 'user' - }, - textFormat: 'plain', - text: 'echo "Hello, World!"' - }, - { - channelData: {}, - type: 'message', - id: '6266x5ZXhXkBfuIH0fNx0h-o|0000001', - timestamp: '2019-08-08T16:41:13.1835518Z', - from: { - id: 'webchat-mockbot', - name: 'webchat-mockbot', - role: 'bot' - }, - text: 'Echoing back in a separate activity.' - }, - { - channelData: {}, - type: 'message', - id: '6266x5ZXhXkBfuIH0fNx0h-o|0000002', - timestamp: '2019-08-08T16:41:13.3963019Z', - from: { - id: 'webchat-mockbot', - name: 'webchat-mockbot', - role: 'bot' - }, - text: 'Hello, World!' - } - ]; - const styleOptions = { timestampFormat: 'absolute' }; - const { driver } = await setupWebDriver({ storeInitialState: { activities }, props: { styleOptions } }); - - await driver.wait(uiConnected(), timeouts.directLine); - await driver.wait(minNumActivitiesShown(3), timeouts.directLine); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); - -test('avatar background color', async () => { - const styleOptions = { - botAvatarBackgroundColor: 'red', - botAvatarInitials: 'B', - userAvatarBackgroundColor: 'blue', - userAvatarInitials: 'TJ' - }; - - const { driver, pageObjects } = await setupWebDriver({ props: { styleOptions } }); - - await driver.wait(uiConnected(), timeouts.directLine); - await pageObjects.sendMessageViaSendBox('echo "Hello, World!"', { waitForSend: true }); - - await driver.wait(minNumActivitiesShown(3), timeouts.directLine); - - const base64PNG = await driver.takeScreenshot(); - - expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); -}); diff --git a/__tests__/html2/basic/absoluteTimestamp.html b/__tests__/html2/basic/absoluteTimestamp.html new file mode 100644 index 0000000000..64ebd3aa0b --- /dev/null +++ b/__tests__/html2/basic/absoluteTimestamp.html @@ -0,0 +1,81 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-absolute-timestamp-1-snap.png b/__tests__/html2/basic/absoluteTimestamp.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-absolute-timestamp-1-snap.png rename to __tests__/html2/basic/absoluteTimestamp.html.snap-1.png diff --git a/__tests__/html2/basic/assets/surface1.jpg b/__tests__/html2/basic/assets/surface1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5fe603bb54c180474664b950e560c425fcc5ae6a GIT binary patch literal 247289 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

Xka$D>!bWV)ct(Y*rV7H*E3rE=%! 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 z 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 + + + + + + + + + + +

+ + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-avatar-background-color-1-snap.png b/__tests__/html2/basic/avatarBackgroundColor.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-avatar-background-color-1-snap.png rename to __tests__/html2/basic/avatarBackgroundColor.html.snap-1.png diff --git a/__tests__/html2/basic/heroCard.wrapTitle.html b/__tests__/html2/basic/heroCard.wrapTitle.html new file mode 100644 index 0000000000..80704a55df --- /dev/null +++ b/__tests__/html2/basic/heroCard.wrapTitle.html @@ -0,0 +1,89 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png b/__tests__/html2/basic/heroCard.wrapTitle.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png rename to __tests__/html2/basic/heroCard.wrapTitle.html.snap-1.png diff --git a/__tests__/html2/basic/heroCard.wrapTitle.wrap.html b/__tests__/html2/basic/heroCard.wrapTitle.wrap.html new file mode 100644 index 0000000000..46b7297119 --- /dev/null +++ b/__tests__/html2/basic/heroCard.wrapTitle.wrap.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png b/__tests__/html2/basic/heroCard.wrapTitle.wrap.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-hero-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png rename to __tests__/html2/basic/heroCard.wrapTitle.wrap.html.snap-1.png diff --git a/__tests__/html2/basic/longURL.breakAll.html b/__tests__/html2/basic/longURL.breakAll.html new file mode 100644 index 0000000000..c0207715a4 --- /dev/null +++ b/__tests__/html2/basic/longURL.breakAll.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-all-1-snap.png b/__tests__/html2/basic/longURL.breakAll.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-all-1-snap.png rename to __tests__/html2/basic/longURL.breakAll.html.snap-1.png diff --git a/__tests__/html2/basic/longURL.html b/__tests__/html2/basic/longURL.html new file mode 100644 index 0000000000..60d9c7f15e --- /dev/null +++ b/__tests__/html2/basic/longURL.html @@ -0,0 +1,58 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-word-1-snap.png b/__tests__/html2/basic/longURL.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-break-word-1-snap.png rename to __tests__/html2/basic/longURL.html.snap-1.png diff --git a/__tests__/html2/basic/longURL.keepAll.html b/__tests__/html2/basic/longURL.keepAll.html new file mode 100644 index 0000000000..68bab0fd58 --- /dev/null +++ b/__tests__/html2/basic/longURL.keepAll.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-keep-all-1-snap.png b/__tests__/html2/basic/longURL.keepAll.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-long-ur-ls-with-keep-all-1-snap.png rename to __tests__/html2/basic/longURL.keepAll.html.snap-1.png diff --git a/__tests__/html2/basic/thumbnailCard.wrapTitle.html b/__tests__/html2/basic/thumbnailCard.wrapTitle.html new file mode 100644 index 0000000000..692dd14bdc --- /dev/null +++ b/__tests__/html2/basic/thumbnailCard.wrapTitle.html @@ -0,0 +1,72 @@ + + + + + + + + + + + +
+ + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png b/__tests__/html2/basic/thumbnailCard.wrapTitle.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-default-value-1-snap.png rename to __tests__/html2/basic/thumbnailCard.wrapTitle.html.snap-1.png diff --git a/__tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html b/__tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html new file mode 100644 index 0000000000..d8859a748a --- /dev/null +++ b/__tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html @@ -0,0 +1,9 @@ + + + + + + + diff --git a/__tests__/__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png b/__tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html.snap-1.png similarity index 100% rename from __tests__/__image_snapshots__/chrome-docker/basic-js-thumbnail-card-with-a-long-title-and-rich-card-wrap-title-set-to-true-1-snap.png rename to __tests__/html2/basic/thumbnailCard.wrapTitle.wrap.html.snap-1.png From 0c4a7c5fcc8f4bba90cf22cbed35d0960cb0e1a6 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 07:13:10 +0000 Subject: [PATCH 50/54] Add FAQs --- docs/LIVESTREAMING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index e6f79c8535..abd381ce20 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -385,3 +385,9 @@ Bottomline: we understand the bandwidth usage could be large. But the benefits o - To conclude a livestream without any contents, send the final message with `type` set to `typing`, with `text` either unset or set to an empty string - For best compatibility, bot should not use `type` of `message` with empty `text` field - Some systems cannot handle message activity without content + +## Frequently asked questions + +### Why an activity is not part of the livestream? + +Please verify the activity payload against the logic in [this file](https://github.com/microsoft/BotFramework-WebChat/blob/main/packages/core/src/utils/getActivityLivestreamingMetadata.ts). If the result is `undefined`, the activity is not part of a livestream. They could be missing required fields or failed some type validations. From 18a8e2c37bc8cc75eaa76ee153c003dae7190566 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 07:21:31 +0000 Subject: [PATCH 51/54] Wordings --- docs/LIVESTREAMING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/LIVESTREAMING.md b/docs/LIVESTREAMING.md index abd381ce20..7917c9df1d 100644 --- a/docs/LIVESTREAMING.md +++ b/docs/LIVESTREAMING.md @@ -50,7 +50,7 @@ Ephemeral message means the content should only be available for a limited time > Also known as: finalized livestream. -When a livestream is finished, it will be closed for future updates. The said livestream is a concluded livestream. +When a livestream has finished, it will be marked as closed and sealed against future updates. The said livestream is a concluded livestream. ### Bot vs. copilot From c39197f9ab2907eee8b405a6d2f356470d0b2b6d Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 17:15:52 +0000 Subject: [PATCH 52/54] Use URLSearchParams --- __tests__/html2/basic/longURL.keepAll.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/__tests__/html2/basic/longURL.keepAll.html b/__tests__/html2/basic/longURL.keepAll.html index 68bab0fd58..1c4fa9bd7a 100644 --- a/__tests__/html2/basic/longURL.keepAll.html +++ b/__tests__/html2/basic/longURL.keepAll.html @@ -2,7 +2,12 @@ From 66a318a256d65aa8682db412c977ad2909ea7ee3 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 17:20:05 +0000 Subject: [PATCH 53/54] Move to unpkg --- __tests__/html/typingIndicator.liveRegion.multiple.html | 2 +- __tests__/html/typingIndicator.liveRegion.simple.html | 2 +- __tests__/html2/livestream/backtrackToTypingIndicator.html | 2 +- __tests__/html2/livestream/contentless.html | 2 +- __tests__/html2/livestream/contentlessLivestreamForever.html | 2 +- __tests__/html2/livestream/raceBetweenChunkAndEmpty.html | 2 +- .../livestream/raceBetweenLivestreamAndTypingIndicator.html | 2 +- .../livestream/raceBetweenTypingAndContentlessLivestream.html | 2 +- __tests__/html2/livestream/regretWithEmptyMessage.html | 2 +- __tests__/html2/livestream/simultaneous.html | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/__tests__/html/typingIndicator.liveRegion.multiple.html b/__tests__/html/typingIndicator.liveRegion.multiple.html index 9b1ed6fd69..f0dfae4c93 100644 --- a/__tests__/html/typingIndicator.liveRegion.multiple.html +++ b/__tests__/html/typingIndicator.liveRegion.multiple.html @@ -11,7 +11,7 @@ diff --git a/__tests__/html/typingIndicator.liveRegion.simple.html b/__tests__/html/typingIndicator.liveRegion.simple.html index 4f4794ee21..d9f027b1db 100644 --- a/__tests__/html/typingIndicator.liveRegion.simple.html +++ b/__tests__/html/typingIndicator.liveRegion.simple.html @@ -11,7 +11,7 @@ diff --git a/__tests__/html2/livestream/backtrackToTypingIndicator.html b/__tests__/html2/livestream/backtrackToTypingIndicator.html index ed8f056d81..5b589f3772 100644 --- a/__tests__/html2/livestream/backtrackToTypingIndicator.html +++ b/__tests__/html2/livestream/backtrackToTypingIndicator.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/contentless.html b/__tests__/html2/livestream/contentless.html index 4c922da1ef..f850afed9b 100644 --- a/__tests__/html2/livestream/contentless.html +++ b/__tests__/html2/livestream/contentless.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/contentlessLivestreamForever.html b/__tests__/html2/livestream/contentlessLivestreamForever.html index 19e69f0741..5247cfd17e 100644 --- a/__tests__/html2/livestream/contentlessLivestreamForever.html +++ b/__tests__/html2/livestream/contentlessLivestreamForever.html @@ -13,7 +13,7 @@ diff --git a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html index f67e081f9a..7783202d14 100644 --- a/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html +++ b/__tests__/html2/livestream/raceBetweenChunkAndEmpty.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html index e5e8ee2389..14c8d3c34b 100644 --- a/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html +++ b/__tests__/html2/livestream/raceBetweenLivestreamAndTypingIndicator.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html b/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html index 31aee2ea4e..09fcdc7299 100644 --- a/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html +++ b/__tests__/html2/livestream/raceBetweenTypingAndContentlessLivestream.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/regretWithEmptyMessage.html b/__tests__/html2/livestream/regretWithEmptyMessage.html index 8f9c394df9..e4cfe927fb 100644 --- a/__tests__/html2/livestream/regretWithEmptyMessage.html +++ b/__tests__/html2/livestream/regretWithEmptyMessage.html @@ -14,7 +14,7 @@ diff --git a/__tests__/html2/livestream/simultaneous.html b/__tests__/html2/livestream/simultaneous.html index ba294ae24d..3d73a12a15 100644 --- a/__tests__/html2/livestream/simultaneous.html +++ b/__tests__/html2/livestream/simultaneous.html @@ -14,7 +14,7 @@ From 860f1a074b8659fbedb4e353b81a302bdd0f91e9 Mon Sep 17 00:00:00 2001 From: William Wong Date: Wed, 12 Mar 2025 17:57:02 +0000 Subject: [PATCH 54/54] Should recompute after an element changed --- .../private/useReduceActivities.spec.tsx | 38 +++++++++++++++++++ .../private/useReduceActivities.ts | 4 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx index b2ba918e01..22d47e8861 100644 --- a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx +++ b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx @@ -134,6 +134,44 @@ describe('setup', () => { test('should not call fn()', () => expect(fn).toHaveBeenCalledTimes(4)); test('return value should be undefined', () => expect(useReduceActivities).toHaveLastReturnedWith(undefined)); }); + + describe('when the third activity is being replaced', () => { + let fourthActivity: WebChatActivity; + + beforeEach(() => { + fourthActivity = { ...ACTIVITY_TEMPLATE, id: 'a-00004', text: 'Good morning!' }; + + useActivities.mockImplementationOnce(() => [[firstActivity, fourthActivity, secondActivity]]); + + renderResult.rerender(); + }); + + describe('fn() should have been called', () => { + // It should call 2 more times because the first one should be from cache. + test('6 times in total', () => expect(fn).toHaveBeenCalledTimes(6)); + + test('with the fourth activity on 5rd call', () => + expect(fn).toHaveBeenNthCalledWith( + 5, + { maxText: 'Aloha!' }, + fourthActivity, + 1, + expect.arrayContaining([]) + )); + + test('with the second activity on 6th call', () => + expect(fn).toHaveBeenNthCalledWith( + 6, + { maxText: 'Good morning!' }, + secondActivity, + 2, + expect.arrayContaining([]) + )); + + test('return value should be derived from the second activity', () => + expect(useReduceActivities).toHaveLastReturnedWith({ maxText: 'Hello, World!' })); + }); + }); }); describe('when the first activity is removed', () => { diff --git a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts index 2d956277ff..290c223332 100644 --- a/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts +++ b/packages/api/src/providers/ActivityTyping/private/useReduceActivities.ts @@ -16,11 +16,12 @@ export default function useReduceActivities( (state = Object.freeze([])) => { let changed = activities.length !== state.length; let prevValue: T | undefined; + let shouldRecompute = false; const nextState = activities.map>((activity, index) => { const entry = state[+index]; - if (Object.is(entry?.activity, activity)) { + if (!shouldRecompute && Object.is(entry?.activity, activity)) { prevValue = entry?.value; // Skips the activity if it has been reduced in the past render loop. @@ -28,6 +29,7 @@ export default function useReduceActivities( } changed = true; + shouldRecompute = true; return Object.freeze({ activity,