@microsoft/omnichannel-chat-widget 1.8.3-main.3445895 → 1.8.3-main.4743fdc
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/lib/cjs/common/Constants.js +2 -0
- package/lib/cjs/common/telemetry/TelemetryConstants.js +3 -0
- package/lib/cjs/components/citationpanestateful/CitationDim.js +29 -0
- package/lib/cjs/components/citationpanestateful/CitationPaneStateful.js +158 -0
- package/lib/cjs/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.js +70 -0
- package/lib/cjs/components/confirmationpanestateful/interfaces/IConfirmationPaneLocalizedTexts.js +1 -0
- package/lib/cjs/components/livechatwidget/common/endChat.js +5 -1
- package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +5 -3
- package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +86 -3
- package/lib/cjs/components/webchatcontainerstateful/interfaces/ICitation.js +1 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +97 -30
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +54 -0
- package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +2 -2
- package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +46 -45
- package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -0
- package/lib/cjs/contexts/createReducer.js +15 -0
- package/lib/esm/common/Constants.js +2 -0
- package/lib/esm/common/telemetry/TelemetryConstants.js +3 -0
- package/lib/esm/components/citationpanestateful/CitationDim.js +20 -0
- package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +147 -0
- package/lib/esm/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.js +61 -0
- package/lib/esm/components/confirmationpanestateful/interfaces/IConfirmationPaneLocalizedTexts.js +1 -0
- package/lib/esm/components/livechatwidget/common/endChat.js +5 -1
- package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +5 -3
- package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +86 -4
- package/lib/esm/components/webchatcontainerstateful/interfaces/ICitation.js +1 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +98 -30
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +46 -0
- package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +2 -2
- package/lib/esm/contexts/common/LiveChatWidgetActionType.js +46 -45
- package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -0
- package/lib/esm/contexts/createReducer.js +15 -0
- package/lib/types/common/Constants.d.ts +2 -0
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +3 -0
- package/lib/types/components/citationpanestateful/CitationDim.d.ts +5 -0
- package/lib/types/components/citationpanestateful/CitationPaneStateful.d.ts +4 -0
- package/lib/types/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.d.ts +11 -0
- package/lib/types/components/citationpanestateful/interfaces/ICitationPaneStatefulProps.d.ts +10 -0
- package/lib/types/components/confirmationpanestateful/common/defaultProps/defaultConfirmationPaneLocalizedTexts.d.ts +1 -1
- package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulProps.d.ts +1 -1
- package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +3 -1
- package/lib/types/components/webchatcontainerstateful/interfaces/ICitation.d.ts +12 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +3 -4
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +5 -0
- package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +2 -2
- package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
- package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +46 -45
- package/package.json +2 -2
- /package/lib/cjs/components/{confirmationpanestateful/interfaces/IConfirmationPaneLocalizedText.js → citationpanestateful/interfaces/ICitationPaneStatefulProps.js} +0 -0
- /package/lib/esm/components/{confirmationpanestateful/interfaces/IConfirmationPaneLocalizedText.js → citationpanestateful/interfaces/ICitationPaneStatefulProps.js} +0 -0
- /package/lib/types/components/confirmationpanestateful/interfaces/{IConfirmationPaneLocalizedText.d.ts → IConfirmationPaneLocalizedTexts.d.ts} +0 -0
package/lib/esm/components/confirmationpanestateful/interfaces/IConfirmationPaneLocalizedTexts.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -39,7 +39,7 @@ const prepareEndChat = async (props, facadeChatSDK, state, dispatch, setAdapter,
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
// Use Case: If ended by Agent, stay chat in InActive state
|
|
42
|
-
|
|
42
|
+
const isConversationalSurveyEnabled = state.appStates.isConversationalSurveyEnabled;
|
|
43
43
|
if (isConversationalSurveyEnabled && ((state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.conversationEndedBy) === ConversationEndEntity.Agent || (state === null || state === void 0 ? void 0 : (_state$appStates3 = state.appStates) === null || _state$appStates3 === void 0 ? void 0 : _state$appStates3.conversationEndedBy) === ConversationEndEntity.Bot)) {
|
|
44
44
|
dispatch({
|
|
45
45
|
type: LiveChatWidgetActionType.SET_CONVERSATION_STATE,
|
|
@@ -296,6 +296,10 @@ export const closeChatStateCleanUp = dispatch => {
|
|
|
296
296
|
proactiveChatInNewWindow: false
|
|
297
297
|
}
|
|
298
298
|
});
|
|
299
|
+
dispatch({
|
|
300
|
+
type: LiveChatWidgetActionType.SET_CITATIONS,
|
|
301
|
+
payload: {}
|
|
302
|
+
});
|
|
299
303
|
|
|
300
304
|
// Clear live chat context only if chat widget is fully closed to support transcript calls after sessionclose is called
|
|
301
305
|
dispatch({
|
|
@@ -39,10 +39,11 @@ import htmlPlayerMiddleware from "../../webchatcontainerstateful/webchatcontroll
|
|
|
39
39
|
import htmlTextMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware";
|
|
40
40
|
import preProcessingMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware";
|
|
41
41
|
import sanitizationMiddleware from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware";
|
|
42
|
+
import { localizedStringsBotInitialsMiddleware, getOverriddenLocalizedStrings } from "../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware";
|
|
42
43
|
|
|
43
44
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
45
|
export const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) => {
|
|
45
|
-
var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _props$webChatContain5, _props$webChatContain6, _state$domainStates$l4, _state$domainStates$l5, _props$webChatContain11, _props$webChatContain12, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain13, _props$webChatContain14, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain15, _props$webChatContain16, _defaultWebChatContai, _props$webChatContain17, _props$webChatContain18, _props$webChatContain19, _props$webChatContain20, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain21, _props$webChatContain22, _defaultWebChatContai2, _props$webChatContain23, _props$webChatContain24, _defaultWebChatContai3, _props$webChatContain25, _props$webChatContain26;
|
|
46
|
+
var _props$webChatContain, _props$webChatContain2, _props$webChatContain3, _props$webChatContain4, _props$webChatContain5, _props$webChatContain6, _state$domainStates$l4, _state$domainStates$l5, _props$webChatContain11, _props$webChatContain12, _state$domainStates$r, _state$domainStates$r2, _props$webChatContain13, _props$webChatContain14, _state$domainStates$r3, _state$domainStates$r4, _props$webChatContain15, _props$webChatContain16, _defaultWebChatContai, _props$webChatContain17, _props$webChatContain18, _props$webChatContain19, _props$webChatContain20, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain21, _props$webChatContain22, _defaultWebChatContai2, _props$webChatContain23, _props$webChatContain24, _defaultWebChatContai3, _props$webChatContain25, _props$webChatContain26, _props$webChatContain27, _props$webChatContain28;
|
|
46
47
|
// Add a hook to make all links open a new window
|
|
47
48
|
postDomPurifyActivities();
|
|
48
49
|
const localizedTexts = {
|
|
@@ -117,7 +118,7 @@ export const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endCh
|
|
|
117
118
|
};
|
|
118
119
|
webChatStore = createStore({},
|
|
119
120
|
//initial state
|
|
120
|
-
preProcessingMiddleware, attachmentProcessingMiddleware, createAttachmentUploadValidatorMiddleware((_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), createCustomEventMiddleware(BroadcastService), createQueueOverflowMiddleware(state, dispatch), channelDataMiddleware(addConversationalSurveyTagsCallback), createConversationEndMiddleware(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), createDataMaskingMiddleware((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), createMessageTimeStampMiddleware, createMessageSequenceIdOverrideMiddleware, createCitationsMiddleware, gifUploadMiddleware, htmlPlayerMiddleware, htmlTextMiddleware(honorsTargetInHTMLLinks), createMaxMessageSizeValidator(localizedTexts), sanitizationMiddleware, createCallActionMiddleware(),
|
|
121
|
+
preProcessingMiddleware, attachmentProcessingMiddleware, createAttachmentUploadValidatorMiddleware((_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), createCustomEventMiddleware(BroadcastService), createQueueOverflowMiddleware(state, dispatch), channelDataMiddleware(addConversationalSurveyTagsCallback), createConversationEndMiddleware(conversationEndCallback, startConversationalSurveyCallback, endConversationalSurveyCallback), createDataMaskingMiddleware((_state$domainStates$l3 = state.domainStates.liveChatConfig) === null || _state$domainStates$l3 === void 0 ? void 0 : _state$domainStates$l3.DataMaskingInfo), createMessageTimeStampMiddleware, createMessageSequenceIdOverrideMiddleware, createCitationsMiddleware(state, dispatch), gifUploadMiddleware, htmlPlayerMiddleware, htmlTextMiddleware(honorsTargetInHTMLLinks), createMaxMessageSizeValidator(localizedTexts), sanitizationMiddleware, createCallActionMiddleware(), localizedStringsBotInitialsMiddleware(),
|
|
121
122
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
122
123
|
...(((_props$webChatContain7 = props.webChatContainerProps) === null || _props$webChatContain7 === void 0 ? void 0 : _props$webChatContain7.storeMiddlewares) ?? []));
|
|
123
124
|
WebChatStoreLoader.store = webChatStore;
|
|
@@ -171,7 +172,8 @@ export const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endCh
|
|
|
171
172
|
onTelemetry: createWebChatTelemetry(),
|
|
172
173
|
cardActionMiddleware: createCardActionMiddleware(((_props$webChatContain25 = props.webChatContainerProps) === null || _props$webChatContain25 === void 0 ? void 0 : _props$webChatContain25.botMagicCode) || undefined),
|
|
173
174
|
sendTypingIndicator: true,
|
|
174
|
-
|
|
175
|
+
overrideLocalizedStrings: getOverriddenLocalizedStrings((_props$webChatContain26 = props.webChatContainerProps) === null || _props$webChatContain26 === void 0 ? void 0 : (_props$webChatContain27 = _props$webChatContain26.webChatProps) === null || _props$webChatContain27 === void 0 ? void 0 : _props$webChatContain27.overrideLocalizedStrings),
|
|
176
|
+
...((_props$webChatContain28 = props.webChatContainerProps) === null || _props$webChatContain28 === void 0 ? void 0 : _props$webChatContain28.webChatProps)
|
|
175
177
|
};
|
|
176
178
|
return webChatProps;
|
|
177
179
|
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
|
|
3
1
|
import { Constants, HtmlAttributeNames, HtmlClassNames } from "../../common/Constants";
|
|
4
2
|
import { Stack } from "@fluentui/react";
|
|
5
3
|
import { LogLevel, TelemetryEvent } from "../../common/telemetry/TelemetryConstants";
|
|
6
|
-
import React, { useEffect } from "react";
|
|
4
|
+
import React, { useEffect, useRef, useState } from "react";
|
|
7
5
|
import { createTimer, getDeviceType, setFocusOnSendBox } from "../../common/utils";
|
|
8
6
|
import { BotMagicCodeStore } from "./webchatcontroller/BotMagicCodeStore";
|
|
7
|
+
import CitationPaneStateful from "../citationpanestateful/CitationPaneStateful";
|
|
9
8
|
import { Components } from "botframework-webchat";
|
|
10
9
|
import { LiveChatWidgetActionType } from "../../contexts/common/LiveChatWidgetActionType";
|
|
11
10
|
import { NotificationHandler } from "./webchatcontroller/notification/NotificationHandler";
|
|
@@ -23,6 +22,7 @@ import { defaultWebChatContainerStatefulProps } from "./common/defaultProps/defa
|
|
|
23
22
|
import { useChatContextStore } from "../..";
|
|
24
23
|
let uiTimer;
|
|
25
24
|
const broadcastChannelMessageEvent = "message";
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
26
|
const postActivity = activity => {
|
|
27
27
|
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
28
28
|
return {
|
|
@@ -55,6 +55,17 @@ export const WebChatContainerStateful = props => {
|
|
|
55
55
|
Event: TelemetryEvent.UXWebchatContainerCompleted
|
|
56
56
|
});
|
|
57
57
|
}, []);
|
|
58
|
+
|
|
59
|
+
// Citation pane state
|
|
60
|
+
const [citationPaneOpen, setCitationPaneOpen] = useState(false);
|
|
61
|
+
const [citationPaneText, setCitationPaneText] = useState("");
|
|
62
|
+
|
|
63
|
+
// Guard to prevent handling multiple rapid clicks which could cause
|
|
64
|
+
// the dim layer and pane to re-render out of sync and create a flicker.
|
|
65
|
+
const citationOpeningRef = useRef(false);
|
|
66
|
+
|
|
67
|
+
// ...existing code...
|
|
68
|
+
|
|
58
69
|
const {
|
|
59
70
|
BasicWebChat
|
|
60
71
|
} = Components;
|
|
@@ -63,6 +74,53 @@ export const WebChatContainerStateful = props => {
|
|
|
63
74
|
webChatContainerProps,
|
|
64
75
|
contextDataStore
|
|
65
76
|
} = props;
|
|
77
|
+
|
|
78
|
+
// Delegated click handler for citation anchors. Placed after state is
|
|
79
|
+
// available so we can prefer reading citations from app state and fall
|
|
80
|
+
// back to the legacy window map for backward-compatibility in tests.
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
const clickHandler = ev => {
|
|
83
|
+
try {
|
|
84
|
+
if (citationOpeningRef.current) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const target = ev.target;
|
|
88
|
+
// Only consider anchors whose href starts with the citation scheme
|
|
89
|
+
const anchor = target.closest && target.closest("a[href^=\"cite:\"]");
|
|
90
|
+
if (anchor) {
|
|
91
|
+
ev.preventDefault();
|
|
92
|
+
citationOpeningRef.current = true;
|
|
93
|
+
// Rely only on the href to identify the citation key
|
|
94
|
+
let text = "";
|
|
95
|
+
try {
|
|
96
|
+
var _state$domainStates;
|
|
97
|
+
const cid = anchor.getAttribute("href");
|
|
98
|
+
// Prefer state-based citations injected by middleware
|
|
99
|
+
if (state !== null && state !== void 0 && (_state$domainStates = state.domainStates) !== null && _state$domainStates !== void 0 && _state$domainStates.citations && cid) {
|
|
100
|
+
text = state.domainStates.citations[cid] ?? "";
|
|
101
|
+
}
|
|
102
|
+
// If state lookup failed, fall back to the anchor's title or innerText
|
|
103
|
+
if (!text) {
|
|
104
|
+
text = anchor.getAttribute("title") || anchor.innerText || "";
|
|
105
|
+
}
|
|
106
|
+
} catch (e) {
|
|
107
|
+
// ignore
|
|
108
|
+
}
|
|
109
|
+
setCitationPaneOpen(true);
|
|
110
|
+
setCitationPaneText(text);
|
|
111
|
+
|
|
112
|
+
// Simple debounce - reset guard after a short delay
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
citationOpeningRef.current = false;
|
|
115
|
+
}, 100);
|
|
116
|
+
}
|
|
117
|
+
} catch (e) {
|
|
118
|
+
citationOpeningRef.current = false;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
document.addEventListener("click", clickHandler);
|
|
122
|
+
return () => document.removeEventListener("click", clickHandler);
|
|
123
|
+
}, [state]);
|
|
66
124
|
const containerStyles = {
|
|
67
125
|
root: Object.assign({}, defaultWebChatContainerStatefulProps.containerStyles, webChatContainerProps === null || webChatContainerProps === void 0 ? void 0 : webChatContainerProps.containerStyles, {
|
|
68
126
|
display: state.appStates.isMinimized ? "none" : ""
|
|
@@ -97,8 +155,10 @@ export const WebChatContainerStateful = props => {
|
|
|
97
155
|
localStorage;
|
|
98
156
|
sessionStorage;
|
|
99
157
|
} catch (error) {
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
159
|
if (!window.TPCWarningShown) {
|
|
101
160
|
NotificationHandler.notifyWarning(NotificationScenarios.TPC, (localizedTexts === null || localizedTexts === void 0 ? void 0 : localizedTexts.THIRD_PARTY_COOKIES_BLOCKED_ALERT_MESSAGE) ?? "");
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
162
|
window.TPCWarningShown = true;
|
|
103
163
|
}
|
|
104
164
|
}
|
|
@@ -287,9 +347,31 @@ export const WebChatContainerStateful = props => {
|
|
|
287
347
|
overflow-y: unset;
|
|
288
348
|
}
|
|
289
349
|
|
|
350
|
+
/* Custom styles for carousel hero cards */
|
|
351
|
+
ul.webchat__carousel-filmstrip__attachments .ac-image {
|
|
352
|
+
width: 200px !important;
|
|
353
|
+
height: 150px !important;
|
|
354
|
+
object-fit: cover !important;
|
|
355
|
+
border-radius: 8px !important;
|
|
356
|
+
border: 1px solid #e0e0e0 !important;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.webchat__carousel-filmstrip-attachment .webchat__bubble {
|
|
360
|
+
height: 100% !important;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.webchat__carousel-filmstrip-attachment .webchat__bubble #ms_lcw_webchat_adaptive_card {
|
|
364
|
+
height: 100% !important;
|
|
365
|
+
}
|
|
366
|
+
|
|
290
367
|
`), /*#__PURE__*/React.createElement(Stack, {
|
|
291
368
|
styles: containerStyles,
|
|
292
369
|
className: "webchat__stacked-layout_container"
|
|
293
|
-
}, /*#__PURE__*/React.createElement(BasicWebChat, null))
|
|
370
|
+
}, /*#__PURE__*/React.createElement(BasicWebChat, null)), citationPaneOpen && /*#__PURE__*/React.createElement(CitationPaneStateful, {
|
|
371
|
+
id: HtmlAttributeNames.ocwCitationPaneClassName,
|
|
372
|
+
title: HtmlAttributeNames.ocwCitationPaneTitle,
|
|
373
|
+
contentHtml: citationPaneText,
|
|
374
|
+
onClose: () => setCitationPaneOpen(false)
|
|
375
|
+
}));
|
|
294
376
|
};
|
|
295
377
|
export default WebChatContainerStateful;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,56 +1,125 @@
|
|
|
1
1
|
import { LogLevel, TelemetryEvent } from "../../../../../common/telemetry/TelemetryConstants";
|
|
2
|
+
import { LiveChatWidgetActionType } from "../../../../../contexts/common/LiveChatWidgetActionType";
|
|
2
3
|
import { TelemetryHelper } from "../../../../../common/telemetry/TelemetryHelper";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
import { executeReducer } from "../../../../../contexts/createReducer";
|
|
5
|
+
|
|
6
|
+
// Middleware that extracts citation metadata from incoming ACS activities and
|
|
7
|
+
// updates in-memory app state with a global citation map. Also rewrites
|
|
8
|
+
// per-message citation labels in the activity text to use a stable,
|
|
9
|
+
// message-scoped prefix when the producer provides a message id.
|
|
10
|
+
|
|
11
|
+
export const createCitationsMiddleware = (state, dispatch) => () => next => action => {
|
|
12
|
+
var _action$payload;
|
|
13
|
+
if ((_action$payload = action.payload) !== null && _action$payload !== void 0 && _action$payload.activity) {
|
|
14
|
+
if (isApplicable(action)) {
|
|
15
|
+
try {
|
|
16
|
+
var _action$payload2, _action$payload2$acti, _gptFeedback$summariz, _gptFeedback$summariz2;
|
|
17
|
+
const inMemoryState = executeReducer(state, {
|
|
18
|
+
type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE,
|
|
19
|
+
payload: null
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Use the producer-supplied messageid as a stable per-message prefix
|
|
23
|
+
// when present. Do not derive a prefix from activity.id or timestamps.
|
|
24
|
+
const messagePrefix = ((_action$payload2 = action.payload) === null || _action$payload2 === void 0 ? void 0 : (_action$payload2$acti = _action$payload2.activity) === null || _action$payload2$acti === void 0 ? void 0 : _action$payload2$acti.messageid) ?? "";
|
|
25
|
+
const gptFeedback = JSON.parse(action.payload.activity.channelData.metadata["pva:gpt-feedback"]);
|
|
26
|
+
// Extract citation objects from the model response
|
|
27
|
+
const citations = (_gptFeedback$summariz = gptFeedback.summarizationOpenAIResponse) === null || _gptFeedback$summariz === void 0 ? void 0 : (_gptFeedback$summariz2 = _gptFeedback$summariz.result) === null || _gptFeedback$summariz2 === void 0 ? void 0 : _gptFeedback$summariz2.textCitations;
|
|
28
|
+
// Rewrite inline citation labels in activity.text to match the global map keys
|
|
29
|
+
const updatedText = replaceCitations(action.payload.activity.text, citations, messagePrefix);
|
|
30
|
+
action.payload.activity.text = updatedText;
|
|
31
|
+
// Build a global citation map keyed by the prefixed citation id and
|
|
32
|
+
// dispatch it to app state so the UI container can render citations.
|
|
11
33
|
try {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
34
|
+
var _inMemoryState$domain;
|
|
35
|
+
const citationMap = {};
|
|
36
|
+
if (citations && Array.isArray(citations)) {
|
|
37
|
+
citations.forEach(citation => {
|
|
38
|
+
if (citation !== null && citation !== void 0 && citation.id) {
|
|
39
|
+
// Preserve the 'cite:' scheme so renderer click handling remains consistent
|
|
40
|
+
const idWithoutScheme = citation.id.replace(/^cite:/, "");
|
|
41
|
+
const prefixedId = `cite:${messagePrefix}_${idWithoutScheme}`;
|
|
42
|
+
citationMap[prefixedId] = citation.text || citation.title || "";
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Read current in-memory state to merge with existing citations
|
|
48
|
+
//const inMemoryState = executeReducer(state, { type: LiveChatWidgetActionType.GET_IN_MEMORY_STATE, payload: null });
|
|
49
|
+
const existingCitations = (inMemoryState === null || inMemoryState === void 0 ? void 0 : (_inMemoryState$domain = inMemoryState.domainStates) === null || _inMemoryState$domain === void 0 ? void 0 : _inMemoryState$domain.citations) || {};
|
|
50
|
+
const updatedCitations = {
|
|
51
|
+
...existingCitations,
|
|
52
|
+
...citationMap
|
|
53
|
+
};
|
|
54
|
+
// Always dispatch to app state
|
|
55
|
+
dispatch({
|
|
56
|
+
type: LiveChatWidgetActionType.SET_CITATIONS,
|
|
57
|
+
payload: updatedCitations
|
|
58
|
+
});
|
|
59
|
+
} catch (innerErr) {
|
|
60
|
+
TelemetryHelper.logActionEvent(LogLevel.WARN, {
|
|
18
61
|
Event: TelemetryEvent.CitationMiddlewareFailed,
|
|
19
62
|
ExceptionDetails: {
|
|
20
|
-
ErrorData: "Error while
|
|
21
|
-
Exception:
|
|
63
|
+
ErrorData: "Error while populating citation map",
|
|
64
|
+
Exception: innerErr
|
|
22
65
|
}
|
|
23
66
|
});
|
|
24
67
|
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
70
|
+
Event: TelemetryEvent.CitationMiddlewareFailed,
|
|
71
|
+
ExceptionDetails: {
|
|
72
|
+
ErrorData: "Error while converting citation labels",
|
|
73
|
+
Exception: error
|
|
74
|
+
}
|
|
75
|
+
});
|
|
25
76
|
}
|
|
26
77
|
}
|
|
27
|
-
|
|
28
|
-
|
|
78
|
+
}
|
|
79
|
+
return next(action);
|
|
29
80
|
};
|
|
30
81
|
const isApplicable = action => {
|
|
31
|
-
var _action$
|
|
32
|
-
if ((action === null || action === void 0 ? void 0 : (_action$
|
|
33
|
-
var _action$
|
|
34
|
-
//
|
|
35
|
-
if (action !== null && action !== void 0 && (_action$
|
|
82
|
+
var _action$payload3, _action$payload3$acti, _action$payload4, _action$payload4$acti;
|
|
83
|
+
if ((action === null || action === void 0 ? void 0 : (_action$payload3 = action.payload) === null || _action$payload3 === void 0 ? void 0 : (_action$payload3$acti = _action$payload3.activity) === null || _action$payload3$acti === void 0 ? void 0 : _action$payload3$acti.actionType) === "DIRECT_LINE/INCOMING_ACTIVITY" && (action === null || action === void 0 ? void 0 : (_action$payload4 = action.payload) === null || _action$payload4 === void 0 ? void 0 : (_action$payload4$acti = _action$payload4.activity) === null || _action$payload4$acti === void 0 ? void 0 : _action$payload4$acti.channelId) === "ACS_CHANNEL") {
|
|
84
|
+
var _action$payload5, _action$payload5$acti, _action$payload5$acti2, _action$payload5$acti3;
|
|
85
|
+
// Only applicable for ACS incoming activities that include pva:gpt-feedback
|
|
86
|
+
if (action !== null && action !== void 0 && (_action$payload5 = action.payload) !== null && _action$payload5 !== void 0 && (_action$payload5$acti = _action$payload5.activity) !== null && _action$payload5$acti !== void 0 && (_action$payload5$acti2 = _action$payload5$acti.channelData) !== null && _action$payload5$acti2 !== void 0 && (_action$payload5$acti3 = _action$payload5$acti2.metadata) !== null && _action$payload5$acti3 !== void 0 && _action$payload5$acti3["pva:gpt-feedback"]) {
|
|
36
87
|
return true;
|
|
37
88
|
}
|
|
38
89
|
}
|
|
39
90
|
return false;
|
|
40
91
|
};
|
|
41
|
-
const replaceCitations = (text, citations) => {
|
|
92
|
+
const replaceCitations = (text, citations, messagePrefix) => {
|
|
42
93
|
if (!citations || !Array.isArray(citations)) {
|
|
43
94
|
return text;
|
|
44
95
|
}
|
|
45
96
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
97
|
+
let updatedText = text;
|
|
98
|
+
|
|
99
|
+
// First, handle the citation reference definitions at the end (e.g., [1]: cite:1757450535119_1 "index.html")
|
|
100
|
+
// These should NOT be escaped as they are proper citation definitions
|
|
101
|
+
updatedText = updatedText.replace(/\[(\d+)\]:\s(cite:\d+)\s"([^\\"]+)"/g, (match, number, citeId) => {
|
|
102
|
+
// Attempt to find a citation object matching the inline cite id and
|
|
103
|
+
// update the displayed id/title. When a messagePrefix exists we
|
|
104
|
+
// rewrite the id to the prefixed form so it aligns with the
|
|
105
|
+
// global citation map keys.
|
|
106
|
+
const lookupId = citeId;
|
|
107
|
+
const citation = citations.find(c => c.id === lookupId);
|
|
48
108
|
if (citation) {
|
|
49
|
-
|
|
50
|
-
|
|
109
|
+
const idWithoutScheme = citeId.replace(/^cite:/, "");
|
|
110
|
+
const prefixed = messagePrefix ? `cite:${messagePrefix}_${idWithoutScheme}` : citeId;
|
|
111
|
+
return `[${number}]: ${prefixed} "${citation.title}"`;
|
|
51
112
|
}
|
|
52
|
-
return match;
|
|
113
|
+
return match;
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Second, escape inline citation references that are NOT followed by a colon
|
|
117
|
+
// This handles cases like "[1][2]"" in the middle of text that should be escaped for markdown
|
|
118
|
+
updatedText = updatedText.replace(/\[(\d+)\](?!:)/g, (match, number) => {
|
|
119
|
+
// Escape the brackets to prevent markdown from treating them as incomplete link syntax
|
|
120
|
+
return `[${number}]`;
|
|
53
121
|
});
|
|
122
|
+
return updatedText;
|
|
54
123
|
} catch (error) {
|
|
55
124
|
TelemetryHelper.logActionEvent(LogLevel.ERROR, {
|
|
56
125
|
Event: TelemetryEvent.CitationMiddlewareFailed,
|
|
@@ -59,7 +128,6 @@ const replaceCitations = (text, citations) => {
|
|
|
59
128
|
Exception: error
|
|
60
129
|
}
|
|
61
130
|
});
|
|
62
|
-
// Return the original text in case of issues
|
|
63
131
|
return text;
|
|
64
132
|
}
|
|
65
133
|
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
import { Constants } from "../../../../../common/Constants";
|
|
4
|
+
import { getIconText } from "../../../../../common/utils";
|
|
5
|
+
import { defaultWebChatStyles } from "../../../common/defaultStyles/defaultWebChatStyles";
|
|
6
|
+
import { WebChatActionType } from "../../enums/WebChatActionType";
|
|
7
|
+
let currentAgentInitials = defaultWebChatStyles.botAvatarInitials;
|
|
8
|
+
export const localizedStringsBotInitialsMiddleware = () => _ref => {
|
|
9
|
+
let {
|
|
10
|
+
dispatch
|
|
11
|
+
} = _ref;
|
|
12
|
+
return next => action => {
|
|
13
|
+
if (action.type === WebChatActionType.DIRECT_LINE_INCOMING_ACTIVITY) {
|
|
14
|
+
var _action$payload, _activity$from;
|
|
15
|
+
const activity = (_action$payload = action.payload) === null || _action$payload === void 0 ? void 0 : _action$payload.activity;
|
|
16
|
+
if (activity !== null && activity !== void 0 && (_activity$from = activity.from) !== null && _activity$from !== void 0 && _activity$from.name && activity.from.role !== Constants.userMessageTag && activity.from.name !== Constants.userMessageTag) {
|
|
17
|
+
var _activity$channelData, _activity$channelData2, _activity$tags;
|
|
18
|
+
const agentName = activity.from.name.trim();
|
|
19
|
+
const isSystemMessage = agentName === "__agent__" || agentName.startsWith("__") || ((_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : (_activity$channelData2 = _activity$channelData.tags) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2.includes(Constants.systemMessageTag)) || ((_activity$tags = activity.tags) === null || _activity$tags === void 0 ? void 0 : _activity$tags.includes(Constants.systemMessageTag));
|
|
20
|
+
if (!isSystemMessage && agentName !== "") {
|
|
21
|
+
// Update initials for valid agent/bot names
|
|
22
|
+
const newInitials = getIconText(agentName) || currentAgentInitials;
|
|
23
|
+
currentAgentInitials = newInitials;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return next(action);
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const getOverriddenLocalizedStrings = existingOverrides => {
|
|
31
|
+
return strings => {
|
|
32
|
+
const result = {
|
|
33
|
+
...strings,
|
|
34
|
+
...existingOverrides
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Apply dynamic bot initials to alt text if not already overridden through props
|
|
38
|
+
if (!(existingOverrides !== null && existingOverrides !== void 0 && existingOverrides.ACTIVITY_BOT_SAID_ALT)) {
|
|
39
|
+
result.ACTIVITY_BOT_SAID_ALT = `${currentAgentInitials} said:`;
|
|
40
|
+
}
|
|
41
|
+
if (!(existingOverrides !== null && existingOverrides !== void 0 && existingOverrides.ACTIVITY_BOT_ATTACHED_ALT)) {
|
|
42
|
+
result.ACTIVITY_BOT_ATTACHED_ALT = `${currentAgentInitials} attached:`;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { WebChatActionType } from "../../enums/WebChatActionType";
|
|
2
1
|
import { LogLevel, TelemetryEvent } from "../../../../../common/telemetry/TelemetryConstants";
|
|
3
|
-
import { TelemetryHelper } from "../../../../../common/telemetry/TelemetryHelper";
|
|
4
2
|
import { LiveChatWidgetActionType } from "../../../../../contexts/common/LiveChatWidgetActionType";
|
|
3
|
+
import { TelemetryHelper } from "../../../../../common/telemetry/TelemetryHelper";
|
|
4
|
+
import { WebChatActionType } from "../../enums/WebChatActionType";
|
|
5
5
|
import { executeReducer } from "../../../../../contexts/createReducer";
|
|
6
6
|
import { isEndConversationDueToOverflowActivity } from "../../../../../common/utils";
|
|
7
7
|
const queueOverflowHandlingHelper = async (state, dispatch) => {
|
|
@@ -3,49 +3,50 @@ export let LiveChatWidgetActionType;
|
|
|
3
3
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_ELEMENT_ID"] = 0] = "SET_WIDGET_ELEMENT_ID";
|
|
4
4
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_RENDERING_MIDDLEWARE_PROPS"] = 1] = "SET_RENDERING_MIDDLEWARE_PROPS";
|
|
5
5
|
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_MIDDLEWARE_LOCALIZED_TEXTS"] = 2] = "SET_MIDDLEWARE_LOCALIZED_TEXTS";
|
|
6
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
7
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
8
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
9
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
10
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
11
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
12
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
13
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
14
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
15
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
16
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
17
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
18
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
19
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
20
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
21
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
22
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
23
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
24
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
25
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
26
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
27
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
28
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
29
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
30
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
31
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
32
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
33
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
34
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
35
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
36
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
37
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
38
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
39
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
40
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
41
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
42
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
43
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
44
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
45
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
46
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
47
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
48
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
49
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
50
|
-
LiveChatWidgetActionType[LiveChatWidgetActionType["
|
|
6
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CITATIONS"] = 3] = "SET_CITATIONS";
|
|
7
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_GLOBAL_DIR"] = 4] = "SET_GLOBAL_DIR";
|
|
8
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_MINIMIZED"] = 5] = "SET_MINIMIZED";
|
|
9
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_STATE"] = 6] = "SET_CONVERSATION_STATE";
|
|
10
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PREVIOUS_FOCUSED_ELEMENT_ID"] = 7] = "SET_PREVIOUS_FOCUSED_ELEMENT_ID";
|
|
11
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_FAILING"] = 8] = "SET_START_CHAT_FAILING";
|
|
12
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_FAILURE_TYPE"] = 9] = "SET_START_CHAT_FAILURE_TYPE";
|
|
13
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_OUTSIDE_OPERATING_HOURS"] = 10] = "SET_OUTSIDE_OPERATING_HOURS";
|
|
14
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PRE_CHAT_SURVEY_RESPONSE"] = 11] = "SET_PRE_CHAT_SURVEY_RESPONSE";
|
|
15
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CUSTOM_CONTEXT"] = 12] = "SET_CUSTOM_CONTEXT";
|
|
16
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOW_CONFIRMATION"] = 13] = "SET_SHOW_CONFIRMATION";
|
|
17
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOW_EMAIL_TRANSCRIPT_PANE"] = 14] = "SET_SHOW_EMAIL_TRANSCRIPT_PANE";
|
|
18
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PRECHAT_RESPONSE_EMAIL"] = 15] = "SET_PRECHAT_RESPONSE_EMAIL";
|
|
19
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_AUDIO_NOTIFICATION"] = 16] = "SET_AUDIO_NOTIFICATION";
|
|
20
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_E2VV_ENABLED"] = 17] = "SET_E2VV_ENABLED";
|
|
21
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_CONTEXT"] = 18] = "SET_POST_CHAT_CONTEXT";
|
|
22
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SHOW_CALLING_CONTAINER"] = 19] = "SHOW_CALLING_CONTAINER";
|
|
23
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_INCOMING_CALL"] = 20] = "SET_INCOMING_CALL";
|
|
24
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_VIDEO_CALL"] = 21] = "DISABLE_VIDEO_CALL";
|
|
25
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_LOCAL_VIDEO"] = 22] = "DISABLE_LOCAL_VIDEO";
|
|
26
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_REMOTE_VIDEO"] = 23] = "DISABLE_REMOTE_VIDEO";
|
|
27
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CHAT_TOKEN"] = 24] = "SET_CHAT_TOKEN";
|
|
28
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_BUTTON_DISPLAY"] = 25] = "SET_START_CHAT_BUTTON_DISPLAY";
|
|
29
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PROACTIVE_CHAT_PARAMS"] = 26] = "SET_PROACTIVE_CHAT_PARAMS";
|
|
30
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_TELEMETRY_DATA"] = 27] = "SET_TELEMETRY_DATA";
|
|
31
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_RECONNECT_ID"] = 28] = "SET_RECONNECT_ID";
|
|
32
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_UNREAD_MESSAGE_COUNT"] = 29] = "SET_UNREAD_MESSAGE_COUNT";
|
|
33
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_FOCUS_CHAT_BUTTON"] = 30] = "SET_FOCUS_CHAT_BUTTON";
|
|
34
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED"] = 31] = "SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED";
|
|
35
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY"] = 32] = "SET_CONVERSATION_ENDED_BY";
|
|
36
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_STATE"] = 33] = "SET_WIDGET_STATE";
|
|
37
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 34] = "SET_LIVE_CHAT_CONTEXT";
|
|
38
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 35] = "SET_BOT_OAUTH_SIGNIN_ID";
|
|
39
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 36] = "SET_WIDGET_SIZE";
|
|
40
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_INSTANCE_ID"] = 37] = "SET_WIDGET_INSTANCE_ID";
|
|
41
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONFIG"] = 38] = "SET_LIVE_CHAT_CONFIG";
|
|
42
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_WORKFLOW_IN_PROGRESS"] = 39] = "SET_POST_CHAT_WORKFLOW_IN_PROGRESS";
|
|
43
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_INITIAL_CHAT_SDK_REQUEST_ID"] = 40] = "SET_INITIAL_CHAT_SDK_REQUEST_ID";
|
|
44
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOULD_USE_BOT_SURVEY"] = 41] = "SET_SHOULD_USE_BOT_SURVEY";
|
|
45
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CHAT_DISCONNECT_EVENT_RECEIVED"] = 42] = "SET_CHAT_DISCONNECT_EVENT_RECEIVED";
|
|
46
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SURVEY_MODE"] = 43] = "SET_SURVEY_MODE";
|
|
47
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONFIRMATION_STATE"] = 44] = "SET_CONFIRMATION_STATE";
|
|
48
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_PARTICIPANT_TYPE"] = 45] = "SET_POST_CHAT_PARTICIPANT_TYPE";
|
|
49
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATIONAL_SURVEY_ENABLED"] = 46] = "SET_CONVERSATIONAL_SURVEY_ENABLED";
|
|
50
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATIONAL_SURVEY_DISPLAY"] = 47] = "SET_CONVERSATIONAL_SURVEY_DISPLAY";
|
|
51
|
+
LiveChatWidgetActionType[LiveChatWidgetActionType["GET_IN_MEMORY_STATE"] = 48] = "GET_IN_MEMORY_STATE";
|
|
51
52
|
})(LiveChatWidgetActionType || (LiveChatWidgetActionType = {}));
|
|
@@ -39,6 +39,8 @@ export const getLiveChatWidgetContextInitialState = props => {
|
|
|
39
39
|
domainStates: {
|
|
40
40
|
liveChatConfig: props.chatConfig,
|
|
41
41
|
widgetElementId: "",
|
|
42
|
+
// Map of citation id => content injected by citations middleware
|
|
43
|
+
citations: {},
|
|
42
44
|
renderingMiddlewareProps: (_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.renderingMiddlewareProps,
|
|
43
45
|
middlewareLocalizedTexts: defaultMiddlewareLocalizedTexts,
|
|
44
46
|
preChatSurveyResponse: "{}",
|
|
@@ -62,6 +62,21 @@ const reducer = (state, action) => {
|
|
|
62
62
|
middlewareLocalizedTexts: action.payload
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
|
+
case LiveChatWidgetActionType.SET_CITATIONS:
|
|
66
|
+
inMemory = {
|
|
67
|
+
...inMemory,
|
|
68
|
+
domainStates: {
|
|
69
|
+
...inMemory.domainStates,
|
|
70
|
+
citations: action.payload
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
...state,
|
|
75
|
+
domainStates: {
|
|
76
|
+
...state.domainStates,
|
|
77
|
+
citations: action.payload
|
|
78
|
+
}
|
|
79
|
+
};
|
|
65
80
|
case LiveChatWidgetActionType.SET_GLOBAL_DIR:
|
|
66
81
|
inMemory = {
|
|
67
82
|
...inMemory,
|
|
@@ -153,6 +153,8 @@ export declare class HtmlAttributeNames {
|
|
|
153
153
|
static readonly adaptiveCardTextBlockClassName = "ac-textBlock";
|
|
154
154
|
static readonly adaptiveCardToggleInputClassName = "ac-toggleInput";
|
|
155
155
|
static readonly adaptiveCardActionSetClassName = "ac-actionSet";
|
|
156
|
+
static readonly ocwCitationPaneClassName = "ocw-citation-pane";
|
|
157
|
+
static readonly ocwCitationPaneTitle = "Citation";
|
|
156
158
|
}
|
|
157
159
|
export declare class WebChatMiddlewareConstants {
|
|
158
160
|
static readonly nextVisibleActivity = "nextVisibleActivity";
|
|
@@ -136,6 +136,7 @@ export declare enum TelemetryEvent {
|
|
|
136
136
|
EmailTranscriptLoaded = "EmailTranscriptLoaded",
|
|
137
137
|
OutOfOfficePaneLoaded = "OutOfOfficePaneLoaded",
|
|
138
138
|
ConfirmationPaneLoaded = "ConfirmationPaneLoaded",
|
|
139
|
+
CitationPaneLoaded = "CitationPaneLoaded",
|
|
139
140
|
ProactiveChatPaneLoaded = "ProactiveChatPaneLoaded",
|
|
140
141
|
ReconnectChatPaneLoaded = "ReconnectChatPaneLoaded",
|
|
141
142
|
HeaderCloseButtonClicked = "HeaderCloseButtonClicked",
|
|
@@ -262,7 +263,9 @@ export declare enum TelemetryEvent {
|
|
|
262
263
|
UXLCWChatButtonLoadingStart = "UXLCWChatButtonLoadingStart",
|
|
263
264
|
UXLCWChatButtonLoadingCompleted = "UXLCWChatButtonLoadingCompleted",
|
|
264
265
|
UXConfirmationPaneStart = "UXConfirmationPaneStart",
|
|
266
|
+
UXCitationPaneStart = "UXCitationPaneStart",
|
|
265
267
|
UXConfirmationPaneCompleted = "UXConfirmationPaneCompleted",
|
|
268
|
+
UXCitationPaneCompleted = "UXCitationPaneCompleted",
|
|
266
269
|
UXLiveChatWidgetStart = "UXLiveChatWidgetStart",
|
|
267
270
|
UXLiveChatWidgetCompleted = "UXLiveChatWidgetCompleted",
|
|
268
271
|
AppInsightsInitialized = "AppInsightsInitialized",
|
package/lib/types/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const defaultCitationPaneStyles: {
|
|
2
|
+
pane: React.CSSProperties;
|
|
3
|
+
};
|
|
4
|
+
export declare const defaultCitationContentCSS: (controlId: string) => string;
|
|
5
|
+
declare const _default: {
|
|
6
|
+
defaultCitationPaneStyles: {
|
|
7
|
+
pane: React.CSSProperties;
|
|
8
|
+
};
|
|
9
|
+
defaultCitationContentCSS: (controlId: string) => string;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|