@microsoft/omnichannel-chat-widget 0.1.0-main.243d300 → 0.1.0-main.2b2f787

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +7 -34
  2. package/lib/cjs/common/Constants.js +3 -1
  3. package/lib/cjs/common/storage/default/defaultCacheManager.js +2 -2
  4. package/lib/cjs/common/storage/default/defaultClientDataStoreProvider.js +15 -6
  5. package/lib/cjs/common/telemetry/TelemetryConstants.js +13 -0
  6. package/lib/cjs/common/telemetry/TelemetryHelper.js +2 -1
  7. package/lib/cjs/common/utils.js +23 -2
  8. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +1 -1
  9. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
  10. package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -2
  11. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +139 -0
  12. package/lib/cjs/components/livechatwidget/common/createAdapter.js +2 -0
  13. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
  14. package/lib/cjs/components/livechatwidget/common/endChat.js +23 -17
  15. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +26 -13
  16. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +5 -5
  17. package/lib/cjs/components/livechatwidget/common/startChat.js +70 -59
  18. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +43 -37
  19. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
  20. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
  21. package/lib/cjs/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +1 -1
  22. package/lib/cjs/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +1 -0
  23. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +1 -3
  24. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
  25. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageBoxStyles.js +1 -1
  26. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultUserMessageBoxStyles.js +1 -1
  27. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +2 -14
  28. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +2 -11
  29. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +7 -4
  30. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +4 -2
  31. package/lib/cjs/hooks/useDebounce.js +28 -0
  32. package/lib/cjs/hooks/useWindowDimensions.js +30 -0
  33. package/lib/cjs/plugins/newMessageEventHandler.js +14 -0
  34. package/lib/esm/common/Constants.js +3 -1
  35. package/lib/esm/common/storage/default/defaultCacheManager.js +2 -2
  36. package/lib/esm/common/storage/default/defaultClientDataStoreProvider.js +15 -6
  37. package/lib/esm/common/telemetry/TelemetryConstants.js +13 -0
  38. package/lib/esm/common/telemetry/TelemetryHelper.js +2 -1
  39. package/lib/esm/common/utils.js +20 -0
  40. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +1 -1
  41. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +1 -1
  42. package/lib/esm/components/headerstateful/HeaderStateful.js +4 -2
  43. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +134 -0
  44. package/lib/esm/components/livechatwidget/common/createAdapter.js +2 -0
  45. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +14 -10
  46. package/lib/esm/components/livechatwidget/common/endChat.js +23 -17
  47. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +26 -13
  48. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +6 -5
  49. package/lib/esm/components/livechatwidget/common/startChat.js +70 -59
  50. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +44 -38
  51. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +8 -1
  52. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +1 -1
  53. package/lib/esm/components/prechatsurveypanestateful/common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps.js +1 -1
  54. package/lib/esm/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +1 -0
  55. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +1 -3
  56. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
  57. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageBoxStyles.js +1 -1
  58. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultUserMessageBoxStyles.js +1 -1
  59. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +2 -14
  60. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +2 -11
  61. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware.js +5 -5
  62. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +4 -2
  63. package/lib/esm/hooks/useDebounce.js +22 -0
  64. package/lib/esm/hooks/useWindowDimensions.js +23 -0
  65. package/lib/esm/plugins/newMessageEventHandler.js +14 -0
  66. package/lib/types/common/Constants.d.ts +2 -0
  67. package/lib/types/common/storage/default/defaultCacheManager.d.ts +1 -1
  68. package/lib/types/common/storage/default/defaultClientDataStoreProvider.d.ts +1 -1
  69. package/lib/types/common/telemetry/TelemetryConstants.d.ts +14 -1
  70. package/lib/types/common/telemetry/definitions/Contracts.d.ts +2 -0
  71. package/lib/types/common/telemetry/definitions/Payload.d.ts +1 -0
  72. package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +4 -0
  73. package/lib/types/common/utils.d.ts +1 -0
  74. package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +9 -0
  75. package/lib/types/components/livechatwidget/common/startChat.d.ts +3 -3
  76. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +2 -0
  77. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.d.ts +1 -1
  78. package/lib/types/hooks/useDebounce.d.ts +3 -0
  79. package/lib/types/hooks/useWindowDimensions.d.ts +4 -0
  80. package/package.json +3 -3
package/README.md CHANGED
@@ -11,8 +11,6 @@
11
11
  1. [Installation](#installation)
12
12
  1. [Example Usage](#example-usage)
13
13
  1. [Components](#components)
14
- 1. [Common Scenarios](#common-scenarios)
15
- - [Disable Bot Magic Code](#disable-bot-magic-code)
16
14
  1. [See Also](#see-also)
17
15
 
18
16
  ## Introduction
@@ -97,7 +95,9 @@ const render = async () => {
97
95
  render();
98
96
  ```
99
97
 
100
- A sample widget can be found in this repo [here](https://github.com/microsoft/omnichannel-chat-widget/tree/main/chat-widget/sample). To build it, do ```yarn build-sample``` or ```yarn build-sample:dev``` from project root.
98
+ A javascript sample widget can be found in this repo [here](https://github.com/microsoft/omnichannel-chat-widget/tree/main/chat-widget/samples/javascript-sample). To build it, do ```yarn build-sample``` or ```yarn build-sample:dev``` from project root.
99
+
100
+ A typescript sample widget can be found [here](https://github.com/microsoft/omnichannel-chat-widget/tree/main/chat-widget/samples/typescript-sample)
101
101
 
102
102
  ## Components
103
103
 
@@ -129,6 +129,7 @@ These are components that are included in the ```@microsoft/omnichannel-chat-com
129
129
  | ----- | -------- | ----- |
130
130
  | WebChatContainer | The default wrapper around BotFramework's [WebChat](https://github.com/microsoft/BotFramework-WebChat), which is the message container we are using | [IWebChatContainerStatefulProps](https://github.com/microsoft/omnichannel-chat-widget/blob/main/chat-widget/src/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.ts) |
131
131
  | LiveChatWidget | The default widget that stitches the UI components with Chat SDK | [ILiveChatWidgetProps](https://github.com/microsoft/omnichannel-chat-widget/blob/main/chat-widget/src/components/livechatwidget/interfaces/ILiveChatWidgetProps.ts) |
132
+ | PostChatLoadingPane | The default loading pane used after the chat is ended and before the post chat pane loads completely | [ILoadingPaneProps](https://github.com/microsoft/omnichannel-chat-widget/blob/main/chat-components/src/components/loadingpane/interfaces/ILoadingPaneProps.ts) |
132
133
 
133
134
  Some of the interfaces listed in the Stateless table have Stateful counterparts defined in the ```@microsoft/omnichannel-chat-widget``` package. For example, [IConfirmationPaneStatefulProps](https://github.com/microsoft/omnichannel-chat-widget/blob/main/chat-widget/src/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulProps.ts) extends [IConfirmationPaneProps](https://github.com/microsoft/omnichannel-chat-widget/blob/main/chat-components/src/components/confirmationpane/interfaces/IConfirmationPaneProps.ts) with additional attributes that only makes sense in the stateful context.
134
135
 
@@ -220,40 +221,12 @@ const customizedFooterProp: IFooterProps = {
220
221
 
221
222
  > :pushpin: Note that [WebChat hooks](https://github.com/microsoft/BotFramework-WebChat/blob/main/docs/HOOKS.md) can also be used in any custom components.
222
223
 
223
- ## Common Scenarios
224
-
225
- ### Disable Bot Magic Code
226
-
227
- Configuration to disable the default behaviour of having to type the magic code in the conversation to complete the sign-in proccess with a bot. Instead, the magic code will be sent to the bot behind the scenes.
228
-
229
- 1. Add [MagicCodeForwarder.html](sample/MagicCodeForwarder.html) in the same location as the chat widget
230
-
231
- 2. Add `botMagicCode` configuration to disable default magic code feature
232
-
233
- > :exclamation: `fwdUrl` **MUST** have the same `origin` as the chat widget URL
234
-
235
- ```js
236
- const liveChatWidgetProps = {
237
- chatSDK: chatSDK, // mandatory
238
- chatConfig: chatConfig, // mandatory
239
- webChatContainerProps: {
240
- botMagicCode: {
241
- disabled: true,
242
- fwdUrl: 'http://localhost:8000/sample/MagicCodeForwarder.html'
243
- }
244
- },
245
- };
246
-
247
- ReactDOM.render(
248
- <LiveChatWidget {...liveChatWidgetProps}/>,
249
- document.getElementById("my-container")
250
- );
251
- ```
252
-
253
224
  ## See Also
254
225
 
255
226
  [Telemetry](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/Telemetry.md)\
256
227
  [Create LCW widget with Webpack5 and TypeScript](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/BuildingUsingWebpack5.md)\
257
228
  [Omnichannel Features](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/Features.md)\
258
229
  [How to Add Visual Regression Tests](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/VisualRegressionTestingGuide.md)\
259
- [Security](https://github.com/microsoft/omnichannel-chat-widget/blob/main/SECURITY.md)
230
+ [Security](https://github.com/microsoft/omnichannel-chat-widget/blob/main/SECURITY.md)\
231
+ [Third Party Cookie Support](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/Tpc.md)\
232
+ [Storybook](https://microsoft.github.io/omnichannel-chat-widget/docs/storybook/)
@@ -52,7 +52,7 @@ _defineProperty(Constants, "publicMessageTag", "public");
52
52
  _defineProperty(Constants, "supportedAdaptiveCardContentTypes", ["application/vnd.microsoft.card.adaptive", "application/vnd.microsoft.card.audio", "application/vnd.microsoft.card.hero", "application/vnd.microsoft.card.receipt", "application/vnd.microsoft.card.thumbnail", "application/vnd.microsoft.card.signin", "application/vnd.microsoft.card.oauth"]);
53
53
  _defineProperty(Constants, "maxUploadFileSize", "500000");
54
54
  _defineProperty(Constants, "imageRegex", /(\.)(jpeg|jpg|jiff|png|gif|bmp|webp)$/i);
55
- _defineProperty(Constants, "audioMediaRegex", /(\.)(aac|aiff|alac|flac|mp2|mp3|pcm|wav|wma)$/i);
55
+ _defineProperty(Constants, "audioMediaRegex", /(\.)(aac|aiff|alac|amr|flac|mp2|mp3|pcm|wav|wma)$/i);
56
56
  _defineProperty(Constants, "videoMediaRegex", /(\.)(avchd|avi|flv|mpe|mpeg|mpg|mpv|mp4|m4p|m4v|mov|qt|swf|webm|wmv)$/i);
57
57
  _defineProperty(Constants, "chromeSupportedInlineMediaRegex", /(\.)(aac|mp3|wav|mp4)$/i);
58
58
  _defineProperty(Constants, "firefoxSupportedInlineMediaRegex", /(\.)(aac|flac|mp3|wav|mp4|mov)$/i);
@@ -89,6 +89,7 @@ _defineProperty(Constants, "internetConnectionTestUrlText", "Omnichannel Connect
89
89
  _defineProperty(Constants, "ChatWidgetStateChangedPrefix", "ChatWidgetStateChanged");
90
90
  _defineProperty(Constants, "PostChatLoadingDurationInMs", 2000);
91
91
  _defineProperty(Constants, "BrowserUnloadConfirmationMessage", "Do you want to leave chat?");
92
+ _defineProperty(Constants, "CacheTtlInMinutes", 15);
92
93
  const Regex = (_class = class Regex {}, _defineProperty(_class, "EmailRegex", "(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"), _class);
93
94
  exports.Regex = Regex;
94
95
  class HtmlIdNames {}
@@ -134,6 +135,7 @@ _defineProperty(HtmlAttributeNames, "noreferrerTag", "noreferrer");
134
135
  _defineProperty(HtmlAttributeNames, "adaptiveCardClassName", "ac-adaptiveCard");
135
136
  _defineProperty(HtmlAttributeNames, "adaptiveCardTextBlockClassName", "ac-textBlock");
136
137
  _defineProperty(HtmlAttributeNames, "adaptiveCardToggleInputClassName", "ac-toggleInput");
138
+ _defineProperty(HtmlAttributeNames, "adaptiveCardActionSetClassName", "ac-actionSet");
137
139
  class WebChatMiddlewareConstants {}
138
140
  exports.WebChatMiddlewareConstants = WebChatMiddlewareConstants;
139
141
  _defineProperty(WebChatMiddlewareConstants, "nextVisibleActivity", "nextVisibleActivity");
@@ -13,11 +13,11 @@ function _toPrimitive(input, hint) { if (typeof input !== "object" || input ===
13
13
  class defaultCacheManager {}
14
14
  exports.defaultCacheManager = defaultCacheManager;
15
15
  _defineProperty(defaultCacheManager, "InternalCache", {});
16
- const registerBroadcastServiceForLocalStorage = (orgid, widgetId, widgetInstanceId) => {
16
+ const registerBroadcastServiceForLocalStorage = (orgid, widgetId, widgetInstanceId, ttlInMins) => {
17
17
  const widgetCacheId = (0, _utils.getWidgetCacheId)(orgid, widgetId, widgetInstanceId);
18
18
  _omnichannelChatComponents.BroadcastService.getMessageByEventName(widgetCacheId).subscribe(msg => {
19
19
  try {
20
- (0, _defaultClientDataStoreProvider.defaultClientDataStoreProvider)().setData(widgetCacheId, JSON.stringify(msg.payload), "localStorage");
20
+ (0, _defaultClientDataStoreProvider.defaultClientDataStoreProvider)(ttlInMins).setData(widgetCacheId, JSON.stringify(msg.payload), "localStorage");
21
21
  } catch (error) {
22
22
  console.error("Error in setting data to localstorage", error);
23
23
  }
@@ -4,21 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.defaultClientDataStoreProvider = void 0;
7
- var _defaultInMemoryDataStore = require("./defaultInMemoryDataStore");
8
- var _TelemetryHelper = require("../../telemetry/TelemetryHelper");
9
7
  var _TelemetryConstants = require("../../telemetry/TelemetryConstants");
10
- const defaultClientDataStoreProvider = () => {
8
+ var _TelemetryHelper = require("../../telemetry/TelemetryHelper");
9
+ var _defaultInMemoryDataStore = require("./defaultInMemoryDataStore");
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+
12
+ const defaultClientDataStoreProvider = function () {
13
+ let cacheTtlinMins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
14
+ let ttlInMs = 0;
11
15
  const isCookieAllowed = () => {
12
16
  try {
13
17
  localStorage;
14
18
  sessionStorage;
15
19
  return true;
16
20
  } catch (error) {
17
- console.error("Third party cookie blocked");
21
+ if (!window.TPCWarningShown) {
22
+ console.warn("Third party cookies blocked.");
23
+ window.TPCWarningShown = true;
24
+ }
18
25
  return false;
19
26
  }
20
27
  };
21
- const TtlInMs = 15 * 60 * 1000; // 15 mins
28
+ if (ttlInMs == 0) {
29
+ ttlInMs = cacheTtlinMins * 60 * 1000;
30
+ }
22
31
  const dataStoreProvider = {
23
32
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
33
  setData: (key, data, type) => {
@@ -28,7 +37,7 @@ const defaultClientDataStoreProvider = () => {
28
37
  const now = new Date();
29
38
  const item = {
30
39
  data: data,
31
- expiry: now.getTime() + TtlInMs
40
+ expiry: now.getTime() + ttlInMs
32
41
  };
33
42
  const strItem = JSON.stringify(item);
34
43
  if (type === "localStorage") {
@@ -54,6 +54,11 @@ exports.BroadcastEvent = BroadcastEvent;
54
54
  BroadcastEvent["InitiateEndChatOnBrowserUnload"] = "InitiateEndChatOnBrowserUnload";
55
55
  BroadcastEvent["ClosePopoutWindow"] = "ClosePopoutWindow";
56
56
  BroadcastEvent["RaiseErrorEvent"] = "RaiseErrorEvent";
57
+ BroadcastEvent["NetworkDisconnected"] = "NetworkDisconnected";
58
+ BroadcastEvent["NetworkReconnected"] = "NetworkReconnected";
59
+ BroadcastEvent["SigninCardReceived"] = "SignInCardReceived";
60
+ BroadcastEvent["BotAuthConfigRequest"] = "BotAuthConfigRequest";
61
+ BroadcastEvent["BotAuthConfigResponse"] = "BotAuthConfigResponse";
57
62
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
58
63
  let TelemetryEvent;
59
64
  exports.TelemetryEvent = TelemetryEvent;
@@ -115,6 +120,7 @@ exports.TelemetryEvent = TelemetryEvent;
115
120
  TelemetryEvent["DownloadTranscriptResponseNullOrUndefined"] = "DownloadTranscriptResponseNullOrUndefined";
116
121
  TelemetryEvent["EmailTranscriptSent"] = "EmailTranscriptSent";
117
122
  TelemetryEvent["EmailTranscriptFailed"] = "EmailTranscriptFailed";
123
+ TelemetryEvent["ErrorUIPaneLoaded"] = "ErrorUIPaneLoaded";
118
124
  TelemetryEvent["DownloadTranscriptFailed"] = "DownloadTranscriptFailed";
119
125
  TelemetryEvent["StartChatFailed"] = "StartChatFailed";
120
126
  TelemetryEvent["IC3ThreadUpdateEventReceived"] = "IC3ThreadUpdateEventReceived";
@@ -144,6 +150,11 @@ exports.TelemetryEvent = TelemetryEvent;
144
150
  TelemetryEvent["CustomerVoiceResponsePageLoaded"] = "CustomerVoiceResponsePageLoaded";
145
151
  TelemetryEvent["CustomerVoiceFormResponseSubmitted"] = "CustomerVoiceFormResponseSubmitted";
146
152
  TelemetryEvent["CustomerVoiceFormResponseError"] = "CustomerVoiceFormResponseError";
153
+ TelemetryEvent["BotAuthActivityEmptySasUrl"] = "BotAuthActivityEmptySasUrl";
154
+ TelemetryEvent["SetBotAuthProviderFetchConfig"] = "SetBotAuthProviderFetchConfig";
155
+ TelemetryEvent["SetBotAuthProviderHideCard"] = "SetBotAuthProviderHideCard";
156
+ TelemetryEvent["SetBotAuthProviderDisplayCard"] = "SetBotAuthProviderDisplayCard";
157
+ TelemetryEvent["SetBotAuthProviderNotFound"] = "SetBotAuthProviderNotFound";
147
158
  TelemetryEvent["ProcessingHTMLTextMiddlewareFailed"] = "ProcessingHTMLTextMiddlewareFailed";
148
159
  TelemetryEvent["ProcessingSanitizationMiddlewareFailed"] = "ProcessingSanitizationMiddlewareFailed";
149
160
  TelemetryEvent["FormatTagsMiddlewareJSONStringifyFailed"] = "FormatTagsMiddlewareJSONStringifyFailed";
@@ -170,6 +181,8 @@ exports.TelemetryEvent = TelemetryEvent;
170
181
  TelemetryEvent["ReconnectChatMinimize"] = "ReconnectChatMinimize";
171
182
  TelemetryEvent["MessageSent"] = "MessageSent";
172
183
  TelemetryEvent["MessageReceived"] = "MessageReceived";
184
+ TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
185
+ TelemetryEvent["HistoryMessageReceived"] = "HistoryMessageReceived";
173
186
  TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
174
187
  TelemetryEvent["NetworkDisconnected"] = "NetworkDisconnected";
175
188
  TelemetryEvent["NetworkReconnected"] = "NetworkReconnected";
@@ -62,6 +62,7 @@ class TelemetryHelper {
62
62
  event.ElapsedTimeInMilliseconds = payload.ElapsedTimeInMilliseconds;
63
63
  event.ExceptionDetails = JSON.stringify(payload.ExceptionDetails);
64
64
  event.Description = payload.Description;
65
+ event.CustomProperties = JSON.stringify(payload.CustomProperties);
65
66
  });
66
67
  }
67
68
  static conformToWebChatContract(level, input) {
@@ -167,7 +168,7 @@ class TelemetryHelper {
167
168
  telemetryDataLocal.widgetId = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.appId;
168
169
  telemetryDataLocal.orgId = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.orgId;
169
170
  telemetryDataLocal.orgUrl = telemetryConfig === null || telemetryConfig === void 0 ? void 0 : telemetryConfig.orgUrl;
170
- telemetryDataLocal.lcwRuntimeId = (0, _utils.newGuid)();
171
+ telemetryDataLocal.lcwRuntimeId = telemetryConfig.LCWRuntimeId ?? (0, _utils.newGuid)();
171
172
  return telemetryDataLocal;
172
173
  }
173
174
  static addSessionDataToTelemetry(chatSession, telemetryInternalData) {
@@ -3,12 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getBroadcastChannelName = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
6
+ exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getBroadcastChannelName = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
7
7
  var _Constants = require("./Constants");
8
8
  var _DataStoreManager = require("./contextDataStore/DataStoreManager");
9
9
  var _KeyCodes = require("./KeyCodes");
10
10
  var _TelemetryConstants = require("./telemetry/TelemetryConstants");
11
11
  var _md5Typescript = require("md5-typescript");
12
+ var _this = void 0;
12
13
  const getElementBySelector = selector => {
13
14
  let element;
14
15
  if (typeof selector === "string") {
@@ -334,4 +335,24 @@ exports.addDelayInMs = addDelayInMs;
334
335
  const getBroadcastChannelName = (widgetId, widgetInstanceId) => {
335
336
  return widgetInstanceId && !isNullOrEmptyString(widgetInstanceId) ? `${widgetInstanceId}_${widgetId}` : widgetId;
336
337
  };
337
- exports.getBroadcastChannelName = getBroadcastChannelName;
338
+
339
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
340
+ exports.getBroadcastChannelName = getBroadcastChannelName;
341
+ const debounceLeading = function (fn) {
342
+ let ms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3000;
343
+ let timeoutId;
344
+ return function () {
345
+ // eslint-disable-line @typescript-eslint/no-explicit-any
346
+
347
+ if (!timeoutId) {
348
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
349
+ args[_key] = arguments[_key];
350
+ }
351
+ fn.apply(_this, args);
352
+ }
353
+ timeoutId = setTimeout(() => {
354
+ timeoutId = null;
355
+ }, ms);
356
+ };
357
+ };
358
+ exports.debounceLeading = debounceLeading;
@@ -90,7 +90,7 @@ const ConfirmationPaneStateful = props => {
90
90
  Event: _TelemetryConstants.TelemetryEvent.ConfirmationPaneLoaded
91
91
  });
92
92
  }, []);
93
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !(controlProps !== null && controlProps !== void 0 && controlProps.disableDimLayer) && /*#__PURE__*/_react.default.createElement(_DimLayer.DimLayer, {
93
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_DimLayer.DimLayer, {
94
94
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
95
95
  }), /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.ConfirmationPane, {
96
96
  componentOverrides: props === null || props === void 0 ? void 0 : props.componentOverrides,
@@ -97,7 +97,7 @@ const EmailTranscriptPaneStateful = props => {
97
97
  Event: _TelemetryConstants.TelemetryEvent.EmailTranscriptLoaded
98
98
  });
99
99
  }, [initialEmail]);
100
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !(controlProps !== null && controlProps !== void 0 && controlProps.disableDimLayer) && /*#__PURE__*/_react.default.createElement(_DimLayer.DimLayer, {
100
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_DimLayer.DimLayer, {
101
101
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
102
102
  }), /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.InputValidationPane, {
103
103
  componentOverrides: props.componentOverrides,
@@ -30,6 +30,7 @@ const HeaderStateful = props => {
30
30
  const [outOfOperatingHours, setOutOfOperatingHours] = (0, _react.useState)(((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : (_state$domainStates$l2 = _state$domainStates$l.LiveWSAndLiveChatEngJoin) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.OutOfOperatingHours) === "True");
31
31
  const outOfOfficeStyleProps = Object.assign({}, _defaultOutOfOfficeHeaderStyleProps.defaultOutOfOfficeHeaderStyleProps, outOfOfficeHeaderProps === null || outOfOfficeHeaderProps === void 0 ? void 0 : outOfOfficeHeaderProps.styleProps);
32
32
  const conversationState = (0, _react.useRef)(state.appStates.conversationState);
33
+ const conversationEndedByAgent = (0, _react.useRef)(state.appStates.conversationEndedByAgent);
33
34
  const controlProps = {
34
35
  id: "oc-lcw-header",
35
36
  dir: state.domainStates.globalDir,
@@ -49,7 +50,7 @@ const HeaderStateful = props => {
49
50
  Event: _TelemetryConstants.TelemetryEvent.HeaderCloseButtonClicked,
50
51
  Description: "Header Close button clicked."
51
52
  });
52
- if (conversationState.current === _ConversationState.ConversationState.Active) {
53
+ if (conversationState.current === _ConversationState.ConversationState.Active || conversationEndedByAgent.current) {
53
54
  dispatch({
54
55
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_SHOW_CONFIRMATION,
55
56
  payload: true
@@ -71,7 +72,7 @@ const HeaderStateful = props => {
71
72
  ...(headerProps === null || headerProps === void 0 ? void 0 : headerProps.controlProps),
72
73
  hideTitle: state.appStates.conversationState === _ConversationState.ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === _ConversationState.ConversationState.PostchatLoading || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP = headerProps.controlProps) === null || _headerProps$controlP === void 0 ? void 0 : _headerProps$controlP.hideTitle),
73
74
  hideIcon: state.appStates.conversationState === _ConversationState.ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === _ConversationState.ConversationState.PostchatLoading || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP2 = headerProps.controlProps) === null || _headerProps$controlP2 === void 0 ? void 0 : _headerProps$controlP2.hideIcon),
74
- hideCloseButton: state.appStates.conversationState === _ConversationState.ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === _ConversationState.ConversationState.Prechat || state.appStates.conversationState === _ConversationState.ConversationState.ReconnectChat || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP3 = headerProps.controlProps) === null || _headerProps$controlP3 === void 0 ? void 0 : _headerProps$controlP3.hideCloseButton)
75
+ hideCloseButton: state.appStates.conversationState === _ConversationState.ConversationState.Loading && !state.appStates.isStartChatFailing || state.appStates.conversationState === _ConversationState.ConversationState.PostchatLoading || state.appStates.conversationState === _ConversationState.ConversationState.Prechat || state.appStates.conversationState === _ConversationState.ConversationState.ReconnectChat || (headerProps === null || headerProps === void 0 ? void 0 : (_headerProps$controlP3 = headerProps.controlProps) === null || _headerProps$controlP3 === void 0 ? void 0 : _headerProps$controlP3.hideCloseButton)
75
76
  };
76
77
  const outOfOfficeControlProps = {
77
78
  id: "oc-lcw-header",
@@ -95,6 +96,7 @@ const HeaderStateful = props => {
95
96
  if (state.appStates.conversationState) {
96
97
  conversationState.current = state.appStates.conversationState;
97
98
  }
99
+ conversationEndedByAgent.current = state.appStates.conversationEndedByAgent;
98
100
  }, [state.appStates]);
99
101
  return /*#__PURE__*/_react.default.createElement(_omnichannelChatComponents.Header, {
100
102
  componentOverrides: headerProps === null || headerProps === void 0 ? void 0 : headerProps.componentOverrides,
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BotAuthActivitySubscriber = void 0;
7
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
8
+ var _TelemetryConstants = require("../../../../common/telemetry/TelemetryConstants");
9
+ var _TelemetryHelper = require("../../../../common/telemetry/TelemetryHelper");
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
12
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
13
+ const supportedSignInCardContentTypes = ["application/vnd.microsoft.card.signin", "application/vnd.microsoft.card.oauth"];
14
+ const botOauthUrlRegex = /[\S]+.botframework.com\/api\/oauth\/signin\?signin=([\S]+)/;
15
+ const delay = t => new Promise(resolve => setTimeout(resolve, t));
16
+ const fetchBotAuthConfigRetries = 3;
17
+ const fetchBotAuthConfigRetryInterval = 1000;
18
+ let response;
19
+ const extractSignInId = signInUrl => {
20
+ const result = botOauthUrlRegex.exec(signInUrl);
21
+ if (result && result[1]) {
22
+ return result[1];
23
+ }
24
+ return "";
25
+ };
26
+ const extractSasUrl = async attachment => {
27
+ let sasUrl = undefined;
28
+ if (attachment && attachment.content && attachment.content.tokenPostResource && attachment.content.tokenPostResource.sasUrl) {
29
+ sasUrl = attachment.content.tokenPostResource.sasUrl;
30
+ }
31
+ if (!sasUrl) {
32
+ const signInId = extractSignInId(attachment.content.buttons[0].value);
33
+ const getTestUrlEndpoint = `https://token.botframework.com/api/sas/gettesturl?signInId=${signInId}`;
34
+ try {
35
+ const response = await window.fetch(getTestUrlEndpoint);
36
+ if (response.status === 200) {
37
+ const responseJson = await response.json();
38
+ sasUrl = responseJson.sasUrl;
39
+ }
40
+ } catch {
41
+ sasUrl = undefined;
42
+ }
43
+ }
44
+ return sasUrl;
45
+ };
46
+ const fetchBotAuthConfig = async retries => {
47
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
48
+ Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderFetchConfig
49
+ });
50
+ const botAuthConfigRequestEvent = {
51
+ eventName: _TelemetryConstants.BroadcastEvent.BotAuthConfigRequest
52
+ };
53
+ _omnichannelChatComponents.BroadcastService.postMessage(botAuthConfigRequestEvent);
54
+ const listener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.BotAuthConfigResponse).subscribe(data => {
55
+ var _data$payload, _data$payload2;
56
+ response = ((_data$payload = data.payload) === null || _data$payload === void 0 ? void 0 : _data$payload.response) !== undefined ? (_data$payload2 = data.payload) === null || _data$payload2 === void 0 ? void 0 : _data$payload2.response : response;
57
+ listener.unsubscribe();
58
+ });
59
+ if (response !== undefined) {
60
+ //return response;
61
+ return response;
62
+ }
63
+ if (retries === 1) {
64
+ // Base Case
65
+ throw new Error();
66
+ }
67
+ await delay(fetchBotAuthConfigRetryInterval);
68
+ return await fetchBotAuthConfig(--retries);
69
+ };
70
+ class BotAuthActivitySubscriber {
71
+ constructor() {
72
+ _defineProperty(this, "observer", void 0);
73
+ _defineProperty(this, "signInCardSeen", void 0);
74
+ this.signInCardSeen = new Set();
75
+ }
76
+ applicable(activity) {
77
+ var _activity$attachments;
78
+ return (activity === null || activity === void 0 ? void 0 : (_activity$attachments = activity.attachments) === null || _activity$attachments === void 0 ? void 0 : _activity$attachments.length) > 0 && activity.attachments[0] && supportedSignInCardContentTypes.indexOf(activity.attachments[0].contentType) >= 0;
79
+ }
80
+ async apply(activity) {
81
+ this.observer.next(false); // Hides card
82
+ const attachment = activity.attachments[0];
83
+ const signInUrl = attachment.content.buttons[0].value;
84
+ const signInId = extractSignInId(signInUrl);
85
+ if (!signInId) {
86
+ return;
87
+ }
88
+ if (this.signInCardSeen.has(signInId)) {
89
+ // Prevents duplicate auth
90
+ return;
91
+ }
92
+ this.signInCardSeen.add(signInId);
93
+ const sasUrl = await extractSasUrl(attachment);
94
+ const event = {
95
+ eventName: _TelemetryConstants.BroadcastEvent.SigninCardReceived,
96
+ payload: {
97
+ sasUrl
98
+ }
99
+ };
100
+ if (!sasUrl) {
101
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
102
+ Event: _TelemetryConstants.TelemetryEvent.BotAuthActivityEmptySasUrl,
103
+ Description: "SaS Url is empty"
104
+ });
105
+ return activity;
106
+ } else {
107
+ _omnichannelChatComponents.BroadcastService.postMessage(event);
108
+ }
109
+ try {
110
+ const response = await fetchBotAuthConfig(fetchBotAuthConfigRetries);
111
+ if (response === false) {
112
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
113
+ Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderHideCard
114
+ });
115
+ } else {
116
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
117
+ Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderDisplayCard
118
+ });
119
+ return activity;
120
+ }
121
+ } catch {
122
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
123
+ Event: _TelemetryConstants.TelemetryEvent.SetBotAuthProviderNotFound
124
+ });
125
+ //this is to ensure listener continues waiting for response
126
+ if (this.signInCardSeen.has(signInId)) {
127
+ this.signInCardSeen.delete(signInId);
128
+ }
129
+ return activity;
130
+ }
131
+ }
132
+ async next(activity) {
133
+ if (this.applicable(activity)) {
134
+ return await this.apply(activity);
135
+ }
136
+ return activity;
137
+ }
138
+ }
139
+ exports.BotAuthActivitySubscriber = BotAuthActivitySubscriber;
@@ -10,6 +10,7 @@ var _NotificationScenarios = require("../../webchatcontainerstateful/webchatcont
10
10
  var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
11
11
  var _ChatAdapterShim = require("./ChatAdapterShim");
12
12
  var _PauseActivitySubscriber = require("./ActivitySubscriber/PauseActivitySubscriber");
13
+ var _BotAuthActivitySubscriber = require("./ActivitySubscriber/BotAuthActivitySubscriber");
13
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
15
  const createAdapter = async chatSDK => {
15
16
  const chatAdapterOptionalParams = {
@@ -34,6 +35,7 @@ const createAdapter = async chatSDK => {
34
35
  if (chatSDK.isMockModeOn !== true) {
35
36
  adapter = new _ChatAdapterShim.ChatAdapterShim(adapter);
36
37
  adapter.addSubscriber(new _PauseActivitySubscriber.PauseActivitySubscriber());
38
+ adapter.addSubscriber(new _BotAuthActivitySubscriber.BotAuthActivitySubscriber());
37
39
  return adapter.chatAdapter;
38
40
  }
39
41
  return adapter;
@@ -13,9 +13,9 @@ var _activityMiddleware = require("../../../webchatcontainerstateful/webchatcont
13
13
  var _attachmentMiddleware = _interopRequireDefault(require("../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware"));
14
14
  var _avatarMiddleware = require("../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware");
15
15
  var _createMarkdown = require("../createMarkdown");
16
+ var _WebChatLogger = require("../../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger");
16
17
  var _groupActivitiesMiddleware = require("../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/groupActivitiesMiddleware");
17
18
  var _typingIndicatorMiddleware = require("../../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware");
18
- var _WebChatLogger = require("../../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger");
19
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
20
  /* eslint-disable @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any */
21
21
 
@@ -413,6 +413,7 @@ const dummyDefaultProps = {
413
413
  width: "90px",
414
414
  cursor: "pointer",
415
415
  overflow: "hidden",
416
+ padding: "0px",
416
417
  whiteSpace: "nowrap"
417
418
  },
418
419
  subtitleStyleProps: {
@@ -420,12 +421,14 @@ const dummyDefaultProps = {
420
421
  fontWeight: "200",
421
422
  color: "#666",
422
423
  overflow: "hidden",
424
+ padding: "0px",
423
425
  fontFamily: "'Segoe UI',Arial,sans-serif",
424
426
  display: "block",
425
427
  alignItems: "center",
426
428
  margin: "0px 14px 0px 14px",
427
429
  textOverflow: "ellipsis !important",
428
- width: "max-content",
430
+ width: "90px",
431
+ whiteSpace: "nowrap",
429
432
  cursor: "pointer"
430
433
  },
431
434
  classNames: {
@@ -475,7 +478,6 @@ const dummyDefaultProps = {
475
478
  cancelButtonText: "Cancel",
476
479
  cancelButtonAriaLabel: "Cancel. Return to Chat",
477
480
  brightnessValueOnDim: "0.2",
478
- disableDimLayer: false,
479
481
  onConfirm: () => {},
480
482
  // Detailed implementation omitted
481
483
  onCancel: () => {} // Detailed implementation omitted
@@ -583,6 +585,7 @@ const dummyDefaultProps = {
583
585
  hideCallingContainer: false,
584
586
  hideChatButton: false,
585
587
  hideConfirmationPane: false,
588
+ hideErrorUIPane: false,
586
589
  hideFooter: false,
587
590
  hideHeader: false,
588
591
  hideLoadingPane: false,
@@ -633,7 +636,6 @@ const dummyDefaultProps = {
633
636
  cancelButtonText: "Cancel",
634
637
  cancelButtonAriaLabel: "Cancel",
635
638
  brightnessValueOnDim: "0.2",
636
- disableDimLayer: false,
637
639
  onSend: undefined,
638
640
  onCancel: undefined,
639
641
  checkInput: undefined
@@ -1031,7 +1033,8 @@ const dummyDefaultProps = {
1031
1033
  margin: "0px 0px 20px 0px",
1032
1034
  display: "flex",
1033
1035
  order: 1,
1034
- alignSelf: "auto"
1036
+ alignSelf: "auto",
1037
+ overflow: "visible"
1035
1038
  },
1036
1039
  iconImageProps: {
1037
1040
  src: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2lpKSI+DQo8cGF0aCBkPSJNMTUuMTk3MSAxNi4yNzI1VjI1Ljg1MjRDMTUuMTk3MSAyNy4zODExIDE1Ljg0MDEgMjcuNTIwMSAxNi45ODMyIDI3LjUyMDFMMjYuNzA4NCAyNy41NjQ5TDMxLjAwMzkgMzIuMzEyM1YyNy41NjQ5SDMxLjg5N0MzMi4xNzQzIDI3LjU2MzcgMzIuNDQ4NyAyNy41MDc3IDMyLjcwNDUgMjcuNDAwMUMzMi45NjAzIDI3LjI5MjQgMzMuMTkyNSAyNy4xMzUzIDMzLjM4NzggMjYuOTM3NUMzMy41ODMxIDI2LjczOTggMzMuNzM3NyAyNi41MDU0IDMzLjg0MjcgMjYuMjQ3N0MzMy45NDc4IDI1Ljk5IDM0LjAwMTMgMjUuNzE0IDM0LjAwMDEgMjUuNDM1NVYxNi4zMDM4QzM0LjAwMTMgMTYuMDI1NCAzMy45NDc4IDE1Ljc0OTQgMzMuODQyNyAxNS40OTE3QzMzLjczNzcgMTUuMjM0IDMzLjU4MzEgMTQuOTk5NiAzMy4zODc4IDE0LjgwMThDMzMuMTkyNSAxNC42MDQxIDMyLjk2MDMgMTQuNDQ2OSAzMi43MDQ1IDE0LjMzOTNDMzIuNDQ4NyAxNC4yMzE2IDMyLjE3NDMgMTQuMTc1NiAzMS44OTcgMTQuMTc0NEwxNy4zMDQ3IDE0LjE0MzFDMTcuMDI2OSAxNC4xNDM3IDE2Ljc1MiAxNC4xOTkyIDE2LjQ5NTcgMTQuMzA2NkMxNi4yMzk0IDE0LjQxNCAxNi4wMDY3IDE0LjU3MTEgMTUuODEwOSAxNC43Njg5QzE1LjYxNTIgMTQuOTY2NyAxNS40NjAyIDE1LjIwMTMgMTUuMzU0OCAxNS40NTkzQzE1LjI0OTUgMTUuNzE3MyAxNS4xOTU5IDE1Ljk5MzYgMTUuMTk3MSAxNi4yNzI1WiIgZmlsbD0iI0Q2RDZENiIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZGlpKSI+DQo8cGF0aCBkPSJNMjcuODczNSA2LjY5ODg3VjE4Ljg0MDlDMjcuODczNSAyMC43Nzg1IDI3LjA1NzIgMjAuOTU0NiAyNS42MDU4IDIwLjk1NDZMMTMuMjU4IDIxLjAxMTRMNy44MDQxNCAyNy4wMjg1VjIxLjAxMTRINi42NzAyN0M2LjMxODEyIDIxLjAwOTkgNS45Njk3MSAyMC45Mzg5IDUuNjQ0OTMgMjAuODAyNUM1LjMyMDE2IDIwLjY2NjEgNS4wMjUzOCAyMC40NjY4IDQuNzc3NDIgMjAuMjE2MkM0LjUyOTQ2IDE5Ljk2NTYgNC4zMzMxOSAxOS42Njg1IDQuMTk5OCAxOS4zNDE5QzQuMDY2NDIgMTkuMDE1MiAzLjk5ODUzIDE4LjY2NTUgNC4wMDAwMiAxOC4zMTI1VjYuNzM4NjRDMy45OTg1MyA2LjM4NTcxIDQuMDY2NDIgNi4wMzU5NSA0LjE5OTggNS43MDkzMUM0LjMzMzE5IDUuMzgyNjcgNC41Mjk0NiA1LjA4NTU3IDQuNzc3NDIgNC44MzQ5NUM1LjAyNTM4IDQuNTg0MzQgNS4zMjAxNiA0LjM4NTEzIDUuNjQ0OTMgNC4yNDg2OUM1Ljk2OTcxIDQuMTEyMjUgNi4zMTgxMiA0LjA0MTI2IDYuNjcwMjcgNC4wMzk3N0wyNS4xOTc2IDRDMjUuNTUwMiA0LjAwMDc0IDI1Ljg5OTMgNC4wNzExOCAyNi4yMjQ3IDQuMjA3MjlDMjYuNTUwMSA0LjM0MzM5IDI2Ljg0NTYgNC41NDI0OSAyNy4wOTQxIDQuNzkzMThDMjcuMzQyNyA1LjA0Mzg2IDI3LjUzOTUgNS4zNDEyMiAyNy42NzMyIDUuNjY4MjNDMjcuODA3IDUuOTk1MjMgMjcuODc1IDYuMzQ1NDYgMjcuODczNSA2LjY5ODg3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyKSIvPg0KPC9nPg0KPGRlZnM+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2lpIiB4PSIxNS4xOTcxIiB5PSIxNC4xNDMxIiB3aWR0aD0iMTguODAzMSIgaGVpZ2h0PSIxOC4xNjkzIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMC4yIiBkeT0iLTAuMiIvPg0KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAuMTcgMCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9InNoYXBlIiByZXN1bHQ9ImVmZmVjdDFfaW5uZXJTaGFkb3ciLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMC41IiBkeT0iLTAuNSIvPg0KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgazI9Ii0xIiBrMz0iMSIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAuMTYgMCIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9ImVmZmVjdDFfaW5uZXJTaGFkb3ciIHJlc3VsdD0iZWZmZWN0Ml9pbm5lclNoYWRvdyIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2RpaSIgeD0iMCIgeT0iMCIgd2lkdGg9IjM5Ljg3MzYiIGhlaWdodD0iMzkuMDI4NSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQgZHg9IjQiIGR5PSI0Ii8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvdyIvPg0KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3ciIHJlc3VsdD0ic2hhcGUiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPg0KPGZlT2Zmc2V0IGR4PSItMiIgZHk9Ii0yIi8+DQo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiBrMj0iLTEiIGszPSIxIi8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwIDEgMCAwIDAgMC4xNyAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0ic2hhcGUiIHJlc3VsdD0iZWZmZWN0Ml9pbm5lclNoYWRvdyIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+DQo8ZmVPZmZzZXQgZHg9Ii0xIiBkeT0iLTEiLz4NCjxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIGsyPSItMSIgazM9IjEiLz4NCjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjE2IDAiLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJlZmZlY3QyX2lubmVyU2hhZG93IiByZXN1bHQ9ImVmZmVjdDNfaW5uZXJTaGFkb3ciLz4NCjwvZmlsdGVyPg0KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyIiB4MT0iLTAuMzk1MDAxIiB5MT0iMjMuMTI4MiIgeDI9IjIwLjEwNTgiIHkyPSIzNy44NDc0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+DQo8c3RvcCBzdG9wLWNvbG9yPSIjRUZFRkVGIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8L2xpbmVhckdyYWRpZW50Pg0KPC9kZWZzPg0KPC9zdmc+DQo=",
@@ -1123,7 +1126,8 @@ const dummyDefaultProps = {
1123
1126
  dir: "auto",
1124
1127
  hideOOOHPane: false,
1125
1128
  hideTitle: false,
1126
- titleText: "Thanks for contacting us. You have reached us outside of our operating hours. An agent will respond when we open."
1129
+ titleText: "Thanks for contacting us. You have reached us outside of our operating hours. An agent will respond when we open. Please see link https://microsoft.com",
1130
+ openLinkInNewTab: true
1127
1131
  },
1128
1132
  styleProps: {
1129
1133
  generalStyleProps: {
@@ -1166,7 +1170,7 @@ const dummyDefaultProps = {
1166
1170
  subtitleText: "Please take a moment to give us feedback about your chat experience. We are loading the survey for you now."
1167
1171
  },
1168
1172
  styleProps: {
1169
- // ...[Existing chat button style props]
1173
+ // ...[Existing loading pane style props]
1170
1174
  generalStyleProps: {
1171
1175
  position: "initial",
1172
1176
  width: "100%",
@@ -1211,7 +1215,7 @@ const dummyDefaultProps = {
1211
1215
  generalStyleProps: {
1212
1216
  borderStyle: "solid",
1213
1217
  borderRadius: "4px",
1214
- borderWidth: "3px",
1218
+ borderWidth: "0px",
1215
1219
  backgroundColor: "#FFFFFF",
1216
1220
  borderColor: "#F1F1F1",
1217
1221
  overflowY: "auto",
@@ -1616,10 +1620,10 @@ const dummyDefaultProps = {
1616
1620
  padding: "0px 10px 0 10px"
1617
1621
  },
1618
1622
  userMessageBoxStyles: {
1619
- maxWidth: "75%"
1623
+ maxWidth: "90%"
1620
1624
  },
1621
1625
  systemMessageBoxStyles: {
1622
- maxWidth: "75%"
1626
+ maxWidth: "90%"
1623
1627
  },
1624
1628
  typingIndicatorStyleProps: {
1625
1629
  marginLeft: "10px",