@botonic/react 0.20.1-alpha.1 → 0.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/lib/app.js +4 -3
  2. package/lib/app.js.map +1 -1
  3. package/lib/components/button.js +22 -2
  4. package/lib/components/button.js.map +1 -1
  5. package/lib/components/buttons-disabler.js +2 -2
  6. package/lib/components/carousel.js +2 -2
  7. package/lib/components/custom-message.js +2 -2
  8. package/lib/components/document.js +2 -2
  9. package/lib/components/image.js +28 -32
  10. package/lib/components/image.js.map +1 -1
  11. package/lib/components/message.js +2 -2
  12. package/lib/components/multichannel/facebook/facebook.js +2 -2
  13. package/lib/components/reply.js +2 -2
  14. package/lib/components/subtitle.js +2 -2
  15. package/lib/components/text.js +2 -2
  16. package/lib/components/timestamps.js +2 -2
  17. package/lib/components/title.js +2 -2
  18. package/lib/constants.js +201 -0
  19. package/lib/constants.js.map +1 -0
  20. package/lib/contexts.js +57 -0
  21. package/lib/contexts.js.map +1 -0
  22. package/lib/dev-app.js +241 -0
  23. package/lib/dev-app.js.map +1 -0
  24. package/lib/index.d.ts +241 -0
  25. package/lib/index.js +131 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/message-utils.js +149 -0
  28. package/lib/message-utils.js.map +1 -0
  29. package/lib/msg-to-botonic.js +199 -0
  30. package/lib/msg-to-botonic.js.map +1 -0
  31. package/lib/node-app.js +97 -0
  32. package/lib/node-app.js.map +1 -0
  33. package/lib/react-bot.js +167 -0
  34. package/lib/react-bot.js.map +1 -0
  35. package/lib/util/dom.js +84 -0
  36. package/lib/util/dom.js.map +1 -0
  37. package/lib/util/environment.js +42 -0
  38. package/lib/util/environment.js.map +1 -0
  39. package/lib/util/error-boundary.js +105 -0
  40. package/lib/util/error-boundary.js.map +1 -0
  41. package/lib/util/index.d.ts +9 -0
  42. package/lib/util/index.js +2 -0
  43. package/lib/util/index.js.map +1 -0
  44. package/lib/util/logs.js +28 -0
  45. package/lib/util/logs.js.map +1 -0
  46. package/lib/util/objects.js +60 -0
  47. package/lib/util/objects.js.map +1 -0
  48. package/lib/util/react.js +75 -0
  49. package/lib/util/react.js.map +1 -0
  50. package/lib/util/regexs.js +31 -0
  51. package/lib/util/regexs.js.map +1 -0
  52. package/lib/util/webchat.js +92 -0
  53. package/lib/util/webchat.js.map +1 -0
  54. package/lib/webchat/actions.js +53 -0
  55. package/lib/webchat/actions.js.map +1 -0
  56. package/lib/webchat/components/attachment.js +43 -0
  57. package/lib/webchat/components/attachment.js.map +1 -0
  58. package/lib/webchat/components/common.js +33 -0
  59. package/lib/webchat/components/common.js.map +1 -0
  60. package/lib/webchat/components/emoji-picker.js +58 -0
  61. package/lib/webchat/components/emoji-picker.js.map +1 -0
  62. package/lib/webchat/components/persistent-menu.js +96 -0
  63. package/lib/webchat/components/persistent-menu.js.map +1 -0
  64. package/lib/webchat/components/send-button.js +27 -0
  65. package/lib/webchat/components/send-button.js.map +1 -0
  66. package/lib/webchat/components/styled-scrollbar.js +55 -0
  67. package/lib/webchat/components/styled-scrollbar.js.map +1 -0
  68. package/lib/webchat/components/styled-scrollbar.scss +12 -0
  69. package/lib/webchat/components/typing-indicator.js +27 -0
  70. package/lib/webchat/components/typing-indicator.js.map +1 -0
  71. package/lib/webchat/components/typing-indicator.scss +38 -0
  72. package/lib/webchat/devices/device-adapter.js +82 -0
  73. package/lib/webchat/devices/device-adapter.js.map +1 -0
  74. package/lib/webchat/devices/index.js +32 -0
  75. package/lib/webchat/devices/index.js.map +1 -0
  76. package/lib/webchat/devices/scrollbar-controller.js +152 -0
  77. package/lib/webchat/devices/scrollbar-controller.js.map +1 -0
  78. package/lib/webchat/devices/webchat-resizer.js +76 -0
  79. package/lib/webchat/devices/webchat-resizer.js.map +1 -0
  80. package/lib/webchat/header.js +116 -0
  81. package/lib/webchat/header.js.map +1 -0
  82. package/lib/webchat/hooks.js +359 -0
  83. package/lib/webchat/hooks.js.map +1 -0
  84. package/lib/webchat/index.d.ts +62 -0
  85. package/lib/webchat/index.js +32 -0
  86. package/lib/webchat/index.js.map +1 -0
  87. package/lib/webchat/message-list.js +88 -0
  88. package/lib/webchat/message-list.js.map +1 -0
  89. package/lib/webchat/messages-reducer.js +93 -0
  90. package/lib/webchat/messages-reducer.js.map +1 -0
  91. package/lib/webchat/replies.js +78 -0
  92. package/lib/webchat/replies.js.map +1 -0
  93. package/lib/webchat/session-view.js +106 -0
  94. package/lib/webchat/session-view.js.map +1 -0
  95. package/lib/webchat/use-storage-state-hook.js +29 -0
  96. package/lib/webchat/use-storage-state-hook.js.map +1 -0
  97. package/lib/webchat/webchat-dev.js +109 -0
  98. package/lib/webchat/webchat-dev.js.map +1 -0
  99. package/lib/webchat/webchat-reducer.js +108 -0
  100. package/lib/webchat/webchat-reducer.js.map +1 -0
  101. package/lib/webchat/webchat.js +1059 -0
  102. package/lib/webchat/webchat.js.map +1 -0
  103. package/lib/webchat/webview.js +122 -0
  104. package/lib/webchat/webview.js.map +1 -0
  105. package/lib/webchat-app.js +653 -0
  106. package/lib/webchat-app.js.map +1 -0
  107. package/lib/webchat.template.html +37 -0
  108. package/lib/webview.js +214 -0
  109. package/lib/webview.js.map +1 -0
  110. package/lib/webview.template.html +39 -0
  111. package/package.json +2 -2
  112. package/src/components/button.jsx +21 -1
  113. package/src/components/image.jsx +22 -27
  114. package/src/components/index.d.ts +5 -1
  115. package/src/constants.js +1 -0
  116. package/src/index.d.ts +3 -7
  117. package/src/index.js +0 -1
  118. package/src/webchat/actions.jsx +1 -1
  119. package/src/webchat/hooks.js +5 -5
  120. package/src/webchat/webchat-reducer.js +3 -3
  121. package/src/webchat/webchat.jsx +20 -17
  122. package/src/webchat-app.jsx +4 -4
  123. package/src/webchat/components/portal-modal/backdrop.jsx +0 -38
  124. package/src/webchat/components/portal-modal/constants.js +0 -7
  125. package/src/webchat/components/portal-modal/content.jsx +0 -10
  126. package/src/webchat/components/portal-modal/index.js +0 -5
  127. package/src/webchat/components/portal-modal/portal-modal-component.jsx +0 -72
  128. package/src/webchat/components/portal-modal/portal.jsx +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/devices/scrollbar-controller.js"],"names":["debounced","delay","fn","timerId","args","clearTimeout","setTimeout","stopAtScrollLimit","element","scrollTop","scrollHeight","clientHeight","ScrollbarController","currentDevice","host","webchat","DEVICES","MOBILE","IPHONE","limitScrollBoundaries","ontouchstart","e","handleOnTouchMoveEvents","ontouchmove","onmouseover","handleOnMouseOverEvents","scrollableArea","isScrollable","visible","full","target","currentTarget","toggleOnMouseWheelEvents","parentNode","scrollableContent","hasScrollbar","onmousewheel","preventDefault","toggleOnTouchMoveEvents","frame","dStopAtScrollLimit","window","addEventListener","attachEvent"],"mappings":"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","sourcesContent":["import {\n getScrollableArea,\n getScrollableContent,\n getWebchatElement,\n} from '../../util/dom'\nimport { DEVICES, isMobileDevice } from '.'\n\nconst debounced = (delay, fn) => {\n let timerId\n return function (...args) {\n if (timerId) {\n clearTimeout(timerId)\n }\n timerId = setTimeout(() => {\n fn(...args)\n timerId = null\n }, delay)\n }\n}\n\nconst stopAtScrollLimit = element => {\n if (element.scrollTop === 0) element.scrollTop = 1\n if (element.scrollHeight - element.scrollTop === element.clientHeight)\n element.scrollTop -= 1\n}\n\nexport class ScrollbarController {\n constructor(currentDevice, host) {\n this.currentDevice = currentDevice\n this.webchat = getWebchatElement(host)\n }\n\n handleScrollEvents() {\n /*\n It handles scroll events for Mobile/Desktop.\n \"ontouchmove\" is the phone equivalent for \"onmouseover\"\n */\n if (isMobileDevice()) {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return\n this.limitScrollBoundaries()\n this.webchat.ontouchstart = e => {\n this.handleOnTouchMoveEvents(e)\n }\n this.webchat.ontouchmove = e => {\n this.handleOnTouchMoveEvents(e)\n }\n } else {\n this.webchat.onmouseover = e => this.handleOnMouseOverEvents(e)\n }\n }\n\n hasScrollbar() {\n const scrollableArea = getScrollableArea(this.webchat)\n const isScrollable =\n scrollableArea.visible.clientHeight - scrollableArea.full.clientHeight < 0\n return isScrollable\n }\n\n handleOnMouseOverEvents(e) {\n let target = e.currentTarget\n while (target) {\n this.toggleOnMouseWheelEvents()\n target = target.parentNode\n }\n }\n\n toggleOnMouseWheelEvents() {\n const scrollableContent = getScrollableContent(this.webchat)\n if (this.hasScrollbar()) {\n scrollableContent.onmousewheel = {}\n return\n }\n scrollableContent.onmousewheel = e => e.preventDefault()\n }\n\n handleOnTouchMoveEvents(e) {\n this.toggleOnTouchMoveEvents()\n }\n\n toggleOnTouchMoveEvents() {\n if (this.hasScrollbar()) {\n this.webchat.ontouchmove = {}\n this.webchat.ontouchstart = {}\n return\n }\n this.webchat.ontouchmove = e => e.preventDefault()\n }\n\n limitScrollBoundaries() {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return\n /*\n It adds a bounce effect when top or bottom limits of the scrollbar are reached for iOS,\n as an alternative of overscroll-behavior (https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior)\n */\n const frame = getScrollableArea(this.webchat).visible\n const dStopAtScrollLimit = debounced(100, stopAtScrollLimit)\n if (frame) {\n if (window.addEventListener) {\n frame.addEventListener('scroll', () => dStopAtScrollLimit(frame), true)\n } else if (window.attachEvent) {\n frame.attachEvent('scroll', () => dStopAtScrollLimit(frame))\n }\n }\n }\n}\n"],"file":"scrollbar-controller.js"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.WebchatResizer = void 0;
9
+
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+
14
+ var _dom = require("../../util/dom");
15
+
16
+ var _ = require(".");
17
+
18
+ var WebchatResizer = /*#__PURE__*/function () {
19
+ function WebchatResizer(currentDevice, host) {
20
+ (0, _classCallCheck2["default"])(this, WebchatResizer);
21
+ this.currentDevice = currentDevice;
22
+ this.host = host;
23
+ this.webchat = (0, _dom.getWebchatElement)(host);
24
+ }
25
+
26
+ (0, _createClass2["default"])(WebchatResizer, [{
27
+ key: "onFocus",
28
+ value: function onFocus(onKeyboardShownFn) {
29
+ var _this = this;
30
+
31
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return;
32
+ /*
33
+ Based on Tip #4 from https://blog.opendigerati.com/the-eccentric-ways-of-ios-safari-with-the-keyboard-b5aa3f34228d,
34
+ taking window.innerHeight as the amount of pixels the virtual keyboard adds
35
+ */
36
+
37
+ var waitUntilKeyboardIsShown = 400;
38
+
39
+ var calculateNewWebchatElementHeight = function calculateNewWebchatElementHeight() {
40
+ var webchatHeight = _this.webchat.clientHeight; // Some iOS versions keep track of this height with VisualViewport API: https://stackoverflow.com/a/59056851
41
+
42
+ var keyboardOffset = window.visualViewport && window.visualViewport.height || window.innerHeight;
43
+ var newWebchatPercentualHeight = keyboardOffset / webchatHeight;
44
+
45
+ var toTwoDecimal = function toTwoDecimal(toRound) {
46
+ return Math.round(toRound * 100) / 100;
47
+ };
48
+
49
+ newWebchatPercentualHeight = toTwoDecimal(newWebchatPercentualHeight) * 100;
50
+ return newWebchatPercentualHeight;
51
+ };
52
+
53
+ setTimeout(function () {
54
+ _this.setWebchatElementHeight("".concat(calculateNewWebchatElementHeight(), "%"));
55
+
56
+ (0, _dom.scrollToBottom)(_this.host);
57
+ onKeyboardShownFn();
58
+ }, waitUntilKeyboardIsShown);
59
+ }
60
+ }, {
61
+ key: "onBlur",
62
+ value: function onBlur() {
63
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return;
64
+ this.setWebchatElementHeight('100%');
65
+ }
66
+ }, {
67
+ key: "setWebchatElementHeight",
68
+ value: function setWebchatElementHeight(newHeight) {
69
+ this.webchat.style.height = newHeight;
70
+ }
71
+ }]);
72
+ return WebchatResizer;
73
+ }();
74
+
75
+ exports.WebchatResizer = WebchatResizer;
76
+ //# sourceMappingURL=webchat-resizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/devices/webchat-resizer.js"],"names":["WebchatResizer","currentDevice","host","webchat","onKeyboardShownFn","DEVICES","MOBILE","IPHONE","waitUntilKeyboardIsShown","calculateNewWebchatElementHeight","webchatHeight","clientHeight","keyboardOffset","window","visualViewport","height","innerHeight","newWebchatPercentualHeight","toTwoDecimal","toRound","Math","round","setTimeout","setWebchatElementHeight","newHeight","style"],"mappings":";;;;;;;;;;;;;AAAA;;AACA;;IAEaA,c;AACX,0BAAYC,aAAZ,EAA2BC,IAA3B,EAAiC;AAAA;AAC/B,SAAKD,aAAL,GAAqBA,aAArB;AACA,SAAKC,IAAL,GAAYA,IAAZ;AACA,SAAKC,OAAL,GAAe,4BAAkBD,IAAlB,CAAf;AACD;;;;WAED,iBAAQE,iBAAR,EAA2B;AAAA;;AACzB,UAAI,KAAKH,aAAL,KAAuBI,UAAQC,MAAR,CAAeC,MAA1C,EAAkD;AAClD;AACJ;AACA;AACA;;AACI,UAAMC,wBAAwB,GAAG,GAAjC;;AACA,UAAMC,gCAAgC,GAAG,SAAnCA,gCAAmC,GAAM;AAC7C,YAAMC,aAAa,GAAG,KAAI,CAACP,OAAL,CAAaQ,YAAnC,CAD6C,CAE7C;;AACA,YAAMC,cAAc,GACjBC,MAAM,CAACC,cAAP,IAAyBD,MAAM,CAACC,cAAP,CAAsBC,MAAhD,IACAF,MAAM,CAACG,WAFT;AAGA,YAAIC,0BAA0B,GAAGL,cAAc,GAAGF,aAAlD;;AACA,YAAMQ,YAAY,GAAG,SAAfA,YAAe,CAAAC,OAAO;AAAA,iBAAIC,IAAI,CAACC,KAAL,CAAWF,OAAO,GAAG,GAArB,IAA4B,GAAhC;AAAA,SAA5B;;AACAF,QAAAA,0BAA0B,GACxBC,YAAY,CAACD,0BAAD,CAAZ,GAA2C,GAD7C;AAEA,eAAOA,0BAAP;AACD,OAXD;;AAYAK,MAAAA,UAAU,CAAC,YAAM;AACf,QAAA,KAAI,CAACC,uBAAL,WAAgCd,gCAAgC,EAAhE;;AACA,iCAAe,KAAI,CAACP,IAApB;AACAE,QAAAA,iBAAiB;AAClB,OAJS,EAIPI,wBAJO,CAAV;AAKD;;;WAED,kBAAS;AACP,UAAI,KAAKP,aAAL,KAAuBI,UAAQC,MAAR,CAAeC,MAA1C,EAAkD;AAClD,WAAKgB,uBAAL,CAA6B,MAA7B;AACD;;;WAED,iCAAwBC,SAAxB,EAAmC;AACjC,WAAKrB,OAAL,CAAasB,KAAb,CAAmBV,MAAnB,GAA4BS,SAA5B;AACD","sourcesContent":["import { getWebchatElement, scrollToBottom } from '../../util/dom'\nimport { DEVICES } from '.'\n\nexport class WebchatResizer {\n constructor(currentDevice, host) {\n this.currentDevice = currentDevice\n this.host = host\n this.webchat = getWebchatElement(host)\n }\n\n onFocus(onKeyboardShownFn) {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return\n /*\n Based on Tip #4 from https://blog.opendigerati.com/the-eccentric-ways-of-ios-safari-with-the-keyboard-b5aa3f34228d,\n taking window.innerHeight as the amount of pixels the virtual keyboard adds\n */\n const waitUntilKeyboardIsShown = 400\n const calculateNewWebchatElementHeight = () => {\n const webchatHeight = this.webchat.clientHeight\n // Some iOS versions keep track of this height with VisualViewport API: https://stackoverflow.com/a/59056851\n const keyboardOffset =\n (window.visualViewport && window.visualViewport.height) ||\n window.innerHeight\n let newWebchatPercentualHeight = keyboardOffset / webchatHeight\n const toTwoDecimal = toRound => Math.round(toRound * 100) / 100\n newWebchatPercentualHeight =\n toTwoDecimal(newWebchatPercentualHeight) * 100\n return newWebchatPercentualHeight\n }\n setTimeout(() => {\n this.setWebchatElementHeight(`${calculateNewWebchatElementHeight()}%`)\n scrollToBottom(this.host)\n onKeyboardShownFn()\n }, waitUntilKeyboardIsShown)\n }\n\n onBlur() {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return\n this.setWebchatElementHeight('100%')\n }\n\n setWebchatElementHeight(newHeight) {\n this.webchat.style.height = newHeight\n }\n}\n"],"file":"webchat-resizer.js"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.WebchatHeader = exports.StyledWebchatHeader = exports.DefaultHeader = void 0;
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
15
+
16
+ var _framerMotion = require("framer-motion");
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
21
+
22
+ var _constants = require("../constants");
23
+
24
+ var _contexts = require("../contexts");
25
+
26
+ var _environment = require("../util/environment");
27
+
28
+ var _react2 = require("../util/react");
29
+
30
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8;
31
+
32
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
+
34
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
35
+
36
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
+
38
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
39
+
40
+ var Header = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n background: linear-gradient(\n 90deg,\n ", " 0%,\n ", " 100%\n );\n height: 55px;\n border-radius: ", ";\n z-index: 2;\n"])), _constants.COLORS.BLEACHED_CEDAR_PURPLE, function (props) {
41
+ return props.color;
42
+ }, _constants.WEBCHAT.DEFAULTS.BORDER_RADIUS_TOP_CORNERS);
43
+
44
+ var ImageContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 10px;\n align-items: center;\n"])));
45
+
46
+ var Image = _styledComponents["default"].img(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n width: 32px;\n border-radius: 50%;\n"])));
47
+
48
+ var TextContainer = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex: 1 1 auto;\n"])));
49
+
50
+ var Title = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-family: inherit;\n font-size: 15px;\n font-weight: bold;\n color: ", ";\n"])), _constants.COLORS.SOLID_WHITE);
51
+
52
+ var Subtitle = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-family: inherit;\n font-size: 11px;\n color: ", ";\n"])), _constants.COLORS.SOLID_WHITE);
53
+
54
+ var CloseHeader = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 0px 16px;\n cursor: pointer;\n color: ", ";\n font-family: inherit;\n font-size: 36px;\n"])), _constants.COLORS.SOLID_WHITE);
55
+
56
+ var DefaultHeader = function DefaultHeader(props) {
57
+ var getThemeProperty = props.getThemeProperty;
58
+ var animationsEnabled = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.enableAnimations, true);
59
+ var headerImage = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.headerImage, getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.brandImage, _constants.WEBCHAT.DEFAULTS.LOGO));
60
+ var headerTitle = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.headerTitle, _constants.WEBCHAT.DEFAULTS.TITLE);
61
+ var headerSubtitle = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.headerSubtitle, '');
62
+ return /*#__PURE__*/_react["default"].createElement(Header, {
63
+ role: _constants.ROLES.HEADER,
64
+ color: props.color,
65
+ style: _objectSpread({}, getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.headerStyle))
66
+ }, headerImage && /*#__PURE__*/_react["default"].createElement(ImageContainer, null, /*#__PURE__*/_react["default"].createElement(Image, {
67
+ src: (0, _environment.resolveImage)(headerImage)
68
+ })), /*#__PURE__*/_react["default"].createElement(TextContainer, {
69
+ ml: headerImage ? '0px' : '16px'
70
+ }, /*#__PURE__*/_react["default"].createElement(Title, {
71
+ mb: headerSubtitle ? '6px' : '0px'
72
+ }, headerTitle), /*#__PURE__*/_react["default"].createElement(Subtitle, null, headerSubtitle)), /*#__PURE__*/_react["default"].createElement(_react2.ConditionalWrapper, {
73
+ condition: animationsEnabled,
74
+ wrapper: function wrapper(children) {
75
+ return /*#__PURE__*/_react["default"].createElement(_framerMotion.motion.div, {
76
+ whileHover: {
77
+ scale: 1.2
78
+ }
79
+ }, children);
80
+ }
81
+ }, /*#__PURE__*/_react["default"].createElement(CloseHeader, {
82
+ onClick: props.onCloseClick
83
+ }, "\u2A2F")));
84
+ };
85
+
86
+ exports.DefaultHeader = DefaultHeader;
87
+
88
+ var WebchatHeader = function WebchatHeader(props) {
89
+ var _useContext = (0, _react.useContext)(_contexts.WebchatContext),
90
+ webchatState = _useContext.webchatState,
91
+ getThemeProperty = _useContext.getThemeProperty;
92
+
93
+ var handleCloseWebchat = function handleCloseWebchat(event) {
94
+ props.onCloseClick(event.target.value);
95
+ };
96
+
97
+ var CustomHeader = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.customHeader);
98
+
99
+ if (CustomHeader) {
100
+ return /*#__PURE__*/_react["default"].createElement(CustomHeader, {
101
+ onCloseClick: handleCloseWebchat
102
+ });
103
+ }
104
+
105
+ return /*#__PURE__*/_react["default"].createElement(DefaultHeader, {
106
+ webchatState: webchatState,
107
+ getThemeProperty: getThemeProperty,
108
+ color: getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.brandColor, _constants.COLORS.BOTONIC_BLUE),
109
+ onCloseClick: handleCloseWebchat
110
+ });
111
+ };
112
+
113
+ exports.WebchatHeader = WebchatHeader;
114
+ var StyledWebchatHeader = (0, _styledComponents["default"])(WebchatHeader)(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n border-radius: 8px 8px 0px 0px;\n box-shadow: ", " 0px 2px 5px;\n height: 36px;\n flex: none;\n"])), _constants.COLORS.PIGEON_POST_BLUE_ALPHA_0_5);
115
+ exports.StyledWebchatHeader = StyledWebchatHeader;
116
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/webchat/header.jsx"],"names":["Header","styled","div","COLORS","BLEACHED_CEDAR_PURPLE","props","color","WEBCHAT","DEFAULTS","BORDER_RADIUS_TOP_CORNERS","ImageContainer","Image","img","TextContainer","Title","SOLID_WHITE","Subtitle","CloseHeader","DefaultHeader","getThemeProperty","animationsEnabled","CUSTOM_PROPERTIES","enableAnimations","headerImage","brandImage","LOGO","headerTitle","TITLE","headerSubtitle","ROLES","HEADER","headerStyle","children","scale","onCloseClick","WebchatHeader","WebchatContext","webchatState","handleCloseWebchat","event","target","value","CustomHeader","customHeader","brandColor","BOTONIC_BLUE","StyledWebchatHeader","PIGEON_POST_BLUE_ALPHA_0_5"],"mappings":"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","sourcesContent":["import { motion } from 'framer-motion'\nimport React, { useContext } from 'react'\nimport styled from 'styled-components'\n\nimport { COLORS, ROLES, WEBCHAT } from '../constants'\nimport { WebchatContext } from '../contexts'\nimport { resolveImage } from '../util/environment'\nimport { ConditionalWrapper } from '../util/react'\n\nconst Header = styled.div`\n display: flex;\n background: linear-gradient(\n 90deg,\n ${COLORS.BLEACHED_CEDAR_PURPLE} 0%,\n ${props => props.color} 100%\n );\n height: 55px;\n border-radius: ${WEBCHAT.DEFAULTS.BORDER_RADIUS_TOP_CORNERS};\n z-index: 2;\n`\n\nconst ImageContainer = styled.div`\n padding: 10px;\n align-items: center;\n`\n\nconst Image = styled.img`\n width: 32px;\n border-radius: 50%;\n`\n\nconst TextContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex: 1 1 auto;\n`\n\nconst Title = styled.div`\n display: flex;\n font-family: inherit;\n font-size: 15px;\n font-weight: bold;\n color: ${COLORS.SOLID_WHITE};\n`\n\nconst Subtitle = styled.div`\n display: flex;\n font-family: inherit;\n font-size: 11px;\n color: ${COLORS.SOLID_WHITE};\n`\n\nconst CloseHeader = styled.div`\n padding: 0px 16px;\n cursor: pointer;\n color: ${COLORS.SOLID_WHITE};\n font-family: inherit;\n font-size: 36px;\n`\n\nexport const DefaultHeader = props => {\n const { getThemeProperty } = props\n const animationsEnabled = getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.enableAnimations,\n true\n )\n const headerImage = getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.headerImage,\n getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.brandImage,\n WEBCHAT.DEFAULTS.LOGO\n )\n )\n\n const headerTitle = getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.headerTitle,\n WEBCHAT.DEFAULTS.TITLE\n )\n const headerSubtitle = getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.headerSubtitle,\n ''\n )\n\n return (\n <Header\n role={ROLES.HEADER}\n color={props.color}\n style={{ ...getThemeProperty(WEBCHAT.CUSTOM_PROPERTIES.headerStyle) }}\n >\n {headerImage && (\n <ImageContainer>\n <Image src={resolveImage(headerImage)} />\n </ImageContainer>\n )}\n <TextContainer ml={headerImage ? '0px' : '16px'}>\n <Title mb={headerSubtitle ? '6px' : '0px'}>{headerTitle}</Title>\n <Subtitle>{headerSubtitle}</Subtitle>\n </TextContainer>\n <ConditionalWrapper\n condition={animationsEnabled}\n wrapper={children => (\n <motion.div whileHover={{ scale: 1.2 }}>{children}</motion.div>\n )}\n >\n <CloseHeader onClick={props.onCloseClick}>⨯</CloseHeader>\n </ConditionalWrapper>\n </Header>\n )\n}\n\nexport const WebchatHeader = props => {\n const { webchatState, getThemeProperty } = useContext(WebchatContext)\n\n const handleCloseWebchat = event => {\n props.onCloseClick(event.target.value)\n }\n const CustomHeader = getThemeProperty(WEBCHAT.CUSTOM_PROPERTIES.customHeader)\n if (CustomHeader) {\n return <CustomHeader onCloseClick={handleCloseWebchat} />\n }\n return (\n <DefaultHeader\n webchatState={webchatState}\n getThemeProperty={getThemeProperty}\n color={getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.brandColor,\n COLORS.BOTONIC_BLUE\n )}\n onCloseClick={handleCloseWebchat}\n />\n )\n}\n\nexport const StyledWebchatHeader = styled(WebchatHeader)`\n border-radius: 8px 8px 0px 0px;\n box-shadow: ${COLORS.PIGEON_POST_BLUE_ALPHA_0_5} 0px 2px 5px;\n height: 36px;\n flex: none;\n`\n"],"file":"header.js"}
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useComponentVisible = useComponentVisible;
9
+ exports.useComponentWillMount = void 0;
10
+ exports.usePrevious = usePrevious;
11
+ exports.useTyping = useTyping;
12
+ exports.useWebchat = useWebchat;
13
+ exports.webchatInitialState = void 0;
14
+
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
18
+
19
+ var _react = require("react");
20
+
21
+ var _constants = require("../constants");
22
+
23
+ var _dom = require("../util/dom");
24
+
25
+ var _actions = require("./actions");
26
+
27
+ var _webchatReducer = require("./webchat-reducer");
28
+
29
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
30
+
31
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
32
+
33
+ var webchatInitialState = {
34
+ width: _constants.WEBCHAT.DEFAULTS.WIDTH,
35
+ height: _constants.WEBCHAT.DEFAULTS.HEIGHT,
36
+ messagesJSON: [],
37
+ messagesComponents: [],
38
+ replies: [],
39
+ latestInput: {},
40
+ typing: false,
41
+ webview: null,
42
+ webviewParams: null,
43
+ session: {
44
+ user: null
45
+ },
46
+ lastRoutePath: null,
47
+ handoff: false,
48
+ theme: {
49
+ headerTitle: _constants.WEBCHAT.DEFAULTS.TITLE,
50
+ brandColor: _constants.COLORS.BOTONIC_BLUE,
51
+ brandImage: _constants.WEBCHAT.DEFAULTS.LOGO,
52
+ triggerButtonImage: undefined,
53
+ textPlaceholder: _constants.WEBCHAT.DEFAULTS.PLACEHOLDER,
54
+ style: {
55
+ fontFamily: _constants.WEBCHAT.DEFAULTS.FONT_FAMILY
56
+ }
57
+ },
58
+ themeUpdates: {},
59
+ error: {},
60
+ online: true,
61
+ devSettings: {
62
+ keepSessionOnReload: false
63
+ },
64
+ isWebchatOpen: false,
65
+ isEmojiPickerOpen: false,
66
+ isPersistentMenuOpen: false,
67
+ isCoverComponentOpen: false,
68
+ isCustomComponentRendered: false,
69
+ lastMessageUpdate: undefined,
70
+ currentAttachment: undefined,
71
+ jwt: null
72
+ };
73
+ exports.webchatInitialState = webchatInitialState;
74
+
75
+ function useWebchat() {
76
+ var _useReducer = (0, _react.useReducer)(_webchatReducer.webchatReducer, webchatInitialState),
77
+ _useReducer2 = (0, _slicedToArray2["default"])(_useReducer, 2),
78
+ webchatState = _useReducer2[0],
79
+ webchatDispatch = _useReducer2[1];
80
+
81
+ var addMessage = function addMessage(message) {
82
+ return webchatDispatch({
83
+ type: _actions.ADD_MESSAGE,
84
+ payload: message
85
+ });
86
+ };
87
+
88
+ var addMessageComponent = function addMessageComponent(message) {
89
+ return webchatDispatch({
90
+ type: _actions.ADD_MESSAGE_COMPONENT,
91
+ payload: message
92
+ });
93
+ };
94
+
95
+ var updateMessage = function updateMessage(message) {
96
+ return webchatDispatch({
97
+ type: _actions.UPDATE_MESSAGE,
98
+ payload: message
99
+ });
100
+ };
101
+
102
+ var updateReplies = function updateReplies(replies) {
103
+ return webchatDispatch({
104
+ type: _actions.UPDATE_REPLIES,
105
+ payload: replies
106
+ });
107
+ };
108
+
109
+ var updateLatestInput = function updateLatestInput(input) {
110
+ return webchatDispatch({
111
+ type: _actions.UPDATE_LATEST_INPUT,
112
+ payload: input
113
+ });
114
+ };
115
+
116
+ var updateTyping = function updateTyping(typing) {
117
+ return webchatDispatch({
118
+ type: _actions.UPDATE_TYPING,
119
+ payload: typing
120
+ });
121
+ };
122
+
123
+ var updateWebview = function updateWebview(webview, params) {
124
+ return webchatDispatch({
125
+ type: _actions.UPDATE_WEBVIEW,
126
+ payload: {
127
+ webview: webview,
128
+ webviewParams: params
129
+ }
130
+ });
131
+ };
132
+
133
+ var updateSession = function updateSession(session) {
134
+ webchatDispatch({
135
+ type: _actions.UPDATE_SESSION,
136
+ payload: session
137
+ });
138
+ };
139
+
140
+ var updateLastRoutePath = function updateLastRoutePath(path) {
141
+ return webchatDispatch({
142
+ type: _actions.UPDATE_LAST_ROUTE_PATH,
143
+ payload: path
144
+ });
145
+ };
146
+
147
+ var updateHandoff = function updateHandoff(handoff) {
148
+ return webchatDispatch({
149
+ type: _actions.UPDATE_HANDOFF,
150
+ payload: handoff
151
+ });
152
+ };
153
+
154
+ var updateTheme = function updateTheme(theme) {
155
+ var themeUpdates = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
156
+ var payload = themeUpdates !== undefined ? {
157
+ theme: theme,
158
+ themeUpdates: themeUpdates
159
+ } : {
160
+ theme: theme
161
+ };
162
+ webchatDispatch({
163
+ type: _actions.UPDATE_THEME,
164
+ payload: payload
165
+ });
166
+ };
167
+
168
+ var updateDevSettings = function updateDevSettings(settings) {
169
+ return webchatDispatch({
170
+ type: _actions.UPDATE_DEV_SETTINGS,
171
+ payload: settings
172
+ });
173
+ };
174
+
175
+ var toggleWebchat = function toggleWebchat(toggle) {
176
+ return webchatDispatch({
177
+ type: _actions.TOGGLE_WEBCHAT,
178
+ payload: toggle
179
+ });
180
+ };
181
+
182
+ var toggleEmojiPicker = function toggleEmojiPicker(toggle) {
183
+ return webchatDispatch({
184
+ type: _actions.TOGGLE_EMOJI_PICKER,
185
+ payload: toggle
186
+ });
187
+ };
188
+
189
+ var togglePersistentMenu = function togglePersistentMenu(toggle) {
190
+ return webchatDispatch({
191
+ type: _actions.TOGGLE_PERSISTENT_MENU,
192
+ payload: toggle
193
+ });
194
+ };
195
+
196
+ var toggleCoverComponent = function toggleCoverComponent(toggle) {
197
+ return webchatDispatch({
198
+ type: _actions.TOGGLE_COVER_COMPONENT,
199
+ payload: toggle
200
+ });
201
+ };
202
+
203
+ var doRenderCustomComponent = function doRenderCustomComponent(toggle) {
204
+ return webchatDispatch({
205
+ type: _actions.DO_RENDER_CUSTOM_COMPONENT,
206
+ payload: toggle
207
+ });
208
+ };
209
+
210
+ var setError = function setError(error) {
211
+ return webchatDispatch({
212
+ type: _actions.SET_ERROR,
213
+ payload: error
214
+ });
215
+ };
216
+
217
+ var setOnline = function setOnline(online) {
218
+ return webchatDispatch({
219
+ type: _actions.SET_ONLINE,
220
+ payload: online
221
+ });
222
+ };
223
+
224
+ var clearMessages = function clearMessages() {
225
+ webchatDispatch({
226
+ type: _actions.CLEAR_MESSAGES
227
+ });
228
+ };
229
+
230
+ var updateLastMessageDate = function updateLastMessageDate(date) {
231
+ webchatDispatch({
232
+ type: _actions.UPDATE_LAST_MESSAGE_DATE,
233
+ payload: date
234
+ });
235
+ };
236
+
237
+ var setCurrentAttachment = function setCurrentAttachment(attachment) {
238
+ webchatDispatch({
239
+ type: _actions.SET_CURRENT_ATTACHMENT,
240
+ payload: attachment
241
+ });
242
+ };
243
+
244
+ var updateJwt = function updateJwt(jwt) {
245
+ webchatDispatch({
246
+ type: _actions.UPDATE_JWT,
247
+ payload: jwt
248
+ });
249
+ };
250
+
251
+ return {
252
+ webchatState: webchatState,
253
+ webchatDispatch: webchatDispatch,
254
+ addMessage: addMessage,
255
+ addMessageComponent: addMessageComponent,
256
+ updateMessage: updateMessage,
257
+ updateReplies: updateReplies,
258
+ updateLatestInput: updateLatestInput,
259
+ updateTyping: updateTyping,
260
+ updateWebview: updateWebview,
261
+ updateSession: updateSession,
262
+ updateLastRoutePath: updateLastRoutePath,
263
+ updateHandoff: updateHandoff,
264
+ updateTheme: updateTheme,
265
+ updateDevSettings: updateDevSettings,
266
+ toggleWebchat: toggleWebchat,
267
+ toggleEmojiPicker: toggleEmojiPicker,
268
+ togglePersistentMenu: togglePersistentMenu,
269
+ toggleCoverComponent: toggleCoverComponent,
270
+ doRenderCustomComponent: doRenderCustomComponent,
271
+ setError: setError,
272
+ setOnline: setOnline,
273
+ clearMessages: clearMessages,
274
+ updateLastMessageDate: updateLastMessageDate,
275
+ setCurrentAttachment: setCurrentAttachment,
276
+ updateJwt: updateJwt
277
+ };
278
+ }
279
+
280
+ function useTyping(_ref) {
281
+ var webchatState = _ref.webchatState,
282
+ updateTyping = _ref.updateTyping,
283
+ updateMessage = _ref.updateMessage,
284
+ host = _ref.host;
285
+ (0, _react.useEffect)(function () {
286
+ var delayTimeout, typingTimeout;
287
+ (0, _dom.scrollToBottom)({
288
+ host: host
289
+ });
290
+
291
+ try {
292
+ var nextMsg = webchatState.messagesJSON.filter(function (m) {
293
+ return !m.display;
294
+ })[0];
295
+
296
+ if (nextMsg.delay && nextMsg.typing) {
297
+ delayTimeout = setTimeout(function () {
298
+ return updateTyping(true);
299
+ }, nextMsg.delay * 1000);
300
+ } else if (nextMsg.typing) updateTyping(true);
301
+
302
+ var totalDelay = nextMsg.delay + nextMsg.typing;
303
+ if (totalDelay) typingTimeout = setTimeout(function () {
304
+ updateMessage(_objectSpread(_objectSpread({}, nextMsg), {}, {
305
+ display: true
306
+ }));
307
+ updateTyping(false);
308
+ }, totalDelay * 1000);
309
+ } catch (e) {}
310
+
311
+ return function () {
312
+ clearTimeout(delayTimeout);
313
+ clearTimeout(typingTimeout);
314
+ };
315
+ }, [webchatState.messagesJSON, webchatState.typing]);
316
+ }
317
+
318
+ function usePrevious(value) {
319
+ var ref = (0, _react.useRef)();
320
+ (0, _react.useEffect)(function () {
321
+ ref.current = value;
322
+ });
323
+ return ref.current;
324
+ }
325
+
326
+ function useComponentVisible(initialIsVisible, onClickOutside) {
327
+ var _useState = (0, _react.useState)(initialIsVisible),
328
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
329
+ isComponentVisible = _useState2[0],
330
+ setIsComponentVisible = _useState2[1];
331
+
332
+ var ref = (0, _react.useRef)(null);
333
+
334
+ var handleClickOutside = function handleClickOutside(event) {
335
+ if (ref.current && !ref.current.contains(event.target)) {
336
+ setIsComponentVisible(false);
337
+ onClickOutside();
338
+ }
339
+ };
340
+
341
+ (0, _react.useEffect)(function () {
342
+ document.addEventListener('click', handleClickOutside, false);
343
+ return function () {
344
+ document.removeEventListener('click', handleClickOutside, false);
345
+ };
346
+ });
347
+ return {
348
+ ref: ref,
349
+ isComponentVisible: isComponentVisible,
350
+ setIsComponentVisible: setIsComponentVisible
351
+ };
352
+ }
353
+
354
+ var useComponentWillMount = function useComponentWillMount(func) {
355
+ (0, _react.useMemo)(func, []);
356
+ };
357
+
358
+ exports.useComponentWillMount = useComponentWillMount;
359
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/webchat/hooks.js"],"names":["webchatInitialState","width","WEBCHAT","DEFAULTS","WIDTH","height","HEIGHT","messagesJSON","messagesComponents","replies","latestInput","typing","webview","webviewParams","session","user","lastRoutePath","handoff","theme","headerTitle","TITLE","brandColor","COLORS","BOTONIC_BLUE","brandImage","LOGO","triggerButtonImage","undefined","textPlaceholder","PLACEHOLDER","style","fontFamily","FONT_FAMILY","themeUpdates","error","online","devSettings","keepSessionOnReload","isWebchatOpen","isEmojiPickerOpen","isPersistentMenuOpen","isCoverComponentOpen","isCustomComponentRendered","lastMessageUpdate","currentAttachment","jwt","useWebchat","webchatReducer","webchatState","webchatDispatch","addMessage","message","type","ADD_MESSAGE","payload","addMessageComponent","ADD_MESSAGE_COMPONENT","updateMessage","UPDATE_MESSAGE","updateReplies","UPDATE_REPLIES","updateLatestInput","input","UPDATE_LATEST_INPUT","updateTyping","UPDATE_TYPING","updateWebview","params","UPDATE_WEBVIEW","updateSession","UPDATE_SESSION","updateLastRoutePath","path","UPDATE_LAST_ROUTE_PATH","updateHandoff","UPDATE_HANDOFF","updateTheme","UPDATE_THEME","updateDevSettings","settings","UPDATE_DEV_SETTINGS","toggleWebchat","toggle","TOGGLE_WEBCHAT","toggleEmojiPicker","TOGGLE_EMOJI_PICKER","togglePersistentMenu","TOGGLE_PERSISTENT_MENU","toggleCoverComponent","TOGGLE_COVER_COMPONENT","doRenderCustomComponent","DO_RENDER_CUSTOM_COMPONENT","setError","SET_ERROR","setOnline","SET_ONLINE","clearMessages","CLEAR_MESSAGES","updateLastMessageDate","date","UPDATE_LAST_MESSAGE_DATE","setCurrentAttachment","attachment","SET_CURRENT_ATTACHMENT","updateJwt","UPDATE_JWT","useTyping","host","delayTimeout","typingTimeout","nextMsg","filter","m","display","delay","setTimeout","totalDelay","e","clearTimeout","usePrevious","value","ref","current","useComponentVisible","initialIsVisible","onClickOutside","isComponentVisible","setIsComponentVisible","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","useComponentWillMount","func"],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useReducer, useRef, useState } from 'react'\n\nimport { COLORS, WEBCHAT } from '../constants'\nimport { scrollToBottom } from '../util/dom'\nimport {\n ADD_MESSAGE,\n ADD_MESSAGE_COMPONENT,\n CLEAR_MESSAGES,\n DO_RENDER_CUSTOM_COMPONENT,\n SET_CURRENT_ATTACHMENT,\n SET_ERROR,\n SET_ONLINE,\n TOGGLE_COVER_COMPONENT,\n TOGGLE_EMOJI_PICKER,\n TOGGLE_PERSISTENT_MENU,\n TOGGLE_WEBCHAT,\n UPDATE_DEV_SETTINGS,\n UPDATE_HANDOFF,\n UPDATE_JWT,\n UPDATE_LAST_MESSAGE_DATE,\n UPDATE_LAST_ROUTE_PATH,\n UPDATE_LATEST_INPUT,\n UPDATE_MESSAGE,\n UPDATE_REPLIES,\n UPDATE_SESSION,\n UPDATE_THEME,\n UPDATE_TYPING,\n UPDATE_WEBVIEW,\n} from './actions'\nimport { webchatReducer } from './webchat-reducer'\n\nexport const webchatInitialState = {\n width: WEBCHAT.DEFAULTS.WIDTH,\n height: WEBCHAT.DEFAULTS.HEIGHT,\n messagesJSON: [],\n messagesComponents: [],\n replies: [],\n latestInput: {},\n typing: false,\n webview: null,\n webviewParams: null,\n session: { user: null },\n lastRoutePath: null,\n handoff: false,\n theme: {\n headerTitle: WEBCHAT.DEFAULTS.TITLE,\n brandColor: COLORS.BOTONIC_BLUE,\n brandImage: WEBCHAT.DEFAULTS.LOGO,\n triggerButtonImage: undefined,\n textPlaceholder: WEBCHAT.DEFAULTS.PLACEHOLDER,\n style: {\n fontFamily: WEBCHAT.DEFAULTS.FONT_FAMILY,\n },\n },\n themeUpdates: {},\n error: {},\n online: true,\n devSettings: { keepSessionOnReload: false },\n isWebchatOpen: false,\n isEmojiPickerOpen: false,\n isPersistentMenuOpen: false,\n isCoverComponentOpen: false,\n isCustomComponentRendered: false,\n lastMessageUpdate: undefined,\n currentAttachment: undefined,\n jwt: null,\n}\n\nexport function useWebchat() {\n const [webchatState, webchatDispatch] = useReducer(\n webchatReducer,\n webchatInitialState\n )\n\n const addMessage = message =>\n webchatDispatch({ type: ADD_MESSAGE, payload: message })\n const addMessageComponent = message =>\n webchatDispatch({ type: ADD_MESSAGE_COMPONENT, payload: message })\n const updateMessage = message =>\n webchatDispatch({ type: UPDATE_MESSAGE, payload: message })\n const updateReplies = replies =>\n webchatDispatch({ type: UPDATE_REPLIES, payload: replies })\n const updateLatestInput = input =>\n webchatDispatch({ type: UPDATE_LATEST_INPUT, payload: input })\n const updateTyping = typing =>\n webchatDispatch({ type: UPDATE_TYPING, payload: typing })\n const updateWebview = (webview, params) =>\n webchatDispatch({\n type: UPDATE_WEBVIEW,\n payload: { webview, webviewParams: params },\n })\n const updateSession = session => {\n webchatDispatch({\n type: UPDATE_SESSION,\n payload: session,\n })\n }\n\n const updateLastRoutePath = path =>\n webchatDispatch({\n type: UPDATE_LAST_ROUTE_PATH,\n payload: path,\n })\n const updateHandoff = handoff =>\n webchatDispatch({\n type: UPDATE_HANDOFF,\n payload: handoff,\n })\n const updateTheme = (theme, themeUpdates = undefined) => {\n const payload =\n themeUpdates !== undefined ? { theme, themeUpdates } : { theme }\n webchatDispatch({\n type: UPDATE_THEME,\n payload,\n })\n }\n const updateDevSettings = settings =>\n webchatDispatch({\n type: UPDATE_DEV_SETTINGS,\n payload: settings,\n })\n const toggleWebchat = toggle =>\n webchatDispatch({\n type: TOGGLE_WEBCHAT,\n payload: toggle,\n })\n const toggleEmojiPicker = toggle =>\n webchatDispatch({\n type: TOGGLE_EMOJI_PICKER,\n payload: toggle,\n })\n const togglePersistentMenu = toggle =>\n webchatDispatch({\n type: TOGGLE_PERSISTENT_MENU,\n payload: toggle,\n })\n const toggleCoverComponent = toggle =>\n webchatDispatch({\n type: TOGGLE_COVER_COMPONENT,\n payload: toggle,\n })\n const doRenderCustomComponent = toggle =>\n webchatDispatch({\n type: DO_RENDER_CUSTOM_COMPONENT,\n payload: toggle,\n })\n const setError = error =>\n webchatDispatch({\n type: SET_ERROR,\n payload: error,\n })\n const setOnline = online =>\n webchatDispatch({\n type: SET_ONLINE,\n payload: online,\n })\n\n const clearMessages = () => {\n webchatDispatch({\n type: CLEAR_MESSAGES,\n })\n }\n const updateLastMessageDate = date => {\n webchatDispatch({\n type: UPDATE_LAST_MESSAGE_DATE,\n payload: date,\n })\n }\n const setCurrentAttachment = attachment => {\n webchatDispatch({\n type: SET_CURRENT_ATTACHMENT,\n payload: attachment,\n })\n }\n\n const updateJwt = jwt => {\n webchatDispatch({\n type: UPDATE_JWT,\n payload: jwt,\n })\n }\n\n return {\n webchatState,\n webchatDispatch,\n addMessage,\n addMessageComponent,\n updateMessage,\n updateReplies,\n updateLatestInput,\n updateTyping,\n updateWebview,\n updateSession,\n updateLastRoutePath,\n updateHandoff,\n updateTheme,\n updateDevSettings,\n toggleWebchat,\n toggleEmojiPicker,\n togglePersistentMenu,\n toggleCoverComponent,\n doRenderCustomComponent,\n setError,\n setOnline,\n clearMessages,\n updateLastMessageDate,\n setCurrentAttachment,\n updateJwt,\n }\n}\n\nexport function useTyping({ webchatState, updateTyping, updateMessage, host }) {\n useEffect(() => {\n let delayTimeout, typingTimeout\n scrollToBottom({ host })\n try {\n const nextMsg = webchatState.messagesJSON.filter(m => !m.display)[0]\n if (nextMsg.delay && nextMsg.typing) {\n delayTimeout = setTimeout(\n () => updateTyping(true),\n nextMsg.delay * 1000\n )\n } else if (nextMsg.typing) updateTyping(true)\n const totalDelay = nextMsg.delay + nextMsg.typing\n if (totalDelay)\n typingTimeout = setTimeout(() => {\n updateMessage({ ...nextMsg, display: true })\n updateTyping(false)\n }, totalDelay * 1000)\n } catch (e) {}\n return () => {\n clearTimeout(delayTimeout)\n clearTimeout(typingTimeout)\n }\n }, [webchatState.messagesJSON, webchatState.typing])\n}\n\nexport function usePrevious(value) {\n const ref = useRef()\n useEffect(() => {\n ref.current = value\n })\n return ref.current\n}\n\nexport function useComponentVisible(initialIsVisible, onClickOutside) {\n const [isComponentVisible, setIsComponentVisible] = useState(initialIsVisible)\n const ref = useRef(null)\n const handleClickOutside = event => {\n if (ref.current && !ref.current.contains(event.target)) {\n setIsComponentVisible(false)\n onClickOutside()\n }\n }\n useEffect(() => {\n document.addEventListener('click', handleClickOutside, false)\n return () => {\n document.removeEventListener('click', handleClickOutside, false)\n }\n })\n return { ref, isComponentVisible, setIsComponentVisible }\n}\n\nexport const useComponentWillMount = func => {\n useMemo(func, [])\n}\n"],"file":"hooks.js"}