@xapp/chat-widget 1.64.2 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -12,14 +12,15 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
12
12
  var React__default$1 = /*#__PURE__*/_interopDefaultLegacy(React$1);
13
13
  var thunk__default = /*#__PURE__*/_interopDefaultLegacy(thunk);
14
14
 
15
- var ActionButton = function (props) {
15
+ var ActionButton = function (_a) {
16
+ var label = _a.label, disable = _a.disable, type = _a.type, addClass = _a.addClass, onClick = _a.onClick;
16
17
  function handleClick(ev) {
17
18
  ev.stopPropagation();
18
- if (props.onClick) {
19
- props.onClick(props.label);
19
+ if (onClick) {
20
+ onClick(label);
20
21
  }
21
22
  }
22
- return (React__default$1["default"].createElement("button", { type: props.type, className: "action-button ".concat(props.addClass), onClick: handleClick }, props.label));
23
+ return (React__default$1["default"].createElement("button", { disabled: disable, type: type, className: "action-button ".concat(addClass), onClick: handleClick }, label));
23
24
  };
24
25
 
25
26
  var defaultServerUrl = "";
@@ -678,40 +679,45 @@ var CtaBubble = function (props) {
678
679
  };
679
680
 
680
681
  var CtaBubbleContainer = function (props) {
681
- var visible = props.visible, timeout = props.timeout, delay = props.delay, animate = props.animate, buttonAnimation = props.buttonAnimation, onClick = props.onClick;
682
+ var visible = props.visible, timeout = props.timeout, delay = props.delay, animate = props.animate, buttonAnimation = props.buttonAnimation, onClick = props.onClick, children = props.children;
682
683
  var startTime = React$1.useMemo(function () {
683
- if (visible) {
684
- return new Date().valueOf();
685
- }
686
- return undefined;
684
+ return visible ? new Date().valueOf() : undefined;
687
685
  }, [visible]);
688
686
  var _a = React$1.useState(false), showBubble = _a[0], setShowBubble = _a[1];
687
+ var isMounted = React$1.useRef(true);
689
688
  React$1.useEffect(function () {
690
- var isMounted = true;
689
+ var hideTimer = null;
691
690
  if (startTime) {
692
691
  var delayTimer_1 = setTimeout(function () {
693
- if (isMounted) {
692
+ if (isMounted.current) {
694
693
  setShowBubble(true);
695
694
  }
696
- var hideTimer = setTimeout(function () {
697
- if (isMounted) {
698
- setShowBubble(false);
699
- }
700
- }, timeout);
701
- return function () {
702
- clearTimeout(hideTimer);
703
- };
695
+ if (typeof timeout === "number") {
696
+ hideTimer = setTimeout(function () {
697
+ if (isMounted.current) {
698
+ setShowBubble(false);
699
+ }
700
+ }, timeout);
701
+ }
704
702
  }, delay);
705
703
  return function () {
706
- isMounted = false;
704
+ if (hideTimer) {
705
+ clearTimeout(hideTimer);
706
+ }
707
707
  clearTimeout(delayTimer_1);
708
+ isMounted.current = false;
708
709
  };
709
710
  }
711
+ // Return a cleanup function for the case where startTime is undefined
710
712
  return function () {
711
- isMounted = false;
713
+ if (hideTimer) {
714
+ clearTimeout(hideTimer);
715
+ }
716
+ isMounted.current = false;
712
717
  };
713
718
  }, [startTime, timeout, delay]);
714
- return (React__default$1["default"].createElement(React__default$1["default"].Fragment, null, visible && showBubble && React__default$1["default"].createElement(CtaBubble, { onClick: onClick, animate: animate, buttonAnimation: buttonAnimation }, props.children)));
719
+ console.log("visible ".concat(visible, " showBubble ").concat(showBubble));
720
+ return (React__default$1["default"].createElement(React__default$1["default"].Fragment, null, visible && showBubble && React__default$1["default"].createElement(CtaBubble, { onClick: onClick, animate: animate, buttonAnimation: buttonAnimation }, children)));
715
721
  };
716
722
 
717
723
  var ChatButton = function (_a) {
@@ -753,7 +759,7 @@ var ChatButton = function (_a) {
753
759
  setAnimate(false);
754
760
  }, configToApply.animationTimeout);
755
761
  }
756
- else {
762
+ else if (configToApply === null || configToApply === void 0 ? void 0 : configToApply.animation) {
757
763
  // No delay or timeout, start animation immediately
758
764
  setAnimate(true);
759
765
  }
@@ -796,8 +802,8 @@ var ChatButton = function (_a) {
796
802
  // Fallback to default SVG
797
803
  React__default$1["default"].createElement("svg", { width: svgSize, height: svgSize, viewBox: "0 0 22 22" },
798
804
  React__default$1["default"].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" })))),
799
- config && config.message && (React__default$1["default"].createElement("div", { className: "xapp-chat-button__cta" },
800
- React__default$1["default"].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, visible: !visible }, config.message)))));
805
+ configToApply && configToApply.message && (React__default$1["default"].createElement("div", { className: "xapp-chat-button__cta" },
806
+ React__default$1["default"].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, visible: !visible /** Why is this !visible */ }, configToApply === null || configToApply === void 0 ? void 0 : configToApply.message)))));
801
807
  };
802
808
 
803
809
  var ChatCard = function (props) {
@@ -7949,11 +7955,17 @@ function useSuggestions(search, context) {
7949
7955
  }); }, [suggestions, suggestionIndex, execute, suggestionItem]);
7950
7956
  }
7951
7957
 
7952
- var AdminBar = function (_props) {
7958
+ var AdminBar = function (_a) {
7959
+ var onAdminJoin = _a.onAdminJoin;
7953
7960
  var name = React$1.useRef(null);
7954
7961
  // We can manage this locally
7955
7962
  // const hasAdminJoined = useSelector<ChatState, boolean | undefined>(state => state.hasAdminJoined);
7956
- var _a = React$1.useState(false), joined = _a[0], setJoined = _a[1];
7963
+ var _b = React$1.useState(false), joined = _b[0], setJoined = _b[1];
7964
+ var _c = React$1.useState(""), inputName = _c[0], setInputName = _c[1];
7965
+ function handleInputChange(event) {
7966
+ setInputName(event.target.value);
7967
+ }
7968
+ var disable = inputName === "" || inputName === undefined;
7957
7969
  var dispatch = useChatServerDispatch();
7958
7970
  function onSubmit(event) {
7959
7971
  var _a;
@@ -7961,18 +7973,21 @@ var AdminBar = function (_props) {
7961
7973
  if (!joined) {
7962
7974
  dispatch(sendBargeIn((_a = name.current) === null || _a === void 0 ? void 0 : _a.value));
7963
7975
  setJoined(true);
7976
+ onAdminJoin(true);
7964
7977
  }
7965
7978
  else {
7966
7979
  dispatch(sendBargeOut());
7967
7980
  setJoined(false);
7981
+ onAdminJoin(false);
7982
+ setInputName("");
7968
7983
  }
7969
7984
  }
7970
7985
  function renderJoin() {
7971
7986
  return (React__default$1["default"].createElement("form", { className: "xappw-admin-input-form", onSubmit: onSubmit },
7972
7987
  React__default$1["default"].createElement("div", { className: "xappw-admin-input-form__buttons" },
7973
- React__default$1["default"].createElement(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Join" })),
7988
+ React__default$1["default"].createElement(ActionButton, { addClass: "xappw-admin-input-form__btn", type: "submit", label: "Join", disable: disable })),
7974
7989
  React__default$1["default"].createElement("div", { className: "xappw-admin-input" },
7975
- React__default$1["default"].createElement("input", { ref: name, id: "adminBarInput", placeholder: "Type your name here...", className: "xappw-admin-input__input" }))));
7990
+ React__default$1["default"].createElement("input", { ref: name, id: "adminBarInput", placeholder: "Type your name here...", className: "xappw-admin-input__input", onChange: handleInputChange }))));
7976
7991
  }
7977
7992
  function renderLeave() {
7978
7993
  return (React__default$1["default"].createElement("form", { className: "xappw-admin-input-form", onSubmit: onSubmit },
@@ -8244,10 +8259,11 @@ var ChatFooter = function (props) {
8244
8259
  var menuButtonTabIndex = (_a = menuConfig === null || menuConfig === void 0 ? void 0 : menuConfig.button) === null || _a === void 0 ? void 0 : _a.tabIndex;
8245
8260
  var menuItems = React$1.useMemo(function () { return menuItemsRaw ? menuItemsRaw : []; }, [menuItemsRaw]);
8246
8261
  var brandingEnabled = (_b = footerConfig === null || footerConfig === void 0 ? void 0 : footerConfig.branding) === null || _b === void 0 ? void 0 : _b.enabled;
8247
- var _e = React$1.useState({
8262
+ var _e = React$1.useState(false), isAdminJoined = _e[0], setAdminJoined = _e[1];
8263
+ var _f = React$1.useState({
8248
8264
  text: "",
8249
8265
  formats: []
8250
- }), input = _e[0], setInput = _e[1];
8266
+ }), input = _f[0], setInput = _f[1];
8251
8267
  function toggleDrawer() {
8252
8268
  var newDrawer = !drawerOpen;
8253
8269
  setDrawerState(newDrawer);
@@ -8283,6 +8299,9 @@ var ChatFooter = function (props) {
8283
8299
  setInput(data);
8284
8300
  setSuggestionSearch(data.text);
8285
8301
  }, []);
8302
+ var handleAdminJoin = function (status) {
8303
+ setAdminJoined(status);
8304
+ };
8286
8305
  return (React__default$1["default"].createElement("div", { className: "chat-footer background-footer", "aria-label": menuItems.length ? "to open menu click a button above the rounded rectangle at the bottom of widget" : "", "aria-hidden": false },
8287
8306
  showMenu && menuItems.length ?
8288
8307
  React__default$1["default"].createElement(React__default$1["default"].Fragment, null,
@@ -8290,10 +8309,11 @@ var ChatFooter = function (props) {
8290
8309
  React__default$1["default"].createElement("div", { className: "chat-footer__menu-icon" },
8291
8310
  React__default$1["default"].createElement(DrawerBars, { tabIndex: menuButtonTabIndex, onToggle: toggleDrawer }))) : React__default$1["default"].createElement(React__default$1["default"].Fragment, null),
8292
8311
  React__default$1["default"].createElement(Suggestions, { className: "xappw-chat-footer__suggestions", data: suggestions.suggestions, index: suggestions.index, searchTerms: suggestionSearch, onItemClick: handleItemClick, onItemUse: handleItemUse }),
8293
- props.isAdmin && props.isChatting && props.visible && React__default$1["default"].createElement(AdminBar, null),
8294
- React__default$1["default"].createElement(Input, { addClass: "chat-footer__input " + (props.isChatting && props.visible ? "visible" : ""), suggestion: suggestions.item, value: input, placeholder: placeholder, sendButtonIcon: sendButtonIcon, footerConfig: footerConfig, inputConfig: inputConfig, onSubmit: handleSubmit, onChange: handleChange, onSuggestionCommand: suggestions.execute,
8295
- // onFocus={this.inputOnFocus}
8296
- onFileUpload: props.onFileUpload }),
8312
+ props.isAdmin && props.isChatting && props.visible && React__default$1["default"].createElement(AdminBar, { onAdminJoin: handleAdminJoin }),
8313
+ React__default$1["default"].createElement("div", { style: { pointerEvents: isAdminJoined ? "auto" : "none", opacity: isAdminJoined ? 1 : 0.5 } },
8314
+ React__default$1["default"].createElement(Input, { addClass: "chat-footer__input " + (props.isChatting && props.visible ? "visible" : ""), suggestion: suggestions.item, value: input, placeholder: placeholder, sendButtonIcon: sendButtonIcon, footerConfig: footerConfig, inputConfig: inputConfig, onSubmit: handleSubmit, onChange: handleChange, onSuggestionCommand: suggestions.execute,
8315
+ // onFocus={this.inputOnFocus}
8316
+ onFileUpload: props.onFileUpload })),
8297
8317
  brandingEnabled && React__default$1["default"].createElement(ChatBranding, { text: 'Powered by [XAPP AI](https://xapp.ai)' })));
8298
8318
  };
8299
8319