@subiz/widget-v4 4.1.92 → 4.1.94

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 (107) hide show
  1. package/compiled_src/bot.js +1 -0
  2. package/compiled_src/chatbox/ChatButton.js +3 -1
  3. package/compiled_src/chatbox/Rating.js +17 -5
  4. package/compiled_src/chatbox/Widget.js +2 -2
  5. package/compiled_src/lib.js +3 -0
  6. package/compiled_src/store/api.js +3 -3
  7. package/compiled_src/store/store.js +7 -0
  8. package/dist/127.js +273 -0
  9. package/dist/132.js +2796 -0
  10. package/dist/185.js +1885 -0
  11. package/dist/1919d7c8739.127.js +1 -0
  12. package/dist/1919d7c8739.132.js +1 -0
  13. package/dist/1919d7c8739.185.js +1 -0
  14. package/dist/1919d7c8739.27.js +1 -0
  15. package/dist/1919d7c8739.278.js +1 -0
  16. package/dist/1919d7c8739.459.js +1 -0
  17. package/dist/1919d7c8739.490.js +1 -0
  18. package/dist/1919d7c8739.74.js +1 -0
  19. package/dist/1919d7c8739.997.js +1 -0
  20. package/dist/1919d7c8739.app.js +1 -0
  21. package/dist/1919d7c8739.index.html +57 -0
  22. package/dist/1919d7c8739.library.html +57 -0
  23. package/dist/1919d7c8739.library.js +1 -0
  24. package/dist/1919d7c8739.preview.html +759 -0
  25. package/dist/1919d7c8739.preview.js +1 -0
  26. package/dist/1919d7c8739.screenshoot.js +1 -0
  27. package/dist/1919d7c8739.webview.js +1 -0
  28. package/dist/27.js +107 -0
  29. package/dist/278.js +406 -0
  30. package/dist/459.js +107 -0
  31. package/dist/490.js +305 -0
  32. package/dist/74.js +372 -0
  33. package/dist/997.js +107 -0
  34. package/dist/HASH +1 -0
  35. package/dist/assets/img/Facebook.64607ec.png +0 -0
  36. package/dist/assets/img/Zalo.6845707.png +0 -0
  37. package/dist/assets/img/award1a.1a58e10.png +0 -0
  38. package/dist/assets/img/award3a.3b74423.png +0 -0
  39. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  40. package/dist/assets/img/award5.39eb7ae.png +0 -0
  41. package/dist/assets/img/bubble_default.7d5e4ab.svg +20 -0
  42. package/dist/assets/img/caret.998eb8f.svg +1 -0
  43. package/dist/assets/img/convos_empty.2353007.svg +72 -0
  44. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  45. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  46. package/dist/assets/img/done_gray.d7e8203.svg +4 -0
  47. package/dist/assets/img/done_green.b817fd4.svg +4 -0
  48. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  49. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  50. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  51. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  52. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  53. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  54. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  55. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  56. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  57. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  58. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  59. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  60. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  61. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  62. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  63. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  64. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  65. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  66. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  67. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  68. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  69. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  70. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  71. package/dist/assets/img/empty.29bed2d.svg +23 -0
  72. package/dist/assets/img/empty_1.0b98af0.svg +11 -0
  73. package/dist/assets/img/examplte_logo.f86535f.svg +1 -0
  74. package/dist/assets/img/external-link.90577cc.svg +1 -0
  75. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  76. package/dist/assets/img/ghn.070f8e3.svg +17 -0
  77. package/dist/assets/img/ghtk.326eac1.svg +18 -0
  78. package/dist/assets/img/image_default.be0698b.png +0 -0
  79. package/dist/assets/img/info.ebce7ea.svg +1 -0
  80. package/dist/assets/img/loader.37000a7.svg +1 -0
  81. package/dist/assets/img/loading_static.a27f0ac.svg +10 -0
  82. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  83. package/dist/assets/img/main-service2.9b99549.png +0 -0
  84. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  85. package/dist/assets/img/package.8d37d0f.svg +5 -0
  86. package/dist/assets/img/package_fade.763c001.svg +1 -0
  87. package/dist/assets/img/rating--average.1ea492c.svg +12 -0
  88. package/dist/assets/img/rating--great.e3d712e.svg +16 -0
  89. package/dist/assets/img/rating--poor.2938a25.svg +12 -0
  90. package/dist/assets/img/search.f9705ff.svg +1 -0
  91. package/dist/assets/img/send.6db52a9.svg +3 -0
  92. package/dist/assets/img/shop.f7dc7d8.svg +1 -0
  93. package/dist/assets/img/shop_faded.df7845a.svg +1 -0
  94. package/dist/assets/img/subiz-mono.877e9f5.svg +3 -0
  95. package/dist/assets/img/x.26fdfa3.svg +5 -0
  96. package/dist/malicious-app.js +15 -0
  97. package/dist/screenshoot.html +7 -0
  98. package/dist/screenshoot.js +10660 -0
  99. package/index.html +25 -1
  100. package/package.json +5 -5
  101. package/src/bot.js +2 -1
  102. package/src/chatbox/ChatButton.js +5 -1
  103. package/src/chatbox/Rating.js +17 -5
  104. package/src/chatbox/Widget.js +6 -2
  105. package/src/lib.js +4 -0
  106. package/src/store/api.js +23 -15
  107. package/src/store/store.js +10 -0
package/index.html CHANGED
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta name="description" content="Subiz preview" />
@@ -46,6 +46,30 @@
46
46
  button.id = 'test2'
47
47
  document.body.appendChild(button)
48
48
  }, 2000)
49
+
50
+ setTimeout(function () {
51
+ // only run when url contain ?bot=greeting
52
+ var urlParams = new URLSearchParams(window.location.search)
53
+ const greeting = urlParams.get('bot')
54
+ if (greeting !== 'greeting') return
55
+
56
+ let botid = '<botid>' ////////////////////// replace your bot id here. eg: bbrtilgagvnoehvpzg
57
+
58
+ // dont allow other bots to run
59
+ subiz('shrinkWidget')
60
+ subiz('stopAutobot')
61
+
62
+ subiz('waitReady', function () {
63
+ let kk = subiz('startConvo', {
64
+ initial_by: botid,
65
+ state: 'active',
66
+ members: [{id: botid, type: 'bot'}],
67
+ }).then(function (out) {
68
+ if (!out || !out.convo || !out.convo.id) return
69
+ subiz('showWidget', 'chat', out.convo.id)
70
+ })
71
+ })
72
+ })
49
73
  </script>
50
74
  </body>
51
75
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.1.92",
3
+ "version": "4.1.94",
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": "^4.0.27",
16
16
  "cookie_js": "1.4.2",
17
- "core-js": "^3.37.1",
17
+ "core-js": "^3.38.1",
18
18
  "css-loader": "5.2.7",
19
19
  "file-loader": "^6.2.0",
20
20
  "less": "^4.2.0",
@@ -26,12 +26,12 @@
26
26
  "@babel/core": "^7.25.2",
27
27
  "@babel/plugin-proposal-class-properties": "^7.18.6",
28
28
  "@babel/plugin-transform-react-jsx": "^7.25.2",
29
- "@babel/preset-env": "^7.25.2",
29
+ "@babel/preset-env": "^7.25.4",
30
30
  "babel-loader": "^9.1.3",
31
31
  "babel-plugin-syntax-jsx": "^6.18.0",
32
32
  "html-webpack-plugin": "^5.6.0",
33
- "puppeteer": "^22.14.0",
34
- "webpack": "^5.93.0",
33
+ "puppeteer": "^23.2.1",
34
+ "webpack": "^5.94.0",
35
35
  "webpack-bundle-analyzer": "^4.10.2",
36
36
  "webpack-cli": "^5.1.4",
37
37
  "webpack-dev-server": "^5.0.4"
package/src/bot.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import sb from './util/index.js'
2
2
  import * as common from './common.js'
3
3
 
4
- export default function(store) {
4
+ export default function (store) {
5
+ if (!store.matchAutoStartBot()) return
5
6
  let botM = store.matchBot()
6
7
  if (Object.keys(botM).length === 0) return
7
8
  sb.each(botM, (bot) => {
@@ -183,7 +183,11 @@ export default class ChatButton extends Com {
183
183
  let account = this.props.store.matchAccount()
184
184
  let accountSetting = this.props.plugin.chatbox
185
185
  let byid = sb.get(this.state.previewEvent, 'by.display_id', sb.get(this.state.previewEvent, 'by.id'))
186
- let agent = sb.cloneDeep(this.props.store.matchAgent(byid)) || {}
186
+ // let agent = sb.cloneDeep(this.props.store.matchAgent(byid)) || {}
187
+ // somehow store.matchAgent(id) return undefined so we try to backup with store.matchAgent('*')[id]
188
+ let agent = this.props.store.matchAgent(byid)
189
+ if (!agent) agent = this.props.store.matchAgent('*')[byid] || {}
190
+ agent = sb.cloneDeep(agent)
187
191
  agent.fullname = agent.fullname || sb.get(account, 'name') || this.props.t('agent')
188
192
  agent.avatar_url = agent.avatar_url || defaultAvatar
189
193
  let position = sb.get(accountSetting, 'desktop_button.position') || 'right'
@@ -5,6 +5,7 @@ import ReleaseAnimation from './releaseAnimation.js'
5
5
  const POPUP_MAX_HEIGHT = 400
6
6
  const POPUP_HARD_MAX_HEIGHT = 500
7
7
  const POPUP_MIN_HEIGHT = 0
8
+ const RATING_EXPIRED_TIME = 15 * 60_000
8
9
 
9
10
  import {Com} from '../common.js'
10
11
  import {h, createRef} from 'preact'
@@ -112,16 +113,20 @@ export default class Rating extends Com {
112
113
  shoudDisplay() {
113
114
  if (!this.props.cid) return false
114
115
 
115
- var requested
116
- var rated
117
- var ended
116
+ let requested
117
+ let rated
118
+ let ended
119
+ let lastMessageSentAt = 0
118
120
 
119
121
  let user = this.props.store.matchUser()
120
122
  // user must send message
121
123
  let foundUser = false
122
124
  sb.map(this.props.store.listEvents(this.props.cid), (ev) => {
123
125
  if (!ev || !ev.by) return
124
- if (ev.by.type == 'user' && ev.type == 'message_sent') foundUser = true
126
+ if (ev.type === 'message_sent') {
127
+ if (sb.get(ev, 'by.type') === 'user') foundUser = true
128
+ if (ev.created > lastMessageSentAt) lastMessageSentAt = ev.created
129
+ }
125
130
  if (ev.type === 'conversation_state_updated' && sb.get(ev, 'data.conversation.state') === 'ended') {
126
131
  ended = ev
127
132
  }
@@ -131,7 +136,14 @@ export default class Rating extends Com {
131
136
  if (!foundUser) return false
132
137
  if (rated) return false
133
138
  let accountSetting = this.props.plugin.chatbox
134
- var auto = accountSetting.auto_request_rating && ended
139
+ let auto = accountSetting.auto_request_rating && ended
140
+ if (auto) {
141
+ if (lastMessageSentAt) {
142
+ auto = auto && Date.now() - lastMessageSentAt < RATING_EXPIRED_TIME
143
+ } else {
144
+ auto = false
145
+ }
146
+ }
135
147
  return requested || auto
136
148
  }
137
149
 
@@ -636,7 +636,9 @@ export default class Widget extends Com {
636
636
 
637
637
  var $convos = sb.map(convos, (convo) => {
638
638
  let ags = sb.filter(convo.members, (m) => {
639
- return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active'
639
+ //return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active'
640
+ // somehow bot send greeting but membership is observer
641
+ return m.type === 'agent' || m.type === 'bot'
640
642
  })
641
643
  let agentids = sb.map(ags, (m) => m.id)
642
644
  agentids = agentids || sb.agentsOfConvo(convo)[0]
@@ -929,7 +931,9 @@ export default class Widget extends Com {
929
931
  let agentM = this.props.store.matchAgent('*')
930
932
 
931
933
  let ags = sb.filter(convo.members, (m) => {
932
- return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active'
934
+ //return (m.type === 'agent' || m.type === 'bot') && m.membership === 'active'
935
+ // somehow bot send greeting but membership is observer
936
+ return m.type === 'agent' || m.type === 'bot'
933
937
  })
934
938
  let agentids = sb.map(ags, (m) => m.id)
935
939
  agentids = agentids || sb.agentsOfConvo(convo)[0]
package/src/lib.js CHANGED
@@ -306,6 +306,10 @@ class Widget {
306
306
  this.pluginMgr.showCurrentGreeting()
307
307
  }
308
308
  }
309
+
310
+ stopAutobot() {
311
+ this.store.doNotStartBot()
312
+ }
309
313
  }
310
314
 
311
315
  // for debugging purpose
package/src/store/api.js CHANGED
@@ -209,7 +209,10 @@ export default class {
209
209
  return this.apireq.post(`/accounts/${this.accid}/conversations`, data)
210
210
  }
211
211
 
212
- sendConvoEvent = (cid, ev) => this.apireq.post(`/accounts/${this.accid}/conversations/${cid}/events`, ev)
212
+ sendConvoEvent = (cid, ev) =>
213
+ this.apireq
214
+ .addQuery('x-referer', sb.get(location, 'origin', ''))
215
+ .post(`/accounts/${this.accid}/conversations/${cid}/events`, ev)
213
216
  createPostback = (cid, p) => this.apireq.post(`/accounts/${this.accid}/conversations/${cid}/postbacks`, p)
214
217
  markAsReceived = (cid, messageId) =>
215
218
  this.apireq.post(`/accounts/${this.accid}/conversations/${cid}/messages/${messageId}/receive`)
@@ -219,23 +222,28 @@ export default class {
219
222
  getConversation = (cid) => this.apireq.get(`/accounts/${this.accid}/conversations/${cid}`)
220
223
  getLocaleContent = (locale) => this.apireq.get(`/accounts/${this.accid}/locales/${locale}`)
221
224
  sendEvent = (data) =>
222
- this.apireq.addQuery('shorten', true).post(`/accounts/${this.accid}/users/${this.uid}/events`, data)
225
+ this.apireq
226
+ .addQuery('shorten', true)
227
+ .addQuery('x-referer', sb.get(location, 'origin', ''))
228
+ .post(`/accounts/${this.accid}/users/${this.uid}/events`, data)
223
229
 
224
230
  submitForm = (form_id, page_url, device, data, user) =>
225
- this.apireq.post(`/accounts/${this.accid}/users/${this.uid}/events`, {
226
- by: {id: this.uid, device: device},
227
- type: 'form_submitted',
228
- data: {
229
- user: user,
230
- form_submission: {
231
- user_id: this.uid,
232
- form_id: form_id,
233
- page_url: page_url,
234
- submitted_at: sb.Date.now(),
235
- values: data,
231
+ this.apireq
232
+ .addQuery('x-referer', sb.get(location, 'origin', ''))
233
+ .post(`/accounts/${this.accid}/users/${this.uid}/events`, {
234
+ by: {id: this.uid, device: device},
235
+ type: 'form_submitted',
236
+ data: {
237
+ user: user,
238
+ form_submission: {
239
+ user_id: this.uid,
240
+ form_id: form_id,
241
+ page_url: page_url,
242
+ submitted_at: sb.Date.now(),
243
+ values: data,
244
+ },
236
245
  },
237
- },
238
- })
246
+ })
239
247
 
240
248
  sendTyping = (cid) => this.apireq.post(`/accounts/${this.accid}/conversations/${cid}/typing`)
241
249
 
@@ -69,6 +69,16 @@ export default class Store {
69
69
  })
70
70
  window.addEventListener('beforeunload', () => this.api.sendLostFocus())
71
71
 
72
+ this.doNotStartBot = () => {
73
+ this._donotstartbot = true
74
+ }
75
+
76
+ this.autoStartBot = () => {
77
+ this._donotstartbot = false
78
+ }
79
+
80
+ this.matchAutoStartBot = () => !this._donotstartbot
81
+
72
82
  // faster send rate when has focus
73
83
  this._presenceInterval1 = sb.setInterval(() => {
74
84
  if (this._die) return sb.clearInterval(this._presenceInterval1)