@subiz/widget-v4 4.0.61 → 4.0.63

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 (154) hide show
  1. package/assets/img/caret.svg +1 -0
  2. package/assets/img/done_green.svg +4 -0
  3. package/assets/img/empty_1.svg +11 -0
  4. package/assets/img/ghn.svg +17 -0
  5. package/assets/img/ghtk.svg +18 -0
  6. package/assets/img/home.svg +1 -0
  7. package/assets/img/info.svg +1 -0
  8. package/assets/img/loader.svg +1 -0
  9. package/assets/img/map-pin.svg +1 -0
  10. package/assets/img/not_found_search.png +0 -0
  11. package/assets/img/package.svg +5 -0
  12. package/assets/img/package_fade.svg +1 -0
  13. package/assets/img/phone.svg +1 -0
  14. package/assets/img/search.svg +1 -0
  15. package/assets/img/shop.svg +1 -0
  16. package/assets/img/shop_faded.svg +1 -0
  17. package/assets/img/user.svg +1 -0
  18. package/assets/img/x.svg +5 -0
  19. package/assets/less/chatbox.less +33 -0
  20. package/assets/less/dropdown_select.less +130 -0
  21. package/assets/less/form.less +7 -20
  22. package/assets/less/order.less +489 -0
  23. package/assets/less/rating.less +3 -8
  24. package/compiled_src/call/call.js +12 -15
  25. package/compiled_src/chatbox/DropdownSelect.js +239 -0
  26. package/compiled_src/chatbox/Event.js +4 -2
  27. package/compiled_src/chatbox/Events.js +1 -0
  28. package/compiled_src/chatbox/MessageInput.js +4 -7
  29. package/compiled_src/chatbox/Order.js +281 -0
  30. package/compiled_src/chatbox/OrderAttachments.js +2 -1
  31. package/compiled_src/chatbox/Rating.js +7 -10
  32. package/compiled_src/chatbox/TextMessage.js +9 -2
  33. package/compiled_src/chatbox/Widget.js +40 -3
  34. package/compiled_src/chatbox/spinner.js +1 -1
  35. package/compiled_src/chatbox/time.js +3 -1
  36. package/compiled_src/common.js +40 -1
  37. package/compiled_src/contact/contact.js +7 -12
  38. package/compiled_src/lib.js +9 -14
  39. package/compiled_src/notif/notif.js +12 -15
  40. package/compiled_src/order/address_picker.js +241 -0
  41. package/compiled_src/order/icon.js +62 -0
  42. package/compiled_src/order/index.js +113 -0
  43. package/compiled_src/order/order.js +1220 -0
  44. package/compiled_src/plugin.js +9 -42
  45. package/compiled_src/popup/countdown.js +4 -7
  46. package/compiled_src/popup/popup.js +9 -12
  47. package/compiled_src/store/api.js +80 -90
  48. package/compiled_src/store/api_fake.js +55 -82
  49. package/compiled_src/store/store.js +163 -158
  50. package/compiled_src/util/common.js +36 -2
  51. package/dist/0b82fa7e5c3b07b40a44.png +1 -0
  52. package/dist/0f4af006e38ee8b93633.png +1 -0
  53. package/dist/{74.js → 132.js} +2232 -235
  54. package/dist/178.js +341 -174
  55. package/dist/17e757ccadd.132.js +1 -0
  56. package/dist/17e757ccadd.178.js +1 -0
  57. package/dist/17e757ccadd.213.js +1 -0
  58. package/dist/17e757ccadd.335.js +1 -0
  59. package/dist/17e757ccadd.362.js +1 -0
  60. package/dist/17e757ccadd.441.js +1 -0
  61. package/dist/17e757ccadd.605.js +1 -0
  62. package/dist/17e757ccadd.678.js +1 -0
  63. package/dist/17e757ccadd.782.js +1 -0
  64. package/dist/17e757ccadd.app.js +1 -0
  65. package/dist/{17db8166252.index.html → 17e757ccadd.index.html} +1 -1
  66. package/dist/{17db8166252.library.html → 17e757ccadd.library.html} +1 -1
  67. package/dist/17e757ccadd.library.js +1 -0
  68. package/dist/{17db8166252.preview.html → 17e757ccadd.preview.html} +1 -1
  69. package/dist/17e757ccadd.preview.js +1 -0
  70. package/dist/17e757ccadd.screenshoot.js +1 -0
  71. package/dist/1ea1c6cd21d25176810c.png +1 -0
  72. package/dist/213.js +18 -88
  73. package/dist/292d42404e1b03398f61.png +1 -0
  74. package/dist/312d376370831b7bea83.png +1 -0
  75. package/dist/313d1bfc1cf776d1aefe.png +1 -0
  76. package/dist/335.js +408 -0
  77. package/dist/362.js +71 -21
  78. package/dist/441.js +69 -43
  79. package/dist/4aa58bb7a66bb44975aa.png +1 -0
  80. package/dist/56ce063bc6c81adb7322.png +1 -0
  81. package/dist/605.js +13 -79
  82. package/dist/678.js +70 -20
  83. package/dist/6a411166ef5cc79e0714.png +1 -0
  84. package/dist/6faf403782fefacc1649.png +1 -0
  85. package/dist/782.js +118 -21
  86. package/dist/79dca33c68fab79c067f.png +1 -0
  87. package/dist/82da1578fa84f9debaeb.png +1 -0
  88. package/dist/8b8e0f0824743974b282.png +1 -0
  89. package/dist/8d551390d81e39130a3c.png +1 -0
  90. package/dist/9fc61b9479877ebdb6c7.png +1 -0
  91. package/dist/HASH +1 -1
  92. package/dist/a165d31dcb3dc90f1057.png +1 -0
  93. package/dist/a98d4a5698812c4426b3.png +1 -0
  94. package/dist/assets/img/caret.998eb8f.svg +1 -0
  95. package/dist/assets/img/done_green.b817fd4.svg +4 -0
  96. package/dist/assets/img/empty_1.0b98af0.svg +11 -0
  97. package/dist/assets/img/ghn.070f8e3.svg +17 -0
  98. package/dist/assets/img/ghtk.326eac1.svg +18 -0
  99. package/dist/assets/img/info.ebce7ea.svg +1 -0
  100. package/dist/assets/img/loader.37000a7.svg +1 -0
  101. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  102. package/dist/assets/img/package.8d37d0f.svg +5 -0
  103. package/dist/assets/img/package_fade.763c001.svg +1 -0
  104. package/dist/assets/img/search.f9705ff.svg +1 -0
  105. package/dist/assets/img/shop.f7dc7d8.svg +1 -0
  106. package/dist/assets/img/shop_faded.df7845a.svg +1 -0
  107. package/dist/assets/img/x.26fdfa3.svg +5 -0
  108. package/dist/c41606bf9d1b604e46d5.png +1 -0
  109. package/dist/ce1f7450ce6c1aacd330.png +1 -0
  110. package/dist/cf8c01e88f4770a6e3e5.png +1 -0
  111. package/dist/dfbcfeab1d5622a737e2.png +1 -0
  112. package/dist/e4893ed8c2f7b8329919.png +1 -0
  113. package/dist/ec2ab4eb4ef73d186186.png +1 -0
  114. package/dist/screenshoot.html +1 -1
  115. package/dist/screenshoot.js +448 -386
  116. package/order.html +19 -771
  117. package/package.json +12 -13
  118. package/src/chatbox/DropdownSelect.js +229 -0
  119. package/src/chatbox/Event.js +2 -2
  120. package/src/chatbox/Events.js +43 -42
  121. package/src/chatbox/Order.js +232 -0
  122. package/src/chatbox/OrderAttachments.js +2 -1
  123. package/src/chatbox/TextMessage.js +21 -12
  124. package/src/chatbox/Widget.js +34 -4
  125. package/src/chatbox/spinner.js +1 -1
  126. package/src/chatbox/time.js +1 -1
  127. package/src/common.js +52 -8
  128. package/src/contact/contact.js +1 -1
  129. package/src/order/address_picker.js +235 -0
  130. package/src/order/icon.js +32 -0
  131. package/src/order/index.js +86 -0
  132. package/src/order/order.js +1157 -0
  133. package/src/order/scratch +211 -0
  134. package/src/plugin.js +7 -52
  135. package/src/store/api.js +26 -1
  136. package/src/store/store.js +46 -9
  137. package/src/util/common.js +48 -2
  138. package/webpack.dev.js +2 -0
  139. package/dist/17db8166252.178.js +0 -1
  140. package/dist/17db8166252.213.js +0 -1
  141. package/dist/17db8166252.362.js +0 -1
  142. package/dist/17db8166252.441.js +0 -1
  143. package/dist/17db8166252.605.js +0 -1
  144. package/dist/17db8166252.619.js +0 -1
  145. package/dist/17db8166252.678.js +0 -1
  146. package/dist/17db8166252.74.js +0 -1
  147. package/dist/17db8166252.782.js +0 -1
  148. package/dist/17db8166252.app.js +0 -1
  149. package/dist/17db8166252.library.js +0 -1
  150. package/dist/17db8166252.preview.js +0 -1
  151. package/dist/17db8166252.screenshoot.js +0 -1
  152. package/dist/619.js +0 -777
  153. package/order.js +0 -0
  154. package/test.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subiz/widget-v4",
3
- "version": "4.0.61",
3
+ "version": "4.0.63",
4
4
  "main": "./compiled_src/lib.js",
5
5
  "scripts": {
6
6
  "dev": "npx webpack serve --config webpack.dev.js",
@@ -9,33 +9,32 @@
9
9
  "lib": "rm -rf compiled_src && npx babel --out-dir=compiled_src src"
10
10
  },
11
11
  "dependencies": {
12
- "@googlemaps/js-api-loader": "^1.12.11",
13
12
  "@subiz/ajax": "^3.0.12",
14
13
  "@subiz/flow": "^1.0.9",
15
14
  "@subiz/storage": "0.0.8",
16
15
  "@subiz/wsclient": "^3.1.7",
17
16
  "cookie_js": "1.4.2",
18
- "core-js": "^3.20.0",
19
- "css-loader": "^5.2.6",
17
+ "core-js": "^3.20.3",
18
+ "css-loader": "^6.5.1",
20
19
  "file-loader": "^6.2.0",
21
20
  "less": "^4.1.2",
22
21
  "less-loader": "^10.2.0",
23
- "marked": "^4.0.7",
22
+ "marked": "^4.0.10",
24
23
  "preact": "^10.6.4"
25
24
  },
26
25
  "devDependencies": {
26
+ "@babel/cli": "^7.16.8",
27
+ "@babel/core": "^7.16.7",
28
+ "@babel/plugin-proposal-class-properties": "^7.16.7",
29
+ "@babel/plugin-transform-react-jsx": "^7.16.7",
30
+ "@babel/preset-env": "^7.16.8",
27
31
  "babel-loader": "^8.2.3",
28
- "@babel/core": "^7.16.5",
29
- "@babel/cli": "^7.16.0",
30
- "@babel/plugin-proposal-class-properties": "^7.16.5",
31
- "@babel/plugin-transform-react-jsx": "^7.16.5",
32
- "@babel/preset-env": "^7.16.5",
33
32
  "babel-plugin-syntax-jsx": "^6.18.0",
34
33
  "html-webpack-plugin": "^5.5.0",
35
- "puppeteer": "^13.0.0",
36
- "webpack": "^5.65.0",
34
+ "puppeteer": "^13.0.1",
35
+ "webpack": "^5.66.0",
37
36
  "webpack-bundle-analyzer": "^4.5.0",
38
37
  "webpack-cli": "^4.9.1",
39
- "webpack-dev-server": "^4.6.0"
38
+ "webpack-dev-server": "^4.7.3"
40
39
  }
41
40
  }
@@ -0,0 +1,229 @@
1
+ import sb from '../util/index.js'
2
+ import {Com, Clickaway} from '../common.js'
3
+ import {h, createRef} from 'preact'
4
+ import Spinner from './spinner.js'
5
+
6
+ // props: ['items', 'mode', 'has_search', selected, loading, width, full],
7
+ export default class DropdownSelect extends Com {
8
+ state = {
9
+ show: false,
10
+ searchValue: '',
11
+ }
12
+
13
+ filterRef = createRef()
14
+ overlayRef = createRef()
15
+
16
+ constructor(props) {
17
+ super(props)
18
+
19
+ document.addEventListener('touchmove', function(e) {
20
+ // e.preventDefault();
21
+ // e.stopPropagation();
22
+ // alert('2')
23
+ // return false
24
+ })
25
+ }
26
+
27
+ onTouchMove = (e) => {
28
+ if (e.target === this.overlayRef.current) {
29
+ e.preventDefault()
30
+ e.stopPropagation()
31
+ }
32
+ }
33
+
34
+ hideDropdown = () => {
35
+ this.setState({show: false, searchValue: ''})
36
+ }
37
+
38
+ onKeydown = (e) => {
39
+ if (e.key === 'Escape') {
40
+ if (!this.state.show) return
41
+ if (this.state.searchValue) this.setState({searchValue: ''})
42
+ else this.hideDropdown()
43
+ e.preventDefault()
44
+ e.stopPropagation()
45
+ }
46
+ }
47
+
48
+ hasSearch = () => {
49
+ if (this.props.has_search) return true
50
+ return sb.size(this.props.items) >= 10
51
+ }
52
+
53
+ getFilteredOptions = () => {
54
+ let items = this.props.items
55
+ if (this.state.searchValue && this.hasSearch()) {
56
+ items = sb.filter(items, (item) => {
57
+ let optionName = sb
58
+ .unicodeToAscii(item.name)
59
+ .toLowerCase()
60
+ .replace(/ /g, '')
61
+ let optionDesc = sb
62
+ .unicodeToAscii(item.desc)
63
+ .toLowerCase()
64
+ .replace(/ /g, '')
65
+ let searchValue = sb
66
+ .unicodeToAscii(this.state.searchValue)
67
+ .toLowerCase()
68
+ .replace(/ /g, '')
69
+ return optionName.indexOf(searchValue) != -1 || optionDesc.indexOf(searchValue) != -1
70
+ })
71
+ }
72
+ return items
73
+ }
74
+
75
+ componentDidMount() {
76
+ window.addEventListener('keydown', this.onKeydown)
77
+ }
78
+
79
+ componentWillUnmount() {
80
+ window.removeEventListener('keydown', this.onKeydown)
81
+ }
82
+
83
+ onChangeSearchValue = (e) => {
84
+ this.setState({searchValue: e.target.value})
85
+ }
86
+
87
+ renderEmpty() {
88
+ return (
89
+ <div class='dropdown_select_filter__empty'>
90
+ <img class='dropdown_select_filter__empty_img' src={require('../../assets/img/not_found_search.png')} />
91
+ <div class='muted' style='text-align: center !important;'>
92
+ Không có kết quả
93
+ </div>
94
+ </div>
95
+ )
96
+ }
97
+
98
+ renderLoading() {
99
+ return (
100
+ <div class='dropdown_select_filter__empty pt-3'>
101
+ <Spinner size='40' static />
102
+ <div class='muted mt-2' style='text-align: center !important;'>
103
+ Đang tải dữ liệu
104
+ </div>
105
+ </div>
106
+ )
107
+ }
108
+
109
+ toogleDropdown = async () => {
110
+ await this.setState({show: true, searchValue: ''})
111
+ this.focusFilter()
112
+ }
113
+
114
+ focusFilter() {
115
+ if (!this.filterRef.current) return
116
+ this.filterRef.current.focus()
117
+ setTimeout(() => {
118
+ if (!this.filterRef.current) return
119
+ this.filterRef.current.focus()
120
+ }, 100)
121
+ }
122
+
123
+ onSelect = (item) => {
124
+ this.props.onSelect(item)
125
+ this.hideDropdown()
126
+ }
127
+
128
+ renderDropdown() {
129
+ if (!this.state.show) return null
130
+
131
+ let items = this.getFilteredOptions()
132
+ let $items = sb.map(items, (item) => {
133
+ return (
134
+ <div class='dropdown_select__item' onClick={(_) => this.onSelect(item)}>
135
+ {item.name}
136
+ </div>
137
+ )
138
+ })
139
+
140
+ let $filter = null
141
+ if (this.hasSearch()) {
142
+ let $img = <img class='dropdown_select_filter__icon' src={require('../../assets/img/search.svg')} />
143
+ if (this.props.loading) {
144
+ $img = <img class='dropdown_select_filter__icon' src={require('../../assets/img/loader.svg')} />
145
+ }
146
+ $filter = (
147
+ <div class='dropdown_select_filter'>
148
+ {$img}
149
+ <input
150
+ ref={this.filterRef}
151
+ value={this.state.searchValue}
152
+ onInput={this.onChangeSearchValue}
153
+ type='text'
154
+ class='dropdown_select_filter_input '
155
+ />
156
+ </div>
157
+ )
158
+ }
159
+
160
+ if ($items.length == 0) $items = this.renderEmpty()
161
+ if (this.props.loading) $items = this.renderLoading()
162
+
163
+ let style = `width: ${this.props.width || '150px'} !important;`
164
+ if (this.props.full) {
165
+ style = ` top: 20px !important; left: 20px !important; right: 20px !important; width: unset !important; `
166
+ return (
167
+ <div
168
+ class='dropdown_select__overlay'
169
+ ref={this.overlayRef}
170
+ onClick={this.hideDropdown}
171
+ onTouchMove={this.onTouchMove}>
172
+ <div
173
+ class='dropdown_select'
174
+ style={style}
175
+ onClick={(e) => {
176
+ e.preventDefault()
177
+ e.stopPropagation()
178
+ }}>
179
+ {$filter}
180
+ <div class='dropdown_select__items'>{$items}</div>
181
+ </div>
182
+ </div>
183
+ )
184
+ }
185
+
186
+ return (
187
+ <div class='dropdown_select' style={style}>
188
+ {$filter}
189
+ <div class='dropdown_select__items'>{$items}</div>
190
+ </div>
191
+ )
192
+ }
193
+
194
+ onBackgroundScroll = (e) => {
195
+ console.log('EEEEEEE', e)
196
+ alert('y')
197
+ }
198
+
199
+ render() {
200
+ let $name = (
201
+ <div class='muted text-truncate' style='flex: 1 !important;'>
202
+ Chọn một phần tử
203
+ </div>
204
+ )
205
+ if (sb.get(this.props, 'selected.name'))
206
+ $name = (
207
+ <div class='text-truncate' style='flex: 1 !important;'>
208
+ {sb.get(this.props, 'selected.name')}
209
+ </div>
210
+ )
211
+
212
+ let style = 'position: relative !important;'
213
+ if (this.props.full) {
214
+ style = ''
215
+ }
216
+
217
+ return (
218
+ <div style={style}>
219
+ <Clickaway onClickaway={this.hideDropdown}>
220
+ <div type='text' class={'dropdown_select_input ' + this.props.extra_cls} onClick={this.toogleDropdown}>
221
+ {$name}&nbsp;
222
+ <img class='dropdown_select__caret' src={require('../../assets/img/caret.svg')} />
223
+ </div>
224
+ {this.renderDropdown()}
225
+ </Clickaway>
226
+ </div>
227
+ )
228
+ }
229
+ }
@@ -125,7 +125,7 @@ export default class Event extends Com {
125
125
  <div class='convo-event agent-message' title={t}>
126
126
  {$time}
127
127
  {$sender}
128
- <TextMessage store={this.props.store} ev={ev} />
128
+ <TextMessage store={this.props.store} ev={ev} onLink={this.props.onLink} />
129
129
  <ImageAttachments store={this.props.store} ev={ev} />
130
130
  <AudioAttachments store={this.props.store} ev={ev} />
131
131
  <VideoAttachments store={this.props.store} ev={ev} />
@@ -177,7 +177,7 @@ export default class Event extends Com {
177
177
  {$sender}
178
178
  <div class='message-user__container'>
179
179
  {$dot}
180
- <TextMessage store={this.props.store} ev={ev} refresh={this.state.refresh} />
180
+ <TextMessage store={this.props.store} ev={ev} refresh={this.state.refresh} onLink={this.props.onLink} />
181
181
  <ImageAttachments store={this.props.store} ev={ev} />
182
182
  <AudioAttachments store={this.props.store} ev={ev} />
183
183
  <VideoAttachments store={this.props.store} ev={ev} />
@@ -4,15 +4,15 @@ const convoemptyimg = require('../../assets/img/convos_empty.svg')
4
4
  import sb from '../util/index.js'
5
5
 
6
6
  import Spinner from './spinner.js'
7
- import { Com } from '../common.js'
8
- import { h, Fragment } from 'preact'
7
+ import {Com} from '../common.js'
8
+ import {h, Fragment} from 'preact'
9
9
 
10
10
  // ['cid', 'creating', 'isShow'],
11
11
  export default class Events extends Com {
12
- constructor (props) {
12
+ constructor(props) {
13
13
  super(props)
14
- this.props.store.onUpdate(this, _ => this.forceUpdate())
15
- this.props.store.onConvoEvent(this, ev => this.onEvent(ev))
14
+ this.props.store.onUpdate(this, (_) => this.forceUpdate())
15
+ this.props.store.onConvoEvent(this, (ev) => this.onEvent(ev))
16
16
  this.loadConvo()
17
17
  this.refBody = null
18
18
 
@@ -29,20 +29,20 @@ export default class Events extends Com {
29
29
  this.checkAndSeen()
30
30
  }
31
31
 
32
- componentDidUpdate (prevProps) {
32
+ componentDidUpdate(prevProps) {
33
33
  if (prevProps.cid !== this.props.cid) this.loadConvo()
34
34
  }
35
35
 
36
- render () {
36
+ render() {
37
37
  if (this.state.error) return this.renderError()
38
38
  let events = sb.map(this.props.store.listEvents(this.props.cid))
39
39
 
40
40
  if (!this.state.loading && sb.size(events) === 0) {
41
41
  return (
42
- <div ref={ref => (this.refBody = ref)} class="widget-body--events-container">
43
- <div class="widget-body--empty">
44
- <div class="widget-body--empty-icon"></div>
45
- <div class="widget-body--empty-text">{this.props.t('empty_convo_text')}</div>
42
+ <div ref={(ref) => (this.refBody = ref)} class='widget-body--events-container'>
43
+ <div class='widget-body--empty'>
44
+ <div class='widget-body--empty-icon'></div>
45
+ <div class='widget-body--empty-text'>{this.props.t('empty_convo_text')}</div>
46
46
  </div>
47
47
  <PoweredBy store={this.props.store} />
48
48
  </div>
@@ -52,11 +52,12 @@ export default class Events extends Com {
52
52
  events = sb.orderBy(events, 'created', 'asc')
53
53
 
54
54
  let convo = this.props.store.matchConvo(this.props.cid)
55
- events = sb.map(events, ev => ({ ev: ev }))
55
+ events = sb.map(events, (ev) => ({ev: ev}))
56
56
  processEvents(convo, events)
57
57
 
58
- let $events = sb.map(events, ev => (
58
+ let $events = sb.map(events, (ev) => (
59
59
  <Event
60
+ onLink={this.props.onLink}
60
61
  store={this.props.store}
61
62
  onFormSubmit={this.props.onFormSubmit}
62
63
  onSend={this.props.onSend}
@@ -70,7 +71,7 @@ export default class Events extends Com {
70
71
  let $loading = null
71
72
  let style = 'opacity: 1 !important'
72
73
  if (this.state.loading || this.props.creating) {
73
- $loading = <Spinner static mode="blue" size="120" center />
74
+ $loading = <Spinner static mode='blue' size='120' center />
74
75
  style = 'opacity: 0 !important'
75
76
  }
76
77
 
@@ -79,33 +80,33 @@ export default class Events extends Com {
79
80
  {$loading}
80
81
  <div
81
82
  style={style}
82
- ref={ref => (this.refBody = ref)}
83
- class="widget-body--events-container"
83
+ ref={(ref) => (this.refBody = ref)}
84
+ class='widget-body--events-container'
84
85
  onMouseOver={this.checkAndSeen}>
85
- <div class="widget-body--events">{$events}</div>
86
+ <div class='widget-body--events'>{$events}</div>
86
87
  <PoweredBy store={this.props.store} />
87
88
  </div>
88
89
  </Fragment>
89
90
  )
90
91
  }
91
92
 
92
- renderError () {
93
+ renderError() {
93
94
  let $tryAgainBtn = (
94
- <a href="#" onclick={_ => this.loadConvo()}>
95
+ <a href='#' onclick={(_) => this.loadConvo()}>
95
96
  {this.props.t('try_again')}
96
97
  </a>
97
98
  )
98
- if (this.state.loading) $tryAgainBtn = <Spinner size="16" mode="blue" />
99
+ if (this.state.loading) $tryAgainBtn = <Spinner size='16' mode='blue' />
99
100
  return (
100
- <div class="widget-body--events-container widget-body--events-container__error">
101
- <img alt="empty" src={convoemptyimg} />
102
- <div class="widget_body__events__error_msg">{this.props.t('load_convo_error')}</div>
103
- <div class="widget_body__events__error_retry">{$tryAgainBtn}</div>
101
+ <div class='widget-body--events-container widget-body--events-container__error'>
102
+ <img alt='empty' src={convoemptyimg} />
103
+ <div class='widget_body__events__error_msg'>{this.props.t('load_convo_error')}</div>
104
+ <div class='widget_body__events__error_retry'>{$tryAgainBtn}</div>
104
105
  </div>
105
106
  )
106
107
  }
107
108
 
108
- focus () {
109
+ focus() {
109
110
  let events = this.props.store.listEvents(this.props.cid)
110
111
  events = sb.orderBy(sb.map(events), 'created', 'desc')
111
112
  // find first msg_sent event of agent
@@ -121,7 +122,7 @@ export default class Events extends Com {
121
122
 
122
123
  let attachments = sb.get(last_agent_sent, 'data.message.attachments', [])
123
124
  let convo = this.props.store.matchConvo(this.props.cid)
124
- let pendingForms = sb.filter(attachments, att => {
125
+ let pendingForms = sb.filter(attachments, (att) => {
125
126
  if (!att) return false
126
127
  if (att.type !== 'form' && att.type !== 'ask_info_form') return false
127
128
  var form = att.form
@@ -138,7 +139,7 @@ export default class Events extends Com {
138
139
  //}
139
140
  }
140
141
 
141
- onEvent (newev) {
142
+ onEvent(newev) {
142
143
  if (sb.convoOfEv(newev) !== this.props.cid) return
143
144
  let isBottom = this.isBottom()
144
145
 
@@ -149,37 +150,37 @@ export default class Events extends Com {
149
150
  if (byme || isBottom) this.scrollToBottom()
150
151
  }
151
152
 
152
- async loadConvo () {
153
+ async loadConvo() {
153
154
  if (!this.props.cid) return
154
155
  // load msg
155
156
  this.lastContentOffsetY = 0
156
- this.setState({ loading: true })
157
+ this.setState({loading: true})
157
158
  let events = this.props.store.listEvents(this.props.cid)
158
159
  if (sb.size(events) === 0) {
159
160
  let cid = this.props.cid
160
- let { error } = await this.props.store.fetchMoreEvents(cid)
161
- this.setState({ loading: false })
161
+ let {error} = await this.props.store.fetchMoreEvents(cid)
162
+ this.setState({loading: false})
162
163
  if (cid !== this.props.cid) return // out dated
163
164
  if (error) {
164
- this.setState({ error: true })
165
+ this.setState({error: true})
165
166
  return
166
167
  }
167
168
  }
168
- this.setState({ loading: true })
169
+ this.setState({loading: true})
169
170
  this.props.store.fetchMoreEvents(this.props.cid)
170
- this.setState({ error: false })
171
+ this.setState({error: false})
171
172
  this.scrollToBottom()
172
173
 
173
- setTimeout(() => this.setState({ loading: false }), 50)
174
+ setTimeout(() => this.setState({loading: false}), 50)
174
175
  }
175
176
 
176
- isBottom () {
177
+ isBottom() {
177
178
  let $container = this.refBody
178
179
  if (!$container) return false
179
180
  return $container.scrollHeight < $container.scrollTop + $container.offsetHeight + 50
180
181
  }
181
182
 
182
- scrollToBottom () {
183
+ scrollToBottom() {
183
184
  setTimeout(() => {
184
185
  const $div = this.refBody
185
186
  if ($div) $div.scrollTop = $div.scrollHeight
@@ -200,8 +201,8 @@ export default class Events extends Com {
200
201
  // [{ev: {}, mode: 'time'}]
201
202
  //_mode = time
202
203
  //_mode = lead
203
- function processEvents (convo, events) {
204
- events = events.filter(event => visibleEvent(event.ev))
204
+ function processEvents(convo, events) {
205
+ events = events.filter((event) => visibleEvent(event.ev))
205
206
  if (events.length < 1) return
206
207
 
207
208
  // show time for the first msg sent
@@ -242,7 +243,7 @@ function processEvents (convo, events) {
242
243
  }
243
244
  }
244
245
 
245
- function visibleEvent (ev) {
246
+ function visibleEvent(ev) {
246
247
  let type = sb.get(ev, 'type')
247
248
  return (
248
249
  // type === 'conversation_joined' ||
@@ -251,7 +252,7 @@ function visibleEvent (ev) {
251
252
  )
252
253
  }
253
254
 
254
- function isSummited (form) {
255
+ function isSummited(form) {
255
256
  let fields = sb.get(form, 'fields') || []
256
- return sb.find(fields, field => !!field.answered)
257
+ return sb.find(fields, (field) => !!field.answered)
257
258
  }