ordering-ui-react-native 0.22.59 → 0.22.60-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 (143) hide show
  1. package/package.json +5 -7
  2. package/src/DeliveryApp.tsx +1 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/src/providers/AlertProvider.tsx +3 -1
  8. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +5 -3
  9. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  10. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  11. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  12. package/themes/business/src/components/Chat/index.tsx +15 -3
  13. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  14. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  15. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  16. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  17. package/themes/business/src/components/LogoutButton/index.tsx +13 -4
  18. package/themes/business/src/components/MapView/RenderMarker.tsx +146 -0
  19. package/themes/business/src/components/MapView/index.tsx +68 -142
  20. package/themes/business/src/components/NewOrderNotification/index.tsx +39 -55
  21. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  22. package/themes/business/src/components/OrderDetails/Delivery.tsx +123 -54
  23. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +146 -36
  24. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  25. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  26. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  28. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  29. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  30. package/themes/business/src/components/OrdersOption/index.tsx +345 -231
  31. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  32. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  33. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
  34. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  36. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  37. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  38. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  39. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  40. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  41. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  42. package/themes/business/src/components/StoresList/index.tsx +2 -2
  43. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  44. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  45. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  46. package/themes/business/src/config/currency.tsx +1010 -0
  47. package/themes/business/src/hooks/useLocation.tsx +16 -12
  48. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  49. package/themes/business/src/types/index.tsx +33 -7
  50. package/themes/business/src/utils/index.tsx +28 -3
  51. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  53. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +223 -219
  62. package/themes/original/src/components/AddressForm/index.tsx +48 -16
  63. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  64. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  65. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  66. package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  68. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
  70. package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
  71. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  72. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  73. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  74. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  75. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  76. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  77. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  79. package/themes/original/src/components/Cart/index.tsx +50 -14
  80. package/themes/original/src/components/CartContent/index.tsx +2 -3
  81. package/themes/original/src/components/Checkout/index.tsx +133 -90
  82. package/themes/original/src/components/Favorite/index.tsx +1 -5
  83. package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
  84. package/themes/original/src/components/GPSButton/index.tsx +2 -1
  85. package/themes/original/src/components/GoogleMap/index.tsx +8 -6
  86. package/themes/original/src/components/Help/functions.tsx +76 -0
  87. package/themes/original/src/components/Help/index.tsx +74 -29
  88. package/themes/original/src/components/Help/styles.tsx +4 -1
  89. package/themes/original/src/components/HelpOptions/index.tsx +44 -0
  90. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  91. package/themes/original/src/components/Home/index.tsx +37 -12
  92. package/themes/original/src/components/LoginForm/index.tsx +11 -5
  93. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  94. package/themes/original/src/components/Messages/index.tsx +20 -13
  95. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  96. package/themes/original/src/components/MomentOption/index.tsx +67 -49
  97. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  98. package/themes/original/src/components/MultiCheckout/index.tsx +78 -36
  99. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  100. package/themes/original/src/components/NavBar/index.tsx +6 -2
  101. package/themes/original/src/components/NotFoundSource/index.tsx +40 -39
  102. package/themes/original/src/components/NotFoundSource/styles.tsx +18 -9
  103. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  104. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  105. package/themes/original/src/components/OrderDetails/index.tsx +44 -19
  106. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  107. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  108. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  109. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  110. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  111. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  112. package/themes/original/src/components/PaymentOptions/index.tsx +471 -459
  113. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  114. package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
  115. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  116. package/themes/original/src/components/ProductOptionSubOption/index.tsx +15 -14
  117. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  118. package/themes/original/src/components/SignupForm/index.tsx +40 -24
  119. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  120. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  121. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  122. package/themes/original/src/components/StripeCardsList/index.tsx +9 -4
  123. package/themes/original/src/components/StripeElementsForm/index.tsx +2 -2
  124. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  125. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  126. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  127. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  128. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  129. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  130. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  131. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  132. package/themes/original/src/components/shared/OButton.tsx +2 -2
  133. package/themes/original/src/components/shared/OInput.tsx +4 -8
  134. package/themes/original/src/components/shared/OModal.tsx +7 -2
  135. package/themes/original/src/types/index.tsx +699 -691
  136. package/themes/original/src/utils/index.tsx +29 -0
  137. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  138. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -62
  139. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +0 -12
  140. package/themes/original/src/components/HelpGuide/index.tsx +0 -68
  141. package/themes/original/src/components/HelpGuide/styles.tsx +0 -12
  142. package/themes/original/src/components/HelpOrder/index.tsx +0 -71
  143. package/themes/original/src/components/HelpOrder/styles.tsx +0 -13
@@ -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)
@@ -58,6 +58,7 @@ export const BusinessItemAccordion = (props: any) => {
58
58
  }, cart?.subtotal)
59
59
 
60
60
  const bgStyle = (subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary
61
+ const textStyles = (subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.black : theme.colors.white
61
62
 
62
63
  useEffect(() => {
63
64
  if (isActive && !isFromUpselling) {
@@ -68,6 +69,11 @@ export const BusinessItemAccordion = (props: any) => {
68
69
  }
69
70
  }, [isActive, viewedCart])
70
71
 
72
+ const handleGoToStore = () => {
73
+ Vibration.vibrate(100)
74
+ props.onNavigationRedirect('Business', { store: cart?.business?.slug })
75
+ }
76
+
71
77
  return (
72
78
  <BIContainer isClosed={isClosed} isMultiCheckout={isMultiCheckout} checkoutVisible={!isActive && !isClosed && !!isProducts && !checkoutButtonDisabled}>
73
79
  <BIHeader
@@ -81,7 +87,7 @@ export const BusinessItemAccordion = (props: any) => {
81
87
  <View style={{ flexDirection: 'row' }}>
82
88
  {props.onNavigationRedirect && !isClosed && !isGiftCart && (
83
89
  <>
84
- <TouchableOpacity onPress={() => props.onNavigationRedirect('Business', { store: cart?.business?.slug })}>
90
+ <TouchableOpacity onPress={() => handleGoToStore()}>
85
91
  <OText color={theme.colors.primary} size={12} lineHeight={18} style={{ textDecorationLine: 'underline' }}>{t('GO_TO_STORE', 'Go to store')}</OText>
86
92
  </TouchableOpacity>
87
93
  </>
@@ -155,7 +161,7 @@ export const BusinessItemAccordion = (props: any) => {
155
161
  {cart?.valid_products && (
156
162
  <OButton
157
163
  onClick={handleClickCheckout}
158
- textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
164
+ textStyle={{ color: textStyles, textAlign: 'center', flex: 1 }}
159
165
  style={{ width: 180, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
160
166
  text={t('CHECKOUT', 'Checkout')}
161
167
  bgColor={bgStyle}
@@ -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.backgroundLight : 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}>
@@ -284,7 +296,7 @@ export const BusinessSearchFooter = (props: any) => {
284
296
  onClick={() => handleChangeActiveBusinessType(type)}
285
297
  text={`${t(`BUSINESS_TYPE_${type.name.replace(/\s/g, '_').toUpperCase()}`, type.name)} ${filters?.business_types?.includes(type?.id) ? 'X' : ''}`}
286
298
  style={styles.categoryStyle}
287
- textStyle={{ fontSize: 10, color: (filters?.business_types?.includes(type?.id) || (type?.id === null && filters?.business_types?.length === 0)) ? '#fff' : theme.colors.textNormal }}
299
+ textStyle={{ fontSize: 10, color: (filters?.business_types?.includes(type?.id) || (type?.id === null && filters?.business_types?.length === 0)) ? theme.colors.white : theme.colors.textNormal }}
288
300
  />
289
301
  ))}
290
302
  </View>
@@ -296,7 +308,6 @@ export const BusinessSearchFooter = (props: any) => {
296
308
  <OButton
297
309
  text={t('APPLY', 'Apply')}
298
310
  parentStyle={styles.applyButton}
299
- textStyle={{ color: '#fff' }}
300
311
  onClick={() => handleApplyFilters()}
301
312
  />
302
313
  </View>
@@ -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}
@@ -11,6 +11,8 @@ import { BusinessMenuList } from '../BusinessMenuList'
11
11
  import Spinner from 'react-native-loading-spinner-overlay'
12
12
  import { BusinessPreorderParams } from '../../types'
13
13
  import moment from 'moment'
14
+ import { setLocalMoment } from '../../utils';
15
+
14
16
  import SelectDropdown from 'react-native-select-dropdown'
15
17
  import {
16
18
  PreOrderContainer,
@@ -41,7 +43,8 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
41
43
  getActualSchedule,
42
44
  isAsap,
43
45
  cateringPreorder,
44
- preorderLeadTime
46
+ preorderLeadTime,
47
+ preorderMaximumDays
45
48
  } = props
46
49
 
47
50
  const theme = useTheme()
@@ -261,14 +264,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
261
264
  if (cateringPreorder) {
262
265
  let _timeLists = []
263
266
  const schedule = business && getActualSchedule()
264
- if (!schedule && cateringPreorder && Object.keys(business)?.length > 0) {
267
+ if (!schedule && business) {
268
+ setTimeList([])
265
269
  return
266
270
  }
271
+
267
272
  _timeLists = hoursList
268
- .filter(hour => ((Object.keys(business || {})?.length === 0) || schedule?.lapses?.some((lapse: any) =>
269
- 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}`))) &&
270
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
271
- (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
+ })
272
284
  .map(hour => {
273
285
  return {
274
286
  value: hour.startTime,
@@ -296,7 +308,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
296
308
  const _times = getTimes(selectDate, selectedMenu)
297
309
  setTimeList(_times)
298
310
  }
299
- }, [selectDate, menu, business, cateringPreorder, hoursList, dateSelected])
311
+ }, [selectDate, menu, JSON.stringify(datesWhitelist), JSON.stringify(business), cateringPreorder, JSON.stringify(hoursList), dateSelected])
300
312
 
301
313
  useEffect(() => {
302
314
  if (selectedPreorderType === 0 && Object.keys(menu).length > 0) setMenu({})
@@ -311,6 +323,10 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
311
323
  }
312
324
  }, [dateSelected])
313
325
 
326
+ useEffect(() => {
327
+ setLocalMoment(moment, t)
328
+ }, [])
329
+
314
330
  useFocusEffect(
315
331
  React.useCallback(() => {
316
332
  handleAsap && handleAsap()
@@ -438,21 +454,23 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
438
454
  style={styles.calendar}
439
455
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
440
456
  calendarHeaderStyle={styles.calendarHeader}
441
- dateNumberStyle={styles.dateNumber}
442
- dateNameStyle={styles.dateName}
443
457
  iconContainer={{ flex: 0.1 }}
444
- highlightDateNameStyle={styles.highlightDateName}
445
- highlightDateNumberStyle={styles.highlightDateNumber}
446
458
  dayContainerStyle={{ height: '100%' }}
447
459
  highlightDateContainerStyle={{ height: '100%' }}
448
460
  calendarHeaderFormat='MMMM, YYYY'
449
461
  iconStyle={{ borderWidth: 1 }}
450
462
  selectedDate={selectDate}
451
463
  datesWhitelist={datesWhitelist}
464
+ highlightDateNameStyle={styles.highlightDateName}
465
+ highlightDateNumberStyle={styles.highlightDateNumber}
466
+ minDate={moment()}
467
+ maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
452
468
  disabledDateNameStyle={styles.disabledDateName}
453
469
  disabledDateNumberStyle={styles.disabledDateNumber}
470
+ dateNumberStyle={styles.dateNumber}
471
+ dateNameStyle={styles.dateName}
454
472
  disabledDateOpacity={0.6}
455
- onDateSelected={(date) => onSelectDate(date)}
473
+ onDateSelected={(date: any) => onSelectDate(date)}
456
474
  leftSelector={<LeftSelector />}
457
475
  rightSelector={<RightSelector />}
458
476
  />
@@ -559,9 +577,10 @@ export const BusinessPreorder = (props: any) => {
559
577
 
560
578
  const splitCateringValue = (configName: string) =>
561
579
  Object.values(props?.business?.configs || {})
562
- ?.find(config => config?.key === configName)
580
+ ?.find((config : any) => config?.key === configName)
563
581
  ?.value?.split('|')
564
- ?.find(val => val.includes(cateringTypeString || ''))?.split(',')[1]
582
+ ?.find((val : any) => val.includes(cateringTypeString || ''))?.split(',')[1]
583
+
565
584
  const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
566
585
  const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
567
586
  const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
@@ -580,4 +599,4 @@ export const BusinessPreorder = (props: any) => {
580
599
  cateringPreorder: !!cateringTypeString
581
600
  }
582
601
  return <MomentOption {...businessPreorderProps} />
583
- }
602
+ }