@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.
Files changed (51) hide show
  1. package/lib/cjs/common/Constants.js +2 -0
  2. package/lib/cjs/common/telemetry/TelemetryConstants.js +3 -0
  3. package/lib/cjs/components/citationpanestateful/CitationDim.js +29 -0
  4. package/lib/cjs/components/citationpanestateful/CitationPaneStateful.js +158 -0
  5. package/lib/cjs/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.js +70 -0
  6. package/lib/cjs/components/confirmationpanestateful/interfaces/IConfirmationPaneLocalizedTexts.js +1 -0
  7. package/lib/cjs/components/livechatwidget/common/endChat.js +5 -1
  8. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +5 -3
  9. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +86 -3
  10. package/lib/cjs/components/webchatcontainerstateful/interfaces/ICitation.js +1 -0
  11. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +97 -30
  12. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +54 -0
  13. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +2 -2
  14. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +46 -45
  15. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -0
  16. package/lib/cjs/contexts/createReducer.js +15 -0
  17. package/lib/esm/common/Constants.js +2 -0
  18. package/lib/esm/common/telemetry/TelemetryConstants.js +3 -0
  19. package/lib/esm/components/citationpanestateful/CitationDim.js +20 -0
  20. package/lib/esm/components/citationpanestateful/CitationPaneStateful.js +147 -0
  21. package/lib/esm/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.js +61 -0
  22. package/lib/esm/components/confirmationpanestateful/interfaces/IConfirmationPaneLocalizedTexts.js +1 -0
  23. package/lib/esm/components/livechatwidget/common/endChat.js +5 -1
  24. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +5 -3
  25. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +86 -4
  26. package/lib/esm/components/webchatcontainerstateful/interfaces/ICitation.js +1 -0
  27. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.js +98 -30
  28. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.js +46 -0
  29. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +2 -2
  30. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +46 -45
  31. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -0
  32. package/lib/esm/contexts/createReducer.js +15 -0
  33. package/lib/types/common/Constants.d.ts +2 -0
  34. package/lib/types/common/telemetry/TelemetryConstants.d.ts +3 -0
  35. package/lib/types/components/citationpanestateful/CitationDim.d.ts +5 -0
  36. package/lib/types/components/citationpanestateful/CitationPaneStateful.d.ts +4 -0
  37. package/lib/types/components/citationpanestateful/common/defaultProps/defaultCitationPaneProps.d.ts +11 -0
  38. package/lib/types/components/citationpanestateful/interfaces/ICitationPaneStatefulProps.d.ts +10 -0
  39. package/lib/types/components/confirmationpanestateful/common/defaultProps/defaultConfirmationPaneLocalizedTexts.d.ts +1 -1
  40. package/lib/types/components/confirmationpanestateful/interfaces/IConfirmationPaneStatefulProps.d.ts +1 -1
  41. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +3 -1
  42. package/lib/types/components/webchatcontainerstateful/interfaces/ICitation.d.ts +12 -0
  43. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/citationsMiddleware.d.ts +3 -4
  44. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware.d.ts +5 -0
  45. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +2 -2
  46. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  47. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +46 -45
  48. package/package.json +2 -2
  49. /package/lib/cjs/components/{confirmationpanestateful/interfaces/IConfirmationPaneLocalizedText.js → citationpanestateful/interfaces/ICitationPaneStatefulProps.js} +0 -0
  50. /package/lib/esm/components/{confirmationpanestateful/interfaces/IConfirmationPaneLocalizedText.js → citationpanestateful/interfaces/ICitationPaneStatefulProps.js} +0 -0
  51. /package/lib/types/components/confirmationpanestateful/interfaces/{IConfirmationPaneLocalizedText.d.ts → IConfirmationPaneLocalizedTexts.d.ts} +0 -0
@@ -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
- let isConversationalSurveyEnabled = state.appStates.isConversationalSurveyEnabled;
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
- ...((_props$webChatContain26 = props.webChatContainerProps) === null || _props$webChatContain26 === void 0 ? void 0 : _props$webChatContain26.webChatProps)
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;
@@ -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
- export const createCitationsMiddleware = _ref => {
4
- let {
5
- dispatch
6
- } = _ref;
7
- return next => action => {
8
- var _action$payload;
9
- if ((_action$payload = action.payload) !== null && _action$payload !== void 0 && _action$payload.activity) {
10
- if (isApplicable(action)) {
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
- const gptFeedback = JSON.parse(action.payload.activity.channelData.metadata["pva:gpt-feedback"]);
13
- // Replace citations in the text
14
- const updatedText = replaceCitations(action.payload.activity.text, gptFeedback.summarizationOpenAIResponse.result.textCitations);
15
- action.payload.activity.text = updatedText;
16
- } catch (error) {
17
- TelemetryHelper.logActionEvent(LogLevel.ERROR, {
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 converting citation labels",
21
- Exception: error
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
- return next(action);
28
- };
78
+ }
79
+ return next(action);
29
80
  };
30
81
  const isApplicable = action => {
31
- var _action$payload2, _action$payload2$acti, _action$payload3, _action$payload3$acti;
32
- if ((action === null || action === void 0 ? void 0 : (_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.actionType) === "DIRECT_LINE/INCOMING_ACTIVITY" && (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.channelId) === "ACS_CHANNEL") {
33
- var _action$payload4, _action$payload4$acti, _action$payload4$acti2, _action$payload4$acti3;
34
- // Validate if pva:gpt-feedback exists and is not null
35
- if (action !== null && action !== void 0 && (_action$payload4 = action.payload) !== null && _action$payload4 !== void 0 && (_action$payload4$acti = _action$payload4.activity) !== null && _action$payload4$acti !== void 0 && (_action$payload4$acti2 = _action$payload4$acti.channelData) !== null && _action$payload4$acti2 !== void 0 && (_action$payload4$acti3 = _action$payload4$acti2.metadata) !== null && _action$payload4$acti3 !== void 0 && _action$payload4$acti3["pva:gpt-feedback"]) {
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
- return text.replace(/\[(\d+)\]:\s(cite:\d+)\s"([^"]+)"/g, (match, number, citeId) => {
47
- const citation = citations.find(c => c.id === citeId);
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
- // Replace only the citation label while preserving the original format
50
- return `[${number}]: ${citeId} "${citation.title}"`;
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; // Keep the original match if no replacement is found
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["SET_GLOBAL_DIR"] = 3] = "SET_GLOBAL_DIR";
7
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_MINIMIZED"] = 4] = "SET_MINIMIZED";
8
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_STATE"] = 5] = "SET_CONVERSATION_STATE";
9
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PREVIOUS_FOCUSED_ELEMENT_ID"] = 6] = "SET_PREVIOUS_FOCUSED_ELEMENT_ID";
10
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_FAILING"] = 7] = "SET_START_CHAT_FAILING";
11
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_FAILURE_TYPE"] = 8] = "SET_START_CHAT_FAILURE_TYPE";
12
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_OUTSIDE_OPERATING_HOURS"] = 9] = "SET_OUTSIDE_OPERATING_HOURS";
13
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PRE_CHAT_SURVEY_RESPONSE"] = 10] = "SET_PRE_CHAT_SURVEY_RESPONSE";
14
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CUSTOM_CONTEXT"] = 11] = "SET_CUSTOM_CONTEXT";
15
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOW_CONFIRMATION"] = 12] = "SET_SHOW_CONFIRMATION";
16
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOW_EMAIL_TRANSCRIPT_PANE"] = 13] = "SET_SHOW_EMAIL_TRANSCRIPT_PANE";
17
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PRECHAT_RESPONSE_EMAIL"] = 14] = "SET_PRECHAT_RESPONSE_EMAIL";
18
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_AUDIO_NOTIFICATION"] = 15] = "SET_AUDIO_NOTIFICATION";
19
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_E2VV_ENABLED"] = 16] = "SET_E2VV_ENABLED";
20
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_CONTEXT"] = 17] = "SET_POST_CHAT_CONTEXT";
21
- LiveChatWidgetActionType[LiveChatWidgetActionType["SHOW_CALLING_CONTAINER"] = 18] = "SHOW_CALLING_CONTAINER";
22
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_INCOMING_CALL"] = 19] = "SET_INCOMING_CALL";
23
- LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_VIDEO_CALL"] = 20] = "DISABLE_VIDEO_CALL";
24
- LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_LOCAL_VIDEO"] = 21] = "DISABLE_LOCAL_VIDEO";
25
- LiveChatWidgetActionType[LiveChatWidgetActionType["DISABLE_REMOTE_VIDEO"] = 22] = "DISABLE_REMOTE_VIDEO";
26
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CHAT_TOKEN"] = 23] = "SET_CHAT_TOKEN";
27
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_START_CHAT_BUTTON_DISPLAY"] = 24] = "SET_START_CHAT_BUTTON_DISPLAY";
28
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_PROACTIVE_CHAT_PARAMS"] = 25] = "SET_PROACTIVE_CHAT_PARAMS";
29
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_TELEMETRY_DATA"] = 26] = "SET_TELEMETRY_DATA";
30
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_RECONNECT_ID"] = 27] = "SET_RECONNECT_ID";
31
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_UNREAD_MESSAGE_COUNT"] = 28] = "SET_UNREAD_MESSAGE_COUNT";
32
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_FOCUS_CHAT_BUTTON"] = 29] = "SET_FOCUS_CHAT_BUTTON";
33
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED"] = 30] = "SET_CONVERSATION_ENDED_BY_AGENT_EVENT_RECEIVED";
34
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY"] = 31] = "SET_CONVERSATION_ENDED_BY";
35
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_STATE"] = 32] = "SET_WIDGET_STATE";
36
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 33] = "SET_LIVE_CHAT_CONTEXT";
37
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 34] = "SET_BOT_OAUTH_SIGNIN_ID";
38
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 35] = "SET_WIDGET_SIZE";
39
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_INSTANCE_ID"] = 36] = "SET_WIDGET_INSTANCE_ID";
40
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONFIG"] = 37] = "SET_LIVE_CHAT_CONFIG";
41
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_WORKFLOW_IN_PROGRESS"] = 38] = "SET_POST_CHAT_WORKFLOW_IN_PROGRESS";
42
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_INITIAL_CHAT_SDK_REQUEST_ID"] = 39] = "SET_INITIAL_CHAT_SDK_REQUEST_ID";
43
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SHOULD_USE_BOT_SURVEY"] = 40] = "SET_SHOULD_USE_BOT_SURVEY";
44
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CHAT_DISCONNECT_EVENT_RECEIVED"] = 41] = "SET_CHAT_DISCONNECT_EVENT_RECEIVED";
45
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_SURVEY_MODE"] = 42] = "SET_SURVEY_MODE";
46
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONFIRMATION_STATE"] = 43] = "SET_CONFIRMATION_STATE";
47
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_POST_CHAT_PARTICIPANT_TYPE"] = 44] = "SET_POST_CHAT_PARTICIPANT_TYPE";
48
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATIONAL_SURVEY_ENABLED"] = 45] = "SET_CONVERSATIONAL_SURVEY_ENABLED";
49
- LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATIONAL_SURVEY_DISPLAY"] = 46] = "SET_CONVERSATIONAL_SURVEY_DISPLAY";
50
- LiveChatWidgetActionType[LiveChatWidgetActionType["GET_IN_MEMORY_STATE"] = 47] = "GET_IN_MEMORY_STATE";
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",
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export declare const CitationDim: React.FC<{
3
+ brightness?: string;
4
+ }>;
5
+ export default CitationDim;
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { ICitationPaneStatefulProps } from "./interfaces/ICitationPaneStatefulProps";
3
+ export declare const CitationPaneStateful: (props: ICitationPaneStatefulProps) => React.JSX.Element;
4
+ export default CitationPaneStateful;
@@ -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;