ordering-ui-external 2.6.7 → 2.6.8
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.
- package/_bundles/{0.ordering-ui.fd1dc326de89a8eb39f9.js → 0.ordering-ui.ba64d5c9c7490676feb5.js} +1 -1
- package/_bundles/{7.ordering-ui.fd1dc326de89a8eb39f9.js → 7.ordering-ui.ba64d5c9c7490676feb5.js} +1 -1
- package/_bundles/ordering-ui.ba64d5c9c7490676feb5.js +2 -0
- package/_modules/components/LanguageSelector/index.js +1 -0
- package/_modules/components/OrderTypeSelectorHeader/index.js +3 -1
- package/_modules/components/SmartAppBanner/index.js +5 -2
- package/_modules/contexts/ThemeContext/index.js +1 -1
- package/_modules/styles/Select/index.js +14 -2
- package/_modules/styles/Selects/index.js +11 -8
- package/_modules/themes/five/src/components/BusinessBasicInformation/BusinessInfoComponent.js +168 -0
- package/_modules/themes/five/src/components/BusinessBasicInformation/SearchComponent.js +39 -0
- package/_modules/themes/five/src/components/BusinessBasicInformation/SocialNetWork.js +19 -0
- package/_modules/themes/five/src/components/BusinessBasicInformation/index.js +35 -156
- package/_modules/themes/five/src/components/BusinessBasicInformation/styles.js +45 -35
- package/_modules/themes/five/src/components/BusinessProductsCategories/index.js +1 -1
- package/_modules/themes/five/src/components/CardForm/index.js +16 -3
- package/_modules/themes/five/src/components/CardForm/styles.js +13 -9
- package/_modules/themes/five/src/components/CardFormCustom/cardUtils.js +102 -0
- package/_modules/themes/five/src/components/CardFormCustom/index.js +148 -0
- package/_modules/themes/five/src/components/CardFormCustom/styles.js +16 -0
- package/_modules/themes/five/src/components/CartPopover/styles.js +1 -1
- package/_modules/themes/five/src/components/Checkout/index.js +31 -22
- package/_modules/themes/five/src/components/LanguageSelector/index.js +4 -1
- package/_modules/themes/five/src/components/LoginForm/index.js +11 -8
- package/_modules/themes/five/src/components/Modal/styles.js +1 -1
- package/_modules/themes/five/src/components/OrderContextUI/index.js +13 -1
- package/_modules/themes/five/src/components/OrderDetails/OrderHistory.js +7 -3
- package/_modules/themes/five/src/components/OrderDetails/index.js +4 -2
- package/_modules/themes/five/src/components/PaymentOptionCard/index.js +84 -0
- package/_modules/themes/five/src/components/PaymentOptionStripe/index.js +48 -22
- package/_modules/themes/five/src/components/PaymentOptionStripe/styles.js +3 -1
- package/_modules/themes/five/src/components/PaymentOptions/index.js +46 -24
- package/_modules/themes/five/src/components/RenderProductsLayout/index.js +1 -1
- package/_modules/themes/five/src/components/SearchProducts/styles.js +1 -1
- package/_modules/themes/five/src/components/UserDetails/index.js +1 -1
- package/_modules/themes/five/src/components/UserPopover/styles.js +1 -1
- package/_modules/themes/five/src/styles/Select/index.js +4 -2
- package/_modules/themes/five/src/styles/Selects/index.js +7 -4
- package/_modules/themes/pwa/src/components/MomentPopover/styles.js +1 -1
- package/index.html +1 -1
- package/package.json +4 -2
- package/src/components/LanguageSelector/index.js +1 -0
- package/src/components/OrderTypeSelectorHeader/index.js +3 -1
- package/src/components/SmartAppBanner/index.js +4 -2
- package/src/contexts/ThemeContext/index.js +1 -1
- package/src/styles/Select/index.js +11 -2
- package/src/styles/Selects/index.js +1 -1
- package/src/themes/five/src/components/BusinessBasicInformation/BusinessInfoComponent.js +230 -0
- package/src/themes/five/src/components/BusinessBasicInformation/SearchComponent.js +40 -0
- package/src/themes/five/src/components/BusinessBasicInformation/SocialNetWork.js +10 -0
- package/src/themes/five/src/components/BusinessBasicInformation/index.js +39 -247
- package/src/themes/five/src/components/BusinessBasicInformation/styles.js +14 -4
- package/src/themes/five/src/components/BusinessProductsCategories/index.js +1 -1
- package/src/themes/five/src/components/CardForm/index.js +25 -4
- package/src/themes/five/src/components/CardForm/styles.js +35 -0
- package/src/themes/five/src/components/CardFormCustom/cardUtils.js +111 -0
- package/src/themes/five/src/components/CardFormCustom/index.js +161 -0
- package/src/themes/five/src/components/CardFormCustom/styles.js +20 -0
- package/src/themes/five/src/components/CartPopover/styles.js +1 -1
- package/src/themes/five/src/components/Checkout/index.js +34 -25
- package/src/themes/five/src/components/LanguageSelector/index.js +2 -1
- package/src/themes/five/src/components/LoginForm/index.js +6 -4
- package/src/themes/five/src/components/Modal/styles.js +1 -0
- package/src/themes/five/src/components/OrderContextUI/index.js +10 -3
- package/src/themes/five/src/components/OrderDetails/OrderHistory.js +4 -3
- package/src/themes/five/src/components/OrderDetails/index.js +1 -1
- package/src/themes/five/src/components/PaymentOptionCard/index.js +70 -0
- package/src/themes/five/src/components/PaymentOptionStripe/index.js +46 -20
- package/src/themes/five/src/components/PaymentOptionStripe/styles.js +6 -1
- package/src/themes/five/src/components/PaymentOptions/index.js +28 -3
- package/src/themes/five/src/components/ProductForm/index.js +0 -1
- package/src/themes/five/src/components/RenderProductsLayout/index.js +1 -1
- package/src/themes/five/src/components/SearchProducts/styles.js +1 -1
- package/src/themes/five/src/components/UserDetails/index.js +1 -1
- package/src/themes/five/src/components/UserPopover/styles.js +1 -1
- package/src/themes/five/src/styles/Select/index.js +3 -2
- package/src/themes/five/src/styles/Selects/index.js +1 -1
- package/src/themes/pwa/src/components/MomentPopover/styles.js +4 -1
- package/template/theme.json +3 -1
- package/_bundles/ordering-ui.fd1dc326de89a8eb39f9.js +0 -2
- /package/_bundles/{1.ordering-ui.fd1dc326de89a8eb39f9.js → 1.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{2.ordering-ui.fd1dc326de89a8eb39f9.js → 2.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{4.ordering-ui.fd1dc326de89a8eb39f9.js → 4.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{5.ordering-ui.fd1dc326de89a8eb39f9.js → 5.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{6.ordering-ui.fd1dc326de89a8eb39f9.js → 6.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{7.ordering-ui.fd1dc326de89a8eb39f9.js.LICENSE.txt → 7.ordering-ui.ba64d5c9c7490676feb5.js.LICENSE.txt} +0 -0
- /package/_bundles/{8.ordering-ui.fd1dc326de89a8eb39f9.js → 8.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{9.ordering-ui.fd1dc326de89a8eb39f9.js → 9.ordering-ui.ba64d5c9c7490676feb5.js} +0 -0
- /package/_bundles/{ordering-ui.fd1dc326de89a8eb39f9.js.LICENSE.txt → ordering-ui.ba64d5c9c7490676feb5.js.LICENSE.txt} +0 -0
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import React, { useState, useEffect } from 'react'
|
|
2
|
-
import Skeleton from 'react-loading-skeleton'
|
|
3
|
-
import { StarFill, Facebook, Tiktok, Pinterest, Whatsapp, Instagram, Snapchat } from 'react-bootstrap-icons'
|
|
4
2
|
import { useTheme } from 'styled-components'
|
|
5
3
|
|
|
6
4
|
import { Modal } from '../Modal'
|
|
@@ -8,12 +6,9 @@ import { BusinessInformation } from '../BusinessInformation'
|
|
|
8
6
|
import { BusinessReviews } from '../BusinessReviews'
|
|
9
7
|
import BsInfoCircle from '@meronex/icons/bs/BsInfoCircle'
|
|
10
8
|
|
|
11
|
-
import { useUtils,
|
|
9
|
+
import { useUtils, useLanguage } from 'ordering-components-external'
|
|
12
10
|
|
|
13
|
-
import { convertHoursToMinutes, shape, lightenDarkenColor } from '../../../../../utils'
|
|
14
|
-
import { Select } from '../../styles/Select'
|
|
15
11
|
import { MomentContent } from '../MomentContent'
|
|
16
|
-
import CgSearch from '@meronex/icons/cg/CgSearch'
|
|
17
12
|
import { SearchProducts } from '../SearchProducts'
|
|
18
13
|
import { SearchProducts as SearchProductsStarbucks } from '../../../../six/src/components/BusinessProductsListing/SearchProducts'
|
|
19
14
|
import {
|
|
@@ -21,22 +16,10 @@ import {
|
|
|
21
16
|
BusinessContent,
|
|
22
17
|
WrapperBusinessLogo,
|
|
23
18
|
BusinessLogo,
|
|
24
|
-
BusinessInfo,
|
|
25
|
-
BusinessInfoItem,
|
|
26
|
-
BusinessInfoContainer,
|
|
27
|
-
BusinessInfoContent,
|
|
28
|
-
WrapperSearch,
|
|
29
|
-
BusinessDetail,
|
|
30
19
|
BusinessMoreDetail,
|
|
31
|
-
TitleWrapper,
|
|
32
|
-
RibbonBox,
|
|
33
|
-
SearchIconWrapper,
|
|
34
20
|
SearchComponentContainer,
|
|
35
|
-
SocialList,
|
|
36
|
-
IconWrapper,
|
|
37
21
|
BusinessInfoWrapper,
|
|
38
|
-
WrapperFloatingSearch
|
|
39
|
-
SearchWrapper
|
|
22
|
+
WrapperFloatingSearch
|
|
40
23
|
} from './styles'
|
|
41
24
|
import { BusinessPreorder } from '../BusinessPreorder'
|
|
42
25
|
|
|
@@ -44,6 +27,8 @@ import dayjs from 'dayjs'
|
|
|
44
27
|
import timezone from 'dayjs/plugin/timezone'
|
|
45
28
|
import isBetween from 'dayjs/plugin/isBetween'
|
|
46
29
|
import { useWindowSize } from '../../../../../hooks/useWindowSize'
|
|
30
|
+
import { BusinessInfoComponent } from './BusinessInfoComponent'
|
|
31
|
+
import { SearchComponent } from './SearchComponent'
|
|
47
32
|
|
|
48
33
|
dayjs.extend(timezone)
|
|
49
34
|
dayjs.extend(isBetween)
|
|
@@ -63,36 +48,44 @@ export const BusinessBasicInformation = (props) => {
|
|
|
63
48
|
handleChangeSortBy,
|
|
64
49
|
categoryState,
|
|
65
50
|
errorQuantityProducts,
|
|
66
|
-
isCustomerMode
|
|
51
|
+
isCustomerMode,
|
|
52
|
+
isCustomLayout
|
|
67
53
|
} = props
|
|
68
54
|
const { business, loading } = businessState
|
|
69
55
|
|
|
70
56
|
const theme = useTheme()
|
|
71
|
-
const [orderState] = useOrder()
|
|
72
57
|
const [, t] = useLanguage()
|
|
73
|
-
const [{
|
|
58
|
+
const [{ optimizeImage }] = useUtils()
|
|
74
59
|
const windowSize = useWindowSize()
|
|
75
60
|
const [isBusinessReviews, setIsBusinessReviews] = useState(false)
|
|
76
61
|
const [isPreOrder, setIsPreOrder] = useState(false)
|
|
77
62
|
const [openSearchProducts, setOpenSearchProducts] = useState(false)
|
|
78
|
-
const [{ configs }] = useConfig()
|
|
79
|
-
const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
|
|
80
63
|
|
|
81
64
|
const hideLogo = theme?.business_view?.components?.header?.components?.business?.components?.logo?.hidden
|
|
82
|
-
const hideDeliveryFee = theme?.business_view?.components?.header?.components?.business?.components?.fee?.hidden
|
|
83
|
-
const hideTime = theme?.business_view?.components?.header?.components?.business?.components?.time?.hidden
|
|
84
|
-
const hideReviews = theme?.business_view?.components?.header?.components?.business?.components?.reviews?.hidden
|
|
85
|
-
const hideReviewsPopup = theme?.business_view?.components?.header?.components?.reviews?.hidden
|
|
86
|
-
const hideDistance = theme?.business_view?.components?.header?.components?.business?.components?.distance?.hidden
|
|
87
|
-
const hideSort = theme?.business_view?.components?.header?.components?.business?.components?.sort?.hidden
|
|
88
65
|
const hideInfoIcon = theme?.business_view?.components?.header?.components?.business?.components?.business_info?.hidden
|
|
89
66
|
|
|
90
67
|
const isInfoShrunken = theme?.business_view?.components?.header?.components?.business?.components?.layout?.position === 'shrunken'
|
|
91
68
|
const searchLayout = theme?.business_view?.components?.product_search?.components?.layout?.type
|
|
92
|
-
const hideCity = theme?.business_view?.components?.header?.components?.business?.components?.city?.hidden
|
|
93
69
|
const isChew = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
94
|
-
|
|
95
|
-
const
|
|
70
|
+
|
|
71
|
+
const businessInfoComponentProps = {
|
|
72
|
+
isChew,
|
|
73
|
+
loading,
|
|
74
|
+
business,
|
|
75
|
+
isInfoShrunken,
|
|
76
|
+
isCustomerMode,
|
|
77
|
+
setIsPreOrder,
|
|
78
|
+
setIsBusinessReviews,
|
|
79
|
+
categoryState,
|
|
80
|
+
searchValue,
|
|
81
|
+
errorQuantityProducts,
|
|
82
|
+
setOpenSearchProducts,
|
|
83
|
+
handleChangeSortBy,
|
|
84
|
+
sortByValue,
|
|
85
|
+
sortByOptions,
|
|
86
|
+
isCustomLayout
|
|
87
|
+
}
|
|
88
|
+
|
|
96
89
|
const getBusinessType = () => {
|
|
97
90
|
if (Object.keys(business).length <= 0) return t('GENERAL', 'General')
|
|
98
91
|
const _types = []
|
|
@@ -166,217 +159,6 @@ export const BusinessBasicInformation = (props) => {
|
|
|
166
159
|
})
|
|
167
160
|
}, [sortByValue])
|
|
168
161
|
|
|
169
|
-
const SearchComponent = () => {
|
|
170
|
-
return (
|
|
171
|
-
<WrapperSearch id='search-component'>
|
|
172
|
-
<SearchWrapper>
|
|
173
|
-
<SearchIconWrapper
|
|
174
|
-
onClick={() => setOpenSearchProducts(true)}
|
|
175
|
-
>
|
|
176
|
-
<CgSearch />
|
|
177
|
-
</SearchIconWrapper>
|
|
178
|
-
{!hideSort && (
|
|
179
|
-
<Select
|
|
180
|
-
notAsync
|
|
181
|
-
notReload
|
|
182
|
-
options={sortByOptions}
|
|
183
|
-
defaultValue={sortByValue}
|
|
184
|
-
onChange={(val) => handleChangeSortBy && handleChangeSortBy(val)}
|
|
185
|
-
/>
|
|
186
|
-
)}
|
|
187
|
-
</SearchWrapper>
|
|
188
|
-
</WrapperSearch>
|
|
189
|
-
)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const SocialNetWork = ({ url, icon }) => {
|
|
193
|
-
return (
|
|
194
|
-
<IconWrapper href={url} target='_blank' rel='noopener noreferrer'>
|
|
195
|
-
{icon}
|
|
196
|
-
</IconWrapper>
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const BusinessInfoComponent = () => {
|
|
201
|
-
return (
|
|
202
|
-
<BusinessInfoContainer isChew={isChew} isFlexEnd={windowSize.width >= 768}>
|
|
203
|
-
<BusinessInfoContent>
|
|
204
|
-
<BusinessInfo className='info'>
|
|
205
|
-
<BusinessInfoItem isInfoShrunken={isInfoShrunken}>
|
|
206
|
-
{!loading ? (
|
|
207
|
-
<TitleWrapper>
|
|
208
|
-
<h2 className='bold' id='business_name'>{business?.name}</h2>
|
|
209
|
-
{business?.ribbon?.enabled && (
|
|
210
|
-
<RibbonBox
|
|
211
|
-
bgColor={business?.ribbon?.color}
|
|
212
|
-
colorText={lightenDarkenColor(business?.ribbon?.color)}
|
|
213
|
-
borderRibbon={lightenDarkenColor(business?.ribbon?.color)}
|
|
214
|
-
isRoundRect={business?.ribbon?.shape === shape?.rectangleRound}
|
|
215
|
-
isCapsule={business?.ribbon?.shape === shape?.capsuleShape}
|
|
216
|
-
>
|
|
217
|
-
{business?.ribbon?.text}
|
|
218
|
-
</RibbonBox>
|
|
219
|
-
)}
|
|
220
|
-
</TitleWrapper>
|
|
221
|
-
) : (
|
|
222
|
-
<Skeleton width={isCustomerMode ? 100 : 150} height={isCustomerMode ? 35 : 'auto'} />
|
|
223
|
-
)}
|
|
224
|
-
{typeof hideCity !== 'undefined' && !hideCity && business?.city?.name && (
|
|
225
|
-
<>
|
|
226
|
-
{!loading ? (
|
|
227
|
-
<p className='type'>{business?.city?.name}</p>
|
|
228
|
-
) : (
|
|
229
|
-
<Skeleton width={isCustomerMode ? 100 : 150} />
|
|
230
|
-
)}
|
|
231
|
-
</>
|
|
232
|
-
)}
|
|
233
|
-
{!loading ? (
|
|
234
|
-
<SocialList>
|
|
235
|
-
{business?.facebook_profile && (
|
|
236
|
-
<SocialNetWork
|
|
237
|
-
url={business?.facebook_profile}
|
|
238
|
-
icon={<Facebook />}
|
|
239
|
-
/>
|
|
240
|
-
)}
|
|
241
|
-
{business?.instagram_profile && (
|
|
242
|
-
<SocialNetWork
|
|
243
|
-
url={business?.instagram_profile}
|
|
244
|
-
icon={<Instagram />}
|
|
245
|
-
/>
|
|
246
|
-
)}
|
|
247
|
-
{business?.tiktok_profile && (
|
|
248
|
-
<SocialNetWork
|
|
249
|
-
url={business?.tiktok_profile}
|
|
250
|
-
icon={<Tiktok />}
|
|
251
|
-
/>
|
|
252
|
-
)}
|
|
253
|
-
{business?.pinterest_profile && (
|
|
254
|
-
<SocialNetWork
|
|
255
|
-
url={business?.pinterest_profile}
|
|
256
|
-
icon={<Pinterest />}
|
|
257
|
-
/>
|
|
258
|
-
)}
|
|
259
|
-
{business?.whatsapp_number && (
|
|
260
|
-
<SocialNetWork
|
|
261
|
-
url={business?.whatsapp_number}
|
|
262
|
-
icon={<Whatsapp />}
|
|
263
|
-
/>
|
|
264
|
-
)}
|
|
265
|
-
{business?.snapchat_profile && (
|
|
266
|
-
<SocialNetWork
|
|
267
|
-
url={business?.snapchat_profile}
|
|
268
|
-
icon={<Snapchat />}
|
|
269
|
-
/>
|
|
270
|
-
)}
|
|
271
|
-
</SocialList>
|
|
272
|
-
) : (
|
|
273
|
-
<SocialList>
|
|
274
|
-
{[...Array(5).keys()].map(i => (
|
|
275
|
-
<IconWrapper isSkeleton key={i}>
|
|
276
|
-
<Skeleton width={27} height={27} />
|
|
277
|
-
</IconWrapper>
|
|
278
|
-
))}
|
|
279
|
-
</SocialList>
|
|
280
|
-
)}
|
|
281
|
-
<BusinessDetail isSkeleton={loading}>
|
|
282
|
-
{orderState?.options.type === 1 && !hideDeliveryFee && (
|
|
283
|
-
<>
|
|
284
|
-
{!loading ? (
|
|
285
|
-
<>
|
|
286
|
-
<h5>
|
|
287
|
-
<span>{t('DELIVERY_FEE', 'Delivery fee')}</span>
|
|
288
|
-
{business && parsePrice(business?.delivery_price || 0)}
|
|
289
|
-
</h5>
|
|
290
|
-
<span className='dot'>•</span>
|
|
291
|
-
</>
|
|
292
|
-
) : (
|
|
293
|
-
<Skeleton width={isCustomerMode ? 70 : 50} />
|
|
294
|
-
)}
|
|
295
|
-
</>
|
|
296
|
-
)}
|
|
297
|
-
{!hideTime && (
|
|
298
|
-
<>
|
|
299
|
-
{!loading ? (
|
|
300
|
-
<>
|
|
301
|
-
{orderState?.options?.type === 1 ? (
|
|
302
|
-
<>
|
|
303
|
-
<h5>
|
|
304
|
-
{convertHoursToMinutes(business?.delivery_time)}
|
|
305
|
-
</h5>
|
|
306
|
-
<span className='dot'>•</span>
|
|
307
|
-
</>
|
|
308
|
-
) : (
|
|
309
|
-
<>
|
|
310
|
-
<h5>
|
|
311
|
-
{convertHoursToMinutes(business?.pickup_time)}
|
|
312
|
-
</h5>
|
|
313
|
-
<span className='dot'>•</span>
|
|
314
|
-
</>
|
|
315
|
-
)}
|
|
316
|
-
</>
|
|
317
|
-
) : (
|
|
318
|
-
<Skeleton width={isCustomerMode ? 70 : 50} />
|
|
319
|
-
)}
|
|
320
|
-
</>
|
|
321
|
-
)}
|
|
322
|
-
{!hideDistance && (
|
|
323
|
-
<>
|
|
324
|
-
{!loading ? (
|
|
325
|
-
<>
|
|
326
|
-
<h5>
|
|
327
|
-
{parseDistance(business?.distance || 0)}
|
|
328
|
-
</h5>
|
|
329
|
-
<span className='dot'>•</span>
|
|
330
|
-
</>
|
|
331
|
-
) : (
|
|
332
|
-
<Skeleton width={isCustomerMode ? 70 : 50} />
|
|
333
|
-
)}
|
|
334
|
-
</>
|
|
335
|
-
)}
|
|
336
|
-
{!hideReviews && (
|
|
337
|
-
<>
|
|
338
|
-
{!loading ? (
|
|
339
|
-
<div className='review'>
|
|
340
|
-
<StarFill className='start' />
|
|
341
|
-
<p>{business?.reviews?.total}</p>
|
|
342
|
-
</div>
|
|
343
|
-
) : (
|
|
344
|
-
<Skeleton width={isCustomerMode ? 100 : 50} />
|
|
345
|
-
)}
|
|
346
|
-
</>
|
|
347
|
-
)}
|
|
348
|
-
</BusinessDetail>
|
|
349
|
-
{
|
|
350
|
-
!loading ? (
|
|
351
|
-
<div className='preorder-Reviews'>
|
|
352
|
-
{isPreOrderSetting && (
|
|
353
|
-
<>
|
|
354
|
-
<span onClick={() => setIsPreOrder(true)}>{t('PREORDER', 'Preorder')}</span>
|
|
355
|
-
<span className='dot'>•</span>
|
|
356
|
-
</>
|
|
357
|
-
)}
|
|
358
|
-
{business.reviews?.reviews && !hideReviewsPopup && <span onClick={() => setIsBusinessReviews(true)}>{t('REVIEWS', 'Reviews')}</span>}
|
|
359
|
-
</div>
|
|
360
|
-
) : (
|
|
361
|
-
<Skeleton width={isCustomerMode ? 100 : 150} />
|
|
362
|
-
)
|
|
363
|
-
}
|
|
364
|
-
</BusinessInfoItem>
|
|
365
|
-
</BusinessInfo>
|
|
366
|
-
</BusinessInfoContent>
|
|
367
|
-
{!hideSearch &&
|
|
368
|
-
(categoryState?.products?.length !== 0 || searchValue) &&
|
|
369
|
-
!errorQuantityProducts &&
|
|
370
|
-
!isInfoShrunken &&
|
|
371
|
-
!business?.professionals?.length &&
|
|
372
|
-
// (categoryClicked || windowSize.width >= 993) &&
|
|
373
|
-
(
|
|
374
|
-
<SearchComponent />
|
|
375
|
-
)}
|
|
376
|
-
</BusinessInfoContainer>
|
|
377
|
-
)
|
|
378
|
-
}
|
|
379
|
-
|
|
380
162
|
return (
|
|
381
163
|
<>
|
|
382
164
|
{props.beforeElements?.map((BeforeElement, i) => (
|
|
@@ -401,7 +183,10 @@ export const BusinessBasicInformation = (props) => {
|
|
|
401
183
|
)}
|
|
402
184
|
<BusinessInfoWrapper>
|
|
403
185
|
{(!isInfoShrunken && !isChew) && (
|
|
404
|
-
<BusinessInfoComponent
|
|
186
|
+
<BusinessInfoComponent
|
|
187
|
+
{...businessInfoComponentProps}
|
|
188
|
+
|
|
189
|
+
/>
|
|
405
190
|
)}
|
|
406
191
|
{(business?.header || business?.logo || loading || isInfoShrunken) && (
|
|
407
192
|
<BusinessContainer bgimage={business?.header} isSkeleton={isSkeleton} id='container' isClosed={!business?.open} isChew={isChew}>
|
|
@@ -416,13 +201,20 @@ export const BusinessBasicInformation = (props) => {
|
|
|
416
201
|
</BusinessContent>
|
|
417
202
|
)}
|
|
418
203
|
{(isInfoShrunken || isChew) && (
|
|
419
|
-
<BusinessInfoComponent
|
|
204
|
+
<BusinessInfoComponent
|
|
205
|
+
{...businessInfoComponentProps}
|
|
206
|
+
/>
|
|
420
207
|
)}
|
|
421
208
|
{!loading && (
|
|
422
209
|
<>
|
|
423
210
|
{isInfoShrunken && (
|
|
424
211
|
<SearchComponentContainer>
|
|
425
|
-
<SearchComponent
|
|
212
|
+
<SearchComponent
|
|
213
|
+
setOpenSearchProducts={setOpenSearchProducts}
|
|
214
|
+
handleChangeSortBy={handleChangeSortBy}
|
|
215
|
+
sortByValue={sortByValue}
|
|
216
|
+
sortByOptions={sortByOptions}
|
|
217
|
+
/>
|
|
426
218
|
</SearchComponentContainer>
|
|
427
219
|
)}
|
|
428
220
|
{searchLayout === 'floating' && (
|
|
@@ -249,7 +249,7 @@ export const WrapperSearch = styled.div`
|
|
|
249
249
|
position: fixed;
|
|
250
250
|
top: 0;
|
|
251
251
|
right: 0;
|
|
252
|
-
z-index:
|
|
252
|
+
z-index: 10001;
|
|
253
253
|
width: fit-content;
|
|
254
254
|
margin-top: 0px;
|
|
255
255
|
background-color: ${props => props.theme.colors.backgroundPage};
|
|
@@ -260,6 +260,7 @@ export const WrapperSearch = styled.div`
|
|
|
260
260
|
&.fixed-search {
|
|
261
261
|
left: 0;
|
|
262
262
|
width: 100vw;
|
|
263
|
+
z-index: 1002;
|
|
263
264
|
}
|
|
264
265
|
}
|
|
265
266
|
`
|
|
@@ -370,17 +371,26 @@ export const TitleWrapper = styled.div`
|
|
|
370
371
|
overflow: hidden;
|
|
371
372
|
white-space: nowrap;
|
|
372
373
|
text-overflow: ellipsis;
|
|
374
|
+
background: ${({ theme }) => theme?.colors?.white};
|
|
373
375
|
&.fixed-name {
|
|
374
376
|
z-index: 1002;
|
|
375
377
|
position: fixed;
|
|
376
378
|
top: 0;
|
|
377
|
-
width: calc(100vw - 190px);
|
|
378
379
|
padding: 10px 0;
|
|
379
380
|
font-size: 18px;
|
|
380
|
-
${
|
|
381
|
+
${({ isCustomLayout }) => !isCustomLayout ? css`
|
|
382
|
+
width: calc(100vw - 190px);
|
|
383
|
+
${props => props.theme?.rtl ? css`
|
|
381
384
|
right: 50px;
|
|
382
|
-
|
|
385
|
+
` : css`
|
|
383
386
|
left: 50px;
|
|
387
|
+
`}
|
|
388
|
+
` : css`
|
|
389
|
+
${props => props.theme?.rtl ? css`
|
|
390
|
+
right: 10px;
|
|
391
|
+
` : css`
|
|
392
|
+
left: 10px;
|
|
393
|
+
`}
|
|
384
394
|
`}
|
|
385
395
|
}
|
|
386
396
|
@media (min-width: 768px) {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import { CardCvcElement, CardElement, CardExpiryElement, CardNumberElement } from '@stripe/react-stripe-js'
|
|
3
|
-
import { CardForm as CardFormController, useLanguage } from 'ordering-components-external'
|
|
4
|
-
|
|
3
|
+
import { CardForm as CardFormController, useLanguage, useValidationFields } from 'ordering-components-external'
|
|
5
4
|
import {
|
|
6
5
|
FormStripe,
|
|
7
6
|
FormRow,
|
|
@@ -10,7 +9,9 @@ import {
|
|
|
10
9
|
CardNumberField,
|
|
11
10
|
CardExpiryCvcField,
|
|
12
11
|
CardExpiryField,
|
|
13
|
-
CardCvcField
|
|
12
|
+
CardCvcField,
|
|
13
|
+
CardZipcodeField,
|
|
14
|
+
ZipcodeField
|
|
14
15
|
} from './styles'
|
|
15
16
|
|
|
16
17
|
import { Button } from '../../styles/Buttons'
|
|
@@ -43,10 +44,14 @@ const CardFormUI = (props) => {
|
|
|
43
44
|
handleChange,
|
|
44
45
|
isSplitForm,
|
|
45
46
|
handleChangeExpiry,
|
|
46
|
-
handleChangeCvc
|
|
47
|
+
handleChangeCvc,
|
|
48
|
+
errorZipcode
|
|
47
49
|
} = props
|
|
48
50
|
|
|
49
51
|
const [, t] = useLanguage()
|
|
52
|
+
const [validationFields] = useValidationFields()
|
|
53
|
+
const zipCodeEnabled = validationFields?.fields?.card?.zipcode?.enabled
|
|
54
|
+
const zipCodeRequired = validationFields?.fields?.card?.zipcode?.required
|
|
50
55
|
|
|
51
56
|
return (
|
|
52
57
|
<>
|
|
@@ -93,6 +98,22 @@ const CardFormUI = (props) => {
|
|
|
93
98
|
<ErrorMessage>{errorCvc}</ErrorMessage>
|
|
94
99
|
</CardCvcField>
|
|
95
100
|
</CardExpiryCvcField>
|
|
101
|
+
{zipCodeEnabled && (
|
|
102
|
+
<CardZipcodeField>
|
|
103
|
+
<label>{t('ZIPCODE', 'Zipcode')}</label>
|
|
104
|
+
<ZipcodeField
|
|
105
|
+
name='zipcode'
|
|
106
|
+
placeholder={`${t('ZIPCODE', 'Zipcode')}${zipCodeRequired ? '*' : ''}`}
|
|
107
|
+
options={CARD_ELEMENT_OPTIONS}
|
|
108
|
+
onChange={handleChange}
|
|
109
|
+
pattern='[0-9]'
|
|
110
|
+
type='number'
|
|
111
|
+
/>
|
|
112
|
+
{errorZipcode && (
|
|
113
|
+
<ErrorMessage>{t('ZIPCODE_IS_INCOMPLETED', 'The zipcode is incompleted.')}</ErrorMessage>
|
|
114
|
+
)}
|
|
115
|
+
</CardZipcodeField>
|
|
116
|
+
)}
|
|
96
117
|
</>
|
|
97
118
|
}
|
|
98
119
|
</FormRow>
|
|
@@ -40,6 +40,10 @@ export const CardCvcField = styled.div`
|
|
|
40
40
|
color: #ADB2B9;
|
|
41
41
|
`
|
|
42
42
|
|
|
43
|
+
export const CardZipcodeField = styled.div`
|
|
44
|
+
color: #ADB2B9;
|
|
45
|
+
`
|
|
46
|
+
|
|
43
47
|
export const CardNumberField = styled.div`
|
|
44
48
|
width: 100%;
|
|
45
49
|
color: #ADB2B9;
|
|
@@ -98,3 +102,34 @@ export const FormActions = styled.div`
|
|
|
98
102
|
}
|
|
99
103
|
}
|
|
100
104
|
`
|
|
105
|
+
|
|
106
|
+
export const ZipcodeField = styled.input`
|
|
107
|
+
font-weight: 500;
|
|
108
|
+
font-size: 16px;
|
|
109
|
+
box-sizing: border-box;
|
|
110
|
+
width: 100% !important;
|
|
111
|
+
&:-webkit-autofill {
|
|
112
|
+
color: '#fce883'
|
|
113
|
+
}
|
|
114
|
+
&::placeholder {
|
|
115
|
+
font-weight: 500
|
|
116
|
+
}
|
|
117
|
+
&:focus(){
|
|
118
|
+
box-shadow: rgba(50, 50, 93, 0.109804) 0px 4px 6px,
|
|
119
|
+
rgba(0, 0, 0, 0.0784314) 0px 1px 3px;
|
|
120
|
+
-webkit-transition: all 150ms ease;
|
|
121
|
+
transition: all 150ms ease;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
&::-webkit-outer-spin-button,
|
|
125
|
+
&::-webkit-inner-spin-button {
|
|
126
|
+
-webkit-appearance: none;
|
|
127
|
+
margin: 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Firefox */
|
|
131
|
+
&[type=number] {
|
|
132
|
+
-moz-appearance: textfield;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
`
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import Payment from 'payment'
|
|
2
|
+
|
|
3
|
+
const clearNumber = (value = '') => {
|
|
4
|
+
return value.replace(/\D+/g, '')
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const formatCreditCardNumber = (value) => {
|
|
8
|
+
if (!value) {
|
|
9
|
+
return value
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const issuer = Payment.fns.cardType(value)
|
|
13
|
+
const clearValue = clearNumber(value)
|
|
14
|
+
let nextValue
|
|
15
|
+
|
|
16
|
+
switch (issuer) {
|
|
17
|
+
case 'amex':
|
|
18
|
+
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
|
|
19
|
+
4,
|
|
20
|
+
10
|
|
21
|
+
)} ${clearValue.slice(10, 15)}`
|
|
22
|
+
break
|
|
23
|
+
case 'dinersclub':
|
|
24
|
+
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
|
|
25
|
+
4,
|
|
26
|
+
10
|
|
27
|
+
)} ${clearValue.slice(10, 14)}`
|
|
28
|
+
break
|
|
29
|
+
default:
|
|
30
|
+
nextValue = `${clearValue.slice(0, 4)} ${clearValue.slice(
|
|
31
|
+
4,
|
|
32
|
+
8
|
|
33
|
+
)} ${clearValue.slice(8, 12)} ${clearValue.slice(12, 19)}`
|
|
34
|
+
break
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return nextValue.trim()
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const formatCVC = (value, prevValue, allValues = {}) => {
|
|
41
|
+
const clearValue = clearNumber(value)
|
|
42
|
+
let maxLength = 4
|
|
43
|
+
|
|
44
|
+
if (allValues.number) {
|
|
45
|
+
const issuer = Payment.fns.cardType(allValues.number)
|
|
46
|
+
maxLength = issuer === 'amex' ? 4 : 3
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return clearValue.slice(0, maxLength)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const formatExpirationDate = (value) => {
|
|
53
|
+
const clearValue = clearNumber(value)
|
|
54
|
+
|
|
55
|
+
if (clearValue.length >= 3) {
|
|
56
|
+
return `${clearValue.slice(0, 2)}/${clearValue.slice(2, 4)}`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return clearValue
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const getCardType = (number) => {
|
|
63
|
+
// visa
|
|
64
|
+
var re = new RegExp('^4')
|
|
65
|
+
if (number.match(re) != null) {
|
|
66
|
+
return 'Visa'
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Mastercard
|
|
70
|
+
// Updated for Mastercard 2017 BINs expansion
|
|
71
|
+
if (/^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/.test(number)) {
|
|
72
|
+
return 'Mastercard'
|
|
73
|
+
}
|
|
74
|
+
// AMEX
|
|
75
|
+
re = new RegExp('^3[47]')
|
|
76
|
+
if (number.match(re) != null) {
|
|
77
|
+
return 'AMEX'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Discover
|
|
81
|
+
re = new RegExp('^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)')
|
|
82
|
+
if (number.match(re) != null) {
|
|
83
|
+
return 'Discover'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Diners
|
|
87
|
+
re = new RegExp('^36')
|
|
88
|
+
if (number.match(re) != null) {
|
|
89
|
+
return 'Diners'
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Diners - Carte Blanche
|
|
93
|
+
re = new RegExp('^30[0-5]')
|
|
94
|
+
if (number.match(re) != null) {
|
|
95
|
+
return 'Diners - Carte Blanche'
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// JCB
|
|
99
|
+
re = new RegExp('^35(2[89]|[3-8][0-9])')
|
|
100
|
+
if (number.match(re) != null) {
|
|
101
|
+
return 'JCB'
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Visa Electron
|
|
105
|
+
re = new RegExp('^(4026|417500|4508|4844|491(3|7))')
|
|
106
|
+
if (number.match(re) != null) {
|
|
107
|
+
return 'Visa Electron'
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return ''
|
|
111
|
+
}
|