@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.
- package/compiled_src/chatbox/Event.js +3 -4
- package/compiled_src/chatbox/TextMessage.js +104 -9
- package/compiled_src/chatbox/Widget.js +11 -10
- package/package.json +5 -5
- package/src/chatbox/Event.js +3 -4
- package/src/chatbox/TextMessage.js +82 -15
- package/src/chatbox/Widget.js +10 -9
- package/dist/132.js +0 -6995
- package/dist/178.js +0 -406
- package/dist/1833a09e682.132.js +0 -1
- package/dist/1833a09e682.178.js +0 -1
- package/dist/1833a09e682.213.js +0 -1
- package/dist/1833a09e682.335.js +0 -1
- package/dist/1833a09e682.362.js +0 -1
- package/dist/1833a09e682.441.js +0 -1
- package/dist/1833a09e682.605.js +0 -1
- package/dist/1833a09e682.678.js +0 -1
- package/dist/1833a09e682.782.js +0 -1
- package/dist/1833a09e682.app.js +0 -1
- package/dist/1833a09e682.index.html +0 -26
- package/dist/1833a09e682.library.html +0 -26
- package/dist/1833a09e682.library.js +0 -1
- package/dist/1833a09e682.preview.html +0 -759
- package/dist/1833a09e682.preview.js +0 -1
- package/dist/1833a09e682.screenshoot.js +0 -1
- package/dist/213.js +0 -3215
- package/dist/335.js +0 -411
- package/dist/362.js +0 -107
- package/dist/441.js +0 -2834
- package/dist/605.js +0 -328
- package/dist/678.js +0 -107
- package/dist/782.js +0 -107
- package/dist/HASH +0 -1
- package/dist/assets/img/Facebook.64607ec.png +0 -0
- package/dist/assets/img/Zalo.6845707.png +0 -0
- package/dist/assets/img/award1a.1a58e10.png +0 -0
- package/dist/assets/img/award3a.3b74423.png +0 -0
- package/dist/assets/img/award4a.ed6ccd4.png +0 -0
- package/dist/assets/img/award5.39eb7ae.png +0 -0
- package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
- package/dist/assets/img/caret.998eb8f.svg +0 -1
- package/dist/assets/img/convos_empty.2353007.svg +0 -72
- package/dist/assets/img/default.06e6ee0.jpg +0 -0
- package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
- package/dist/assets/img/done_gray.d7e8203.svg +0 -4
- package/dist/assets/img/done_green.b817fd4.svg +0 -4
- package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
- package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
- package/dist/assets/img/empty.29bed2d.svg +0 -23
- package/dist/assets/img/empty_1.0b98af0.svg +0 -11
- package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
- package/dist/assets/img/external-link.90577cc.svg +0 -1
- package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
- package/dist/assets/img/ghn.070f8e3.svg +0 -17
- package/dist/assets/img/ghtk.326eac1.svg +0 -18
- package/dist/assets/img/image_default.be0698b.png +0 -0
- package/dist/assets/img/info.ebce7ea.svg +0 -1
- package/dist/assets/img/loader.37000a7.svg +0 -1
- package/dist/assets/img/loading_static.8f403ae.svg +0 -10
- package/dist/assets/img/main-service1.d536cc2.png +0 -0
- package/dist/assets/img/main-service2.9b99549.png +0 -0
- package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
- package/dist/assets/img/package.8d37d0f.svg +0 -5
- package/dist/assets/img/package_fade.763c001.svg +0 -1
- package/dist/assets/img/rating--average.1ea492c.svg +0 -12
- package/dist/assets/img/rating--great.e3d712e.svg +0 -16
- package/dist/assets/img/rating--poor.2938a25.svg +0 -12
- package/dist/assets/img/search.f9705ff.svg +0 -1
- package/dist/assets/img/send.6db52a9.svg +0 -3
- package/dist/assets/img/shop.f7dc7d8.svg +0 -1
- package/dist/assets/img/shop_faded.df7845a.svg +0 -1
- package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
- package/dist/assets/img/x.26fdfa3.svg +0 -5
- package/dist/malicious-app.js +0 -13
- package/dist/screenshoot.html +0 -7
- 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'
|
|
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 (
|
|
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
|
-
|
|
106
|
-
|
|
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
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
39
|
+
"webpack-dev-server": "^4.11.1"
|
|
40
40
|
}
|
|
41
41
|
}
|
package/src/chatbox/Event.js
CHANGED
|
@@ -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'
|
|
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 (
|
|
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
|
-
|
|
70
|
-
deltas = deltas.ops || []
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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
|
+
}
|
package/src/chatbox/Widget.js
CHANGED
|
@@ -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
|
|
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) {
|