@microsoft/omnichannel-chat-widget 1.8.4-main.7bdb634 → 1.8.4-main.96ea063
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 +39 -3
- package/lib/cjs/common/Constants.js +5 -0
- package/lib/cjs/common/telemetry/AppInsightsEvents.js +14 -9
- package/lib/cjs/common/telemetry/TelemetryConstants.js +19 -2
- package/lib/cjs/common/telemetry/TelemetryManager.js +10 -7
- package/lib/cjs/common/telemetry/loggers/appInsightsLogger.js +29 -13
- package/lib/cjs/common/utils/xssUtils.js +23 -51
- package/lib/cjs/common/utils.js +15 -2
- package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +16 -4
- package/lib/cjs/components/citationpanestateful/CitationPaneStateful.js +20 -1
- package/lib/cjs/components/errorboundary/ErrorBoundary.js +2 -1
- package/lib/cjs/components/headerstateful/HeaderStateful.js +8 -2
- package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +23 -6
- package/lib/cjs/components/livechatwidget/common/ChatWidgetEvents.js +2 -1
- package/lib/cjs/components/livechatwidget/common/PersistentConversationHandler.js +34 -19
- package/lib/cjs/components/livechatwidget/common/createAdapter.js +3 -2
- package/lib/cjs/components/livechatwidget/common/defaultProps/defaultPersistentChatHistoryProps.js +1 -2
- package/lib/cjs/components/livechatwidget/common/endChat.js +26 -9
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +9 -2
- package/lib/cjs/components/livechatwidget/common/liveChatConfigUtils.js +36 -4
- package/lib/cjs/components/livechatwidget/common/registerTelemetryLoggers.js +3 -0
- package/lib/cjs/components/livechatwidget/common/renderSurveyHelpers.js +2 -2
- package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +3 -3
- package/lib/cjs/components/livechatwidget/common/startChat.js +5 -1
- package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +24 -4
- package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +134 -29
- package/lib/cjs/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +37 -8
- package/lib/cjs/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +12 -3
- package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +0 -1
- package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +50 -34
- package/lib/cjs/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +121 -14
- package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +2 -1
- package/lib/cjs/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
- package/lib/cjs/components/webchatcontainerstateful/hooks/usePersistentChatHistory.js +1 -3
- package/lib/cjs/components/webchatcontainerstateful/interfaces/IExtendedChatConffig.js +1 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +19 -9
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/ConversationDividerActivity.js +30 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +169 -156
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +7 -2
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +3 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +6 -1
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +29 -7
- package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +1 -0
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +7 -1
- package/lib/cjs/contexts/createReducer.js +15 -0
- package/lib/cjs/controller/componentController.js +13 -1
- package/lib/cjs/firstresponselatency/FirstMessageTrackerFromBot.js +3 -2
- package/lib/cjs/firstresponselatency/FirstResponseLatencyTracker.js +6 -2
- package/lib/cjs/plugins/newMessageEventHandler.js +4 -1
- package/lib/esm/common/Constants.js +5 -0
- package/lib/esm/common/telemetry/AppInsightsEvents.js +14 -9
- package/lib/esm/common/telemetry/TelemetryConstants.js +17 -1
- package/lib/esm/common/telemetry/TelemetryManager.js +10 -7
- package/lib/esm/common/telemetry/loggers/appInsightsLogger.js +30 -14
- package/lib/esm/common/utils/xssUtils.js +23 -51
- package/lib/esm/common/utils.js +12 -1
- package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +17 -5
- package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +20 -1
- package/lib/esm/components/errorboundary/ErrorBoundary.js +4 -2
- package/lib/esm/components/headerstateful/HeaderStateful.js +9 -3
- package/lib/esm/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.js +23 -6
- package/lib/esm/components/livechatwidget/common/ChatWidgetEvents.js +2 -1
- package/lib/esm/components/livechatwidget/common/PersistentConversationHandler.js +34 -19
- package/lib/esm/components/livechatwidget/common/createAdapter.js +3 -2
- package/lib/esm/components/livechatwidget/common/defaultProps/defaultPersistentChatHistoryProps.js +1 -2
- package/lib/esm/components/livechatwidget/common/endChat.js +26 -9
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +9 -2
- package/lib/esm/components/livechatwidget/common/liveChatConfigUtils.js +33 -2
- package/lib/esm/components/livechatwidget/common/registerTelemetryLoggers.js +3 -0
- package/lib/esm/components/livechatwidget/common/renderSurveyHelpers.js +2 -2
- package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +3 -3
- package/lib/esm/components/livechatwidget/common/startChat.js +7 -3
- package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +23 -4
- package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +135 -30
- package/lib/esm/components/postchatsurveypanestateful/PostChatSurveyPaneStateful.js +39 -10
- package/lib/esm/components/prechatsurveypanestateful/PreChatSurveyPaneStateful.js +13 -4
- package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +1 -2
- package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +51 -38
- package/lib/esm/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +121 -14
- package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +2 -1
- package/lib/esm/components/webchatcontainerstateful/common/defaultStyles/defaultAdaptiveCardStyles.js +3 -1
- package/lib/esm/components/webchatcontainerstateful/hooks/usePersistentChatHistory.js +1 -3
- package/lib/esm/components/webchatcontainerstateful/interfaces/IExtendedChatConffig.js +1 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +19 -9
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/ConversationDividerActivity.js +30 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +169 -160
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +7 -2
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +3 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +1 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +6 -1
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +29 -7
- package/lib/esm/contexts/common/LiveChatWidgetActionType.js +1 -0
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +7 -1
- package/lib/esm/contexts/createReducer.js +15 -0
- package/lib/esm/controller/componentController.js +13 -1
- package/lib/esm/firstresponselatency/FirstMessageTrackerFromBot.js +3 -2
- package/lib/esm/firstresponselatency/FirstResponseLatencyTracker.js +6 -2
- package/lib/esm/plugins/newMessageEventHandler.js +4 -1
- package/lib/types/common/Constants.d.ts +5 -0
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +16 -1
- package/lib/types/common/telemetry/interfaces/IInternalTelemetryData.d.ts +1 -0
- package/lib/types/common/utils/xssUtils.d.ts +5 -21
- package/lib/types/common/utils.d.ts +9 -1
- package/lib/types/components/errorboundary/ErrorBoundary.d.ts +1 -1
- package/lib/types/components/livechatwidget/common/ActivitySubscriber/BotAuthActivitySubscriber.d.ts +1 -0
- package/lib/types/components/livechatwidget/common/ChatWidgetEvents.d.ts +2 -1
- package/lib/types/components/livechatwidget/common/liveChatConfigUtils.d.ts +11 -0
- package/lib/types/components/livechatwidget/common/startChatErrorHandler.d.ts +1 -0
- package/lib/types/components/livechatwidget/interfaces/IBotAuthActivitySubscriberOptionalParams.d.ts +1 -0
- package/lib/types/components/livechatwidget/interfaces/IPersistentChatHistoryProps.d.ts +5 -1
- package/lib/types/components/webchatcontainerstateful/interfaces/IAdaptiveCardStyles.d.ts +2 -0
- package/lib/types/components/webchatcontainerstateful/interfaces/IBotAuthConfig.d.ts +7 -0
- package/lib/types/components/webchatcontainerstateful/interfaces/IExtendedChatConffig.d.ts +15 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.d.ts +1 -2
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.d.ts +15 -39
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.d.ts +2 -1
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +1 -1
- package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
- package/lib/types/contexts/common/ILiveChatWidgetLocalizedTexts.d.ts +5 -0
- package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +2 -1
- package/package.json +15 -6
package/README.md
CHANGED
|
@@ -177,7 +177,7 @@ Header's and Footer's child components consist of three parts:
|
|
|
177
177
|
1. "middleGroup" - adding child components in the middle of the Header/Footer
|
|
178
178
|
1. "rightGroup" - adding child components at the right of the Header/Footer
|
|
179
179
|
|
|
180
|
-
By default Header has the header icon and title on the left and minimize and close buttons on the right, and Footer has Download Transcript and Email Transcript buttons on the left and audio notification button on the right. These components can be overriden with [ComponentOverrides](#
|
|
180
|
+
By default Header has the header icon and title on the left and minimize and close buttons on the right, and Footer has Download Transcript and Email Transcript buttons on the left and audio notification button on the right. These components can be overriden with [ComponentOverrides](#componentoverrides). In addition, other custom child components can be added to both Header and Footer by creating custom react nodes and adding them to attributes "leftGroup", "middleGroup" or "rightGroup" of "controlProps".
|
|
181
181
|
|
|
182
182
|
```js
|
|
183
183
|
const buttonStyleProps: IButtonStyles = {
|
|
@@ -224,8 +224,10 @@ const customizedFooterProp: IFooterProps = {
|
|
|
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
226
|
#### Bidirectional Custom Events
|
|
227
|
+
|
|
227
228
|
- Sending events from a hosting web page to bots/agents
|
|
228
|
-
|
|
229
|
+
- Register a function to post event
|
|
230
|
+
|
|
229
231
|
```js
|
|
230
232
|
//define sendCustomEvent function
|
|
231
233
|
const sendCustomEvent = (payload) => {
|
|
@@ -253,7 +255,9 @@ const customizedFooterProp: IFooterProps = {
|
|
|
253
255
|
}
|
|
254
256
|
})
|
|
255
257
|
```
|
|
256
|
-
|
|
258
|
+
|
|
259
|
+
- Receiving events from bots/agents
|
|
260
|
+
|
|
257
261
|
```js
|
|
258
262
|
//define setOnCustomEvent function
|
|
259
263
|
const setOnCustomEvent = (callback) => {
|
|
@@ -268,6 +272,38 @@ const customizedFooterProp: IFooterProps = {
|
|
|
268
272
|
setOnCustomEvent((event) => console.log(event));
|
|
269
273
|
```
|
|
270
274
|
|
|
275
|
+
#### Trigger initiateEndChat event
|
|
276
|
+
|
|
277
|
+
Customer can trigger the initiateEndChat event via BroadcastService to end a chat session.
|
|
278
|
+
When needed, the payload below could be triggered:
|
|
279
|
+
|
|
280
|
+
```js
|
|
281
|
+
const endChatEvent = {
|
|
282
|
+
eventName: "InitiateEndChat",
|
|
283
|
+
payload: {
|
|
284
|
+
skipSessionCloseForPersistentChat: true
|
|
285
|
+
} //optional payload
|
|
286
|
+
};
|
|
287
|
+
BroadcastService.postMessage(endChatEvent);
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
The payload of the event is optional, only needed when force closing of a persistent chat session is not required.
|
|
291
|
+
When chat widget receives the event without any payload, it will:
|
|
292
|
+
|
|
293
|
+
1. set the widget to closed state, the widget panel will be minimized. Post chat survey will not be displayed.
|
|
294
|
+
2. trigger a sessionclose service network request to OmniChannel services.
|
|
295
|
+
|
|
296
|
+
If skipSessionCloseForPersistentChat is set to true. The session close network request will not be triggered, instead, if postChat survey is available, post chat survey will be displayed.
|
|
297
|
+
|
|
298
|
+
After successfully processed initiateEndChat event. The CloseChat event is broadcasted.
|
|
299
|
+
|
|
300
|
+
```js
|
|
301
|
+
BroadcastService.getMessageByEventName("CloseChat").subscribe(async (msg) => {
|
|
302
|
+
console.log("close chat received: ", msg);
|
|
303
|
+
//more actions to unmount component and resources
|
|
304
|
+
})
|
|
305
|
+
```
|
|
306
|
+
|
|
271
307
|
## See Also
|
|
272
308
|
|
|
273
309
|
[Customizations Dev Guide](https://github.com/microsoft/omnichannel-chat-widget/blob/main/docs/customizations/getstarted.md)\
|
|
@@ -68,6 +68,7 @@ _defineProperty(Constants, "queuePositionMessageTag", "queueposition");
|
|
|
68
68
|
_defineProperty(Constants, "averageWaitTimeMessageTag", "averagewaittime");
|
|
69
69
|
_defineProperty(Constants, "message", "message");
|
|
70
70
|
_defineProperty(Constants, "hiddenTag", "Hidden");
|
|
71
|
+
_defineProperty(Constants, "typing", "typing");
|
|
71
72
|
// messageTimestampMiddleware
|
|
72
73
|
_defineProperty(Constants, "prefixTimestampTag", "ServerMessageTimestamp_");
|
|
73
74
|
_defineProperty(Constants, "acsChannel", "ACS_CHANNEL");
|
|
@@ -81,6 +82,8 @@ _defineProperty(Constants, "audioMediaRegex", /(\.)(aac|aiff|alac|amr|flac|mp2|m
|
|
|
81
82
|
_defineProperty(Constants, "videoMediaRegex", /(\.)(avchd|avi|flv|mpe|mpeg|mpg|mpv|mp4|m4p|m4v|mov|qt|swf|webm|wmv)$/i);
|
|
82
83
|
_defineProperty(Constants, "chromeSupportedInlineMediaRegex", /(\.)(aac|mp3|wav|mp4)$/i);
|
|
83
84
|
_defineProperty(Constants, "firefoxSupportedInlineMediaRegex", /(\.)(aac|flac|mp3|wav|mp4|mov)$/i);
|
|
85
|
+
_defineProperty(Constants, "AdaptiveCardType", "adaptivecard");
|
|
86
|
+
_defineProperty(Constants, "SuggestedActionsType", "suggestedactions");
|
|
84
87
|
// calling container event names
|
|
85
88
|
_defineProperty(Constants, "CallAdded", "callAdded");
|
|
86
89
|
_defineProperty(Constants, "LocalVideoStreamAdded", "localVideoStreamAdded");
|
|
@@ -142,6 +145,7 @@ _defineProperty(Constants, "customEventName", "customEventName");
|
|
|
142
145
|
_defineProperty(Constants, "customEventValue", "customEventValue");
|
|
143
146
|
_defineProperty(Constants, "Hidden", "Hidden");
|
|
144
147
|
_defineProperty(Constants, "EndConversationDueToOverflow", "endconversationduetooverflow");
|
|
148
|
+
_defineProperty(Constants, "SkipSessionCloseForPersistentChatFlag", "skipSessionCloseForPersistentChat");
|
|
145
149
|
const Regex = (_class = /*#__PURE__*/_createClass(function Regex() {
|
|
146
150
|
_classCallCheck(this, Regex);
|
|
147
151
|
}), _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);
|
|
@@ -377,6 +381,7 @@ _defineProperty(PrepareEndChatDescriptionConstants, "ConversationEndedBy", "Conv
|
|
|
377
381
|
_defineProperty(PrepareEndChatDescriptionConstants, "PrepareEndChatError", "There's an error while preparing to end chat. Closing chat widget.");
|
|
378
382
|
_defineProperty(PrepareEndChatDescriptionConstants, "WidgetLoadFailedAfterSessionInit", "SessionInit was successful, but widget load failed. Ending chat to avoid ghost chats in OC.");
|
|
379
383
|
_defineProperty(PrepareEndChatDescriptionConstants, "InitiateEndChatReceived", "Received InitiateEndChat BroadcastEvent while conversation state is not Active. Ending chat.");
|
|
384
|
+
_defineProperty(PrepareEndChatDescriptionConstants, "InitiateEndChatReceivedActiveChat", "Received InitiateEndChat BroadcastEvent while conversation state is Active. Updating conversation states.");
|
|
380
385
|
_defineProperty(PrepareEndChatDescriptionConstants, "EndChatReceivedFromOtherTabs", "Received EndChat BroadcastEvent from other tabs. Closing this chat.");
|
|
381
386
|
_defineProperty(PrepareEndChatDescriptionConstants, "CustomerCloseChatOnFailureOrPostChat", "Customer is trying to close chat widget on start chat failure or post chat pane.");
|
|
382
387
|
_defineProperty(PrepareEndChatDescriptionConstants, "CustomerCloseInactiveChat", "Chat was Inactive and customer is trying to close chat widget or refreshing the page.");
|
|
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.AppInsightsEventMapping = void 0;
|
|
7
7
|
const AppInsightsEventMapping = {
|
|
8
8
|
"LCWChatButtonClicked": "LCWChatButtonActionStarted",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
9
|
+
"UXLCWChatButtonLoadingStart": "LiveChatWidgetChatButtonLoadingStarted",
|
|
10
|
+
"UXLCWChatButtonLoadingCompleted": "LiveChatWidgetChatButtonLoadingCompleted",
|
|
11
|
+
"UXPrechatPaneStart": "PrechatSurveyStarted",
|
|
12
|
+
"UXPrechatPaneCompleted": "PrechatSurveyCompleted",
|
|
13
|
+
"PrechatSubmitted": "PrechatSurveySubmitCompleted",
|
|
14
14
|
"EndChatEventReceived": "EndChatEventReceivedCompleted",
|
|
15
15
|
"EmailTranscriptSent": "EmailTranscriptActionCompleted",
|
|
16
16
|
"EmailTranscriptFailed": "EmailTranscriptActionFailed",
|
|
@@ -18,14 +18,19 @@ const AppInsightsEventMapping = {
|
|
|
18
18
|
"HeaderMinimizeButtonClicked": "MinimizeChatActionStarted",
|
|
19
19
|
"DownloadTranscriptButtonClicked": "DownloadTranscriptActionStarted",
|
|
20
20
|
"EmailTranscriptButtonClicked": "EmailTranscriptButtonActionStarted",
|
|
21
|
-
"CustomerVoiceFormResponseSubmitted": "CustomerVoiceFormResponseSubmitCompleted",
|
|
22
|
-
"StartProactiveChatEventReceived": "StartProactiveChatEventReceivedCompleted",
|
|
23
21
|
"ProactiveChatRejected": "ProactiveChatTimeOutCompleted",
|
|
24
22
|
"MessageSent": "MessageSentCompleted",
|
|
25
23
|
"MessageReceived": "MessageReceivedCompleted",
|
|
26
24
|
"SystemMessageReceived": "SystemMessageReceivedCompleted",
|
|
27
|
-
"RehydrateMessageReceived": "
|
|
25
|
+
"RehydrateMessageReceived": "ChatHistoryMessageReceivedCompleted",
|
|
28
26
|
"CustomContextReceived": "CustomContextReceivedCompleted",
|
|
29
|
-
"
|
|
27
|
+
"NewTokenValidationStarted": "AuthTokenValidationStarted",
|
|
28
|
+
"NewTokenValidationCompleted": "AuthTokenValidationCompleted",
|
|
29
|
+
"NewTokenValidationFailed": "AuthTokenValidationFailed",
|
|
30
|
+
"UXPostChatPaneStarted": "PostChatSurveyStarted",
|
|
31
|
+
"UXPostChatPaneCompleted": "PostChatSurveyCompleted",
|
|
32
|
+
"WidgetLoadStarted": "ChatSessionInitializationStarted",
|
|
33
|
+
"WidgetLoadComplete": "ChatSessionInitializationCompleted",
|
|
34
|
+
"WidgetLoadFailed": "ChatSessionInitializationFailed"
|
|
30
35
|
};
|
|
31
36
|
exports.AppInsightsEventMapping = AppInsightsEventMapping;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.TelemetryEvent = exports.TelemetryConstants = exports.ScenarioType = exports.LogLevel = exports.BroadcastEvent = void 0;
|
|
6
|
+
exports.TelemetryEvent = exports.TelemetryConstants = exports.ScenarioType = exports.LogLevel = exports.ConversationStage = exports.BroadcastEvent = void 0;
|
|
7
7
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
8
8
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
9
9
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
@@ -124,6 +124,7 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
124
124
|
TelemetryEvent["EndChatFailed"] = "EndChatFailed";
|
|
125
125
|
TelemetryEvent["SettingCustomContext"] = "SettingCustomContext";
|
|
126
126
|
TelemetryEvent["WebChatLoaded"] = "WebChatLoaded";
|
|
127
|
+
TelemetryEvent["PersistentChatHistoryEnabled"] = "PersistentChatHistoryEnabled";
|
|
127
128
|
TelemetryEvent["LCWChatButtonActionCompleted"] = "LCWChatButtonActionCompleted";
|
|
128
129
|
TelemetryEvent["LCWChatButtonClicked"] = "LCWChatButtonClicked";
|
|
129
130
|
TelemetryEvent["LCWChatButtonShow"] = "LCWChatButtonShow";
|
|
@@ -288,6 +289,8 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
288
289
|
TelemetryEvent["UXCitationPaneCompleted"] = "UXCitationPaneCompleted";
|
|
289
290
|
TelemetryEvent["UXLiveChatWidgetStart"] = "UXLiveChatWidgetStart";
|
|
290
291
|
TelemetryEvent["UXLiveChatWidgetCompleted"] = "UXLiveChatWidgetCompleted";
|
|
292
|
+
TelemetryEvent["UXPostChatPaneStarted"] = "UXPostChatPaneStarted";
|
|
293
|
+
TelemetryEvent["UXPostChatPaneCompleted"] = "UXPostChatPaneCompleted";
|
|
291
294
|
TelemetryEvent["AppInsightsInitialized"] = "AppInsightsInitialized";
|
|
292
295
|
TelemetryEvent["AppInsightsInitFailed"] = "AppInsightsInitFailed";
|
|
293
296
|
TelemetryEvent["ConvertPersistentChatHistoryMessageToActivityFailed"] = "ConvertPersistentChatHistoryMessageToActivityFailed";
|
|
@@ -303,6 +306,7 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
303
306
|
TelemetryEvent["LCWPersistentConversationHandlerInitialized"] = "LCWPersistentConversationHandlerInitialized";
|
|
304
307
|
TelemetryEvent["LCWPersistentHistoryPullBlocked"] = "LCWPersistentHistoryPullBlocked";
|
|
305
308
|
TelemetryEvent["LCWPersistentHistoryPullCompleted"] = "LCWPersistentHistoryPullCompleted";
|
|
309
|
+
TelemetryEvent["LCWPersistentHistoryReturnedNull"] = "LCWPersistentHistoryReturnedNull";
|
|
306
310
|
TelemetryEvent["LCWLazyLoadInitializationStarted"] = "LCWLazyLoadInitializationStarted";
|
|
307
311
|
TelemetryEvent["LCWLazyLoadContainerNotFound"] = "LCWLazyLoadContainerNotFound";
|
|
308
312
|
TelemetryEvent["LCWLazyLoadInitializationCompleted"] = "LCWLazyLoadInitializationCompleted";
|
|
@@ -312,10 +316,16 @@ exports.TelemetryEvent = TelemetryEvent;
|
|
|
312
316
|
TelemetryEvent["LCWLazyLoadActivityMounted"] = "LCWLazyLoadActivityMounted";
|
|
313
317
|
TelemetryEvent["LCWLazyLoadReset"] = "LCWLazyLoadReset";
|
|
314
318
|
TelemetryEvent["LCWLazyLoadNoMoreHistory"] = "LCWLazyLoadNoMoreHistory";
|
|
319
|
+
TelemetryEvent["LCWLazyLoadHistoryError"] = "LCWLazyLoadHistoryError";
|
|
315
320
|
TelemetryEvent["LCWLazyLoadDestroyed"] = "LCWLazyLoadDestroyed";
|
|
321
|
+
TelemetryEvent["LCWLazyLoadTriggerFired"] = "LCWLazyLoadTriggerFired";
|
|
322
|
+
TelemetryEvent["LCWLazyLoadBatchReceived"] = "LCWLazyLoadBatchReceived";
|
|
323
|
+
TelemetryEvent["LCWLazyLoadInitialLoadComplete"] = "LCWLazyLoadInitialLoadComplete";
|
|
324
|
+
TelemetryEvent["LCWLazyLoadScrollAnchorApplied"] = "LCWLazyLoadScrollAnchorApplied";
|
|
316
325
|
TelemetryEvent["SecureEventBusUnauthorizedDispatch"] = "SecureEventBusUnauthorizedDispatch";
|
|
317
326
|
TelemetryEvent["SecureEventBusListenerError"] = "SecureEventBusListenerError";
|
|
318
327
|
TelemetryEvent["SecureEventBusDispatchError"] = "SecureEventBusDispatchError";
|
|
328
|
+
TelemetryEvent["StartChatComplete"] = "StartChatComplete";
|
|
319
329
|
})(TelemetryEvent || (exports.TelemetryEvent = TelemetryEvent = {}));
|
|
320
330
|
let TelemetryConstants = /*#__PURE__*/function () {
|
|
321
331
|
function TelemetryConstants() {
|
|
@@ -446,4 +456,11 @@ let TelemetryConstants = /*#__PURE__*/function () {
|
|
|
446
456
|
}]);
|
|
447
457
|
return TelemetryConstants;
|
|
448
458
|
}();
|
|
449
|
-
exports.TelemetryConstants = TelemetryConstants;
|
|
459
|
+
exports.TelemetryConstants = TelemetryConstants;
|
|
460
|
+
let ConversationStage;
|
|
461
|
+
exports.ConversationStage = ConversationStage;
|
|
462
|
+
(function (ConversationStage) {
|
|
463
|
+
ConversationStage["Initialization"] = "Initialization";
|
|
464
|
+
ConversationStage["CSREngagement"] = "CSR Engagement";
|
|
465
|
+
ConversationStage["ConversationEnd"] = "Conversation End";
|
|
466
|
+
})(ConversationStage || (exports.ConversationStage = ConversationStage = {}));
|
|
@@ -50,7 +50,7 @@ const RegisterLoggers = () => {
|
|
|
50
50
|
loggers.push((0, _consoleLogger.consoleLogger)());
|
|
51
51
|
}
|
|
52
52
|
if (((_TelemetryManager$Int9 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int9 === void 0 ? void 0 : (_TelemetryManager$Int10 = _TelemetryManager$Int9.telemetryConfig) === null || _TelemetryManager$Int10 === void 0 ? void 0 : _TelemetryManager$Int10.telemetryDisabled) === false) {
|
|
53
|
-
var _TelemetryManager$Int11, _TelemetryManager$Int20, _TelemetryManager$Int21, _TelemetryManager$Int22, _TelemetryManager$Int23;
|
|
53
|
+
var _TelemetryManager$Int11, _TelemetryManager$Int20, _TelemetryManager$Int21, _TelemetryManager$Int22, _TelemetryManager$Int23, _TelemetryManager$Int24, _TelemetryManager$Int25, _TelemetryManager$Int26;
|
|
54
54
|
if ((_TelemetryManager$Int11 = TelemetryManager.InternalTelemetryData) !== null && _TelemetryManager$Int11 !== void 0 && _TelemetryManager$Int11.ariaConfig) {
|
|
55
55
|
var _TelemetryManager$Int12, _TelemetryManager$Int13, _TelemetryManager$Int14, _TelemetryManager$Int15, _TelemetryManager$Int16, _TelemetryManager$Int17, _TelemetryManager$Int18, _TelemetryManager$Int19;
|
|
56
56
|
loggers.push((0, _ariaTelemetryLogger.ariaTelemetryLogger)(((_TelemetryManager$Int12 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int12 === void 0 ? void 0 : (_TelemetryManager$Int13 = _TelemetryManager$Int12.ariaConfig) === null || _TelemetryManager$Int13 === void 0 ? void 0 : _TelemetryManager$Int13.ariaTelemetryKey) ?? _defaultAriaConfig.defaultAriaConfig.ariaTelemetryKey, ((_TelemetryManager$Int14 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int14 === void 0 ? void 0 : (_TelemetryManager$Int15 = _TelemetryManager$Int14.ariaConfig) === null || _TelemetryManager$Int15 === void 0 ? void 0 : _TelemetryManager$Int15.disableCookieUsage) ?? _defaultAriaConfig.defaultAriaConfig.disableCookieUsage, ((_TelemetryManager$Int16 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int16 === void 0 ? void 0 : (_TelemetryManager$Int17 = _TelemetryManager$Int16.ariaConfig) === null || _TelemetryManager$Int17 === void 0 ? void 0 : _TelemetryManager$Int17.collectorUriForTelemetry) ?? _defaultAriaConfig.defaultAriaConfig.collectorUriForTelemetry, ((_TelemetryManager$Int18 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int18 === void 0 ? void 0 : (_TelemetryManager$Int19 = _TelemetryManager$Int18.ariaConfig) === null || _TelemetryManager$Int19 === void 0 ? void 0 : _TelemetryManager$Int19.ariaTelemetryApplicationName) ?? _defaultAriaConfig.defaultAriaConfig.ariaTelemetryApplicationName));
|
|
@@ -61,12 +61,15 @@ const RegisterLoggers = () => {
|
|
|
61
61
|
loggers.push(logger);
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
const chatConfigAppInsightsKey = (_TelemetryManager$Int22 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int22 === void 0 ? void 0 : _TelemetryManager$Int22.chatConfigAppInsightsKey;
|
|
65
|
+
const appInsightsKeyFromUser = (_TelemetryManager$Int23 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int23 === void 0 ? void 0 : (_TelemetryManager$Int24 = _TelemetryManager$Int23.appInsightsConfig) === null || _TelemetryManager$Int24 === void 0 ? void 0 : _TelemetryManager$Int24.appInsightsKey;
|
|
66
|
+
// when chatConfig has AppInsightsInstrumentationKey
|
|
67
|
+
if (chatConfigAppInsightsKey) {
|
|
68
|
+
loggers.push((0, _appInsightsLogger.appInsightsLogger)(chatConfigAppInsightsKey));
|
|
69
|
+
}
|
|
70
|
+
// when key set through appInsightsConfig
|
|
71
|
+
else if (appInsightsKeyFromUser && ((_TelemetryManager$Int25 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int25 === void 0 ? void 0 : (_TelemetryManager$Int26 = _TelemetryManager$Int25.appInsightsConfig) === null || _TelemetryManager$Int26 === void 0 ? void 0 : _TelemetryManager$Int26.appInsightsDisabled) === false) {
|
|
72
|
+
loggers.push((0, _appInsightsLogger.appInsightsLogger)(appInsightsKeyFromUser));
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
};
|
|
@@ -14,15 +14,12 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
14
14
|
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; }
|
|
15
15
|
var AllowedKeys;
|
|
16
16
|
(function (AllowedKeys) {
|
|
17
|
-
AllowedKeys["
|
|
18
|
-
AllowedKeys["
|
|
19
|
-
AllowedKeys["
|
|
20
|
-
AllowedKeys["
|
|
17
|
+
AllowedKeys["OrganizationId"] = "powerplatform.analytics.resource.organization.id";
|
|
18
|
+
AllowedKeys["ConversationId"] = "powerplatform.analytics.resource.id";
|
|
19
|
+
AllowedKeys["ElapsedTimeInMilliseconds"] = "Duration";
|
|
20
|
+
AllowedKeys["Description"] = "omnichannel.description";
|
|
21
|
+
AllowedKeys["ChannelId"] = "omnichannel.channel.type";
|
|
21
22
|
AllowedKeys["LCWRuntimeId"] = "ClientSessionId";
|
|
22
|
-
AllowedKeys["ConversationId"] = "LiveWorkItemId";
|
|
23
|
-
AllowedKeys["ChatId"] = "ChatThreadId";
|
|
24
|
-
AllowedKeys["OrganizationId"] = "OrganizationId";
|
|
25
|
-
AllowedKeys["ElapsedTimeInMilliseconds"] = "DurationInMilliseconds";
|
|
26
23
|
})(AllowedKeys || (AllowedKeys = {}));
|
|
27
24
|
let initializationPromise = null;
|
|
28
25
|
const appInsightsLogger = appInsightsKey => {
|
|
@@ -95,11 +92,11 @@ const appInsightsLogger = appInsightsKey => {
|
|
|
95
92
|
if (!_logger) return;
|
|
96
93
|
const eventName = telemetryInput === null || telemetryInput === void 0 ? void 0 : (_telemetryInput$paylo = telemetryInput.payload) === null || _telemetryInput$paylo === void 0 ? void 0 : _telemetryInput$paylo.Event;
|
|
97
94
|
const telemetryInfo = telemetryInput === null || telemetryInput === void 0 ? void 0 : (_telemetryInput$telem = telemetryInput.telemetryInfo) === null || _telemetryInput$telem === void 0 ? void 0 : _telemetryInput$telem.telemetryInfo;
|
|
98
|
-
const eventProperties = setEventProperties(telemetryInfo);
|
|
99
95
|
if (eventName) {
|
|
100
96
|
const trackingEventName = getTrackingEventName(logLevel, eventName);
|
|
101
|
-
|
|
102
|
-
|
|
97
|
+
const eventProperties = setEventProperties(trackingEventName, telemetryInfo);
|
|
98
|
+
_logger.trackTrace({
|
|
99
|
+
message: trackingEventName,
|
|
103
100
|
properties: eventProperties
|
|
104
101
|
});
|
|
105
102
|
}
|
|
@@ -116,17 +113,36 @@ const appInsightsLogger = appInsightsKey => {
|
|
|
116
113
|
};
|
|
117
114
|
|
|
118
115
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
-
function setEventProperties(telemetryInfo) {
|
|
116
|
+
function setEventProperties(eventName, telemetryInfo) {
|
|
120
117
|
const eventProperties = {};
|
|
121
118
|
if (telemetryInfo) {
|
|
122
119
|
for (const key in AllowedKeys) {
|
|
123
|
-
const finalKey = AllowedKeys[key]; // get renamed keys for LCWRuntimeId, ConversationId
|
|
120
|
+
const finalKey = AllowedKeys[key]; // get renamed keys for LCWRuntimeId, ConversationId
|
|
124
121
|
const value = telemetryInfo[key];
|
|
125
122
|
if (value !== undefined && value !== null && value !== "") {
|
|
126
123
|
eventProperties[finalKey] = value;
|
|
127
124
|
}
|
|
128
125
|
}
|
|
129
126
|
}
|
|
127
|
+
// Include exception details in description for error events
|
|
128
|
+
if (telemetryInfo !== null && telemetryInfo !== void 0 && telemetryInfo.ExceptionDetails) {
|
|
129
|
+
eventProperties[AllowedKeys.Description] = JSON.stringify(telemetryInfo.ExceptionDetails);
|
|
130
|
+
}
|
|
131
|
+
const customProperties = (() => {
|
|
132
|
+
if (!(telemetryInfo !== null && telemetryInfo !== void 0 && telemetryInfo.CustomProperties)) {
|
|
133
|
+
return {};
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
return typeof telemetryInfo.CustomProperties === "string" ? JSON.parse(telemetryInfo.CustomProperties) : telemetryInfo.CustomProperties;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.warn("Failed to parse CustomProperties:", error);
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
})();
|
|
142
|
+
// Additional properties
|
|
143
|
+
eventProperties["ConversationStage"] = customProperties.ConversationStage ?? _TelemetryConstants.ConversationStage.CSREngagement;
|
|
144
|
+
eventProperties["Scenario"] = "Conversation Diagnostics";
|
|
145
|
+
eventProperties["powerplatform.analytics.subscenario"] = eventName.includes(": ") ? eventName.split(": ")[1] : eventName;
|
|
130
146
|
return eventProperties;
|
|
131
147
|
}
|
|
132
148
|
function getTrackingEventName(logLevel, eventName) {
|
|
@@ -7,70 +7,42 @@ exports.detectAndCleanXSS = void 0;
|
|
|
7
7
|
var _dompurify = _interopRequireDefault(require("dompurify"));
|
|
8
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Sanitizes text input and detects XSS attack patterns.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* against various XSS techniques including script injection, event handler injection, style-based
|
|
15
|
-
* attacks, and encoded payloads.
|
|
12
|
+
* Sanitizes first with DOMPurify, then checks for malicious patterns in both
|
|
13
|
+
* the original and sanitized text to catch mutation XSS attacks.
|
|
16
14
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* - HTML event handlers (onmouseover, onclick, etc.)
|
|
20
|
-
* - Script tags (<script>)
|
|
21
|
-
* - CSS expression() functions
|
|
22
|
-
* - CSS url() functions
|
|
23
|
-
* - Position-based CSS attacks (position: fixed/absolute)
|
|
24
|
-
* - VBScript protocol URLs
|
|
25
|
-
* - Data URLs with HTML content
|
|
26
|
-
* - Fragment identifiers with escaped quotes
|
|
27
|
-
* - HTML entity-encoded angle brackets
|
|
28
|
-
*
|
|
29
|
-
* @param text - The input text to be analyzed and sanitized
|
|
30
|
-
* @returns An object containing:
|
|
31
|
-
* - cleanText: The sanitized version of the input text with all HTML tags and attributes removed
|
|
32
|
-
* - isXSSDetected: Boolean flag indicating whether potential XSS patterns were found in the original text
|
|
15
|
+
* @param text - Input text to sanitize
|
|
16
|
+
* @returns Object with cleanText (sanitized) and isXSSDetected flag
|
|
33
17
|
*/
|
|
34
18
|
const detectAndCleanXSS = text => {
|
|
35
|
-
//
|
|
36
|
-
const xssPatterns = [/javascript\s*:/gi,
|
|
37
|
-
// JavaScript protocol URLs (with optional spaces)
|
|
38
|
-
/vbscript\s*:/gi,
|
|
39
|
-
// VBScript protocol URLs (with optional spaces)
|
|
40
|
-
/on\w+\s*=/gi,
|
|
41
|
-
// HTML event handlers (onmouseover, onclick, onload, etc.)
|
|
42
|
-
/<\s*script/gi,
|
|
43
|
-
// Script tag opening (with optional spaces)
|
|
44
|
-
/expression\s*\(/gi,
|
|
45
|
-
// CSS expression() function (IE-specific)
|
|
46
|
-
/url\s*\(/gi,
|
|
47
|
-
// CSS url() function
|
|
48
|
-
/style\s*=.*position\s*:\s*fixed/gi,
|
|
49
|
-
// CSS position fixed attacks
|
|
50
|
-
/style\s*=.*position\s*:\s*absolute/gi,
|
|
51
|
-
// CSS position absolute attacks
|
|
52
|
-
/data\s*:\s*text\s*\/\s*html/gi,
|
|
53
|
-
// Data URLs containing HTML
|
|
54
|
-
/#.*\\"/gi,
|
|
55
|
-
// Fragment identifiers with escaped quotes
|
|
56
|
-
/>.*</gi // HTML entity-encoded angle brackets indicating tag structure
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
// Check if any XSS patterns are detected in the input text
|
|
60
|
-
const isXSSDetected = xssPatterns.some(pattern => pattern.test(text));
|
|
61
|
-
|
|
62
|
-
// Clean the text using DOMPurify with strict config
|
|
19
|
+
// Sanitize first to prevent mutation XSS (e.g., "s<iframe></iframe>tyle" → "style")
|
|
63
20
|
const cleanText = _dompurify.default.sanitize(text, {
|
|
64
21
|
ALLOWED_TAGS: [],
|
|
65
|
-
// No HTML tags allowed in title
|
|
66
22
|
ALLOWED_ATTR: [],
|
|
67
23
|
KEEP_CONTENT: true,
|
|
68
|
-
// Keep text content
|
|
69
24
|
ALLOW_DATA_ATTR: false,
|
|
70
25
|
ALLOW_UNKNOWN_PROTOCOLS: false,
|
|
71
26
|
SANITIZE_DOM: true,
|
|
72
27
|
FORCE_BODY: false
|
|
73
28
|
});
|
|
29
|
+
const contentChanged = text !== cleanText;
|
|
30
|
+
|
|
31
|
+
// Non-global regex patterns to avoid stateful .test() issues
|
|
32
|
+
const xssPatterns = [/javascript\s*:/i, /vbscript\s*:/i, /on\w+\s*=/i,
|
|
33
|
+
// Event handlers
|
|
34
|
+
/<\s*script/i, /<\s*iframe/i, /<\s*object/i, /<\s*embed/i, /<\s*svg/i, /expression\s*\(/i,
|
|
35
|
+
// IE CSS expressions
|
|
36
|
+
/style\s*=.*position\s*:\s*(fixed|absolute)/i, /data\s*:\s*text\s*\/\s*html/i, /#.*\\"/i, /&(lt|gt|#x3c|#60|#x3e|#62);/i,
|
|
37
|
+
// HTML entities
|
|
38
|
+
/&#x?[0-9a-f]+;.*</i, /\u003c.*\u003e/i,
|
|
39
|
+
// Unicode escapes
|
|
40
|
+
/src\s*=\s*["']?\s*javascript:/i, /href\s*=\s*["']?\s*javascript:/i];
|
|
41
|
+
const hasXSSPattern = xssPatterns.some(pattern => {
|
|
42
|
+
return pattern.test(text) || pattern.test(cleanText);
|
|
43
|
+
});
|
|
44
|
+
const hasHTMLStructure = /<[^>]+>/.test(text) && !/<[^>]+>/.test(cleanText);
|
|
45
|
+
const isXSSDetected = contentChanged || hasXSSPattern || hasHTMLStructure;
|
|
74
46
|
return {
|
|
75
47
|
cleanText,
|
|
76
48
|
isXSSDetected
|
package/lib/cjs/common/utils.js
CHANGED
|
@@ -7,7 +7,9 @@ exports.getCustomEventValue = exports.getConversationDetailsCall = exports.getBr
|
|
|
7
7
|
exports.getDeviceType = getDeviceType;
|
|
8
8
|
exports.getWidgetEndChatEventName = exports.getWidgetCacheIdfromProps = exports.getWidgetCacheId = exports.getTimestampHourMinute = exports.getStateFromCache = exports.getLocaleDirection = exports.getIconText = exports.getDomain = void 0;
|
|
9
9
|
exports.isEndConversationDueToOverflowActivity = isEndConversationDueToOverflowActivity;
|
|
10
|
-
exports.
|
|
10
|
+
exports.parseAdaptiveCardPayload = exports.newGuid = exports.isValidCustomEvent = exports.isUndefinedOrEmpty = exports.isThisSessionPopout = exports.isNullOrUndefined = exports.isNullOrEmptyString = void 0;
|
|
11
|
+
exports.parseBooleanFromConfig = parseBooleanFromConfig;
|
|
12
|
+
exports.setTabIndices = exports.setOcUserAgent = exports.setFocusOnSendBox = exports.setFocusOnElement = exports.preventFocusToMoveOutOfElement = exports.parseLowerCaseString = void 0;
|
|
11
13
|
var _Constants = require("./Constants");
|
|
12
14
|
var _TelemetryConstants = require("./telemetry/TelemetryConstants");
|
|
13
15
|
var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
|
|
@@ -478,7 +480,7 @@ const setOcUserAgent = chatSDK => {
|
|
|
478
480
|
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
479
481
|
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/"))) {
|
|
480
482
|
try {
|
|
481
|
-
const version = require("
|
|
483
|
+
const version = require("../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
|
|
482
484
|
const userAgent = `omnichannel-chat-widget/${version}`;
|
|
483
485
|
chatSDK.OCClient.ocUserAgent = [userAgent, ...chatSDK.OCClient.ocUserAgent];
|
|
484
486
|
} catch (error) {
|
|
@@ -519,4 +521,15 @@ exports.getCustomEventValue = getCustomEventValue;
|
|
|
519
521
|
function isEndConversationDueToOverflowActivity(activity) {
|
|
520
522
|
var _activity$channelData, _activity$channelData2;
|
|
521
523
|
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);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Parses a value that can be boolean or string ("true"/"false") into a boolean.
|
|
528
|
+
* Handles null/undefined by returning false.
|
|
529
|
+
*
|
|
530
|
+
* @param value - The value to parse (can be boolean, string, null, or undefined)
|
|
531
|
+
* @returns true if value is true or "true" (case-insensitive), false otherwise
|
|
532
|
+
*/
|
|
533
|
+
function parseBooleanFromConfig(value) {
|
|
534
|
+
return value === true || (value === null || value === void 0 ? void 0 : value.toString().toLowerCase()) === "true";
|
|
522
535
|
}
|
|
@@ -26,7 +26,10 @@ const ChatButtonStateful = props => {
|
|
|
26
26
|
uiTimer = (0, _utils.createTimer)();
|
|
27
27
|
_TelemetryHelper.TelemetryHelper.logLoadingEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
28
28
|
Event: _TelemetryConstants.TelemetryEvent.UXLCWChatButtonLoadingStart,
|
|
29
|
-
Description: "Chat button loading started"
|
|
29
|
+
Description: "Chat button loading started",
|
|
30
|
+
CustomProperties: {
|
|
31
|
+
ConversationStage: _TelemetryConstants.ConversationStage.Initialization
|
|
32
|
+
}
|
|
30
33
|
});
|
|
31
34
|
}, []);
|
|
32
35
|
|
|
@@ -49,7 +52,10 @@ const ChatButtonStateful = props => {
|
|
|
49
52
|
ref.current = async () => {
|
|
50
53
|
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
51
54
|
Event: _TelemetryConstants.TelemetryEvent.LCWChatButtonClicked,
|
|
52
|
-
Description: "Chat button click action started"
|
|
55
|
+
Description: "Chat button click action started",
|
|
56
|
+
CustomProperties: {
|
|
57
|
+
ConversationStage: _TelemetryConstants.ConversationStage.Initialization
|
|
58
|
+
}
|
|
53
59
|
});
|
|
54
60
|
if (state.appStates.isMinimized) {
|
|
55
61
|
dispatch({
|
|
@@ -69,7 +75,10 @@ const ChatButtonStateful = props => {
|
|
|
69
75
|
}
|
|
70
76
|
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
71
77
|
Event: _TelemetryConstants.TelemetryEvent.LCWChatButtonActionCompleted,
|
|
72
|
-
Description: "Chat button action completed"
|
|
78
|
+
Description: "Chat button action completed",
|
|
79
|
+
CustomProperties: {
|
|
80
|
+
ConversationStage: _TelemetryConstants.ConversationStage.Initialization
|
|
81
|
+
}
|
|
73
82
|
});
|
|
74
83
|
};
|
|
75
84
|
const outOfOfficeStyleProps = Object.assign({}, _defaultOutOfOfficeChatButtonStyleProps.defaultOutOfOfficeChatButtonStyleProps, outOfOfficeButtonProps === null || outOfOfficeButtonProps === void 0 ? void 0 : outOfOfficeButtonProps.styleProps);
|
|
@@ -123,7 +132,10 @@ const ChatButtonStateful = props => {
|
|
|
123
132
|
_TelemetryHelper.TelemetryHelper.logLoadingEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
124
133
|
Event: _TelemetryConstants.TelemetryEvent.UXLCWChatButtonLoadingCompleted,
|
|
125
134
|
Description: "Chat button loading completed",
|
|
126
|
-
ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed
|
|
135
|
+
ElapsedTimeInMilliseconds: uiTimer.milliSecondsElapsed,
|
|
136
|
+
CustomProperties: {
|
|
137
|
+
ConversationStage: _TelemetryConstants.ConversationStage.Initialization
|
|
138
|
+
}
|
|
127
139
|
});
|
|
128
140
|
}, []);
|
|
129
141
|
(0, _react.useEffect)(() => {
|
|
@@ -42,7 +42,7 @@ const CitationPaneStateful = props => {
|
|
|
42
42
|
const [paneStyle, setPaneStyle] = (0, _react.useState)(null);
|
|
43
43
|
const [isReady, setIsReady] = (0, _react.useState)(false);
|
|
44
44
|
|
|
45
|
-
//
|
|
45
|
+
// Initial focus pattern (mirrors ConfirmationPaneStateful): focus first focusable element (will re-attempt after visibility becomes true)
|
|
46
46
|
(0, _react.useEffect)(() => {
|
|
47
47
|
(0, _utils.preventFocusToMoveOutOfElement)(controlId);
|
|
48
48
|
const focusableElements = (0, _utils.findAllFocusableElement)(`#${controlId}`);
|
|
@@ -64,6 +64,25 @@ const CitationPaneStateful = props => {
|
|
|
64
64
|
});
|
|
65
65
|
}, []);
|
|
66
66
|
|
|
67
|
+
// Retry focus once pane is actually visible (isReady) in case initial attempt occurred while wrapper was visibility:hidden
|
|
68
|
+
(0, _react.useEffect)(() => {
|
|
69
|
+
if (!isReady) return;
|
|
70
|
+
const focusableElements = (0, _utils.findAllFocusableElement)(`#${controlId}`);
|
|
71
|
+
if (focusableElements && focusableElements.length > 0) {
|
|
72
|
+
const first = focusableElements[0];
|
|
73
|
+
// If focused element is not already inside the pane, move focus
|
|
74
|
+
if (!first.contains(document.activeElement) && !(document.activeElement && document.activeElement.id.startsWith(controlId))) {
|
|
75
|
+
requestAnimationFrame(() => {
|
|
76
|
+
if (first.isConnected) {
|
|
77
|
+
first.focus({
|
|
78
|
+
preventScroll: true
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}, [isReady, controlId]);
|
|
85
|
+
|
|
67
86
|
// Compute the widget bounds and set pane style accordingly (95% of widget size
|
|
68
87
|
// and centered inside the widget). If the widget container can't be found,
|
|
69
88
|
// fall back to the default pane styles from defaultCitationPaneProps.
|
|
@@ -19,11 +19,12 @@ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "
|
|
|
19
19
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
20
20
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
21
21
|
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
22
23
|
const RenderChildrenFunction = _ref => {
|
|
23
24
|
let {
|
|
24
25
|
children
|
|
25
26
|
} = _ref;
|
|
26
|
-
return typeof children ===
|
|
27
|
+
return typeof children === "function" ? children() : children;
|
|
27
28
|
};
|
|
28
29
|
let ErrorBoundary = /*#__PURE__*/function (_Component) {
|
|
29
30
|
_inherits(ErrorBoundary, _Component);
|
|
@@ -70,7 +70,10 @@ const HeaderStateful = props => {
|
|
|
70
70
|
var _props$headerProps, _props$headerProps$co, _props$headerProps$co2;
|
|
71
71
|
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
72
72
|
Event: _TelemetryConstants.TelemetryEvent.HeaderCloseButtonClicked,
|
|
73
|
-
Description: "Header Close action started."
|
|
73
|
+
Description: "Header Close action started.",
|
|
74
|
+
CustomProperties: {
|
|
75
|
+
ConversationStage: _TelemetryConstants.ConversationStage.ConversationEnd
|
|
76
|
+
}
|
|
74
77
|
});
|
|
75
78
|
if (localConfirmationPaneState.current !== _Constants.ConfirmationState.Ok) {
|
|
76
79
|
dispatch({
|
|
@@ -85,7 +88,10 @@ const HeaderStateful = props => {
|
|
|
85
88
|
}
|
|
86
89
|
_TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
|
|
87
90
|
Event: _TelemetryConstants.TelemetryEvent.CloseChatActionCompleted,
|
|
88
|
-
Description: "Header Close action completed."
|
|
91
|
+
Description: "Header Close action completed.",
|
|
92
|
+
CustomProperties: {
|
|
93
|
+
ConversationStage: _TelemetryConstants.ConversationStage.ConversationEnd
|
|
94
|
+
}
|
|
89
95
|
});
|
|
90
96
|
const closeButtonId = ((_props$headerProps = props.headerProps) === null || _props$headerProps === void 0 ? void 0 : (_props$headerProps$co = _props$headerProps.controlProps) === null || _props$headerProps$co === void 0 ? void 0 : (_props$headerProps$co2 = _props$headerProps$co.closeButtonProps) === null || _props$headerProps$co2 === void 0 ? void 0 : _props$headerProps$co2.id) ?? `${controlProps.id}-close-button`;
|
|
91
97
|
if (closeButtonId) {
|