@subiz/widget-v4 4.0.89 → 4.0.90

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 (97) hide show
  1. package/compiled_src/chatbox/Event.js +3 -4
  2. package/compiled_src/chatbox/TextMessage.js +104 -9
  3. package/compiled_src/chatbox/Widget.js +11 -10
  4. package/package.json +5 -5
  5. package/src/chatbox/Event.js +3 -4
  6. package/src/chatbox/TextMessage.js +82 -15
  7. package/src/chatbox/Widget.js +10 -9
  8. package/dist/132.js +0 -6995
  9. package/dist/178.js +0 -406
  10. package/dist/1833a09e682.132.js +0 -1
  11. package/dist/1833a09e682.178.js +0 -1
  12. package/dist/1833a09e682.213.js +0 -1
  13. package/dist/1833a09e682.335.js +0 -1
  14. package/dist/1833a09e682.362.js +0 -1
  15. package/dist/1833a09e682.441.js +0 -1
  16. package/dist/1833a09e682.605.js +0 -1
  17. package/dist/1833a09e682.678.js +0 -1
  18. package/dist/1833a09e682.782.js +0 -1
  19. package/dist/1833a09e682.app.js +0 -1
  20. package/dist/1833a09e682.index.html +0 -26
  21. package/dist/1833a09e682.library.html +0 -26
  22. package/dist/1833a09e682.library.js +0 -1
  23. package/dist/1833a09e682.preview.html +0 -759
  24. package/dist/1833a09e682.preview.js +0 -1
  25. package/dist/1833a09e682.screenshoot.js +0 -1
  26. package/dist/213.js +0 -3215
  27. package/dist/335.js +0 -411
  28. package/dist/362.js +0 -107
  29. package/dist/441.js +0 -2834
  30. package/dist/605.js +0 -328
  31. package/dist/678.js +0 -107
  32. package/dist/782.js +0 -107
  33. package/dist/HASH +0 -1
  34. package/dist/assets/img/Facebook.64607ec.png +0 -0
  35. package/dist/assets/img/Zalo.6845707.png +0 -0
  36. package/dist/assets/img/award1a.1a58e10.png +0 -0
  37. package/dist/assets/img/award3a.3b74423.png +0 -0
  38. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  39. package/dist/assets/img/award5.39eb7ae.png +0 -0
  40. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  41. package/dist/assets/img/caret.998eb8f.svg +0 -1
  42. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  43. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  44. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  45. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  46. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  47. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  48. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  49. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  50. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  51. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  52. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  53. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  54. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  55. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  56. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  57. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  58. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  59. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  60. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  61. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  62. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  63. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  64. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  65. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  66. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  67. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  68. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  69. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  70. package/dist/assets/img/empty.29bed2d.svg +0 -23
  71. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  72. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  73. package/dist/assets/img/external-link.90577cc.svg +0 -1
  74. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  75. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  76. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  77. package/dist/assets/img/image_default.be0698b.png +0 -0
  78. package/dist/assets/img/info.ebce7ea.svg +0 -1
  79. package/dist/assets/img/loader.37000a7.svg +0 -1
  80. package/dist/assets/img/loading_static.8f403ae.svg +0 -10
  81. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  82. package/dist/assets/img/main-service2.9b99549.png +0 -0
  83. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  84. package/dist/assets/img/package.8d37d0f.svg +0 -5
  85. package/dist/assets/img/package_fade.763c001.svg +0 -1
  86. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  87. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  88. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  89. package/dist/assets/img/search.f9705ff.svg +0 -1
  90. package/dist/assets/img/send.6db52a9.svg +0 -3
  91. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  92. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  93. package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
  94. package/dist/assets/img/x.26fdfa3.svg +0 -5
  95. package/dist/malicious-app.js +0 -13
  96. package/dist/screenshoot.html +0 -7
  97. package/dist/screenshoot.js +0 -5953
@@ -142,7 +142,7 @@ class Event extends _common.Com {
142
142
 
143
143
  let agentM = this.props.store.matchAgent('*');
144
144
 
145
- if (byid !== 'system' || bytype !== 'dummy') {
145
+ if (byid !== 'system' && bytype !== 'dummy' && bytype !== 'workflow') {
146
146
  uri = _index.default.get(agentM[byid], 'avatar_url') || acc.logo_url || require('../../assets/img/default_avatar.png');
147
147
  }
148
148
 
@@ -330,11 +330,10 @@ class Event extends _common.Com {
330
330
 
331
331
  let byid = _index.default.get(ev, 'by.display_id', _index.default.get(ev, 'by.id'));
332
332
 
333
- if (byid === 'system' || bytype === 'dummy') return 'system';
334
- let user = this.props.store.matchUser();
333
+ if (bytype === 'user') return _index.default.getUserDisplayName(this.props.store.matchUser());
335
334
  let acc = this.props.store.matchAccount();
336
- if (bytype === 'user') return _index.default.getUserDisplayName(user);
337
335
  if (bytype === 'agent') return _index.default.getAgentDisplayName(acc, this.props.store.matchAgent(byid));
336
+ if (byid === 'system' || bytype === 'dummy' || bytype === 'workflow') return acc.name || 'system';
338
337
  return '';
339
338
  }
340
339
 
@@ -100,19 +100,86 @@ class TextMessage extends _common.Com {
100
100
  }
101
101
 
102
102
  renderDelta() {
103
- let deltas = _index.default.get(this.props.ev, 'data.message.quill_delta');
103
+ let deltas = _index.default.get(this.props.ev, 'data.message.quill_delta') || _index.default.get(this.props.ev, 'data.message.text');
104
104
 
105
- deltas = _index.default.parseJSON(deltas) || {};
106
- deltas = deltas.ops || [];
105
+ let quilldeltas = _index.default.parseJSON(deltas) || {};
106
+ quilldeltas = trimQuillDelta(quilldeltas);
107
+ if (!quilldeltas || _index.default.size(quilldeltas.ops) === 0) return null;
107
108
 
108
- let isMarkdown = _index.default.find(deltas, delta => _index.default.get(delta, 'attributes.bold') || _index.default.get(delta, 'attributes.italic') || _index.default.get(delta, 'attributes.underline') || _index.default.get(delta, 'insert.emoji'));
109
+ let $deltas = _index.default.map(quilldeltas.ops, delta => {
110
+ let html = '';
111
+ let insert = delta.insert;
112
+ let attributes = delta.attributes;
109
113
 
110
- if (isMarkdown) {
111
- var text = deltaToMarkdown(deltas);
112
- return this.renderMarkdown(text);
114
+ if (insert.dynamicField) {
115
+ return _index.default.get(insert, 'dynamicField.text', '');
116
+ }
117
+
118
+ if (insert.mention) {
119
+ if (insert.mention.id == '*' || insert.mention.id == 'all') {
120
+ return (0, _preact.h)("span", {
121
+ class: "mention"
122
+ }, "@", this.$t('all'));
123
+ }
124
+
125
+ let ag = store.matchAgent(insert.mention.id);
126
+
127
+ let name = _index.default.getAgentDisplayName(ag, insert.mention.fullname);
128
+
129
+ return (0, _preact.h)("span", {
130
+ class: "mention",
131
+ "data-agent-id": ag.id,
132
+ "data-agent-fullname": name
133
+ }, "@", name);
134
+ }
135
+
136
+ if (insert.emoji) return (0, _preact.h)(_Emoji.default, {
137
+ emojiCode: `:${insert.emoji}:`
138
+ });
139
+
140
+ if (typeof insert === 'string') {
141
+ let $tags = _index.default.extractText(insert).map((tag, i) => {
142
+ if (tag.type === 'link') {
143
+ return (0, _preact.h)("a", {
144
+ href: absLink(tag.text),
145
+ target: "_blank"
146
+ }, tag.text);
147
+ }
148
+
149
+ return tag.text;
150
+ });
151
+
152
+ if (attributes) {
153
+ if (attributes.italic && attributes.bold) return (0, _preact.h)("span", {
154
+ style: "font-weight: bold; font-style: italic"
155
+ }, $tags);
156
+ if (attributes.italic) return (0, _preact.h)("span", {
157
+ style: "font-style: italic"
158
+ }, $tags);
159
+ if (attributes.bold) return (0, _preact.h)("span", {
160
+ style: "font-weight: bold"
161
+ }, $tags);
162
+ }
163
+
164
+ return (0, _preact.h)("span", null, $tags);
165
+ }
166
+
167
+ return null;
168
+ });
169
+
170
+ let byType = _index.default.get(this.ev, 'by.type');
171
+
172
+ if (_index.default.size($deltas) === 0) return null;
173
+
174
+ if (byType === 'agent') {
175
+ return (0, _preact.h)("div", {
176
+ class: "message-agent message-text--agent"
177
+ }, $deltas);
113
178
  }
114
179
 
115
- return this.renderPlainText();
180
+ return (0, _preact.h)("div", {
181
+ class: "message-user message-text--user"
182
+ }, $deltas);
116
183
  }
117
184
 
118
185
  renderMarkdown(text) {
@@ -187,4 +254,32 @@ const emojiCodes = {
187
254
  tired: '😩',
188
255
  surprised: '😮',
189
256
  wink: '😉'
190
- };
257
+ };
258
+
259
+ function trimQuillDelta(delta) {
260
+ if (!delta) return delta;
261
+ if (!delta.ops || !delta.ops.length) return delta;
262
+ let last = delta.ops[delta.ops.length - 1];
263
+ if (typeof last.insert != 'string') return delta;
264
+ let insert = last.insert.trim();
265
+
266
+ if (insert) {
267
+ if (last.insert != insert) {
268
+ let newops = delta.ops.slice();
269
+ let last = newops.pop();
270
+ last.insert = insert;
271
+ newops.push(last);
272
+ return {
273
+ ops: newops
274
+ };
275
+ }
276
+
277
+ return delta;
278
+ }
279
+
280
+ let newops = delta.ops.slice();
281
+ newops.pop();
282
+ return trimQuillDelta({
283
+ ops: newops
284
+ });
285
+ }
@@ -124,7 +124,7 @@ class Widget extends _common.Com {
124
124
  formData: {},
125
125
  showOrder: false,
126
126
  order_id: '',
127
- quickReplyMessage: ''
127
+ quickReplyMessage: {}
128
128
  });
129
129
  this.props.store.onUpdate(this, _ => this.forceUpdate());
130
130
  }
@@ -143,7 +143,7 @@ class Widget extends _common.Com {
143
143
  this.closeOrder();
144
144
  this.setState({
145
145
  clickedJoin: false,
146
- quickReplyMessage: ''
146
+ quickReplyMessage: {}
147
147
  });
148
148
  setTimeout(() => {
149
149
  this.events && this.events.focus();
@@ -279,11 +279,12 @@ class Widget extends _common.Com {
279
279
  fields: [{
280
280
  key: 'to_agent_group',
281
281
  value: _index.default.stringify(groupid)
282
- }]
282
+ }],
283
+ attachments: this.state.quickReplyMessage.attachments
283
284
  }
284
285
  });
285
286
  this.setState({
286
- quickReplyMessage: ''
287
+ quickReplyMessage: {}
287
288
  });
288
289
  if (form.end_conversation_after_submit) await this.props.store.endConvo(this.props.cid);
289
290
  return;
@@ -331,7 +332,7 @@ class Widget extends _common.Com {
331
332
  this.setState({
332
333
  creating: false,
333
334
  clickedJoin: false,
334
- quickReplyMessage: ''
335
+ quickReplyMessage: {}
335
336
  });
336
337
  if (!this.props.store.isMobile()) this.focusInput();
337
338
  }
@@ -343,7 +344,7 @@ class Widget extends _common.Com {
343
344
  is_required: true,
344
345
  label: this.props.t.i18n(_index.default.get(form, `i18n_question_label`, {})) || form.question_label,
345
346
  type: 'text',
346
- value: this.state.quickReplyMessage
347
+ value: this.state.quickReplyMessage.text
347
348
  };
348
349
  this.setState({
349
350
  formData
@@ -405,7 +406,7 @@ class Widget extends _common.Com {
405
406
  if (_index.default.size(this.state.formData) === 0) return null;
406
407
 
407
408
  let $fields = _index.default.map(this.state.formData, (field, key) => {
408
- if (this.state.quickReplyMessage && key === 'question') return null;
409
+ if (this.state.quickReplyMessage.text && key === 'question') return null;
409
410
  let $field = null;
410
411
  var errclass = field.error ? 'input--error' : '';
411
412
 
@@ -682,7 +683,7 @@ class Widget extends _common.Com {
682
683
 
683
684
  this.setState({
684
685
  formData,
685
- quickReplyMessage: message.text
686
+ quickReplyMessage: message
686
687
  });
687
688
  }
688
689
 
@@ -757,7 +758,7 @@ class Widget extends _common.Com {
757
758
  });
758
759
  this.setState({
759
760
  clickedJoin: true,
760
- quickReplyMessage: ''
761
+ quickReplyMessage: {}
761
762
  });
762
763
  }
763
764
 
@@ -785,7 +786,7 @@ class Widget extends _common.Com {
785
786
  let convo = this.props.store.matchConvo(this.props.cid) || {};
786
787
  if (convo.state === 'ended') return true;
787
788
  if (convo.state && convo.state !== 'pending') delete formData.group;
788
- return !!_index.default.find(formData, field => field.value == null || field.value === '');
789
+ return !!_index.default.find(formData, field => field.is_required && (field.value == null || field.value === ''));
789
790
  }
790
791
 
791
792
  renderConvoSummary(convo) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.89",
3
+ "version": "4.0.90",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -14,7 +14,7 @@
14
14
  "@subiz/storage": "0.0.8",
15
15
  "@subiz/wsclient": "^3.1.7",
16
16
  "cookie_js": "1.4.2",
17
- "core-js": "^3.25.1",
17
+ "core-js": "^3.25.2",
18
18
  "css-loader": "5.2.7",
19
19
  "file-loader": "^6.2.0",
20
20
  "less": "^4.1.3",
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "devDependencies": {
26
26
  "@babel/cli": "^7.18.10",
27
- "@babel/core": "^7.19.0",
27
+ "@babel/core": "^7.19.1",
28
28
  "@babel/plugin-proposal-class-properties": "^7.18.6",
29
29
  "@babel/plugin-transform-react-jsx": "^7.19.0",
30
- "@babel/preset-env": "^7.19.0",
30
+ "@babel/preset-env": "^7.19.1",
31
31
  "babel-loader": "^8.2.5",
32
32
  "babel-plugin-syntax-jsx": "^6.18.0",
33
33
  "html-webpack-plugin": "^5.5.0",
@@ -36,6 +36,6 @@
36
36
  "webpack": "^5.74.0",
37
37
  "webpack-bundle-analyzer": "^4.6.1",
38
38
  "webpack-cli": "^4.10.0",
39
- "webpack-dev-server": "^4.11.0"
39
+ "webpack-dev-server": "^4.11.1"
40
40
  }
41
41
  }
@@ -101,7 +101,7 @@ export default class Event extends Com {
101
101
 
102
102
  let agentM = this.props.store.matchAgent('*')
103
103
  // should replace with subiz logo
104
- if (byid !== 'system' || bytype !== 'dummy') {
104
+ if (byid !== 'system' && bytype !== 'dummy' && bytype !== 'workflow') {
105
105
  uri = sb.get(agentM[byid], 'avatar_url') || acc.logo_url || require('../../assets/img/default_avatar.png')
106
106
  }
107
107
 
@@ -227,11 +227,10 @@ export default class Event extends Com {
227
227
  getSenderName(ev) {
228
228
  let bytype = sb.get(ev, 'by.type')
229
229
  let byid = sb.get(ev, 'by.display_id', sb.get(ev, 'by.id'))
230
- if (byid === 'system' || bytype === 'dummy') return 'system'
231
- let user = this.props.store.matchUser()
230
+ if (bytype === 'user') return sb.getUserDisplayName(this.props.store.matchUser())
232
231
  let acc = this.props.store.matchAccount()
233
- if (bytype === 'user') return sb.getUserDisplayName(user)
234
232
  if (bytype === 'agent') return sb.getAgentDisplayName(acc, this.props.store.matchAgent(byid))
233
+ if (byid === 'system' || bytype === 'dummy' || bytype === 'workflow') return acc.name || 'system'
235
234
  return ''
236
235
  }
237
236
  }
@@ -65,22 +65,61 @@ export default class TextMessage extends Com {
65
65
  }
66
66
 
67
67
  renderDelta() {
68
- let deltas = sb.get(this.props.ev, 'data.message.quill_delta')
69
- deltas = sb.parseJSON(deltas) || {}
70
- deltas = deltas.ops || []
71
- let isMarkdown = sb.find(
72
- deltas,
73
- (delta) =>
74
- sb.get(delta, 'attributes.bold') ||
75
- sb.get(delta, 'attributes.italic') ||
76
- sb.get(delta, 'attributes.underline') ||
77
- sb.get(delta, 'insert.emoji'),
78
- )
79
- if (isMarkdown) {
80
- var text = deltaToMarkdown(deltas)
81
- return this.renderMarkdown(text)
68
+ let deltas = sb.get(this.props.ev, 'data.message.quill_delta') || sb.get(this.props.ev, 'data.message.text')
69
+ let quilldeltas = sb.parseJSON(deltas) || {}
70
+ // deltas = deltas.ops || []
71
+ quilldeltas = trimQuillDelta(quilldeltas)
72
+ if (!quilldeltas || sb.size(quilldeltas.ops) === 0) return null
73
+ let $deltas = sb.map(quilldeltas.ops, (delta) => {
74
+ let html = ''
75
+ let insert = delta.insert
76
+ let attributes = delta.attributes
77
+
78
+ if (insert.dynamicField) {
79
+ return sb.get(insert, 'dynamicField.text', '')
80
+ }
81
+ if (insert.mention) {
82
+ if (insert.mention.id == '*' || insert.mention.id == 'all') {
83
+ return <span class='mention'>@{this.$t('all')}</span>
84
+ }
85
+
86
+ let ag = store.matchAgent(insert.mention.id)
87
+ let name = sb.getAgentDisplayName(ag, insert.mention.fullname)
88
+ return (
89
+ <span class='mention' data-agent-id={ag.id} data-agent-fullname={name}>
90
+ @{name}
91
+ </span>
92
+ )
93
+ }
94
+ if (insert.emoji) return <Emoji emojiCode={`:${insert.emoji}:`} />
95
+ if (typeof insert === 'string') {
96
+ let $tags = sb.extractText(insert).map((tag, i) => {
97
+ if (tag.type === 'link') {
98
+ return (
99
+ <a href={absLink(tag.text)} target='_blank'>
100
+ {tag.text}
101
+ </a>
102
+ )
103
+ }
104
+ return tag.text
105
+ })
106
+
107
+ if (attributes) {
108
+ if (attributes.italic && attributes.bold)
109
+ return <span style='font-weight: bold; font-style: italic'>{$tags}</span>
110
+ if (attributes.italic) return <span style='font-style: italic'>{$tags}</span>
111
+ if (attributes.bold) return <span style='font-weight: bold'>{$tags}</span>
112
+ }
113
+ return <span>{$tags}</span>
114
+ }
115
+ return null
116
+ })
117
+ let byType = sb.get(this.ev, 'by.type')
118
+ if (sb.size($deltas) === 0) return null
119
+ if (byType === 'agent') {
120
+ return <div class='message-agent message-text--agent'>{$deltas}</div>
82
121
  }
83
- return this.renderPlainText()
122
+ return <div class='message-user message-text--user'>{$deltas}</div>
84
123
  }
85
124
 
86
125
  renderMarkdown(text) {
@@ -154,3 +193,31 @@ const emojiCodes = {
154
193
  surprised: '😮',
155
194
  wink: '😉',
156
195
  }
196
+
197
+ function trimQuillDelta(delta) {
198
+ if (!delta) return delta
199
+ if (!delta.ops || !delta.ops.length) return delta
200
+ let last = delta.ops[delta.ops.length - 1]
201
+ if (typeof last.insert != 'string') return delta
202
+
203
+ let insert = last.insert.trim()
204
+ if (insert) {
205
+ if (last.insert != insert) {
206
+ // just fix the last item
207
+ let newops = delta.ops.slice()
208
+ // let last = sb.cloneDeep(newops.pop())
209
+ let last = newops.pop()
210
+ last.insert = insert
211
+ newops.push(last)
212
+ return {ops: newops}
213
+ }
214
+
215
+ // last item dont change, do nothing
216
+ return delta
217
+ }
218
+
219
+ // remove the last item
220
+ let newops = delta.ops.slice()
221
+ newops.pop()
222
+ return trimQuillDelta({ops: newops})
223
+ }
@@ -32,7 +32,7 @@ export default class Widget extends Com {
32
32
  showOrder: false,
33
33
  order_id: '',
34
34
  // hot fix for prechat with bot quick reply
35
- quickReplyMessage: '',
35
+ quickReplyMessage: {},
36
36
  })
37
37
 
38
38
  this.props.store.onUpdate(this, (_) => this.forceUpdate())
@@ -51,7 +51,7 @@ export default class Widget extends Com {
51
51
 
52
52
  if (prevProp.cid !== this.props.cid) {
53
53
  this.closeOrder()
54
- this.setState({clickedJoin: false, quickReplyMessage: ''})
54
+ this.setState({clickedJoin: false, quickReplyMessage: {}})
55
55
  // this.props.store.setLastview('chat', { cid: this.props.cid })
56
56
  setTimeout(() => {
57
57
  // focus Events then focus MessageInput
@@ -188,11 +188,12 @@ export default class Widget extends Com {
188
188
  text: firstmsg,
189
189
  format: 'plaintext',
190
190
  fields: [{key: 'to_agent_group', value: sb.stringify(groupid)}],
191
+ attachments: this.state.quickReplyMessage.attachments,
191
192
  },
192
193
  })
193
194
 
194
195
  // reset quickReplyMessage
195
- this.setState({quickReplyMessage: ''})
196
+ this.setState({quickReplyMessage: {}})
196
197
 
197
198
  // end_conversation_after_submit only for offline form or prechat form
198
199
  if (form.end_conversation_after_submit) await this.props.store.endConvo(this.props.cid)
@@ -218,7 +219,7 @@ export default class Widget extends Com {
218
219
  this.setState({
219
220
  creating: false,
220
221
  clickedJoin: false,
221
- quickReplyMessage: '',
222
+ quickReplyMessage: {},
222
223
  })
223
224
  if (!this.props.store.isMobile()) this.focusInput()
224
225
  }
@@ -231,7 +232,7 @@ export default class Widget extends Com {
231
232
  is_required: true,
232
233
  label: this.props.t.i18n(sb.get(form, `i18n_question_label`, {})) || form.question_label,
233
234
  type: 'text',
234
- value: this.state.quickReplyMessage,
235
+ value: this.state.quickReplyMessage.text,
235
236
  }
236
237
 
237
238
  this.setState({formData})
@@ -281,7 +282,7 @@ export default class Widget extends Com {
281
282
 
282
283
  let $fields = sb.map(this.state.formData, (field, key) => {
283
284
  // not display question when click bot quick reply
284
- if (this.state.quickReplyMessage && key === 'question') return null
285
+ if (this.state.quickReplyMessage.text && key === 'question') return null
285
286
 
286
287
  let $field = null
287
288
  var errclass = field.error ? 'input--error' : ''
@@ -552,7 +553,7 @@ export default class Widget extends Com {
552
553
  if (formData) {
553
554
  sb.set(formData, 'question.value', message.text)
554
555
  }
555
- this.setState({formData, quickReplyMessage: message.text})
556
+ this.setState({formData, quickReplyMessage: message})
556
557
  }
557
558
 
558
559
  sendMessage = async (message) => {
@@ -673,7 +674,7 @@ export default class Widget extends Com {
673
674
  async onStartConvoClick() {
674
675
  var convo = this.props.store.matchConvo(this.props.cid) || {}
675
676
  if (convo.state === 'ended') return this.props.onGo({view: 'chat', cid: ''})
676
- this.setState({clickedJoin: true, quickReplyMessage: ''})
677
+ this.setState({clickedJoin: true, quickReplyMessage: {}})
677
678
  }
678
679
 
679
680
  onEventFormSubmit() {
@@ -716,7 +717,7 @@ export default class Widget extends Com {
716
717
  // allow button "Tiep tuc chat" display when sent quick_replies msg
717
718
  //if (this.userHasSent(this.props.cid)) return false
718
719
  if (convo.state && convo.state !== 'pending') delete formData.group
719
- return !!sb.find(formData, (field) => field.value == null || field.value === '')
720
+ return !!sb.find(formData, (field) => field.is_required && (field.value == null || field.value === ''))
720
721
  }
721
722
 
722
723
  renderConvoSummary(convo) {