@subiz/widget-v4 4.1.178 → 4.1.184

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 (111) hide show
  1. package/assets/less/base.less +28 -0
  2. package/assets/less/chatbox.less +4 -0
  3. package/assets/less/message.less +0 -8
  4. package/assets/less/widget.less +197 -2
  5. package/assets/less/widget_header.less +2 -1
  6. package/chat.js +0 -1
  7. package/compiled_src/chatbox/ChatButton.js +183 -82
  8. package/compiled_src/chatbox/Widget.js +2 -1
  9. package/compiled_src/chatbox/main.js +44 -53
  10. package/compiled_src/store/store.js +40 -17
  11. package/package.json +5 -5
  12. package/src/chatbox/ChatButton.js +197 -77
  13. package/src/chatbox/Widget.js +4 -2
  14. package/src/chatbox/main.js +30 -52
  15. package/src/store/store.js +56 -18
  16. package/dist/127.js +0 -273
  17. package/dist/132.js +0 -2802
  18. package/dist/185.js +0 -1827
  19. package/dist/1991cfb4656.127.js +0 -1
  20. package/dist/1991cfb4656.132.js +0 -1
  21. package/dist/1991cfb4656.185.js +0 -1
  22. package/dist/1991cfb4656.27.js +0 -1
  23. package/dist/1991cfb4656.278.js +0 -1
  24. package/dist/1991cfb4656.339.js +0 -1
  25. package/dist/1991cfb4656.459.js +0 -1
  26. package/dist/1991cfb4656.490.js +0 -1
  27. package/dist/1991cfb4656.74.js +0 -1
  28. package/dist/1991cfb4656.997.js +0 -1
  29. package/dist/1991cfb4656.app.js +0 -1
  30. package/dist/1991cfb4656.chat.html +0 -1
  31. package/dist/1991cfb4656.chat.js +0 -1
  32. package/dist/1991cfb4656.form.html +0 -1
  33. package/dist/1991cfb4656.form.js +0 -1
  34. package/dist/1991cfb4656.index.html +0 -72
  35. package/dist/1991cfb4656.library.html +0 -72
  36. package/dist/1991cfb4656.library.js +0 -1
  37. package/dist/1991cfb4656.preview.html +0 -759
  38. package/dist/1991cfb4656.preview.js +0 -1
  39. package/dist/1991cfb4656.webview.js +0 -1
  40. package/dist/27.js +0 -107
  41. package/dist/278.js +0 -417
  42. package/dist/459.js +0 -107
  43. package/dist/490.js +0 -305
  44. package/dist/74.js +0 -372
  45. package/dist/997.js +0 -107
  46. package/dist/HASH +0 -1
  47. package/dist/assets/img/Facebook.64607ec.png +0 -0
  48. package/dist/assets/img/Zalo.6845707.png +0 -0
  49. package/dist/assets/img/award1a.1a58e10.png +0 -0
  50. package/dist/assets/img/award3a.3b74423.png +0 -0
  51. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  52. package/dist/assets/img/award5.39eb7ae.png +0 -0
  53. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  54. package/dist/assets/img/caret.998eb8f.svg +0 -1
  55. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  56. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  57. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  58. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  59. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  60. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  61. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  62. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  63. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  64. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  65. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  66. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  67. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  68. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  69. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  70. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  71. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  72. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  73. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  74. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  75. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  76. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  77. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  78. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  79. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  80. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  81. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  82. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  83. package/dist/assets/img/empty.29bed2d.svg +0 -23
  84. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  85. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  86. package/dist/assets/img/external-link.90577cc.svg +0 -1
  87. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  88. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  89. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  90. package/dist/assets/img/image_default.be0698b.png +0 -0
  91. package/dist/assets/img/info.ebce7ea.svg +0 -1
  92. package/dist/assets/img/loader.37000a7.svg +0 -1
  93. package/dist/assets/img/loading_static.a27f0ac.svg +0 -10
  94. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  95. package/dist/assets/img/main-service2.9b99549.png +0 -0
  96. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  97. package/dist/assets/img/package.8d37d0f.svg +0 -5
  98. package/dist/assets/img/package_fade.763c001.svg +0 -1
  99. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  100. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  101. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  102. package/dist/assets/img/search.f9705ff.svg +0 -1
  103. package/dist/assets/img/send.6db52a9.svg +0 -3
  104. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  105. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  106. package/dist/assets/img/stars_v2.79cf728.png +0 -0
  107. package/dist/assets/img/subiz-mono.8fbc067.svg +0 -3
  108. package/dist/assets/img/x.26fdfa3.svg +0 -5
  109. package/dist/malicious-app.js +0 -17
  110. package/dist/screenshoot.html +0 -7
  111. package/dist/screenshoot.js +0 -11988
@@ -16,6 +16,8 @@
16
16
  @red: #dc3545;
17
17
  @yellow: #ffc107;
18
18
  @green: #28a745;
19
+ @green-light-bg: #28a74526;
20
+ @border: @gray-300;
19
21
 
20
22
  @link: #0d6efd;
21
23
  @link-hover: #024dbc;
@@ -65,3 +67,29 @@
65
67
  -moz-mask-image: url(@url);
66
68
  mask-image: url(@url);
67
69
  }
70
+
71
+ .badge {
72
+ padding: 2px 8px;
73
+ font-size: 12px;
74
+ font-weight: 600;
75
+ border-radius: 6px;
76
+ display: inline-flex;
77
+ align-items: center;
78
+
79
+ &.badge--success {
80
+ .color(@green);
81
+ background: @green-light-bg;
82
+ }
83
+ }
84
+
85
+ .dot {
86
+ width: 8px;
87
+ height: 8px;
88
+ border-radius: 4px;
89
+ flex-shrink: 0;
90
+ background: @black;
91
+
92
+ &.dot--success {
93
+ background: @green;
94
+ }
95
+ }
@@ -92,6 +92,7 @@ body div#sbz92 {
92
92
 
93
93
  font-family: @font-family-sans-serif;
94
94
  font-size: @font-size-base;
95
+ line-height: 1.25;
95
96
 
96
97
  -webkit-box-sizing: border-box; // Safari/Chrome, other WebKit
97
98
  -moz-box-sizing: border-box; // Firefox, other Gecko
@@ -209,6 +210,9 @@ body div#sbz92 {
209
210
  .ml-2 {
210
211
  margin-left: @spacer2;
211
212
  }
213
+ .mr-1 {
214
+ margin-right: @spacer1;
215
+ }
212
216
  .mr-2 {
213
217
  margin-right: @spacer2;
214
218
  }
@@ -507,7 +507,6 @@ a.message_error {
507
507
  }
508
508
 
509
509
  .url-button-attachment {
510
- text-decoration: none;
511
510
  padding: 10px;
512
511
  display: block;
513
512
  padding-top: 9px;
@@ -542,13 +541,6 @@ a.message_error {
542
541
 
543
542
  .generic-attachment--element.clickable {
544
543
  cursor: pointer;
545
- .generic-attachment--element-title {
546
- .color(@link);
547
- }
548
-
549
- &:hover .generic-attachment--element-title {
550
- .color(@link-hover);
551
- }
552
544
  }
553
545
 
554
546
  .widget_body__events__error_msg {
@@ -291,7 +291,7 @@
291
291
  position: relative;
292
292
  }
293
293
 
294
- .widget-body.embed-chat {
294
+ .embed-chat {
295
295
  .widget-body--events {
296
296
  width: 600px;
297
297
  margin: 0 auto;
@@ -302,6 +302,23 @@
302
302
  max-width: 600px;
303
303
  margin: 20px auto;
304
304
  }
305
+
306
+ .widget-header--inner {
307
+ max-width: 100%;
308
+ width: 600px;
309
+ }
310
+
311
+ .widget-body--content {
312
+ width: 600px;
313
+ margin: 0 auto;
314
+ max-width: 100%;
315
+ }
316
+
317
+ .convo-list {
318
+ width: 600px;
319
+ margin: 0 auto;
320
+ max-width: 100%;
321
+ }
305
322
  }
306
323
 
307
324
  .widget-body--content {
@@ -402,9 +419,13 @@
402
419
  scale: 1;
403
420
  transition:
404
421
  filter 250ms ease,
405
- opacity 0.4s ease,
422
+ opacity 0.15s ease-in,
406
423
  scale 0.125s ease-in-out,
407
424
  transform 0.2s ease-in-out;
425
+
426
+ &.hidden {
427
+ opacity: 0;
428
+ }
408
429
  }
409
430
 
410
431
  .chat-button:hover {
@@ -574,3 +595,177 @@
574
595
  color: #fff;
575
596
  }
576
597
  }
598
+
599
+ .widget-preview-text-message--header {
600
+ display: flex;
601
+ overflow: hidden;
602
+ align-items: center;
603
+ width: 100%;
604
+
605
+ .widget-preview--avatar {
606
+ width: 24px;
607
+ height: 24px;
608
+ flex-shrink: 0;
609
+ margin-right: 10px;
610
+ }
611
+ }
612
+
613
+ .widget-preview-text-message--author {
614
+ flex: 1;
615
+ overflow: hidden;
616
+ display: flex;
617
+ align-items: center;
618
+
619
+ .badge {
620
+ margin-left: 10px;
621
+ }
622
+ }
623
+
624
+ .widget-preview-text-message--author-text {
625
+ text-overflow: ellipsis;
626
+ white-space: nowrap;
627
+ overflow: hidden;
628
+ line-height: 1.5;
629
+ .color(@secondary-color);
630
+ }
631
+
632
+ .widget-preview-text-message--content {
633
+ margin-top: 10px;
634
+ white-space: pre-wrap;
635
+ }
636
+
637
+ .widget-preview-quick-reply-wrapper {
638
+ z-index: @z-index-3;
639
+ width: 100%;
640
+ margin-bottom: 15px;
641
+ display: flex;
642
+ flex-direction: column;
643
+ align-items: flex-start;
644
+
645
+ &.right {
646
+ align-items: flex-end;
647
+ }
648
+ }
649
+
650
+ .widget-preview-quick-reply-item {
651
+ border-radius: 20px;
652
+ padding: 8px 20px;
653
+ background: @white;
654
+ border: 1.5px solid;
655
+ border-color: @primary-color;
656
+ .color(@primary-color);
657
+ margin-bottom: 15px;
658
+ cursor: pointer;
659
+ transition: 0.3s ease;
660
+ position: relative;
661
+
662
+ &:last-child {
663
+ margin-bottom: 0;
664
+ }
665
+
666
+ &:hover {
667
+ .color(@white);
668
+ background-color: @primary-color;
669
+ }
670
+ }
671
+
672
+ .widget-preview-image-wrapper {
673
+ z-index: @z-index-3;
674
+ width: 100%;
675
+ margin-bottom: 15px;
676
+ display: flex;
677
+ flex-direction: column;
678
+ align-items: flex-start;
679
+
680
+ &.right {
681
+ align-items: flex-end;
682
+ }
683
+ }
684
+
685
+ .widget-preview-image-item {
686
+ max-width: 300px;
687
+ border-radius: 15px;
688
+ box-shadow: 0px 5px 30px rgba(0, 0, 0, 0.15);
689
+ border: 1px solid @border;
690
+ overflow: hidden;
691
+ cursor: pointer;
692
+
693
+ img {
694
+ width: 100%;
695
+ max-height: 300px;
696
+ object-fit: cover;
697
+ }
698
+ }
699
+
700
+ .widget-preview-text-message {
701
+ z-index: @z-index-3;
702
+ background: @white;
703
+ box-shadow: 0px 5px 30px rgba(0, 0, 0, 0.15);
704
+ border: 1px solid @border;
705
+ border-radius: 15px;
706
+ max-width: 100%;
707
+ min-width: 210px;
708
+ margin-bottom: 15px;
709
+ padding: 15px 20px;
710
+ positive: relative;
711
+ cursor: pointer;
712
+
713
+ &.right {
714
+ border-bottom-right-radius: 8px;
715
+ }
716
+ &.left {
717
+ border-bottom-left-radius: 8px;
718
+ }
719
+ }
720
+
721
+ .widget-preview-new-wrapper {
722
+ max-width: 340px;
723
+ position: relative;
724
+ opacity: 1;
725
+ transition:
726
+ opacity 0.15s ease-in,
727
+ transform 0.15s ease-in;
728
+ transform: translateY(0);
729
+
730
+ &.hidden {
731
+ transform: translateY(20px);
732
+ transition:
733
+ opacity 0.15s ease-out,
734
+ transform 0.15s ease-out;
735
+ opacity: 0;
736
+ }
737
+
738
+ &:hover {
739
+ .widget-preview-x-wrapper {
740
+ display: flex;
741
+ }
742
+ }
743
+
744
+ .widget-preview--btn-close {
745
+ width: 32px;
746
+ height: 32px;
747
+ background-color: #00000040;
748
+ background-size: 16px 16px;
749
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXIteCI+PGxpbmUgeDE9IjE4IiB5MT0iNiIgeDI9IjYiIHkyPSIxOCI+PC9saW5lPjxsaW5lIHgxPSI2IiB5MT0iNiIgeDI9IjE4IiB5Mj0iMTgiPjwvbGluZT48L3N2Zz4K');
750
+
751
+ &:hover {
752
+ background-color: #00000066;
753
+ }
754
+ }
755
+ }
756
+
757
+ .widget-preview-x-wrapper {
758
+ display: none;
759
+ justify-content: flex-start;
760
+ width: calc(100% + 40px);
761
+ position: absolute;
762
+ padding: 15px 20px;
763
+ left: -20px;
764
+ bottom: 100%;
765
+
766
+ &.right {
767
+ justify-content: flex-end;
768
+ left: unset;
769
+ right: -20px;
770
+ }
771
+ }
@@ -103,7 +103,8 @@
103
103
  .widget-header--inner {
104
104
  position: absolute;
105
105
  top: 0;
106
- left: 0;
106
+ left: 50%;
107
+ transform: translateX(-50%);
107
108
  width: 100%;
108
109
  opacity: 1;
109
110
 
package/chat.js CHANGED
@@ -44,7 +44,6 @@ async function run() {
44
44
  },
45
45
  })
46
46
  }
47
- subiz._overrideDeviceType('mobile')
48
47
  if (window.innerWidth > 760) {
49
48
  // table or wider screen
50
49
  subiz.setEmbebedChatMode()
@@ -15,12 +15,14 @@ let defaultAvatar = require('../../assets/img/default_avatar.png');
15
15
  class ChatButton extends _common.Com {
16
16
  constructor(props) {
17
17
  super(props);
18
- this.setState({
19
- opacity: 0,
18
+ this.state = {
19
+ hasPreviewDom: false,
20
+ previewExtraCls: 'hidden',
20
21
  previewEvent: {},
21
- displayPreview: false
22
- });
23
- this.loadGreeting();
22
+ ready: false
23
+ };
24
+ this.readyGate = new _index.default.Gate();
25
+ this.prepareButtonImage();
24
26
  this.props.store.onUpdate(this, _ => this.forceUpdate());
25
27
  this.props.store.onConvoEvent(this, ev => {
26
28
  if (_index.default.get(ev, 'type') !== 'message_sent') return;
@@ -41,11 +43,34 @@ class ChatButton extends _common.Com {
41
43
  let message = _index.default.get(ev, 'data.message.text') || '';
42
44
  if (!message && isquickreplies) return;
43
45
  }
44
- this.setState({
45
- displayPreview: true,
46
+ let screen = _index.default.get(this.props.store.matchLastview(), 'screen');
47
+ let minimized = _index.default.get(this.props.store.matchLastview(), 'minimized');
48
+ if (screen === 'widget') return;
49
+ if (minimized && Date.now() - minimized < Ms30Mins) return;
50
+ if (this.props.store.isMobile()) {
51
+ this.props.store.updateLastview({
52
+ previewEvent: ev
53
+ });
54
+ this.forceUpdate();
55
+ return;
56
+ }
57
+ this.props.store.updateLastview({
58
+ screen: 'preview',
46
59
  previewEvent: ev
47
60
  });
61
+ this.forceUpdate();
48
62
  });
63
+ this.props.store.onLastview(this, () => {
64
+ let screen = _index.default.get(this.props.store.matchLastview(), 'screen');
65
+ let previewEvent = _index.default.get(this.props.store.matchLastview(), 'previewEvent') || {};
66
+ let isOpen = screen === 'preview' && _index.default.size(previewEvent) > 0;
67
+ if (isOpen) {
68
+ this.makeAnimateShowPreview(previewEvent);
69
+ } else {
70
+ this.makeAnimateHidePreview();
71
+ }
72
+ });
73
+ this.loadGreeting();
49
74
  }
50
75
  fixMissingSetting(chatbox) {
51
76
  chatbox = _index.default.cloneDeep(chatbox);
@@ -74,26 +99,13 @@ class ChatButton extends _common.Com {
74
99
  let hiddenButtonDesktop = _index.default.get(accountSetting, 'desktop_button.hidden');
75
100
  if (hiddenButtonDesktop) return null;
76
101
  let cls = 'widget-layout widget-layout--' + position;
77
- let opacity = this.state.opacity;
78
- if (!this.props.isShow) {
102
+ if (!this.props.isShow || !this.state.ready) {
79
103
  cls += ' widget-layout--hidden';
80
- opacity = 0;
81
104
  }
82
105
  return (0, _preact.h)("div", {
83
- class: cls,
84
- style: 'opacity: ' + opacity + ' !important'
106
+ class: cls
85
107
  }, this.renderPreview(), this.renderButton());
86
108
  }
87
- ClearPreview() {
88
- this.setState({
89
- previewEvent: {}
90
- });
91
- }
92
- ClosePreview() {
93
- this.setState({
94
- displayPreview: false
95
- });
96
- }
97
109
  pickBestGreeting() {
98
110
  let convoM = this.props.store.matchConvo('*');
99
111
  let unseenConvo = _index.default.filter(convoM, convo => {
@@ -125,30 +137,80 @@ class ChatButton extends _common.Com {
125
137
  }
126
138
  return unseenConvo[0].last_message_sent;
127
139
  }
128
- ShowGreeting() {
140
+ showPreview(ev) {
141
+ this.props.store.updateLastview({
142
+ screen: 'preview',
143
+ previewEvent: ev
144
+ });
145
+ }
146
+ async makeAnimateShowPreview(ev) {
147
+ await this.readyGate.entry();
148
+ let agent = this.getAgentOfPreviewEvent(ev);
149
+ await _index.default.preloadImg(agent.avatar_url);
150
+ if (this.state.hasPreviewDom) {
151
+ this.setState({
152
+ previewExtraCls: 'hidden'
153
+ });
154
+ if (this._animateTimeout) clearTimeout(this._animateTimeout);
155
+ this._animateTimeout = setTimeout(() => {
156
+ this.setState({
157
+ previewExtraCls: '',
158
+ previewEvent: ev
159
+ });
160
+ }, 200);
161
+ return;
162
+ }
129
163
  this.setState({
130
- previewEvent: this.pickBestGreeting(),
131
- displayPreview: true
164
+ hasPreviewDom: true,
165
+ previewExtraCls: 'hidden',
166
+ previewEvent: {}
132
167
  });
168
+ if (this._animateTimeout) clearTimeout(this._animateTimeout);
169
+ this._animateTimeout = setTimeout(() => {
170
+ this.setState({
171
+ previewExtraCls: '',
172
+ previewEvent: ev
173
+ });
174
+ }, 200);
133
175
  }
134
- HideGreeting() {
176
+ makeAnimateHidePreview() {
177
+ if (this._animateTimeout) clearTimeout(this._animateTimeout);
135
178
  this.setState({
179
+ previewExtraCls: 'hidden'
180
+ });
181
+ this._animateTimeout = setTimeout(() => {
182
+ this.setState({
183
+ hasPreviewDom: false,
184
+ previewEvent: {}
185
+ });
186
+ }, 200);
187
+ }
188
+ ShowGreeting() {
189
+ let ev = this.pickBestGreeting();
190
+ this.showPreview(ev);
191
+ }
192
+ HideGreeting() {
193
+ this.props.store.updateLastview({
194
+ screen: 'button',
195
+ minimized: Date.now(),
136
196
  previewEvent: {}
137
197
  });
138
198
  }
139
199
  loadGreeting() {
200
+ let minimized = _index.default.get(this.props.store.matchLastview(), 'minimized');
201
+ let screen = _index.default.get(this.props.store.matchLastview(), 'screen');
202
+ if (screen !== 'preview') return;
203
+ if (minimized && Date.now() - minimized < Ms30Mins) return;
204
+ let previewEvent = _index.default.get(this.props.store.matchLastview(), 'previewEvent') || {};
205
+ if (_index.default.size(previewEvent) > 0) {
206
+ this.showPreview(previewEvent);
207
+ return;
208
+ }
140
209
  let accountSetting = this.props.plugin.chatbox;
141
- if (new _index.default.Date().getTime() - this.props.store.matchClosePreviewAt() < Ms30Mins) return;
142
210
  let greeting = _index.default.get(accountSetting, 'greeting', {});
143
211
  let text = this.props.t.i18n(_index.default.get(greeting, 'greeting', {})) || greeting.message;
144
212
  let enabled = greeting.enabled;
145
- if (this.props.store.isMobile()) {
146
- enabled = enabled && !_index.default.get(greeting, 'mobile_disabled');
147
- }
148
213
  if (!text || !enabled) {
149
- this.setState({
150
- previewEvent: {}
151
- });
152
214
  return;
153
215
  }
154
216
  this.ShowGreeting();
@@ -168,14 +230,14 @@ class ChatButton extends _common.Com {
168
230
  return this.onPreviewClick();
169
231
  }
170
232
  onPreviewClick(e) {
171
- let cid = _index.default.convoOfEv(this.state.previewEvent);
233
+ let previewEvent = _index.default.get(this.props.store.matchLastview(), 'previewEvent') || {};
234
+ let cid = _index.default.convoOfEv(previewEvent);
172
235
  if (!cid) {
173
236
  let convos = _index.default.map(this.props.store.matchConvo('*'));
174
237
  let convo = _index.default.find(convos, convo => !_index.default.isConvoSeen(convo, this.props.store.matchUser().id));
175
238
  if (!convo) convo = convos[0] || {};
176
239
  cid = convo.id;
177
240
  }
178
- this.closePreview(e);
179
241
  this.props.onClick && this.props.onClick({
180
242
  view: 'chat',
181
243
  cid
@@ -188,68 +250,113 @@ class ChatButton extends _common.Com {
188
250
  class: "chat-button--unread"
189
251
  }, unreadcount);
190
252
  }
191
- renderPreview() {
253
+ getAgentOfPreviewEvent(ev) {
192
254
  let account = this.props.store.matchAccount();
193
- if (!account) return null;
194
255
  let accountSetting = this.props.plugin.chatbox;
195
- let byid = _index.default.get(this.state.previewEvent, 'by.display_id', _index.default.get(this.state.previewEvent, 'by.id'));
256
+ let previewEvent = ev;
257
+ let byid = _index.default.get(previewEvent, 'by.display_id', _index.default.get(previewEvent, 'by.id'));
196
258
  let agent = this.props.store.matchAgent(byid);
197
259
  if (!agent) agent = this.props.store.matchAgent('*')[byid] || {};
198
260
  agent = _index.default.cloneDeep(agent);
199
261
  agent.fullname = agent.fullname || _index.default.get(account, 'name') || this.props.t('agent');
200
262
  agent.avatar_url = agent.avatar_url || account.logo_url || require('../../assets/img/image_default.png');
201
- let position = _index.default.get(accountSetting, 'desktop_button.position') || 'right';
202
- if (this.props.store.isMobile()) {
203
- position = _index.default.get(accountSetting, 'mobile_button.position') || position;
204
- }
205
263
  if (accountSetting && accountSetting.hide_agent_profile) {
206
264
  agent = Object.assign({}, account, {
207
265
  avatar_url: account.logo_url || require('../../assets/img/image_default.png'),
208
266
  fullname: account.name || this.props.t('agent')
209
267
  });
210
268
  }
211
- let cls = 'widget-preview widget-preview--' + position;
212
- if (!this.state.displayPreview) cls += ' widget-preview--hidden';
213
- var tags = this.renderMessagePreview(this.state.previewEvent);
214
- if (_index.default.size(tags) === 0) cls += ' widget-preview--hidden';
269
+ return agent;
270
+ }
271
+ renderPreview() {
272
+ if (this.props.store.isMobile()) return;
273
+ if (!this.state.hasPreviewDom) return;
274
+ let previewEvent = this.state.previewEvent;
275
+ let agent = this.getAgentOfPreviewEvent(previewEvent);
276
+ let account = this.props.store.matchAccount();
277
+ let accountSetting = this.props.plugin.chatbox;
278
+ let position = _index.default.get(accountSetting, 'desktop_button.position') || 'right';
279
+ if (this.props.store.isMobile()) {
280
+ position = _index.default.get(accountSetting, 'mobile_button.position') || position;
281
+ }
282
+ let tags = this.renderMessagePreview(previewEvent);
283
+ let attachments = _index.default.get(previewEvent, 'data.message.attachments') || [];
284
+ let quickReplies = _index.default.find(attachments, att => att.type === 'quick_replies');
285
+ quickReplies = _index.default.get(quickReplies, 'quick_replies') || [];
286
+ let imgAtt = _index.default.find(attachments, att => _index.default.includes(att.mimetype, 'image') && att.url);
287
+ let uri = _index.default.get(imgAtt, 'url') || '';
288
+ if (uri && !uri.startsWith('https://') && !uri.startsWith('http://') && !uri.startsWith('content://') && !uri.startsWith('data:')) {
289
+ uri = this.props.store.FileURL + uri;
290
+ }
215
291
  return (0, _preact.h)("div", {
216
- class: cls
292
+ class: `widget-preview-new-wrapper ${this.state.previewExtraCls}`
217
293
  }, (0, _preact.h)("div", {
218
- class: "widget-preview--body"
219
- }, (0, _preact.h)("img", {
220
- alt: "widget avatar",
221
- class: "widget-preview--avatar",
222
- src: this.props.store.replaceFileUrl(agent.avatar_url),
223
- onError: ev => this.onProfileError(ev),
224
- onload: _ => this.onProfileReady()
225
- }), (0, _preact.h)("div", {
226
- class: "widget-preview--content",
227
- onClick: e => this.onPreviewClick(e)
294
+ class: `widget-preview-x-wrapper ${position}`
228
295
  }, (0, _preact.h)("div", {
229
- class: "widget-preview--title"
230
- }, agent.fullname), (0, _preact.h)("p", {
231
- class: "widget-preview--message"
232
- }, tags)), (0, _preact.h)("div", {
233
296
  class: "widget-preview--btn-close",
234
297
  onClick: e => this.closePreview(e)
235
298
  })), (0, _preact.h)("div", {
236
- class: "widget-preview--action",
299
+ class: `widget-preview-text-message ${position}`,
237
300
  onClick: e => this.onPreviewClick(e)
238
301
  }, (0, _preact.h)("div", {
239
- class: "widget-preview--action-text"
240
- }, this.props.t('chat_now'))));
241
- }
242
- onProfileReady() {
243
- if (this._buttonLoaded) this.setState({
244
- opacity: 1
245
- });
246
- this._profileLoaded = true;
302
+ class: "widget-preview-text-message--header"
303
+ }, (0, _preact.h)("img", {
304
+ alt: "widget avatar",
305
+ class: "widget-preview--avatar",
306
+ src: this.props.store.replaceFileUrl(agent.avatar_url)
307
+ }), (0, _preact.h)("div", {
308
+ class: "widget-preview-text-message--author"
309
+ }, (0, _preact.h)("div", {
310
+ class: "widget-preview-text-message--author-text"
311
+ }, agent.fullname), accountSetting.is_online && (0, _preact.h)("div", {
312
+ class: "badge badge--success"
313
+ }, (0, _preact.h)("div", {
314
+ class: "dot dot--success mr-1"
315
+ }), 'ONLINE'))), (0, _preact.h)("div", {
316
+ class: "widget-preview-text-message--content"
317
+ }, tags)), uri && (0, _preact.h)("div", {
318
+ class: `widget-preview-image-wrapper ${position}`
319
+ }, (0, _preact.h)("div", {
320
+ class: "widget-preview-image-item",
321
+ onClick: () => this.onPreviewClick()
322
+ }, (0, _preact.h)("img", {
323
+ src: uri
324
+ }))), _index.default.size(quickReplies) > 0 && (0, _preact.h)("div", {
325
+ class: `widget-preview-quick-reply-wrapper ${position}`
326
+ }, _index.default.map(quickReplies, reply => {
327
+ if (!(reply.title || '').trim()) return;
328
+ return (0, _preact.h)("div", {
329
+ class: "widget-preview-quick-reply-item",
330
+ onClick: () => {
331
+ this.props.onSelectQuickReply({
332
+ text: reply.title,
333
+ format: 'plaintext',
334
+ conversation_id: _index.default.convoOfEv(previewEvent),
335
+ attachments: [{
336
+ type: 'postback',
337
+ postback: {
338
+ event_id: previewEvent.id,
339
+ payload: reply.payload
340
+ }
341
+ }]
342
+ });
343
+ }
344
+ }, reply.title);
345
+ })));
247
346
  }
248
- onButtonReady() {
249
- if (this._profileLoaded) this.setState({
250
- opacity: 1
347
+ async prepareButtonImage() {
348
+ let accountSetting = this.props.plugin.chatbox;
349
+ accountSetting = this.fixMissingSetting(accountSetting);
350
+ let imgsrc = _index.default.get(accountSetting, 'desktop_button.background_image_url') || _index.default.get(accountSetting, 'desktop_button.background_mask_url') || defaultBubble;
351
+ if (this.props.store.isMobile()) {
352
+ imgsrc = _index.default.get(accountSetting, 'mobile_button.background_image_url') || _index.default.get(accountSetting, 'mobile_button.background_mask_url') || imgsrc;
353
+ }
354
+ imgsrc = this.props.store.replaceFileUrl(imgsrc);
355
+ await _index.default.preloadImg(imgsrc);
356
+ this.setState({
357
+ ready: true
251
358
  });
252
- this._buttonLoaded = true;
359
+ this.readyGate.open();
253
360
  }
254
361
  renderButton() {
255
362
  if (typeof sbz_info != 'undefined') sbz_info.render_chatbox_button = _index.default.Date.now();
@@ -353,9 +460,7 @@ class ChatButton extends _common.Com {
353
460
  height: "70",
354
461
  alt: "chat button",
355
462
  class: "chat-button--img",
356
- onload: () => this.onButtonReady(),
357
- src: imgsrc,
358
- onError: (e, a) => this.onChatButtonError(e, a)
463
+ src: imgsrc
359
464
  })), this.renderUnread());
360
465
  }
361
466
  onProfileError(ev) {
@@ -402,11 +507,7 @@ class ChatButton extends _common.Com {
402
507
  e.preventDefault();
403
508
  e.stopPropagation();
404
509
  }
405
- this.setState({
406
- displayPreview: false
407
- });
408
- this.props.store.closePreview();
409
- this.forceUpdate();
510
+ this.HideGreeting();
410
511
  }
411
512
  }
412
513
  exports.default = ChatButton;