@xapp/chat-widget 1.57.2 → 1.57.4
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.
- package/dist/components/ActionItem/ActionItem.stories.d.ts +3 -5
- package/dist/components/ChatFooter/ChatFooter.stories.d.ts +3 -5
- package/dist/components/ChatMarkdownMessage/ChatMarkdownMessage.stories.d.ts +3 -5
- package/dist/components/ChatMenu/ChatMenu.stories.d.ts +3 -5
- package/dist/components/ChatMessage/ChatMessage.d.ts +0 -0
- package/dist/components/ChatTextMessage/ChatTextMessage.d.ts +0 -0
- package/dist/components/ChatWidget/ChatWidget.stories.d.ts +1 -0
- package/dist/components/OptionalLink/OptionalLink.stories.d.ts +3 -5
- package/dist/index.css +2 -2
- package/dist/index.es.js +63 -17
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +63 -17
- package/dist/index.js.map +1 -1
- package/dist/storybook/store.d.ts +3 -0
- package/dist/utils/index.d.ts +0 -0
- package/dist/utils/time.d.ts +0 -0
- package/dist/xapp-chat-widget.css +1 -1
- package/dist/xapp-chat-widget.js +2 -2
- package/dist/xapp-chat-widget.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -262,6 +262,33 @@ var RetryRequest = /** @class */ (function () {
|
|
|
262
262
|
return RetryRequest;
|
|
263
263
|
}());
|
|
264
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Get a display date of a specific point in time based on the current time.
|
|
267
|
+
*
|
|
268
|
+
* @param date
|
|
269
|
+
* @returns
|
|
270
|
+
*/
|
|
271
|
+
function getTimeAgo(date) {
|
|
272
|
+
var now = new Date();
|
|
273
|
+
var diffInSeconds = Math.floor((now.valueOf() - date.valueOf()) / 1000);
|
|
274
|
+
if (diffInSeconds < 1) {
|
|
275
|
+
return "now";
|
|
276
|
+
}
|
|
277
|
+
if (diffInSeconds < 60) {
|
|
278
|
+
return "".concat(diffInSeconds, " seconds ago");
|
|
279
|
+
}
|
|
280
|
+
var diffInMinutes = Math.floor(diffInSeconds / 60);
|
|
281
|
+
if (diffInMinutes < 60) {
|
|
282
|
+
return "".concat(diffInMinutes, " minutes ago");
|
|
283
|
+
}
|
|
284
|
+
var diffInHours = Math.floor(diffInMinutes / 60);
|
|
285
|
+
if (diffInHours < 24) {
|
|
286
|
+
return "".concat(diffInHours, " hours ago");
|
|
287
|
+
}
|
|
288
|
+
// If more than 24 hours ago, return the full date and time
|
|
289
|
+
return date.toLocaleString();
|
|
290
|
+
}
|
|
291
|
+
|
|
265
292
|
var EMAIL_REGEX = "^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$";
|
|
266
293
|
// Returns current timestamp
|
|
267
294
|
function getCurrentDateString() {
|
|
@@ -321,6 +348,10 @@ var Avatar = function (props) {
|
|
|
321
348
|
var hasImage = !!style.backgroundImage || !!child;
|
|
322
349
|
return (React__default$1["default"].createElement("div", { className: "avatar ".concat(agentAva ? "avatar--agent" : "avatar--visitor", " ").concat(!hasImage ? "avatar--empty" : ""), style: style, title: entity ? entity.display_name : "Agent" }, child));
|
|
323
350
|
};
|
|
351
|
+
/**
|
|
352
|
+
* Generates an SVG based on the
|
|
353
|
+
* @returns
|
|
354
|
+
*/
|
|
324
355
|
function getVisitorSvg() {
|
|
325
356
|
return (React__default$1["default"].createElement("svg", { width: "16", height: "19", viewBox: "0 0 16 19", style: { margin: "0 auto", display: "block" } },
|
|
326
357
|
React__default$1["default"].createElement("path", { d: "M11.5 5c0-1.933-1.567-3.5-3.5-3.5S4.5 3.067 4.5 5 6.067 8.5 8 8.5s3.5-1.567 3.5-3.5zM3 5c0-2.76 2.24-5 5-5s5 2.24 5 5-2.24 5-5 5-5-2.24-5-5zM1.955 17.294c.21-.642.504-1.285.898-1.88C3.963 13.74 5.615 12.75 8 12.75c2.385 0 4.038.99 5.147 2.664.394.595.69 1.238.898 1.88.124.382.19.672.214.822.063.41.447.69.856.625.41-.063.69-.447.625-.856-.034-.225-.118-.59-.27-1.053-.247-.763-.598-1.527-1.073-2.244C13.024 12.51 10.917 11.25 8 11.25c-2.916 0-5.024 1.26-6.397 3.336-.475.717-.826 1.48-1.074 2.245-.152.463-.236.83-.27 1.054-.065.41.215.793.624.857.41.065.793-.215.857-.624.025-.15.09-.44.215-.822z", fill: "#FFF", fillRule: "evenodd" })));
|
|
@@ -2614,6 +2645,8 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2614
2645
|
log("Connection update received. Session created: ".concat(data.sessionCreated, " Error: ").concat(data.errorMessage || ""));
|
|
2615
2646
|
if (data.sessionCreated) {
|
|
2616
2647
|
_this.sessionCreated = true;
|
|
2648
|
+
// This is overkill. But if we are stuck in pending this can help.
|
|
2649
|
+
_this.setConnectionStatus("online");
|
|
2617
2650
|
}
|
|
2618
2651
|
else {
|
|
2619
2652
|
// Shut down
|
|
@@ -2659,6 +2692,7 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2659
2692
|
user: {
|
|
2660
2693
|
displayName: sender.displayName || sender.email || sender.userId,
|
|
2661
2694
|
nick: senderToNick(sender),
|
|
2695
|
+
avatarPath: sender.avatarPath
|
|
2662
2696
|
},
|
|
2663
2697
|
msg: message.msg,
|
|
2664
2698
|
timestamp: ts || new Date().getTime(),
|
|
@@ -2666,14 +2700,15 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2666
2700
|
});
|
|
2667
2701
|
};
|
|
2668
2702
|
this.handlers["user joined"] = function (_data, sender, ts) {
|
|
2703
|
+
var _a, _b;
|
|
2669
2704
|
_this.dispatch({
|
|
2670
2705
|
type: "chat",
|
|
2671
2706
|
detail: {
|
|
2672
2707
|
type: "chat.memberjoin",
|
|
2673
2708
|
user: {
|
|
2709
|
+
avatarPath: (_b = (_a = _this.options) === null || _a === void 0 ? void 0 : _a.bot) === null || _b === void 0 ? void 0 : _b.avatarPath,
|
|
2674
2710
|
displayName: sender.displayName,
|
|
2675
2711
|
nick: senderToNick(sender),
|
|
2676
|
-
avatarPath: sender.avatarPath,
|
|
2677
2712
|
},
|
|
2678
2713
|
timestamp: ts || new Date().getTime(),
|
|
2679
2714
|
},
|
|
@@ -2774,8 +2809,9 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2774
2809
|
this.ws = new WebSocket(url.toString());
|
|
2775
2810
|
this.ws.onerror = function (ev) {
|
|
2776
2811
|
var _a;
|
|
2777
|
-
|
|
2778
|
-
|
|
2812
|
+
err("Error in WS connection. Url: ".concat(url.toString(), " Type: ").concat(!ev ? "?" : ev.type, " Ready State: ").concat((_a = _this.ws) === null || _a === void 0 ? void 0 : _a.readyState));
|
|
2813
|
+
// TODO: Experimental. Let's not set it to "pending". We may have a timing issue and miss the "online"
|
|
2814
|
+
// this.setConnectionStatus("pending");
|
|
2779
2815
|
};
|
|
2780
2816
|
this.ws.onmessage = function (me) {
|
|
2781
2817
|
log("ROUTER says: ".concat(me.data));
|
|
@@ -2785,7 +2821,7 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2785
2821
|
_this.handlers[message.event](message.data, message.sender, message.timeMs);
|
|
2786
2822
|
}
|
|
2787
2823
|
else {
|
|
2788
|
-
|
|
2824
|
+
err("Unknown router message event: ".concat(message.event));
|
|
2789
2825
|
}
|
|
2790
2826
|
};
|
|
2791
2827
|
return this.ws;
|
|
@@ -2820,7 +2856,7 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2820
2856
|
_this.ws.send(payloadData);
|
|
2821
2857
|
})
|
|
2822
2858
|
.catch(function (t) {
|
|
2823
|
-
|
|
2859
|
+
err("Connection wait timed out in ".concat(t, " ms"));
|
|
2824
2860
|
})];
|
|
2825
2861
|
case 1:
|
|
2826
2862
|
_a.sent();
|
|
@@ -2893,7 +2929,7 @@ var StentorRouterChat = /** @class */ (function () {
|
|
|
2893
2929
|
_this.postMessage(serviceRequest);
|
|
2894
2930
|
})
|
|
2895
2931
|
.catch(function (t) {
|
|
2896
|
-
|
|
2932
|
+
err("Session creation wait timed out in ".concat(t, " ms"));
|
|
2897
2933
|
})];
|
|
2898
2934
|
case 1:
|
|
2899
2935
|
_a.sent();
|
|
@@ -7096,7 +7132,7 @@ var ListMiddlewareWidget = function (props) {
|
|
|
7096
7132
|
var handleExecute = useExecuteActionCallback();
|
|
7097
7133
|
var handleButton = useButtonCallback();
|
|
7098
7134
|
var user = ctx.user;
|
|
7099
|
-
return (React__default$1["default"].createElement(ChatMessagePart, { showAvatar:
|
|
7135
|
+
return (React__default$1["default"].createElement(ChatMessagePart, { showAvatar: false, user: user },
|
|
7100
7136
|
list.type === "CAROUSEL" && React__default$1["default"].createElement("div", { className: "chat-msg chat-msg--fullwidth chat-msg--no-ava" },
|
|
7101
7137
|
React__default$1["default"].createElement(Carousel, { list: list, onExecute: handleExecute, onButtonClick: handleButton, onOpenUrl: ctx.openUrl })),
|
|
7102
7138
|
list.type === "LIST" && React__default$1["default"].createElement("div", { className: "chat-msg chat-msg--expand" },
|
|
@@ -7317,12 +7353,15 @@ var ChatPermissionMessage = function (props) {
|
|
|
7317
7353
|
};
|
|
7318
7354
|
|
|
7319
7355
|
var ChatTextMessage = function (props) {
|
|
7356
|
+
var message = props.message;
|
|
7357
|
+
var date = new Date(message.timestamp);
|
|
7358
|
+
var time = date.getHours() + ':' + date.getMinutes();
|
|
7320
7359
|
var agentMessage = isAgent(props.message.user.nick);
|
|
7321
7360
|
return (React__default$1["default"].createElement("div", { className: "chat-msg" },
|
|
7322
7361
|
React__default$1["default"].createElement("div", { className: "chat-text-container" },
|
|
7323
7362
|
React__default$1["default"].createElement(ChatMessageBubble, { owner: agentMessage ? "others" : "mine", hasTail: agentMessage && !props.sibling },
|
|
7324
|
-
React__default$1["default"].createElement("span", { className: "message-sr-only" }, "at " +
|
|
7325
|
-
React__default$1["default"].createElement("span", null,
|
|
7363
|
+
React__default$1["default"].createElement("span", { className: "message-sr-only" }, "at " + time + (agentMessage ? " the bot said" : " the user said")),
|
|
7364
|
+
React__default$1["default"].createElement("span", null, message.msg.text)))));
|
|
7326
7365
|
};
|
|
7327
7366
|
|
|
7328
7367
|
function getClassName(msg) {
|
|
@@ -7351,25 +7390,32 @@ var ChatMessage = function (props) {
|
|
|
7351
7390
|
return (React__default$1["default"].createElement(React__default$1["default"].Fragment, null,
|
|
7352
7391
|
msg.text &&
|
|
7353
7392
|
React__default$1["default"].createElement(ChatMessagePart, { showAvatar: avaKey === "text", user: user },
|
|
7354
|
-
React__default$1["default"].createElement(ChatTextMessage, { message: props.message, sibling: props.sibling
|
|
7393
|
+
React__default$1["default"].createElement(ChatTextMessage, { message: props.message, sibling: props.sibling })),
|
|
7355
7394
|
msg.html &&
|
|
7356
7395
|
React__default$1["default"].createElement(ChatMessagePart, { showAvatar: avaKey === "html", user: user },
|
|
7357
|
-
React__default$1["default"].createElement(ChatMarkdownMessage, { message: props.message, sibling: props.sibling,
|
|
7396
|
+
React__default$1["default"].createElement(ChatMarkdownMessage, { message: props.message, sibling: props.sibling, onOpenUrl: (_a = props.middlewareContext) === null || _a === void 0 ? void 0 : _a.openUrl })),
|
|
7358
7397
|
msg.displays && middleware && msg.displays.map(function (display, index) {
|
|
7359
7398
|
var Middleware = middleware;
|
|
7360
|
-
return (React__default$1["default"].createElement(
|
|
7361
|
-
React__default$1["default"].createElement("span", { className: "message-sr-only" }, "at " + props.time + " the bot said"),
|
|
7362
|
-
React__default$1["default"].createElement(Middleware, { key: index, msg: display, ctx: props.middlewareContext })));
|
|
7399
|
+
return (React__default$1["default"].createElement(Middleware, { key: index, msg: display, ctx: props.middlewareContext }));
|
|
7363
7400
|
}),
|
|
7364
7401
|
msg.permissionRequest && ctx &&
|
|
7365
7402
|
React__default$1["default"].createElement(ChatMessagePart, { showAvatar: avaKey === "permissionRequest", user: user },
|
|
7366
|
-
React__default$1["default"].createElement(ChatPermissionMessage, { message: props.message, sibling: props.sibling, ctx: ctx
|
|
7403
|
+
React__default$1["default"].createElement(ChatPermissionMessage, { message: props.message, sibling: props.sibling, ctx: ctx }))));
|
|
7367
7404
|
}
|
|
7368
7405
|
return (React__default$1["default"].createElement(React__default$1["default"].Fragment, null));
|
|
7369
7406
|
}
|
|
7407
|
+
function renderTimestamp() {
|
|
7408
|
+
var timestamp = props.message.timestamp;
|
|
7409
|
+
var ts = new Date(timestamp);
|
|
7410
|
+
var timeAgo = getTimeAgo(ts);
|
|
7411
|
+
return (React__default$1["default"].createElement("div", { className: "chat-msg-timestamp ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor") },
|
|
7412
|
+
React__default$1["default"].createElement("span", null, timeAgo)));
|
|
7413
|
+
}
|
|
7370
7414
|
// empty
|
|
7371
7415
|
return (React__default$1["default"].createElement("div", { className: "chat-msg-container-wrapper ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor", " ").concat(props.sibling ? "sibling" : "") },
|
|
7372
|
-
React__default$1["default"].createElement("div", { className: "chat-msg-container ".concat(getClassName(props.message)) },
|
|
7416
|
+
React__default$1["default"].createElement("div", { className: "chat-msg-container ".concat(getClassName(props.message)) },
|
|
7417
|
+
renderByType(),
|
|
7418
|
+
renderTimestamp())));
|
|
7373
7419
|
};
|
|
7374
7420
|
|
|
7375
7421
|
/**
|
|
@@ -30309,7 +30355,7 @@ var MessageList = function (props) {
|
|
|
30309
30355
|
switch (msg.type) {
|
|
30310
30356
|
case "chat.file":
|
|
30311
30357
|
case "chat.msg":
|
|
30312
|
-
return (React__default$1["default"].createElement(ChatMessage, { key: msg.type + msg.timestamp, message: msg, sibling: sibling, agent: user,
|
|
30358
|
+
return (React__default$1["default"].createElement(ChatMessage, { key: msg.type + msg.timestamp, message: msg, sibling: sibling, agent: user, messageMiddleware: props.messageMiddleware, middlewareContext: ctxCache.resolve(user) }));
|
|
30313
30359
|
case "chat.failureMsg":
|
|
30314
30360
|
return (React__default$1["default"].createElement(FailureMessage, __assign({ key: msg.type + msg.timestamp, agents: props.agents, time: time }, msg.failureMsg)));
|
|
30315
30361
|
case "chat.memberjoin":
|