@subiz/widget-v4 4.1.26 → 4.1.28

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 (39) hide show
  1. package/compiled_src/chatbox/Header.js +12 -7
  2. package/compiled_src/chatbox/Widget.js +12 -0
  3. package/compiled_src/chatbox/main.js +24 -2
  4. package/compiled_src/util/campaign.js +17 -8
  5. package/dist/132.js +52 -11
  6. package/dist/18754d60df1.132.js +1 -0
  7. package/dist/18754d60df1.441.js +1 -0
  8. package/dist/18754d60df1.app.js +1 -0
  9. package/dist/{186bfd5b9ef.index.html → 18754d60df1.index.html} +9 -2
  10. package/dist/{186bfd5b9ef.library.html → 18754d60df1.library.html} +9 -2
  11. package/dist/18754d60df1.library.js +1 -0
  12. package/dist/{186bfd5b9ef.preview.html → 18754d60df1.preview.html} +1 -1
  13. package/dist/18754d60df1.preview.js +1 -0
  14. package/dist/18754d60df1.screenshoot.js +1 -0
  15. package/dist/18754d60df1.webview.js +1 -0
  16. package/dist/441.js +216 -152
  17. package/dist/HASH +1 -1
  18. package/dist/screenshoot.html +1 -1
  19. package/dist/screenshoot.js +43 -15
  20. package/index.html +8 -0
  21. package/package.json +10 -10
  22. package/src/chatbox/Header.js +12 -9
  23. package/src/chatbox/Widget.js +14 -0
  24. package/src/chatbox/main.js +24 -1
  25. package/src/util/campaign.js +29 -8
  26. package/dist/186bfd5b9ef.132.js +0 -1
  27. package/dist/186bfd5b9ef.441.js +0 -1
  28. package/dist/186bfd5b9ef.app.js +0 -1
  29. package/dist/186bfd5b9ef.library.js +0 -1
  30. package/dist/186bfd5b9ef.preview.js +0 -1
  31. package/dist/186bfd5b9ef.screenshoot.js +0 -1
  32. package/dist/186bfd5b9ef.webview.js +0 -1
  33. /package/dist/{186bfd5b9ef.178.js → 18754d60df1.178.js} +0 -0
  34. /package/dist/{186bfd5b9ef.213.js → 18754d60df1.213.js} +0 -0
  35. /package/dist/{186bfd5b9ef.335.js → 18754d60df1.335.js} +0 -0
  36. /package/dist/{186bfd5b9ef.362.js → 18754d60df1.362.js} +0 -0
  37. /package/dist/{186bfd5b9ef.605.js → 18754d60df1.605.js} +0 -0
  38. /package/dist/{186bfd5b9ef.678.js → 18754d60df1.678.js} +0 -0
  39. /package/dist/{186bfd5b9ef.782.js → 18754d60df1.782.js} +0 -0
@@ -19,21 +19,22 @@ class Header extends _common.Com {
19
19
  let cls = 'widget-header';
20
20
  let renderSocial = false;
21
21
  let renderTeam = false;
22
- let renderCollapsed = this.props.view !== 'list' && headerMode === 'collapsed';
23
22
  let accSetting = this.props.plugin.chatbox || {};
24
23
  let layout = _index.default.get(accSetting, 'header.layout');
25
- if (renderCollapsed) {
24
+ let renderCollapsed = this.props.view !== 'list' && headerMode === 'collapsed';
25
+ let renderClassic = !renderCollapsed && layout === 'classic';
26
+ if (renderCollapsed || layout == 'classic') {
26
27
  cls += ' widget-header--collapsed';
27
28
  } else {
28
29
  cls += ' widget-header--convo-expanded';
29
30
  renderSocial = layout === 'social';
30
- renderTeam = !renderSocial;
31
+ renderTeam = !(renderSocial || renderClassic);
31
32
  }
32
33
  return (0, _preact.h)("div", {
33
34
  class: cls
34
- }, this.renderCollapsedHeader(renderCollapsed), this.renderSocial(renderSocial), this.renderTeam(renderTeam));
35
+ }, this.renderCollapsedHeader(renderCollapsed || renderClassic, renderClassic), this.renderSocial(renderSocial), this.renderTeam(renderTeam));
35
36
  }
36
- renderCollapsedHeader(show) {
37
+ renderCollapsedHeader(show, classic) {
37
38
  let accSetting = this.props.plugin.chatbox || {};
38
39
  let acc = this.props.store.matchAccount() || {};
39
40
  let state = acc.is_online ? this.props.t('agent_online') : this.props.t('agent_offline');
@@ -42,9 +43,13 @@ class Header extends _common.Com {
42
43
  let agentIdsJoined = _index.default.map(this.getAgentJoined(this.props.cid), agent => agent.id);
43
44
  let cls = 'widget-header--inner widget-header--inner--collapsed';
44
45
  if (!show) cls += ' widget-header--inner--hidden';
46
+ let $back = null;
47
+ let style = '';
48
+ if (!classic) $back = this.renderBackButton();else style = 'padding-bottom: 75px !important;';
45
49
  return (0, _preact.h)("div", {
46
- class: cls
47
- }, this.renderBackButton(), (0, _preact.h)(_AgentsAvatar.default, {
50
+ class: cls,
51
+ style: style
52
+ }, $back, (0, _preact.h)(_AgentsAvatar.default, {
48
53
  plugin: this.props.plugin,
49
54
  store: this.props.store,
50
55
  mode: "secondary",
@@ -86,6 +86,7 @@ class Widget extends _common.Com {
86
86
  this.focusInput();
87
87
  });
88
88
  this.userSent = {};
89
+ this.wasFormInputed = false;
89
90
  this.setState({
90
91
  creating: false,
91
92
  clickedJoin: false,
@@ -289,6 +290,7 @@ class Widget extends _common.Com {
289
290
  if (!this.props.store.isMobile()) this.focusInput();
290
291
  }
291
292
  onBooleanChange(key, e) {
293
+ this.wasFormInputed = true;
292
294
  let formData = _index.default.cloneDeep(this.state.formData);
293
295
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
294
296
  if (!field) return;
@@ -298,6 +300,7 @@ class Widget extends _common.Com {
298
300
  });
299
301
  }
300
302
  onInputChange(key, val) {
303
+ this.wasFormInputed = true;
301
304
  let formData = _index.default.cloneDeep(this.state.formData);
302
305
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
303
306
  if (!field) return;
@@ -307,6 +310,7 @@ class Widget extends _common.Com {
307
310
  });
308
311
  }
309
312
  onListAddItem(key, val) {
313
+ this.wasFormInputed = true;
310
314
  let formData = _index.default.cloneDeep(this.state.formData);
311
315
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
312
316
  if (!field) return;
@@ -317,6 +321,7 @@ class Widget extends _common.Com {
317
321
  });
318
322
  }
319
323
  onListRemoveItem(key, index) {
324
+ this.wasFormInputed = true;
320
325
  let formData = _index.default.cloneDeep(this.state.formData);
321
326
  let field = _index.default.find(formData, (_, fkkey) => fkkey === key);
322
327
  if (!field) return;
@@ -348,6 +353,7 @@ class Widget extends _common.Com {
348
353
  }));
349
354
  }
350
355
  toggleCheckboxField(key, v) {
356
+ this.wasFormInputed = true;
351
357
  let formData = _index.default.cloneDeep(this.state.formData);
352
358
  let field = _index.default.find(formData, (f, fkkey) => f.key === key);
353
359
  if (!field) return;
@@ -385,6 +391,7 @@ class Widget extends _common.Com {
385
391
  }));
386
392
  }
387
393
  toggleRadioField(key, v) {
394
+ this.wasFormInputed = true;
388
395
  let formData = _index.default.cloneDeep(this.state.formData);
389
396
  let field = _index.default.find(formData, (f, fkkey) => f.key === key);
390
397
  if (!field) return;
@@ -394,6 +401,7 @@ class Widget extends _common.Com {
394
401
  });
395
402
  }
396
403
  selectDropdownField(key, v) {
404
+ this.wasFormInputed = true;
397
405
  let formData = _index.default.cloneDeep(this.state.formData);
398
406
  let field = _index.default.find(formData, (f, fkkey) => f.key === key);
399
407
  if (!field) return;
@@ -690,11 +698,15 @@ class Widget extends _common.Com {
690
698
  createPostback(postback) {
691
699
  this.props.store.createPostback(this.props.cid, postback);
692
700
  }
701
+ onChangeMessageInput() {
702
+ this.wasFormInputed = true;
703
+ }
693
704
  renderChat() {
694
705
  let $input = (0, _preact.h)(_MessageInput.default, {
695
706
  store: this.props.store,
696
707
  ref: this.msgInput,
697
708
  cid: this.props.cid,
709
+ onChange: this.onChangeMessageInput,
698
710
  onSend: this.sendMessage,
699
711
  t: this.props.t
700
712
  });
@@ -17,6 +17,7 @@ class Main extends _common.Com {
17
17
  constructor(props) {
18
18
  super(props);
19
19
  this.refButton = (0, _preact.createRef)();
20
+ this.refWidget = (0, _preact.createRef)();
20
21
  }
21
22
  async refreshCSS() {
22
23
  let plugins = this.props.store.matchPlugin();
@@ -45,7 +46,7 @@ class Main extends _common.Com {
45
46
  });
46
47
  this.checkExpand();
47
48
  this.props.store.onResetCSS(this, () => this.refreshCSS());
48
- this.props.store.onConvoEvent(this, _ => this.checkExpand());
49
+ this.props.store.onConvoEvent(this, ev => this.onConvoEvent(ev));
49
50
  this.props.store.onUpdate(this, _ => this.checkExpand());
50
51
  await this.refreshCSS();
51
52
  this.setState({
@@ -83,9 +84,30 @@ class Main extends _common.Com {
83
84
  isShow: this.state.isShowWidget,
84
85
  onClose: a => this.onWidgetClose(a),
85
86
  onGo: a => this.showWidget(a),
86
- t: this.props.t
87
+ t: this.props.t,
88
+ ref: this.refWidget
87
89
  }));
88
90
  }
91
+ onConvoEvent(ev) {
92
+ this.checkExpand();
93
+ this.checkShowBotConvo(ev);
94
+ }
95
+ checkShowBotConvo(ev) {
96
+ let $widget = this.refWidget.current;
97
+ if (!$widget) return;
98
+ if ($widget.wasFormInputed) return;
99
+ if (ev.type !== 'message_sent') return;
100
+ if (!this.state.isShowWidget) return;
101
+ let byType = _index.default.get(ev, 'by.type');
102
+ let byid = _index.default.get(ev, 'by.id') || '';
103
+ if (!byid.startsWith('bb') || byType !== 'agent') return;
104
+ let cid = _index.default.get(ev, 'data.message.conversation_id');
105
+ if (!cid) return;
106
+ this.showWidget({
107
+ cid,
108
+ view: 'chat'
109
+ });
110
+ }
89
111
  checkExpand() {
90
112
  if (this.props.store.isMobile()) return;
91
113
  if (this.props.plugin._no_auto_expand) return;
@@ -34,14 +34,7 @@ function trackAreaClicked(selector, cb) {
34
34
  common.map(selector.split('\n'), selector => {
35
35
  selector = common.trim(selector);
36
36
  if (!selector) return;
37
- let doms = [];
38
- try {
39
- doms = document.querySelectorAll(selector);
40
- } catch (e) {}
41
- common.map(doms, dom => {
42
- if (!dom) return;
43
- dom.addEventListener('click', cb, false);
44
- });
37
+ on('click', selector, cb);
45
38
  });
46
39
  }
47
40
  function trackInactivity(seconds = 0, cb) {
@@ -78,4 +71,20 @@ function trackTimeOnPage(seconds = 0, cb) {
78
71
  if (cb) cb(timeOnPage);
79
72
  common.clearInterval(timer);
80
73
  }, 1000);
74
+ }
75
+ function on(eventName, selector, fn) {
76
+ document.addEventListener(eventName, function (event) {
77
+ let possibleTargets = document.querySelectorAll(selector);
78
+ let target = event.target;
79
+ for (let i = 0, l = possibleTargets.length; i < l; i++) {
80
+ let el = target;
81
+ let p = possibleTargets[i];
82
+ while (el && el !== document) {
83
+ if (el === p) {
84
+ return fn.call(p, event);
85
+ }
86
+ el = el.parentNode;
87
+ }
88
+ }
89
+ });
81
90
  }
package/dist/132.js CHANGED
@@ -576,21 +576,22 @@ class Header extends common/* Com */.up {
576
576
  let cls = 'widget-header';
577
577
  let renderSocial = false;
578
578
  let renderTeam = false;
579
- let renderCollapsed = this.props.view !== 'list' && headerMode === 'collapsed';
580
579
  let accSetting = this.props.plugin.chatbox || {};
581
580
  let layout = util/* default.get */.Z.get(accSetting, 'header.layout');
582
- if (renderCollapsed) {
581
+ let renderCollapsed = this.props.view !== 'list' && headerMode === 'collapsed';
582
+ let renderClassic = !renderCollapsed && layout === 'classic';
583
+ if (renderCollapsed || layout == 'classic') {
583
584
  cls += ' widget-header--collapsed';
584
585
  } else {
585
586
  cls += ' widget-header--convo-expanded';
586
587
  renderSocial = layout === 'social';
587
- renderTeam = !renderSocial;
588
+ renderTeam = !(renderSocial || renderClassic);
588
589
  }
589
590
  return (0,preact_module.h)("div", {
590
591
  class: cls
591
- }, this.renderCollapsedHeader(renderCollapsed), this.renderSocial(renderSocial), this.renderTeam(renderTeam));
592
+ }, this.renderCollapsedHeader(renderCollapsed || renderClassic, renderClassic), this.renderSocial(renderSocial), this.renderTeam(renderTeam));
592
593
  }
593
- renderCollapsedHeader(show) {
594
+ renderCollapsedHeader(show, classic) {
594
595
  let accSetting = this.props.plugin.chatbox || {};
595
596
  let acc = this.props.store.matchAccount() || {};
596
597
  let state = acc.is_online ? this.props.t('agent_online') : this.props.t('agent_offline');
@@ -599,9 +600,13 @@ class Header extends common/* Com */.up {
599
600
  let agentIdsJoined = util/* default.map */.Z.map(this.getAgentJoined(this.props.cid), agent => agent.id);
600
601
  let cls = 'widget-header--inner widget-header--inner--collapsed';
601
602
  if (!show) cls += ' widget-header--inner--hidden';
603
+ let $back = null;
604
+ let style = '';
605
+ if (!classic) $back = this.renderBackButton();else style = 'padding-bottom: 75px !important;';
602
606
  return (0,preact_module.h)("div", {
603
- class: cls
604
- }, this.renderBackButton(), (0,preact_module.h)(AgentsAvatar, {
607
+ class: cls,
608
+ style: style
609
+ }, $back, (0,preact_module.h)(AgentsAvatar, {
605
610
  plugin: this.props.plugin,
606
611
  store: this.props.store,
607
612
  mode: "secondary",
@@ -2793,13 +2798,15 @@ class Event extends common/* Com */.up {
2793
2798
  });
2794
2799
  let $error = null;
2795
2800
  if (ev._error && ev.type === 'message_sent') {
2801
+ let msg = this.props.t('error_send_message');
2802
+ if (ev._error_message) msg = this.props.t(ev._error_message);
2796
2803
  $error = (0,preact_module.h)("a", {
2797
2804
  class: "message_error",
2798
2805
  src: "javascript:;",
2799
2806
  onClick: e => this.resendMessage()
2800
2807
  }, (0,preact_module.h)("div", {
2801
2808
  class: "message_error__text"
2802
- }, this.props.t('error_send_message')), (0,preact_module.h)("div", {
2809
+ }, msg), (0,preact_module.h)("div", {
2803
2810
  class: "message_error__icon"
2804
2811
  }));
2805
2812
  }
@@ -5336,6 +5343,7 @@ class Widget extends common/* Com */.up {
5336
5343
  this.focusInput();
5337
5344
  });
5338
5345
  this.userSent = {};
5346
+ this.wasFormInputed = false;
5339
5347
  this.setState({
5340
5348
  creating: false,
5341
5349
  clickedJoin: false,
@@ -5539,6 +5547,7 @@ class Widget extends common/* Com */.up {
5539
5547
  if (!this.props.store.isMobile()) this.focusInput();
5540
5548
  }
5541
5549
  onBooleanChange(key, e) {
5550
+ this.wasFormInputed = true;
5542
5551
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5543
5552
  let field = util/* default.find */.Z.find(formData, (_, fkkey) => fkkey === key);
5544
5553
  if (!field) return;
@@ -5548,6 +5557,7 @@ class Widget extends common/* Com */.up {
5548
5557
  });
5549
5558
  }
5550
5559
  onInputChange(key, val) {
5560
+ this.wasFormInputed = true;
5551
5561
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5552
5562
  let field = util/* default.find */.Z.find(formData, (_, fkkey) => fkkey === key);
5553
5563
  if (!field) return;
@@ -5557,6 +5567,7 @@ class Widget extends common/* Com */.up {
5557
5567
  });
5558
5568
  }
5559
5569
  onListAddItem(key, val) {
5570
+ this.wasFormInputed = true;
5560
5571
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5561
5572
  let field = util/* default.find */.Z.find(formData, (_, fkkey) => fkkey === key);
5562
5573
  if (!field) return;
@@ -5567,6 +5578,7 @@ class Widget extends common/* Com */.up {
5567
5578
  });
5568
5579
  }
5569
5580
  onListRemoveItem(key, index) {
5581
+ this.wasFormInputed = true;
5570
5582
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5571
5583
  let field = util/* default.find */.Z.find(formData, (_, fkkey) => fkkey === key);
5572
5584
  if (!field) return;
@@ -5598,6 +5610,7 @@ class Widget extends common/* Com */.up {
5598
5610
  }));
5599
5611
  }
5600
5612
  toggleCheckboxField(key, v) {
5613
+ this.wasFormInputed = true;
5601
5614
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5602
5615
  let field = util/* default.find */.Z.find(formData, (f, fkkey) => f.key === key);
5603
5616
  if (!field) return;
@@ -5635,6 +5648,7 @@ class Widget extends common/* Com */.up {
5635
5648
  }));
5636
5649
  }
5637
5650
  toggleRadioField(key, v) {
5651
+ this.wasFormInputed = true;
5638
5652
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5639
5653
  let field = util/* default.find */.Z.find(formData, (f, fkkey) => f.key === key);
5640
5654
  if (!field) return;
@@ -5644,6 +5658,7 @@ class Widget extends common/* Com */.up {
5644
5658
  });
5645
5659
  }
5646
5660
  selectDropdownField(key, v) {
5661
+ this.wasFormInputed = true;
5647
5662
  let formData = util/* default.cloneDeep */.Z.cloneDeep(this.state.formData);
5648
5663
  let field = util/* default.find */.Z.find(formData, (f, fkkey) => f.key === key);
5649
5664
  if (!field) return;
@@ -5835,7 +5850,7 @@ class Widget extends common/* Com */.up {
5835
5850
  let convoM = this.props.store.matchConvo('*');
5836
5851
  var convos = util/* default.map */.Z.map(convoM, convo => this.props.store.matchConvo(convo.id));
5837
5852
  convos = util/* default.filter */.Z.filter(convos, convo => !!convo);
5838
- convos = util/* default.orderBy */.Z.orderBy(convos, 'actived', 'desc');
5853
+ convos = util/* default.orderByF */.Z.orderByF(convos, convo => util/* default.get */.Z.get(convo, 'last_message_sent.created', convo.actived), 'desc');
5839
5854
  var $convos = util/* default.map */.Z.map(convos, convo => {
5840
5855
  let ags = util/* default.filter */.Z.filter(convo.members, m => {
5841
5856
  return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active';
@@ -5940,11 +5955,15 @@ class Widget extends common/* Com */.up {
5940
5955
  createPostback(postback) {
5941
5956
  this.props.store.createPostback(this.props.cid, postback);
5942
5957
  }
5958
+ onChangeMessageInput() {
5959
+ this.wasFormInputed = true;
5960
+ }
5943
5961
  renderChat() {
5944
5962
  let $input = (0,preact_module.h)(MessageInput, {
5945
5963
  store: this.props.store,
5946
5964
  ref: this.msgInput,
5947
5965
  cid: this.props.cid,
5966
+ onChange: this.onChangeMessageInput,
5948
5967
  onSend: this.sendMessage,
5949
5968
  t: this.props.t
5950
5969
  });
@@ -6247,6 +6266,7 @@ class Main extends common/* Com */.up {
6247
6266
  constructor(props) {
6248
6267
  super(props);
6249
6268
  this.refButton = (0,preact_module/* createRef */.Vf)();
6269
+ this.refWidget = (0,preact_module/* createRef */.Vf)();
6250
6270
  }
6251
6271
  async refreshCSS() {
6252
6272
  let plugins = this.props.store.matchPlugin();
@@ -6275,7 +6295,7 @@ class Main extends common/* Com */.up {
6275
6295
  });
6276
6296
  this.checkExpand();
6277
6297
  this.props.store.onResetCSS(this, () => this.refreshCSS());
6278
- this.props.store.onConvoEvent(this, _ => this.checkExpand());
6298
+ this.props.store.onConvoEvent(this, ev => this.onConvoEvent(ev));
6279
6299
  this.props.store.onUpdate(this, _ => this.checkExpand());
6280
6300
  await this.refreshCSS();
6281
6301
  this.setState({
@@ -6313,9 +6333,30 @@ class Main extends common/* Com */.up {
6313
6333
  isShow: this.state.isShowWidget,
6314
6334
  onClose: a => this.onWidgetClose(a),
6315
6335
  onGo: a => this.showWidget(a),
6316
- t: this.props.t
6336
+ t: this.props.t,
6337
+ ref: this.refWidget
6317
6338
  }));
6318
6339
  }
6340
+ onConvoEvent(ev) {
6341
+ this.checkExpand();
6342
+ this.checkShowBotConvo(ev);
6343
+ }
6344
+ checkShowBotConvo(ev) {
6345
+ let $widget = this.refWidget.current;
6346
+ if (!$widget) return;
6347
+ if ($widget.wasFormInputed) return;
6348
+ if (ev.type !== 'message_sent') return;
6349
+ if (!this.state.isShowWidget) return;
6350
+ let byType = util/* default.get */.Z.get(ev, 'by.type');
6351
+ let byid = util/* default.get */.Z.get(ev, 'by.id') || '';
6352
+ if (!byid.startsWith('bb') || byType !== 'agent') return;
6353
+ let cid = util/* default.get */.Z.get(ev, 'data.message.conversation_id');
6354
+ if (!cid) return;
6355
+ this.showWidget({
6356
+ cid,
6357
+ view: 'chat'
6358
+ });
6359
+ }
6319
6360
  checkExpand() {
6320
6361
  if (this.props.store.isMobile()) return;
6321
6362
  if (this.props.plugin._no_auto_expand) return;