@subiz/widget-v4 4.1.218 → 4.1.222

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 (128) hide show
  1. package/assets/img/bar_ho_tro.svg +3 -0
  2. package/{dist/assets/img/bubble_default.6f6eec8.svg → assets/img/bubble_11.svg} +0 -1
  3. package/assets/less/form-page.less +58 -0
  4. package/assets/less/form.less +279 -3
  5. package/assets/less/widget.less +6 -0
  6. package/compiled_src/chatbox/ChatButton.js +22 -3
  7. package/compiled_src/chatbox/Widget.js +13 -18
  8. package/compiled_src/form/Form.js +270 -71
  9. package/compiled_src/form/FormPage.js +17 -4
  10. package/compiled_src/form/form-fields.js +244 -0
  11. package/compiled_src/form/index.js +2 -0
  12. package/compiled_src/form/rating-stars.js +48 -88
  13. package/compiled_src/plugin.js +10 -0
  14. package/compiled_src/store/api.js +5 -7
  15. package/compiled_src/store/api_fake.js +3 -1
  16. package/compiled_src/store/localize.js +33 -0
  17. package/compiled_src/store/store.js +57 -1
  18. package/compiled_src/store/widget-settings.js +67 -0
  19. package/compiled_src/util/common.js +1 -1
  20. package/package.json +3 -3
  21. package/src/chatbox/ChatButton.js +25 -4
  22. package/src/chatbox/Widget.js +21 -21
  23. package/src/form/Form.js +335 -97
  24. package/src/form/FormPage.js +21 -8
  25. package/src/form/form-fields.js +224 -0
  26. package/src/form/index.js +6 -1
  27. package/src/form/rating-stars.js +48 -64
  28. package/src/plugin.js +10 -0
  29. package/src/store/api.js +9 -7
  30. package/src/store/api_fake.js +3 -1
  31. package/src/store/localize.js +30 -0
  32. package/src/store/store.js +64 -1
  33. package/src/store/widget-settings.js +46 -0
  34. package/src/util/common.js +1 -1
  35. package/test.cjs +3 -0
  36. package/webpack.dev.js +2 -0
  37. package/dist/127.js +0 -273
  38. package/dist/132.js +0 -2817
  39. package/dist/185.js +0 -1917
  40. package/dist/1a12ed33347.127.js +0 -1
  41. package/dist/1a12ed33347.132.js +0 -1
  42. package/dist/1a12ed33347.185.js +0 -1
  43. package/dist/1a12ed33347.27.js +0 -1
  44. package/dist/1a12ed33347.278.js +0 -1
  45. package/dist/1a12ed33347.339.js +0 -1
  46. package/dist/1a12ed33347.459.js +0 -1
  47. package/dist/1a12ed33347.490.js +0 -1
  48. package/dist/1a12ed33347.app.js +0 -1
  49. package/dist/1a12ed33347.chat.html +0 -1
  50. package/dist/1a12ed33347.chat.js +0 -1
  51. package/dist/1a12ed33347.form.html +0 -1
  52. package/dist/1a12ed33347.form.js +0 -1
  53. package/dist/1a12ed33347.index.html +0 -72
  54. package/dist/1a12ed33347.library.html +0 -72
  55. package/dist/1a12ed33347.library.js +0 -1
  56. package/dist/1a12ed33347.preview.html +0 -759
  57. package/dist/1a12ed33347.preview.js +0 -1
  58. package/dist/1a12ed33347.webview.js +0 -1
  59. package/dist/27.js +0 -37
  60. package/dist/459.js +0 -37
  61. package/dist/490.js +0 -305
  62. package/dist/HASH +0 -1
  63. package/dist/assets/img/Facebook.64607ec.png +0 -0
  64. package/dist/assets/img/Zalo.6845707.png +0 -0
  65. package/dist/assets/img/award1a.1a58e10.png +0 -0
  66. package/dist/assets/img/award3a.3b74423.png +0 -0
  67. package/dist/assets/img/award4a.ed6ccd4.png +0 -0
  68. package/dist/assets/img/award5.39eb7ae.png +0 -0
  69. package/dist/assets/img/caret.998eb8f.svg +0 -1
  70. package/dist/assets/img/convos_empty.2353007.svg +0 -72
  71. package/dist/assets/img/default.06e6ee0.jpg +0 -0
  72. package/dist/assets/img/default_avatar.e449b04.png +0 -0
  73. package/dist/assets/img/default_logo.dd13a2b.svg +0 -5
  74. package/dist/assets/img/done_gray.d7e8203.svg +0 -4
  75. package/dist/assets/img/done_green.b817fd4.svg +0 -4
  76. package/dist/assets/img/dot_chat.335fd8a.svg +0 -3
  77. package/dist/assets/img/emoji/messenger/sub_23.529_58.824.d5faf14.png +0 -0
  78. package/dist/assets/img/emoji/messenger/sub_23.529_60.784.1420241.png +0 -0
  79. package/dist/assets/img/emoji/messenger/sub_25.490_0.000.1e6b2c0.png +0 -0
  80. package/dist/assets/img/emoji/messenger/sub_25.490_45.098.3dfbc08.png +0 -0
  81. package/dist/assets/img/emoji/messenger/sub_25.490_5.882.4b49e94.png +0 -0
  82. package/dist/assets/img/emoji/messenger/sub_27.451_72.549.7114f58.png +0 -0
  83. package/dist/assets/img/emoji/messenger/sub_27.451_84.314.231e2b7.png +0 -0
  84. package/dist/assets/img/emoji/messenger/sub_27.451_96.078.ddbb008.png +0 -0
  85. package/dist/assets/img/emoji/messenger/sub_29.412_5.882.61f3359.png +0 -0
  86. package/dist/assets/img/emoji/messenger/sub_58.824_100.000.6df72bc.png +0 -0
  87. package/dist/assets/img/emoji/messenger/sub_58.824_45.098.3d7a7ad.png +0 -0
  88. package/dist/assets/img/emoji/messenger/sub_58.824_47.059.0f4d6e2.png +0 -0
  89. package/dist/assets/img/emoji/messenger/sub_58.824_54.902.65724c1.png +0 -0
  90. package/dist/assets/img/emoji/messenger/sub_58.824_64.706.9da3cba.png +0 -0
  91. package/dist/assets/img/emoji/messenger/sub_58.824_72.549.edca5cf.png +0 -0
  92. package/dist/assets/img/emoji/messenger/sub_58.824_78.431.f910f2a.png +0 -0
  93. package/dist/assets/img/emoji/messenger/sub_58.824_88.235.def4e71.png +0 -0
  94. package/dist/assets/img/emoji/messenger/sub_60.784_11.765.49c03d0.png +0 -0
  95. package/dist/assets/img/emoji/messenger/sub_60.784_27.451.46b54e5.png +0 -0
  96. package/dist/assets/img/emoji/messenger/sub_60.784_29.412.e36d284.png +0 -0
  97. package/dist/assets/img/emoji/messenger/sub_60.784_3.922.bb191b0.png +0 -0
  98. package/dist/assets/img/emoji/messenger/sub_60.784_35.294.af7b927.png +0 -0
  99. package/dist/assets/img/emoji/messenger/sub_60.784_7.843.98f2a99.png +0 -0
  100. package/dist/assets/img/empty.29bed2d.svg +0 -23
  101. package/dist/assets/img/empty_1.0b98af0.svg +0 -11
  102. package/dist/assets/img/examplte_logo.f86535f.svg +0 -1
  103. package/dist/assets/img/external-link.90577cc.svg +0 -1
  104. package/dist/assets/img/fb_inverse_circle.36c2cfc.png +0 -0
  105. package/dist/assets/img/ghn.070f8e3.svg +0 -17
  106. package/dist/assets/img/ghtk.326eac1.svg +0 -18
  107. package/dist/assets/img/image_default.be0698b.png +0 -0
  108. package/dist/assets/img/info.ebce7ea.svg +0 -1
  109. package/dist/assets/img/loader.37000a7.svg +0 -1
  110. package/dist/assets/img/loading_static.a27f0ac.svg +0 -10
  111. package/dist/assets/img/main-service1.d536cc2.png +0 -0
  112. package/dist/assets/img/main-service2.9b99549.png +0 -0
  113. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  114. package/dist/assets/img/package.8d37d0f.svg +0 -5
  115. package/dist/assets/img/package_fade.763c001.svg +0 -1
  116. package/dist/assets/img/rating--average.1ea492c.svg +0 -12
  117. package/dist/assets/img/rating--great.e3d712e.svg +0 -16
  118. package/dist/assets/img/rating--poor.2938a25.svg +0 -12
  119. package/dist/assets/img/search.f9705ff.svg +0 -1
  120. package/dist/assets/img/send.6db52a9.svg +0 -3
  121. package/dist/assets/img/shop.f7dc7d8.svg +0 -1
  122. package/dist/assets/img/shop_faded.df7845a.svg +0 -1
  123. package/dist/assets/img/stars_v2.79cf728.png +0 -0
  124. package/dist/assets/img/subiz-mono.8fbc067.svg +0 -3
  125. package/dist/assets/img/x.26fdfa3.svg +0 -5
  126. package/dist/malicious-app.js +0 -17
  127. package/dist/screenshoot.html +0 -7
  128. package/dist/screenshoot.js +0 -14454
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FaceIcon = FaceIcon;
7
+ exports.LinearScale = LinearScale;
8
+ exports.OTHER_OPTION_VALUE = void 0;
9
+ exports.RatingFaces = RatingFaces;
10
+ exports.getDescription = getDescription;
11
+ exports.getPlaceholder = getPlaceholder;
12
+ exports.getRatingConfig = getRatingConfig;
13
+ exports.getScaleRange = getScaleRange;
14
+ exports.isChips = isChips;
15
+ exports.isEmptyValue = isEmptyValue;
16
+ exports.optionLabel = optionLabel;
17
+ exports.sameValue = sameValue;
18
+ exports.toStoredValue = toStoredValue;
19
+ exports.translate = translate;
20
+ var _preact = require("preact");
21
+ var _index = _interopRequireDefault(require("../util/index.js"));
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ const OTHER_OPTION_VALUE = exports.OTHER_OPTION_VALUE = '__other__';
24
+ const DEFAULT_MESSAGES = {
25
+ vi: {
26
+ form_other_option: 'Khác…',
27
+ form_other_option_placeholder: 'Nhập câu trả lời của bạn',
28
+ form_other_option_label: 'Khác'
29
+ },
30
+ en: {
31
+ form_other_option: 'Other…',
32
+ form_other_option_placeholder: 'Type your answer',
33
+ form_other_option_label: 'Other'
34
+ }
35
+ };
36
+ function translate(t, key) {
37
+ let msg = typeof t === 'function' ? t(key) : '';
38
+ if (msg && msg !== key) return msg;
39
+ let locale = '';
40
+ try {
41
+ if (t && typeof t.locale === 'function') locale = String(t.locale() || '');
42
+ } catch (e) {}
43
+ let lang = locale && !locale.toLowerCase().startsWith('vi') ? 'en' : 'vi';
44
+ return DEFAULT_MESSAGES[lang][key] || key;
45
+ }
46
+ function isChips(com) {
47
+ return String(_index.default.get(com, 'class') || '').split(/\s+/).includes('chips');
48
+ }
49
+ function getPlaceholder(com) {
50
+ return _index.default.get(com, 'place_holder') || _index.default.get(com, 'placeholder') || '';
51
+ }
52
+ function getDescription(com) {
53
+ return _index.default.get(com, 'description') || _index.default.get(com, 'label_description') || '';
54
+ }
55
+ function toStoredValue(v) {
56
+ if (typeof v === 'number') return v;
57
+ let s = String(v === undefined || v === null ? '' : v).trim();
58
+ if (s !== '' && /^-?\d+(\.\d+)?$/.test(s)) return Number(s);
59
+ return s;
60
+ }
61
+ function sameValue(a, b) {
62
+ if (a === undefined || a === null || a === '') return false;
63
+ return String(a) === String(b);
64
+ }
65
+ const FACES_5 = ['face_very_sad', 'face_sad', 'face_neutral', 'face_happy', 'face_very_happy'];
66
+ const FACES_3 = ['face_sad', 'face_neutral', 'face_happy'];
67
+ function getRatingConfig(com) {
68
+ let options = _index.default.filter(_index.default.get(com, 'input_options') || [], o => o && o.value !== undefined && o.value !== '');
69
+ if (_index.default.size(options) > 0) {
70
+ let isFace = _index.default.find(options, o => String(o.icon || '').startsWith('face'));
71
+ let faces = options.length === 3 ? FACES_3 : FACES_5;
72
+ let levels = _index.default.map(options, (o, i) => {
73
+ let icon = String(o.icon || '');
74
+ if (isFace && !icon.startsWith('face')) icon = faces[i] || 'face_neutral';
75
+ if (!isFace) icon = 'star';
76
+ return {
77
+ value: String(o.value),
78
+ icon
79
+ };
80
+ });
81
+ return {
82
+ kind: isFace ? 'face' : 'star',
83
+ levels
84
+ };
85
+ }
86
+ let max = parseInt(_index.default.get(com, 'scale_max'), 10);
87
+ if (max !== 3) max = 5;
88
+ let levels = [];
89
+ for (let i = 1; i <= max; i++) levels.push({
90
+ value: String(i),
91
+ icon: 'star'
92
+ });
93
+ return {
94
+ kind: 'star',
95
+ levels
96
+ };
97
+ }
98
+ function getScaleRange(com) {
99
+ let min = parseInt(_index.default.get(com, 'scale_min'), 10) === 0 ? 0 : 1;
100
+ let max = parseInt(_index.default.get(com, 'scale_max'), 10);
101
+ if (!max || isNaN(max)) max = 5;
102
+ if (max < 2) max = 2;
103
+ if (max > 10) max = 10;
104
+ let values = [];
105
+ for (let i = min; i <= max; i++) values.push(i);
106
+ return {
107
+ min,
108
+ max,
109
+ values
110
+ };
111
+ }
112
+ function optionLabel(com, v) {
113
+ let option = _index.default.find(_index.default.get(com, 'input_options') || [], o => sameValue(o.value, v));
114
+ if (option) return option.label || option.value;
115
+ return v;
116
+ }
117
+ function isEmptyValue(val) {
118
+ if (val === undefined || val === null) return true;
119
+ if (typeof val === 'string' && !val.trim()) return true;
120
+ if (Array.isArray(val) && val.length === 0) return true;
121
+ return false;
122
+ }
123
+ const MOUTHS = {
124
+ face_very_sad: 'M7.5 17.5 Q12 11.5 16.5 17.5',
125
+ face_sad: 'M8.5 16.5 Q12 13.5 15.5 16.5',
126
+ face_neutral: 'M8.5 15.5 L15.5 15.5',
127
+ face_happy: 'M8.5 14 Q12 17.5 15.5 14',
128
+ face_very_happy: 'M7.5 13 Q12 20 16.5 13 Z'
129
+ };
130
+ function FaceIcon({
131
+ icon,
132
+ size
133
+ }) {
134
+ let mouth = MOUTHS[icon] || MOUTHS.face_neutral;
135
+ let s = size || 28;
136
+ return (0, _preact.h)("svg", {
137
+ class: "form-face-icon",
138
+ width: s,
139
+ height: s,
140
+ viewBox: "0 0 24 24",
141
+ fill: "none",
142
+ stroke: "currentColor",
143
+ "stroke-width": "1.6",
144
+ "stroke-linecap": "round",
145
+ "stroke-linejoin": "round",
146
+ "aria-hidden": "true"
147
+ }, (0, _preact.h)("circle", {
148
+ cx: "12",
149
+ cy: "12",
150
+ r: "10"
151
+ }), (0, _preact.h)("circle", {
152
+ cx: "8.8",
153
+ cy: "9.6",
154
+ r: "0.6",
155
+ fill: "currentColor",
156
+ "stroke-width": "1.2"
157
+ }), (0, _preact.h)("circle", {
158
+ cx: "15.2",
159
+ cy: "9.6",
160
+ r: "0.6",
161
+ fill: "currentColor",
162
+ "stroke-width": "1.2"
163
+ }), (0, _preact.h)("path", {
164
+ d: mouth,
165
+ fill: icon === 'face_very_happy' ? 'currentColor' : 'none',
166
+ "fill-opacity": "0.15"
167
+ }));
168
+ }
169
+ function RatingFaces({
170
+ levels,
171
+ value,
172
+ onChange,
173
+ readonly
174
+ }) {
175
+ return (0, _preact.h)("div", {
176
+ class: 'form-rating-faces' + (readonly ? ' readonly' : ''),
177
+ role: readonly ? undefined : 'radiogroup'
178
+ }, _index.default.map(levels, level => {
179
+ let selected = sameValue(value, level.value);
180
+ let cls = 'form-rating-face';
181
+ if (selected) cls += ' selected';
182
+ if (readonly) {
183
+ return (0, _preact.h)("span", {
184
+ class: cls,
185
+ key: level.value
186
+ }, (0, _preact.h)(FaceIcon, {
187
+ icon: level.icon
188
+ }));
189
+ }
190
+ return (0, _preact.h)("button", {
191
+ type: "button",
192
+ class: cls,
193
+ key: level.value,
194
+ role: "radio",
195
+ "aria-checked": selected ? 'true' : 'false',
196
+ "aria-label": level.value,
197
+ title: level.value,
198
+ onClick: () => onChange(selected ? '' : toStoredValue(level.value))
199
+ }, (0, _preact.h)(FaceIcon, {
200
+ icon: level.icon
201
+ }));
202
+ }));
203
+ }
204
+ function LinearScale({
205
+ com,
206
+ value,
207
+ onChange,
208
+ numberedLabels
209
+ }) {
210
+ let {
211
+ min,
212
+ max,
213
+ values
214
+ } = getScaleRange(com);
215
+ let cols = Math.ceil(values.length / 2);
216
+ let minLabel = _index.default.get(com, 'scale_min_label') || '';
217
+ let maxLabel = _index.default.get(com, 'scale_max_label') || '';
218
+ return (0, _preact.h)("div", {
219
+ class: 'form-linear-scale' + (values.length >= 8 ? ' many' : ''),
220
+ style: `--scale-count: ${values.length}; --scale-cols: ${cols}`
221
+ }, (0, _preact.h)("div", {
222
+ class: "form-linear-scale-items",
223
+ role: "radiogroup"
224
+ }, _index.default.map(values, v => {
225
+ let selected = sameValue(value, v);
226
+ let cls = 'form-linear-scale-item';
227
+ if (selected) cls += ' selected';
228
+ if (values.length % 2 && v === values[cols]) cls += ' row2-start';
229
+ return (0, _preact.h)("button", {
230
+ type: "button",
231
+ key: v,
232
+ class: cls,
233
+ role: "radio",
234
+ "aria-checked": selected ? 'true' : 'false',
235
+ onClick: () => onChange(v)
236
+ }, v);
237
+ })), (minLabel || maxLabel) && (0, _preact.h)("div", {
238
+ class: "form-linear-scale-labels"
239
+ }, (0, _preact.h)("span", {
240
+ class: "form-linear-scale-label min"
241
+ }, minLabel && numberedLabels ? `${min} · ${minLabel}` : minLabel), (0, _preact.h)("span", {
242
+ class: "form-linear-scale-label max"
243
+ }, maxLabel && numberedLabels ? `${max} · ${maxLabel}` : maxLabel)));
244
+ }
@@ -35,6 +35,7 @@ async function load() {
35
35
  let accid = getUrlParameter('id') || getUrlParameter('accid') || getUrlParameter('account-id') || 'acqsulrowbxiugvginhw';
36
36
  let mask = accid + '@' + 'abcd';
37
37
  let token = getUrlParameter('token');
38
+ let formId = getUrlParameter('form-id') || getUrlParameter('formid');
38
39
  let previewJson = getUrlParameter('preview');
39
40
  await store.init(accid);
40
41
  let t = key => {
@@ -57,6 +58,7 @@ async function load() {
57
58
  store: store,
58
59
  t: t,
59
60
  token: token,
61
+ formId: formId,
60
62
  previewJson: previewJson
61
63
  }), document.getElementById('form'));
62
64
  });
@@ -6,124 +6,84 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _common = require("../common.js");
8
8
  var _preact = require("preact");
9
- var _index = _interopRequireDefault(require("../util/index.js"));
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
9
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
12
10
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
13
11
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
14
- class Form2 extends _common.Com {
12
+ class RatingStars extends _common.Com {
15
13
  constructor(props) {
16
14
  super(props);
17
- _defineProperty(this, "state", {
18
- hovering: 0,
19
- selected: 0
20
- });
21
15
  _defineProperty(this, "onMouseEnter", v => {
22
16
  let {
23
- selected,
24
- hovering
17
+ selected
25
18
  } = this.state;
26
- if (v <= selected) {
27
- this.setState({
28
- hovering: selected
29
- });
30
- return;
31
- }
32
19
  this.setState({
33
- hovering: v
20
+ hovering: v <= selected ? selected : v
34
21
  });
35
22
  });
36
23
  _defineProperty(this, "onMouseLeave", () => {
37
- let {
38
- selected,
39
- hovering
40
- } = this.state;
41
24
  this.setState({
42
25
  hovering: 0
43
26
  });
44
27
  });
28
+ this.state = {
29
+ hovering: 0,
30
+ selected: Number(props.value) || 0
31
+ };
45
32
  }
46
33
  onToggleValue(v) {
47
- let {
48
- selected
49
- } = this.state;
50
- let newVal = v;
51
- if (v === selected) newVal = 0;
34
+ let newVal = v === this.state.selected ? 0 : v;
52
35
  this.setState({
53
36
  selected: newVal,
54
37
  hovering: newVal
55
38
  });
56
- this.props.onChange(newVal);
39
+ if (this.props.onChange) this.props.onChange(newVal);
57
40
  }
58
41
  render() {
59
42
  let {
60
43
  selected,
61
44
  hovering
62
45
  } = this.state;
63
- let star1Cls = 'star-wrapper';
64
- if (selected >= 1) {
65
- star1Cls += ' selected';
66
- } else if (hovering >= 1) {
67
- star1Cls += ' hovering';
68
- }
69
- let star2Cls = 'star-wrapper';
70
- if (selected >= 2) {
71
- star2Cls += ' selected';
72
- } else if (hovering >= 2) {
73
- star2Cls += ' hovering';
74
- }
75
- let star3Cls = 'star-wrapper';
76
- if (selected >= 3) {
77
- star3Cls += ' selected';
78
- } else if (hovering >= 3) {
79
- star3Cls += ' hovering';
80
- }
81
- let star4Cls = 'star-wrapper';
82
- if (selected >= 4) {
83
- star4Cls += ' selected';
84
- } else if (hovering >= 4) {
85
- star4Cls += ' hovering';
86
- }
87
- let star5Cls = 'star-wrapper';
88
- if (selected >= 5) {
89
- star5Cls += ' selected';
90
- } else if (hovering >= 5) {
91
- star5Cls += ' hovering';
46
+ let count = Number(this.props.count) || 5;
47
+ let readonly = !!this.props.readonly;
48
+ let $stars = [];
49
+ for (let i = 1; i <= count; i++) {
50
+ let cls = 'star-wrapper';
51
+ if (selected >= i) cls += ' selected';else if (hovering >= i) cls += ' hovering';
52
+ if (readonly) {
53
+ $stars.push((0, _preact.h)("div", {
54
+ class: cls,
55
+ key: i
56
+ }, (0, _preact.h)("div", {
57
+ class: "star"
58
+ })));
59
+ continue;
60
+ }
61
+ $stars.push((0, _preact.h)("div", {
62
+ class: cls,
63
+ key: i,
64
+ role: "radio",
65
+ "aria-checked": selected === i ? 'true' : 'false',
66
+ "aria-label": String(i),
67
+ tabIndex: 0,
68
+ onClick: () => this.onToggleValue(i),
69
+ onKeyDown: e => {
70
+ if (e.key === 'Enter' || e.key === ' ') {
71
+ e.preventDefault();
72
+ this.onToggleValue(i);
73
+ }
74
+ },
75
+ onMouseEnter: () => this.onMouseEnter(i)
76
+ }, (0, _preact.h)("div", {
77
+ class: "star"
78
+ })));
92
79
  }
80
+ let cls = 'form-ratings-wrapper';
81
+ if (readonly) cls += ' readonly';
93
82
  return (0, _preact.h)("div", {
94
- class: "form-ratings-wrapper",
83
+ class: cls,
84
+ role: readonly ? undefined : 'radiogroup',
95
85
  onMouseLeave: () => this.onMouseLeave()
96
- }, (0, _preact.h)("div", {
97
- class: star1Cls,
98
- onClick: () => this.onToggleValue(1),
99
- onMouseEnter: () => this.onMouseEnter(1)
100
- }, (0, _preact.h)("div", {
101
- class: "star"
102
- })), (0, _preact.h)("div", {
103
- class: star2Cls,
104
- onClick: () => this.onToggleValue(2),
105
- onMouseEnter: () => this.onMouseEnter(2)
106
- }, (0, _preact.h)("div", {
107
- class: "star"
108
- })), (0, _preact.h)("div", {
109
- class: star3Cls,
110
- onClick: () => this.onToggleValue(3),
111
- onMouseEnter: () => this.onMouseEnter(3)
112
- }, (0, _preact.h)("div", {
113
- class: "star"
114
- })), (0, _preact.h)("div", {
115
- class: star4Cls,
116
- onClick: () => this.onToggleValue(4),
117
- onMouseEnter: () => this.onMouseEnter(4)
118
- }, (0, _preact.h)("div", {
119
- class: "star"
120
- })), (0, _preact.h)("div", {
121
- class: star5Cls,
122
- onClick: () => this.onToggleValue(5),
123
- onMouseEnter: () => this.onMouseEnter(5)
124
- }, (0, _preact.h)("div", {
125
- class: "star"
126
- })));
86
+ }, $stars);
127
87
  }
128
88
  }
129
- exports.default = Form2;
89
+ exports.default = RatingStars;
@@ -8,6 +8,7 @@ var _index = _interopRequireDefault(require("./util/index.js"));
8
8
  var common = _interopRequireWildcard(require("./common.js"));
9
9
  var _preact = require("preact");
10
10
  var _main = _interopRequireDefault(require("./chatbox/main.js"));
11
+ var _greeting = require("./chatbox/greeting.js");
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
13
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
14
  const LoadPopup = () => Promise.resolve().then(() => _interopRequireWildcard(require('./popup/popup.js')));
@@ -146,6 +147,15 @@ function Plugin(plugin, store, $container, lib) {
146
147
  _locale = common.getLocale(plugin, locale);
147
148
  await common.downloadLanguage(store, _locale);
148
149
  this.t = t;
150
+ if (plugin.type === 'chatbox') {
151
+ store.relocalizeLightConvos(_locale, t.i18n, {
152
+ widgetGreeting: () => (0, _greeting.widgetGreeting)(plugin.chatbox, t),
153
+ previewGreetingText: () => {
154
+ let greeting = _index.default.get(plugin, 'chatbox.greeting', {});
155
+ return t.i18n(_index.default.get(greeting, 'greeting', {})) || greeting.message;
156
+ }
157
+ });
158
+ }
149
159
  _render();
150
160
  return _locale;
151
161
  };
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _index = _interopRequireDefault(require("../util/index.js"));
8
+ var _widgetSettings = require("./widget-settings.js");
8
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
10
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
10
11
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
@@ -84,7 +85,7 @@ class _default {
84
85
  }));
85
86
  _defineProperty(this, "sendTyping", cid => this.apireq.post(`/accounts/${this.accid}/conversations/${cid}/typing`));
86
87
  _defineProperty(this, "sendLostFocus", () => this.apireq.post(`/accounts/${this.accid}/focuses/${this.uid}/delete`));
87
- _defineProperty(this, "attachmentRequest", () => this.apireq.setBaseUrl(new URL('/4.1', this.ApiURL).href).addQuery('x-account-id', this.accid));
88
+ _defineProperty(this, "attachmentRequest", () => this.apireq.setBaseUrl(new URL('/4.1', new URL(this.ApiURL, document.location.href)).href).addQuery('x-account-id', this.accid));
88
89
  _defineProperty(this, "attachmentJSON", async (path, body, method = 'post') => {
89
90
  const result = await this.attachmentRequest()[method](path, body);
90
91
  if (result.error || result.body?.error || result.code < 200 || result.code >= 300) {
@@ -172,12 +173,7 @@ class _default {
172
173
  _defineProperty(this, "getUser", _ => this.apireq.get(`/accounts/${this.accid}/users/${this.uid}`));
173
174
  _defineProperty(this, "getAccountSetting", async p => {
174
175
  let href = _index.default.get(document, 'location.href');
175
- let res = {};
176
- if (p && p.bot_id) {
177
- res = await this.apireq.addQuery('url', href).addQuery('bot_id', p.bot_id).get(`/accounts/${this.accid}/settings`);
178
- } else {
179
- res = await this.apireq.addQuery('url', href).get(`/accounts/${this.accid}/settings`);
180
- }
176
+ const res = await (0, _widgetSettings.loadWidgetSettings)(this.apireq, this.ApiURL, this.accid, href, p && p.bot_id);
181
177
  if (res.error) return res;
182
178
  let plugins = _index.default.get(res, 'body.plugins') || [];
183
179
  _index.default.map(plugins, plugin => {
@@ -208,6 +204,8 @@ class _default {
208
204
  _defineProperty(this, "list_wards", p => this.apireq.setQuery(p).get(`/accounts/${this.accid}/wards`));
209
205
  _defineProperty(this, "checkFormToken", (accid, token) => this.api41.addQuery('account-id', accid).get(`/submissions/${token}`));
210
206
  _defineProperty(this, "submitForm2", (accid, token, data) => this.api41.addQuery('account-id', accid).post(`/submissions/${token}`, data));
207
+ _defineProperty(this, "getPublicForm", formid => this.websiteFormRequest().get(`/accounts/${this.accid}/public-forms/${encodeURIComponent(formid)}`));
208
+ _defineProperty(this, "submitPublicForm", (formid, data) => this.websiteFormRequest().post(`/accounts/${this.accid}/public-forms/${encodeURIComponent(formid)}/submissions`, data));
211
209
  _defineProperty(this, "suggest_address", keyword => this.apireq.setQuery({
212
210
  keyword: keyword
213
211
  }).get(`/accounts/${this.accid}/addresses`));
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _index = _interopRequireDefault(require("../util/index.js"));
8
+ var _widgetSettings = require("./widget-settings.js");
8
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
10
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
10
11
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
@@ -71,10 +72,11 @@ class _default {
71
72
  }]
72
73
  }
73
74
  }));
74
- _defineProperty(this, "getAccountSetting", () => this.apireq.get(`/accounts/${this.accid}/settings`));
75
+ _defineProperty(this, "getAccountSetting", p => (0, _widgetSettings.loadWidgetSettings)(this.apireq, this.ApiURL, this.accid, document.location.href, p && p.bot_id));
75
76
  _defineProperty(this, "sendImpression", impression => OK200);
76
77
  _defineProperty(this, "sendConversion", conversion => OK200);
77
78
  this.FileURL = FileURL;
79
+ this.ApiURL = ApiURL;
78
80
  this.apireq = ajax.setBaseUrl(ApiURL).setContentType('text/plain').beforeHook(jsonifyTextPlain).setParser('json');
79
81
  }
80
82
  setAgentId(agid) {
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.localizeMessage = localizeMessage;
7
+ exports.pickLocale = void 0;
8
+ var _index = _interopRequireDefault(require("../util/index.js"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const pickLocale = locale => i18n => {
11
+ if (!i18n || !locale) return undefined;
12
+ return i18n[locale.replace('-', '_')] || i18n[locale];
13
+ };
14
+ exports.pickLocale = pickLocale;
15
+ function localizeMessage(message, pick) {
16
+ if (!message) return false;
17
+ let changed = false;
18
+ const block = message.i18n_block && pick(message.i18n_block);
19
+ if (block) {
20
+ message.block = _index.default.cloneDeep(block);
21
+ message.text = _index.default.blockToText(block);
22
+ changed = true;
23
+ }
24
+ _index.default.map(message.attachments, att => {
25
+ _index.default.map(att && att.quick_replies, qr => {
26
+ const title = qr && qr.i18n_title && pick(qr.i18n_title);
27
+ if (!title) return;
28
+ qr.title = title;
29
+ changed = true;
30
+ });
31
+ });
32
+ return changed;
33
+ }
@@ -12,6 +12,7 @@ var _kv = _interopRequireDefault(require("./kv.js"));
12
12
  var _api_fake = _interopRequireDefault(require("./api_fake.js"));
13
13
  var _realtime_fake = _interopRequireDefault(require("./realtime_fake.js"));
14
14
  var _attachments = require("./attachments.js");
15
+ var _localize = require("./localize.js");
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
17
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
18
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
@@ -210,6 +211,8 @@ class Store {
210
211
  _defineProperty(this, "matchClosePreviewAt", () => this.kv.match('close_preview_at') || 0);
211
212
  _defineProperty(this, "checkFormToken", (accid, token) => this.api.checkFormToken(accid, token));
212
213
  _defineProperty(this, "submitForm2", (accid, token, data) => this.api.submitForm2(accid, token, data));
214
+ _defineProperty(this, "getPublicForm", formid => this.api.getPublicForm(formid));
215
+ _defineProperty(this, "submitPublicForm", (formid, data) => this.api.submitPublicForm(formid, data));
213
216
  _defineProperty(this, "sendPresence", _index.default.throttle(async () => {
214
217
  if (!this._track_page_view) return;
215
218
  if (this._die) return dieErr;
@@ -1197,6 +1200,58 @@ class Store {
1197
1200
  if (cid.startsWith('cslight')) return;
1198
1201
  this._typing(cid);
1199
1202
  }
1203
+ relocalizeLightConvos(locale, pick, opts = {}) {
1204
+ let changed = [];
1205
+ _index.default.map(this.lightConvos, convo => {
1206
+ if (!convo) return;
1207
+ _index.default.map(convo.events, ev => {
1208
+ let message = _index.default.get(ev, 'data.message');
1209
+ if (!message) return;
1210
+ let ok = false;
1211
+ if (convo.light_type === 'widget' && _index.default.get(ev, 'id', '').startsWith('widget-greeting-')) {
1212
+ let text = opts.widgetGreeting && _index.default.get(opts.widgetGreeting(), 'data.message.text');
1213
+ if (text) {
1214
+ message.text = text;
1215
+ ok = true;
1216
+ }
1217
+ } else {
1218
+ ok = (0, _localize.localizeMessage)(message, pick);
1219
+ }
1220
+ if (!ok) return;
1221
+ if (_index.default.get(convo, 'last_message_sent.id') === ev.id) convo.last_message_sent = _index.default.cloneDeep(ev);
1222
+ changed.push(ev);
1223
+ });
1224
+ convo.locale = locale;
1225
+ });
1226
+ if (_index.default.size(this.lightConvos)) this.kv.put('light_convos', this.lightConvos);
1227
+ this.relocalizePreview(pick, opts.previewGreetingText);
1228
+ if (changed.length) this.pubsub.publish('account');
1229
+ }
1230
+ relocalizePreview(pick, previewGreetingText) {
1231
+ let previewEvent = _index.default.get(this.matchLastview(), 'previewEvent');
1232
+ if (!_index.default.size(previewEvent)) return;
1233
+ let cid = _index.default.get(previewEvent, 'data.message.conversation_id');
1234
+ let next = _index.default.cloneDeep(previewEvent);
1235
+ let ok = false;
1236
+ if (!cid) {
1237
+ let text = previewGreetingText && previewGreetingText();
1238
+ if (text) {
1239
+ next.data.message.text = text;
1240
+ ok = true;
1241
+ }
1242
+ } else {
1243
+ let ev = previewEvent.id && _index.default.find(_index.default.get(this.lightConvos, [cid, 'events']), e => e && e.id === previewEvent.id);
1244
+ if (ev) {
1245
+ next = _index.default.cloneDeep(ev);
1246
+ ok = true;
1247
+ } else {
1248
+ ok = (0, _localize.localizeMessage)(_index.default.get(next, 'data.message'), pick);
1249
+ }
1250
+ }
1251
+ if (ok) this.updateLastview({
1252
+ previewEvent: next
1253
+ });
1254
+ }
1200
1255
  deleteLightConvo(id) {
1201
1256
  delete this.lightConvos[id];
1202
1257
  this.kv.put('light_convos', this.lightConvos);
@@ -1273,9 +1328,10 @@ class Store {
1273
1328
  type: 'bot'
1274
1329
  };
1275
1330
  ev.data = {
1276
- message: message
1331
+ message: _index.default.cloneDeep(message)
1277
1332
  };
1278
1333
  ev.data.message.conversation_id = convoid;
1334
+ (0, _localize.localizeMessage)(ev.data.message, (0, _localize.pickLocale)(locale));
1279
1335
  lastev = ev;
1280
1336
  return ev;
1281
1337
  });