@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
@@ -29,9 +29,17 @@ const getChatReconnectContext = async (chatSDK, reconnectId) => {
29
29
 
30
30
 
31
31
  const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
32
- var _props$reconnectChatP, _props$reconnectChatP2;
32
+ var _props$chatConfig, _props$reconnectChatP;
33
33
 
34
- 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
34
+ let authClientFunction = undefined;
35
+
36
+ if ((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) {
37
+ var _props$chatConfig2, _props$chatConfig2$Li;
38
+
39
+ 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;
40
+ }
41
+
42
+ if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.isReconnectEnabled && authClientFunction // TODO: Implement this after storage is in place
35
43
 
36
44
  /* && !isLoadWithState() */
37
45
  ) {
@@ -46,27 +54,27 @@ const getReconnectIdForAuthenticatedChat = async (props, chatSDK) => {
46
54
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
55
 
48
56
 
49
- const handleUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat, redirectInSameWindow) => {
57
+ const handleUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat, redirectInSameWindow) => {
50
58
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
51
59
 
52
60
  if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
53
- await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow);
61
+ await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
54
62
  } else {
55
- await setReconnectIdAndStartChat(chatSDK, dispatch, setAdapter, reconnectId, initStartChat);
63
+ await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
56
64
  }
57
65
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
66
 
59
67
 
60
- const startUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat) => {
68
+ const startUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
61
69
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
62
70
 
63
71
  if (!shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
64
- await setReconnectIdAndStartChat(chatSDK, dispatch, setAdapter, reconnectId, initStartChat);
72
+ await setReconnectIdAndStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat);
65
73
  }
66
74
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
75
 
68
76
 
69
- const setReconnectIdAndStartChat = async (chatSDK, dispatch, setAdapter, reconnectId, initStartChat) => {
77
+ const setReconnectIdAndStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, reconnectId, initStartChat) => {
70
78
  const startUnauthenticatedReconnectChat = {
71
79
  eventName: BroadcastEvent.StartUnauthenticatedReconnectChat
72
80
  };
@@ -82,7 +90,7 @@ const setReconnectIdAndStartChat = async (chatSDK, dispatch, setAdapter, reconne
82
90
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
83
91
  payload: ConversationState.Loading
84
92
  });
85
- await initStartChat(chatSDK, dispatch, setAdapter, optionalParams);
93
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, optionalParams);
86
94
  };
87
95
 
88
96
  const redirectPage = (redirectURL, redirectInSameWindow) => {
@@ -104,7 +112,7 @@ const shouldRedirectOrStartNewChat = reconnectAvailabilityResponse => {
104
112
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
113
 
106
114
 
107
- const startNewChatEmptyRedirectionUrl = async (chatSDK, dispatch, setAdapter, initStartChat) => {
115
+ const startNewChatEmptyRedirectionUrl = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat) => {
108
116
  const startUnauthenticatedReconnectChat = {
109
117
  eventName: BroadcastEvent.StartUnauthenticatedReconnectChat
110
118
  };
@@ -127,25 +135,25 @@ const startNewChatEmptyRedirectionUrl = async (chatSDK, dispatch, setAdapter, in
127
135
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
128
136
  payload: ConversationState.Loading
129
137
  });
130
- await initStartChat(chatSDK, dispatch, setAdapter);
138
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
131
139
  }
132
140
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
141
 
134
142
 
135
- const handleRedirectUnauthenticatedReconnectChat = async (chatSDK, dispatch, setAdapter, initStartChat, reconnectId, redirectInSameWindow) => {
143
+ const handleRedirectUnauthenticatedReconnectChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, reconnectId, redirectInSameWindow) => {
136
144
  const reconnectAvailabilityResponse = await getChatReconnectContext(chatSDK, reconnectId);
137
145
 
138
146
  if (shouldRedirectOrStartNewChat(reconnectAvailabilityResponse)) {
139
- await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow);
147
+ await redirectOrStartNewChat(reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow);
140
148
  }
141
149
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
142
150
 
143
151
 
144
- const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK, dispatch, setAdapter, initStartChat, redirectInSameWindow) => {
152
+ const redirectOrStartNewChat = async (reconnectAvailabilityResponse, chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat, redirectInSameWindow) => {
145
153
  if (reconnectAvailabilityResponse.redirectURL) {
146
154
  redirectPage(reconnectAvailabilityResponse.redirectURL, redirectInSameWindow);
147
155
  } else {
148
- await startNewChatEmptyRedirectionUrl(chatSDK, dispatch, setAdapter, initStartChat);
156
+ await startNewChatEmptyRedirectionUrl(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, initStartChat);
149
157
  }
150
158
  };
151
159
 
@@ -29,10 +29,6 @@ export const setPostChatContextAndLoadSurvey = async (chatSDK, dispatch, persist
29
29
 
30
30
 
31
31
  BroadcastService.getMessageByEventName("LoadPostChatSurvey").subscribe(msg => {
32
- dispatch({
33
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
34
- payload: ConversationState.Loading
35
- });
36
32
  dispatch({
37
33
  type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
38
34
  payload: ConversationState.Postchat
@@ -0,0 +1,38 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ export function shareObservable(observable) {
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ let observers = []; // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+
6
+ let subscription; // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+
8
+ return new window.Observable(observer => {
9
+ if (!subscription) {
10
+ subscription = observable.subscribe({
11
+ complete() {
12
+ observers.forEach(observer => observer.complete());
13
+ },
14
+
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ error(err) {
17
+ observers.forEach(observer => observer.error(err));
18
+ },
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ next(value) {
22
+ observers.forEach(observer => observer.next(value));
23
+ }
24
+
25
+ });
26
+ }
27
+
28
+ observers.push(observer);
29
+ return () => {
30
+ observers = observers.filter(o => o !== observer);
31
+
32
+ if (!observers.length) {
33
+ subscription.unsubscribe();
34
+ subscription = null;
35
+ }
36
+ };
37
+ });
38
+ }
@@ -1,7 +1,6 @@
1
1
  import { ChatSDKError } from "../../../common/Constants";
2
2
  import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
3
  import { ConversationState } from "../../../contexts/common/ConversationState";
4
- import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
5
4
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
6
5
  import { NotificationHandler } from "../../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
7
6
  import { NotificationScenarios } from "../../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
@@ -9,17 +8,21 @@ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
9
8
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
10
9
  import { createAdapter } from "./createAdapter";
11
10
  import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
12
- import { createTimer, getWidgetCacheId } from "../../../common/utils";
11
+ import { createTimer, getStateFromCache, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
13
12
  import { getReconnectIdForAuthenticatedChat, handleRedirectUnauthenticatedReconnectChat } from "./reconnectChatHelper";
14
13
  import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
15
14
  import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
16
- import { BroadcastService } from "@microsoft/omnichannel-chat-components"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ import { BroadcastService } from "@microsoft/omnichannel-chat-components";
16
+ import { ActivityStreamHandler } from "./ActivityStreamHandler"; // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
17
 
18
18
  let optionalParams = {}; // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
19
 
20
20
  const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) => {
21
21
  var _props$reconnectChatP;
22
22
 
23
+ optionalParams = {}; //Resetting to ensure no stale values
24
+ // Can connect to existing chat session
25
+
23
26
  if (await canConnectToExistingChat(props, chatSDK, state, dispatch, setAdapter)) {
24
27
  return;
25
28
  } // Redirecting if unauthenticated reconnect chat expired
@@ -28,56 +31,100 @@ const prepareStartChat = async (props, chatSDK, state, dispatch, setAdapter) =>
28
31
  if ((_props$reconnectChatP = props.reconnectChatPaneProps) !== null && _props$reconnectChatP !== void 0 && _props$reconnectChatP.reconnectId) {
29
32
  var _props$reconnectChatP2, _props$reconnectChatP3;
30
33
 
31
- await handleRedirectUnauthenticatedReconnectChat(chatSDK, dispatch, setAdapter, initStartChat, (_props$reconnectChatP2 = props.reconnectChatPaneProps) === null || _props$reconnectChatP2 === void 0 ? void 0 : _props$reconnectChatP2.reconnectId, (_props$reconnectChatP3 = props.reconnectChatPaneProps) === null || _props$reconnectChatP3 === void 0 ? void 0 : _props$reconnectChatP3.redirectInSameWindow);
32
- } else {
33
- // Getting PreChat Survey Context
34
- const parseToJson = false;
35
- const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
36
- const showPrechat = state.appStates.conversationState === ConversationState.ProactiveChat ? preChatSurveyResponse && state.appStates.proactiveChatStates.proactiveChatEnablePrechat : preChatSurveyResponse; // Getting reconnectId for authenticated chat
34
+ await 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);
35
+ return;
36
+ } // Getting reconnectId for authenticated chat
37
37
 
38
- const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
39
38
 
40
- if (reconnectId) {
41
- dispatch({
42
- type: LiveChatWidgetActionType.SET_RECONNECT_ID,
43
- payload: reconnectId
44
- });
45
- dispatch({
46
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
47
- payload: ConversationState.ReconnectChat
48
- });
49
- } else if (showPrechat) {
50
- dispatch({
51
- type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
52
- payload: preChatSurveyResponse
53
- });
54
- dispatch({
55
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
56
- payload: ConversationState.Prechat
39
+ const reconnectId = await getReconnectIdForAuthenticatedChat(props, chatSDK);
40
+
41
+ if (reconnectId) {
42
+ dispatch({
43
+ type: LiveChatWidgetActionType.SET_RECONNECT_ID,
44
+ payload: reconnectId
45
+ });
46
+ dispatch({
47
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
48
+ payload: ConversationState.ReconnectChat
49
+ });
50
+ return;
51
+ } // Set custom context params
52
+
53
+
54
+ setCustomContextParams(props, chatSDK); // Setting Proactive chat settings
55
+
56
+ const isProactiveChat = state.appStates.conversationState === ConversationState.ProactiveChat;
57
+ const isPreChatEnabledInProactiveChat = state.appStates.proactiveChatStates.proactiveChatEnablePrechat; //Setting PreChat and intiate chat
58
+
59
+ setPreChatAndInitiateChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, isProactiveChat, isPreChatEnabledInProactiveChat);
60
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+
62
+
63
+ const setPreChatAndInitiateChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, isProactiveChat, proactiveChatEnablePrechatState) => {
64
+ // Getting prechat Survey Context
65
+ const parseToJson = false;
66
+ const preChatSurveyResponse = await chatSDK.getPreChatSurvey(parseToJson);
67
+ const showPrechat = isProactiveChat ? preChatSurveyResponse && proactiveChatEnablePrechatState : preChatSurveyResponse;
68
+
69
+ if (showPrechat) {
70
+ dispatch({
71
+ type: LiveChatWidgetActionType.SET_PRE_CHAT_SURVEY_RESPONSE,
72
+ payload: preChatSurveyResponse
73
+ });
74
+ dispatch({
75
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
76
+ payload: ConversationState.Prechat
77
+ });
78
+ return;
79
+ } //Initiate start chat
80
+
81
+
82
+ dispatch({
83
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
84
+ payload: ConversationState.Loading
85
+ });
86
+ await initStartChat(chatSDK, chatConfig, getAuthToken, dispatch, setAdapter);
87
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+
89
+
90
+ const handleAuthentication = async (chatSDK, chatConfig, getAuthToken) => {
91
+ if (getAuthToken) {
92
+ TelemetryHelper.logActionEvent(LogLevel.INFO, {
93
+ Event: TelemetryEvent.GetAuthTokenCalled
94
+ });
95
+ let authClientFunction = undefined;
96
+
97
+ if (chatConfig !== null && chatConfig !== void 0 && chatConfig.LiveChatConfigAuthSettings) {
98
+ var _chatConfig$LiveChatC;
99
+
100
+ authClientFunction = (chatConfig === null || chatConfig === void 0 ? void 0 : (_chatConfig$LiveChatC = chatConfig.LiveChatConfigAuthSettings) === null || _chatConfig$LiveChatC === void 0 ? void 0 : _chatConfig$LiveChatC.msdyn_javascriptclientfunction) ?? undefined;
101
+ }
102
+
103
+ const token = await getAuthToken(authClientFunction);
104
+
105
+ if (!isNullOrEmptyString(token)) {
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ chatSDK.setAuthTokenProvider(async () => {
108
+ return token;
57
109
  });
58
- setCustomContextParams(props, state);
59
110
  } else {
60
- dispatch({
61
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
62
- payload: ConversationState.Loading
111
+ TelemetryHelper.logActionEvent(LogLevel.ERROR, {
112
+ Event: TelemetryEvent.ReceivedNullOrEmptyToken
63
113
  });
64
- setCustomContextParams(props, state);
65
- await initStartChat(chatSDK, dispatch, setAdapter);
66
114
  }
67
115
  }
68
116
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
117
 
70
118
 
71
- const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedState) => {
119
+ const initStartChat = async (chatSDK, chatConfig, getAuthToken, dispatch, setAdapter, params, persistedState) => {
72
120
  try {
73
121
  var _newAdapter$activity$, _TelemetryTimers$Widg;
74
122
 
75
- let isStartChatSuccessful = false;
123
+ let isStartChatSuccessful = false; //Check if chat retrieved from cache
76
124
 
77
125
  if (persistedState || params !== null && params !== void 0 && params.liveChatContext) {
78
126
  var _persistedState$domai, _persistedState$domai2, _persistedState$domai3, _persistedState$domai4, _persistedState$domai5;
79
127
 
80
- // Broadcasting limited cached chat details
81
128
  BroadcastService.postMessage({
82
129
  eventName: BroadcastEvent.ChatRetrievedFromCache,
83
130
  payload: {
@@ -88,11 +135,15 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
88
135
  }
89
136
 
90
137
  try {
138
+ //Start widget load timer
91
139
  TelemetryTimers.WidgetLoadTimer = createTimer();
92
140
  TelemetryHelper.logSDKEvent(LogLevel.INFO, {
93
141
  Event: TelemetryEvent.StartChatSDKCall
94
- });
95
- optionalParams = Object.assign({}, params, optionalParams);
142
+ }); // Set optional params
143
+
144
+ optionalParams = Object.assign({}, params, optionalParams); // set auth token to chat sdk before start chat
145
+
146
+ await handleAuthentication(chatSDK, chatConfig, getAuthToken);
96
147
  await chatSDK.startChat(optionalParams);
97
148
  isStartChatSuccessful = true;
98
149
  } catch (error) {
@@ -102,46 +153,52 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
102
153
  exception: `Failed to setup startChat: ${error}`
103
154
  }
104
155
  });
105
- isStartChatSuccessful = false;
106
- }
156
+ isStartChatSuccessful = false; // Resetting the widget state to Closed, for recent introduction of OC rate limiting(429 Error)
157
+ // TODO : How to diplay a proper UI message to customer to try after sometime at this point - cool down scenario
158
+
159
+ dispatch({
160
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
161
+ payload: ConversationState.Closed
162
+ });
163
+ return;
164
+ } // New adapter creation
165
+
107
166
 
108
167
  const newAdapter = await createAdapter(chatSDK);
109
168
  setAdapter(newAdapter);
110
169
  const chatToken = await chatSDK.getChatToken();
170
+ dispatch({
171
+ type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
172
+ payload: chatToken
173
+ });
111
174
  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));
112
175
 
113
- if (!persistedState) {
114
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
115
- if (chatSDK !== null && chatSDK !== void 0 && chatSDK.getVoiceVideoCalling) {
116
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
- const chatToken = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getChatToken());
118
- dispatch({
119
- type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
120
- payload: chatToken
121
- });
122
- } // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
-
124
-
125
- const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
126
- dispatch({
127
- type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
128
- payload: liveChatContext
129
- });
130
- await setPostChatContextAndLoadSurvey(chatSDK, dispatch);
131
- await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
132
-
133
- if (isStartChatSuccessful) {
134
- dispatch({
135
- type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
136
- payload: ConversationState.Active
137
- });
138
- }
139
- } else {
176
+ if (persistedState) {
140
177
  dispatch({
141
178
  type: LiveChatWidgetActionType.SET_WIDGET_STATE,
142
179
  payload: persistedState
143
180
  });
144
181
  await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
182
+ return;
183
+ } // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
+
185
+
186
+ const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
187
+ dispatch({
188
+ type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
189
+ payload: liveChatContext
190
+ }); // Set post chat context in state, no survey load
191
+
192
+ await setPostChatContextAndLoadSurvey(chatSDK, dispatch); // Updating chat session detail for telemetry
193
+
194
+ await updateSessionDataForTelemetry(chatSDK, dispatch); // Set app state to Active
195
+
196
+ if (isStartChatSuccessful) {
197
+ ActivityStreamHandler.uncork();
198
+ dispatch({
199
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
200
+ payload: ConversationState.Active
201
+ });
145
202
  }
146
203
 
147
204
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
@@ -168,18 +225,23 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, params, persistedSta
168
225
  payload: ConversationState.OutOfOffice
169
226
  });
170
227
  }
228
+ } finally {
229
+ optionalParams = {};
171
230
  }
172
231
  }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
232
 
174
233
 
175
234
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
176
- var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _DataStoreManager$cli, _persistedState$domai6;
235
+ var _chatSDK$omnichannelC, _chatSDK$omnichannelC2, _props$controlProps, _persistedState$domai6, _persistedState$appSt;
236
+
237
+ // By pass this function in case of popout chat
238
+ if (state.appStates.skipChatButtonRendering === true) {
239
+ return false;
240
+ }
177
241
 
178
- const widgetStateEventName = getWidgetCacheId((chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC === void 0 ? void 0 : _chatSDK$omnichannelC.orgId) ?? "", (chatSDK === null || chatSDK === void 0 ? void 0 : (_chatSDK$omnichannelC2 = chatSDK.omnichannelConfig) === null || _chatSDK$omnichannelC2 === void 0 ? void 0 : _chatSDK$omnichannelC2.widgetId) ?? "");
179
- const widgetStateFromCache = (_DataStoreManager$cli = DataStoreManager.clientDataStore) === null || _DataStoreManager$cli === void 0 ? void 0 : _DataStoreManager$cli.getData(widgetStateEventName, "localStorage");
180
- const persistedState = widgetStateFromCache ? JSON.parse(widgetStateFromCache) : undefined;
242
+ const persistedState = 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
181
243
 
182
- if (persistedState !== null && persistedState !== void 0 && (_persistedState$domai6 = persistedState.domainStates) !== null && _persistedState$domai6 !== void 0 && _persistedState$domai6.liveChatContext) {
244
+ if (persistedState && !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.Active) {
183
245
  var _persistedState$domai7;
184
246
 
185
247
  dispatch({
@@ -189,22 +251,27 @@ const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdap
189
251
  const optionalParams = {
190
252
  liveChatContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai7 = persistedState.domainStates) === null || _persistedState$domai7 === void 0 ? void 0 : _persistedState$domai7.liveChatContext
191
253
  };
192
- await initStartChat(chatSDK, dispatch, setAdapter, optionalParams, persistedState);
254
+ await initStartChat(chatSDK, props.chatConfig, props.getAuthToken, dispatch, setAdapter, optionalParams, persistedState);
193
255
  return true;
194
256
  } else {
195
257
  return false;
196
258
  }
197
- };
259
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
260
+
261
+
262
+ const setCustomContextParams = (props, chatSDK) => {
263
+ var _chatSDK$omnichannelC3, _chatSDK$omnichannelC4, _props$controlProps2, _props$chatConfig, _persistedState$domai8;
264
+
265
+ // Add custom context only for unauthenticated chat
266
+ const persistedState = 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) ?? "");
198
267
 
199
- const setCustomContextParams = (props, state) => {
200
- var _props$chatConfig, _state$domainStates;
268
+ if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && !isUndefinedOrEmpty(persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai8 = persistedState.domainStates) === null || _persistedState$domai8 === void 0 ? void 0 : _persistedState$domai8.customContext)) {
269
+ var _persistedState$domai9;
201
270
 
202
- // Add custom context if any only for unauthenticated chat
203
- if (!((_props$chatConfig = props.chatConfig) !== null && _props$chatConfig !== void 0 && _props$chatConfig.LiveChatConfigAuthSettings) && (_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.customContext) {
204
271
  optionalParams = Object.assign({}, optionalParams, {
205
- customContext: state.domainStates.customContext
272
+ customContext: persistedState === null || persistedState === void 0 ? void 0 : (_persistedState$domai9 = persistedState.domainStates) === null || _persistedState$domai9 === void 0 ? void 0 : _persistedState$domai9.customContext
206
273
  });
207
274
  }
208
275
  };
209
276
 
210
- export { prepareStartChat, initStartChat };
277
+ export { prepareStartChat, initStartChat, setPreChatAndInitiateChat };