@microsoft/omnichannel-chat-widget 1.7.5-main.290ba08 → 1.7.6-main.9b09b06

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 (83) hide show
  1. package/lib/cjs/common/facades/FacadeChatSDK.js +11 -1
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +32 -0
  3. package/lib/cjs/common/telemetry/TelemetryHelper.js +10 -0
  4. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +15 -1
  5. package/lib/cjs/components/confirmationpanestateful/ConfirmationPaneStateful.js +14 -2
  6. package/lib/cjs/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +16 -2
  7. package/lib/cjs/components/footerstateful/FooterStateful.js +15 -0
  8. package/lib/cjs/components/headerstateful/HeaderStateful.js +16 -2
  9. package/lib/cjs/components/livechatwidget/LiveChatWidget.js +3 -2
  10. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +5 -3
  11. package/lib/cjs/components/livechatwidget/interfaces/IFeatureConfigProps.js +1 -0
  12. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +37 -4
  13. package/lib/cjs/components/loadingpanestateful/LoadingPaneStateful.js +20 -2
  14. package/lib/cjs/components/notificationpanestateful/NotificationPaneStateful.js +21 -7
  15. package/lib/cjs/components/ooohpanestateful/OOOHPaneStateful.js +12 -1
  16. package/lib/cjs/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +14 -3
  17. package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +13 -0
  18. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +12 -0
  19. package/lib/cjs/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +12 -1
  20. package/lib/cjs/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +19 -8
  21. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +14 -1
  22. package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -1
  23. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/enums/WebChatActionType.js +1 -0
  24. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +7 -7
  25. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +4 -4
  26. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +7 -4
  27. package/lib/cjs/plugins/createChatTranscript.js +15 -6
  28. package/lib/esm/common/facades/FacadeChatSDK.js +11 -1
  29. package/lib/esm/common/telemetry/TelemetryConstants.js +32 -0
  30. package/lib/esm/common/telemetry/TelemetryHelper.js +10 -0
  31. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +15 -1
  32. package/lib/esm/components/confirmationpanestateful/ConfirmationPaneStateful.js +14 -3
  33. package/lib/esm/components/emailtranscriptpanestateful/EmailTranscriptPaneStateful.js +17 -3
  34. package/lib/esm/components/footerstateful/FooterStateful.js +14 -0
  35. package/lib/esm/components/headerstateful/HeaderStateful.js +16 -2
  36. package/lib/esm/components/livechatwidget/LiveChatWidget.js +3 -2
  37. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +5 -3
  38. package/lib/esm/components/livechatwidget/interfaces/IFeatureConfigProps.js +1 -0
  39. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +37 -4
  40. package/lib/esm/components/loadingpanestateful/LoadingPaneStateful.js +19 -2
  41. package/lib/esm/components/notificationpanestateful/NotificationPaneStateful.js +21 -7
  42. package/lib/esm/components/ooohpanestateful/OOOHPaneStateful.js +12 -1
  43. package/lib/esm/components/postchatloadingpanestateful/PostChatLoadingPaneStateful.js +14 -3
  44. package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +13 -1
  45. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +11 -0
  46. package/lib/esm/components/reconnectchatpanestateful/ReconnectChatPaneStateful.js +12 -1
  47. package/lib/esm/components/startchaterrorpanestateful/StartChatErrorPaneStateful.js +19 -8
  48. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +14 -1
  49. package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultWebChatStyles.js +2 -1
  50. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/enums/WebChatActionType.js +1 -0
  51. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware.js +7 -7
  52. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware.js +4 -4
  53. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.js +7 -4
  54. package/lib/esm/plugins/createChatTranscript.js +15 -6
  55. package/lib/types/common/facades/FacadeChatSDK.d.ts +2 -1
  56. package/lib/types/common/telemetry/TelemetryConstants.d.ts +33 -1
  57. package/lib/types/common/telemetry/TelemetryHelper.d.ts +2 -1
  58. package/lib/types/common/telemetry/definitions/Contracts.d.ts +1 -1
  59. package/lib/types/common/telemetry/definitions/Payload.d.ts +14 -1
  60. package/lib/types/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.d.ts +1 -1
  61. package/lib/types/components/footerstateful/downloadtranscriptstateful/interfaces/IWebChatTranscriptConfig.d.ts +1 -0
  62. package/lib/types/components/livechatwidget/common/authHelper.d.ts +1 -1
  63. package/lib/types/components/livechatwidget/common/createAdapter.d.ts +1 -1
  64. package/lib/types/components/livechatwidget/common/createDownloadTranscriptProps.d.ts +2 -1
  65. package/lib/types/components/livechatwidget/common/createInternetConnectionChangeHandler.d.ts +2 -1
  66. package/lib/types/components/livechatwidget/common/endChat.d.ts +1 -1
  67. package/lib/types/components/livechatwidget/common/getMockChatSDKIfApplicable.d.ts +1 -1
  68. package/lib/types/components/livechatwidget/common/reconnectChatHelper.d.ts +2 -2
  69. package/lib/types/components/livechatwidget/common/setPostChatContextAndLoadSurvey.d.ts +1 -1
  70. package/lib/types/components/livechatwidget/common/startChat.d.ts +2 -2
  71. package/lib/types/components/livechatwidget/common/startChatErrorHandler.d.ts +1 -1
  72. package/lib/types/components/livechatwidget/common/startProactiveChat.d.ts +1 -1
  73. package/lib/types/components/livechatwidget/interfaces/IFeatureConfigProps.d.ts +3 -0
  74. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +9 -7
  75. package/lib/types/components/webchatcontainerstateful/common/utils/FileAttachmentIconManager.d.ts +1 -1
  76. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatProps.d.ts +1 -1
  77. package/lib/types/components/webchatcontainerstateful/webchatcontroller/enums/WebChatActionType.d.ts +2 -1
  78. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +1 -1
  79. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware.d.ts +1 -1
  80. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware.d.ts +1 -1
  81. package/lib/types/hooks/useChatSDKStore.d.ts +1 -1
  82. package/lib/types/hooks/useDebounce.d.ts +1 -1
  83. package/package.json +17 -8
@@ -1,15 +1,22 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
- import { ConfirmationPane } from "@microsoft/omnichannel-chat-components";
3
2
  import React, { useEffect } from "react";
4
- import { findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
3
+ import { createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
4
+ import { ConfirmationPane } from "@microsoft/omnichannel-chat-components";
5
+ import { ConfirmationState } from "../../common/Constants";
5
6
  import { DimLayer } from "../dimlayer/DimLayer";
6
7
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
7
8
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
8
9
  import useChatContextStore from "../../hooks/useChatContextStore";
9
- import { ConfirmationState } from "../../common/Constants";
10
+ let uiTimer;
10
11
 
11
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
13
  export const ConfirmationPaneStateful = props => {
14
+ useEffect(() => {
15
+ uiTimer = createTimer();
16
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
17
+ Event: TelemetryEvent.UXConfirmationPaneStart
18
+ });
19
+ }, []);
13
20
  const initialTabIndexMap = new Map();
14
21
  let elements = [];
15
22
  const [state, dispatch] = useChatContextStore();
@@ -76,6 +83,10 @@ export const ConfirmationPaneStateful = props => {
76
83
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
77
84
  Event: TelemetryEvent.ConfirmationPaneLoaded
78
85
  });
86
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
87
+ Event: TelemetryEvent.UXConfirmationPaneCompleted,
88
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
89
+ });
79
90
  }, []);
80
91
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
81
92
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
@@ -1,6 +1,6 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useCallback, useEffect, useState } from "react";
3
- import { findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, formatTemplateString, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
3
+ import { createTimer, findAllFocusableElement, findParentFocusableElementsWithoutChildContainer, formatTemplateString, preventFocusToMoveOutOfElement, setFocusOnElement, setFocusOnSendBox, setTabIndices } from "../../common/utils";
4
4
  import { DimLayer } from "../dimlayer/DimLayer";
5
5
  import { InputValidationPane } from "@microsoft/omnichannel-chat-components";
6
6
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
@@ -11,8 +11,16 @@ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
11
11
  import { defaultMiddlewareLocalizedTexts } from "../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts";
12
12
  import useChatContextStore from "../../hooks/useChatContextStore";
13
13
  import useFacadeSDKStore from "../../hooks/useFacadeChatSDKStore";
14
+ let uiTimer;
14
15
  export const EmailTranscriptPaneStateful = props => {
15
16
  var _props$controlProps;
17
+ // this is to ensure the telemetry is set only once and start the load timer
18
+ useEffect(() => {
19
+ uiTimer = createTimer();
20
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
21
+ Event: TelemetryEvent.UXEmailTranscriptPaneStart
22
+ });
23
+ }, []);
16
24
  const initialTabIndexMap = new Map();
17
25
  let elements = [];
18
26
  const [state, dispatch] = useChatContextStore();
@@ -44,22 +52,24 @@ export const EmailTranscriptPaneStateful = props => {
44
52
  attachmentMessage: (props === null || props === void 0 ? void 0 : props.attachmentMessage) ?? "The following attachment was uploaded during the conversation:"
45
53
  };
46
54
  try {
55
+ var _state$domainStates2, _state$domainStates2$;
47
56
  await (facadeChatSDK === null || facadeChatSDK === void 0 ? void 0 : facadeChatSDK.emailLiveChatTranscript(chatTranscriptBody, {
48
57
  liveChatContext
49
58
  }));
50
- NotificationHandler.notifySuccess(NotificationScenarios.EmailAddressSaved, defaultMiddlewareLocalizedTexts === null || defaultMiddlewareLocalizedTexts === void 0 ? void 0 : defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS);
59
+ NotificationHandler.notifySuccess(NotificationScenarios.EmailAddressSaved, (state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.middlewareLocalizedTexts) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS) ?? (defaultMiddlewareLocalizedTexts === null || defaultMiddlewareLocalizedTexts === void 0 ? void 0 : defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS));
51
60
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
52
61
  Event: TelemetryEvent.EmailTranscriptSent,
53
62
  Description: "Transcript sent to email successfully."
54
63
  });
55
64
  } catch (ex) {
65
+ var _state$domainStates3, _state$domainStates3$;
56
66
  TelemetryHelper.logActionEvent(LogLevel.ERROR, {
57
67
  Event: TelemetryEvent.EmailTranscriptFailed,
58
68
  ExceptionDetails: {
59
69
  exception: ex
60
70
  }
61
71
  });
62
- const message = formatTemplateString(defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR, [email]);
72
+ const message = formatTemplateString((state === null || state === void 0 ? void 0 : (_state$domainStates3 = state.domainStates) === null || _state$domainStates3 === void 0 ? void 0 : (_state$domainStates3$ = _state$domainStates3.middlewareLocalizedTexts) === null || _state$domainStates3$ === void 0 ? void 0 : _state$domainStates3$.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR, [email]);
63
73
  NotificationHandler.notifyError(NotificationScenarios.EmailTranscriptError, (props === null || props === void 0 ? void 0 : props.bannerMessageOnError) ?? message);
64
74
  }
65
75
  }, [props.attachmentMessage, props.bannerMessageOnError, facadeChatSDK, state.domainStates.liveChatContext]);
@@ -94,6 +104,10 @@ export const EmailTranscriptPaneStateful = props => {
94
104
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
95
105
  Event: TelemetryEvent.EmailTranscriptLoaded
96
106
  });
107
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
108
+ Event: TelemetryEvent.UXEmailTranscriptPaneCompleted,
109
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
110
+ });
97
111
  }, [initialEmail]);
98
112
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DimLayer, {
99
113
  brightness: (controlProps === null || controlProps === void 0 ? void 0 : controlProps.brightnessValueOnDim) ?? "0.2"
@@ -9,13 +9,21 @@ import { NewMessageNotificationSoundBase64 } from "../../assets/Audios";
9
9
  import { NotificationHandler } from "../webchatcontainerstateful/webchatcontroller/notification/NotificationHandler";
10
10
  import { NotificationScenarios } from "../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
11
11
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
12
+ import { createTimer } from "../../common/utils";
12
13
  import { downloadTranscript } from "./downloadtranscriptstateful/DownloadTranscriptStateful";
13
14
  import useChatContextStore from "../../hooks/useChatContextStore";
14
15
  import useFacadeSDKStore from "../../hooks/useFacadeChatSDKStore";
16
+ let uiTimer;
15
17
 
16
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
19
  export const FooterStateful = props => {
18
20
  var _footerProps$controlP3;
21
+ useEffect(() => {
22
+ uiTimer = createTimer();
23
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
24
+ Event: TelemetryEvent.UXFooterStart
25
+ });
26
+ }, []);
19
27
  const [state, dispatch] = useChatContextStore();
20
28
  // hideFooterDisplay - the purpose of this is to keep the footer always "active",
21
29
  // but hide it visually in certain states (e.g., loading state) and show in some other states (e.g. active state).
@@ -92,6 +100,12 @@ export const FooterStateful = props => {
92
100
  }
93
101
  }
94
102
  }, [state.appStates.conversationState]);
103
+ useEffect(() => {
104
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
105
+ Event: TelemetryEvent.UXFooterCompleted,
106
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
107
+ });
108
+ }, []);
95
109
  return /*#__PURE__*/React.createElement(React.Fragment, null, !hideFooterDisplay && /*#__PURE__*/React.createElement(Footer, {
96
110
  componentOverrides: footerProps === null || footerProps === void 0 ? void 0 : footerProps.componentOverrides,
97
111
  controlProps: controlProps,
@@ -1,16 +1,24 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useEffect, useRef, useState } from "react";
3
+ import { ConfirmationState } from "../../common/Constants";
3
4
  import { ConversationState } from "../../contexts/common/ConversationState";
5
+ import DraggableEventEmitter from "../draggable/DraggableEventEmitter";
4
6
  import { Header } from "@microsoft/omnichannel-chat-components";
5
7
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
6
8
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
9
+ import { createTimer } from "../../common/utils";
7
10
  import { defaultOutOfOfficeHeaderStyleProps } from "./common/styleProps/defaultOutOfOfficeHeaderStyleProps";
8
11
  import useChatAdapterStore from "../../hooks/useChatAdapterStore";
9
12
  import useChatContextStore from "../../hooks/useChatContextStore";
10
- import { ConfirmationState } from "../../common/Constants";
11
- import DraggableEventEmitter from "../draggable/DraggableEventEmitter";
13
+ let uiTimer;
12
14
  export const HeaderStateful = props => {
13
15
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates, _headerProps$controlP, _headerProps$controlP2, _headerProps$controlP3, _outOfOfficeHeaderPro, _state$domainStates3;
16
+ useEffect(() => {
17
+ uiTimer = createTimer();
18
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
19
+ Event: TelemetryEvent.UXHeaderStart
20
+ });
21
+ }, []);
14
22
  const [state, dispatch] = useChatContextStore();
15
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
24
  const [adapter] = useChatAdapterStore();
@@ -105,6 +113,12 @@ export const HeaderStateful = props => {
105
113
  elementId: outOfOperatingHours || state.appStates.conversationState === ConversationState.OutOfOffice ? outOfOfficeControlProps.id : controlProps.id,
106
114
  targetWindow: props.draggableEventEmitterTargetWindow ?? window
107
115
  };
116
+ useEffect(() => {
117
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
118
+ Event: TelemetryEvent.UXHeaderCompleted,
119
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
120
+ });
121
+ }, []);
108
122
  if (props.draggable === true) {
109
123
  var _generalStyleProps;
110
124
  const styleProps = outOfOperatingHours || state.appStates.conversationState === ConversationState.OutOfOffice ? outOfOfficeStyleProps : headerProps === null || headerProps === void 0 ? void 0 : headerProps.styleProps;
@@ -11,13 +11,14 @@ import { getMockChatSDKIfApplicable } from "./common/getMockChatSDKIfApplicable"
11
11
  import { isNullOrUndefined } from "../../common/utils";
12
12
  import overridePropsOnMockIfApplicable from "./common/overridePropsOnMockIfApplicable";
13
13
  export const LiveChatWidget = props => {
14
- var _props$mock, _props$chatConfig, _props$chatConfig$Liv;
14
+ var _props$mock, _props$featureConfigP, _props$chatConfig, _props$chatConfig$Liv;
15
15
  const reducer = createReducer();
16
16
  const [state, dispatch] = useReducer(reducer, getLiveChatWidgetContextInitialState(props));
17
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
18
  const [adapter, setAdapter] = useState(undefined);
19
19
  const [facadeChatSDK, setFacadeChatSDK] = useState(undefined);
20
20
  const chatSDK = getMockChatSDKIfApplicable(props.chatSDK, props === null || props === void 0 ? void 0 : (_props$mock = props.mock) === null || _props$mock === void 0 ? void 0 : _props$mock.type);
21
+ const disableReauthentication = ((_props$featureConfigP = props.featureConfigProps) === null || _props$featureConfigP === void 0 ? void 0 : _props$featureConfigP.disableReauthentication) === true;
21
22
  overridePropsOnMockIfApplicable(props);
22
23
  if (!props.chatConfig) {
23
24
  throw new Error("chatConfig is required");
@@ -34,7 +35,7 @@ export const LiveChatWidget = props => {
34
35
  "getAuthToken": props === null || props === void 0 ? void 0 : props.getAuthToken,
35
36
  //when type is not undefined, it means the SDK is mocked
36
37
  "isSDKMocked": !isNullOrUndefined(props === null || props === void 0 ? void 0 : (_props$mock2 = props.mock) === null || _props$mock2 === void 0 ? void 0 : _props$mock2.type)
37
- }));
38
+ }, disableReauthentication));
38
39
  }
39
40
  return /*#__PURE__*/React.createElement(FacadeChatSDKStore.Provider, {
40
41
  value: [facadeChatSDK, setFacadeChatSDK]
@@ -14,19 +14,21 @@ const isInternetConnected = async () => {
14
14
  return false;
15
15
  }
16
16
  };
17
- export const createInternetConnectionChangeHandler = async () => {
17
+ export const createInternetConnectionChangeHandler = async state => {
18
18
  const handler = async () => {
19
19
  const connected = await isInternetConnected();
20
20
  if (!connected) {
21
+ var _state$domainStates, _state$domainStates$m;
21
22
  TelemetryHelper.logActionEvent(LogLevel.WARN, {
22
23
  Event: TelemetryEvent.NetworkDisconnected
23
24
  });
24
- NotificationHandler.notifyError(NotificationScenarios.InternetConnection, defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION);
25
+ NotificationHandler.notifyError(NotificationScenarios.InternetConnection, (state === null || state === void 0 ? void 0 : (_state$domainStates = state.domainStates) === null || _state$domainStates === void 0 ? void 0 : (_state$domainStates$m = _state$domainStates.middlewareLocalizedTexts) === null || _state$domainStates$m === void 0 ? void 0 : _state$domainStates$m.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION);
25
26
  } else {
27
+ var _state$domainStates2, _state$domainStates2$;
26
28
  TelemetryHelper.logActionEvent(LogLevel.WARN, {
27
29
  Event: TelemetryEvent.NetworkReconnected
28
30
  });
29
- NotificationHandler.notifySuccess(NotificationScenarios.InternetConnection, defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE);
31
+ NotificationHandler.notifySuccess(NotificationScenarios.InternetConnection, (state === null || state === void 0 ? void 0 : (_state$domainStates2 = state.domainStates) === null || _state$domainStates2 === void 0 ? void 0 : (_state$domainStates2$ = _state$domainStates2.middlewareLocalizedTexts) === null || _state$domainStates2$ === void 0 ? void 0 : _state$domainStates2$.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE) ?? defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE);
30
32
  BroadcastService.postMessage({
31
33
  eventName: BroadcastEvent.NetworkReconnected
32
34
  });
@@ -54,8 +54,15 @@ import { startProactiveChat } from "../common/startProactiveChat";
54
54
  import useChatAdapterStore from "../../../hooks/useChatAdapterStore";
55
55
  import useChatContextStore from "../../../hooks/useChatContextStore";
56
56
  import useFacadeSDKStore from "../../../hooks/useFacadeChatSDKStore";
57
+ let uiTimer;
57
58
  export const LiveChatWidgetStateful = props => {
58
59
  var _props$webChatContain, _props$styleProps, _props$controlProps, _props$controlProps3, _state$appStates7, _props$webChatContain5, _state$appStates14, _props$webChatContain7, _props$webChatContain8, _props$controlProps12, _props$draggableChatW, _props$draggableChatW2, _props$draggableChatW3, _props$draggableChatW4, _props$draggableChatW5, _livechatProps$webCha, _props$webChatContain9, _props$webChatContain10, _props$webChatContain11, _props$webChatContain12, _livechatProps$styleP, _livechatProps$contro, _livechatProps$contro2, _livechatProps$compon, _livechatProps$contro3, _livechatProps$compon2, _livechatProps$contro4, _livechatProps$compon3, _livechatProps$contro5, _livechatProps$compon4, _livechatProps$contro6, _livechatProps$compon5, _livechatProps$contro7, _livechatProps$compon6, _livechatProps$contro8, _livechatProps$compon7, _livechatProps$contro9, _livechatProps$compon8, _livechatProps$contro10, _livechatProps$contro11, _livechatProps$compon9, _livechatProps$contro12, _livechatProps$compon10, _livechatProps$contro13, _livechatProps$compon11, _livechatProps$compon12, _livechatProps$compon13;
60
+ useEffect(() => {
61
+ uiTimer = createTimer();
62
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
63
+ Event: TelemetryEvent.UXLivechatwidgetStart
64
+ });
65
+ }, []);
59
66
  const [state, dispatch] = useChatContextStore();
60
67
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
68
  const [adapter, setAdapter] = useChatAdapterStore();
@@ -212,7 +219,7 @@ export const LiveChatWidgetStateful = props => {
212
219
  state.domainStates.confirmationState = ConfirmationState.NotSet;
213
220
  setupClientDataStore();
214
221
  registerTelemetryLoggers(props, dispatch);
215
- createInternetConnectionChangeHandler();
222
+ createInternetConnectionChangeHandler(state);
216
223
  dispatch({
217
224
  type: LiveChatWidgetActionType.SET_WIDGET_ELEMENT_ID,
218
225
  payload: widgetElementId
@@ -574,6 +581,26 @@ export const LiveChatWidgetStateful = props => {
574
581
  eventName: BroadcastEvent.NewMessageNotification
575
582
  });
576
583
  });
584
+ facadeChatSDK === null || facadeChatSDK === void 0 ? void 0 : facadeChatSDK.onAgentEndSession(event => {
585
+ var _inMemoryState$appSta6;
586
+ const inMemoryState = executeReducer(state, {
587
+ type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
588
+ payload: null
589
+ });
590
+ if ("participantsRemoved" in event && (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$appSta6 = inMemoryState.appStates) === null || _inMemoryState$appSta6 === void 0 ? void 0 : _inMemoryState$appSta6.conversationState) === ConversationState.Active) {
591
+ setWebChatStyles(styles => {
592
+ return {
593
+ ...styles,
594
+ hideSendBox: true
595
+ };
596
+ });
597
+ TelemetryHelper.logSDKEvent(LogLevel.INFO, {
598
+ Event: TelemetryEvent.ParticipantsRemovedEvent,
599
+ Description: "Participants removed event received."
600
+ });
601
+ return;
602
+ }
603
+ });
577
604
  }
578
605
  if (state.appStates.conversationState === ConversationState.InActive) {
579
606
  var _props$webChatContain2, _props$webChatContain3;
@@ -703,13 +730,13 @@ export const LiveChatWidgetStateful = props => {
703
730
 
704
731
  // Handle Chat disconnect cases
705
732
  useEffect(() => {
706
- var _inMemoryState$appSta6;
733
+ var _inMemoryState$appSta7;
707
734
  const inMemoryState = executeReducer(state, {
708
735
  type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
709
736
  payload: null
710
737
  });
711
738
  handleChatDisconnect(props, inMemoryState, setWebChatStyles);
712
- const chatDisconnectState = inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$appSta6 = inMemoryState.appStates) === null || _inMemoryState$appSta6 === void 0 ? void 0 : _inMemoryState$appSta6.chatDisconnectEventReceived;
739
+ const chatDisconnectState = inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$appSta7 = inMemoryState.appStates) === null || _inMemoryState$appSta7 === void 0 ? void 0 : _inMemoryState$appSta7.chatDisconnectEventReceived;
713
740
  if (chatDisconnectState && adapter) {
714
741
  try {
715
742
  adapter.end();
@@ -731,6 +758,12 @@ export const LiveChatWidgetStateful = props => {
731
758
  payload: (_props$webChatContain6 = props.webChatContainerProps) === null || _props$webChatContain6 === void 0 ? void 0 : _props$webChatContain6.renderingMiddlewareProps
732
759
  });
733
760
  }, [(_props$webChatContain7 = props.webChatContainerProps) === null || _props$webChatContain7 === void 0 ? void 0 : _props$webChatContain7.renderingMiddlewareProps]);
761
+ useEffect(() => {
762
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
763
+ Event: TelemetryEvent.UXLivechatwidgetCompleted,
764
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
765
+ });
766
+ }, []);
734
767
  const initiateEndChatOnBrowserUnload = () => {
735
768
  var _DataStoreManager$cli;
736
769
  TelemetryHelper.logActionEvent(LogLevel.INFO, {
@@ -775,7 +808,7 @@ export const LiveChatWidgetStateful = props => {
775
808
  const chatWidgetDraggableConfig = {
776
809
  elementId: widgetElementId,
777
810
  channel: ((_props$controlProps12 = props.controlProps) === null || _props$controlProps12 === void 0 ? void 0 : _props$controlProps12.widgetInstanceId) ?? "lcw",
778
- disabled: ((_props$draggableChatW = props.draggableChatWidgetProps) === null || _props$draggableChatW === void 0 ? void 0 : _props$draggableChatW.disabled) === true ?? false // Draggable by default, unless explicitly disabled
811
+ disabled: ((_props$draggableChatW = props.draggableChatWidgetProps) === null || _props$draggableChatW === void 0 ? void 0 : _props$draggableChatW.disabled) !== true // Draggable by default, unless explicitly disabled
779
812
  };
780
813
 
781
814
  // Disable receiving IDraggableEvent in current window
@@ -1,16 +1,23 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useEffect } from "react";
3
+ import { createTimer, findAllFocusableElement } from "../../common/utils";
3
4
  import { LoadingPane } from "@microsoft/omnichannel-chat-components";
4
5
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
5
6
  import { defaultGeneralLoadingPaneStyleProps } from "./common/defaultStyleProps/defaultgeneralLoadingPaneStyleProps";
6
- import { findAllFocusableElement } from "../../common/utils";
7
+ import { errorUILoadingPaneStyleProps } from "./common/errorUIStyleProps/errorUILoadingPaneStyleProps";
7
8
  import useChatContextStore from "../../hooks/useChatContextStore";
8
9
  import useWindowDimensions from "../../hooks/useWindowDimensions";
9
- import { errorUILoadingPaneStyleProps } from "./common/errorUIStyleProps/errorUILoadingPaneStyleProps";
10
+ let uiTimer;
10
11
 
11
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
13
  export const LoadingPaneStateful = props => {
13
14
  var _loadingPaneProps$sty, _startChatErrorPanePr, _startChatErrorPanePr2;
15
+ useEffect(() => {
16
+ uiTimer = createTimer();
17
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
18
+ Event: TelemetryEvent.UXLoadingPaneStart
19
+ });
20
+ }, []);
14
21
  const [state] = useChatContextStore();
15
22
  const {
16
23
  loadingPaneProps,
@@ -53,6 +60,16 @@ export const LoadingPaneStateful = props => {
53
60
  Event: TelemetryEvent.LoadingPaneLoaded,
54
61
  Description: "Loading pane loaded."
55
62
  });
63
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
64
+ Event: TelemetryEvent.UXLoadingPaneCompleted,
65
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
66
+ });
67
+ return () => {
68
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
69
+ Event: TelemetryEvent.LoadingPaneUnloaded,
70
+ Description: "Loading pane unmount."
71
+ });
72
+ };
56
73
  }, []);
57
74
  return /*#__PURE__*/React.createElement(LoadingPane, {
58
75
  componentOverrides: loadingPaneProps === null || loadingPaneProps === void 0 ? void 0 : loadingPaneProps.componentOverrides,
@@ -1,18 +1,26 @@
1
+ import { ConfirmationState, NotificationPaneConstants } from "../../common/Constants";
2
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
3
  import React, { useEffect, useRef } from "react";
4
+ import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
2
5
  import { NotificationPane } from "@microsoft/omnichannel-chat-components";
6
+ import { NotificationScenarios } from "../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
7
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
8
+ import { createTimer } from "../../common/utils";
9
+ import { defaultChatDisconnectControlProps } from "./defaultProps/defaultChatDisconnectControlProps";
10
+ import { defaultChatDisconnectStyleProps } from "./defaultProps/defaultChatDisconnectStyleProps";
3
11
  import { hooks } from "botframework-webchat";
4
12
  import { useCallback } from "react";
5
- import { NotificationScenarios } from "../webchatcontainerstateful/webchatcontroller/enums/NotificationScenarios";
6
13
  import useChatAdapterStore from "../../hooks/useChatAdapterStore";
7
14
  import useChatContextStore from "../../hooks/useChatContextStore";
8
- import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
9
- import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
10
- import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
11
- import { ConfirmationState, NotificationPaneConstants } from "../../common/Constants";
12
- import { defaultChatDisconnectStyleProps } from "./defaultProps/defaultChatDisconnectStyleProps";
13
- import { defaultChatDisconnectControlProps } from "./defaultProps/defaultChatDisconnectControlProps";
15
+ let uiTimer;
14
16
  export const NotificationPaneStateful = props => {
15
17
  var _state$domainStates, _state$domainStates3;
18
+ useEffect(() => {
19
+ uiTimer = createTimer();
20
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
21
+ Event: TelemetryEvent.UXNotificationPaneStart
22
+ });
23
+ }, []);
16
24
  const {
17
25
  notificationPaneProps,
18
26
  notificationScenarioType,
@@ -162,6 +170,12 @@ export const NotificationPaneStateful = props => {
162
170
  // TODO additional scenarios to be added...
163
171
  }
164
172
 
173
+ useEffect(() => {
174
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
175
+ Event: TelemetryEvent.UXNotificationPaneCompleted,
176
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
177
+ });
178
+ }, []);
165
179
  return /*#__PURE__*/React.createElement(NotificationPane, genericPropsObj);
166
180
  };
167
181
  export default NotificationPaneStateful;
@@ -1,12 +1,19 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useEffect } from "react";
3
+ import { createTimer, findAllFocusableElement } from "../../common/utils";
3
4
  import { OutOfOfficeHoursPane } from "@microsoft/omnichannel-chat-components";
4
5
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
5
6
  import { defaultGeneralStyleProps } from "./common/defaultStyleProps/defaultgeneralOOOHPaneStyleProps";
6
- import { findAllFocusableElement } from "../../common/utils";
7
7
  import useChatContextStore from "../../hooks/useChatContextStore";
8
+ let uiTimer;
8
9
  export const OutOfOfficeHoursPaneStateful = props => {
9
10
  var _props$styleProps;
11
+ useEffect(() => {
12
+ uiTimer = createTimer();
13
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
14
+ Event: TelemetryEvent.UXOOHPaneStart
15
+ });
16
+ }, []);
10
17
  const [state] = useChatContextStore();
11
18
  const generalStyleProps = Object.assign({}, defaultGeneralStyleProps, (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyleProps);
12
19
  const styleProps = {
@@ -28,6 +35,10 @@ export const OutOfOfficeHoursPaneStateful = props => {
28
35
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
29
36
  Event: TelemetryEvent.OutOfOfficePaneLoaded
30
37
  });
38
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
39
+ Event: TelemetryEvent.UXOOHPaneCompleted,
40
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
41
+ });
31
42
  }, []);
32
43
  return /*#__PURE__*/React.createElement(OutOfOfficeHoursPane, {
33
44
  componentOverrides: props.componentOverrides,
@@ -1,12 +1,19 @@
1
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
2
  import React, { useEffect } from "react";
3
+ import { createTimer, findAllFocusableElement } from "../../common/utils";
2
4
  import { LoadingPane } from "@microsoft/omnichannel-chat-components";
5
+ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
3
6
  import { defaultGeneralPostChatLoadingPaneStyleProps } from "./common/defaultgeneralPostChatLoadingPaneStyleProps";
4
- import { findAllFocusableElement } from "../../common/utils";
5
7
  import useChatContextStore from "../../hooks/useChatContextStore";
6
- import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
7
- import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
8
+ let uiTimer;
8
9
  export const PostChatLoadingPaneStateful = props => {
9
10
  var _props$styleProps;
11
+ useEffect(() => {
12
+ uiTimer = createTimer();
13
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
14
+ Event: TelemetryEvent.UXPostChatLoadingPaneStart
15
+ });
16
+ }, []);
10
17
  const [state] = useChatContextStore();
11
18
  const generalStyleProps = Object.assign({}, defaultGeneralPostChatLoadingPaneStyleProps, (_props$styleProps = props.styleProps) === null || _props$styleProps === void 0 ? void 0 : _props$styleProps.generalStyleProps);
12
19
  const styleProps = {
@@ -33,6 +40,10 @@ export const PostChatLoadingPaneStateful = props => {
33
40
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
34
41
  Event: TelemetryEvent.PostChatSurveyLoadingPaneLoaded
35
42
  });
43
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
44
+ Event: TelemetryEvent.UXPostChatLoadingPaneCompleted,
45
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
46
+ });
36
47
  }, []);
37
48
  return /*#__PURE__*/React.createElement(LoadingPane, {
38
49
  componentOverrides: props.componentOverrides,
@@ -1,7 +1,7 @@
1
1
  import { HtmlAttributeNames, Regex } from "../../common/Constants";
2
2
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
3
3
  import React, { useEffect } from "react";
4
- import { extractPreChatSurveyResponseValues, findAllFocusableElement, getStateFromCache, getWidgetCacheId, isUndefinedOrEmpty, parseAdaptiveCardPayload } from "../../common/utils";
4
+ import { createTimer, extractPreChatSurveyResponseValues, findAllFocusableElement, getStateFromCache, getWidgetCacheId, isUndefinedOrEmpty, parseAdaptiveCardPayload } from "../../common/utils";
5
5
  import { ConversationState } from "../../contexts/common/ConversationState";
6
6
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
7
7
  import MarkdownIt from "markdown-it";
@@ -10,10 +10,18 @@ import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
10
10
  import { defaultGeneralPreChatSurveyPaneStyleProps } from "./common/defaultStyles/defaultGeneralPreChatSurveyPaneStyleProps";
11
11
  import { defaultPreChatSurveyLocalizedTexts } from "./common/defaultProps/defaultPreChatSurveyLocalizedTexts";
12
12
  import useChatContextStore from "../../hooks/useChatContextStore";
13
+ let uiTimer;
13
14
 
14
15
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
16
  export const PreChatSurveyPaneStateful = props => {
16
17
  var _surveyProps$stylePro, _props$surveyProps, _props$surveyProps$co;
18
+ useEffect(() => {
19
+ uiTimer = createTimer();
20
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
21
+ Event: TelemetryEvent.UXPrechatPaneStart
22
+ });
23
+ }, []);
24
+
17
25
  // Set MarkDown global variable to be used for prechat adaptive cards
18
26
  window["markdownit"] = MarkdownIt;
19
27
  const [state, dispatch] = useChatContextStore();
@@ -136,6 +144,10 @@ export const PreChatSurveyPaneStateful = props => {
136
144
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
137
145
  Event: TelemetryEvent.PrechatSurveyLoaded
138
146
  });
147
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
148
+ Event: TelemetryEvent.UXPrechatPaneCompleted,
149
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
150
+ });
139
151
  }, []);
140
152
  return /*#__PURE__*/React.createElement(PreChatSurveyPane, {
141
153
  controlProps: controlProps,
@@ -9,10 +9,17 @@ import { ProactiveChatPane } from "@microsoft/omnichannel-chat-components";
9
9
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
10
10
  import { TelemetryTimers } from "../../common/telemetry/TelemetryManager";
11
11
  import useChatContextStore from "../../hooks/useChatContextStore";
12
+ let uiTimer;
12
13
 
13
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
15
  export const ProactiveChatPaneStateful = props => {
15
16
  var _proactiveChatProps$c;
17
+ useEffect(() => {
18
+ uiTimer = createTimer();
19
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
20
+ Event: TelemetryEvent.UXProactiveChatPaneStart
21
+ });
22
+ }, []);
16
23
  const [state, dispatch] = useChatContextStore();
17
24
  const {
18
25
  proactiveChatProps,
@@ -114,6 +121,10 @@ export const ProactiveChatPaneStateful = props => {
114
121
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
115
122
  Event: TelemetryEvent.ProactiveChatPaneLoaded
116
123
  });
124
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
125
+ Event: TelemetryEvent.UXProactiveChatCompleted,
126
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
127
+ });
117
128
  return () => {
118
129
  clearTimeout(timeoutEvent);
119
130
  };
@@ -1,13 +1,21 @@
1
1
  import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
2
2
  import React, { useEffect } from "react";
3
+ import { createTimer, setFocusOnElement } from "../../common/utils";
3
4
  import { ConversationState } from "../../contexts/common/ConversationState";
4
5
  import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
5
6
  import { ReconnectChatPane } from "@microsoft/omnichannel-chat-components";
6
7
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
7
- import { setFocusOnElement } from "../../common/utils";
8
8
  import useChatContextStore from "../../hooks/useChatContextStore";
9
9
  import useFacadeChatSDKStore from "../../hooks/useFacadeChatSDKStore";
10
+ let uiTimer;
10
11
  export const ReconnectChatPaneStateful = props => {
12
+ useEffect(() => {
13
+ uiTimer = createTimer();
14
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
15
+ Event: TelemetryEvent.UXReconnectChatPaneStart,
16
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
17
+ });
18
+ }, []);
11
19
  const [state, dispatch] = useChatContextStore();
12
20
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
21
  //const chatSDK: any = useChatSDKStore();
@@ -91,6 +99,9 @@ export const ReconnectChatPaneStateful = props => {
91
99
  TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
92
100
  Event: TelemetryEvent.ReconnectChatPaneLoaded
93
101
  });
102
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
103
+ Event: TelemetryEvent.UXReconnectChatCompleted
104
+ });
94
105
  }, []);
95
106
  return /*#__PURE__*/React.createElement(ReconnectChatPane, {
96
107
  componentOverrides: reconnectChatProps === null || reconnectChatProps === void 0 ? void 0 : reconnectChatProps.componentOverrides,
@@ -1,18 +1,25 @@
1
+ import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
1
2
  import React, { useEffect } from "react";
3
+ import { createTimer, findAllFocusableElement } from "../../common/utils";
2
4
  import { LoadingPane } from "@microsoft/omnichannel-chat-components";
3
- import { findAllFocusableElement } from "../../common/utils";
4
- import useChatContextStore from "../../hooks/useChatContextStore";
5
+ import { StartChatErrorPaneConstants } from "../../common/Constants";
6
+ import { StartChatFailureType } from "../../contexts/common/StartChatFailureType";
5
7
  import { TelemetryHelper } from "../../common/telemetry/TelemetryHelper";
6
- import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
7
8
  import { defaultStartChatErrorPaneGeneralStyleProps } from "./common/defaultStartChatErrorPaneGeneralStyleProps";
8
- import { defaultStartChatErrorPaneTitleStyleProps } from "./common/defaultStartChatErrorPaneTitleStyleProps";
9
- import { defaultStartChatErrorPaneSubtitleStyleProps } from "./common/defaultStartChatErrorPaneSubtitleStyleProps";
10
- import { defaultStartChatErrorPaneIconStyleProps } from "./common/defaultStartChatErrorPaneIconStyleProps";
11
9
  import { defaultStartChatErrorPaneIconImageStyleProps } from "./common/defaultStartChatErrorPaneIconImageProps";
12
- import { StartChatErrorPaneConstants } from "../../common/Constants";
13
- import { StartChatFailureType } from "../../contexts/common/StartChatFailureType";
10
+ import { defaultStartChatErrorPaneIconStyleProps } from "./common/defaultStartChatErrorPaneIconStyleProps";
11
+ import { defaultStartChatErrorPaneSubtitleStyleProps } from "./common/defaultStartChatErrorPaneSubtitleStyleProps";
12
+ import { defaultStartChatErrorPaneTitleStyleProps } from "./common/defaultStartChatErrorPaneTitleStyleProps";
13
+ import useChatContextStore from "../../hooks/useChatContextStore";
14
+ let uiTimer;
14
15
  export const StartChatErrorPaneStateful = startChatErrorPaneProps => {
15
16
  var _startChatErrorPanePr, _startChatErrorPanePr2, _startChatErrorPanePr3, _startChatErrorPanePr4, _startChatErrorPanePr5, _startChatErrorPanePr6, _startChatErrorPanePr7, _startChatErrorPanePr8, _startChatErrorPanePr9, _startChatErrorPanePr10, _startChatErrorPanePr11;
17
+ useEffect(() => {
18
+ uiTimer = createTimer();
19
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
20
+ Event: TelemetryEvent.UXStartChatErrorPaneStart
21
+ });
22
+ }, []);
16
23
  const [state] = useChatContextStore();
17
24
  const generalStyleProps = Object.assign({}, defaultStartChatErrorPaneGeneralStyleProps, startChatErrorPaneProps === null || startChatErrorPaneProps === void 0 ? void 0 : (_startChatErrorPanePr = startChatErrorPaneProps.styleProps) === null || _startChatErrorPanePr === void 0 ? void 0 : _startChatErrorPanePr.generalStyleProps);
18
25
  const titleStyleProps = Object.assign({}, defaultStartChatErrorPaneTitleStyleProps, startChatErrorPaneProps === null || startChatErrorPaneProps === void 0 ? void 0 : (_startChatErrorPanePr2 = startChatErrorPaneProps.styleProps) === null || _startChatErrorPanePr2 === void 0 ? void 0 : _startChatErrorPanePr2.titleStyleProps);
@@ -61,6 +68,10 @@ export const StartChatErrorPaneStateful = startChatErrorPaneProps => {
61
68
  Event: TelemetryEvent.StartChatErrorPaneLoaded,
62
69
  Description: "Start chat error pane loaded."
63
70
  });
71
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
72
+ Event: TelemetryEvent.UXStartChatErrorCompleted,
73
+ ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
74
+ });
64
75
  }, []);
65
76
  return /*#__PURE__*/React.createElement(LoadingPane, {
66
77
  componentOverrides: startChatErrorPaneProps === null || startChatErrorPaneProps === void 0 ? void 0 : startChatErrorPaneProps.componentOverrides,