ordering-ui-react-native 0.22.1 → 0.22.2-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 (161) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/StripeMethodForm/index.tsx +4 -2
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/src/types/index.tsx +2 -1
  8. package/themes/business/index.tsx +2 -0
  9. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  10. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  11. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  12. package/themes/business/src/components/BusinessProductList/index.tsx +2 -1
  13. package/themes/business/src/components/Chat/index.tsx +15 -3
  14. package/themes/business/src/components/DriverMap/index.tsx +49 -27
  15. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  16. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  17. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  18. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  19. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  20. package/themes/business/src/components/MapView/index.tsx +36 -17
  21. package/themes/business/src/components/NewOrderNotification/index.tsx +40 -27
  22. package/themes/business/src/components/OrderDetails/Business.tsx +54 -37
  23. package/themes/business/src/components/OrderDetails/Delivery.tsx +138 -55
  24. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +125 -43
  25. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +62 -24
  26. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  27. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +149 -68
  28. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  29. package/themes/business/src/components/OrderSummary/index.tsx +210 -65
  30. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  31. package/themes/business/src/components/OrdersOption/index.tsx +217 -156
  32. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  33. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  34. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +39 -16
  35. package/themes/business/src/components/PreviousOrders/index.tsx +76 -66
  36. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  37. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  38. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  39. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  40. package/themes/business/src/components/PrinterSettings/index.tsx +226 -76
  41. package/themes/business/src/components/PrinterSettings/styles.tsx +20 -0
  42. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  43. package/themes/business/src/components/StoresList/index.tsx +2 -2
  44. package/themes/business/src/components/UserProfileForm/index.tsx +16 -17
  45. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  46. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  47. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  48. package/themes/business/src/types/index.tsx +14 -5
  49. package/themes/business/src/utils/index.tsx +25 -1
  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 +6 -0
  54. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  55. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  56. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  57. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  58. package/themes/original/index.tsx +11 -0
  59. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  60. package/themes/original/src/components/AddressList/index.tsx +8 -7
  61. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  62. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  63. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  64. package/themes/original/src/components/BusinessController/index.tsx +5 -5
  65. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +2 -3
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +1 -3
  68. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  69. package/themes/original/src/components/BusinessPreorder/index.tsx +44 -32
  70. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  71. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  72. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  73. package/themes/original/src/components/BusinessProductsListing/index.tsx +18 -6
  74. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  75. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  76. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -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 +38 -14
  80. package/themes/original/src/components/CartContent/index.tsx +2 -4
  81. package/themes/original/src/components/Checkout/index.tsx +110 -58
  82. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  83. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  84. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  85. package/themes/original/src/components/Favorite/index.tsx +1 -5
  86. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  87. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  88. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  89. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  90. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  91. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  92. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  93. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  94. package/themes/original/src/components/Help/index.tsx +2 -0
  95. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  96. package/themes/original/src/components/Home/index.tsx +3 -11
  97. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  98. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  99. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  100. package/themes/original/src/components/Messages/index.tsx +29 -17
  101. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  102. package/themes/original/src/components/MomentOption/index.tsx +79 -56
  103. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  104. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  105. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  106. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  107. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  108. package/themes/original/src/components/NavBar/index.tsx +7 -4
  109. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  110. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  111. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  112. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +13 -10
  113. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  114. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  115. package/themes/original/src/components/OrderProgress/index.tsx +5 -4
  116. package/themes/original/src/components/OrderSummary/index.tsx +29 -10
  117. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  118. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  119. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  120. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  121. package/themes/original/src/components/PaymentOptions/index.tsx +10 -8
  122. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  123. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  124. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  125. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  126. package/themes/original/src/components/ProductItemAccordion/index.tsx +51 -44
  127. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  128. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  129. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  130. package/themes/original/src/components/Promotions/index.tsx +6 -9
  131. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  132. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  133. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  134. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  135. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  136. package/themes/original/src/components/Sessions/index.tsx +3 -3
  137. package/themes/original/src/components/SignupForm/index.tsx +86 -78
  138. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  139. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  140. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  141. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  142. package/themes/original/src/components/StripeCardsList/index.tsx +10 -3
  143. package/themes/original/src/components/StripeElementsForm/index.tsx +76 -62
  144. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  145. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  146. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  147. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  148. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  149. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  150. package/themes/original/src/components/UserFormDetails/index.tsx +159 -133
  151. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  152. package/themes/original/src/components/UserVerification/index.tsx +14 -4
  153. package/themes/original/src/components/Wallets/index.tsx +6 -3
  154. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  155. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  156. package/themes/original/src/components/shared/OButton.tsx +5 -4
  157. package/themes/original/src/components/shared/OInput.tsx +4 -8
  158. package/themes/original/src/components/shared/OModal.tsx +7 -2
  159. package/themes/original/src/types/index.tsx +5 -1
  160. package/themes/original/src/utils/index.tsx +30 -1
  161. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -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,7 @@ export const AppleLogin = (props: any) => {
79
79
  identityToken,
80
80
  authorizationCode
81
81
  } = appleAuthRequestResponse;
82
-
82
+
83
83
  user = newUser;
84
84
 
85
85
  fetchAndUpdateCredentialState(updateCredentialStateForUser).catch(error =>
@@ -26,7 +26,6 @@ import {
26
26
  SocialListWrapper
27
27
  } from './styles';
28
28
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
29
- const types = ['food', 'laundry', 'alcohol', 'groceries'];
30
29
 
31
30
  let BusinessInformation: null | React.ElementType = null
32
31
  let BusinessReviews: null | React.ElementType = null
@@ -36,6 +35,7 @@ export const BusinessBasicInformation = (
36
35
  ) => {
37
36
  const { navigation, businessState, isBusinessInfoShow, logo, header, isPreOrder } = props;
38
37
  const { business, loading } = businessState;
38
+ const types = business?.types && business?.types?.filter(({ enabled }) => (enabled)).map(({ name }) => (name))
39
39
 
40
40
  const theme = useTheme();
41
41
  const [orderState] = useOrder();
@@ -146,14 +146,11 @@ export const BusinessBasicInformation = (
146
146
  }
147
147
 
148
148
  const getBusinessType = () => {
149
- if (Object.keys(business || {}).length <= 0) return t('GENERAL', 'General');
149
+ if (!types) return t('GENERAL', 'General');
150
150
  const _types: any = [];
151
151
  types.forEach(
152
- (type) =>
153
- business[type] &&
154
- _types.push(
155
- t(`BUSINESS_TYPE_${type?.replace(/\s/g, '_')?.toUpperCase()}`, type),
156
- ),
152
+ (type: any) =>
153
+ _types.push(type)
157
154
  );
158
155
  return _types.join(', ');
159
156
  };
@@ -455,7 +452,7 @@ export const BusinessBasicInformation = (
455
452
  </BusinessInfoItem>
456
453
  </View>
457
454
  <WrapReviews>
458
- {!isBusinessInfoShow && (
455
+ {!isBusinessInfoShow && !loading && (
459
456
  <>
460
457
  {isPreOrder && (!business?.professionals || business?.professionals?.length === 0) && (
461
458
  <>
@@ -35,9 +35,9 @@ import FastImage from 'react-native-fast-image'
35
35
  import { LottieAnimation } from '../LottieAnimation';
36
36
  import { CardAnimation } from '../shared/CardAnimation';
37
37
 
38
- function BusinessControllerPropsAreEqual (prevProps: any, nextProps: any) {
38
+ function BusinessControllerPropsAreEqual(prevProps: any, nextProps: any) {
39
39
  return JSON.stringify(prevProps.business) === JSON.stringify(nextProps.business) &&
40
- prevProps.isBusinessOpen === nextProps.isBusinessOpen
40
+ prevProps.isBusinessOpen === nextProps.isBusinessOpen
41
41
  }
42
42
 
43
43
  export const BusinessControllerUI = React.memo((props: BusinessControllerParams) => {
@@ -232,7 +232,7 @@ export const BusinessControllerUI = React.memo((props: BusinessControllerParams)
232
232
  </View>
233
233
  )}
234
234
  {!hideBusinessOffer && (
235
- getBusinessOffer((business?.offers)) &&
235
+ !!getBusinessOffer((business?.offers)) &&
236
236
  <OfferBox
237
237
  isClosed={!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1')}
238
238
  isRibbon={business?.ribbon?.enabled && !!business?.ribbon?.text}
@@ -244,7 +244,7 @@ export const BusinessControllerUI = React.memo((props: BusinessControllerParams)
244
244
  numberOfLines={2}
245
245
  ellipsizeMode='tail'
246
246
  lineHeight={13}
247
- >{getBusinessOffer((business?.offers)) || parsePrice(0)}</OText>
247
+ >{t('DISCOUNT', 'Discount')}{' '}{getBusinessOffer((business?.offers))}</OText>
248
248
  </OfferBox>
249
249
  )}
250
250
  <BusinessState isRibbon={business?.ribbon?.enabled && !!business?.ribbon?.text}>
@@ -309,7 +309,7 @@ export const BusinessControllerUI = React.memo((props: BusinessControllerParams)
309
309
  </ReviewAndFavorite>
310
310
  )}
311
311
  </View>
312
- <OText size={textSize} style={{ lineHeight: 15, marginBottom: 3 }} numberOfLines={2}>
312
+ <OText size={textSize} style={{ lineHeight: 15, marginBottom: 3, fontFamily: undefined }} numberOfLines={1}>
313
313
  {business?.address}
314
314
  </OText>
315
315
  <Metadata>
@@ -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 {
@@ -57,6 +57,9 @@ export const BusinessItemAccordion = (props: any) => {
57
57
  return acc = acc
58
58
  }, cart?.subtotal)
59
59
 
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
62
+
60
63
  useEffect(() => {
61
64
  if (isActive && !isFromUpselling) {
62
65
  if (cart?.uuid !== viewedCart?.uuid) {
@@ -66,6 +69,11 @@ export const BusinessItemAccordion = (props: any) => {
66
69
  }
67
70
  }, [isActive, viewedCart])
68
71
 
72
+ const handleGoToStore = () => {
73
+ Vibration.vibrate(100)
74
+ props.onNavigationRedirect('Business', { store: cart?.business?.slug })
75
+ }
76
+
69
77
  return (
70
78
  <BIContainer isClosed={isClosed} isMultiCheckout={isMultiCheckout} checkoutVisible={!isActive && !isClosed && !!isProducts && !checkoutButtonDisabled}>
71
79
  <BIHeader
@@ -79,7 +87,7 @@ export const BusinessItemAccordion = (props: any) => {
79
87
  <View style={{ flexDirection: 'row' }}>
80
88
  {props.onNavigationRedirect && !isClosed && !isGiftCart && (
81
89
  <>
82
- <TouchableOpacity onPress={() => props.onNavigationRedirect('Business', { store: cart?.business?.slug })}>
90
+ <TouchableOpacity onPress={() => handleGoToStore()}>
83
91
  <OText color={theme.colors.primary} size={12} lineHeight={18} style={{ textDecorationLine: 'underline' }}>{t('GO_TO_STORE', 'Go to store')}</OText>
84
92
  </TouchableOpacity>
85
93
  </>
@@ -153,11 +161,11 @@ export const BusinessItemAccordion = (props: any) => {
153
161
  {cart?.valid_products && (
154
162
  <OButton
155
163
  onClick={handleClickCheckout}
156
- textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
164
+ textStyle={{ color: textStyles, textAlign: 'center', flex: 1 }}
157
165
  style={{ width: 180, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
158
166
  text={t('CHECKOUT', 'Checkout')}
159
- bgColor={(subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
160
- borderColor={theme.colors.primary}
167
+ bgColor={bgStyle}
168
+ borderColor={bgStyle}
161
169
  isDisabled={checkoutButtonDisabled}
162
170
  />
163
171
  )}
@@ -243,7 +243,7 @@ export const BusinessSearchFooter = (props: any) => {
243
243
  onClick={() => handleChangePriceRange(price?.level)}
244
244
  text={`${price.content} ${(filters?.price_level === price?.level) ? ' X' : ''}`}
245
245
  style={styles.priceItem}
246
- textStyle={{ fontSize: 10, color: (filters?.price_level === price?.level) ? theme.colors.backgroundLight : theme.colors.textNormal }}
246
+ textStyle={{ fontSize: 10, color: (filters?.price_level === price?.level) ? theme.colors.white : theme.colors.textNormal }}
247
247
  />
248
248
  ))}
249
249
  </View>
@@ -284,7 +284,7 @@ export const BusinessSearchFooter = (props: any) => {
284
284
  onClick={() => handleChangeActiveBusinessType(type)}
285
285
  text={`${t(`BUSINESS_TYPE_${type.name.replace(/\s/g, '_').toUpperCase()}`, type.name)} ${filters?.business_types?.includes(type?.id) ? 'X' : ''}`}
286
286
  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 }}
287
+ 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
288
  />
289
289
  ))}
290
290
  </View>
@@ -296,7 +296,6 @@ export const BusinessSearchFooter = (props: any) => {
296
296
  <OButton
297
297
  text={t('APPLY', 'Apply')}
298
298
  parentStyle={styles.applyButton}
299
- textStyle={{ color: '#fff' }}
300
299
  onClick={() => handleApplyFilters()}
301
300
  />
302
301
  </View>
@@ -47,13 +47,11 @@ export const BusinessSearchHeader = (props: any) => {
47
47
  borderWidth: 0,
48
48
  width: 26,
49
49
  height: 26,
50
- backgroundColor: '#FFF',
51
- borderColor: '#FFF',
52
- shadowColor: '#FFF',
53
50
  paddingLeft: 0,
54
51
  paddingRight: 0,
55
52
  marginTop: 50,
56
53
  }}
54
+ useArrow
57
55
  onClick={() => props.navigation.goBack()}
58
56
  icon={AntDesignIcon}
59
57
  iconProps={{
@@ -230,7 +230,7 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
230
230
  </BusinessInfoItem>
231
231
  <OButton
232
232
  onClick={() => onBusinessClick(business)}
233
- textStyle={{ color: theme.colors.primary, fontSize: 10 }}
233
+ textStyle={{ fontSize: 10 }}
234
234
  text={t('GO_TO_STORE', 'Go to store')}
235
235
  style={{
236
236
  borderRadius: 23,
@@ -238,7 +238,6 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
238
238
  paddingRight: 10,
239
239
  height: 23,
240
240
  shadowOpacity: 0,
241
- backgroundColor: theme.colors.primaryContrast,
242
241
  borderWidth: 0
243
242
  }}
244
243
  />
@@ -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()
@@ -435,22 +451,18 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
435
451
  {selectDate && datesWhitelist[0]?.start !== null && (
436
452
  <CalendarStrip
437
453
  scrollable
438
- style={styles.calendar}
439
- calendarHeaderContainerStyle={styles.calendarHeaderContainer}
440
- calendarHeaderStyle={styles.calendarHeader}
441
- dateNumberStyle={styles.dateNumber}
442
- dateNameStyle={styles.dateName}
443
- iconContainer={{ flex: 0.1 }}
444
- highlightDateNameStyle={styles.highlightDateName}
445
- highlightDateNumberStyle={styles.highlightDateNumber}
446
- dayContainerStyle={{ height: '100%' }}
447
- highlightDateContainerStyle={{ height: '100%' }}
448
454
  calendarHeaderFormat='MMMM, YYYY'
449
455
  iconStyle={{ borderWidth: 1 }}
450
456
  selectedDate={selectDate}
451
457
  datesWhitelist={datesWhitelist}
458
+ highlightDateNameStyle={styles.highlightDateName}
459
+ highlightDateNumberStyle={styles.highlightDateNumber}
460
+ minDate={moment()}
461
+ maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
452
462
  disabledDateNameStyle={styles.disabledDateName}
453
463
  disabledDateNumberStyle={styles.disabledDateNumber}
464
+ dateNumberStyle={styles.dateNumber}
465
+ dateNameStyle={styles.dateName}
454
466
  disabledDateOpacity={0.6}
455
467
  onDateSelected={(date) => onSelectDate(date)}
456
468
  leftSelector={<LeftSelector />}
@@ -527,7 +539,6 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
527
539
  )}
528
540
  <OButton
529
541
  text={t('GO_TO_MENU', 'Go to menu')}
530
- textStyle={{ color: 'white' }}
531
542
  style={{ borderRadius: 7.6, marginBottom: 20, marginTop: 30 }}
532
543
  onClick={() => handleClickBusiness()}
533
544
  isDisabled={isAsap || !(dateSelected && timeSelected)}
@@ -553,21 +564,22 @@ export const BusinessPreorder = (props: any) => {
553
564
  currentDate.setMinutes(59)
554
565
 
555
566
  const cateringTypeString = orderState?.options?.type === 7
556
- ? 'catering_delivery'
557
- : orderState?.options?.type === 8
558
- ? 'catering_pickup'
559
- : null
567
+ ? 'catering_delivery'
568
+ : orderState?.options?.type === 8
569
+ ? 'catering_pickup'
570
+ : null
571
+
572
+ const splitCateringValue = (configName: string) =>
573
+ Object.values(props?.business?.configs || {})
574
+ ?.find((config : any) => config?.key === configName)
575
+ ?.value?.split('|')
576
+ ?.find((val : any) => val.includes(cateringTypeString || ''))?.split(',')[1]
560
577
 
561
- const splitCateringValue = (configName : string) =>
562
- Object.values(props?.business?.configs || {})
563
- ?.find(config => config?.key === configName)
564
- ?.value?.split('|')
565
- ?.find(val => val.includes(cateringTypeString || ''))?.split(',')[1]
566
- const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
567
- const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
568
- const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
569
- const preorderMaximumDays = parseInt(splitCateringValue('preorder_maximum_days'))
570
- const preorderMinimumDays = parseInt(splitCateringValue('preorder_minimum_days'))
578
+ const preorderSlotInterval = parseInt(splitCateringValue('preorder_slot_interval'))
579
+ const preorderLeadTime = parseInt(splitCateringValue('preorder_lead_time'))
580
+ const preorderTimeRange = parseInt(splitCateringValue('preorder_time_range'))
581
+ const preorderMaximumDays = parseInt(splitCateringValue('preorder_maximum_days'))
582
+ const preorderMinimumDays = parseInt(splitCateringValue('preorder_minimum_days'))
571
583
 
572
584
  const businessPreorderProps = {
573
585
  ...props,
@@ -1,87 +1,90 @@
1
1
  import React from 'react'
2
- import { useTheme } from 'styled-components/native'
3
2
  import { StyleSheet } from 'react-native'
4
- import { SubCategoriesContainer, ContainerButton } from './styles'
5
- import { OButton } from '../../shared'
6
3
  import { useLanguage } from 'ordering-components/native'
4
+ import FIcon from 'react-native-vector-icons/Feather'
5
+ import { SubCategoriesContainer, ContainerButton } from './styles'
6
+ import { OButton, OText } from '../../shared'
7
7
 
8
8
  function SubcategoriesComponentPropsAreEqual(prev: any, next: any) {
9
- return prev.subcategoriesSelected === next.subcategoriesSelected &&
10
- prev.category === next.category
9
+ return prev.subcategoriesSelected === next.subcategoriesSelected &&
10
+ prev.category === next.category
11
11
  }
12
12
 
13
13
  interface SubcategoriesComponentParams {
14
- subcategoriesSelected?: any,
15
- category?: any,
16
- onClickSubcategory: any
14
+ subcategoriesSelected?: any,
15
+ category?: any,
16
+ onClickSubcategory: any
17
17
  }
18
18
 
19
- const SubcategoriesComponent = (props : SubcategoriesComponentParams) => {
20
- const {
21
- subcategoriesSelected,
22
- category,
23
- onClickSubcategory
24
- } = props
19
+ const SubcategoriesComponent = (props: SubcategoriesComponentParams) => {
20
+ const {
21
+ subcategoriesSelected,
22
+ category,
23
+ onClickSubcategory
24
+ } = props
25
25
 
26
- const theme = useTheme()
27
- const [, t] = useLanguage()
28
- const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
26
+ const [, t] = useLanguage()
27
+ const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
29
28
 
30
- const bpStyles = StyleSheet.create({
31
- catWrap: { flexDirection: 'row', alignItems: 'center', marginBottom: 19 },
32
- catIcon: {
33
- borderRadius: 7.6,
34
- shadowColor: '#000000',
35
- shadowOpacity: 0.1,
36
- shadowOffset: { width: 0, height: 0 },
37
- shadowRadius: 1,
38
- marginEnd: 13,
39
- },
40
- categoryButtonStyle: {
41
- borderWidth: 0,
42
- marginLeft: 5,
43
- marginRight: 5,
44
- marginBottom: 10,
45
- height: 35,
46
- paddingLeft: 3,
47
- paddingRight: 3,
48
- }
49
- });
29
+ const bpStyles = StyleSheet.create({
30
+ categoryButtonStyle: {
31
+ borderWidth: 0,
32
+ marginRight: 5,
33
+ borderRadius: 8,
34
+ marginBottom: 5,
35
+ height: 35,
36
+ padding: 0,
37
+ paddingLeft: 3,
38
+ paddingRight: 3,
39
+ }
40
+ });
50
41
 
51
42
 
52
- return (
53
- <SubCategoriesContainer>
54
- <ContainerButton
55
- isSelected={allsubcategorySelected}
56
- >
57
- <OButton
58
- onClick={() => onClickSubcategory(null, category)}
59
- bgColor={allsubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
60
- text={`${t('ALL', 'All')} ${allsubcategorySelected ? 'X' : ''}`}
61
- style={bpStyles.categoryButtonStyle}
62
- textStyle={{ color: allsubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
63
- />
64
- </ContainerButton>
65
- {category?.subcategories?.map((subcategory: any) => {
66
- const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
67
- return (
68
- <ContainerButton
69
- key={subcategory?.id}
70
- isSelected={isSubcategorySelected}
71
- >
72
- <OButton
73
- onClick={() => onClickSubcategory(subcategory, category)}
74
- bgColor={isSubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
75
- text={`${subcategory?.name} ${isSubcategorySelected ? 'X' : ''}`}
76
- style={bpStyles.categoryButtonStyle}
77
- textStyle={{ color: isSubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
78
- />
79
- </ContainerButton>
80
- )
81
- }
82
- )}
83
- </SubCategoriesContainer>
84
- )
43
+ return (
44
+ <SubCategoriesContainer>
45
+ <ContainerButton
46
+ isSelected={allsubcategorySelected}
47
+ >
48
+ <OButton
49
+ onClick={() => onClickSubcategory(null, category)}
50
+ text={
51
+ allsubcategorySelected
52
+ ? <OText color='#FFF'>
53
+ {t('ALL', 'All')}{' '}
54
+ <FIcon name='x-circle' size={16} />
55
+ </OText>
56
+ : t('ALL', 'All')
57
+ }
58
+ style={bpStyles.categoryButtonStyle}
59
+ textStyle={{ fontSize: 12 }}
60
+ />
61
+ </ContainerButton>
62
+ {category?.subcategories?.map((subcategory: any) => {
63
+ const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
64
+ return (
65
+ <ContainerButton
66
+ key={subcategory?.id}
67
+ isSelected={isSubcategorySelected}
68
+ >
69
+ <OButton
70
+ onClick={() => onClickSubcategory(subcategory, category)}
71
+ text={
72
+ isSubcategorySelected
73
+ ? <OText color='#FFF'>
74
+ {subcategory?.name}{' '}
75
+ <FIcon name='x-circle' size={16} />
76
+ </OText>
77
+ : subcategory?.name
78
+ }
79
+ style={bpStyles.categoryButtonStyle}
80
+ textStyle={{ fontSize: 12 }}
81
+ />
82
+ </ContainerButton>
83
+ )
84
+ }
85
+ )}
86
+ </SubCategoriesContainer>
87
+ )
85
88
  }
86
89
 
87
90
  export const SubcategoriesComponentMemoized = React.memo(SubcategoriesComponent, SubcategoriesComponentPropsAreEqual)
@@ -65,11 +65,10 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
65
65
  return
66
66
  }
67
67
  const categoryFounded = subcategoriesSelected.find((_subcategory: any) => subCategory?.id === _subcategory?.id)
68
- if (categoryFounded) {
69
- setSubcategoriesSelected?.(subcategoriesSelected.filter((_subcategory: any) => subCategory?.id !== _subcategory?.id))
70
- } else {
71
- setSubcategoriesSelected?.([...subcategoriesSelected, subCategory])
72
- }
68
+ setSubcategoriesSelected?.(categoryFounded
69
+ ? subcategoriesSelected.filter((_subcategory: any) => subCategory?.id !== _subcategory?.id)
70
+ : [...subcategoriesSelected, subCategory]
71
+ )
73
72
  }
74
73
 
75
74
  return (
@@ -214,11 +213,11 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
214
213
  text={t('VIEW_MORE', 'View more')}
215
214
  parentStyle={{ padding: 0 }}
216
215
  onClick={() => setOpenDescription(category)}
217
- bgColor='transparent'
216
+ bgColor={theme.colors.white}
217
+ borderColor={theme.colors.primary}
218
218
  textStyle={{
219
219
  fontSize: 12,
220
220
  borderBottomWidth: 1,
221
- borderBottomColor: theme.colors.primary,
222
221
  color: theme.colors.primary
223
222
  }}
224
223
  />
@@ -18,15 +18,12 @@ export const RibbonBox = styled.View`
18
18
  background-color: ${(props: any) => props.theme.colors.primary};
19
19
  padding: 2px 8px;
20
20
  max-width: 180px;
21
-
22
21
  ${(props: any) => props.bgColor && css`
23
22
  background-color: ${props.bgColor};
24
23
  `}
25
-
26
24
  ${(props: any) => props.isRoundRect && css`
27
25
  border-radius: 7.6px;
28
26
  `}
29
-
30
27
  ${(props: any) => props.isCapsule && css`
31
28
  border-radius: 50px;
32
29
  `}
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
- import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView, Keyboard, KeyboardEvent, BackHandler, ScrollView } from 'react-native'
2
+ import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView, Keyboard, KeyboardEvent, BackHandler, ScrollView, Vibration } from 'react-native'
3
3
  import { IOScrollView } from 'react-native-intersection-observer'
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
5
5
  import { useTheme } from 'styled-components/native';
@@ -225,8 +225,9 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
225
225
  cartUuid: cart?.uuid,
226
226
  businessLogo: cart?.business?.logo,
227
227
  businessName: cart?.business?.name,
228
- cartTotal: cart?.total
229
- }, true)
228
+ cartTotal: cart?.total,
229
+ fromProductsList: true
230
+ })
230
231
  } else {
231
232
  const groupKeys: any = {}
232
233
  cartsAvailable.forEach((_cart: any) => {
@@ -242,12 +243,12 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
242
243
  props.onNavigationRedirect('CheckoutNavigator', {
243
244
  screen: 'MultiCheckout',
244
245
  checkCarts: true
245
- }, true)
246
+ })
246
247
  } else {
247
248
  props.onNavigationRedirect('CheckoutNavigator', {
248
249
  screen: 'MultiCheckout',
249
250
  cartUuid: cartsAvailable[0]?.group?.uuid
250
- }, true)
251
+ })
251
252
  }
252
253
  }
253
254
  }
@@ -381,6 +382,14 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
381
382
  setViewedCategory(_viewedCategory)
382
383
  events.emit('product_list_viewed', _viewedCategory)
383
384
  }
385
+ } else {
386
+ if (business.categories) {
387
+ const categoryAll: any = {}
388
+ categoryAll.business_id = business.id
389
+ categoryAll.id = null
390
+ categoryAll.name = 'All'
391
+ events.emit('product_list_viewed', categoryAll)
392
+ }
384
393
  }
385
394
  }, [business?.lazy_load_products_recommended, selectedCategoryId, categorySelected?.id, viewedCategory])
386
395
 
@@ -679,7 +688,10 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
679
688
  btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
680
689
  btnRightValue={parsePrice(currentCart?.total)}
681
690
  disabled={subtotalWithTaxes < currentCart?.minimum || openUpselling}
682
- handleClick={() => setOpenUpselling(true)}
691
+ handleClick={() => {
692
+ Vibration.vibrate(100)
693
+ setOpenUpselling(true)
694
+ }}
683
695
  />
684
696
  </View>
685
697
  )}