@microsoft/omnichannel-chat-widget 1.6.5-main.fbe38da → 1.6.6-main.a655e3b

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.
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.setTabIndices = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseLowerCaseString = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.formatTemplateString = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.createFileAndDownload = exports.checkContactIdError = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
6
+ exports.setTabIndices = exports.setOcUserAgent = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseLowerCaseString = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isUndefinedOrEmpty = exports.isNullOrUndefined = exports.isNullOrEmptyString = exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = exports.getConversationDetailsCall = exports.getBroadcastChannelName = exports.formatTemplateString = exports.findParentFocusableElementsWithoutChildContainer = exports.findAllFocusableElement = exports.extractPreChatSurveyResponseValues = exports.escapeHtml = exports.debounceLeading = exports.createTimer = exports.createFileAndDownload = exports.checkContactIdError = exports.changeLanguageCodeFormatForWebChat = exports.addDelayInMs = void 0;
7
7
  var _Constants = require("./Constants");
8
8
  var _TelemetryConstants = require("./telemetry/TelemetryConstants");
9
9
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
@@ -458,4 +458,18 @@ exports.formatTemplateString = formatTemplateString;
458
458
  const parseLowerCaseString = property => {
459
459
  return String(property).toLowerCase();
460
460
  };
461
- exports.parseLowerCaseString = parseLowerCaseString;
461
+ exports.parseLowerCaseString = parseLowerCaseString;
462
+ const setOcUserAgent = chatSDK => {
463
+ var _chatSDK$OCClient, _chatSDK$OCClient2;
464
+ // eslint-disable-line @typescript-eslint/no-explicit-any
465
+ if ((_chatSDK$OCClient = chatSDK.OCClient) !== null && _chatSDK$OCClient !== void 0 && _chatSDK$OCClient.ocUserAgent && !((_chatSDK$OCClient2 = chatSDK.OCClient) !== null && _chatSDK$OCClient2 !== void 0 && _chatSDK$OCClient2.ocUserAgent.join(" ").includes("omnichannel-chat-widget/"))) {
466
+ try {
467
+ const version = require("../../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
468
+ const userAgent = `omnichannel-chat-widget/${version}`;
469
+ chatSDK.OCClient.ocUserAgent = [userAgent, ...chatSDK.OCClient.ocUserAgent];
470
+ } catch (error) {
471
+ console.warn(error);
472
+ }
473
+ }
474
+ };
475
+ exports.setOcUserAgent = setOcUserAgent;
@@ -6,21 +6,27 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.prepareEndChat = exports.endVoiceVideoCallIfOngoing = exports.endChatStateCleanUp = exports.endChat = exports.closeChatStateCleanUp = exports.chatSDKStateCleanUp = exports.callingStateCleanUp = void 0;
7
7
  var _Constants = require("../../../common/Constants");
8
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
- var _authHelper = require("./authHelper");
10
9
  var _utils = require("../../../common/utils");
11
10
  var _renderSurveyHelpers = require("./renderSurveyHelpers");
12
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
13
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
14
13
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
15
14
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
15
+ var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
16
16
  var _WebChatStoreLoader = require("../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader");
17
17
  var _defaultWebChatContainerStatefulProps = require("../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps");
18
- var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
18
+ var _createReducer = require("../../../contexts/createReducer");
19
+ var _authHelper = require("./authHelper");
20
+ var _reconnectChatHelper = require("./reconnectChatHelper");
19
21
  var _omnichannelChatSdk = require("@microsoft/omnichannel-chat-sdk");
20
22
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
23
  const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter) => {
22
24
  try {
23
25
  var _conversationDetails$, _state$domainStates, _state$appStates3;
26
+ const {
27
+ chatConfig
28
+ } = props;
29
+
24
30
  // Use Case: If call is ongoing, end the call by simulating end call button click
25
31
  endVoiceVideoCallIfOngoing(chatSDK, dispatch);
26
32
  const conversationDetails = await (0, _utils.getConversationDetailsCall)(chatSDK);
@@ -80,12 +86,25 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
80
86
  Description: `${_Constants.PrepareEndChatDescriptionConstants.ConversationEndedByCustomerWithInvalidPostChat} ${state === null || state === void 0 ? void 0 : (_state$appStates4 = state.appStates) === null || _state$appStates4 === void 0 ? void 0 : _state$appStates4.conversationEndedBy}.`
81
87
  });
82
88
  }
83
- endChat(props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, false, true, true);
89
+ const persistentEnabled = (0, _reconnectChatHelper.isPersistentEnabled)(chatConfig);
90
+ const {
91
+ appStates
92
+ } = (0, _createReducer.executeReducer)(state, {
93
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
94
+ payload: undefined
95
+ });
96
+ const endedByCustomer = (appStates === null || appStates === void 0 ? void 0 : appStates.conversationEndedBy) === "Customer";
84
97
 
85
- // Initiate post chat render
86
- if (postchatContext) {
87
- await (0, _renderSurveyHelpers.initiatePostChat)(props, conversationDetails, state, dispatch, postchatContext);
88
- return;
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ const commonParams = [props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter];
100
+ if (persistentEnabled && endedByCustomer) {
101
+ await endChat(...commonParams, true, false, true);
102
+ } else {
103
+ await endChat(...commonParams, false, true, true);
104
+ if (postchatContext) {
105
+ await (0, _renderSurveyHelpers.initiatePostChat)(props, conversationDetails, state, dispatch, postchatContext);
106
+ return;
107
+ }
89
108
  }
90
109
  } catch (error) {
91
110
  var _props$controlProps;
@@ -63,7 +63,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
63
63
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
64
64
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
65
65
  const LiveChatWidgetStateful = props => {
66
- 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, _props$webChatContain9, _props$webChatContain10, _props$webChatContain11, _props$webChatContain12, _livechatProps$webCha, _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;
66
+ 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;
67
67
  const [state, dispatch] = (0, _useChatContextStore.default)();
68
68
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
69
  const [adapter, setAdapter] = (0, _useChatAdapterStore.default)();
@@ -358,7 +358,19 @@ const LiveChatWidgetStateful = props => {
358
358
 
359
359
  // Start chat from SDK Event
360
360
  _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.StartChat).subscribe(msg => {
361
- var _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
361
+ var _props$chatConfig4, _props$chatConfig4$Li, _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
362
+ // If chat is out of operating hours chat widget sets the conversation state to OutOfOffice.
363
+ if ((props === null || props === void 0 ? void 0 : (_props$chatConfig4 = props.chatConfig) === null || _props$chatConfig4 === void 0 ? void 0 : (_props$chatConfig4$Li = _props$chatConfig4.LiveWSAndLiveChatEngJoin) === null || _props$chatConfig4$Li === void 0 ? void 0 : _props$chatConfig4$Li.OutOfOperatingHours.toLowerCase()) === "true") {
364
+ (state === null || state === void 0 ? void 0 : state.appStates.isMinimized) && dispatch({
365
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
366
+ payload: false
367
+ });
368
+ dispatch({
369
+ type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
370
+ payload: _ConversationState.ConversationState.OutOfOffice
371
+ });
372
+ return;
373
+ }
362
374
  // If the startChat event is not initiated by the same tab. Ignore the call
363
375
  if (!(0, _utils.isNullOrUndefined)(msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload6 = msg.payload) === null || _msg$payload6 === void 0 ? void 0 : _msg$payload6.runtimeId) !== _TelemetryManager.TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
364
376
  return;
@@ -718,7 +730,13 @@ const LiveChatWidgetStateful = props => {
718
730
  draggable: ((_props$draggableChatW5 = props.draggableChatWidgetProps) === null || _props$draggableChatW5 === void 0 ? void 0 : _props$draggableChatW5.disabled) !== true // Draggable by default, unless explicitly disabled
719
731
  };
720
732
 
721
- return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement("style", null, `
733
+ // Add 'omnichannel-chat-widget' OC User Agent if not already set
734
+ (0, _utils.setOcUserAgent)(chatSDK);
735
+ const directLine = ((_livechatProps$webCha = livechatProps.webChatContainerProps) === null || _livechatProps$webCha === void 0 ? void 0 : _livechatProps$webCha.directLine) ?? adapter ?? _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.directLine;
736
+ const userID = directLine.getState ? directLine === null || directLine === void 0 ? void 0 : directLine.getState("acs.userId") : "teamsvisitor";
737
+
738
+ // WebChat's Composer can only be rendered if a directLine object is defined
739
+ return directLine && /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement("style", null, `
722
740
  ::-webkit-scrollbar {
723
741
  width: ${scrollbarProps.width};
724
742
  }
@@ -745,12 +763,13 @@ const LiveChatWidgetStateful = props => {
745
763
  }
746
764
  }
747
765
  `), /*#__PURE__*/_react2.default.createElement(_DraggableChatWidget.default, chatWidgetDraggableConfig, /*#__PURE__*/_react2.default.createElement(Composer, _extends({}, webChatProps, {
766
+ userID: userID,
748
767
  styleOptions: {
749
768
  ...webChatStyles,
750
769
  bubbleBackground: ((_props$webChatContain9 = props.webChatContainerProps) === null || _props$webChatContain9 === void 0 ? void 0 : (_props$webChatContain10 = _props$webChatContain9.adaptiveCardStyles) === null || _props$webChatContain10 === void 0 ? void 0 : _props$webChatContain10.background) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.background,
751
770
  bubbleTextColor: ((_props$webChatContain11 = props.webChatContainerProps) === null || _props$webChatContain11 === void 0 ? void 0 : (_props$webChatContain12 = _props$webChatContain11.adaptiveCardStyles) === null || _props$webChatContain12 === void 0 ? void 0 : _props$webChatContain12.color) ?? _defaultAdaptiveCardStyles.defaultAdaptiveCardStyles.color
752
771
  },
753
- directLine: ((_livechatProps$webCha = livechatProps.webChatContainerProps) === null || _livechatProps$webCha === void 0 ? void 0 : _livechatProps$webCha.directLine) ?? adapter ?? _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.directLine
772
+ directLine: directLine
754
773
  }), /*#__PURE__*/_react2.default.createElement(_react.Stack, {
755
774
  id: widgetElementId,
756
775
  styles: generalStyles,
@@ -34,6 +34,31 @@ const defaultWebChatStyles = {
34
34
  suggestedActionsStackedHeight: 125,
35
35
  suggestedActionsStackedOverflow: "scroll",
36
36
  // eslint-disable-line @typescript-eslint/no-explicit-any
37
- typingAnimationDuration: 3500
37
+ typingAnimationDuration: 3500,
38
+ emojiSet: {
39
+ ":)": "😊",
40
+ ":-)": "😊",
41
+ "(:": "😊",
42
+ "(-:": "😊",
43
+ ":-|": "😐",
44
+ ":|": "😐",
45
+ ":-(": "â˜šī¸",
46
+ ":(": "â˜šī¸",
47
+ ":-D": "😀",
48
+ ":D": "😀",
49
+ ":-p": "😛",
50
+ ":p": "😛",
51
+ ":-P": "😛",
52
+ ":P": "😛",
53
+ ":-o": "😲",
54
+ ":o": "😲",
55
+ ":O": "😲",
56
+ ":-O": "😲",
57
+ ";-)": "😉",
58
+ ";)": "😉",
59
+ "<3": "â¤ī¸",
60
+ "</3": "💔",
61
+ "<\\3": "💔"
62
+ }
38
63
  };
39
64
  exports.defaultWebChatStyles = defaultWebChatStyles;
@@ -64,6 +64,12 @@ class TranscriptHTMLBuilder {
64
64
  this.disableNewLineMarkdownSupport = this.options.disableNewLineMarkdownSupport;
65
65
  }
66
66
  }
67
+ createMetaElement() {
68
+ const htmlData = `
69
+ <meta charset="UTF-8">
70
+ `;
71
+ return htmlData;
72
+ }
67
73
  createTitleElement() {
68
74
  const htmlData = `<title> ${this.pageTitle} </title>`;
69
75
  return htmlData;
@@ -81,6 +87,7 @@ class TranscriptHTMLBuilder {
81
87
  createHeadElement() {
82
88
  const htmlData = `
83
89
  <head>
90
+ ${this.createMetaElement()}
84
91
  ${this.createTitleElement()}
85
92
  ${this.createExternalScriptElements()}
86
93
  <script>
@@ -421,4 +421,17 @@ export const formatTemplateString = (templateMessage, values) => {
421
421
  };
422
422
  export const parseLowerCaseString = property => {
423
423
  return String(property).toLowerCase();
424
+ };
425
+ export const setOcUserAgent = chatSDK => {
426
+ var _chatSDK$OCClient, _chatSDK$OCClient2;
427
+ // eslint-disable-line @typescript-eslint/no-explicit-any
428
+ if ((_chatSDK$OCClient = chatSDK.OCClient) !== null && _chatSDK$OCClient !== void 0 && _chatSDK$OCClient.ocUserAgent && !((_chatSDK$OCClient2 = chatSDK.OCClient) !== null && _chatSDK$OCClient2 !== void 0 && _chatSDK$OCClient2.ocUserAgent.join(" ").includes("omnichannel-chat-widget/"))) {
429
+ try {
430
+ const version = require("../../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
431
+ const userAgent = `omnichannel-chat-widget/${version}`;
432
+ chatSDK.OCClient.ocUserAgent = [userAgent, ...chatSDK.OCClient.ocUserAgent];
433
+ } catch (error) {
434
+ console.warn(error);
435
+ }
436
+ }
424
437
  };
@@ -1,21 +1,27 @@
1
1
  import { ConfirmationState, Constants, ConversationEndEntity, ParticipantType, PrepareEndChatDescriptionConstants } from "../../../common/Constants";
2
2
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
- import { handleAuthentication } from "./authHelper";
4
3
  import { getConversationDetailsCall, getWidgetEndChatEventName } from "../../../common/utils";
5
4
  import { getPostChatContext, initiatePostChat } from "./renderSurveyHelpers";
6
5
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
7
6
  import { ConversationState } from "../../../contexts/common/ConversationState";
8
7
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
9
8
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
9
+ import { TelemetryManager } from "../../../common/telemetry/TelemetryManager";
10
10
  import { WebChatStoreLoader } from "../../webchatcontainerstateful/webchatcontroller/WebChatStoreLoader";
11
11
  import { defaultWebChatContainerStatefulProps } from "../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps";
12
- import { TelemetryManager } from "../../../common/telemetry/TelemetryManager";
12
+ import { executeReducer } from "../../../contexts/createReducer";
13
+ import { handleAuthentication } from "./authHelper";
14
+ import { isPersistentEnabled } from "./reconnectChatHelper";
13
15
  import { uuidv4 } from "@microsoft/omnichannel-chat-sdk";
14
16
 
15
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
18
  const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter) => {
17
19
  try {
18
20
  var _conversationDetails$, _state$domainStates, _state$appStates3;
21
+ const {
22
+ chatConfig
23
+ } = props;
24
+
19
25
  // Use Case: If call is ongoing, end the call by simulating end call button click
20
26
  endVoiceVideoCallIfOngoing(chatSDK, dispatch);
21
27
  const conversationDetails = await getConversationDetailsCall(chatSDK);
@@ -75,12 +81,25 @@ const prepareEndChat = async (props, chatSDK, state, dispatch, setAdapter, setWe
75
81
  Description: `${PrepareEndChatDescriptionConstants.ConversationEndedByCustomerWithInvalidPostChat} ${state === null || state === void 0 ? void 0 : (_state$appStates4 = state.appStates) === null || _state$appStates4 === void 0 ? void 0 : _state$appStates4.conversationEndedBy}.`
76
82
  });
77
83
  }
78
- endChat(props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, false, true, true);
84
+ const persistentEnabled = isPersistentEnabled(chatConfig);
85
+ const {
86
+ appStates
87
+ } = executeReducer(state, {
88
+ type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
89
+ payload: undefined
90
+ });
91
+ const endedByCustomer = (appStates === null || appStates === void 0 ? void 0 : appStates.conversationEndedBy) === "Customer";
79
92
 
80
- // Initiate post chat render
81
- if (postchatContext) {
82
- await initiatePostChat(props, conversationDetails, state, dispatch, postchatContext);
83
- return;
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ const commonParams = [props, chatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter];
95
+ if (persistentEnabled && endedByCustomer) {
96
+ await endChat(...commonParams, true, false, true);
97
+ } else {
98
+ await endChat(...commonParams, false, true, true);
99
+ if (postchatContext) {
100
+ await initiatePostChat(props, conversationDetails, state, dispatch, postchatContext);
101
+ return;
102
+ }
84
103
  }
85
104
  } catch (error) {
86
105
  var _props$controlProps;
@@ -6,7 +6,7 @@ import { ConfirmationState, Constants, ConversationEndEntity, E2VVOptions, LiveW
6
6
  import { Stack } from "@fluentui/react";
7
7
  import React, { useEffect, useRef, useState } from "react";
8
8
  import { checkIfConversationStillValid, initStartChat, prepareStartChat, setPreChatAndInitiateChat } from "../common/startChat";
9
- import { createTimer, getBroadcastChannelName, getConversationDetailsCall, getLocaleDirection, getStateFromCache, getWidgetCacheIdfromProps, getWidgetEndChatEventName, isNullOrEmptyString, isNullOrUndefined, isUndefinedOrEmpty } from "../../../common/utils";
9
+ import { createTimer, getBroadcastChannelName, getConversationDetailsCall, getLocaleDirection, getStateFromCache, getWidgetCacheIdfromProps, getWidgetEndChatEventName, isNullOrEmptyString, isNullOrUndefined, isUndefinedOrEmpty, setOcUserAgent } from "../../../common/utils";
10
10
  import { defaultClientDataStoreProvider, isCookieAllowed } from "../../../common/storage/default/defaultClientDataStoreProvider";
11
11
  import { chatSDKStateCleanUp, endChat, endChatStateCleanUp, prepareEndChat } from "../common/endChat";
12
12
  import { handleChatReconnect, isPersistentEnabled, isReconnectEnabled } from "../common/reconnectChatHelper";
@@ -55,7 +55,7 @@ import StartChatErrorPaneStateful from "../../startchaterrorpanestateful/StartCh
55
55
  import { StartChatFailureType } from "../../../contexts/common/StartChatFailureType";
56
56
  import { executeReducer } from "../../../contexts/createReducer";
57
57
  export const LiveChatWidgetStateful = props => {
58
- 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, _props$webChatContain9, _props$webChatContain10, _props$webChatContain11, _props$webChatContain12, _livechatProps$webCha, _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;
58
+ 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;
59
59
  const [state, dispatch] = useChatContextStore();
60
60
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
61
  const [adapter, setAdapter] = useChatAdapterStore();
@@ -350,7 +350,19 @@ export const LiveChatWidgetStateful = props => {
350
350
 
351
351
  // Start chat from SDK Event
352
352
  BroadcastService.getMessageByEventName(BroadcastEvent.StartChat).subscribe(msg => {
353
- var _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
353
+ var _props$chatConfig4, _props$chatConfig4$Li, _msg$payload5, _msg$payload6, _msg$payload7, _msg$payload9, _inMemoryState$appSta, _inMemoryState$appSta2, _inMemoryState$appSta3, _inMemoryState$appSta4;
354
+ // If chat is out of operating hours chat widget sets the conversation state to OutOfOffice.
355
+ if ((props === null || props === void 0 ? void 0 : (_props$chatConfig4 = props.chatConfig) === null || _props$chatConfig4 === void 0 ? void 0 : (_props$chatConfig4$Li = _props$chatConfig4.LiveWSAndLiveChatEngJoin) === null || _props$chatConfig4$Li === void 0 ? void 0 : _props$chatConfig4$Li.OutOfOperatingHours.toLowerCase()) === "true") {
356
+ (state === null || state === void 0 ? void 0 : state.appStates.isMinimized) && dispatch({
357
+ type: LiveChatWidgetActionType.SET_MINIMIZED,
358
+ payload: false
359
+ });
360
+ dispatch({
361
+ type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
362
+ payload: ConversationState.OutOfOffice
363
+ });
364
+ return;
365
+ }
354
366
  // If the startChat event is not initiated by the same tab. Ignore the call
355
367
  if (!isNullOrUndefined(msg === null || msg === void 0 ? void 0 : (_msg$payload5 = msg.payload) === null || _msg$payload5 === void 0 ? void 0 : _msg$payload5.runtimeId) && (msg === null || msg === void 0 ? void 0 : (_msg$payload6 = msg.payload) === null || _msg$payload6 === void 0 ? void 0 : _msg$payload6.runtimeId) !== TelemetryManager.InternalTelemetryData.lcwRuntimeId) {
356
368
  return;
@@ -710,7 +722,13 @@ export const LiveChatWidgetStateful = props => {
710
722
  draggable: ((_props$draggableChatW5 = props.draggableChatWidgetProps) === null || _props$draggableChatW5 === void 0 ? void 0 : _props$draggableChatW5.disabled) !== true // Draggable by default, unless explicitly disabled
711
723
  };
712
724
 
713
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, `
725
+ // Add 'omnichannel-chat-widget' OC User Agent if not already set
726
+ setOcUserAgent(chatSDK);
727
+ const directLine = ((_livechatProps$webCha = livechatProps.webChatContainerProps) === null || _livechatProps$webCha === void 0 ? void 0 : _livechatProps$webCha.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine;
728
+ const userID = directLine.getState ? directLine === null || directLine === void 0 ? void 0 : directLine.getState("acs.userId") : "teamsvisitor";
729
+
730
+ // WebChat's Composer can only be rendered if a directLine object is defined
731
+ return directLine && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, `
714
732
  ::-webkit-scrollbar {
715
733
  width: ${scrollbarProps.width};
716
734
  }
@@ -737,12 +755,13 @@ export const LiveChatWidgetStateful = props => {
737
755
  }
738
756
  }
739
757
  `), /*#__PURE__*/React.createElement(DraggableChatWidget, chatWidgetDraggableConfig, /*#__PURE__*/React.createElement(Composer, _extends({}, webChatProps, {
758
+ userID: userID,
740
759
  styleOptions: {
741
760
  ...webChatStyles,
742
761
  bubbleBackground: ((_props$webChatContain9 = props.webChatContainerProps) === null || _props$webChatContain9 === void 0 ? void 0 : (_props$webChatContain10 = _props$webChatContain9.adaptiveCardStyles) === null || _props$webChatContain10 === void 0 ? void 0 : _props$webChatContain10.background) ?? defaultAdaptiveCardStyles.background,
743
762
  bubbleTextColor: ((_props$webChatContain11 = props.webChatContainerProps) === null || _props$webChatContain11 === void 0 ? void 0 : (_props$webChatContain12 = _props$webChatContain11.adaptiveCardStyles) === null || _props$webChatContain12 === void 0 ? void 0 : _props$webChatContain12.color) ?? defaultAdaptiveCardStyles.color
744
763
  },
745
- directLine: ((_livechatProps$webCha = livechatProps.webChatContainerProps) === null || _livechatProps$webCha === void 0 ? void 0 : _livechatProps$webCha.directLine) ?? adapter ?? defaultWebChatContainerStatefulProps.directLine
764
+ directLine: directLine
746
765
  }), /*#__PURE__*/React.createElement(Stack, {
747
766
  id: widgetElementId,
748
767
  styles: generalStyles,
@@ -28,5 +28,30 @@ export const defaultWebChatStyles = {
28
28
  suggestedActionsStackedHeight: 125,
29
29
  suggestedActionsStackedOverflow: "scroll",
30
30
  // eslint-disable-line @typescript-eslint/no-explicit-any
31
- typingAnimationDuration: 3500
31
+ typingAnimationDuration: 3500,
32
+ emojiSet: {
33
+ ":)": "😊",
34
+ ":-)": "😊",
35
+ "(:": "😊",
36
+ "(-:": "😊",
37
+ ":-|": "😐",
38
+ ":|": "😐",
39
+ ":-(": "â˜šī¸",
40
+ ":(": "â˜šī¸",
41
+ ":-D": "😀",
42
+ ":D": "😀",
43
+ ":-p": "😛",
44
+ ":p": "😛",
45
+ ":-P": "😛",
46
+ ":P": "😛",
47
+ ":-o": "😲",
48
+ ":o": "😲",
49
+ ":O": "😲",
50
+ ":-O": "😲",
51
+ ";-)": "😉",
52
+ ";)": "😉",
53
+ "<3": "â¤ī¸",
54
+ "</3": "💔",
55
+ "<\\3": "💔"
56
+ }
32
57
  };
@@ -60,6 +60,12 @@ class TranscriptHTMLBuilder {
60
60
  this.disableNewLineMarkdownSupport = this.options.disableNewLineMarkdownSupport;
61
61
  }
62
62
  }
63
+ createMetaElement() {
64
+ const htmlData = `
65
+ <meta charset="UTF-8">
66
+ `;
67
+ return htmlData;
68
+ }
63
69
  createTitleElement() {
64
70
  const htmlData = `<title> ${this.pageTitle} </title>`;
65
71
  return htmlData;
@@ -77,6 +83,7 @@ class TranscriptHTMLBuilder {
77
83
  createHeadElement() {
78
84
  const htmlData = `
79
85
  <head>
86
+ ${this.createMetaElement()}
80
87
  ${this.createTitleElement()}
81
88
  ${this.createExternalScriptElements()}
82
89
  <script>
@@ -43,3 +43,4 @@ export declare const createFileAndDownload: (fileName: string, blobData: string,
43
43
  */
44
44
  export declare const formatTemplateString: (templateMessage: string, values: any) => string;
45
45
  export declare const parseLowerCaseString: (property: string | boolean | undefined) => string;
46
+ export declare const setOcUserAgent: (chatSDK: any) => void;
@@ -1,3 +1,3 @@
1
1
  import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
2
- export declare const LiveChatWidgetStateful: (props: ILiveChatWidgetProps) => JSX.Element;
2
+ export declare const LiveChatWidgetStateful: (props: ILiveChatWidgetProps) => any;
3
3
  export default LiveChatWidgetStateful;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.6.5-main.fbe38da",
3
+ "version": "1.6.6-main.a655e3b",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -75,7 +75,7 @@
75
75
  },
76
76
  "dependencies": {
77
77
  "@microsoft/omnichannel-chat-components": "1.1.5",
78
- "@microsoft/omnichannel-chat-sdk": "^1.8.1",
78
+ "@microsoft/omnichannel-chat-sdk": "^1.8.3",
79
79
  "abort-controller-es5": "^2.0.1",
80
80
  "dompurify": "^2.3.4",
81
81
  "markdown-it": "^12.3.2",
@@ -85,8 +85,8 @@
85
85
  "md5-typescript": "^1.0.5",
86
86
  "p-defer-es5": "^2.0.1",
87
87
  "sanitize-html": "2.12.1",
88
- "slack-markdown-it": "^1.0.5",
89
- "simple-update-in": "2.2.0"
88
+ "simple-update-in": "2.2.0",
89
+ "slack-markdown-it": "^1.0.5"
90
90
  },
91
91
  "scripts": {
92
92
  "storybook": "start-storybook -p 6006",