@microsoft/omnichannel-chat-widget 1.8.2-main.4b1a5f0 → 1.8.2-main.5195aba

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 (63) hide show
  1. package/README.md +2 -0
  2. package/lib/cjs/common/Constants.js +12 -4
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +1 -0
  4. package/lib/cjs/common/utils.js +7 -1
  5. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +28 -15
  6. package/lib/cjs/components/draggable/DraggableChatWidget.js +16 -1
  7. package/lib/cjs/components/headerstateful/HeaderStateful.js +12 -2
  8. package/lib/cjs/components/livechatwidget/LiveChatWidget.js +2 -8
  9. package/lib/cjs/components/livechatwidget/common/createInternetConnectionChangeHandler.js +22 -9
  10. package/lib/cjs/components/livechatwidget/common/endChat.js +18 -7
  11. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +30 -1
  12. package/lib/cjs/components/livechatwidget/common/liveChatConfigUtils.js +18 -1
  13. package/lib/cjs/components/livechatwidget/common/renderSurveyHelpers.js +31 -7
  14. package/lib/cjs/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +15 -2
  15. package/lib/cjs/components/livechatwidget/common/startChat.js +5 -3
  16. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +22 -11
  17. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +52 -14
  18. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +4 -3
  19. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +12 -6
  20. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +45 -0
  21. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +3 -1
  22. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +3 -1
  23. package/lib/cjs/contexts/createReducer.js +30 -0
  24. package/lib/cjs/controller/componentController.js +2 -2
  25. package/lib/cjs/firstresponselatency/util.js +52 -27
  26. package/lib/cjs/plugins/newMessageEventHandler.js +12 -6
  27. package/lib/esm/common/Constants.js +10 -3
  28. package/lib/esm/common/telemetry/TelemetryConstants.js +1 -0
  29. package/lib/esm/common/utils.js +4 -0
  30. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +28 -15
  31. package/lib/esm/components/draggable/DraggableChatWidget.js +16 -1
  32. package/lib/esm/components/headerstateful/HeaderStateful.js +12 -2
  33. package/lib/esm/components/livechatwidget/LiveChatWidget.js +2 -8
  34. package/lib/esm/components/livechatwidget/common/createInternetConnectionChangeHandler.js +22 -9
  35. package/lib/esm/components/livechatwidget/common/endChat.js +18 -7
  36. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +30 -1
  37. package/lib/esm/components/livechatwidget/common/liveChatConfigUtils.js +16 -0
  38. package/lib/esm/components/livechatwidget/common/renderSurveyHelpers.js +33 -9
  39. package/lib/esm/components/livechatwidget/common/setPostChatContextAndLoadSurvey.js +16 -3
  40. package/lib/esm/components/livechatwidget/common/startChat.js +5 -3
  41. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +22 -11
  42. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +52 -14
  43. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.js +4 -4
  44. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.js +12 -6
  45. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.js +38 -0
  46. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +3 -1
  47. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +3 -1
  48. package/lib/esm/contexts/createReducer.js +30 -0
  49. package/lib/esm/controller/componentController.js +2 -2
  50. package/lib/esm/firstresponselatency/util.js +49 -25
  51. package/lib/esm/plugins/newMessageEventHandler.js +12 -6
  52. package/lib/types/common/Constants.d.ts +9 -3
  53. package/lib/types/common/telemetry/TelemetryConstants.d.ts +1 -0
  54. package/lib/types/common/utils.d.ts +5 -0
  55. package/lib/types/components/livechatwidget/common/liveChatConfigUtils.d.ts +1 -0
  56. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware.d.ts +1 -1
  57. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/conversationEndMiddleware.d.ts +1 -1
  58. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/queueOverflowHandlerMiddleware.d.ts +5 -0
  59. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +2 -0
  60. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +3 -1
  61. package/lib/types/firstresponselatency/util.d.ts +17 -0
  62. package/lib/types/plugins/newMessageEventHandler.d.ts +1 -1
  63. package/package.json +4 -4
@@ -17,7 +17,7 @@ export const shouldShowEmailTranscriptPane = state => {
17
17
  return state.uiStates.showEmailTranscriptPane;
18
18
  };
19
19
  export const shouldShowWebChatContainer = state => {
20
- return !state.appStates.isMinimized && state.appStates.conversationState === ConversationState.Active || state.appStates.conversationState === ConversationState.InActive;
20
+ return !state.appStates.isMinimized && state.appStates.conversationState === ConversationState.Active || state.appStates.conversationState === ConversationState.InActive || state.appStates.conversationState === ConversationState.Postchat && state.appStates.isConversationalSurveyEnabled && state.appStates.isConversationalSurvey;
21
21
  };
22
22
  export const shouldShowLoadingPane = state => {
23
23
  return !state.appStates.isMinimized && state.appStates.conversationState === ConversationState.Loading;
@@ -42,7 +42,7 @@ export const shouldShowConfirmationPane = state => {
42
42
  return state.uiStates.showConfirmationPane;
43
43
  };
44
44
  export const shouldShowPostChatSurveyPane = state => {
45
- return state.appStates.conversationState === ConversationState.Postchat;
45
+ return state.appStates.conversationState === ConversationState.Postchat && !state.appStates.isConversationalSurvey;
46
46
  };
47
47
  export const shouldShowCallingContainer = state => {
48
48
  return state.appStates.conversationState === ConversationState.Active && state.appStates.e2vvEnabled;
@@ -1,35 +1,59 @@
1
1
  import { ScenarioType } from "./Constants";
2
2
  import { Constants } from "../common/Constants";
3
+ /**
4
+ * Determines whether a given activity is a historical message.
5
+ *
6
+ * This function checks if the activity is a message type and uses a combination
7
+ * of legacy tags and timestamp-based logic to determine if the message is historical.
8
+ *
9
+ * @param {IActivity} activity - The activity object to evaluate.
10
+ * @param {number} startTime - The start time (in milliseconds since epoch) to compare against.
11
+ * @returns {boolean} - Returns true if the activity is a historical message, false otherwise.
12
+ *
13
+ * Logic:
14
+ * - If the activity type is not a message, it is not historical.
15
+ * - If the activity contains a legacy history message tag, it is considered historical.
16
+ * - Otherwise, the function extracts a timestamp from the activity ID using `extractTimestampFromId`.
17
+ * - If the ID is valid and the timestamp is older than the start time, the message is historical.
18
+ */
3
19
  export const isHistoryMessage = (activity, startTime) => {
4
- try {
5
- if ((activity === null || activity === void 0 ? void 0 : activity.type) === Constants.message) {
6
- var _activity$channelData, _activity$channelData2;
7
- // this is an old piece of code, probably no longer relevant
8
- if (activity !== null && activity !== void 0 && (_activity$channelData = activity.channelData) !== null && _activity$channelData !== void 0 && (_activity$channelData2 = _activity$channelData.tags) !== null && _activity$channelData2 !== void 0 && _activity$channelData2.includes(Constants.historyMessageTag)) return true;
20
+ var _activity$channelData, _activity$channelData2;
21
+ // Only process message activities
22
+ if ((activity === null || activity === void 0 ? void 0 : activity.type) !== Constants.message) {
23
+ return false;
24
+ }
9
25
 
10
- // Id is an epoch time in milliseconds , in utc format, for some reason is in a string format
11
- if (activity !== null && activity !== void 0 && activity.id) {
12
- /// activity.id is an string that contains epoch time in milliseconds
13
- const activityId = parseInt(activity === null || activity === void 0 ? void 0 : activity.id);
26
+ // Legacy check for history message tag
27
+ if (activity !== null && activity !== void 0 && (_activity$channelData = activity.channelData) !== null && _activity$channelData !== void 0 && (_activity$channelData2 = _activity$channelData.tags) !== null && _activity$channelData2 !== void 0 && _activity$channelData2.includes(Constants.historyMessageTag)) {
28
+ return true;
29
+ }
30
+ const activityId = extractTimestampFromId(activity);
31
+ const isValidId = !isNaN(activityId) && activityId > 0;
32
+ const isOlderThanStartTime = activityId < startTime;
33
+ const isHistoryById = isValidId && isOlderThanStartTime;
34
+ return isHistoryById;
35
+ };
36
+ export const extractTimestampFromId = activity => {
37
+ const id = (activity === null || activity === void 0 ? void 0 : activity.id) ?? "";
14
38
 
15
- // if the activity id is not a number, we default to new message
16
- if (isNaN(activityId)) {
17
- return false;
18
- }
39
+ // Helper function to get timestamp fallback
40
+ const getTimestampFallback = () => {
41
+ const timestamp = new Date((activity === null || activity === void 0 ? void 0 : activity.timestamp) ?? "").getTime();
42
+ return isNaN(timestamp) ? 0 : timestamp;
43
+ };
19
44
 
20
- // if the activity id is less than the start time, it means that the message is a history message
21
- if (activityId < startTime) {
22
- return true;
23
- }
24
- }
25
- // anything else will be considered a new message
26
- return false;
27
- }
28
- } catch (e) {
29
- // if there is an error in parsing the activity id, we will consider it a new message
30
- console.error("Error in parsing activity id: ", e);
45
+ // Check if ID looks like a UUID (contains dashes or is very long)
46
+ const UUID_LENGTH_THRESHOLD = 13; // Threshold to distinguish UUIDs from epoch timestamps
47
+ if (id.includes("-") || id.length > UUID_LENGTH_THRESHOLD) {
48
+ // Likely UUID, use timestamp instead
49
+ return getTimestampFallback();
50
+ }
51
+ const activityId = parseInt(id);
52
+ // if activity id is not a number, then we use timestamp field
53
+ if (isNaN(activityId)) {
54
+ return getTimestampFallback();
31
55
  }
32
- return false;
56
+ return activityId;
33
57
  };
34
58
  export const buildMessagePayload = (activity, userId) => {
35
59
  var _text, _text2, _activity$channelData3, _activity$from;
@@ -6,13 +6,13 @@ import { Constants } from "../common/Constants";
6
6
  import { FirstResponseLatencyTracker } from "../firstresponselatency/FirstResponseLatencyTracker";
7
7
  import { TelemetryHelper } from "../common/telemetry/TelemetryHelper";
8
8
  import { TelemetryManager } from "../common/telemetry/TelemetryManager";
9
- export const createOnNewAdapterActivityHandler = (chatId, userId) => {
9
+ export const createOnNewAdapterActivityHandler = (chatId, userId, startTime) => {
10
10
  // Hooking the message tracker in the listener, a bit invasive but easier to control.
11
11
  const firstResponseLatencyTracker = new FirstResponseLatencyTracker();
12
12
  // epoch time in utc for when start to listen.
13
13
  // We dont longer have a mechanism to know if a message is history or new, so any message older than the time we start listening will be considered a history message.
14
14
  // this is a workaround for the fact that we dont have a way to identify if a message is history or new, and it will provide consistency across different scenarios
15
- const startTime = new Date().getTime();
15
+
16
16
  let isHistoryMessageReceivedEventRaised = false;
17
17
  const onNewAdapterActivityHandler = activity => {
18
18
  raiseMessageEvent(activity);
@@ -35,6 +35,7 @@ export const createOnNewAdapterActivityHandler = (chatId, userId) => {
35
35
  });
36
36
  };
37
37
  const systemMessageStrategy = activity => {
38
+ var _TelemetryManager$Int3;
38
39
  const payload = buildMessagePayload(activity, userId);
39
40
  payload.messageType = Constants.systemMessageTag;
40
41
  if (isHistoryMessage(activity, startTime)) {
@@ -42,6 +43,11 @@ export const createOnNewAdapterActivityHandler = (chatId, userId) => {
42
43
  historyMessageStrategy(polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int2 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int2 === void 0 ? void 0 : _TelemetryManager$Int2.conversationId));
43
44
  return;
44
45
  }
46
+ const newMessageReceivedEvent = {
47
+ eventName: BroadcastEvent.NewMessageReceived,
48
+ payload: polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int3 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int3 === void 0 ? void 0 : _TelemetryManager$Int3.conversationId)
49
+ };
50
+ BroadcastService.postMessage(newMessageReceivedEvent);
45
51
  TelemetryHelper.logActionEventToAllTelemetry(LogLevel.INFO, {
46
52
  Event: TelemetryEvent.SystemMessageReceived,
47
53
  Description: "System message received"
@@ -77,20 +83,20 @@ export const createOnNewAdapterActivityHandler = (chatId, userId) => {
77
83
  return true;
78
84
  };
79
85
  const receivedMessageStrategy = activity => {
80
- var _TelemetryManager$Int4;
86
+ var _TelemetryManager$Int5;
81
87
  if (!isValidMessage(activity)) return;
82
88
  const isHistoryMessageReceived = isHistoryMessage(activity, startTime);
83
89
  const payload = buildMessagePayload(activity, userId);
84
90
  payload.messageType = Constants.userMessageTag;
85
91
  if (isHistoryMessageReceived) {
86
- var _TelemetryManager$Int3;
87
- historyMessageStrategy(polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int3 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int3 === void 0 ? void 0 : _TelemetryManager$Int3.conversationId));
92
+ var _TelemetryManager$Int4;
93
+ historyMessageStrategy(polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int4 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int4 === void 0 ? void 0 : _TelemetryManager$Int4.conversationId));
88
94
  return;
89
95
  }
90
96
  firstResponseLatencyTracker.stopClock(payload);
91
97
  const newMessageReceivedEvent = {
92
98
  eventName: BroadcastEvent.NewMessageReceived,
93
- payload: polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int4 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int4 === void 0 ? void 0 : _TelemetryManager$Int4.conversationId)
99
+ payload: polyfillMessagePayloadForEvent(activity, payload, (_TelemetryManager$Int5 = TelemetryManager.InternalTelemetryData) === null || _TelemetryManager$Int5 === void 0 ? void 0 : _TelemetryManager$Int5.conversationId)
94
100
  };
95
101
  BroadcastService.postMessage(newMessageReceivedEvent);
96
102
  TelemetryHelper.logActionEventToAllTelemetry(LogLevel.INFO, {
@@ -7,6 +7,9 @@ export declare class Constants {
7
7
  static readonly historyMessageTag = "history";
8
8
  static readonly agentEndConversationMessageTag = "agentendconversation";
9
9
  static readonly supervisorForceCloseMessageTag = "supervisorforceclosedconversation";
10
+ static readonly endConversationalSurveyMessageTag = "endconversationalsurvey";
11
+ static readonly startConversationalSurveyMessageTag = "startconversationalsurvey";
12
+ static readonly c2ConversationalSurveyMessageTag = "c2conversationalsurvey";
10
13
  static readonly receivedMessageClassName = "ms_lcw_webchat_received_message";
11
14
  static readonly sentMessageClassName = "ms_lcw_webchat_sent_message";
12
15
  static readonly webchatChannelId = "webchat";
@@ -80,8 +83,7 @@ export declare class Constants {
80
83
  static readonly TargetRelationship = "rel";
81
84
  static readonly TargetRelationshipAttributes = "noopener noreferrer";
82
85
  static readonly OpenLinkIconCssClass = "webchat__render-markdown__external-link-icon";
83
- static readonly internetConnectionTestUrl = "https://ocsdk-prod.azureedge.net/public/connecttest.txt";
84
- static readonly internetConnectionTestUrlText = "Omnichannel Connect Test";
86
+ static readonly internetConnectionTestPath = "/livechatwidget/version.txt";
85
87
  static readonly ChatWidgetStateChangedPrefix = "ChatWidgetStateChanged";
86
88
  static readonly PostChatLoadingDurationInMs = 2000;
87
89
  static readonly BrowserUnloadConfirmationMessage = "Do you want to leave chat?";
@@ -94,10 +96,11 @@ export declare class Constants {
94
96
  static readonly OCOriginalMessageId = "OriginalMessageId";
95
97
  static readonly WebchatSequenceIdAttribute = "webchat:sequence-id";
96
98
  static readonly MessageSequenceIdOverride = "MessageSequenceIdOverride";
99
+ static readonly EndConversationDueToOverflow = "endconversationduetooverflow";
97
100
  }
98
101
  export declare const Regex: {
99
102
  new (): {};
100
- readonly EmailRegex: "(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
103
+ readonly EmailRegex: "^(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\])$";
101
104
  };
102
105
  export declare class HtmlIdNames {
103
106
  static readonly MSLiveChatWidget = "MSLiveChatWidget";
@@ -180,6 +183,9 @@ export declare enum ConversationMode {
180
183
  Regular = "192350000",
181
184
  Persistent = "192350001"
182
185
  }
186
+ export declare enum SurveyProvider {
187
+ MicrosoftCopilotStudio = "600990001"
188
+ }
183
189
  export declare enum LiveWorkItemState {
184
190
  Active = "Active",
185
191
  Closed = "Closed",
@@ -172,6 +172,7 @@ export declare enum TelemetryEvent {
172
172
  BotAuthActivityUndefinedSignInId = "BotAuthActivityUndefinedSignInId",
173
173
  ThirdPartyCookiesBlocked = "ThirdPartyCookiesBlocked",
174
174
  ParticipantsRemovedEvent = "ParticipantsRemovedEvent",
175
+ QueueOverflowEvent = "QueueOverflowEvent",
175
176
  ProcessingHTMLTextMiddlewareFailed = "ProcessingHTMLTextMiddlewareFailed",
176
177
  ProcessingSanitizationMiddlewareFailed = "ProcessingSanitizationMiddlewareFailed",
177
178
  FormatTagsMiddlewareJSONStringifyFailed = "FormatTagsMiddlewareJSONStringifyFailed",
@@ -47,3 +47,8 @@ export declare const formatTemplateString: (templateMessage: string, values: any
47
47
  export declare const parseLowerCaseString: (property: string | boolean | undefined) => string;
48
48
  export declare const setOcUserAgent: (chatSDK: any) => void;
49
49
  export declare function getDeviceType(): string;
50
+ export declare function isEndConversationDueToOverflowActivity(activity: {
51
+ channelData?: {
52
+ tags?: string[];
53
+ };
54
+ }): boolean | undefined;
@@ -1,3 +1,4 @@
1
1
  import { FacadeChatSDK } from "../../../common/facades/FacadeChatSDK";
2
2
  export declare const isPostChatSurveyEnabled: (facadeChatSDK: FacadeChatSDK) => Promise<boolean>;
3
+ export declare const getPostChatSurveyConfig: (facadeChatSDK: FacadeChatSDK) => Promise<any>;
3
4
  export declare const isPersistentChatEnabled: (conversationMode: string | undefined) => boolean;
@@ -4,7 +4,7 @@
4
4
  * Adds necessary tags if not present so that the rendering middlewares can process them later.
5
5
  ******/
6
6
  import { IWebChatAction } from "../../../interfaces/IWebChatAction";
7
- declare const channelDataMiddleware: ({ dispatch }: {
7
+ declare const channelDataMiddleware: (addConversationalSurveyTagsCallback: any) => ({ dispatch }: {
8
8
  dispatch: any;
9
9
  }) => (next: any) => (action: IWebChatAction) => any;
10
10
  export default channelDataMiddleware;
@@ -5,7 +5,7 @@
5
5
  * The callback is then invoked to hide the send box (by default).
6
6
  ******/
7
7
  import { IWebChatAction } from "../../../interfaces/IWebChatAction";
8
- declare const createConversationEndMiddleware: (conversationEndCallback: any) => ({ dispatch }: {
8
+ declare const createConversationEndMiddleware: (conversationEndCallback: any, startConversationalSurveyCallback: any, endConversationalSurveyCallback: any) => ({ dispatch }: {
9
9
  dispatch: any;
10
10
  }) => (next: any) => (action: IWebChatAction) => any;
11
11
  export default createConversationEndMiddleware;
@@ -0,0 +1,5 @@
1
+ import { IWebChatAction } from "../../../interfaces/IWebChatAction";
2
+ import { ILiveChatWidgetContext } from "../../../../../contexts/common/ILiveChatWidgetContext";
3
+ import { Dispatch } from "react";
4
+ import { ILiveChatWidgetAction } from "../../../../../contexts/common/ILiveChatWidgetAction";
5
+ export declare const createQueueOverflowMiddleware: (state: ILiveChatWidgetContext, dispatch: Dispatch<ILiveChatWidgetAction>) => () => (next: (action: IWebChatAction) => void) => (action: IWebChatAction) => void;
@@ -48,6 +48,8 @@ export interface ILiveChatWidgetContext {
48
48
  chatDisconnectEventReceived: boolean;
49
49
  selectedSurveyMode: string | null;
50
50
  postChatParticipantType: undefined | ParticipantType;
51
+ isConversationalSurvey: boolean;
52
+ isConversationalSurveyEnabled: boolean;
51
53
  };
52
54
  uiStates: {
53
55
  showConfirmationPane: boolean;
@@ -44,5 +44,7 @@ export declare enum LiveChatWidgetActionType {
44
44
  SET_SURVEY_MODE = 42,
45
45
  SET_CONFIRMATION_STATE = 43,
46
46
  SET_POST_CHAT_PARTICIPANT_TYPE = 44,
47
- GET_IN_MEMORY_STATE = 45
47
+ SET_CONVERSATIONAL_SURVEY_ENABLED = 45,
48
+ SET_CONVERSATIONAL_SURVEY_DISPLAY = 46,
49
+ GET_IN_MEMORY_STATE = 47
48
50
  }
@@ -1,6 +1,23 @@
1
1
  import { MessagePayload, ScenarioType, TrackingMessage } from "./Constants";
2
2
  import { IActivity } from "botframework-directlinejs";
3
+ /**
4
+ * Determines whether a given activity is a historical message.
5
+ *
6
+ * This function checks if the activity is a message type and uses a combination
7
+ * of legacy tags and timestamp-based logic to determine if the message is historical.
8
+ *
9
+ * @param {IActivity} activity - The activity object to evaluate.
10
+ * @param {number} startTime - The start time (in milliseconds since epoch) to compare against.
11
+ * @returns {boolean} - Returns true if the activity is a historical message, false otherwise.
12
+ *
13
+ * Logic:
14
+ * - If the activity type is not a message, it is not historical.
15
+ * - If the activity contains a legacy history message tag, it is considered historical.
16
+ * - Otherwise, the function extracts a timestamp from the activity ID using `extractTimestampFromId`.
17
+ * - If the ID is valid and the timestamp is older than the start time, the message is historical.
18
+ */
3
19
  export declare const isHistoryMessage: (activity: IActivity, startTime: number) => boolean;
20
+ export declare const extractTimestampFromId: (activity: IActivity) => number;
4
21
  export declare const buildMessagePayload: (activity: IActivity, userId: string) => MessagePayload;
5
22
  export declare const polyfillMessagePayloadForEvent: (activity: IActivity, payload: MessagePayload, conversationId?: string) => MessagePayload;
6
23
  export declare const getScenarioType: (activity: IActivity) => ScenarioType;
@@ -1,2 +1,2 @@
1
1
  import { IActivity } from "botframework-directlinejs";
2
- export declare const createOnNewAdapterActivityHandler: (chatId: string, userId: string) => (activity: IActivity) => void;
2
+ export declare const createOnNewAdapterActivityHandler: (chatId: string, userId: string, startTime: number) => (activity: IActivity) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.8.2-main.4b1a5f0",
3
+ "version": "1.8.2-main.5195aba",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -87,7 +87,7 @@
87
87
  "@azure/core-tracing": "^1.2.0",
88
88
  "@microsoft/applicationinsights-web": "^3.3.6",
89
89
  "@microsoft/omnichannel-chat-components": "1.1.12",
90
- "@microsoft/omnichannel-chat-sdk": "^1.11.2",
90
+ "@microsoft/omnichannel-chat-sdk": "^1.11.4",
91
91
  "@opentelemetry/api": "^1.9.0",
92
92
  "abort-controller": "^3",
93
93
  "abort-controller-es5": "^2.0.1",
@@ -121,8 +121,8 @@
121
121
  "build:umd": "webpack --config ./webpack.umd.config.cjs",
122
122
  "verify": "yarn install && yarn build-storybook && yarn test:all && yarn build && yarn storybook",
123
123
  "testpack": "yarn build && yarn pack",
124
- "build-sample": "yarn build && webpack --config ./webpack.config.cjs",
125
- "build-sample:dev": "yarn build && webpack --config ./webpack.dev.config.cjs",
124
+ "build-sample": "yarn build && cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config ./webpack.config.cjs",
125
+ "build-sample:dev": "yarn build && cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config ./webpack.dev.config.cjs",
126
126
  "test:visual:build": "yarn build-storybook && yarn test:visual",
127
127
  "lint": "yarn eslint . --max-warnings=0",
128
128
  "prepush": "yarn lint && yarn danger:prepush",