@subiz/widget-v4 4.0.92 → 4.0.93

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 (169) hide show
  1. package/compiled_src/bot.js +0 -11
  2. package/compiled_src/call/call.js +0 -61
  3. package/compiled_src/call/css.js +0 -2
  4. package/compiled_src/chatbox/AgentsAvatar.js +0 -16
  5. package/compiled_src/chatbox/AudioAttachments.js +0 -14
  6. package/compiled_src/chatbox/ButtonAttachments.js +1 -14
  7. package/compiled_src/chatbox/Buttons.js +0 -13
  8. package/compiled_src/chatbox/ChatButton.js +1 -78
  9. package/compiled_src/chatbox/DropdownSelect.js +3 -44
  10. package/compiled_src/chatbox/Emoji.js +0 -7
  11. package/compiled_src/chatbox/Event.js +0 -59
  12. package/compiled_src/chatbox/Events.js +4 -44
  13. package/compiled_src/chatbox/FileAttachments.js +0 -14
  14. package/compiled_src/chatbox/FormAttachment.js +1 -52
  15. package/compiled_src/chatbox/FormAttachments.js +0 -14
  16. package/compiled_src/chatbox/FormSubmitAttachments.js +0 -11
  17. package/compiled_src/chatbox/GenericTemplateAttachments.js +1 -20
  18. package/compiled_src/chatbox/Header.js +1 -46
  19. package/compiled_src/chatbox/ImageAttachments.js +0 -16
  20. package/compiled_src/chatbox/InfoMessage.js +0 -13
  21. package/compiled_src/chatbox/ListField.js +0 -16
  22. package/compiled_src/chatbox/MessageInput.js +1 -47
  23. package/compiled_src/chatbox/Order.js +0 -35
  24. package/compiled_src/chatbox/OrderAttachments.js +1 -23
  25. package/compiled_src/chatbox/PoweredBy.js +0 -7
  26. package/compiled_src/chatbox/ProductAttachments.js +0 -19
  27. package/compiled_src/chatbox/QuickReplies.js +0 -18
  28. package/compiled_src/chatbox/Rating.js +0 -37
  29. package/compiled_src/chatbox/ShadowDomRoot.js +0 -9
  30. package/compiled_src/chatbox/TextMessage.js +0 -64
  31. package/compiled_src/chatbox/Typing.js +0 -15
  32. package/compiled_src/chatbox/VideoAttachments.js +0 -14
  33. package/compiled_src/chatbox/Widget.js +6 -167
  34. package/compiled_src/chatbox/css.js +0 -2
  35. package/compiled_src/chatbox/dragscroll.js +1 -5
  36. package/compiled_src/chatbox/main.js +1 -40
  37. package/compiled_src/chatbox/releaseAnimation.js +0 -11
  38. package/compiled_src/chatbox/spinner.js +0 -10
  39. package/compiled_src/chatbox/time.js +0 -22
  40. package/compiled_src/chatbox/touchscroll.js +0 -7
  41. package/compiled_src/common.js +0 -22
  42. package/compiled_src/contact/contact.js +2 -52
  43. package/compiled_src/contact/css.js +0 -2
  44. package/compiled_src/lib.js +19 -46
  45. package/compiled_src/notif/css.js +0 -2
  46. package/compiled_src/notif/notif.js +0 -63
  47. package/compiled_src/order/address_picker.js +4 -38
  48. package/compiled_src/order/icon.js +0 -16
  49. package/compiled_src/order/index.js +1 -34
  50. package/compiled_src/order/order.js +2 -156
  51. package/compiled_src/plugin.js +1 -77
  52. package/compiled_src/popup/countdown.js +2 -33
  53. package/compiled_src/popup/css.js +0 -2
  54. package/compiled_src/popup/popup.js +2 -165
  55. package/compiled_src/popup/tick.core.commonjs.js +72 -222
  56. package/compiled_src/popup/tick.view.flip.commonjs.js +23 -31
  57. package/compiled_src/store/api.js +99 -65
  58. package/compiled_src/store/api_fake.js +3 -39
  59. package/compiled_src/store/realtime_fake.js +0 -6
  60. package/compiled_src/store/store.js +42 -248
  61. package/compiled_src/util/campaign.js +0 -13
  62. package/compiled_src/util/common.js +15 -185
  63. package/compiled_src/util/common.test.js +0 -4
  64. package/compiled_src/util/extractor.js +1 -21
  65. package/compiled_src/util/extractor.test.js +0 -3
  66. package/compiled_src/util/gate.js +0 -7
  67. package/compiled_src/util/gate.test.js +1 -2
  68. package/compiled_src/util/index.js +1 -7
  69. package/compiled_src/util/mutex.js +31 -0
  70. package/compiled_src/util/op.js +1 -14
  71. package/compiled_src/util/pubsub.js +0 -6
  72. package/compiled_src/util/pubsub.test.js +0 -2
  73. package/package.json +11 -11
  74. package/src/lib.js +24 -2
  75. package/src/store/api.js +110 -21
  76. package/src/store/api_fake.js +5 -6
  77. package/src/store/store.js +31 -5
  78. package/src/util/index.js +1 -0
  79. package/src/util/mutex.js +27 -0
  80. package/dist/132.js +0 -7092
  81. package/dist/178.js +0 -406
  82. package/dist/18364d15f37.132.js +0 -1
  83. package/dist/18364d15f37.178.js +0 -1
  84. package/dist/18364d15f37.213.js +0 -1
  85. package/dist/18364d15f37.335.js +0 -1
  86. package/dist/18364d15f37.362.js +0 -1
  87. package/dist/18364d15f37.441.js +0 -1
  88. package/dist/18364d15f37.605.js +0 -1
  89. package/dist/18364d15f37.678.js +0 -1
  90. package/dist/18364d15f37.782.js +0 -1
  91. package/dist/18364d15f37.app.js +0 -1
  92. package/dist/18364d15f37.index.html +0 -26
  93. package/dist/18364d15f37.library.html +0 -26
  94. package/dist/18364d15f37.library.js +0 -1
  95. package/dist/18364d15f37.preview.html +0 -759
  96. package/dist/18364d15f37.preview.js +0 -1
  97. package/dist/18364d15f37.screenshoot.js +0 -1
  98. package/dist/213.js +0 -3215
  99. package/dist/335.js +0 -411
  100. package/dist/362.js +0 -107
  101. package/dist/441.js +0 -2834
  102. package/dist/605.js +0 -328
  103. package/dist/678.js +0 -107
  104. package/dist/782.js +0 -107
  105. package/dist/HASH +0 -1
  106. package/dist/assets/img/Facebook.64607ec.png +0 -0
  107. package/dist/assets/img/Zalo.6845707.png +0 -0
  108. package/dist/assets/img/award1a.1a58e10.png +0 -0
  109. package/dist/assets/img/award3a.3b74423.png +0 -0
  110. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  111. package/dist/assets/img/award5.39eb7ae.png +0 -0
  112. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  113. package/dist/assets/img/caret.998eb8f.svg +0 -1
  114. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  115. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  116. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  117. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  118. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  119. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  120. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  121. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  122. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  123. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  124. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  125. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  126. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  127. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  128. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  129. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  130. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  131. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  132. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  133. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  134. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  135. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  136. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  137. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  138. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  139. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  140. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  141. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  142. package/dist/assets/img/empty.29bed2d.svg +0 -23
  143. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  144. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  145. package/dist/assets/img/external-link.90577cc.svg +0 -1
  146. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  147. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  148. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  149. package/dist/assets/img/image_default.be0698b.png +0 -0
  150. package/dist/assets/img/info.ebce7ea.svg +0 -1
  151. package/dist/assets/img/loader.37000a7.svg +0 -1
  152. package/dist/assets/img/loading_static.8f403ae.svg +0 -10
  153. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  154. package/dist/assets/img/main-service2.9b99549.png +0 -0
  155. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  156. package/dist/assets/img/package.8d37d0f.svg +0 -5
  157. package/dist/assets/img/package_fade.763c001.svg +0 -1
  158. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  159. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  160. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  161. package/dist/assets/img/search.f9705ff.svg +0 -1
  162. package/dist/assets/img/send.6db52a9.svg +0 -3
  163. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  164. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  165. package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
  166. package/dist/assets/img/x.26fdfa3.svg +0 -5
  167. package/dist/malicious-app.js +0 -13
  168. package/dist/screenshoot.html +0 -7
  169. package/dist/screenshoot.js +0 -5953
@@ -4,66 +4,39 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _index = _interopRequireDefault(require("../util/index.js"));
9
-
10
8
  var _Emoji = _interopRequireDefault(require("./Emoji.js"));
11
-
12
9
  var _PoweredBy = _interopRequireDefault(require("./PoweredBy.js"));
13
-
14
10
  var _AgentsAvatar = _interopRequireDefault(require("./AgentsAvatar.js"));
15
-
16
11
  var _Header = _interopRequireDefault(require("./Header.js"));
17
-
18
12
  var _MessageInput = _interopRequireDefault(require("./MessageInput.js"));
19
-
20
13
  var _Events = _interopRequireDefault(require("./Events.js"));
21
-
22
14
  var _Typing = _interopRequireDefault(require("./Typing.js"));
23
-
24
15
  var _Rating = _interopRequireDefault(require("./Rating.js"));
25
-
26
16
  var _Order = _interopRequireDefault(require("./Order.js"));
27
-
28
17
  var _ListField = _interopRequireDefault(require("./ListField.js"));
29
-
30
18
  var _spinner = _interopRequireDefault(require("./spinner.js"));
31
-
32
19
  var _time = _interopRequireDefault(require("./time.js"));
33
-
34
20
  var _common = require("../common.js");
35
-
36
21
  var _preact = require("preact");
37
-
38
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
-
40
23
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
41
-
42
24
  var send = require('../../assets/img/send.svg');
43
-
44
25
  var checkedimg = require('../../assets/img/done_gray.svg');
45
-
46
26
  var empty = require('../../assets/img/empty.svg');
47
-
48
27
  const defaultAvatar = 'https://file-subiz.com/fiqoahedjbgwclpouoml-avatar_default_baa8a1d7.png';
49
-
50
28
  class Widget extends _common.Com {
51
29
  constructor(props) {
52
30
  super(props);
53
-
54
31
  _defineProperty(this, "msgInput", (0, _preact.createRef)());
55
-
56
32
  _defineProperty(this, "sendMessage", async message => {
57
33
  let hasPostback = _index.default.find(message.attachments, att => att.type === 'postback');
58
-
59
34
  if (this.isFormRequired() && hasPostback) {
60
35
  this.onStartConvoClick();
61
36
  this.fillQuickReplyToQuestion(message);
62
37
  return;
63
38
  }
64
-
65
39
  let text = message.text;
66
-
67
40
  if (!this.props.cid) {
68
41
  this.creating = true;
69
42
  const {
@@ -74,8 +47,8 @@ class Widget extends _common.Com {
74
47
  message: text,
75
48
  initial_by: this.props.store.matchUser().id
76
49
  });
77
-
78
- if (error) {}
50
+ if (error) {
51
+ }
79
52
 
80
53
  this.creating = false;
81
54
  this.props.store.sendConvoEvent(convo.id, 'message_sent', {
@@ -87,16 +60,13 @@ class Widget extends _common.Com {
87
60
  });
88
61
  return;
89
62
  }
90
-
91
63
  this.props.store.sendConvoEvent(this.props.cid, 'message_sent', {
92
64
  message
93
65
  });
94
66
  });
95
-
96
67
  _defineProperty(this, "onLink", (e, url) => {
97
68
  if (!url) return e.preventDefault();
98
69
  let noschemeurl = url.replace(/(^\w+:|^)\/\//, '');
99
-
100
70
  if (noschemeurl.startsWith('widget.subiz.com.vn/orders/')) {
101
71
  let orderid = noschemeurl.substr('widget.subiz.com.vn/orders/'.length);
102
72
  orderid = orderid.split('/')[0];
@@ -108,7 +78,6 @@ class Widget extends _common.Com {
108
78
  return;
109
79
  }
110
80
  });
111
-
112
81
  _defineProperty(this, "closeOrder", e => {
113
82
  this.setState({
114
83
  showOrder: false,
@@ -116,7 +85,6 @@ class Widget extends _common.Com {
116
85
  });
117
86
  this.focusInput();
118
87
  });
119
-
120
88
  this.userSent = {};
121
89
  this.setState({
122
90
  creating: false,
@@ -128,17 +96,14 @@ class Widget extends _common.Com {
128
96
  });
129
97
  this.props.store.onUpdate(this, _ => this.forceUpdate());
130
98
  }
131
-
132
99
  componentDidMount() {
133
100
  if (!this.props.store.isMobile()) this.focusInput();
134
101
  }
135
-
136
102
  componentDidUpdate(prevProp) {
137
103
  if (prevProp.isShow !== this.props.isShow) {
138
104
  if (this.props.isShow && !this.props.store.isMobile()) this.focusInput();
139
105
  if (this.props.isShow && this.props.store.isMobile()) this.blur();
140
106
  }
141
-
142
107
  if (prevProp.cid !== this.props.cid) {
143
108
  this.closeOrder();
144
109
  this.setState({
@@ -150,24 +115,19 @@ class Widget extends _common.Com {
150
115
  if (!this.props.store.isMobile()) this.focusInput();
151
116
  }, 100);
152
117
  }
153
-
154
118
  this.updateFormDataFields();
155
119
  }
156
-
157
120
  shouldShowForm() {
158
121
  let form;
159
122
  let accountSetting = this.props.plugin.chatbox || {};
160
123
  let acc = this.props.store.matchAccount() || {};
161
124
  if (_index.default.get(accountSetting, 'prechat_form.enabled')) form = accountSetting.prechat_form;
162
-
163
125
  let offlineEnabled = _index.default.get(accountSetting, 'offline_form.enabled');
164
-
165
126
  if (this.isOffline(acc, accountSetting) && offlineEnabled) form = accountSetting.offline_form;
166
127
  if (!this.hasSentMessage(this.props.cid) && form && (_index.default.size(form.groups) || form.group_required)) return true;
167
128
  let formRequired = this.isFormRequired();
168
129
  return formRequired && !this.props.cid || formRequired && this.props.cid && this.state.clickedJoin;
169
130
  }
170
-
171
131
  render() {
172
132
  let showform = this.shouldShowForm();
173
133
  let form;
@@ -175,26 +135,21 @@ class Widget extends _common.Com {
175
135
  let acc = this.props.store.matchAccount() || {};
176
136
  let submitLabel = this.props.t('prechat_form_btn');
177
137
  if (_index.default.get(accountSetting, 'prechat_form.enabled')) form = accountSetting.prechat_form;
178
-
179
138
  let offlineEnabled = _index.default.get(accountSetting, 'offline_form.enabled');
180
-
181
139
  if (this.isOffline(acc, accountSetting) && offlineEnabled) {
182
140
  form = accountSetting.offline_form;
183
141
  submitLabel = this.props.t('offline_form_btn');
184
142
  }
185
-
186
143
  if (this.props.view === 'offline_form') {
187
144
  showform = true;
188
145
  form = accountSetting.offline_form;
189
146
  submitLabel = this.props.t('offline_form_btn');
190
147
  }
191
-
192
148
  if (this.props.view === 'prechat_form') {
193
149
  showform = true;
194
150
  form = accountSetting.prechat_form;
195
151
  submitLabel = this.props.t('prechat_form_btn');
196
152
  }
197
-
198
153
  let $body = null;
199
154
  if (this.props.view === 'list') $body = this.renderConvoList();else if (showform) $body = this.renderForm(form, submitLabel);else $body = this.renderChat();
200
155
  let position = _index.default.get(accountSetting, 'desktop_button.position') || 'right';
@@ -215,35 +170,27 @@ class Widget extends _common.Com {
215
170
  })
216
171
  }), $body);
217
172
  }
218
-
219
173
  async submitPrechatForm(form) {
220
174
  var hasError = false;
221
-
222
175
  _index.default.map(this.state.formData, (field, key) => {
223
176
  if (field.is_required && (field.value === undefined || field.value === '' || _index.default.size(field.value) === 0 && Array.isArray(field.value))) {
224
177
  field.error = this.props.t('error_empty');
225
178
  hasError = true;
226
179
  } else field.error = '';
227
-
228
180
  if (key.substr(5) === 'emails' && !_index.default.isEmail(field.value) && field.is_required) {
229
181
  field.error = this.props.t('error_email_invalid');
230
182
  hasError = true;
231
183
  }
232
-
233
184
  if (key.substr(5) === 'phones' && !_index.default.isPhone(field.value) && field.is_required) {
234
185
  field.error = this.props.t('error_phone_invalid');
235
186
  hasError = true;
236
187
  }
237
188
  });
238
-
239
189
  if (hasError) return this.forceUpdate();
240
190
 
241
191
  let data = _index.default.cloneDeep(this.state.formData);
242
-
243
192
  let user = _index.default.cloneDeep(this.props.store.matchUser());
244
-
245
193
  let is_lead = false;
246
-
247
194
  _index.default.map(data, (field, key) => {
248
195
  if (!key.startsWith('attr:')) return;
249
196
  var attr = {
@@ -254,19 +201,14 @@ class Widget extends _common.Com {
254
201
  if (field.type === 'datetime') attr.datetime = new _index.default.Date(field.value).toISOString();
255
202
  if (field.type === 'list') attr.list = field.value;
256
203
  if (field.type === 'text' || field.type === 'boolean') attr[field.type] = field.value;
257
-
258
204
  _index.default.setUserAttr(user, attr);
259
205
  });
260
-
261
206
  if (is_lead) _index.default.setUserAttr(user, {
262
207
  key: 'lead_source',
263
208
  text: 'widget'
264
209
  });
265
-
266
210
  let firstmsg = _index.default.get(data, 'question.value');
267
-
268
211
  let groupid = _index.default.get(data, 'group.value', '');
269
-
270
212
  if (this.props.cid) {
271
213
  this.props.store.setUser(user);
272
214
  this.setState({
@@ -283,9 +225,11 @@ class Widget extends _common.Com {
283
225
  attachments: this.state.quickReplyMessage.attachments
284
226
  }
285
227
  });
228
+
286
229
  this.setState({
287
230
  quickReplyMessage: {}
288
231
  });
232
+
289
233
  if (form.end_conversation_after_submit) await this.props.store.endConvo(this.props.cid);
290
234
  return;
291
235
  }
@@ -311,7 +255,6 @@ class Widget extends _common.Com {
311
255
  error,
312
256
  convo
313
257
  } = await this.props.store.startConvo(req);
314
-
315
258
  if (error) {
316
259
  this.setState({
317
260
  creating: false,
@@ -319,7 +262,6 @@ class Widget extends _common.Com {
319
262
  });
320
263
  return;
321
264
  }
322
-
323
265
  let newconvoid = convo.id;
324
266
  this.userSent[newconvoid] = true;
325
267
  this.props.onGo({
@@ -336,7 +278,6 @@ class Widget extends _common.Com {
336
278
  });
337
279
  if (!this.props.store.isMobile()) this.focusInput();
338
280
  }
339
-
340
281
  formMounted(form) {
341
282
  let formData = this.fillForm(form);
342
283
  formData['question'] = {
@@ -351,36 +292,27 @@ class Widget extends _common.Com {
351
292
  });
352
293
  if (!this.props.store.isMobile()) this.focusInput();
353
294
  }
354
-
355
295
  onBooleanChange(key, e) {
356
296
  let formData = _index.default.cloneDeep(this.state.formData);
357
-
358
297
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
359
-
360
298
  if (!field) return;
361
299
  field.value = e.target.checked;
362
300
  this.setState({
363
301
  formData
364
302
  });
365
303
  }
366
-
367
304
  onInputChange(key, val) {
368
305
  let formData = _index.default.cloneDeep(this.state.formData);
369
-
370
306
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
371
-
372
307
  if (!field) return;
373
308
  field.value = val;
374
309
  this.setState({
375
310
  formData
376
311
  });
377
312
  }
378
-
379
313
  onListAddItem(key, val) {
380
314
  let formData = _index.default.cloneDeep(this.state.formData);
381
-
382
315
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
383
-
384
316
  if (!field) return;
385
317
  field.value = field.value || [];
386
318
  field.value.push(val);
@@ -388,12 +320,9 @@ class Widget extends _common.Com {
388
320
  formData
389
321
  });
390
322
  }
391
-
392
323
  onListRemoveItem(key, index) {
393
324
  let formData = _index.default.cloneDeep(this.state.formData);
394
-
395
325
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
396
-
397
326
  if (!field) return;
398
327
  field.value = field.value || [];
399
328
  field.value.splice(index, 1);
@@ -401,15 +330,12 @@ class Widget extends _common.Com {
401
330
  formData
402
331
  });
403
332
  }
404
-
405
333
  renderFields() {
406
334
  if (_index.default.size(this.state.formData) === 0) return null;
407
-
408
335
  let $fields = _index.default.map(this.state.formData, (field, key) => {
409
336
  if (this.state.quickReplyMessage.text && key === 'question') return null;
410
337
  let $field = null;
411
338
  var errclass = field.error ? 'input--error' : '';
412
-
413
339
  if (field.type === 'text') {
414
340
  if (key === 'question') {
415
341
  $field = (0, _preact.h)("textarea", {
@@ -475,11 +401,9 @@ class Widget extends _common.Com {
475
401
  }))));
476
402
  } else if (field.type === 'list') {
477
403
  let selected = this.state.formData[key].value || [];
478
-
479
404
  let items = _index.default.filter(_index.default.get(field, 'list', []), item => {
480
405
  return !_index.default.includes(selected, item);
481
406
  });
482
-
483
407
  $field = (0, _preact.h)(_ListField.default, {
484
408
  selected: selected,
485
409
  items: items,
@@ -494,9 +418,7 @@ class Widget extends _common.Com {
494
418
  type: "date"
495
419
  });
496
420
  }
497
-
498
421
  let label = '';
499
-
500
422
  if (field.key === 'fullname') {
501
423
  label = this.props.t('fullname');
502
424
  } else if (field.key === 'emails') {
@@ -506,7 +428,6 @@ class Widget extends _common.Com {
506
428
  } else if (field.key === 'question') {
507
429
  label = field.label || this.props.t('your_question');
508
430
  }
509
-
510
431
  if (field.label) label = field.label;
511
432
  return (0, _preact.h)("div", null, (0, _preact.h)("div", {
512
433
  class: "label"
@@ -516,12 +437,10 @@ class Widget extends _common.Com {
516
437
  class: "form-control--valid-input--error"
517
438
  }, field.error) : '', $field);
518
439
  });
519
-
520
440
  return (0, _preact.h)("div", {
521
441
  class: "pt-2"
522
442
  }, $fields);
523
443
  }
524
-
525
444
  renderForm(form, submitLabel) {
526
445
  let $loading = null;
527
446
  if (this.state.creating) $loading = (0, _preact.h)("span", {
@@ -554,29 +473,22 @@ class Widget extends _common.Com {
554
473
  onClick: _ => this.submitPrechatForm(form)
555
474
  }, submitLabel, " ", $loading)));
556
475
  }
557
-
558
476
  goToConvo(cid) {
559
477
  this.props.onGo({
560
478
  view: 'chat',
561
479
  cid
562
480
  });
563
481
  }
564
-
565
482
  renderConvoList() {
566
483
  let convoM = this.props.store.matchConvo('*');
567
-
568
484
  var convos = _index.default.map(convoM, convo => this.props.store.matchConvo(convo.id));
569
-
570
485
  convos = _index.default.filter(convos, convo => !!convo);
571
486
  convos = _index.default.orderBy(convos, 'created', 'desc');
572
-
573
487
  var $convos = _index.default.map(convos, convo => {
574
488
  let ags = _index.default.filter(convo.members, m => {
575
489
  return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active';
576
490
  });
577
-
578
491
  let agentids = _index.default.map(ags, m => m.id);
579
-
580
492
  agentids = agentids || _index.default.agentsOfConvo(convo)[0];
581
493
  return (0, _preact.h)("div", {
582
494
  class: "convo-list--item",
@@ -591,11 +503,9 @@ class Widget extends _common.Com {
591
503
  agent_ids: agentids
592
504
  }), this.renderConvoSummary(convo));
593
505
  });
594
-
595
506
  let $body = (0, _preact.h)("div", {
596
507
  class: "convo-list--list"
597
508
  }, $convos);
598
-
599
509
  if (_index.default.size(convos) === 0) {
600
510
  $body = (0, _preact.h)("div", {
601
511
  class: "convo-list--list"
@@ -608,7 +518,6 @@ class Widget extends _common.Com {
608
518
  class: "empty-desc"
609
519
  }, this.props.t('empty_convo'))));
610
520
  }
611
-
612
521
  return (0, _preact.h)("div", {
613
522
  class: "convo-list"
614
523
  }, (0, _preact.h)("div", {
@@ -629,7 +538,6 @@ class Widget extends _common.Com {
629
538
  store: this.props.store
630
539
  })));
631
540
  }
632
-
633
541
  blur() {
634
542
  if (this.props.store.isPreview) return;
635
543
  var $input = this.msgInput.current;
@@ -640,16 +548,13 @@ class Widget extends _common.Com {
640
548
 
641
549
  focusInput() {
642
550
  if (this.props.store.isPreview) return;
643
-
644
551
  if (this.shouldShowForm()) {
645
552
  let firstemptykey = '';
646
-
647
553
  _index.default.map(this.state.formData, (field, key) => {
648
554
  if (field.type !== 'text') return;
649
555
  if (firstemptykey) return;
650
556
  if (!field.value) firstemptykey = key;
651
557
  });
652
-
653
558
  setTimeout(() => {
654
559
  var $input = this['form_' + encode(firstemptykey)];
655
560
  if (!$input) return;
@@ -657,7 +562,6 @@ class Widget extends _common.Com {
657
562
  }, 300);
658
563
  return;
659
564
  }
660
-
661
565
  var $input = this.msgInput.current;
662
566
  if (!$input) return;
663
567
  setTimeout(() => $input.focus());
@@ -673,24 +577,19 @@ class Widget extends _common.Com {
673
577
  });
674
578
  this.focusInput();
675
579
  }
676
-
677
580
  fillQuickReplyToQuestion(message) {
678
581
  let formData = this.state.formData;
679
-
680
582
  if (formData) {
681
583
  _index.default.set(formData, 'question.value', message.text);
682
584
  }
683
-
684
585
  this.setState({
685
586
  formData,
686
587
  quickReplyMessage: message
687
588
  });
688
589
  }
689
-
690
590
  createPostback(postback) {
691
591
  this.props.store.createPostback(this.props.cid, postback);
692
592
  }
693
-
694
593
  renderChat() {
695
594
  let $input = (0, _preact.h)(_MessageInput.default, {
696
595
  store: this.props.store,
@@ -700,7 +599,6 @@ class Widget extends _common.Com {
700
599
  t: this.props.t
701
600
  });
702
601
  let convo = this.props.store.matchConvo(this.props.cid) || {};
703
-
704
602
  if (this.isFormRequired() || convo.state === 'ended') {
705
603
  $input = (0, _preact.h)("div", {
706
604
  class: "message-input message-input--preform"
@@ -709,7 +607,6 @@ class Widget extends _common.Com {
709
607
  onClick: e => this.onStartConvoClick(e)
710
608
  }, this.props.t('offline_preform_btn')));
711
609
  }
712
-
713
610
  return (0, _preact.h)("div", {
714
611
  class: "widget-body"
715
612
  }, (0, _preact.h)("div", {
@@ -749,7 +646,6 @@ class Widget extends _common.Com {
749
646
  t: this.props.t
750
647
  }), $input);
751
648
  }
752
-
753
649
  async onStartConvoClick() {
754
650
  var convo = this.props.store.matchConvo(this.props.cid) || {};
755
651
  if (convo.state === 'ended') return this.props.onGo({
@@ -761,73 +657,59 @@ class Widget extends _common.Com {
761
657
  quickReplyMessage: {}
762
658
  });
763
659
  }
764
-
765
660
  onEventFormSubmit() {
766
661
  this.focusInput();
767
662
  }
768
-
769
663
  onContainerClick() {
770
664
  var selection = window.getSelection();
771
665
  if (selection.toString().length > 0) return;
772
666
  if (!this.props.store.isMobile()) this.focusInput();
773
667
  }
774
-
775
668
  isFormRequired() {
669
+
776
670
  let form;
777
671
  let accountSetting = this.props.plugin.chatbox || {};
778
672
  let acc = this.props.store.matchAccount() || {};
779
673
  if (_index.default.get(accountSetting, 'prechat_form.enabled')) form = accountSetting.prechat_form;
780
674
 
781
675
  let offlineEnabled = _index.default.get(accountSetting, 'offline_form.enabled');
782
-
783
676
  if (this.isOffline(acc, accountSetting) && offlineEnabled) form = accountSetting.offline_form;
784
677
  if (!form) return false;
785
678
  let formData = this.fillForm(form);
679
+
786
680
  let convo = this.props.store.matchConvo(this.props.cid) || {};
787
681
  if (convo.state === 'ended') return true;
788
682
  if (convo.state && convo.state !== 'pending') delete formData.group;
789
683
  return !!_index.default.find(formData, field => field.is_required && (field.value == null || field.value === ''));
790
684
  }
791
-
792
685
  renderConvoSummary(convo) {
793
686
  let accountSetting = this.props.plugin.chatbox || {};
794
687
  let agentM = this.props.store.matchAgent('*');
795
-
796
688
  let ags = _index.default.filter(convo.members, m => {
797
689
  return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active';
798
690
  });
799
-
800
691
  let agentids = _index.default.map(ags, m => m.id);
801
-
802
692
  agentids = agentids || _index.default.agentsOfConvo(convo)[0];
803
-
804
693
  let agents = _index.default.map(agentids, id => agentM[id] || {
805
694
  avatar_url: defaultAvatar,
806
695
  fullname: 'Offline Agent'
807
696
  });
808
-
809
697
  var name = _index.default.each(agents, ag => ag.fullname).join(', ');
810
-
811
698
  if (accountSetting.hide_agent_profile || !name) name = this.props.store.matchAccount().name;
812
699
  if (!name) name = this.props.t('agent');
813
700
  var $you = null;
814
-
815
701
  if (convo.lastSenderType === 'user') {
816
702
  $you = (0, _preact.h)("span", {
817
703
  class: "yourmessage"
818
704
  }, this.props.t('you'), ":");
819
705
  }
820
-
821
706
  let seen = _index.default.isConvoSeen(convo, this.props.store.matchUser().id);
822
-
823
707
  var lastmsg = this.renderMessagePreview(convo.last_message_sent || {
824
708
  data: {
825
709
  message: _index.default.get(convo, 'last_message')
826
710
  }
827
711
  });
828
-
829
712
  var time = _index.default.getMs(_index.default.get(convo, 'last_message_sent.created')) || _index.default.getMs(_index.default.get(convo, 'last_sent.created')) || _index.default.getMs(convo.created);
830
-
831
713
  var $tim = (0, _preact.h)(_time.default, {
832
714
  ago: true,
833
715
  time: time,
@@ -837,7 +719,6 @@ class Widget extends _common.Com {
837
719
  let $unread = seen ? null : (0, _preact.h)("div", {
838
720
  class: "convo-list--item-unread"
839
721
  });
840
-
841
722
  if (convo.state === 'ended') {
842
723
  $unread = (0, _preact.h)("img", {
843
724
  alt: "conversation ended",
@@ -846,7 +727,6 @@ class Widget extends _common.Com {
846
727
  title: this.props.t('conversation_ended')
847
728
  });
848
729
  }
849
-
850
730
  return (0, _preact.h)("div", {
851
731
  class: "convo-list--convo-last-info"
852
732
  }, (0, _preact.h)("div", {
@@ -861,31 +741,23 @@ class Widget extends _common.Com {
861
741
  class: "convo-list--convo-last-message"
862
742
  }, $you, lastmsg), $unread));
863
743
  }
864
-
865
744
  agentsOfConvo(convo) {
866
745
  let agentM = this.props.store.matchAgent('*');
867
-
868
746
  var agentids = _index.default.agentsOfConvo(convo, true);
869
-
870
747
  return _index.default.map(agentids, id => agentM[id] || {
871
748
  avatar_url: defaultAvatar,
872
749
  fullname: 'Offline Agent'
873
750
  });
874
751
  }
875
-
876
752
  renderMessagePreview(ev) {
877
753
  let defmsg = this.props.t('sent_you_a_message');
878
-
879
754
  let message = _index.default.get(ev, 'data.message.text');
880
-
881
755
  var format = _index.default.get(ev, 'data.message.format');
882
756
 
883
757
  if (format !== 'plaintext') message = defmsg;
884
758
  if (!message && _index.default.size(_index.default.get(ev, 'data.message.attachments')) > 0) message = defmsg;
885
759
  if (!message) return null;
886
-
887
760
  let byType = _index.default.get(ev, 'by.type');
888
-
889
761
  return (0, _preact.h)("div", {
890
762
  class: "convo-list--convo-last-mes"
891
763
  }, _index.default.map(_index.default.extractText(message), tag => {
@@ -896,31 +768,23 @@ class Widget extends _common.Com {
896
768
  return tag.text;
897
769
  }));
898
770
  }
899
-
900
771
  userHasSent(cid) {
901
772
  var convo = this.props.store.matchConvo(cid) || {};
902
773
  let user = this.props.store.matchUser();
903
774
  if (this.userSent[cid]) return true;
904
-
905
775
  let joined = _index.default.find(convo.members, mem => mem.id === user.id && (mem.membership === 'active' || mem.last_sent > 0));
906
-
907
776
  return joined;
908
777
  }
909
-
910
778
  hasSentMessage(cid) {
911
779
  let convo = this.props.store.matchConvo(cid) || {};
912
-
913
780
  let joined = _index.default.find(convo.members, mem => {
914
781
  if (mem.type === 'bot') return true;
915
782
  return mem.last_sent;
916
783
  });
917
-
918
784
  return joined;
919
785
  }
920
-
921
786
  isOffline(acc, accSetting) {
922
787
  let enableWhen = _index.default.get(accSetting, 'offline_form.enable_when');
923
-
924
788
  let isonline = true;
925
789
  if (enableWhen === 'all_agents_offline') isonline = acc.is_online;
926
790
  if (enableWhen === 'out_of_bussiness_hour') isonline = acc.is_in_business_hour;
@@ -932,35 +796,27 @@ class Widget extends _common.Com {
932
796
  let accountSetting = this.props.plugin.chatbox || {};
933
797
  let acc = this.props.store.matchAccount() || {};
934
798
  if (_index.default.get(accountSetting, 'prechat_form.enabled')) form = accountSetting.prechat_form;
935
-
936
799
  let offlineEnabled = _index.default.get(accountSetting, 'offline_form.enabled');
937
-
938
800
  if (this.isOffline(acc, accountSetting) && offlineEnabled) {
939
801
  form = accountSetting.offline_form;
940
802
  }
941
-
942
803
  if (this.props.view === 'offline_form') {
943
804
  form = accountSetting.offline_form;
944
805
  }
945
-
946
806
  if (this.props.view === 'prechat_form') {
947
807
  form = accountSetting.prechat_form;
948
808
  }
949
-
950
809
  if (_index.default.size(form) === 0) return [];
951
810
  var data = {};
952
-
953
811
  _index.default.each(form.fields, f => {
954
812
  var newf = Object.assign({}, f);
955
813
 
956
814
  if (f.type === 'list') {
957
815
  newf.list = f.list;
958
816
  }
959
-
960
817
  newf.label = this.props.t.i18n(_index.default.get(f, `i18n_label`, {})) || f.label;
961
818
  data['attr:' + f.key] = newf;
962
819
  });
963
-
964
820
  if (form.group_required && _index.default.size(form.groups) > 0) {
965
821
  data['group'] = {
966
822
  key: 'group',
@@ -980,53 +836,42 @@ class Widget extends _common.Com {
980
836
  label: this.props.t.i18n(_index.default.get(form, `i18n_question_label`, {})) || form.question_label,
981
837
  type: 'text'
982
838
  };
983
-
984
839
  if (this.isFormChanged(this.state.formData, data)) {
985
840
  this.setState({
986
841
  formData: data
987
842
  });
988
843
  }
989
844
  }
990
-
991
845
  isFormChanged(oldForm, newForm) {
992
846
  let oldKeys = Object.keys(oldForm);
993
847
  let newKeys = Object.keys(newForm);
994
848
  if (oldKeys.length !== newKeys.length) return true;
995
-
996
849
  for (let i = 0; i < oldKeys.length; i++) {
997
850
  if (_index.default.get(oldForm, `${oldKeys[i]}.label`) !== _index.default.get(newForm, `${newKeys[i]}.label`)) return true;
998
851
  if (_index.default.get(oldForm, `${oldKeys[i]}.is_required`) !== _index.default.get(newForm, `${newKeys[i]}.is_required`)) return true;
999
-
1000
852
  if (_index.default.stringify(_index.default.get(oldForm, `${oldKeys[i]}.list`)) !== _index.default.stringify(_index.default.get(newForm, `${newKeys[i]}.list`))) {
1001
853
  return true;
1002
854
  }
1003
855
  }
1004
-
1005
856
  return false;
1006
857
  }
1007
-
1008
858
  fillForm(form) {
1009
859
  if (_index.default.size(form) === 0) return [];
1010
860
  var data = {};
1011
861
  let user = this.props.store.matchUser();
1012
-
1013
862
  _index.default.each(form.fields, f => {
1014
863
  var newf = Object.assign({}, f);
1015
864
  newf.value = _index.default.getUserAttr(user, f.key, f.type);
1016
865
  if (f.type === 'boolean' && !newf.value) newf.value = false;
1017
-
1018
866
  if (f.type === 'datetime' && newf.value) {
1019
867
  newf.value = new _index.default.Date(data.value).toLocaleDateString('en-CA');
1020
868
  }
1021
-
1022
869
  if (f.type === 'list') {
1023
870
  newf.list = f.list;
1024
871
  }
1025
-
1026
872
  newf.label = this.props.t.i18n(_index.default.get(f, `i18n_label`, {})) || f.label;
1027
873
  data['attr:' + f.key] = newf;
1028
874
  });
1029
-
1030
875
  if (form.group_required && _index.default.size(form.groups) > 0) {
1031
876
  data['group'] = {
1032
877
  key: 'group',
@@ -1039,21 +884,15 @@ class Widget extends _common.Com {
1039
884
  }))
1040
885
  };
1041
886
  }
1042
-
1043
887
  return data;
1044
888
  }
1045
-
1046
889
  }
1047
-
1048
890
  exports.default = Widget;
1049
-
1050
891
  class FormMounter extends _common.Com {
1051
892
  componentDidMount() {
1052
893
  this.props.onMount(this.props.form);
1053
894
  }
1054
-
1055
895
  }
1056
-
1057
896
  function encode(key) {
1058
897
  return encodeURIComponent(key);
1059
898
  }