@microsoft/omnichannel-chat-widget 0.1.0-main.7a3ed6a → 0.1.0-main.7b290a7

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 (161) 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 +16 -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/headerstateful/HeaderStateful.js +11 -8
  21. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +3 -4
  22. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +42 -46
  23. package/lib/cjs/components/livechatwidget/common/disposeTelemetryLoggers.js +14 -0
  24. package/lib/cjs/components/livechatwidget/common/endChat.js +103 -50
  25. package/lib/cjs/components/livechatwidget/common/initCallingSdk.js +5 -0
  26. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +33 -9
  27. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +105 -20
  28. package/lib/cjs/components/livechatwidget/common/registerTelemetryLoggers.js +11 -7
  29. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +26 -24
  30. package/lib/cjs/components/livechatwidget/common/startChat.js +113 -54
  31. package/lib/cjs/components/livechatwidget/common/startProactiveChat.js +3 -3
  32. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +120 -33
  33. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  34. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +8 -0
  35. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +8 -0
  36. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +28 -11
  37. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +10 -4
  38. package/lib/cjs/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  39. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  40. package/lib/cjs/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +51 -73
  41. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +9 -46
  42. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +3 -1
  43. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  44. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +45 -0
  45. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  46. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +11 -7
  47. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +12 -4
  48. package/lib/cjs/contexts/createReducer.js +35 -10
  49. package/lib/cjs/controller/componentController.js +2 -2
  50. package/lib/cjs/plugins/newMessageEventHandler.js +99 -0
  51. package/lib/esm/assets/Audios.js +1 -0
  52. package/lib/esm/assets/Icons.js +11 -0
  53. package/lib/esm/common/Constants.js +34 -3
  54. package/lib/esm/common/contextDataStore/DataStoreManager.js +5 -0
  55. package/lib/esm/common/interfaces/IContextDataStore.js +1 -0
  56. package/lib/esm/common/telemetry/TelemetryConstants.js +38 -2
  57. package/lib/esm/common/telemetry/TelemetryHelper.js +22 -5
  58. package/lib/esm/common/telemetry/TelemetryManager.js +22 -9
  59. package/lib/esm/common/telemetry/defaultConfigs/defaultAriaConfig.js +3 -3
  60. package/lib/esm/common/telemetry/defaultConfigs/defaultTelemetryConfiguration.js +4 -1
  61. package/lib/esm/common/telemetry/loggers/ariaTelemetryLogger.js +50 -15
  62. package/lib/esm/common/telemetry/loggers/consoleLogger.js +9 -5
  63. package/lib/esm/common/utils.js +12 -1
  64. package/lib/esm/components/callingcontainerstateful/CallingContainerStateful.js +14 -0
  65. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +10 -2
  66. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +8 -50
  67. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +2 -2
  68. package/lib/esm/components/footerstateful/FooterStateful.js +4 -5
  69. package/lib/esm/components/headerstateful/HeaderStateful.js +12 -9
  70. package/lib/esm/components/livechatwidget/common/createMarkdown.js +3 -3
  71. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +40 -47
  72. package/lib/esm/components/livechatwidget/common/disposeTelemetryLoggers.js +4 -0
  73. package/lib/esm/components/livechatwidget/common/endChat.js +101 -47
  74. package/lib/esm/components/livechatwidget/common/initCallingSdk.js +3 -0
  75. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +29 -9
  76. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +94 -20
  77. package/lib/esm/components/livechatwidget/common/registerTelemetryLoggers.js +10 -3
  78. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +23 -22
  79. package/lib/esm/components/livechatwidget/common/startChat.js +108 -51
  80. package/lib/esm/components/livechatwidget/common/startProactiveChat.js +5 -5
  81. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +111 -34
  82. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +1 -1
  83. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +6 -0
  84. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +6 -0
  85. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +26 -10
  86. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +9 -5
  87. package/lib/esm/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.js +1 -0
  88. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +4 -0
  89. package/lib/esm/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.js +2 -12
  90. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +7 -44
  91. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +2 -1
  92. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +6 -6
  93. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.js +32 -0
  94. package/lib/esm/contexts/common/ConversationState.js +3 -2
  95. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +11 -7
  96. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +12 -4
  97. package/lib/esm/contexts/createReducer.js +35 -9
  98. package/lib/esm/controller/componentController.js +2 -2
  99. package/lib/esm/plugins/newMessageEventHandler.js +82 -0
  100. package/lib/types/assets/Audios.d.ts +1 -0
  101. package/lib/types/assets/Icons.d.ts +11 -0
  102. package/lib/types/common/Constants.d.ts +19 -1
  103. package/lib/types/common/contextDataStore/DataStoreManager.d.ts +4 -0
  104. package/lib/types/common/interfaces/IContextDataStore.d.ts +14 -0
  105. package/lib/types/common/telemetry/TelemetryConstants.d.ts +27 -1
  106. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -0
  107. package/lib/types/common/telemetry/TelemetryManager.d.ts +1 -0
  108. package/lib/types/common/telemetry/definitions/Contracts.d.ts +3 -0
  109. package/lib/types/common/telemetry/definitions/Payload.d.ts +15 -9
  110. package/lib/types/common/telemetry/interfaces/IChatSDKLogger.d.ts +1 -0
  111. package/lib/types/common/telemetry/interfaces/IInternalTelemetryData.d.ts +2 -0
  112. package/lib/types/common/telemetry/interfaces/ITelemetryConfig.d.ts +12 -0
  113. package/lib/types/common/utils.d.ts +1 -0
  114. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulParams.d.ts +5 -2
  115. package/lib/types/components/footerstateful/audionotificationstateful/interfaces/IAudioNotificationStatefulParams.d.ts +0 -1
  116. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +4 -1
  117. package/lib/types/components/livechatwidget/common/disposeTelemetryLoggers.d.ts +1 -0
  118. package/lib/types/components/livechatwidget/common/endChat.d.ts +4 -1
  119. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +5 -2
  120. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
  121. package/lib/types/components/livechatwidget/common/startChat.d.ts +1 -1
  122. package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +2 -1
  123. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetComponentOverrides.d.ts +1 -0
  124. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +3 -1
  125. package/lib/types/components/prechatsurveypanestateful/interfaces/IPreChatSurveyPaneStatefulParams.d.ts +1 -1
  126. package/lib/types/components/proactivechatpanestateful/interfaces/IProactiveChatNotificationConfig.d.ts +3 -0
  127. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +1 -0
  128. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  129. package/lib/types/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.d.ts +1 -1
  130. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +0 -1
  131. package/lib/types/components/webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger.d.ts +1 -0
  132. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  133. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +4 -0
  134. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +12 -8
  135. package/lib/types/plugins/newMessageEventHandler.d.ts +2 -0
  136. package/package.json +11 -11
  137. package/lib/cjs/assets/audios/newMessageNotification.mp3 +0 -0
  138. package/lib/cjs/assets/icons/archiveIcon.svg +0 -3
  139. package/lib/cjs/assets/icons/audioIcon.svg +0 -6
  140. package/lib/cjs/assets/icons/blankIcon.svg +0 -6
  141. package/lib/cjs/assets/icons/excelIcon.svg +0 -6
  142. package/lib/cjs/assets/icons/imageIcon.svg +0 -6
  143. package/lib/cjs/assets/icons/oneNoteIcon.svg +0 -6
  144. package/lib/cjs/assets/icons/pdfIcon.svg +0 -6
  145. package/lib/cjs/assets/icons/powerpointIcon.svg +0 -6
  146. package/lib/cjs/assets/icons/videoIcon.svg +0 -6
  147. package/lib/cjs/assets/icons/visioIcon.svg +0 -6
  148. package/lib/cjs/assets/icons/wordIcon.svg +0 -6
  149. package/lib/esm/assets/assets.d.js +0 -0
  150. package/lib/esm/assets/audios/newMessageNotification.mp3 +0 -0
  151. package/lib/esm/assets/icons/archiveIcon.svg +0 -3
  152. package/lib/esm/assets/icons/audioIcon.svg +0 -6
  153. package/lib/esm/assets/icons/blankIcon.svg +0 -6
  154. package/lib/esm/assets/icons/excelIcon.svg +0 -6
  155. package/lib/esm/assets/icons/imageIcon.svg +0 -6
  156. package/lib/esm/assets/icons/oneNoteIcon.svg +0 -6
  157. package/lib/esm/assets/icons/pdfIcon.svg +0 -6
  158. package/lib/esm/assets/icons/powerpointIcon.svg +0 -6
  159. package/lib/esm/assets/icons/videoIcon.svg +0 -6
  160. package/lib/esm/assets/icons/visioIcon.svg +0 -6
  161. package/lib/esm/assets/icons/wordIcon.svg +0 -6
@@ -1,65 +1,80 @@
1
+ import { ChatSDKError, Constants } from "../../../common/Constants";
1
2
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
2
- import { ChatSDKError } from "../../../common/Constants";
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";
11
+ import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
10
12
  import { createTimer } from "../../../common/utils";
11
- import { getReconnectIdForAuthenticatedChat } from "./reconnectChatHelper";
12
- import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
13
- import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ import { getReconnectIdForAuthenticatedChat, handleRedirectUnauthenticatedReconnectChat } from "./reconnectChatHelper";
14
+ import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
15
+ import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
16
 
15
17
  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
18
+ var _props$reconnectChatP;
20
19
 
21
- const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
20
+ if (await canConnectToExistingChat(props, chatSDK, state, dispatch, setAdapter)) {
21
+ return;
22
+ } // Redirecting if unauthenticated reconnect chat expired
22
23
 
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
- });
24
+
25
+ if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
26
+ var _props$reconnectChatP2, _props$reconnectChatP3;
27
+
28
+ 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
29
  } else {
42
- dispatch({
43
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
44
- payload: ConversationState.Loading
45
- });
46
- await initStartChat(chatSDK, dispatch, setAdapter);
30
+ // Getting PreChat Survey Context
31
+ const parseToJson = false;
32
+ const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
33
+ const showPrechat = state.appStates.conversationState === ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
34
+
35
+ const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
36
+
37
+ if (reconnectId) {
38
+ dispatch({
39
+ type: LiveChatWidgetActionType.SET_RECONNECT_ID,
40
+ payload: reconnectId
41
+ });
42
+ dispatch({
43
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
44
+ payload: ConversationState.ReconnectChat
45
+ });
46
+ } else if (showPrechat) {
47
+ dispatch({
48
+ type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
49
+ payload: preChatSurveyResponse
50
+ });
51
+ dispatch({
52
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
53
+ payload: ConversationState.Prechat
54
+ });
55
+ } else {
56
+ dispatch({
57
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
58
+ payload: ConversationState.Loading
59
+ });
60
+ await initStartChat(chatSDK, dispatch, setAdapter);
61
+ }
47
62
  }
48
63
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
64
 
50
65
 
51
- const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
66
+ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedState) => {
52
67
  try {
53
- var _TelemetryTimers$Widg;
68
+ var _newAdapter$activity$, _TelemetryTimers$Widg;
54
69
 
55
70
  try {
56
- TelemetryHelper.logConfigDataEvent(LogLevel.INFO, {
71
+ TelemetryTimers.WidgetLoadTimer = createTimer();
72
+ TelemetryHelper.logSDKEvent(LogLevel.INFO, {
57
73
  Event: TelemetryEvent.StartChatSDKCall
58
74
  });
59
75
  await chatSDK.startChat(params);
60
- TelemetryTimers.WidgetLoadTimer = createTimer();
61
76
  } catch (error) {
62
- TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
77
+ TelemetryHelper.logSDKEvent(LogLevel.ERROR, {
63
78
  Event: TelemetryEvent.StartChatMethodException,
64
79
  ExceptionDetails: {
65
80
  exception: `Failed to setup startChat: ${error}`
@@ -68,24 +83,42 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
68
83
  }
69
84
 
70
85
  const newAdapter = await createAdapter(chatSDK);
71
- setAdapter(newAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ setAdapter(newAdapter);
87
+ const chatToken = await chatSDK.getChatToken();
88
+ 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
89
 
73
- if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
90
+ if (!persistedState) {
74
91
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
92
+ if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
95
+ dispatch({
96
+ type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
97
+ payload: chatToken
98
+ });
99
+ } // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+
101
+
102
+ const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
76
103
  dispatch({
77
- type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
78
- payload: chatToken
104
+ type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
105
+ payload: liveChatContext
79
106
  });
80
- }
107
+ await setPostChatContextAndLoadSurvey(chatSDK, dispatch);
108
+ await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
81
109
 
82
- await setPostChatContextAndLoadSurvey(chatSDK, dispatch, false);
83
- await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
110
+ dispatch({
111
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
112
+ payload: ConversationState.Active
113
+ });
114
+ } else {
115
+ dispatch({
116
+ type: LiveChatWidgetActionType.SET_WIDGET_STATE,
117
+ payload: persistedState
118
+ });
119
+ await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
120
+ }
84
121
 
85
- dispatch({
86
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
87
- payload: ConversationState.Active
88
- });
89
122
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
90
123
  Event: TelemetryEvent.WidgetLoadComplete,
91
124
  Description: "Widget load complete",
@@ -93,9 +126,9 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
93
126
  });
94
127
  } catch (ex) {
95
128
  TelemetryHelper.logLoadingEvent(LogLevel.ERROR, {
96
- Event: TelemetryEvent.StartChatFailed,
129
+ Event: TelemetryEvent.WidgetLoadFailed,
97
130
  ExceptionDetails: {
98
- Exception: `Start Chat Failed: ${ex}`
131
+ Exception: `Widget load Failed: ${ex}`
99
132
  }
100
133
  });
101
134
  NotificationHandler.notifyError(NotificationScenarios.Connection, "Start Chat Failed: " + ex); // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -111,6 +144,30 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params) => {
111
144
  });
112
145
  }
113
146
  }
147
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+
149
+
150
+ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
151
+ var _DataStoreManager$cli, _persistedState$domai;
152
+
153
+ const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(Constants.widgetStateDataKey, "localStorage");
154
+ const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
155
+
156
+ if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai = persistedState.domainStates) !== null && _persistedState$domai !== void 0 && _persistedState$domai.liveChatContext) {
157
+ var _persistedState$domai2;
158
+
159
+ dispatch({
160
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
161
+ payload: ConversationState.Loading
162
+ });
163
+ const optionalParams = {
164
+ liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai2 = persistedState.domainStates) === null || _persistedState$domai2 === void 0 ? void 0 : _persistedState$domai2.liveChatContext
165
+ };
166
+ await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
167
+ return true;
168
+ } else {
169
+ return false;
170
+ }
114
171
  };
115
172
 
116
173
  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
7
  import { createTimer, getLocaleDirection } from "../../../common/utils";
7
- import { getReconnectIdForAuthenticatedChat, handleUnauthenticatedReconnectChat } from "../common/reconnectChatHelper";
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,87 @@ export const LiveChatWidgetStateful = props => {
137
150
  }
138
151
  }, [state.appStates.skipChatButtonRendering]);
139
152
  useEffect(() => {
153
+ // Add the custom context on receiving the SetCustomContext event
154
+ BroadcastService.getMessageByEventName(BroadcastEvent.SetCustomContext).subscribe(msg => {
155
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
156
+ Event: TelemetryEvent.CustomContextReceived,
157
+ Description: "CustomContext received."
158
+ });
159
+ dispatch({
160
+ type: LiveChatWidgetActionType.SET_CUSTOM_CONTEXT,
161
+ payload: msg === null || msg === void 0 ? void 0 : msg.payload
162
+ });
163
+ });
140
164
  BroadcastService.getMessageByEventName("StartProactiveChat").subscribe(msg => {
165
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
166
+ Event: TelemetryEvent.StartProactiveChatEventReceived,
167
+ Description: "Start proactive chat event received."
168
+ });
169
+
141
170
  if (canStartProactiveChat.current) {
142
171
  var _msg$payload, _msg$payload2, _msg$payload3;
143
172
 
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);
173
+ 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);
174
+ } else {
175
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
176
+ Event: TelemetryEvent.ChatAlreadyTriggered,
177
+ Description: "Start proactive chat method called, when chat was already triggered."
178
+ });
179
+ }
180
+ }); // start chat from SDK Event
181
+
182
+ BroadcastService.getMessageByEventName("StartChat").subscribe(() => {
183
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
184
+ Event: TelemetryEvent.StartChatEventRecevied,
185
+ Description: "Start chat event received."
186
+ });
187
+
188
+ if (state.appStates.isMinimized) {
189
+ dispatch({
190
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
191
+ payload: false
192
+ });
193
+ } else {
194
+ prepareStartChat(props, chatSDK, state, dispatch, setAdapter);
195
+ }
196
+ }); // end chat from SDK Event
197
+
198
+ BroadcastService.getMessageByEventName("EndChat").subscribe(async () => {
199
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
200
+ Event: TelemetryEvent.EndChatEventReceived,
201
+ Description: "End chat event received."
202
+ });
203
+
204
+ if (canEndChat.current) {
205
+ prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
206
+ } else {
207
+ const skipEndChatSDK = true;
208
+ const skipCloseChat = false;
209
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat);
145
210
  }
146
211
  });
212
+ window.addEventListener("beforeunload", () => {
213
+ disposeTelemetryLoggers();
214
+ });
215
+
216
+ if (state.appStates.conversationEndedByAgent) {
217
+ endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
218
+ }
147
219
  }, []);
148
220
  useEffect(() => {
149
- if (state.appStates.conversationState !== ConversationState.Closed) {
150
- canStartProactiveChat.current = false;
151
- }
221
+ canStartProactiveChat.current = state.appStates.conversationState === ConversationState.Closed;
222
+ canEndChat.current = state.appStates.conversationState === ConversationState.Active;
152
223
 
153
224
  if (state.appStates.conversationState === ConversationState.Active) {
154
225
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
155
226
  BroadcastService.postMessage({
156
- eventName: "NewMessageNotification"
227
+ eventName: BroadcastEvent.NewMessageNotification
157
228
  });
158
229
  });
159
230
  } // Track the message count
160
231
 
161
232
 
162
- if (state.appStates.conversationState == ConversationState.Active) {
233
+ if (state.appStates.conversationState === ConversationState.Active) {
163
234
  chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.onNewMessage(() => {
164
235
  currentMessageCountRef.current++;
165
236
  dispatch({
@@ -178,7 +249,7 @@ export const LiveChatWidgetStateful = props => {
178
249
  });
179
250
  const customEvent = {
180
251
  elementType: ElementType.Custom,
181
- eventName: "UnreadMessageCount",
252
+ eventName: BroadcastEvent.UnreadMessageCount,
182
253
  payload: 0
183
254
  };
184
255
  BroadcastService.postMessage(customEvent);
@@ -188,7 +259,7 @@ export const LiveChatWidgetStateful = props => {
188
259
  if (state.appStates.isMinimized && state.appStates.unreadMessageCount > 0) {
189
260
  const customEvent = {
190
261
  elementType: ElementType.Custom,
191
- eventName: "UnreadMessageCount",
262
+ eventName: BroadcastEvent.UnreadMessageCount,
192
263
  payload: `${state.appStates.unreadMessageCount}`
193
264
  };
194
265
  BroadcastService.postMessage(customEvent);
@@ -203,23 +274,29 @@ export const LiveChatWidgetStateful = props => {
203
274
  }, [(_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.webChatStyles]);
204
275
  const webChatProps = initWebChatComposer(props, chatSDK, state, dispatch, setWebChatStyles);
205
276
 
206
- const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
277
+ const setPostChatContextRelay = () => setPostChatContextAndLoadSurvey(chatSDK, dispatch); // eslint-disable-next-line @typescript-eslint/no-explicit-any
207
278
 
208
- const endChatRelay = () => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter);
279
+
280
+ const endChatRelay = (adapter, skipEndChatSDK, skipCloseChat) => endChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, skipEndChatSDK, skipCloseChat); // eslint-disable-next-line @typescript-eslint/no-explicit-any
281
+
282
+
283
+ const prepareEndChatRelay = (adapter, state) => prepareEndChat(props, chatSDK, setAdapter, setWebChatStyles, dispatch, adapter, state);
209
284
 
210
285
  const prepareStartChatRelay = () => prepareStartChat(props, chatSDK, state, dispatch, setAdapter); // eslint-disable-next-line @typescript-eslint/no-explicit-any
211
286
 
212
287
 
213
- const initStartChatRelay = optionalParams => initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
288
+ const initStartChatRelay = (optionalParams, persistedState) => initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
214
289
 
215
290
  const confirmationPaneProps = initConfirmationPropsComposer(props); // publish chat widget state
216
291
 
217
- const chatWidgetStateChangeEvent = {
218
- eventName: "ChatWidgetStateChanged",
219
- payload: { ...state
220
- }
221
- };
222
- BroadcastService.postMessage(chatWidgetStateChangeEvent);
292
+ useEffect(() => {
293
+ const chatWidgetStateChangeEvent = {
294
+ eventName: BroadcastEvent.ChatWidgetStateChanged,
295
+ payload: { ...state
296
+ }
297
+ };
298
+ BroadcastService.postMessage(chatWidgetStateChangeEvent);
299
+ }, [state]);
223
300
  return /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
224
301
  styleOptions: webChatStyles,
225
302
  directLine: ((_props$webChatContain4 = props.webChatContainerProps) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
@@ -241,14 +318,14 @@ export const LiveChatWidgetStateful = props => {
241
318
  })), !((_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
319
  reconnectChatProps: props.reconnectChatPaneProps,
243
320
  initStartChat: initStartChatRelay
244
- })), !((_props$controlProps11 = props.controlProps) !== null && _props$controlProps11 !== void 0 && _props$controlProps11.hidePreChatSurveyPane) && shouldShowPreChatSurveyPane(state) && /*#__PURE__*/React.createElement(PreChatSurveyPaneStateful, {
321
+ })), !((_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
322
  surveyProps: props.preChatSurveyPaneProps,
246
323
  initStartChat: initStartChatRelay
247
- }), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
324
+ })), !((_props$controlProps12 = props.controlProps) !== null && _props$controlProps12 !== void 0 && _props$controlProps12.hideCallingContainer) && shouldShowCallingContainer(state) && /*#__PURE__*/React.createElement(CallingContainerStateful, _extends({
248
325
  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, {
326
+ }, 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
327
  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))));
328
+ prepareEndChat: prepareEndChatRelay
329
+ }))), !((_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
330
  };
254
331
  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,
@@ -3,6 +3,8 @@ import { LoadingPane } from "@microsoft/omnichannel-chat-components";
3
3
  import { defaultGeneralPostChatLoadingPaneStyleProps } from "./common/defaultgeneralPostChatLoadingPaneStyleProps";
4
4
  import { findAllFocusableElement } from "../../common/utils";
5
5
  import useChatContextStore from "../../hooks/useChatContextStore";
6
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
7
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
6
8
  export const PostChatLoadingPaneStateful = props => {
7
9
  var _props$styleProps;
8
10
 
@@ -28,6 +30,10 @@ export const PostChatLoadingPaneStateful = props => {
28
30
  if (firstElement && firstElement[0]) {
29
31
  firstElement[0].focus();
30
32
  }
33
+
34
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
35
+ Event: TelemetryEvent.PostChatSurveyLoadingPaneLoaded
36
+ });
31
37
  }, []);
32
38
  return /*#__PURE__*/React.createElement(LoadingPane, {
33
39
  componentOverrides: props.componentOverrides,