@microsoft/omnichannel-chat-widget 1.7.3-main.c8bb80a → 1.7.3-main.fee24eb

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 (48) hide show
  1. package/lib/cjs/components/livechatwidget/LiveChatWidget.js +6 -1
  2. package/lib/cjs/components/livechatwidget/common/getMockChatSDKIfApplicable.js +26 -0
  3. package/lib/cjs/components/livechatwidget/common/overridePropsOnMockIfApplicable.js +41 -0
  4. package/lib/cjs/components/livechatwidget/common/startChat.js +28 -27
  5. package/lib/cjs/components/livechatwidget/common/startChatErrorHandler.js +6 -6
  6. package/lib/cjs/components/livechatwidget/common/updateSessionDataForTelemetry.js +8 -3
  7. package/lib/cjs/components/livechatwidget/interfaces/IMockProps.js +7 -0
  8. package/lib/cjs/components/webchatcontainerstateful/common/DemoChatAdapter.js +87 -0
  9. package/lib/cjs/components/webchatcontainerstateful/common/DemoChatSDK.js +17 -0
  10. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatAdapter.js +41 -0
  11. package/lib/cjs/components/webchatcontainerstateful/common/DesignerChatSDK.js +17 -0
  12. package/lib/cjs/components/webchatcontainerstateful/common/MockBotCardCommandType.js +14 -0
  13. package/lib/cjs/components/webchatcontainerstateful/common/MockBotCommand.js +19 -0
  14. package/lib/cjs/components/webchatcontainerstateful/common/mockchatsdk.js +3 -0
  15. package/lib/cjs/components/webchatcontainerstateful/common/utils/attachmentActivityUtils.js +71 -0
  16. package/lib/cjs/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +90 -0
  17. package/lib/esm/components/livechatwidget/LiveChatWidget.js +6 -1
  18. package/lib/esm/components/livechatwidget/common/getMockChatSDKIfApplicable.js +20 -0
  19. package/lib/esm/components/livechatwidget/common/overridePropsOnMockIfApplicable.js +34 -0
  20. package/lib/esm/components/livechatwidget/common/startChat.js +28 -27
  21. package/lib/esm/components/livechatwidget/common/startChatErrorHandler.js +7 -7
  22. package/lib/esm/components/livechatwidget/common/updateSessionDataForTelemetry.js +7 -2
  23. package/lib/esm/components/livechatwidget/interfaces/IMockProps.js +6 -0
  24. package/lib/esm/components/webchatcontainerstateful/common/DemoChatAdapter.js +79 -0
  25. package/lib/esm/components/webchatcontainerstateful/common/DemoChatSDK.js +10 -0
  26. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatAdapter.js +33 -0
  27. package/lib/esm/components/webchatcontainerstateful/common/DesignerChatSDK.js +10 -0
  28. package/lib/esm/components/webchatcontainerstateful/common/MockBotCardCommandType.js +7 -0
  29. package/lib/esm/components/webchatcontainerstateful/common/MockBotCommand.js +12 -0
  30. package/lib/esm/components/webchatcontainerstateful/common/mockchatsdk.js +3 -0
  31. package/lib/esm/components/webchatcontainerstateful/common/utils/attachmentActivityUtils.js +61 -0
  32. package/lib/esm/components/webchatcontainerstateful/common/utils/chatAdapterUtils.js +77 -0
  33. package/lib/types/components/livechatwidget/common/getMockChatSDKIfApplicable.d.ts +1 -0
  34. package/lib/types/components/livechatwidget/common/overridePropsOnMockIfApplicable.d.ts +3 -0
  35. package/lib/types/components/livechatwidget/common/updateSessionDataForTelemetry.d.ts +1 -1
  36. package/lib/types/components/livechatwidget/interfaces/ILiveChatWidgetProps.d.ts +2 -0
  37. package/lib/types/components/livechatwidget/interfaces/IMockProps.d.ts +8 -0
  38. package/lib/types/components/webchatcontainerstateful/common/DemoChatAdapter.d.ts +10 -0
  39. package/lib/types/components/webchatcontainerstateful/common/DemoChatSDK.d.ts +6 -0
  40. package/lib/types/components/webchatcontainerstateful/common/DesignerChatAdapter.d.ts +8 -0
  41. package/lib/types/components/webchatcontainerstateful/common/DesignerChatSDK.d.ts +6 -0
  42. package/lib/types/components/webchatcontainerstateful/common/MockBotCardCommandType.d.ts +6 -0
  43. package/lib/types/components/webchatcontainerstateful/common/MockBotCommand.d.ts +11 -0
  44. package/lib/types/components/webchatcontainerstateful/common/mockadapter.d.ts +2 -1
  45. package/lib/types/components/webchatcontainerstateful/common/mockchatsdk.d.ts +6 -0
  46. package/lib/types/components/webchatcontainerstateful/common/utils/attachmentActivityUtils.d.ts +9 -0
  47. package/lib/types/components/webchatcontainerstateful/common/utils/chatAdapterUtils.d.ts +9 -0
  48. package/package.json +1 -1
@@ -5,13 +5,18 @@ import { ChatSDKStore } from "../../contexts/ChatSDKStore";
5
5
  import LiveChatWidgetStateful from "./livechatwidgetstateful/LiveChatWidgetStateful";
6
6
  import { createReducer } from "../../contexts/createReducer";
7
7
  import { getLiveChatWidgetContextInitialState } from "../../contexts/common/LiveChatWidgetContextInitialState";
8
+ import { getMockChatSDKIfApplicable } from "./common/getMockChatSDKIfApplicable";
9
+ import overridePropsOnMockIfApplicable from "./common/overridePropsOnMockIfApplicable";
8
10
  export const LiveChatWidget = props => {
11
+ var _props$mock;
9
12
  const reducer = createReducer();
10
13
  const [state, dispatch] = useReducer(reducer, getLiveChatWidgetContextInitialState(props));
11
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
15
  const [adapter, setAdapter] = useState(undefined);
16
+ const chatSDK = getMockChatSDKIfApplicable(props.chatSDK, props === null || props === void 0 ? void 0 : (_props$mock = props.mock) === null || _props$mock === void 0 ? void 0 : _props$mock.type);
17
+ overridePropsOnMockIfApplicable(props);
13
18
  return /*#__PURE__*/React.createElement(ChatSDKStore.Provider, {
14
- value: props.chatSDK
19
+ value: chatSDK
15
20
  }, /*#__PURE__*/React.createElement(ChatAdapterStore.Provider, {
16
21
  value: [adapter, setAdapter]
17
22
  }, /*#__PURE__*/React.createElement(ChatContextStore.Provider, {
@@ -0,0 +1,20 @@
1
+ import { DemoChatSDK } from "../../webchatcontainerstateful/common/DemoChatSDK";
2
+ import { DesignerChatSDK } from "../../webchatcontainerstateful/common/DesignerChatSDK";
3
+ import { MockChatSDK } from "../../webchatcontainerstateful/common/mockchatsdk";
4
+
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
+ export const getMockChatSDKIfApplicable = (chatSDK, type) => {
7
+ if (type) {
8
+ switch (type.toLowerCase()) {
9
+ case "demo":
10
+ chatSDK = new DemoChatSDK();
11
+ break;
12
+ case "designer":
13
+ chatSDK = new DesignerChatSDK();
14
+ break;
15
+ default:
16
+ chatSDK = new MockChatSDK();
17
+ }
18
+ }
19
+ return chatSDK;
20
+ };
@@ -0,0 +1,34 @@
1
+ const overridePropsOnMockIfApplicable = props => {
2
+ var _props$mock, _props$mock2;
3
+ if (props !== null && props !== void 0 && (_props$mock = props.mock) !== null && _props$mock !== void 0 && _props$mock.type && (props === null || props === void 0 ? void 0 : (_props$mock2 = props.mock) === null || _props$mock2 === void 0 ? void 0 : _props$mock2.type.toLowerCase()) === "designer") {
4
+ if (!props.webChatContainerProps) {
5
+ props.webChatContainerProps = {};
6
+ }
7
+ if (!props.webChatContainerProps.webChatProps) {
8
+ props.webChatContainerProps.webChatProps = {};
9
+ }
10
+ if (!props.webChatContainerProps.webChatStyles) {
11
+ props.webChatContainerProps.webChatStyles = {};
12
+ }
13
+ if (!props.webChatContainerProps.webChatProps.overrideLocalizedStrings) {
14
+ props.webChatContainerProps.webChatProps.overrideLocalizedStrings = {};
15
+ }
16
+ props.webChatContainerProps = {
17
+ ...props.webChatContainerProps,
18
+ webChatProps: {
19
+ disabled: true,
20
+ ...props.webChatContainerProps.webChatProps,
21
+ overrideLocalizedStrings: {
22
+ TEXT_INPUT_PLACEHOLDER: "Send a message . . .",
23
+ ...props.webChatContainerProps.webChatProps.overrideLocalizedStrings
24
+ }
25
+ },
26
+ webChatStyles: {
27
+ hideUploadButton: false,
28
+ sendBoxBackground: "rgb(243, 242, 241)",
29
+ ...props.webChatContainerProps.webChatStyles
30
+ }
31
+ };
32
+ }
33
+ };
34
+ export default overridePropsOnMockIfApplicable;
@@ -2,21 +2,21 @@ import { BroadcastEvent, LogLevel, TelemetryEvent } from "../../../common/teleme
2
2
  import { Constants, LiveWorkItemState, WidgetLoadCustomErrorString, WidgetLoadTelemetryMessage } from "../../../common/Constants";
3
3
  import { checkContactIdError, createTimer, getConversationDetailsCall, getStateFromCache, getWidgetCacheIdfromProps, isNullOrEmptyString, isUndefinedOrEmpty } from "../../../common/utils";
4
4
  import { getAuthClientFunction, handleAuthentication } from "./authHelper";
5
+ import { handleChatReconnect, isPersistentEnabled, isReconnectEnabled } from "./reconnectChatHelper";
6
+ import { handleStartChatError, logWidgetLoadComplete } from "./startChatErrorHandler";
5
7
  import { ActivityStreamHandler } from "./ActivityStreamHandler";
6
8
  import { BroadcastService } from "@microsoft/omnichannel-chat-components";
7
9
  import { ConversationState } from "../../../contexts/common/ConversationState";
8
10
  import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
9
11
  import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
10
12
  import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
13
+ import { chatSDKStateCleanUp } from "./endChat";
11
14
  import { createAdapter } from "./createAdapter";
12
15
  import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
13
- import { handleChatReconnect, isPersistentEnabled, isReconnectEnabled } from "./reconnectChatHelper";
14
- import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
15
- import { updateSessionDataForTelemetry } from "./updateSessionDataForTelemetry";
16
- import { logWidgetLoadComplete, handleStartChatError } from "./startChatErrorHandler";
17
- import { chatSDKStateCleanUp } from "./endChat";
18
16
  import { isPersistentChatEnabled } from "./liveChatConfigUtils";
17
+ import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
19
18
  import { shouldSetPreChatIfPersistentChat } from "./persistentChatHelper";
19
+ import { updateTelemetryData } from "./updateSessionDataForTelemetry";
20
20
 
21
21
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
22
  let optionalParams = {};
@@ -151,7 +151,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
151
151
  chatSDKStateCleanUp(chatSDK);
152
152
  }
153
153
  try {
154
- var _state$appStates2, _newAdapter$activity$;
154
+ var _state$appStates2;
155
155
  // Clear disconnect state on start chat
156
156
  (state === null || state === void 0 ? void 0 : (_state$appStates2 = state.appStates) === null || _state$appStates2 === void 0 ? void 0 : _state$appStates2.chatDisconnectEventReceived) && dispatch({
157
157
  type: LiveChatWidgetActionType.SET_CHAT_DISCONNECT_EVENT_RECEIVED,
@@ -202,16 +202,7 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
202
202
  isStartChatSuccessful = false;
203
203
  throw error;
204
204
  }
205
-
206
- // New adapter creation
207
- const newAdapter = await createAdapter(chatSDK);
208
- setAdapter(newAdapter);
209
- const chatToken = await chatSDK.getChatToken();
210
- dispatch({
211
- type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
212
- payload: chatToken
213
- });
214
- newAdapter === null || newAdapter === void 0 ? void 0 : (_newAdapter$activity$ = newAdapter.activity$) === null || _newAdapter$activity$ === void 0 ? void 0 : _newAdapter$activity$.subscribe(createOnNewAdapterActivityHandler(chatToken === null || chatToken === void 0 ? void 0 : chatToken.chatId, chatToken === null || chatToken === void 0 ? void 0 : chatToken.visitorId));
205
+ await createAdapterAndSubscribe(chatSDK, dispatch, setAdapter);
215
206
 
216
207
  // Set app state to Active
217
208
  if (isStartChatSuccessful) {
@@ -232,27 +223,26 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
232
223
  payload: persistedState
233
224
  });
234
225
  logWidgetLoadComplete(WidgetLoadTelemetryMessage.PersistedStateRetrievedMessage);
235
- await setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
226
+ // Set post chat context in state, load in background to do not block the load
227
+ setPostChatContextAndLoadSurvey(chatSDK, dispatch, true);
236
228
  return;
237
229
  }
238
230
 
239
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
240
- const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
241
-
242
231
  // Persistent Chat relies on the `reconnectId` retrieved from reconnectablechats API to reconnect upon start chat and not `liveChatContext`
243
232
  if (!persistentChatEnabled) {
233
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
+ const liveChatContext = await (chatSDK === null || chatSDK === void 0 ? void 0 : chatSDK.getCurrentLiveChatContext());
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
244
236
  dispatch({
245
237
  type: LiveChatWidgetActionType.SET_LIVE_CHAT_CONTEXT,
246
238
  payload: liveChatContext
247
239
  });
248
240
  }
249
241
  logWidgetLoadComplete();
250
- // Set post chat context in state
251
- // Commenting this for now as post chat context is fetched during end chat
252
- await setPostChatContextAndLoadSurvey(chatSDK, dispatch);
253
-
242
+ // Set post chat context in state, load in background to do not block the load
243
+ setPostChatContextAndLoadSurvey(chatSDK, dispatch);
254
244
  // Updating chat session detail for telemetry
255
- await updateSessionDataForTelemetry(chatSDK, dispatch);
245
+ await updateTelemetryData(chatSDK, dispatch);
256
246
  } catch (ex) {
257
247
  handleStartChatError(dispatch, chatSDK, props, ex, isStartChatSuccessful);
258
248
  } finally {
@@ -261,6 +251,19 @@ const initStartChat = async (chatSDK, dispatch, setAdapter, state, props, params
261
251
  }
262
252
  };
263
253
 
254
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
255
+ const createAdapterAndSubscribe = async (chatSDK, dispatch, setAdapter) => {
256
+ var _newAdapter$activity$;
257
+ // New adapter creation
258
+ const newAdapter = await createAdapter(chatSDK);
259
+ setAdapter(newAdapter);
260
+ const chatToken = await chatSDK.getChatToken();
261
+ dispatch({
262
+ type: LiveChatWidgetActionType.SET_CHAT_TOKEN,
263
+ payload: chatToken
264
+ });
265
+ newAdapter === null || newAdapter === void 0 ? void 0 : (_newAdapter$activity$ = newAdapter.activity$) === null || _newAdapter$activity$ === void 0 ? void 0 : _newAdapter$activity$.subscribe(createOnNewAdapterActivityHandler(chatToken === null || chatToken === void 0 ? void 0 : chatToken.chatId, chatToken === null || chatToken === void 0 ? void 0 : chatToken.visitorId));
266
+ };
264
267
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
265
268
  const canConnectToExistingChat = async (props, chatSDK, state, dispatch, setAdapter) => {
266
269
  var _state$appStates3, _persistedState$domai6, _persistedState$appSt;
@@ -349,10 +352,8 @@ const checkIfConversationStillValid = async (chatSDK, dispatch, state) => {
349
352
  var _state$domainStates8, _state$domainStates8$, _state$domainStates9;
350
353
  const requestIdFromCache = (_state$domainStates8 = state.domainStates) === null || _state$domainStates8 === void 0 ? void 0 : (_state$domainStates8$ = _state$domainStates8.liveChatContext) === null || _state$domainStates8$ === void 0 ? void 0 : _state$domainStates8$.requestId;
351
354
  const liveChatContext = state === null || state === void 0 ? void 0 : (_state$domainStates9 = state.domainStates) === null || _state$domainStates9 === void 0 ? void 0 : _state$domainStates9.liveChatContext;
352
-
353
355
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
356
  let conversationDetails = undefined;
355
-
356
357
  // Preserve current requestId
357
358
  const currentRequestId = chatSDK.requestId ?? "";
358
359
  dispatch({
@@ -1,14 +1,14 @@
1
- import { ChatSDKErrorName, ChatSDKError } from "@microsoft/omnichannel-chat-sdk";
1
+ import { ChatSDKError, ChatSDKErrorName } from "@microsoft/omnichannel-chat-sdk";
2
2
  import { LogLevel, TelemetryEvent } from "../../../common/telemetry/TelemetryConstants";
3
- import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
4
- import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
3
+ import { PrepareEndChatDescriptionConstants, WidgetLoadCustomErrorString, WidgetLoadTelemetryMessage } from "../../../common/Constants";
4
+ import { callingStateCleanUp, chatSDKStateCleanUp, closeChatStateCleanUp, endChatStateCleanUp } from "./endChat";
5
5
  import { ConversationState } from "../../../contexts/common/ConversationState";
6
- import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
7
- import { callingStateCleanUp, endChatStateCleanUp, closeChatStateCleanUp, chatSDKStateCleanUp } from "./endChat";
8
6
  import { DataStoreManager } from "../../../common/contextDataStore/DataStoreManager";
9
- import { getWidgetCacheIdfromProps } from "../../../common/utils";
10
- import { PrepareEndChatDescriptionConstants, WidgetLoadCustomErrorString, WidgetLoadTelemetryMessage } from "../../../common/Constants";
7
+ import { LiveChatWidgetActionType } from "../../../contexts/common/LiveChatWidgetActionType";
11
8
  import { StartChatFailureType } from "../../../contexts/common/StartChatFailureType";
9
+ import { TelemetryHelper } from "../../../common/telemetry/TelemetryHelper";
10
+ import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
11
+ import { getWidgetCacheIdfromProps } from "../../../common/utils";
12
12
 
13
13
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
14
  export const handleStartChatError = (dispatch, chatSDK, props, ex, isStartChatSuccessful) => {
@@ -6,7 +6,13 @@ import { TelemetryManager } from "../../../common/telemetry/TelemetryManager";
6
6
  import { getConversationDetailsCall } from "../../../common/utils";
7
7
 
8
8
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
- export const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
9
+ export const updateTelemetryData = async (chatSDK, dispatch) => {
10
+ // load it concurrently, this will reduce the load time
11
+ await Promise.all([updateSessionDataForTelemetry(chatSDK, dispatch), updateConversationDataForTelemetry(chatSDK, dispatch)]);
12
+ };
13
+
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
10
16
  if (chatSDK) {
11
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
18
  const chatSession = await chatSDK.getCurrentLiveChatContext();
@@ -21,7 +27,6 @@ export const updateSessionDataForTelemetry = async (chatSDK, dispatch) => {
21
27
  chatSession
22
28
  }
23
29
  });
24
- await updateConversationDataForTelemetry(chatSDK, dispatch);
25
30
  }
26
31
  };
27
32
 
@@ -0,0 +1,6 @@
1
+ var LiveChatWidgetMockType;
2
+ (function (LiveChatWidgetMockType) {
3
+ LiveChatWidgetMockType["Test"] = "Test";
4
+ LiveChatWidgetMockType["Demo"] = "Demo";
5
+ })(LiveChatWidgetMockType || (LiveChatWidgetMockType = {}));
6
+ export {};
@@ -0,0 +1,79 @@
1
+ import "rxjs/add/operator/share";
2
+ import "rxjs/add/observable/of";
3
+ import { Observable } from "rxjs/Observable";
4
+ import MockAdapter from "./mockadapter";
5
+ import { customerUser, postBotMessageActivity, postBotAttachmentActivity, postBotTypingActivity, postEchoActivity, postSystemMessageActivity } from "./utils/chatAdapterUtils";
6
+ import { createHeroCardAttachment, createJpgFileAttachment, createSigninCardAttachment, createThumbnailCardAttachment } from "./utils/attachmentActivityUtils";
7
+ import MockBotCommand from "./MockBotCommand";
8
+ import MockBotCardCommandType from "./MockBotCardCommandType";
9
+ export class DemoChatAdapter extends MockAdapter {
10
+ constructor() {
11
+ super();
12
+ setTimeout(() => {
13
+ postSystemMessageActivity(this.activityObserver, "You're currently using a demo.", 0);
14
+ postBotMessageActivity(this.activityObserver, "Type `/help` to learn more", undefined, 0); // send init message from bot
15
+ }, 1000);
16
+ }
17
+ postBotCommandsActivity() {
18
+ let delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000;
19
+ postBotAttachmentActivity(this.activityObserver, [{
20
+ contentType: "application/vnd.microsoft.card.thumbnail",
21
+ content: {
22
+ buttons: [{
23
+ title: "Send system message",
24
+ type: "imBack",
25
+ value: "send system message"
26
+ }, {
27
+ title: "Send typing",
28
+ type: "imBack",
29
+ value: "send typing"
30
+ }, {
31
+ title: "Send bot message",
32
+ type: "imBack",
33
+ value: "send bot message"
34
+ }],
35
+ title: "Commands"
36
+ }
37
+ }], delay);
38
+ }
39
+ postActivity(activity) {
40
+ if (activity) {
41
+ postEchoActivity(this.activityObserver, activity, customerUser);
42
+ if (activity.text) {
43
+ switch (true) {
44
+ case activity.text === MockBotCommand.Help:
45
+ this.postBotCommandsActivity();
46
+ break;
47
+ case activity.text === MockBotCommand.SendSystemMessage:
48
+ postSystemMessageActivity(this.activityObserver, "Contoso has joined the chat.");
49
+ break;
50
+ case activity.text === MockBotCommand.SendTyping:
51
+ postBotTypingActivity(this.activityObserver);
52
+ break;
53
+ case activity.text === MockBotCommand.SendAttachment:
54
+ postBotAttachmentActivity(this.activityObserver, [createJpgFileAttachment()]);
55
+ break;
56
+ case activity.text === MockBotCommand.SendBotMessage:
57
+ postBotMessageActivity(this.activityObserver, "Hi, how can I help you?");
58
+ break;
59
+ case activity.text === `${MockBotCommand.Card} ${MockBotCardCommandType.Signin}`:
60
+ postBotAttachmentActivity(this.activityObserver, [createSigninCardAttachment()]);
61
+ break;
62
+ case activity.text === `${MockBotCommand.Card} ${MockBotCardCommandType.Hero}`:
63
+ postBotAttachmentActivity(this.activityObserver, [createHeroCardAttachment()]);
64
+ break;
65
+ case activity.text === `${MockBotCommand.Card} ${MockBotCardCommandType.Thumbnail}`:
66
+ postBotAttachmentActivity(this.activityObserver, [createThumbnailCardAttachment()]);
67
+ break;
68
+ case activity.text.startsWith(`${MockBotCommand.Bot} `):
69
+ postBotMessageActivity(this.activityObserver, activity.text.substring(5));
70
+ break;
71
+ case activity.text.startsWith(`${MockBotCommand.System} `):
72
+ postSystemMessageActivity(this.activityObserver, activity.text.substring(8));
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ return Observable.of(activity.id || "");
78
+ }
79
+ }
@@ -0,0 +1,10 @@
1
+ import { DemoChatAdapter } from "./DemoChatAdapter";
2
+ import { MockChatSDK } from "./mockchatsdk";
3
+ export class DemoChatSDK extends MockChatSDK {
4
+ constructor() {
5
+ super();
6
+ }
7
+ createChatAdapter() {
8
+ return new DemoChatAdapter();
9
+ }
10
+ }
@@ -0,0 +1,33 @@
1
+ import { Observable } from "rxjs/Observable";
2
+ import MockAdapter from "./mockadapter";
3
+ import { customerUser, postBotMessageActivity, postEchoActivity, postSystemMessageActivity } from "./utils/chatAdapterUtils";
4
+ export class DesignerChatAdapter extends MockAdapter {
5
+ constructor() {
6
+ super();
7
+ setTimeout(() => {
8
+ postBotMessageActivity(this.activityObserver, "Id venenatis a condimentum vitae?", undefined, 0);
9
+ this.postUserActivity("Diam donec adipiscing tristique risus nec feugiat in fermentum", 0);
10
+ postSystemMessageActivity(this.activityObserver, "We are finding the best agent for your inquiry, please hold ...", 100);
11
+ postSystemMessageActivity(this.activityObserver, "John has joined the chat", 100);
12
+ postBotMessageActivity(this.activityObserver, "Neque viverra justo nec ultrices dui sapien eget mi proin", undefined, 100);
13
+ }, 1000);
14
+ }
15
+ postUserActivity(text) {
16
+ let delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
17
+ setTimeout(() => {
18
+ postEchoActivity(this.activityObserver, {
19
+ text,
20
+ from: {
21
+ ...customerUser
22
+ },
23
+ type: "message"
24
+ }, customerUser, 0);
25
+ }, delay);
26
+ }
27
+ postActivity(activity) {
28
+ if (activity) {
29
+ postEchoActivity(this.activityObserver, activity, customerUser);
30
+ }
31
+ return Observable.of(activity.id || "");
32
+ }
33
+ }
@@ -0,0 +1,10 @@
1
+ import { DesignerChatAdapter } from "./DesignerChatAdapter";
2
+ import { MockChatSDK } from "./mockchatsdk";
3
+ export class DesignerChatSDK extends MockChatSDK {
4
+ constructor() {
5
+ super();
6
+ }
7
+ createChatAdapter() {
8
+ return new DesignerChatAdapter();
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ var MockBotCardCommandType;
2
+ (function (MockBotCardCommandType) {
3
+ MockBotCardCommandType["Hero"] = "hero";
4
+ MockBotCardCommandType["Signin"] = "signin";
5
+ MockBotCardCommandType["Thumbnail"] = "thumbnail";
6
+ })(MockBotCardCommandType || (MockBotCardCommandType = {}));
7
+ export default MockBotCardCommandType;
@@ -0,0 +1,12 @@
1
+ var MockBotCommand;
2
+ (function (MockBotCommand) {
3
+ MockBotCommand["Bot"] = "/bot";
4
+ MockBotCommand["Card"] = "/card";
5
+ MockBotCommand["Help"] = "/help";
6
+ MockBotCommand["SendAttachment"] = "send attachment";
7
+ MockBotCommand["SendBotMessage"] = "send bot message";
8
+ MockBotCommand["SendSystemMessage"] = "send system message";
9
+ MockBotCommand["SendTyping"] = "send typing";
10
+ MockBotCommand["System"] = "/system";
11
+ })(MockBotCommand || (MockBotCommand = {}));
12
+ export default MockBotCommand;
@@ -14,6 +14,9 @@ export class MockChatSDK {
14
14
  orgUrl: "https://contoso.crm.dynamics.com"
15
15
  });
16
16
  }
17
+ async initialize() {
18
+ return this.getLiveChatConfig();
19
+ }
17
20
  async startChat() {
18
21
  await this.sleep(1000);
19
22
  }
@@ -0,0 +1,61 @@
1
+ export const createJpgFileAttachment = () => {
2
+ return {
3
+ contentType: "image/jpeg",
4
+ name: "600x400.jpg",
5
+ contentUrl: "https://raw.githubusercontent.com/microsoft/omnichannel-chat-sdk/e7e75d4ede351e1cf2e52f13860d2284848c4af0/playwright/public/images/600x400.jpg"
6
+ };
7
+ };
8
+ export const createHeroCardAttachment = () => {
9
+ return {
10
+ contentType: "application/vnd.microsoft.card.hero",
11
+ content: {
12
+ buttons: [{
13
+ title: "Bellevue",
14
+ type: "imBack",
15
+ value: "Bellevue"
16
+ }, {
17
+ title: "Redmond",
18
+ type: "imBack",
19
+ value: "Redmond"
20
+ }, {
21
+ title: "Seattle",
22
+ type: "imBack",
23
+ value: "Seattle"
24
+ }],
25
+ title: "Choose your location"
26
+ }
27
+ };
28
+ };
29
+ export const createThumbnailCardAttachment = () => {
30
+ return {
31
+ contentType: "application/vnd.microsoft.card.thumbnail",
32
+ content: {
33
+ title: "Microsoft",
34
+ subtitle: "Our mission is to empower every person and every organization on the planet to achieve more.",
35
+ text: "Microsoft creates platforms and tools powered by AI to deliver innovative solutions that meet the evolving needs of our customers. The technology company is committed to making AI available broadly and doing so responsibly, with a mission to empower every person and every organization on the planet to achieve more.",
36
+ images: [{
37
+ alt: "Microsoft logo",
38
+ url: "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE1Mu3b?ver=5c31" // logo from https://microsoft.com
39
+ }],
40
+
41
+ buttons: [{
42
+ title: "Learn more",
43
+ type: "openUrl",
44
+ value: "https://www.microsoft.com/"
45
+ }]
46
+ }
47
+ };
48
+ };
49
+ export const createSigninCardAttachment = () => {
50
+ return {
51
+ contentType: "application/vnd.microsoft.card.signin",
52
+ content: {
53
+ text: "Please login",
54
+ buttons: [{
55
+ type: "signin",
56
+ title: "Signin",
57
+ value: "https://login.live.com/"
58
+ }]
59
+ }
60
+ };
61
+ };
@@ -0,0 +1,77 @@
1
+ import { uuidv4 } from "@microsoft/omnichannel-chat-sdk";
2
+ export const customerUser = {
3
+ id: "usedId",
4
+ name: "User",
5
+ role: "user"
6
+ };
7
+ export const botUser = {
8
+ id: "botId",
9
+ name: "Bot",
10
+ role: "bot"
11
+ };
12
+
13
+ // WebChat expects an "echo" activity to confirm the message has been sent successfully
14
+ export const postEchoActivity = function (activityObserver, activity, user) {
15
+ let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1000;
16
+ const echoActivity = {
17
+ ...activity,
18
+ id: uuidv4(),
19
+ from: {
20
+ ...activity.from,
21
+ ...user
22
+ },
23
+ timestamp: new Date().toISOString()
24
+ };
25
+ setTimeout(() => {
26
+ activityObserver === null || activityObserver === void 0 ? void 0 : activityObserver.next(echoActivity); // mock message sent activity
27
+ }, delay);
28
+ };
29
+ export const postBotMessageActivity = function (activityObserver, text) {
30
+ let tags = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
31
+ let delay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1000;
32
+ setTimeout(() => {
33
+ activityObserver === null || activityObserver === void 0 ? void 0 : activityObserver.next({
34
+ id: uuidv4(),
35
+ from: {
36
+ ...botUser
37
+ },
38
+ text,
39
+ type: "message",
40
+ channelData: {
41
+ tags
42
+ },
43
+ timestamp: new Date().toISOString()
44
+ });
45
+ }, delay);
46
+ };
47
+ export const postSystemMessageActivity = function (activityObserver, text) {
48
+ let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
49
+ postBotMessageActivity(activityObserver, text, "system", delay);
50
+ };
51
+ export const postBotTypingActivity = function (activityObserver) {
52
+ let delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;
53
+ setTimeout(() => {
54
+ activityObserver === null || activityObserver === void 0 ? void 0 : activityObserver.next({
55
+ id: uuidv4(),
56
+ from: {
57
+ ...botUser
58
+ },
59
+ type: "typing"
60
+ });
61
+ }, delay);
62
+ };
63
+ export const postBotAttachmentActivity = function (activityObserver) {
64
+ let attachments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
65
+ let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
66
+ setTimeout(() => {
67
+ activityObserver === null || activityObserver === void 0 ? void 0 : activityObserver.next({
68
+ id: uuidv4(),
69
+ from: {
70
+ ...botUser
71
+ },
72
+ attachments,
73
+ type: "message",
74
+ timestamp: new Date().toISOString()
75
+ });
76
+ }, delay);
77
+ };
@@ -0,0 +1 @@
1
+ export declare const getMockChatSDKIfApplicable: (chatSDK: any, type?: string | undefined) => any;
@@ -0,0 +1,3 @@
1
+ import { ILiveChatWidgetProps } from "../interfaces/ILiveChatWidgetProps";
2
+ declare const overridePropsOnMockIfApplicable: (props: ILiveChatWidgetProps) => void;
3
+ export default overridePropsOnMockIfApplicable;
@@ -1,3 +1,3 @@
1
1
  import { Dispatch } from "react";
2
2
  import { ILiveChatWidgetAction } from "../../../contexts/common/ILiveChatWidgetAction";
3
- export declare const updateSessionDataForTelemetry: (chatSDK: any, dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<void>;
3
+ export declare const updateTelemetryData: (chatSDK: any, dispatch: Dispatch<ILiveChatWidgetAction>) => Promise<void>;
@@ -25,6 +25,7 @@ import { IPostChatSurveyPaneStatefulProps } from "../../postchatsurveypanestatef
25
25
  import { IScrollBarProps } from "./IScrollBarProps";
26
26
  import { IDraggableChatWidgetProps } from "./IDraggableChatWidgetProps";
27
27
  import { INotificationPaneProps } from "@microsoft/omnichannel-chat-components/lib/types/components/notificationpane/interfaces/INotificationPaneProps";
28
+ import { IMockProps } from "./IMockProps";
28
29
  export interface ILiveChatWidgetProps {
29
30
  audioNotificationProps?: IAudioNotificationProps;
30
31
  callingContainerProps?: ICallingContainerProps;
@@ -61,4 +62,5 @@ export interface ILiveChatWidgetProps {
61
62
  allowSdkChatSupport?: boolean;
62
63
  initialCustomContext?: any;
63
64
  draggableChatWidgetProps?: IDraggableChatWidgetProps;
65
+ mock?: IMockProps;
64
66
  }
@@ -0,0 +1,8 @@
1
+ declare enum LiveChatWidgetMockType {
2
+ Test = "Test",
3
+ Demo = "Demo"
4
+ }
5
+ export interface IMockProps {
6
+ type: LiveChatWidgetMockType;
7
+ }
8
+ export {};
@@ -0,0 +1,10 @@
1
+ import "rxjs/add/operator/share";
2
+ import "rxjs/add/observable/of";
3
+ import { Message } from "botframework-directlinejs";
4
+ import { Observable } from "rxjs/Observable";
5
+ import MockAdapter from "./mockadapter";
6
+ export declare class DemoChatAdapter extends MockAdapter {
7
+ constructor();
8
+ private postBotCommandsActivity;
9
+ postActivity(activity: Message): Observable<string>;
10
+ }
@@ -0,0 +1,6 @@
1
+ import { DemoChatAdapter } from "./DemoChatAdapter";
2
+ import { MockChatSDK } from "./mockchatsdk";
3
+ export declare class DemoChatSDK extends MockChatSDK {
4
+ constructor();
5
+ createChatAdapter(): DemoChatAdapter;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { Message } from "botframework-directlinejs";
2
+ import { Observable } from "rxjs/Observable";
3
+ import MockAdapter from "./mockadapter";
4
+ export declare class DesignerChatAdapter extends MockAdapter {
5
+ constructor();
6
+ private postUserActivity;
7
+ postActivity(activity: Message): Observable<string>;
8
+ }
@@ -0,0 +1,6 @@
1
+ import { DesignerChatAdapter } from "./DesignerChatAdapter";
2
+ import { MockChatSDK } from "./mockchatsdk";
3
+ export declare class DesignerChatSDK extends MockChatSDK {
4
+ constructor();
5
+ createChatAdapter(): DesignerChatAdapter;
6
+ }
@@ -0,0 +1,6 @@
1
+ declare enum MockBotCardCommandType {
2
+ Hero = "hero",
3
+ Signin = "signin",
4
+ Thumbnail = "thumbnail"
5
+ }
6
+ export default MockBotCardCommandType;