@microsoft/omnichannel-chat-widget 1.8.2-main.fc93d3d → 1.8.3-main.3445895
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.
- package/README.md +46 -1
- package/lib/cjs/common/Constants.js +8 -2
- package/lib/cjs/common/telemetry/TelemetryConstants.js +3 -0
- package/lib/cjs/common/telemetry/TelemetryHelper.js +7 -5
- package/lib/cjs/common/utils.js +27 -2
- package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +4 -4
- package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +22 -9
- package/lib/cjs/components/livechatwidget/common/createMarkdown.js +54 -1
- package/lib/cjs/components/livechatwidget/common/customEventHandler.js +53 -0
- package/lib/cjs/components/livechatwidget/common/endChat.js +13 -2
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +8 -3
- package/lib/cjs/components/livechatwidget/common/renderSurveyHelpers.js +23 -0
- package/lib/cjs/components/livechatwidget/common/startChat.js +5 -4
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +16 -6
- package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +1 -2
- package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +3 -1
- package/lib/cjs/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +27 -2
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +42 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +72 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +41 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +45 -0
- package/lib/cjs/contexts/common/CustomEventType.js +1 -0
- package/lib/cjs/firstresponselatency/FirstMessageTrackerFromBot.js +101 -36
- package/lib/cjs/firstresponselatency/FirstResponseLatencyTracker.js +39 -21
- package/lib/cjs/firstresponselatency/util.js +24 -10
- package/lib/cjs/plugins/createChatTranscript.js +13 -0
- package/lib/cjs/plugins/newMessageEventHandler.js +2 -2
- package/lib/esm/common/Constants.js +8 -2
- package/lib/esm/common/telemetry/TelemetryConstants.js +3 -0
- package/lib/esm/common/telemetry/TelemetryHelper.js +7 -5
- package/lib/esm/common/utils.js +21 -0
- package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +4 -4
- package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +22 -9
- package/lib/esm/components/livechatwidget/common/createMarkdown.js +54 -1
- package/lib/esm/components/livechatwidget/common/customEventHandler.js +45 -0
- package/lib/esm/components/livechatwidget/common/endChat.js +13 -2
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +9 -4
- package/lib/esm/components/livechatwidget/common/renderSurveyHelpers.js +23 -0
- package/lib/esm/components/livechatwidget/common/startChat.js +5 -4
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +16 -6
- package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +1 -2
- package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +4 -2
- package/lib/esm/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +23 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.js +36 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +65 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.js +33 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +38 -0
- package/lib/esm/contexts/common/CustomEventType.js +1 -0
- package/lib/esm/firstresponselatency/FirstMessageTrackerFromBot.js +101 -36
- package/lib/esm/firstresponselatency/FirstResponseLatencyTracker.js +39 -21
- package/lib/esm/firstresponselatency/util.js +21 -8
- package/lib/esm/plugins/createChatTranscript.js +13 -0
- package/lib/esm/plugins/newMessageEventHandler.js +3 -3
- package/lib/types/common/Constants.d.ts +8 -2
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +3 -0
- package/lib/types/common/utils.d.ts +8 -0
- package/lib/types/components/livechatwidget/common/customEventHandler.d.ts +4 -0
- package/lib/types/components/webchatcontainerstateful/common/utils/chatAdapterUtils.d.ts +2 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware.d.ts +8 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +5 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware.d.ts +22 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +5 -0
- package/lib/types/contexts/common/CustomEventType.d.ts +6 -0
- package/lib/types/firstresponselatency/FirstResponseLatencyTracker.d.ts +2 -2
- package/lib/types/firstresponselatency/util.d.ts +1 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -223,6 +223,51 @@ const customizedFooterProp: IFooterProps = {
|
|
|
223
223
|
|
|
224
224
|
> :pushpin: Note that [WebChat hooks](https://github.com/microsoft/BotFramework-WebChat/blob/main/docs/HOOKS.md) can also be used in any custom components.
|
|
225
225
|
|
|
226
|
+
#### Bidirectional Custom Events
|
|
227
|
+
- Sending events from a hosting web page to bots/agents
|
|
228
|
+
- Register a function to post event
|
|
229
|
+
```js
|
|
230
|
+
//define sendCustomEvent function
|
|
231
|
+
const sendCustomEvent = (payload) => {
|
|
232
|
+
const customEvent = {
|
|
233
|
+
eventName: "sendCustomEvent",
|
|
234
|
+
payload
|
|
235
|
+
};
|
|
236
|
+
BroadcastService.postMessage(customEvent);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
//attach the sendCustomEvent function to window object
|
|
240
|
+
window["sendCustomEvent"] = sendCustomEvent;
|
|
241
|
+
|
|
242
|
+
//invoke the sendCustomEvent function with some customized payload
|
|
243
|
+
window.sendCustomEvent({
|
|
244
|
+
customEventName: "TestEvent",
|
|
245
|
+
customEventValue: {
|
|
246
|
+
boolVar: true,
|
|
247
|
+
displayableVar: {
|
|
248
|
+
isDisplayable: true,
|
|
249
|
+
value: "From C2: "+ new Date().toISOString()
|
|
250
|
+
},
|
|
251
|
+
numberVar: -10.5,
|
|
252
|
+
stringVar: "Hello from C2 str: " + new Date().toISOString()
|
|
253
|
+
}
|
|
254
|
+
})
|
|
255
|
+
```
|
|
256
|
+
- Receiving events from bots/agents
|
|
257
|
+
```js
|
|
258
|
+
//define setOnCustomEvent function
|
|
259
|
+
const setOnCustomEvent = (callback) => {
|
|
260
|
+
BroadcastService.getMessageByEventName("onCustomEvent").subscribe((event) => {
|
|
261
|
+
if (event && typeof callback === "function") {
|
|
262
|
+
callback(event);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
//set callback function
|
|
268
|
+
setOnCustomEvent((event) => console.log(event));
|
|
269
|
+
```
|
|
270
|
+
|
|
226
271
|
## See Also
|
|
227
272
|
|
|
228
273
|
[Customizations Dev Guide](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/customizations/getstarted.md)\
|
|
@@ -232,4 +277,4 @@ const customizedFooterProp: IFooterProps = {
|
|
|
232
277
|
[How to Add Visual Regression Tests](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/VisualRegressionTestingGuide.md)\
|
|
233
278
|
[Security](https://github.com/microsoft/omnichannel-chat-widget/blob/main/SECURITY.md)\
|
|
234
279
|
[Third Party Cookie Support](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/Tpc.md)\
|
|
235
|
-
[Storybook](https://microsoft.github.io/omnichannel-chat-widget/docs/storybook/)
|
|
280
|
+
[Storybook](https://microsoft.github.io/omnichannel-chat-widget/docs/storybook/)
|
|
@@ -32,6 +32,7 @@ _defineProperty(Constants, "webchatChannelId", "webchat");
|
|
|
32
32
|
_defineProperty(Constants, "markdown", "markdown");
|
|
33
33
|
_defineProperty(Constants, "actionType", "actionType");
|
|
34
34
|
_defineProperty(Constants, "markDownSystemMessageClass", "webchat__basic-transcript__activity-markdown-body");
|
|
35
|
+
_defineProperty(Constants, "MARKDOWN_LIST_INDENTATION", " ");
|
|
35
36
|
_defineProperty(Constants, "String", "string");
|
|
36
37
|
_defineProperty(Constants, "ChatMessagesJson", "chatMessagesJson");
|
|
37
38
|
_defineProperty(Constants, "truePascal", "True");
|
|
@@ -115,8 +116,7 @@ _defineProperty(Constants, "TargetRelationshipAttributes", "noopener noreferrer"
|
|
|
115
116
|
// Markdown icons
|
|
116
117
|
_defineProperty(Constants, "OpenLinkIconCssClass", "webchat__render-markdown__external-link-icon");
|
|
117
118
|
// internet connection test
|
|
118
|
-
_defineProperty(Constants, "
|
|
119
|
-
_defineProperty(Constants, "internetConnectionTestUrlText", "Omnichannel Connect Test");
|
|
119
|
+
_defineProperty(Constants, "internetConnectionTestPath", "/livechatwidget/version.txt");
|
|
120
120
|
_defineProperty(Constants, "ChatWidgetStateChangedPrefix", "ChatWidgetStateChanged");
|
|
121
121
|
_defineProperty(Constants, "PostChatLoadingDurationInMs", 2000);
|
|
122
122
|
_defineProperty(Constants, "BrowserUnloadConfirmationMessage", "Do you want to leave chat?");
|
|
@@ -132,6 +132,12 @@ _defineProperty(Constants, "InitContextParamsResponse", "initContextParamsRespon
|
|
|
132
132
|
_defineProperty(Constants, "OCOriginalMessageId", "OriginalMessageId");
|
|
133
133
|
_defineProperty(Constants, "WebchatSequenceIdAttribute", "webchat:sequence-id");
|
|
134
134
|
_defineProperty(Constants, "MessageSequenceIdOverride", "MessageSequenceIdOverride");
|
|
135
|
+
_defineProperty(Constants, "sendCustomEvent", "sendCustomEvent");
|
|
136
|
+
_defineProperty(Constants, "onCustomEvent", "onCustomEvent");
|
|
137
|
+
_defineProperty(Constants, "customEventName", "customEventName");
|
|
138
|
+
_defineProperty(Constants, "customEventValue", "customEventValue");
|
|
139
|
+
_defineProperty(Constants, "Hidden", "Hidden");
|
|
140
|
+
_defineProperty(Constants, "EndConversationDueToOverflow", "endconversationduetooverflow");
|
|
135
141
|
const Regex = (_class = /*#__PURE__*/_createClass(function Regex() {
|
|
136
142
|
_classCallCheck(this, Regex);
|
|
137
143
|
}), _defineProperty(_class, "EmailRegex", "^(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\])$"), _class);
|
|
@@ -190,10 +190,12 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
190
190
|
TelemetryEvent["BotAuthActivityUndefinedSignInId"] = "BotAuthActivityUndefinedSignInId";
|
|
191
191
|
TelemetryEvent["ThirdPartyCookiesBlocked"] = "ThirdPartyCookiesBlocked";
|
|
192
192
|
TelemetryEvent["ParticipantsRemovedEvent"] = "ParticipantsRemovedEvent";
|
|
193
|
+
TelemetryEvent["QueueOverflowEvent"] = "QueueOverflowEvent";
|
|
193
194
|
TelemetryEvent["ProcessingHTMLTextMiddlewareFailed"] = "ProcessingHTMLTextMiddlewareFailed";
|
|
194
195
|
TelemetryEvent["ProcessingSanitizationMiddlewareFailed"] = "ProcessingSanitizationMiddlewareFailed";
|
|
195
196
|
TelemetryEvent["FormatTagsMiddlewareJSONStringifyFailed"] = "FormatTagsMiddlewareJSONStringifyFailed";
|
|
196
197
|
TelemetryEvent["AttachmentUploadValidatorMiddlewareFailed"] = "AttachmentUploadValidatorMiddlewareFailed";
|
|
198
|
+
TelemetryEvent["CitationMiddlewareFailed"] = "CitationMiddlewareFailed";
|
|
197
199
|
TelemetryEvent["QueuePositionMessageRecieved"] = "QueuePositionMessageRecieved";
|
|
198
200
|
TelemetryEvent["AverageWaitTimeMessageRecieved"] = "AverageWaitTimeMessageRecieved";
|
|
199
201
|
TelemetryEvent["DataMaskingRuleApplied"] = "DataMaskingRuleApplied";
|
|
@@ -228,6 +230,7 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
228
230
|
TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
|
|
229
231
|
TelemetryEvent["RehydrateMessageReceived"] = "RehydrateMessageReceived";
|
|
230
232
|
TelemetryEvent["CustomContextReceived"] = "CustomContextReceived";
|
|
233
|
+
TelemetryEvent["CustomEventAction"] = "CustomEventAction";
|
|
231
234
|
TelemetryEvent["NetworkDisconnected"] = "NetworkDisconnected";
|
|
232
235
|
TelemetryEvent["NetworkReconnected"] = "NetworkReconnected";
|
|
233
236
|
TelemetryEvent["LinkModePostChatWorkflowStarted"] = "LinkModePostChatWorkflowStarted";
|
|
@@ -236,11 +236,13 @@ let TelemetryHelper = /*#__PURE__*/function () {
|
|
|
236
236
|
}, {
|
|
237
237
|
key: "postTelemetryEvent",
|
|
238
238
|
value: function postTelemetryEvent(eventName, logLevel, payload) {
|
|
239
|
+
var _TelemetryManager$Int16;
|
|
239
240
|
const telemetryEvent = {
|
|
240
241
|
eventName,
|
|
241
242
|
logLevel,
|
|
242
243
|
payload: {
|
|
243
|
-
...payload
|
|
244
|
+
...payload,
|
|
245
|
+
runtimeId: (_TelemetryManager$Int16 = _TelemetryManager.TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int16 === void 0 ? void 0 : _TelemetryManager$Int16.lcwRuntimeId
|
|
244
246
|
}
|
|
245
247
|
};
|
|
246
248
|
_omnichannelChatComponents.BroadcastService.postMessage(telemetryEvent);
|
|
@@ -267,11 +269,11 @@ _defineProperty(TelemetryHelper, "logActionEvent", (logLevel, payload) => {
|
|
|
267
269
|
TelemetryHelper.postTelemetryEvent((payload === null || payload === void 0 ? void 0 : payload.Event) ?? "", logLevel, payload);
|
|
268
270
|
});
|
|
269
271
|
_defineProperty(TelemetryHelper, "logSDKEvent", (logLevel, payload) => {
|
|
270
|
-
var _TelemetryManager$
|
|
272
|
+
var _TelemetryManager$Int17;
|
|
271
273
|
TelemetryHelper.postTelemetryEvent((payload === null || payload === void 0 ? void 0 : payload.Event) ?? "", logLevel, {
|
|
272
274
|
...payload,
|
|
273
275
|
TransactionId: (0, _utils.newGuid)(),
|
|
274
|
-
RequestId: (_TelemetryManager$
|
|
276
|
+
RequestId: (_TelemetryManager$Int17 = _TelemetryManager.TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int17 === void 0 ? void 0 : _TelemetryManager$Int17.currentRequestId
|
|
275
277
|
});
|
|
276
278
|
});
|
|
277
279
|
_defineProperty(TelemetryHelper, "logConfigDataEvent", (logLevel, payload) => {
|
|
@@ -306,12 +308,12 @@ _defineProperty(TelemetryHelper, "logFacadeChatSDKEventToAllTelemetry", (logLeve
|
|
|
306
308
|
});
|
|
307
309
|
});
|
|
308
310
|
_defineProperty(TelemetryHelper, "logSDKEventToAllTelemetry", (logLevel, payload) => {
|
|
309
|
-
var _TelemetryManager$
|
|
311
|
+
var _TelemetryManager$Int18;
|
|
310
312
|
TelemetryHelper.postTelemetryEvent((payload === null || payload === void 0 ? void 0 : payload.Event) ?? "", logLevel, {
|
|
311
313
|
...{
|
|
312
314
|
...payload,
|
|
313
315
|
TransactionId: (0, _utils.newGuid)(),
|
|
314
|
-
RequestId: (_TelemetryManager$
|
|
316
|
+
RequestId: (_TelemetryManager$Int18 = _TelemetryManager.TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int18 === void 0 ? void 0 : _TelemetryManager$Int18.currentRequestId
|
|
315
317
|
},
|
|
316
318
|
LogToAll: true
|
|
317
319
|
});
|
package/lib/cjs/common/utils.js
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
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.getCustomEventValue = 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
|
exports.getDeviceType = getDeviceType;
|
|
8
|
-
exports.
|
|
8
|
+
exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = void 0;
|
|
9
|
+
exports.isEndConversationDueToOverflowActivity = isEndConversationDueToOverflowActivity;
|
|
10
|
+
exports.setTabIndices = exports.setOcUserAgent = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseLowerCaseString = exports.parseAdaptiveCardPayload = exports.newGuid = exports.isValidCustomEvent = exports.isUndefinedOrEmpty = exports.isThisSessionPopout = exports.isNullOrUndefined = exports.isNullOrEmptyString = void 0;
|
|
9
11
|
var _Constants = require("./Constants");
|
|
10
12
|
var _TelemetryConstants = require("./telemetry/TelemetryConstants");
|
|
11
13
|
var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
|
|
@@ -494,4 +496,27 @@ function getDeviceType() {
|
|
|
494
496
|
} else {
|
|
495
497
|
return "standard";
|
|
496
498
|
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
//Bots expect a payload containing:
|
|
502
|
+
//1. customEventName: this should be string describe the event name
|
|
503
|
+
//2. customEventValue: given the value is from customer with unknown type, it is required to stringify the payload later
|
|
504
|
+
const isValidCustomEvent = payload => {
|
|
505
|
+
if (_Constants.Constants.customEventName in payload && payload.customEventName && typeof payload.customEventName === _Constants.Constants.String && _Constants.Constants.customEventValue in payload && payload.customEventValue) return true;
|
|
506
|
+
return false;
|
|
507
|
+
};
|
|
508
|
+
exports.isValidCustomEvent = isValidCustomEvent;
|
|
509
|
+
const getCustomEventValue = customEventPayload => {
|
|
510
|
+
let returnVal = "";
|
|
511
|
+
try {
|
|
512
|
+
returnVal = typeof customEventPayload.customEventValue === _Constants.Constants.String ? customEventPayload.customEventValue : JSON.stringify(customEventPayload.customEventValue);
|
|
513
|
+
} catch (error) {
|
|
514
|
+
console.error(error);
|
|
515
|
+
}
|
|
516
|
+
return returnVal;
|
|
517
|
+
};
|
|
518
|
+
exports.getCustomEventValue = getCustomEventValue;
|
|
519
|
+
function isEndConversationDueToOverflowActivity(activity) {
|
|
520
|
+
var _activity$channelData, _activity$channelData2;
|
|
521
|
+
return (activity === null || activity === void 0 ? void 0 : (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : _activity$channelData.tags) && Array.isArray(activity === null || activity === void 0 ? void 0 : (_activity$channelData2 = activity.channelData) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2.tags) && activity.channelData.tags.includes(_Constants.Constants.EndConversationDueToOverflow);
|
|
497
522
|
}
|
|
@@ -74,7 +74,6 @@ const ChatButtonStateful = props => {
|
|
|
74
74
|
};
|
|
75
75
|
const outOfOfficeStyleProps = Object.assign({}, _defaultOutOfOfficeChatButtonStyleProps.defaultOutOfOfficeChatButtonStyleProps, outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.styleProps);
|
|
76
76
|
const controlProps = {
|
|
77
|
-
...(buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.controlProps),
|
|
78
77
|
id: "oc-lcw-chat-button",
|
|
79
78
|
dir: state.domainStates.globalDir,
|
|
80
79
|
titleText: "Let's Chat!",
|
|
@@ -83,7 +82,8 @@ const ChatButtonStateful = props => {
|
|
|
83
82
|
unreadMessageCount: state.appStates.unreadMessageCount ? state.appStates.unreadMessageCount > _Constants.Constants.maximumUnreadMessageCount ? (_props$buttonProps = props.buttonProps) === null || _props$buttonProps === void 0 ? void 0 : (_props$buttonProps$co = _props$buttonProps.controlProps) === null || _props$buttonProps$co === void 0 ? void 0 : _props$buttonProps$co.largeUnreadMessageString : state.appStates.unreadMessageCount.toString() : "0",
|
|
84
83
|
unreadMessageString: (_props$buttonProps2 = props.buttonProps) === null || _props$buttonProps2 === void 0 ? void 0 : (_props$buttonProps2$c = _props$buttonProps2.controlProps) === null || _props$buttonProps2$c === void 0 ? void 0 : _props$buttonProps2$c.unreadMessageString,
|
|
85
84
|
// Regular chat button onClick - this will always take precedence
|
|
86
|
-
onClick: () => ref.current()
|
|
85
|
+
onClick: () => ref.current(),
|
|
86
|
+
...(buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.controlProps)
|
|
87
87
|
};
|
|
88
88
|
const outOfOfficeControlProps = {
|
|
89
89
|
// Only take specific properties from outOfOfficeButtonProps, never onClick
|
|
@@ -92,7 +92,6 @@ const ChatButtonStateful = props => {
|
|
|
92
92
|
titleText: (outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : (_outOfOfficeButtonPro = outOfOfficeButtonProps.controlProps) === null || _outOfOfficeButtonPro === void 0 ? void 0 : _outOfOfficeButtonPro.titleText) || "We're Offline",
|
|
93
93
|
subtitleText: (outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : (_outOfOfficeButtonPro2 = outOfOfficeButtonProps.controlProps) === null || _outOfOfficeButtonPro2 === void 0 ? void 0 : _outOfOfficeButtonPro2.subtitleText) || "No agents available",
|
|
94
94
|
unreadMessageString: (_props$buttonProps3 = props.buttonProps) === null || _props$buttonProps3 === void 0 ? void 0 : (_props$buttonProps3$c = _props$buttonProps3.controlProps) === null || _props$buttonProps3$c === void 0 ? void 0 : _props$buttonProps3$c.unreadMessageString,
|
|
95
|
-
...(outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.controlProps),
|
|
96
95
|
// Out-of-office specific onClick - this will ALWAYS take precedence
|
|
97
96
|
onClick: () => {
|
|
98
97
|
if (state.appStates.isMinimized) {
|
|
@@ -105,7 +104,8 @@ const ChatButtonStateful = props => {
|
|
|
105
104
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
106
105
|
payload: _ConversationState.ConversationState.OutOfOffice
|
|
107
106
|
});
|
|
108
|
-
}
|
|
107
|
+
},
|
|
108
|
+
...(outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.controlProps)
|
|
109
109
|
};
|
|
110
110
|
(0, _react.useEffect)(() => {
|
|
111
111
|
_TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
|
|
@@ -13,34 +13,47 @@ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
|
13
13
|
var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
|
|
14
14
|
var _createReducer = require("../../../contexts/createReducer");
|
|
15
15
|
var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
|
|
16
|
-
const
|
|
16
|
+
const getRegionBasedInternetTestUrl = widgetSnippet => {
|
|
17
|
+
var _widgetSnippet$match;
|
|
18
|
+
if (!widgetSnippet) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const widgetSnippetSourceRegex = new RegExp("src=\"(https:\\/\\/[\\w-.]+)[\\w-.\\/]+\"");
|
|
22
|
+
const baseCdnUrl = (_widgetSnippet$match = widgetSnippet.match(widgetSnippetSourceRegex)) === null || _widgetSnippet$match === void 0 ? void 0 : _widgetSnippet$match[1];
|
|
23
|
+
return baseCdnUrl ? `${baseCdnUrl}${_Constants.Constants.internetConnectionTestPath}` : null;
|
|
24
|
+
};
|
|
25
|
+
const isInternetConnected = async testUrl => {
|
|
17
26
|
try {
|
|
18
|
-
const response = await fetch(
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
const response = await fetch(testUrl, {
|
|
28
|
+
method: "GET",
|
|
29
|
+
cache: "no-cache"
|
|
30
|
+
});
|
|
31
|
+
return response.ok;
|
|
21
32
|
} catch {
|
|
22
33
|
return false;
|
|
23
34
|
}
|
|
24
35
|
};
|
|
25
36
|
const createInternetConnectionChangeHandler = async state => {
|
|
26
37
|
const handler = async () => {
|
|
27
|
-
|
|
38
|
+
var _inMemoryState$domain, _inMemoryState$domain2;
|
|
28
39
|
const inMemoryState = (0, _createReducer.executeReducer)(state, {
|
|
29
40
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
|
|
30
41
|
payload: null
|
|
31
42
|
});
|
|
43
|
+
const testUrl = getRegionBasedInternetTestUrl((_inMemoryState$domain = inMemoryState.domainStates.liveChatConfig) === null || _inMemoryState$domain === void 0 ? void 0 : (_inMemoryState$domain2 = _inMemoryState$domain.LiveWSAndLiveChatEngJoin) === null || _inMemoryState$domain2 === void 0 ? void 0 : _inMemoryState$domain2.msdyn_widgetsnippet);
|
|
44
|
+
const connected = testUrl ? await isInternetConnected(testUrl) : false;
|
|
32
45
|
if (!connected) {
|
|
33
|
-
var _inMemoryState$
|
|
46
|
+
var _inMemoryState$domain3, _inMemoryState$domain4;
|
|
34
47
|
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.WARN, {
|
|
35
48
|
Event: _TelemetryConstants.TelemetryEvent.NetworkDisconnected
|
|
36
49
|
});
|
|
37
|
-
_NotificationHandler.NotificationHandler.notifyError(_NotificationScenarios.NotificationScenarios.InternetConnection, (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$
|
|
50
|
+
_NotificationHandler.NotificationHandler.notifyError(_NotificationScenarios.NotificationScenarios.InternetConnection, (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$domain3 = inMemoryState.domainStates) === null || _inMemoryState$domain3 === void 0 ? void 0 : (_inMemoryState$domain4 = _inMemoryState$domain3.middlewareLocalizedTexts) === null || _inMemoryState$domain4 === void 0 ? void 0 : _inMemoryState$domain4.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION) ?? _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_NO_INTERNET_CONNECTION);
|
|
38
51
|
} else {
|
|
39
|
-
var _inMemoryState$
|
|
52
|
+
var _inMemoryState$domain5, _inMemoryState$domain6;
|
|
40
53
|
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.WARN, {
|
|
41
54
|
Event: _TelemetryConstants.TelemetryEvent.NetworkReconnected
|
|
42
55
|
});
|
|
43
|
-
_NotificationHandler.NotificationHandler.notifySuccess(_NotificationScenarios.NotificationScenarios.InternetConnection, (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$
|
|
56
|
+
_NotificationHandler.NotificationHandler.notifySuccess(_NotificationScenarios.NotificationScenarios.InternetConnection, (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$domain5 = inMemoryState.domainStates) === null || _inMemoryState$domain5 === void 0 ? void 0 : (_inMemoryState$domain6 = _inMemoryState$domain5.middlewareLocalizedTexts) === null || _inMemoryState$domain6 === void 0 ? void 0 : _inMemoryState$domain6.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE) ?? _defaultMiddlewareLocalizedTexts.defaultMiddlewareLocalizedTexts.MIDDLEWARE_BANNER_INTERNET_BACK_ONLINE);
|
|
44
57
|
_omnichannelChatComponents.BroadcastService.postMessage({
|
|
45
58
|
eventName: _TelemetryConstants.BroadcastEvent.NetworkReconnected
|
|
46
59
|
});
|
|
@@ -34,12 +34,65 @@ const createMarkdown = (disableMarkdownMessageFormatting, disableNewLineMarkdown
|
|
|
34
34
|
// Rule to process html blocks and paragraphs
|
|
35
35
|
"html_inline",
|
|
36
36
|
// Rule to process html tags
|
|
37
|
-
"newline"
|
|
37
|
+
"newline",
|
|
38
|
+
// Rule to proceess '\n'
|
|
39
|
+
"list" // Enable list parsing rule
|
|
38
40
|
]);
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
markdown.disable(["strikethrough"]);
|
|
42
44
|
|
|
45
|
+
// Custom plugin to fix numbered list continuity
|
|
46
|
+
markdown.use(function (md) {
|
|
47
|
+
const originalRender = md.render.bind(md);
|
|
48
|
+
const originalRenderInline = md.renderInline.bind(md);
|
|
49
|
+
function preprocessText(text) {
|
|
50
|
+
// Handle numbered lists that come with double line breaks (knowledge article format)
|
|
51
|
+
// This ensures proper continuous numbering instead of separate lists
|
|
52
|
+
|
|
53
|
+
let result = text;
|
|
54
|
+
|
|
55
|
+
// Only process if the text contains the double line break pattern
|
|
56
|
+
// But exclude simple numbered lists (where content after \n\n starts with another number)
|
|
57
|
+
if (!/\d+\.\s+.*?\n\n(?!\d+\.\s)[\s\S]*?(?:\n\n\d+\.|\s*$)/.test(text)) {
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Convert "1. Item\n\nContent\n\n2. Item" to proper markdown list format
|
|
62
|
+
// Use improved pattern with negative lookahead to exclude cases where content starts with numbered list
|
|
63
|
+
const listPattern = /(\d+\.\s+[^\n]+)(\n\n(?!\d+\.\s)[\s\S]*?)(?=\n\n\d+\.|\s*$)/g;
|
|
64
|
+
if (listPattern.test(result)) {
|
|
65
|
+
// Reset regex state for actual replacement
|
|
66
|
+
listPattern.lastIndex = 0;
|
|
67
|
+
result = result.replace(listPattern, (match, listItem, content) => {
|
|
68
|
+
if (!content) {
|
|
69
|
+
return match;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Format content with proper indentation
|
|
73
|
+
const cleanContent = content.substring(2); // Remove leading \n\n
|
|
74
|
+
const lines = cleanContent.split("\n");
|
|
75
|
+
const indentedContent = lines.map(line => line.trim() ? `${_Constants.Constants.MARKDOWN_LIST_INDENTATION}${line}` : "").join("\n");
|
|
76
|
+
const lineBreak = disableNewLineMarkdownSupport ? "\n" : "\n\n";
|
|
77
|
+
return `${listItem}${lineBreak}${indentedContent}`;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
+
md.render = function (text, env) {
|
|
85
|
+
const processedText = preprocessText(text);
|
|
86
|
+
return originalRender(processedText, env);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
md.renderInline = function (text, env) {
|
|
91
|
+
const processedText = preprocessText(text);
|
|
92
|
+
return originalRenderInline(processedText, env);
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
|
|
43
96
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
97
|
markdown.use(_markdownItForInline.default, "url_new_win", "link_open", function (tokens, idx, env) {
|
|
45
98
|
const targetAttrIndex = tokens[idx].attrIndex(_Constants.Constants.Target);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeToSendCustomEvent = exports.customEventCallback = void 0;
|
|
7
|
+
var _Constants = require("../../../common/Constants");
|
|
8
|
+
var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
9
|
+
var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
|
|
10
|
+
var _utils = require("../../../common/utils");
|
|
11
|
+
const customEventCallback = facadeChatSDK => event => {
|
|
12
|
+
if (!(_Constants.Constants.payload in event)) return;
|
|
13
|
+
if ((0, _utils.isValidCustomEvent)(event.payload)) {
|
|
14
|
+
const customEventPayload = event.payload;
|
|
15
|
+
try {
|
|
16
|
+
const customEventValueStr = (0, _utils.getCustomEventValue)(customEventPayload);
|
|
17
|
+
const customEventName = customEventPayload.customEventName;
|
|
18
|
+
const messageMeta = {
|
|
19
|
+
customEvent: _Constants.Constants.true,
|
|
20
|
+
customEventName: customEventName,
|
|
21
|
+
customEventValue: customEventValueStr
|
|
22
|
+
};
|
|
23
|
+
const messagePayload = {
|
|
24
|
+
content: "",
|
|
25
|
+
tags: [_Constants.Constants.Hidden],
|
|
26
|
+
metadata: messageMeta,
|
|
27
|
+
timestamp: new Date()
|
|
28
|
+
};
|
|
29
|
+
facadeChatSDK.sendMessage(messagePayload);
|
|
30
|
+
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.DEBUG, {
|
|
31
|
+
Event: _TelemetryConstants.TelemetryEvent.CustomEventAction,
|
|
32
|
+
Description: "Sent customEvent.",
|
|
33
|
+
CustomProperties: {
|
|
34
|
+
customEventName,
|
|
35
|
+
lengthCustomEventValue: customEventValueStr.length
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
} catch (error) {
|
|
39
|
+
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.ERROR, {
|
|
40
|
+
Event: _TelemetryConstants.TelemetryEvent.CustomEventAction,
|
|
41
|
+
Description: "Failed to process CustomEvent.",
|
|
42
|
+
ExceptionDetails: {
|
|
43
|
+
error
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.customEventCallback = customEventCallback;
|
|
50
|
+
const subscribeToSendCustomEvent = (broadcastService, facadeChatSDK, customEventCallback) => {
|
|
51
|
+
broadcastService.getMessageByEventName(_Constants.Constants.sendCustomEvent).subscribe(customEventCallback(facadeChatSDK));
|
|
52
|
+
};
|
|
53
|
+
exports.subscribeToSendCustomEvent = subscribeToSendCustomEvent;
|
|
@@ -40,6 +40,7 @@ const prepareEndChat = async (props, facadeChatSDK, state, dispatch, setAdapter,
|
|
|
40
40
|
Description: _Constants.PrepareEndChatDescriptionConstants.ConversationEndedByCustomerWithoutPostChat
|
|
41
41
|
});
|
|
42
42
|
await endChat(props, facadeChatSDK, state, dispatch, setAdapter, setWebChatStyles, adapter, false, false, true);
|
|
43
|
+
return;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
// Use Case: If ended by Agent, stay chat in InActive state
|
|
@@ -216,7 +217,7 @@ const endChat = async (props, facadeChatSDK, state, dispatch, setAdapter, setWeb
|
|
|
216
217
|
payload: undefined
|
|
217
218
|
});
|
|
218
219
|
// Always allow to close the chat for embedded mode irrespective of end chat errors
|
|
219
|
-
closeChatWidget(dispatch);
|
|
220
|
+
closeChatWidget(dispatch, setWebChatStyles, props);
|
|
220
221
|
facadeChatSDK.destroy();
|
|
221
222
|
}
|
|
222
223
|
}
|
|
@@ -349,13 +350,23 @@ const endVoiceVideoCallIfOngoing = async (facadeChatSDK, dispatch) => {
|
|
|
349
350
|
}, callId);
|
|
350
351
|
}
|
|
351
352
|
};
|
|
353
|
+
|
|
354
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
352
355
|
exports.endVoiceVideoCallIfOngoing = endVoiceVideoCallIfOngoing;
|
|
353
|
-
const closeChatWidget = dispatch => {
|
|
356
|
+
const closeChatWidget = (dispatch, setWebChatStyles, props) => {
|
|
357
|
+
var _props$webChatContain2, _props$webChatContain3;
|
|
354
358
|
// Embedded chat
|
|
355
359
|
dispatch({
|
|
356
360
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
357
361
|
payload: _ConversationState.ConversationState.Closed
|
|
358
362
|
});
|
|
363
|
+
|
|
364
|
+
// if customer is setting the hideSendbox, we should not alter its value
|
|
365
|
+
if ((props === null || props === void 0 ? void 0 : (_props$webChatContain2 = props.webChatContainerProps) === null || _props$webChatContain2 === void 0 ? void 0 : (_props$webChatContain3 = _props$webChatContain2.webChatStyles) === null || _props$webChatContain3 === void 0 ? void 0 : _props$webChatContain3.hideSendBox) === true) return;
|
|
366
|
+
setWebChatStyles(styles => ({
|
|
367
|
+
...styles,
|
|
368
|
+
hideSendBox: false
|
|
369
|
+
}));
|
|
359
370
|
};
|
|
360
371
|
|
|
361
372
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -7,6 +7,8 @@ exports.initWebChatComposer = void 0;
|
|
|
7
7
|
var _Constants = require("../../../common/Constants");
|
|
8
8
|
var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
|
|
9
9
|
var _utils = require("../../../common/utils");
|
|
10
|
+
var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
|
|
11
|
+
var _ConversationState = require("../../../contexts/common/ConversationState");
|
|
10
12
|
var _dompurify = _interopRequireDefault(require("dompurify"));
|
|
11
13
|
var _HyperlinkTextOverrideRenderer = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/markdownrenderers/HyperlinkTextOverrideRenderer"));
|
|
12
14
|
var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
|
|
@@ -18,27 +20,30 @@ var _activityMiddleware = require("../../webchatcontainerstateful/webchatcontrol
|
|
|
18
20
|
var _attachmentMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware");
|
|
19
21
|
var _attachmentUploadValidatorMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware"));
|
|
20
22
|
var _avatarMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware");
|
|
23
|
+
var _callActionMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/callActionMiddleware"));
|
|
21
24
|
var _cardActionMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware");
|
|
25
|
+
var _citationsMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware");
|
|
22
26
|
var _conversationEndMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware"));
|
|
27
|
+
var _customEventMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/customEventMiddleware"));
|
|
23
28
|
var _dataMaskingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/dataMaskingMiddleware"));
|
|
24
29
|
var _createMarkdown = require("./createMarkdown");
|
|
25
30
|
var _maxMessageSizeValidator = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/maxMessageSizeValidator"));
|
|
26
31
|
var _messageSequenceIdOverrideMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageSequenceIdOverrideMiddleware");
|
|
27
32
|
var _messageTimestampMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware");
|
|
33
|
+
var _queueOverflowHandlerMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware");
|
|
28
34
|
var _botframeworkWebchat = require("botframework-webchat");
|
|
29
35
|
var _toastMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/toastMiddleware");
|
|
30
36
|
var _WebChatLogger = require("../../webchatcontainerstateful/webchatcontroller/webchattelemetry/WebChatLogger");
|
|
31
37
|
var _defaultAttachmentProps = require("../../webchatcontainerstateful/common/defaultProps/defaultAttachmentProps");
|
|
32
38
|
var _defaultMiddlewareLocalizedTexts = require("../../webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts");
|
|
33
39
|
var _defaultWebChatContainerStatefulProps = require("../../webchatcontainerstateful/common/defaultProps/defaultWebChatContainerStatefulProps");
|
|
40
|
+
var _createReducer = require("../../../contexts/createReducer");
|
|
34
41
|
var _omnichannelChatSdk = require("@microsoft/omnichannel-chat-sdk");
|
|
35
42
|
var _gifUploadMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/gifUploadMiddleware"));
|
|
36
43
|
var _htmlPlayerMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlPlayerMiddleware"));
|
|
37
44
|
var _htmlTextMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware"));
|
|
38
45
|
var _preProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware"));
|
|
39
46
|
var _sanitizationMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware"));
|
|
40
|
-
var _ConversationState = require("../../../contexts/common/ConversationState");
|
|
41
|
-
var _createReducer = require("../../../contexts/createReducer");
|
|
42
47
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
43
48
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
49
|
const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) => {
|
|
@@ -117,7 +122,7 @@ const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) =>
|
|
|
117
122
|
};
|
|
118
123
|
webChatStore = (0, _botframeworkWebchat.createStore)({},
|
|
119
124
|
//initial state
|
|
120
|
-
_preProcessingMiddleware.default, _attachmentProcessingMiddleware.default, (0, _attachmentUploadValidatorMiddleware.default)((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : _state$domainStates$l.allowedFileExtensions, (_state$domainStates$l2 = state.domainStates.liveChatConfig) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.maxUploadFileSize, localizedTexts), (0, _channelDataMiddleware.default)(addConversationalSurveyTagsCallback), (0, _conversationEndMiddleware.default)(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), (0, _dataMaskingMiddleware.default)((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), _messageTimestampMiddleware.createMessageTimeStampMiddleware, _messageSequenceIdOverrideMiddleware.createMessageSequenceIdOverrideMiddleware, _gifUploadMiddleware.default, _htmlPlayerMiddleware.default, (0, _htmlTextMiddleware.default)(honorsTargetInHTMLLinks), (0, _maxMessageSizeValidator.default)(localizedTexts), _sanitizationMiddleware.default,
|
|
125
|
+
_preProcessingMiddleware.default, _attachmentProcessingMiddleware.default, (0, _attachmentUploadValidatorMiddleware.default)((_state$domainStates$l = state.domainStates.liveChatConfig) === null || _state$domainStates$l === void 0 ? void 0 : _state$domainStates$l.allowedFileExtensions, (_state$domainStates$l2 = state.domainStates.liveChatConfig) === null || _state$domainStates$l2 === void 0 ? void 0 : _state$domainStates$l2.maxUploadFileSize, localizedTexts), (0, _customEventMiddleware.default)(_omnichannelChatComponents.BroadcastService), (0, _queueOverflowHandlerMiddleware.createQueueOverflowMiddleware)(state, dispatch), (0, _channelDataMiddleware.default)(addConversationalSurveyTagsCallback), (0, _conversationEndMiddleware.default)(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), (0, _dataMaskingMiddleware.default)((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), _messageTimestampMiddleware.createMessageTimeStampMiddleware, _messageSequenceIdOverrideMiddleware.createMessageSequenceIdOverrideMiddleware, _citationsMiddleware.createCitationsMiddleware, _gifUploadMiddleware.default, _htmlPlayerMiddleware.default, (0, _htmlTextMiddleware.default)(honorsTargetInHTMLLinks), (0, _maxMessageSizeValidator.default)(localizedTexts), _sanitizationMiddleware.default, (0, _callActionMiddleware.default)(),
|
|
121
126
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
127
|
...(((_props$webChatContain7 = props.webChatContainerProps) === null || _props$webChatContain7 === void 0 ? void 0 : _props$webChatContain7.storeMiddlewares) ?? []));
|
|
123
128
|
_WebChatStoreLoader.WebChatStoreLoader.store = webChatStore;
|
|
@@ -12,6 +12,7 @@ var _PostChatSurveyMode = require("../../postchatsurveypanestateful/enums/PostCh
|
|
|
12
12
|
var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
13
13
|
var _utils = require("../../../common/utils");
|
|
14
14
|
var _liveChatConfigUtils = require("./liveChatConfigUtils");
|
|
15
|
+
var _createReducer = require("../../../contexts/createReducer");
|
|
15
16
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
17
|
let conversationDetails = undefined;
|
|
17
18
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -64,6 +65,13 @@ const renderSurvey = async (postChatContext, state, dispatch) => {
|
|
|
64
65
|
// Function for embed mode postchat workflow which is essentially same for both customer and agent
|
|
65
66
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
67
|
const embedModePostChatWorkflow = async (postChatContext, state, dispatch) => {
|
|
68
|
+
const inMemoryState = (0, _createReducer.executeReducer)(state, {
|
|
69
|
+
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
|
|
70
|
+
payload: null
|
|
71
|
+
});
|
|
72
|
+
if (inMemoryState.appStates.conversationState === _ConversationState.ConversationState.Closed) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
67
75
|
_TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
|
|
68
76
|
Event: _TelemetryConstants.TelemetryEvent.EmbedModePostChatWorkflowStarted
|
|
69
77
|
});
|
|
@@ -84,6 +92,13 @@ const embedModePostChatWorkflow = async (postChatContext, state, dispatch) => {
|
|
|
84
92
|
payload: _ConversationState.ConversationState.PostchatLoading
|
|
85
93
|
});
|
|
86
94
|
await (0, _utils.addDelayInMs)(_Constants.Constants.PostChatLoadingDurationInMs);
|
|
95
|
+
const inMemoryState = (0, _createReducer.executeReducer)(state, {
|
|
96
|
+
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
|
|
97
|
+
payload: null
|
|
98
|
+
});
|
|
99
|
+
if (inMemoryState.appStates.conversationState === _ConversationState.ConversationState.Closed) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
87
102
|
dispatch({
|
|
88
103
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
89
104
|
payload: _ConversationState.ConversationState.Postchat
|
|
@@ -102,6 +117,14 @@ const embedModePostChatWorkflow = async (postChatContext, state, dispatch) => {
|
|
|
102
117
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
118
|
const initiatePostChat = async (props, conversationDetailsParam, state, dispatch, postchatContext) => {
|
|
104
119
|
var _conversationDetails;
|
|
120
|
+
const inMemoryState = (0, _createReducer.executeReducer)(state, {
|
|
121
|
+
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
|
|
122
|
+
payload: null
|
|
123
|
+
});
|
|
124
|
+
if (inMemoryState.appStates.conversationState === _ConversationState.ConversationState.Closed) {
|
|
125
|
+
// If the conversation is closed, we need to reset the state
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
105
128
|
conversationDetails = conversationDetailsParam;
|
|
106
129
|
const participantType = ((_conversationDetails = conversationDetails) === null || _conversationDetails === void 0 ? void 0 : _conversationDetails.participantType) ?? postchatContext.participantType;
|
|
107
130
|
await setSurveyMode(props, participantType, state, dispatch);
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.setPreChatAndInitiateChat = exports.prepareStartChat = exports.initStartChat = exports.checkIfConversationStillValid = void 0;
|
|
7
7
|
var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
|
|
8
8
|
var _Constants = require("../../../common/Constants");
|
|
9
|
+
var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
|
|
9
10
|
var _utils = require("../../../common/utils");
|
|
10
11
|
var _reconnectChatHelper = require("./reconnectChatHelper");
|
|
11
12
|
var _startChatErrorHandler = require("./startChatErrorHandler");
|
|
@@ -14,7 +15,6 @@ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components
|
|
|
14
15
|
var _ConversationState = require("../../../contexts/common/ConversationState");
|
|
15
16
|
var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
|
|
16
17
|
var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
|
|
17
|
-
var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
|
|
18
18
|
var _endChat = require("./endChat");
|
|
19
19
|
var _createAdapter = require("./createAdapter");
|
|
20
20
|
var _newMessageEventHandler = require("../../../plugins/newMessageEventHandler");
|
|
@@ -137,7 +137,7 @@ const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, is
|
|
|
137
137
|
* This is because a new change to control OOH as closed event when a widget is coming from chat.
|
|
138
138
|
*/
|
|
139
139
|
if ((state === null || state === void 0 ? void 0 : state.appStates.isMinimized) === undefined || (state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.isMinimized) === true) {
|
|
140
|
-
var _state$domainStates5, _state$domainStates5$, _state$domainStates6, _state$domainStates6
|
|
140
|
+
var _state$domainStates5, _state$domainStates5$, _state$domainStates6, _state$domainStates6$, _TelemetryManager$Int;
|
|
141
141
|
dispatch({
|
|
142
142
|
type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_MINIMIZED,
|
|
143
143
|
payload: false
|
|
@@ -147,14 +147,14 @@ const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, is
|
|
|
147
147
|
eventName: _TelemetryConstants.BroadcastEvent.MaximizeChat,
|
|
148
148
|
payload: {
|
|
149
149
|
height: state === null || state === void 0 ? void 0 : (_state$domainStates5 = state.domainStates) === null || _state$domainStates5 === void 0 ? void 0 : (_state$domainStates5$ = _state$domainStates5.widgetSize) === null || _state$domainStates5$ === void 0 ? void 0 : _state$domainStates5$.height,
|
|
150
|
-
width: state === null || state === void 0 ? void 0 : (_state$domainStates6 = state.domainStates) === null || _state$domainStates6 === void 0 ? void 0 : (_state$domainStates6$ = _state$domainStates6.widgetSize) === null || _state$domainStates6$ === void 0 ? void 0 : _state$domainStates6$.width
|
|
150
|
+
width: state === null || state === void 0 ? void 0 : (_state$domainStates6 = state.domainStates) === null || _state$domainStates6 === void 0 ? void 0 : (_state$domainStates6$ = _state$domainStates6.widgetSize) === null || _state$domainStates6$ === void 0 ? void 0 : _state$domainStates6$.width,
|
|
151
|
+
runtimeId: _TelemetryManager.TelemetryManager === null || _TelemetryManager.TelemetryManager === void 0 ? void 0 : (_TelemetryManager$Int = _TelemetryManager.TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int === void 0 ? void 0 : _TelemetryManager$Int.lcwRuntimeId
|
|
151
152
|
}
|
|
152
153
|
});
|
|
153
154
|
}
|
|
154
155
|
const optionalParams = {
|
|
155
156
|
isProactiveChat
|
|
156
157
|
};
|
|
157
|
-
(0, _FirstMessageTrackerFromBot.createTrackingForFirstMessage)();
|
|
158
158
|
await initStartChat(facadeChatSDK, dispatch, setAdapter, state, props, optionalParams);
|
|
159
159
|
};
|
|
160
160
|
|
|
@@ -206,6 +206,7 @@ const initStartChat = async (facadeChatSDK, dispatch, setAdapter, state, props,
|
|
|
206
206
|
const startChatOptionalParams = Object.assign({}, params, optionalParams, defaultOptionalParams);
|
|
207
207
|
// startTime is used to determine if a message is history or new, better to be set before creating the adapter to get bandwidth
|
|
208
208
|
const startTime = new Date().getTime();
|
|
209
|
+
(0, _FirstMessageTrackerFromBot.createTrackingForFirstMessage)();
|
|
209
210
|
await facadeChatSDK.startChat(startChatOptionalParams);
|
|
210
211
|
isStartChatSuccessful = true;
|
|
211
212
|
await createAdapterAndSubscribe(facadeChatSDK, dispatch, setAdapter, startTime, props);
|