ordering-ui-react-native 0.16.30 → 0.16.31

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 (22) hide show
  1. package/package.json +2 -1
  2. package/themes/original/index.tsx +8 -0
  3. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  4. package/themes/original/src/components/BusinessProductsListing/index.tsx +255 -208
  5. package/themes/original/src/components/BusinessProductsListing/styles.tsx +5 -0
  6. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -38
  7. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  8. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +549 -0
  9. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +106 -0
  10. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +519 -0
  11. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Original/styles.tsx} +0 -0
  12. package/themes/original/src/components/BusinessesListing/index.tsx +13 -515
  13. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  14. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  15. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  16. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  17. package/themes/original/src/components/ProfessionalProfile/index.tsx +297 -0
  18. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  19. package/themes/original/src/components/ServiceForm/index.tsx +485 -0
  20. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  21. package/themes/original/src/types/index.tsx +31 -1
  22. package/themes/original/src/utils/index.tsx +11 -0
@@ -0,0 +1,549 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
3
+ import Geolocation from '@react-native-community/geolocation'
4
+ import { getTrackingStatus, requestTrackingPermission } from 'react-native-tracking-transparency'
5
+ import {
6
+ View,
7
+ StyleSheet,
8
+ ScrollView,
9
+ Platform,
10
+ TouchableOpacity,
11
+ RefreshControl,
12
+ AppState
13
+ } from 'react-native';
14
+ import {
15
+ BusinessList as BusinessesListingController,
16
+ useLanguage,
17
+ useSession,
18
+ useOrder,
19
+ useConfig,
20
+ useUtils,
21
+ } from 'ordering-components/native';
22
+ import { useTheme } from 'styled-components/native';
23
+ import Ionicons from 'react-native-vector-icons/Ionicons'
24
+
25
+ import {
26
+ Search,
27
+ OrderControlContainer,
28
+ AddressInput,
29
+ WrapMomentOption,
30
+ HeaderWrapper,
31
+ ListWrapper,
32
+ FeaturedWrapper,
33
+ OrderProgressWrapper,
34
+ FarAwayMessage,
35
+ SearchBarWrapper,
36
+ MomentWrapper,
37
+ FilterWrapper,
38
+ ServiceWrapper,
39
+ PriceWrapper
40
+ } from './styles';
41
+
42
+ import { SearchBar } from '../../../SearchBar';
43
+ import { OIcon, OText, OButton } from '../../../shared';
44
+ import { BusinessesListingParams } from '../../../../types';
45
+ import { NotFoundSource } from '../../../NotFoundSource';
46
+ import { BusinessTypeFilter } from '../../../BusinessTypeFilter';
47
+ import { BusinessController } from '../../../BusinessController';
48
+ import { OrderTypeSelector } from '../../../OrderTypeSelector';
49
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
50
+ import { BusinessFeaturedController } from '../../../BusinessFeaturedController';
51
+ import { HighestRatedBusinesses } from '../../../HighestRatedBusinesses';
52
+ import { getTypesText, convertToRadian, priceList } from '../../../../utils';
53
+ import { OrderProgress } from '../../../OrderProgress';
54
+ import { useFocusEffect, useIsFocused } from '@react-navigation/native';
55
+ import { MomentSelector } from '../../../MomentSelector'
56
+
57
+ const PIXELS_TO_SCROLL = 2000;
58
+
59
+ const BusinessesListingUI = (props: BusinessesListingParams) => {
60
+ const {
61
+ navigation,
62
+ businessesList,
63
+ searchValue,
64
+ getBusinesses,
65
+ handleChangeBusinessType,
66
+ handleBusinessClick,
67
+ paginationProps,
68
+ handleChangeSearch,
69
+ businessId,
70
+ isGuestUser,
71
+ handleUpdateBusinessList,
72
+ priceLevelSelected,
73
+ handleChangePriceLevel,
74
+ businessTypeSelected
75
+ } = props;
76
+ const theme = useTheme();
77
+ const isFocused = useIsFocused();
78
+ const appState = useRef(AppState.currentState)
79
+ const [appStateVisible, setAppStateVisible] = useState(appState.current);
80
+ const [refreshing] = useState(false);
81
+ const styles = StyleSheet.create({
82
+ container: {
83
+ marginBottom: 0,
84
+ },
85
+ welcome: {
86
+ flex: 1,
87
+ flexDirection: 'row',
88
+ },
89
+ inputStyle: {
90
+ backgroundColor: theme.colors.inputDisabled,
91
+ flex: 1,
92
+ },
93
+ wrapperOrderOptions: {
94
+ width: '100%',
95
+ flexDirection: 'row',
96
+ justifyContent: 'space-between',
97
+ marginBottom: 10,
98
+ zIndex: 100
99
+ },
100
+ borderStyle: {
101
+ borderColor: theme.colors.backgroundGray,
102
+ borderWidth: 1,
103
+ borderRadius: 10,
104
+ },
105
+ searchInput: {
106
+ fontSize: 12,
107
+ // backgroundColor: theme.colors.white,
108
+ paddingLeft: 10,
109
+ paddingTop: 7
110
+ },
111
+ iconStyle: {
112
+ fontSize: 18,
113
+ color: theme.colors.warning5,
114
+ marginRight: 8
115
+ },
116
+ farAwayMsg: {
117
+ paddingVertical: 6,
118
+ paddingHorizontal: 20
119
+ },
120
+ inputContainerStyles: {
121
+ backgroundColor: theme.colors.white,
122
+ borderColor: theme.colors.backgroundGray,
123
+ borderWidth: 1,
124
+ },
125
+ priceLevel: {
126
+ marginRight: 10,
127
+ borderRadius: 50,
128
+ paddingVertical: 4,
129
+ paddingLeft: 5,
130
+ paddingRight: 5,
131
+ height: 27,
132
+ borderWidth: 0
133
+ }
134
+ });
135
+
136
+
137
+ const [, t] = useLanguage();
138
+ const [{ user, auth }] = useSession();
139
+ const [orderState] = useOrder();
140
+ const [{ configs }] = useConfig();
141
+ const [{ parseDate }] = useUtils();
142
+
143
+ const { top } = useSafeAreaInsets();
144
+
145
+ const [featuredBusiness, setFeaturedBusinesses] = useState(Array);
146
+ const [isFarAway, setIsFarAway] = useState(false)
147
+ const [businessTypes, setBusinessTypes] = useState(null)
148
+ const [orderTypeValue, setOrderTypeValue] = useState(orderState?.options.value)
149
+ const isPreorderEnabled = (configs?.preorder_status_enabled?.value === '1' || configs?.preorder_status_enabled?.value === 'true') &&
150
+ Number(configs?.max_days_preorder?.value) > 0
151
+ const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
152
+ const timerId = useRef<any>(false)
153
+ const [favoriteIds, setFavoriteIds] = useState<any>([])
154
+
155
+ // const panResponder = useRef(
156
+ // PanResponder.create({
157
+ // onMoveShouldSetPanResponder: (e, gestureState) => {
158
+ // const { dx, dy } = gestureState;
159
+ // resetInactivityTimeout()
160
+ // return (Math.abs(dx) > 20) || (Math.abs(dy) > 20);
161
+ // },
162
+ // })
163
+ // ).current
164
+
165
+ const handleMomentClick = () => {
166
+ if (isPreorderEnabled) {
167
+ navigation.navigate('MomentOption')
168
+ }
169
+ }
170
+
171
+ const configTypes =
172
+ configs?.order_types_allowed?.value
173
+ .split('|')
174
+ .map((value: any) => Number(value)) || [];
175
+
176
+ const handleScroll = ({ nativeEvent }: any) => {
177
+ const y = nativeEvent.contentOffset.y;
178
+ const height = nativeEvent.contentSize.height;
179
+ const hasMore = !(
180
+ paginationProps.totalPages === paginationProps.currentPage
181
+ );
182
+
183
+ if (y + PIXELS_TO_SCROLL > height && !businessesList.loading && hasMore) {
184
+ getBusinesses();
185
+ }
186
+ };
187
+
188
+ const getDistance = (lat1: any, lon1: any, lat2: any, lon2: any) => {
189
+ const R = 6371 // km
190
+ const dLat = convertToRadian(lat2 - lat1)
191
+ const dLon = convertToRadian(lon2 - lon1)
192
+ const curLat1 = convertToRadian(lat1)
193
+ const curLat2 = convertToRadian(lat2)
194
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(curLat1) * Math.cos(curLat2)
195
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
196
+ return R * c
197
+ }
198
+
199
+ const resetInactivityTimeout = () => {
200
+ clearTimeout(timerId.current)
201
+ timerId.current = setInterval(() => {
202
+ getBusinesses(true)
203
+ }, 120000)
204
+ }
205
+
206
+ useEffect(() => {
207
+ if (!businessesList?.loading) {
208
+ const fb = businessesList.businesses.filter((b) => b.featured === true && b?.open);
209
+ const ary = [];
210
+ while (fb.length > 0) {
211
+ ary.push(fb.splice(0, 2));
212
+ }
213
+ setFeaturedBusinesses(ary);
214
+ }
215
+ resetInactivityTimeout()
216
+ }, [businessesList.loading])
217
+
218
+ const handleOnRefresh = () => {
219
+ if (!businessesList.loading) {
220
+ getBusinesses(true);
221
+ }
222
+ }
223
+
224
+ const checkUserLocation = async () => {
225
+ let trackingStatus = await getTrackingStatus()
226
+ if (trackingStatus === 'not-determined') {
227
+ trackingStatus = await requestTrackingPermission()
228
+ }
229
+ if (trackingStatus === 'authorized' || trackingStatus === 'unavailable') {
230
+ Geolocation.getCurrentPosition((pos) => {
231
+ const crd = pos.coords
232
+ const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
233
+ if (distance > 20) setIsFarAway(true)
234
+ else setIsFarAway(false)
235
+ }, (err) => {
236
+ console.log(`ERROR(${err.code}): ${err.message}`)
237
+ }, {
238
+ enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
239
+ })
240
+ }
241
+ }
242
+
243
+ useEffect(() => {
244
+ checkUserLocation()
245
+ }, [orderState?.options?.address?.location])
246
+
247
+ useEffect(() => {
248
+ if (!orderState?.loading) {
249
+ setOrderTypeValue(orderState?.options?.type)
250
+ }
251
+ }, [orderState?.options?.type])
252
+
253
+ useFocusEffect(
254
+ useCallback(() => {
255
+ resetInactivityTimeout()
256
+ return () => clearTimeout(timerId.current)
257
+ }, [navigation])
258
+ )
259
+
260
+ useEffect(() => {
261
+ if (!businessesList?.businesses?.length) return
262
+ const ids = [...favoriteIds]
263
+ businessesList.businesses.forEach((business: any) => {
264
+ if (business?.favorite) {
265
+ ids.push(business?.id)
266
+ }
267
+ })
268
+ setFavoriteIds([...new Set(ids)])
269
+ }, [businessesList?.businesses?.length])
270
+
271
+ return (
272
+ <ScrollView style={styles.container} onScroll={(e) => handleScroll(e)} showsVerticalScrollIndicator={false}
273
+ refreshControl={
274
+ <RefreshControl
275
+ refreshing={refreshing}
276
+ onRefresh={() => handleOnRefresh()}
277
+ />
278
+ }
279
+ >
280
+ <HeaderWrapper
281
+ source={theme.images.general.appointment}
282
+ style={{ paddingTop: top + 20 }}>
283
+ {!auth && (
284
+ <TouchableOpacity onPress={() => navigation?.canGoBack() && navigation.goBack()} style={{ position: 'absolute', marginStart: 40, paddingVertical: 20 }}>
285
+ <OIcon src={theme.images.general.arrow_left} width={20} style={{ tintColor: theme.colors.white }} />
286
+ </TouchableOpacity>
287
+ )}
288
+ <Search>
289
+ <AddressInput
290
+ onPress={() =>
291
+ auth
292
+ ? navigation.navigate('AddressList', { isFromBusinesses: true })
293
+ : navigation.navigate('AddressForm', {
294
+ address: orderState.options?.address,
295
+ isFromBusinesses: true,
296
+ isGuestUser: isGuestUser
297
+ })
298
+ }>
299
+ <OIcon
300
+ src={theme.images.general.pin}
301
+ color={theme.colors.disabled}
302
+ width={16}
303
+ style={{ marginRight: 10 }}
304
+ />
305
+ <OText size={12} numberOfLines={1} style={{ width: '90%' }}>
306
+ {orderState?.options?.address?.address}
307
+ </OText>
308
+ </AddressInput>
309
+ </Search>
310
+ {isFarAway && (
311
+ <FarAwayMessage style={styles.farAwayMsg}>
312
+ <Ionicons name='md-warning-outline' style={styles.iconStyle} />
313
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
314
+ </FarAwayMessage>
315
+ )}
316
+ <OrderControlContainer>
317
+ <MomentWrapper>
318
+ <MomentSelector />
319
+ </MomentWrapper>
320
+ <View style={styles.wrapperOrderOptions}>
321
+ <WrapMomentOption onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes, setOrderTypeValue })}>
322
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(orderTypeValue || orderState?.options?.type || 1), 'Delivery')}</OText>
323
+ <OIcon
324
+ src={theme.images.general.arrow_down}
325
+ width={10}
326
+ style={{ marginStart: 8 }}
327
+ />
328
+ </WrapMomentOption>
329
+ {!businessId && (
330
+ <SearchBarWrapper>
331
+ <SearchBar
332
+ onSearch={handleChangeSearch}
333
+ searchValue={searchValue}
334
+ lazyLoad
335
+ isCancelXButtonShow={!!searchValue}
336
+ borderStyle={styles.borderStyle}
337
+ onCancel={() => handleChangeSearch('')}
338
+ placeholder={t('SEARCH', 'Search')}
339
+ height={80}
340
+ isAppointment
341
+ isDisabled={!businessTypes}
342
+ inputStyle={{ ...styles.searchInput, ...Platform.OS === 'ios' ? {} : { paddingBottom: 4 } }}
343
+ onSubmitEditing={() => { configs?.advanced_business_search_enabled?.value === '1' && navigation.navigate('BusinessSearch', { businessTypes, defaultTerm: searchValue }) }}
344
+ />
345
+ </SearchBarWrapper>
346
+ )}
347
+ </View>
348
+ </OrderControlContainer>
349
+ </HeaderWrapper>
350
+ <FilterWrapper>
351
+ <ServiceWrapper>
352
+ <OText
353
+ size={16}
354
+ style={{ marginBottom: 16 }}
355
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
356
+ >
357
+ {t('POPULAR_SERVICES', 'Popular services')}
358
+ </OText>
359
+ <BusinessTypeFilter
360
+ businessTypes={props.businessTypes}
361
+ defaultBusinessType={props.defaultBusinessType}
362
+ handleChangeBusinessType={handleChangeBusinessType}
363
+ setBusinessTypes={setBusinessTypes}
364
+ isAppoint
365
+ />
366
+ </ServiceWrapper>
367
+ <PriceWrapper>
368
+ <OText
369
+ size={16}
370
+ style={{ marginBottom: 16 }}
371
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
372
+ >
373
+ {t('PRICE', 'Price')}
374
+ </OText>
375
+ <ScrollView
376
+ horizontal
377
+ showsVerticalScrollIndicator={false}
378
+ showsHorizontalScrollIndicator={false}
379
+ >
380
+ {priceList?.length > 0 && priceList.map((price, i) => (
381
+ <OButton
382
+ key={i}
383
+ bgColor={(priceLevelSelected === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
384
+ onClick={() => handleChangePriceLevel(price?.level)}
385
+ text={`${price.content} ${(priceLevelSelected === price?.level) ? ' X' : ''}`}
386
+ style={styles.priceLevel}
387
+ textStyle={{ fontSize: 10, color: (priceLevelSelected === price?.level) ? theme.colors.backgroundLight : theme.colors.textNormal }}
388
+ />
389
+ ))}
390
+ </ScrollView>
391
+ </PriceWrapper>
392
+ </FilterWrapper>
393
+ <OrderProgressWrapper>
394
+ <OrderProgress
395
+ {...props}
396
+ isFocused={isFocused}
397
+ />
398
+ </OrderProgressWrapper>
399
+
400
+ {
401
+ !businessId && !props.franchiseId && featuredBusiness && featuredBusiness.length > 0 && (
402
+ <FeaturedWrapper>
403
+ <OText size={16} style={{ marginLeft: 40 }} weight={Platform.OS === 'ios' ? '600' : 'bold'}>{t('BUSINESS_FEATURE', 'Featured business')}</OText>
404
+ <ScrollView
405
+ showsHorizontalScrollIndicator={false}
406
+ nestedScrollEnabled
407
+ horizontal contentContainerStyle={{ paddingHorizontal: 40 }}>
408
+ {featuredBusiness.map((bAry: any, idx) => (
409
+ <View key={'f-listing_' + idx}>
410
+ <BusinessFeaturedController
411
+ business={bAry[0]}
412
+ isBusinessOpen={bAry[0]?.open}
413
+ handleCustomClick={handleBusinessClick}
414
+ orderType={orderState?.options?.type}
415
+ />
416
+ {bAry.length > 1 && (
417
+ <BusinessFeaturedController
418
+ business={bAry[1]}
419
+ isBusinessOpen={bAry[1]?.open}
420
+ handleCustomClick={handleBusinessClick}
421
+ orderType={orderState?.options?.type}
422
+ />
423
+ )}
424
+ </View>
425
+ ))}
426
+ </ScrollView>
427
+ </FeaturedWrapper>
428
+ )
429
+ }
430
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
431
+ {
432
+ !businessId && !props.franchiseId && (
433
+ <HighestRatedBusinesses
434
+ onBusinessClick={handleBusinessClick}
435
+ navigation={navigation}
436
+ initialBuisnessType={businessTypeSelected}
437
+ initialPricelevel={priceLevelSelected}
438
+ favoriteIds={favoriteIds}
439
+ setFavoriteIds={setFavoriteIds}
440
+ />
441
+ )
442
+ }
443
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
444
+ <ListWrapper>
445
+ {!businessId && (
446
+ <BusinessTypeFilter
447
+ images={props.images}
448
+ businessTypes={props.businessTypes}
449
+ defaultBusinessType={props.defaultBusinessType}
450
+ handleChangeBusinessType={handleChangeBusinessType}
451
+ setBusinessTypes={setBusinessTypes}
452
+ />
453
+ )}
454
+ {!businessesList.loading && businessesList.businesses.length === 0 && (
455
+ <NotFoundSource
456
+ content={t(
457
+ 'NOT_FOUND_BUSINESSES',
458
+ 'No businesses to delivery / pick up at this address, please change filters or change address.',
459
+ )}
460
+ />
461
+ )}
462
+ {businessesList.businesses?.map(
463
+ (business: any, i: number) => (
464
+ <BusinessController
465
+ key={`${business.id}_` + i}
466
+ business={business}
467
+ isBusinessOpen={business.open}
468
+ handleCustomClick={handleBusinessClick}
469
+ orderType={orderState?.options?.type}
470
+ navigation={navigation}
471
+ businessHeader={business?.header}
472
+ businessFeatured={business?.featured}
473
+ businessLogo={business?.logo}
474
+ businessReviews={business?.reviews}
475
+ businessDeliveryPrice={business?.delivery_price}
476
+ businessDeliveryTime={business?.delivery_time}
477
+ businessPickupTime={business?.pickup_time}
478
+ businessDistance={business?.distance}
479
+ handleUpdateBusinessList={handleUpdateBusinessList}
480
+ favoriteIds={favoriteIds}
481
+ setFavoriteIds={setFavoriteIds}
482
+ />
483
+ )
484
+ )}
485
+ {businessesList.loading && (
486
+ <>
487
+ {[
488
+ ...Array(
489
+ paginationProps.nextPageItems
490
+ ? paginationProps.nextPageItems
491
+ : 8,
492
+ ).keys(),
493
+ ].map((item, i) => (
494
+ <Placeholder
495
+ Animation={Fade}
496
+ key={i}
497
+ style={{ marginBottom: 20 }}>
498
+ <View style={{ width: '100%' }}>
499
+ <PlaceholderLine
500
+ height={200}
501
+ style={{ marginBottom: 20, borderRadius: 25 }}
502
+ />
503
+ <View style={{ paddingHorizontal: 10 }}>
504
+ <View
505
+ style={{
506
+ flexDirection: 'row',
507
+ justifyContent: 'space-between',
508
+ }}>
509
+ <PlaceholderLine
510
+ height={25}
511
+ width={40}
512
+ style={{ marginBottom: 10 }}
513
+ />
514
+ <PlaceholderLine
515
+ height={25}
516
+ width={20}
517
+ style={{ marginBottom: 10 }}
518
+ />
519
+ </View>
520
+ <PlaceholderLine
521
+ height={20}
522
+ width={30}
523
+ style={{ marginBottom: 10 }}
524
+ />
525
+ <PlaceholderLine
526
+ height={20}
527
+ width={80}
528
+ style={{ marginBottom: 10 }}
529
+ />
530
+ </View>
531
+ </View>
532
+ </Placeholder>
533
+ ))}
534
+ </>
535
+ )}
536
+ </ListWrapper>
537
+ </ScrollView>
538
+ );
539
+ };
540
+
541
+ export const BusinessesListing = (props: BusinessesListingParams) => {
542
+ const BusinessesListingProps = {
543
+ ...props,
544
+ isForceSearch: Platform.OS === 'ios',
545
+ UIComponent: BusinessesListingUI,
546
+ };
547
+
548
+ return <BusinessesListingController {...BusinessesListingProps} />;
549
+ };
@@ -0,0 +1,106 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const WelcomeTitle = styled.View`
4
+ flex: 1;
5
+ flex-direction: row;
6
+ align-items: center;
7
+ margin-bottom: 15px;
8
+ `
9
+
10
+ export const BusinessList = styled.View`
11
+ flex-wrap: wrap;
12
+ `
13
+
14
+ export const Search = styled.View`
15
+ justify-content: flex-end;
16
+ align-items: center;
17
+ margin-vertical: 10px;
18
+ `
19
+
20
+ export const AddressInput = styled.TouchableOpacity`
21
+ flex-direction: row;
22
+ background-color: ${(props: any) => props.theme.colors.white};
23
+ border-radius: 22px;
24
+ padding-horizontal: 20px;
25
+ align-items: center;
26
+ width: 100%;
27
+ height: 44px;
28
+ max-height: 44px;
29
+ `
30
+
31
+ export const OrderControlContainer = styled.View`
32
+ width: 100%;
33
+ flex-direction: column;
34
+ align-items: center;
35
+ z-index: 10;
36
+ padding-bottom: 20px;
37
+ flex: 1;
38
+ `
39
+
40
+ export const WrapMomentOption = styled.TouchableOpacity`
41
+ background-color: ${(props: any) => props.theme.colors.backgroundGray100};
42
+ border-radius: 7.6px;
43
+ font-size: 12px;
44
+ max-width: 240px;
45
+ height: 26px;
46
+ align-items: center;
47
+ justify-content: center;
48
+ padding-horizontal: 8px;
49
+ flex-direction: row;
50
+ margin-end: 12px;
51
+ `
52
+
53
+ export const HeaderWrapper = styled.ImageBackground`
54
+ width: 100%;
55
+ height: 370px;
56
+ padding: 20px 40px;
57
+ background-color: transparent;
58
+ `;
59
+
60
+ export const ListWrapper = styled.View`
61
+ background-color: ${(props: any) => props.theme.colors.backgroundLight};
62
+ padding-horizontal: 40px;
63
+ `;
64
+
65
+ export const FeaturedWrapper = styled.View`
66
+ background-color: ${(props: any) => props.theme.colors.backgroundLight};
67
+ height: 220px;
68
+ paddingVertical: 30px;
69
+ `;
70
+
71
+ export const OrderProgressWrapper = styled.View`
72
+ margin-top: 37px;
73
+ margin-bottom: 20px;
74
+ padding-horizontal: 40px;
75
+ `
76
+
77
+ export const FarAwayMessage = styled.View`
78
+ flex-direction: row;
79
+ align-items: center;
80
+ background-color: ${(props: any) => props.theme.colors.warning1};
81
+ margin-bottom: 25px;
82
+ border-radius: 7.6px;
83
+ border: 1px solid ${(props: any) => props.theme.colors.warning5};
84
+ `
85
+
86
+ export const SearchBarWrapper = styled.View`
87
+ width: 100px;
88
+ `
89
+
90
+ export const MomentWrapper = styled.View`
91
+ width: 100%;
92
+ margin-bottom: 20px;
93
+ `
94
+
95
+ export const FilterWrapper = styled.View`
96
+ margin-top: 25px;
97
+ `
98
+
99
+ export const ServiceWrapper = styled.View`
100
+ padding-left: 40px;
101
+ `
102
+
103
+ export const PriceWrapper = styled.View`
104
+ padding-left: 40px;
105
+ margin-top: 30px;
106
+ `