ordering-ui-react-native 0.16.47 → 0.16.48-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 (204) hide show
  1. package/package.json +6 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  6. package/src/components/BusinessInformation/index.tsx +33 -4
  7. package/src/components/BusinessInformation/styles.tsx +2 -2
  8. package/src/components/BusinessProductsList/index.tsx +10 -10
  9. package/src/components/BusinessesListing/index.tsx +1 -1
  10. package/src/components/Checkout/index.tsx +2 -1
  11. package/src/components/LanguageSelector/index.tsx +21 -16
  12. package/src/components/Messages/index.tsx +2 -2
  13. package/src/components/NotificationSetting/index.tsx +85 -0
  14. package/src/components/OrdersOption/index.tsx +54 -56
  15. package/src/components/PaymentOptions/index.tsx +298 -345
  16. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  17. package/src/components/ReviewDriver/index.tsx +1 -1
  18. package/src/components/ReviewOrder/index.tsx +2 -2
  19. package/src/components/ReviewProducts/index.tsx +11 -0
  20. package/src/components/SingleProductReview/index.tsx +8 -5
  21. package/src/components/StripeElementsForm/index.tsx +25 -16
  22. package/src/components/VerifyPhone/styles.tsx +1 -2
  23. package/src/components/shared/OBottomPopup.tsx +6 -2
  24. package/src/components/shared/OToast.tsx +4 -4
  25. package/src/index.tsx +2 -0
  26. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  27. package/src/utils/index.tsx +2 -1
  28. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +259 -238
  29. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  30. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  31. package/themes/business/src/components/Chat/index.tsx +40 -32
  32. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  33. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  34. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  35. package/themes/business/src/components/MapView/index.tsx +12 -1
  36. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  37. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  38. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +33 -23
  39. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  40. package/themes/business/src/components/OrdersOption/index.tsx +76 -77
  41. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  42. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  43. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  44. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  45. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  46. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  47. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  48. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  49. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  50. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  51. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  52. package/themes/business/src/components/PreviousOrders/index.tsx +331 -243
  53. package/themes/business/src/components/PreviousOrders/styles.tsx +30 -2
  54. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  55. package/themes/business/src/components/ReviewCustomer/index.tsx +39 -15
  56. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  57. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  58. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  59. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  60. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  61. package/themes/business/src/components/shared/OLink.tsx +24 -12
  62. package/themes/business/src/components/shared/OText.tsx +3 -2
  63. package/themes/business/src/types/index.tsx +25 -11
  64. package/themes/business/src/utils/index.tsx +10 -0
  65. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  66. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  67. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  68. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  69. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  70. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  71. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  72. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  73. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  74. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  75. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  76. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  77. package/themes/kiosk/src/types/index.d.ts +2 -0
  78. package/themes/original/index.tsx +6 -0
  79. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  80. package/themes/original/src/components/AddressForm/index.tsx +157 -140
  81. package/themes/original/src/components/AddressList/index.tsx +1 -1
  82. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  83. package/themes/original/src/components/BusinessBasicInformation/index.tsx +218 -147
  84. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +2 -2
  85. package/themes/original/src/components/BusinessController/index.tsx +231 -114
  86. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  87. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  88. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  89. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  90. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  91. package/themes/original/src/components/BusinessListingSearch/index.tsx +109 -139
  92. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  93. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  94. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  95. package/themes/original/src/components/BusinessProductsList/index.tsx +59 -60
  96. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  97. package/themes/original/src/components/BusinessProductsListing/index.tsx +175 -80
  98. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -11
  99. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  100. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +35 -23
  101. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +3 -2
  102. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +275 -120
  103. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -10
  104. package/themes/original/src/components/BusinessesListing/index.tsx +80 -25
  105. package/themes/original/src/components/Cart/index.tsx +82 -15
  106. package/themes/original/src/components/Cart/styles.tsx +4 -0
  107. package/themes/original/src/components/CartContent/index.tsx +22 -16
  108. package/themes/original/src/components/Checkout/index.tsx +113 -117
  109. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  110. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  111. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  112. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  113. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  114. package/themes/original/src/components/FavoriteList/index.tsx +69 -45
  115. package/themes/original/src/components/FloatingButton/index.tsx +13 -11
  116. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  117. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  118. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  119. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  120. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  121. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  122. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  123. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  124. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  125. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  126. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  127. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  128. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  129. package/themes/original/src/components/Messages/index.tsx +35 -20
  130. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  131. package/themes/original/src/components/MultiCart/index.tsx +63 -0
  132. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  133. package/themes/original/src/components/MultiCheckout/index.tsx +10 -2
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +34 -16
  135. package/themes/original/src/components/MyOrders/index.tsx +88 -22
  136. package/themes/original/src/components/NavBar/index.tsx +11 -5
  137. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  138. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  139. package/themes/original/src/components/Notifications/index.tsx +148 -0
  140. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  141. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  142. package/themes/original/src/components/OrderDetails/index.tsx +200 -39
  143. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  144. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  145. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  146. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  147. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  148. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  149. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  150. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  151. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +94 -98
  152. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  153. package/themes/original/src/components/OrdersOption/index.tsx +102 -56
  154. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  155. package/themes/original/src/components/PaymentOptions/index.tsx +1 -2
  156. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  157. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  158. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  159. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  160. package/themes/original/src/components/ProductForm/index.tsx +639 -664
  161. package/themes/original/src/components/ProductForm/styles.tsx +10 -11
  162. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  163. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  165. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  166. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  167. package/themes/original/src/components/ProfessionalProfile/index.tsx +19 -8
  168. package/themes/original/src/components/Promotions/index.tsx +232 -219
  169. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  170. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  171. package/themes/original/src/components/ReviewOrder/index.tsx +120 -108
  172. package/themes/original/src/components/ReviewOrder/styles.tsx +5 -7
  173. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  174. package/themes/original/src/components/ReviewTrigger/index.tsx +136 -0
  175. package/themes/original/src/components/ReviewTrigger/styles.tsx +41 -0
  176. package/themes/original/src/components/ServiceForm/index.tsx +332 -264
  177. package/themes/original/src/components/SignupForm/index.tsx +160 -113
  178. package/themes/original/src/components/SingleOrderCard/index.tsx +266 -183
  179. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  180. package/themes/original/src/components/SingleProductCard/index.tsx +198 -112
  181. package/themes/original/src/components/SingleProductCard/styles.tsx +3 -10
  182. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  183. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  184. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  185. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  186. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  187. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  188. package/themes/original/src/components/UserProfile/index.tsx +56 -31
  189. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  190. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  191. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  192. package/themes/original/src/components/Wallets/index.tsx +176 -164
  193. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  194. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  195. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  196. package/themes/original/src/components/shared/OBottomPopup.tsx +48 -15
  197. package/themes/original/src/components/shared/OButton.tsx +10 -3
  198. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  199. package/themes/original/src/components/shared/OInput.tsx +10 -1
  200. package/themes/original/src/layouts/Container.tsx +13 -9
  201. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  202. package/themes/original/src/types/index.tsx +83 -28
  203. package/themes/original/src/utils/index.tsx +103 -58
  204. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,32 +1,38 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
2
3
  import {
3
4
  BusinessController as BusinessSingleCard,
4
5
  useUtils,
5
6
  useOrder,
6
7
  useLanguage,
7
- useConfig
8
+ useConfig,
9
+ useToast,
10
+ useSession,
11
+ ToastType
8
12
  } from 'ordering-components/native';
9
13
  import { OIcon, OText } from '../shared';
10
- import { StyleSheet, TouchableOpacity, View } from 'react-native';
14
+ import { Dimensions, StyleSheet, View } from 'react-native';
15
+ import { InView } from 'react-native-intersection-observer'
11
16
  import { BusinessControllerParams } from '../../types';
12
17
  import { convertHoursToMinutes, shape } from '../../utils';
18
+
13
19
  import {
14
- Card,
15
20
  BusinessHero,
16
21
  BusinessContent,
17
- BusinessCategory,
18
22
  BusinessInfo,
19
23
  Metadata,
20
24
  BusinessState,
21
25
  BusinessLogo,
22
26
  Reviews,
23
27
  RibbonBox,
24
- ReviewAndFavorite
28
+ ReviewAndFavorite,
29
+ OfferBox
25
30
  } from './styles';
26
31
  import { useTheme } from 'styled-components/native';
27
32
  import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome5';
28
- import IconAntDesign from 'react-native-vector-icons/AntDesign'
29
33
  import FastImage from 'react-native-fast-image'
34
+ import { LottieAnimation } from '../LottieAnimation';
35
+ import { CardAnimation } from '../shared/CardAnimation';
30
36
 
31
37
  export const BusinessControllerUI = (props: BusinessControllerParams) => {
32
38
  const {
@@ -35,6 +41,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
35
41
  navigation,
36
42
  isBusinessOpen,
37
43
  style,
44
+ isCustomLayout,
38
45
  businessHeader,
39
46
  businessFeatured,
40
47
  businessLogo,
@@ -43,14 +50,32 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
43
50
  businessDeliveryTime,
44
51
  businessPickupTime,
45
52
  businessDistance,
46
- handleFavoriteBusiness
53
+ handleFavoriteBusiness,
54
+ enableIntersection,
55
+ getBusinessOffer
47
56
  } = props;
57
+
48
58
  const [{ parsePrice, parseDistance, parseNumber, optimizeImage }] = useUtils();
59
+ const [, { showToast }] = useToast()
49
60
  const [orderState] = useOrder();
61
+ const [{ auth }] = useSession()
50
62
  const [configState] = useConfig();
51
63
  const [, t] = useLanguage();
52
64
  const theme = useTheme()
65
+ const windowHeight = Dimensions.get('window').height
66
+ const [isIntersectionObserver, setIsIntersectionObserver] = useState(!enableIntersection)
67
+
68
+ const textSize = isCustomLayout ? 12 : 10
69
+ const cardHeight = windowHeight * 0.3
70
+
53
71
  const styles = StyleSheet.create({
72
+ container: {
73
+ marginVertical: 20,
74
+ borderRadius: 7.6,
75
+ width: '100%',
76
+ position: 'relative',
77
+ height: cardHeight
78
+ },
54
79
  headerStyle: {
55
80
  borderTopLeftRadius: 7.6,
56
81
  borderTopRightRadius: 7.6,
@@ -100,7 +125,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
100
125
  flexDirection: 'row',
101
126
  alignItems: 'center',
102
127
  justifyContent: 'flex-start',
103
- },
128
+ }
104
129
  });
105
130
 
106
131
  const types = ['food', 'laundry', 'alcohol', 'groceries'];
@@ -119,130 +144,222 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
119
144
  const handleBusinessClick = (selectedBusiness: any) => {
120
145
  if (business?.open) handleClick && handleClick(selectedBusiness)
121
146
  else {
122
- navigation.navigate('BusinessPreorder', { business: selectedBusiness, handleBusinessClick: handleClick })
147
+ if (configState?.configs?.preorder_status_enabled?.value === '1') {
148
+ navigation.navigate('BusinessPreorder', { business: selectedBusiness, handleBusinessClick: handleClick })
149
+ return
150
+ }
151
+ showToast(ToastType.Info, t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment'));
123
152
  }
124
153
  }
125
154
 
126
- const handleChangeFavorite = () => {
127
- handleFavoriteBusiness && handleFavoriteBusiness(!business?.favorite)
128
- }
155
+ const handleChangeFavorite = () => {
156
+ if (auth) {
157
+ handleFavoriteBusiness && handleFavoriteBusiness(!business?.favorite)
158
+ } else {
159
+ navigation && navigation.navigate('Login');
160
+ }
161
+ }
162
+
163
+ const handleChangeInterSection = (inView: boolean) => {
164
+ setIsIntersectionObserver(inView)
165
+ }
129
166
 
130
167
  return (
131
- <Card activeOpacity={1} onPress={() => handleBusinessClick(business)} style={style}>
132
- {business?.ribbon?.enabled && (
133
- <RibbonBox
134
- bgColor={business?.ribbon?.color}
135
- isRoundRect={business?.ribbon?.shape === shape?.rectangleRound}
136
- isCapsule={business?.ribbon?.shape === shape?.capsuleShape}
168
+ <InView style={{ minHeight: 200 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeInterSection(inView)}>
169
+ {isIntersectionObserver ? (
170
+ <CardAnimation
171
+ style={[style, styles.container]}
172
+ onClick={() => handleBusinessClick(business)}
137
173
  >
138
- <OText
139
- size={10}
140
- weight={'400'}
141
- color={theme.colors.white}
142
- numberOfLines={2}
143
- ellipsizeMode='tail'
144
- lineHeight={13}
145
- >
146
- {business?.ribbon?.text}
147
- </OText>
148
- </RibbonBox>
149
- )}
150
- <BusinessHero>
151
- <FastImage
152
- style={{ height: 120 }}
153
- source={{
154
- uri: optimizeImage(businessHeader || business?.header, 'h_500,c_limit'),
155
- priority: FastImage.priority.normal,
156
- }}
157
- resizeMode={FastImage.resizeMode.cover}
158
- />
159
- {(businessFeatured ?? business?.featured) && (
160
- <View style={styles.featured}>
161
- <FontAwesomeIcon name="crown" size={26} color="gold" />
162
- </View>
163
- )}
164
- <BusinessState>
165
- {!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1') && (
166
- <View style={styles.businessStateView}>
174
+ {business?.ribbon?.enabled && (
175
+ <RibbonBox
176
+ bgColor={business?.ribbon?.color}
177
+ isRoundRect={business?.ribbon?.shape === shape?.rectangleRound}
178
+ isCapsule={business?.ribbon?.shape === shape?.capsuleShape}
179
+ >
167
180
  <OText
168
- color={theme.colors.textThird}
169
181
  size={10}
170
- style={styles.businessStateText}>
171
- {t('PREORDER', 'PREORDER')}
182
+ weight={'400'}
183
+ color={theme.colors.white}
184
+ numberOfLines={2}
185
+ ellipsizeMode='tail'
186
+ lineHeight={13}
187
+ >
188
+ {business?.ribbon?.text}
172
189
  </OText>
173
- </View>
190
+ </RibbonBox>
174
191
  )}
175
- </BusinessState>
176
- </BusinessHero>
177
- <BusinessContent>
178
- <BusinessInfo>
179
- <BusinessLogo style={styles.businessLogo}>
192
+ <BusinessHero>
180
193
  <FastImage
181
- style={{ width: 56, height: 56 }}
182
- source={{
183
- uri: optimizeImage(businessLogo || business?.logo, 'h_150,c_limit'),
194
+ style={{ height: isCustomLayout ? cardHeight * 0.66 : 120 }}
195
+ source={(businessHeader || business?.header) ? {
196
+ uri: optimizeImage(businessHeader || business?.header, 'h_500,c_limit'),
184
197
  priority: FastImage.priority.normal,
185
- }}
198
+ } : theme.images.dummies.businessHeader}
186
199
  resizeMode={FastImage.resizeMode.cover}
187
200
  />
188
- </BusinessLogo>
189
- <ReviewAndFavorite>
190
- {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
191
- <Reviews>
192
- <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
193
- <OText size={10} style={{ lineHeight: 15 }}>
194
- {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
195
- </OText>
196
- </Reviews>
201
+ {(businessFeatured ?? business?.featured) && (
202
+ <View style={styles.featured}>
203
+ <FontAwesomeIcon name="crown" size={26} color="gold" />
204
+ </View>
197
205
  )}
198
- <TouchableOpacity
199
- onPress={handleChangeFavorite}
200
- >
201
- <IconAntDesign
202
- name={business?.favorite ? 'heart' : 'hearto'}
203
- color={theme.colors.danger5}
204
- size={18}
205
- />
206
- </TouchableOpacity>
207
- </ReviewAndFavorite>
208
- </BusinessInfo>
209
- <OText
210
- size={12}
211
- style={{ lineHeight: 18, marginBottom: 6 }}
212
- weight={'500'}>
213
- {business?.name}
214
- </OText>
215
- <OText size={10} style={{ lineHeight: 15, marginBottom: 3 }}>
216
- {business?.address}
217
- </OText>
218
- {/* <BusinessCategory>
219
- <OText>{getBusinessType()}</OText>
220
- </BusinessCategory> */}
221
- <Metadata>
222
- {!isBusinessOpen ? (
223
- <View style={styles.closed}>
224
- <OText size={10} color={theme.colors.red}>
225
- {t('CLOSED', 'Closed')}
206
+ {(!isCustomLayout) && (
207
+ getBusinessOffer((business?.offers)) &&
208
+ <OfferBox>
209
+ <OText
210
+ size={10}
211
+ weight={'400'}
212
+ numberOfLines={2}
213
+ ellipsizeMode='tail'
214
+ lineHeight={13}
215
+ >{getBusinessOffer((business?.offers)) || parsePrice(0)}</OText>
216
+ </OfferBox>
217
+ )}
218
+ <BusinessState>
219
+ {!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1') && (
220
+ <View style={styles.businessStateView}>
221
+ <OText
222
+ color={theme.colors.textThird}
223
+ size={10}
224
+ style={styles.businessStateText}>
225
+ {t('PREORDER', 'PREORDER')}
226
+ </OText>
227
+ </View>
228
+ )}
229
+ </BusinessState>
230
+ </BusinessHero>
231
+ <BusinessContent>
232
+ <BusinessInfo style={isCustomLayout && { position: 'absolute', bottom: 85, left: 15 }}>
233
+ <BusinessLogo style={styles.businessLogo}>
234
+ <FastImage
235
+ style={{ width: 56, height: 56 }}
236
+ source={(businessLogo || business?.logo) ? {
237
+ uri: optimizeImage(businessLogo || business?.logo, 'h_150,c_limit'),
238
+ priority: FastImage.priority.normal,
239
+ } : theme.images.dummies.businessLogo}
240
+ resizeMode={FastImage.resizeMode.cover}
241
+ />
242
+ </BusinessLogo>
243
+ {!isCustomLayout && (
244
+ <ReviewAndFavorite>
245
+ {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
246
+ <Reviews>
247
+ <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
248
+ <OText size={10} style={{ lineHeight: 15 }}>
249
+ {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
250
+ </OText>
251
+ </Reviews>
252
+ )}
253
+ <LottieAnimation
254
+ type='favorite'
255
+ onClick={handleChangeFavorite}
256
+ initialValue={business?.favorite ? 0.75 : 0}
257
+ toValue={business?.favorite ? 0 : 0.75}
258
+ disableAnimation={!auth}
259
+ iconProps={{ color: theme.colors.danger5, size: 18 }}
260
+ isActive={business?.favorite}
261
+ />
262
+ </ReviewAndFavorite>
263
+ )}
264
+ </BusinessInfo>
265
+ <View style={isCustomLayout && { width: '100%', flexDirection: 'row', justifyContent: 'space-between', marginTop: 5 }}>
266
+ <OText
267
+ size={textSize + 2}
268
+ style={{ lineHeight: 18, marginBottom: 6 }}
269
+ weight={'500'}>
270
+ {business?.name}
226
271
  </OText>
272
+ {isCustomLayout && (
273
+ <ReviewAndFavorite>
274
+ {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
275
+ <Reviews>
276
+ <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
277
+ <OText size={10} style={{ lineHeight: 15 }}>
278
+ {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
279
+ </OText>
280
+ </Reviews>
281
+ )}
282
+ <LottieAnimation
283
+ type='favorite'
284
+ onClick={handleChangeFavorite}
285
+ initialValue={business?.favorite ? 0.75 : 0}
286
+ toValue={business?.favorite ? 0 : 0.75}
287
+ disableAnimation={!auth}
288
+ iconProps={{ color: theme.colors.danger5, size: 18 }}
289
+ isActive={business?.favorite}
290
+ />
291
+ </ReviewAndFavorite>
292
+ )}
227
293
  </View>
228
- ) : (
229
- <View style={styles.bullet}>
230
- {orderState?.options?.type === 1 && (
231
- <OText size={10} color={theme.colors.textSecondary}>
232
- {`${t('DELIVERY_FEE', 'Delivery fee')} ${parsePrice(businessDeliveryPrice ?? business?.delivery_price) + ' \u2022 '}`}
233
- </OText>
294
+ <OText size={textSize} style={{ lineHeight: 15, marginBottom: 3 }} numberOfLines={isCustomLayout ? 1 : 2}>
295
+ {business?.address}
296
+ </OText>
297
+ <Metadata>
298
+ {!isBusinessOpen ? (
299
+ <View style={styles.closed}>
300
+ <OText size={10} color={theme.colors.red}>
301
+ {t('CLOSED', 'Closed')}
302
+ </OText>
303
+ </View>
304
+ ) : (
305
+ <View style={styles.bullet}>
306
+ {orderState?.options?.type === 1 && (
307
+ <OText size={textSize} color={theme.colors.textSecondary}>
308
+ {`${t('DELIVERY_FEE', 'Delivery fee')} ${parsePrice(businessDeliveryPrice ?? business?.delivery_price) + ' \u2022 '}`}
309
+ </OText>
310
+ )}
311
+ <OText size={textSize} color={theme.colors.textSecondary}>{`${convertHoursToMinutes(
312
+ orderState?.options?.type === 1
313
+ ? (businessDeliveryTime ?? business?.delivery_time)
314
+ : (businessPickupTime ?? business?.pickup_time),
315
+ )} \u2022 `}</OText>
316
+ <OText size={textSize} color={theme.colors.textSecondary}>{parseDistance(businessDistance ?? business?.distance)}</OText>
317
+ </View>
234
318
  )}
235
- <OText size={10} color={theme.colors.textSecondary}>{`${convertHoursToMinutes(
236
- orderState?.options?.type === 1
237
- ? (businessDeliveryTime ?? business?.delivery_time)
238
- : (businessPickupTime ?? business?.pickup_time),
239
- )} \u2022 `}</OText>
240
- <OText size={10} color={theme.colors.textSecondary}>{parseDistance(businessDistance ?? business?.distance)}</OText>
319
+ </Metadata>
320
+ </BusinessContent>
321
+ </CardAnimation>
322
+ ) : (
323
+ <Placeholder
324
+ Animation={Fade}
325
+ style={{ marginBottom: 20 }}>
326
+ <View style={{ width: '100%' }}>
327
+ <PlaceholderLine
328
+ height={200}
329
+ style={{ marginBottom: 20, borderRadius: 25 }}
330
+ />
331
+ <View style={{ paddingHorizontal: 10 }}>
332
+ <View
333
+ style={{
334
+ flexDirection: 'row',
335
+ justifyContent: 'space-between',
336
+ }}>
337
+ <PlaceholderLine
338
+ height={25}
339
+ width={40}
340
+ style={{ marginBottom: 10 }}
341
+ />
342
+ <PlaceholderLine
343
+ height={25}
344
+ width={20}
345
+ style={{ marginBottom: 10 }}
346
+ />
347
+ </View>
348
+ <PlaceholderLine
349
+ height={20}
350
+ width={30}
351
+ style={{ marginBottom: 10 }}
352
+ />
353
+ <PlaceholderLine
354
+ height={20}
355
+ width={80}
356
+ style={{ marginBottom: 10 }}
357
+ />
241
358
  </View>
242
- )}
243
- </Metadata>
244
- </BusinessContent>
245
- </Card>
359
+ </View>
360
+ </Placeholder>
361
+ )}
362
+ </InView>
246
363
  );
247
364
  };
248
365
 
@@ -1,12 +1,5 @@
1
1
  import styled, { css } from 'styled-components/native';
2
2
 
3
- export const Card = styled.TouchableOpacity`
4
- margin-vertical: 20px;
5
- border-radius: 7.6px;
6
- width: 100%;
7
- position: relative;
8
- `
9
-
10
3
  export const BusinessHero = styled.View`
11
4
  position: relative;
12
5
  border-top-right-radius: 7.6px;
@@ -16,7 +9,7 @@ export const BusinessHero = styled.View`
16
9
 
17
10
  export const BusinessContent = styled.View`
18
11
  padding-horizontal: 18px;
19
- padding-bottom: 18px;
12
+ padding-bottom: 10px;
20
13
  border-bottom-left-radius: 7.6px;
21
14
  border-bottom-right-radius: 7.6px;
22
15
  border-width: 1px;
@@ -46,7 +39,7 @@ export const BusinessState = styled.View`
46
39
  `
47
40
 
48
41
  export const BusinessLogo = styled.View`
49
-
42
+
50
43
  `
51
44
 
52
45
  export const ReviewAndFavorite = styled.View`
@@ -80,3 +73,15 @@ export const RibbonBox = styled.View`
80
73
  border-radius: 50px;
81
74
  `}
82
75
  `
76
+
77
+ export const OfferBox = styled.View`
78
+ position: absolute;
79
+ z-index: 1;
80
+ top: 20px;
81
+ right: 10px;
82
+ border-radius: 50px;
83
+ color: ${(props: any) => props.theme.colors.textThird};
84
+ background: ${(props: any) => props.theme.colors.inputBorderColor};
85
+ padding: 3px 8px;
86
+ max-width: 180px;
87
+ `
@@ -41,10 +41,16 @@ export const BusinessItemAccordion = (props: any) => {
41
41
  useEffect(() => {
42
42
  const cartsArray = Object.values(orderState?.carts)
43
43
  const cartsLength = cartsArray.filter((cart: any) => cart.products.length > 0).length ?? 0
44
- if ((cartsLength === 1) && !isClosed) {
45
- setActiveState(true)
44
+ if (cartsLength === 1) {
45
+ setActiveState(!isClosed)
46
46
  }
47
- }, [orderState?.carts])
47
+ }, [orderState?.carts, isClosed])
48
+
49
+ const subtotalWithTaxes = cart?.taxes?.reduce((acc: any, item: any) => {
50
+ if (item?.type === 1)
51
+ return acc = acc + item?.summary?.tax
52
+ return acc = acc
53
+ }, cart?.subtotal)
48
54
 
49
55
  return (
50
56
  <BIContainer isClosed={isClosed} isMultiCheckout={isMultiCheckout} checkoutVisible={!isActive && !isClosed && !!isProducts && !checkoutButtonDisabled}>
@@ -102,7 +108,7 @@ export const BusinessItemAccordion = (props: any) => {
102
108
  <OText
103
109
  size={12}
104
110
  lineHeight={18}
105
- color={theme.colors.textSecondary}
111
+ color={theme.colors.primary}
106
112
  style={{ textDecorationLine: 'underline' }}
107
113
  >
108
114
  {t('CHANGE_STORE', 'Change store')}
@@ -149,9 +155,9 @@ export const BusinessItemAccordion = (props: any) => {
149
155
  <OButton
150
156
  onClick={handleClickCheckout}
151
157
  textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
152
- style={{ width: 160, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
158
+ style={{ width: 180, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
153
159
  text={t('CHECKOUT', 'Checkout')}
154
- bgColor={(cart?.subtotal < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
160
+ bgColor={(subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
155
161
  borderColor={theme.colors.primary}
156
162
  isDisabled={checkoutButtonDisabled}
157
163
  />
@@ -0,0 +1,57 @@
1
+ import React from 'react'
2
+ import { View } from 'react-native'
3
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder'
4
+
5
+ export const BusinessControllerSkeletons = ({ paginationProps }: any) => {
6
+ return (
7
+ <>
8
+ {[
9
+ ...Array(
10
+ paginationProps.nextPageItems
11
+ ? paginationProps.nextPageItems
12
+ : 3,
13
+ ).keys(),
14
+ ].map((item, i) => (
15
+ <Placeholder
16
+ Animation={Fade}
17
+ key={i}
18
+ style={{ width: 320, marginRight: 20, marginTop: 20 }}>
19
+ <View style={{ width: 320 }}>
20
+ <PlaceholderLine
21
+ height={155}
22
+ style={{ marginBottom: 20, borderRadius: 25 }}
23
+ />
24
+ <View style={{ paddingHorizontal: 10 }}>
25
+ <View
26
+ style={{
27
+ flexDirection: 'row',
28
+ justifyContent: 'space-between',
29
+ }}>
30
+ <PlaceholderLine
31
+ height={25}
32
+ width={40}
33
+ style={{ marginBottom: 10 }}
34
+ />
35
+ <PlaceholderLine
36
+ height={25}
37
+ width={20}
38
+ style={{ marginBottom: 10 }}
39
+ />
40
+ </View>
41
+ <PlaceholderLine
42
+ height={20}
43
+ width={30}
44
+ style={{ marginBottom: 10 }}
45
+ />
46
+ <PlaceholderLine
47
+ height={20}
48
+ width={80}
49
+ style={{ marginBottom: 0 }}
50
+ />
51
+ </View>
52
+ </View>
53
+ </Placeholder>
54
+ ))}
55
+ </>
56
+ )
57
+ }
@@ -0,0 +1,59 @@
1
+ import { useLanguage, useUtils } from 'ordering-components/native'
2
+ import React from 'react'
3
+ import { View, TouchableOpacity, StyleSheet } from 'react-native'
4
+ import { OText } from '../../shared'
5
+
6
+ import { ProgressContentWrapper, ProgressBar } from './styles'
7
+
8
+ export const MaxSectionItem = (props: any) => {
9
+ const {
10
+ filters,
11
+ handleChangeFilters,
12
+ title,
13
+ options,
14
+ filter
15
+ } = props
16
+
17
+ const [, t] = useLanguage()
18
+ const [{ parsePrice }] = useUtils();
19
+
20
+ const styles = StyleSheet.create({
21
+ maxContainer: {
22
+ flexDirection: 'row',
23
+ justifyContent: 'space-between'
24
+ }
25
+ });
26
+
27
+ const parseValue = (option: number) => {
28
+ return filter === 'max_distance'
29
+ ? `${option / 1000} ${t('KM', 'Km')}`
30
+ : filter === 'max_eta'
31
+ ? `${option} ${t('MIN', 'min')}`
32
+ : parsePrice(option)
33
+ }
34
+ return (
35
+ <View style={{ marginBottom: 20 }}>
36
+ <OText weight='bold' mBottom={10} size={16}>
37
+ {title}
38
+ </OText>
39
+ <ProgressContentWrapper>
40
+ <ProgressBar style={{ width: `${((options.indexOf(filters?.[filter]) / 3) * 100) ?? 100}%` }} />
41
+ </ProgressContentWrapper>
42
+ <View style={styles.maxContainer}>
43
+ {options.map((option: any, i: number) => (
44
+ <TouchableOpacity
45
+ onPress={() => handleChangeFilters(filter, option)}
46
+ key={option}
47
+ >
48
+ <OText
49
+ size={12}
50
+ weight={filters?.[filter] === option || (option === 'default' && (filters?.[filter] === 'default' || !filters?.[filter])) ? 'bold' : '500'}
51
+ >
52
+ {option === 'default' ? `${parseValue(options[i - 1])}+` : parseValue(option)}
53
+ </OText>
54
+ </TouchableOpacity>
55
+ ))}
56
+ </View>
57
+ </View>
58
+ )
59
+ }
@@ -0,0 +1,13 @@
1
+ import styled from 'styled-components/native';
2
+
3
+ export const ProgressBar = styled.View`
4
+ height: 4px;
5
+ background: ${(props: any) => props.theme.colors.textNormal};
6
+ `
7
+
8
+ export const ProgressContentWrapper = styled.View`
9
+ height: 4px;
10
+ background: #F8F9FA;
11
+ margin-bottom: 10px;
12
+ flex: 1;
13
+ `