@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/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
- log("Error in WS connection. Type: ".concat(!ev ? "?" : ev.type, " Ready State: ").concat((_a = _this.ws) === null || _a === void 0 ? void 0 : _a.readyState));
2778
- _this.setConnectionStatus("pending");
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
- log("Unknown router message event: ".concat(message.event));
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
- console.log("Connection wait timed out in ".concat(t, " ms"));
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
- console.log("Session creation wait timed out in ".concat(t, " ms"));
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: true, user: user },
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 " + props.time + (agentMessage ? " the bot said" : " the user said")),
7325
- React__default$1["default"].createElement("span", null, props.message.msg.text)))));
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, time: props.time })),
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, time: props.time, onOpenUrl: (_a = props.middlewareContext) === null || _a === void 0 ? void 0 : _a.openUrl })),
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(React__default$1["default"].Fragment, null,
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, time: props.time }))));
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)) }, renderByType())));
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, time: time, messageMiddleware: props.messageMiddleware, middlewareContext: ctxCache.resolve(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":