@subiz/widget-v4 4.0.99 → 4.1.2

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 (114) hide show
  1. package/compiled_src/call/call.js +3 -3
  2. package/compiled_src/chatbox/AgentsAvatar.js +0 -3
  3. package/compiled_src/chatbox/ButtonAttachments.js +0 -1
  4. package/compiled_src/chatbox/ChatButton.js +0 -5
  5. package/compiled_src/chatbox/DropdownSelect.js +4 -5
  6. package/compiled_src/chatbox/Event.js +0 -2
  7. package/compiled_src/chatbox/Events.js +1 -9
  8. package/compiled_src/chatbox/FormAttachment.js +0 -1
  9. package/compiled_src/chatbox/GenericTemplateAttachments.js +0 -3
  10. package/compiled_src/chatbox/Header.js +5 -2
  11. package/compiled_src/chatbox/InfoMessage.js +0 -1
  12. package/compiled_src/chatbox/MessageInput.js +3 -3
  13. package/compiled_src/chatbox/Order.js +3 -1
  14. package/compiled_src/chatbox/OrderAttachments.js +0 -1
  15. package/compiled_src/chatbox/QuickReplies.js +0 -1
  16. package/compiled_src/chatbox/Rating.js +3 -1
  17. package/compiled_src/chatbox/TextMessage.js +0 -2
  18. package/compiled_src/chatbox/Typing.js +0 -1
  19. package/compiled_src/chatbox/Widget.js +4 -18
  20. package/compiled_src/chatbox/main.js +0 -1
  21. package/compiled_src/chatbox/releaseAnimation.js +0 -1
  22. package/compiled_src/contact/contact.js +3 -7
  23. package/compiled_src/lib.js +7 -18
  24. package/compiled_src/notif/notif.js +3 -3
  25. package/compiled_src/order/address_picker.js +4 -6
  26. package/compiled_src/order/index.js +0 -2
  27. package/compiled_src/order/order.js +4 -7
  28. package/compiled_src/plugin.js +0 -9
  29. package/compiled_src/popup/countdown.js +3 -5
  30. package/compiled_src/popup/popup.js +3 -8
  31. package/compiled_src/popup/tick.core.commonjs.js +16 -158
  32. package/compiled_src/popup/tick.view.flip.commonjs.js +0 -25
  33. package/compiled_src/store/api.js +3 -9
  34. package/compiled_src/store/api_fake.js +3 -3
  35. package/compiled_src/store/store.js +6 -49
  36. package/compiled_src/util/campaign.js +0 -5
  37. package/compiled_src/util/common.js +1 -28
  38. package/compiled_src/util/extractor.js +0 -1
  39. package/compiled_src/util/gate.test.js +0 -1
  40. package/compiled_src/util/index.js +0 -1
  41. package/compiled_src/util/op.js +0 -1
  42. package/compiled_src/util/order.js +0 -4
  43. package/package.json +4 -4
  44. package/src/chatbox/Header.js +9 -3
  45. package/src/lib.js +5 -15
  46. package/src/store/store.js +1 -1
  47. package/src/util/common.js +1 -1
  48. package/dist/132.js +0 -6645
  49. package/dist/178.js +0 -406
  50. package/dist/213.js +0 -2950
  51. package/dist/335.js +0 -376
  52. package/dist/362.js +0 -107
  53. package/dist/441.js +0 -2840
  54. package/dist/605.js +0 -297
  55. package/dist/678.js +0 -107
  56. package/dist/782.js +0 -107
  57. package/dist/HASH +0 -1
  58. package/dist/assets/img/Facebook.64607ec.png +0 -0
  59. package/dist/assets/img/Zalo.6845707.png +0 -0
  60. package/dist/assets/img/bubble_default.7d5e4ab.svg +0 -20
  61. package/dist/assets/img/caret.998eb8f.svg +0 -1
  62. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  63. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  64. package/dist/assets/img/default_avatar.5b74dc1.png +0 -0
  65. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  66. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  67. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  68. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  69. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  70. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  71. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  72. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  73. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  74. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  75. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  76. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  77. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  78. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  79. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  80. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  81. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  82. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  83. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  84. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  85. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  86. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  87. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  88. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  89. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  90. package/dist/assets/img/empty.29bed2d.svg +0 -23
  91. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  92. package/dist/assets/img/external-link.90577cc.svg +0 -1
  93. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  94. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  95. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  96. package/dist/assets/img/image_default.be0698b.png +0 -0
  97. package/dist/assets/img/info.ebce7ea.svg +0 -1
  98. package/dist/assets/img/loader.37000a7.svg +0 -1
  99. package/dist/assets/img/loading_static.8f403ae.svg +0 -10
  100. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  101. package/dist/assets/img/package.8d37d0f.svg +0 -5
  102. package/dist/assets/img/package_fade.763c001.svg +0 -1
  103. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  104. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  105. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  106. package/dist/assets/img/search.f9705ff.svg +0 -1
  107. package/dist/assets/img/send.6db52a9.svg +0 -3
  108. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  109. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  110. package/dist/assets/img/subiz-mono.877e9f5.svg +0 -3
  111. package/dist/assets/img/x.26fdfa3.svg +0 -5
  112. package/dist/malicious-app.js +0 -13
  113. package/dist/screenshoot.html +0 -7
  114. package/dist/screenshoot.js +0 -5689
@@ -83,7 +83,6 @@ exports.requestAnimationFrame = requestAnimationFrame;
83
83
  var setTimeout = f.contentWindow.setTimeout;
84
84
  exports.setTimeout = setTimeout;
85
85
  var setInterval = f.contentWindow.setInterval;
86
-
87
86
  exports.setInterval = setInterval;
88
87
  function convoOfEv(ev) {
89
88
  if (!ev) return '';
@@ -278,7 +277,6 @@ function trimStart(s, prefix) {
278
277
  while (s.charAt(0) === prefix) s = s.substr(1);
279
278
  return s;
280
279
  }
281
-
282
280
  function throttle(func, wait, options) {
283
281
  var context, args, result;
284
282
  var timeout = null;
@@ -343,7 +341,7 @@ function orderBy(a, k, d) {
343
341
  return clone;
344
342
  }
345
343
  function isPhone(phone) {
346
- var re = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im;
344
+ var re = /^[\+]?[(]?[0-9]{2,3}[)]?[-\s\.]?[0-9]{3,4}[-\s\.]?[0-9]{4,6}$/im;
347
345
  return re.test(String(phone));
348
346
  }
349
347
  function isURL(url) {
@@ -427,7 +425,6 @@ function replaceCssVariablePlugin(css, setting) {
427
425
  ret.push(item);
428
426
  continue;
429
427
  }
430
-
431
428
  var path = item.type.substr(2, item.type.length - 3);
432
429
  var val = op.get(setting, path) || op.get(DEFVAL, path) || '';
433
430
  ret.push(val);
@@ -493,14 +490,12 @@ function replaceCssVariable(css, setting) {
493
490
  ret.push(val + 5);
494
491
  continue;
495
492
  }
496
-
497
493
  var path = item.type.substr(2, item.type.length - 3);
498
494
  var val = op.get(setting, path) || op.get(DEFVAL, path) || '';
499
495
  val = norm2(val);
500
496
  if (['mobile_button.width', 'mobile_button.height', 'mobile_button.margin_x', 'mobile_button.margin_y', 'desktop_button.width', 'desktop_button.height', 'desktop_button.margin_x', 'desktop_button.margin_y', 'width', 'height'].includes(path)) {
501
497
  val += 'px';
502
498
  }
503
-
504
499
  if (path === 'height' && op.get(setting, 'window_mode') === 'full') {
505
500
  ret.push('100%');
506
501
  continue;
@@ -509,7 +504,6 @@ function replaceCssVariable(css, setting) {
509
504
  }
510
505
  return ret.join('');
511
506
  }
512
-
513
507
  function tokenize(arr, token) {
514
508
  if (!arr || !arr.length) return [];
515
509
  var out = [];
@@ -573,23 +567,18 @@ function js2css(js, onlyprops, variables) {
573
567
  var newjs = {};
574
568
  for (var prop in js) {
575
569
  if (!js.hasOwnProperty(prop)) continue;
576
-
577
570
  if (onlyprops && onlyprops.length > 0 && onlyprops.indexOf(prop) === -1) continue;
578
-
579
571
  if (typeof js[prop] === 'string') newjs[prop] = trim(js[prop]);else newjs[prop] = js[prop];
580
572
  }
581
573
  js = newjs;
582
574
  let style = '';
583
575
  for (var prop in js) {
584
576
  if (!js.hasOwnProperty(prop)) continue;
585
-
586
577
  var filter = '';
587
578
  if (js.blur) filter += 'blur(' + js.blur + ') ';
588
579
  if (js.grayscale) filter += 'grayscale(' + js + ') ';
589
580
  if (filter) style += 'filter: ' + filter + '!important;';
590
-
591
581
  if (js.rotate !== undefined) style += 'transform:rotate(' + js.rotate + ') !important;';
592
-
593
582
  if (js[prop] !== undefined) {
594
583
  let propval = js[prop] + '';
595
584
  map(variables, (value, name) => {
@@ -603,22 +592,15 @@ function js2css(js, onlyprops, variables) {
603
592
  }
604
593
  function browserName() {
605
594
  var isOpera = !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
606
-
607
595
  var isFirefox = typeof InstallTrigger !== 'undefined';
608
-
609
596
  var isSafari = /constructor/i.test(window.HTMLElement) || function (p) {
610
597
  return p.toString() === '[object SafariRemoteNotification]';
611
598
  }(!window['safari'] || typeof safari !== 'undefined' && window['safari'].pushNotification);
612
-
613
599
  var isIE = false || !!document.documentMode;
614
-
615
600
  var isEdge = !isIE && !!window.StyleMedia;
616
-
617
601
  var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
618
602
  if (!isChrome) isChrome = navigator.userAgent.indexOf('Chrome');
619
-
620
603
  var isEdgeChromium = isChrome && navigator.userAgent.indexOf('Edg') != -1;
621
-
622
604
  var isBlink = (isChrome || isOpera) && !!window.CSS;
623
605
  if (isOpera) return 'opera';
624
606
  if (isFirefox) return 'firefox';
@@ -642,7 +624,6 @@ function osName() {
642
624
  if (window.navigator.userAgent.indexOf('Linux') != -1) OSName = 'Linux';
643
625
  return OSName;
644
626
  }
645
-
646
627
  function check_frequently(freq, lastrun, store) {
647
628
  if (!lastrun) return true;
648
629
  if (op.get(freq, 'once_per_user')) return false;
@@ -658,7 +639,6 @@ function check_frequently(freq, lastrun, store) {
658
639
  function checkRunConditions(freq, conds, lastrun, store) {
659
640
  var acc = store.matchAccount() || {};
660
641
  var location = store.matchLocation() || {};
661
-
662
642
  if (!check_frequently(freq, lastrun, store)) return false;
663
643
  for (var i = 0; i < size(conds); i++) {
664
644
  var cond = conds[i];
@@ -671,7 +651,6 @@ function checkRunConditions(freq, conds, lastrun, store) {
671
651
  });
672
652
  if (found) return false;
673
653
  }
674
-
675
654
  let urls = filter(cond.urls, url => norm(url));
676
655
  if (size(urls) > 0) {
677
656
  let found = find(urls, url => {
@@ -905,7 +884,6 @@ function diffYear(a, b, tzoffset) {
905
884
  function sameDay(a, b, tzoffset) {
906
885
  return diffDay(a, b, tzoffset) === 0;
907
886
  }
908
-
909
887
  function shortTime(utcms, tzoffset, now) {
910
888
  var machineoffsetmin = -new Date().getTimezoneOffset();
911
889
  var offsetmin = machineoffsetmin;
@@ -928,13 +906,9 @@ function shortTime(utcms, tzoffset, now) {
928
906
  let tzdate = tztime.getDate();
929
907
  if (tzhour < 10) tzhour = '0' + tzhour;
930
908
  if (tzmin < 10) tzmin = '0' + tzmin;
931
-
932
909
  if (sameDay(time, now, tzoffset)) return tzhour + ':' + tzmin;
933
-
934
910
  if (diffDay(time, now, tzoffset) <= 5) return tzdddd + ', ' + tzhour + ':' + tzmin;
935
-
936
911
  if (diffYear(time, now, tzoffset) === 0) return tzmonthname + ' ' + tzdate + ', ' + tzhour + ':' + tzmin;
937
-
938
912
  return tzyear + '/' + tzmonth + '/' + tzdate + ', ' + tzhour + ':' + tzmin;
939
913
  }
940
914
  function unixSec(t) {
@@ -953,7 +927,6 @@ function getMs(t) {
953
927
  }
954
928
  return t * 1e3;
955
929
  }
956
-
957
930
  function detectLang() {
958
931
  let urllang = getUrlParameter('sbz_locale');
959
932
  let doclang = document.getElementsByTagName('html')[0].getAttribute('xml:lang') || document.getElementsByTagName('html')[0].getAttribute('lang');
@@ -57,7 +57,6 @@ function extractEmails(text) {
57
57
  function extractPhones(msg) {
58
58
  msg = msg || '';
59
59
  var fgmsg = '';
60
-
61
60
  var realchmap = {};
62
61
  for (var i = 0; i < msg.length; i++) {
63
62
  var ch = msg.charAt(i);
@@ -4,7 +4,6 @@ var test = require('tape');
4
4
  var Gate = require('./gate.js');
5
5
  test('gate', async t => {
6
6
  var gate = new Gate();
7
-
8
7
  var flip = 0;
9
8
  setTimeout(function () {
10
9
  flip = 1;
@@ -10,7 +10,6 @@ var campaign = _interopRequireWildcard(require("./campaign.js"));
10
10
  var order = _interopRequireWildcard(require("./order.js"));
11
11
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
-
14
13
  var sb = {};
15
14
  sb = Object.assign(sb, common);
16
15
  sb.Gate = require('./gate.js').default;
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.get = get;
7
7
  exports.set = set;
8
-
9
8
  var toStr = Object.prototype.toString;
10
9
  var isArray = Array.isArray || function (obj) {
11
10
  return toStr.call(obj) === '[object Array]';
@@ -51,7 +51,6 @@ function calcOrderTotal(order) {
51
51
  if (!item.product) return 0;
52
52
  let price = op.get(item, 'product.price', 0) * (item.quantity || 0);
53
53
  ordervalue += price;
54
-
55
54
  if (item.discount_type == 'percentage') {
56
55
  if (item.discount_percentage > 0) {
57
56
  beforeTaxDiscount += price * item.discount_percentage / 10000;
@@ -67,7 +66,6 @@ function calcOrderTotal(order) {
67
66
  item.total = price;
68
67
  subtotal += price;
69
68
  });
70
-
71
69
  let taxM = {};
72
70
  op.map(order.items, (item, i) => {
73
71
  if (!item.product) return;
@@ -89,7 +87,6 @@ function calcOrderTotal(order) {
89
87
  } else if (order.discount_type == 'amount') {
90
88
  computed_discount = order.discount_amount || 0;
91
89
  }
92
-
93
90
  let shippingfee = op.get(order, 'shipping.nominal_fee', 0);
94
91
  if (shippingfee > 0) {
95
92
  if (op.get(order, 'shipping.tax.id')) {
@@ -105,7 +102,6 @@ function calcOrderTotal(order) {
105
102
  totaltax = 0;
106
103
  op.map(taxM, t => totaltax += t.taxprice);
107
104
  let total = subtotal + totaltax - computed_discount + shippingfee;
108
-
109
105
  total += order.adjustment || 0;
110
106
  if (total < 0) total = 0;
111
107
  order.subtotal = subtotal;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.99",
3
+ "version": "4.1.2",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -19,7 +19,7 @@
19
19
  "file-loader": "^6.2.0",
20
20
  "less": "^4.1.3",
21
21
  "less-loader": "^11.1.0",
22
- "marked": "^4.2.3",
22
+ "marked": "^4.2.4",
23
23
  "preact": "^10.11.3"
24
24
  },
25
25
  "devDependencies": {
@@ -31,10 +31,10 @@
31
31
  "babel-loader": "^9.1.0",
32
32
  "babel-plugin-syntax-jsx": "^6.18.0",
33
33
  "html-webpack-plugin": "^5.5.0",
34
- "puppeteer": "^19.3.0",
34
+ "puppeteer": "^19.4.0",
35
35
  "webpack": "^5.75.0",
36
36
  "webpack-bundle-analyzer": "^4.7.0",
37
- "webpack-cli": "^5.0.0",
37
+ "webpack-cli": "^5.0.1",
38
38
  "webpack-dev-server": "^4.11.1"
39
39
  }
40
40
  }
@@ -187,7 +187,8 @@ Vui lòng hỏi chúng tôi bất cứ điều gì hoặc chia sẻ phản hồi
187
187
  return (
188
188
  <div
189
189
  class={`widget-header--wrap-button-back ${unreadcount ? 'widget-header--has-convo-unred' : ''}`}
190
- onClick={(e) => this.onBackClick(e)}>
190
+ onClick={(e) => this.onBackClick(e)}
191
+ >
191
192
  <div class='widget-header--button-back' data-tooltip={this.props.t('menu_back')}></div>
192
193
  {$unreadcount}
193
194
  </div>
@@ -202,7 +203,8 @@ Vui lòng hỏi chúng tôi bất cứ điều gì hoặc chia sẻ phản hồi
202
203
  class='widget-header--button widget-header--button-close'
203
204
  data-tooltip={this.props.t('close')}
204
205
  data-tooltip-position='bottom'
205
- onClick={(e) => this.onCloseClick(e)}>
206
+ onClick={(e) => this.onCloseClick(e)}
207
+ >
206
208
  <span class='widget-header--button-close-icon'></span>
207
209
  </div>
208
210
  )
@@ -227,4 +229,8 @@ Vui lòng hỏi chúng tôi bất cứ điều gì hoặc chia sẻ phản hồi
227
229
  }
228
230
  }
229
231
 
230
- let getJoinedNameMember = (agents) => sb.map(agents, (agent) => agent.name).join(', ')
232
+ let getJoinedNameMember = (agents) => {
233
+ agents = sb.filter(agents, (agent) => sb.trim(agent.fullname))
234
+ if (!agents.length) return null
235
+ return sb.map(agents, (agent) => agent.fullname).join(', ')
236
+ }
package/src/lib.js CHANGED
@@ -20,18 +20,6 @@ class Widget {
20
20
  this.store.onConvoEvent({_isMounted: true}, (ev) => sb.map(this.subs, (sub) => sub(ev)))
21
21
  }
22
22
 
23
- setLang(obj) {
24
- var xhttp = new XMLHttpRequest()
25
- xhttp.open('GET', 'https://api.sbz.vn/4.0/oldlang', true)
26
- xhttp.send()
27
- }
28
-
29
- toggleLangDebugMode() {
30
- var xhttp = new XMLHttpRequest()
31
- xhttp.open('GET', 'https://api.sbz.vn/4.0/oldlangdebug', true)
32
- xhttp.send()
33
- }
34
-
35
23
  async waitReady(cb) {
36
24
  await this.store.readyGate.entry()
37
25
  cb()
@@ -146,10 +134,7 @@ class Widget {
146
134
  version = () => '4.5'
147
135
 
148
136
  setSetting = (setting) => this.store.setSetting({account_setting: setting})
149
- getSetting = (_) => ({account_setting: sb.cloneDeep(this.store.matchAccountSetting())})
150
-
151
137
  getUser = () => sb.parseJSON(sb.stringify(this.store.matchUser()))
152
-
153
138
  setViewingProduct = (p) => this.store.linkProduct(p)
154
139
  getViewingProduct = () => this.store.getLinkedProduct()
155
140
 
@@ -160,6 +145,11 @@ class Widget {
160
145
  return this.pluginMgr.setCurrentChatboxLocale(locale)
161
146
  }
162
147
 
148
+ async setLanguage(locale) {
149
+ await this.domGate.entry()
150
+ return this.pluginMgr.setCurrentChatboxLocale(locale)
151
+ }
152
+
163
153
  async setPluginLocale(id, locale) {
164
154
  await this.domGate.entry()
165
155
  return this.pluginMgr.setPluginLocale(id, locale)
@@ -469,7 +469,7 @@ export default class Store {
469
469
 
470
470
  let convo = this.cache.match('convo_' + id) || {}
471
471
  let mem = sb.find(convo.members, (m) => m.id === user.id)
472
- mem.seen_at = Date.now()
472
+ if (mem) mem.seen_at = Date.now()
473
473
  this._setConvo(convo)
474
474
  this.g_haveSentSeenM[lastmsgsent.id] = true
475
475
  })
@@ -312,7 +312,7 @@ export function orderBy(a, k, d) {
312
312
  }
313
313
 
314
314
  export function isPhone(phone) {
315
- var re = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im
315
+ var re = /^[\+]?[(]?[0-9]{2,3}[)]?[-\s\.]?[0-9]{3,4}[-\s\.]?[0-9]{4,6}$/im
316
316
  return re.test(String(phone))
317
317
  }
318
318