@subiz/widget-v4 4.1.185 → 4.1.187

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 (117) hide show
  1. package/assets/less/chatbox.less +1 -0
  2. package/assets/less/message.less +20 -0
  3. package/assets/less/widget.less +50 -13
  4. package/compiled_src/bot.js +1 -1
  5. package/compiled_src/chatbox/ChatButton.js +15 -9
  6. package/compiled_src/chatbox/TextMessage.js +3 -0
  7. package/compiled_src/chatbox/block.js +1 -0
  8. package/compiled_src/chatbox/main.js +2 -0
  9. package/compiled_src/store/store.js +8 -1
  10. package/compiled_src/util/common.js +1 -0
  11. package/compiled_src/util/index.js +1 -0
  12. package/compiled_src/util/op.js +9 -0
  13. package/dist/127.js +273 -0
  14. package/dist/132.js +2802 -0
  15. package/dist/185.js +1827 -0
  16. package/dist/19a00a03cb8.127.js +1 -0
  17. package/dist/19a00a03cb8.132.js +1 -0
  18. package/dist/19a00a03cb8.185.js +1 -0
  19. package/dist/19a00a03cb8.27.js +1 -0
  20. package/dist/19a00a03cb8.278.js +1 -0
  21. package/dist/19a00a03cb8.339.js +1 -0
  22. package/dist/19a00a03cb8.459.js +1 -0
  23. package/dist/19a00a03cb8.490.js +1 -0
  24. package/dist/19a00a03cb8.74.js +1 -0
  25. package/dist/19a00a03cb8.997.js +1 -0
  26. package/dist/19a00a03cb8.app.js +1 -0
  27. package/dist/19a00a03cb8.chat.html +1 -0
  28. package/dist/19a00a03cb8.chat.js +1 -0
  29. package/dist/19a00a03cb8.form.html +1 -0
  30. package/dist/19a00a03cb8.form.js +1 -0
  31. package/dist/19a00a03cb8.index.html +72 -0
  32. package/dist/19a00a03cb8.library.html +72 -0
  33. package/dist/19a00a03cb8.library.js +1 -0
  34. package/dist/19a00a03cb8.preview.html +759 -0
  35. package/dist/19a00a03cb8.preview.js +1 -0
  36. package/dist/19a00a03cb8.webview.js +1 -0
  37. package/dist/27.js +35 -0
  38. package/dist/459.js +35 -0
  39. package/dist/490.js +305 -0
  40. package/dist/74.js +372 -0
  41. package/dist/997.js +35 -0
  42. package/dist/HASH +1 -0
  43. package/dist/assets/img/Facebook.64607ec.png +0 -0
  44. package/dist/assets/img/Zalo.6845707.png +0 -0
  45. package/dist/assets/img/award1a.1a58e10.png +0 -0
  46. package/dist/assets/img/award3a.3b74423.png +0 -0
  47. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  48. package/dist/assets/img/award5.39eb7ae.png +0 -0
  49. package/dist/assets/img/bubble_default.7d5e4ab.svg +20 -0
  50. package/dist/assets/img/caret.998eb8f.svg +1 -0
  51. package/dist/assets/img/convos_empty.2353007.svg +72 -0
  52. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  53. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  54. package/dist/assets/img/done_gray.d7e8203.svg +4 -0
  55. package/dist/assets/img/done_green.b817fd4.svg +4 -0
  56. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  57. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  58. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  59. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  60. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  61. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  62. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  63. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  64. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  65. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  66. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  67. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  68. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  69. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  70. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  71. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  72. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  73. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  74. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  75. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  76. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  77. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  78. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  79. package/dist/assets/img/empty.29bed2d.svg +23 -0
  80. package/dist/assets/img/empty_1.0b98af0.svg +11 -0
  81. package/dist/assets/img/examplte_logo.f86535f.svg +1 -0
  82. package/dist/assets/img/external-link.90577cc.svg +1 -0
  83. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  84. package/dist/assets/img/ghn.070f8e3.svg +17 -0
  85. package/dist/assets/img/ghtk.326eac1.svg +18 -0
  86. package/dist/assets/img/image_default.be0698b.png +0 -0
  87. package/dist/assets/img/info.ebce7ea.svg +1 -0
  88. package/dist/assets/img/loader.37000a7.svg +1 -0
  89. package/dist/assets/img/loading_static.a27f0ac.svg +10 -0
  90. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  91. package/dist/assets/img/main-service2.9b99549.png +0 -0
  92. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  93. package/dist/assets/img/package.8d37d0f.svg +5 -0
  94. package/dist/assets/img/package_fade.763c001.svg +1 -0
  95. package/dist/assets/img/rating--average.1ea492c.svg +12 -0
  96. package/dist/assets/img/rating--great.e3d712e.svg +16 -0
  97. package/dist/assets/img/rating--poor.2938a25.svg +12 -0
  98. package/dist/assets/img/search.f9705ff.svg +1 -0
  99. package/dist/assets/img/send.6db52a9.svg +3 -0
  100. package/dist/assets/img/shop.f7dc7d8.svg +1 -0
  101. package/dist/assets/img/shop_faded.df7845a.svg +1 -0
  102. package/dist/assets/img/stars_v2.79cf728.png +0 -0
  103. package/dist/assets/img/subiz-mono.8fbc067.svg +3 -0
  104. package/dist/assets/img/x.26fdfa3.svg +5 -0
  105. package/dist/malicious-app.js +17 -0
  106. package/dist/screenshoot.html +7 -0
  107. package/dist/screenshoot.js +12630 -0
  108. package/package.json +2 -2
  109. package/src/bot.js +1 -1
  110. package/src/chatbox/ChatButton.js +16 -8
  111. package/src/chatbox/TextMessage.js +15 -5
  112. package/src/chatbox/block.js +1 -0
  113. package/src/chatbox/main.js +2 -0
  114. package/src/store/store.js +8 -2
  115. package/src/util/common.js +1 -0
  116. package/src/util/index.js +1 -0
  117. package/src/util/op.js +18 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.1.185",
3
+ "version": "4.1.187",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -29,7 +29,7 @@
29
29
  "babel-loader": "^10.0.0",
30
30
  "babel-plugin-syntax-jsx": "^6.18.0",
31
31
  "html-webpack-plugin": "^5.6.4",
32
- "puppeteer": "^24.24.0",
32
+ "puppeteer": "^24.25.0",
33
33
  "webpack": "^5.102.1",
34
34
  "webpack-bundle-analyzer": "^4.10.2",
35
35
  "webpack-cli": "^6.0.1",
package/src/bot.js CHANGED
@@ -17,7 +17,7 @@ export default function (store) {
17
17
  bot.id,
18
18
  bot.welcome_message,
19
19
  common.getLocale(bot, sb.detectLang()),
20
- true,
20
+ false,
21
21
  )
22
22
  if (error) return console.error(error)
23
23
  store.logBotRun(bot.id)
@@ -49,10 +49,13 @@ export default class ChatButton extends Com {
49
49
 
50
50
  if (this.props.store.isMobile()) {
51
51
  // dont show greeting fro mobile anymore
52
- // need setState previewEvent for display 1 unread in mobile
53
- this.props.store.updateLastview({previewEvent: ev})
54
- this.forceUpdate()
55
- return
52
+ let mobileDisabled = sb.get(this.props.plugin, 'chatbox.greeting.mobile_disabled')
53
+ if (mobileDisabled) {
54
+ // need setState previewEvent for display 1 unread in mobile
55
+ this.props.store.updateLastview({screen: 'button', previewEvent: ev})
56
+ this.forceUpdate()
57
+ return
58
+ }
56
59
  }
57
60
 
58
61
  this.props.store.updateLastview({screen: 'preview', previewEvent: ev})
@@ -212,7 +215,8 @@ export default class ChatButton extends Com {
212
215
  let text = this.props.t.i18n(sb.get(greeting, 'greeting', {})) || greeting.message
213
216
 
214
217
  let enabled = greeting.enabled
215
- if (!text || !enabled) {
218
+ let mobileDisabled = this.props.store.isMobile() && greeting.mobile_disabled
219
+ if (!text || !enabled || mobileDisabled) {
216
220
  return
217
221
  }
218
222
  this.ShowGreeting()
@@ -278,7 +282,7 @@ export default class ChatButton extends Com {
278
282
  }
279
283
 
280
284
  renderPreview() {
281
- if (this.props.store.isMobile()) return
285
+ //if (this.props.store.isMobile()) return
282
286
  if (!this.state.hasPreviewDom) return
283
287
  let previewEvent = this.state.previewEvent
284
288
  let agent = this.getAgentOfPreviewEvent(previewEvent)
@@ -294,6 +298,7 @@ export default class ChatButton extends Com {
294
298
  let attachments = sb.get(previewEvent, 'data.message.attachments') || []
295
299
  let quickReplies = sb.find(attachments, (att) => att.type === 'quick_replies')
296
300
  quickReplies = sb.get(quickReplies, 'quick_replies') || []
301
+ quickReplies = sb.take(quickReplies, 10)
297
302
  let imgAtt = sb.find(attachments, (att) => sb.includes(att.mimetype, 'image') && att.url)
298
303
  let uri = sb.get(imgAtt, 'url') || ''
299
304
  if (
@@ -308,7 +313,7 @@ export default class ChatButton extends Com {
308
313
 
309
314
  return (
310
315
  <div class={`widget-preview-new-wrapper ${this.state.previewExtraCls}`}>
311
- <div class={`widget-preview-x-wrapper ${position}`}>
316
+ <div class={`widget-preview-x-wrapper ${position} ${this.props.store.isMobile() ? 'mobile' : ''}`}>
312
317
  <div class='widget-preview--btn-close' onClick={(e) => this.closePreview(e)} />
313
318
  </div>
314
319
  <div class={`widget-preview-text-message ${position}`} onClick={(e) => this.onPreviewClick(e)}>
@@ -338,11 +343,14 @@ export default class ChatButton extends Com {
338
343
  </div>
339
344
  )}
340
345
  {sb.size(quickReplies) > 0 && (
341
- <div class={`widget-preview-quick-reply-wrapper ${position}`}>
346
+ <div
347
+ class={`widget-preview-quick-reply-wrapper ${position} ${sb.size(quickReplies) > 4 ? 'horizontal' : ''}`}
348
+ >
342
349
  {sb.map(quickReplies, (reply) => {
343
350
  if (!(reply.title || '').trim()) return
344
351
  return (
345
352
  <div
353
+ title={reply.title}
346
354
  class='widget-preview-quick-reply-item'
347
355
  onClick={() => {
348
356
  // copy chooseQuickReply function from Event.js
@@ -45,13 +45,23 @@ export default class TextMessage extends Com {
45
45
  }
46
46
 
47
47
  return (
48
- <a href={url} target='_blank' onClick={(e) => this.props.onLink(e, url)}>
48
+ <a class='text-message-link' href={url} target='_blank' onClick={(e) => this.props.onLink(e, url)}>
49
49
  {tag.text}
50
50
  </a>
51
51
  )
52
52
  }
53
- if (tag.type === 'phone') return <a href={'tel:' + tag.text}>{tag.text}</a>
54
- if (tag.type === 'email') return <a href={'mailto:' + tag.text}>{tag.text}</a>
53
+ if (tag.type === 'phone')
54
+ return (
55
+ <a class='text-message-link' href={'tel:' + tag.text}>
56
+ {tag.text}
57
+ </a>
58
+ )
59
+ if (tag.type === 'email')
60
+ return (
61
+ <a class='text-message-link' href={'mailto:' + tag.text}>
62
+ {tag.text}
63
+ </a>
64
+ )
55
65
  return tag.text
56
66
  })
57
67
 
@@ -80,7 +90,7 @@ export default class TextMessage extends Com {
80
90
  if (byType === 'agent') {
81
91
  return (
82
92
  <div class='message-agent message-text--agent' title={t}>
83
- <Block block={block} onLink={this.props.onLink} textMessage/>
93
+ <Block block={block} onLink={this.props.onLink} textMessage />
84
94
  {this.renderTime()}
85
95
  </div>
86
96
  )
@@ -89,7 +99,7 @@ export default class TextMessage extends Com {
89
99
  if (this.props.ev._error) msgcls += ' message-user--error'
90
100
  return (
91
101
  <div class={msgcls} title={t}>
92
- <Block block={block} onLink={this.props.onLink} textMessage/>
102
+ <Block block={block} onLink={this.props.onLink} textMessage />
93
103
  </div>
94
104
  )
95
105
  }
@@ -188,6 +188,7 @@ export default class Block extends Com {
188
188
  case 'a':
189
189
  return (
190
190
  <a
191
+ class={this.props.textMessage ? 'message-text-link' : ''}
191
192
  href={ele.attrs['href']}
192
193
  target={this.props.textMessage ? '_blank' : ele.attrs['target']}
193
194
  title={ele.attrs['title']}
@@ -26,6 +26,8 @@ export default class Main extends Com {
26
26
  let chatbox = found.chatbox
27
27
  let margin_y = sb.get(chatbox, 'desktop_button.margin_y')
28
28
  chatbox.desktop_widget_max_height = margin_y ? `calc(100% - ${margin_y + 10}px)` : 'calc(100% - 40px)'
29
+ const PREVIEW_MAX_WIDTH = 340
30
+ chatbox.preview_max_width = Math.min(PREVIEW_MAX_WIDTH, chatbox.width) + 'px'
29
31
  var outcss = sb.replaceCssVariable(css, chatbox)
30
32
  sb.setCss(this.props.plugin.id, this.$cssStyleDiv, outcss)
31
33
  }
@@ -594,8 +594,14 @@ export default class Store {
594
594
  }
595
595
  }
596
596
 
597
- // mobile always has screen button initially
598
- if (this.isMobile()) lastView.screen = 'button'
597
+ if (this.isMobile()) {
598
+ lastView.screen = 'preview'
599
+ let plugins = this.matchPlugin() || {}
600
+ let chatbox = sb.find(plugins, (plugin) => plugin.type === 'chatbox') || {}
601
+ if (sb.get(chatbox, 'chatbox.greeting.mobile_disabled')) {
602
+ lastView.screen = 'button'
603
+ }
604
+ }
599
605
  this.kv.put('lastview', lastView)
600
606
  }
601
607
 
@@ -668,6 +668,7 @@ export function replaceCssVariable(css, setting) {
668
668
  tokens = tokenize(tokens, "'@desktop_button.margin_x'")
669
669
  tokens = tokenize(tokens, "'@desktop_button.margin_y'")
670
670
  tokens = tokenize(tokens, "'@desktop_widget_max_height'")
671
+ tokens = tokenize(tokens, "'@preview_max_width'")
671
672
  tokens = tokenize(tokens, "'@mobile_button.width'")
672
673
  tokens = tokenize(tokens, "'@mobile_button.height'")
673
674
  tokens = tokenize(tokens, "'@mobile_button.background'")
package/src/util/index.js CHANGED
@@ -23,6 +23,7 @@ sb.Mutex = require('./mutex.js').default
23
23
  var op = require('./op.js')
24
24
  sb.get = op.get
25
25
  sb.set = op.set
26
+ sb.take = op.take
26
27
 
27
28
  sb.Pubsub = require('./pubsub.js').default
28
29
 
package/src/util/op.js CHANGED
@@ -9,26 +9,26 @@ var isArray =
9
9
  return toStr.call(obj) === '[object Array]'
10
10
  }
11
11
 
12
- function hasOwnProperty (obj, prop) {
12
+ function hasOwnProperty(obj, prop) {
13
13
  if (obj == null) return false
14
14
  //to handle objects with null prototypes (too edge case?)
15
15
  return Object.prototype.hasOwnProperty.call(obj, prop)
16
16
  }
17
17
 
18
- function getKey (key) {
18
+ function getKey(key) {
19
19
  var intKey = parseInt(key)
20
20
  return intKey.toString() === key ? intKey : key
21
21
  }
22
22
 
23
- function hasShallowProperty (obj, prop) {
23
+ function hasShallowProperty(obj, prop) {
24
24
  return (typeof prop === 'number' && isArray(obj)) || hasOwnProperty(obj, prop)
25
25
  }
26
26
 
27
- function getShallowProperty (obj, prop) {
27
+ function getShallowProperty(obj, prop) {
28
28
  if (hasShallowProperty(obj, prop)) return obj[prop]
29
29
  }
30
30
 
31
- export function get (obj, path, defaultValue) {
31
+ export function get(obj, path, defaultValue) {
32
32
  if (typeof path === 'number') path = [path]
33
33
  if (!path || path.length === 0) return obj
34
34
  if (obj == null) return defaultValue
@@ -44,7 +44,7 @@ export function get (obj, path, defaultValue) {
44
44
  return get(obj[currentPath], path.slice(1), defaultValue)
45
45
  }
46
46
 
47
- export function set (obj, path, value) {
47
+ export function set(obj, path, value) {
48
48
  if (typeof path === 'number') path = [path]
49
49
  if (!path || path.length === 0) return obj
50
50
  if (typeof path === 'string') {
@@ -65,3 +65,15 @@ export function set (obj, path, value) {
65
65
 
66
66
  return set(obj[currentPath], path.slice(1), value)
67
67
  }
68
+
69
+ export function take(arr, n = 1) {
70
+ if (!Array.isArray(arr)) return []
71
+
72
+ let len = arr.length
73
+ if (typeof len !== 'number' || len <= 0) return []
74
+
75
+ if (n <= 0) return []
76
+ let end = Math.min(n, len)
77
+
78
+ return arr.slice(0, end)
79
+ }