@botonic/react 0.20.1-alpha.1 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/lib/components/image.js +6 -52
  2. package/lib/components/image.js.map +1 -1
  3. package/lib/constants.js +200 -0
  4. package/lib/constants.js.map +1 -0
  5. package/lib/contexts.js +57 -0
  6. package/lib/contexts.js.map +1 -0
  7. package/lib/dev-app.js +241 -0
  8. package/lib/dev-app.js.map +1 -0
  9. package/lib/index.d.ts +239 -0
  10. package/lib/index.js +131 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/message-utils.js +149 -0
  13. package/lib/message-utils.js.map +1 -0
  14. package/lib/msg-to-botonic.js +199 -0
  15. package/lib/msg-to-botonic.js.map +1 -0
  16. package/lib/node-app.js +97 -0
  17. package/lib/node-app.js.map +1 -0
  18. package/lib/react-bot.js +167 -0
  19. package/lib/react-bot.js.map +1 -0
  20. package/lib/util/dom.js +84 -0
  21. package/lib/util/dom.js.map +1 -0
  22. package/lib/util/environment.js +42 -0
  23. package/lib/util/environment.js.map +1 -0
  24. package/lib/util/error-boundary.js +105 -0
  25. package/lib/util/error-boundary.js.map +1 -0
  26. package/lib/util/index.d.ts +9 -0
  27. package/lib/util/index.js +2 -0
  28. package/lib/util/index.js.map +1 -0
  29. package/lib/util/logs.js +28 -0
  30. package/lib/util/logs.js.map +1 -0
  31. package/lib/util/objects.js +60 -0
  32. package/lib/util/objects.js.map +1 -0
  33. package/lib/util/react.js +75 -0
  34. package/lib/util/react.js.map +1 -0
  35. package/lib/util/regexs.js +31 -0
  36. package/lib/util/regexs.js.map +1 -0
  37. package/lib/util/webchat.js +92 -0
  38. package/lib/util/webchat.js.map +1 -0
  39. package/lib/webchat/actions.js +51 -0
  40. package/lib/webchat/actions.js.map +1 -0
  41. package/lib/webchat/components/attachment.js +43 -0
  42. package/lib/webchat/components/attachment.js.map +1 -0
  43. package/lib/webchat/components/common.js +33 -0
  44. package/lib/webchat/components/common.js.map +1 -0
  45. package/lib/webchat/components/emoji-picker.js +58 -0
  46. package/lib/webchat/components/emoji-picker.js.map +1 -0
  47. package/lib/webchat/components/persistent-menu.js +96 -0
  48. package/lib/webchat/components/persistent-menu.js.map +1 -0
  49. package/lib/webchat/components/send-button.js +27 -0
  50. package/lib/webchat/components/send-button.js.map +1 -0
  51. package/lib/webchat/components/styled-scrollbar.js +55 -0
  52. package/lib/webchat/components/styled-scrollbar.js.map +1 -0
  53. package/lib/webchat/components/styled-scrollbar.scss +12 -0
  54. package/lib/webchat/components/typing-indicator.js +27 -0
  55. package/lib/webchat/components/typing-indicator.js.map +1 -0
  56. package/lib/webchat/components/typing-indicator.scss +38 -0
  57. package/lib/webchat/devices/device-adapter.js +82 -0
  58. package/lib/webchat/devices/device-adapter.js.map +1 -0
  59. package/lib/webchat/devices/index.js +32 -0
  60. package/lib/webchat/devices/index.js.map +1 -0
  61. package/lib/webchat/devices/scrollbar-controller.js +152 -0
  62. package/lib/webchat/devices/scrollbar-controller.js.map +1 -0
  63. package/lib/webchat/devices/webchat-resizer.js +76 -0
  64. package/lib/webchat/devices/webchat-resizer.js.map +1 -0
  65. package/lib/webchat/header.js +116 -0
  66. package/lib/webchat/header.js.map +1 -0
  67. package/lib/webchat/hooks.js +350 -0
  68. package/lib/webchat/hooks.js.map +1 -0
  69. package/lib/webchat/index.d.ts +62 -0
  70. package/lib/webchat/index.js +32 -0
  71. package/lib/webchat/index.js.map +1 -0
  72. package/lib/webchat/message-list.js +88 -0
  73. package/lib/webchat/message-list.js.map +1 -0
  74. package/lib/webchat/messages-reducer.js +93 -0
  75. package/lib/webchat/messages-reducer.js.map +1 -0
  76. package/lib/webchat/replies.js +78 -0
  77. package/lib/webchat/replies.js.map +1 -0
  78. package/lib/webchat/session-view.js +106 -0
  79. package/lib/webchat/session-view.js.map +1 -0
  80. package/lib/webchat/use-storage-state-hook.js +29 -0
  81. package/lib/webchat/use-storage-state-hook.js.map +1 -0
  82. package/lib/webchat/webchat-dev.js +109 -0
  83. package/lib/webchat/webchat-dev.js.map +1 -0
  84. package/lib/webchat/webchat-reducer.js +102 -0
  85. package/lib/webchat/webchat-reducer.js.map +1 -0
  86. package/lib/webchat/webchat.js +1041 -0
  87. package/lib/webchat/webchat.js.map +1 -0
  88. package/lib/webchat/webview.js +122 -0
  89. package/lib/webchat/webview.js.map +1 -0
  90. package/lib/webchat-app.js +643 -0
  91. package/lib/webchat-app.js.map +1 -0
  92. package/lib/webchat.template.html +37 -0
  93. package/lib/webview.js +214 -0
  94. package/lib/webview.js.map +1 -0
  95. package/lib/webview.template.html +39 -0
  96. package/package.json +2 -2
  97. package/src/components/image.jsx +3 -37
  98. package/src/index.d.ts +0 -2
  99. package/src/index.js +0 -1
  100. package/src/webchat/actions.jsx +0 -1
  101. package/src/webchat/hooks.js +0 -8
  102. package/src/webchat/webchat-reducer.js +0 -4
  103. package/src/webchat/webchat.jsx +0 -18
  104. package/src/webchat-app.jsx +0 -8
  105. package/src/webchat/components/portal-modal/backdrop.jsx +0 -38
  106. package/src/webchat/components/portal-modal/constants.js +0 -7
  107. package/src/webchat/components/portal-modal/content.jsx +0 -10
  108. package/src/webchat/components/portal-modal/index.js +0 -5
  109. package/src/webchat/components/portal-modal/portal-modal-component.jsx +0 -72
  110. package/src/webchat/components/portal-modal/portal.jsx +0 -21
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.OpenedEmojiPicker = exports.EmojiPicker = void 0;
9
+
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
+
12
+ var _emojiPickerReact = _interopRequireDefault(require("emoji-picker-react"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
17
+
18
+ var _emojiButton = _interopRequireDefault(require("../../assets/emojiButton.svg"));
19
+
20
+ var _constants = require("../../constants");
21
+
22
+ var _hooks = require("../hooks");
23
+
24
+ var _common = require("./common");
25
+
26
+ var _templateObject;
27
+
28
+ var EmojiPicker = function EmojiPicker(props) {
29
+ return /*#__PURE__*/_react["default"].createElement(_common.IconContainer, {
30
+ role: _constants.ROLES.EMOJI_PICKER_ICON
31
+ }, /*#__PURE__*/_react["default"].createElement("div", {
32
+ onClick: props.onClick
33
+ }, /*#__PURE__*/_react["default"].createElement(_common.Icon, {
34
+ src: _emojiButton["default"]
35
+ })));
36
+ };
37
+
38
+ exports.EmojiPicker = EmojiPicker;
39
+
40
+ var Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: flex-end;\n position: absolute;\n right: 3px;\n top: -324px;\n"])));
41
+
42
+ var OpenedEmojiPicker = function OpenedEmojiPicker(props) {
43
+ var _useComponentVisible = (0, _hooks.useComponentVisible)(true, props.onClick),
44
+ ref = _useComponentVisible.ref,
45
+ isComponentVisible = _useComponentVisible.isComponentVisible;
46
+
47
+ return /*#__PURE__*/_react["default"].createElement("div", {
48
+ ref: ref
49
+ }, isComponentVisible && /*#__PURE__*/_react["default"].createElement(Container, {
50
+ role: _constants.ROLES.EMOJI_PICKER
51
+ }, /*#__PURE__*/_react["default"].createElement(_emojiPickerReact["default"], {
52
+ onEmojiClick: props.onEmojiClick,
53
+ disableAutoFocus: true
54
+ })));
55
+ };
56
+
57
+ exports.OpenedEmojiPicker = OpenedEmojiPicker;
58
+ //# sourceMappingURL=emoji-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/components/emoji-picker.jsx"],"names":["EmojiPicker","props","ROLES","EMOJI_PICKER_ICON","onClick","LogoEmoji","Container","styled","div","OpenedEmojiPicker","ref","isComponentVisible","EMOJI_PICKER","onEmojiClick"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;;;AAEO,IAAMA,WAAW,GAAG,SAAdA,WAAc,CAAAC,KAAK;AAAA,sBAC9B,gCAAC,qBAAD;AAAe,IAAA,IAAI,EAAEC,iBAAMC;AAA3B,kBACE;AAAK,IAAA,OAAO,EAAEF,KAAK,CAACG;AAApB,kBACE,gCAAC,YAAD;AAAM,IAAA,GAAG,EAAEC;AAAX,IADF,CADF,CAD8B;AAAA,CAAzB;;;;AAQP,IAAMC,SAAS,GAAGC,6BAAOC,GAAV,8LAAf;;AAQO,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAAR,KAAK,EAAI;AACxC,6BAAoC,gCAAoB,IAApB,EAA0BA,KAAK,CAACG,OAAhC,CAApC;AAAA,MAAQM,GAAR,wBAAQA,GAAR;AAAA,MAAaC,kBAAb,wBAAaA,kBAAb;;AACA,sBACE;AAAK,IAAA,GAAG,EAAED;AAAV,KACGC,kBAAkB,iBACjB,gCAAC,SAAD;AAAW,IAAA,IAAI,EAAET,iBAAMU;AAAvB,kBACE,gCAAC,4BAAD;AAAQ,IAAA,YAAY,EAAEX,KAAK,CAACY,YAA5B;AAA0C,IAAA,gBAAgB,EAAE;AAA5D,IADF,CAFJ,CADF;AASD,CAXM","sourcesContent":["import Picker from 'emoji-picker-react'\nimport React from 'react'\nimport styled from 'styled-components'\n\nimport LogoEmoji from '../../assets/emojiButton.svg'\nimport { ROLES } from '../../constants'\nimport { useComponentVisible } from '../hooks'\nimport { Icon, IconContainer } from './common'\n\nexport const EmojiPicker = props => (\n <IconContainer role={ROLES.EMOJI_PICKER_ICON}>\n <div onClick={props.onClick}>\n <Icon src={LogoEmoji} />\n </div>\n </IconContainer>\n)\n\nconst Container = styled.div`\n display: flex;\n justify-content: flex-end;\n position: absolute;\n right: 3px;\n top: -324px;\n`\n\nexport const OpenedEmojiPicker = props => {\n const { ref, isComponentVisible } = useComponentVisible(true, props.onClick)\n return (\n <div ref={ref}>\n {isComponentVisible && (\n <Container role={ROLES.EMOJI_PICKER}>\n <Picker onEmojiClick={props.onEmojiClick} disableAutoFocus={true} />\n </Container>\n )}\n </div>\n )\n}\n"],"file":"emoji-picker.js"}
@@ -0,0 +1,96 @@
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["default"] = exports.PersistentMenu = exports.OpenedPersistentMenu = void 0;
11
+
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
17
+
18
+ var _menuButton = _interopRequireDefault(require("../../assets/menuButton.svg"));
19
+
20
+ var _button = require("../../components/button");
21
+
22
+ var _constants = require("../../constants");
23
+
24
+ var _contexts = require("../../contexts");
25
+
26
+ var _hooks = require("../hooks");
27
+
28
+ var _common = require("./common");
29
+
30
+ var _templateObject, _templateObject2;
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
+ var ButtonsContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n z-index: 2;\n width: 100%;\n bottom: 0;\n text-align: center;\n"])));
37
+
38
+ var OpenedPersistentMenu = function OpenedPersistentMenu(_ref) {
39
+ var onClick = _ref.onClick,
40
+ options = _ref.options,
41
+ borderRadius = _ref.borderRadius;
42
+
43
+ var _useComponentVisible = (0, _hooks.useComponentVisible)(true, onClick),
44
+ ref = _useComponentVisible.ref,
45
+ isComponentVisible = _useComponentVisible.isComponentVisible;
46
+
47
+ var _useContext = (0, _react.useContext)(_contexts.WebchatContext),
48
+ getThemeProperty = _useContext.getThemeProperty;
49
+
50
+ var CustomPersistentMenu = getThemeProperty(_constants.WEBCHAT.CUSTOM_PROPERTIES.customPersistentMenu, undefined);
51
+ var closeLabel = 'Cancel';
52
+
53
+ try {
54
+ closeLabel = options.filter(function (opt) {
55
+ return opt.closeLabel !== undefined;
56
+ })[0].closeLabel;
57
+ } catch (e) {}
58
+
59
+ return /*#__PURE__*/_react["default"].createElement("div", {
60
+ ref: ref,
61
+ role: _constants.ROLES.PERSISTENT_MENU
62
+ }, isComponentVisible && CustomPersistentMenu ? /*#__PURE__*/_react["default"].createElement(CustomPersistentMenu, {
63
+ onClick: onClick,
64
+ options: options
65
+ }) : /*#__PURE__*/_react["default"].createElement(ButtonsContainer, null, Object.values(options).map(function (e, i) {
66
+ return e.label && /*#__PURE__*/_react["default"].createElement(_button.Button, {
67
+ onClick: onClick,
68
+ url: e.url,
69
+ target: e.target,
70
+ webview: e.webview,
71
+ payload: e.payload,
72
+ key: i
73
+ }, e.label);
74
+ }), /*#__PURE__*/_react["default"].createElement(_button.Button, {
75
+ onClick: onClick,
76
+ bottomRadius: borderRadius
77
+ }, closeLabel)));
78
+ };
79
+
80
+ exports.OpenedPersistentMenu = OpenedPersistentMenu;
81
+
82
+ var IconContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n cursor: pointer;\n padding: 18px;\n"])));
83
+
84
+ var PersistentMenu = function PersistentMenu(props) {
85
+ return /*#__PURE__*/_react["default"].createElement(IconContainer, {
86
+ role: _constants.ROLES.PERSISTENT_MENU_ICON,
87
+ onClick: props.onClick
88
+ }, /*#__PURE__*/_react["default"].createElement(_common.Icon, {
89
+ src: _menuButton["default"]
90
+ }));
91
+ };
92
+
93
+ exports.PersistentMenu = PersistentMenu;
94
+ var _default = OpenedPersistentMenu;
95
+ exports["default"] = _default;
96
+ //# sourceMappingURL=persistent-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/components/persistent-menu.jsx"],"names":["ButtonsContainer","styled","div","OpenedPersistentMenu","onClick","options","borderRadius","ref","isComponentVisible","WebchatContext","getThemeProperty","CustomPersistentMenu","WEBCHAT","CUSTOM_PROPERTIES","customPersistentMenu","undefined","closeLabel","filter","opt","e","ROLES","PERSISTENT_MENU","Object","values","map","i","label","url","target","webview","payload","IconContainer","PersistentMenu","props","PERSISTENT_MENU_ICON","LogoMenu"],"mappings":";;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAEA,IAAMA,gBAAgB,GAAGC,6BAAOC,GAAV,mLAAtB;;AAQO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,OAAwC;AAAA,MAArCC,OAAqC,QAArCA,OAAqC;AAAA,MAA5BC,OAA4B,QAA5BA,OAA4B;AAAA,MAAnBC,YAAmB,QAAnBA,YAAmB;;AAC1E,6BAAoC,gCAAoB,IAApB,EAA0BF,OAA1B,CAApC;AAAA,MAAQG,GAAR,wBAAQA,GAAR;AAAA,MAAaC,kBAAb,wBAAaA,kBAAb;;AACA,oBAA6B,uBAAWC,wBAAX,CAA7B;AAAA,MAAQC,gBAAR,eAAQA,gBAAR;;AACA,MAAMC,oBAAoB,GAAGD,gBAAgB,CAC3CE,mBAAQC,iBAAR,CAA0BC,oBADiB,EAE3CC,SAF2C,CAA7C;AAIA,MAAIC,UAAU,GAAG,QAAjB;;AACA,MAAI;AACFA,IAAAA,UAAU,GAAGX,OAAO,CAACY,MAAR,CAAe,UAAAC,GAAG;AAAA,aAAIA,GAAG,CAACF,UAAJ,KAAmBD,SAAvB;AAAA,KAAlB,EAAoD,CAApD,EACVC,UADH;AAED,GAHD,CAGE,OAAOG,CAAP,EAAU,CAAE;;AACd,sBACE;AAAK,IAAA,GAAG,EAAEZ,GAAV;AAAe,IAAA,IAAI,EAAEa,iBAAMC;AAA3B,KACGb,kBAAkB,IAAIG,oBAAtB,gBACC,gCAAC,oBAAD;AAAsB,IAAA,OAAO,EAAEP,OAA/B;AAAwC,IAAA,OAAO,EAAEC;AAAjD,IADD,gBAGC,gCAAC,gBAAD,QACGiB,MAAM,CAACC,MAAP,CAAclB,OAAd,EAAuBmB,GAAvB,CAA2B,UAACL,CAAD,EAAIM,CAAJ,EAAU;AACpC,WACEN,CAAC,CAACO,KAAF,iBACE,gCAAC,cAAD;AACE,MAAA,OAAO,EAAEtB,OADX;AAEE,MAAA,GAAG,EAAEe,CAAC,CAACQ,GAFT;AAGE,MAAA,MAAM,EAAER,CAAC,CAACS,MAHZ;AAIE,MAAA,OAAO,EAAET,CAAC,CAACU,OAJb;AAKE,MAAA,OAAO,EAAEV,CAAC,CAACW,OALb;AAME,MAAA,GAAG,EAAEL;AANP,OAQGN,CAAC,CAACO,KARL,CAFJ;AAcD,GAfA,CADH,eAiBE,gCAAC,cAAD;AAAQ,IAAA,OAAO,EAAEtB,OAAjB;AAA0B,IAAA,YAAY,EAAEE;AAAxC,KACGU,UADH,CAjBF,CAJJ,CADF;AA6BD,CAzCM;;;;AA2CP,IAAMe,aAAa,GAAG9B,6BAAOC,GAAV,0KAAnB;;AAOO,IAAM8B,cAAc,GAAG,SAAjBA,cAAiB,CAAAC,KAAK;AAAA,sBACjC,gCAAC,aAAD;AAAe,IAAA,IAAI,EAAEb,iBAAMc,oBAA3B;AAAiD,IAAA,OAAO,EAAED,KAAK,CAAC7B;AAAhE,kBACE,gCAAC,YAAD;AAAM,IAAA,GAAG,EAAE+B;AAAX,IADF,CADiC;AAAA,CAA5B;;;eAMQhC,oB","sourcesContent":["import React, { useContext } from 'react'\nimport styled from 'styled-components'\n\nimport LogoMenu from '../../assets/menuButton.svg'\nimport { Button } from '../../components/button'\nimport { ROLES, WEBCHAT } from '../../constants'\nimport { WebchatContext } from '../../contexts'\nimport { useComponentVisible } from '../hooks'\nimport { Icon } from './common'\n\nconst ButtonsContainer = styled.div`\n position: absolute;\n z-index: 2;\n width: 100%;\n bottom: 0;\n text-align: center;\n`\n\nexport const OpenedPersistentMenu = ({ onClick, options, borderRadius }) => {\n const { ref, isComponentVisible } = useComponentVisible(true, onClick)\n const { getThemeProperty } = useContext(WebchatContext)\n const CustomPersistentMenu = getThemeProperty(\n WEBCHAT.CUSTOM_PROPERTIES.customPersistentMenu,\n undefined\n )\n let closeLabel = 'Cancel'\n try {\n closeLabel = options.filter(opt => opt.closeLabel !== undefined)[0]\n .closeLabel\n } catch (e) {}\n return (\n <div ref={ref} role={ROLES.PERSISTENT_MENU}>\n {isComponentVisible && CustomPersistentMenu ? (\n <CustomPersistentMenu onClick={onClick} options={options} />\n ) : (\n <ButtonsContainer>\n {Object.values(options).map((e, i) => {\n return (\n e.label && (\n <Button\n onClick={onClick}\n url={e.url}\n target={e.target}\n webview={e.webview}\n payload={e.payload}\n key={i}\n >\n {e.label}\n </Button>\n )\n )\n })}\n <Button onClick={onClick} bottomRadius={borderRadius}>\n {closeLabel}\n </Button>\n </ButtonsContainer>\n )}\n </div>\n )\n}\n\nconst IconContainer = styled.div`\n display: flex;\n align-items: center;\n cursor: pointer;\n padding: 18px;\n`\n\nexport const PersistentMenu = props => (\n <IconContainer role={ROLES.PERSISTENT_MENU_ICON} onClick={props.onClick}>\n <Icon src={LogoMenu} />\n </IconContainer>\n)\n\nexport default OpenedPersistentMenu\n"],"file":"persistent-menu.js"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.SendButton = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _sendButton = _interopRequireDefault(require("../../assets/send-button.svg"));
13
+
14
+ var _constants = require("../../constants");
15
+
16
+ var _common = require("./common");
17
+
18
+ var SendButton = function SendButton() {
19
+ return /*#__PURE__*/_react["default"].createElement(_common.IconContainer, {
20
+ role: _constants.ROLES.SEND_BUTTON_ICON
21
+ }, /*#__PURE__*/_react["default"].createElement(_common.Icon, {
22
+ src: _sendButton["default"]
23
+ }));
24
+ };
25
+
26
+ exports.SendButton = SendButton;
27
+ //# sourceMappingURL=send-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/components/send-button.jsx"],"names":["SendButton","ROLES","SEND_BUTTON_ICON","SendButtonIcon"],"mappings":";;;;;;;;;AAAA;;AAEA;;AACA;;AACA;;AAEO,IAAMA,UAAU,GAAG,SAAbA,UAAa;AAAA,sBACxB,gCAAC,qBAAD;AAAe,IAAA,IAAI,EAAEC,iBAAMC;AAA3B,kBACE,gCAAC,YAAD;AAAM,IAAA,GAAG,EAAEC;AAAX,IADF,CADwB;AAAA,CAAnB","sourcesContent":["import React from 'react'\n\nimport SendButtonIcon from '../../assets/send-button.svg'\nimport { ROLES } from '../../constants'\nimport { Icon, IconContainer } from './common'\n\nexport const SendButton = () => (\n <IconContainer role={ROLES.SEND_BUTTON_ICON}>\n <Icon src={SendButtonIcon} />\n </IconContainer>\n)\n"],"file":"send-button.js"}
@@ -0,0 +1,55 @@
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.StyledScrollbar = void 0;
11
+
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+
14
+ require("simplebar/dist/simplebar.css");
15
+
16
+ require("./styled-scrollbar.scss");
17
+
18
+ var _simplebarReact = _interopRequireDefault(require("simplebar-react"));
19
+
20
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
21
+
22
+ var _constants = require("../../constants");
23
+
24
+ var _templateObject, _templateObject2;
25
+
26
+ 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); }
27
+
28
+ 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; }
29
+
30
+ var StyledScrollbar = (0, _styledComponents["default"])(_simplebarReact["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n ", "\n & .simplebar-scrollbar::before {\n background-color: ", ";\n background-image: ", ";\n border-radius: ", ";\n }\n & .simplebar-track .simplebar-scrollbar.simplebar-visible::before {\n opacity: ", ";\n }\n & .simplebar-track {\n background-color: ", ";\n background-image: ", ";\n border-radius: ", ";\n }\n"])), function (props) {
31
+ return props.ismessagescontainer && (0, _styledComponents.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n overflow-x: hidden;\n "])));
32
+ }, function (_ref) {
33
+ var scrollbar = _ref.scrollbar;
34
+ return scrollbar && scrollbar.thumb && scrollbar.thumb.color ? scrollbar.thumb.color : "".concat(_constants.COLORS.GRAY);
35
+ }, function (_ref2) {
36
+ var scrollbar = _ref2.scrollbar;
37
+ return scrollbar && scrollbar.thumb && scrollbar.thumb.bgcolor ? scrollbar.thumb.bgcolor : "".concat(_constants.COLORS.GRAY);
38
+ }, function (_ref3) {
39
+ var scrollbar = _ref3.scrollbar;
40
+ return scrollbar && scrollbar.thumb && scrollbar.thumb.border ? scrollbar.thumb.border : '20px';
41
+ }, function (_ref4) {
42
+ var scrollbar = _ref4.scrollbar;
43
+ return scrollbar && !scrollbar.enable ? '0' : scrollbar && scrollbar.thumb && scrollbar.thumb.opacity ? scrollbar.thumb.opacity : '0.75';
44
+ }, function (_ref5) {
45
+ var scrollbar = _ref5.scrollbar;
46
+ return scrollbar && scrollbar.track && scrollbar.track.color && !(scrollbar && !scrollbar.enable) ? scrollbar.track.color : _constants.COLORS.TRANSPARENT;
47
+ }, function (_ref6) {
48
+ var scrollbar = _ref6.scrollbar;
49
+ return scrollbar && scrollbar.track && scrollbar.track.bgcolor && !(scrollbar && !scrollbar.enable) ? scrollbar.track.bgcolor : _constants.COLORS.TRANSPARENT;
50
+ }, function (_ref7) {
51
+ var scrollbar = _ref7.scrollbar;
52
+ return scrollbar && scrollbar.track && scrollbar.track.border ? scrollbar.track.border : '20px';
53
+ });
54
+ exports.StyledScrollbar = StyledScrollbar;
55
+ //# sourceMappingURL=styled-scrollbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/components/styled-scrollbar.jsx"],"names":["StyledScrollbar","SimpleBar","props","ismessagescontainer","css","scrollbar","thumb","color","COLORS","GRAY","bgcolor","border","enable","opacity","track","TRANSPARENT"],"mappings":";;;;;;;;;;;;;AAAA;;AACA;;AAEA;;AACA;;AAEA;;;;;;;;AAEO,IAAMA,eAAe,GAAG,kCAAOC,0BAAP,CAAH,+aACxB,UAAAC,KAAK;AAAA,SACLA,KAAK,CAACC,mBAAN,QACAC,qBADA,wMADK;AAAA,CADmB,EAUJ;AAAA,MAAGC,SAAH,QAAGA,SAAH;AAAA,SAClBA,SAAS,IAAIA,SAAS,CAACC,KAAvB,IAAgCD,SAAS,CAACC,KAAV,CAAgBC,KAAhD,GACIF,SAAS,CAACC,KAAV,CAAgBC,KADpB,aAEOC,kBAAOC,IAFd,CADkB;AAAA,CAVI,EAcJ;AAAA,MAAGJ,SAAH,SAAGA,SAAH;AAAA,SAClBA,SAAS,IAAIA,SAAS,CAACC,KAAvB,IAAgCD,SAAS,CAACC,KAAV,CAAgBI,OAAhD,GACIL,SAAS,CAACC,KAAV,CAAgBI,OADpB,aAEOF,kBAAOC,IAFd,CADkB;AAAA,CAdI,EAkBP;AAAA,MAAGJ,SAAH,SAAGA,SAAH;AAAA,SACfA,SAAS,IAAIA,SAAS,CAACC,KAAvB,IAAgCD,SAAS,CAACC,KAAV,CAAgBK,MAAhD,GACIN,SAAS,CAACC,KAAV,CAAgBK,MADpB,GAEI,MAHW;AAAA,CAlBO,EAwBb;AAAA,MAAGN,SAAH,SAAGA,SAAH;AAAA,SACTA,SAAS,IAAI,CAACA,SAAS,CAACO,MAAxB,GACI,GADJ,GAEIP,SAAS,IAAIA,SAAS,CAACC,KAAvB,IAAgCD,SAAS,CAACC,KAAV,CAAgBO,OAAhD,GACAR,SAAS,CAACC,KAAV,CAAgBO,OADhB,GAEA,MALK;AAAA,CAxBa,EAgCJ;AAAA,MAAGR,SAAH,SAAGA,SAAH;AAAA,SAClBA,SAAS,IACTA,SAAS,CAACS,KADV,IAEAT,SAAS,CAACS,KAAV,CAAgBP,KAFhB,IAGA,EAAEF,SAAS,IAAI,CAACA,SAAS,CAACO,MAA1B,CAHA,GAIIP,SAAS,CAACS,KAAV,CAAgBP,KAJpB,GAKIC,kBAAOO,WANO;AAAA,CAhCI,EAuCJ;AAAA,MAAGV,SAAH,SAAGA,SAAH;AAAA,SAClBA,SAAS,IACTA,SAAS,CAACS,KADV,IAEAT,SAAS,CAACS,KAAV,CAAgBJ,OAFhB,IAGA,EAAEL,SAAS,IAAI,CAACA,SAAS,CAACO,MAA1B,CAHA,GAIIP,SAAS,CAACS,KAAV,CAAgBJ,OAJpB,GAKIF,kBAAOO,WANO;AAAA,CAvCI,EA8CP;AAAA,MAAGV,SAAH,SAAGA,SAAH;AAAA,SACfA,SAAS,IAAIA,SAAS,CAACS,KAAvB,IAAgCT,SAAS,CAACS,KAAV,CAAgBH,MAAhD,GACIN,SAAS,CAACS,KAAV,CAAgBH,MADpB,GAEI,MAHW;AAAA,CA9CO,CAArB","sourcesContent":["import 'simplebar/dist/simplebar.css'\nimport './styled-scrollbar.scss'\n\nimport SimpleBar from 'simplebar-react'\nimport styled, { css } from 'styled-components'\n\nimport { COLORS } from '../../constants'\n\nexport const StyledScrollbar = styled(SimpleBar)`\n ${props =>\n props.ismessagescontainer &&\n css`\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n overflow-x: hidden;\n `}\n & .simplebar-scrollbar::before {\n background-color: ${({ scrollbar }) =>\n scrollbar && scrollbar.thumb && scrollbar.thumb.color\n ? scrollbar.thumb.color\n : `${COLORS.GRAY}`};\n background-image: ${({ scrollbar }) =>\n scrollbar && scrollbar.thumb && scrollbar.thumb.bgcolor\n ? scrollbar.thumb.bgcolor\n : `${COLORS.GRAY}`};\n border-radius: ${({ scrollbar }) =>\n scrollbar && scrollbar.thumb && scrollbar.thumb.border\n ? scrollbar.thumb.border\n : '20px'};\n }\n & .simplebar-track .simplebar-scrollbar.simplebar-visible::before {\n opacity: ${({ scrollbar }) =>\n scrollbar && !scrollbar.enable\n ? '0'\n : scrollbar && scrollbar.thumb && scrollbar.thumb.opacity\n ? scrollbar.thumb.opacity\n : '0.75'};\n }\n & .simplebar-track {\n background-color: ${({ scrollbar }) =>\n scrollbar &&\n scrollbar.track &&\n scrollbar.track.color &&\n !(scrollbar && !scrollbar.enable)\n ? scrollbar.track.color\n : COLORS.TRANSPARENT};\n background-image: ${({ scrollbar }) =>\n scrollbar &&\n scrollbar.track &&\n scrollbar.track.bgcolor &&\n !(scrollbar && !scrollbar.enable)\n ? scrollbar.track.bgcolor\n : COLORS.TRANSPARENT};\n border-radius: ${({ scrollbar }) =>\n scrollbar && scrollbar.track && scrollbar.track.border\n ? scrollbar.track.border\n : '20px'};\n }\n`\n"],"file":"styled-scrollbar.js"}
@@ -0,0 +1,12 @@
1
+ #botonic-scrollable-content
2
+ > div.simplebar-wrapper
3
+ > div.simplebar-mask
4
+ > div
5
+ > div {
6
+ overscroll-behavior: contain; // https://css-tricks.com/almanac/properties/o/overscroll-behavior/
7
+ -webkit-overflow-scrolling: touch;
8
+ ::-webkit-scrollbar {
9
+ // https://github.com/Grsmto/simplebar/issues/445#issuecomment-586902814
10
+ display: none;
11
+ }
12
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.TypingIndicator = void 0;
9
+
10
+ require("./typing-indicator.scss");
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ var _constants = require("../../constants");
15
+
16
+ var TypingIndicator = function TypingIndicator(props) {
17
+ return /*#__PURE__*/_react["default"].createElement("div", {
18
+ role: _constants.ROLES.TYPING_INDICATOR,
19
+ className: "typing-indicator",
20
+ style: {
21
+ backgroundColor: _constants.COLORS.SEASHELL_WHITE
22
+ }
23
+ }, /*#__PURE__*/_react["default"].createElement("span", null), /*#__PURE__*/_react["default"].createElement("span", null), /*#__PURE__*/_react["default"].createElement("span", null));
24
+ };
25
+
26
+ exports.TypingIndicator = TypingIndicator;
27
+ //# sourceMappingURL=typing-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/components/typing-indicator.jsx"],"names":["TypingIndicator","props","ROLES","TYPING_INDICATOR","backgroundColor","COLORS","SEASHELL_WHITE"],"mappings":";;;;;;;;;AAAA;;AAEA;;AAEA;;AAEO,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,CAAAC,KAAK;AAAA,sBAClC;AACE,IAAA,IAAI,EAAEC,iBAAMC,gBADd;AAEE,IAAA,SAAS,EAAC,kBAFZ;AAGE,IAAA,KAAK,EAAE;AAAEC,MAAAA,eAAe,EAAEC,kBAAOC;AAA1B;AAHT,kBAKE,6CALF,eAME,6CANF,eAOE,6CAPF,CADkC;AAAA,CAA7B","sourcesContent":["import './typing-indicator.scss'\n\nimport React from 'react'\n\nimport { COLORS, ROLES } from '../../constants'\n\nexport const TypingIndicator = props => (\n <div\n role={ROLES.TYPING_INDICATOR}\n className='typing-indicator'\n style={{ backgroundColor: COLORS.SEASHELL_WHITE }}\n >\n <span />\n <span />\n <span />\n </div>\n)\n"],"file":"typing-indicator.js"}
@@ -0,0 +1,38 @@
1
+ .typing-indicator {
2
+ will-change: transform;
3
+ width: 44px;
4
+ line-height: 0px;
5
+ border-radius: 20px;
6
+ padding: 8px 2px 8px;
7
+ text-align: center;
8
+ display: block;
9
+ margin: 8px;
10
+ position: relative;
11
+ animation: 2s bulge infinite ease-out;
12
+ span {
13
+ height: 6px;
14
+ width: 6px;
15
+ margin: 0 1px;
16
+ background-color: #9e9ea1;
17
+ display: inline-block;
18
+ border-radius: 50%;
19
+ opacity: 0.4;
20
+ @for $i from 1 through 3 {
21
+ &:nth-of-type(#{$i}) {
22
+ animation: 1s blink infinite ($i * 0.3333s);
23
+ }
24
+ }
25
+ }
26
+ }
27
+
28
+ @keyframes blink {
29
+ 50% {
30
+ opacity: 1;
31
+ }
32
+ }
33
+
34
+ @keyframes bulge {
35
+ 50% {
36
+ transform: scale(1.05);
37
+ }
38
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.DeviceAdapter = 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 _scrollbarController = require("./scrollbar-controller");
19
+
20
+ var _webchatResizer = require("./webchat-resizer");
21
+
22
+ var DeviceAdapter = /*#__PURE__*/function () {
23
+ function DeviceAdapter() {
24
+ (0, _classCallCheck2["default"])(this, DeviceAdapter);
25
+ this.currentDevice = this.getCurrentDevice();
26
+ }
27
+
28
+ (0, _createClass2["default"])(DeviceAdapter, [{
29
+ key: "init",
30
+ value: function init(host) {
31
+ this.webchatResizer = new _webchatResizer.WebchatResizer(this.currentDevice, host);
32
+ this.scrollbarController = new _scrollbarController.ScrollbarController(this.currentDevice, host);
33
+ this.scrollbarController.handleScrollEvents();
34
+ }
35
+ }, {
36
+ key: "getCurrentDevice",
37
+ value: function getCurrentDevice() {
38
+ // navigator.platform deprecated. Ref: (https://erikmartinjordan.com/navigator-platform-deprecated-alternative)
39
+ if (navigator.userAgentData) return navigator.userAgentData.platform;
40
+ return navigator.platform;
41
+ }
42
+ }, {
43
+ key: "onFocus",
44
+ value: function onFocus(host) {
45
+ var _this = this;
46
+
47
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) {
48
+ (0, _dom.scrollToBottom)({
49
+ host: host,
50
+ timeout: 800
51
+ });
52
+ return;
53
+ }
54
+
55
+ setTimeout(function () {
56
+ // Place onFocus logic to be run the last on the queue of asynchronous events to give enough time to init method to be called. Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#zero_delays
57
+ _this.webchatResizer.onFocus(function () {
58
+ return _this.scrollbarController.handleOnTouchMoveEvents();
59
+ });
60
+ }, 0);
61
+ }
62
+ }, {
63
+ key: "onBlur",
64
+ value: function onBlur() {
65
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return;
66
+ this.webchatResizer.onBlur();
67
+ this.scrollbarController.handleOnTouchMoveEvents();
68
+ }
69
+ }, {
70
+ key: "fontSize",
71
+ value: function fontSize() {
72
+ var defaultFontSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 14;
73
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return defaultFontSize; // Disabling auto-zoom on input (iPhone devices): https://stackoverflow.com/a/25614477, https://stackoverflow.com/a/6394497
74
+
75
+ return 'initial';
76
+ }
77
+ }]);
78
+ return DeviceAdapter;
79
+ }();
80
+
81
+ exports.DeviceAdapter = DeviceAdapter;
82
+ //# sourceMappingURL=device-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/devices/device-adapter.js"],"names":["DeviceAdapter","currentDevice","getCurrentDevice","host","webchatResizer","WebchatResizer","scrollbarController","ScrollbarController","handleScrollEvents","navigator","userAgentData","platform","DEVICES","MOBILE","IPHONE","timeout","setTimeout","onFocus","handleOnTouchMoveEvents","onBlur","defaultFontSize"],"mappings":";;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;IAEaA,a;AACX,2BAAc;AAAA;AACZ,SAAKC,aAAL,GAAqB,KAAKC,gBAAL,EAArB;AACD;;;;WAED,cAAKC,IAAL,EAAW;AACT,WAAKC,cAAL,GAAsB,IAAIC,8BAAJ,CAAmB,KAAKJ,aAAxB,EAAuCE,IAAvC,CAAtB;AACA,WAAKG,mBAAL,GAA2B,IAAIC,wCAAJ,CAAwB,KAAKN,aAA7B,EAA4CE,IAA5C,CAA3B;AACA,WAAKG,mBAAL,CAAyBE,kBAAzB;AACD;;;WAED,4BAAmB;AACjB;AACA,UAAIC,SAAS,CAACC,aAAd,EAA6B,OAAOD,SAAS,CAACC,aAAV,CAAwBC,QAA/B;AAC7B,aAAOF,SAAS,CAACE,QAAjB;AACD;;;WAED,iBAAQR,IAAR,EAAc;AAAA;;AACZ,UAAI,KAAKF,aAAL,KAAuBW,UAAQC,MAAR,CAAeC,MAA1C,EAAkD;AAChD,iCAAe;AAAEX,UAAAA,IAAI,EAAJA,IAAF;AAAQY,UAAAA,OAAO,EAAE;AAAjB,SAAf;AACA;AACD;;AACDC,MAAAA,UAAU,CAAC,YAAM;AACf;AACA,QAAA,KAAI,CAACZ,cAAL,CAAoBa,OAApB,CAA4B;AAAA,iBAC1B,KAAI,CAACX,mBAAL,CAAyBY,uBAAzB,EAD0B;AAAA,SAA5B;AAGD,OALS,EAKP,CALO,CAAV;AAMD;;;WAED,kBAAS;AACP,UAAI,KAAKjB,aAAL,KAAuBW,UAAQC,MAAR,CAAeC,MAA1C,EAAkD;AAClD,WAAKV,cAAL,CAAoBe,MAApB;AACA,WAAKb,mBAAL,CAAyBY,uBAAzB;AACD;;;WAED,oBAA+B;AAAA,UAAtBE,eAAsB,uEAAJ,EAAI;AAC7B,UAAI,KAAKnB,aAAL,KAAuBW,UAAQC,MAAR,CAAeC,MAA1C,EAAkD,OAAOM,eAAP,CADrB,CAE7B;;AACA,aAAO,SAAP;AACD","sourcesContent":["import { scrollToBottom } from '../../util/dom'\nimport { DEVICES } from '.'\nimport { ScrollbarController } from './scrollbar-controller'\nimport { WebchatResizer } from './webchat-resizer'\n\nexport class DeviceAdapter {\n constructor() {\n this.currentDevice = this.getCurrentDevice()\n }\n\n init(host) {\n this.webchatResizer = new WebchatResizer(this.currentDevice, host)\n this.scrollbarController = new ScrollbarController(this.currentDevice, host)\n this.scrollbarController.handleScrollEvents()\n }\n\n getCurrentDevice() {\n // navigator.platform deprecated. Ref: (https://erikmartinjordan.com/navigator-platform-deprecated-alternative)\n if (navigator.userAgentData) return navigator.userAgentData.platform\n return navigator.platform\n }\n\n onFocus(host) {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) {\n scrollToBottom({ host, timeout: 800 })\n return\n }\n setTimeout(() => {\n // Place onFocus logic to be run the last on the queue of asynchronous events to give enough time to init method to be called. Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#zero_delays\n this.webchatResizer.onFocus(() =>\n this.scrollbarController.handleOnTouchMoveEvents()\n )\n }, 0)\n }\n\n onBlur() {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return\n this.webchatResizer.onBlur()\n this.scrollbarController.handleOnTouchMoveEvents()\n }\n\n fontSize(defaultFontSize = 14) {\n if (this.currentDevice !== DEVICES.MOBILE.IPHONE) return defaultFontSize\n // Disabling auto-zoom on input (iPhone devices): https://stackoverflow.com/a/25614477, https://stackoverflow.com/a/6394497\n return 'initial'\n }\n}\n"],"file":"device-adapter.js"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isMobileDevice = exports.isDevice = exports.DEVICES = void 0;
7
+ var DEVICES = Object.freeze({
8
+ MOBILE: {
9
+ IPHONE: 'iPhone',
10
+ ANDROID: 'Android',
11
+ WEBOS: 'webOS',
12
+ BLACKBERRY: 'BlackBerry',
13
+ WINDOWS_PHONE: 'Windows Phone'
14
+ }
15
+ });
16
+ exports.DEVICES = DEVICES;
17
+
18
+ var isDevice = function isDevice(deviceName) {
19
+ // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today
20
+ return !!navigator.platform && navigator.platform.toLowerCase().includes(deviceName.toLowerCase());
21
+ };
22
+
23
+ exports.isDevice = isDevice;
24
+
25
+ var isMobileDevice = function isMobileDevice() {
26
+ return Object.values(DEVICES.MOBILE).some(function (deviceName) {
27
+ return isDevice(deviceName);
28
+ });
29
+ };
30
+
31
+ exports.isMobileDevice = isMobileDevice;
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/webchat/devices/index.js"],"names":["DEVICES","Object","freeze","MOBILE","IPHONE","ANDROID","WEBOS","BLACKBERRY","WINDOWS_PHONE","isDevice","deviceName","navigator","platform","toLowerCase","includes","isMobileDevice","values","some"],"mappings":";;;;;;AAAO,IAAMA,OAAO,GAAGC,MAAM,CAACC,MAAP,CAAc;AACnCC,EAAAA,MAAM,EAAE;AACNC,IAAAA,MAAM,EAAE,QADF;AAENC,IAAAA,OAAO,EAAE,SAFH;AAGNC,IAAAA,KAAK,EAAE,OAHD;AAINC,IAAAA,UAAU,EAAE,YAJN;AAKNC,IAAAA,aAAa,EAAE;AALT;AAD2B,CAAd,CAAhB;;;AAUA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAC,UAAU,EAAI;AACpC;AACA,SACE,CAAC,CAACC,SAAS,CAACC,QAAZ,IACAD,SAAS,CAACC,QAAV,CAAmBC,WAAnB,GAAiCC,QAAjC,CAA0CJ,UAAU,CAACG,WAAX,EAA1C,CAFF;AAID,CANM;;;;AAQA,IAAME,cAAc,GAAG,SAAjBA,cAAiB,GAAM;AAClC,SAAOd,MAAM,CAACe,MAAP,CAAchB,OAAO,CAACG,MAAtB,EAA8Bc,IAA9B,CAAmC,UAAAP,UAAU;AAAA,WAAID,QAAQ,CAACC,UAAD,CAAZ;AAAA,GAA7C,CAAP;AACD,CAFM","sourcesContent":["export const DEVICES = Object.freeze({\n MOBILE: {\n IPHONE: 'iPhone',\n ANDROID: 'Android',\n WEBOS: 'webOS',\n BLACKBERRY: 'BlackBerry',\n WINDOWS_PHONE: 'Windows Phone',\n },\n})\n\nexport const isDevice = deviceName => {\n // https://stackoverflow.com/questions/19877924/what-is-the-list-of-possible-values-for-navigator-platform-as-of-today\n return (\n !!navigator.platform &&\n navigator.platform.toLowerCase().includes(deviceName.toLowerCase())\n )\n}\n\nexport const isMobileDevice = () => {\n return Object.values(DEVICES.MOBILE).some(deviceName => isDevice(deviceName))\n}\n"],"file":"index.js"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ScrollbarController = 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 debounced = function debounced(delay, fn) {
19
+ var timerId;
20
+ return function () {
21
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
22
+ args[_key] = arguments[_key];
23
+ }
24
+
25
+ if (timerId) {
26
+ clearTimeout(timerId);
27
+ }
28
+
29
+ timerId = setTimeout(function () {
30
+ fn.apply(void 0, args);
31
+ timerId = null;
32
+ }, delay);
33
+ };
34
+ };
35
+
36
+ var stopAtScrollLimit = function stopAtScrollLimit(element) {
37
+ if (element.scrollTop === 0) element.scrollTop = 1;
38
+ if (element.scrollHeight - element.scrollTop === element.clientHeight) element.scrollTop -= 1;
39
+ };
40
+
41
+ var ScrollbarController = /*#__PURE__*/function () {
42
+ function ScrollbarController(currentDevice, host) {
43
+ (0, _classCallCheck2["default"])(this, ScrollbarController);
44
+ this.currentDevice = currentDevice;
45
+ this.webchat = (0, _dom.getWebchatElement)(host);
46
+ }
47
+
48
+ (0, _createClass2["default"])(ScrollbarController, [{
49
+ key: "handleScrollEvents",
50
+ value: function handleScrollEvents() {
51
+ var _this = this;
52
+
53
+ /*
54
+ It handles scroll events for Mobile/Desktop.
55
+ "ontouchmove" is the phone equivalent for "onmouseover"
56
+ */
57
+ if ((0, _.isMobileDevice)()) {
58
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return;
59
+ this.limitScrollBoundaries();
60
+
61
+ this.webchat.ontouchstart = function (e) {
62
+ _this.handleOnTouchMoveEvents(e);
63
+ };
64
+
65
+ this.webchat.ontouchmove = function (e) {
66
+ _this.handleOnTouchMoveEvents(e);
67
+ };
68
+ } else {
69
+ this.webchat.onmouseover = function (e) {
70
+ return _this.handleOnMouseOverEvents(e);
71
+ };
72
+ }
73
+ }
74
+ }, {
75
+ key: "hasScrollbar",
76
+ value: function hasScrollbar() {
77
+ var scrollableArea = (0, _dom.getScrollableArea)(this.webchat);
78
+ var isScrollable = scrollableArea.visible.clientHeight - scrollableArea.full.clientHeight < 0;
79
+ return isScrollable;
80
+ }
81
+ }, {
82
+ key: "handleOnMouseOverEvents",
83
+ value: function handleOnMouseOverEvents(e) {
84
+ var target = e.currentTarget;
85
+
86
+ while (target) {
87
+ this.toggleOnMouseWheelEvents();
88
+ target = target.parentNode;
89
+ }
90
+ }
91
+ }, {
92
+ key: "toggleOnMouseWheelEvents",
93
+ value: function toggleOnMouseWheelEvents() {
94
+ var scrollableContent = (0, _dom.getScrollableContent)(this.webchat);
95
+
96
+ if (this.hasScrollbar()) {
97
+ scrollableContent.onmousewheel = {};
98
+ return;
99
+ }
100
+
101
+ scrollableContent.onmousewheel = function (e) {
102
+ return e.preventDefault();
103
+ };
104
+ }
105
+ }, {
106
+ key: "handleOnTouchMoveEvents",
107
+ value: function handleOnTouchMoveEvents(e) {
108
+ this.toggleOnTouchMoveEvents();
109
+ }
110
+ }, {
111
+ key: "toggleOnTouchMoveEvents",
112
+ value: function toggleOnTouchMoveEvents() {
113
+ if (this.hasScrollbar()) {
114
+ this.webchat.ontouchmove = {};
115
+ this.webchat.ontouchstart = {};
116
+ return;
117
+ }
118
+
119
+ this.webchat.ontouchmove = function (e) {
120
+ return e.preventDefault();
121
+ };
122
+ }
123
+ }, {
124
+ key: "limitScrollBoundaries",
125
+ value: function limitScrollBoundaries() {
126
+ if (this.currentDevice !== _.DEVICES.MOBILE.IPHONE) return;
127
+ /*
128
+ It adds a bounce effect when top or bottom limits of the scrollbar are reached for iOS,
129
+ as an alternative of overscroll-behavior (https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior)
130
+ */
131
+
132
+ var frame = (0, _dom.getScrollableArea)(this.webchat).visible;
133
+ var dStopAtScrollLimit = debounced(100, stopAtScrollLimit);
134
+
135
+ if (frame) {
136
+ if (window.addEventListener) {
137
+ frame.addEventListener('scroll', function () {
138
+ return dStopAtScrollLimit(frame);
139
+ }, true);
140
+ } else if (window.attachEvent) {
141
+ frame.attachEvent('scroll', function () {
142
+ return dStopAtScrollLimit(frame);
143
+ });
144
+ }
145
+ }
146
+ }
147
+ }]);
148
+ return ScrollbarController;
149
+ }();
150
+
151
+ exports.ScrollbarController = ScrollbarController;
152
+ //# sourceMappingURL=scrollbar-controller.js.map