@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.
- package/dist/components/AdminBar/AdminBar.d.ts +0 -0
- package/dist/components/CardContainer/CardContainer.d.ts +0 -0
- package/dist/components/ChatActionButtons/ChatActionButton.d.ts +0 -0
- package/dist/components/ChatActionButtons/ChatActionButtons.d.ts +0 -0
- package/dist/components/ChatMedia/ChatMedia.d.ts +1 -1
- package/dist/components/ChatMessage/ChatMessage.d.ts +0 -0
- package/dist/components/ChatMessagePart/ChatMessagePart.d.ts +0 -0
- package/dist/components/ChatRating/ChatRating.d.ts +0 -0
- package/dist/components/Icons/CloseIcon.d.ts +0 -0
- package/dist/components/Icons/LeftDownArrowIcon.d.ts +0 -0
- package/dist/components/Icons/SendIcon.d.ts +0 -0
- package/dist/components/Input/Input.d.ts +0 -0
- package/dist/components/MessageList/MessageList.d.ts +0 -0
- package/dist/components/MessageSvg/MessageSvg.d.ts +0 -0
- package/dist/components/QueuePosition/QueuePosition.d.ts +0 -0
- package/dist/components/ServerOffline/ServerOffline.d.ts +0 -0
- package/dist/components/UknownMessage/UnknownMessage.d.ts +0 -0
- package/dist/index.css +1 -1
- package/dist/index.es.js +824 -712
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +979 -867
- package/dist/index.js.map +1 -1
- package/dist/store/ChatAction.d.ts +0 -0
- package/dist/store/ChatState.d.ts +0 -0
- package/dist/store/actions/types.d.ts +0 -0
- package/dist/storybook/store.d.ts +2 -2
- package/dist/utils/useChatDispatch.d.ts +0 -0
- package/dist/xapp/ChatServer.d.ts +0 -0
- package/dist/xapp/LogChat.d.ts +0 -0
- package/dist/xapp/StentorRouterChat.d.ts +0 -0
- package/dist/xapp-chat-widget.css +1 -1
- package/dist/xapp-chat-widget.js +4 -5
- package/dist/xapp-chat-widget.js.map +1 -1
- package/package.json +23 -19
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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 (
|
|
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 =
|
|
172
|
-
|
|
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
|
|
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 =
|
|
351
|
+
var ChatConfigContext = require$$1.createContext(null);
|
|
351
352
|
function useWidgetEnv() {
|
|
352
|
-
var ctx =
|
|
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
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 (
|
|
471
|
+
return (require$$0.jsx("div", { onClick: handleOpenUrl, className: className, children: props.children }));
|
|
474
472
|
}
|
|
475
473
|
else {
|
|
476
|
-
return (
|
|
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 =
|
|
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 (
|
|
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 =
|
|
500
|
+
var content = (require$$0.jsx("div", { className: "chat-card-img__content", style: { backgroundImage: "url(".concat(cleanUrl, ")") } }));
|
|
503
501
|
if (!props.imageActionUrl) {
|
|
504
|
-
return
|
|
502
|
+
return require$$0.jsx("div", { className: "chat-card-img", children: content });
|
|
505
503
|
}
|
|
506
504
|
else {
|
|
507
|
-
return (
|
|
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 (
|
|
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
|
|
519
|
+
return require$$0.jsx("div", { className: props.className });
|
|
523
520
|
}
|
|
524
|
-
return
|
|
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 =
|
|
526
|
+
var handleButton = require$$1.useCallback(function () {
|
|
530
527
|
onClick(button);
|
|
531
528
|
}, [button, onClick]);
|
|
532
|
-
return
|
|
529
|
+
return require$$0.jsx(ActionButton, { onClick: handleButton, addClass: "button-card", label: button.label });
|
|
533
530
|
};
|
|
534
|
-
var ChatActionButton =
|
|
531
|
+
var ChatActionButton = require$$1.memo(ChatActionButtonInner);
|
|
535
532
|
|
|
536
533
|
var ChatActionButtonsInner = function (props) {
|
|
537
|
-
return (
|
|
538
|
-
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 (
|
|
550
|
+
return (require$$0.jsx("button", { onClick: props.onClick, className: "xa-chevron", children: getLeftArrowSvg() }));
|
|
562
551
|
};
|
|
563
552
|
|
|
564
553
|
function getRightArrowSvg() {
|
|
565
|
-
return (
|
|
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 (
|
|
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 =
|
|
574
|
-
var _a =
|
|
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 (
|
|
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 (
|
|
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 =
|
|
621
|
-
var _a =
|
|
622
|
-
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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 =
|
|
742
|
+
var _a = require$$1.useState(false), showBubble = _a[0], setShowBubble = _a[1];
|
|
768
743
|
log("[CtaBubbleContainer] Current state: showBubble=".concat(showBubble));
|
|
769
|
-
|
|
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 (
|
|
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 =
|
|
846
|
-
var _d =
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
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 =
|
|
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
|
-
|
|
955
|
-
|
|
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
|
|
967
|
-
|
|
968
|
-
|
|
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 (
|
|
976
|
-
|
|
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
|
|
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
|
|
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 (
|
|
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 (
|
|
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 =
|
|
1424
|
-
var handleChange =
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
1420
|
+
return jsxRuntime.jsx(RichTextNormalSpan, { text: text, format: format, readOnly: readOnly });
|
|
1453
1421
|
case "bold":
|
|
1454
|
-
return
|
|
1422
|
+
return jsxRuntime.jsx(RichTextBoldSpan, { text: text, format: format, readOnly: readOnly });
|
|
1455
1423
|
case "inputText":
|
|
1456
|
-
return (
|
|
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 =
|
|
1586
|
-
var handleInput =
|
|
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 =
|
|
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 (
|
|
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 =
|
|
1608
|
-
onChange
|
|
1609
|
-
|
|
1610
|
-
|
|
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 =
|
|
1614
|
-
onChange
|
|
1582
|
+
var handleRichChange = react.useCallback(function (val) {
|
|
1583
|
+
if (onChange) {
|
|
1584
|
+
onChange(val);
|
|
1585
|
+
}
|
|
1615
1586
|
}, [onChange]);
|
|
1616
|
-
var handleInput =
|
|
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 =
|
|
1595
|
+
var handleRichInput = react.useCallback(function (val) {
|
|
1625
1596
|
if (onInput) {
|
|
1626
1597
|
onInput(val);
|
|
1627
1598
|
}
|
|
1628
1599
|
}, [onInput]);
|
|
1629
|
-
var handleKeyDown =
|
|
1600
|
+
var handleKeyDown = react.useCallback(function (event) {
|
|
1630
1601
|
if (onKeyDown) {
|
|
1631
1602
|
onKeyDown(event);
|
|
1632
1603
|
}
|
|
1633
1604
|
}, [onKeyDown]);
|
|
1634
|
-
var inputRef =
|
|
1605
|
+
var inputRef = react.useRef(null);
|
|
1635
1606
|
var inputNode = inputRef.current;
|
|
1636
|
-
|
|
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 (
|
|
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
|
|
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 =
|
|
1641
|
+
var handleClick = react.useCallback(function () {
|
|
1672
1642
|
onClick(data);
|
|
1673
1643
|
}, [data, onClick]);
|
|
1674
|
-
var handleHover =
|
|
1644
|
+
var handleHover = react.useCallback(function () {
|
|
1675
1645
|
if (onHover) {
|
|
1676
1646
|
onHover(data);
|
|
1677
1647
|
}
|
|
1678
1648
|
}, [data, onHover]);
|
|
1679
|
-
var handleSpanClick =
|
|
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 =
|
|
1686
|
-
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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 (
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
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 =
|
|
1882
|
+
var _a = react.useState({
|
|
1922
1883
|
state: "paused"
|
|
1923
1884
|
}), value = _a[0], setValue = _a[1];
|
|
1924
1885
|
var pause = options.pause;
|
|
1925
|
-
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
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
|
-
|
|
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 =
|
|
8053
|
+
var ChatServerContext = require$$1.createContext(null);
|
|
7885
8054
|
function useChatServer(config, options) {
|
|
7886
|
-
var _a =
|
|
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 =
|
|
8059
|
+
var prevDepsRef = require$$1.useRef(undefined);
|
|
7891
8060
|
// Log what caused the "effect"
|
|
7892
8061
|
// useWhatChanged(deps, "options, config, dispatch");
|
|
7893
|
-
|
|
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 =
|
|
7933
|
-
return
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 ? (
|
|
8059
|
-
|
|
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 (
|
|
8072
|
-
|
|
8073
|
-
|
|
8074
|
-
|
|
8075
|
-
|
|
8076
|
-
|
|
8077
|
-
|
|
8078
|
-
|
|
8079
|
-
|
|
8080
|
-
|
|
8081
|
-
|
|
8082
|
-
|
|
8083
|
-
|
|
8084
|
-
|
|
8085
|
-
|
|
8086
|
-
|
|
8087
|
-
|
|
8088
|
-
|
|
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(
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
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
|
|
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 =
|
|
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 (
|
|
8183
|
-
|
|
8184
|
-
|
|
8185
|
-
|
|
8186
|
-
|
|
8187
|
-
|
|
8188
|
-
|
|
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
|
|
8458
|
+
var UnknownMessage = function () { return require$$0.jsx(require$$0.Fragment, {}); };
|
|
8208
8459
|
|
|
8209
8460
|
function renderAvatar(entity) {
|
|
8210
|
-
return (
|
|
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
|
-
|
|
8219
|
-
|
|
8220
|
-
|
|
8221
|
-
|
|
8222
|
-
|
|
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
|
|
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
|
|
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 =
|
|
8520
|
+
var card = require$$1.useMemo(function () { return convertFromCardDisplay(msg); }, [msg]);
|
|
8274
8521
|
var user = ctx.user;
|
|
8275
8522
|
var handleButton = useButtonCallback();
|
|
8276
|
-
return (
|
|
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
|
|
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 =
|
|
8570
|
+
var _a = require$$1.useState(array.getArray()), res = _a[0], setRes = _a[1];
|
|
8326
8571
|
var mounted = useIsMounted();
|
|
8327
|
-
|
|
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
|
|
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 (
|
|
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 =
|
|
8616
|
+
var handleClick = require$$1.useCallback(function (ev) {
|
|
8374
8617
|
ev.preventDefault();
|
|
8375
8618
|
}, []);
|
|
8376
|
-
return (
|
|
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 =
|
|
8729
|
+
var handleClick = require$$1.useCallback(function (ev) {
|
|
8487
8730
|
ev.preventDefault();
|
|
8488
8731
|
}, []);
|
|
8489
|
-
return (
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 =
|
|
8759
|
+
var list = require$$1.useMemo(function () { return convertFromListDisplay(msg); }, [msg]);
|
|
8532
8760
|
var executeActionCallback = useExecuteActionCallback();
|
|
8533
|
-
var handleExecute =
|
|
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 (
|
|
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
|
|
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 =
|
|
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 (
|
|
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 =
|
|
8794
|
+
var items = require$$1.useMemo(function () { return convertToMultiSelectItems(msg); }, [msg]);
|
|
8574
8795
|
var user = ctx.user;
|
|
8575
|
-
var _a =
|
|
8576
|
-
var handleSubmit =
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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 =
|
|
8846
|
+
var handleClick = require$$1.useCallback(function () {
|
|
8631
8847
|
if (onClick) {
|
|
8632
8848
|
onClick();
|
|
8633
8849
|
}
|
|
8634
8850
|
}, [onClick]);
|
|
8635
|
-
return (
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
8929
|
+
var handleResult = require$$1.useCallback(function (position, userMsg) {
|
|
8720
8930
|
handleSend({
|
|
8721
8931
|
text: userMsg,
|
|
8722
|
-
location: position
|
|
8723
|
-
|
|
8724
|
-
|
|
8725
|
-
|
|
8726
|
-
|
|
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 =
|
|
8948
|
+
var handleDeny = require$$1.useCallback(function (label) {
|
|
8737
8949
|
handleResult(undefined, label);
|
|
8738
8950
|
}, [handleResult]);
|
|
8739
|
-
var handleAllow =
|
|
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
|
|
8961
|
+
return require$$0.jsx(require$$0.Fragment, {});
|
|
8750
8962
|
}
|
|
8751
|
-
return (
|
|
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() +
|
|
8969
|
+
var time = date.getHours() + ":" + date.getMinutes();
|
|
8762
8970
|
var agentMessage = isAgent(props.message.user.nick);
|
|
8763
|
-
return (
|
|
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 (
|
|
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 =
|
|
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 (
|
|
8810
|
-
|
|
8811
|
-
|
|
8812
|
-
|
|
8813
|
-
|
|
8814
|
-
|
|
8815
|
-
|
|
8816
|
-
|
|
8817
|
-
|
|
8818
|
-
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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 =
|
|
8938
|
-
var ctx =
|
|
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
|
-
|
|
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 =
|
|
8987
|
-
var _b =
|
|
8988
|
-
var _c =
|
|
8989
|
-
var _d =
|
|
8990
|
-
|
|
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
|
-
|
|
9187
|
+
require$$1.useEffect(function () {
|
|
8994
9188
|
setContextState(context);
|
|
8995
9189
|
}, [context]);
|
|
8996
|
-
var suggestionItem =
|
|
8997
|
-
var shift =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
9053
|
-
var _c =
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 ?
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
9432
|
+
var handleClear = require$$1.useCallback(function () {
|
|
9253
9433
|
onChange({
|
|
9254
9434
|
text: "",
|
|
9255
9435
|
formats: [],
|
|
9256
9436
|
});
|
|
9257
9437
|
}, [onChange]);
|
|
9258
|
-
var handleKeyDown =
|
|
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 (
|
|
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
|
-
|
|
9285
|
-
|
|
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 =
|
|
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
|
|
9477
|
+
return require$$0.jsx(require$$0.Fragment, {});
|
|
9303
9478
|
}
|
|
9304
|
-
return (
|
|
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 =
|
|
9310
|
-
var _b =
|
|
9311
|
-
|
|
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 =
|
|
9323
|
-
var handleSpanClick =
|
|
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
|
-
|
|
9506
|
+
require$$1.useEffect(function () {
|
|
9332
9507
|
setActiveItem(item);
|
|
9333
9508
|
}, [item]);
|
|
9334
|
-
var actions =
|
|
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
|
|
9514
|
+
return require$$0.jsx(MarkdownBuilder, { text: line });
|
|
9340
9515
|
}
|
|
9341
|
-
return
|
|
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 (
|
|
9346
|
-
|
|
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 =
|
|
9356
|
-
var _e =
|
|
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 =
|
|
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 =
|
|
9369
|
-
var _g =
|
|
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 =
|
|
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 =
|
|
9573
|
+
var handleItemClick = require$$1.useCallback(function (data) {
|
|
9401
9574
|
handleSubmit(data);
|
|
9402
9575
|
}, [handleSubmit]);
|
|
9403
|
-
var handleItemUse =
|
|
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 (
|
|
9411
|
-
|
|
9412
|
-
|
|
9413
|
-
|
|
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
|
|
9456
|
-
return
|
|
9457
|
-
}
|
|
9458
|
-
return (
|
|
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
|
|
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 =
|
|
9632
|
+
var rateGoodButtonOnClick = require$$1.useCallback(function () {
|
|
9480
9633
|
onRate("good");
|
|
9481
9634
|
}, [onRate]);
|
|
9482
|
-
var rateAgainButtonOnClick =
|
|
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 (!
|
|
9639
|
+
if (!shouldDisplay) {
|
|
9487
9640
|
return null;
|
|
9488
9641
|
}
|
|
9489
|
-
if (!
|
|
9490
|
-
return (
|
|
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 (
|
|
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 =
|
|
9652
|
+
var handleRate = require$$1.useCallback(function (rating) {
|
|
9508
9653
|
dispatch(sendChatRating(rating));
|
|
9509
9654
|
}, [dispatch]);
|
|
9510
|
-
return (
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
31176
|
+
var failureMessage = require$$1.useMemo(function () {
|
|
31034
31177
|
return compileSlotValues(text, slots);
|
|
31035
31178
|
}, [text, slots]);
|
|
31036
31179
|
if (countdown === 0) {
|
|
31037
|
-
return
|
|
31180
|
+
return require$$0.jsx(require$$0.Fragment, {});
|
|
31038
31181
|
}
|
|
31039
|
-
return (
|
|
31040
|
-
|
|
31041
|
-
|
|
31042
|
-
|
|
31043
|
-
|
|
31044
|
-
|
|
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 (
|
|
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 =
|
|
31058
|
-
var email =
|
|
31059
|
-
var message =
|
|
31060
|
-
var form =
|
|
31061
|
-
var _a =
|
|
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 (
|
|
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 (
|
|
31095
|
-
|
|
31096
|
-
|
|
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
|
|
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 =
|
|
31241
|
+
var handleSubmit = require$$1.useCallback(function (data) {
|
|
31118
31242
|
dispatch(sendOfflineMsg(data));
|
|
31119
31243
|
}, [dispatch]);
|
|
31120
|
-
return (
|
|
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 =
|
|
31248
|
+
var _a = require$$1.useState(false), sent = _a[0], setSent = _a[1];
|
|
31127
31249
|
var onSubmit = props.onSubmit;
|
|
31128
|
-
var handleSubmit =
|
|
31250
|
+
var handleSubmit = require$$1.useCallback(function (msg) {
|
|
31129
31251
|
onSubmit(msg);
|
|
31130
31252
|
setSent(true);
|
|
31131
31253
|
}, [onSubmit]);
|
|
31132
|
-
return
|
|
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 =
|
|
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 (
|
|
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
|
|
31154
|
-
position:
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31191
|
-
|
|
31192
|
-
|
|
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 (
|
|
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 (
|
|
31215
|
-
|
|
31216
|
-
|
|
31217
|
-
|
|
31218
|
-
|
|
31219
|
-
|
|
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
|
|
31230
|
-
visible:
|
|
31231
|
-
|
|
31232
|
-
|
|
31233
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
31363
|
+
require$$1.useEffect(function () {
|
|
31266
31364
|
scrollToBottom("smooth");
|
|
31267
|
-
}, [
|
|
31365
|
+
}, [messages, agents, scrollToBottom]);
|
|
31268
31366
|
// Handle WS button dismissal - only scroll when button is removed
|
|
31269
|
-
|
|
31367
|
+
require$$1.useEffect(function () {
|
|
31270
31368
|
var prevHasButton = prevHasWsButtonRef.current;
|
|
31271
|
-
var currentHasButton =
|
|
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
|
-
}, [
|
|
31287
|
-
var handleSend =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
31438
|
+
return require$$0.jsx(OfflineFormContainer, { time: time }, "offline-".concat(msg.timestamp));
|
|
31340
31439
|
case "chat.prechat":
|
|
31341
|
-
return
|
|
31440
|
+
return require$$0.jsx(PrechatFormContainer, { time: time }, "prechat");
|
|
31342
31441
|
default:
|
|
31343
|
-
return (
|
|
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 =
|
|
31357
|
-
if (
|
|
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
|
|
31363
|
-
// const next =
|
|
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 ===
|
|
31484
|
+
if (index === 0 || index === messages.length - 1 || index === lastMsgIndex) {
|
|
31389
31485
|
showTs = true;
|
|
31390
31486
|
}
|
|
31391
31487
|
else {
|
|
31392
|
-
var previous =
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
31771
|
-
var _c =
|
|
31772
|
-
var _d =
|
|
31773
|
-
var _e =
|
|
31774
|
-
var _f =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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 (
|
|
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 =
|
|
32050
|
-
var _c =
|
|
32051
|
-
var _d =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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 (
|
|
32124
|
-
|
|
32125
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
32167
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
32205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
32258
|
-
if (!
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 (
|
|
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 =
|
|
34208
|
+
var store = require$$1.useMemo(function () {
|
|
34096
34209
|
return createStaticStore(state);
|
|
34097
34210
|
}, [state]);
|
|
34098
|
-
var config =
|
|
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 (
|
|
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 =
|
|
34227
|
+
var state = require$$1.useMemo(function () {
|
|
34116
34228
|
return createStateFromMessages(messages);
|
|
34117
34229
|
}, [messages]);
|
|
34118
|
-
return
|
|
34230
|
+
return require$$0.jsx(StaticChatWidgetContainer, { state: state, mode: props.mode, config: props.config });
|
|
34119
34231
|
};
|
|
34120
34232
|
|
|
34121
|
-
exports.React =
|
|
34233
|
+
exports.React = require$$1;
|
|
34122
34234
|
exports.ActionButton = ActionButton;
|
|
34123
34235
|
exports.Avatar = Avatar;
|
|
34124
34236
|
exports.CardMiddleware = CardMiddleware;
|