@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.
- package/lib/components/image.js +6 -52
- package/lib/components/image.js.map +1 -1
- package/lib/constants.js +200 -0
- package/lib/constants.js.map +1 -0
- package/lib/contexts.js +57 -0
- package/lib/contexts.js.map +1 -0
- package/lib/dev-app.js +241 -0
- package/lib/dev-app.js.map +1 -0
- package/lib/index.d.ts +239 -0
- package/lib/index.js +131 -0
- package/lib/index.js.map +1 -0
- package/lib/message-utils.js +149 -0
- package/lib/message-utils.js.map +1 -0
- package/lib/msg-to-botonic.js +199 -0
- package/lib/msg-to-botonic.js.map +1 -0
- package/lib/node-app.js +97 -0
- package/lib/node-app.js.map +1 -0
- package/lib/react-bot.js +167 -0
- package/lib/react-bot.js.map +1 -0
- package/lib/util/dom.js +84 -0
- package/lib/util/dom.js.map +1 -0
- package/lib/util/environment.js +42 -0
- package/lib/util/environment.js.map +1 -0
- package/lib/util/error-boundary.js +105 -0
- package/lib/util/error-boundary.js.map +1 -0
- package/lib/util/index.d.ts +9 -0
- package/lib/util/index.js +2 -0
- package/lib/util/index.js.map +1 -0
- package/lib/util/logs.js +28 -0
- package/lib/util/logs.js.map +1 -0
- package/lib/util/objects.js +60 -0
- package/lib/util/objects.js.map +1 -0
- package/lib/util/react.js +75 -0
- package/lib/util/react.js.map +1 -0
- package/lib/util/regexs.js +31 -0
- package/lib/util/regexs.js.map +1 -0
- package/lib/util/webchat.js +92 -0
- package/lib/util/webchat.js.map +1 -0
- package/lib/webchat/actions.js +51 -0
- package/lib/webchat/actions.js.map +1 -0
- package/lib/webchat/components/attachment.js +43 -0
- package/lib/webchat/components/attachment.js.map +1 -0
- package/lib/webchat/components/common.js +33 -0
- package/lib/webchat/components/common.js.map +1 -0
- package/lib/webchat/components/emoji-picker.js +58 -0
- package/lib/webchat/components/emoji-picker.js.map +1 -0
- package/lib/webchat/components/persistent-menu.js +96 -0
- package/lib/webchat/components/persistent-menu.js.map +1 -0
- package/lib/webchat/components/send-button.js +27 -0
- package/lib/webchat/components/send-button.js.map +1 -0
- package/lib/webchat/components/styled-scrollbar.js +55 -0
- package/lib/webchat/components/styled-scrollbar.js.map +1 -0
- package/lib/webchat/components/styled-scrollbar.scss +12 -0
- package/lib/webchat/components/typing-indicator.js +27 -0
- package/lib/webchat/components/typing-indicator.js.map +1 -0
- package/lib/webchat/components/typing-indicator.scss +38 -0
- package/lib/webchat/devices/device-adapter.js +82 -0
- package/lib/webchat/devices/device-adapter.js.map +1 -0
- package/lib/webchat/devices/index.js +32 -0
- package/lib/webchat/devices/index.js.map +1 -0
- package/lib/webchat/devices/scrollbar-controller.js +152 -0
- package/lib/webchat/devices/scrollbar-controller.js.map +1 -0
- package/lib/webchat/devices/webchat-resizer.js +76 -0
- package/lib/webchat/devices/webchat-resizer.js.map +1 -0
- package/lib/webchat/header.js +116 -0
- package/lib/webchat/header.js.map +1 -0
- package/lib/webchat/hooks.js +350 -0
- package/lib/webchat/hooks.js.map +1 -0
- package/lib/webchat/index.d.ts +62 -0
- package/lib/webchat/index.js +32 -0
- package/lib/webchat/index.js.map +1 -0
- package/lib/webchat/message-list.js +88 -0
- package/lib/webchat/message-list.js.map +1 -0
- package/lib/webchat/messages-reducer.js +93 -0
- package/lib/webchat/messages-reducer.js.map +1 -0
- package/lib/webchat/replies.js +78 -0
- package/lib/webchat/replies.js.map +1 -0
- package/lib/webchat/session-view.js +106 -0
- package/lib/webchat/session-view.js.map +1 -0
- package/lib/webchat/use-storage-state-hook.js +29 -0
- package/lib/webchat/use-storage-state-hook.js.map +1 -0
- package/lib/webchat/webchat-dev.js +109 -0
- package/lib/webchat/webchat-dev.js.map +1 -0
- package/lib/webchat/webchat-reducer.js +102 -0
- package/lib/webchat/webchat-reducer.js.map +1 -0
- package/lib/webchat/webchat.js +1041 -0
- package/lib/webchat/webchat.js.map +1 -0
- package/lib/webchat/webview.js +122 -0
- package/lib/webchat/webview.js.map +1 -0
- package/lib/webchat-app.js +643 -0
- package/lib/webchat-app.js.map +1 -0
- package/lib/webchat.template.html +37 -0
- package/lib/webview.js +214 -0
- package/lib/webview.js.map +1 -0
- package/lib/webview.template.html +39 -0
- package/package.json +2 -2
- package/src/components/image.jsx +3 -37
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -1
- package/src/webchat/actions.jsx +0 -1
- package/src/webchat/hooks.js +0 -8
- package/src/webchat/webchat-reducer.js +0 -4
- package/src/webchat/webchat.jsx +0 -18
- package/src/webchat-app.jsx +0 -8
- package/src/webchat/components/portal-modal/backdrop.jsx +0 -38
- package/src/webchat/components/portal-modal/constants.js +0 -7
- package/src/webchat/components/portal-modal/content.jsx +0 -10
- package/src/webchat/components/portal-modal/index.js +0 -5
- package/src/webchat/components/portal-modal/portal-modal-component.jsx +0 -72
- 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
|