@microsoft/omnichannel-chat-widget 0.1.0-main.ae3aa42 → 0.1.0-main.b59a07c

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 (51) hide show
  1. package/lib/cjs/common/Constants.js +2 -2
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +13 -2
  3. package/lib/cjs/common/telemetry/TelemetryManager.js +7 -1
  4. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +8 -9
  5. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +6 -5
  6. package/lib/cjs/common/utils.js +17 -2
  7. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  8. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +12 -4
  9. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  10. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +3 -13
  11. package/lib/cjs/components/livechatwidget/common/endChat.js +28 -13
  12. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +4 -0
  13. package/lib/cjs/components/livechatwidget/common/startChat.js +49 -10
  14. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +52 -5
  15. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -5
  16. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  17. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  18. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +22 -21
  19. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  20. package/lib/cjs/contexts/createReducer.js +8 -0
  21. package/lib/cjs/plugins/newMessageEventHandler.js +10 -13
  22. package/lib/esm/common/Constants.js +2 -2
  23. package/lib/esm/common/telemetry/TelemetryConstants.js +13 -2
  24. package/lib/esm/common/telemetry/TelemetryManager.js +6 -1
  25. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +8 -6
  26. package/lib/esm/common/telemetry/loggers/consoleLogger.js +6 -5
  27. package/lib/esm/common/utils.js +8 -0
  28. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  29. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +13 -5
  30. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  31. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +3 -13
  32. package/lib/esm/components/livechatwidget/common/endChat.js +25 -14
  33. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +4 -0
  34. package/lib/esm/components/livechatwidget/common/startChat.js +51 -14
  35. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +47 -6
  36. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +6 -7
  37. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  38. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +1 -0
  39. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +22 -21
  40. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  41. package/lib/esm/contexts/createReducer.js +8 -0
  42. package/lib/esm/plugins/newMessageEventHandler.js +10 -12
  43. package/lib/types/common/Constants.d.ts +1 -1
  44. package/lib/types/common/telemetry/TelemetryConstants.d.ts +13 -4
  45. package/lib/types/common/telemetry/TelemetryHelper.d.ts +1 -0
  46. package/lib/types/common/telemetry/definitions/Payload.d.ts +12 -9
  47. package/lib/types/common/utils.d.ts +2 -0
  48. package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
  49. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  50. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +22 -21
  51. package/package.json +2 -2
@@ -45,8 +45,6 @@ _defineProperty(Constants, "false", "false");
45
45
 
46
46
  _defineProperty(Constants, "maximumUnreadMessageCount", 99);
47
47
 
48
- _defineProperty(Constants, "widgetStateDataKey", "LcwChatWidgetState");
49
-
50
48
  _defineProperty(Constants, "channelIdKey", "ChannelId-");
51
49
 
52
50
  _defineProperty(Constants, "ChannelId", "lcw");
@@ -155,6 +153,8 @@ _defineProperty(Constants, "internetConnectionTestUrl", "https://ocsdk-prod.azur
155
153
 
156
154
  _defineProperty(Constants, "internetConnectionTestUrlText", "Omnichannel Connect Test");
157
155
 
156
+ _defineProperty(Constants, "ChatWidgetStateChangedPrefix", "ChatWidgetStateChanged");
157
+
158
158
  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);
159
159
  exports.Regex = Regex;
160
160
 
@@ -37,18 +37,24 @@ exports.BroadcastEvent = BroadcastEvent;
37
37
 
38
38
  (function (BroadcastEvent) {
39
39
  BroadcastEvent["LoadPostChatSurvey"] = "LoadPostChatSurvey";
40
- BroadcastEvent["EndChat"] = "ChatEnded";
40
+ BroadcastEvent["ChatEnded"] = "ChatEnded";
41
41
  BroadcastEvent["NewMessageNotification"] = "NewMessageNotification";
42
42
  BroadcastEvent["UnreadMessageCount"] = "UnreadMessageCount";
43
- BroadcastEvent["ChatWidgetStateChanged"] = "ChatWidgetStateChanged";
43
+ BroadcastEvent["StartProactiveChat"] = "StartProactiveChat";
44
44
  BroadcastEvent["ProactiveChatStartChat"] = "ProactiveChatStartChat";
45
45
  BroadcastEvent["ProactiveChatStartPopoutChat"] = "ProactiveChatStartPopoutChat";
46
+ BroadcastEvent["ProactiveChatIsInPopoutMode"] = "ProactiveChatIsInPopoutMode";
47
+ BroadcastEvent["ClosePopoutWindow"] = "ClosePopoutWindow";
46
48
  BroadcastEvent["InvalidAdaptiveCardFormat"] = "InvalidAdaptiveCardFormat";
47
49
  BroadcastEvent["NewMessageSent"] = "NewMessageSent";
48
50
  BroadcastEvent["NewMessageReceived"] = "NewMessageReceived";
49
51
  BroadcastEvent["RedirectPageRequest"] = "RedirectPageRequest";
52
+ BroadcastEvent["StartChat"] = "StartChat";
50
53
  BroadcastEvent["StartChatSkippingChatButtonRendering"] = "StartChatSkippingChatButtonRendering";
51
54
  BroadcastEvent["StartUnauthenticatedReconnectChat"] = "StartUnauthenticatedReconnectChat";
55
+ BroadcastEvent["EndChat"] = "EndChat";
56
+ BroadcastEvent["SetCustomContext"] = "SetCustomContext";
57
+ BroadcastEvent["ChatRetrievedFromCache"] = "ChatRetrievedFromCache";
52
58
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
53
59
 
54
60
  let TelemetryEvent;
@@ -103,6 +109,7 @@ exports.TelemetryEvent = TelemetryEvent;
103
109
  TelemetryEvent["StartChatEventRecevied"] = "StartChatEventReceived";
104
110
  TelemetryEvent["EndChatSDKCall"] = "EndChatCall";
105
111
  TelemetryEvent["EndChatEventReceived"] = "EndChatEventReceived";
112
+ TelemetryEvent["ClosePopoutWindowEventRecevied"] = "ClosePopoutWindowEventRecevied";
106
113
  TelemetryEvent["OnNewMessageFailed"] = "OnNewMessageFailed";
107
114
  TelemetryEvent["OnNewMessageAudioNotificationFailed"] = "OnNewMessageAudioNotificationFailed";
108
115
  TelemetryEvent["DownloadTranscriptResponseNullOrUndefined"] = "DownloadTranscriptResponseNullOrUndefined";
@@ -152,6 +159,7 @@ exports.TelemetryEvent = TelemetryEvent;
152
159
  TelemetryEvent["ReconnectChatMinimize"] = "ReconnectChatMinimize";
153
160
  TelemetryEvent["MessageSent"] = "MessageSent";
154
161
  TelemetryEvent["MessageReceived"] = "MessageReceived";
162
+ TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
155
163
  })(TelemetryEvent || (exports.TelemetryEvent = TelemetryEvent = {}));
156
164
 
157
165
  class TelemetryConstants {
@@ -194,6 +202,9 @@ class TelemetryConstants {
194
202
  case TelemetryEvent.PreChatSurveyStartChatMethodFailed:
195
203
  case TelemetryEvent.HeaderCloseButtonClicked:
196
204
  case TelemetryEvent.HeaderMinimizeButtonClicked:
205
+ case TelemetryEvent.MessageSent:
206
+ case TelemetryEvent.MessageReceived:
207
+ case TelemetryEvent.CustomContextReceived:
197
208
  return ScenarioType.ACTIONS;
198
209
 
199
210
  case TelemetryEvent.StartChatSDKCall:
@@ -15,6 +15,8 @@ var _consoleLogger = require("./loggers/consoleLogger");
15
15
 
16
16
  var _defaultAriaConfig = require("./defaultConfigs/defaultAriaConfig");
17
17
 
18
+ var _TelemetryHelper = require("./TelemetryHelper");
19
+
18
20
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
19
21
 
20
22
  class TelemetryTimers {}
@@ -92,7 +94,11 @@ const RegisterLoggers = () => {
92
94
 
93
95
  const logLevel = telemetryEvent.logLevel ?? _TelemetryConstants.LogLevel.INFO;
94
96
  const scenarioType = ((_payload = telemetryEvent.payload) === null || _payload === void 0 ? void 0 : _payload.scenarioType) ?? _TelemetryConstants.ScenarioType.UNDEFINED;
95
- logger.log(logLevel, parseInput(telemetryEvent === null || telemetryEvent === void 0 ? void 0 : telemetryEvent.payload, scenarioType));
97
+ const telemetryInput = parseInput(telemetryEvent === null || telemetryEvent === void 0 ? void 0 : telemetryEvent.payload, scenarioType);
98
+ telemetryInput.telemetryInfo = {
99
+ telemetryInfo: _TelemetryHelper.TelemetryHelper.buildTelemetryEvent(logLevel, telemetryInput)
100
+ };
101
+ logger.log(logLevel, telemetryInput);
96
102
  });
97
103
  };
98
104
 
@@ -15,8 +15,6 @@ var _Enums = require("@microsoft/omnichannel-chat-sdk/lib/external/aria/common/E
15
15
 
16
16
  var _Constants = require("../../Constants");
17
17
 
18
- var _TelemetryHelper = require("../TelemetryHelper");
19
-
20
18
  var _TelemetryManager = require("../TelemetryManager");
21
19
 
22
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -67,18 +65,19 @@ const ariaTelemetryLogger = (ariaTelemetryKey, disabledCookieUsage, collectiorUr
67
65
  log: (logLevel, telemetryInput) => {
68
66
  try {
69
67
  let property;
68
+ const telemetryInfo = telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo;
70
69
  const eventProperties = new _AWTEventProperties.default();
71
-
72
- const event = _TelemetryHelper.TelemetryHelper.buildTelemetryEvent(logLevel, telemetryInput);
73
-
74
70
  eventProperties.setName(telemetryInput.scenarioType);
75
71
 
76
- for (const key of Object.keys(event)) {
77
- property = typeof event[key] === "object" ? JSON.stringify(event[key]) : event[key];
78
- eventProperties.setProperty(key, property);
72
+ if (telemetryInfo) {
73
+ for (const key of Object.keys(telemetryInfo)) {
74
+ property = typeof telemetryInfo[key] === "object" ? JSON.stringify(telemetryInfo[key]) : telemetryInfo[key];
75
+ eventProperties.setProperty(key, property);
76
+ }
77
+
78
+ eventProperties.setPropertyWithPii(ariaTelemetryApplicationName, _Constants.Constants.LiveChatWidget, _Enums.AWTPiiKind.GenericData);
79
79
  }
80
80
 
81
- eventProperties.setPropertyWithPii(ariaTelemetryApplicationName, _Constants.Constants.LiveChatWidget, _Enums.AWTPiiKind.GenericData);
82
81
  logger() ? logger().logEvent(eventProperties) : console.log("Unable to initialize aria logger");
83
82
  } catch (error) {
84
83
  console.error("Error in logging telemetry to Aria logger:" + error);
@@ -13,27 +13,28 @@ const consoleLogger = () => {
13
13
  const consoleLogger = {
14
14
  log: (logLevel, telemetryInput) => {
15
15
  const payload = telemetryInput !== null && telemetryInput !== void 0 && telemetryInput.payload && Object.keys(telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.payload).length > 0 ? telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.payload : "";
16
+ const telemetryInfo = telemetryInput !== null && telemetryInput !== void 0 && telemetryInput.telemetryInfo && Object.keys(telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo).length > 0 ? telemetryInput === null || telemetryInput === void 0 ? void 0 : telemetryInput.telemetryInfo : "";
16
17
 
17
18
  try {
18
19
  switch (logLevel) {
19
20
  case _TelemetryConstants.LogLevel.INFO:
20
- console.info(_Constants.Constants.LiveChatWidget, payload);
21
+ console.info(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
21
22
  break;
22
23
 
23
24
  case _TelemetryConstants.LogLevel.DEBUG:
24
- console.debug(_Constants.Constants.LiveChatWidget, payload);
25
+ console.debug(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
25
26
  break;
26
27
 
27
28
  case _TelemetryConstants.LogLevel.WARN:
28
- console.warn(_Constants.Constants.LiveChatWidget, payload);
29
+ console.warn(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
29
30
  break;
30
31
 
31
32
  case _TelemetryConstants.LogLevel.ERROR:
32
- console.error(_Constants.Constants.LiveChatWidget, payload);
33
+ console.error(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
33
34
  break;
34
35
 
35
36
  default:
36
- console.debug(_Constants.Constants.LiveChatWidget, payload);
37
+ console.debug(_Constants.Constants.LiveChatWidget, payload, telemetryInfo);
37
38
  break;
38
39
  }
39
40
  } catch (ex) {
@@ -3,12 +3,14 @@
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.isNullOrUndefined = exports.isNullOrEmptyString = exports.getTimestampHourMinute = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = void 0;
6
+ exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.createTimer = exports.changeLanguageCodeFormatForWebChat = void 0;
7
7
 
8
8
  var _Constants = require("./Constants");
9
9
 
10
10
  var _KeyCodes = require("./KeyCodes");
11
11
 
12
+ var _TelemetryConstants = require("./telemetry/TelemetryConstants");
13
+
12
14
  const getElementBySelector = selector => {
13
15
  let element;
14
16
 
@@ -333,6 +335,7 @@ const createTimer = () => {
333
335
 
334
336
  };
335
337
  }; // Returns the domain of the org
338
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
336
339
 
337
340
 
338
341
  exports.createTimer = createTimer;
@@ -347,4 +350,16 @@ const getDomain = hostValue => {
347
350
  return _Constants.AriaTelemetryConstants.Public;
348
351
  };
349
352
 
350
- exports.getDomain = getDomain;
353
+ exports.getDomain = getDomain;
354
+
355
+ const getWidgetCacheId = (orgId, widgetId) => {
356
+ return `${_Constants.Constants.ChatWidgetStateChangedPrefix}_${orgId}_${widgetId}`;
357
+ };
358
+
359
+ exports.getWidgetCacheId = getWidgetCacheId;
360
+
361
+ const getWidgetEndChatEventName = (orgId, widgetId) => {
362
+ return `${_TelemetryConstants.BroadcastEvent.ChatEnded}_${orgId}_${widgetId}`;
363
+ };
364
+
365
+ exports.getWidgetEndChatEventName = getWidgetEndChatEventName;
@@ -206,6 +206,20 @@ const CallingContainerStateful = props => {
206
206
  });
207
207
  }
208
208
  });
209
+ window.addEventListener("beforeunload", () => {
210
+ if (state.uiStates.isIncomingCall) {
211
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.rejectCall();
212
+ } else {
213
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.stopCall();
214
+ }
215
+
216
+ voiceVideoCallingSdk === null || voiceVideoCallingSdk === void 0 ? void 0 : voiceVideoCallingSdk.close();
217
+ dispatch({
218
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_E2VV_ENABLED,
219
+ payload: false
220
+ });
221
+ resetCallingStates(true);
222
+ });
209
223
  }, []);
210
224
  const controlProps = {
211
225
  id: "oc-lcw-callingcontainer",
@@ -34,7 +34,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
34
34
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
35
 
36
36
  const ChatButtonStateful = props => {
37
- var _state$domainStates$l, _state$domainStates$l2, _buttonProps$controlP;
37
+ var _state$domainStates$l, _state$domainStates$l2, _buttonProps$controlP, _props$buttonProps, _props$buttonProps$co, _props$buttonProps2, _props$buttonProps2$c, _props$buttonProps3, _props$buttonProps3$c;
38
38
 
39
39
  const [state, dispatch] = (0, _useChatContextStore.default)();
40
40
  const {
@@ -50,14 +50,20 @@ const ChatButtonStateful = props => {
50
50
  dir: state.domainStates.globalDir,
51
51
  titleText: "Let's Chat!",
52
52
  subtitleText: "We're online.",
53
- hideNotificationBubble: !(state.appStates.isMinimized === true && state.appStates.unreadMessageCount > 0) || (buttonProps === null || buttonProps === void 0 ? void 0 : (_buttonProps$controlP = buttonProps.controlProps) === null || _buttonProps$controlP === void 0 ? void 0 : _buttonProps$controlP.hideNotificationBubble) === true,
54
- unreadMessageCount: state.appStates.unreadMessageCount ? state.appStates.unreadMessageCount > _Constants.Constants.maximumUnreadMessageCount ? _Constants.Constants.maximumUnreadMessageCount.toString() + "+" : state.appStates.unreadMessageCount.toString() : "0",
53
+ hideNotificationBubble: (buttonProps === null || buttonProps === void 0 ? void 0 : (_buttonProps$controlP = buttonProps.controlProps) === null || _buttonProps$controlP === void 0 ? void 0 : _buttonProps$controlP.hideNotificationBubble) === true || state.appStates.isMinimized === false,
54
+ unreadMessageCount: state.appStates.unreadMessageCount ? state.appStates.unreadMessageCount > _Constants.Constants.maximumUnreadMessageCount ? (_props$buttonProps = props.buttonProps) === null || _props$buttonProps === void 0 ? void 0 : (_props$buttonProps$co = _props$buttonProps.controlProps) === null || _props$buttonProps$co === void 0 ? void 0 : _props$buttonProps$co.largeUnreadMessageString : state.appStates.unreadMessageCount.toString() : "0",
55
55
  onClick: async () => {
56
56
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
57
57
  Event: _TelemetryConstants.TelemetryEvent.LCWChatButtonClicked
58
58
  });
59
59
 
60
- if (state.appStates.isMinimized) {
60
+ if (state.appStates.proactiveChatStates.proactiveChatInNewWindow) {
61
+ const proactiveChatIsInPopoutModeEvent = {
62
+ eventName: _TelemetryConstants.BroadcastEvent.ProactiveChatIsInPopoutMode
63
+ };
64
+
65
+ _omnichannelChatComponents.BroadcastService.postMessage(proactiveChatIsInPopoutModeEvent);
66
+ } else if (state.appStates.isMinimized) {
61
67
  dispatch({
62
68
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
63
69
  payload: false
@@ -66,6 +72,7 @@ const ChatButtonStateful = props => {
66
72
  await startChat();
67
73
  }
68
74
  },
75
+ unreadMessageString: (_props$buttonProps2 = props.buttonProps) === null || _props$buttonProps2 === void 0 ? void 0 : (_props$buttonProps2$c = _props$buttonProps2.controlProps) === null || _props$buttonProps2$c === void 0 ? void 0 : _props$buttonProps2$c.unreadMessageString,
69
76
  ...(buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.controlProps)
70
77
  };
71
78
  const outOfOfficeControlProps = {
@@ -86,6 +93,7 @@ const ChatButtonStateful = props => {
86
93
  });
87
94
  }
88
95
  },
96
+ unreadMessageString: (_props$buttonProps3 = props.buttonProps) === null || _props$buttonProps3 === void 0 ? void 0 : (_props$buttonProps3$c = _props$buttonProps3.controlProps) === null || _props$buttonProps3$c === void 0 ? void 0 : _props$buttonProps3$c.unreadMessageString,
89
97
  ...(outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.controlProps)
90
98
  };
91
99
  (0, _react.useEffect)(() => {
@@ -138,7 +138,7 @@ const beautifyChatTranscripts = (chatTranscripts, renderMarkDown, attachmentMess
138
138
 
139
139
  if (value.attachments && value.attachments.length > 0 && value.attachments[0].name) {
140
140
  fileAttachmentName = value.attachments[0].name;
141
- value.content = attachmentMessage ?? "The following attachment was uploaded during the conversation:" + fileAttachmentName;
141
+ value.content = attachmentMessage ? attachmentMessage + " " + fileAttachmentName : "The following attachment was uploaded during the conversation: " + fileAttachmentName;
142
142
  }
143
143
  }
144
144
 
@@ -274,18 +274,6 @@ const dummyDefaultProps = {
274
274
  width: "50px",
275
275
  fontSize: "18px"
276
276
  },
277
- currentCallTimerStyleProps: {
278
- borderRadius: "2px",
279
- margin: "1px",
280
- color: "#FFFFFF",
281
- paddingTop: "18px",
282
- fontSize: 12,
283
- fontFamily: "Segoe UI, Arial, sans-serif",
284
- backgroundColor: "darkgrey",
285
- height: "45px",
286
- width: "50px",
287
- textAlign: "center"
288
- },
289
277
  videoTileStyleProps: {
290
278
  width: "100%",
291
279
  marginLeft: "auto",
@@ -349,7 +337,9 @@ const dummyDefaultProps = {
349
337
  hideChatTextContainer: false,
350
338
  hideChatSubtitle: false,
351
339
  hideChatTitle: false,
352
- hideNotificationBubble: true
340
+ hideNotificationBubble: true,
341
+ unreadMessageString: "new messages",
342
+ largeUnreadMessageString: "99+"
353
343
  },
354
344
  styleProps: {
355
345
  generalStyleProps: {
@@ -23,6 +23,8 @@ var _PostChatSurveyMode = require("../../postchatsurveypanestateful/enums/PostCh
23
23
 
24
24
  var _Constants = require("../../../common/Constants");
25
25
 
26
+ var _utils = require("../../../common/utils");
27
+
26
28
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
29
  const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state) => {
28
30
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _state$domainStates$l4;
@@ -34,7 +36,7 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
34
36
  if (isPostChatEnabled === "true" && (conversationDetails === null || conversationDetails === void 0 ? void 0 : conversationDetails.canRenderPostChat) === _Constants.Constants.truePascal) {
35
37
  const skipEndChatSDK = false;
36
38
  const skipCloseChat = true;
37
- await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
39
+ await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, true);
38
40
 
39
41
  if (postChatSurveyMode === _PostChatSurveyMode.PostChatSurveyMode.Embed) {
40
42
  const loadPostChatEvent = {
@@ -49,21 +51,30 @@ const prepareEndChat = async (props, chatSDK, setAdapter, setWebChatStyles, disp
49
51
  });
50
52
  }
51
53
  } else {
52
- await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
54
+ await endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, true);
53
55
  }
54
56
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
57
 
56
58
 
57
59
  exports.prepareEndChat = prepareEndChat;
58
60
 
59
- const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat) => {
61
+ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat, postMessageToOtherTab) => {
60
62
  if (!skipEndChatSDK) {
61
63
  try {
62
64
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
63
65
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCall
64
66
  });
65
67
 
66
- await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat());
68
+ await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.endChat()); // Need to clear these states immediately when chat ended from OC.
69
+
70
+ dispatch({
71
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
72
+ payload: undefined
73
+ });
74
+ dispatch({
75
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
76
+ payload: undefined
77
+ });
67
78
  } catch (ex) {
68
79
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
69
80
  Event: _TelemetryConstants.TelemetryEvent.EndChatSDKCallFailed,
@@ -71,6 +82,8 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
71
82
  exception: ex
72
83
  }
73
84
  });
85
+
86
+ postMessageToOtherTab = false;
74
87
  }
75
88
  }
76
89
 
@@ -100,18 +113,20 @@ const endChat = async (props, chatSDK, setAdapter, setWebChatStyles, dispatch, a
100
113
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_AUDIO_NOTIFICATION,
101
114
  payload: null
102
115
  });
103
- dispatch({
104
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
105
- payload: undefined
106
- });
107
- dispatch({
108
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
109
- payload: undefined
110
- });
111
116
 
112
117
  _omnichannelChatComponents.BroadcastService.postMessage({
113
- eventName: _TelemetryConstants.BroadcastEvent.EndChat
118
+ eventName: _TelemetryConstants.BroadcastEvent.ChatEnded
114
119
  });
120
+
121
+ if (postMessageToOtherTab) {
122
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2;
123
+
124
+ const endChatEventName = (0, _utils.getWidgetEndChatEventName)(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId);
125
+
126
+ _omnichannelChatComponents.BroadcastService.postMessage({
127
+ eventName: endChatEventName
128
+ });
129
+ }
115
130
  } catch (error) {
116
131
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
117
132
  Event: _TelemetryConstants.TelemetryEvent.CloseChatMethodException,
@@ -123,6 +123,10 @@ const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatStyles)
123
123
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
124
124
  payload: undefined
125
125
  });
126
+ dispatch({
127
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
128
+ payload: undefined
129
+ });
126
130
  };
127
131
 
128
132
  webChatStore = (0, _botframeworkWebchat.createStore)({}, //initial state
@@ -35,7 +35,11 @@ var _setPostChatContextAndLoadSurvey = require("./setPostChatContextAndLoadSurve
35
35
 
36
36
  var _updateSessionDataForTelemetry = require("./updateSessionDataForTelemetry");
37
37
 
38
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
39
+
38
40
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+
39
43
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
40
44
  var _props$reconnectChatP;
41
45
 
@@ -74,11 +78,13 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
74
78
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
75
79
  payload: _ConversationState.ConversationState.Prechat
76
80
  });
81
+ setCustomContextParams(props, state);
77
82
  } else {
78
83
  dispatch({
79
84
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
80
85
  payload: _ConversationState.ConversationState.Loading
81
86
  });
87
+ setCustomContextParams(props, state);
82
88
  await initStartChat(chatSDK, dispatch, setAdapter);
83
89
  }
84
90
  }
@@ -91,6 +97,21 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
91
97
  try {
92
98
  var _newAdapter$activity$, _TelemetryTimers$Widg;
93
99
 
100
+ let isStartChatSuccessful = false;
101
+
102
+ if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
103
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
104
+
105
+ // Broadcasting limited cached chat details
106
+ _omnichannelChatComponents.BroadcastService.postMessage({
107
+ eventName: _TelemetryConstants.BroadcastEvent.ChatRetrievedFromCache,
108
+ payload: {
109
+ chatId: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai = persistedState.domainStates) === null || _persistedState$domai === void 0 ? void 0 : (_persistedState$domai2 = _persistedState$domai.liveChatContext) === null || _persistedState$domai2 === void 0 ? void 0 : (_persistedState$domai3 = _persistedState$domai2.chatToken) === null || _persistedState$domai3 === void 0 ? void 0 : _persistedState$domai3.chatId,
110
+ requestId: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai4 = persistedState.domainStates) === null || _persistedState$domai4 === void 0 ? void 0 : (_persistedState$domai5 = _persistedState$domai4.liveChatContext) === null || _persistedState$domai5 === void 0 ? void 0 : _persistedState$domai5.requestId
111
+ }
112
+ });
113
+ }
114
+
94
115
  try {
95
116
  _TelemetryManager.TelemetryTimers.WidgetLoadTimer = (0, _utils.createTimer)();
96
117
 
@@ -98,7 +119,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
98
119
  Event: _TelemetryConstants.TelemetryEvent.StartChatSDKCall
99
120
  });
100
121
 
101
- await chatSDK.startChat(params);
122
+ optionalParams = Object.assign({}, params, optionalParams);
123
+ await chatSDK.startChat(optionalParams);
124
+ isStartChatSuccessful = true;
102
125
  } catch (error) {
103
126
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
104
127
  Event: _TelemetryConstants.TelemetryEvent.StartChatMethodException,
@@ -106,6 +129,8 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
106
129
  exception: `Failed to setup startChat: ${error}`
107
130
  }
108
131
  });
132
+
133
+ isStartChatSuccessful = false;
109
134
  }
110
135
 
111
136
  const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK);
@@ -133,10 +158,12 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
133
158
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch);
134
159
  await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch); // Set app state to Active
135
160
 
136
- dispatch({
137
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
138
- payload: _ConversationState.ConversationState.Active
139
- });
161
+ if (isStartChatSuccessful) {
162
+ dispatch({
163
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
164
+ payload: _ConversationState.ConversationState.Active
165
+ });
166
+ }
140
167
  } else {
141
168
  dispatch({
142
169
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_WIDGET_STATE,
@@ -178,24 +205,36 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
178
205
  exports.initStartChat = initStartChat;
179
206
 
180
207
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
181
- var _DataStoreManager$cli, _persistedState$domai;
208
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
182
209
 
183
- const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(_Constants.Constants.widgetStateDataKey, "localStorage");
210
+ const widgetStateEventName = (0, _utils.getWidgetCacheId)((chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId) ?? "", (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId) ?? "");
211
+ const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateEventName, "localStorage");
184
212
  const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
185
213
 
186
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
187
- var _persistedState$domai2;
214
+ if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai6 = persistedState.domainStates) !== null && _persistedState$domai6 !== void 0 && _persistedState$domai6.liveChatContext) {
215
+ var _persistedState$domai7;
188
216
 
189
217
  dispatch({
190
218
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
191
219
  payload: _ConversationState.ConversationState.Loading
192
220
  });
193
221
  const optionalParams = {
194
- liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai2 = persistedState.domainStates) === null || _persistedState$domai2 === void 0 ? void 0 : _persistedState$domai2.liveChatContext
222
+ liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
195
223
  };
196
224
  await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
197
225
  return true;
198
226
  } else {
199
227
  return false;
200
228
  }
229
+ };
230
+
231
+ const setCustomContextParams = (props, state) => {
232
+ var _props$chatConfig, _state$domainStates;
233
+
234
+ // Add custom context if any only for unauthenticated chat
235
+ if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && (_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.customContext) {
236
+ optionalParams = Object.assign({}, optionalParams, {
237
+ customContext: state.domainStates.customContext
238
+ });
239
+ }
201
240
  };