@microsoft/omnichannel-chat-widget 1.8.3 → 1.8.4-main.7bdb634

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 (89) hide show
  1. package/lib/cjs/common/Constants.js +4 -0
  2. package/lib/cjs/common/facades/FacadeChatSDK.js +6 -0
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +31 -0
  4. package/lib/cjs/common/utils/SecureEventBus.js +307 -0
  5. package/lib/cjs/common/utils/dispatchCustomEvent.js +25 -0
  6. package/lib/cjs/components/livechatwidget/common/ActivitySubscriber/AddActivitySubscriber.js +127 -0
  7. package/lib/cjs/components/livechatwidget/common/ChatWidgetEvents.js +15 -0
  8. package/lib/cjs/components/livechatwidget/common/PersistentConversationHandler.js +284 -0
  9. package/lib/cjs/components/livechatwidget/common/createAdapter.js +2 -0
  10. package/lib/cjs/components/livechatwidget/common/defaultProps/defaultPersistentChatHistoryProps.js +18 -0
  11. package/lib/cjs/components/livechatwidget/common/endChat.js +7 -1
  12. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +7 -5
  13. package/lib/cjs/components/livechatwidget/interfaces/IPersistentChatHistoryProps.js +1 -0
  14. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +31 -5
  15. package/lib/cjs/components/webchatcontainerstateful/common/activities/botActivity.js +14 -0
  16. package/lib/cjs/components/webchatcontainerstateful/common/activities/conversationDividerActivity.js +17 -0
  17. package/lib/cjs/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +97 -0
  18. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +2 -1
  19. package/lib/cjs/components/webchatcontainerstateful/common/defaultProps/defaultWebChatStatefulProps.js +1 -1
  20. package/lib/cjs/components/webchatcontainerstateful/hooks/usePersistentChatHistory.js +59 -0
  21. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +122 -0
  22. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/Constants.js +10 -0
  23. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/ConversationDividerActivity.js +18 -0
  24. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +1038 -0
  25. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +34 -0
  26. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +44 -0
  27. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +16 -2
  28. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultInLineBannerStyle.js +20 -0
  29. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +2 -2
  30. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +59 -0
  31. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +4 -3
  32. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +2 -2
  33. package/lib/esm/common/Constants.js +4 -0
  34. package/lib/esm/common/facades/FacadeChatSDK.js +6 -0
  35. package/lib/esm/common/telemetry/TelemetryConstants.js +31 -0
  36. package/lib/esm/common/utils/SecureEventBus.js +328 -0
  37. package/lib/esm/common/utils/dispatchCustomEvent.js +18 -0
  38. package/lib/esm/components/livechatwidget/common/ActivitySubscriber/AddActivitySubscriber.js +120 -0
  39. package/lib/esm/components/livechatwidget/common/ChatWidgetEvents.js +8 -0
  40. package/lib/esm/components/livechatwidget/common/PersistentConversationHandler.js +277 -0
  41. package/lib/esm/components/livechatwidget/common/createAdapter.js +2 -0
  42. package/lib/esm/components/livechatwidget/common/defaultProps/defaultPersistentChatHistoryProps.js +11 -0
  43. package/lib/esm/components/livechatwidget/common/endChat.js +7 -1
  44. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +7 -5
  45. package/lib/esm/components/livechatwidget/interfaces/IPersistentChatHistoryProps.js +1 -0
  46. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +34 -5
  47. package/lib/esm/components/webchatcontainerstateful/common/activities/botActivity.js +7 -0
  48. package/lib/esm/components/webchatcontainerstateful/common/activities/conversationDividerActivity.js +9 -0
  49. package/lib/esm/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.js +90 -0
  50. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultMiddlewareLocalizedTexts.js +2 -1
  51. package/lib/esm/components/webchatcontainerstateful/common/defaultProps/defaultWebChatStatefulProps.js +2 -2
  52. package/lib/esm/components/webchatcontainerstateful/hooks/usePersistentChatHistory.js +51 -0
  53. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.js +115 -0
  54. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/Constants.js +3 -0
  55. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/ConversationDividerActivity.js +10 -0
  56. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.js +1060 -0
  57. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.js +25 -0
  58. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +42 -0
  59. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.js +13 -0
  60. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultInLineBannerStyle.js +13 -0
  61. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/DeliveredTimestamp.js +1 -1
  62. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.js +52 -0
  63. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/NotDeliveredTimestamp.js +2 -2
  64. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/SendingTimestamp.js +1 -1
  65. package/lib/types/common/Constants.d.ts +3 -0
  66. package/lib/types/common/facades/FacadeChatSDK.d.ts +3 -1
  67. package/lib/types/common/telemetry/TelemetryConstants.d.ts +30 -2
  68. package/lib/types/common/utils/SecureEventBus.d.ts +159 -0
  69. package/lib/types/common/utils/dispatchCustomEvent.d.ts +2 -0
  70. package/lib/types/components/livechatwidget/common/ActivitySubscriber/AddActivitySubscriber.d.ts +45 -0
  71. package/lib/types/components/livechatwidget/common/ChatWidgetEvents.d.ts +7 -0
  72. package/lib/types/components/livechatwidget/common/PersistentConversationHandler.d.ts +28 -0
  73. package/lib/types/components/livechatwidget/common/defaultProps/defaultPersistentChatHistoryProps.d.ts +2 -0
  74. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +2 -0
  75. package/lib/types/components/livechatwidget/interfaces/IPersistentChatHistoryProps.d.ts +7 -0
  76. package/lib/types/components/webchatcontainerstateful/common/activities/botActivity.d.ts +7 -0
  77. package/lib/types/components/webchatcontainerstateful/common/activities/conversationDividerActivity.d.ts +10 -0
  78. package/lib/types/components/webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity.d.ts +2 -0
  79. package/lib/types/components/webchatcontainerstateful/hooks/usePersistentChatHistory.d.ts +4 -0
  80. package/lib/types/components/webchatcontainerstateful/webchatcontroller/WebChatEventSubscribers.d.ts +7 -0
  81. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/Constants.d.ts +3 -0
  82. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/ConversationDividerActivity.d.ts +4 -0
  83. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity.d.ts +326 -0
  84. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LoadInlineBannerActivity.d.ts +8 -0
  85. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware.d.ts +1 -0
  86. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultInLineBannerStyle.d.ts +2 -0
  87. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/timestamps/HistoryMessageTimestamp.d.ts +2 -0
  88. package/lib/types/contexts/common/ILiveChatWidgetLocalizedTexts.d.ts +1 -0
  89. package/package.json +2 -2
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
8
+ var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
+ var _ChatWidgetEvents = _interopRequireDefault(require("./ChatWidgetEvents"));
10
+ var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
11
+ var _conversationDividerActivity = _interopRequireDefault(require("../../webchatcontainerstateful/common/activities/conversationDividerActivity"));
12
+ var _convertPersistentChatHistoryMessageToActivity = _interopRequireDefault(require("../../webchatcontainerstateful/common/activityConverters/convertPersistentChatHistoryMessageToActivity"));
13
+ var _utils = require("../../../common/utils");
14
+ var _defaultPersistentChatHistoryProps = require("./defaultProps/defaultPersistentChatHistoryProps");
15
+ var _dispatchCustomEvent = _interopRequireDefault(require("../../../common/utils/dispatchCustomEvent"));
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
18
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
19
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
20
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
21
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
22
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
23
+ /**
24
+ * Class responsible for handling persistent conversation history
25
+ */
26
+ let PersistentConversationHandler = /*#__PURE__*/function () {
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+
29
+ function PersistentConversationHandler(facadeChatSDK, props) {
30
+ _classCallCheck(this, PersistentConversationHandler);
31
+ _defineProperty(this, "appliedProps", {
32
+ ..._defaultPersistentChatHistoryProps.defaultPersistentChatHistoryProps
33
+ });
34
+ _defineProperty(this, "isLastPull", false);
35
+ _defineProperty(this, "pageToken", null);
36
+ _defineProperty(this, "facadeChatSDK", void 0);
37
+ _defineProperty(this, "lastMessage", null);
38
+ _defineProperty(this, "count", 0);
39
+ _defineProperty(this, "pageSize", 4);
40
+ _defineProperty(this, "isCurrentlyPulling", false);
41
+ _defineProperty(this, "pageTokenInTransitSet", new Set());
42
+ _defineProperty(this, "resetEventListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.PersistentConversationReset).subscribe(() => {
43
+ this.reset();
44
+ }));
45
+ this.facadeChatSDK = facadeChatSDK;
46
+ this.appliedPropsHandler(props);
47
+ _TelemetryHelper.TelemetryHelper.logActionEventToAllTelemetry(_TelemetryConstants.LogLevel.INFO, {
48
+ Event: _TelemetryConstants.TelemetryEvent.LCWPersistentConversationHandlerInitialized,
49
+ Description: "PersistentConversationHandler initialized",
50
+ CustomProperties: {
51
+ pageSize: this.pageSize
52
+ }
53
+ });
54
+ }
55
+ _createClass(PersistentConversationHandler, [{
56
+ key: "appliedPropsHandler",
57
+ value: function appliedPropsHandler(props) {
58
+ this.appliedProps = {
59
+ ..._defaultPersistentChatHistoryProps.defaultPersistentChatHistoryProps,
60
+ ...props
61
+ };
62
+ this.pageSize = this.appliedProps.pageSize || 4;
63
+ }
64
+ }, {
65
+ key: "reset",
66
+ value: function reset() {
67
+ this.isLastPull = false;
68
+ this.pageToken = null;
69
+ this.lastMessage = null;
70
+ this.count = 0;
71
+ this.isCurrentlyPulling = false;
72
+ this.pageTokenInTransitSet.clear();
73
+ }
74
+ }, {
75
+ key: "destroy",
76
+ value: function destroy() {
77
+ // Only unsubscribe when the handler is being destroyed completely
78
+ this.resetEventListener.unsubscribe();
79
+ }
80
+ }, {
81
+ key: "pullHistory",
82
+ value: async function pullHistory() {
83
+ const pullTimer = (0, _utils.createTimer)();
84
+
85
+ // Prevent concurrent pulls regardless of pageToken
86
+ if (this.isCurrentlyPulling) {
87
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.WARN, {
88
+ Event: _TelemetryConstants.TelemetryEvent.LCWPersistentHistoryPullBlocked,
89
+ Description: "History pull blocked - already in progress"
90
+ });
91
+ return;
92
+ }
93
+
94
+ // Additional check for specific pageToken duplicates
95
+ if (this.pageToken && this.pageTokenInTransitSet.has(this.pageToken)) {
96
+ return;
97
+ }
98
+
99
+ // Mark as currently pulling
100
+ this.isCurrentlyPulling = true;
101
+ if (this.pageToken) {
102
+ this.pageTokenInTransitSet.add(this.pageToken);
103
+ }
104
+ try {
105
+ var _ref;
106
+ const messages = await this.fetchHistoryMessages();
107
+ if (messages === null || (messages === null || messages === void 0 ? void 0 : messages.length) === 0) {
108
+ this.isLastPull = true;
109
+ // Dispatch event to notify UI that no more history is available
110
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE);
111
+ // Also hide the loading banner
112
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
113
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
114
+ Event: _TelemetryConstants.TelemetryEvent.LCWPersistentHistoryPullCompleted,
115
+ Description: "History pull completed - no more messages",
116
+ ElapsedTimeInMilliseconds: pullTimer.milliSecondsElapsed
117
+ });
118
+ return;
119
+ }
120
+ const messagesDescOrder = (_ref = [...messages]) === null || _ref === void 0 ? void 0 : _ref.reverse();
121
+ this.processHistoryMessages(messagesDescOrder);
122
+
123
+ // Dispatch event to hide the loading banner after messages are processed
124
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
125
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
126
+ Event: _TelemetryConstants.TelemetryEvent.LCWPersistentHistoryPullCompleted,
127
+ Description: "History pull completed successfully",
128
+ ElapsedTimeInMilliseconds: pullTimer.milliSecondsElapsed,
129
+ CustomProperties: {
130
+ messageCount: messages.length,
131
+ totalProcessed: this.count
132
+ }
133
+ });
134
+ } finally {
135
+ // Always clear the pulling flag when done
136
+ this.isCurrentlyPulling = false;
137
+
138
+ // Remove pageToken from transit set if it was added
139
+ if (this.pageToken) {
140
+ this.pageTokenInTransitSet.delete(this.pageToken);
141
+ }
142
+ }
143
+ }
144
+
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ }, {
147
+ key: "processHistoryMessages",
148
+ value: function processHistoryMessages(messagesDescOrder) {
149
+ for (const message of messagesDescOrder) {
150
+ try {
151
+ const activity = this.processMessageToActivity(message);
152
+ if (activity) {
153
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.ADD_ACTIVITY, {
154
+ activity
155
+ });
156
+ const dividerActivity = this.createDividerActivity(activity);
157
+ if (dividerActivity) {
158
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.ADD_ACTIVITY, {
159
+ activity: dividerActivity
160
+ });
161
+ }
162
+ this.lastMessage = activity;
163
+ }
164
+ } catch (error) {
165
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
166
+ Event: _TelemetryConstants.TelemetryEvent.ConvertPersistentChatHistoryMessageToActivityFailed,
167
+ ExceptionDetails: error
168
+ });
169
+ }
170
+ }
171
+ }
172
+
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
+ }, {
175
+ key: "fetchHistoryMessages",
176
+ value: async function fetchHistoryMessages() {
177
+ if (!this.shouldPull()) {
178
+ // Dispatch event to ensure banner is hidden when no more pulls are needed
179
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE);
180
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
181
+ return [];
182
+ }
183
+ const options = {
184
+ pageSize: this.pageSize,
185
+ pageToken: this.pageToken || undefined
186
+ };
187
+ try {
188
+ var _this$facadeChatSDK;
189
+ const response = await ((_this$facadeChatSDK = this.facadeChatSDK) === null || _this$facadeChatSDK === void 0 ? void 0 : _this$facadeChatSDK.fetchPersistentConversationHistory(options));
190
+ const {
191
+ chatMessages: messages,
192
+ nextPageToken: pageToken
193
+ } = response;
194
+ this.pageToken = pageToken || null;
195
+ if (pageToken === null) {
196
+ this.isLastPull = true;
197
+ // Dispatch event when we reach the end of available history
198
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE);
199
+ }
200
+
201
+ // if chatMessages is null, return empty array
202
+ if (!messages) {
203
+ this.isLastPull = true;
204
+ // Dispatch event when we reach the end of available history
205
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE);
206
+ // Also hide the loading banner
207
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
208
+ return [];
209
+ }
210
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
211
+ return messages;
212
+ } catch (error) {
213
+ _TelemetryHelper.TelemetryHelper.logSDKEvent(_TelemetryConstants.LogLevel.ERROR, {
214
+ Event: _TelemetryConstants.TelemetryEvent.FetchPersistentChatHistoryFailed,
215
+ ExceptionDetails: error
216
+ });
217
+ this.isLastPull = true;
218
+ this.pageToken = null;
219
+ // Dispatch event when there's an error to stop loading banner
220
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.NO_MORE_HISTORY_AVAILABLE);
221
+ // Also hide the loading banner
222
+ (0, _dispatchCustomEvent.default)(_ChatWidgetEvents.default.HIDE_LOADING_BANNER);
223
+ return [];
224
+ }
225
+ }
226
+ }, {
227
+ key: "shouldPull",
228
+ value: function shouldPull() {
229
+ return !this.isLastPull;
230
+ }
231
+
232
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
+ }, {
234
+ key: "processMessageToActivity",
235
+ value: function processMessageToActivity(message) {
236
+ try {
237
+ const activity = (0, _convertPersistentChatHistoryMessageToActivity.default)(message);
238
+ activity.id = activity.id || `activity-${this.count}`;
239
+ activity.channelData = {
240
+ ...activity.channelData,
241
+ metadata: {
242
+ count: this.count
243
+ }
244
+ };
245
+
246
+ // Increment the count after assigning it to the activity
247
+ this.count += 1;
248
+ return activity;
249
+ } catch (error) {
250
+ _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
251
+ Event: _TelemetryConstants.TelemetryEvent.ConvertPersistentChatHistoryMessageToActivityFailed,
252
+ ExceptionDetails: error
253
+ });
254
+ throw error;
255
+ }
256
+ }
257
+
258
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
259
+ }, {
260
+ key: "createDividerActivity",
261
+ value: function createDividerActivity(activity) {
262
+ var _this$lastMessage, _this$lastMessage$cha;
263
+ if (((_this$lastMessage = this.lastMessage) === null || _this$lastMessage === void 0 ? void 0 : (_this$lastMessage$cha = _this$lastMessage.channelData) === null || _this$lastMessage$cha === void 0 ? void 0 : _this$lastMessage$cha.conversationId) !== activity.channelData.conversationId) {
264
+ const rawSequenceId = activity.channelData["webchat:sequence-id"];
265
+ const sequenceId = typeof rawSequenceId === "number" && !isNaN(rawSequenceId) ? rawSequenceId + 1 : 1;
266
+ const timestamp = new Date(activity.timestamp).getTime() + 1;
267
+ return {
268
+ ..._conversationDividerActivity.default,
269
+ channelData: {
270
+ ..._conversationDividerActivity.default.channelData,
271
+ conversationId: activity.channelData.conversationId,
272
+ "webchat:sequence-id": sequenceId
273
+ },
274
+ timestamp: new Date(timestamp).toISOString(),
275
+ identifier: `divider-${activity.channelData.conversationId}`
276
+ };
277
+ }
278
+ return null;
279
+ }
280
+ }]);
281
+ return PersistentConversationHandler;
282
+ }();
283
+ var _default = PersistentConversationHandler;
284
+ exports.default = _default;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createAdapter = void 0;
7
+ var _AddActivitySubscriber = require("./ActivitySubscriber/AddActivitySubscriber");
7
8
  var _BotAuthActivitySubscriber = require("./ActivitySubscriber/BotAuthActivitySubscriber");
8
9
  var _ChatAdapterShim = require("./ChatAdapterShim");
9
10
  var _HiddenAdaptiveCardActivitySubscriber = require("./ActivitySubscriber/HiddenAdaptiveCardActivitySubscriber");
@@ -50,6 +51,7 @@ const createAdapter = async (facadeChatSDK, props) => {
50
51
  fetchBotAuthConfigRetryInterval: (props === null || props === void 0 ? void 0 : (_props$webChatContain3 = props.webChatContainerProps) === null || _props$webChatContain3 === void 0 ? void 0 : (_props$webChatContain4 = _props$webChatContain3.botAuthConfig) === null || _props$webChatContain4 === void 0 ? void 0 : _props$webChatContain4.fetchBotAuthConfigRetryInterval) || defaultBotAuthConfig.fetchBotAuthConfigRetryInterval
51
52
  };
52
53
  adapter = new _ChatAdapterShim.ChatAdapterShim(adapter);
54
+ adapter.addSubscriber(new _AddActivitySubscriber.AddActivitySubscriber());
53
55
  adapter.addSubscriber(new _PauseActivitySubscriber.PauseActivitySubscriber());
54
56
  adapter.addSubscriber(new _BotAuthActivitySubscriber.BotAuthActivitySubscriber(botAuthActivitySubscriberOptionalParams));
55
57
  // Remove this code after ICM ID:544623085 is fixed
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.defaultPersistentChatHistoryProps = void 0;
7
+ const defaultPersistentChatHistoryProps = {
8
+ persistentChatHistoryEnabled: true,
9
+ pageSize: 4,
10
+ dividerActivityStyle: {
11
+ border: "1px solid rgb(96, 94, 92, 0.5)",
12
+ margin: "10px 20%"
13
+ },
14
+ bannerStyle: {
15
+ margin: "10px auto"
16
+ }
17
+ };
18
+ exports.defaultPersistentChatHistoryProps = defaultPersistentChatHistoryProps;
@@ -10,6 +10,7 @@ var _utils = require("../../../common/utils");
10
10
  var _renderSurveyHelpers = require("./renderSurveyHelpers");
11
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
12
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
13
+ var _LazyLoadActivity = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activities/LazyLoadActivity");
13
14
  var _LiveChatWidgetActionType = require("../../../contexts/common/LiveChatWidgetActionType");
14
15
  var _TelemetryHelper = require("../../../common/telemetry/TelemetryHelper");
15
16
  var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
@@ -231,7 +232,12 @@ const endChat = async (props, facadeChatSDK, state, dispatch, setAdapter, setWeb
231
232
  type: _LiveChatWidgetActionType.LiveChatWidgetActionType.SET_POST_CHAT_CONTEXT,
232
233
  payload: undefined
233
234
  });
234
- // Always allow to close the chat for embedded mode irrespective of end chat errors
235
+
236
+ // Call direct reset to ensure LazyLoadHandler gets reset regardless of broadcast timing
237
+ _LazyLoadActivity.LazyLoadHandler.directReset();
238
+ _omnichannelChatComponents.BroadcastService.postMessage({
239
+ eventName: _TelemetryConstants.BroadcastEvent.PersistentConversationReset
240
+ });
235
241
  closeChatWidget(dispatch, setWebChatStyles, props);
236
242
  facadeChatSDK.destroy();
237
243
  }
@@ -7,6 +7,7 @@ exports.initWebChatComposer = void 0;
7
7
  var _Constants = require("../../../common/Constants");
8
8
  var _TelemetryConstants = require("../../../common/telemetry/TelemetryConstants");
9
9
  var _utils = require("../../../common/utils");
10
+ var _localizedStringsBotInitialsMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware");
10
11
  var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
11
12
  var _ConversationState = require("../../../contexts/common/ConversationState");
12
13
  var _dompurify = _interopRequireDefault(require("dompurify"));
@@ -17,6 +18,7 @@ var _WebChatStoreLoader = require("../../webchatcontainerstateful/webchatcontrol
17
18
  var _attachmentProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentProcessingMiddleware"));
18
19
  var _channelDataMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/channelDataMiddleware"));
19
20
  var _activityMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware");
21
+ var _activityStatusMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityStatusMiddleware");
20
22
  var _attachmentMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/attachmentMiddleware");
21
23
  var _attachmentUploadValidatorMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/attachmentUploadValidatorMiddleware"));
22
24
  var _avatarMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/avatarMiddleware");
@@ -44,11 +46,10 @@ var _htmlPlayerMiddleware = _interopRequireDefault(require("../../webchatcontain
44
46
  var _htmlTextMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/htmlTextMiddleware"));
45
47
  var _preProcessingMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/preProcessingMiddleware"));
46
48
  var _sanitizationMiddleware = _interopRequireDefault(require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/sanitizationMiddleware"));
47
- var _localizedStringsBotInitialsMiddleware = require("../../webchatcontainerstateful/webchatcontroller/middlewares/storemiddlewares/localizedStringsBotInitialsMiddleware");
48
49
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
49
50
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
51
  const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) => {
51
- 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;
52
+ 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, _state$domainStates$l6, _state$domainStates$l7, _props$webChatContain17, _props$webChatContain18, _props$webChatContain19, _props$webChatContain20, _state$domainStates$r5, _state$domainStates$r6, _props$webChatContain21, _props$webChatContain22, _defaultWebChatContai, _props$webChatContain23, _props$webChatContain24, _defaultWebChatContai2, _props$webChatContain25, _props$webChatContain26, _props$webChatContain27, _props$webChatContain28;
52
53
  // Add a hook to make all links open a new window
53
54
  postDomPurifyActivities();
54
55
  const localizedTexts = {
@@ -66,6 +67,7 @@ const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) =>
66
67
  let webChatStore = _WebChatStoreLoader.WebChatStoreLoader.store;
67
68
  if (!webChatStore) {
68
69
  var _state$domainStates$l, _state$domainStates$l2, _state$domainStates$l3, _props$webChatContain7;
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
71
  const addConversationalSurveyTagsCallback = action => {
70
72
  var _inMemoryState$appSta;
71
73
  const inMemoryState = (0, _createReducer.executeReducer)(state, {
@@ -168,12 +170,12 @@ const initWebChatComposer = (props, state, dispatch, facadeChatSDK, endChat) =>
168
170
  store: webChatStore,
169
171
  activityMiddleware: (_props$webChatContain11 = props.webChatContainerProps) !== null && _props$webChatContain11 !== void 0 && (_props$webChatContain12 = _props$webChatContain11.renderingMiddlewareProps) !== null && _props$webChatContain12 !== void 0 && _props$webChatContain12.disableActivityMiddleware ? undefined : (0, _activityMiddleware.createActivityMiddleware)(renderMarkdown, (_state$domainStates$r = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r === void 0 ? void 0 : _state$domainStates$r.systemMessageStyleProps, (_state$domainStates$r2 = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r2 === void 0 ? void 0 : _state$domainStates$r2.userMessageStyleProps),
170
172
  attachmentMiddleware: (_props$webChatContain13 = props.webChatContainerProps) !== null && _props$webChatContain13 !== void 0 && (_props$webChatContain14 = _props$webChatContain13.renderingMiddlewareProps) !== null && _props$webChatContain14 !== void 0 && _props$webChatContain14.disableAttachmentMiddleware ? undefined : (0, _attachmentMiddleware.createAttachmentMiddleware)(((_state$domainStates$r3 = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r3 === void 0 ? void 0 : (_state$domainStates$r4 = _state$domainStates$r3.attachmentProps) === null || _state$domainStates$r4 === void 0 ? void 0 : _state$domainStates$r4.enableInlinePlaying) ?? _defaultAttachmentProps.defaultAttachmentProps.enableInlinePlaying),
171
- activityStatusMiddleware: (_props$webChatContain15 = props.webChatContainerProps) !== null && _props$webChatContain15 !== void 0 && (_props$webChatContain16 = _props$webChatContain15.renderingMiddlewareProps) !== null && _props$webChatContain16 !== void 0 && _props$webChatContain16.disableActivityStatusMiddleware ? undefined : (_defaultWebChatContai = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps) === null || _defaultWebChatContai === void 0 ? void 0 : _defaultWebChatContai.activityStatusMiddleware,
173
+ activityStatusMiddleware: (_props$webChatContain15 = props.webChatContainerProps) !== null && _props$webChatContain15 !== void 0 && (_props$webChatContain16 = _props$webChatContain15.renderingMiddlewareProps) !== null && _props$webChatContain16 !== void 0 && _props$webChatContain16.disableActivityStatusMiddleware ? undefined : (0, _activityStatusMiddleware.createActivityStatusMiddleware)((0, _omnichannelChatSdk.getLocaleStringFromId)((_state$domainStates$l6 = state.domainStates.liveChatConfig) === null || _state$domainStates$l6 === void 0 ? void 0 : (_state$domainStates$l7 = _state$domainStates$l6.ChatWidgetLanguage) === null || _state$domainStates$l7 === void 0 ? void 0 : _state$domainStates$l7.msdyn_localeid)),
172
174
  toastMiddleware: (_props$webChatContain17 = props.webChatContainerProps) !== null && _props$webChatContain17 !== void 0 && (_props$webChatContain18 = _props$webChatContain17.renderingMiddlewareProps) !== null && _props$webChatContain18 !== void 0 && _props$webChatContain18.disableToastMiddleware ? undefined : (0, _toastMiddleware.createToastMiddleware)(props.notificationPaneProps, endChat),
173
175
  renderMarkdown,
174
176
  avatarMiddleware: (_props$webChatContain19 = props.webChatContainerProps) !== null && _props$webChatContain19 !== void 0 && (_props$webChatContain20 = _props$webChatContain19.renderingMiddlewareProps) !== null && _props$webChatContain20 !== void 0 && _props$webChatContain20.disableAvatarMiddleware ? undefined : (0, _avatarMiddleware.createAvatarMiddleware)((_state$domainStates$r5 = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r5 === void 0 ? void 0 : _state$domainStates$r5.avatarStyleProps, (_state$domainStates$r6 = state.domainStates.renderingMiddlewareProps) === null || _state$domainStates$r6 === void 0 ? void 0 : _state$domainStates$r6.avatarTextStyleProps),
175
- groupActivitiesMiddleware: (_props$webChatContain21 = props.webChatContainerProps) !== null && _props$webChatContain21 !== void 0 && (_props$webChatContain22 = _props$webChatContain21.renderingMiddlewareProps) !== null && _props$webChatContain22 !== void 0 && _props$webChatContain22.disableGroupActivitiesMiddleware ? undefined : (_defaultWebChatContai2 = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps) === null || _defaultWebChatContai2 === void 0 ? void 0 : _defaultWebChatContai2.groupActivitiesMiddleware,
176
- typingIndicatorMiddleware: (_props$webChatContain23 = props.webChatContainerProps) !== null && _props$webChatContain23 !== void 0 && (_props$webChatContain24 = _props$webChatContain23.renderingMiddlewareProps) !== null && _props$webChatContain24 !== void 0 && _props$webChatContain24.disableTypingIndicatorMiddleware ? undefined : (_defaultWebChatContai3 = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps) === null || _defaultWebChatContai3 === void 0 ? void 0 : _defaultWebChatContai3.typingIndicatorMiddleware,
177
+ groupActivitiesMiddleware: (_props$webChatContain21 = props.webChatContainerProps) !== null && _props$webChatContain21 !== void 0 && (_props$webChatContain22 = _props$webChatContain21.renderingMiddlewareProps) !== null && _props$webChatContain22 !== void 0 && _props$webChatContain22.disableGroupActivitiesMiddleware ? undefined : (_defaultWebChatContai = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps) === null || _defaultWebChatContai === void 0 ? void 0 : _defaultWebChatContai.groupActivitiesMiddleware,
178
+ typingIndicatorMiddleware: (_props$webChatContain23 = props.webChatContainerProps) !== null && _props$webChatContain23 !== void 0 && (_props$webChatContain24 = _props$webChatContain23.renderingMiddlewareProps) !== null && _props$webChatContain24 !== void 0 && _props$webChatContain24.disableTypingIndicatorMiddleware ? undefined : (_defaultWebChatContai2 = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatProps) === null || _defaultWebChatContai2 === void 0 ? void 0 : _defaultWebChatContai2.typingIndicatorMiddleware,
177
179
  onTelemetry: (0, _WebChatLogger.createWebChatTelemetry)(),
178
180
  cardActionMiddleware: (0, _cardActionMiddleware.createCardActionMiddleware)(((_props$webChatContain25 = props.webChatContainerProps) === null || _props$webChatContain25 === void 0 ? void 0 : _props$webChatContain25.botMagicCode) || undefined),
179
181
  sendTypingIndicator: true,
@@ -17,6 +17,7 @@ var _NotificationHandler = require("./webchatcontroller/notification/Notificatio
17
17
  var _NotificationScenarios = require("./webchatcontroller/enums/NotificationScenarios");
18
18
  var _TelemetryHelper = require("../../common/telemetry/TelemetryHelper");
19
19
  var _WebChatActionType = require("./webchatcontroller/enums/WebChatActionType");
20
+ var _WebChatEventSubscribers = _interopRequireDefault(require("./webchatcontroller/WebChatEventSubscribers"));
20
21
  var _WebChatStoreLoader = require("./webchatcontroller/WebChatStoreLoader");
21
22
  var _fontUtils = require("./common/utils/fontUtils");
22
23
  var _defaultAdaptiveCardStyles = require("./common/defaultStyles/defaultAdaptiveCardStyles");
@@ -26,7 +27,10 @@ var _defaultSentMessageAnchorStyles = require("./webchatcontroller/middlewares/r
26
27
  var _defaultSystemMessageBoxStyles = require("./webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultSystemMessageBoxStyles");
27
28
  var _defaultUserMessageBoxStyles = require("./webchatcontroller/middlewares/renderingmiddlewares/defaultStyles/defaultUserMessageBoxStyles");
28
29
  var _defaultWebChatContainerStatefulProps = require("./common/defaultProps/defaultWebChatContainerStatefulProps");
30
+ var _liveChatConfigUtils = require("../livechatwidget/common/liveChatConfigUtils");
29
31
  var _ = require("../..");
32
+ var _useFacadeChatSDKStore = _interopRequireDefault(require("../../hooks/useFacadeChatSDKStore"));
33
+ var _usePersistentChatHistory = _interopRequireDefault(require("./hooks/usePersistentChatHistory"));
30
34
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
35
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
32
36
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -58,7 +62,9 @@ const createMagicCodeSuccessResponse = signin => {
58
62
  };
59
63
  };
60
64
  const WebChatContainerStateful = props => {
61
- var _props$webChatContain, _defaultWebChatContai, _webChatContainerProp, _webChatContainerProp2, _webChatContainerProp3, _webChatContainerProp4, _webChatContainerProp5, _webChatContainerProp6, _webChatContainerProp7, _webChatContainerProp8, _props$webChatContain6, _props$webChatContain7, _defaultWebChatContai2, _props$webChatContain8, _props$webChatContain9, _defaultWebChatContai3, _webChatContainerProp9, _webChatContainerProp10, _webChatContainerProp11, _webChatContainerProp12, _webChatContainerProp13, _webChatContainerProp14, _webChatContainerProp15, _webChatContainerProp16, _webChatContainerProp17, _webChatContainerProp18, _webChatContainerProp19, _webChatContainerProp20, _webChatContainerProp21, _webChatContainerProp22, _webChatContainerProp23, _props$webChatContain10, _props$webChatContain11, _webChatContainerProp24, _webChatContainerProp25, _webChatContainerProp26, _webChatContainerProp27, _props$citationPanePr, _props$citationPanePr2, _props$citationPanePr3, _props$citationPanePr4, _props$citationPanePr5;
65
+ var _props$webChatContain, _defaultWebChatContai, _extendedChatConfig$L, _props$persistentChat, _extendedChatConfig$L2, _extendedChatConfig$L3, _webChatContainerProp, _webChatContainerProp2, _webChatContainerProp3, _webChatContainerProp4, _webChatContainerProp5, _webChatContainerProp6, _webChatContainerProp7, _webChatContainerProp8, _props$webChatContain6, _props$webChatContain7, _defaultWebChatContai2, _props$webChatContain8, _props$webChatContain9, _defaultWebChatContai3, _webChatContainerProp9, _webChatContainerProp10, _webChatContainerProp11, _webChatContainerProp12, _webChatContainerProp13, _webChatContainerProp14, _webChatContainerProp15, _webChatContainerProp16, _webChatContainerProp17, _webChatContainerProp18, _webChatContainerProp19, _webChatContainerProp20, _webChatContainerProp21, _webChatContainerProp22, _webChatContainerProp23, _props$webChatContain10, _props$webChatContain11, _webChatContainerProp24, _webChatContainerProp25, _webChatContainerProp26, _webChatContainerProp27, _props$persistentChat2, _props$citationPanePr, _props$citationPanePr2, _props$citationPanePr3, _props$citationPanePr4, _props$citationPanePr5;
66
+ const [facadeChatSDK] = (0, _useFacadeChatSDKStore.default)();
67
+
62
68
  // Create a font family that includes emoji support, based on the primary font or default
63
69
  const webChatStyles = ((_props$webChatContain = props.webChatContainerProps) === null || _props$webChatContain === void 0 ? void 0 : _props$webChatContain.webChatStyles) ?? _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatStyles;
64
70
  const primaryFont = (webChatStyles === null || webChatStyles === void 0 ? void 0 : webChatStyles.primaryFont) ?? ((_defaultWebChatContai = _defaultWebChatContainerStatefulProps.defaultWebChatContainerStatefulProps.webChatStyles) === null || _defaultWebChatContai === void 0 ? void 0 : _defaultWebChatContai.primaryFont);
@@ -79,9 +85,6 @@ const WebChatContainerStateful = props => {
79
85
  // Guard to prevent handling multiple rapid clicks which could cause
80
86
  // the dim layer and pane to re-render out of sync and create a flicker.
81
87
  const citationOpeningRef = (0, _react2.useRef)(false);
82
-
83
- // ...existing code...
84
-
85
88
  const {
86
89
  BasicWebChat
87
90
  } = _botframeworkWebchat.Components;
@@ -91,6 +94,21 @@ const WebChatContainerStateful = props => {
91
94
  contextDataStore
92
95
  } = props;
93
96
 
97
+ // Type the chatConfig properly to avoid 'any' usage
98
+ const extendedChatConfig = props.chatConfig;
99
+ const isHistoryEnabledInConfig = extendedChatConfig === null || extendedChatConfig === void 0 ? void 0 : (_extendedChatConfig$L = extendedChatConfig.LcwFcbConfiguration) === null || _extendedChatConfig$L === void 0 ? void 0 : _extendedChatConfig$L.lcwPersistentChatHistoryEnabled;
100
+ const isHistoryEnabledViaProps = props === null || props === void 0 ? void 0 : (_props$persistentChat = props.persistentChatHistoryProps) === null || _props$persistentChat === void 0 ? void 0 : _props$persistentChat.persistentChatHistoryEnabled;
101
+ const isPersistentChatEnabledForWidget = !!(extendedChatConfig !== null && extendedChatConfig !== void 0 && (_extendedChatConfig$L2 = extendedChatConfig.LiveChatConfigAuthSettings) !== null && _extendedChatConfig$L2 !== void 0 && _extendedChatConfig$L2.msdyn_javascriptclientfunction) || (0, _liveChatConfigUtils.isPersistentChatEnabled)(extendedChatConfig === null || extendedChatConfig === void 0 ? void 0 : (_extendedChatConfig$L3 = extendedChatConfig.LiveWSAndLiveChatEngJoin) === null || _extendedChatConfig$L3 === void 0 ? void 0 : _extendedChatConfig$L3.msdyn_conversationmode);
102
+
103
+ // Persistent chat history is enabled if explicitly set via props, or if enabled in config
104
+ // Props take precedence over config settings
105
+ const isPersistentHistoryEnabled = isHistoryEnabledViaProps || isHistoryEnabledInConfig;
106
+
107
+ // Check if both persistent chat and widget support are enabled
108
+ const shouldLoadPersistentHistoryMessages = isPersistentHistoryEnabled && isPersistentChatEnabledForWidget;
109
+ if (shouldLoadPersistentHistoryMessages) {
110
+ (0, _usePersistentChatHistory.default)(facadeChatSDK, (props === null || props === void 0 ? void 0 : props.persistentChatHistoryProps) ?? {});
111
+ }
94
112
  // Delegated click handler for citation anchors. Placed after state is
95
113
  // available so we can prefer reading citations from app state and fall
96
114
  // back to the legacy window map for backward-compatibility in tests.
@@ -392,7 +410,15 @@ const WebChatContainerStateful = props => {
392
410
  `), /*#__PURE__*/_react2.default.createElement(_react.Stack, {
393
411
  styles: containerStyles,
394
412
  className: "webchat__stacked-layout_container"
395
- }, /*#__PURE__*/_react2.default.createElement(BasicWebChat, null)), citationPaneOpen && /*#__PURE__*/_react2.default.createElement(_CitationPaneStateful.default, {
413
+ }, /*#__PURE__*/_react2.default.createElement("div", {
414
+ id: "ms_lcw_webchat_root",
415
+ style: {
416
+ height: "100%",
417
+ width: "100%"
418
+ }
419
+ }, shouldLoadPersistentHistoryMessages && /*#__PURE__*/_react2.default.createElement(_WebChatEventSubscribers.default, {
420
+ persistentChatHistoryEnabled: props === null || props === void 0 ? void 0 : (_props$persistentChat2 = props.persistentChatHistoryProps) === null || _props$persistentChat2 === void 0 ? void 0 : _props$persistentChat2.persistentChatHistoryEnabled
421
+ }), /*#__PURE__*/_react2.default.createElement(BasicWebChat, null))), citationPaneOpen && /*#__PURE__*/_react2.default.createElement(_CitationPaneStateful.default, {
396
422
  id: ((_props$citationPanePr = props.citationPaneProps) === null || _props$citationPanePr === void 0 ? void 0 : _props$citationPanePr.id) || _Constants.HtmlAttributeNames.ocwCitationPaneClassName,
397
423
  title: ((_props$citationPanePr2 = props.citationPaneProps) === null || _props$citationPanePr2 === void 0 ? void 0 : _props$citationPanePr2.title) || _Constants.HtmlAttributeNames.ocwCitationPaneTitle,
398
424
  contentHtml: citationPaneText,
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ const botActivity = {
8
+ from: {
9
+ role: "bot"
10
+ },
11
+ type: "message"
12
+ };
13
+ var _default = botActivity;
14
+ exports.default = _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Constants = require("../../../../common/Constants");
8
+ var _botActivity = _interopRequireDefault(require("./botActivity"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ const conversationDividerActivity = {
11
+ ..._botActivity.default,
12
+ channelData: {
13
+ tags: [_Constants.Constants.conversationDividerTag]
14
+ }
15
+ };
16
+ var _default = conversationDividerActivity;
17
+ exports.default = _default;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Constants = require("../../../../common/Constants");
8
+ var _botActivity = _interopRequireDefault(require("../activities/botActivity"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ const convertStringValueToInt = value => {
12
+ if (typeof value !== "string" || value === "") {
13
+ return undefined;
14
+ }
15
+ let result;
16
+ try {
17
+ result = parseInt(value);
18
+ } catch (e) {
19
+ return undefined;
20
+ }
21
+ return isNaN(result) ? undefined : result;
22
+ };
23
+
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ const convertPersistentChatHistoryMessageToActivity = message => {
26
+ var _from$user, _from$application;
27
+ const {
28
+ additionalData,
29
+ attachments,
30
+ content,
31
+ created,
32
+ from,
33
+ transcriptOriginalMessageId
34
+ } = message;
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ const activity = {
37
+ ..._botActivity.default,
38
+ channelData: {
39
+ tags: [_Constants.Constants.persistentChatHistoryMessageTag]
40
+ }
41
+ };
42
+ let webchatSequenceId;
43
+ let timestamp;
44
+ if (transcriptOriginalMessageId) {
45
+ const id = convertStringValueToInt(transcriptOriginalMessageId); // Id used to determine the sequence of messages which is the same as the 'live' messages
46
+ if (id) {
47
+ webchatSequenceId = id;
48
+ timestamp = new Date(id) || created;
49
+ activity.channelData = {
50
+ ...activity.channelData,
51
+ "webchat:sequence-id": webchatSequenceId
52
+ };
53
+ }
54
+ }
55
+ if (additionalData !== null && additionalData !== void 0 && additionalData.tags) {
56
+ const {
57
+ tags,
58
+ ConversationId
59
+ } = additionalData;
60
+ if (ConversationId) {
61
+ activity.channelData.conversationId = ConversationId;
62
+ }
63
+ if (tags) {
64
+ const formattedTags = additionalData.tags.split(",");
65
+ activity.channelData.tags = [...activity.channelData.tags, ...formattedTags];
66
+ }
67
+ }
68
+ if (from !== null && from !== void 0 && (_from$user = from.user) !== null && _from$user !== void 0 && _from$user.displayName) {
69
+ activity.from.name = from.user.displayName;
70
+ }
71
+ if ((from === null || from === void 0 ? void 0 : (_from$application = from.application) === null || _from$application === void 0 ? void 0 : _from$application.displayName) === "Customer") {
72
+ activity.from = {
73
+ role: "user",
74
+ name: from.application.displayName
75
+ };
76
+ }
77
+ if (content) {
78
+ return {
79
+ ...activity,
80
+ text: content,
81
+ timestamp
82
+ };
83
+ }
84
+ if (attachments && attachments.length > 0) {
85
+ const fileName = attachments[0].name || "Unknown";
86
+ const text = `The following attachment was uploaded during the conversation: ${fileName}`;
87
+ return {
88
+ ...activity,
89
+ text,
90
+ timestamp
91
+ };
92
+ }
93
+ // If neither content nor attachments are present, return null to indicate no activity could be created.
94
+ return null;
95
+ };
96
+ var _default = convertPersistentChatHistoryMessageToActivity;
97
+ exports.default = _default;
@@ -34,6 +34,7 @@ const defaultMiddlewareLocalizedTexts = {
34
34
  THIRD_PARTY_COOKIES_BLOCKED_ALERT_MESSAGE: "Allow sites to save/read cookies in browser settings. Reloading page starts a new chat.",
35
35
  MIDDLEWARE_BANNER_FILE_IS_MALICIOUS: "{0} has been blocked because the file may contain a malware.",
36
36
  MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_SUCCESS: "Email will be sent after chat ends!",
37
- MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR: "Email {0} could not be saved, try again later."
37
+ MIDDLEWARE_BANNER_FILE_EMAIL_ADDRESS_RECORDED_ERROR: "Email {0} could not be saved, try again later.",
38
+ PREVIOUS_MESSAGES_LOADING: "Loading previous messages..."
38
39
  };
39
40
  exports.defaultMiddlewareLocalizedTexts = defaultMiddlewareLocalizedTexts;
@@ -9,7 +9,7 @@ var _groupActivitiesMiddleware = require("../../webchatcontroller/middlewares/re
9
9
  var _typingIndicatorMiddleware = require("../../webchatcontroller/middlewares/renderingmiddlewares/typingIndicatorMiddleware");
10
10
  const defaultWebChatStatefulProps = {
11
11
  // activityMiddleware: activityMiddleware, - this is implemented elsewhere and can be customized
12
- activityStatusMiddleware: _activityStatusMiddleware.activityStatusMiddleware,
12
+ activityStatusMiddleware: (0, _activityStatusMiddleware.createActivityStatusMiddleware)(),
13
13
  // avatarMiddleware: avatarMiddleware, - this is implemented elsewhere and can be customized
14
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
15
  groupActivitiesMiddleware: _groupActivitiesMiddleware.groupActivitiesMiddleware,