@microsoft/omnichannel-chat-widget 0.1.0-main.8e79cb8 → 0.1.0-main.9e62ed8

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 (55) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/common/Constants.js +12 -0
  3. package/lib/cjs/common/telemetry/TelemetryConstants.js +14 -2
  4. package/lib/cjs/common/utils.js +1 -1
  5. package/lib/cjs/components/chatbuttonstateful/ChatButtonStateful.js +15 -3
  6. package/lib/cjs/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +10 -1
  7. package/lib/cjs/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +7 -1
  8. package/lib/cjs/components/livechatwidget/common/endChat.js +3 -3
  9. package/lib/cjs/components/livechatwidget/common/initWebChatComposer.js +8 -3
  10. package/lib/cjs/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +129 -36
  11. package/lib/cjs/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  12. package/lib/cjs/components/webchatcontainerstateful/WebChatContainerStateful.js +80 -0
  13. package/lib/cjs/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  14. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +14 -0
  15. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  16. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +52 -0
  17. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +98 -0
  18. package/lib/cjs/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +117 -0
  19. package/lib/cjs/contexts/common/LiveChatWidgetActionType.js +2 -0
  20. package/lib/cjs/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  21. package/lib/cjs/contexts/createReducer.js +8 -0
  22. package/lib/cjs/controller/componentController.js +1 -1
  23. package/lib/esm/common/Constants.js +12 -0
  24. package/lib/esm/common/telemetry/TelemetryConstants.js +14 -2
  25. package/lib/esm/common/utils.js +1 -1
  26. package/lib/esm/components/chatbuttonstateful/ChatButtonStateful.js +17 -6
  27. package/lib/esm/components/footerstateful/downloadtranscriptstateful/DownloadTranscriptStateful.js +8 -2
  28. package/lib/esm/components/livechatwidget/common/defaultProps/dummyDefaultProps.js +7 -1
  29. package/lib/esm/components/livechatwidget/common/endChat.js +3 -2
  30. package/lib/esm/components/livechatwidget/common/initWebChatComposer.js +7 -4
  31. package/lib/esm/components/livechatwidget/livechatwidgetstateful/LiveChatWidgetStateful.js +120 -35
  32. package/lib/esm/components/proactivechatpanestateful/ProactiveChatPaneStateful.js +16 -0
  33. package/lib/esm/components/webchatcontainerstateful/WebChatContainerStateful.js +72 -0
  34. package/lib/esm/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.js +1 -0
  35. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.js +5 -0
  36. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/activityMiddleware.js +16 -2
  37. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.js +41 -0
  38. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.js +94 -0
  39. package/lib/esm/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.js +107 -0
  40. package/lib/esm/contexts/common/LiveChatWidgetActionType.js +2 -0
  41. package/lib/esm/contexts/common/LiveChatWidgetContextInitialState.js +2 -1
  42. package/lib/esm/contexts/createReducer.js +8 -0
  43. package/lib/esm/controller/componentController.js +1 -1
  44. package/lib/types/common/Constants.d.ts +6 -0
  45. package/lib/types/common/interfaces/IContextDataStore.d.ts +1 -1
  46. package/lib/types/common/telemetry/TelemetryConstants.d.ts +15 -3
  47. package/lib/types/components/webchatcontainerstateful/interfaces/IBotMagicCodeConfig.d.ts +4 -0
  48. package/lib/types/components/webchatcontainerstateful/interfaces/IWebChatContainerStatefulProps.d.ts +2 -0
  49. package/lib/types/components/webchatcontainerstateful/webchatcontroller/BotMagicCodeStore.d.ts +3 -0
  50. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.d.ts +2 -0
  51. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/cardActionMiddleware.spec.d.ts +1 -0
  52. package/lib/types/components/webchatcontainerstateful/webchatcontroller/middlewares/renderingmiddlewares/messageTimestampMiddleware.d.ts +5 -0
  53. package/lib/types/contexts/common/ILiveChatWidgetContext.d.ts +1 -0
  54. package/lib/types/contexts/common/LiveChatWidgetActionType.d.ts +3 -1
  55. package/package.json +2 -2
@@ -0,0 +1,107 @@
1
+ import { WebChatActionType } from "../../enums/WebChatActionType";
2
+ import { Constants } from "../../../../../common/Constants"; // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
3
+
4
+ const createMessageTimeStampMiddleware = _ref => {
5
+ let {
6
+ dispatch
7
+ } = _ref;
8
+ return next => action => {
9
+ if (isApplicable(action)) {
10
+ return next(evaluateTagsAndOverrideTimeStamp(action));
11
+ }
12
+
13
+ return next(action);
14
+ };
15
+ };
16
+
17
+ const isApplicable = action => {
18
+ return action.type === WebChatActionType.DIRECT_LINE_INCOMING_ACTIVITY && isPVAConversation(action) && isPayloadValid(action) && isValidChannel(action);
19
+ };
20
+
21
+ const isPayloadValid = action => {
22
+ var _action$payload;
23
+
24
+ return action === null || action === void 0 ? void 0 : (_action$payload = action.payload) === null || _action$payload === void 0 ? void 0 : _action$payload.activity;
25
+ };
26
+
27
+ const isValidChannel = action => {
28
+ var _action$payload2, _action$payload2$acti;
29
+
30
+ return (action === null || action === void 0 ? void 0 : (_action$payload2 = action.payload) === null || _action$payload2 === void 0 ? void 0 : (_action$payload2$acti = _action$payload2.activity) === null || _action$payload2$acti === void 0 ? void 0 : _action$payload2$acti.channelId) === Constants.acsChannel;
31
+ };
32
+
33
+ const isPVAConversation = action => {
34
+ return !isTagIncluded(action, Constants.systemMessageTag) && !isTagIncluded(action, Constants.publicMessageTag) && !isRoleUserOn(action);
35
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+
37
+
38
+ const isTagIncluded = (action, tag) => {
39
+ return isDataTagsPresent(action) && action.payload.activity.channelData.tags.includes(tag);
40
+ };
41
+
42
+ const isRoleUserOn = action => {
43
+ var _action$payload3, _action$payload3$acti, _action$payload3$acti2;
44
+
45
+ return (action === null || action === void 0 ? void 0 : (_action$payload3 = action.payload) === null || _action$payload3 === void 0 ? void 0 : (_action$payload3$acti = _action$payload3.activity) === null || _action$payload3$acti === void 0 ? void 0 : (_action$payload3$acti2 = _action$payload3$acti.from) === null || _action$payload3$acti2 === void 0 ? void 0 : _action$payload3$acti2.role) === Constants.userMessageTag;
46
+ };
47
+
48
+ const overrideTimeStamp = (timestampOriginal, timeStampNew) => {
49
+ return isTimestampValid(timeStampNew) ? timeStampNew : timestampOriginal;
50
+ };
51
+
52
+ const isTimestampValid = timeStamp => {
53
+ const regex = /(\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])(T)(\d{2})(:{1})(\d{2})(:{1})(\d{2})(.\d+)([Z]{1}))/;
54
+ return regex.test(timeStamp);
55
+ };
56
+
57
+ const isDataTagsPresent = action => {
58
+ var _action$payload4, _action$payload4$acti, _action$payload4$acti2;
59
+
60
+ return (action === null || action === void 0 ? void 0 : (_action$payload4 = action.payload) === null || _action$payload4 === void 0 ? void 0 : (_action$payload4$acti = _action$payload4.activity) === null || _action$payload4$acti === void 0 ? void 0 : (_action$payload4$acti2 = _action$payload4$acti.channelData) === null || _action$payload4$acti2 === void 0 ? void 0 : _action$payload4$acti2.tags) && action.payload.activity.channelData.tags.length > 0;
61
+ };
62
+
63
+ const evaluateTagsAndOverrideTimeStamp = action => {
64
+ const tagValue = tagLookup(action, Constants.prefixTimestampTag);
65
+
66
+ if (tagValue) {
67
+ const newTimestamp = extractTimeStamp(tagValue);
68
+ action.payload.activity.timestamp = overrideTimeStamp(action.payload.activity.timestamp, newTimestamp);
69
+ }
70
+
71
+ return action;
72
+ };
73
+
74
+ const extractTimeStamp = timeStamp => {
75
+ if (timeStamp && timeStamp.length > 0) {
76
+ const ts = timeStamp.split(Constants.prefixTimestampTag);
77
+
78
+ if (ts && ts.length > 1) {
79
+ return ts[1];
80
+ }
81
+ }
82
+
83
+ return timeStamp;
84
+ };
85
+
86
+ const tagLookup = (action, tag) => {
87
+ if (!isDataTagsPresent(action)) {
88
+ return null;
89
+ }
90
+
91
+ const tags = action.payload.activity.channelData.tags;
92
+ let value;
93
+
94
+ if (tags && tags.length > 0) {
95
+ for (let i = 0; i < tags.length; i++) {
96
+ value = tags[i];
97
+
98
+ if (value && value.indexOf(tag) > -1) {
99
+ return value;
100
+ }
101
+ }
102
+ }
103
+
104
+ return null;
105
+ };
106
+
107
+ export default createMessageTimeStampMiddleware;
@@ -32,4 +32,6 @@ export let LiveChatWidgetActionType;
32
32
  LiveChatWidgetActionType[LiveChatWidgetActionType["SET_CONVERSATION_ENDED_BY_AGENT"] = 28] = "SET_CONVERSATION_ENDED_BY_AGENT";
33
33
  LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_STATE"] = 29] = "SET_WIDGET_STATE";
34
34
  LiveChatWidgetActionType[LiveChatWidgetActionType["SET_LIVE_CHAT_CONTEXT"] = 30] = "SET_LIVE_CHAT_CONTEXT";
35
+ LiveChatWidgetActionType[LiveChatWidgetActionType["SET_BOT_OAUTH_SIGNIN_ID"] = 31] = "SET_BOT_OAUTH_SIGNIN_ID";
36
+ LiveChatWidgetActionType[LiveChatWidgetActionType["SET_WIDGET_SIZE"] = 32] = "SET_WIDGET_SIZE";
35
37
  })(LiveChatWidgetActionType || (LiveChatWidgetActionType = {}));
@@ -19,7 +19,8 @@ export const getLiveChatWidgetContextInitialState = props => {
19
19
  telemetryInternalData: {},
20
20
  globalDir: "ltr",
21
21
  liveChatContext: undefined,
22
- customContext: undefined
22
+ customContext: undefined,
23
+ widgetSize: undefined
23
24
  },
24
25
  appStates: {
25
26
  conversationState: ConversationState.Closed,
@@ -227,6 +227,14 @@ export const createReducer = () => {
227
227
  }
228
228
  };
229
229
 
230
+ case LiveChatWidgetActionType.SET_WIDGET_SIZE:
231
+ return { ...state,
232
+ domainStates: { ...state.domainStates,
233
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
+ widgetSize: action.payload
235
+ }
236
+ };
237
+
230
238
  default:
231
239
  return state;
232
240
  }
@@ -1,6 +1,6 @@
1
1
  import { ConversationState } from "../contexts/common/ConversationState";
2
2
  export const shouldShowChatButton = state => {
3
- return state.appStates.isMinimized || state.appStates.conversationState === ConversationState.Closed;
3
+ return (state.appStates.isMinimized || state.appStates.conversationState === ConversationState.Closed) && state.appStates.skipChatButtonRendering == false; // Do not show chat button in case of popout
4
4
  };
5
5
  export const shouldShowProactiveChatPane = state => {
6
6
  return !state.appStates.isMinimized && state.appStates.conversationState === ConversationState.ProactiveChat;
@@ -1,4 +1,6 @@
1
1
  export declare class Constants {
2
+ static readonly magicCodeBroadcastChannel = "MagicCodeChannel";
3
+ static readonly magicCodeResponseBroadcastChannel = "MagicCodeResponseChannel";
2
4
  static readonly systemMessageTag = "system";
3
5
  static readonly userMessageTag = "user";
4
6
  static readonly historyMessageTag = "history";
@@ -32,6 +34,10 @@ export declare class Constants {
32
34
  static readonly queuePositionMessageTag = "queueposition";
33
35
  static readonly averageWaitTimeMessageTag = "averagewaittime";
34
36
  static readonly message = "message";
37
+ static readonly hiddenTag = "Hidden";
38
+ static readonly prefixTimestampTag = "ServerMessageTimestamp_";
39
+ static readonly acsChannel = "ACS_CHANNEL";
40
+ static readonly publicMessageTag = "public";
35
41
  static readonly supportedAdaptiveCardContentTypes: Array<string>;
36
42
  static readonly maxUploadFileSize = "500000";
37
43
  static readonly imageRegex: RegExp;
@@ -10,5 +10,5 @@ export interface IContextDataStore {
10
10
  /**
11
11
  * removeData: Remove data from data store by key
12
12
  */
13
- removeData?: (key: string) => void;
13
+ removeData: (key: string, type: string) => void;
14
14
  }
@@ -19,19 +19,28 @@ export declare enum LogLevel {
19
19
  }
20
20
  export declare enum BroadcastEvent {
21
21
  LoadPostChatSurvey = "LoadPostChatSurvey",
22
- EndChat = "ChatEnded",
22
+ ChatEnded = "ChatEnded",
23
23
  NewMessageNotification = "NewMessageNotification",
24
24
  UnreadMessageCount = "UnreadMessageCount",
25
+ StartProactiveChat = "StartProactiveChat",
25
26
  ProactiveChatStartChat = "ProactiveChatStartChat",
26
27
  ProactiveChatStartPopoutChat = "ProactiveChatStartPopoutChat",
28
+ ProactiveChatIsInPopoutMode = "ProactiveChatIsInPopoutMode",
29
+ ResetProactiveChatParams = "ResetProactiveChatParams",
27
30
  InvalidAdaptiveCardFormat = "InvalidAdaptiveCardFormat",
28
31
  NewMessageSent = "NewMessageSent",
29
32
  NewMessageReceived = "NewMessageReceived",
30
33
  RedirectPageRequest = "RedirectPageRequest",
34
+ StartChat = "StartChat",
31
35
  StartChatSkippingChatButtonRendering = "StartChatSkippingChatButtonRendering",
32
36
  StartUnauthenticatedReconnectChat = "StartUnauthenticatedReconnectChat",
37
+ InitiateEndChat = "InitiateEndChat",
33
38
  SetCustomContext = "SetCustomContext",
34
- ChatRetrievedFromCache = "ChatRetrievedFromCache"
39
+ ChatRetrievedFromCache = "ChatRetrievedFromCache",
40
+ MaximizeChat = "MaximizeChat",
41
+ ChatInitiated = "ChatInitiated",
42
+ CloseChat = "CloseChat",
43
+ InitiateEndChatOnBrowserUnload = "InitiateEndChatOnBrowserUnload"
35
44
  }
36
45
  export declare enum TelemetryEvent {
37
46
  CallAdded = "CallAdded",
@@ -80,8 +89,9 @@ export declare enum TelemetryEvent {
80
89
  PrechatSubmitted = "PrechatSubmitted",
81
90
  StartChatSDKCall = "StartChatCall",
82
91
  StartChatEventRecevied = "StartChatEventReceived",
83
- EndChatSDKCall = "EndChatCall",
92
+ EndChatSDKCall = "EndChatSDKCall",
84
93
  EndChatEventReceived = "EndChatEventReceived",
94
+ WindowClosed = "WindowClosed",
85
95
  OnNewMessageFailed = "OnNewMessageFailed",
86
96
  OnNewMessageAudioNotificationFailed = "OnNewMessageAudioNotificationFailed",
87
97
  DownloadTranscriptResponseNullOrUndefined = "DownloadTranscriptResponseNullOrUndefined",
@@ -106,6 +116,8 @@ export declare enum TelemetryEvent {
106
116
  EmailTranscriptButtonClicked = "EmailTranscriptButtonClicked",
107
117
  EmailTranscriptCancelButtonClicked = "EmailTranscriptCancelButtonClicked",
108
118
  AudioToggleButtonClicked = "AudioToggleButtonClicked",
119
+ SuppressBotMagicCodeSucceeded = "SuppressBotMagicCodeSucceeded",
120
+ SuppressBotMagicCodeFailed = "SuppressBotMagicCodeFailed",
109
121
  ProcessingHTMLTextMiddlewareFailed = "ProcessingHTMLTextMiddlewareFailed",
110
122
  ProcessingSanitizationMiddlewareFailed = "ProcessingSanitizationMiddlewareFailed",
111
123
  FormatTagsMiddlewareJSONStringifyFailed = "FormatTagsMiddlewareJSONStringifyFailed",
@@ -0,0 +1,4 @@
1
+ export interface IBotMagicCodeConfig {
2
+ disabled?: boolean;
3
+ fwdUrl?: string;
4
+ }
@@ -1,3 +1,4 @@
1
+ import { IBotMagicCodeConfig } from "./IBotMagicCodeConfig";
1
2
  import { ILiveChatWidgetLocalizedTexts } from "../../../contexts/common/ILiveChatWidgetLocalizedTexts";
2
3
  import { IRenderingMiddlewareProps } from "./IRenderingMiddlewareProps";
3
4
  import { IStyle } from "@fluentui/react";
@@ -13,4 +14,5 @@ export interface IWebChatContainerStatefulProps {
13
14
  storeMiddlewares?: any[];
14
15
  renderingMiddlewareProps?: IRenderingMiddlewareProps;
15
16
  localizedTexts?: ILiveChatWidgetLocalizedTexts;
17
+ botMagicCode?: IBotMagicCodeConfig;
16
18
  }
@@ -0,0 +1,3 @@
1
+ export declare class BotMagicCodeStore {
2
+ static botOAuthSignInId: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ import { IBotMagicCodeConfig } from "../../../interfaces/IBotMagicCodeConfig";
2
+ export declare const createCardActionMiddleware: (botMagicCodeConfig: IBotMagicCodeConfig | undefined) => () => (next: any) => (...args: any) => any;
@@ -0,0 +1,5 @@
1
+ import { IWebChatAction } from "../../../interfaces/IWebChatAction";
2
+ declare const createMessageTimeStampMiddleware: ({ dispatch }: {
3
+ dispatch: any;
4
+ }) => (next: any) => (action: IWebChatAction) => any;
5
+ export default createMessageTimeStampMiddleware;
@@ -16,6 +16,7 @@ export interface ILiveChatWidgetContext {
16
16
  globalDir: "rtl" | "ltr";
17
17
  liveChatContext: any;
18
18
  customContext: any;
19
+ widgetSize: any;
19
20
  };
20
21
  appStates: {
21
22
  conversationState: ConversationState;
@@ -29,5 +29,7 @@ export declare enum LiveChatWidgetActionType {
29
29
  SET_FOCUS_CHAT_BUTTON = 27,
30
30
  SET_CONVERSATION_ENDED_BY_AGENT = 28,
31
31
  SET_WIDGET_STATE = 29,
32
- SET_LIVE_CHAT_CONTEXT = 30
32
+ SET_LIVE_CHAT_CONTEXT = 30,
33
+ SET_BOT_OAUTH_SIGNIN_ID = 31,
34
+ SET_WIDGET_SIZE = 32
33
35
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "0.1.0-main.8e79cb8",
3
+ "version": "0.1.0-main.9e62ed8",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "dependencies": {
76
76
  "@fluentui/react": "^8.49.1",
77
- "@microsoft/omnichannel-chat-components": "^0.1.0-main.423d0ce",
77
+ "@microsoft/omnichannel-chat-components": "0.1.0-main.b59a07c",
78
78
  "@microsoft/omnichannel-chat-sdk": "1.0.1-main.077d17c",
79
79
  "abort-controller-es5": "^2.0.1",
80
80
  "dompurify": "^2.3.4",