@subiz/widget-v4 4.1.113 → 4.1.115

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 (37) hide show
  1. package/assets/less/message.less +148 -9
  2. package/compiled_src/chatbox/Event.js +131 -2
  3. package/compiled_src/chatbox/Events.js +24 -11
  4. package/compiled_src/chatbox/ImageAttachments.js +1 -1
  5. package/compiled_src/chatbox/InfoMessage.js +1 -0
  6. package/compiled_src/chatbox/PoweredBy.js +1 -0
  7. package/compiled_src/chatbox/Widget.js +16 -11
  8. package/compiled_src/lib.js +3 -0
  9. package/compiled_src/store/store.js +25 -1
  10. package/dist/195ec5442e3.278.js +1 -0
  11. package/dist/{19565267fde.app.js → 195ec5442e3.app.js} +1 -1
  12. package/dist/{19565267fde.index.html → 195ec5442e3.index.html} +1 -1
  13. package/dist/{19565267fde.library.html → 195ec5442e3.library.html} +1 -1
  14. package/dist/{19565267fde.library.js → 195ec5442e3.library.js} +1 -1
  15. package/dist/{19565267fde.preview.html → 195ec5442e3.preview.html} +1 -1
  16. package/dist/{19565267fde.preview.js → 195ec5442e3.preview.js} +1 -1
  17. package/dist/{19565267fde.webview.js → 195ec5442e3.webview.js} +1 -1
  18. package/dist/278.js +1 -1
  19. package/dist/HASH +1 -1
  20. package/package.json +3 -3
  21. package/src/chatbox/Event.js +151 -28
  22. package/src/chatbox/Events.js +27 -13
  23. package/src/chatbox/ImageAttachments.js +1 -1
  24. package/src/chatbox/InfoMessage.js +3 -0
  25. package/src/chatbox/PoweredBy.js +2 -0
  26. package/src/chatbox/Widget.js +10 -3
  27. package/src/lib.js +4 -0
  28. package/src/store/store.js +29 -1
  29. package/dist/19565267fde.278.js +0 -1
  30. /package/dist/{19565267fde.127.js → 195ec5442e3.127.js} +0 -0
  31. /package/dist/{19565267fde.132.js → 195ec5442e3.132.js} +0 -0
  32. /package/dist/{19565267fde.185.js → 195ec5442e3.185.js} +0 -0
  33. /package/dist/{19565267fde.27.js → 195ec5442e3.27.js} +0 -0
  34. /package/dist/{19565267fde.459.js → 195ec5442e3.459.js} +0 -0
  35. /package/dist/{19565267fde.490.js → 195ec5442e3.490.js} +0 -0
  36. /package/dist/{19565267fde.74.js → 195ec5442e3.74.js} +0 -0
  37. /package/dist/{19565267fde.997.js → 195ec5442e3.997.js} +0 -0
@@ -13,10 +13,10 @@
13
13
  }
14
14
 
15
15
  .mobile .widget-body--events {
16
- display: flex;
17
- flex-direction: column;
18
- justify-content: flex-end;
19
- padding-bottom: 15px;
16
+ display: flex;
17
+ flex-direction: column;
18
+ justify-content: flex-end;
19
+ padding-bottom: 15px;
20
20
  }
21
21
 
22
22
  .widget-body--events-container.widget-body--events-container__error {
@@ -108,12 +108,15 @@
108
108
 
109
109
  .message-text--agent {
110
110
  white-space: pre-wrap;
111
- margin: 5px 0 0;
112
111
  display: inline-block;
113
112
  background-color: @primary-color;
114
113
  .color(@text-color);
115
114
  padding: 10px 14px 10px 14px;
116
115
  }
116
+ .message-agent.message-text--agent {
117
+ max-width: unset;
118
+ margin-top: 0;
119
+ }
117
120
 
118
121
  .message-user__container {
119
122
  display: flex;
@@ -148,13 +151,13 @@
148
151
  }
149
152
 
150
153
  .message-user.message-user-images-container {
151
- width: 85%;
152
- display: flex;
153
- justify-content: flex-end;
154
+ width: 85%;
155
+ display: flex;
156
+ justify-content: flex-end;
154
157
  }
155
158
 
156
159
  .message-user.message-user-audio {
157
- flex: 1;
160
+ flex: 1;
158
161
  }
159
162
 
160
163
  .message-agent {
@@ -741,3 +744,139 @@ a.product_attachment__title {
741
744
  margin-left: 5px;
742
745
  margin-top: -2px;
743
746
  }
747
+
748
+ .agent-convo-event-wrapper {
749
+ max-width: 85%;
750
+ margin-top: 5px;
751
+ }
752
+
753
+ .agent-convo-event-inner {
754
+ width: fit-content;
755
+ position: relative;
756
+ }
757
+
758
+ .message-event-actions {
759
+ position: absolute;
760
+ bottom: -18px;
761
+ margin-top: 4px;
762
+ left: calc(100% - 40px);
763
+ display: none;
764
+ border: 1px solid #dee2e6;
765
+ background-color: white;
766
+ border-radius: 4px;
767
+ z-index: 10;
768
+ }
769
+
770
+ .agent-convo-event-inner:hover .message-event-actions {
771
+ display: flex;
772
+ }
773
+
774
+ .agent-convo-event-inner.last {
775
+ .message-event-actions {
776
+ display: flex;
777
+ position: unset;
778
+ margin-top: 4px;
779
+ border: none;
780
+ padding: 0;
781
+ }
782
+
783
+ .message-event-action-btn {
784
+ padding: 0;
785
+ .message-event-action-btn-svg {
786
+ width: 24px;
787
+ height: 24px;
788
+ background-position: 2px 2px;
789
+ background-size: 20px 20px;
790
+ }
791
+ }
792
+
793
+ .message-event-action-btn.message-event-action-btn__dev {
794
+ .color(@gray-600);
795
+ padding-right: 10px;
796
+ border-radius: 5px;
797
+ .message-event-action-btn-svg {
798
+ width: 24px;
799
+ height: 24px;
800
+ background-position: 2px 2px;
801
+ background-size: 20px 20px;
802
+ }
803
+ }
804
+
805
+ .message-event-action-btn.message-event-action-btn__dev:hover {
806
+ .color(@black);
807
+ }
808
+
809
+ .message-event-action-btn.message-event-action-btn__dev.message-event-action-btn_like.active {
810
+ .color(#34c759);
811
+ }
812
+
813
+ .message-event-action-btn.message-event-action-btn__dev.message-event-action-btn_like.active {
814
+ .color(#34c759);
815
+ }
816
+ }
817
+
818
+ .message-event-action-btn.message-event-action-btn__dev:hover {
819
+ background-color: unset;
820
+ }
821
+
822
+ .message-event-action-btn {
823
+ height: 24px;
824
+ display: flex;
825
+ align-items: center;
826
+ justify-content: center;
827
+ cursor: pointer;
828
+ padding: 2px;
829
+
830
+ &:hover {
831
+ background-color: #ececec;
832
+ .message-event-action-btn-svg {
833
+ }
834
+ }
835
+
836
+ &.active:hover {
837
+ background-color: #dbfde3;
838
+ .message-event-action-btn-svg {
839
+ }
840
+ }
841
+ }
842
+
843
+ .message-event-action-btn.message-event-action-btn__dev {
844
+ padding: 0px;
845
+
846
+ &:hover {
847
+ background-color: unset;
848
+ }
849
+
850
+ &.active:hover {
851
+ background-color: unset;
852
+ }
853
+ }
854
+
855
+ .message-event-action-btn .message-event-action-btn-svg {
856
+ width: 20px;
857
+ height: 20px;
858
+ border-radius: 4px;
859
+ background-position: 2px 2px;
860
+ background-size: 16px 16px;
861
+ background-repeat: no-repeat;
862
+ background-position: center;
863
+ }
864
+
865
+ .message-event-action-btn-svg.like {
866
+ background-image: url('data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgd2lkdGg9IjI0IiAgaGVpZ2h0PSIyNCIgIHZpZXdCb3g9IjAgMCAyNCAyNCIgIGZpbGw9Im5vbmUiICBzdHJva2U9IiM2Yzc1N2QiICBzdHJva2Utd2lkdGg9IjIiICBzdHJva2UtbGluZWNhcD0icm91bmQiICBzdHJva2UtbGluZWpvaW49InJvdW5kIiAgY2xhc3M9Imljb24gaWNvbi10YWJsZXIgaWNvbnMtdGFibGVyLW91dGxpbmUgaWNvbi10YWJsZXItdGh1bWItdXAiPjxwYXRoIHN0cm9rZT0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik03IDExdjhhMSAxIDAgMCAxIC0xIDFoLTJhMSAxIDAgMCAxIC0xIC0xdi03YTEgMSAwIDAgMSAxIC0xaDNhNCA0IDAgMCAwIDQgLTR2LTFhMiAyIDAgMCAxIDQgMHY1aDNhMiAyIDAgMCAxIDIgMmwtMSA1YTIgMyAwIDAgMSAtMiAyaC03YTMgMyAwIDAgMSAtMyAtMyIgLz48L3N2Zz4K');
867
+ }
868
+ .message-event-action-btn-svg.dislike {
869
+ background-image: url('data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgd2lkdGg9IjI0IiAgaGVpZ2h0PSIyNCIgIHZpZXdCb3g9IjAgMCAyNCAyNCIgIGZpbGw9Im5vbmUiICBzdHJva2U9IiM2Yzc1N2QiICBzdHJva2Utd2lkdGg9IjIiICBzdHJva2UtbGluZWNhcD0icm91bmQiICBzdHJva2UtbGluZWpvaW49InJvdW5kIiAgY2xhc3M9Imljb24gaWNvbi10YWJsZXIgaWNvbnMtdGFibGVyLW91dGxpbmUgaWNvbi10YWJsZXItdGh1bWItZG93biI+PHBhdGggc3Ryb2tlPSJub25lIiBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTcgMTN2LThhMSAxIDAgMCAwIC0xIC0xaC0yYTEgMSAwIDAgMCAtMSAxdjdhMSAxIDAgMCAwIDEgMWgzYTQgNCAwIDAgMSA0IDR2MWEyIDIgMCAwIDAgNCAwdi01aDNhMiAyIDAgMCAwIDIgLTJsLTEgLTVhMiAzIDAgMCAwIC0yIC0yaC03YTMgMyAwIDAgMCAtMyAzIiAvPjwvc3ZnPgo=');
870
+ }
871
+ .message-event-action-btn:hover .message-event-action-btn-svg.like {
872
+ background-image: url('data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgd2lkdGg9IjI0IiAgaGVpZ2h0PSIyNCIgIHZpZXdCb3g9IjAgMCAyNCAyNCIgIGZpbGw9Im5vbmUiICBzdHJva2U9ImJsYWNrIiAgc3Ryb2tlLXdpZHRoPSIyIiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb25zLXRhYmxlci1vdXRsaW5lIGljb24tdGFibGVyLXRodW1iLXVwIj48cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxMXY4YTEgMSAwIDAgMSAtMSAxaC0yYTEgMSAwIDAgMSAtMSAtMXYtN2ExIDEgMCAwIDEgMSAtMWgzYTQgNCAwIDAgMCA0IC00di0xYTIgMiAwIDAgMSA0IDB2NWgzYTIgMiAwIDAgMSAyIDJsLTEgNWEyIDMgMCAwIDEgLTIgMmgtN2EzIDMgMCAwIDEgLTMgLTMiIC8+PC9zdmc+Cg==');
873
+ }
874
+ .message-event-action-btn:hover .message-event-action-btn-svg.dislike {
875
+ background-image: url('data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgd2lkdGg9IjI0IiAgaGVpZ2h0PSIyNCIgIHZpZXdCb3g9IjAgMCAyNCAyNCIgIGZpbGw9Im5vbmUiICBzdHJva2U9ImJsYWNrIiAgc3Ryb2tlLXdpZHRoPSIyIiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgIGNsYXNzPSJpY29uIGljb24tdGFibGVyIGljb25zLXRhYmxlci1vdXRsaW5lIGljb24tdGFibGVyLXRodW1iLWRvd24iPjxwYXRoIHN0cm9rZT0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik03IDEzdi04YTEgMSAwIDAgMCAtMSAtMWgtMmExIDEgMCAwIDAgLTEgMXY3YTEgMSAwIDAgMCAxIDFoM2E0IDQgMCAwIDEgNCA0djFhMiAyIDAgMCAwIDQgMHYtNWgzYTIgMiAwIDAgMCAyIC0ybC0xIC01YTIgMyAwIDAgMCAtMiAtMmgtN2EzIDMgMCAwIDAgLTMgMyIgLz48L3N2Zz4K');
876
+ }
877
+ .message-event-action-btn.active .message-event-action-btn-svg.like {
878
+ background-image: url('data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgd2lkdGg9IjI0IiAgaGVpZ2h0PSIyNCIgIHZpZXdCb3g9IjAgMCAyNCAyNCIgIGZpbGw9IiMzNEM3NTkiICBjbGFzcz0iaWNvbiBpY29uLXRhYmxlciBpY29ucy10YWJsZXItZmlsbGVkIGljb24tdGFibGVyLXRodW1iLXVwIj48cGF0aCBzdHJva2U9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTMgM2EzIDMgMCAwIDEgMi45OTUgMi44MjRsLjAwNSAuMTc2djRoMmEzIDMgMCAwIDEgMi45OCAyLjY1bC4wMTUgLjE3NGwuMDA1IC4xNzZsLS4wMiAuMTk2bC0xLjAwNiA1LjAzMmMtLjM4MSAxLjYyNiAtMS41MDIgMi43OTYgLTIuODEgMi43OGwtLjE2NCAtLjAwOGgtOGExIDEgMCAwIDEgLS45OTMgLS44ODNsLS4wMDcgLS4xMTdsLjAwMSAtOS41MzZhMSAxIDAgMCAxIC41IC0uODY1YTIuOTk4IDIuOTk4IDAgMCAwIDEuNDkyIC0yLjM5N2wuMDA3IC0uMjAydi0xYTMgMyAwIDAgMSAzIC0zeiIgLz48cGF0aCBkPSJNNSAxMGExIDEgMCAwIDEgLjk5MyAuODgzbC4wMDcgLjExN3Y5YTEgMSAwIDAgMSAtLjg4MyAuOTkzbC0uMTE3IC4wMDdoLTFhMiAyIDAgMCAxIC0xLjk5NSAtMS44NWwtLjAwNSAtLjE1di03YTIgMiAwIDAgMSAxLjg1IC0xLjk5NWwuMTUgLS4wMDVoMXoiIC8+PC9zdmc+Cg==');
879
+ }
880
+ .message-event-action-btn.active .message-event-action-btn-svg.dislike {
881
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI0ODBfOTUpIj4KPHBhdGggZD0iTTEzIDIxLjAwNzlDMTMuNzY1IDIxLjAwOCAxNC41MDEyIDIwLjcxNTcgMTUuMDU3OSAyMC4xOTFDMTUuNjE0NyAxOS42NjYyIDE1Ljk0OTkgMTguOTQ4NiAxNS45OTUgMTguMTg0OUwxNiAxOC4wMDc5VjE0LjAwNzlIMThDMTguNzM1MSAxNC4wMDggMTkuNDQ0NyAxMy43MzgyIDE5Ljk5NCAxMy4yNDk3QzIwLjU0MzQgMTIuNzYxMiAyMC44OTQyIDEyLjA4OCAyMC45OCAxMS4zNTc5TDIwLjk5NSAxMS4xODQ5TDIxIDExLjAwNzlMMjAuOTggMTAuODExOUwxOS45NzQgNS43Nzk5MkMxOS41OTMgNC4xNTQ5MiAxOC40NzIgMi45ODM5MiAxNy4xNjQgMi45OTk5MkwxNyAzLjAwNzkySDlDOC43NTQ5MSAzLjAwNzk4IDguNTE4MzggMy4wOTgwNCA4LjMzNTMzIDMuMjYxMDFDOC4xNTIyNyAzLjQyMzk3IDguMDM1NDMgMy42NDg0OSA4LjAwNyAzLjg5MTkyTDggNC4wMDc5Mkw4LjAwMSAxMy41NDM5QzguMDAxIDEzLjcxOTUgOC4wNDcyMSAxMy44OTE5IDguMTM0OTggMTQuMDQzOUM4LjIyMjc1IDE0LjE5NTkgOC4zNDg5OCAxNC4zMjIyIDguNTAxIDE0LjQwOTlDOC45MjcyOSAxNC42NTYxIDkuMjg2NCAxNS4wMDM1IDkuNTQ2NjEgMTUuNDIxM0M5LjgwNjgyIDE1LjgzOTIgOS45NjAxMyAxNi4zMTQ3IDkuOTkzIDE2LjgwNTlMMTAgMTcuMDA3OVYxOC4wMDc5QzEwIDE4LjgwMzYgMTAuMzE2MSAxOS41NjY2IDEwLjg3ODcgMjAuMTI5MkMxMS40NDEzIDIwLjY5MTggMTIuMjA0NCAyMS4wMDc5IDEzIDIxLjAwNzlaIiBmaWxsPSIjMzMzMzMzIi8+CjxwYXRoIGQ9Ik01IDE0LjAwODFDNS4yNDQ5MyAxNC4wMDggNS40ODEzNCAxMy45MTgxIDUuNjY0MzcgMTMuNzU1M0M1Ljg0NzQxIDEzLjU5MjYgNS45NjQzNCAxMy4zNjgzIDUuOTkzIDEzLjEyNTFMNiAxMy4wMDgxVjQuMDA4MDZDNS45OTk5NyAzLjc2MzEyIDUuOTEwMDQgMy41MjY3MiA1Ljc0NzI4IDMuMzQzNjhDNS41ODQ1MyAzLjE2MDY1IDUuMzYwMjUgMy4wNDM3MSA1LjExNyAzLjAxNTA2TDUgMy4wMDgwNkg0QzMuNDk1MSAzLjAwNzkzIDMuMDA4ODQgMy4xOTg3OCAyLjYzODgxIDMuNTQyMjlDMi4yNjg3OCAzLjg4NTc5IDIuMDQyMzYgNC4zNTY1NCAyLjAwNSA0Ljg2MDA2TDIgNS4wMTAwNlYxMi4wMTAxQzIuMDAwMDkgMTIuNTE0NSAyLjE5MDc3IDEzLjAwMDIgMi41MzM4NCAxMy4zN0MyLjg3NjkgMTMuNzM5NyAzLjM0NzAyIDEzLjk2NjIgMy44NSAxNC4wMDQxTDQgMTQuMDA5MUw1IDE0LjAwODFaIiBmaWxsPSIjMzMzMzMzIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMjQ4MF85NSI+CjxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K');
882
+ }
@@ -28,7 +28,11 @@ const LoadOrderAttachments = () => Promise.resolve().then(() => _interopRequireW
28
28
  class Event extends _common.Com {
29
29
  constructor(props) {
30
30
  super(props);
31
+ this.props.store.onConvoEvent(this, ev => this.onEvent(ev));
31
32
  this.refForm = (0, _preact.createRef)();
33
+ this.state = {
34
+ pongs: _index.default.get(this.props.event, 'ev.data.message.pongs') || []
35
+ };
32
36
  }
33
37
  render() {
34
38
  var ev = _index.default.get(this.props.event, 'ev', {});
@@ -52,6 +56,24 @@ class Event extends _common.Com {
52
56
  focus() {
53
57
  this.refForm.current && this.refForm.current.focus();
54
58
  }
59
+ onEvent(ev) {
60
+ if (ev.id !== _index.default.get(this.props.event, 'ev.id')) return;
61
+ this.setState({
62
+ pongs: _index.default.get(ev, 'data.message.pongs') || []
63
+ });
64
+ }
65
+ hasLike() {
66
+ let {
67
+ pongs
68
+ } = this.state;
69
+ return !!_index.default.find(pongs, pong => pong.type === 'like');
70
+ }
71
+ hasDislike() {
72
+ let {
73
+ pongs
74
+ } = this.state;
75
+ return !!_index.default.find(pongs, pong => pong.type === 'dislike');
76
+ }
55
77
  chooseQuickReply(reply) {
56
78
  let ev = _index.default.get(this.props.event, 'ev', {});
57
79
  let message = {
@@ -141,14 +163,21 @@ class Event extends _common.Com {
141
163
  t: this.props.t
142
164
  }));
143
165
  }
166
+ if (this.props.store.isAIDevMode()) $time = null;
144
167
  let t = new _index.default.Date(ev.created).toLocaleString();
145
168
  if (_index.default.get(ev, 'by.type') !== 'user') {
146
169
  let $sender = null;
147
170
  if (this.props.event.mode === 'lead') $sender = this.renderAgentAvatar(ev);
171
+ let innercls = 'agent-convo-event-inner';
172
+ if (this.props.isLast) innercls += ' last';
148
173
  return (0, _preact.h)("div", {
149
174
  class: "convo-event agent-message",
150
175
  title: t
151
- }, $time, $sender, (0, _preact.h)(_TextMessage.default, {
176
+ }, $time, $sender, (0, _preact.h)("div", {
177
+ class: "agent-convo-event-wrapper"
178
+ }, (0, _preact.h)("div", {
179
+ class: innercls
180
+ }, (0, _preact.h)(_TextMessage.default, {
152
181
  store: this.props.store,
153
182
  ev: ev,
154
183
  onLink: this.props.onLink
@@ -196,7 +225,7 @@ class Event extends _common.Com {
196
225
  store: this.props.store,
197
226
  ev: ev,
198
227
  onSelect: e => this.chooseQuickReply(e)
199
- }));
228
+ }), this.renderReactions(), this.renderAIDevNote())));
200
229
  }
201
230
  if (_index.default.get(ev, 'data.message.idempotency_key') === ev.id && this.props.store.now() - ev.created < 900) {
202
231
  _index.default.setTimeout(() => this.setState({
@@ -269,6 +298,106 @@ class Event extends _common.Com {
269
298
  ev: ev
270
299
  })), $error);
271
300
  }
301
+ async onSendReaction(action) {
302
+ if (this._reacting) return;
303
+ let ev = this.props.event.ev;
304
+ let cid = _index.default.get(ev, 'data.message.conversation_id');
305
+ ev = {
306
+ type: 'message_pong',
307
+ data: {
308
+ message: {
309
+ id: ev.id,
310
+ pongs: [{
311
+ type: action
312
+ }],
313
+ conversion_id: cid
314
+ }
315
+ }
316
+ };
317
+ if (action == 'dislike' && this.props.store.isAIDevMode()) {
318
+ this.props.store.emitConvoEvent({
319
+ type: 'bad_feedbacked',
320
+ data: {
321
+ event: ev,
322
+ id: ev.id,
323
+ conversion_id: cid
324
+ }
325
+ });
326
+ }
327
+ let {
328
+ pongs
329
+ } = this.state;
330
+ if (action === 'like') {
331
+ pongs = pongs.filter(pong => pong.type !== 'dislike');
332
+ pongs.push({
333
+ type: 'like'
334
+ });
335
+ } else if (action === 'dislike') {
336
+ pongs = pongs.filter(pong => pong.type !== 'like');
337
+ pongs.push({
338
+ type: 'dislike'
339
+ });
340
+ } else if (action === 'remove_like') {
341
+ pongs = pongs.filter(pong => pong.type !== 'like');
342
+ } else if (action === 'remove_dislike') {
343
+ pongs = pongs.filter(pong => pong.type !== 'dislike');
344
+ }
345
+ this.setState({
346
+ pongs
347
+ });
348
+ this._reacting = true;
349
+ let res = await this.props.store.sendReaction(cid, ev);
350
+ this._reacting = false;
351
+ }
352
+ renderReactions() {
353
+ if (this.props.store.isAIDevMode()) return null;
354
+ let ev = _index.default.get(this.props.event, 'ev') || {};
355
+ let pongs = _index.default.get(ev, 'data.message.pongs') || [];
356
+ let hasLike = this.hasLike();
357
+ let hasDislike = this.hasDislike();
358
+ let likecls = 'message-event-action-btn';
359
+ if (hasLike) likecls += ' active';
360
+ let dislikecls = 'message-event-action-btn';
361
+ if (hasDislike) dislikecls += ' active';
362
+ return (0, _preact.h)("div", {
363
+ class: "message-event-actions"
364
+ }, (0, _preact.h)("div", {
365
+ class: likecls,
366
+ onClick: () => this.onSendReaction(hasLike ? 'remove_like' : 'like')
367
+ }, (0, _preact.h)("div", {
368
+ class: "message-event-action-btn-svg like"
369
+ })), (0, _preact.h)("div", {
370
+ class: dislikecls,
371
+ onClick: () => this.onSendReaction(hasDislike ? 'remove_dislike' : 'dislike')
372
+ }, (0, _preact.h)("div", {
373
+ class: "message-event-action-btn-svg dislike"
374
+ })));
375
+ }
376
+ renderAIDevNote() {
377
+ if (!this.props.isLast) return null;
378
+ if (!this.props.store.isAIDevMode()) return null;
379
+ let ev = _index.default.get(this.props.event, 'ev') || {};
380
+ let pongs = _index.default.get(ev, 'data.message.pongs') || [];
381
+ let hasLike = this.hasLike();
382
+ let hasDislike = this.hasDislike();
383
+ let likecls = 'message-event-action-btn message-event-action-btn__dev message-event-action-btn_like';
384
+ if (hasLike) likecls += ' active';
385
+ let dislikecls = 'message-event-action-btn message-event-action-btn__dev message-event-action-btn_dislike';
386
+ if (hasDislike) dislikecls += ' active';
387
+ return (0, _preact.h)("div", {
388
+ class: "message-event-actions"
389
+ }, (0, _preact.h)("div", {
390
+ class: likecls,
391
+ onClick: () => this.onSendReaction(hasLike ? 'remove_like' : 'like')
392
+ }, (0, _preact.h)("div", {
393
+ class: "message-event-action-btn-svg like"
394
+ }), " Good"), (0, _preact.h)("div", {
395
+ class: dislikecls,
396
+ onClick: () => this.onSendReaction(hasDislike ? 'remove_dislike' : 'dislike')
397
+ }, (0, _preact.h)("div", {
398
+ class: "message-event-action-btn-svg dislike"
399
+ }), " Bad"));
400
+ }
272
401
  renderUpdateConvo(ev) {
273
402
  var state = _index.default.get(ev, 'data.conversation.state');
274
403
  if (state === 'active') return null;
@@ -52,17 +52,30 @@ class Events extends _common.Com {
52
52
  ev: ev
53
53
  }));
54
54
  processEvents(convo, events);
55
- let $events = _index.default.map(events, ev => (0, _preact.h)(_Event.default, {
56
- chatbox: this.props.chatbox,
57
- onLink: this.props.onLink,
58
- store: this.props.store,
59
- onFormSubmit: this.props.onFormSubmit,
60
- onSend: this.props.onSend,
61
- onPostback: this.props.onPostback,
62
- event: ev,
63
- t: this.props.t,
64
- key: ev.ev.id
65
- }));
55
+ let lastAgentMessageSentId = '';
56
+ for (let i = events.length - 1; i >= 0; i--) {
57
+ let ev = _index.default.get(events, [i, 'ev']) || {};
58
+ let bytype = _index.default.get(ev, 'by.type');
59
+ if (bytype !== 'user' && ev.type === 'message_sent') {
60
+ lastAgentMessageSentId = ev.id;
61
+ break;
62
+ }
63
+ }
64
+ let $events = _index.default.map(events, ev => {
65
+ let isLast = ev.ev.id === lastAgentMessageSentId;
66
+ return (0, _preact.h)(_Event.default, {
67
+ isLast: isLast,
68
+ chatbox: this.props.chatbox,
69
+ onLink: this.props.onLink,
70
+ store: this.props.store,
71
+ onFormSubmit: this.props.onFormSubmit,
72
+ onSend: this.props.onSend,
73
+ onPostback: this.props.onPostback,
74
+ event: ev,
75
+ t: this.props.t,
76
+ key: ev.ev.id
77
+ });
78
+ });
66
79
  let $loading = null;
67
80
  let style = 'opacity: 1 !important';
68
81
  if (this.state.loading || this.props.creating) {
@@ -27,7 +27,7 @@ class ImageAttachment extends _common.Com {
27
27
  const MAX_HEIGHT = 240;
28
28
  const DEFAULT_MAX_WIDTH = 267;
29
29
  let $container = this.containerRef.current;
30
- this.frameWidth = $container ? $container.offsetWidth : DEFAULT_MAX_WIDTH;
30
+ this.frameWidth = $container ? $container.parentNode.parentNode.offsetWidth : DEFAULT_MAX_WIDTH;
31
31
  this.frameHeight = MAX_HEIGHT;
32
32
  this.setState({
33
33
  ready: true
@@ -27,6 +27,7 @@ class InfoMessage extends _common.Com {
27
27
  t: this.props.t
28
28
  }));
29
29
  }
30
+ if (this.props.store.isAIDevMode()) $time = null;
30
31
  if (ev.type === 'conversation_rated') {
31
32
  var rating = _index.default.get(ev, 'data.conversation.ratings.0', {
32
33
  no_rating: true,
@@ -8,6 +8,7 @@ var _preact = require("preact");
8
8
  var logo = require('../../assets/img/subiz-mono.svg');
9
9
  function PoweredBy(props) {
10
10
  if (props.store.isMobile()) return null;
11
+ if (props.store.isAIDevMode()) return null;
11
12
  let user = props.store.matchUser() || {};
12
13
  var link = `https://subiz.com.vn/?utm_source=${window.location.host || `id-${user.account_id}`}&utm_medium=widget&utm_campaign=widget_referral`;
13
14
  return (0, _preact.h)("div", {
@@ -201,19 +201,24 @@ class Widget extends _common.Com {
201
201
  let cls = 'widget-container widget-container--' + position;
202
202
  if (!this.props.store.isMobile() && _index.default.get(accountSetting, 'window_mode') === 'full') cls += ' widget-container--full';
203
203
  if (!this.props.isShow) cls += ' widget-container--hide';
204
+ let hideheader = _index.default.get(accountSetting, 'header.hidden', false);
205
+ var $header;
206
+ if (!hideheader) {
207
+ $header = (0, _preact.h)(_Header.default, {
208
+ t: this.props.t,
209
+ plugin: this.props.plugin,
210
+ store: this.props.store,
211
+ cid: this.props.cid,
212
+ view: this.props.view,
213
+ onClose: this.props.onClose,
214
+ onGotoList: () => this.props.onGo({
215
+ view: 'list'
216
+ })
217
+ });
218
+ }
204
219
  return (0, _preact.h)("div", {
205
220
  class: cls
206
- }, (0, _preact.h)(_Header.default, {
207
- t: this.props.t,
208
- plugin: this.props.plugin,
209
- store: this.props.store,
210
- cid: this.props.cid,
211
- view: this.props.view,
212
- onClose: this.props.onClose,
213
- onGotoList: () => this.props.onGo({
214
- view: 'list'
215
- })
216
- }), $body);
221
+ }, $header, $body);
217
222
  }
218
223
  async submitPrechatForm(form, formName) {
219
224
  if (this.state.submiting) return;
@@ -46,6 +46,9 @@ class Widget {
46
46
  await this.store.readyGate.entry();
47
47
  cb();
48
48
  }
49
+ setAIDevMode(mode) {
50
+ this.store.setAIDevMode(mode);
51
+ }
49
52
  setTrackPageView(val) {
50
53
  this.store.setTrackPageview(val);
51
54
  }
@@ -334,6 +334,15 @@ class Store {
334
334
  highlight(pluginid, ref) {
335
335
  this.pubsub.publish('highlight', pluginid, ref);
336
336
  }
337
+ emitConvoEvent(ev) {
338
+ this.pubsub.publish('events', ev);
339
+ }
340
+ setAIDevMode(mode) {
341
+ this.ai_dev_mode = mode;
342
+ }
343
+ isAIDevMode() {
344
+ return this.ai_dev_mode;
345
+ }
337
346
  overrideDeviceType(type) {
338
347
  this.forceDevice = type;
339
348
  this.pubsub.publish('account');
@@ -722,7 +731,17 @@ class Store {
722
731
  var oldev = this.chain.match(cid, msgid);
723
732
  if (!_index.default.get(oldev, 'data.message')) return;
724
733
  var pongs = _index.default.get(oldev, 'data.message.pongs', []);
725
- pongs = pongs.concat(_index.default.get(ev, 'data.message.pongs', []));
734
+ let newpongs = _index.default.get(ev, 'data.message.pongs', []) || [];
735
+ pongs = pongs.concat(newpongs);
736
+ if (newpongs.length === 1) {
737
+ let pongtype = newpongs[0].type;
738
+ if (pongtype === 'like' || pongtype === 'remove_dislike') {
739
+ pongs = pongs.filter(pong => pong.type !== 'dislike');
740
+ }
741
+ if (pongtype === 'dislike' || pongtype === 'remove_like') {
742
+ pongs = pongs.filter(pong => pong.type !== 'like');
743
+ }
744
+ }
726
745
  oldev.data.message.pongs = pongs;
727
746
  _index.default.map(pongs, pong => {
728
747
  if (pong.member_id == user.id && pong.type === 'seen') {
@@ -731,6 +750,7 @@ class Store {
731
750
  }
732
751
  });
733
752
  this.chain.put(cid, oldev.id, _index.default.getMs(oldev.created), oldev);
753
+ this.pubsub.publish('events', oldev);
734
754
  }
735
755
  if (ev.type === 'message_sent') {
736
756
  let idemkey = _index.default.get(ev, 'data.message.idempotency_key');
@@ -757,6 +777,7 @@ class Store {
757
777
  this._typing(cid);
758
778
  }
759
779
  async startConvo(req) {
780
+ if (!req) req = {};
760
781
  await this.readyGate.entry();
761
782
  this.convoGate.close();
762
783
  if (!req.source) req.source = document.location.href;
@@ -782,6 +803,9 @@ class Store {
782
803
  createPostback(cid, postback) {
783
804
  return this.api.createPostback(cid, postback);
784
805
  }
806
+ sendReaction(cid, ev) {
807
+ return this.api.sendConvoEvent(cid, ev);
808
+ }
785
809
  async sendConvoEvent(cid, type, data) {
786
810
  await this.readyGate.entry();
787
811
  var idempotency = _index.default.randomString(36);