@microsoft/omnichannel-chat-widget 0.1.0-main.c2417f9 → 0.1.0-main.ce08f21

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 (81) hide show
  1. package/lib/cjs/common/Constants.js +4 -0
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +7 -0
  3. package/lib/cjs/common/utils.js +58 -5
  4. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +4 -0
  5. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  6. package/lib/cjs/components/headerstateful/HeaderStateful.js +4 -3
  7. package/lib/cjs/components/livechatwidget/common/ActivityStreamHandler.js +44 -0
  8. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +23 -0
  9. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  10. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +39 -0
  11. package/lib/cjs/components/livechatwidget/common/ChatAdapterShim.js +70 -0
  12. package/lib/cjs/components/livechatwidget/common/Deferred.js +42 -0
  13. package/lib/cjs/components/livechatwidget/common/createAdapter.js +13 -1
  14. package/lib/cjs/components/livechatwidget/common/createMarkdown.js +31 -30
  15. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +2 -2
  16. package/lib/cjs/components/livechatwidget/common/endChat.js +52 -20
  17. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +8 -0
  18. package/lib/cjs/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  19. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  20. package/lib/cjs/components/livechatwidget/common/shareObservable.js +45 -0
  21. package/lib/cjs/components/livechatwidget/common/startChat.js +152 -81
  22. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +167 -112
  23. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +4 -8
  24. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +1 -1
  25. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  26. package/lib/cjs/contexts/common/ConversationState.js +3 -2
  27. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +1 -0
  28. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -2
  29. package/lib/cjs/contexts/createReducer.js +8 -0
  30. package/lib/cjs/controller/componentController.js +3 -3
  31. package/lib/esm/common/Constants.js +4 -0
  32. package/lib/esm/common/telemetry/TelemetryConstants.js +7 -0
  33. package/lib/esm/common/utils.js +45 -3
  34. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +4 -0
  35. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +0 -1
  36. package/lib/esm/components/headerstateful/HeaderStateful.js +4 -3
  37. package/lib/esm/components/livechatwidget/common/ActivityStreamHandler.js +34 -0
  38. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.js +14 -0
  39. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.js +1 -0
  40. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.js +29 -0
  41. package/lib/esm/components/livechatwidget/common/ChatAdapterShim.js +59 -0
  42. package/lib/esm/components/livechatwidget/common/Deferred.js +33 -0
  43. package/lib/esm/components/livechatwidget/common/createAdapter.js +12 -2
  44. package/lib/esm/components/livechatwidget/common/createMarkdown.js +31 -30
  45. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +2 -2
  46. package/lib/esm/components/livechatwidget/common/endChat.js +53 -21
  47. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +9 -2
  48. package/lib/esm/components/livechatwidget/common/reconnectChatHelper.js +23 -15
  49. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +0 -4
  50. package/lib/esm/components/livechatwidget/common/shareObservable.js +38 -0
  51. package/lib/esm/components/livechatwidget/common/startChat.js +147 -80
  52. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +164 -112
  53. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +5 -8
  54. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +1 -1
  55. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +2 -0
  56. package/lib/esm/contexts/common/ConversationState.js +3 -2
  57. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +1 -0
  58. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -2
  59. package/lib/esm/contexts/createReducer.js +8 -0
  60. package/lib/esm/controller/componentController.js +3 -3
  61. package/lib/types/common/Constants.d.ts +2 -0
  62. package/lib/types/common/telemetry/TelemetryConstants.d.ts +7 -1
  63. package/lib/types/common/utils.d.ts +6 -3
  64. package/lib/types/components/headerstateful/interfaces/IHeaderStatefulParams.d.ts +2 -1
  65. package/lib/types/components/livechatwidget/common/ActivityStreamHandler.d.ts +14 -0
  66. package/lib/types/components/livechatwidget/common/ActivitySubscriber/DefaultActivitySubscriber.d.ts +5 -0
  67. package/lib/types/components/livechatwidget/common/ActivitySubscriber/IActivitySubscriber.d.ts +6 -0
  68. package/lib/types/components/livechatwidget/common/ActivitySubscriber/PauseActivitySubscriber.d.ts +7 -0
  69. package/lib/types/components/livechatwidget/common/ChatAdapterShim.d.ts +7 -0
  70. package/lib/types/components/livechatwidget/common/Deferred.d.ts +9 -0
  71. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +4 -3
  72. package/lib/types/components/livechatwidget/common/shareObservable.d.ts +1 -0
  73. package/lib/types/components/livechatwidget/common/startChat.d.ts +4 -2
  74. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetControlProps.d.ts +1 -0
  75. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +1 -0
  76. package/lib/types/components/reconnectchatpanestateful/interfaces/IReconnectChatPaneStatefulProps.d.ts +0 -1
  77. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +1 -0
  78. package/lib/types/contexts/common/ConversationState.d.ts +3 -2
  79. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -1
  80. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
  81. package/package.json +4 -3
@@ -67,6 +67,8 @@ var _cardActionMiddleware = require("../../webchatcontainerstateful/webchatcontr
67
67
 
68
68
  var _messageTimestampMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware"));
69
69
 
70
+ var _Constants = require("../../../common/Constants");
71
+
70
72
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
71
73
 
72
74
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -105,6 +107,12 @@ const initWebChatComposer = (props, chatSDK, state, dispatch, setWebChatStyles)
105
107
 
106
108
  if (isPostChatEnabled === "true") {
107
109
  if (postChatSurveyMode === _PostChatSurveyMode.PostChatSurveyMode.Embed) {
110
+ _WebChatStoreLoader.WebChatStoreLoader.store = null;
111
+ dispatch({
112
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
113
+ payload: _ConversationState.ConversationState.PostchatLoading
114
+ });
115
+ await (0, _utils.addDelayInMs)(_Constants.Constants.PostChatLoadingDurationInMs);
108
116
  const loadPostChatEvent = {
109
117
  eventName: _TelemetryConstants.BroadcastEvent.LoadPostChatSurvey
110
118
  };
@@ -44,9 +44,17 @@ const getChatReconnectContext = async (chatSDK, reconnectId) => {
44
44
  exports.getChatReconnectContext = getChatReconnectContext;
45
45
 
46
46
  const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
47
- var _props$reconnectChatP, _props$reconnectChatP2;
47
+ var _props$chatConfig, _props$reconnectChatP;
48
48
 
49
- if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.isReconnectEnabled && (_props$reconnectChatP2 = props.reconnectChatPaneProps) !== null && _props$reconnectChatP2 !== void 0 && _props$reconnectChatP2.authClientFunction // TODO: Implement this after storage is in place
49
+ let authClientFunction = undefined;
50
+
51
+ if ((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) {
52
+ var _props$chatConfig2, _props$chatConfig2$Li;
53
+
54
+ authClientFunction = ((_props$chatConfig2 = props.chatConfig) === null || _props$chatConfig2 === void 0 ? void 0 : (_props$chatConfig2$Li = _props$chatConfig2.LiveChatConfigAuthSettings) === null || _props$chatConfig2$Li === void 0 ? void 0 : _props$chatConfig2$Li.msdyn_javascriptclientfunction) ?? undefined;
55
+ }
56
+
57
+ if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.isReconnectEnabled && authClientFunction // TODO: Implement this after storage is in place
50
58
 
51
59
  /* && !isLoadWithState() */
52
60
  ) {
@@ -63,31 +71,31 @@ const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
63
71
 
64
72
  exports.getReconnectIdForAuthenticatedChat = getReconnectIdForAuthenticatedChat;
65
73
 
66
- const handleUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat, redirectInSameWindow) => {
74
+ const handleUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat, redirectInSameWindow) => {
67
75
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
68
76
 
69
77
  if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
70
- await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow);
78
+ await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
71
79
  } else {
72
- await setReconnectIdAndStartChat(chatSDK, dispatch, setAdapter, reconnectId, initStartChat);
80
+ await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
73
81
  }
74
82
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
83
 
76
84
 
77
85
  exports.handleUnauthenticatedReconnectChat = handleUnauthenticatedReconnectChat;
78
86
 
79
- const startUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat) => {
87
+ const startUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
80
88
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
81
89
 
82
90
  if (!shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
83
- await setReconnectIdAndStartChat(chatSDK, dispatch, setAdapter, reconnectId, initStartChat);
91
+ await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
84
92
  }
85
93
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
94
 
87
95
 
88
96
  exports.startUnauthenticatedReconnectChat = startUnauthenticatedReconnectChat;
89
97
 
90
- const setReconnectIdAndStartChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat) => {
98
+ const setReconnectIdAndStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
91
99
  const startUnauthenticatedReconnectChat = {
92
100
  eventName: _TelemetryConstants.BroadcastEvent.StartUnauthenticatedReconnectChat
93
101
  };
@@ -105,7 +113,7 @@ const setReconnectIdAndStartChat = async (chatSDK, dispatch, setAdapter, reconne
105
113
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
106
114
  payload: _ConversationState.ConversationState.Loading
107
115
  });
108
- await initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
116
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, optionalParams);
109
117
  };
110
118
 
111
119
  const redirectPage = (redirectURL, redirectInSameWindow) => {
@@ -128,7 +136,7 @@ const shouldRedirectOrStartNewChat = reconnectAvailabilityResponse => {
128
136
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
129
137
 
130
138
 
131
- const startNewChatEmptyRedirectionUrl = async (chatSDK, dispatch, setAdapter, initStartChat) => {
139
+ const startNewChatEmptyRedirectionUrl = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat) => {
132
140
  const startUnauthenticatedReconnectChat = {
133
141
  eventName: _TelemetryConstants.BroadcastEvent.StartUnauthenticatedReconnectChat
134
142
  };
@@ -153,26 +161,26 @@ const startNewChatEmptyRedirectionUrl = async (chatSDK, dispatch, setAdapter, in
153
161
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
154
162
  payload: _ConversationState.ConversationState.Loading
155
163
  });
156
- await initStartChat(chatSDK, dispatch, setAdapter);
164
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
157
165
  }
158
166
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
167
 
160
168
 
161
- const handleRedirectUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, initStartChat, reconnectId, redirectInSameWindow) => {
169
+ const handleRedirectUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, reconnectId, redirectInSameWindow) => {
162
170
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
163
171
 
164
172
  if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
165
- await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow);
173
+ await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
166
174
  }
167
175
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
176
 
169
177
 
170
178
  exports.handleRedirectUnauthenticatedReconnectChat = handleRedirectUnauthenticatedReconnectChat;
171
179
 
172
- const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow) => {
180
+ const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow) => {
173
181
  if (reconnectAvailabilityResponse.redirectURL) {
174
182
  redirectPage(reconnectAvailabilityResponse.redirectURL, redirectInSameWindow);
175
183
  } else {
176
- await startNewChatEmptyRedirectionUrl(chatSDK, dispatch, setAdapter, initStartChat);
184
+ await startNewChatEmptyRedirectionUrl(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat);
177
185
  }
178
186
  };
@@ -43,10 +43,6 @@ const setPostChatContextAndLoadSurvey = async (chatSDK, dispatch, persistedChat)
43
43
 
44
44
 
45
45
  _omnichannelChatComponents.BroadcastService.getMessageByEventName("LoadPostChatSurvey").subscribe(msg => {
46
- dispatch({
47
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
48
- payload: _ConversationState.ConversationState.Loading
49
- });
50
46
  dispatch({
51
47
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
52
48
  payload: _ConversationState.ConversationState.Postchat
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.shareObservable = shareObservable;
7
+
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ function shareObservable(observable) {
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ let observers = []; // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+
13
+ let subscription; // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+
15
+ return new window.Observable(observer => {
16
+ if (!subscription) {
17
+ subscription = observable.subscribe({
18
+ complete() {
19
+ observers.forEach(observer => observer.complete());
20
+ },
21
+
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ error(err) {
24
+ observers.forEach(observer => observer.error(err));
25
+ },
26
+
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ next(value) {
29
+ observers.forEach(observer => observer.next(value));
30
+ }
31
+
32
+ });
33
+ }
34
+
35
+ observers.push(observer);
36
+ return () => {
37
+ observers = observers.filter(o => o !== observer);
38
+
39
+ if (!observers.length) {
40
+ subscription.unsubscribe();
41
+ subscription = null;
42
+ }
43
+ };
44
+ });
45
+ }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.prepareStartChat = exports.initStartChat = void 0;
6
+ exports.setPreChatAndInitiateChat = exports.prepareStartChat = exports.initStartChat = void 0;
7
7
 
8
8
  var _Constants = require("../../../common/Constants");
9
9
 
@@ -11,8 +11,6 @@ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants"
11
11
 
12
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
13
13
 
14
- var _DataStoreManager = require("../../../common/contextDataStore/DataStoreManager");
15
-
16
14
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
17
15
 
18
16
  var _NotificationHandler = require("../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler");
@@ -37,12 +35,17 @@ var _updateSessionDataForTelemetry = require("./updateSessionDataForTelemetry");
37
35
 
38
36
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
39
37
 
38
+ var _ActivityStreamHandler = require("./ActivityStreamHandler");
39
+
40
40
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
41
  let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
42
 
43
43
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
44
44
  var _props$reconnectChatP;
45
45
 
46
+ optionalParams = {}; //Resetting to ensure no stale values
47
+ // Can connect to existing chat session
48
+
46
49
  if (await canConnectToExistingChat(props, chatSDK, state, dispatch, setAdapter)) {
47
50
  return;
48
51
  } // Redirecting if unauthenticated reconnect chat expired
@@ -51,58 +54,105 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
51
54
  if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
52
55
  var _props$reconnectChatP2, _props$reconnectChatP3;
53
56
 
54
- await (0, _reconnectChatHelper.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);
55
- } else {
56
- // Getting PreChat Survey Context
57
- const parseToJson = false;
58
- const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
59
- const showPrechat = state.appStates.conversationState === _ConversationState.ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
57
+ await (0, _reconnectChatHelper.handleRedirectUnauthenticatedReconnectChat)(chatSDK, props.chatConfig, props.getAuthToken, 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);
58
+ return;
59
+ } // Getting reconnectId for authenticated chat
60
60
 
61
- const reconnectId = await (0, _reconnectChatHelper.getReconnectIdForAuthenticatedChat)(props, chatSDK);
62
61
 
63
- if (reconnectId) {
64
- dispatch({
65
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_RECONNECT_ID,
66
- payload: reconnectId
67
- });
68
- dispatch({
69
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
70
- payload: _ConversationState.ConversationState.ReconnectChat
71
- });
72
- } else if (showPrechat) {
73
- dispatch({
74
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
75
- payload: preChatSurveyResponse
76
- });
77
- dispatch({
78
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
79
- payload: _ConversationState.ConversationState.Prechat
62
+ const reconnectId = await (0, _reconnectChatHelper.getReconnectIdForAuthenticatedChat)(props, chatSDK);
63
+
64
+ if (reconnectId) {
65
+ dispatch({
66
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_RECONNECT_ID,
67
+ payload: reconnectId
68
+ });
69
+ dispatch({
70
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
71
+ payload: _ConversationState.ConversationState.ReconnectChat
72
+ });
73
+ return;
74
+ } // Set custom context params
75
+
76
+
77
+ setCustomContextParams(props, chatSDK); // Setting Proactive chat settings
78
+
79
+ const isProactiveChat = state.appStates.conversationState === _ConversationState.ConversationState.ProactiveChat;
80
+ const isPreChatEnabledInProactiveChat = state.appStates.proactiveChatStates.proactiveChatEnablePrechat; //Setting PreChat and intiate chat
81
+
82
+ setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, isProactiveChat, isPreChatEnabledInProactiveChat);
83
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
84
+
85
+
86
+ exports.prepareStartChat = prepareStartChat;
87
+
88
+ const setPreChatAndInitiateChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState) => {
89
+ // Getting prechat Survey Context
90
+ const parseToJson = false;
91
+ const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
92
+ const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse;
93
+
94
+ if (showPrechat) {
95
+ dispatch({
96
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
97
+ payload: preChatSurveyResponse
98
+ });
99
+ dispatch({
100
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
101
+ payload: _ConversationState.ConversationState.Prechat
102
+ });
103
+ return;
104
+ } //Initiate start chat
105
+
106
+
107
+ dispatch({
108
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
109
+ payload: _ConversationState.ConversationState.Loading
110
+ });
111
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
112
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+
114
+
115
+ exports.setPreChatAndInitiateChat = setPreChatAndInitiateChat;
116
+
117
+ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
118
+ if (getAuthToken) {
119
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
120
+ Event: _TelemetryConstants.TelemetryEvent.GetAuthTokenCalled
121
+ });
122
+
123
+ let authClientFunction = undefined;
124
+
125
+ if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
126
+ var _chatConfig$LiveChatC;
127
+
128
+ authClientFunction = (chatConfig === null || chatConfig === void 0 ? void 0 : (_chatConfig$LiveChatC = chatConfig.LiveChatConfigAuthSettings) === null || _chatConfig$LiveChatC === void 0 ? void 0 : _chatConfig$LiveChatC.msdyn_javascriptclientfunction) ?? undefined;
129
+ }
130
+
131
+ const token = await getAuthToken(authClientFunction);
132
+
133
+ if (!(0, _utils.isNullOrEmptyString)(token)) {
134
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
135
+ chatSDK.setAuthTokenProvider(async () => {
136
+ return token;
80
137
  });
81
- setCustomContextParams(props, state);
82
138
  } else {
83
- dispatch({
84
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
85
- payload: _ConversationState.ConversationState.Loading
139
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
140
+ Event: _TelemetryConstants.TelemetryEvent.ReceivedNullOrEmptyToken
86
141
  });
87
- setCustomContextParams(props, state);
88
- await initStartChat(chatSDK, dispatch, setAdapter);
89
142
  }
90
143
  }
91
144
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
145
 
93
146
 
94
- exports.prepareStartChat = prepareStartChat;
95
-
96
- const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedState) => {
147
+ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, params, persistedState) => {
97
148
  try {
98
149
  var _newAdapter$activity$, _TelemetryTimers$Widg;
99
150
 
100
- let isStartChatSuccessful = false;
151
+ let isStartChatSuccessful = false; //Check if chat retrieved from cache
101
152
 
102
153
  if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
103
154
  var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
104
155
 
105
- // Broadcasting limited cached chat details
106
156
  _omnichannelChatComponents.BroadcastService.postMessage({
107
157
  eventName: _TelemetryConstants.BroadcastEvent.ChatRetrievedFromCache,
108
158
  payload: {
@@ -113,13 +163,17 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
113
163
  }
114
164
 
115
165
  try {
166
+ //Start widget load timer
116
167
  _TelemetryManager.TelemetryTimers.WidgetLoadTimer = (0, _utils.createTimer)();
117
168
 
118
169
  _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.INFO, {
119
170
  Event: _TelemetryConstants.TelemetryEvent.StartChatSDKCall
120
- });
171
+ }); // Set optional params
172
+
121
173
 
122
- optionalParams = Object.assign({}, params, optionalParams);
174
+ optionalParams = Object.assign({}, params, optionalParams); // set auth token to chat sdk before start chat
175
+
176
+ await handleAuthentication(chatSDK, chatConfig, getAuthToken);
123
177
  await chatSDK.startChat(optionalParams);
124
178
  isStartChatSuccessful = true;
125
179
  } catch (error) {
@@ -130,46 +184,53 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
130
184
  }
131
185
  });
132
186
 
133
- isStartChatSuccessful = false;
134
- }
187
+ isStartChatSuccessful = false; // Resetting the widget state to Closed, for recent introduction of OC rate limiting(429 Error)
188
+ // TODO : How to diplay a proper UI message to customer to try after sometime at this point - cool down scenario
189
+
190
+ dispatch({
191
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
192
+ payload: _ConversationState.ConversationState.Closed
193
+ });
194
+ return;
195
+ } // New adapter creation
196
+
135
197
 
136
198
  const newAdapter = await (0, _createAdapter.createAdapter)(chatSDK);
137
199
  setAdapter(newAdapter);
138
200
  const chatToken = await chatSDK.getChatToken();
201
+ dispatch({
202
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
203
+ payload: chatToken
204
+ });
139
205
  newAdapter === null || newAdapter === void 0 ? void 0 : (_newAdapter$activity$ = newAdapter.activity$) === null || _newAdapter$activity$ === void 0 ? void 0 : _newAdapter$activity$.subscribe((0, _newMessageEventHandler.createOnNewAdapterActivityHandler)(chatToken === null || chatToken === void 0 ? void 0 : chatToken.chatId, chatToken === null || chatToken === void 0 ? void 0 : chatToken.visitorId));
140
206
 
141
- if (!persistedState) {
142
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
- if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
144
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
145
- const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
146
- dispatch({
147
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CHAT_TOKEN,
148
- payload: chatToken
149
- });
150
- } // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
-
152
-
153
- const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
154
- dispatch({
155
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
156
- payload: liveChatContext
157
- });
158
- await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch);
159
- await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch); // Set app state to Active
160
-
161
- if (isStartChatSuccessful) {
162
- dispatch({
163
- type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
164
- payload: _ConversationState.ConversationState.Active
165
- });
166
- }
167
- } else {
207
+ if (persistedState) {
168
208
  dispatch({
169
209
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_WIDGET_STATE,
170
210
  payload: persistedState
171
211
  });
172
212
  await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch, true);
213
+ return;
214
+ } // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
+
216
+
217
+ const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
218
+ dispatch({
219
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
220
+ payload: liveChatContext
221
+ }); // Set post chat context in state, no survey load
222
+
223
+ await (0, _setPostChatContextAndLoadSurvey.setPostChatContextAndLoadSurvey)(chatSDK, dispatch); // Updating chat session detail for telemetry
224
+
225
+ await (0, _updateSessionDataForTelemetry.updateSessionDataForTelemetry)(chatSDK, dispatch); // Set app state to Active
226
+
227
+ if (isStartChatSuccessful) {
228
+ _ActivityStreamHandler.ActivityStreamHandler.uncork();
229
+
230
+ dispatch({
231
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
232
+ payload: _ConversationState.ConversationState.Active
233
+ });
173
234
  }
174
235
 
175
236
  _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
@@ -198,6 +259,8 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
198
259
  payload: _ConversationState.ConversationState.OutOfOffice
199
260
  });
200
261
  }
262
+ } finally {
263
+ optionalParams = {};
201
264
  }
202
265
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
203
266
 
@@ -205,13 +268,16 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
205
268
  exports.initStartChat = initStartChat;
206
269
 
207
270
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
208
- var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
271
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps, _persistedState$domai6, _persistedState$appSt;
209
272
 
210
- const widgetStateEventName = (0, _utils.getWidgetCacheId)((chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId) ?? "", (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId) ?? "");
211
- const widgetStateFromCache = (_DataStoreManager$cli = _DataStoreManager.DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateEventName, "localStorage");
212
- const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
273
+ // By pass this function in case of popout chat
274
+ if (state.appStates.skipChatButtonRendering === true) {
275
+ return false;
276
+ }
213
277
 
214
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai6 = persistedState.domainStates) !== null && _persistedState$domai6 !== void 0 && _persistedState$domai6.liveChatContext) {
278
+ const persistedState = (0, _utils.getStateFromCache)(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, (props === null || props === void 0 ? void 0 : (_props$controlProps = props.controlProps) === null || _props$controlProps === void 0 ? void 0 : _props$controlProps.widgetInstanceId) ?? ""); //Connect to only active chat session
279
+
280
+ if (persistedState && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai6 = persistedState.domainStates) === null || _persistedState$domai6 === void 0 ? void 0 : _persistedState$domai6.liveChatContext) && (persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$appSt = persistedState.appStates) === null || _persistedState$appSt === void 0 ? void 0 : _persistedState$appSt.conversationState) === _ConversationState.ConversationState.Active) {
215
281
  var _persistedState$domai7;
216
282
 
217
283
  dispatch({
@@ -221,20 +287,25 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
221
287
  const optionalParams = {
222
288
  liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
223
289
  };
224
- await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
290
+ await initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
225
291
  return true;
226
292
  } else {
227
293
  return false;
228
294
  }
229
- };
295
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
296
+
297
+
298
+ const setCustomContextParams = (props, chatSDK) => {
299
+ var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4, _props$controlProps2, _props$chatConfig, _persistedState$domai8;
300
+
301
+ // Add custom context only for unauthenticated chat
302
+ const persistedState = (0, _utils.getStateFromCache)(chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC3 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC3 === void 0 ? void 0 : _chatSDK$omnichannelC3.orgId, chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC4 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC4 === void 0 ? void 0 : _chatSDK$omnichannelC4.widgetId, (props === null || props === void 0 ? void 0 : (_props$controlProps2 = props.controlProps) === null || _props$controlProps2 === void 0 ? void 0 : _props$controlProps2.widgetInstanceId) ?? "");
230
303
 
231
- const setCustomContextParams = (props, state) => {
232
- var _props$chatConfig, _state$domainStates;
304
+ if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && !(0, _utils.isUndefinedOrEmpty)(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai8 = persistedState.domainStates) === null || _persistedState$domai8 === void 0 ? void 0 : _persistedState$domai8.customContext)) {
305
+ var _persistedState$domai9;
233
306
 
234
- // Add custom context if any only for unauthenticated chat
235
- if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && (_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.customContext) {
236
307
  optionalParams = Object.assign({}, optionalParams, {
237
- customContext: state.domainStates.customContext
308
+ customContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai9 = persistedState.domainStates) === null || _persistedState$domai9 === void 0 ? void 0 : _persistedState$domai9.customContext
238
309
  });
239
310
  }
240
311
  };