@subiz/widget-v4 4.0.58 → 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 (156) 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 +35 -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/main.js +2 -1
  35. package/compiled_src/chatbox/spinner.js +1 -1
  36. package/compiled_src/chatbox/time.js +3 -1
  37. package/compiled_src/common.js +40 -1
  38. package/compiled_src/contact/contact.js +7 -12
  39. package/compiled_src/lib.js +9 -14
  40. package/compiled_src/notif/notif.js +12 -15
  41. package/compiled_src/order/address_picker.js +241 -0
  42. package/compiled_src/order/icon.js +62 -0
  43. package/compiled_src/order/index.js +113 -0
  44. package/compiled_src/order/order.js +1220 -0
  45. package/compiled_src/plugin.js +9 -42
  46. package/compiled_src/popup/countdown.js +4 -7
  47. package/compiled_src/popup/popup.js +40 -13
  48. package/compiled_src/store/api.js +80 -90
  49. package/compiled_src/store/api_fake.js +55 -82
  50. package/compiled_src/store/store.js +163 -158
  51. package/compiled_src/util/common.js +40 -4
  52. package/dist/0b82fa7e5c3b07b40a44.png +1 -0
  53. package/dist/0f4af006e38ee8b93633.png +1 -0
  54. package/dist/{74.js → 132.js} +2234 -236
  55. package/dist/178.js +341 -174
  56. package/dist/17e757ccadd.132.js +1 -0
  57. package/dist/17e757ccadd.178.js +1 -0
  58. package/dist/17e757ccadd.213.js +1 -0
  59. package/dist/17e757ccadd.335.js +1 -0
  60. package/dist/17e757ccadd.362.js +1 -0
  61. package/dist/17e757ccadd.441.js +1 -0
  62. package/dist/17e757ccadd.605.js +1 -0
  63. package/dist/17e757ccadd.678.js +1 -0
  64. package/dist/17e757ccadd.782.js +1 -0
  65. package/dist/17e757ccadd.app.js +1 -0
  66. package/dist/{17d938a5acb.index.html → 17e757ccadd.index.html} +3 -18
  67. package/dist/{17d938a5acb.library.html → 17e757ccadd.library.html} +3 -18
  68. package/dist/17e757ccadd.library.js +1 -0
  69. package/dist/{17d938a5acb.preview.html → 17e757ccadd.preview.html} +1 -1
  70. package/dist/17e757ccadd.preview.js +1 -0
  71. package/dist/17e757ccadd.screenshoot.js +1 -0
  72. package/dist/1ea1c6cd21d25176810c.png +1 -0
  73. package/dist/213.js +46 -87
  74. package/dist/292d42404e1b03398f61.png +1 -0
  75. package/dist/312d376370831b7bea83.png +1 -0
  76. package/dist/313d1bfc1cf776d1aefe.png +1 -0
  77. package/dist/335.js +408 -0
  78. package/dist/362.js +71 -21
  79. package/dist/441.js +69 -43
  80. package/dist/4aa58bb7a66bb44975aa.png +1 -0
  81. package/dist/56ce063bc6c81adb7322.png +1 -0
  82. package/dist/605.js +13 -79
  83. package/dist/678.js +70 -20
  84. package/dist/6a411166ef5cc79e0714.png +1 -0
  85. package/dist/6faf403782fefacc1649.png +1 -0
  86. package/dist/782.js +118 -21
  87. package/dist/79dca33c68fab79c067f.png +1 -0
  88. package/dist/82da1578fa84f9debaeb.png +1 -0
  89. package/dist/8b8e0f0824743974b282.png +1 -0
  90. package/dist/8d551390d81e39130a3c.png +1 -0
  91. package/dist/9fc61b9479877ebdb6c7.png +1 -0
  92. package/dist/HASH +1 -1
  93. package/dist/a165d31dcb3dc90f1057.png +1 -0
  94. package/dist/a98d4a5698812c4426b3.png +1 -0
  95. package/dist/assets/img/caret.998eb8f.svg +1 -0
  96. package/dist/assets/img/done_green.b817fd4.svg +4 -0
  97. package/dist/assets/img/empty_1.0b98af0.svg +11 -0
  98. package/dist/assets/img/ghn.070f8e3.svg +17 -0
  99. package/dist/assets/img/ghtk.326eac1.svg +18 -0
  100. package/dist/assets/img/info.ebce7ea.svg +1 -0
  101. package/dist/assets/img/loader.37000a7.svg +1 -0
  102. package/dist/assets/img/not_found_search.2ddb8d1.png +0 -0
  103. package/dist/assets/img/package.8d37d0f.svg +5 -0
  104. package/dist/assets/img/package_fade.763c001.svg +1 -0
  105. package/dist/assets/img/search.f9705ff.svg +1 -0
  106. package/dist/assets/img/shop.f7dc7d8.svg +1 -0
  107. package/dist/assets/img/shop_faded.df7845a.svg +1 -0
  108. package/dist/assets/img/x.26fdfa3.svg +5 -0
  109. package/dist/c41606bf9d1b604e46d5.png +1 -0
  110. package/dist/ce1f7450ce6c1aacd330.png +1 -0
  111. package/dist/cf8c01e88f4770a6e3e5.png +1 -0
  112. package/dist/dfbcfeab1d5622a737e2.png +1 -0
  113. package/dist/e4893ed8c2f7b8329919.png +1 -0
  114. package/dist/ec2ab4eb4ef73d186186.png +1 -0
  115. package/dist/screenshoot.html +1 -1
  116. package/dist/screenshoot.js +452 -389
  117. package/index.html +3 -18
  118. package/order.html +32 -0
  119. package/package.json +13 -14
  120. package/src/chatbox/DropdownSelect.js +229 -0
  121. package/src/chatbox/Event.js +2 -2
  122. package/src/chatbox/Events.js +43 -42
  123. package/src/chatbox/Order.js +232 -0
  124. package/src/chatbox/OrderAttachments.js +2 -1
  125. package/src/chatbox/TextMessage.js +21 -12
  126. package/src/chatbox/Widget.js +34 -4
  127. package/src/chatbox/main.js +2 -2
  128. package/src/chatbox/spinner.js +1 -1
  129. package/src/chatbox/time.js +1 -1
  130. package/src/common.js +52 -8
  131. package/src/contact/contact.js +1 -1
  132. package/src/order/address_picker.js +235 -0
  133. package/src/order/icon.js +32 -0
  134. package/src/order/index.js +86 -0
  135. package/src/order/order.js +1157 -0
  136. package/src/order/scratch +211 -0
  137. package/src/plugin.js +7 -52
  138. package/src/popup/popup.js +27 -2
  139. package/src/store/api.js +26 -1
  140. package/src/store/store.js +46 -9
  141. package/src/util/common.js +52 -4
  142. package/webpack.dev.js +2 -0
  143. package/dist/17d938a5acb.178.js +0 -1
  144. package/dist/17d938a5acb.213.js +0 -1
  145. package/dist/17d938a5acb.362.js +0 -1
  146. package/dist/17d938a5acb.441.js +0 -1
  147. package/dist/17d938a5acb.605.js +0 -1
  148. package/dist/17d938a5acb.619.js +0 -1
  149. package/dist/17d938a5acb.678.js +0 -1
  150. package/dist/17d938a5acb.74.js +0 -1
  151. package/dist/17d938a5acb.782.js +0 -1
  152. package/dist/17d938a5acb.app.js +0 -1
  153. package/dist/17d938a5acb.library.js +0 -1
  154. package/dist/17d938a5acb.preview.js +0 -1
  155. package/dist/17d938a5acb.screenshoot.js +0 -1
  156. package/dist/619.js +0 -777
@@ -0,0 +1,235 @@
1
+ import sb from '../util/index.js'
2
+ import {Com, Clickaway} from '../common.js'
3
+ import {h, createRef} from 'preact'
4
+ import Spinner from '../chatbox/spinner.js'
5
+
6
+ // props: ['items', 'mode', 'has_search', selected, loading, width, full],
7
+ export default class AddressPicker extends Com {
8
+ state = {
9
+ show: false,
10
+ searchValue: '',
11
+ addresses: [],
12
+ }
13
+
14
+ filterRef = createRef()
15
+ overlayRef = createRef()
16
+
17
+ constructor(props) {
18
+ super(props)
19
+
20
+ document.addEventListener('touchmove', function(e) {
21
+ // e.preventDefault();
22
+ // e.stopPropagation();
23
+ // alert('2')
24
+ // return false
25
+ })
26
+ }
27
+
28
+ onTouchMove = (e) => {
29
+ if (e.target === this.overlayRef.current) {
30
+ e.preventDefault()
31
+ e.stopPropagation()
32
+ }
33
+ }
34
+
35
+ hideDropdown = () => {
36
+ this.setState({show: false, searchValue: ''})
37
+ }
38
+
39
+ onKeydown = (e) => {
40
+ if (e.key === 'Escape') {
41
+ if (!this.state.show) return
42
+ if (this.state.searchValue) this.setState({searchValue: ''})
43
+ else this.hideDropdown()
44
+ e.preventDefault()
45
+ e.stopPropagation()
46
+ }
47
+
48
+ if (e.key == 'Enter') {
49
+ }
50
+ }
51
+
52
+ doSearch = sb.throttle(async () => {
53
+ // flag to detect rat race
54
+ let requestId = Date.now()
55
+ this.requestId = requestId
56
+
57
+ let res = await this.props.store.suggest_addresses(this.state.searchValue)
58
+
59
+ // avoid previouse request render after
60
+ if (this.requestId !== requestId) return
61
+ this.setState({addresses: sb.get(res, 'body.addresses', [])})
62
+ }, 100)
63
+
64
+ componentDidMount() {
65
+ window.addEventListener('keydown', this.onKeydown)
66
+ }
67
+
68
+ componentWillUnmount() {
69
+ window.removeEventListener('keydown', this.onKeydown)
70
+ }
71
+
72
+ onChangeSearchValue = (e) => {
73
+ this.setState({searchValue: e.target.value})
74
+ this.props.onChangeAddress(e.target.value)
75
+ this.doSearch()
76
+ }
77
+
78
+ renderEmpty() {
79
+ return (
80
+ <div class='dropdown_select_filter__empty'>
81
+ <img class='dropdown_select_filter__empty_img' src={require('../../assets/img/not_found_search.png')} />
82
+ <div class='muted' style='text-align: center !important;'>
83
+ Không có kết quả
84
+ </div>
85
+ </div>
86
+ )
87
+ }
88
+
89
+ renderLoading() {
90
+ return (
91
+ <div class='dropdown_select_filter__empty pt-3'>
92
+ <Spinner size='40' static />
93
+ <div class='muted mt-2' style='text-align: center !important;'>
94
+ Đang tải dữ liệu
95
+ </div>
96
+ </div>
97
+ )
98
+ }
99
+
100
+ toogleDropdown = async () => {
101
+ await this.setState({show: true, searchValue: this.props.initAddress || ''})
102
+
103
+ this.focusFilter()
104
+ }
105
+
106
+ focusFilter() {
107
+ if (!this.filterRef.current) return
108
+ this.filterRef.current.focus()
109
+ setTimeout(() => {
110
+ if (!this.filterRef.current) return
111
+ this.filterRef.current.focus()
112
+ }, 100)
113
+ }
114
+
115
+ onSelect = (item) => {
116
+ this.props.onSelect(item)
117
+ this.hideDropdown()
118
+ }
119
+
120
+ renderDropdown() {
121
+ if (!this.state.show) return null
122
+
123
+ let $items = sb.map(this.state.addresses, (addr, i) => {
124
+ let label = [((addr.address || '') + ' ' + normalize(addr.street)).trim()].join(', ')
125
+ let desc = [normalize(addr.ward), normalize(addr.district), normalize(addr.province)].join(', ')
126
+
127
+ return (
128
+ <div class='dropdown_select__item' onClick={(_) => this.onSelect(addr)} key={i}>
129
+ <div>
130
+ <b>{label}</b>
131
+ </div>
132
+ <div style='opacity: 0.7 !important;'>{desc}</div>
133
+ </div>
134
+ )
135
+ })
136
+
137
+ let $filter = null
138
+ let $img = <img class='dropdown_select_filter__icon' src={require('../../assets/img/search.svg')} />
139
+ if (this.props.loading) {
140
+ $img = <img class='dropdown_select_filter__icon' src={require('../../assets/img/loader.svg')} />
141
+ }
142
+ $filter = (
143
+ <div class='dropdown_select_filter'>
144
+ {$img}
145
+ <input
146
+ ref={this.filterRef}
147
+ value={this.state.searchValue}
148
+ onInput={this.onChangeSearchValue}
149
+ type='text'
150
+ class='dropdown_select_filter_input '
151
+ />
152
+ </div>
153
+ )
154
+
155
+ if ($items.length == 0) $items = this.renderEmpty()
156
+ if (this.props.loading) $items = this.renderLoading()
157
+
158
+ let style = `width: ${this.props.width || '150px'} !important;`
159
+ if (this.props.full) {
160
+ style = ` top: 20px !important; left: 20px !important; right: 20px !important; width: unset !important; `
161
+ return (
162
+ <div
163
+ class='dropdown_select__overlay'
164
+ ref={this.overlayRef}
165
+ onClick={this.hideDropdown}
166
+ onTouchMove={this.onTouchMove}>
167
+ <div
168
+ class='dropdown_select'
169
+ style={style}
170
+ onClick={(e) => {
171
+ e.preventDefault()
172
+ e.stopPropagation()
173
+ }}>
174
+ {$filter}
175
+ <div class='dropdown_select__items'>{$items}</div>
176
+ </div>
177
+ </div>
178
+ )
179
+ }
180
+
181
+ return (
182
+ <div class='dropdown_select' style={style}>
183
+ {$filter}
184
+ <div class='dropdown_select__items'>{$items}</div>
185
+ </div>
186
+ )
187
+ }
188
+
189
+ onBackgroundScroll = (e) => {
190
+ console.log('EEEEEEE', e)
191
+ }
192
+
193
+ render() {
194
+ let $name = (
195
+ <div class='text-truncate' style='flex: 1 !important;'>
196
+ {this.props.initAddress}
197
+ </div>
198
+ )
199
+
200
+ let style = 'position: relative !important;'
201
+ if (this.props.full) {
202
+ style = ''
203
+ }
204
+
205
+ return (
206
+ <div style={style}>
207
+ <Clickaway onClickaway={this.hideDropdown}>
208
+ <div type='text' class={'dropdown_select_input ' + this.props.extra_cls} onClick={this.toogleDropdown}>
209
+ {$name}
210
+ </div>
211
+ {this.renderDropdown()}
212
+ </Clickaway>
213
+ </div>
214
+ )
215
+ }
216
+ }
217
+
218
+ function normalize(s) {
219
+ let ls = (s + '').toLowerCase()
220
+ if (ls.startsWith('tp ')) return s.substr(3)
221
+
222
+ if (ls.startsWith('thanh pho ')) return s.substr('thanh pho '.length)
223
+ if (ls.startsWith('thành phố ')) return s.substr('thành phố '.length)
224
+ if (ls.startsWith('tỉnh ')) return s.substr('tỉnh '.length)
225
+ if (ls.startsWith('huyện ')) return s.substr('huyện '.length)
226
+ if (ls.startsWith('tỉnh ')) return s.substr('tỉnh '.length)
227
+ if (ls.startsWith('xã ')) return s.substr('xã '.length)
228
+ if (ls.startsWith('thị trấn ')) return s.substr('thị trấn '.length)
229
+ if (ls.startsWith('thị xã ')) return s.substr('thị xã '.length)
230
+ // phuong khuong dinh => khuong dinh; phuong 1 => phuong 1
231
+ if (ls.startsWith('đường ') && (s[7] < '0' || s[7] > '9')) return s.substr('đường '.length)
232
+ if (ls.startsWith('phường ') && (s[7] < '0' || s[7] > '9')) return s.substr('phường '.length)
233
+ if (ls.startsWith('quận ') && (s[7] < '0' || s[7] > '9')) return s.substr('quận '.length)
234
+ return s
235
+ }
@@ -0,0 +1,32 @@
1
+ import sb from '../util/index.js'
2
+ let promiseMainCSS = (() => import(/*webpackChunkName: "main-css" */ '../chatbox/css.js'))()
3
+
4
+ var $link = document.createElement('link')
5
+ $link.href = 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap'
6
+ $link.rel = 'stylesheet'
7
+ document.head.append($link)
8
+
9
+ sb.preloadWebfonts(['Roboto'], [400, 500])
10
+
11
+ import Time from '../chatbox/time.js'
12
+ let defaultAvatar = require('../../assets/img/default_avatar.png')
13
+ import * as common from '../common.js'
14
+ import DropdownSelect from '../chatbox/DropdownSelect.js'
15
+ import {h, createRef, render, Fragment} from 'preact'
16
+
17
+ export default class Icon extends common.Com {
18
+ render() {
19
+ if (this.props.name == 'package') {
20
+ if (this.props.active)
21
+ return <img style='width: 18px !important;' src={require('../../assets/img/package.svg')} />
22
+
23
+ return <img style='width: 18px !important;' src={require('../../assets/img/package_fade.svg')} />
24
+ }
25
+
26
+ if (this.props.name === 'shop') {
27
+ if (this.props.active) return <img style='width: 18px !important;' src={require('../../assets/img/shop.svg')} />
28
+
29
+ return <img style='width: 18px !important;' src={require('../../assets/img/shop_faded.svg')} />
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,86 @@
1
+ import Store from '../store/store.js'
2
+ import * as common from '../common.js'
3
+ import sb from '../util/index.js'
4
+ import {h, render} from 'preact'
5
+ import Order from './order.js'
6
+ // find the body
7
+ let promiseMainCSS = (() => import(/*webpackChunkName: "main-css" */ '../chatbox/css.js'))()
8
+
9
+ var config = require('../../config.js')
10
+
11
+ function findChatbox(store) {
12
+ var pluginM = store.matchPlugin()
13
+ let chatboxs = sb.filter(pluginM, (plugin) => plugin.type === 'chatbox')
14
+ if (sb.size(chatboxs) === 0) {
15
+ console.error('no chatbox found.')
16
+ return
17
+ }
18
+ return chatboxs[0]
19
+ }
20
+
21
+ function getUrlParameter(name) {
22
+ name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]')
23
+ var regex = new RegExp('[\\?&]' + name + '=([^&#]*)')
24
+ var results = regex.exec(location.search)
25
+ return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '))
26
+ }
27
+
28
+ var $link = document.createElement('link')
29
+ $link.href = 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap'
30
+ $link.rel = 'stylesheet'
31
+ document.head.append($link)
32
+
33
+ sb.preloadWebfonts(['Roboto'], [400, 500])
34
+
35
+ async function load() {
36
+ let store = new Store(config.ApiURL, config.FileURL, config.RealtimeURL, true)
37
+ let signkey = getUrlParameter('x-signed-key')
38
+ let {body, error} = await store.lookupOrder(signkey)
39
+ let order = body
40
+ // order.status = 'confirmed'
41
+ let accid = sb.get(order, 'ctx.credential.account_id')
42
+ let user_id = sb.get(order, 'ctx.credential.issuer')
43
+ let mask = accid + '@' + user_id
44
+ await store.init(accid, mask)
45
+
46
+ window.store = store
47
+
48
+ let t = (key) => {
49
+ if (_locale === 'debug') return `{{${key}}}`
50
+
51
+ let messages = sb.get(common.langMessages, _locale, [])
52
+ let message = sb.find(messages, (message) => message.key === key)
53
+ return sb.get(message, 'message', key)
54
+ }
55
+ let acc = store.matchAccount()
56
+ let plugin = findChatbox(store)
57
+
58
+ // make sure you are still alive
59
+ let css = (await promiseMainCSS).default.default.toString()
60
+ var outcss = sb.replaceCssVariable(css, plugin.chatbox)
61
+
62
+ let $cssStyleDiv = document.createElement('style')
63
+ document.head.appendChild($cssStyleDiv)
64
+ $cssStyleDiv.type = 'text/css'
65
+ $cssStyleDiv.id = 'subiz-style-for-order'
66
+
67
+ sb.setCss('order', $cssStyleDiv, outcss)
68
+
69
+ // auto detect language first
70
+ let _locale = plugin.locale || acc.locale || 'vi-VN'
71
+ t.i18n = (i18nText) => {
72
+ if (!i18nText) return ''
73
+ let fallbackLocale = plugin.locale || acc.locale || 'vi-VN'
74
+ fallbackLocale = fallbackLocale.replace('-', '_')
75
+ let locale = _locale.replace('-', '_')
76
+
77
+ return i18nText[locale] || i18nText[fallbackLocale]
78
+ }
79
+ t.locale = () => _locale
80
+
81
+ common.downloadLanguage(store, _locale).then(() => {
82
+ render(<Order store={store} t={t} order_id={order.id} />, document.getElementById('order'))
83
+ })
84
+ }
85
+
86
+ load()