@microsoft/omnichannel-chat-widget 0.1.0-main.86df755 → 0.1.0-main.a7e4e7d

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 (163) hide show
  1. package/README.md +227 -0
  2. package/lib/cjs/assets/Audios.js +8 -0
  3. package/lib/cjs/assets/Icons.js +28 -0
  4. package/lib/cjs/common/Constants.js +38 -4
  5. package/lib/cjs/common/contextDataStore/DataStoreManager.js +14 -0
  6. package/lib/cjs/{assets/assets.d.js → common/interfaces/IContextDataStore.js} +0 -0
  7. package/lib/cjs/common/telemetry/TelemetryConstants.js +42 -3
  8. package/lib/cjs/common/telemetry/TelemetryHelper.js +22 -4
  9. package/lib/cjs/common/telemetry/TelemetryManager.js +28 -9
  10. package/lib/cjs/common/telemetry/defaultConfigs/defaultAriaConfig.js +3 -3
  11. package/lib/cjs/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  12. package/lib/cjs/common/telemetry/loggers/ariaTelemetryLogger.js +48 -15
  13. package/lib/cjs/common/telemetry/loggers/consoleLogger.js +9 -5
  14. package/lib/cjs/common/utils.js +30 -2
  15. package/lib/cjs/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  16. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +9 -2
  17. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +8 -54
  18. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +2 -2
  19. package/lib/cjs/components/footerstateful/FooterStateful.js +4 -5
  20. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  21. package/lib/cjs/components/headerstateful/HeaderStateful.js +11 -8
  22. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +3 -4
  23. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +42 -46
  24. package/lib/cjs/components/livechatwidget/common/disposeTelemetryLoggers.js +14 -0
  25. package/lib/cjs/components/livechatwidget/common/endChat.js +116 -49
  26. package/lib/cjs/components/livechatwidget/common/initCallingSdk.js +5 -0
  27. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +33 -9
  28. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +105 -20
  29. package/lib/cjs/components/livechatwidget/common/registerTelemetryLoggers.js +11 -7
  30. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +26 -24
  31. package/lib/cjs/components/livechatwidget/common/startChat.js +151 -53
  32. package/lib/cjs/components/livechatwidget/common/startProactiveChat.js +3 -3
  33. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +131 -32
  34. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  35. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +8 -0
  36. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +8 -0
  37. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +26 -10
  38. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +10 -4
  39. package/lib/cjs/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  40. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  41. package/lib/cjs/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +51 -73
  42. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +9 -46
  43. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +3 -1
  44. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  45. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +45 -0
  46. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  47. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +11 -7
  48. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +12 -4
  49. package/lib/cjs/contexts/createReducer.js +35 -10
  50. package/lib/cjs/controller/componentController.js +2 -2
  51. package/lib/cjs/plugins/newMessageEventHandler.js +99 -0
  52. package/lib/esm/assets/Audios.js +1 -0
  53. package/lib/esm/assets/Icons.js +11 -0
  54. package/lib/esm/common/Constants.js +34 -3
  55. package/lib/esm/common/contextDataStore/DataStoreManager.js +5 -0
  56. package/lib/esm/common/interfaces/IContextDataStore.js +1 -0
  57. package/lib/esm/common/telemetry/TelemetryConstants.js +38 -2
  58. package/lib/esm/common/telemetry/TelemetryHelper.js +22 -5
  59. package/lib/esm/common/telemetry/TelemetryManager.js +22 -9
  60. package/lib/esm/common/telemetry/defaultConfigs/defaultAriaConfig.js +3 -3
  61. package/lib/esm/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  62. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +50 -15
  63. package/lib/esm/common/telemetry/loggers/consoleLogger.js +9 -5
  64. package/lib/esm/common/utils.js +19 -1
  65. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  66. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +10 -2
  67. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +8 -50
  68. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +2 -2
  69. package/lib/esm/components/footerstateful/FooterStateful.js +4 -5
  70. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +1 -1
  71. package/lib/esm/components/headerstateful/HeaderStateful.js +12 -9
  72. package/lib/esm/components/livechatwidget/common/createMarkdown.js +3 -3
  73. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +40 -47
  74. package/lib/esm/components/livechatwidget/common/disposeTelemetryLoggers.js +4 -0
  75. package/lib/esm/components/livechatwidget/common/endChat.js +110 -46
  76. package/lib/esm/components/livechatwidget/common/initCallingSdk.js +3 -0
  77. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +29 -9
  78. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +94 -20
  79. package/lib/esm/components/livechatwidget/common/registerTelemetryLoggers.js +10 -3
  80. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +23 -22
  81. package/lib/esm/components/livechatwidget/common/startChat.js +146 -52
  82. package/lib/esm/components/livechatwidget/common/startProactiveChat.js +5 -5
  83. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +122 -35
  84. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  85. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +6 -0
  86. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +6 -0
  87. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +25 -10
  88. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +9 -5
  89. package/lib/esm/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  90. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  91. package/lib/esm/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +2 -12
  92. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +7 -44
  93. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
  94. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  95. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +32 -0
  96. package/lib/esm/contexts/common/ConversationState.js +3 -2
  97. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +11 -7
  98. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +12 -4
  99. package/lib/esm/contexts/createReducer.js +35 -9
  100. package/lib/esm/controller/componentController.js +2 -2
  101. package/lib/esm/plugins/newMessageEventHandler.js +82 -0
  102. package/lib/types/assets/Audios.d.ts +1 -0
  103. package/lib/types/assets/Icons.d.ts +11 -0
  104. package/lib/types/common/Constants.d.ts +19 -1
  105. package/lib/types/common/contextDataStore/DataStoreManager.d.ts +4 -0
  106. package/lib/types/common/interfaces/IContextDataStore.d.ts +14 -0
  107. package/lib/types/common/telemetry/TelemetryConstants.d.ts +27 -1
  108. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -0
  109. package/lib/types/common/telemetry/TelemetryManager.d.ts +1 -0
  110. package/lib/types/common/telemetry/definitions/Contracts.d.ts +3 -0
  111. package/lib/types/common/telemetry/definitions/Payload.d.ts +15 -9
  112. package/lib/types/common/telemetry/interfaces/IChatSDKLogger.d.ts +1 -0
  113. package/lib/types/common/telemetry/interfaces/IInternalTelemetryData.d.ts +2 -0
  114. package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +12 -0
  115. package/lib/types/common/utils.d.ts +3 -0
  116. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +5 -2
  117. package/lib/types/components/footerstateful/audionotificationstateful/interfaces/IAudioNotificationStatefulParams.d.ts +0 -1
  118. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +4 -1
  119. package/lib/types/components/livechatwidget/common/disposeTelemetryLoggers.d.ts +1 -0
  120. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -1
  121. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -2
  122. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
  123. package/lib/types/components/livechatwidget/common/startChat.d.ts +1 -1
  124. package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +2 -1
  125. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetComponentOverrides.d.ts +1 -0
  126. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +3 -1
  127. package/lib/types/components/prechatsurveypanestateful/interfaces/IPreChatSurveyPaneStatefulParams.d.ts +1 -1
  128. package/lib/types/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.d.ts +3 -0
  129. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +1 -0
  130. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  131. package/lib/types/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.d.ts +1 -1
  132. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +0 -1
  133. package/lib/types/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.d.ts +1 -0
  134. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  135. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +4 -0
  136. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +12 -8
  137. package/lib/types/plugins/newMessageEventHandler.d.ts +2 -0
  138. package/package.json +11 -11
  139. package/lib/cjs/assets/audios/newMessageNotification.mp3 +0 -0
  140. package/lib/cjs/assets/icons/archiveIcon.svg +0 -3
  141. package/lib/cjs/assets/icons/audioIcon.svg +0 -6
  142. package/lib/cjs/assets/icons/blankIcon.svg +0 -6
  143. package/lib/cjs/assets/icons/excelIcon.svg +0 -6
  144. package/lib/cjs/assets/icons/imageIcon.svg +0 -6
  145. package/lib/cjs/assets/icons/oneNoteIcon.svg +0 -6
  146. package/lib/cjs/assets/icons/pdfIcon.svg +0 -6
  147. package/lib/cjs/assets/icons/powerpointIcon.svg +0 -6
  148. package/lib/cjs/assets/icons/videoIcon.svg +0 -6
  149. package/lib/cjs/assets/icons/visioIcon.svg +0 -6
  150. package/lib/cjs/assets/icons/wordIcon.svg +0 -6
  151. package/lib/esm/assets/assets.d.js +0 -0
  152. package/lib/esm/assets/audios/newMessageNotification.mp3 +0 -0
  153. package/lib/esm/assets/icons/archiveIcon.svg +0 -3
  154. package/lib/esm/assets/icons/audioIcon.svg +0 -6
  155. package/lib/esm/assets/icons/blankIcon.svg +0 -6
  156. package/lib/esm/assets/icons/excelIcon.svg +0 -6
  157. package/lib/esm/assets/icons/imageIcon.svg +0 -6
  158. package/lib/esm/assets/icons/oneNoteIcon.svg +0 -6
  159. package/lib/esm/assets/icons/pdfIcon.svg +0 -6
  160. package/lib/esm/assets/icons/powerpointIcon.svg +0 -6
  161. package/lib/esm/assets/icons/videoIcon.svg +0 -6
  162. package/lib/esm/assets/icons/visioIcon.svg +0 -6
  163. package/lib/esm/assets/icons/wordIcon.svg +0 -6
@@ -1,91 +1,149 @@
1
- import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
2
1
  import { ChatSDKError } from "../../../common/Constants";
2
+ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
3
  import { ConversationState } from "../../../contexts/common/ConversationState";
4
+ import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
4
5
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
5
6
  import { NotificationHandler } from "../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
6
7
  import { NotificationScenarios } from "../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
7
8
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
8
9
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
9
10
  import { createAdapter } from "./createAdapter";
10
- import { createTimer } from "../../../common/utils";
11
- import { getReconnectIdForAuthenticatedChat } from "./reconnectChatHelper";
11
+ import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
12
+ import { createTimer, getWidgetCacheId } from "../../../common/utils";
13
+ import { getReconnectIdForAuthenticatedChat, handleRedirectUnauthenticatedReconnectChat } from "./reconnectChatHelper";
14
+ import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
12
15
  import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
13
- import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ import { BroadcastService } from "@microsoft/omnichannel-chat-components"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+
18
+ let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
19
 
15
20
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
16
- // Getting PreChat Survey Context
17
- const parseToJson = false;
18
- const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
19
- const showPrechat = state.appStates.conversationState === ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
21
+ var _props$reconnectChatP;
20
22
 
21
- const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
23
+ if (await canConnectToExistingChat(props, chatSDK, state, dispatch, setAdapter)) {
24
+ return;
25
+ } // Redirecting if unauthenticated reconnect chat expired
22
26
 
23
- if (reconnectId) {
24
- dispatch({
25
- type: LiveChatWidgetActionType.SET_RECONNECT_ID,
26
- payload: reconnectId
27
- });
28
- dispatch({
29
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
30
- payload: ConversationState.ReconnectChat
31
- });
32
- } else if (showPrechat) {
33
- dispatch({
34
- type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
35
- payload: preChatSurveyResponse
36
- });
37
- dispatch({
38
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
39
- payload: ConversationState.Prechat
40
- });
27
+
28
+ if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
29
+ var _props$reconnectChatP2, _props$reconnectChatP3;
30
+
31
+ await handleRedirectUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, initStartChat, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, (_props$reconnectChatP3 = props.reconnectChatPaneProps) === null || _props$reconnectChatP3 === void 0 ? void 0 : _props$reconnectChatP3.redirectInSameWindow);
41
32
  } else {
42
- dispatch({
43
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
44
- payload: ConversationState.Loading
45
- });
46
- await initStartChat(chatSDK, dispatch, setAdapter);
33
+ // Getting PreChat Survey Context
34
+ const parseToJson = false;
35
+ const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
36
+ const showPrechat = state.appStates.conversationState === ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
37
+
38
+ const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
39
+
40
+ if (reconnectId) {
41
+ dispatch({
42
+ type: LiveChatWidgetActionType.SET_RECONNECT_ID,
43
+ payload: reconnectId
44
+ });
45
+ dispatch({
46
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
47
+ payload: ConversationState.ReconnectChat
48
+ });
49
+ } else if (showPrechat) {
50
+ dispatch({
51
+ type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
52
+ payload: preChatSurveyResponse
53
+ });
54
+ dispatch({
55
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
56
+ payload: ConversationState.Prechat
57
+ });
58
+ setCustomContextParams(props, state);
59
+ } else {
60
+ dispatch({
61
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
62
+ payload: ConversationState.Loading
63
+ });
64
+ setCustomContextParams(props, state);
65
+ await initStartChat(chatSDK, dispatch, setAdapter);
66
+ }
47
67
  }
48
68
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
69
 
50
70
 
51
- const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
71
+ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedState) => {
52
72
  try {
53
- var _TelemetryTimers$Widg;
73
+ var _newAdapter$activity$, _TelemetryTimers$Widg;
74
+
75
+ let isStartChatSuccessful = false;
76
+
77
+ if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
78
+ var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
79
+
80
+ // Broadcasting limited cached chat details
81
+ BroadcastService.postMessage({
82
+ eventName: BroadcastEvent.ChatRetrievedFromCache,
83
+ payload: {
84
+ 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,
85
+ 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
86
+ }
87
+ });
88
+ }
54
89
 
55
90
  try {
56
- TelemetryHelper.logConfigDataEvent(LogLevel.INFO, {
91
+ TelemetryTimers.WidgetLoadTimer = createTimer();
92
+ TelemetryHelper.logSDKEvent(LogLevel.INFO, {
57
93
  Event: TelemetryEvent.StartChatSDKCall
58
94
  });
59
- await chatSDK.startChat(params);
60
- TelemetryTimers.WidgetLoadTimer = createTimer();
95
+ optionalParams = Object.assign({}, params, optionalParams);
96
+ await chatSDK.startChat(optionalParams);
97
+ isStartChatSuccessful = true;
61
98
  } catch (error) {
62
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
99
+ TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
63
100
  Event: TelemetryEvent.StartChatMethodException,
64
101
  ExceptionDetails: {
65
102
  exception: `Failed to setup startChat: ${error}`
66
103
  }
67
104
  });
105
+ isStartChatSuccessful = false;
68
106
  }
69
107
 
70
108
  const newAdapter = await createAdapter(chatSDK);
71
- setAdapter(newAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
+ setAdapter(newAdapter);
110
+ const chatToken = await chatSDK.getChatToken();
111
+ newAdapter === null || newAdapter === void 0 ? void 0 : (_newAdapter$activity$ = newAdapter.activity$) === null || _newAdapter$activity$ === void 0 ? void 0 : _newAdapter$activity$.subscribe(createOnNewAdapterActivityHandler(chatToken === null || chatToken === void 0 ? void 0 : chatToken.chatId, chatToken === null || chatToken === void 0 ? void 0 : chatToken.visitorId));
72
112
 
73
- if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
113
+ if (!persistedState) {
74
114
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
115
+ if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
118
+ dispatch({
119
+ type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
120
+ payload: chatToken
121
+ });
122
+ } // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
+
124
+
125
+ const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
76
126
  dispatch({
77
- type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
78
- payload: chatToken
127
+ type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
128
+ payload: liveChatContext
79
129
  });
80
- }
130
+ await setPostChatContextAndLoadSurvey(chatSDK, dispatch);
131
+ await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
81
132
 
82
- await setPostChatContextAndLoadSurvey(chatSDK, dispatch, false);
83
- await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
133
+ if (isStartChatSuccessful) {
134
+ dispatch({
135
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
136
+ payload: ConversationState.Active
137
+ });
138
+ }
139
+ } else {
140
+ dispatch({
141
+ type: LiveChatWidgetActionType.SET_WIDGET_STATE,
142
+ payload: persistedState
143
+ });
144
+ await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
145
+ }
84
146
 
85
- dispatch({
86
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
87
- payload: ConversationState.Active
88
- });
89
147
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
90
148
  Event: TelemetryEvent.WidgetLoadComplete,
91
149
  Description: "Widget load complete",
@@ -93,9 +151,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
93
151
  });
94
152
  } catch (ex) {
95
153
  TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
96
- Event: TelemetryEvent.StartChatFailed,
154
+ Event: TelemetryEvent.WidgetLoadFailed,
97
155
  ExceptionDetails: {
98
- Exception: `Start Chat Failed: ${ex}`
156
+ Exception: `Widget load Failed: ${ex}`
99
157
  }
100
158
  });
101
159
  NotificationHandler.notifyError(NotificationScenarios.Connection, "Start Chat Failed: " + ex); // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -111,6 +169,42 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
111
169
  });
112
170
  }
113
171
  }
172
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
+
174
+
175
+ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
176
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
177
+
178
+ const widgetStateEventName = 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) ?? "");
179
+ const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateEventName, "localStorage");
180
+ const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
181
+
182
+ if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai6 = persistedState.domainStates) !== null && _persistedState$domai6 !== void 0 && _persistedState$domai6.liveChatContext) {
183
+ var _persistedState$domai7;
184
+
185
+ dispatch({
186
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
187
+ payload: ConversationState.Loading
188
+ });
189
+ const optionalParams = {
190
+ liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
191
+ };
192
+ await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
193
+ return true;
194
+ } else {
195
+ return false;
196
+ }
197
+ };
198
+
199
+ const setCustomContextParams = (props, state) => {
200
+ var _props$chatConfig, _state$domainStates;
201
+
202
+ // Add custom context if any only for unauthenticated chat
203
+ 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) {
204
+ optionalParams = Object.assign({}, optionalParams, {
205
+ customContext: state.domainStates.customContext
206
+ });
207
+ }
114
208
  };
115
209
 
116
210
  export { prepareStartChat, initStartChat };
@@ -2,14 +2,14 @@ import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryCon
2
2
  import { ConversationState } from "../../../contexts/common/ConversationState";
3
3
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
4
4
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
5
- import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager"; // Defines startProactiveChat callback
6
-
7
- export const startProactiveChat = (dispatch, bodyTitle, showPrechat, inNewWindow) => {
5
+ import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
6
+ // Defines startProactiveChat callback
7
+ export const startProactiveChat = (dispatch, notificationConfig, enablePreChat, inNewWindow) => {
8
8
  dispatch({
9
9
  type: LiveChatWidgetActionType.SET_PROACTIVE_CHAT_PARAMS,
10
10
  payload: {
11
- proactiveChatBodyTitle: bodyTitle ?? "",
12
- proactiveChatEnablePrechat: showPrechat ?? false,
11
+ proactiveChatBodyTitle: notificationConfig && notificationConfig.message ? notificationConfig.message : "",
12
+ proactiveChatEnablePrechat: enablePreChat ?? false,
13
13
  proactiveChatInNewWindow: inNewWindow ?? false
14
14
  }
15
15
  });
@@ -1,10 +1,11 @@
1
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
+ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
4
  import { BroadcastService, decodeComponentString } from "@microsoft/omnichannel-chat-components";
4
5
  import { Stack } from "@fluentui/react";
5
6
  import React, { useEffect, useRef, useState } from "react";
6
- import { createTimer, getLocaleDirection } from "../../../common/utils";
7
- import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
7
+ import { createTimer, getLocaleDirection, getWidgetCacheId, getWidgetEndChatEventName } from "../../../common/utils";
8
+ import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat, startUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
8
9
  import { initStartChat, prepareStartChat } from "../common/startChat";
9
10
  import { shouldShowCallingContainer, shouldShowChatButton, shouldShowConfirmationPane, shouldShowEmailTranscriptPane, shouldShowHeader, shouldShowLoadingPane, shouldShowOutOfOfficeHoursPane, shouldShowPostChatLoadingPane, shouldShowPostChatSurveyPane, shouldShowPreChatSurveyPane, shouldShowProactiveChatPane, shouldShowReconnectChatPane, shouldShowWebChatContainer } from "../../../controller/componentController";
10
11
  import CallingContainerStateful from "../../callingcontainerstateful/CallingContainerStateful";
@@ -12,6 +13,7 @@ import ChatButtonStateful from "../../chatbuttonstateful/ChatButtonStateful";
12
13
  import { Components } from "botframework-webchat";
13
14
  import ConfirmationPaneStateful from "../../confirmationpanestateful/ConfirmationPaneStateful";
14
15
  import { ConversationState } from "../../../contexts/common/ConversationState";
16
+ import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
15
17
  import { ElementType } from "@microsoft/omnichannel-chat-components";
16
18
  import EmailTranscriptPaneStateful from "../../emailtranscriptpanestateful/EmailTranscriptPaneStateful";
17
19
  import HeaderStateful from "../../headerstateful/HeaderStateful";
@@ -23,12 +25,14 @@ import PostChatSurveyPaneStateful from "../../postchatsurveypanestateful/PostCha
23
25
  import PreChatSurveyPaneStateful from "../../prechatsurveypanestateful/PreChatSurveyPaneStateful";
24
26
  import ProactiveChatPaneStateful from "../../proactivechatpanestateful/ProactiveChatPaneStateful";
25
27
  import ReconnectChatPaneStateful from "../../reconnectchatpanestateful/ReconnectChatPaneStateful";
28
+ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
26
29
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
27
30
  import WebChatContainerStateful from "../../webchatcontainerstateful/WebChatContainerStateful";
28
31
  import { createFooter } from "../common/createFooter";
29
32
  import { createInternetConnectionChangeHandler } from "../common/createInternetConnectionChangeHandler";
30
33
  import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
31
- import { endChat } from "../common/endChat";
34
+ import { disposeTelemetryLoggers } from "../common/disposeTelemetryLoggers";
35
+ import { endChat, prepareEndChat } from "../common/endChat";
32
36
  import { getGeneralStylesForButton } from "../common/getGeneralStylesForButton";
33
37
  import { initCallingSdk } from "../common/initCallingSdk";
34
38
  import { initConfirmationPropsComposer } from "../common/initConfirmationPropsComposer";
@@ -40,7 +44,7 @@ import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
40
44
  import useChatContextStore from "../../../hooks/useChatContextStore";
41
45
  import useChatSDKStore from "../../../hooks/useChatSDKStore";
42
46
  export const LiveChatWidgetStateful = props => {
43
- var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps5, _props$componentOverr, _props$controlProps6, _props$componentOverr2, _props$controlProps7, _props$componentOverr3, _props$controlProps8, _props$componentOverr4, _props$controlProps9, _props$componentOverr5, _props$controlProps10, _props$componentOverr6, _props$controlProps11, _props$controlProps12, _props$controlProps13, _props$componentOverr7, _props$controlProps14, _props$componentOverr8, _props$controlProps15, _props$componentOverr9, _props$componentOverr10, _props$componentOverr11;
47
+ var _props$webChatContain, _props$styleProps, _props$controlProps, _props$webChatContain3, _props$webChatContain4, _props$styleProps2, _props$controlProps5, _props$componentOverr, _props$controlProps6, _props$componentOverr2, _props$controlProps7, _props$componentOverr3, _props$controlProps8, _props$componentOverr4, _props$controlProps9, _props$componentOverr5, _props$controlProps10, _props$componentOverr6, _props$controlProps11, _props$componentOverr7, _props$controlProps12, _props$controlProps13, _props$componentOverr8, _props$controlProps14, _props$componentOverr9, _props$controlProps15, _props$componentOverr10, _props$componentOverr11, _props$componentOverr12;
44
48
 
45
49
  const [state, dispatch] = useChatContextStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
50
 
@@ -49,12 +53,14 @@ export const LiveChatWidgetStateful = props => {
49
53
  ...((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles)
50
54
  }); // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
55
 
52
- const chatSDK = useChatSDKStore();
56
+ const chatSDK = useChatSDKStore(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+
53
58
  const [voiceVideoCallingSDK, setVoiceVideoCallingSDK] = useState(undefined);
54
59
  const {
55
60
  Composer
56
61
  } = Components;
57
- const canStartProactiveChat = useRef(true); // Process general styles
62
+ const canStartProactiveChat = useRef(true);
63
+ const canEndChat = useRef(true); // Process general styles
58
64
 
59
65
  const generalStyles = {
60
66
  root: Object.assign({}, getGeneralStylesForButton(state), (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyles)
@@ -67,6 +73,7 @@ export const LiveChatWidgetStateful = props => {
67
73
 
68
74
  registerTelemetryLoggers(props, dispatch);
69
75
  createInternetConnectionChangeHandler();
76
+ DataStoreManager.clientDataStore = props.contextDataStore ?? undefined;
70
77
  dispatch({
71
78
  type: LiveChatWidgetActionType.SET_WIDGET_ELEMENT_ID,
72
79
  payload: widgetElementId
@@ -75,6 +82,10 @@ export const LiveChatWidgetStateful = props => {
75
82
  type: LiveChatWidgetActionType.SET_SKIP_CHAT_BUTTON_RENDERING,
76
83
  payload: ((_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.skipChatButtonRendering) || false
77
84
  });
85
+ dispatch({
86
+ type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
87
+ payload: false
88
+ });
78
89
  initCallingSdk(chatSDK, setVoiceVideoCallingSDK).then(sdkCreated => {
79
90
  sdkCreated && dispatch({
80
91
  type: LiveChatWidgetActionType.SET_E2VV_ENABLED,
@@ -85,7 +96,7 @@ export const LiveChatWidgetStateful = props => {
85
96
  if (!((_props$controlProps3 = props.controlProps) !== null && _props$controlProps3 !== void 0 && _props$controlProps3.skipChatButtonRendering) && (_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
86
97
  var _props$reconnectChatP2;
87
98
 
88
- handleUnauthenticatedReconnectChat(dispatch, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
99
+ startUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, initStartChat);
89
100
  } // Initialize global dir
90
101
 
91
102
 
@@ -95,13 +106,11 @@ export const LiveChatWidgetStateful = props => {
95
106
  payload: globalDir
96
107
  });
97
108
 
98
- if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.chatToken) {
109
+ if ((_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.liveChatContext) {
99
110
  var _state$domainStates2;
100
111
 
101
112
  const optionalParams = {
102
- liveChatContext: {
103
- chatToken: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.chatToken
104
- }
113
+ liveChatContext: (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : _state$domainStates2.liveChatContext
105
114
  };
106
115
  initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
107
116
  }
@@ -111,9 +120,9 @@ export const LiveChatWidgetStateful = props => {
111
120
  var _props$reconnectChatP3;
112
121
 
113
122
  if ((_props$reconnectChatP3 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP3 !== void 0 && _props$reconnectChatP3.reconnectId && !state.appStates.reconnectId) {
114
- var _props$reconnectChatP4;
123
+ var _props$reconnectChatP4, _props$reconnectChatP5;
115
124
 
116
- handleUnauthenticatedReconnectChat(dispatch, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat);
125
+ handleUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, (_props$reconnectChatP4 = props.reconnectChatPaneProps) === null || _props$reconnectChatP4 === void 0 ? void 0 : _props$reconnectChatP4.reconnectId, initStartChat, (_props$reconnectChatP5 = props.reconnectChatPaneProps) === null || _props$reconnectChatP5 === void 0 ? void 0 : _props$reconnectChatP5.redirectInSameWindow);
117
126
  } else {
118
127
  getReconnectIdForAuthenticatedChat(props, chatSDK).then(authReconnectId => {
119
128
  if (authReconnectId && !state.appStates.reconnectId) {
@@ -126,6 +135,10 @@ export const LiveChatWidgetStateful = props => {
126
135
  payload: ConversationState.ReconnectChat
127
136
  });
128
137
  } else {
138
+ const chatStartedSkippingChatButtonRendering = {
139
+ eventName: BroadcastEvent.StartChatSkippingChatButtonRendering
140
+ };
141
+ BroadcastService.postMessage(chatStartedSkippingChatButtonRendering);
129
142
  dispatch({
130
143
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
131
144
  payload: ConversationState.Loading
@@ -137,29 +150,94 @@ export const LiveChatWidgetStateful = props => {
137
150
  }
138
151
  }, [state.appStates.skipChatButtonRendering]);
139
152
  useEffect(() => {
153
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2;
154
+
155
+ // Add the custom context on receiving the SetCustomContext event
156
+ BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
157
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
158
+ Event: TelemetryEvent.CustomContextReceived,
159
+ Description: "CustomContext received."
160
+ });
161
+ dispatch({
162
+ type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
163
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
164
+ });
165
+ });
140
166
  BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
167
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
168
+ Event: TelemetryEvent.StartProactiveChatEventReceived,
169
+ Description: "Start proactive chat event received."
170
+ });
171
+
141
172
  if (canStartProactiveChat.current) {
142
173
  var _msg$payload, _msg$payload2, _msg$payload3;
143
174
 
144
- startProactiveChat(dispatch, msg === null || msg === void 0 ? void 0 : (_msg$payload = msg.payload) === null || _msg$payload === void 0 ? void 0 : _msg$payload.bodyTitle, msg === null || msg === void 0 ? void 0 : (_msg$payload2 = msg.payload) === null || _msg$payload2 === void 0 ? void 0 : _msg$payload2.showPrechat, msg === null || msg === void 0 ? void 0 : (_msg$payload3 = msg.payload) === null || _msg$payload3 === void 0 ? void 0 : _msg$payload3.inNewWindow);
175
+ startProactiveChat(dispatch, msg === null || msg === void 0 ? void 0 : (_msg$payload = msg.payload) === null || _msg$payload === void 0 ? void 0 : _msg$payload.notificationConfig, msg === null || msg === void 0 ? void 0 : (_msg$payload2 = msg.payload) === null || _msg$payload2 === void 0 ? void 0 : _msg$payload2.enablePreChat, msg === null || msg === void 0 ? void 0 : (_msg$payload3 = msg.payload) === null || _msg$payload3 === void 0 ? void 0 : _msg$payload3.inNewWindow);
176
+ } else {
177
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
178
+ Event: TelemetryEvent.ChatAlreadyTriggered,
179
+ Description: "Start proactive chat method called, when chat was already triggered."
180
+ });
181
+ }
182
+ }); // start chat from SDK Event
183
+
184
+ BroadcastService.getMessageByEventName("StartChat").subscribe(() => {
185
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
186
+ Event: TelemetryEvent.StartChatEventRecevied,
187
+ Description: "Start chat event received."
188
+ });
189
+
190
+ if (state.appStates.isMinimized) {
191
+ dispatch({
192
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
193
+ payload: false
194
+ });
195
+ } else {
196
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
145
197
  }
198
+ }); // end chat from SDK Event
199
+
200
+ BroadcastService.getMessageByEventName("EndChat").subscribe(async () => {
201
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
202
+ Event: TelemetryEvent.EndChatEventReceived,
203
+ Description: "End chat event received."
204
+ });
205
+
206
+ if (canEndChat.current) {
207
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
208
+ } else {
209
+ const skipEndChatSDK = true;
210
+ const skipCloseChat = false;
211
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
212
+ }
213
+ }); // Listen to end chat event from other tabs
214
+
215
+ const endChatEventName = 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);
216
+ BroadcastService.getMessageByEventName(endChatEventName).subscribe(async () => {
217
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, false, false, false);
218
+ });
219
+ window.addEventListener("beforeunload", () => {
220
+ disposeTelemetryLoggers();
146
221
  });
222
+
223
+ if (state.appStates.conversationEndedByAgent) {
224
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
225
+ }
147
226
  }, []);
148
227
  useEffect(() => {
149
- if (state.appStates.conversationState !== ConversationState.Closed) {
150
- canStartProactiveChat.current = false;
151
- }
228
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed;
229
+ canEndChat.current = state.appStates.conversationState === ConversationState.Active;
152
230
 
153
231
  if (state.appStates.conversationState === ConversationState.Active) {
154
232
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
155
233
  BroadcastService.postMessage({
156
- eventName: "NewMessageNotification"
234
+ eventName: BroadcastEvent.NewMessageNotification
157
235
  });
158
236
  });
159
237
  } // Track the message count
160
238
 
161
239
 
162
- if (state.appStates.conversationState == ConversationState.Active) {
240
+ if (state.appStates.conversationState === ConversationState.Active) {
163
241
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
164
242
  currentMessageCountRef.current++;
165
243
  dispatch({
@@ -178,7 +256,7 @@ export const LiveChatWidgetStateful = props => {
178
256
  });
179
257
  const customEvent = {
180
258
  elementType: ElementType.Custom,
181
- eventName: "UnreadMessageCount",
259
+ eventName: BroadcastEvent.UnreadMessageCount,
182
260
  payload: 0
183
261
  };
184
262
  BroadcastService.postMessage(customEvent);
@@ -188,7 +266,7 @@ export const LiveChatWidgetStateful = props => {
188
266
  if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
189
267
  const customEvent = {
190
268
  elementType: ElementType.Custom,
191
- eventName: "UnreadMessageCount",
269
+ eventName: BroadcastEvent.UnreadMessageCount,
192
270
  payload: `${state.appStates.unreadMessageCount}`
193
271
  };
194
272
  BroadcastService.postMessage(customEvent);
@@ -203,23 +281,32 @@ export const LiveChatWidgetStateful = props => {
203
281
  }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
204
282
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
205
283
 
206
- const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
284
+ const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
285
+
207
286
 
208
- const endChatRelay = () => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
287
+ const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
288
+
289
+
290
+ const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
209
291
 
210
292
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
211
293
 
212
294
 
213
- const initStartChatRelay = optionalParams => initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
295
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
214
296
 
215
297
  const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
216
298
 
217
- const chatWidgetStateChangeEvent = {
218
- eventName: "ChatWidgetStateChanged",
219
- payload: { ...state
220
- }
221
- };
222
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
299
+ useEffect(() => {
300
+ var _props$chatSDK, _props$chatSDK$omnich, _props$chatSDK2, _props$chatSDK2$omnic;
301
+
302
+ const widgetStateEventName = getWidgetCacheId(props === null || props === void 0 ? void 0 : (_props$chatSDK = props.chatSDK) === null || _props$chatSDK === void 0 ? void 0 : (_props$chatSDK$omnich = _props$chatSDK.omnichannelConfig) === null || _props$chatSDK$omnich === void 0 ? void 0 : _props$chatSDK$omnich.orgId, props === null || props === void 0 ? void 0 : (_props$chatSDK2 = props.chatSDK) === null || _props$chatSDK2 === void 0 ? void 0 : (_props$chatSDK2$omnic = _props$chatSDK2.omnichannelConfig) === null || _props$chatSDK2$omnic === void 0 ? void 0 : _props$chatSDK2$omnic.widgetId);
303
+ const chatWidgetStateChangeEvent = {
304
+ eventName: widgetStateEventName,
305
+ payload: { ...state
306
+ }
307
+ };
308
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
309
+ }, [state]);
223
310
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
224
311
  styleOptions: webChatStyles,
225
312
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -241,14 +328,14 @@ export const LiveChatWidgetStateful = props => {
241
328
  })), !((_props$controlProps8 = props.controlProps) !== null && _props$controlProps8 !== void 0 && _props$controlProps8.hideLoadingPane) && shouldShowLoadingPane(state) && (decodeComponentString((_props$componentOverr4 = props.componentOverrides) === null || _props$componentOverr4 === void 0 ? void 0 : _props$componentOverr4.loadingPane) || /*#__PURE__*/React.createElement(LoadingPaneStateful, props.loadingPaneProps)), !((_props$controlProps9 = props.controlProps) !== null && _props$controlProps9 !== void 0 && _props$controlProps9.hideOutOfOfficeHoursPane) && shouldShowOutOfOfficeHoursPane(state) && (decodeComponentString((_props$componentOverr5 = props.componentOverrides) === null || _props$componentOverr5 === void 0 ? void 0 : _props$componentOverr5.outOfOfficeHoursPane) || /*#__PURE__*/React.createElement(OutOfOfficeHoursPaneStateful, props.outOfOfficeHoursPaneProps)), !((_props$controlProps10 = props.controlProps) !== null && _props$controlProps10 !== void 0 && _props$controlProps10.hideReconnectChatPane) && shouldShowReconnectChatPane(state) && (decodeComponentString((_props$componentOverr6 = props.componentOverrides) === null || _props$componentOverr6 === void 0 ? void 0 : _props$componentOverr6.reconnectChatPane) || /*#__PURE__*/React.createElement(ReconnectChatPaneStateful, {
242
329
  reconnectChatProps: props.reconnectChatPaneProps,
243
330
  initStartChat: initStartChatRelay
244
- })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
331
+ })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.preChatSurveyPane) || /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
245
332
  surveyProps: props.preChatSurveyPaneProps,
246
333
  initStartChat: initStartChatRelay
247
- }), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
334
+ })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
248
335
  voiceVideoCallingSdk: voiceVideoCallingSDK
249
- }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && shouldShowWebChatContainer(state) && (decodeComponentString((_props$componentOverr7 = props.componentOverrides) === null || _props$componentOverr7 === void 0 ? void 0 : _props$componentOverr7.webChatContainer) || /*#__PURE__*/React.createElement(WebChatContainerStateful, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
336
+ }, props.callingContainerProps)), !((_props$controlProps13 = props.controlProps) !== null && _props$controlProps13 !== void 0 && _props$controlProps13.hideWebChatContainer) && shouldShowWebChatContainer(state) && (decodeComponentString((_props$componentOverr8 = props.componentOverrides) === null || _props$componentOverr8 === void 0 ? void 0 : _props$componentOverr8.webChatContainer) || /*#__PURE__*/React.createElement(WebChatContainerStateful, props.webChatContainerProps)), !((_props$controlProps14 = props.controlProps) !== null && _props$controlProps14 !== void 0 && _props$controlProps14.hideConfirmationPane) && shouldShowConfirmationPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.confirmationPane) || /*#__PURE__*/React.createElement(ConfirmationPaneStateful, _extends({}, confirmationPaneProps, {
250
337
  setPostChatContext: setPostChatContextRelay,
251
- endChat: endChatRelay
252
- }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && shouldShowPostChatLoadingPane(state) && (decodeComponentString((_props$componentOverr9 = props.componentOverrides) === null || _props$componentOverr9 === void 0 ? void 0 : _props$componentOverr9.postChatLoadingPane) || /*#__PURE__*/React.createElement(PostChatLoadingPaneStateful, props.postChatLoadingPaneProps)), shouldShowPostChatSurveyPane(state) && (decodeComponentString((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatSurveyPane) || /*#__PURE__*/React.createElement(PostChatSurveyPaneStateful, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), createFooter(props, state), shouldShowEmailTranscriptPane(state) && (decodeComponentString((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.emailTranscriptPane) || /*#__PURE__*/React.createElement(EmailTranscriptPaneStateful, props.emailTranscriptPane))));
338
+ prepareEndChat: prepareEndChatRelay
339
+ }))), !((_props$controlProps15 = props.controlProps) !== null && _props$controlProps15 !== void 0 && _props$controlProps15.hidePostChatLoadingPane) && shouldShowPostChatLoadingPane(state) && (decodeComponentString((_props$componentOverr10 = props.componentOverrides) === null || _props$componentOverr10 === void 0 ? void 0 : _props$componentOverr10.postChatLoadingPane) || /*#__PURE__*/React.createElement(PostChatLoadingPaneStateful, props.postChatLoadingPaneProps)), shouldShowPostChatSurveyPane(state) && (decodeComponentString((_props$componentOverr11 = props.componentOverrides) === null || _props$componentOverr11 === void 0 ? void 0 : _props$componentOverr11.postChatSurveyPane) || /*#__PURE__*/React.createElement(PostChatSurveyPaneStateful, _extends({}, props.postChatSurveyPaneProps, props.chatSDK))), createFooter(props, state), shouldShowEmailTranscriptPane(state) && (decodeComponentString((_props$componentOverr12 = props.componentOverrides) === null || _props$componentOverr12 === void 0 ? void 0 : _props$componentOverr12.emailTranscriptPane) || /*#__PURE__*/React.createElement(EmailTranscriptPaneStateful, props.emailTranscriptPane))));
253
340
  };
254
341
  export default LiveChatWidgetStateful;
@@ -26,7 +26,7 @@ export const LoadingPaneStateful = props => {
26
26
  firstElement[0].focus();
27
27
  }
28
28
 
29
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
29
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
30
30
  Event: TelemetryEvent.LoadingPaneLoaded,
31
31
  Description: "Loading pane loaded."
32
32
  });
@@ -1,5 +1,7 @@
1
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
2
  import React, { useEffect } from "react";
2
3
  import { OutOfOfficeHoursPane } from "@microsoft/omnichannel-chat-components";
4
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
3
5
  import { defaultGeneralStyleProps } from "./common/defaultStyleProps/defaultgeneralOOOHPaneStyleProps";
4
6
  import { findAllFocusableElement } from "../../common/utils";
5
7
  import useChatContextStore from "../../hooks/useChatContextStore";
@@ -23,6 +25,10 @@ export const OutOfOfficeHoursPaneStateful = props => {
23
25
  if (firstElement && firstElement[0]) {
24
26
  firstElement[0].focus();
25
27
  }
28
+
29
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
30
+ Event: TelemetryEvent.OutOfOfficePaneLoaded
31
+ });
26
32
  }, []);
27
33
  return /*#__PURE__*/React.createElement(OutOfOfficeHoursPane, {
28
34
  componentOverrides: props.componentOverrides,