@xapp/chat-widget 1.80.0 → 1.81.1

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 (34) hide show
  1. package/dist/components/AdminBar/AdminBar.d.ts +0 -0
  2. package/dist/components/CardContainer/CardContainer.d.ts +0 -0
  3. package/dist/components/ChatActionButtons/ChatActionButton.d.ts +0 -0
  4. package/dist/components/ChatActionButtons/ChatActionButtons.d.ts +0 -0
  5. package/dist/components/ChatMedia/ChatMedia.d.ts +1 -1
  6. package/dist/components/ChatMessage/ChatMessage.d.ts +0 -0
  7. package/dist/components/ChatMessagePart/ChatMessagePart.d.ts +0 -0
  8. package/dist/components/ChatRating/ChatRating.d.ts +0 -0
  9. package/dist/components/Icons/CloseIcon.d.ts +0 -0
  10. package/dist/components/Icons/LeftDownArrowIcon.d.ts +0 -0
  11. package/dist/components/Icons/SendIcon.d.ts +0 -0
  12. package/dist/components/Input/Input.d.ts +0 -0
  13. package/dist/components/MessageList/MessageList.d.ts +0 -0
  14. package/dist/components/MessageSvg/MessageSvg.d.ts +0 -0
  15. package/dist/components/QueuePosition/QueuePosition.d.ts +0 -0
  16. package/dist/components/ServerOffline/ServerOffline.d.ts +0 -0
  17. package/dist/components/UknownMessage/UnknownMessage.d.ts +0 -0
  18. package/dist/index.css +1 -1
  19. package/dist/index.es.js +824 -712
  20. package/dist/index.es.js.map +1 -1
  21. package/dist/index.js +979 -867
  22. package/dist/index.js.map +1 -1
  23. package/dist/store/ChatAction.d.ts +0 -0
  24. package/dist/store/ChatState.d.ts +0 -0
  25. package/dist/store/actions/types.d.ts +0 -0
  26. package/dist/storybook/store.d.ts +2 -2
  27. package/dist/utils/useChatDispatch.d.ts +0 -0
  28. package/dist/xapp/ChatServer.d.ts +0 -0
  29. package/dist/xapp/LogChat.d.ts +0 -0
  30. package/dist/xapp/StentorRouterChat.d.ts +0 -0
  31. package/dist/xapp-chat-widget.css +1 -1
  32. package/dist/xapp-chat-widget.js +4 -5
  33. package/dist/xapp-chat-widget.js.map +1 -1
  34. package/package.json +23 -19
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var React$1 = require('react');
3
+ var require$$1 = require('react');
4
+ var require$$0 = require('react/jsx-runtime');
4
5
  var reactRedux = require('react-redux');
5
6
 
6
7
  var ActionButton = function (_a) {
@@ -11,7 +12,7 @@ var ActionButton = function (_a) {
11
12
  onClick(label);
12
13
  }
13
14
  }
14
- return (React$1.createElement("button", { disabled: disable, type: type, className: "action-button ".concat(addClass), onClick: handleClick }, label));
15
+ return (require$$0.jsx("button", { disabled: disable, type: type, className: "action-button ".concat(addClass), onClick: handleClick, children: label }));
15
16
  };
16
17
 
17
18
  /******************************************************************************
@@ -168,14 +169,14 @@ function isAgent(nick) {
168
169
  }
169
170
 
170
171
  function useIsMounted() {
171
- var ref = React$1.useRef(false);
172
- React$1.useEffect(function () {
172
+ var ref = require$$1.useRef(false);
173
+ require$$1.useEffect(function () {
173
174
  ref.current = true;
174
175
  return function () {
175
176
  ref.current = false;
176
177
  };
177
178
  }, []);
178
- return React$1.useCallback(function () { return ref.current; }, []);
179
+ return require$$1.useCallback(function () { return ref.current; }, []);
179
180
  }
180
181
 
181
182
  var RetryOptions = /** @class */ (function () {
@@ -347,9 +348,9 @@ var defaultWidgetButtonWidth = "48";
347
348
  var defaultMobileWidgetButtonWidth = "30";
348
349
  var defaultNonMobileScreenWidth = "400";
349
350
  var scheduleWidgetUrl = "ScheduleButton";
350
- var ChatConfigContext = React$1.createContext(null);
351
+ var ChatConfigContext = require$$1.createContext(null);
351
352
  function useWidgetEnv() {
352
- var ctx = React$1.useContext(ChatConfigContext);
353
+ var ctx = require$$1.useContext(ChatConfigContext);
353
354
  return ctx === null || ctx === void 0 ? void 0 : ctx.env;
354
355
  }
355
356
  function getServerConfig(env) {
@@ -365,7 +366,7 @@ function getServerConfig(env) {
365
366
  function useServerConfig(env, nonce) {
366
367
  var connection = getServerConfig(env);
367
368
  var accountKey = connection.accountKey, serverUrl = connection.serverUrl, type = connection.type, timeout = connection.timeout;
368
- return React$1.useMemo(function () { return ({
369
+ return require$$1.useMemo(function () { return ({
369
370
  accountKey: accountKey,
370
371
  serverUrl: serverUrl,
371
372
  timeout: timeout,
@@ -384,7 +385,7 @@ var Avatar = function (props) {
384
385
  var style = {};
385
386
  var child;
386
387
  var entity = props.entity;
387
- var chatConfig = React$1.useContext(ChatConfigContext);
388
+ var chatConfig = require$$1.useContext(ChatConfigContext);
388
389
  var avatarPath = entity === null || entity === void 0 ? void 0 : entity.avatarPath;
389
390
  if (!avatarPath) {
390
391
  var avatarImage = GenerateAvatar({
@@ -403,22 +404,21 @@ var Avatar = function (props) {
403
404
  child = getVisitorSvg();
404
405
  }
405
406
  var hasImage = !!style.backgroundImage || !!child;
406
- return (React$1.createElement("div", { className: "avatar ".concat(agentAva ? "avatar--agent" : "avatar--visitor", " ").concat(!hasImage ? "avatar--empty" : ""), style: style, title: entity ? entity.display_name : "Agent" }, child));
407
+ return (require$$0.jsx("div", { className: "avatar ".concat(agentAva ? "avatar--agent" : "avatar--visitor", " ").concat(!hasImage ? "avatar--empty" : ""), style: style, title: entity ? entity.display_name : "Agent", children: child }));
407
408
  };
408
409
  /**
409
410
  * Generates an SVG based on the
410
411
  * @returns
411
412
  */
412
413
  function getVisitorSvg() {
413
- return (React$1.createElement("svg", { width: "16", height: "19", viewBox: "0 0 16 19", style: { margin: "0 auto", display: "block" } },
414
- React$1.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" })));
414
+ return (require$$0.jsx("svg", { width: "16", height: "19", viewBox: "0 0 16 19", style: { margin: "0 auto", display: "block" }, children: require$$0.jsx("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" }) }));
415
415
  }
416
416
  function GenerateAvatar(props) {
417
417
  var initials = (props === null || props === void 0 ? void 0 : props.initials) || "?";
418
418
  var size = (props === null || props === void 0 ? void 0 : props.size) || 40;
419
419
  var backgroundColor = (props === null || props === void 0 ? void 0 : props.backgroundColor) || "#007bff";
420
420
  var textColor = (props === null || props === void 0 ? void 0 : props.textColor) || "#ffffff";
421
- var image = React$1.useMemo(function () {
421
+ var image = require$$1.useMemo(function () {
422
422
  return generateImage(initials, size, backgroundColor, textColor);
423
423
  }, [initials, size, backgroundColor, textColor]);
424
424
  return image;
@@ -456,24 +456,22 @@ function getItemUrl(item) {
456
456
  return item.url || item.imageActionUrl;
457
457
  }
458
458
 
459
- function useChatDispatch() {
460
- return reactRedux.useDispatch();
461
- }
459
+ var useChatDispatch = reactRedux.useDispatch.withTypes();
462
460
 
463
461
  var OptionalLink = function (props) {
464
462
  var chatDispatch = useChatDispatch();
465
463
  var visuals = reactRedux.useSelector(function (state) { return state.visuals; });
466
464
  var url = props.url, className = props.className, onOpen = props.onOpen;
467
- var handleOpenUrl = React$1.useCallback(function () {
465
+ var handleOpenUrl = require$$1.useCallback(function () {
468
466
  if (onOpen) {
469
467
  onOpen(url, chatDispatch, visuals);
470
468
  }
471
469
  }, [url, onOpen]);
472
470
  if (url) {
473
- return (React$1.createElement("div", { onClick: handleOpenUrl, className: className }, props.children));
471
+ return (require$$0.jsx("div", { onClick: handleOpenUrl, className: className, children: props.children }));
474
472
  }
475
473
  else {
476
- return (React$1.createElement("div", { onClick: props.onClick, className: className }, props.children));
474
+ return (require$$0.jsx("div", { onClick: props.onClick, className: className, children: props.children }));
477
475
  }
478
476
  };
479
477
 
@@ -481,7 +479,7 @@ var ActionItem = function (props) {
481
479
  var _a;
482
480
  var item = props.item, onButtonClick = props.onButtonClick, onExecute = props.onExecute;
483
481
  var singleButton = ((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length) === 1;
484
- var handleClick = React$1.useCallback(function () {
482
+ var handleClick = require$$1.useCallback(function () {
485
483
  var _a;
486
484
  var btns = (_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length;
487
485
  // If there is only one button, it takes precedent
@@ -494,17 +492,17 @@ var ActionItem = function (props) {
494
492
  }
495
493
  }, [item, onExecute, onButtonClick]);
496
494
  var className = "xappw-chat-action-item ".concat(singleButton ? "xappw-chat-action-item--action" : "", " ").concat(props.className);
497
- return (React$1.createElement(OptionalLink, { className: className, url: getItemUrl(item), onClick: handleClick, onOpen: props.onOpenUrl }, props.children));
495
+ return (require$$0.jsx(OptionalLink, { className: className, url: getItemUrl(item), onClick: handleClick, onOpen: props.onOpenUrl, children: props.children }));
498
496
  };
499
497
 
500
498
  var ChatImage = function (props) {
501
499
  var cleanUrl = props.imageUrl.replace(/'/g, "%27");
502
- var content = React$1.createElement("div", { className: "chat-card-img__content", style: { backgroundImage: "url(".concat(cleanUrl, ")") } });
500
+ var content = (require$$0.jsx("div", { className: "chat-card-img__content", style: { backgroundImage: "url(".concat(cleanUrl, ")") } }));
503
501
  if (!props.imageActionUrl) {
504
- return (React$1.createElement("div", { className: "chat-card-img" }, content));
502
+ return require$$0.jsx("div", { className: "chat-card-img", children: content });
505
503
  }
506
504
  else {
507
- return (React$1.createElement("a", { href: props.imageActionUrl, "aria-label": "read more", target: "_blank", rel: "noopener noreferrer", className: "chat-card-img" }, content));
505
+ return (require$$0.jsx("a", { href: props.imageActionUrl, "aria-label": "read more", target: "_blank", rel: "noopener noreferrer", className: "chat-card-img", children: content }));
508
506
  }
509
507
  };
510
508
 
@@ -515,63 +513,53 @@ var ActionItemImage = function (props) {
515
513
  var itemUrl = getItemUrl(item);
516
514
  if (item.imageUrl) {
517
515
  var imageActionUrl = !singleButton ? item.imageActionUrl : null;
518
- return (React$1.createElement("div", { className: props.className },
519
- React$1.createElement(ChatImage, { imageUrl: item.imageUrl, imageActionUrl: !itemUrl && imageActionUrl })));
516
+ return (require$$0.jsx("div", { className: props.className, children: require$$0.jsx(ChatImage, { imageUrl: item.imageUrl, imageActionUrl: !itemUrl && imageActionUrl }) }));
520
517
  }
521
518
  else if (props.emptyImageVisible) {
522
- return (React$1.createElement("div", { className: props.className }));
519
+ return require$$0.jsx("div", { className: props.className });
523
520
  }
524
- return React$1.createElement(React$1.Fragment, null);
521
+ return require$$0.jsx(require$$0.Fragment, {});
525
522
  };
526
523
 
527
524
  var ChatActionButtonInner = function (props) {
528
525
  var button = props.button, onClick = props.onClick;
529
- var handleButton = React$1.useCallback(function () {
526
+ var handleButton = require$$1.useCallback(function () {
530
527
  onClick(button);
531
528
  }, [button, onClick]);
532
- return (React$1.createElement(ActionButton, { onClick: handleButton, addClass: "button-card", label: button.label }));
529
+ return require$$0.jsx(ActionButton, { onClick: handleButton, addClass: "button-card", label: button.label });
533
530
  };
534
- var ChatActionButton = React$1.memo(ChatActionButtonInner);
531
+ var ChatActionButton = require$$1.memo(ChatActionButtonInner);
535
532
 
536
533
  var ChatActionButtonsInner = function (props) {
537
- return (React$1.createElement("div", { className: "buttons-container " + (props.className || "") }, props.buttons.map(function (button, i) {
538
- return React$1.createElement(ChatActionButton, { button: button, onClick: props.onClick, key: i });
539
- })));
534
+ return (require$$0.jsx("div", { className: "buttons-container " + (props.className || ""), children: props.buttons.map(function (button, i) {
535
+ return require$$0.jsx(ChatActionButton, { button: button, onClick: props.onClick }, i);
536
+ }) }));
540
537
  };
541
- var ChatActionButtons = React$1.memo(ChatActionButtonsInner);
538
+ var ChatActionButtons = require$$1.memo(ChatActionButtonsInner);
542
539
 
543
540
  var CarouselItem = function (props) {
544
541
  var _a;
545
542
  var item = props.item;
546
- return (React$1.createElement(ActionItem, { className: "chat-list-item-container", item: item, onButtonClick: props.onButtonClick, onExecute: props.onExecute, onOpenUrl: props.onOpenUrl },
547
- React$1.createElement("div", { className: "chat-list-item" },
548
- React$1.createElement(ActionItemImage, { item: item, className: "chat-list-item__img", emptyImageVisible: props.emptyImageVisible }),
549
- item.title && React$1.createElement("div", { className: "chat-list-item__title" },
550
- React$1.createElement("span", null, item.title)),
551
- item.subTitle && React$1.createElement("div", { className: "chat-list-item__subtitle" },
552
- React$1.createElement("span", null, item.subTitle)),
553
- !!((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length) && React$1.createElement(ChatActionButtons, { className: "chat-list-item__actions", buttons: item.buttons, onClick: props.onButtonClick }))));
543
+ return (require$$0.jsx(ActionItem, { className: "chat-list-item-container", item: item, onButtonClick: props.onButtonClick, onExecute: props.onExecute, onOpenUrl: props.onOpenUrl, children: require$$0.jsxs("div", { className: "chat-list-item", children: [require$$0.jsx(ActionItemImage, { item: item, className: "chat-list-item__img", emptyImageVisible: props.emptyImageVisible }), item.title && (require$$0.jsx("div", { className: "chat-list-item__title", children: require$$0.jsx("span", { children: item.title }) })), item.subTitle && (require$$0.jsx("div", { className: "chat-list-item__subtitle", children: require$$0.jsx("span", { children: item.subTitle }) })), !!((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length) && (require$$0.jsx(ChatActionButtons, { className: "chat-list-item__actions", buttons: item.buttons, onClick: props.onButtonClick }))] }) }));
554
544
  };
555
545
 
556
546
  function getLeftArrowSvg() {
557
- return (React$1.createElement("svg", { viewBox: "-5 -18 10 36" },
558
- React$1.createElement("path", { d: "M 2.5 -15 L -2.5 0 L 2.5 15", stroke: "currentColor", strokeLinecap: "square", strokeWidth: "4px", fill: "none" })));
547
+ return (require$$0.jsx("svg", { viewBox: "-5 -18 10 36", children: require$$0.jsx("path", { d: "M 2.5 -15 L -2.5 0 L 2.5 15", stroke: "currentColor", strokeLinecap: "square", strokeWidth: "4px", fill: "none" }) }));
559
548
  }
560
549
  var ChevronLeft = function (props) {
561
- return (React$1.createElement("button", { onClick: props.onClick, className: "xa-chevron" }, getLeftArrowSvg()));
550
+ return (require$$0.jsx("button", { onClick: props.onClick, className: "xa-chevron", children: getLeftArrowSvg() }));
562
551
  };
563
552
 
564
553
  function getRightArrowSvg() {
565
- return (React$1.createElement("svg", { viewBox: "-5 -18 10 36" },
566
- React$1.createElement("path", { d: "M -2.5 -15 L 2.5 0 L -2.5 15", stroke: "currentColor", strokeLinecap: "square", strokeWidth: "4px", fill: "none" })));
554
+ return (require$$0.jsx("svg", { viewBox: "-5 -18 10 36", children: require$$0.jsx("path", { d: "M -2.5 -15 L 2.5 0 L -2.5 15", stroke: "currentColor", strokeLinecap: "square", strokeWidth: "4px", fill: "none" }) }));
567
555
  }
568
556
  var ChevronRight = function (props) {
569
- return (React$1.createElement("button", { onClick: props.onClick, className: "xa-chevron" }, getRightArrowSvg()));
557
+ return (require$$0.jsx("button", { onClick: props.onClick, className: "xa-chevron", children: getRightArrowSvg() }));
570
558
  };
571
559
 
572
560
  var Carousel = function (props) {
573
- var listRef = React$1.useRef(null);
574
- var _a = React$1.useState(0), visibleIndex = _a[0], setSetVisibleIndex = _a[1];
561
+ var listRef = require$$1.useRef(null);
562
+ var _a = require$$1.useState(0), visibleIndex = _a[0], setSetVisibleIndex = _a[1];
575
563
  function scrollMe(direction) {
576
564
  var _a, _b;
577
565
  var scrollArea = listRef.current;
@@ -605,21 +593,15 @@ var Carousel = function (props) {
605
593
  var hasOnlyOneItem = props.list.items.length === 1;
606
594
  var hasImage = props.list.items.some(function (item) { return item.imageUrl; });
607
595
  var listItems = props.list.items.map(function (item, itemIndex) {
608
- return (React$1.createElement("div", { className: "xappw-carousel-items__item", key: "item-key-".concat(itemIndex) },
609
- React$1.createElement(CarouselItem, { item: item, emptyImageVisible: hasImage, onExecute: props.onExecute, onButtonClick: props.onButtonClick, onOpenUrl: props.onOpenUrl })));
596
+ return (require$$0.jsx("div", { className: "xappw-carousel-items__item", children: require$$0.jsx(CarouselItem, { item: item, emptyImageVisible: hasImage, onExecute: props.onExecute, onButtonClick: props.onButtonClick, onOpenUrl: props.onOpenUrl }) }, "item-key-".concat(itemIndex)));
610
597
  });
611
- return (React$1.createElement("div", { className: "xappw-carousel" },
612
- !hasOnlyOneItem && (React$1.createElement("div", { className: "xappw-carousel__prev" },
613
- React$1.createElement(ChevronLeft, { onClick: function () { return scrollMe(-1); } }))),
614
- React$1.createElement("div", { ref: listRef, className: "xappw-carousel-items ".concat(hasOnlyOneItem ? "xappw-carousel-items--one-item" : "") }, listItems),
615
- !hasOnlyOneItem && (React$1.createElement("div", { className: "xappw-carousel__next" },
616
- React$1.createElement(ChevronRight, { onClick: function () { return scrollMe(1); } })))));
598
+ return (require$$0.jsxs("div", { className: "xappw-carousel", children: [!hasOnlyOneItem && (require$$0.jsx("div", { className: "xappw-carousel__prev", children: require$$0.jsx(ChevronLeft, { onClick: function () { return scrollMe(-1); } }) })), require$$0.jsx("div", { ref: listRef, className: "xappw-carousel-items ".concat(hasOnlyOneItem ? "xappw-carousel-items--one-item" : ""), children: listItems }), !hasOnlyOneItem && (require$$0.jsx("div", { className: "xappw-carousel__next", children: require$$0.jsx(ChevronRight, { onClick: function () { return scrollMe(1); } }) }))] }));
617
599
  };
618
600
 
619
601
  function useDimensions() {
620
- var ref = React$1.useRef(null);
621
- var _a = React$1.useState(), dimensions = _a[0], setDimensions = _a[1];
622
- React$1.useLayoutEffect(function () {
602
+ var ref = require$$1.useRef(null);
603
+ var _a = require$$1.useState(), dimensions = _a[0], setDimensions = _a[1];
604
+ require$$1.useLayoutEffect(function () {
623
605
  var _a, _b;
624
606
  setDimensions((_b = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) === null || _b === void 0 ? void 0 : _b.toJSON());
625
607
  }, []);
@@ -715,9 +697,7 @@ var CtaBubbleTail = function (props) {
715
697
  var _a, _b;
716
698
  var _c = useDimensions(), ref = _c[0], rect = _c[1];
717
699
  var viewPort = { x: (_a = rect === null || rect === void 0 ? void 0 : rect.width) !== null && _a !== void 0 ? _a : 0, y: (_b = rect === null || rect === void 0 ? void 0 : rect.height) !== null && _b !== void 0 ? _b : 0 };
718
- return (React$1.createElement("div", { ref: ref, className: "cta-bubble__tail" },
719
- React$1.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 ".concat(viewPort.x, " ").concat(viewPort.y) },
720
- React$1.createElement("path", { d: getTailSvgPath$1(props, viewPort), fill: "currentColor" }))));
700
+ return (require$$0.jsx("div", { ref: ref, className: "cta-bubble__tail", children: require$$0.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 ".concat(viewPort.x, " ").concat(viewPort.y), children: require$$0.jsx("path", { d: getTailSvgPath$1(props, viewPort), fill: "currentColor" }) }) }));
721
701
  };
722
702
  var CtaBubble = function (props) {
723
703
  var _a, _b, _c, _d;
@@ -731,17 +711,12 @@ var CtaBubble = function (props) {
731
711
  }
732
712
  };
733
713
  console.log("Returning CTABubble with message: ", props.children);
734
- return (React$1.createElement("div", { ref: ref, style: {
714
+ return (require$$0.jsxs("div", { ref: ref, style: {
735
715
  border: props.borderStyle ? "solid" : "none",
736
716
  borderWidth: ((_a = props.borderStyle) === null || _a === void 0 ? void 0 : _a.width) || "0px",
737
717
  borderColor: ((_b = props.borderStyle) === null || _b === void 0 ? void 0 : _b.color) || "transparent",
738
718
  animation: "".concat(animation, " 1s infinite"),
739
- }, className: "cta-bubble", onClick: props.onClick },
740
- React$1.createElement(CtaBubbleTail, { width: (_c = rect === null || rect === void 0 ? void 0 : rect.width) !== null && _c !== void 0 ? _c : 0, height: (_d = rect === null || rect === void 0 ? void 0 : rect.height) !== null && _d !== void 0 ? _d : 0, direction: 60, angle: 45, length: 16 }),
741
- React$1.createElement("div", { className: "cta-bubble__content" }, props.children),
742
- props.dismissible && (React$1.createElement("button", { className: "cta-bubble__dismiss", onClick: handleDismiss, "aria-label": "Dismiss" },
743
- React$1.createElement("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
744
- React$1.createElement("path", { d: "M11 1L1 11M1 1L11 11", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }))))));
719
+ }, className: "cta-bubble", onClick: props.onClick, children: [require$$0.jsx(CtaBubbleTail, { width: (_c = rect === null || rect === void 0 ? void 0 : rect.width) !== null && _c !== void 0 ? _c : 0, height: (_d = rect === null || rect === void 0 ? void 0 : rect.height) !== null && _d !== void 0 ? _d : 0, direction: 60, angle: 45, length: 16 }), require$$0.jsx("div", { className: "cta-bubble__content", children: props.children }), props.dismissible && (require$$0.jsx("button", { className: "cta-bubble__dismiss", onClick: handleDismiss, "aria-label": "Dismiss", children: require$$0.jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: require$$0.jsx("path", { d: "M11 1L1 11M1 1L11 11", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }) }))] }));
745
720
  };
746
721
 
747
722
  var CtaBubbleContainer = function (props) {
@@ -759,14 +734,14 @@ var CtaBubbleContainer = function (props) {
759
734
  hasChildren: !!children,
760
735
  childrenContent: children,
761
736
  });
762
- var startTime = React$1.useMemo(function () {
737
+ var startTime = require$$1.useMemo(function () {
763
738
  var time = visible ? new Date().valueOf() : undefined;
764
739
  log("[CtaBubbleContainer] StartTime calculated: visible=".concat(visible, ", startTime=").concat(time));
765
740
  return time;
766
741
  }, [visible]);
767
- var _a = React$1.useState(false), showBubble = _a[0], setShowBubble = _a[1];
742
+ var _a = require$$1.useState(false), showBubble = _a[0], setShowBubble = _a[1];
768
743
  log("[CtaBubbleContainer] Current state: showBubble=".concat(showBubble));
769
- React$1.useEffect(function () {
744
+ require$$1.useEffect(function () {
770
745
  log("[CtaBubbleContainer] useEffect triggered with:", {
771
746
  startTime: startTime,
772
747
  startTimeExists: !!startTime,
@@ -836,14 +811,14 @@ var CtaBubbleContainer = function (props) {
836
811
  // Final render decision
837
812
  var shouldRender = visible && showBubble;
838
813
  log("[CtaBubbleContainer] Render decision: visible=".concat(visible, ", showBubble=").concat(showBubble, ", shouldRender=").concat(shouldRender));
839
- return (React$1.createElement(React$1.Fragment, null, visible && showBubble && (React$1.createElement(CtaBubble, { onClick: onClick, animate: animate, buttonAnimation: buttonAnimation, dismissible: dismissible, onDismiss: handleDismiss }, children))));
814
+ return (require$$0.jsx(require$$0.Fragment, { children: visible && showBubble && (require$$0.jsx(CtaBubble, { onClick: onClick, animate: animate, buttonAnimation: buttonAnimation, dismissible: dismissible, onDismiss: handleDismiss, children: children })) }));
840
815
  };
841
816
 
842
817
  var ChatButton = function (_a) {
843
818
  var _b;
844
819
  var onClick = _a.onClick, addClass = _a.addClass, config = _a.config, visible = _a.visible, borderStyle = _a.borderStyle, imageUrl = _a.imageUrl, hasInteracted = _a.hasInteracted, onCtaDismiss = _a.onCtaDismiss;
845
- var _c = React$1.useState(defaultWidgetButtonWidth), buttonWidth = _c[0], setButtonWidth = _c[1];
846
- var _d = React$1.useState(false), animate = _d[0], setAnimate = _d[1];
820
+ var _c = require$$1.useState(defaultWidgetButtonWidth), buttonWidth = _c[0], setButtonWidth = _c[1];
821
+ var _d = require$$1.useState(false), animate = _d[0], setAnimate = _d[1];
847
822
  var mobileWidth = ((_b = config === null || config === void 0 ? void 0 : config.mobile) === null || _b === void 0 ? void 0 : _b.applyAtLessThanWidth) || defaultNonMobileScreenWidth;
848
823
  // Determines mobile or normal
849
824
  var getConfigToApply = function () {
@@ -856,7 +831,7 @@ var ChatButton = function (_a) {
856
831
  }
857
832
  };
858
833
  var configToApply = getConfigToApply();
859
- React$1.useEffect(function () {
834
+ require$$1.useEffect(function () {
860
835
  var _a;
861
836
  var delayTimer;
862
837
  var timeoutTimer;
@@ -899,7 +874,7 @@ var ChatButton = function (_a) {
899
874
  };
900
875
  }, [configToApply, setAnimate, hasInteracted]);
901
876
  var animation = animate && !hasInteracted ? (configToApply === null || configToApply === void 0 ? void 0 : configToApply.animation) || "wiggle" : "none";
902
- React$1.useEffect(function () {
877
+ require$$1.useEffect(function () {
903
878
  var handleResize = function () {
904
879
  var screenWidth = window.innerWidth;
905
880
  var newButtonWidth = screenWidth < parseInt(mobileWidth, 10)
@@ -915,23 +890,19 @@ var ChatButton = function (_a) {
915
890
  }, [mobileWidth]);
916
891
  var maxSvgSize = 22;
917
892
  var svgSize = Math.min(maxSvgSize, (+buttonWidth / +defaultWidgetButtonWidth) * maxSvgSize);
918
- return (React$1.createElement("button", { "aria-label": "open chat", className: "xapp-chat-button ".concat(addClass || "").trim(), onClick: onClick },
919
- React$1.createElement("div", { id: "xapp-widget-button", className: "xapp-chat-button__btn", style: {
920
- width: "".concat(buttonWidth, "px"),
921
- height: "".concat(buttonWidth, "px"),
922
- borderRadius: "".concat(+buttonWidth / 2, "px"),
923
- border: borderStyle && borderStyle.width ? "solid" : "none",
924
- borderWidth: (borderStyle === null || borderStyle === void 0 ? void 0 : borderStyle.width) || "0px",
925
- borderColor: (borderStyle === null || borderStyle === void 0 ? void 0 : borderStyle.color) || "transparent",
926
- animation: "".concat(animation, " 1s infinite"),
927
- } }, imageUrl ? (
928
- // Display image from URL
929
- React$1.createElement("img", { src: imageUrl, alt: "Chat Icon" })) : (
930
- // Fallback to default SVG
931
- React$1.createElement("svg", { width: svgSize, height: svgSize, viewBox: "0 0 22 22" },
932
- React$1.createElement("path", { d: "M13 22l-4-6H2c-1.11-.043-2-.935-2-2V2C0 .89.89 0 2 0h18c1.11 0 2 .892 2 2v12c0 1.067-.89 1.957-2 2h-3l-4 6zm3-8h4c-.005.3-.01-12 0-12-.01.004-18 .006-18 0 .005.006 0 12 0 12h8l3 5 3-5z", fill: "#FFF", fillRule: "evenodd" })))),
933
- configToApply && configToApply.message && !hasInteracted && (React$1.createElement("div", { className: "xapp-chat-button__cta" },
934
- React$1.createElement(CtaBubbleContainer, { timeout: configToApply === null || configToApply === void 0 ? void 0 : configToApply.timeout, delay: configToApply === null || configToApply === void 0 ? void 0 : configToApply.delay, animate: animate, buttonAnimation: animation, dismissible: configToApply === null || configToApply === void 0 ? void 0 : configToApply.dismissible, visible: !visible /** Why is this !visible */, onDismiss: onCtaDismiss }, configToApply === null || configToApply === void 0 ? void 0 : configToApply.message)))));
893
+ return (require$$0.jsxs("button", { "aria-label": "open chat", className: "xapp-chat-button ".concat(addClass || "").trim(), onClick: onClick, children: [require$$0.jsx("div", { id: "xapp-widget-button", className: "xapp-chat-button__btn", style: {
894
+ width: "".concat(buttonWidth, "px"),
895
+ height: "".concat(buttonWidth, "px"),
896
+ borderRadius: "".concat(+buttonWidth / 2, "px"),
897
+ border: borderStyle && borderStyle.width ? "solid" : "none",
898
+ borderWidth: (borderStyle === null || borderStyle === void 0 ? void 0 : borderStyle.width) || "0px",
899
+ borderColor: (borderStyle === null || borderStyle === void 0 ? void 0 : borderStyle.color) || "transparent",
900
+ animation: "".concat(animation, " 1s infinite"),
901
+ }, children: imageUrl ? (
902
+ // Display image from URL
903
+ require$$0.jsx("img", { src: imageUrl, alt: "Chat Icon" })) : (
904
+ // Fallback to default SVG
905
+ require$$0.jsx("svg", { width: svgSize, height: svgSize, viewBox: "0 0 22 22", children: require$$0.jsx("path", { d: "M13 22l-4-6H2c-1.11-.043-2-.935-2-2V2C0 .89.89 0 2 0h18c1.11 0 2 .892 2 2v12c0 1.067-.89 1.957-2 2h-3l-4 6zm3-8h4c-.005.3-.01-12 0-12-.01.004-18 .006-18 0 .005.006 0 12 0 12h8l3 5 3-5z", fill: "#FFF", fillRule: "evenodd" }) })) }), configToApply && configToApply.message && !hasInteracted && (require$$0.jsx("div", { className: "xapp-chat-button__cta", children: require$$0.jsx(CtaBubbleContainer, { timeout: configToApply === null || configToApply === void 0 ? void 0 : configToApply.timeout, delay: configToApply === null || configToApply === void 0 ? void 0 : configToApply.delay, animate: animate, buttonAnimation: animation, dismissible: configToApply === null || configToApply === void 0 ? void 0 : configToApply.dismissible, visible: !visible /** Why is this !visible */, onDismiss: onCtaDismiss, children: configToApply === null || configToApply === void 0 ? void 0 : configToApply.message }) }))] }));
935
906
  };
936
907
 
937
908
  var ChatCard = function (props) {
@@ -941,40 +912,32 @@ var ChatCard = function (props) {
941
912
  var image;
942
913
  var content;
943
914
  if (card.imageUrl) {
944
- image = React$1.createElement("div", { className: "chat-card-container__img" },
945
- React$1.createElement(ChatImage, { imageUrl: card.imageUrl, imageActionUrl: card.imageActionUrl }));
915
+ image = (require$$0.jsx("div", { className: "chat-card-container__img", children: require$$0.jsx(ChatImage, { imageUrl: card.imageUrl, imageActionUrl: card.imageActionUrl }) }));
946
916
  }
947
917
  if (card.title) {
948
- title =
949
- React$1.createElement("div", { className: "chat-card-title" },
950
- React$1.createElement("span", null, card.title));
918
+ title = (require$$0.jsx("div", { className: "chat-card-title", children: require$$0.jsx("span", { children: card.title }) }));
951
919
  }
952
920
  if (card.content) {
953
- content =
954
- React$1.createElement("div", { className: "chat-card-sub-title" },
955
- React$1.createElement("span", null, card.content));
956
- }
957
- return (React$1.createElement("div", { className: "chat-card-container" },
958
- image,
959
- title,
960
- content,
961
- !!((_a = card.buttons) === null || _a === void 0 ? void 0 : _a.length) && React$1.createElement(ChatActionButtons, { buttons: card.buttons, onClick: props.onButtonClick })));
921
+ content = (require$$0.jsx("div", { className: "chat-card-sub-title", children: require$$0.jsx("span", { children: card.content }) }));
922
+ }
923
+ return (require$$0.jsxs("div", { className: "chat-card-container", children: [image, title, content, !!((_a = card.buttons) === null || _a === void 0 ? void 0 : _a.length) && (require$$0.jsx(ChatActionButtons, { buttons: card.buttons, onClick: props.onButtonClick }))] }));
962
924
  };
963
925
 
964
926
  var ChatChip = function (props) {
965
927
  var option = props.option;
966
- var className = option.actionUrl ? "chat-chip chat-chip-link" : "chat-chip";
967
- return (React$1.createElement("div", { onClick: function () { return props === null || props === void 0 ? void 0 : props.onClick(option); }, className: className },
968
- React$1.createElement("span", null, typeof option === "object" ? option.label : option)));
928
+ var className = option.actionUrl
929
+ ? "chat-chip chat-chip-link"
930
+ : "chat-chip";
931
+ return (require$$0.jsx("div", { onClick: function () { return props === null || props === void 0 ? void 0 : props.onClick(option); }, className: className, children: require$$0.jsx("span", { children: typeof option === "object" ? option.label : option }) }));
969
932
  };
970
933
 
971
934
  /**
972
935
  * Render option list. We just follow the order.
973
936
  */
974
937
  var ChatChips = function (props) {
975
- return (React$1.createElement("div", { className: "chat-chips" }, props.options.map(function (option, i) {
976
- return React$1.createElement(ChatChip, { key: i, onClick: props.onOptionClick, option: option });
977
- })));
938
+ return (require$$0.jsx("div", { className: "chat-chips", children: props.options.map(function (option, i) {
939
+ return require$$0.jsx(ChatChip, { onClick: props.onOptionClick, option: option }, i);
940
+ }) }));
978
941
  };
979
942
 
980
943
  var defaultBehavior = {
@@ -1093,7 +1056,7 @@ function execute(url, dispatch, visuals, behavior) {
1093
1056
  }
1094
1057
  function useOpenUrlCallback() {
1095
1058
  var env = useWidgetEnv();
1096
- return React$1.useCallback(function (url, dispatch, visuals, behavior) {
1059
+ return require$$1.useCallback(function (url, dispatch, visuals, behavior) {
1097
1060
  if (!behavior) {
1098
1061
  behavior = (env === null || env === void 0 ? void 0 : env.urls) ? resolveUrlPolicy(url, env.urls) : defaultBehavior;
1099
1062
  }
@@ -1389,6 +1352,12 @@ var LogChat = /** @class */ (function () {
1389
1352
  });
1390
1353
  });
1391
1354
  };
1355
+ LogChat.prototype.notifyDisconnecting = function () {
1356
+ log("CLIENT: notifyDisconnecting:");
1357
+ if (this.inner.notifyDisconnecting) {
1358
+ this.inner.notifyDisconnecting();
1359
+ }
1360
+ };
1392
1361
  return LogChat;
1393
1362
  }());
1394
1363
 
@@ -1398,13 +1367,12 @@ function getDefaultExportFromCjs (x) {
1398
1367
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
1399
1368
  }
1400
1369
 
1401
- var React = React$1;
1370
+ var jsxRuntime = require$$0;
1371
+ var react = require$$1;
1402
1372
 
1403
1373
  var IconButton = function (props) {
1404
1374
  var Icon = props.icon;
1405
- return (React.createElement("div", { tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "xapp-search-icon-button ".concat(props.className || ""), onClick: props.onClick },
1406
- React.createElement("div", { className: "xapp-search-icon-button__content" },
1407
- React.createElement(Icon, null))));
1375
+ return (jsxRuntime.jsx("div", { tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "xapp-search-icon-button ".concat(props.className || ""), onClick: props.onClick, children: jsxRuntime.jsx("div", { className: "xapp-search-icon-button__content", children: jsxRuntime.jsx(Icon, {}) }) }));
1408
1376
  };
1409
1377
 
1410
1378
  // compile time full switch-case verification
@@ -1414,17 +1382,17 @@ function throwBadKind(x) {
1414
1382
 
1415
1383
  var RichTextBoldSpan = function (props) {
1416
1384
  var format = props.format, text = props.text;
1417
- return (React.createElement("span", { "data-rich-text-type": "bold", className: "xapp-search-rich-text-bold-span" }, text.substring(format.start, format.end)));
1385
+ return (jsxRuntime.jsx("span", { "data-rich-text-type": "bold", className: "xapp-search-rich-text-bold-span", children: text.substring(format.start, format.end) }));
1418
1386
  };
1419
1387
 
1420
1388
  var RichTextInputSpan = function (props) {
1421
1389
  var format = props.format, text = props.text, readOnly = props.readOnly, onClick = props.onClick;
1422
1390
  var defaultValue = format.text || text.substring(format.start, format.end);
1423
- var _a = React.useState(defaultValue), value = _a[0], setValue = _a[1];
1424
- var handleChange = React.useCallback(function (ev) {
1391
+ var _a = react.useState(defaultValue), value = _a[0], setValue = _a[1];
1392
+ var handleChange = react.useCallback(function (ev) {
1425
1393
  setValue(ev.target.value);
1426
1394
  }, []);
1427
- var handleClick = React.useCallback(function (ev) {
1395
+ var handleClick = react.useCallback(function (ev) {
1428
1396
  if (onClick) {
1429
1397
  var res = onClick(format);
1430
1398
  if (res === false) {
@@ -1434,14 +1402,14 @@ var RichTextInputSpan = function (props) {
1434
1402
  }
1435
1403
  }, [onClick, format]);
1436
1404
  if (readOnly) {
1437
- return (React.createElement("span", { className: "xapp-search-rich-text-input-span xapp-search-rich-text-input-span--readonly", onClick: handleClick }, defaultValue));
1405
+ return (jsxRuntime.jsx("span", { className: "xapp-search-rich-text-input-span xapp-search-rich-text-input-span--readonly", onClick: handleClick, children: defaultValue }));
1438
1406
  }
1439
- return (React.createElement("input", { type: "text", value: value, className: "xapp-search-rich-text-input-span", "data-rich-text-type": "inputText", onChange: handleChange, onClick: handleClick, readOnly: readOnly }));
1407
+ return (jsxRuntime.jsx("input", { type: "text", value: value, className: "xapp-search-rich-text-input-span", "data-rich-text-type": "inputText", onChange: handleChange, onClick: handleClick, readOnly: readOnly }));
1440
1408
  };
1441
1409
 
1442
1410
  var RichTextNormalSpan = function (props) {
1443
1411
  var format = props.format, text = props.text;
1444
- return (React.createElement("span", { "data-rich-text-type": "normal", className: "xapp-search-rich-text-normal-span" }, text.substring(format.start, format.end)));
1412
+ return (jsxRuntime.jsx("span", { "data-rich-text-type": "normal", className: "xapp-search-rich-text-normal-span", children: text.substring(format.start, format.end) }));
1445
1413
  };
1446
1414
 
1447
1415
  var RichTextSpan = function (props) {
@@ -1449,11 +1417,11 @@ var RichTextSpan = function (props) {
1449
1417
  var type = format.type;
1450
1418
  switch (type) {
1451
1419
  case "normal":
1452
- return (React.createElement(RichTextNormalSpan, { text: text, format: format, readOnly: readOnly }));
1420
+ return jsxRuntime.jsx(RichTextNormalSpan, { text: text, format: format, readOnly: readOnly });
1453
1421
  case "bold":
1454
- return (React.createElement(RichTextBoldSpan, { text: text, format: format, readOnly: readOnly }));
1422
+ return jsxRuntime.jsx(RichTextBoldSpan, { text: text, format: format, readOnly: readOnly });
1455
1423
  case "inputText":
1456
- return (React.createElement(RichTextInputSpan, { text: text, format: format, readOnly: readOnly, onClick: onClick }));
1424
+ return (jsxRuntime.jsx(RichTextInputSpan, { text: text, format: format, readOnly: readOnly, onClick: onClick }));
1457
1425
  default:
1458
1426
  throwBadKind(type);
1459
1427
  }
@@ -1538,7 +1506,7 @@ function parseContent(node) {
1538
1506
  formats.push({
1539
1507
  type: type,
1540
1508
  start: text.length,
1541
- end: text.length + innerText.length
1509
+ end: text.length + innerText.length,
1542
1510
  });
1543
1511
  text += innerText;
1544
1512
  }
@@ -1549,7 +1517,7 @@ function parseContent(node) {
1549
1517
  formats.push({
1550
1518
  type: "normal",
1551
1519
  start: text.length,
1552
- end: text.length + innerText.length
1520
+ end: text.length + innerText.length,
1553
1521
  });
1554
1522
  text += innerText;
1555
1523
  }
@@ -1557,7 +1525,7 @@ function parseContent(node) {
1557
1525
  });
1558
1526
  return cleanRichTextValue({
1559
1527
  text: text,
1560
- formats: formats
1528
+ formats: formats,
1561
1529
  });
1562
1530
  }
1563
1531
  function cleanContent(node) {
@@ -1575,22 +1543,21 @@ function cleanContent(node) {
1575
1543
  try {
1576
1544
  (_a = c.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(c);
1577
1545
  }
1578
- catch (_b) {
1579
- }
1546
+ catch (_b) { }
1580
1547
  }
1581
1548
  }
1582
1549
  var RichText = function (props) {
1583
1550
  var value = props.value, className = props.className, readOnly = props.readOnly, onInput = props.onInput, onChange = props.onChange, onSpanClick = props.onSpanClick;
1584
1551
  var formatsRaw = value.formats, text = value.text;
1585
- var formats = React.useMemo(function () { return extendFormat(formatsRaw, text.length); }, [formatsRaw, text.length]);
1586
- var handleInput = React.useCallback(function (ev) {
1552
+ var formats = react.useMemo(function () { return extendFormat(formatsRaw, text.length); }, [formatsRaw, text.length]);
1553
+ var handleInput = react.useCallback(function (ev) {
1587
1554
  var target = ev.currentTarget;
1588
1555
  var newValue = parseContent(target);
1589
1556
  if (onInput) {
1590
1557
  onInput(newValue);
1591
1558
  }
1592
1559
  }, [onInput]);
1593
- var handleBlur = React.useCallback(function (ev) {
1560
+ var handleBlur = react.useCallback(function (ev) {
1594
1561
  var target = ev.currentTarget;
1595
1562
  var newValue = parseContent(target);
1596
1563
  cleanContent(target);
@@ -1598,49 +1565,53 @@ var RichText = function (props) {
1598
1565
  onChange(newValue);
1599
1566
  }
1600
1567
  }, [onChange]);
1601
- return (React.createElement("div", { id: props.id, className: "xapp-search-rich-text ".concat(className || ""), contentEditable: !readOnly, suppressContentEditableWarning: true, onInput: handleInput, onBlur: handleBlur, onKeyDown: props.onKeyDown }, formats.map(function (format, index) { return (React.createElement(RichTextSpan, { key: index, format: format, text: text, readOnly: readOnly, onClick: onSpanClick })); })));
1568
+ return (jsxRuntime.jsx("div", { id: props.id, className: "xapp-search-rich-text ".concat(className || ""), contentEditable: !readOnly, suppressContentEditableWarning: true, onInput: handleInput, onBlur: handleBlur, onKeyDown: props.onKeyDown, children: formats.map(function (format, index) { return (jsxRuntime.jsx(RichTextSpan, { format: format, text: text, readOnly: readOnly, onClick: onSpanClick }, index)); }) }));
1602
1569
  };
1603
1570
 
1604
1571
  var RichInput = function (props) {
1605
1572
  var id = props.id, value = props.value, type = props.type, autoFocus = props.autoFocus, spellCheck = props.spellCheck, tabIndex = props.tabIndex, onChange = props.onChange, onInput = props.onInput, onKeyDown = props.onKeyDown, onSearch = props.onSearch;
1606
1573
  var rich = value.formats.some(function (f) { return f.type === "inputText"; });
1607
- var handleChange = React.useCallback(function (ev) {
1608
- onChange({
1609
- text: ev.target.value,
1610
- formats: []
1611
- });
1574
+ var handleChange = react.useCallback(function (ev) {
1575
+ if (onChange) {
1576
+ onChange({
1577
+ text: ev.target.value,
1578
+ formats: [],
1579
+ });
1580
+ }
1612
1581
  }, [onChange]);
1613
- var handleRichChange = React.useCallback(function (val) {
1614
- onChange(val);
1582
+ var handleRichChange = react.useCallback(function (val) {
1583
+ if (onChange) {
1584
+ onChange(val);
1585
+ }
1615
1586
  }, [onChange]);
1616
- var handleInput = React.useCallback(function (ev) {
1587
+ var handleInput = react.useCallback(function (ev) {
1617
1588
  if (onInput) {
1618
1589
  onInput({
1619
1590
  text: ev.target.value,
1620
- formats: []
1591
+ formats: [],
1621
1592
  });
1622
1593
  }
1623
1594
  }, [onInput]);
1624
- var handleRichInput = React.useCallback(function (val) {
1595
+ var handleRichInput = react.useCallback(function (val) {
1625
1596
  if (onInput) {
1626
1597
  onInput(val);
1627
1598
  }
1628
1599
  }, [onInput]);
1629
- var handleKeyDown = React.useCallback(function (event) {
1600
+ var handleKeyDown = react.useCallback(function (event) {
1630
1601
  if (onKeyDown) {
1631
1602
  onKeyDown(event);
1632
1603
  }
1633
1604
  }, [onKeyDown]);
1634
- var inputRef = React.useRef(null);
1605
+ var inputRef = react.useRef(null);
1635
1606
  var inputNode = inputRef.current;
1636
- React.useEffect(function () {
1607
+ react.useEffect(function () {
1637
1608
  if (inputNode && onSearch) {
1638
1609
  var handler_1 = function (ev) {
1639
1610
  var target = ev.target;
1640
1611
  if (target) {
1641
1612
  onSearch({
1642
1613
  text: target.value,
1643
- formats: []
1614
+ formats: [],
1644
1615
  });
1645
1616
  }
1646
1617
  };
@@ -1651,12 +1622,11 @@ var RichInput = function (props) {
1651
1622
  }
1652
1623
  return undefined;
1653
1624
  }, [inputNode, onSearch]);
1654
- return (React.createElement("div", { className: "xappw-rich-input ".concat(props.className) }, rich ?
1655
- React.createElement(RichText, { id: id, value: value, onChange: handleRichChange, onInput: handleRichInput, onKeyDown: handleKeyDown, className: "xappw-rich-input__input ".concat(props.className, "__input") }) : React.createElement("input", { id: id, ref: inputRef, type: type, value: value.text, autoComplete: "off", autoFocus: autoFocus, placeholder: props.placeholder, spellCheck: spellCheck, tabIndex: tabIndex ? Number(tabIndex) : 0, className: "xappw-rich-input__input ".concat(props.className, "__input"), onFocus: props.onFocus, onChange: handleChange, onInput: handleInput, onKeyDown: handleKeyDown })));
1625
+ return (jsxRuntime.jsx("div", { className: "xappw-rich-input ".concat(props.className), children: rich ? (jsxRuntime.jsx(RichText, { id: id, value: value, onChange: handleRichChange, onInput: handleRichInput, onKeyDown: handleKeyDown, className: "xappw-rich-input__input ".concat(props.className, "__input") })) : (jsxRuntime.jsx("input", { id: id, ref: inputRef, type: type, value: value.text, autoComplete: "off", autoFocus: autoFocus, placeholder: props.placeholder, spellCheck: spellCheck, tabIndex: tabIndex ? Number(tabIndex) : 0, className: "xappw-rich-input__input ".concat(props.className, "__input"), onFocus: props.onFocus, onChange: handleChange, onInput: handleInput, onKeyDown: handleKeyDown })) }));
1656
1626
  };
1657
1627
 
1658
1628
  var SuggestionsGroupHeading = function (props) {
1659
- return (React.createElement("div", { className: "xappw-suggestions-group-heading" }, props.label));
1629
+ return jsxRuntime.jsx("div", { className: "xappw-suggestions-group-heading", children: props.label });
1660
1630
  };
1661
1631
 
1662
1632
  function getScrollContainer(node) {
@@ -1668,22 +1638,22 @@ function getScrollContainer(node) {
1668
1638
  }
1669
1639
  var SuggestionsItem = function (props) {
1670
1640
  var data = props.data, current = props.current, ActionsComponent = props.actions, onClick = props.onClick, onHover = props.onHover, onSpanClick = props.onSpanClick;
1671
- var handleClick = React.useCallback(function () {
1641
+ var handleClick = react.useCallback(function () {
1672
1642
  onClick(data);
1673
1643
  }, [data, onClick]);
1674
- var handleHover = React.useCallback(function () {
1644
+ var handleHover = react.useCallback(function () {
1675
1645
  if (onHover) {
1676
1646
  onHover(data);
1677
1647
  }
1678
1648
  }, [data, onHover]);
1679
- var handleSpanClick = React.useCallback(function (span) {
1649
+ var handleSpanClick = react.useCallback(function (span) {
1680
1650
  if (onSpanClick) {
1681
1651
  return onSpanClick(data, span);
1682
1652
  }
1683
1653
  return undefined;
1684
1654
  }, [onSpanClick, data]);
1685
- var ref = React.useRef(null);
1686
- React.useEffect(function () {
1655
+ var ref = react.useRef(null);
1656
+ react.useEffect(function () {
1687
1657
  var node = ref.current;
1688
1658
  if (current && node) {
1689
1659
  var scrollContainer = getScrollContainer(node);
@@ -1700,22 +1670,13 @@ var SuggestionsItem = function (props) {
1700
1670
  }
1701
1671
  }
1702
1672
  }, [current]);
1703
- return (React.createElement("div", { ref: ref, className: "xappw-suggestions-item ".concat(current ? "xappw-suggestions-item--current" : ""), onClick: handleClick, onMouseEnter: handleHover },
1704
- React.createElement(RichText, { value: data, className: "xappw-suggestions-item__texts", readOnly: true, onSpanClick: handleSpanClick }),
1705
- ActionsComponent &&
1706
- React.createElement("div", { className: "xappw-suggestions-item__actions" },
1707
- React.createElement(ActionsComponent, { data: data, current: current }))));
1673
+ return (jsxRuntime.jsxs("div", { ref: ref, className: "xappw-suggestions-item ".concat(current ? "xappw-suggestions-item--current" : ""), onClick: handleClick, onMouseEnter: handleHover, children: [jsxRuntime.jsx(RichText, { value: data, className: "xappw-suggestions-item__texts", readOnly: true, onSpanClick: handleSpanClick }), ActionsComponent && (jsxRuntime.jsx("div", { className: "xappw-suggestions-item__actions", children: jsxRuntime.jsx(ActionsComponent, { data: data, current: current }) }))] }));
1708
1674
  };
1709
1675
 
1710
1676
  var SuggestionsGroup = function (props) {
1711
1677
  var group = props.group, currentIndex = props.currentIndex, itemActions = props.itemActions;
1712
1678
  var heading = group.heading, items = group.items;
1713
- return (React.createElement("div", { className: "xappw-suggestions-group" },
1714
- React.createElement("div", { className: "xappw-suggestions-group__heading" },
1715
- React.createElement(SuggestionsGroupHeading, { label: heading })),
1716
- React.createElement("div", { className: "xappw-suggestions-group__items" }, items.map(function (item, itemIndex) {
1717
- return React.createElement(SuggestionsItem, { key: itemIndex, data: item, current: currentIndex === itemIndex, actions: itemActions, onClick: props.onItemClick, onHover: props.onItemHover, onSpanClick: props.onSpanClick });
1718
- }))));
1679
+ return (jsxRuntime.jsxs("div", { className: "xappw-suggestions-group", children: [jsxRuntime.jsx("div", { className: "xappw-suggestions-group__heading", children: jsxRuntime.jsx(SuggestionsGroupHeading, { label: heading }) }), jsxRuntime.jsx("div", { className: "xappw-suggestions-group__items", children: items.map(function (item, itemIndex) { return (jsxRuntime.jsx(SuggestionsItem, { data: item, current: currentIndex === itemIndex, actions: itemActions, onClick: props.onItemClick, onHover: props.onItemHover, onSpanClick: props.onSpanClick }, itemIndex)); }) })] }));
1719
1680
  };
1720
1681
 
1721
1682
  function getItemsLength(result) {
@@ -1724,7 +1685,7 @@ function getItemsLength(result) {
1724
1685
 
1725
1686
  var SuggestionsList = function (props) {
1726
1687
  var suggestions = props.suggestions, itemActions = props.itemActions, className = props.className;
1727
- var length = React.useMemo(function () {
1688
+ var length = react.useMemo(function () {
1728
1689
  if (suggestions) {
1729
1690
  return getItemsLength(suggestions);
1730
1691
  }
@@ -1732,11 +1693,11 @@ var SuggestionsList = function (props) {
1732
1693
  }, [suggestions]);
1733
1694
  var currentIndex = length >= 0 ? props.index : NaN;
1734
1695
  var indexWalker = 0;
1735
- return (React.createElement("div", { className: "xappw-suggestions-list ".concat(className || "") }, suggestions === null || suggestions === void 0 ? void 0 : suggestions.map(function (group, index) {
1736
- var res = (React.createElement(SuggestionsGroup, { key: index, group: group, currentIndex: currentIndex - indexWalker, itemActions: itemActions, onItemClick: props.onItemClick, onItemHover: props.onItemHover, onSpanClick: props.onSpanClick }));
1737
- indexWalker += group.items.length;
1738
- return res;
1739
- })));
1696
+ return (jsxRuntime.jsx("div", { className: "xappw-suggestions-list ".concat(className || ""), children: suggestions === null || suggestions === void 0 ? void 0 : suggestions.map(function (group, index) {
1697
+ var res = (jsxRuntime.jsx(SuggestionsGroup, { group: group, currentIndex: currentIndex - indexWalker, itemActions: itemActions, onItemClick: props.onItemClick, onItemHover: props.onItemHover, onSpanClick: props.onSpanClick }, index));
1698
+ indexWalker += group.items.length;
1699
+ return res;
1700
+ }) }));
1740
1701
  };
1741
1702
 
1742
1703
  function findItemByIndex(groups, index) {
@@ -1755,65 +1716,6 @@ function findItemByIndex(groups, index) {
1755
1716
  return undefined;
1756
1717
  }
1757
1718
 
1758
- function parseSuggestionsFormat(format) {
1759
- var types = Object.keys(format);
1760
- var type = types[0];
1761
- var item = format[type];
1762
- if (!item) {
1763
- throw new Error();
1764
- }
1765
- return {
1766
- type: type,
1767
- start: item.start,
1768
- end: item.end
1769
- };
1770
- }
1771
- function parseSuggestionsFormats(formats) {
1772
- return formats.map(parseSuggestionsFormat);
1773
- }
1774
- function parseSuggestionsResponseItem(item) {
1775
- return {
1776
- text: item.suggestion,
1777
- content: item.answer,
1778
- formats: parseSuggestionsFormats(item.format),
1779
- type: item.type
1780
- };
1781
- }
1782
- function getHeading(type) {
1783
- switch (type) {
1784
- case "FAQ":
1785
- return "FAQs";
1786
- case "INTENT":
1787
- return "Suggestions";
1788
- case "HISTORICAL":
1789
- return "Suggestions";
1790
- default:
1791
- return type;
1792
- }
1793
- }
1794
- function parseSuggestionsResponse(response, direction) {
1795
- if (direction === void 0) { direction = 1; }
1796
- if (!response) {
1797
- return undefined;
1798
- }
1799
- var items = sortSuggestionItems(response.suggestions, direction);
1800
- return items.reduce(function (result, current) {
1801
- var mappedItem = parseSuggestionsResponseItem(current);
1802
- if (result.length) {
1803
- var prevGroup = result[result.length - 1];
1804
- if (prevGroup.heading === getHeading(current.type)) {
1805
- prevGroup.items.push(mappedItem);
1806
- return result;
1807
- }
1808
- }
1809
- result.push({
1810
- heading: getHeading(current.type),
1811
- items: [mappedItem]
1812
- });
1813
- return result;
1814
- }, []);
1815
- }
1816
-
1817
1719
  /******************************************************************************
1818
1720
  Copyright (c) Microsoft Corporation.
1819
1721
 
@@ -1896,6 +1798,65 @@ function sortSuggestionItems(items, direction) {
1896
1798
  return __spreadArray([], items).sort(function (left, right) { return compareSuggestionItems(left, right, direction); });
1897
1799
  }
1898
1800
 
1801
+ function parseSuggestionsFormat(format) {
1802
+ var types = Object.keys(format);
1803
+ var type = types[0];
1804
+ var item = format[type];
1805
+ if (!item) {
1806
+ throw new Error();
1807
+ }
1808
+ return {
1809
+ type: type,
1810
+ start: item.start,
1811
+ end: item.end,
1812
+ };
1813
+ }
1814
+ function parseSuggestionsFormats(formats) {
1815
+ return formats.map(parseSuggestionsFormat);
1816
+ }
1817
+ function parseSuggestionsResponseItem(item) {
1818
+ return {
1819
+ text: item.suggestion,
1820
+ content: item.answer,
1821
+ formats: parseSuggestionsFormats(item.format),
1822
+ type: item.type,
1823
+ };
1824
+ }
1825
+ function getHeading(type) {
1826
+ switch (type) {
1827
+ case "FAQ":
1828
+ return "FAQs";
1829
+ case "INTENT":
1830
+ return "Suggestions";
1831
+ case "HISTORICAL":
1832
+ return "Suggestions";
1833
+ default:
1834
+ return type;
1835
+ }
1836
+ }
1837
+ function parseSuggestionsResponse(response, direction) {
1838
+ if (direction === void 0) { direction = 1; }
1839
+ if (!response) {
1840
+ return undefined;
1841
+ }
1842
+ var items = sortSuggestionItems(response.suggestions, direction);
1843
+ return items.reduce(function (result, current) {
1844
+ var mappedItem = parseSuggestionsResponseItem(current);
1845
+ if (result.length) {
1846
+ var prevGroup = result[result.length - 1];
1847
+ if (prevGroup.heading === getHeading(current.type)) {
1848
+ prevGroup.items.push(mappedItem);
1849
+ return result;
1850
+ }
1851
+ }
1852
+ result.push({
1853
+ heading: getHeading(current.type),
1854
+ items: [mappedItem],
1855
+ });
1856
+ return result;
1857
+ }, []);
1858
+ }
1859
+
1899
1860
  /**
1900
1861
  * Append the provided query params to the URL
1901
1862
  *
@@ -1918,11 +1879,11 @@ function noop$1() {
1918
1879
  }
1919
1880
  function useJsonFetch(url, options) {
1920
1881
  if (options === void 0) { options = defaultOptions$2; }
1921
- var _a = React.useState({
1882
+ var _a = react.useState({
1922
1883
  state: "paused"
1923
1884
  }), value = _a[0], setValue = _a[1];
1924
1885
  var pause = options.pause;
1925
- React.useEffect(function () {
1886
+ react.useEffect(function () {
1926
1887
  if (pause) {
1927
1888
  setValue({
1928
1889
  state: "paused"
@@ -1987,7 +1948,7 @@ function useJsonFetch(url, options) {
1987
1948
 
1988
1949
  function useSuggestionsFetch$1(options) {
1989
1950
  var baseUrl = options.url, context = options.context, query = options.query;
1990
- var url = React.useMemo(function () {
1951
+ var url = react.useMemo(function () {
1991
1952
  if (!baseUrl) {
1992
1953
  return undefined;
1993
1954
  }
@@ -2945,7 +2906,7 @@ var serverInfo = {
2945
2906
  displayName: "XAPP Server"};
2946
2907
  var StentorRouterChat = /** @class */ (function () {
2947
2908
  function StentorRouterChat(config, options) {
2948
- var _a, _b;
2909
+ var _a, _b, _c, _d, _e;
2949
2910
  this.isDisposed = false;
2950
2911
  this._userId = "";
2951
2912
  this._sessionId = "";
@@ -2955,6 +2916,12 @@ var StentorRouterChat = /** @class */ (function () {
2955
2916
  this.isAdmin = false;
2956
2917
  this.urlAttributes = {};
2957
2918
  this.handlers = {};
2919
+ // Sleep delay management
2920
+ // Use number | NodeJS.Timeout for cross-environment compatibility (browser vs Node.js)
2921
+ this.sleepTimeoutId = null;
2922
+ // Message deduplication
2923
+ this.receivedMessageIds = new Set();
2924
+ this.MESSAGE_DEDUP_CACHE_SIZE = 1000;
2958
2925
  this.config = config;
2959
2926
  this.options = options;
2960
2927
  // Dig out the path parameters. Put them into the attributes.
@@ -2981,6 +2948,9 @@ var StentorRouterChat = /** @class */ (function () {
2981
2948
  log("WS url: ".concat(this.serverUrl, " isAdmin: ").concat(this.isAdmin, " attributes: ").concat(JSON.stringify(this.attributes), " appId: ").concat(this.appId));
2982
2949
  this.configurableMessages = getConfigurableMessagesConfig(options.configurableMessages);
2983
2950
  this.noOfServerErrors = 0;
2951
+ // Initialize sleep delay (default 60 seconds for websocketraw)
2952
+ this.SLEEP_DELAY_MS = (_e = (_d = (_c = options === null || options === void 0 ? void 0 : options.env) === null || _c === void 0 ? void 0 : _c.connection) === null || _d === void 0 ? void 0 : _d.backgroundSleepDelay) !== null && _e !== void 0 ? _e : 60000;
2953
+ log("Background sleep delay set to ".concat(this.SLEEP_DELAY_MS, "ms"));
2984
2954
  }
2985
2955
  StentorRouterChat.prototype.init = function (dispatch) {
2986
2956
  var _this = this;
@@ -3018,10 +2988,38 @@ var StentorRouterChat = /** @class */ (function () {
3018
2988
  var _a = _this.configurableMessages[data.tries], retry = _a.retry, delay = _a.delay, text = _a.text;
3019
2989
  _this.sendFailureMessage(retry, data.delay || delay, text, sender);
3020
2990
  };
3021
- this.handlers["new message"] = function (data, sender, ts, attributes) {
2991
+ this.handlers["new message"] = function (data, sender, ts, attributes, messageId) {
3022
2992
  // Because the router's internal message format is Stentor channel compatible.
3023
2993
  // So the data is either a stentor Request (from widget) or a stentor Response (from bot)
3024
2994
  var _a;
2995
+ // Deduplicate messages if messageId is provided
2996
+ if (messageId) {
2997
+ // Validate messageId to prevent memory exhaustion attacks
2998
+ if (messageId.length > 256) {
2999
+ log("Rejecting message with oversized messageId (".concat(messageId.length, " chars)"));
3000
+ return;
3001
+ }
3002
+ if (_this.receivedMessageIds.has(messageId)) {
3003
+ log("Deduplicating message with id: ".concat(messageId));
3004
+ return;
3005
+ }
3006
+ _this.receivedMessageIds.add(messageId);
3007
+ // Limit the size of the set to prevent memory issues
3008
+ // Batch eviction: remove ~10% of entries when limit exceeded
3009
+ // Note: Set maintains insertion order per ES2015 spec. Iteration yields
3010
+ // values in insertion order, so we evict the earliest-added entries.
3011
+ // After deletions, remaining entries maintain their relative order.
3012
+ if (_this.receivedMessageIds.size > _this.MESSAGE_DEDUP_CACHE_SIZE) {
3013
+ var idsToRemove = Math.floor(_this.MESSAGE_DEDUP_CACHE_SIZE * 0.1);
3014
+ var iterator = _this.receivedMessageIds.values();
3015
+ for (var i = 0; i < idsToRemove; i++) {
3016
+ var oldest = iterator.next().value;
3017
+ if (oldest) {
3018
+ _this.receivedMessageIds.delete(oldest);
3019
+ }
3020
+ }
3021
+ }
3022
+ }
3025
3023
  var message;
3026
3024
  if (sender.deviceId === "Bot") {
3027
3025
  var response = data;
@@ -3033,6 +3031,11 @@ var StentorRouterChat = /** @class */ (function () {
3033
3031
  if (typeof ((_a = _this.options.hooks) === null || _a === void 0 ? void 0 : _a.onResponse) === "function") {
3034
3032
  _this.options.hooks.onResponse(response);
3035
3033
  }
3034
+ // Session is initialized after first bot response (same as StentorDirectChat)
3035
+ if (_this.isNewSession) {
3036
+ _this.isNewSession = false;
3037
+ log("Session initialized after receiving first bot response");
3038
+ }
3036
3039
  message = responseToMessage(response);
3037
3040
  }
3038
3041
  else if (sender.deviceId === "Widget") {
@@ -3055,35 +3058,43 @@ var StentorRouterChat = /** @class */ (function () {
3055
3058
  },
3056
3059
  });
3057
3060
  };
3058
- this.handlers["user joined"] = function (_data, sender, ts, _attributes) {
3061
+ this.handlers["user joined"] = function (data, sender, ts, _attributes) {
3059
3062
  var _a, _b;
3060
3063
  var nick = senderToNick(sender);
3061
3064
  log("Received \"user joined\" event - deviceId: ".concat(sender.deviceId, ", userId: ").concat(sender.userId, ", displayName: ").concat(sender.displayName, ", nick: ").concat(nick));
3062
3065
  log("Dispatching chat.memberjoin for ".concat(sender.displayName || "Unknown"));
3066
+ var userData = data;
3063
3067
  _this.dispatch({
3064
3068
  type: "chat",
3065
3069
  detail: {
3066
3070
  type: "chat.memberjoin",
3067
3071
  user: {
3068
- avatarPath: (_b = (_a = _this.options) === null || _a === void 0 ? void 0 : _a.bot) === null || _b === void 0 ? void 0 : _b.avatarPath,
3072
+ avatarPath: sender.avatarPath || ((_b = (_a = _this.options) === null || _a === void 0 ? void 0 : _a.bot) === null || _b === void 0 ? void 0 : _b.avatarPath),
3069
3073
  displayName: sender.displayName,
3070
3074
  nick: nick,
3071
3075
  },
3072
3076
  timestamp: ts || new Date().getTime(),
3077
+ showDivider: userData === null || userData === void 0 ? void 0 : userData.showDivider,
3078
+ message: userData === null || userData === void 0 ? void 0 : userData.message,
3079
+ hideUserInfo: userData === null || userData === void 0 ? void 0 : userData.hideUserInfo,
3073
3080
  },
3074
3081
  });
3075
3082
  log("chat.memberjoin dispatched for nick: ".concat(nick));
3076
3083
  };
3077
- this.handlers["user left"] = function (_data, sender, ts, _attributes) {
3084
+ this.handlers["user left"] = function (data, sender, ts, _attributes) {
3085
+ var userData = data;
3078
3086
  _this.dispatch({
3079
3087
  type: "chat",
3080
3088
  detail: {
3081
3089
  type: "chat.memberleave",
3082
3090
  user: {
3091
+ avatarPath: sender.avatarPath,
3083
3092
  displayName: sender.displayName,
3084
3093
  nick: senderToNick(sender),
3085
3094
  },
3086
3095
  timestamp: ts || new Date().getTime(),
3096
+ showDivider: userData === null || userData === void 0 ? void 0 : userData.showDivider,
3097
+ message: userData === null || userData === void 0 ? void 0 : userData.message,
3087
3098
  },
3088
3099
  });
3089
3100
  };
@@ -3154,6 +3165,88 @@ var StentorRouterChat = /** @class */ (function () {
3154
3165
  _this.dispatch(dismissWsButton(data.id));
3155
3166
  }, WS_BUTTON_DISMISS_ANIMATION_DURATION);
3156
3167
  };
3168
+ this.handlers["system-message"] = function (data, sender, ts, _attributes) {
3169
+ log("Received \"system-message\" event - id: ".concat(data.id, ", message: ").concat(data.message, ", dismissId: ").concat(data.dismissId));
3170
+ // If there's a dismissId, dispatch dismiss action first
3171
+ if (data.dismissId) {
3172
+ _this.dispatch({
3173
+ type: "chat",
3174
+ detail: {
3175
+ type: "chat.systemmessagedismiss",
3176
+ user: {
3177
+ displayName: sender.displayName || "System",
3178
+ nick: senderToNick(sender),
3179
+ },
3180
+ id: data.dismissId,
3181
+ timestamp: ts || new Date().getTime(),
3182
+ },
3183
+ });
3184
+ }
3185
+ // Then dispatch the new system message
3186
+ _this.dispatch({
3187
+ type: "chat",
3188
+ detail: {
3189
+ type: "chat.systemmessage",
3190
+ user: {
3191
+ displayName: sender.displayName || "System",
3192
+ nick: senderToNick(sender),
3193
+ },
3194
+ id: data.id,
3195
+ message: data.message,
3196
+ dismissId: data.dismissId,
3197
+ timestamp: ts || new Date().getTime(),
3198
+ },
3199
+ });
3200
+ };
3201
+ this.handlers["system-message-dismiss"] = function (data, sender, ts, _attributes) {
3202
+ log("Received \"system-message-dismiss\" event - id: ".concat(data.id));
3203
+ _this.dispatch({
3204
+ type: "chat",
3205
+ detail: {
3206
+ type: "chat.systemmessagedismiss",
3207
+ user: {
3208
+ displayName: sender.displayName || "System",
3209
+ nick: senderToNick(sender),
3210
+ },
3211
+ id: data.id,
3212
+ timestamp: ts || new Date().getTime(),
3213
+ },
3214
+ });
3215
+ };
3216
+ this.handlers["missed messages"] = function (data, _sender, _ts, _attributes) {
3217
+ var _a;
3218
+ var missedData = data;
3219
+ log("Received \"missed messages\" event with ".concat(((_a = missedData === null || missedData === void 0 ? void 0 : missedData.messages) === null || _a === void 0 ? void 0 : _a.length) || 0, " messages"));
3220
+ // Process each missed message
3221
+ if ((missedData === null || missedData === void 0 ? void 0 : missedData.messages) && Array.isArray(missedData.messages)) {
3222
+ missedData.messages.forEach(function (missedMessage) {
3223
+ log("Processing missed message: event=".concat(missedMessage.event, ", messageId=").concat(missedMessage.messageId));
3224
+ // Route the missed message to the appropriate handler
3225
+ var handler = _this.handlers[missedMessage.event];
3226
+ if (handler && missedMessage.event !== "missed messages") {
3227
+ handler(missedMessage.data, missedMessage.sender, missedMessage.timeMs, missedMessage.attributes, missedMessage.messageId);
3228
+ }
3229
+ else {
3230
+ log("No handler for missed message event: ".concat(missedMessage.event));
3231
+ }
3232
+ });
3233
+ }
3234
+ };
3235
+ this.handlers["request missed messages"] = function () {
3236
+ // This is a client→server event, so no handler needed on client side
3237
+ log("Request missed messages handler (no-op on client side)");
3238
+ };
3239
+ // No-op handlers for user activity events (client→server only)
3240
+ // These prevent error logs if the server echoes these events back
3241
+ this.handlers["user backgrounded"] = function () {
3242
+ log("User backgrounded handler (no-op on client side)");
3243
+ };
3244
+ this.handlers["user foregrounded"] = function () {
3245
+ log("User foregrounded handler (no-op on client side)");
3246
+ };
3247
+ this.handlers["user disconnecting"] = function () {
3248
+ log("User disconnecting handler (no-op on client side)");
3249
+ };
3157
3250
  // Register the router as a pseudo-agent (serverInfo) so it can send messages (like internal errors)
3158
3251
  this.dispatch({
3159
3252
  type: "chat",
@@ -3262,7 +3355,7 @@ var StentorRouterChat = /** @class */ (function () {
3262
3355
  var message = JSON.parse(me.data);
3263
3356
  var handler = _this.handlers[message.event];
3264
3357
  if (handler) {
3265
- _this.handlers[message.event](message.data, message.sender, message.timeMs, message.attributes);
3358
+ _this.handlers[message.event](message.data, message.sender, message.timeMs, message.attributes, message.messageId);
3266
3359
  }
3267
3360
  else {
3268
3361
  err("Unknown router message event: ".concat(message.event));
@@ -3456,22 +3549,57 @@ var StentorRouterChat = /** @class */ (function () {
3456
3549
  StentorRouterChat.prototype.dispose = function () {
3457
3550
  log("DISPOSE called - cleaning up connection");
3458
3551
  this.isDisposed = true;
3552
+ // Clear any pending sleep timeout
3553
+ if (this.sleepTimeoutId) {
3554
+ clearTimeout(this.sleepTimeoutId);
3555
+ this.sleepTimeoutId = null;
3556
+ }
3459
3557
  if (this.ws) {
3460
3558
  this.wsClose();
3461
3559
  }
3462
3560
  log("Closed web socket (dispose)");
3463
3561
  };
3464
3562
  StentorRouterChat.prototype.sleep = function () {
3465
- this.isDisposed = true;
3466
- if (this.ws) {
3467
- this.wsClose();
3468
- }
3469
- log("SLEEP called - closed web socket");
3470
- log("Closed web socket (sleep)");
3563
+ var _this = this;
3564
+ log("SLEEP called - scheduling delayed close");
3565
+ // Notify router that user has backgrounded the tab
3566
+ if (this.checkConnection()) {
3567
+ log("SLEEP - Notifying router of user backgrounded");
3568
+ this.emit("user backgrounded");
3569
+ }
3570
+ // Cancel any pending sleep timeout
3571
+ if (this.sleepTimeoutId) {
3572
+ clearTimeout(this.sleepTimeoutId);
3573
+ this.sleepTimeoutId = null;
3574
+ }
3575
+ // Schedule WebSocket close after delay
3576
+ // Note: Don't set isDisposed here - only in dispose(). Setting it here would
3577
+ // prevent reconnection when the user returns to the tab after the timeout.
3578
+ this.sleepTimeoutId = window.setTimeout(function () {
3579
+ if (_this.ws) {
3580
+ _this.wsClose();
3581
+ }
3582
+ log("SLEEP - closed web socket after ".concat(_this.SLEEP_DELAY_MS, "ms delay"));
3583
+ _this.sleepTimeoutId = null;
3584
+ }, this.SLEEP_DELAY_MS);
3585
+ log("SLEEP - WebSocket will close in ".concat(this.SLEEP_DELAY_MS, "ms if not woken up"));
3471
3586
  };
3472
3587
  StentorRouterChat.prototype.wakeup = function () {
3473
- this.isDisposed = false;
3588
+ var _this = this;
3474
3589
  log("WAKEUP called - userId:", this._userId);
3590
+ // Cancel pending sleep if user returned before timeout
3591
+ if (this.sleepTimeoutId) {
3592
+ clearTimeout(this.sleepTimeoutId);
3593
+ this.sleepTimeoutId = null;
3594
+ log("WAKEUP - Cancelled pending sleep, keeping WebSocket open");
3595
+ // Notify router that user has foregrounded the tab (connection still open)
3596
+ if (this.checkConnection()) {
3597
+ log("WAKEUP - Notifying router of user foregrounded");
3598
+ this.emit("user foregrounded");
3599
+ }
3600
+ return; // WebSocket is still open, no need to reconnect
3601
+ }
3602
+ this.isDisposed = false;
3475
3603
  // wait for the session setup
3476
3604
  if (!this._userId) {
3477
3605
  log("WAKEUP - No userId, returning early");
@@ -3485,6 +3613,47 @@ var StentorRouterChat = /** @class */ (function () {
3485
3613
  // Fire up the WebSocket
3486
3614
  log("WAKEUP - Calling autoReconnect");
3487
3615
  this.autoReconnect(this.wsCreate.bind(this, "wakeup"));
3616
+ // Request any missed messages and notify router after reconnection is established
3617
+ // Use waitFor to poll for connection readiness with timeout
3618
+ waitFor(this.checkConnection.bind(this), 100, 5000, "wakeup-connection")
3619
+ .then(function () {
3620
+ // Notify router that user has foregrounded the tab (after reconnect)
3621
+ log("WAKEUP - Notifying router of user foregrounded (after reconnect)");
3622
+ _this.emit("user foregrounded");
3623
+ _this.requestMissedMessages();
3624
+ })
3625
+ .catch(function () {
3626
+ log("WAKEUP - Connection not ready after 5s, skipping missed messages request");
3627
+ });
3628
+ };
3629
+ StentorRouterChat.prototype.requestMissedMessages = function () {
3630
+ log("Requesting missed messages from server");
3631
+ this.emit("request missed messages");
3632
+ };
3633
+ /**
3634
+ * Notifies the router that the user is disconnecting (e.g., closing tab, navigating away).
3635
+ * This is a best-effort notification - it may not arrive before the page unloads.
3636
+ * Should be called from a beforeunload event handler.
3637
+ */
3638
+ StentorRouterChat.prototype.notifyDisconnecting = function () {
3639
+ if (!this.checkConnection()) {
3640
+ return;
3641
+ }
3642
+ log("Notifying router of user disconnecting");
3643
+ var payload = JSON.stringify({
3644
+ event: "user disconnecting",
3645
+ data: { reason: "tab_close" },
3646
+ sender: this.visitorInfo,
3647
+ sessionId: this._sessionId,
3648
+ timeMs: Date.now()
3649
+ });
3650
+ try {
3651
+ this.ws.send(payload);
3652
+ }
3653
+ catch (e) {
3654
+ // Best-effort - page is unloading, so we can't do much if send fails
3655
+ log("Failed to send disconnect notification:", e);
3656
+ }
3488
3657
  };
3489
3658
  StentorRouterChat.prototype.bargeOut = function (_cb) {
3490
3659
  return __awaiter$1(this, void 0, void 0, function () {
@@ -7728,7 +7897,7 @@ var StentorServerChat = /** @class */ (function () {
7728
7897
  type: "chat.memberjoin",
7729
7898
  user: {
7730
7899
  displayName: data.username,
7731
- nick: "agent:robot",
7900
+ nick: data.nick || "agent:robot",
7732
7901
  avatarPath: data.avatarPath
7733
7902
  },
7734
7903
  timestamp: +new Date(),
@@ -7881,16 +8050,16 @@ function createChatServerCore(config, options) {
7881
8050
  function createChatServer(config, options) {
7882
8051
  return new LogChat(createChatServerCore(config, options));
7883
8052
  }
7884
- var ChatServerContext = React$1.createContext(null);
8053
+ var ChatServerContext = require$$1.createContext(null);
7885
8054
  function useChatServer(config, options) {
7886
- var _a = React$1.useState(), server = _a[0], setServer = _a[1];
8055
+ var _a = require$$1.useState(), server = _a[0], setServer = _a[1];
7887
8056
  var dispatch = useChatDispatch();
7888
8057
  var deps = [options, config, dispatch];
7889
8058
  // Track previous values to detect what changed
7890
- var prevDepsRef = React$1.useRef();
8059
+ var prevDepsRef = require$$1.useRef(undefined);
7891
8060
  // Log what caused the "effect"
7892
8061
  // useWhatChanged(deps, "options, config, dispatch");
7893
- React$1.useEffect(function () {
8062
+ require$$1.useEffect(function () {
7894
8063
  // Log when effect runs and what changed (for debugging connection issues)
7895
8064
  if (prevDepsRef.current) {
7896
8065
  var _a = prevDepsRef.current, prevOptions = _a[0], prevConfig = _a[1], prevDispatch = _a[2];
@@ -7929,8 +8098,8 @@ function useChatServer(config, options) {
7929
8098
 
7930
8099
  function useChatServerDispatch() {
7931
8100
  var inner = useChatDispatch();
7932
- var chatServer = React$1.useContext(ChatServerContext);
7933
- return React$1.useCallback(function (action) {
8101
+ var chatServer = require$$1.useContext(ChatServerContext);
8102
+ return require$$1.useCallback(function (action) {
7934
8103
  if (!action) {
7935
8104
  console.warn("react bug? Someone invokes with null");
7936
8105
  return;
@@ -7960,17 +8129,16 @@ var ChatChipsContainer = function (_) {
7960
8129
  }));
7961
8130
  }
7962
8131
  }
7963
- return (React$1.createElement("div", { className: "message-list-container__chips ".concat(!(chips === null || chips === void 0 ? void 0 : chips.length) ? "message-list-container__chips--empty" : "") },
7964
- React$1.createElement(ChatChips, { options: chips, onOptionClick: optionOnChange })));
8132
+ return (require$$0.jsx("div", { className: "message-list-container__chips ".concat(!(chips === null || chips === void 0 ? void 0 : chips.length) ? "message-list-container__chips--empty" : ""), children: require$$0.jsx(ChatChips, { options: chips, onOptionClick: optionOnChange }) }));
7965
8133
  };
7966
8134
 
7967
8135
  var ButtonGroup = function (_a) {
7968
8136
  var children = _a.children, _b = _a.className, className = _b === void 0 ? "" : _b;
7969
- return (React$1.createElement("div", { className: "button-group ".concat(className) }, children));
8137
+ return (require$$0.jsx("div", { className: "button-group ".concat(className), children: children }));
7970
8138
  };
7971
8139
 
7972
8140
  var CancelButton = function (props) {
7973
- return (React$1.createElement("div", { id: "xapp-widget-close", "aria-label": "close widget", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "cancel-button", onClick: props.onClick }));
8141
+ return (require$$0.jsx("div", { id: "xapp-widget-close", "aria-label": "close widget", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "cancel-button", onClick: props.onClick }));
7974
8142
  };
7975
8143
 
7976
8144
  var lib = {};
@@ -8055,10 +8223,8 @@ var ChatMenuItem = function (props) {
8055
8223
  props.onClick(props.label);
8056
8224
  }
8057
8225
  }
8058
- var content = props.subtitle ? (React$1.createElement("span", null,
8059
- React$1.createElement("div", null, props.label),
8060
- React$1.createElement("div", { className: "chat-menu-item--subtitle" }, props.subtitle))) : (React$1.createElement("span", null, props.label));
8061
- return (React$1.createElement("button", { type: "button", className: "chat-menu-item", tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, onClick: handleClick }, content));
8226
+ var content = props.subtitle ? (require$$0.jsxs("span", { children: [require$$0.jsx("div", { children: props.label }), require$$0.jsx("div", { className: "chat-menu-item--subtitle", children: props.subtitle })] })) : (require$$0.jsx("span", { children: props.label }));
8227
+ return (require$$0.jsx("button", { type: "button", className: "chat-menu-item", tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, onClick: handleClick, children: content }));
8062
8228
  };
8063
8229
 
8064
8230
  var _this = undefined;
@@ -8068,28 +8234,24 @@ var ChatMenu = function (props) {
8068
8234
  var handleOpenUrl = useOpenUrlCallback();
8069
8235
  var chatDispatch = useChatDispatch();
8070
8236
  var visuals = reactRedux.useSelector(function (state) { return state.visuals; });
8071
- return (React$1.createElement("div", { className: "chat-menu-".concat(openFrom, " ").concat(opened ? "chat-menu-".concat(openFrom, "--opened") : "chat-menu-".concat(openFrom, "--closed")) }, items.map(function (item, i) {
8072
- if (lib.isStandardMenuItem(item)) {
8073
- return React$1.createElement(ChatMenuItem, { key: i, onClick: props.onItemClick, label: item.label, subtitle: item.subtitle });
8074
- }
8075
- else if (lib.isStaticImageMenuItem(item)) {
8076
- return (React$1.createElement("div", { key: i, className: "chat-menu-item-static" },
8077
- React$1.createElement("img", { style: {
8078
- maxHeight: "100%",
8079
- maxWidth: "auto"
8080
- }, src: item.imageUrl, alt: "Menu Item" })));
8081
- }
8082
- else if (lib.isStaticTextMenuItem(item)) {
8083
- return (React$1.createElement("div", { key: i, className: "chat-menu-item-static-text" },
8084
- React$1.createElement("div", null,
8085
- React$1.createElement("div", null, item.title),
8086
- React$1.createElement("div", { className: "chat-menu-item-static-text--body" }, item.body))));
8087
- }
8088
- else if (lib.isOpenURLMenuItem(item)) {
8089
- return React$1.createElement("button", { key: i, className: "chat-menu-item", onClick: handleOpenUrl.bind(_this, item.url, chatDispatch, visuals, item.behavior) }, item.text);
8090
- }
8091
- return React$1.createElement("p", null, "Unknown");
8092
- })));
8237
+ return (require$$0.jsx("div", { className: "chat-menu-".concat(openFrom, " ").concat(opened ? "chat-menu-".concat(openFrom, "--opened") : "chat-menu-".concat(openFrom, "--closed")), children: items.map(function (item, i) {
8238
+ if (lib.isStandardMenuItem(item)) {
8239
+ return (require$$0.jsx(ChatMenuItem, { onClick: props.onItemClick, label: item.label, subtitle: item.subtitle }, i));
8240
+ }
8241
+ else if (lib.isStaticImageMenuItem(item)) {
8242
+ return (require$$0.jsx("div", { className: "chat-menu-item-static", children: require$$0.jsx("img", { style: {
8243
+ maxHeight: "100%",
8244
+ maxWidth: "auto",
8245
+ }, src: item.imageUrl, alt: "Menu Item" }) }, i));
8246
+ }
8247
+ else if (lib.isStaticTextMenuItem(item)) {
8248
+ return (require$$0.jsx("div", { className: "chat-menu-item-static-text", children: require$$0.jsxs("div", { children: [require$$0.jsx("div", { children: item.title }), require$$0.jsx("div", { className: "chat-menu-item-static-text--body", children: item.body })] }) }, i));
8249
+ }
8250
+ else if (lib.isOpenURLMenuItem(item)) {
8251
+ return (require$$0.jsx("button", { className: "chat-menu-item", onClick: handleOpenUrl.bind(_this, item.url, chatDispatch, visuals, item.behavior), children: item.text }, i));
8252
+ }
8253
+ return require$$0.jsx("p", { children: "Unknown" });
8254
+ }) }));
8093
8255
  };
8094
8256
 
8095
8257
  var DrawerBars = function (props) {
@@ -8101,23 +8263,23 @@ var DrawerBars = function (props) {
8101
8263
  function getBars() {
8102
8264
  var barElements = [];
8103
8265
  for (var bar = 0; bar < bars; bar++) {
8104
- barElements.push(React$1.createElement("div", { key: "drawer-bar-".concat(bar), className: "drawer-bar bar".concat(bar) }));
8266
+ barElements.push(require$$0.jsx("div", { className: "drawer-bar bar".concat(bar) }, "drawer-bar-".concat(bar)));
8105
8267
  }
8106
8268
  return barElements;
8107
8269
  }
8108
- return (React$1.createElement("button", { className: "drawer-bars", tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, "aria-label": "open menu", "aria-hidden": false, onClick: props.onToggle }, getBars()));
8270
+ return (require$$0.jsx("button", { className: "drawer-bars", tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, "aria-label": "open menu", "aria-hidden": false, onClick: props.onToggle, children: getBars() }));
8109
8271
  };
8110
8272
 
8111
8273
  var MenuButton = function (props) {
8112
- return (React$1.createElement("div", { id: "xapp-widget-menu", "aria-label": "open menu", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "menu-button", onClick: props.onClick }));
8274
+ return (require$$0.jsx("div", { id: "xapp-widget-menu", "aria-label": "open menu", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "menu-button", onClick: props.onClick }));
8113
8275
  };
8114
8276
 
8115
8277
  var MinimizeButton = function (props) {
8116
- return (React$1.createElement("div", { id: "xapp-widget-minimize", "aria-label": "minimize widget", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "minimize-button ".concat(props.showInRight ? "positionRight" : ""), onClick: props.onClick }));
8278
+ return (require$$0.jsx("div", { id: "xapp-widget-minimize", "aria-label": "minimize widget", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "minimize-button ".concat(props.showInRight ? "positionRight" : ""), onClick: props.onClick }));
8117
8279
  };
8118
8280
 
8119
8281
  var RefreshButton = function (props) {
8120
- return (React$1.createElement("div", { id: "xapp-widget-refresh", "aria-label": "refresh chat", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "refresh-button ".concat(props.showInRight ? "positionRight" : props.showInLeft ? "positionLeft" : ""), onClick: props.onClick }));
8282
+ return (require$$0.jsx("div", { id: "xapp-widget-refresh", "aria-label": "refresh chat", "aria-hidden": false, tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, className: "refresh-button ".concat(props.showInRight ? "positionRight" : props.showInLeft ? "positionLeft" : ""), onClick: props.onClick }));
8121
8283
  };
8122
8284
 
8123
8285
  var DEFAULT_STATUS_CONFIG = {
@@ -8140,21 +8302,126 @@ function getStatusText(status, config) {
8140
8302
  return (_d = config === null || config === void 0 ? void 0 : config.connecting) !== null && _d !== void 0 ? _d : DEFAULT_STATUS_CONFIG.connecting;
8141
8303
  }
8142
8304
  }
8305
+ /**
8306
+ * Determines if a string contains HTML tags
8307
+ */
8308
+ function isHtmlString(text) {
8309
+ if (typeof text !== "string") {
8310
+ return false;
8311
+ }
8312
+ // Check for common HTML patterns
8313
+ var htmlPattern = /<\/?[a-z][\s\S]*>/i;
8314
+ return htmlPattern.test(text);
8315
+ }
8316
+ /**
8317
+ * Sanitizes HTML string by removing potentially dangerous elements and attributes
8318
+ */
8319
+ function sanitizeHtml(html) {
8320
+ try {
8321
+ // Check if DOMParser is available
8322
+ if (typeof DOMParser === "undefined") {
8323
+ log("DOMParser not available, returning text content only");
8324
+ return html.replace(/<[^>]*>/g, ""); // Strip all HTML tags as fallback
8325
+ }
8326
+ // Create a temporary DOM element to parse the HTML
8327
+ var doc_1 = new DOMParser().parseFromString(html, "text/html");
8328
+ // Check if parsing was successful
8329
+ if (!doc_1 || !doc_1.body) {
8330
+ log("DOMParser failed to parse HTML, returning text content only");
8331
+ return html.replace(/<[^>]*>/g, ""); // Strip all HTML tags as fallback
8332
+ }
8333
+ // List of allowed tags (whitelist approach)
8334
+ var allowedTags_1 = ["span", "div", "p", "strong", "em", "b", "i", "u", "br"];
8335
+ // List of allowed style properties
8336
+ var allowedStyleProps_1 = [
8337
+ "color", "background-color", "font-size", "font-weight", "font-style",
8338
+ "text-align", "display", "flex", "align-items", "justify-content",
8339
+ "gap", "margin", "padding", "width", "height", "border-radius"
8340
+ ];
8341
+ // Recursive function to clean nodes
8342
+ var cleanNode_1 = function (node) {
8343
+ if (node.nodeType === Node.ELEMENT_NODE) {
8344
+ var element_1 = node;
8345
+ var tagName = element_1.tagName.toLowerCase();
8346
+ // Remove if not in allowed tags, but preserve text content
8347
+ if (!allowedTags_1.includes(tagName)) {
8348
+ // Replace the element with its text content
8349
+ var textNode = doc_1.createTextNode(element_1.textContent || "");
8350
+ element_1.replaceWith(textNode);
8351
+ return;
8352
+ }
8353
+ // Remove all attributes except style
8354
+ var attributes = Array.from(element_1.attributes);
8355
+ attributes.forEach(function (attr) {
8356
+ if (attr.name !== "style") {
8357
+ element_1.removeAttribute(attr.name);
8358
+ }
8359
+ });
8360
+ // Clean style attribute - only allow safe properties
8361
+ if (element_1.hasAttribute("style")) {
8362
+ var styleText = element_1.getAttribute("style") || "";
8363
+ var cleanedStyles_1 = [];
8364
+ // Parse individual style properties
8365
+ styleText.split(";").forEach(function (declaration) {
8366
+ var _a = declaration.split(":"), prop = _a[0], valueParts = _a.slice(1);
8367
+ var value = valueParts.join(":").trim(); // Rejoin in case value contains colons
8368
+ var propTrimmed = prop.trim();
8369
+ if (propTrimmed && value && allowedStyleProps_1.includes(propTrimmed.toLowerCase())) {
8370
+ // Additional validation: ensure value doesn't contain javascript: or expression()
8371
+ if (!/javascript:|expression\(|@import|behavior:/i.test(value)) {
8372
+ cleanedStyles_1.push("".concat(propTrimmed, ": ").concat(value));
8373
+ }
8374
+ }
8375
+ });
8376
+ if (cleanedStyles_1.length > 0) {
8377
+ element_1.setAttribute("style", cleanedStyles_1.join("; "));
8378
+ }
8379
+ else {
8380
+ element_1.removeAttribute("style");
8381
+ }
8382
+ }
8383
+ // Recursively clean child nodes
8384
+ var children = Array.from(element_1.childNodes);
8385
+ children.forEach(function (child) { return cleanNode_1(child); });
8386
+ }
8387
+ };
8388
+ // Clean each child of the body, not the body itself
8389
+ Array.from(doc_1.body.childNodes).forEach(function (child) { return cleanNode_1(child); });
8390
+ return doc_1.body.innerHTML;
8391
+ }
8392
+ catch (error) {
8393
+ log("Error sanitizing HTML: ".concat(error));
8394
+ // Fallback: strip all HTML tags
8395
+ return html.replace(/<[^>]*>/g, "");
8396
+ }
8397
+ }
8398
+ /**
8399
+ * Safely renders subtitle text that can be plain text, JSX, or HTML string
8400
+ */
8401
+ function renderSubtitleText(text) {
8402
+ // If it's an HTML string, sanitize and render it using dangerouslySetInnerHTML
8403
+ if (isHtmlString(text)) {
8404
+ var sanitizedHtml = sanitizeHtml(text);
8405
+ return require$$0.jsx("span", { dangerouslySetInnerHTML: { __html: sanitizedHtml } });
8406
+ }
8407
+ // Otherwise, render as-is (handles JSX and plain text)
8408
+ return text;
8409
+ }
8143
8410
  var refreshButtonAriaLabel = "To refresh chat click on clockwise gapped circle arrow icon in top right side of widget. ";
8144
8411
  var minimizeButtonAriaLabel = "To minimize widget click on minus icon in top right side of widget. ";
8145
8412
  var closeButtonAriaLabel = "To close widget click on close icon in top right side of widget.";
8146
8413
  var ChatHeader = function (props) {
8147
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
8414
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
8148
8415
  var innerDispatch = useChatDispatch();
8149
8416
  var menuConfig = props.menuConfig, onSubmit = props.onSubmit;
8150
- var _s = React$1.useState(false), drawerOpen = _s[0], setDrawerState = _s[1]; // false initially
8417
+ var _r = require$$1.useState(false), drawerOpen = _r[0], setDrawerState = _r[1]; // false initially
8151
8418
  var menuPosition = (menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.menuButtonLocation) || "FOOTER";
8152
8419
  var showMenuLeft = menuPosition === "HEADER_LEFT";
8153
8420
  var showMenuRight = menuPosition === "HEADER_RIGHT";
8154
8421
  var menuItemsRaw = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.items;
8155
8422
  var menuItemsTabIndex = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.itemsTabIndex;
8156
8423
  var menuButtonTabIndex = (_a = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.button) === null || _a === void 0 ? void 0 : _a.tabIndex;
8157
- var menuItems = React$1.useMemo(function () { return (menuItemsRaw ? menuItemsRaw : []); }, [menuItemsRaw]);
8424
+ var menuItems = require$$1.useMemo(function () { return (menuItemsRaw ? menuItemsRaw : []); }, [menuItemsRaw]);
8158
8425
  // Check if we have a right-side menu
8159
8426
  var hasRightMenu = showMenuRight && menuItems.length > 0;
8160
8427
  function toggleDrawer() {
@@ -8179,55 +8446,35 @@ var ChatHeader = function (props) {
8179
8446
  if (canCancel) {
8180
8447
  ariaLabel = "".concat(ariaLabel).concat(closeButtonAriaLabel);
8181
8448
  }
8182
- return (React$1.createElement(React$1.Fragment, null,
8183
- React$1.createElement("div", { className: "status-container background-header", "aria-label": ariaLabel, "aria-hidden": false },
8184
- showMenuLeft && menuItems.length ? (React$1.createElement(React$1.Fragment, null,
8185
- React$1.createElement("div", { className: "chat-footer__menu-icon" },
8186
- React$1.createElement(DrawerBars, { bars: 3, tabIndex: menuButtonTabIndex, onToggle: toggleDrawer })))) : (React$1.createElement(React$1.Fragment, null)),
8187
- ((_b = props === null || props === void 0 ? void 0 : props.agent) === null || _b === void 0 ? void 0 : _b.avatarPath) === undefined ? (React$1.createElement("div", null)) : (React$1.createElement("div", { className: "status-container__avatar" },
8188
- React$1.createElement(Avatar, { entity: props.agent }))),
8189
- React$1.createElement("div", { className: "\n ".concat("status-text", "\n ").concat(showMenuLeft && menuItems.length
8190
- ? "status-text-positionWithMenu"
8191
- : ((_c = props === null || props === void 0 ? void 0 : props.agent) === null || _c === void 0 ? void 0 : _c.avatarPath) === undefined
8192
- ? "status-text-positionLeftNoAvatar"
8193
- : "status-text-positionLeft", "\n ").concat(((_d = props.config) === null || _d === void 0 ? void 0 : _d.alignTextCenter)
8194
- ? "status-text-positionCenter"
8195
- : "", " \n ") },
8196
- React$1.createElement("span", { className: "status-text-title" }, getStatusText(props.accountStatus, (_e = props.config) === null || _e === void 0 ? void 0 : _e.status)),
8197
- ((_g = (_f = props.config) === null || _f === void 0 ? void 0 : _f.subtitle) === null || _g === void 0 ? void 0 : _g.enabled) && (React$1.createElement("span", { className: "status-text-subtitle" }, (_k = (_j = (_h = props.config) === null || _h === void 0 ? void 0 : _h.subtitle) === null || _j === void 0 ? void 0 : _j.text) !== null && _k !== void 0 ? _k : ""))),
8198
- React$1.createElement(ButtonGroup, null,
8199
- hasRightMenu && (React$1.createElement(MenuButton, { onClick: toggleDrawer, tabIndex: menuButtonTabIndex })),
8200
- props.canRefresh && (React$1.createElement(RefreshButton, { onClick: props.refreshOnClick, tabIndex: (_m = (_l = props.config) === null || _l === void 0 ? void 0 : _l.actions) === null || _m === void 0 ? void 0 : _m.refreshTabIndex, showInLeft: false, showInRight: false })),
8201
- props.canMinimize && (React$1.createElement(MinimizeButton, { onClick: props.minimizeOnClick, tabIndex: (_p = (_o = props.config) === null || _o === void 0 ? void 0 : _o.actions) === null || _p === void 0 ? void 0 : _p.minimizeTabIndex, showInRight: false })),
8202
- props.canCancel && (React$1.createElement(CancelButton, { onClick: props.cancelOnClick, tabIndex: (_r = (_q = props.config) === null || _q === void 0 ? void 0 : _q.actions) === null || _r === void 0 ? void 0 : _r.cancelTabIndex })))),
8203
- drawerOpen ? (React$1.createElement("div", { className: "xa-chat-menu-container" },
8204
- React$1.createElement(ChatMenu, { openFrom: showMenuRight ? "right" : "left", opened: drawerOpen, tabIndex: menuItemsTabIndex, onItemClick: handleMenuItem, items: menuItems }))) : (React$1.createElement(React$1.Fragment, null))));
8449
+ return (require$$0.jsxs(require$$0.Fragment, { children: [require$$0.jsxs("div", { className: "status-container background-header", "aria-label": ariaLabel, "aria-hidden": false, children: [showMenuLeft && menuItems.length ? (require$$0.jsx(require$$0.Fragment, { children: require$$0.jsx("div", { className: "chat-footer__menu-icon", children: require$$0.jsx(DrawerBars, { bars: 3, tabIndex: menuButtonTabIndex, onToggle: toggleDrawer }) }) })) : (require$$0.jsx(require$$0.Fragment, {})), ((_b = props === null || props === void 0 ? void 0 : props.agent) === null || _b === void 0 ? void 0 : _b.avatarPath) === undefined ? (require$$0.jsx("div", {})) : (require$$0.jsx("div", { className: "status-container__avatar", children: require$$0.jsx(Avatar, { entity: props.agent }) })), require$$0.jsxs("div", { className: "\n ".concat("status-text", "\n ").concat(showMenuLeft && menuItems.length
8450
+ ? "status-text-positionWithMenu"
8451
+ : ((_c = props === null || props === void 0 ? void 0 : props.agent) === null || _c === void 0 ? void 0 : _c.avatarPath) === undefined
8452
+ ? "status-text-positionLeftNoAvatar"
8453
+ : "status-text-positionLeft", "\n ").concat(((_d = props.config) === null || _d === void 0 ? void 0 : _d.alignTextCenter)
8454
+ ? "status-text-positionCenter"
8455
+ : "", " \n "), children: [require$$0.jsx("span", { className: "status-text-title", children: getStatusText(props.accountStatus, (_e = props.config) === null || _e === void 0 ? void 0 : _e.status) }), ((_g = (_f = props.config) === null || _f === void 0 ? void 0 : _f.subtitle) === null || _g === void 0 ? void 0 : _g.enabled) && (require$$0.jsx("span", { className: "status-text-subtitle", children: renderSubtitleText((_j = (_h = props.config) === null || _h === void 0 ? void 0 : _h.subtitle) === null || _j === void 0 ? void 0 : _j.text) }))] }), require$$0.jsxs(ButtonGroup, { children: [hasRightMenu && (require$$0.jsx(MenuButton, { onClick: toggleDrawer, tabIndex: menuButtonTabIndex })), props.canRefresh && (require$$0.jsx(RefreshButton, { onClick: props.refreshOnClick, tabIndex: (_l = (_k = props.config) === null || _k === void 0 ? void 0 : _k.actions) === null || _l === void 0 ? void 0 : _l.refreshTabIndex, showInLeft: false, showInRight: false })), props.canMinimize && (require$$0.jsx(MinimizeButton, { onClick: props.minimizeOnClick, tabIndex: (_o = (_m = props.config) === null || _m === void 0 ? void 0 : _m.actions) === null || _o === void 0 ? void 0 : _o.minimizeTabIndex, showInRight: false })), props.canCancel && (require$$0.jsx(CancelButton, { onClick: props.cancelOnClick, tabIndex: (_q = (_p = props.config) === null || _p === void 0 ? void 0 : _p.actions) === null || _q === void 0 ? void 0 : _q.cancelTabIndex }))] })] }), drawerOpen ? (require$$0.jsx("div", { className: "xa-chat-menu-container", children: require$$0.jsx(ChatMenu, { openFrom: showMenuRight ? "right" : "left", opened: drawerOpen, tabIndex: menuItemsTabIndex, onItemClick: handleMenuItem, items: menuItems }) })) : (require$$0.jsx(require$$0.Fragment, {}))] }));
8205
8456
  };
8206
8457
 
8207
- var UnknownMessage = function () { return React$1.createElement(React$1.Fragment, null); };
8458
+ var UnknownMessage = function () { return require$$0.jsx(require$$0.Fragment, {}); };
8208
8459
 
8209
8460
  function renderAvatar(entity) {
8210
- return (React$1.createElement("div", { className: "xappw-chat-msg-part__avatar" },
8211
- React$1.createElement(Avatar, { entity: entity })));
8461
+ return (require$$0.jsx("div", { className: "xappw-chat-msg-part__avatar", children: require$$0.jsx(Avatar, { entity: entity }) }));
8212
8462
  }
8213
8463
  var ChatMessagePart = function (props) {
8214
8464
  var _a;
8215
8465
  var position = (_a = props.avatarPosition) !== null && _a !== void 0 ? _a : "left";
8216
8466
  var containerClass = "xappw-chat-msg-part" +
8217
- (position === "below" ? " xappw-chat-msg-part--avatar-below" : "");
8218
- var user = props.user;
8219
- return (React$1.createElement("div", { className: containerClass }, position === "left" ? (React$1.createElement(React$1.Fragment, null,
8220
- props.showAvatar && renderAvatar(user),
8221
- props.children)) : (React$1.createElement(React$1.Fragment, null,
8222
- props.children,
8223
- props.showAvatar && (React$1.createElement("div", { className: "xappw-chat-msg-part__avatar-wrapper" },
8224
- renderAvatar(user),
8225
- (user === null || user === void 0 ? void 0 : user.displayName) && (React$1.createElement("div", { className: "xappw-chat-msg-part__avatar-name" }, user.displayName))))))));
8467
+ (position === "below" ? " xappw-chat-msg-part--avatar-below" : "") +
8468
+ (position === "bottom" ? " xappw-chat-msg-part--avatar-bottom" : "");
8469
+ var user = props.user, hideUserInfo = props.hideUserInfo;
8470
+ // Hide user info if hideUserInfo is true and position is "bottom"
8471
+ var shouldHideUserInfo = hideUserInfo && position === "bottom";
8472
+ return (require$$0.jsx("div", { className: containerClass, children: position === "left" ? (require$$0.jsxs(require$$0.Fragment, { children: [props.showAvatar && renderAvatar(user), props.children] })) : (require$$0.jsxs(require$$0.Fragment, { children: [props.children, props.showAvatar && !shouldHideUserInfo && (require$$0.jsxs("div", { className: "xappw-chat-msg-part__avatar-wrapper", children: [renderAvatar(user), (user === null || user === void 0 ? void 0 : user.displayName) && (require$$0.jsx("div", { className: "xappw-chat-msg-part__avatar-name", children: user.displayName }))] }))] })) }));
8226
8473
  };
8227
8474
 
8228
8475
  function useExecuteActionCallback() {
8229
8476
  var dispatch = useChatServerDispatch();
8230
- return React$1.useCallback(function (text, meta) {
8477
+ return require$$1.useCallback(function (text, meta) {
8231
8478
  dispatch(executeAction(text, meta));
8232
8479
  }, [dispatch]);
8233
8480
  }
@@ -8237,7 +8484,7 @@ function useButtonCallback() {
8237
8484
  var chatDispatch = useChatDispatch();
8238
8485
  var visuals = reactRedux.useSelector(function (state) { return state.visuals; });
8239
8486
  var executeAction = useExecuteActionCallback();
8240
- return React$1.useCallback(function (button) {
8487
+ return require$$1.useCallback(function (button) {
8241
8488
  if (button.actionUrl) {
8242
8489
  handleOpenUrl(button.actionUrl, chatDispatch, visuals);
8243
8490
  }
@@ -8270,17 +8517,15 @@ function isList(display) {
8270
8517
 
8271
8518
  var CardMiddlewareWidget = function (props) {
8272
8519
  var msg = props.msg, ctx = props.ctx;
8273
- var card = React$1.useMemo(function () { return convertFromCardDisplay(msg); }, [msg]);
8520
+ var card = require$$1.useMemo(function () { return convertFromCardDisplay(msg); }, [msg]);
8274
8521
  var user = ctx.user;
8275
8522
  var handleButton = useButtonCallback();
8276
- return (React$1.createElement(ChatMessagePart, { showAvatar: true, user: user },
8277
- React$1.createElement("div", { className: "chat-msg" },
8278
- React$1.createElement(ChatCard, { card: card, onButtonClick: handleButton }))));
8523
+ return (require$$0.jsx(ChatMessagePart, { showAvatar: true, user: user, children: require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsx(ChatCard, { card: card, onButtonClick: handleButton }) }) }));
8279
8524
  };
8280
8525
  var CardMiddleware = function (next) { return function (props) {
8281
8526
  var msg = props.msg, ctx = props.ctx;
8282
8527
  if (isCard(msg)) {
8283
- return React$1.createElement(CardMiddlewareWidget, { msg: msg, ctx: ctx });
8528
+ return require$$0.jsx(CardMiddlewareWidget, { msg: msg, ctx: ctx });
8284
8529
  }
8285
8530
  return next(props);
8286
8531
  }; };
@@ -8322,9 +8567,9 @@ function createSubscribableArray(originalValue) {
8322
8567
  };
8323
8568
  }
8324
8569
  function useSubscribableArray(array) {
8325
- var _a = React$1.useState(array.getArray()), res = _a[0], setRes = _a[1];
8570
+ var _a = require$$1.useState(array.getArray()), res = _a[0], setRes = _a[1];
8326
8571
  var mounted = useIsMounted();
8327
- React$1.useEffect(function () {
8572
+ require$$1.useEffect(function () {
8328
8573
  var subscription = array.subscribe(function (newVal) {
8329
8574
  if (mounted()) {
8330
8575
  setRes(newVal);
@@ -8356,7 +8601,7 @@ function useGlobalSubscribableArray(storage) {
8356
8601
  }
8357
8602
  function useLateMiddlewaresBuilder(storage) {
8358
8603
  var middlewares = useGlobalSubscribableArray(storage);
8359
- return React$1.useMemo(function () { return joinMiddlewares(middlewares); }, [middlewares]);
8604
+ return require$$1.useMemo(function () { return joinMiddlewares(middlewares); }, [middlewares]);
8360
8605
  }
8361
8606
  var storage = createStorage(globalThis, "xappMsgMiddlewares");
8362
8607
  function useLateMiddleware() {
@@ -8364,16 +8609,14 @@ function useLateMiddleware() {
8364
8609
  }
8365
8610
 
8366
8611
  function getSvg() {
8367
- return (React$1.createElement("svg", { viewBox: "0 0 20 20" },
8368
- React$1.createElement("path", { d: "M17 17H3V3h5V1H3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5h-2z" }),
8369
- React$1.createElement("path", { d: "M19 1h-8l3.29 3.29-5.73 5.73 1.42 1.42 5.73-5.73L19 9V1z" })));
8612
+ return (require$$0.jsxs("svg", { viewBox: "0 0 20 20", children: [require$$0.jsx("path", { d: "M17 17H3V3h5V1H3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5h-2z" }), require$$0.jsx("path", { d: "M19 1h-8l3.29 3.29-5.73 5.73 1.42 1.42 5.73-5.73L19 9V1z" })] }));
8370
8613
  }
8371
8614
  var ExternalLink = function (props) {
8372
8615
  var url = props.url;
8373
- var handleClick = React$1.useCallback(function (ev) {
8616
+ var handleClick = require$$1.useCallback(function (ev) {
8374
8617
  ev.preventDefault();
8375
8618
  }, []);
8376
- return (React$1.createElement("a", { href: url, "aria-label": "read more", target: "_blank", rel: "noreferrer", className: props.className, onClick: handleClick }, getSvg()));
8619
+ return (require$$0.jsx("a", { href: url, "aria-label": "read more", target: "_blank", rel: "noreferrer", className: props.className, onClick: handleClick, children: getSvg() }));
8377
8620
  };
8378
8621
 
8379
8622
  function firstIndex(val, patterns) {
@@ -8483,10 +8726,10 @@ function reduceLink(url, maxLength) {
8483
8726
 
8484
8727
  var SmartLink = function (props) {
8485
8728
  var url = props.url, className = props.className;
8486
- var handleClick = React$1.useCallback(function (ev) {
8729
+ var handleClick = require$$1.useCallback(function (ev) {
8487
8730
  ev.preventDefault();
8488
8731
  }, []);
8489
- return (React$1.createElement("a", { href: url, "aria-label": "read more", target: "_blank", rel: "noreferrer", className: className, onClick: handleClick }, reduceLink(url, 40)));
8732
+ return (require$$0.jsx("a", { href: url, "aria-label": "read more", target: "_blank", rel: "noreferrer", className: className, onClick: handleClick, children: reduceLink(url, 40) }));
8490
8733
  };
8491
8734
 
8492
8735
  var ListItem = function (props) {
@@ -8494,33 +8737,18 @@ var ListItem = function (props) {
8494
8737
  var item = props.item;
8495
8738
  var layout = props.layout || "normal";
8496
8739
  var url = item.url || item.imageActionUrl;
8497
- return (React$1.createElement(ActionItem, { className: "xappw-vlist-item-container", item: item, onButtonClick: props.onButtonClick, onExecute: props.onExecute, onOpenUrl: props.onOpenUrl },
8498
- React$1.createElement("div", { className: "xappw-vlist-item xappw-vlist-item--".concat(layout) },
8499
- React$1.createElement("div", { className: "xappw-vlist-item__description" },
8500
- item.title && React$1.createElement("div", { className: "xappw-vlist-item__title" },
8501
- React$1.createElement("span", null, item.title)),
8502
- url && React$1.createElement(SmartLink, { url: url, className: "xappw-vlist-item__link" }),
8503
- item.subTitle && React$1.createElement("div", { className: "xappw-vlist-item__subtitle" },
8504
- React$1.createElement("span", null, item.subTitle)),
8505
- !!((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length) && React$1.createElement(ChatActionButtons, { buttons: item.buttons, onClick: props.onButtonClick })),
8506
- React$1.createElement("div", { className: "xappw-vlist-item__side" },
8507
- url && React$1.createElement(ExternalLink, { url: "url", className: "xappw-vlist-item__external-link" }),
8508
- React$1.createElement(ActionItemImage, { item: item, className: "xappw-vlist-item__img", emptyImageVisible: props.emptyImageVisible })))));
8740
+ return (require$$0.jsx(ActionItem, { className: "xappw-vlist-item-container", item: item, onButtonClick: props.onButtonClick, onExecute: props.onExecute, onOpenUrl: props.onOpenUrl, children: require$$0.jsxs("div", { className: "xappw-vlist-item xappw-vlist-item--".concat(layout), children: [require$$0.jsxs("div", { className: "xappw-vlist-item__description", children: [item.title && (require$$0.jsx("div", { className: "xappw-vlist-item__title", children: require$$0.jsx("span", { children: item.title }) })), url && require$$0.jsx(SmartLink, { url: url, className: "xappw-vlist-item__link" }), item.subTitle && (require$$0.jsx("div", { className: "xappw-vlist-item__subtitle", children: require$$0.jsx("span", { children: item.subTitle }) })), !!((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length) && (require$$0.jsx(ChatActionButtons, { buttons: item.buttons, onClick: props.onButtonClick }))] }), require$$0.jsxs("div", { className: "xappw-vlist-item__side", children: [url && require$$0.jsx(ExternalLink, { url: "url", className: "xappw-vlist-item__external-link" }), require$$0.jsx(ActionItemImage, { item: item, className: "xappw-vlist-item__img", emptyImageVisible: props.emptyImageVisible })] })] }) }));
8509
8741
  };
8510
8742
 
8511
8743
  var List = function (props) {
8512
8744
  var list = props.list;
8513
- var listRef = React$1.useRef(null);
8745
+ var listRef = require$$1.useRef(null);
8514
8746
  var hasImage = list.items.some(function (item) { return item.imageUrl; });
8515
8747
  var titlesOnly = !list.items.some(function (item) { var _a; return item.subTitle || ((_a = item.buttons) === null || _a === void 0 ? void 0 : _a.length); });
8516
8748
  var listItems = list.items.map(function (item, itemIndex) {
8517
- return (React$1.createElement("div", { className: "xappw-vlist-container__item", key: "item-key-".concat(itemIndex) },
8518
- React$1.createElement(ListItem, { item: item, layout: titlesOnly ? "titles" : "normal", emptyImageVisible: hasImage, onExecute: props.onExecute, onButtonClick: props.onButtonClick, onOpenUrl: props.onOpenUrl })));
8749
+ return (require$$0.jsx("div", { className: "xappw-vlist-container__item", children: require$$0.jsx(ListItem, { item: item, layout: titlesOnly ? "titles" : "normal", emptyImageVisible: hasImage, onExecute: props.onExecute, onButtonClick: props.onButtonClick, onOpenUrl: props.onOpenUrl }) }, "item-key-".concat(itemIndex)));
8519
8750
  });
8520
- return (React$1.createElement("div", { className: "xappw-vlist" },
8521
- React$1.createElement("div", { ref: listRef, className: "xappw-vlist-container" },
8522
- props.list.title && React$1.createElement("div", { className: "xappw-vlist__header" }, props.list.title),
8523
- listItems)));
8751
+ return (require$$0.jsx("div", { className: "xappw-vlist", children: require$$0.jsxs("div", { ref: listRef, className: "xappw-vlist-container", children: [props.list.title && require$$0.jsx("div", { className: "xappw-vlist__header", children: props.list.title }), listItems] }) }));
8524
8752
  };
8525
8753
 
8526
8754
  var ListMiddlewareWidget = function (props) {
@@ -8528,38 +8756,31 @@ var ListMiddlewareWidget = function (props) {
8528
8756
  if (!ctx) {
8529
8757
  throw new TypeError("ctx not provided to ".concat(ListMiddlewareWidget.name));
8530
8758
  }
8531
- var list = React$1.useMemo(function () { return convertFromListDisplay(msg); }, [msg]);
8759
+ var list = require$$1.useMemo(function () { return convertFromListDisplay(msg); }, [msg]);
8532
8760
  var executeActionCallback = useExecuteActionCallback();
8533
- var handleExecute = React$1.useCallback(function (ui, text, token) {
8761
+ var handleExecute = require$$1.useCallback(function (ui, text, token) {
8534
8762
  executeActionCallback(text, { token: token, action: "click", ui: ui });
8535
8763
  }, [executeActionCallback]);
8536
8764
  var handleButton = useButtonCallback();
8537
8765
  var user = ctx.user;
8538
- return (React$1.createElement(ChatMessagePart, { showAvatar: false, user: user },
8539
- list.type === "CAROUSEL" && (React$1.createElement("div", { className: "chat-msg chat-msg--fullwidth chat-msg--no-ava" },
8540
- React$1.createElement(Carousel, { list: list, onExecute: handleExecute.bind(null, "carousel"), onButtonClick: handleButton, onOpenUrl: ctx.openUrl }))),
8541
- list.type === "LIST" && (React$1.createElement("div", { className: "chat-msg chat-msg--expand" },
8542
- React$1.createElement(List, { list: list, onExecute: handleExecute.bind(null, "list"), onButtonClick: handleButton, onOpenUrl: ctx.openUrl })))));
8766
+ return (require$$0.jsxs(ChatMessagePart, { showAvatar: false, user: user, children: [list.type === "CAROUSEL" && (require$$0.jsx("div", { className: "chat-msg chat-msg--fullwidth chat-msg--no-ava", children: require$$0.jsx(Carousel, { list: list, onExecute: handleExecute.bind(null, "carousel"), onButtonClick: handleButton, onOpenUrl: ctx.openUrl }) })), list.type === "LIST" && (require$$0.jsx("div", { className: "chat-msg chat-msg--expand", children: require$$0.jsx(List, { list: list, onExecute: handleExecute.bind(null, "list"), onButtonClick: handleButton, onOpenUrl: ctx.openUrl }) }))] }));
8543
8767
  };
8544
8768
  var ListMiddleware = function (next) { return function (props) {
8545
8769
  var msg = props.msg, ctx = props.ctx;
8546
8770
  if (isList(msg)) {
8547
- return React$1.createElement(ListMiddlewareWidget, { msg: msg, ctx: ctx });
8771
+ return require$$0.jsx(ListMiddlewareWidget, { msg: msg, ctx: ctx });
8548
8772
  }
8549
8773
  return next(props);
8550
8774
  }; };
8551
8775
 
8552
8776
  var MultiSelect = function (props) {
8553
8777
  var items = props.items, checked = props.checked, onChange = props.onChange;
8554
- var handleToggle = React$1.useCallback(function (ev) {
8778
+ var handleToggle = require$$1.useCallback(function (ev) {
8555
8779
  var _a;
8556
8780
  var id = ev.target.value;
8557
8781
  onChange(__assign(__assign({}, checked), (_a = {}, _a[id] = !checked[id], _a)));
8558
8782
  }, [checked, onChange]);
8559
- return (React$1.createElement("ul", { className: "xappw-multiselect" }, items === null || items === void 0 ? void 0 : items.map(function (item) { return (React$1.createElement("li", { key: item.id },
8560
- React$1.createElement("label", null,
8561
- React$1.createElement("input", { type: "checkbox", checked: checked[item.id] || false, onChange: handleToggle, value: item.id }),
8562
- React$1.createElement("span", null, item.title)))); })));
8783
+ return (require$$0.jsx("ul", { className: "xappw-multiselect", children: items === null || items === void 0 ? void 0 : items.map(function (item) { return (require$$0.jsx("li", { children: require$$0.jsxs("label", { children: [require$$0.jsx("input", { type: "checkbox", checked: checked[item.id] || false, onChange: handleToggle, value: item.id }), require$$0.jsx("span", { children: item.title })] }) }, item.id)); }) }));
8563
8784
  };
8564
8785
 
8565
8786
  function isMultiSelect(display) {
@@ -8570,29 +8791,25 @@ function convertToMultiSelectItems(display) {
8570
8791
  }
8571
8792
  var MultiSelectMiddlewareWidget = function (props) {
8572
8793
  var msg = props.msg, ctx = props.ctx;
8573
- var items = React$1.useMemo(function () { return convertToMultiSelectItems(msg); }, [msg]);
8794
+ var items = require$$1.useMemo(function () { return convertToMultiSelectItems(msg); }, [msg]);
8574
8795
  var user = ctx.user;
8575
- var _a = React$1.useState({}), checked = _a[0], setChecked = _a[1];
8576
- var handleSubmit = React$1.useCallback(function () {
8796
+ var _a = require$$1.useState({}), checked = _a[0], setChecked = _a[1];
8797
+ var handleSubmit = require$$1.useCallback(function () {
8577
8798
  ctx.send({
8578
8799
  type: "custom",
8579
8800
  payload: JSON.stringify({
8580
8801
  type: "OPTION_SELECT_REQUEST",
8581
8802
  intentId: "OptionSelect",
8582
- selected: Object.keys(checked).map(function (k) { return ({ id: k }); })
8583
- })
8803
+ selected: Object.keys(checked).map(function (k) { return ({ id: k }); }),
8804
+ }),
8584
8805
  });
8585
8806
  }, [ctx, checked]);
8586
- return (React$1.createElement(ChatMessagePart, { showAvatar: true, user: user },
8587
- React$1.createElement("div", { className: "chat-msg" },
8588
- React$1.createElement("div", null,
8589
- React$1.createElement(MultiSelect, { items: items, checked: checked, onChange: setChecked }),
8590
- React$1.createElement(ActionButton, { label: "Submit", onClick: handleSubmit })))));
8807
+ return (require$$0.jsx(ChatMessagePart, { showAvatar: true, user: user, children: require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsxs("div", { children: [require$$0.jsx(MultiSelect, { items: items, checked: checked, onChange: setChecked }), require$$0.jsx(ActionButton, { label: "Submit", onClick: handleSubmit })] }) }) }));
8591
8808
  };
8592
8809
  var MultiSelectMiddleware = function (next) { return function (props) {
8593
8810
  var msg = props.msg, ctx = props.ctx;
8594
8811
  if (isMultiSelect(msg)) {
8595
- return React$1.createElement(MultiSelectMiddlewareWidget, { msg: msg, ctx: ctx });
8812
+ return require$$0.jsx(MultiSelectMiddlewareWidget, { msg: msg, ctx: ctx });
8596
8813
  }
8597
8814
  return next(props);
8598
8815
  }; };
@@ -8604,14 +8821,14 @@ var StandardMiddlewaresBuilder = joinMiddlewares([
8604
8821
  ]);
8605
8822
  function useStandardMiddlewareBuilder() {
8606
8823
  var lateMiddleware = useLateMiddleware();
8607
- return React$1.useMemo(function () { return joinMiddlewares([
8824
+ return require$$1.useMemo(function () { return joinMiddlewares([
8608
8825
  lateMiddleware,
8609
8826
  StandardMiddlewaresBuilder,
8610
8827
  ]); }, [lateMiddleware]);
8611
8828
  }
8612
8829
  function useStandardMiddleware() {
8613
8830
  var builder = useStandardMiddlewareBuilder();
8614
- return React$1.useMemo(function () { return builder(UnknownMessage); }, [builder]);
8831
+ return require$$1.useMemo(function () { return builder(UnknownMessage); }, [builder]);
8615
8832
  }
8616
8833
  var StandardMiddlewares = StandardMiddlewaresBuilder(UnknownMessage);
8617
8834
 
@@ -8622,36 +8839,33 @@ function getTailSvgPath(owner) {
8622
8839
  return "m 0 0 v 240 h 60 c -40 -40 -60 -160 -60 -240";
8623
8840
  }
8624
8841
  function getTailSvg(owner) {
8625
- return (React$1.createElement("svg", { className: "chat-text-bubble__tail", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 80 240" },
8626
- React$1.createElement("path", { d: getTailSvgPath(owner), fill: "currentColor" })));
8842
+ return (require$$0.jsx("svg", { className: "chat-text-bubble__tail", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 80 240", children: require$$0.jsx("path", { d: getTailSvgPath(owner), fill: "currentColor" }) }));
8627
8843
  }
8628
8844
  var ChatMessageBubble = function (props) {
8629
8845
  var owner = props.owner, onClick = props.onClick;
8630
- var handleClick = React$1.useCallback(function () {
8846
+ var handleClick = require$$1.useCallback(function () {
8631
8847
  if (onClick) {
8632
8848
  onClick();
8633
8849
  }
8634
8850
  }, [onClick]);
8635
- return (React$1.createElement("div", { onClick: handleClick, className: "chat-text-bubble ".concat(owner === "mine" ? "chat-text-bubble--mine" : "chat-text-bubble--others") },
8636
- (props.hasTail) && getTailSvg(owner),
8637
- props.children));
8851
+ return (require$$0.jsxs("div", { onClick: handleClick, className: "chat-text-bubble ".concat(owner === "mine" ? "chat-text-bubble--mine" : "chat-text-bubble--others"), children: [props.hasTail && getTailSvg(owner), props.children] }));
8638
8852
  };
8639
8853
 
8640
8854
  var ChatMarkdownMessage = function (props) {
8641
8855
  var onOpenUrl = props.onOpenUrl;
8642
8856
  var agentMessage = isAgent(props.message.user.nick);
8643
- var ref = React$1.useRef();
8857
+ var ref = require$$1.useRef(null);
8644
8858
  var chatDispatch = useChatDispatch();
8645
8859
  var visuals = reactRedux.useSelector(function (state) { return state.visuals; });
8646
8860
  var html = props.message.msg.html;
8647
- var handleLinkClick = React$1.useCallback(function (ev) {
8861
+ var handleLinkClick = require$$1.useCallback(function (ev) {
8648
8862
  if (onOpenUrl) {
8649
8863
  var link = ev.target;
8650
8864
  ev.preventDefault();
8651
8865
  onOpenUrl(link.href, chatDispatch, visuals);
8652
8866
  }
8653
8867
  }, [onOpenUrl]);
8654
- React$1.useEffect(function () {
8868
+ require$$1.useEffect(function () {
8655
8869
  if (ref.current) {
8656
8870
  ref.current.innerHTML = html;
8657
8871
  if (onOpenUrl) {
@@ -8668,11 +8882,7 @@ var ChatMarkdownMessage = function (props) {
8668
8882
  }
8669
8883
  return undefined;
8670
8884
  }, [ref, html, onOpenUrl, handleLinkClick]);
8671
- return (React$1.createElement("div", { className: "chat-msg" },
8672
- React$1.createElement("div", { className: "chat-text-container" },
8673
- React$1.createElement(ChatMessageBubble, { owner: agentMessage ? "others" : "mine", hasTail: agentMessage && !props.sibling },
8674
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + (agentMessage ? " the bot said" : " the user said")),
8675
- React$1.createElement("div", { ref: ref })))));
8885
+ return (require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsx("div", { className: "chat-text-container", children: require$$0.jsxs(ChatMessageBubble, { owner: agentMessage ? "others" : "mine", hasTail: agentMessage && !props.sibling, children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + (agentMessage ? " the bot said" : " the user said") }), require$$0.jsx("div", { ref: ref })] }) }) }));
8676
8886
  };
8677
8887
 
8678
8888
  var ChatPermissionMessage = function (props) {
@@ -8686,57 +8896,59 @@ var ChatPermissionMessage = function (props) {
8686
8896
  var author = message.user;
8687
8897
  var allowLabel = "Allow";
8688
8898
  var denyLabel = "Deny";
8689
- var writeAsAgent = React$1.useCallback(function (msg) {
8899
+ var writeAsAgent = require$$1.useCallback(function (msg) {
8690
8900
  ctx.write({
8691
8901
  type: "msg",
8692
8902
  user: author,
8693
- msg: msg
8903
+ msg: msg,
8694
8904
  });
8695
8905
  }, [ctx, author]);
8696
- var writeAsUser = React$1.useCallback(function (msg) {
8906
+ var writeAsUser = require$$1.useCallback(function (msg) {
8697
8907
  ctx.write({
8698
8908
  type: "msg",
8699
8909
  user: user,
8700
- msg: msg
8910
+ msg: msg,
8701
8911
  });
8702
8912
  }, [ctx, user]);
8703
- var handleFail = React$1.useCallback(function () {
8913
+ var handleFail = require$$1.useCallback(function () {
8704
8914
  ctx.send({
8705
8915
  type: "msg",
8706
8916
  user: undefined,
8707
8917
  msg: {
8708
- text: denyLabel
8709
- }
8918
+ text: denyLabel,
8919
+ },
8710
8920
  });
8711
8921
  }, [ctx]);
8712
- var handleSend = React$1.useCallback(function (msg) {
8922
+ var handleSend = require$$1.useCallback(function (msg) {
8713
8923
  ctx.send({
8714
8924
  type: "permissionGrant",
8715
8925
  user: author,
8716
- msg: msg
8926
+ msg: msg,
8717
8927
  });
8718
8928
  }, [author, ctx]);
8719
- var handleResult = React$1.useCallback(function (position, userMsg) {
8929
+ var handleResult = require$$1.useCallback(function (position, userMsg) {
8720
8930
  handleSend({
8721
8931
  text: userMsg,
8722
- location: position ? {
8723
- latitude: position.coords.latitude,
8724
- longitude: position.coords.longitude
8725
- } : undefined,
8726
- permissionRequest: permissionRequest
8932
+ location: position
8933
+ ? {
8934
+ latitude: position.coords.latitude,
8935
+ longitude: position.coords.longitude,
8936
+ }
8937
+ : undefined,
8938
+ permissionRequest: permissionRequest,
8727
8939
  });
8728
8940
  writeAsUser({
8729
- text: userMsg
8941
+ text: userMsg,
8730
8942
  });
8731
8943
  var agentMsg = position ? permissionRequest === null || permissionRequest === void 0 ? void 0 : permissionRequest.approve : permissionRequest === null || permissionRequest === void 0 ? void 0 : permissionRequest.deny;
8732
8944
  if (agentMsg) {
8733
8945
  writeAsAgent(agentMsg);
8734
8946
  }
8735
8947
  }, [permissionRequest, writeAsUser, writeAsAgent, handleSend]);
8736
- var handleDeny = React$1.useCallback(function (label) {
8948
+ var handleDeny = require$$1.useCallback(function (label) {
8737
8949
  handleResult(undefined, label);
8738
8950
  }, [handleResult]);
8739
- var handleAllow = React$1.useCallback(function (label) {
8951
+ var handleAllow = require$$1.useCallback(function (label) {
8740
8952
  if (navigator.geolocation) {
8741
8953
  navigator.geolocation.getCurrentPosition(function (position) {
8742
8954
  handleResult(position, label);
@@ -8746,25 +8958,17 @@ var ChatPermissionMessage = function (props) {
8746
8958
  }
8747
8959
  }, [handleFail, handleResult]);
8748
8960
  if (!permissionRequest) {
8749
- return React$1.createElement(React$1.Fragment, null);
8961
+ return require$$0.jsx(require$$0.Fragment, {});
8750
8962
  }
8751
- return (React$1.createElement("div", { className: "chat-msg" },
8752
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + (agentMessage ? " the bot said" : " the user said")),
8753
- React$1.createElement("div", { className: "buttons-container" },
8754
- React$1.createElement(ActionButton, { label: allowLabel, addClass: "button", onClick: handleAllow }),
8755
- React$1.createElement(ActionButton, { label: denyLabel, addClass: "button", onClick: handleDeny }))));
8963
+ return (require$$0.jsxs("div", { className: "chat-msg", children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + (agentMessage ? " the bot said" : " the user said") }), require$$0.jsxs("div", { className: "buttons-container", children: [require$$0.jsx(ActionButton, { label: allowLabel, addClass: "button", onClick: handleAllow }), require$$0.jsx(ActionButton, { label: denyLabel, addClass: "button", onClick: handleDeny })] })] }));
8756
8964
  };
8757
8965
 
8758
8966
  var ChatTextMessage = function (props) {
8759
8967
  var message = props.message;
8760
8968
  var date = new Date(message.timestamp);
8761
- var time = date.getHours() + ':' + date.getMinutes();
8969
+ var time = date.getHours() + ":" + date.getMinutes();
8762
8970
  var agentMessage = isAgent(props.message.user.nick);
8763
- return (React$1.createElement("div", { className: "chat-msg" },
8764
- React$1.createElement("div", { className: "chat-text-container" },
8765
- React$1.createElement(ChatMessageBubble, { owner: agentMessage ? "others" : "mine", hasTail: agentMessage && !props.sibling },
8766
- React$1.createElement("span", { className: "message-sr-only" }, "at " + time + (agentMessage ? " the bot said" : " the user said")),
8767
- React$1.createElement("span", null, message.msg.text)))));
8971
+ return (require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsx("div", { className: "chat-text-container", children: require$$0.jsxs(ChatMessageBubble, { owner: agentMessage ? "others" : "mine", hasTail: agentMessage && !props.sibling, children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + time + (agentMessage ? " the bot said" : " the user said") }), require$$0.jsx("span", { children: message.msg.text })] }) }) }));
8768
8972
  };
8769
8973
 
8770
8974
  var ChatScheduleWidget = function (props) {
@@ -8775,10 +8979,7 @@ var ChatScheduleWidget = function (props) {
8775
8979
  function handleClick() {
8776
8980
  openUrl(scheduleWidgetUrl, chatDispatch, visuals);
8777
8981
  }
8778
- return (React$1.createElement("div", { className: "chat-schedule-button-container" },
8779
- React$1.createElement("button", { className: "chat-schedule-button", onClick: handleClick },
8780
- React$1.createElement("i", { className: "fa fa-lg fa-calendar" }),
8781
- React$1.createElement("span", null, display.label || "Schedule Now!"))));
8982
+ return (require$$0.jsx("div", { className: "chat-schedule-button-container", children: require$$0.jsxs("button", { className: "chat-schedule-button", onClick: handleClick, children: [require$$0.jsx("i", { className: "fa fa-lg fa-calendar" }), require$$0.jsx("span", { children: display.label || "Schedule Now!" })] }) }));
8782
8983
  };
8783
8984
 
8784
8985
  function getClassName(msg) {
@@ -8792,13 +8993,17 @@ var avaKeys = ["text", "html", "card", "list"];
8792
8993
  * @returns
8793
8994
  */
8794
8995
  var ChatMessage = function (props) {
8996
+ var _a;
8795
8997
  var middleware = props.messageMiddleware || StandardMiddlewares;
8796
- var chatConfig = React$1.useContext(ChatConfigContext);
8998
+ var chatConfig = require$$1.useContext(ChatConfigContext);
8797
8999
  // console.log(`########### chatConfig: ${JSON.stringify(chatConfig, null, 2)}`);
8798
9000
  var ctx = props.middlewareContext;
8799
9001
  var user = props.agent;
9002
+ // Get hideUserInfo from the agent info based on the message sender's nick
9003
+ var agentInfo = (_a = props.agents) === null || _a === void 0 ? void 0 : _a[props.message.user.nick];
9004
+ var hideUserInfo = (agentInfo === null || agentInfo === void 0 ? void 0 : agentInfo.hideUserInfo) || false;
8800
9005
  function renderByType() {
8801
- var _a;
9006
+ var _a, _b, _c, _d;
8802
9007
  var msg = props.message.msg;
8803
9008
  switch (props.message.type) {
8804
9009
  // TODO: props actually requires it to be "chat.msg". Fix prop typing?
@@ -8806,38 +9011,27 @@ var ChatMessage = function (props) {
8806
9011
  // Here is the deal. If we have text (output speech), then text - card - list - options
8807
9012
  // OR card OR list only. Avatar with text bubble.
8808
9013
  var avaKey = avaKeys.find(function (key) { return !!msg[key]; });
8809
- return (React$1.createElement(React$1.Fragment, null,
8810
- msg.text &&
8811
- React$1.createElement(ChatMessagePart, { showAvatar: avaKey === "text", user: user, avatarPosition: chatConfig.env.theme.messages.avatarPosition },
8812
- React$1.createElement(ChatTextMessage, { message: props.message, sibling: props.sibling })),
8813
- msg.html &&
8814
- React$1.createElement(ChatMessagePart, { showAvatar: avaKey === "html", user: user, avatarPosition: chatConfig.env.theme.messages.avatarPosition },
8815
- React$1.createElement(ChatMarkdownMessage, { message: props.message, sibling: props.sibling, onOpenUrl: (_a = props.middlewareContext) === null || _a === void 0 ? void 0 : _a.openUrl })),
8816
- msg.displays && middleware && msg.displays.map(function (display, index) {
8817
- if (display.type === "ScheduleButton") {
8818
- return (React$1.createElement(ChatScheduleWidget, { minimizeOnClick: props.minimizeOnClick, display: display }));
8819
- }
8820
- var Middleware = middleware;
8821
- return (React$1.createElement(Middleware, { key: index, msg: display, ctx: props.middlewareContext }));
8822
- }),
8823
- msg.permissionRequest && ctx &&
8824
- React$1.createElement(ChatMessagePart, { showAvatar: avaKey === "permissionRequest", user: user, avatarPosition: chatConfig.env.theme.messages.avatarPosition },
8825
- React$1.createElement(ChatPermissionMessage, { message: props.message, sibling: props.sibling, ctx: ctx }))));
9014
+ return (require$$0.jsxs(require$$0.Fragment, { children: [msg.text &&
9015
+ require$$0.jsx(ChatMessagePart, { showAvatar: avaKey === "text", user: user, avatarPosition: (_a = chatConfig.env.theme.messages) === null || _a === void 0 ? void 0 : _a.avatarPosition, hideUserInfo: hideUserInfo, children: require$$0.jsx(ChatTextMessage, { message: props.message, sibling: props.sibling }) }), msg.html &&
9016
+ require$$0.jsx(ChatMessagePart, { showAvatar: avaKey === "html", user: user, avatarPosition: (_b = chatConfig.env.theme.messages) === null || _b === void 0 ? void 0 : _b.avatarPosition, hideUserInfo: hideUserInfo, children: require$$0.jsx(ChatMarkdownMessage, { message: props.message, sibling: props.sibling, onOpenUrl: (_c = props.middlewareContext) === null || _c === void 0 ? void 0 : _c.openUrl }) }), msg.displays && middleware && msg.displays.map(function (display, index) {
9017
+ if (display.type === "ScheduleButton") {
9018
+ return (require$$0.jsx(ChatScheduleWidget, { minimizeOnClick: props.minimizeOnClick, display: display }));
9019
+ }
9020
+ var Middleware = middleware;
9021
+ return (require$$0.jsx(Middleware, { msg: display, ctx: props.middlewareContext }, index));
9022
+ }), msg.permissionRequest && ctx &&
9023
+ require$$0.jsx(ChatMessagePart, { showAvatar: avaKey === "permissionRequest", user: user, avatarPosition: (_d = chatConfig.env.theme.messages) === null || _d === void 0 ? void 0 : _d.avatarPosition, hideUserInfo: hideUserInfo, children: require$$0.jsx(ChatPermissionMessage, { message: props.message, sibling: props.sibling, ctx: ctx }) })] }));
8826
9024
  }
8827
- return (React$1.createElement(React$1.Fragment, null));
9025
+ return (require$$0.jsx(require$$0.Fragment, {}));
8828
9026
  }
8829
9027
  function renderTimestamp() {
8830
9028
  var timestamp = props.message.timestamp;
8831
9029
  var ts = new Date(timestamp);
8832
9030
  var timeAgo = getTimeAgo(ts);
8833
- return (React$1.createElement("div", { className: "chat-msg-timestamp ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor") },
8834
- React$1.createElement("span", null, timeAgo)));
9031
+ return (require$$0.jsx("div", { className: "chat-msg-timestamp ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor"), children: require$$0.jsx("span", { children: timeAgo }) }));
8835
9032
  }
8836
9033
  // empty
8837
- return (React$1.createElement("div", { className: "chat-msg-container-wrapper ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor", " ").concat(props.sibling ? "sibling" : "") },
8838
- React$1.createElement("div", { className: "chat-msg-container ".concat(getClassName(props.message)) },
8839
- renderByType(),
8840
- renderTimestamp())));
9034
+ return (require$$0.jsx("div", { className: "chat-msg-container-wrapper ".concat(isAgent(props.message.user.nick) ? "agent" : "visitor", " ").concat(props.sibling ? "sibling" : ""), children: require$$0.jsxs("div", { className: "chat-msg-container ".concat(getClassName(props.message)), children: [renderByType(), renderTimestamp()] }) }));
8841
9035
  };
8842
9036
 
8843
9037
  /**
@@ -8881,7 +9075,7 @@ function checkSessionExpiration(duration, lastMessageTimestamp, _lastTimestamp)
8881
9075
  }
8882
9076
 
8883
9077
  function useExternalScript(url) {
8884
- React$1.useEffect(function () {
9078
+ require$$1.useEffect(function () {
8885
9079
  if (!url) {
8886
9080
  return;
8887
9081
  }
@@ -8923,7 +9117,7 @@ function useChatServerVisitorId() {
8923
9117
  });
8924
9118
  var visitorAccessToken = reactRedux.useSelector(function (state) { return state.accessToken; });
8925
9119
  var attributes = reactRedux.useSelector(function (state) { return state.attributes; });
8926
- return React$1.useMemo(function () { return ({
9120
+ return require$$1.useMemo(function () { return ({
8927
9121
  dispatch: dispatch,
8928
9122
  visitorId: clientVisitorId,
8929
9123
  accessToken: visitorAccessToken,
@@ -8934,11 +9128,11 @@ function useChatServerVisitorId() {
8934
9128
  //send whenever server settings or visitor id changes
8935
9129
  function useGreeting(active) {
8936
9130
  var curr = useChatServerVisitorId();
8937
- var snapshotRef = React$1.useRef(null);
8938
- var ctx = React$1.useContext(ChatConfigContext);
9131
+ var snapshotRef = require$$1.useRef(null);
9132
+ var ctx = require$$1.useContext(ChatConfigContext);
8939
9133
  var isAdmin = ctx.env.isAdmin;
8940
9134
  var sessionId = reactRedux.useSelector(function (state) { return state.sessionId; });
8941
- React$1.useEffect(function () {
9135
+ require$$1.useEffect(function () {
8942
9136
  if (active) {
8943
9137
  if (snapshotRef.current !== curr) {
8944
9138
  snapshotRef.current = curr;
@@ -8983,18 +9177,18 @@ function norm(index, len) {
8983
9177
  return (index + len) % len;
8984
9178
  }
8985
9179
  function useSuggestions(search, context) {
8986
- var _a = React$1.useState(), suggestions = _a[0], setSuggestions = _a[1];
8987
- var _b = React$1.useState(-1), suggestionIndex = _b[0], setSuggestionIndex = _b[1];
8988
- var _c = React$1.useState(search), query = _c[0], setQuery = _c[1];
8989
- var _d = React$1.useState(context), contextState = _d[0], setContextState = _d[1];
8990
- React$1.useEffect(function () {
9180
+ var _a = require$$1.useState(), suggestions = _a[0], setSuggestions = _a[1];
9181
+ var _b = require$$1.useState(-1), suggestionIndex = _b[0], setSuggestionIndex = _b[1];
9182
+ var _c = require$$1.useState(search), query = _c[0], setQuery = _c[1];
9183
+ var _d = require$$1.useState(context), contextState = _d[0], setContextState = _d[1];
9184
+ require$$1.useEffect(function () {
8991
9185
  setQuery(search);
8992
9186
  }, [search]);
8993
- React$1.useEffect(function () {
9187
+ require$$1.useEffect(function () {
8994
9188
  setContextState(context);
8995
9189
  }, [context]);
8996
- var suggestionItem = React$1.useMemo(function () { return suggestions ? findItemByIndex_1(suggestions, suggestionIndex) : undefined; }, [suggestions, suggestionIndex]);
8997
- var shift = React$1.useCallback(function (delta) {
9190
+ var suggestionItem = require$$1.useMemo(function () { return suggestions ? findItemByIndex_1(suggestions, suggestionIndex) : undefined; }, [suggestions, suggestionIndex]);
9191
+ var shift = require$$1.useCallback(function (delta) {
8998
9192
  if (suggestions) {
8999
9193
  var len_1 = getItemsLength_1(suggestions);
9000
9194
  setSuggestionIndex(function (index) { return norm(index + delta + ((index < 0 && delta <= 0) ? 1 : 0), len_1); });
@@ -9003,7 +9197,7 @@ function useSuggestions(search, context) {
9003
9197
  setSuggestionIndex(-1);
9004
9198
  }
9005
9199
  }, [suggestions]);
9006
- var execute = React$1.useCallback(function (cmd) {
9200
+ var execute = require$$1.useCallback(function (cmd) {
9007
9201
  switch (cmd) {
9008
9202
  case "prev":
9009
9203
  shift(-1);
@@ -9020,7 +9214,7 @@ function useSuggestions(search, context) {
9020
9214
  }, [shift]);
9021
9215
  var suggestionsResponse = useSuggestionsFetch(query || "", contextState);
9022
9216
  var suggestionsData = suggestionsResponse.state === "success" ? suggestionsResponse.data : undefined;
9023
- var raw = React$1.useMemo(function () {
9217
+ var raw = require$$1.useMemo(function () {
9024
9218
  return suggestionsData ?
9025
9219
  parseSuggestionsResponse_1(suggestionsData, -1).map(function (suggestion) {
9026
9220
  return {
@@ -9029,14 +9223,14 @@ function useSuggestions(search, context) {
9029
9223
  };
9030
9224
  }) : undefined;
9031
9225
  }, [suggestionsData]);
9032
- React$1.useEffect(function () {
9226
+ require$$1.useEffect(function () {
9033
9227
  var prev = suggestionItem;
9034
9228
  setSuggestions(raw);
9035
9229
  if (!prev || !raw) {
9036
9230
  setSuggestionIndex(-1);
9037
9231
  }
9038
9232
  }, [raw, suggestionItem]);
9039
- return React$1.useMemo(function () { return ({
9233
+ return require$$1.useMemo(function () { return ({
9040
9234
  suggestions: suggestions,
9041
9235
  index: suggestionIndex,
9042
9236
  execute: execute,
@@ -9046,11 +9240,11 @@ function useSuggestions(search, context) {
9046
9240
 
9047
9241
  var AdminBar = function (_a) {
9048
9242
  var onAdminJoin = _a.onAdminJoin;
9049
- var name = React$1.useRef(null);
9243
+ var name = require$$1.useRef(null);
9050
9244
  // We can manage this locally
9051
9245
  // const hasAdminJoined = useSelector<ChatState, boolean | undefined>(state => state.hasAdminJoined);
9052
- var _b = React$1.useState(false), joined = _b[0], setJoined = _b[1];
9053
- var _c = React$1.useState(""), inputName = _c[0], setInputName = _c[1];
9246
+ var _b = require$$1.useState(false), joined = _b[0], setJoined = _b[1];
9247
+ var _c = require$$1.useState(""), inputName = _c[0], setInputName = _c[1];
9054
9248
  function handleInputChange(event) {
9055
9249
  setInputName(event.target.value);
9056
9250
  }
@@ -9072,18 +9266,12 @@ var AdminBar = function (_a) {
9072
9266
  }
9073
9267
  }
9074
9268
  function renderJoin() {
9075
- return (React$1.createElement("form", { className: "xappw-admin-input-form", onSubmit: onSubmit },
9076
- React$1.createElement("div", { className: "xappw-admin-input-form__buttons" },
9077
- React$1.createElement(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Join", disable: disable })),
9078
- React$1.createElement("div", { className: "xappw-admin-input" },
9079
- React$1.createElement("input", { ref: name, id: "adminBarInput", placeholder: "Type your name here...", className: "xappw-admin-input__input", onChange: handleInputChange }))));
9269
+ return (require$$0.jsxs("form", { className: "xappw-admin-input-form", onSubmit: onSubmit, children: [require$$0.jsx("div", { className: "xappw-admin-input-form__buttons", children: require$$0.jsx(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Join", disable: disable }) }), require$$0.jsx("div", { className: "xappw-admin-input", children: require$$0.jsx("input", { ref: name, id: "adminBarInput", placeholder: "Type your name here...", className: "xappw-admin-input__input", onChange: handleInputChange }) })] }));
9080
9270
  }
9081
9271
  function renderLeave() {
9082
- return (React$1.createElement("form", { className: "xappw-admin-input-form", onSubmit: onSubmit },
9083
- React$1.createElement("div", { className: "xappw-admin-input-form__buttons" },
9084
- React$1.createElement(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Leave" }))));
9272
+ return (require$$0.jsx("form", { className: "xappw-admin-input-form", onSubmit: onSubmit, children: require$$0.jsx("div", { className: "xappw-admin-input-form__buttons", children: require$$0.jsx(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Leave" }) }) }));
9085
9273
  }
9086
- return (React$1.createElement("div", { className: "xappw-admin-input-container visible" }, joined ? renderLeave() : renderJoin()));
9274
+ return (require$$0.jsx("div", { className: "xappw-admin-input-container visible", children: joined ? renderLeave() : renderJoin() }));
9087
9275
  };
9088
9276
 
9089
9277
  var classnames = {exports: {}};
@@ -9182,39 +9370,32 @@ var MarkdownBuilder = function (_a) {
9182
9370
  var level = hashes.length;
9183
9371
  return "<h".concat(level, ">").concat(headerText, "</h").concat(level, ">");
9184
9372
  });
9185
- return (React$1.createElement("div", { className: containerClass, dangerouslySetInnerHTML: { __html: parsedText } }));
9373
+ return (require$$0.jsx("div", { className: containerClass, dangerouslySetInnerHTML: { __html: parsedText } }));
9186
9374
  };
9187
9375
 
9188
9376
  var ChatBranding = function (_a) {
9189
9377
  var text = _a.text;
9190
9378
  var regex = /\[([^\]]+)\]\((https?:\/\/[^\)]+)\)/;
9191
9379
  var match = text === null || text === void 0 ? void 0 : text.match(regex);
9192
- return match ? React$1.createElement(MarkdownBuilder, { text: text, applyBrandingClass: true, linkColor: "white" })
9193
- :
9194
- React$1.createElement("div", { className: "chat-footer__branding", style: { color: "white" } }, text);
9380
+ return match ? (require$$0.jsx(MarkdownBuilder, { text: text, applyBrandingClass: true, linkColor: "white" })) : (require$$0.jsx("div", { className: "chat-footer__branding", style: { color: "white" }, children: text }));
9195
9381
  };
9196
9382
 
9197
9383
  var CloseIcon = function () {
9198
9384
  // Sergey, I added this style, you will probably want to change it to be more appropriate
9199
- return (React$1.createElement("svg", { style: { color: "grey", paddingRight: "5px" }, xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", viewBox: "0 0 16 16" },
9200
- React$1.createElement("path", { d: "M1.293 1.293a1 1 0 0 1 1.414 0L8 6.586l5.293-5.293a1 1 0 1 1 1.414 1.414L9.414 8l5.293 5.293a1 1 0 0 1-1.414 1.414L8 9.414l-5.293 5.293a1 1 0 0 1-1.414-1.414L6.586 8 1.293 2.707a1 1 0 0 1 0-1.414z" })));
9385
+ return (require$$0.jsx("svg", { style: { color: "grey", paddingRight: "5px" }, xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", viewBox: "0 0 16 16", children: require$$0.jsx("path", { d: "M1.293 1.293a1 1 0 0 1 1.414 0L8 6.586l5.293-5.293a1 1 0 1 1 1.414 1.414L9.414 8l5.293 5.293a1 1 0 0 1-1.414 1.414L8 9.414l-5.293 5.293a1 1 0 0 1-1.414-1.414L6.586 8 1.293 2.707a1 1 0 0 1 0-1.414z" }) }));
9201
9386
  };
9202
9387
 
9203
9388
  var LeftDownArrowIcon = function () {
9204
- return (React$1.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", viewBox: "0 0 16 16" },
9205
- React$1.createElement("path", { fillRule: "evenodd", d: "M2 13.5a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 0-1H3.707L13.854 2.854a.5.5 0 0 0-.708-.708L3 12.293V7.5a.5.5 0 0 0-1 0v6z" })));
9389
+ return (require$$0.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", viewBox: "0 0 16 16", children: require$$0.jsx("path", { fillRule: "evenodd", d: "M2 13.5a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 0-1H3.707L13.854 2.854a.5.5 0 0 0-.708-.708L3 12.293V7.5a.5.5 0 0 0-1 0v6z" }) }));
9206
9390
  };
9207
9391
 
9208
9392
  var SendIcon = function () {
9209
- return (React$1.createElement("svg", { viewBox: "80.208 98.129 313.069 282.823", xmlns: "http://www.w3.org/2000/svg" },
9210
- React$1.createElement("g", { transform: "matrix(0.024498, 0, 0, -0.038359, 79.83091, 381.182404)", fill: "currentColor", stroke: "none" },
9211
- React$1.createElement("path", { d: "M12670 7345 c-63 -18 -272 -77 -465 -130 -192 -53 -478 -132 -635 -175 -508 -141 -1091 -302 -2345 -649 -676 -187 -2038 -563 -3025 -836 -987 -273 -2072 -573 -2410 -666 -338 -94 -802 -222 -1030 -285 -1857 -514 -2579 -714 -2684 -742 -38 -10 -65 -21 -60 -24 5 -3 67 -22 139 -41 72 -20 326 -90 565 -157 239 -67 611 -170 825 -230 215 -60 586 -163 825 -230 239 -67 491 -137 560 -156 l126 -34 974 439 c1397 629 4128 1858 6050 2724 910 410 1826 822 2035 917 209 94 387 173 395 176 35 10 -66 -39 -8200 -3928 -586 -280 -1068 -512 -1071 -516 -3 -4 33 -117 82 -252 76 -213 355 -996 765 -2147 65 -183 120 -330 122 -329 1 2 114 558 250 1236 l248 1233 3455 2064 c1900 1135 3670 2193 3933 2351 264 158 491 293 505 301 62 33 -5 -12 -271 -182 -1671 -1070 -7188 -4613 -7188 -4617 0 -7 3661 -2455 3669 -2454 4 1 3713 6853 3977 7347 8 15 11 27 7 26 -5 0 -60 -15 -123 -34z" }),
9212
- React$1.createElement("path", { d: "M5030 2232 c-15 -61 -479 -1861 -531 -2058 -21 -83 -39 -154 -39 -158 0 -3 369 330 820 740 452 411 817 750 813 754 -11 10 -1025 754 -1039 763 -8 4 -16 -10 -24 -41z" }))));
9393
+ return (require$$0.jsx("svg", { viewBox: "80.208 98.129 313.069 282.823", xmlns: "http://www.w3.org/2000/svg", children: require$$0.jsxs("g", { transform: "matrix(0.024498, 0, 0, -0.038359, 79.83091, 381.182404)", fill: "currentColor", stroke: "none", children: [require$$0.jsx("path", { d: "M12670 7345 c-63 -18 -272 -77 -465 -130 -192 -53 -478 -132 -635 -175 -508 -141 -1091 -302 -2345 -649 -676 -187 -2038 -563 -3025 -836 -987 -273 -2072 -573 -2410 -666 -338 -94 -802 -222 -1030 -285 -1857 -514 -2579 -714 -2684 -742 -38 -10 -65 -21 -60 -24 5 -3 67 -22 139 -41 72 -20 326 -90 565 -157 239 -67 611 -170 825 -230 215 -60 586 -163 825 -230 239 -67 491 -137 560 -156 l126 -34 974 439 c1397 629 4128 1858 6050 2724 910 410 1826 822 2035 917 209 94 387 173 395 176 35 10 -66 -39 -8200 -3928 -586 -280 -1068 -512 -1071 -516 -3 -4 33 -117 82 -252 76 -213 355 -996 765 -2147 65 -183 120 -330 122 -329 1 2 114 558 250 1236 l248 1233 3455 2064 c1900 1135 3670 2193 3933 2351 264 158 491 293 505 301 62 33 -5 -12 -271 -182 -1671 -1070 -7188 -4613 -7188 -4617 0 -7 3661 -2455 3669 -2454 4 1 3713 6853 3977 7347 8 15 11 27 7 26 -5 0 -60 -15 -123 -34z" }), require$$0.jsx("path", { d: "M5030 2232 c-15 -61 -479 -1861 -531 -2058 -21 -83 -39 -154 -39 -158 0 -3 369 330 820 740 452 411 817 750 813 754 -11 10 -1025 754 -1039 763 -8 4 -16 -10 -24 -41z" })] }) }));
9213
9394
  };
9214
9395
 
9215
9396
  var SendButton = function (props) {
9216
9397
  var _a = props.disabled, disabled = _a === void 0 ? false : _a;
9217
- var _b = React$1.useState(false), isHovered = _b[0], setIsHovered = _b[1];
9398
+ var _b = require$$1.useState(false), isHovered = _b[0], setIsHovered = _b[1];
9218
9399
  // Determine which icon to show based on state
9219
9400
  var getIconSrc = function () {
9220
9401
  if (disabled && props.sendButtonIconDisabled) {
@@ -9225,14 +9406,13 @@ var SendButton = function (props) {
9225
9406
  }
9226
9407
  return props.sendButtonIcon;
9227
9408
  };
9228
- return (React$1.createElement(React$1.Fragment, null, !props.sendButtonIcon ? (React$1.createElement(IconButton_1, { className: "xappw-send-button ".concat(props.className || "", " ").concat(disabled ? 'disabled' : ''), tabIndex: props.tabIndex, onClick: disabled ? undefined : props.onClick, icon: SendIcon })) : (React$1.createElement("button", { className: "xappw-custom-send-button ".concat(disabled ? 'disabled' : ''), tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, onClick: props.onClick, disabled: disabled, onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); } },
9229
- React$1.createElement("img", { src: getIconSrc(), alt: "Send button", draggable: false, className: "send-button-icon" })))));
9409
+ return (require$$0.jsx(require$$0.Fragment, { children: !props.sendButtonIcon ? (require$$0.jsx(IconButton_1, { className: "xappw-send-button ".concat(props.className || "", " ").concat(disabled ? 'disabled' : ''), tabIndex: props.tabIndex, onClick: disabled ? undefined : props.onClick, icon: SendIcon })) : (require$$0.jsx("button", { className: "xappw-custom-send-button ".concat(disabled ? 'disabled' : ''), tabIndex: props.tabIndex ? Number(props.tabIndex) : 0, onClick: props.onClick, disabled: disabled, onMouseEnter: function () { return setIsHovered(true); }, onMouseLeave: function () { return setIsHovered(false); }, children: require$$0.jsx("img", { src: getIconSrc(), alt: "Send button", draggable: false, className: "send-button-icon" }) })) }));
9230
9410
  };
9231
9411
 
9232
9412
  var Input = function (props) {
9233
9413
  var _a, _b;
9234
9414
  var value = props.value, placeholder = props.placeholder, sendButtonIcon = props.sendButtonIcon, sendButtonIconHover = props.sendButtonIconHover, sendButtonIconDisabled = props.sendButtonIconDisabled, suggestion = props.suggestion, footerConfig = props.footerConfig, inputConfig = props.inputConfig, onChange = props.onChange, onSubmit = props.onSubmit, onSuggestionCommand = props.onSuggestionCommand;
9235
- var _c = React$1.useState(false), dragover = _c[0], setDragover = _c[1];
9415
+ var _c = require$$1.useState(false), dragover = _c[0], setDragover = _c[1];
9236
9416
  function onDragOver(event) {
9237
9417
  setDragover(true);
9238
9418
  event.preventDefault();
@@ -9245,17 +9425,17 @@ var Input = function (props) {
9245
9425
  function onDragLeave() {
9246
9426
  setDragover(false);
9247
9427
  }
9248
- var handleOnSubmit = React$1.useCallback(function (event) {
9428
+ var handleOnSubmit = require$$1.useCallback(function (event) {
9249
9429
  event && event.preventDefault();
9250
9430
  onSubmit(value); // send to the widget
9251
9431
  }, [value, onSubmit]);
9252
- var handleClear = React$1.useCallback(function () {
9432
+ var handleClear = require$$1.useCallback(function () {
9253
9433
  onChange({
9254
9434
  text: "",
9255
9435
  formats: [],
9256
9436
  });
9257
9437
  }, [onChange]);
9258
- var handleKeyDown = React$1.useCallback(function (event) {
9438
+ var handleKeyDown = require$$1.useCallback(function (event) {
9259
9439
  if (suggestion) {
9260
9440
  if (event.key === "End" || event.key === "ArrowRight" || event.key === "Enter") {
9261
9441
  onChange(suggestion);
@@ -9277,38 +9457,33 @@ var Input = function (props) {
9277
9457
  }
9278
9458
  }
9279
9459
  }, [suggestion, onChange, onSuggestionCommand]);
9280
- return (React$1.createElement("div", { className: "xappw-input-container ".concat(props.addClass, " ").concat(dragover ? "drag-drop-zone" : ""), "aria-label": "To start typing click on rounded rectangle at the bottom of widget. To send your message click icon on right side of rounded rectangle at the bottom of widget" +
9460
+ return (require$$0.jsx("div", { className: "xappw-input-container ".concat(props.addClass, " ").concat(dragover ? "drag-drop-zone" : ""), "aria-label": "To start typing click on rounded rectangle at the bottom of widget. To send your message click icon on right side of rounded rectangle at the bottom of widget" +
9281
9461
  value.text
9282
9462
  ? "To clear input field click on clear icon on the left of send button"
9283
- : "", "aria-hidden": false, onDrop: onDrop, onDragOver: onDragOver, onDragLeave: onDragLeave },
9284
- React$1.createElement("form", { className: "xappw-input-form", onSubmit: handleOnSubmit },
9285
- React$1.createElement(RichInput_1, { key: "input", id: "chatWidgetInput", className: "xappw-input", placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : "type your question here", tabIndex: inputConfig === null || inputConfig === void 0 ? void 0 : inputConfig.tabIndex, onInput: onChange, onChange: onChange, onKeyDown: handleKeyDown,
9286
- // onFocus={onFocus}
9287
- value: value, spellCheck: true }),
9288
- React$1.createElement("div", { className: "xappw-input-form__buttons" },
9289
- value.text && (React$1.createElement(IconButton_1, { icon: CloseIcon, tabIndex: (_a = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.clearButton) === null || _a === void 0 ? void 0 : _a.tabIndex, className: "xappw-input-form__btn", onClick: handleClear })),
9290
- React$1.createElement(SendButton, { className: "xappw-input-form__btn", sendButtonIcon: sendButtonIcon, sendButtonIconHover: sendButtonIconHover, sendButtonIconDisabled: sendButtonIconDisabled, tabIndex: (_b = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.sendButton) === null || _b === void 0 ? void 0 : _b.tabIndex, disabled: !value.text, onClick: handleOnSubmit })))));
9463
+ : "", "aria-hidden": false, onDrop: onDrop, onDragOver: onDragOver, onDragLeave: onDragLeave, children: require$$0.jsxs("form", { className: "xappw-input-form", onSubmit: handleOnSubmit, children: [require$$0.jsx(RichInput_1, { id: "chatWidgetInput", className: "xappw-input", placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : "type your question here", tabIndex: inputConfig === null || inputConfig === void 0 ? void 0 : inputConfig.tabIndex, onInput: onChange, onChange: onChange, onKeyDown: handleKeyDown,
9464
+ // onFocus={onFocus}
9465
+ value: value, spellCheck: true }, "input"), require$$0.jsxs("div", { className: "xappw-input-form__buttons", children: [value.text && (require$$0.jsx(IconButton_1, { icon: CloseIcon, tabIndex: (_a = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.clearButton) === null || _a === void 0 ? void 0 : _a.tabIndex, className: "xappw-input-form__btn", onClick: handleClear })), require$$0.jsx(SendButton, { className: "xappw-input-form__btn", sendButtonIcon: sendButtonIcon, sendButtonIconHover: sendButtonIconHover, sendButtonIconDisabled: sendButtonIconDisabled, tabIndex: (_b = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.sendButton) === null || _b === void 0 ? void 0 : _b.tabIndex, disabled: !value.text, onClick: handleOnSubmit })] })] }) }));
9291
9466
  };
9292
9467
 
9293
9468
  function createActions(onItemUse) {
9294
9469
  return function (innerProps) {
9295
9470
  var data = innerProps.data;
9296
9471
  var canUse = data.type !== "FAQ";
9297
- var handleUse = React$1.useCallback(function (ev) {
9472
+ var handleUse = require$$1.useCallback(function (ev) {
9298
9473
  onItemUse(data);
9299
9474
  ev.stopPropagation();
9300
9475
  }, [data]);
9301
9476
  if (!canUse) {
9302
- return React$1.createElement(React$1.Fragment, null);
9477
+ return require$$0.jsx(require$$0.Fragment, {});
9303
9478
  }
9304
- return (React$1.createElement(IconButton_1, { className: "xappw-suggestions__use", onClick: handleUse, icon: LeftDownArrowIcon }));
9479
+ return (require$$0.jsx(IconButton_1, { className: "xappw-suggestions__use", onClick: handleUse, icon: LeftDownArrowIcon }));
9305
9480
  };
9306
9481
  }
9307
9482
  var Suggestions = function (props) {
9308
9483
  var data = props.data, onItemUse = props.onItemUse, searchTerms = props.searchTerms;
9309
- var _a = React$1.useState(), fixedSuggestions = _a[0], setFixedSuggestions = _a[1];
9310
- var _b = React$1.useState(), activeItem = _b[0], setActiveItem = _b[1];
9311
- React$1.useEffect(function () {
9484
+ var _a = require$$1.useState(), fixedSuggestions = _a[0], setFixedSuggestions = _a[1];
9485
+ var _b = require$$1.useState(), activeItem = _b[0], setActiveItem = _b[1];
9486
+ require$$1.useEffect(function () {
9312
9487
  if (data) {
9313
9488
  setFixedSuggestions(data);
9314
9489
  }
@@ -9319,8 +9494,8 @@ var Suggestions = function (props) {
9319
9494
  }, [data, searchTerms]);
9320
9495
  var len = data === null || data === void 0 ? void 0 : data.length;
9321
9496
  var currentIndex = len > 0 ? props.index : NaN;
9322
- var item = React$1.useMemo(function () { return findItemByIndex_1(data, currentIndex); }, [data, currentIndex]);
9323
- var handleSpanClick = React$1.useCallback(function (target, span) {
9497
+ var item = require$$1.useMemo(function () { return findItemByIndex_1(data, currentIndex); }, [data, currentIndex]);
9498
+ var handleSpanClick = require$$1.useCallback(function (target, span) {
9324
9499
  if (span.type === "inputText") {
9325
9500
  onItemUse(target);
9326
9501
  setActiveItem(undefined);
@@ -9328,32 +9503,30 @@ var Suggestions = function (props) {
9328
9503
  }
9329
9504
  return undefined;
9330
9505
  }, [onItemUse]);
9331
- React$1.useEffect(function () {
9506
+ require$$1.useEffect(function () {
9332
9507
  setActiveItem(item);
9333
9508
  }, [item]);
9334
- var actions = React$1.useMemo(function () { return createActions(onItemUse); }, [onItemUse]);
9509
+ var actions = require$$1.useMemo(function () { return createActions(onItemUse); }, [onItemUse]);
9335
9510
  var transformContent = function (content) {
9336
9511
  var lines = content.split('\n');
9337
9512
  return lines.map(function (line) {
9338
9513
  if (line) {
9339
- return React$1.createElement(MarkdownBuilder, { text: line });
9514
+ return require$$0.jsx(MarkdownBuilder, { text: line });
9340
9515
  }
9341
- return React$1.createElement(React$1.Fragment, null);
9516
+ return require$$0.jsx(require$$0.Fragment, {});
9342
9517
  });
9343
9518
  };
9344
9519
  var containerClass = "xappw-suggestions ".concat(props.className || "", " ").concat(props.hasWsButton ? "xappw-suggestions--with-ws-button" : "").trim();
9345
- return (React$1.createElement("div", { className: containerClass },
9346
- (activeItem === null || activeItem === void 0 ? void 0 : activeItem.content) && React$1.createElement("div", { className: "xappw-suggestions__answer" }, transformContent(activeItem.content)),
9347
- fixedSuggestions && fixedSuggestions.length > 0 &&
9348
- React$1.createElement(SuggestionsList_1, { suggestions: fixedSuggestions, index: currentIndex, className: "xappw-suggestions__groups", itemActions: actions, onItemClick: props.onItemClick, onItemHover: setActiveItem, onSpanClick: handleSpanClick })));
9520
+ return (require$$0.jsxs("div", { className: containerClass, children: [(activeItem === null || activeItem === void 0 ? void 0 : activeItem.content) && require$$0.jsx("div", { className: "xappw-suggestions__answer", children: transformContent(activeItem.content) }), fixedSuggestions && fixedSuggestions.length > 0 &&
9521
+ require$$0.jsx(SuggestionsList_1, { suggestions: fixedSuggestions, index: currentIndex, className: "xappw-suggestions__groups", itemActions: actions, onItemClick: props.onItemClick, onItemHover: setActiveItem, onSpanClick: handleSpanClick })] }));
9349
9522
  };
9350
9523
 
9351
9524
  var ChatFooter = function (props) {
9352
9525
  var _a, _b, _c;
9353
9526
  var isAdmin = props.isAdmin, isChatting = props.isChatting, visible = props.visible, placeholder = props.placeholder, sendButtonIcon = props.sendButtonIcon, sendButtonIconHover = props.sendButtonIconHover, sendButtonIconDisabled = props.sendButtonIconDisabled, footerConfig = props.footerConfig, menuConfig = props.menuConfig, inputConfig = props.inputConfig, hasWsButton = props.hasWsButton, onSubmit = props.onSubmit;
9354
9527
  var innerDispatch = useChatDispatch();
9355
- var _d = React$1.useState(false), drawerOpen = _d[0], setDrawerState = _d[1]; // false initially
9356
- var _e = React$1.useState(), suggestionSearch = _e[0], setSuggestionSearch = _e[1];
9528
+ var _d = require$$1.useState(false), drawerOpen = _d[0], setDrawerState = _d[1]; // false initially
9529
+ var _e = require$$1.useState(), suggestionSearch = _e[0], setSuggestionSearch = _e[1];
9357
9530
  var contexts = reactRedux.useSelector(function (state) { return state.activeContexts; });
9358
9531
  var suggestions = useSuggestions(suggestionSearch, contexts);
9359
9532
  var menuPosition = (menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.menuButtonLocation) || "FOOTER";
@@ -9361,12 +9534,12 @@ var ChatFooter = function (props) {
9361
9534
  var menuItemsRaw = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.items;
9362
9535
  var menuItemsTabIndex = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.itemsTabIndex;
9363
9536
  var menuButtonTabIndex = (_a = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.button) === null || _a === void 0 ? void 0 : _a.tabIndex;
9364
- var menuItems = React$1.useMemo(function () { return menuItemsRaw ? menuItemsRaw : []; }, [menuItemsRaw]);
9537
+ var menuItems = require$$1.useMemo(function () { return menuItemsRaw ? menuItemsRaw : []; }, [menuItemsRaw]);
9365
9538
  var brandingEnabled = (_b = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.branding) === null || _b === void 0 ? void 0 : _b.enabled;
9366
9539
  var brandingText = (_c = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.branding) === null || _c === void 0 ? void 0 : _c.text;
9367
9540
  // If they are NOT an admin, automatically enabled the input
9368
- var _f = React$1.useState(!isAdmin), enableInput = _f[0], setEnableInput = _f[1];
9369
- var _g = React$1.useState({
9541
+ var _f = require$$1.useState(!isAdmin), enableInput = _f[0], setEnableInput = _f[1];
9542
+ var _g = require$$1.useState({
9370
9543
  text: "",
9371
9544
  formats: []
9372
9545
  }), input = _g[0], setInput = _g[1];
@@ -9387,7 +9560,7 @@ var ChatFooter = function (props) {
9387
9560
  setSuggestionSearch(val.text);
9388
9561
  }
9389
9562
  // Clears out suggestion and input text
9390
- var handleSubmit = React$1.useCallback(function (message) {
9563
+ var handleSubmit = require$$1.useCallback(function (message) {
9391
9564
  // Clears out the suggestions
9392
9565
  setSuggestionSearch("");
9393
9566
  // Clears out the input
@@ -9397,29 +9570,20 @@ var ChatFooter = function (props) {
9397
9570
  });
9398
9571
  onSubmit(message.text);
9399
9572
  }, [onSubmit]);
9400
- var handleItemClick = React$1.useCallback(function (data) {
9573
+ var handleItemClick = require$$1.useCallback(function (data) {
9401
9574
  handleSubmit(data);
9402
9575
  }, [handleSubmit]);
9403
- var handleItemUse = React$1.useCallback(function (data) {
9576
+ var handleItemUse = require$$1.useCallback(function (data) {
9404
9577
  setInput(data);
9405
9578
  setSuggestionSearch(data.text);
9406
9579
  }, []);
9407
9580
  var handleAdminJoin = function (status) {
9408
9581
  setEnableInput(status);
9409
9582
  };
9410
- return (React$1.createElement("div", { className: "chat-footer background-footer", "aria-label": menuItems.length ? "to open menu click a button above the rounded rectangle at the bottom of widget" : "", "aria-hidden": false },
9411
- showMenu && menuItems.length ?
9412
- React$1.createElement(React$1.Fragment, null,
9413
- drawerOpen ? React$1.createElement(ChatMenu, { opened: drawerOpen, tabIndex: menuItemsTabIndex, onItemClick: handleMenuItem, items: menuItems }) : React$1.createElement(React$1.Fragment, null),
9414
- React$1.createElement("div", { className: "chat-footer__menu-icon" },
9415
- React$1.createElement(DrawerBars, { tabIndex: menuButtonTabIndex, onToggle: toggleDrawer }))) : React$1.createElement(React$1.Fragment, null),
9416
- React$1.createElement(Suggestions, { className: "xappw-chat-footer__suggestions", data: suggestions.suggestions, index: suggestions.index, searchTerms: suggestionSearch, hasWsButton: hasWsButton, onItemClick: handleItemClick, onItemUse: handleItemUse }),
9417
- isAdmin && isChatting && visible && React$1.createElement(AdminBar, { onAdminJoin: handleAdminJoin }),
9418
- React$1.createElement("div", { style: { pointerEvents: enableInput ? "auto" : "none", opacity: enableInput ? 1 : 0.5 } },
9419
- React$1.createElement(Input, { addClass: "chat-footer__input " + (isChatting && visible ? "visible" : ""), suggestion: suggestions.item, value: input, placeholder: placeholder, sendButtonIcon: sendButtonIcon, sendButtonIconHover: sendButtonIconHover, sendButtonIconDisabled: sendButtonIconDisabled, footerConfig: footerConfig, inputConfig: inputConfig, onSubmit: handleSubmit, onChange: handleChange, onSuggestionCommand: suggestions.execute,
9420
- // onFocus={this.inputOnFocus}
9421
- onFileUpload: props.onFileUpload })),
9422
- brandingEnabled && brandingText && React$1.createElement(ChatBranding, { text: brandingText })));
9583
+ return (require$$0.jsxs("div", { className: "chat-footer background-footer", "aria-label": menuItems.length ? "to open menu click a button above the rounded rectangle at the bottom of widget" : "", "aria-hidden": false, children: [showMenu && menuItems.length ?
9584
+ require$$0.jsxs(require$$0.Fragment, { children: [drawerOpen ? require$$0.jsx(ChatMenu, { opened: drawerOpen, tabIndex: menuItemsTabIndex, onItemClick: handleMenuItem, items: menuItems }) : require$$0.jsx(require$$0.Fragment, {}), require$$0.jsx("div", { className: "chat-footer__menu-icon", children: require$$0.jsx(DrawerBars, { tabIndex: menuButtonTabIndex, onToggle: toggleDrawer }) })] }) : require$$0.jsx(require$$0.Fragment, {}), require$$0.jsx(Suggestions, { className: "xappw-chat-footer__suggestions", data: suggestions.suggestions, index: suggestions.index, searchTerms: suggestionSearch, hasWsButton: hasWsButton, onItemClick: handleItemClick, onItemUse: handleItemUse }), isAdmin && isChatting && visible && require$$0.jsx(AdminBar, { onAdminJoin: handleAdminJoin }), require$$0.jsx("div", { style: { pointerEvents: enableInput ? "auto" : "none", opacity: enableInput ? 1 : 0.5 }, children: require$$0.jsx(Input, { addClass: "chat-footer__input " + (isChatting && visible ? "visible" : ""), suggestion: suggestions.item, value: input, placeholder: placeholder, sendButtonIcon: sendButtonIcon, sendButtonIconHover: sendButtonIconHover, sendButtonIconDisabled: sendButtonIconDisabled, footerConfig: footerConfig, inputConfig: inputConfig, onSubmit: handleSubmit, onChange: handleChange, onSuggestionCommand: suggestions.execute,
9585
+ // onFocus={this.inputOnFocus}
9586
+ onFileUpload: props.onFileUpload }) }), brandingEnabled && brandingText && require$$0.jsx(ChatBranding, { text: brandingText })] }));
9423
9587
  };
9424
9588
 
9425
9589
  var noop = function () { };
@@ -9452,64 +9616,43 @@ var MiddlewareContextFactory = /** @class */ (function () {
9452
9616
 
9453
9617
  var CardContainer = function (props) {
9454
9618
  function renderIcon() {
9455
- var isString = typeof (props.icon) === "string";
9456
- return (React$1.createElement("div", { className: "card-container__icon" }, !isString && props.icon));
9457
- }
9458
- return (React$1.createElement("div", { className: "card-container ".concat(props.addClass) },
9459
- renderIcon(),
9460
- React$1.createElement("div", { className: "card-container__content ".concat(props.contentAddClass) },
9461
- React$1.createElement("div", { className: "card-container__title" }, props.title),
9462
- props.children)));
9619
+ var isString = typeof props.icon === "string";
9620
+ return require$$0.jsx("div", { className: "card-container__icon", children: !isString && props.icon });
9621
+ }
9622
+ return (require$$0.jsxs("div", { className: "card-container ".concat(props.addClass), children: [renderIcon(), require$$0.jsxs("div", { className: "card-container__content ".concat(props.contentAddClass), children: [require$$0.jsx("div", { className: "card-container__title", children: props.title }), props.children] })] }));
9463
9623
  };
9464
9624
 
9465
- var defaultProps$2 = {
9466
- agent: {},
9467
- hasRating: false,
9468
- shouldDisplay: true,
9469
- onRate: function () {
9625
+ var ChatRating = function (_a) {
9626
+ var _b = _a.agent, agent = _b === void 0 ? {} : _b, _c = _a.hasRating, hasRating = _c === void 0 ? false : _c, _d = _a.shouldDisplay, shouldDisplay = _d === void 0 ? true : _d, _e = _a.onRate, onRate = _e === void 0 ? function () {
9470
9627
  // no-op
9471
- }
9472
- };
9473
- var ChatRating = function (props) {
9474
- if (props === void 0) { props = defaultProps$2; }
9475
- var onRate = props.onRate;
9476
- var rateBadButtonOnClick = React$1.useCallback(function () {
9628
+ } : _e;
9629
+ var rateBadButtonOnClick = require$$1.useCallback(function () {
9477
9630
  onRate("bad");
9478
9631
  }, [onRate]);
9479
- var rateGoodButtonOnClick = React$1.useCallback(function () {
9632
+ var rateGoodButtonOnClick = require$$1.useCallback(function () {
9480
9633
  onRate("good");
9481
9634
  }, [onRate]);
9482
- var rateAgainButtonOnClick = React$1.useCallback(function () {
9635
+ var rateAgainButtonOnClick = require$$1.useCallback(function () {
9483
9636
  onRate(undefined);
9484
9637
  }, [onRate]);
9485
9638
  // Do not think this prop should be here
9486
- if (!props.shouldDisplay) {
9639
+ if (!shouldDisplay) {
9487
9640
  return null;
9488
9641
  }
9489
- if (!props.hasRating) {
9490
- return (React$1.createElement(CardContainer, { title: "Chat Rating", addClass: "chat-rating-card" },
9491
- props.agent.displayName,
9492
- " has requested you to rate the chat service.",
9493
- React$1.createElement("div", { className: "buttons-container" },
9494
- React$1.createElement(ActionButton, { addClass: "button button-rate-bad", label: "Rate Bad", onClick: rateBadButtonOnClick }),
9495
- React$1.createElement(ActionButton, { addClass: "button button-rate-good", label: "Rate Good", onClick: rateGoodButtonOnClick }))));
9642
+ if (!hasRating) {
9643
+ return (require$$0.jsxs(CardContainer, { title: "Chat Rating", addClass: "chat-rating-card", children: [agent.displayName, " has requested you to rate the chat service.", require$$0.jsxs("div", { className: "buttons-container", children: [require$$0.jsx(ActionButton, { addClass: "button button-rate-bad", label: "Rate Bad", onClick: rateBadButtonOnClick }), require$$0.jsx(ActionButton, { addClass: "button button-rate-good", label: "Rate Good", onClick: rateGoodButtonOnClick })] })] }));
9496
9644
  }
9497
9645
  else {
9498
- return (React$1.createElement(CardContainer, { title: "Chat Rating", addClass: "chat-rating-card" },
9499
- "You have rated the chat service.",
9500
- React$1.createElement("div", { className: "buttons-container" },
9501
- React$1.createElement(ActionButton, { addClass: "button button-rate-again", label: "Rate again", onClick: rateAgainButtonOnClick }))));
9646
+ return (require$$0.jsxs(CardContainer, { title: "Chat Rating", addClass: "chat-rating-card", children: ["You have rated the chat service.", require$$0.jsx("div", { className: "buttons-container", children: require$$0.jsx(ActionButton, { addClass: "button button-rate-again", label: "Rate again", onClick: rateAgainButtonOnClick }) })] }));
9502
9647
  }
9503
9648
  };
9504
9649
 
9505
9650
  var ChatRatingContainer = function (props) {
9506
9651
  var dispatch = useChatServerDispatch();
9507
- var handleRate = React$1.useCallback(function (rating) {
9652
+ var handleRate = require$$1.useCallback(function (rating) {
9508
9653
  dispatch(sendChatRating(rating));
9509
9654
  }, [dispatch]);
9510
- return (React$1.createElement(React$1.Fragment, null,
9511
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + " system message"),
9512
- React$1.createElement(ChatRating, { agent: props.agent, hasRating: props.hasRating, shouldDisplay: props.shouldDisplay, onRate: handleRate })));
9655
+ return (require$$0.jsxs(require$$0.Fragment, { children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + " system message" }), require$$0.jsx(ChatRating, { agent: props.agent, hasRating: props.hasRating, shouldDisplay: props.shouldDisplay, onRate: handleRate })] }));
9513
9656
  };
9514
9657
 
9515
9658
  var dateFns = {};
@@ -31005,9 +31148,9 @@ function compileSlotValues(responseOutput, slots, replaceWhenUndefined) {
31005
31148
 
31006
31149
  var FailureMessage = function (props) {
31007
31150
  var agents = props.agents, text = props.text, delay = props.delay, time = props.time;
31008
- var _a = React$1.useState(delay), countdown = _a[0], setCountdown = _a[1];
31151
+ var _a = require$$1.useState(delay), countdown = _a[0], setCountdown = _a[1];
31009
31152
  var agent_names = Object.values(agents).filter(function (agent) { return agent.requestFailed; });
31010
- React$1.useEffect(function () {
31153
+ require$$1.useEffect(function () {
31011
31154
  if (delay !== 0) {
31012
31155
  var countdownValue_1 = delay;
31013
31156
  var myInterval_1 = setInterval(function () {
@@ -31022,7 +31165,7 @@ var FailureMessage = function (props) {
31022
31165
  setCountdown(5);
31023
31166
  }
31024
31167
  }, [delay]);
31025
- var slots = React$1.useMemo(function () {
31168
+ var slots = require$$1.useMemo(function () {
31026
31169
  return {
31027
31170
  sec: {
31028
31171
  name: "sec",
@@ -31030,35 +31173,30 @@ var FailureMessage = function (props) {
31030
31173
  },
31031
31174
  };
31032
31175
  }, [countdown]);
31033
- var failureMessage = React$1.useMemo(function () {
31176
+ var failureMessage = require$$1.useMemo(function () {
31034
31177
  return compileSlotValues(text, slots);
31035
31178
  }, [text, slots]);
31036
31179
  if (countdown === 0) {
31037
- return React$1.createElement(React$1.Fragment, null);
31180
+ return require$$0.jsx(require$$0.Fragment, {});
31038
31181
  }
31039
- return (React$1.createElement(React$1.Fragment, null, agent_names.map(function (agent) {
31040
- var _a, _b;
31041
- return (React$1.createElement("div", { className: "chat-msg-container-wrapper", key: "failure-msg-".concat((_a = agent === null || agent === void 0 ? void 0 : agent.user) === null || _a === void 0 ? void 0 : _a.nick) },
31042
- React$1.createElement("div", { className: "chat-msg-container agent", key: (_b = agent === null || agent === void 0 ? void 0 : agent.user) === null || _b === void 0 ? void 0 : _b.nick },
31043
- React$1.createElement(ChatMessagePart, { user: agent === null || agent === void 0 ? void 0 : agent.user, showAvatar: true },
31044
- React$1.createElement("div", { className: "chat-msg" },
31045
- React$1.createElement(ChatMessageBubble, { owner: "others", hasTail: true },
31046
- React$1.createElement("span", { className: "message-sr-only" }, "at " + time + " the bot said"),
31047
- React$1.createElement("span", null, typeof failureMessage === "object" ? failureMessage.displayText : failureMessage)))))));
31048
- })));
31182
+ return (require$$0.jsx(require$$0.Fragment, { children: agent_names.map(function (agent) {
31183
+ var _a, _b;
31184
+ return (require$$0.jsx("div", { className: "chat-msg-container-wrapper", children: require$$0.jsx("div", { className: "chat-msg-container agent", children: require$$0.jsx(ChatMessagePart, { user: agent === null || agent === void 0 ? void 0 : agent.user, showAvatar: true, children: require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsxs(ChatMessageBubble, { owner: "others", hasTail: true, children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + time + " the bot said" }), require$$0.jsx("span", { children: typeof failureMessage === "object"
31185
+ ? failureMessage.displayText
31186
+ : failureMessage })] }) }) }) }, (_a = agent === null || agent === void 0 ? void 0 : agent.user) === null || _a === void 0 ? void 0 : _a.nick) }, "failure-msg-".concat((_b = agent === null || agent === void 0 ? void 0 : agent.user) === null || _b === void 0 ? void 0 : _b.nick)));
31187
+ }) }));
31049
31188
  };
31050
31189
 
31051
31190
  var MessageSvg = function (_) {
31052
- return (React$1.createElement("svg", { className: "message-svg", width: "16", height: "12", viewBox: "0 0 16 12" },
31053
- React$1.createElement("path", { d: "M14.4 0H1.6C.72 0 .008.675.008 1.5L0 10.5c0 .825.72 1.5 1.6 1.5h12.8c.88 0 1.6-.675 1.6-1.5v-9c0-.825-.72-1.5-1.6-1.5zm0 3L8 6.75 1.6 3V1.5L8 5.25l6.4-3.75V3z", fill: "#424242", fillRule: "evenodd" })));
31191
+ return (require$$0.jsx("svg", { className: "message-svg", width: "16", height: "12", viewBox: "0 0 16 12", children: require$$0.jsx("path", { d: "M14.4 0H1.6C.72 0 .008.675.008 1.5L0 10.5c0 .825.72 1.5 1.6 1.5h12.8c.88 0 1.6-.675 1.6-1.5v-9c0-.825-.72-1.5-1.6-1.5zm0 3L8 6.75 1.6 3V1.5L8 5.25l6.4-3.75V3z", fill: "#424242", fillRule: "evenodd" }) }));
31054
31192
  };
31055
31193
 
31056
31194
  var MessageForm = function (props) {
31057
- var name = React$1.useRef(null);
31058
- var email = React$1.useRef(null);
31059
- var message = React$1.useRef(null);
31060
- var form = React$1.useRef(null);
31061
- var _a = React$1.useState(false), sent = _a[0], setSent = _a[1];
31195
+ var name = require$$1.useRef(null);
31196
+ var email = require$$1.useRef(null);
31197
+ var message = require$$1.useRef(null);
31198
+ var form = require$$1.useRef(null);
31199
+ var _a = require$$1.useState(false), sent = _a[0], setSent = _a[1];
31062
31200
  function emailChanged() {
31063
31201
  var _a, _b, _c;
31064
31202
  if ((_a = email.current) === null || _a === void 0 ? void 0 : _a.validity.patternMismatch) {
@@ -31078,7 +31216,7 @@ var MessageForm = function (props) {
31078
31216
  props.onSubmit({
31079
31217
  name: (_c = name.current) === null || _c === void 0 ? void 0 : _c.value,
31080
31218
  email: (_d = email.current) === null || _d === void 0 ? void 0 : _d.value,
31081
- message: (_e = message.current) === null || _e === void 0 ? void 0 : _e.value
31219
+ message: (_e = message.current) === null || _e === void 0 ? void 0 : _e.value,
31082
31220
  });
31083
31221
  setSent(true);
31084
31222
  }
@@ -31086,56 +31224,40 @@ var MessageForm = function (props) {
31086
31224
  setSent(false);
31087
31225
  }
31088
31226
  function renderSent() {
31089
- return (React$1.createElement("div", { key: "sent", className: "message-form--sent" },
31090
- "Your message has been sent. We will get back to you as soon as possible.",
31091
- React$1.createElement(ActionButton, { addClass: "button-resend", label: "Send another", onClick: sendAnother })));
31227
+ return (require$$0.jsxs("div", { className: "message-form--sent", children: ["Your message has been sent. We will get back to you as soon as possible.", require$$0.jsx(ActionButton, { addClass: "button-resend", label: "Send another", onClick: sendAnother })] }, "sent"));
31092
31228
  }
31093
31229
  function renderForm() {
31094
- return (React$1.createElement("form", { ref: form, key: "not-sent", className: "message-form", onSubmit: send },
31095
- React$1.createElement("div", { className: "content" },
31096
- React$1.createElement("div", { className: "section" },
31097
- React$1.createElement("label", { className: "label" }, "Name"),
31098
- React$1.createElement("input", { ref: name, maxLength: 255 })),
31099
- React$1.createElement("div", { className: "section" },
31100
- React$1.createElement("label", { className: "label" }, "Email"),
31101
- React$1.createElement("input", { ref: email, onChange: emailChanged, type: "email", required: true, pattern: EMAIL_REGEX })),
31102
- React$1.createElement("div", { className: "section" },
31103
- React$1.createElement("label", { className: "label" }, "Message"),
31104
- React$1.createElement("textarea", { required: true, ref: message }))),
31105
- React$1.createElement("div", { className: "button-container" },
31106
- React$1.createElement(ActionButton, { type: "submit", addClass: "message-form__submit", label: "Send" }))));
31107
- }
31108
- return (React$1.createElement(CardContainer, { title: props.title, addClass: "offline-card", contentAddClass: sent ? "sent" : "", icon: React$1.createElement(MessageSvg, null) }, sent ? renderSent() : renderForm()));
31230
+ return (require$$0.jsxs("form", { ref: form, className: "message-form", onSubmit: send, children: [require$$0.jsxs("div", { className: "content", children: [require$$0.jsxs("div", { className: "section", children: [require$$0.jsx("label", { className: "label", children: "Name" }), require$$0.jsx("input", { ref: name, maxLength: 255 })] }), require$$0.jsxs("div", { className: "section", children: [require$$0.jsx("label", { className: "label", children: "Email" }), require$$0.jsx("input", { ref: email, onChange: emailChanged, type: "email", required: true, pattern: EMAIL_REGEX })] }), require$$0.jsxs("div", { className: "section", children: [require$$0.jsx("label", { className: "label", children: "Message" }), require$$0.jsx("textarea", { required: true, ref: message })] })] }), require$$0.jsx("div", { className: "button-container", children: require$$0.jsx(ActionButton, { type: "submit", addClass: "message-form__submit", label: "Send" }) })] }, "not-sent"));
31231
+ }
31232
+ return (require$$0.jsx(CardContainer, { title: props.title, addClass: "offline-card", contentAddClass: sent ? "sent" : "", icon: require$$0.jsx(MessageSvg, {}), children: sent ? renderSent() : renderForm() }));
31109
31233
  };
31110
31234
 
31111
31235
  var OfflineForm = function (props) {
31112
- return React$1.createElement(MessageForm, { title: "Offline message card title", onSubmit: props.onSubmit });
31236
+ return require$$0.jsx(MessageForm, { title: "Offline message card title", onSubmit: props.onSubmit });
31113
31237
  };
31114
31238
 
31115
31239
  var OfflineFormContainer = function (props) {
31116
31240
  var dispatch = useChatServerDispatch();
31117
- var handleSubmit = React$1.useCallback(function (data) {
31241
+ var handleSubmit = require$$1.useCallback(function (data) {
31118
31242
  dispatch(sendOfflineMsg(data));
31119
31243
  }, [dispatch]);
31120
- return (React$1.createElement(React$1.Fragment, null,
31121
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + " system message"),
31122
- React$1.createElement(OfflineForm, { onSubmit: handleSubmit })));
31244
+ return (require$$0.jsxs(require$$0.Fragment, { children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + " system message" }), require$$0.jsx(OfflineForm, { onSubmit: handleSubmit })] }));
31123
31245
  };
31124
31246
 
31125
31247
  var PrechatForm = function (props) {
31126
- var _a = React$1.useState(false), sent = _a[0], setSent = _a[1];
31248
+ var _a = require$$1.useState(false), sent = _a[0], setSent = _a[1];
31127
31249
  var onSubmit = props.onSubmit;
31128
- var handleSubmit = React$1.useCallback(function (msg) {
31250
+ var handleSubmit = require$$1.useCallback(function (msg) {
31129
31251
  onSubmit(msg);
31130
31252
  setSent(true);
31131
31253
  }, [onSubmit]);
31132
- return (React$1.createElement(React$1.Fragment, null, !sent && React$1.createElement(MessageForm, { title: "Introduce yourself!", onSubmit: handleSubmit })));
31254
+ return require$$0.jsx(require$$0.Fragment, { children: !sent && require$$0.jsx(MessageForm, { title: "Introduce yourself!", onSubmit: handleSubmit }) });
31133
31255
  };
31134
31256
 
31135
31257
  var PrechatFormContainer = function (props) {
31136
31258
  var dispatch = useChatServerDispatch();
31137
31259
  var sessionId = reactRedux.useSelector(function (state) { return state.sessionId; });
31138
- var handleSubmit = React$1.useCallback(function (data) {
31260
+ var handleSubmit = require$$1.useCallback(function (data) {
31139
31261
  // Don't send empty messages
31140
31262
  if (!data.message)
31141
31263
  return;
@@ -31145,34 +31267,34 @@ var PrechatFormContainer = function (props) {
31145
31267
  }, sessionId));
31146
31268
  dispatch(executeAction(data.message));
31147
31269
  }, [dispatch, sessionId]);
31148
- return (React$1.createElement(React$1.Fragment, null,
31149
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + " system message"),
31150
- React$1.createElement(PrechatForm, { onSubmit: handleSubmit })));
31270
+ return (require$$0.jsxs(require$$0.Fragment, { children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + " system message" }), require$$0.jsx(PrechatForm, { onSubmit: handleSubmit })] }));
31151
31271
  };
31152
31272
 
31153
- var defaultProps$1 = {
31154
- position: 0
31155
- };
31156
- var QueuePosition = function (props) {
31157
- if (props === void 0) { props = defaultProps$1; }
31158
- if (props.position <= 0)
31273
+ var QueuePosition = function (_a) {
31274
+ var _b = _a.position, position = _b === void 0 ? 0 : _b;
31275
+ if (position <= 0)
31159
31276
  return null;
31160
- return (React$1.createElement("div", { className: "system-msg-container" },
31161
- React$1.createElement("span", { className: "system-msg" },
31162
- "Queue position: ",
31163
- props.position)));
31277
+ return (require$$0.jsx("div", { className: "system-msg-container", children: require$$0.jsxs("span", { className: "system-msg", children: ["Queue position: ", position] }) }));
31164
31278
  };
31165
31279
 
31166
31280
  function isServerUser(user) {
31167
31281
  var _a;
31168
31282
  return (_a = user.nick) === null || _a === void 0 ? void 0 : _a.endsWith(ROUTER_USER);
31169
31283
  }
31284
+ function shouldShowDivider(message) {
31285
+ return (message.type === "chat.memberjoin" && message.showDivider) ||
31286
+ (message.type === "chat.memberleave" && message.showDivider);
31287
+ }
31170
31288
  function getMessageByType(msg) {
31171
31289
  switch (msg.type) {
31172
31290
  case "chat.memberjoin":
31173
- return "".concat(msg.user.displayName || "Bot", " has joined the chat");
31291
+ // Use custom message if provided, otherwise use default
31292
+ return msg.message || "".concat(msg.user.displayName || "Bot", " has joined the chat");
31174
31293
  case "chat.memberleave":
31175
- return "".concat(msg.user.displayName || "Bot", " has left the chat");
31294
+ // Use custom message if provided, otherwise use default
31295
+ return msg.message || "".concat(msg.user.displayName || "Bot", " has left the chat");
31296
+ case "chat.systemmessage":
31297
+ return msg.message;
31176
31298
  case "chat.rating":
31177
31299
  if (!msg.newRating) {
31178
31300
  return "You have removed the chat rating";
@@ -31186,10 +31308,12 @@ function getMessageByType(msg) {
31186
31308
  }
31187
31309
  }
31188
31310
  var SystemMessage = function (props) {
31311
+ var _a;
31189
31312
  if (!isServerUser(props.message.user)) {
31190
- return (React$1.createElement("div", { className: "system-msg-container" },
31191
- React$1.createElement("span", { className: "message-sr-only" }, "at " + props.time + " system message"),
31192
- React$1.createElement("span", { className: "system-msg" }, getMessageByType(props.message))));
31313
+ var message = props.message;
31314
+ var showDivider = shouldShowDivider(message);
31315
+ var avatarUrl = (_a = message.user) === null || _a === void 0 ? void 0 : _a.avatarPath;
31316
+ return (require$$0.jsxs("div", { className: "system-msg-container", children: [showDivider && avatarUrl && (require$$0.jsxs("div", { className: "system-msg-divider", children: [require$$0.jsx("div", { className: "divider-line" }), require$$0.jsx("div", { className: "divider-avatar", children: require$$0.jsx("img", { src: avatarUrl, alt: "".concat(message.user.displayName || "User", "'s avatar") }) }), require$$0.jsx("div", { className: "divider-line" })] })), require$$0.jsx("span", { className: "message-sr-only", children: "at " + props.time + " system message" }), require$$0.jsx("span", { className: "system-msg", children: getMessageByType(props.message) })] }));
31193
31317
  }
31194
31318
  else {
31195
31319
  return null;
@@ -31200,10 +31324,7 @@ function convertToSentenceCase(s) {
31200
31324
  }
31201
31325
 
31202
31326
  var TypingIndicator = function (_) {
31203
- return (React$1.createElement("div", { className: "typing-indicator" },
31204
- React$1.createElement("div", { className: "typing-indicator-part" }),
31205
- React$1.createElement("div", { className: "typing-indicator-part" }),
31206
- React$1.createElement("div", { className: "typing-indicator-part" })));
31327
+ return (require$$0.jsxs("div", { className: "typing-indicator", children: [require$$0.jsx("div", { className: "typing-indicator-part" }), require$$0.jsx("div", { className: "typing-indicator-part" }), require$$0.jsx("div", { className: "typing-indicator-part" })] }));
31207
31328
  };
31208
31329
 
31209
31330
  /**
@@ -31211,64 +31332,41 @@ var TypingIndicator = function (_) {
31211
31332
  */
31212
31333
  var TypingStatus = function (props) {
31213
31334
  var agentsTyping = Object.values(props.agents).filter(function (agent) { return agent.typing; });
31214
- return (React$1.createElement(React$1.Fragment, null, agentsTyping.map(function (agent, index) {
31215
- var _a, _b;
31216
- var key = ((_a = agent.user) === null || _a === void 0 ? void 0 : _a.nick) || "".concat(index);
31217
- var displayName = ((_b = agent.user) === null || _b === void 0 ? void 0 : _b.displayName) || "Somebody";
31218
- return (React$1.createElement("span", { key: "typing-status-".concat(index) }, !props.textTypingStatusEnabled ? (React$1.createElement("div", { className: "chat-msg-container-wrapper", key: "typing-status-".concat(key) },
31219
- React$1.createElement("div", { key: key, className: "chat-msg-container agent chat-typing-progress" },
31220
- React$1.createElement(ChatMessagePart, { user: agent.user, showAvatar: true },
31221
- React$1.createElement("div", { className: "chat-msg" },
31222
- React$1.createElement(ChatMessageBubble, { owner: "others", hasTail: true },
31223
- React$1.createElement(TypingIndicator, null))))))) : (React$1.createElement("div", { key: "typing-status-".concat(key), className: "chat-msg-agent-typing" },
31224
- displayName,
31225
- " is typing"))));
31226
- })));
31335
+ return (require$$0.jsx(require$$0.Fragment, { children: agentsTyping.map(function (agent, index) {
31336
+ var _a, _b;
31337
+ var key = ((_a = agent.user) === null || _a === void 0 ? void 0 : _a.nick) || "".concat(index);
31338
+ var displayName = ((_b = agent.user) === null || _b === void 0 ? void 0 : _b.displayName) || "Somebody";
31339
+ return (require$$0.jsx("span", { children: !props.textTypingStatusEnabled ? (require$$0.jsx("div", { className: "chat-msg-container-wrapper", children: require$$0.jsx("div", { className: "chat-msg-container agent chat-typing-progress", children: require$$0.jsx(ChatMessagePart, { user: agent.user, showAvatar: true, children: require$$0.jsx("div", { className: "chat-msg", children: require$$0.jsx(ChatMessageBubble, { owner: "others", hasTail: true, children: require$$0.jsx(TypingIndicator, {}) }) }) }) }, key) }, "typing-status-".concat(key))) : (require$$0.jsxs("div", { className: "chat-msg-agent-typing", children: [displayName, " is typing"] }, "typing-status-".concat(key))) }, "typing-status-".concat(index)));
31340
+ }) }));
31227
31341
  };
31228
31342
 
31229
- var defaultProps = {
31230
- visible: true,
31231
- messages: [],
31232
- agents: {},
31233
- isOffline: true,
31234
- isChatting: false,
31235
- queuePosition: 0,
31236
- lastRatingRequestTimestamp: 0,
31237
- hasRating: false,
31238
- visitorId: "",
31239
- onSend: function () { return Promise.resolve(); },
31240
- onWrite: function () { return Promise.resolve(); },
31241
- onOpenUrl: function () { },
31242
- minimizeOnClick: function () { },
31243
- };
31244
- var MessageList = function (props) {
31245
- if (props === void 0) { props = defaultProps; }
31246
- var onSend = props.onSend, onWrite = props.onWrite, onOpenUrl = props.onOpenUrl, minimizeOnClick = props.minimizeOnClick;
31247
- var messagesEndRef = React$1.useRef(null);
31248
- var containerRef = React$1.useRef(null);
31249
- var prevHasWsButtonRef = React$1.useRef(props.hasWsButton);
31343
+ var MessageList = function (_a) {
31344
+ _a.visible; var _c = _a.messages, messages = _c === void 0 ? [] : _c, _d = _a.agents, agents = _d === void 0 ? {} : _d; _a.isOffline; _a.isChatting; var _g = _a.queuePosition, queuePosition = _g === void 0 ? 0 : _g, _h = _a.lastRatingRequestTimestamp, lastRatingRequestTimestamp = _h === void 0 ? 0 : _h, _j = _a.hasRating, hasRating = _j === void 0 ? false : _j; _a.visitorId; var messageMiddleware = _a.messageMiddleware, textTypingStatusEnabled = _a.textTypingStatusEnabled, agent = _a.agent, hasWsButton = _a.hasWsButton, _l = _a.onSend, onSend = _l === void 0 ? function () { return Promise.resolve(); } : _l, _m = _a.onWrite, onWrite = _m === void 0 ? function () { return Promise.resolve(); } : _m, _o = _a.onOpenUrl, onOpenUrl = _o === void 0 ? function () { } : _o, _p = _a.minimizeOnClick, minimizeOnClick = _p === void 0 ? function () { } : _p; _a.children;
31345
+ var messagesEndRef = require$$1.useRef(null);
31346
+ var containerRef = require$$1.useRef(null);
31347
+ var prevHasWsButtonRef = require$$1.useRef(hasWsButton);
31250
31348
  // Check if user is scrolled to bottom
31251
- var isAtBottom = React$1.useCallback(function () {
31349
+ var isAtBottom = require$$1.useCallback(function () {
31252
31350
  if (!containerRef.current)
31253
31351
  return true;
31254
31352
  var _a = containerRef.current, scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;
31255
31353
  return Math.abs(scrollHeight - clientHeight - scrollTop) < 10;
31256
31354
  }, []);
31257
31355
  // Scroll to bottom
31258
- var scrollToBottom = React$1.useCallback(function (behavior) {
31356
+ var scrollToBottom = require$$1.useCallback(function (behavior) {
31259
31357
  if (behavior === void 0) { behavior = "smooth"; }
31260
31358
  if (messagesEndRef.current) {
31261
31359
  messagesEndRef.current.scrollIntoView({ behavior: behavior });
31262
31360
  }
31263
31361
  }, []);
31264
31362
  // Always scroll to bottom when messages change
31265
- React$1.useEffect(function () {
31363
+ require$$1.useEffect(function () {
31266
31364
  scrollToBottom("smooth");
31267
- }, [props.messages, props.agents, scrollToBottom]);
31365
+ }, [messages, agents, scrollToBottom]);
31268
31366
  // Handle WS button dismissal - only scroll when button is removed
31269
- React$1.useEffect(function () {
31367
+ require$$1.useEffect(function () {
31270
31368
  var prevHasButton = prevHasWsButtonRef.current;
31271
- var currentHasButton = props.hasWsButton;
31369
+ var currentHasButton = hasWsButton;
31272
31370
  // Update ref for next render
31273
31371
  prevHasWsButtonRef.current = currentHasButton;
31274
31372
  // Only handle button dismissal (was true, now false)
@@ -31283,16 +31381,16 @@ var MessageList = function (props) {
31283
31381
  }
31284
31382
  }
31285
31383
  return undefined;
31286
- }, [props.hasWsButton, isAtBottom, scrollToBottom]);
31287
- var handleSend = React$1.useCallback(function (msg) {
31384
+ }, [hasWsButton, isAtBottom, scrollToBottom]);
31385
+ var handleSend = require$$1.useCallback(function (msg) {
31288
31386
  onSend(msg);
31289
31387
  messagesEndRef.current.scrollIntoView({ behavior: "smooth" });
31290
31388
  }, [onSend]);
31291
- var handleWrite = React$1.useCallback(function (msg) {
31389
+ var handleWrite = require$$1.useCallback(function (msg) {
31292
31390
  onWrite(msg);
31293
31391
  messagesEndRef.current.scrollIntoView({ behavior: "smooth" });
31294
31392
  }, [onWrite]);
31295
- var ctxCache = React$1.useMemo(function () {
31393
+ var ctxCache = require$$1.useMemo(function () {
31296
31394
  return new MiddlewareContextFactory({
31297
31395
  send: handleSend,
31298
31396
  write: handleWrite,
@@ -31315,7 +31413,7 @@ var MessageList = function (props) {
31315
31413
  user = msg.user;
31316
31414
  }
31317
31415
  else {
31318
- user = ((_c = props.agents[msg.user.nick]) === null || _c === void 0 ? void 0 : _c.user) || props.agent;
31416
+ user = ((_c = agents[msg.user.nick]) === null || _c === void 0 ? void 0 : _c.user) || agent;
31319
31417
  // Still nothing?
31320
31418
  if (!user) {
31321
31419
  log("Could not get a user from agents list with nick: \"".concat(msg.user.nick, "\""));
@@ -31325,26 +31423,23 @@ var MessageList = function (props) {
31325
31423
  switch (msg.type) {
31326
31424
  case "chat.file":
31327
31425
  case "chat.msg":
31328
- return (React$1.createElement(ChatMessage, { key: "cm-".concat(msg.type, "-").concat(msg.timestamp), message: msg, sibling: sibling, agent: user, messageMiddleware: props.messageMiddleware, middlewareContext: ctxCache.resolve(user), minimizeOnClick: minimizeOnClick }));
31426
+ return (require$$0.jsx(ChatMessage, { message: msg, sibling: sibling, agent: user, messageMiddleware: messageMiddleware, middlewareContext: ctxCache.resolve(user), minimizeOnClick: minimizeOnClick }, "cm-".concat(msg.type, "-").concat(msg.timestamp)));
31329
31427
  case "chat.failureMsg":
31330
- return (React$1.createElement(FailureMessage, __assign({ key: "fm-".concat(msg.type, "-").concat(msg.timestamp), agents: props.agents, time: time }, msg.failureMsg)));
31428
+ return (require$$0.jsx(FailureMessage, __assign({ agents: agents, time: time }, msg.failureMsg), "fm-".concat(msg.type, "-").concat(msg.timestamp)));
31331
31429
  case "chat.memberjoin":
31332
31430
  case "chat.memberleave":
31431
+ case "chat.systemmessage":
31333
31432
  case "chat.rating":
31334
31433
  case "chat.typing":
31335
- return (React$1.createElement(SystemMessage, { key: "sm-".concat(msg.type, "-").concat(msg.timestamp), time: time, message: msg }));
31434
+ return (require$$0.jsx(SystemMessage, { time: time, message: msg }, "sm-".concat(msg.type, "-").concat(msg.timestamp)));
31336
31435
  case "chat.request.rating":
31337
- return (React$1.createElement(ChatRatingContainer, { key: "cr-".concat(msg.type, "-").concat(msg.timestamp), agent: user, hasRating: props.hasRating, time: time, shouldDisplay: msg.timestamp === props.lastRatingRequestTimestamp }));
31436
+ return (require$$0.jsx(ChatRatingContainer, { agent: user, hasRating: hasRating, time: time, shouldDisplay: msg.timestamp === lastRatingRequestTimestamp }, "cr-".concat(msg.type, "-").concat(msg.timestamp)));
31338
31437
  case "chat.offline":
31339
- return React$1.createElement(OfflineFormContainer, { key: "offline-".concat(msg.timestamp), time: time });
31438
+ return require$$0.jsx(OfflineFormContainer, { time: time }, "offline-".concat(msg.timestamp));
31340
31439
  case "chat.prechat":
31341
- return React$1.createElement(PrechatFormContainer, { key: "prechat", time: time });
31440
+ return require$$0.jsx(PrechatFormContainer, { time: time }, "prechat");
31342
31441
  default:
31343
- return (React$1.createElement("span", { key: "default-".concat(msg.timestamp) },
31344
- React$1.createElement("span", { className: "message-sr-only" }, "at " + time + " system message"),
31345
- React$1.createElement("div", { key: "uhm-".concat(+new Date()) },
31346
- "Unhandled message: ",
31347
- JSON.stringify(msg))));
31442
+ return (require$$0.jsxs("span", { children: [require$$0.jsx("span", { className: "message-sr-only", children: "at " + time + " system message" }), require$$0.jsxs("div", { children: ["Unhandled message: ", JSON.stringify(msg)] }, "uhm-".concat(+new Date()))] }, "default-".concat(msg.timestamp)));
31348
31443
  }
31349
31444
  }
31350
31445
  /**
@@ -31353,14 +31448,14 @@ var MessageList = function (props) {
31353
31448
  */
31354
31449
  function renderAll() {
31355
31450
  var lastMsgIndex = -1;
31356
- for (var i = props.messages.length - 1; i > 0; i--) {
31357
- if (props.messages[i].type === "chat.msg") {
31451
+ for (var i = messages.length - 1; i > 0; i--) {
31452
+ if (messages[i].type === "chat.msg") {
31358
31453
  lastMsgIndex = i;
31359
31454
  break;
31360
31455
  }
31361
31456
  }
31362
- return props.messages.map(function (message, index) {
31363
- // const next = props.messages[index + 1];
31457
+ return messages.map(function (message, index) {
31458
+ // const next = messages[index + 1];
31364
31459
  var _a, _b;
31365
31460
  // let sibling = false;
31366
31461
  // const currentNick = message.nick;
@@ -31376,6 +31471,7 @@ var MessageList = function (props) {
31376
31471
  // "chat.failureMsg",
31377
31472
  "chat.memberjoin",
31378
31473
  "chat.memberleave",
31474
+ // "chat.systemmessage", // System messages don't show timestamps
31379
31475
  "chat.rating",
31380
31476
  // "chat.typing",
31381
31477
  "chat.request.rating",
@@ -31385,11 +31481,11 @@ var MessageList = function (props) {
31385
31481
  // show first and las TS and after at least 5 minutes gap. Don't show "router user"
31386
31482
  var showTs = false;
31387
31483
  if (tsTypes.includes(message.type) && !((_b = (_a = message.user) === null || _a === void 0 ? void 0 : _a.nick) === null || _b === void 0 ? void 0 : _b.endsWith(ROUTER_USER))) {
31388
- if (index === 0 || index === props.messages.length - 1 || index === lastMsgIndex) {
31484
+ if (index === 0 || index === messages.length - 1 || index === lastMsgIndex) {
31389
31485
  showTs = true;
31390
31486
  }
31391
31487
  else {
31392
- var previous = props.messages[index - 1];
31488
+ var previous = messages[index - 1];
31393
31489
  if (message.timestamp && previous.timestamp) {
31394
31490
  showTs = message.timestamp - previous.timestamp > 300 * 1000; // 5 minutes
31395
31491
  }
@@ -31400,26 +31496,14 @@ var MessageList = function (props) {
31400
31496
  showTs = false;
31401
31497
  }
31402
31498
  var ts = showTs ? new Date(message.timestamp).toLocaleString() : undefined;
31403
- return (React$1.createElement("span", { key: "message-list-render-all-".concat(index) },
31404
- showTs && (React$1.createElement("div", { className: "ts-msg-container" },
31405
- React$1.createElement("span", { className: "ts-msg" }, ts))),
31406
- renderByType(message, false)));
31499
+ return (require$$0.jsxs("span", { children: [showTs && (require$$0.jsx("div", { className: "ts-msg-container", children: require$$0.jsx("span", { className: "ts-msg", children: ts }) })), renderByType(message, false)] }, "message-list-render-all-".concat(index)));
31407
31500
  });
31408
31501
  }
31409
- var agents = props.agents, queuePosition = props.queuePosition;
31410
- return (React$1.createElement("div", { className: "message-list-container", ref: containerRef },
31411
- React$1.createElement("div", { className: "message-list-container__msgs" },
31412
- renderAll(),
31413
- React$1.createElement("div", { ref: messagesEndRef, style: { float: "left", clear: "both" } }),
31414
- React$1.createElement(QueuePosition, { position: queuePosition }),
31415
- React$1.createElement(TypingStatus, { agents: agents, textTypingStatusEnabled: props.textTypingStatusEnabled })),
31416
- React$1.createElement(ChatChipsContainer, null)));
31502
+ return (require$$0.jsxs("div", { className: "message-list-container", ref: containerRef, children: [require$$0.jsxs("div", { className: "message-list-container__msgs", children: [renderAll(), require$$0.jsx("div", { ref: messagesEndRef, style: { float: "left", clear: "both" } }), require$$0.jsx(QueuePosition, { position: queuePosition }), require$$0.jsx(TypingStatus, { agents: agents, textTypingStatusEnabled: textTypingStatusEnabled })] }), require$$0.jsx(ChatChipsContainer, {})] }));
31417
31503
  };
31418
31504
 
31419
31505
  var ServerOffline = function () {
31420
- return React$1.createElement("div", { className: "server-offline" },
31421
- React$1.createElement("h2", null, "Chat is currently unavailable"),
31422
- React$1.createElement("h3", null, "Server is offline"));
31506
+ return (require$$0.jsxs("div", { className: "server-offline", children: [require$$0.jsx("h2", { children: "Chat is currently unavailable" }), require$$0.jsx("h3", { children: "Server is offline" })] }));
31423
31507
  };
31424
31508
 
31425
31509
  function buildStyleContent(theme) {
@@ -31429,7 +31513,7 @@ function buildStyleContent(theme) {
31429
31513
  function WidgetStylesheet(props) {
31430
31514
  var theme = props.theme;
31431
31515
  var stylesContent = buildStyleContent(theme);
31432
- return React$1.createElement("style", null, stylesContent);
31516
+ return require$$0.jsx("style", { children: stylesContent });
31433
31517
  }
31434
31518
  function buildVariables(gen) {
31435
31519
  var result = gen.next();
@@ -31767,13 +31851,13 @@ var safeStringify = function (arg) {
31767
31851
  };
31768
31852
  var ErrorOverlay = function (_a) {
31769
31853
  var enableErrorOverlay = _a.enableErrorOverlay;
31770
- var _b = React$1.useState([]), errors = _b[0], setErrors = _b[1];
31771
- var _c = React$1.useState(false), isMinimized = _c[0], setIsMinimized = _c[1];
31772
- var _d = React$1.useState(true), isVisible = _d[0], setIsVisible = _d[1];
31773
- var _e = React$1.useState(false), isEnabled = _e[0], setIsEnabled = _e[1];
31774
- var _f = React$1.useState("bottom"), position = _f[0], setPosition = _f[1];
31854
+ var _b = require$$1.useState([]), errors = _b[0], setErrors = _b[1];
31855
+ var _c = require$$1.useState(false), isMinimized = _c[0], setIsMinimized = _c[1];
31856
+ var _d = require$$1.useState(true), isVisible = _d[0], setIsVisible = _d[1];
31857
+ var _e = require$$1.useState(false), isEnabled = _e[0], setIsEnabled = _e[1];
31858
+ var _f = require$$1.useState("bottom"), position = _f[0], setPosition = _f[1];
31775
31859
  // Check if error overlay should be enabled and load position
31776
- React$1.useEffect(function () {
31860
+ require$$1.useEffect(function () {
31777
31861
  var _a;
31778
31862
  var checkEnabled = function () {
31779
31863
  var _a;
@@ -31812,7 +31896,7 @@ var ErrorOverlay = function (_a) {
31812
31896
  console.log("[ErrorOverlay] Component mounted, enabled:", enabled, "position:", savedPosition || "bottom");
31813
31897
  }, [enableErrorOverlay]);
31814
31898
  // Define addError with useCallback to prevent stale closures
31815
- var addError = React$1.useCallback(function (error) {
31899
+ var addError = require$$1.useCallback(function (error) {
31816
31900
  console.log("[ErrorOverlay] Adding error:", error);
31817
31901
  setErrors(function (prev) {
31818
31902
  var timestamp = new Date().toISOString();
@@ -31831,7 +31915,7 @@ var ErrorOverlay = function (_a) {
31831
31915
  return updated.slice(-50);
31832
31916
  });
31833
31917
  }, []);
31834
- React$1.useEffect(function () {
31918
+ require$$1.useEffect(function () {
31835
31919
  if (!isEnabled) {
31836
31920
  console.log("[ErrorOverlay] Not enabled, skipping error interception");
31837
31921
  return undefined;
@@ -31976,41 +32060,17 @@ var ErrorOverlay = function (_a) {
31976
32060
  if (errors.length === 0) {
31977
32061
  return null;
31978
32062
  }
31979
- return (React$1.createElement("div", { className: "error-overlay error-overlay--".concat(position, " ").concat(isMinimized ? "minimized" : "") },
31980
- React$1.createElement("div", { className: "error-overlay-header" },
31981
- React$1.createElement("span", { className: "error-overlay-title" },
31982
- "Debug Console (",
31983
- errors.length,
31984
- ")"),
31985
- React$1.createElement("div", { className: "error-overlay-actions" },
31986
- React$1.createElement("button", { onClick: copyToClipboard, title: "Copy all to clipboard" }, "\uD83D\uDCCB"),
31987
- React$1.createElement("button", { onClick: clearErrors, title: "Clear all" }, "\uD83D\uDDD1\uFE0F"),
31988
- React$1.createElement("button", { onClick: togglePosition, title: "Move to ".concat(position === "bottom" ? "top" : "bottom") }, position === "bottom" ? "⬆️" : "⬇️"),
31989
- React$1.createElement("button", { onClick: toggleEnabled, title: "Disable Error Overlay" }, "\uD83D\uDD27"),
31990
- React$1.createElement("button", { onClick: function () { return setIsMinimized(!isMinimized); }, title: "Minimize/Maximize" }, isMinimized ? "▲" : "▼"),
31991
- React$1.createElement("button", { onClick: function () { return setIsVisible(false); }, title: "Close" }, "\u2715"))),
31992
- !isMinimized && (React$1.createElement("div", { className: "error-overlay-content" }, errors.map(function (error) { return (React$1.createElement("div", { key: error.id, className: "error-entry error-".concat(error.type) },
31993
- React$1.createElement("div", { className: "error-header" },
31994
- React$1.createElement("span", { className: "error-time" }, new Date(error.timestamp).toLocaleTimeString()),
31995
- error.count > 1 && (React$1.createElement("span", { className: "error-count" },
31996
- "(",
31997
- error.count,
31998
- "x)")),
31999
- React$1.createElement("span", { className: "error-badge error-badge-".concat(error.type) }, error.type)),
32000
- React$1.createElement("div", { className: "error-message" }, error.message),
32001
- error.stack && (React$1.createElement("details", { className: "error-stack" },
32002
- React$1.createElement("summary", null, "Stack trace"),
32003
- React$1.createElement("pre", null, error.stack))))); })))));
32063
+ return (require$$0.jsxs("div", { className: "error-overlay error-overlay--".concat(position, " ").concat(isMinimized ? "minimized" : ""), children: [require$$0.jsxs("div", { className: "error-overlay-header", children: [require$$0.jsxs("span", { className: "error-overlay-title", children: ["Debug Console (", errors.length, ")"] }), require$$0.jsxs("div", { className: "error-overlay-actions", children: [require$$0.jsx("button", { onClick: copyToClipboard, title: "Copy all to clipboard", children: "\uD83D\uDCCB" }), require$$0.jsx("button", { onClick: clearErrors, title: "Clear all", children: "\uD83D\uDDD1\uFE0F" }), require$$0.jsx("button", { onClick: togglePosition, title: "Move to ".concat(position === "bottom" ? "top" : "bottom"), children: position === "bottom" ? "⬆️" : "⬇️" }), require$$0.jsx("button", { onClick: toggleEnabled, title: "Disable Error Overlay", children: "\uD83D\uDD27" }), require$$0.jsx("button", { onClick: function () { return setIsMinimized(!isMinimized); }, title: "Minimize/Maximize", children: isMinimized ? "▲" : "▼" }), require$$0.jsx("button", { onClick: function () { return setIsVisible(false); }, title: "Close", children: "\u2715" })] })] }), !isMinimized && (require$$0.jsx("div", { className: "error-overlay-content", children: errors.map(function (error) { return (require$$0.jsxs("div", { className: "error-entry error-".concat(error.type), children: [require$$0.jsxs("div", { className: "error-header", children: [require$$0.jsx("span", { className: "error-time", children: new Date(error.timestamp).toLocaleTimeString() }), error.count > 1 && (require$$0.jsxs("span", { className: "error-count", children: ["(", error.count, "x)"] })), require$$0.jsx("span", { className: "error-badge error-badge-".concat(error.type), children: error.type })] }), require$$0.jsx("div", { className: "error-message", children: error.message }), error.stack && (require$$0.jsxs("details", { className: "error-stack", children: [require$$0.jsx("summary", { children: "Stack trace" }), require$$0.jsx("pre", { children: error.stack })] }))] }, error.id)); }) }))] }));
32004
32064
  };
32005
32065
 
32006
32066
  var WsButton = function (_a) {
32007
32067
  var button = _a.button, onPress = _a.onPress;
32008
- var handleClick = React$1.useCallback(function () {
32068
+ var handleClick = require$$1.useCallback(function () {
32009
32069
  if (button.pressBehavior !== "disabled" && !button.isPressed) {
32010
32070
  onPress(button.id);
32011
32071
  }
32012
32072
  }, [button.pressBehavior, button.isPressed, button.id, onPress]);
32013
- var className = React$1.useMemo(function () {
32073
+ var className = require$$1.useMemo(function () {
32014
32074
  var classes = ["ws-button"];
32015
32075
  if (button.pressBehavior === "disabled" || button.isPressed) {
32016
32076
  classes.push("ws-button--disabled");
@@ -32020,37 +32080,33 @@ var WsButton = function (_a) {
32020
32080
  }
32021
32081
  return classes.join(" ");
32022
32082
  }, [button.pressBehavior, button.isPressed]);
32023
- var containerClassName = React$1.useMemo(function () {
32083
+ var containerClassName = require$$1.useMemo(function () {
32024
32084
  var classes = ["ws-button-container"];
32025
32085
  if (button.isDismissing) {
32026
32086
  classes.push("ws-button-container--dismissing");
32027
32087
  }
32028
32088
  return classes.join(" ");
32029
32089
  }, [button.isDismissing]);
32030
- return (React$1.createElement("div", { className: containerClassName },
32031
- React$1.createElement("button", { className: className, onClick: handleClick, disabled: button.pressBehavior === "disabled" || button.isPressed, "aria-label": button.text, "aria-busy": button.isPressed && button.pressBehavior === "spinning" },
32032
- button.isPressed && button.pressBehavior === "spinning" && (React$1.createElement("span", { className: "ws-button__spinner" })),
32033
- React$1.createElement("span", { className: "ws-button__text" }, button.text))));
32090
+ return (require$$0.jsx("div", { className: containerClassName, children: require$$0.jsxs("button", { className: className, onClick: handleClick, disabled: button.pressBehavior === "disabled" || button.isPressed, "aria-label": button.text, "aria-busy": button.isPressed && button.pressBehavior === "spinning", children: [button.isPressed && button.pressBehavior === "spinning" && (require$$0.jsx("span", { className: "ws-button__spinner" })), require$$0.jsx("span", { className: "ws-button__text", children: button.text })] }) }));
32034
32091
  };
32035
32092
 
32036
32093
  var ModalContent = function (_a) {
32037
32094
  var onClose = _a.onClose, onReset = _a.onReset;
32038
- return (React$1.createElement("div", { className: "modalContent" },
32039
- React$1.createElement("div", { className: "modalBody" },
32040
- React$1.createElement("h2", null, "Restart Conversation"),
32041
- React$1.createElement("p", null, "Would you like to refresh and return to the starting point of the conversation?")),
32042
- React$1.createElement("div", { className: "modalActions" },
32043
- React$1.createElement("button", { onClick: onClose, className: "cancelBtn" }, "Cancel"),
32044
- React$1.createElement("button", { onClick: onReset, className: "restartBtn" }, "Restart"))));
32095
+ return (require$$0.jsxs("div", { className: "modalContent", children: [require$$0.jsxs("div", { className: "modalBody", children: [require$$0.jsx("h2", { children: "Restart Conversation" }), require$$0.jsx("p", { children: "Would you like to refresh and return to the starting point of the conversation?" })] }), require$$0.jsxs("div", { className: "modalActions", children: [require$$0.jsx("button", { onClick: onClose, className: "cancelBtn", children: "Cancel" }), require$$0.jsx("button", { onClick: onReset, className: "restartBtn", children: "Restart" })] })] }));
32045
32096
  };
32046
32097
 
32098
+ /**
32099
+ * Debounce delay for typing indicator in milliseconds.
32100
+ * After this delay of inactivity, the "stop typing" event will be sent.
32101
+ */
32102
+ var TYPING_INDICATOR_DEBOUNCE_MS = 2000;
32047
32103
  var ChatWidgetWrapper = function (props) {
32048
32104
  var _a;
32049
- var _b = React$1.useState(props.config), rawConfig = _b[0], setRawConfig = _b[1];
32050
- var _c = React$1.useState(!!props.getConfig), configLoading = _c[0], setConfigLoading = _c[1];
32051
- var _d = React$1.useState(), configError = _d[0], setConfigError = _d[1];
32105
+ var _b = require$$1.useState(props.config), rawConfig = _b[0], setRawConfig = _b[1];
32106
+ var _c = require$$1.useState(!!props.getConfig), configLoading = _c[0], setConfigLoading = _c[1];
32107
+ var _d = require$$1.useState(), configError = _d[0], setConfigError = _d[1];
32052
32108
  // Load config from callback if provided
32053
- React$1.useEffect(function () {
32109
+ require$$1.useEffect(function () {
32054
32110
  var cancelled = false;
32055
32111
  if (props.getConfig) {
32056
32112
  setConfigLoading(true);
@@ -32084,12 +32140,12 @@ var ChatWidgetWrapper = function (props) {
32084
32140
  // eslint-disable-next-line react-hooks/exhaustive-deps
32085
32141
  }, [props.getConfig, props.config]);
32086
32142
  var connection = useConnectionInfo(rawConfig);
32087
- var config = React$1.useMemo(function () {
32143
+ var config = require$$1.useMemo(function () {
32088
32144
  var _a;
32089
32145
  return (__assign(__assign({}, rawConfig), { connection: connection, assetUrl: (_a = connection === null || connection === void 0 ? void 0 : connection.serverUrl) !== null && _a !== void 0 ? _a : defaultServerUrl, env: rawConfig }));
32090
32146
  }, [connection, rawConfig]);
32091
32147
  var token = reactRedux.useSelector(function (state) { return state.connection.token; });
32092
- var options = React$1.useMemo(function () {
32148
+ var options = require$$1.useMemo(function () {
32093
32149
  var configurableMessages = getConfigurableMessages();
32094
32150
  if ((rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.configurableMessages) &&
32095
32151
  Array.isArray(rawConfig.configurableMessages.items) &&
@@ -32114,20 +32170,13 @@ var ChatWidgetWrapper = function (props) {
32114
32170
  var modeClass = "widget-container--".concat(mode);
32115
32171
  // Show loading state while config is being fetched
32116
32172
  if (configLoading) {
32117
- return (React$1.createElement("div", { className: "widget-container widget-container--loading ".concat(modeClass) },
32118
- React$1.createElement("div", { className: "xa-spinner-container visible" },
32119
- React$1.createElement("div", { className: "xa-spinner" }))));
32173
+ return (require$$0.jsx("div", { className: "widget-container widget-container--loading ".concat(modeClass), children: require$$0.jsx("div", { className: "xa-spinner-container visible", children: require$$0.jsx("div", { className: "xa-spinner" }) }) }));
32120
32174
  }
32121
32175
  // Show error state if config failed to load
32122
32176
  if (configError) {
32123
- return (React$1.createElement("div", { className: "widget-container widget-container--error ".concat(modeClass) },
32124
- React$1.createElement("div", { className: "widget-error-message" },
32125
- "Failed to load chat configuration: ",
32126
- configError.message)));
32127
- }
32128
- return (React$1.createElement(ChatConfigContext.Provider, { value: config },
32129
- React$1.createElement(ChatServerContext.Provider, { value: chatServer },
32130
- React$1.createElement(ChatWidget, __assign({}, props, { config: rawConfig })))));
32177
+ return (require$$0.jsx("div", { className: "widget-container widget-container--error ".concat(modeClass), children: require$$0.jsxs("div", { className: "widget-error-message", children: ["Failed to load chat configuration: ", configError.message] }) }));
32178
+ }
32179
+ return (require$$0.jsx(ChatConfigContext.Provider, { value: config, children: require$$0.jsx(ChatServerContext.Provider, { value: chatServer, children: require$$0.jsx(ChatWidget, __assign({}, props, { config: rawConfig })) }) }));
32131
32180
  };
32132
32181
  var ChatWidget = function (props) {
32133
32182
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
@@ -32136,7 +32185,7 @@ var ChatWidget = function (props) {
32136
32185
  // From Redux
32137
32186
  var chatState = reactRedux.useSelector(function (state) { return state; });
32138
32187
  // Refresh modalReference
32139
- var modalRef = React$1.useRef({});
32188
+ var modalRef = require$$1.useRef({});
32140
32189
  var mode = (_a = props.mode) !== null && _a !== void 0 ? _a : "normal";
32141
32190
  var dockedMode = mode === "docked";
32142
32191
  var staticMode = mode === "static";
@@ -32158,13 +32207,17 @@ var ChatWidget = function (props) {
32158
32207
  chatState.visuals = {};
32159
32208
  }
32160
32209
  // Our state - pull from storage
32161
- var _8 = React$1.useState((!canMinimize && !canCancel) ||
32210
+ var _8 = require$$1.useState((!canMinimize && !canCancel) ||
32162
32211
  // !!get("visible") ||
32163
32212
  chatState.visuals.visible ||
32164
32213
  (((_m = props.config) === null || _m === void 0 ? void 0 : _m.autoOpenOnWidth) &&
32165
32214
  window.matchMedia("(min-width: ".concat((_o = props.config) === null || _o === void 0 ? void 0 : _o.autoOpenOnWidth, ")")).matches)), visible = _8[0], setVisibleState = _8[1];
32166
- var _9 = React$1.useState(false), typing = _9[0], setTypingState = _9[1]; // false initially
32167
- var chatServer = React$1.useContext(ChatServerContext);
32215
+ var _9 = require$$1.useState(false); _9[0]; var setTypingState = _9[1]; // false initially - state kept for potential external observers
32216
+ // Ref to track typing state for use in timeout callbacks
32217
+ var typingRef = require$$1.useRef(false);
32218
+ // Timeout ref for debouncing "stop typing" events
32219
+ var stopTypingTimeoutRef = require$$1.useRef(null);
32220
+ var chatServer = require$$1.useContext(ChatServerContext);
32168
32221
  var patternsConfig = (_q = (_p = props.config) === null || _p === void 0 ? void 0 : _p.autoOpenOnPattern) === null || _q === void 0 ? void 0 : _q.patterns;
32169
32222
  var currentUrl = window.location.href;
32170
32223
  var patternExist = patternsConfig && patternsConfig.length > 0;
@@ -32172,7 +32225,7 @@ var ChatWidget = function (props) {
32172
32225
  var configWidth = (_s = (_r = props.config) === null || _r === void 0 ? void 0 : _r.autoOpenOnPattern) === null || _s === void 0 ? void 0 : _s.minimumWidth;
32173
32226
  // eslint-disable-next-line no-restricted-globals
32174
32227
  var currentWidth = screen.width;
32175
- var setVisible = React$1.useCallback(function (newVisible) {
32228
+ var setVisible = require$$1.useCallback(function (newVisible) {
32176
32229
  if (staticMode) {
32177
32230
  return;
32178
32231
  }
@@ -32182,7 +32235,7 @@ var ChatWidget = function (props) {
32182
32235
  visible: newVisible,
32183
32236
  }));
32184
32237
  }, [innerDispatch, staticMode]);
32185
- React$1.useEffect(function () {
32238
+ require$$1.useEffect(function () {
32186
32239
  var _a, _b;
32187
32240
  var handleKeyDown = function (event) {
32188
32241
  var body = document.getElementsByTagName("body")[0];
@@ -32198,11 +32251,15 @@ var ChatWidget = function (props) {
32198
32251
  }
32199
32252
  return function () {
32200
32253
  document.removeEventListener("keydown", handleKeyDown);
32254
+ // Cleanup typing timeout on unmount
32255
+ if (stopTypingTimeoutRef.current) {
32256
+ clearTimeout(stopTypingTimeoutRef.current);
32257
+ }
32201
32258
  };
32202
32259
  // eslint-disable-next-line react-hooks/exhaustive-deps
32203
32260
  }, []);
32204
- var _10 = React$1.useState(!document.hidden), isTabVisible = _10[0], setIsTabVisible = _10[1];
32205
- React$1.useEffect(function () {
32261
+ var _10 = require$$1.useState(!document.hidden), isTabVisible = _10[0], setIsTabVisible = _10[1];
32262
+ require$$1.useEffect(function () {
32206
32263
  var handleVisibilityChange = function () {
32207
32264
  setIsTabVisible(!document.hidden);
32208
32265
  };
@@ -32211,7 +32268,7 @@ var ChatWidget = function (props) {
32211
32268
  document.removeEventListener("visibilitychange", handleVisibilityChange);
32212
32269
  };
32213
32270
  }, []);
32214
- React$1.useEffect(function () {
32271
+ require$$1.useEffect(function () {
32215
32272
  // Too early?
32216
32273
  if (!chatServer) {
32217
32274
  log("Tab visibility changed but no chatServer yet");
@@ -32226,7 +32283,23 @@ var ChatWidget = function (props) {
32226
32283
  chatServer.wakeup();
32227
32284
  }
32228
32285
  }, [chatServer, innerDispatch, isTabVisible]);
32229
- React$1.useEffect(function () {
32286
+ // Handle beforeunload to notify router when user is leaving
32287
+ require$$1.useEffect(function () {
32288
+ if (!chatServer) {
32289
+ return undefined;
32290
+ }
32291
+ var handleBeforeUnload = function () {
32292
+ log("beforeunload - notifying router of user disconnecting");
32293
+ if (chatServer.notifyDisconnecting) {
32294
+ chatServer.notifyDisconnecting();
32295
+ }
32296
+ };
32297
+ window.addEventListener("beforeunload", handleBeforeUnload);
32298
+ return function () {
32299
+ window.removeEventListener("beforeunload", handleBeforeUnload);
32300
+ };
32301
+ }, [chatServer]);
32302
+ require$$1.useEffect(function () {
32230
32303
  // For reopen widget after move on same window
32231
32304
  // if (get("opened")) {
32232
32305
  // setVisible(true);
@@ -32254,19 +32327,34 @@ var ChatWidget = function (props) {
32254
32327
  chatState.visuals.opened,
32255
32328
  mode,
32256
32329
  ]);
32257
- function handleOnChange() {
32258
- if (!typing) {
32259
- dispatch(sendTyping(true));
32260
- setTypingState(true);
32261
- }
32262
- stopTyping();
32263
- }
32264
- function stopTyping() {
32265
- if (!typing)
32330
+ var stopTyping = require$$1.useCallback(function () {
32331
+ if (!typingRef.current)
32266
32332
  return;
32333
+ // Clear the timeout if it exists
32334
+ if (stopTypingTimeoutRef.current) {
32335
+ clearTimeout(stopTypingTimeoutRef.current);
32336
+ stopTypingTimeoutRef.current = null;
32337
+ }
32267
32338
  dispatch(sendTyping(false));
32268
32339
  setTypingState(false);
32269
- }
32340
+ typingRef.current = false;
32341
+ }, [dispatch]);
32342
+ var handleOnChange = require$$1.useCallback(function () {
32343
+ // Send "typing" event only on first keystroke
32344
+ if (!typingRef.current) {
32345
+ dispatch(sendTyping(true));
32346
+ setTypingState(true);
32347
+ typingRef.current = true;
32348
+ }
32349
+ // Clear any existing timeout
32350
+ if (stopTypingTimeoutRef.current) {
32351
+ clearTimeout(stopTypingTimeoutRef.current);
32352
+ }
32353
+ // Set a new timeout to send "stop typing" after inactivity
32354
+ stopTypingTimeoutRef.current = window.setTimeout(function () {
32355
+ stopTyping();
32356
+ }, TYPING_INDICATOR_DEBOUNCE_MS);
32357
+ }, [dispatch, stopTyping]);
32270
32358
  function handleSendMessage(msg) {
32271
32359
  dispatch(sendMessage(msg));
32272
32360
  }
@@ -32405,7 +32493,7 @@ var ChatWidget = function (props) {
32405
32493
  var config = props.config, onConnectionStatusChange = props.onConnectionStatusChange;
32406
32494
  useGreeting(!isOffline && !props.preChatFormEnabled && visible);
32407
32495
  var connectionStatus = chatState.connection.connectionStatus;
32408
- React$1.useEffect(function () {
32496
+ require$$1.useEffect(function () {
32409
32497
  if (onConnectionStatusChange) {
32410
32498
  onConnectionStatusChange(connectionStatus);
32411
32499
  }
@@ -32418,20 +32506,7 @@ var ChatWidget = function (props) {
32418
32506
  avatarPath: config.avatarUrl,
32419
32507
  display_name: "Agent",
32420
32508
  };
32421
- return (React$1.createElement(React$1.Fragment, null,
32422
- React$1.createElement("div", { className: "widget-container ".concat(modeClass, " ").concat(getVisibilityClass()) },
32423
- React$1.createElement(WidgetStylesheet, { theme: config === null || config === void 0 ? void 0 : config.theme }),
32424
- React$1.createElement(ChatHeader, { accountStatus: chatState.accountStatus, refreshOnClick: handleRestartClick, minimizeOnClick: handleMinimizeClick, cancelOnClick: handleCancelClick, agent: widgetAgent, canRefresh: canRefresh, canMinimize: canMinimize, canCancel: canCancel, config: config === null || config === void 0 ? void 0 : config.header, menuConfig: config.menu, onSubmit: handleOnSubmit }),
32425
- React$1.createElement(MessageList, { visible: visible, queuePosition: chatState.queuePosition, isChatting: chatState.isChatting, isOffline: isOffline, messages: messages, agents: chatState.agents, agent: config === null || config === void 0 ? void 0 : config.agent, lastRatingRequestTimestamp: chatState.lastRatingRequestTimestamp, hasRating: chatState.hasRating, visitorId: chatState.visitorId, hasWsButton: !!chatState.wsButton, messageMiddleware: props.messageMiddleware, textTypingStatusEnabled: (_w = (_v = props.config) === null || _v === void 0 ? void 0 : _v.typingStatus) === null || _w === void 0 ? void 0 : _w.textTypingStatusEnabled, onSend: handleSendMessage, onWrite: handleWriteMessage, onOpenUrl: handleOpenUrl, minimizeOnClick: handleMinimizeClick }),
32426
- React$1.createElement("div", { className: "xa-spinner-container ".concat(visible && connectionStatus === "pending" ? "visible" : "") },
32427
- React$1.createElement("div", { className: "xa-spinner" })),
32428
- connectionStatus === "offline" && React$1.createElement(ServerOffline, null),
32429
- chatState.wsButton && visible && (React$1.createElement(WsButton, { button: chatState.wsButton, onPress: handleWsButtonPress })),
32430
- React$1.createElement(ChatFooter, { isAdmin: config === null || config === void 0 ? void 0 : config.isAdmin, isChatting: chatState.isChatting, placeholder: (_x = config === null || config === void 0 ? void 0 : config.input) === null || _x === void 0 ? void 0 : _x.placeholder, sendButtonIcon: (_z = (_y = config === null || config === void 0 ? void 0 : config.footer) === null || _y === void 0 ? void 0 : _y.sendButton) === null || _z === void 0 ? void 0 : _z.icon, sendButtonIconHover: (_1 = (_0 = config === null || config === void 0 ? void 0 : config.footer) === null || _0 === void 0 ? void 0 : _0.sendButton) === null || _1 === void 0 ? void 0 : _1.iconHover, sendButtonIconDisabled: (_3 = (_2 = config === null || config === void 0 ? void 0 : config.footer) === null || _2 === void 0 ? void 0 : _2.sendButton) === null || _3 === void 0 ? void 0 : _3.iconDisabled, visible: visible, hasWsButton: !!chatState.wsButton, menuConfig: props.config.menu, footerConfig: (_4 = props.config) === null || _4 === void 0 ? void 0 : _4.footer, inputConfig: (_5 = props.config) === null || _5 === void 0 ? void 0 : _5.input, onChange: handleOnChange, onSubmit: handleOnSubmit, onFileUpload: handleFileUpload }),
32431
- React$1.createElement("div", { className: "restartModal", ref: modalRef, onClick: handleRestartModalCloseClick },
32432
- React$1.createElement(ModalContent, { onClose: handleRestartModalCloseClick, onReset: handleReset }))),
32433
- React$1.createElement(ChatButton, { addClass: getVisibilityClass(), onClick: chatButtonOnClick, config: config === null || config === void 0 ? void 0 : config.cta, imageUrl: (_6 = config === null || config === void 0 ? void 0 : config.chatButton) === null || _6 === void 0 ? void 0 : _6.imageUrl, visible: visible, hasInteracted: (_7 = chatState.visuals) === null || _7 === void 0 ? void 0 : _7.hasInteracted, onCtaDismiss: handleCtaDismiss }),
32434
- React$1.createElement(ErrorOverlay, { enableErrorOverlay: config === null || config === void 0 ? void 0 : config.enableErrorOverlay })));
32509
+ return (require$$0.jsxs(require$$0.Fragment, { children: [require$$0.jsxs("div", { className: "widget-container ".concat(modeClass, " ").concat(getVisibilityClass()), children: [require$$0.jsx(WidgetStylesheet, { theme: config === null || config === void 0 ? void 0 : config.theme }), require$$0.jsx(ChatHeader, { accountStatus: chatState.accountStatus, refreshOnClick: handleRestartClick, minimizeOnClick: handleMinimizeClick, cancelOnClick: handleCancelClick, agent: widgetAgent, canRefresh: canRefresh, canMinimize: canMinimize, canCancel: canCancel, config: config === null || config === void 0 ? void 0 : config.header, menuConfig: config.menu, onSubmit: handleOnSubmit }), require$$0.jsx(MessageList, { visible: visible, queuePosition: chatState.queuePosition, isChatting: chatState.isChatting, isOffline: isOffline, messages: messages, agents: chatState.agents, agent: config === null || config === void 0 ? void 0 : config.agent, lastRatingRequestTimestamp: chatState.lastRatingRequestTimestamp, hasRating: chatState.hasRating, visitorId: chatState.visitorId, hasWsButton: !!chatState.wsButton, messageMiddleware: props.messageMiddleware, textTypingStatusEnabled: (_w = (_v = props.config) === null || _v === void 0 ? void 0 : _v.typingStatus) === null || _w === void 0 ? void 0 : _w.textTypingStatusEnabled, onSend: handleSendMessage, onWrite: handleWriteMessage, onOpenUrl: handleOpenUrl, minimizeOnClick: handleMinimizeClick }), require$$0.jsx("div", { className: "xa-spinner-container ".concat(visible && connectionStatus === "pending" ? "visible" : ""), children: require$$0.jsx("div", { className: "xa-spinner" }) }), connectionStatus === "offline" && require$$0.jsx(ServerOffline, {}), chatState.wsButton && visible && (require$$0.jsx(WsButton, { button: chatState.wsButton, onPress: handleWsButtonPress })), require$$0.jsx(ChatFooter, { isAdmin: config === null || config === void 0 ? void 0 : config.isAdmin, isChatting: chatState.isChatting, placeholder: (_x = config === null || config === void 0 ? void 0 : config.input) === null || _x === void 0 ? void 0 : _x.placeholder, sendButtonIcon: (_z = (_y = config === null || config === void 0 ? void 0 : config.footer) === null || _y === void 0 ? void 0 : _y.sendButton) === null || _z === void 0 ? void 0 : _z.icon, sendButtonIconHover: (_1 = (_0 = config === null || config === void 0 ? void 0 : config.footer) === null || _0 === void 0 ? void 0 : _0.sendButton) === null || _1 === void 0 ? void 0 : _1.iconHover, sendButtonIconDisabled: (_3 = (_2 = config === null || config === void 0 ? void 0 : config.footer) === null || _2 === void 0 ? void 0 : _2.sendButton) === null || _3 === void 0 ? void 0 : _3.iconDisabled, visible: visible, hasWsButton: !!chatState.wsButton, menuConfig: props.config.menu, footerConfig: (_4 = props.config) === null || _4 === void 0 ? void 0 : _4.footer, inputConfig: (_5 = props.config) === null || _5 === void 0 ? void 0 : _5.input, onChange: handleOnChange, onSubmit: handleOnSubmit, onFileUpload: handleFileUpload }), require$$0.jsx("div", { className: "restartModal", ref: modalRef, onClick: handleRestartModalCloseClick, children: require$$0.jsx(ModalContent, { onClose: handleRestartModalCloseClick, onReset: handleReset }) })] }), require$$0.jsx(ChatButton, { addClass: getVisibilityClass(), onClick: chatButtonOnClick, config: config === null || config === void 0 ? void 0 : config.cta, imageUrl: (_6 = config === null || config === void 0 ? void 0 : config.chatButton) === null || _6 === void 0 ? void 0 : _6.imageUrl, visible: visible, hasInteracted: (_7 = chatState.visuals) === null || _7 === void 0 ? void 0 : _7.hasInteracted, onCtaDismiss: handleCtaDismiss }), require$$0.jsx(ErrorOverlay, { enableErrorOverlay: config === null || config === void 0 ? void 0 : config.enableErrorOverlay })] }));
32435
32510
  };
32436
32511
 
32437
32512
  // src/utils/formatProdErrorMessage.ts
@@ -33748,15 +33823,23 @@ function memberJoin(state, detail) {
33748
33823
  // }
33749
33824
  var agents = __assign({}, state.agents);
33750
33825
  var prevAgentInfo = state.agents[detail.user.nick];
33751
- agents[detail.user.nick] = __assign(__assign({}, prevAgentInfo), { user: __assign(__assign({}, detail.user), { displayName: detail.user.displayName || "Agent" }), joined: true, typing: false });
33826
+ agents[detail.user.nick] = __assign(__assign({}, prevAgentInfo), { user: __assign(__assign({}, detail.user), { displayName: detail.user.displayName || "Agent" }), joined: true, typing: false, hideUserInfo: detail.hideUserInfo });
33752
33827
  if (isAgent(detail.user.nick)) {
33753
- if (prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) {
33828
+ // Always show join messages with special visual features (divider or custom message)
33829
+ // These are important conversation markers, not routine join notifications
33830
+ var hasSpecialVisuals = detail.showDivider || detail.message;
33831
+ if ((prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) && !hasSpecialVisuals) {
33754
33832
  log("DEDUPLICATION: Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") already joined. NOT adding duplicate join message to chat."));
33755
33833
  }
33756
33834
  else {
33757
- log("Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is joining. Adding join message to chat."));
33835
+ if (hasSpecialVisuals) {
33836
+ log("Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is joining with special visuals (divider or custom message). Adding join message to chat."));
33837
+ }
33838
+ else {
33839
+ log("Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is joining. Adding join message to chat."));
33840
+ }
33758
33841
  }
33759
- return __assign(__assign({}, state), { isChatting: true, chats: (prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) ? state.chats : joinMessages(state.chats, detail), agents: agents });
33842
+ return __assign(__assign({}, state), { isChatting: true, chats: ((prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) && !hasSpecialVisuals) ? state.chats : joinMessages(state.chats, detail), agents: agents });
33760
33843
  }
33761
33844
  else {
33762
33845
  log("Non-agent member \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is joining. Adding join message to chat."));
@@ -33772,9 +33855,22 @@ function memberLeave(state, detail) {
33772
33855
  var agentsJoined = Object.values(agents).filter(function (agent) { return agent.joined; });
33773
33856
  var isChatting = agentsJoined.length > 0;
33774
33857
  if (isAgent(detail.user.nick)) {
33858
+ var hasSpecialVisuals = detail.showDivider || detail.message;
33859
+ if (prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) {
33860
+ if (hasSpecialVisuals) {
33861
+ log("Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is leaving with special visuals (divider or custom message). Adding leave message to chat."));
33862
+ }
33863
+ else {
33864
+ log("Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is leaving. Adding leave message to chat."));
33865
+ }
33866
+ }
33867
+ else {
33868
+ log("DEDUPLICATION: Agent \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") already left. NOT adding duplicate leave message to chat."));
33869
+ }
33775
33870
  return __assign(__assign({}, state), { isChatting: isChatting, chats: (prevAgentInfo === null || prevAgentInfo === void 0 ? void 0 : prevAgentInfo.joined) ? joinMessages(state.chats, detail) : state.chats, agents: agents });
33776
33871
  }
33777
33872
  else {
33873
+ log("Non-agent member \"".concat(detail.user.displayName || "Unknown", "\" (nick: ").concat(detail.user.nick, ") is leaving. Adding leave message to chat."));
33778
33874
  return __assign(__assign({}, state), { isChatting: isChatting, chats: joinMessages(state.chats, detail), agents: agents });
33779
33875
  }
33780
33876
  }
@@ -33800,6 +33896,10 @@ function resetReducer(state) {
33800
33896
  visuals: {} });
33801
33897
  }
33802
33898
 
33899
+ // Type guard for ChatSystemMessageDetail
33900
+ function isChatSystemMessage(chat) {
33901
+ return chat.type === "chat.systemmessage";
33902
+ }
33803
33903
  // todo: create reducer (requires redux-thunk dependency)
33804
33904
  function appendMessageToState(state, msg) {
33805
33905
  state.chats = joinMessages(state.chats, msg);
@@ -33868,6 +33968,20 @@ function update(state, action) {
33868
33968
  return memberJoin(state, action.detail);
33869
33969
  case "chat.memberleave":
33870
33970
  return memberLeave(state, action.detail);
33971
+ case "chat.systemmessage":
33972
+ // Add the system message to the chat
33973
+ appendMessageToState(newState, action.detail);
33974
+ return newState;
33975
+ case "chat.systemmessagedismiss":
33976
+ // Remove system message(s) with the specified id
33977
+ var dismissId_1 = action.detail.id;
33978
+ return __assign(__assign({}, newState), { chats: newState.chats.filter(function (chat) {
33979
+ // Keep all non-system messages, and system messages that don't match the id
33980
+ if (isChatSystemMessage(chat)) {
33981
+ return chat.id !== dismissId_1;
33982
+ }
33983
+ return true;
33984
+ }) });
33871
33985
  case "chat.queue.position":
33872
33986
  newState.queuePosition = action.detail.queuePosition;
33873
33987
  return newState;
@@ -34047,7 +34161,7 @@ var ChatWidgetContainer = function (props) {
34047
34161
  var _a, _b, _c, _d, _e, _f;
34048
34162
  var messageMiddleware = useStandardMiddleware();
34049
34163
  var connection = useServerConfig(props.config);
34050
- var chatStore = React$1.useMemo(function () {
34164
+ var chatStore = require$$1.useMemo(function () {
34051
34165
  var _a, _b, _c, _d, _e;
34052
34166
  return createChatStore({
34053
34167
  connection: connection,
@@ -34059,12 +34173,11 @@ var ChatWidgetContainer = function (props) {
34059
34173
  });
34060
34174
  }, [connection, (_a = props.config) === null || _a === void 0 ? void 0 : _a.userId, (_b = props.config) === null || _b === void 0 ? void 0 : _b.accessToken, (_c = props.config) === null || _c === void 0 ? void 0 : _c.attributes, (_d = props.config) === null || _d === void 0 ? void 0 : _d.sessionExpiration, (_e = props.config) === null || _e === void 0 ? void 0 : _e.enableErrorOverlay]);
34061
34175
  if ((_f = props.config) === null || _f === void 0 ? void 0 : _f.disabled) {
34062
- return React$1.createElement(React$1.Fragment, null);
34176
+ return require$$0.jsx(require$$0.Fragment, {});
34063
34177
  }
34064
34178
  var widgetProps = __assign(__assign({}, props), { messageMiddleware: messageMiddleware, getConfig: props.getConfig // Pass through getConfig callback
34065
34179
  });
34066
- return (React$1.createElement(reactRedux.Provider, { store: chatStore },
34067
- React$1.createElement(ChatWidgetWrapper, __assign({}, widgetProps))));
34180
+ return (require$$0.jsx(reactRedux.Provider, { store: chatStore, children: require$$0.jsx(ChatWidgetWrapper, __assign({}, widgetProps)) }));
34068
34181
  };
34069
34182
 
34070
34183
  // Function to create a static reducer
@@ -34092,17 +34205,16 @@ function createStaticStore(state) {
34092
34205
 
34093
34206
  var StaticChatWidgetContainer = function (props) {
34094
34207
  var state = props.state;
34095
- var store = React$1.useMemo(function () {
34208
+ var store = require$$1.useMemo(function () {
34096
34209
  return createStaticStore(state);
34097
34210
  }, [state]);
34098
- var config = React$1.useMemo(function () {
34211
+ var config = require$$1.useMemo(function () {
34099
34212
  return __assign(__assign({}, props.config), { connection: {
34100
34213
  serverUrl: "",
34101
- type: "local"
34214
+ type: "local",
34102
34215
  } });
34103
34216
  }, [props.config]);
34104
- return (React$1.createElement(reactRedux.Provider, { store: store },
34105
- React$1.createElement(ChatWidgetWrapper, __assign({}, props, { config: config }))));
34217
+ return (require$$0.jsx(reactRedux.Provider, { store: store, children: require$$0.jsx(ChatWidgetWrapper, __assign({}, props, { config: config })) }));
34106
34218
  };
34107
34219
 
34108
34220
  function createStateFromMessages(messages) {
@@ -34112,13 +34224,13 @@ function createStateFromMessages(messages) {
34112
34224
 
34113
34225
  var StaticMessagesChatWidgetContainer = function (props) {
34114
34226
  var messages = props.messages;
34115
- var state = React$1.useMemo(function () {
34227
+ var state = require$$1.useMemo(function () {
34116
34228
  return createStateFromMessages(messages);
34117
34229
  }, [messages]);
34118
- return (React$1.createElement(StaticChatWidgetContainer, { state: state, mode: props.mode, config: props.config }));
34230
+ return require$$0.jsx(StaticChatWidgetContainer, { state: state, mode: props.mode, config: props.config });
34119
34231
  };
34120
34232
 
34121
- exports.React = React$1;
34233
+ exports.React = require$$1;
34122
34234
  exports.ActionButton = ActionButton;
34123
34235
  exports.Avatar = Avatar;
34124
34236
  exports.CardMiddleware = CardMiddleware;