ordering-ui-react-native 0.22.75 → 0.22.76-release

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 (137) hide show
  1. package/package.json +5 -7
  2. package/src/components/BusinessesListing/index.tsx +1 -1
  3. package/src/components/Checkout/index.tsx +40 -39
  4. package/src/components/VerifyPhone/styles.tsx +1 -2
  5. package/src/context/OfflineActions/index.tsx +236 -0
  6. package/src/providers/AlertProvider.tsx +3 -1
  7. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +5 -3
  8. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  9. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  10. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  11. package/themes/business/src/components/Chat/index.tsx +15 -3
  12. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  13. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  14. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  15. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  16. package/themes/business/src/components/LogoutButton/index.tsx +13 -4
  17. package/themes/business/src/components/MapView/RenderMarker.tsx +146 -0
  18. package/themes/business/src/components/MapView/index.tsx +68 -142
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +38 -54
  20. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  21. package/themes/business/src/components/OrderDetails/Delivery.tsx +111 -42
  22. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +146 -36
  23. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  24. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  25. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  26. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  27. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  28. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  29. package/themes/business/src/components/OrdersOption/index.tsx +207 -144
  30. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  31. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +20 -8
  33. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  34. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  35. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  36. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  37. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  38. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  39. package/themes/business/src/components/ProductItemAccordion/index.tsx +15 -16
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  41. package/themes/business/src/components/StoresList/index.tsx +2 -2
  42. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  43. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  44. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  45. package/themes/business/src/config/currency.tsx +1010 -0
  46. package/themes/business/src/hooks/useLocation.tsx +16 -12
  47. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  48. package/themes/business/src/types/index.tsx +26 -4
  49. package/themes/business/src/utils/index.tsx +26 -2
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  54. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  55. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  56. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  57. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  58. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/original/index.tsx +223 -219
  61. package/themes/original/src/components/AddressForm/index.tsx +56 -17
  62. package/themes/original/src/components/AppleLogin/index.tsx +3 -4
  63. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  64. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -3
  65. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +102 -90
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  67. package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
  68. package/themes/original/src/components/BusinessPreorder/index.tsx +30 -17
  69. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +72 -69
  70. package/themes/original/src/components/BusinessProductsList/index.tsx +4 -5
  71. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  72. package/themes/original/src/components/BusinessProductsListing/index.tsx +5 -4
  73. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +1 -0
  74. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +2 -1
  75. package/themes/original/src/components/Cart/index.tsx +43 -12
  76. package/themes/original/src/components/Checkout/index.tsx +126 -98
  77. package/themes/original/src/components/FloatingButton/index.tsx +1 -1
  78. package/themes/original/src/components/GPSButton/index.tsx +2 -1
  79. package/themes/original/src/components/GoogleMap/index.tsx +3 -2
  80. package/themes/original/src/components/Help/functions.tsx +76 -0
  81. package/themes/original/src/components/Help/index.tsx +74 -29
  82. package/themes/original/src/components/Help/styles.tsx +4 -1
  83. package/themes/original/src/components/HelpOptions/index.tsx +53 -0
  84. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  85. package/themes/original/src/components/Home/index.tsx +36 -11
  86. package/themes/original/src/components/LastOrder/index.tsx +1 -1
  87. package/themes/original/src/components/LoginForm/index.tsx +11 -5
  88. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  89. package/themes/original/src/components/Messages/index.tsx +562 -555
  90. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  91. package/themes/original/src/components/MomentOption/index.tsx +141 -61
  92. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  93. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  94. package/themes/original/src/components/MultiCheckout/index.tsx +78 -33
  95. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +2 -2
  96. package/themes/original/src/components/MultiOrdersDetails/index.tsx +2 -2
  97. package/themes/original/src/components/NavBar/index.tsx +6 -2
  98. package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
  99. package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
  100. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  101. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  102. package/themes/original/src/components/OrderDetails/index.tsx +44 -20
  103. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  104. package/themes/original/src/components/OrderProgress/index.tsx +5 -4
  105. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  106. package/themes/original/src/components/OrderTypeSelector/index.tsx +120 -120
  107. package/themes/original/src/components/OrdersOption/index.tsx +325 -325
  108. package/themes/original/src/components/PaymentOptionWallet/index.tsx +1 -0
  109. package/themes/original/src/components/PaymentOptions/index.tsx +471 -459
  110. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  111. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  112. package/themes/original/src/components/ProductOptionSubOption/index.tsx +15 -14
  113. package/themes/original/src/components/ServiceForm/index.tsx +2 -2
  114. package/themes/original/src/components/SignupForm/index.tsx +40 -24
  115. package/themes/original/src/components/SingleOrderCard/index.tsx +8 -5
  116. package/themes/original/src/components/SingleProductCard/index.tsx +2 -1
  117. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  118. package/themes/original/src/components/StripeCardsList/index.tsx +7 -1
  119. package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
  120. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  121. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  122. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  123. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  124. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  125. package/themes/original/src/components/VerifyPhone/index.tsx +1 -1
  126. package/themes/original/src/components/shared/OInput.tsx +97 -97
  127. package/themes/original/src/components/shared/OModal.tsx +7 -2
  128. package/themes/original/src/providers/AlertProvider.tsx +1 -1
  129. package/themes/original/src/types/index.tsx +700 -695
  130. package/themes/original/src/utils/index.tsx +50 -34
  131. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  132. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
  133. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
  134. package/themes/original/src/components/HelpGuide/index.tsx +0 -68
  135. package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
  136. package/themes/original/src/components/HelpOrder/index.tsx +0 -71
  137. package/themes/original/src/components/HelpOrder/styles.tsx +0 -13
@@ -21,7 +21,7 @@ export const AppleLogin = (props: any) => {
21
21
  const [{ configs }] = useConfig();
22
22
  const [credentialStateForUser, updateCredentialStateForUser] = useState<any>(-1);
23
23
 
24
- let user : any= null
24
+ let user: any = null
25
25
 
26
26
  const buttonText = auth
27
27
  ? t('CONTINUE_WITH_APPLE', 'Logout with Apple')
@@ -53,7 +53,7 @@ export const AppleLogin = (props: any) => {
53
53
  }
54
54
  }
55
55
 
56
- const fetchAndUpdateCredentialState = async (updateCredentialStateForUser : any) => {
56
+ const fetchAndUpdateCredentialState = async (updateCredentialStateForUser: any) => {
57
57
  if (user === null) {
58
58
  updateCredentialStateForUser('N/A');
59
59
  } else {
@@ -66,7 +66,7 @@ export const AppleLogin = (props: any) => {
66
66
  }
67
67
  }
68
68
 
69
- const onIOSButtonPress = async (updateCredentialStateForUser : any) => {
69
+ const onIOSButtonPress = async (updateCredentialStateForUser: any) => {
70
70
  try {
71
71
  const appleAuthRequestResponse = await appleAuth.performRequest({
72
72
  requestedOperation: appleAuth.Operation.LOGIN,
@@ -79,7 +79,6 @@ export const AppleLogin = (props: any) => {
79
79
  identityToken,
80
80
  authorizationCode
81
81
  } = appleAuthRequestResponse;
82
-
83
82
  user = newUser;
84
83
 
85
84
  fetchAndUpdateCredentialState(updateCredentialStateForUser).catch(error =>
@@ -40,6 +40,8 @@ function BusinessControllerPropsAreEqual(prevProps: any, nextProps: any) {
40
40
  prevProps.isBusinessOpen === nextProps.isBusinessOpen
41
41
  }
42
42
 
43
+ const deliveryTypes = [1, 7]
44
+
43
45
  export const BusinessControllerUI = React.memo((props: BusinessControllerParams) => {
44
46
  const {
45
47
  business,
@@ -321,14 +323,14 @@ export const BusinessControllerUI = React.memo((props: BusinessControllerParams)
321
323
  </View>
322
324
  ) : (
323
325
  <View style={styles.bullet}>
324
- {orderState?.options?.type === 1 && !hideBusinessFee && (
326
+ {deliveryTypes.includes(orderState?.options?.type) && !hideBusinessFee && (
325
327
  <OText size={textSize} color={theme.colors.textSecondary}>
326
328
  {`${t('DELIVERY_FEE', 'Delivery fee')} ${parsePrice(businessDeliveryPrice ?? business?.delivery_price) + ' \u2022 '}`}
327
329
  </OText>
328
330
  )}
329
331
  {!hideBusinessTime && (
330
332
  <OText size={textSize} color={theme.colors.textSecondary}>{`${convertHoursToMinutes(
331
- orderState?.options?.type === 1
333
+ deliveryTypes.includes(orderState?.options?.type)
332
334
  ? (businessDeliveryTime ?? business?.delivery_time)
333
335
  : (businessPickupTime ?? business?.pickup_time),
334
336
  )} \u2022 `}</OText>
@@ -1,5 +1,5 @@
1
1
  import React, { useState, useRef, useEffect } from 'react';
2
- import { TouchableOpacity, View } from 'react-native';
2
+ import { TouchableOpacity, View, Vibration } from 'react-native';
3
3
  import { useOrder, useLanguage, useUtils, useConfig, useEvent } from 'ordering-components/native';
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import {
@@ -49,7 +49,7 @@ export const BusinessItemAccordion = (props: any) => {
49
49
  if (cartsLength === 1) {
50
50
  changeActiveState && changeActiveState(!isClosed, cart?.uuid)
51
51
  }
52
- }, [orderState?.carts, isClosed])
52
+ }, [orderState?.carts?.length, isClosed])
53
53
 
54
54
  const subtotalWithTaxes = cart?.taxes?.reduce((acc: any, item: any) => {
55
55
  if (item?.type === 1)
@@ -69,6 +69,11 @@ export const BusinessItemAccordion = (props: any) => {
69
69
  }
70
70
  }, [isActive, viewedCart])
71
71
 
72
+ const handleGoToStore = () => {
73
+ Vibration.vibrate(100)
74
+ props.onNavigationRedirect('Business', { store: cart?.business?.slug })
75
+ }
76
+
72
77
  return (
73
78
  <BIContainer isClosed={isClosed} isMultiCheckout={isMultiCheckout} checkoutVisible={!isActive && !isClosed && !!isProducts && !checkoutButtonDisabled}>
74
79
  <BIHeader
@@ -82,7 +87,7 @@ export const BusinessItemAccordion = (props: any) => {
82
87
  <View style={{ flexDirection: 'row' }}>
83
88
  {props.onNavigationRedirect && !isClosed && !isGiftCart && (
84
89
  <>
85
- <TouchableOpacity onPress={() => props.onNavigationRedirect('Business', { store: cart?.business?.slug })}>
90
+ <TouchableOpacity onPress={() => handleGoToStore()}>
86
91
  <OText color={theme.colors.primary} size={12} lineHeight={18} style={{ textDecorationLine: 'underline' }}>{t('GO_TO_STORE', 'Go to store')}</OText>
87
92
  </TouchableOpacity>
88
93
  </>
@@ -1,5 +1,5 @@
1
- import React, { useState } from 'react'
2
- import { useLanguage, useOrder } from 'ordering-components/native'
1
+ import React from 'react'
2
+ import { useLanguage, useOrder, useConfig } from 'ordering-components/native'
3
3
  import { ScrollView, StyleSheet, TouchableOpacity, View, Dimensions } from 'react-native'
4
4
  import { useTheme } from 'styled-components/native'
5
5
  import { OButton, OModal, OText } from '../shared'
@@ -38,6 +38,7 @@ export const BusinessSearchFooter = (props: any) => {
38
38
  const [orderState] = useOrder()
39
39
 
40
40
  const [, t] = useLanguage()
41
+ const [{ configs }] = useConfig()
41
42
 
42
43
  const maxDeliveryFeeOptions = [15, 25, 35, 'default']
43
44
  // const maxProductPriceOptions = [5, 10, 15, 'default']
@@ -57,6 +58,8 @@ export const BusinessSearchFooter = (props: any) => {
57
58
  { level: '5', content: '$$$$$' }
58
59
  ]
59
60
 
61
+ const filterOptionsEnabled = configs?.filter_search_options?.value?.split('|') || []
62
+
60
63
  const styles = StyleSheet.create({
61
64
  container: {
62
65
  paddingHorizontal: 40,
@@ -165,90 +168,97 @@ export const BusinessSearchFooter = (props: any) => {
165
168
  >
166
169
  {t('FILTER', 'Filter')}
167
170
  </OText>
168
- <SortContainer>
169
- <OText weight='bold' mBottom={7} size={16}>
170
- {t('SORT', 'Sort')}
171
- </OText>
172
- {sortItems?.filter(item => !(orderState?.options?.type === 1 && item?.value === 'pickup_time') && !(orderState?.options?.type === 2 && item?.value === 'delivery_time'))?.map(item => (
173
- <TouchableOpacity
174
- key={item?.value}
175
- onPress={() => handleChangeFilters('orderBy', item?.value)}
176
- style={{ marginBottom: 7 }}
171
+ {filterOptionsEnabled.includes('sort') && (
172
+ <SortContainer>
173
+ <OText weight='bold' mBottom={7} size={16}>
174
+ {t('SORT', 'Sort')}
175
+ </OText>
176
+ {sortItems?.filter(item => !(orderState?.options?.type === 1 && item?.value === 'pickup_time') && !(orderState?.options?.type === 2 && item?.value === 'delivery_time'))?.map(item => (
177
+ <TouchableOpacity
178
+ key={item?.value}
179
+ onPress={() => handleChangeFilters('orderBy', item?.value)}
180
+ style={{ marginBottom: 7 }}
181
+ >
182
+ <OText
183
+ weight={filters?.orderBy?.includes(item?.value) ? 'bold' : '500'}
184
+ mBottom={filters?.orderBy?.includes(item?.value) ? 5 : 0}
185
+ >
186
+ {item?.text} {(filters?.orderBy?.includes(item?.value)) && <>{filters?.orderBy?.includes('-') ? <AntDesignIcon name='caretup' /> : <AntDesignIcon name='caretdown' />}</>}
187
+ </OText>
188
+ </TouchableOpacity>
189
+ ))}
190
+ </SortContainer>
191
+ )}
192
+ {filterOptionsEnabled.includes('brands') && (
193
+
194
+ <BrandContainer>
195
+ <OText
196
+ size={16}
197
+ weight='bold'
198
+ lineHeight={24}
199
+ style={{ marginBottom: 10 }}
177
200
  >
178
- <OText
179
- weight={filters?.orderBy?.includes(item?.value) ? 'bold' : '500'}
180
- mBottom={filters?.orderBy?.includes(item?.value) ? 5 : 0}
201
+ {t('BRANDS', 'Brands')}
202
+ </OText>
203
+ {!brandList?.loading && !brandList?.error && brandList?.brands?.length > 0 && (
204
+ <ScrollView
205
+ style={{ maxHeight: 300, marginBottom: 10 }}
206
+ showsVerticalScrollIndicator={true}
207
+ nestedScrollEnabled={true}
181
208
  >
182
- {item?.text} {(filters?.orderBy?.includes(item?.value)) && <>{filters?.orderBy?.includes('-') ? <AntDesignIcon name='caretup' /> : <AntDesignIcon name='caretdown' />}</>}
183
- </OText>
184
- </TouchableOpacity>
185
- ))}
186
- </SortContainer>
187
- <BrandContainer>
188
- <OText
189
- size={16}
190
- weight='bold'
191
- lineHeight={24}
192
- style={{ marginBottom: 10 }}
193
- >
194
- {t('BRANDS', 'Brands')}
195
- </OText>
196
- {!brandList?.loading && !brandList?.error && brandList?.brands?.length > 0 && (
197
- <ScrollView
198
- style={{ maxHeight: 300, marginBottom: 10 }}
199
- showsVerticalScrollIndicator={true}
200
- nestedScrollEnabled={true}
209
+ {brandList?.brands.map((brand: any, i: number) => brand?.enabled && (
210
+ <BrandItem
211
+ key={i}
212
+ onPress={() => handleChangeBrandFilter(brand?.id)}
213
+ >
214
+ <OText
215
+ size={14}
216
+ weight={'400'}
217
+ lineHeight={24}
218
+ >
219
+ {brand?.name}
220
+ </OText>
221
+ {filters?.franchise_ids?.includes(brand?.id) && (
222
+ <AntDesignIcon
223
+ name='check'
224
+ color={theme.colors.success500}
225
+ size={16}
226
+ />
227
+ )}
228
+ </BrandItem>
229
+ ))}
230
+ </ScrollView>
231
+ )}
232
+ {!brandList?.loading && ((brandList?.brands?.filter((brand: any) => brand?.enabled))?.length === 0) && (
233
+ <OText size={14} weight='400'>{t('NO_RESULTS_FOUND', 'Sorry, no results found')}</OText>
234
+ )}
235
+ </BrandContainer>
236
+ )}
237
+ {filterOptionsEnabled.includes('price_range') && (
238
+ <PriceFilterWrapper>
239
+ <OText
240
+ size={16}
241
+ weight='bold'
242
+ lineHeight={24}
243
+ style={{ marginBottom: 5 }}
201
244
  >
202
- {brandList?.brands.map((brand: any, i: number) => brand?.enabled && (
203
- <BrandItem
245
+ {t('PRICE_RANGE', 'Price range')}
246
+ </OText>
247
+ <View style={styles.priceContainer}>
248
+ {priceList.map((price: any, i: number) => (
249
+ <OButton
204
250
  key={i}
205
- onPress={() => handleChangeBrandFilter(brand?.id)}
206
- >
207
- <OText
208
- size={14}
209
- weight={'400'}
210
- lineHeight={24}
211
- >
212
- {brand?.name}
213
- </OText>
214
- {filters?.franchise_ids?.includes(brand?.id) && (
215
- <AntDesignIcon
216
- name='check'
217
- color={theme.colors.success500}
218
- size={16}
219
- />
220
- )}
221
- </BrandItem>
251
+ bgColor={(filters?.price_level === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
252
+ onClick={() => handleChangePriceRange(price?.level)}
253
+ text={`${price.content} ${(filters?.price_level === price?.level) ? ' X' : ''}`}
254
+ style={styles.priceItem}
255
+ textStyle={{ fontSize: 10, color: (filters?.price_level === price?.level) ? theme.colors.white : theme.colors.textNormal }}
256
+ />
222
257
  ))}
223
- </ScrollView>
224
- )}
225
- {!brandList?.loading && ((brandList?.brands?.filter((brand: any) => brand?.enabled))?.length === 0) && (
226
- <OText size={14} weight='400'>{t('NO_RESULTS_FOUND', 'Sorry, no results found')}</OText>
227
- )}
228
- </BrandContainer>
229
- <PriceFilterWrapper>
230
- <OText
231
- size={16}
232
- weight='bold'
233
- lineHeight={24}
234
- style={{ marginBottom: 5 }}
235
- >
236
- {t('PRICE_RANGE', 'Price range')}
237
- </OText>
238
- <View style={styles.priceContainer}>
239
- {priceList.map((price: any, i: number) => (
240
- <OButton
241
- key={i}
242
- bgColor={(filters?.price_level === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
243
- onClick={() => handleChangePriceRange(price?.level)}
244
- text={`${price.content} ${(filters?.price_level === price?.level) ? ' X' : ''}`}
245
- style={styles.priceItem}
246
- textStyle={{ fontSize: 10, color: (filters?.price_level === price?.level) ? theme.colors.white : theme.colors.textNormal }}
247
- />
248
- ))}
249
- </View>
250
- </PriceFilterWrapper>
251
- {orderState?.options?.type === 1 && (
258
+ </View>
259
+ </PriceFilterWrapper>
260
+ )}
261
+ {orderState?.options?.type === 1 && filterOptionsEnabled.includes('max_delivery_fee') && (
252
262
  <MaxSectionItem
253
263
  filters={filters}
254
264
  title={t('MAX_DELIVERY_FEE', 'Max delivery fee')}
@@ -257,7 +267,7 @@ export const BusinessSearchFooter = (props: any) => {
257
267
  handleChangeFilters={handleChangeFilters}
258
268
  />
259
269
  )}
260
- {[1, 2].includes(orderState?.options?.type) && (
270
+ {[1, 2].includes(orderState?.options?.type) && filterOptionsEnabled.includes('max_delivery_time') && (
261
271
  <MaxSectionItem
262
272
  filters={filters}
263
273
  title={orderState?.options?.type === 1 ? t('MAX_DELIVERY_TIME', 'Max delivery time') : t('MAX_PICKUP_TIME', 'Max pickup time')}
@@ -266,14 +276,16 @@ export const BusinessSearchFooter = (props: any) => {
266
276
  handleChangeFilters={handleChangeFilters}
267
277
  />
268
278
  )}
269
- <MaxSectionItem
270
- filters={filters}
271
- title={t('MAX_DISTANCE', 'Max distance')}
272
- options={maxDistanceOptions}
273
- filter='max_distance'
274
- handleChangeFilters={handleChangeFilters}
275
- />
276
- {businessTypes?.length > 0 && (
279
+ {filterOptionsEnabled.includes('max_distance') && (
280
+ <MaxSectionItem
281
+ filters={filters}
282
+ title={t('MAX_DISTANCE', 'Max distance')}
283
+ options={maxDistanceOptions}
284
+ filter='max_distance'
285
+ handleChangeFilters={handleChangeFilters}
286
+ />
287
+ )}
288
+ {businessTypes?.length > 0 && filterOptionsEnabled.includes('business_categories') && (
277
289
  <TagsContainer>
278
290
  <OText weight='bold' mBottom={7} size={16}>{t('BUSINESS_CATEGORIES', 'Business categories')}</OText>
279
291
  <View style={styles.businessTypesContainer}>
@@ -1,5 +1,5 @@
1
- import React, { useEffect, useState } from 'react'
2
- import { useLanguage } from 'ordering-components/native'
1
+ import React from 'react'
2
+ import { useLanguage, useConfig } from 'ordering-components/native'
3
3
  import { View, Platform, StyleSheet, Dimensions } from 'react-native'
4
4
  import { HeaderTitle, OButton, OText } from '../shared'
5
5
  import { SearchBar } from '../SearchBar';
@@ -20,6 +20,8 @@ export const BusinessSearchHeader = (props: any) => {
20
20
  } = props
21
21
  const theme = useTheme()
22
22
  const [, t] = useLanguage()
23
+ const [{ configs }] = useConfig()
24
+
23
25
  const noResults = (!businessesSearchList.loading && !businessesSearchList.lengthError && businessesSearchList?.businesses?.length === 0)
24
26
  const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
25
27
  const hideBrowse = theme?.bar_menu?.components?.browse?.hidden
@@ -61,7 +63,9 @@ export const BusinessSearchHeader = (props: any) => {
61
63
  />
62
64
  )}
63
65
  <HeaderTitle ph={20} text={t('SEARCH', 'Search')} />
64
- <AntDesignIcon name='filter' size={18} style={{ marginLeft: 'auto', marginTop: Platform.OS === 'ios' ? 35 : 55, paddingHorizontal: 20 }} onPress={() => handleOpenfilters()} />
66
+ {configs?.filter_search_options?.value !== '' && (
67
+ <AntDesignIcon name='filter' size={18} style={{ marginLeft: 'auto', marginTop: Platform.OS === 'ios' ? 35 : 55, paddingHorizontal: 20 }} onPress={() => handleOpenfilters()} />
68
+ )}
65
69
  </View>
66
70
  <BContainer
67
71
  style={{ paddingHorizontal: 20 }}
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useState } from 'react'
1
+ import React, { useEffect, useMemo, useState, useCallback } from 'react'
2
2
  import { useLanguage, BusinessSearchList, useOrder, useUtils, useEvent, showToast, ToastType } from 'ordering-components/native'
3
3
  import { ScrollView, StyleSheet, Dimensions, FlatList } from 'react-native'
4
4
  import { useTheme } from 'styled-components/native'
@@ -16,7 +16,6 @@ import {
16
16
  import FastImage from 'react-native-fast-image'
17
17
  import { convertHoursToMinutes } from '../../utils'
18
18
  import { BusinessSearchParams } from '../../types'
19
- import { useIsFocused } from '@react-navigation/native';
20
19
 
21
20
  import { BusinessSearchHeader } from './BusinessSearchHeader'
22
21
  import { BusinessSearchFooter } from './BusinessSearchFooter'
@@ -49,8 +48,6 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
49
48
 
50
49
  const [openFilters, setOpenFilters] = useState(false)
51
50
 
52
- const isFocused = useIsFocused();
53
-
54
51
  const styles = StyleSheet.create({
55
52
  productsContainer: {
56
53
  marginTop: 20
@@ -130,17 +127,16 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
130
127
  })
131
128
  }
132
129
 
133
- const handleScroll = ({ nativeEvent }: any) => {
130
+ const handleScroll = useCallback(({ nativeEvent }: any) => {
134
131
  const y = nativeEvent.contentOffset.y;
135
132
  const height = nativeEvent.contentSize.height;
136
133
  const hasMore = !(
137
134
  paginationProps.totalPages === paginationProps.currentPage
138
135
  );
139
-
140
- if (y + PIXELS_TO_SCROLL > height && !businessesSearchList.loading && hasMore && businessesSearchList?.businesses?.length > 0) {
136
+ if (height > 1000 && y + PIXELS_TO_SCROLL > height && !businessesSearchList.loading && hasMore && businessesSearchList?.businesses?.length > 0) {
141
137
  handleSearchbusinessAndProducts();
142
138
  }
143
- };
139
+ }, [businessesSearchList.loading, businessesSearchList?.businesses?.length]);
144
140
 
145
141
  const onChangeTermValue = (query: any) => {
146
142
  handleChangeTermValue(query)
@@ -159,15 +155,14 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
159
155
  handleSearchbusinessAndProducts(true)
160
156
  }, [])
161
157
 
162
-
163
- useEffect(() => {
164
- handleChangeTermValue('')
165
- }, [isFocused])
158
+ const businessFiltered = useMemo(() => {
159
+ return businessesSearchList.businesses?.filter((business: any) => business?.categories?.length > 0)
160
+ }, [businessesSearchList.businesses])
166
161
 
167
162
  return (
168
163
  <>
169
164
  <FlatList
170
- data={businessesSearchList.businesses?.filter((business: any) => business?.categories?.length > 0)}
165
+ data={businessFiltered}
171
166
  ListFooterComponent={<BusinessSearchFooter
172
167
  businessesSearchList={businessesSearchList}
173
168
  handleCloseFilters={handleCloseFilters}
@@ -43,7 +43,8 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
43
43
  getActualSchedule,
44
44
  isAsap,
45
45
  cateringPreorder,
46
- preorderLeadTime
46
+ preorderLeadTime,
47
+ preorderMaximumDays
47
48
  } = props
48
49
 
49
50
  const theme = useTheme()
@@ -263,14 +264,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
263
264
  if (cateringPreorder) {
264
265
  let _timeLists = []
265
266
  const schedule = business && getActualSchedule()
266
- if (!schedule && cateringPreorder && Object.keys(business)?.length > 0) {
267
+ if (!schedule && business) {
268
+ setTimeList([])
267
269
  return
268
270
  }
271
+
269
272
  _timeLists = hoursList
270
- .filter(hour => ((Object.keys(business || {})?.length === 0) || schedule?.lapses?.some((lapse: any) =>
271
- moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${lapse.open.hour}:${lapse.open.minute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${lapse.close.hour}:${lapse.close.minute}`))) &&
272
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
273
- (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder))
273
+ .filter(hour => {
274
+ return (Object.keys(business || {})?.length === 0 || schedule?.lapses?.some((lapse: any) => {
275
+ const openHour = lapse.open.hour < 10 ? `0${lapse.open.hour}` : lapse.open.hour
276
+ const openMinute = lapse.open.minute < 10 ? `0${lapse.open.minute}` : lapse.open.minute
277
+ const closeHour = lapse.close.hour < 10 ? `0${lapse.close.hour}` : lapse.close.hour
278
+ const closeMinute = lapse.close.minute < 10 ? `0${lapse.close.minute}` : lapse.close.minute
279
+ return moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${openHour}:${openMinute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${closeHour}:${closeMinute}`)
280
+ })) &&
281
+ (moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`)) &&
282
+ (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder)
283
+ })
274
284
  .map(hour => {
275
285
  return {
276
286
  value: hour.startTime,
@@ -298,7 +308,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
298
308
  const _times = getTimes(selectDate, selectedMenu)
299
309
  setTimeList(_times)
300
310
  }
301
- }, [selectDate, menu, business, cateringPreorder, hoursList, dateSelected])
311
+ }, [selectDate, menu, JSON.stringify(datesWhitelist), JSON.stringify(business), cateringPreorder, JSON.stringify(hoursList), dateSelected])
302
312
 
303
313
  useEffect(() => {
304
314
  if (selectedPreorderType === 0 && Object.keys(menu).length > 0) setMenu({})
@@ -314,8 +324,8 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
314
324
  }, [dateSelected])
315
325
 
316
326
  useEffect(() => {
317
- setLocalMoment(moment, t)
318
- }, [])
327
+ setLocalMoment(moment, t)
328
+ }, [])
319
329
 
320
330
  useFocusEffect(
321
331
  React.useCallback(() => {
@@ -444,21 +454,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
444
454
  style={styles.calendar}
445
455
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
446
456
  calendarHeaderStyle={styles.calendarHeader}
447
- dateNumberStyle={styles.dateNumber}
448
- dateNameStyle={styles.dateName}
449
457
  iconContainer={{ flex: 0.1 }}
450
- highlightDateNameStyle={styles.highlightDateName}
451
- highlightDateNumberStyle={styles.highlightDateNumber}
452
458
  dayContainerStyle={{ height: '100%' }}
453
459
  highlightDateContainerStyle={{ height: '100%' }}
454
460
  calendarHeaderFormat='MMMM, YYYY'
455
461
  iconStyle={{ borderWidth: 1 }}
456
462
  selectedDate={selectDate}
457
463
  datesWhitelist={datesWhitelist}
464
+ highlightDateNameStyle={styles.highlightDateName}
465
+ highlightDateNumberStyle={styles.highlightDateNumber}
466
+ minDate={moment()}
467
+ maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
458
468
  disabledDateNameStyle={styles.disabledDateName}
459
469
  disabledDateNumberStyle={styles.disabledDateNumber}
470
+ dateNumberStyle={styles.dateNumber}
471
+ dateNameStyle={styles.dateName}
460
472
  disabledDateOpacity={0.6}
461
- onDateSelected={(date) => onSelectDate(date)}
473
+ onDateSelected={(date: any) => onSelectDate(date)}
462
474
  leftSelector={<LeftSelector />}
463
475
  rightSelector={<RightSelector />}
464
476
  />
@@ -565,9 +577,10 @@ export const BusinessPreorder = (props: any) => {
565
577
 
566
578
  const splitCateringValue = (configName: string) =>
567
579
  Object.values(props?.business?.configs || {})
568
- ?.find(config => config?.key === configName)
580
+ ?.find((config : any) => config?.key === configName)
569
581
  ?.value?.split('|')
570
- ?.find(val => val.includes(cateringTypeString || ''))?.split(',')[1]
582
+ ?.find((val : any) => val.includes(cateringTypeString || ''))?.split(',')[1]
583
+
571
584
  const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
572
585
  const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
573
586
  const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
@@ -586,4 +599,4 @@ export const BusinessPreorder = (props: any) => {
586
599
  cateringPreorder: !!cateringTypeString
587
600
  }
588
601
  return <MomentOption {...businessPreorderProps} />
589
- }
602
+ }