ordering-ui-react-native 0.16.52 → 0.16.53-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 (209) 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/BusinessInformation/index.tsx +33 -4
  6. package/src/components/BusinessInformation/styles.tsx +2 -2
  7. package/src/components/BusinessProductsList/index.tsx +10 -10
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +2 -1
  10. package/src/components/LanguageSelector/index.tsx +21 -16
  11. package/src/components/Messages/index.tsx +2 -2
  12. package/src/components/NotificationSetting/index.tsx +85 -0
  13. package/src/components/OrdersOption/index.tsx +54 -56
  14. package/src/components/PaymentOptions/index.tsx +298 -345
  15. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  16. package/src/components/SingleProductReview/index.tsx +7 -4
  17. package/src/components/StripeElementsForm/index.tsx +25 -16
  18. package/src/components/VerifyPhone/styles.tsx +1 -2
  19. package/src/components/shared/OBottomPopup.tsx +6 -2
  20. package/src/components/shared/OToast.tsx +4 -4
  21. package/src/index.tsx +2 -0
  22. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  23. package/src/utils/index.tsx +2 -1
  24. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +260 -238
  25. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  26. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  27. package/themes/business/src/components/Chat/index.tsx +40 -32
  28. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  29. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  30. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  31. package/themes/business/src/components/MapView/index.tsx +12 -1
  32. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  33. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  34. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +40 -30
  35. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +3 -3
  36. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  37. package/themes/business/src/components/OrdersOption/index.tsx +76 -77
  38. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  39. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  40. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  41. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  42. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  43. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  44. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  45. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  46. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  47. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  48. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  49. package/themes/business/src/components/PreviousOrders/index.tsx +440 -245
  50. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  52. package/themes/business/src/components/ReviewCustomer/index.tsx +39 -15
  53. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  54. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  55. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  56. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  57. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  58. package/themes/business/src/components/shared/OLink.tsx +24 -12
  59. package/themes/business/src/components/shared/OText.tsx +3 -2
  60. package/themes/business/src/types/index.tsx +25 -11
  61. package/themes/business/src/utils/index.tsx +10 -0
  62. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  63. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  64. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  65. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  66. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  67. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  68. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  69. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  70. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  71. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  72. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  73. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  74. package/themes/kiosk/src/types/index.d.ts +2 -0
  75. package/themes/original/index.tsx +8 -6
  76. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  77. package/themes/original/src/components/AddressForm/index.tsx +157 -140
  78. package/themes/original/src/components/AddressList/index.tsx +1 -1
  79. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  80. package/themes/original/src/components/BusinessBasicInformation/index.tsx +218 -147
  81. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +2 -2
  82. package/themes/original/src/components/BusinessController/index.tsx +192 -91
  83. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  84. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  85. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  86. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  87. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  88. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  89. package/themes/original/src/components/BusinessListingSearch/index.tsx +85 -137
  90. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  91. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  92. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  93. package/themes/original/src/components/BusinessProductsList/index.tsx +59 -61
  94. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  95. package/themes/original/src/components/BusinessProductsListing/index.tsx +179 -83
  96. package/themes/original/src/components/BusinessProductsListing/styles.tsx +19 -12
  97. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  98. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +28 -29
  99. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +299 -148
  100. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -11
  101. package/themes/original/src/components/BusinessesListing/index.tsx +51 -71
  102. package/themes/original/src/components/Cart/index.tsx +82 -15
  103. package/themes/original/src/components/Cart/styles.tsx +4 -0
  104. package/themes/original/src/components/CartContent/index.tsx +27 -17
  105. package/themes/original/src/components/CartContent/styles.tsx +1 -1
  106. package/themes/original/src/components/Checkout/index.tsx +114 -118
  107. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  108. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  109. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  110. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  111. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  112. package/themes/original/src/components/FavoriteList/index.tsx +69 -45
  113. package/themes/original/src/components/FloatingButton/index.tsx +13 -11
  114. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  115. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  116. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  117. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  118. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  119. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  120. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  121. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  122. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  123. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  124. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  125. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  126. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  127. package/themes/original/src/components/Messages/index.tsx +35 -20
  128. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  129. package/themes/original/src/components/MultiCart/index.tsx +63 -0
  130. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  131. package/themes/original/src/components/MultiCheckout/index.tsx +10 -2
  132. package/themes/original/src/components/MultiOrdersDetails/index.tsx +34 -16
  133. package/themes/original/src/components/MyOrders/index.tsx +88 -24
  134. package/themes/original/src/components/NavBar/index.tsx +11 -5
  135. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  136. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  137. package/themes/original/src/components/Notifications/index.tsx +148 -0
  138. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  139. package/themes/original/src/components/OrderDetails/index.tsx +162 -50
  140. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  141. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  142. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  143. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  144. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  145. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  146. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  147. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  148. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +94 -98
  149. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  150. package/themes/original/src/components/OrdersOption/index.tsx +91 -53
  151. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  152. package/themes/original/src/components/PaymentOptions/index.tsx +1 -2
  153. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  154. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  155. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  156. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  157. package/themes/original/src/components/ProductForm/index.tsx +365 -384
  158. package/themes/original/src/components/ProductForm/styles.tsx +7 -12
  159. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  160. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  161. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  162. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  163. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  164. package/themes/original/src/components/ProfessionalProfile/index.tsx +19 -8
  165. package/themes/original/src/components/Promotions/index.tsx +232 -219
  166. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  167. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  168. package/themes/original/src/components/ReviewOrder/index.tsx +120 -108
  169. package/themes/original/src/components/ReviewOrder/styles.tsx +5 -7
  170. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  171. package/themes/original/src/components/ReviewTrigger/index.tsx +136 -0
  172. package/themes/original/src/components/{Reviews/ReviewOrder → ReviewTrigger}/styles.tsx +10 -22
  173. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  174. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  175. package/themes/original/src/components/ServiceForm/index.tsx +330 -266
  176. package/themes/original/src/components/SignupForm/index.tsx +134 -89
  177. package/themes/original/src/components/SingleOrderCard/index.tsx +219 -129
  178. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  179. package/themes/original/src/components/SingleProductCard/index.tsx +180 -104
  180. package/themes/original/src/components/SingleProductCard/styles.tsx +3 -10
  181. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  182. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  183. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  184. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  185. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  186. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  187. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  188. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  189. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  190. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  191. package/themes/original/src/components/Wallets/index.tsx +176 -164
  192. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  193. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  194. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  195. package/themes/original/src/components/shared/OBottomPopup.tsx +36 -22
  196. package/themes/original/src/components/shared/OButton.tsx +10 -3
  197. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  198. package/themes/original/src/components/shared/OInput.tsx +10 -1
  199. package/themes/original/src/layouts/Container.tsx +13 -9
  200. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  201. package/themes/original/src/types/index.tsx +65 -13
  202. package/themes/original/src/utils/index.tsx +103 -58
  203. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  204. package/themes/original/src/components/Reviews/ReviewDriver/index.tsx +0 -301
  205. package/themes/original/src/components/Reviews/ReviewDriver/styles.tsx +0 -39
  206. package/themes/original/src/components/Reviews/ReviewOrder/index.tsx +0 -326
  207. package/themes/original/src/components/Reviews/ReviewProducts/index.tsx +0 -101
  208. package/themes/original/src/components/Reviews/ReviewProducts/styles.tsx +0 -17
  209. package/themes/original/src/components/Reviews/index.tsx +0 -9
@@ -11,6 +11,8 @@ import { StyleSheet } from 'react-native';
11
11
  import { useTheme } from 'styled-components/native';
12
12
  import { shape } from '../../utils'
13
13
  import { CategoryDescriptionMemoized } from './CategoryDescription';
14
+ import { OrderItAgain } from '../OrderItAgain'
15
+ import { SubcategoriesComponentMemoized } from './SubcategoriesComponent';
14
16
 
15
17
  const BusinessProductsListUI = (props: BusinessProductsListParams) => {
16
18
  const {
@@ -35,7 +37,9 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
35
37
  onClickCategory,
36
38
  lazyLoadProductsRecommended,
37
39
  handleUpdateProducts,
38
- isFiltMode
40
+ previouslyProducts,
41
+ isFiltMode,
42
+ navigation
39
43
  } = props;
40
44
 
41
45
  const [, t] = useLanguage();
@@ -67,51 +71,29 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
67
71
  }
68
72
  }
69
73
 
70
- const SubcategoriesComponent = ({ category }: any) => {
71
- const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
72
-
73
- return (
74
- <SubCategoriesContainer>
75
- <ContainerButton
76
- isSelected={allsubcategorySelected}
77
- >
78
- <OButton
79
- onClick={() => onClickSubcategory(null, category)}
80
- bgColor={allsubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
81
- text={`${t('ALL', 'All')} ${allsubcategorySelected ? 'X' : ''}`}
82
- style={bpStyles.categoryButtonStyle}
83
- textStyle={{ color: allsubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
84
- />
85
- </ContainerButton>
86
- {category?.subcategories?.map((subcategory: any) => {
87
- const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
88
- return (
89
- <ContainerButton
90
- key={subcategory?.id}
91
- isSelected={isSubcategorySelected}
92
- >
93
- <OButton
94
- onClick={() => onClickSubcategory(subcategory, category)}
95
- bgColor={isSubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
96
- text={`${subcategory?.name} ${isSubcategorySelected ? 'X' : ''}`}
97
- style={bpStyles.categoryButtonStyle}
98
- textStyle={{ color: isSubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
99
- />
100
- </ContainerButton>
101
- )
102
- }
103
- )}
104
- </SubCategoriesContainer>
105
- )
106
- }
107
-
108
74
  return (
109
75
  <ProductsContainer renderToHardwareTextureAndroid={categoryState.loading || isBusinessLoading}>
110
76
  <HeaderWrapper>
111
77
  {category?.subcategories?.length > 0 && (
112
- <SubcategoriesComponent category={category} />
78
+ <SubcategoriesComponentMemoized
79
+ category={category}
80
+ subcategoriesSelected={subcategoriesSelected}
81
+ onClickSubcategory={onClickSubcategory}
82
+ />
113
83
  )}
114
84
  </HeaderWrapper>
85
+ {previouslyProducts?.length > 0 && (
86
+ <OrderItAgain
87
+ onProductClick={onProductClick}
88
+ productList={previouslyProducts}
89
+ businessId={businessId}
90
+ categoryState={categoryState}
91
+ navigation={navigation}
92
+ handleUpdateProducts={handleUpdateProducts}
93
+ currentCart={currentCart}
94
+ searchValue={searchValue}
95
+ />
96
+ )}
115
97
  {category.id &&
116
98
  categoryState.products
117
99
  ?.filter((product: any) =>
@@ -122,12 +104,14 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
122
104
  <SingleProductCard
123
105
  key={'prod_' + product.id + `_${i}`}
124
106
  isSoldOut={product.inventoried && !product.quantity}
107
+ enableIntersection={!isFiltMode && categoryState.products?.length < 80}
125
108
  product={product}
126
109
  businessId={businessId}
127
110
  categoryState={categoryState}
128
111
  onProductClick={() => onProductClick(product)}
129
112
  productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
130
113
  handleUpdateProducts={handleUpdateProducts}
114
+ navigation={navigation}
131
115
  />
132
116
  ))
133
117
  }
@@ -148,11 +132,13 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
148
132
  key={'feat_' + product.id + `_${i}`}
149
133
  isSoldOut={product.inventoried && !product.quantity}
150
134
  product={product}
135
+ enableIntersection={!isFiltMode && categoryState.products?.length < 80}
151
136
  businessId={businessId}
152
137
  categoryState={categoryState}
153
138
  onProductClick={onProductClick}
154
139
  handleUpdateProducts={handleUpdateProducts}
155
140
  productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
141
+ navigation={navigation}
156
142
  />
157
143
  ),
158
144
  )}
@@ -180,14 +166,16 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
180
166
  style={bpStyles.catWrap}
181
167
  onLayout={(event: any) => handleOnLayout(event, category.id)}
182
168
  >
183
- <View style={bpStyles.catIcon}>
184
- <OIcon
185
- url={optimizeImage(category.image, 'h_250,c_limit')}
186
- width={41}
187
- height={41}
188
- style={{ borderRadius: 7.6 }}
189
- />
190
- </View>
169
+ {!!category.image && (
170
+ <View style={bpStyles.catIcon}>
171
+ <OIcon
172
+ url={optimizeImage(category.image, 'h_250,c_limit')}
173
+ width={41}
174
+ height={41}
175
+ style={{ borderRadius: 7.6 }}
176
+ />
177
+ </View>
178
+ )}
191
179
  <OText size={16} weight="600">
192
180
  {category.name}
193
181
  </OText>
@@ -233,19 +221,24 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
233
221
  </View>
234
222
  )}
235
223
  {category?.subcategories?.length > 0 && !isFiltMode && (
236
- <SubcategoriesComponent category={category} />
224
+ <SubcategoriesComponentMemoized
225
+ category={category}
226
+ subcategoriesSelected={subcategoriesSelected}
227
+ onClickSubcategory={onClickSubcategory}
228
+ />
237
229
  )}
238
230
  <>
239
231
  {products.sort((a: any, b: any) => a.rank - b.rank).map((product: any, i: any) => (
240
232
  <SingleProductCard
241
233
  key={`${product?.id}_${i}`}
242
- enableIntersection
234
+ enableIntersection={!isFiltMode && categoryState.products?.length < 80}
243
235
  isSoldOut={product.inventoried && !product.quantity}
244
236
  businessId={businessId}
245
237
  product={product}
246
238
  categoryState={categoryState}
247
239
  onProductClick={onProductClick}
248
240
  handleUpdateProducts={handleUpdateProducts}
241
+ navigation={navigation}
249
242
  productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
250
243
  />
251
244
  ))}
@@ -260,19 +253,24 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
260
253
  <>
261
254
  {[...Array(categoryState?.pagination?.nextPageItems).keys()].map(
262
255
  (item, i) => (
263
- <Placeholder key={i} style={{ padding: 5 }} Animation={Fade}>
264
- <View style={{ flexDirection: 'row' }}>
256
+ <View style={{ minHeight: 165, marginBottom: 28, padding: 12 }} key={i}>
257
+ <Placeholder style={{ padding: 5 }} Animation={Fade}>
258
+ <View style={{ flexDirection: 'row' }}>
259
+ <Placeholder style={{ paddingVertical: 10, flex: 1 }}>
260
+ <PlaceholderLine width={60} style={{ marginBottom: 15 }} />
261
+ <PlaceholderLine width={20} />
262
+ </Placeholder>
263
+ <PlaceholderLine
264
+ width={24}
265
+ height={70}
266
+ style={{ marginLeft: 10, marginBottom: 10 }}
267
+ />
268
+ </View>
265
269
  <PlaceholderLine
266
- width={24}
267
- height={70}
268
- style={{ marginRight: 10, marginBottom: 10 }}
270
+ height={52}
269
271
  />
270
- <Placeholder style={{ paddingVertical: 10 }}>
271
- <PlaceholderLine width={60} style={{ marginBottom: 25 }} />
272
- <PlaceholderLine width={20} />
273
- </Placeholder>
274
- </View>
275
- </Placeholder>
272
+ </Placeholder>
273
+ </View>
276
274
  ),
277
275
  )}
278
276
  </>
@@ -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,6 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
2
  import { View, TouchableOpacity, StyleSheet, SafeAreaView, Dimensions, Platform, KeyboardAvoidingViewBase, KeyboardAvoidingView } from 'react-native'
3
3
  import { IOScrollView } from 'react-native-intersection-observer'
4
+ import { useSafeAreaInsets } from 'react-native-safe-area-context'
4
5
  import { useTheme } from 'styled-components/native';
5
6
  import {
6
7
  BusinessAndProductList,
@@ -12,6 +13,7 @@ import {
12
13
  useToast,
13
14
  useConfig
14
15
  } from 'ordering-components/native'
16
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
15
17
  import { OButton, OIcon, OModal, OText } from '../shared'
16
18
  import Alert from '../../providers/AlertProvider'
17
19
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
@@ -20,21 +22,26 @@ import { BusinessProductsCategories } from '../BusinessProductsCategories'
20
22
  import { BusinessProductsList } from '../BusinessProductsList'
21
23
  import { BusinessProductsListingParams } from '../../types'
22
24
  import { _retrieveStoreData, _removeStoreData } from '../../providers/StoreUtil';
25
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
26
+ import { useIsFocused } from '@react-navigation/native';
27
+
23
28
  import {
24
29
  TopHeader,
25
30
  WrapSearchBar,
26
31
  WrapContent,
27
- BusinessProductsListingContainer,
28
32
  FiltProductsContainer,
29
33
  ContainerSafeAreaView,
30
34
  BackgroundGray,
31
- ProfessionalFilterWrapper
35
+ ProfessionalFilterWrapper,
36
+ NearBusiness,
37
+ TopActions
32
38
  } from './styles'
33
39
  import { FloatingButton } from '../FloatingButton'
34
40
  import { UpsellingRedirect } from './UpsellingRedirect'
35
41
  import Animated from 'react-native-reanimated'
36
42
  import { ProfessionalFilter } from '../ProfessionalFilter';
37
43
  import { ServiceForm } from '../ServiceForm';
44
+ import { BusinessesListing } from '../BusinessesListing/Layout/Original'
38
45
 
39
46
  const PIXELS_TO_SCROLL = 2000
40
47
 
@@ -59,20 +66,29 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
59
66
  getNextProducts,
60
67
  handleUpdateProducts,
61
68
  professionalSelected,
62
- handleChangeProfessionalSelected
69
+ handleUpdateProfessionals,
70
+ handleChangeProfessionalSelected,
71
+ onBusinessClick
63
72
  } = props
64
73
 
74
+ const insets = useSafeAreaInsets()
65
75
  const theme = useTheme();
66
76
  const [, t] = useLanguage()
67
77
  const [{ auth }] = useSession()
68
- const [orderState, { clearCart }] = useOrder()
78
+ const [orderState, { addProduct, updateProduct }] = useOrder()
69
79
  const [{ parsePrice }] = useUtils()
70
80
  const [, { showToast }] = useToast()
71
81
  const [{ configs }] = useConfig()
82
+ const isFocused = useIsFocused();
72
83
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
84
+
85
+ const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
86
+ const showLogo = !theme?.business_view?.components?.header?.components?.business?.components?.logo?.hidden
87
+ const hideBusinessNearCity = theme?.business_view?.components?.near_business?.hidden ?? true
88
+
73
89
  const styles = StyleSheet.create({
74
90
  mainContainer: {
75
- flex: 1,
91
+ flex: 1
76
92
  },
77
93
  BackIcon: {
78
94
  paddingRight: 20,
@@ -94,7 +110,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
94
110
  padding: 15,
95
111
  justifyContent: 'center',
96
112
  shadowColor: theme.colors.clear,
97
- }
113
+ },
114
+ businessSkeleton: {
115
+ borderRadius: 8,
116
+ marginRight: 20,
117
+ width: 56,
118
+ height: 56
119
+ },
98
120
  })
99
121
 
100
122
  const { business, loading, error } = businessState
@@ -109,26 +131,51 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
109
131
  const [subcategoriesSelected, setSubcategoriesSelected] = useState([])
110
132
  const [openService, setOpenService] = useState(false)
111
133
  const [currentProduct, setCurrentProduct] = useState(null)
134
+ const [searchBarHeight, setSearchBarHeight] = useState(60)
112
135
 
113
136
  const isCheckoutMultiBusinessEnabled: Boolean = configs?.checkout_multi_business_enabled?.value === '1'
137
+ const isQuickAddProduct = configs?.add_product_with_one_click?.value === '1'
138
+ const openCarts = (Object.values(orderState?.carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && !cart?.wallets) || null) || []
139
+
114
140
  const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
115
141
  const isOpenFiltProducts = isOpenSearchBar && !!searchValue
116
- const filtProductsHeight = Platform.OS === 'ios' ? 0 : 35
142
+ const filtProductsHeight = Platform.OS === 'ios' ? 0 : 100
117
143
  const onRedirect = (route: string, params?: any) => {
118
144
  navigation.navigate(route, params)
119
145
  }
120
-
121
- const onProductClick = (product: any) => {
122
- if (product?.type === 'service' && professionalSelected) {
123
- setCurrentProduct(product)
124
- setOpenService(true)
125
- return
146
+ const onProductClick = async (product: any) => {
147
+ if (product.extras.length === 0 && !product.inventoried && auth && isQuickAddProduct) {
148
+ const isProductAddedToCart = currentCart?.products?.find((Cproduct: any) => Cproduct.id === product.id)
149
+ const productQuantity = isProductAddedToCart?.quantity
150
+ const addCurrentProduct = {
151
+ ...product,
152
+ quantity: 1
153
+ }
154
+ const updateCurrentProduct = {
155
+ id: product.id,
156
+ code: isProductAddedToCart?.code,
157
+ quantity: productQuantity + 1
158
+ }
159
+ const cartData = currentCart?.business_id ? currentCart : { business_id: business.id }
160
+ if (isProductAddedToCart) {
161
+ await updateProduct(updateCurrentProduct, cartData, isQuickAddProduct)
162
+ } else {
163
+ await addProduct(addCurrentProduct, cartData, isQuickAddProduct)
164
+ }
165
+ } else {
166
+ const productAddedToCartLength = currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0) || 0
167
+ if (product?.type === 'service' && business?.professionals?.length > 0) {
168
+ setCurrentProduct(product)
169
+ setOpenService(true)
170
+ return
171
+ }
172
+ onRedirect('ProductDetails', {
173
+ product: product,
174
+ businessSlug: business.slug,
175
+ businessId: business.id,
176
+ productAddedToCartLength
177
+ })
126
178
  }
127
- onRedirect('ProductDetails', {
128
- product: product,
129
- businessSlug: business.slug,
130
- businessId: business.id,
131
- })
132
179
  }
133
180
 
134
181
  const handleCancel = () => {
@@ -137,7 +184,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
137
184
  }
138
185
 
139
186
  const handleUpsellingPage = () => {
140
- if (isCheckoutMultiBusinessEnabled) {
187
+ if (isCheckoutMultiBusinessEnabled && openCarts.length > 1) {
141
188
  onRedirect('CheckoutNavigator', {
142
189
  screen: 'MultiCheckout'
143
190
  })
@@ -222,32 +269,41 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
222
269
  removeCartByReOrder()
223
270
  }, [currentCart])
224
271
 
272
+ useEffect(() => {
273
+ if (!isFocused) {
274
+ handleChangeSearch('')
275
+ setIsOpenSearchBar(false)
276
+ }
277
+ }, [isFocused])
278
+
279
+ const subtotalWithTaxes = currentCart?.taxes?.reduce((acc: any, item: any) => {
280
+ if (item?.type === 1)
281
+ return acc = acc + item?.summary?.tax
282
+ return acc = acc
283
+ }, currentCart?.subtotal)
284
+
225
285
  return (
226
286
  <>
227
- <ContainerSafeAreaView
228
- style={{ flex: 1 }}
229
- isOpenFiltProducts={isOpenFiltProducts}
230
- >
287
+ <View style={{ flex: 1 }}>
231
288
  <Animated.View style={{ position: 'relative' }}>
232
- <TopHeader isIos={Platform.OS === 'ios'}>
289
+ <TopHeader
290
+ style={{
291
+ marginTop: Platform.OS === 'ios' ? insets.top : 0
292
+ }}
293
+ onLayout={(event: any) => setSearchBarHeight(event.nativeEvent.layout.height)}
294
+ >
233
295
  {!isOpenSearchBar && (
234
296
  <>
235
- <View style={{ ...styles.headerItem, flex: 1 }}>
236
- <OButton
237
- imgLeftSrc={theme.images.general.arrow_left}
238
- imgRightSrc={null}
239
- style={styles.btnBackArrow}
240
- onClick={() => handleBackNavigation()}
241
- imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 30 }}
242
- />
243
- </View>
297
+ <TopActions onPress={() => handleBackNavigation()}>
298
+ <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
299
+ </TopActions>
244
300
  {!errorQuantityProducts && (
245
301
  <View style={{ ...styles.headerItem }}>
246
302
  <TouchableOpacity
247
303
  onPress={() => setIsOpenSearchBar(true)}
248
304
  style={styles.searchIcon}
249
305
  >
250
- <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={16} />
306
+ <OIcon src={theme.images.general.search} color={theme.colors.textNormal} width={20} />
251
307
  </TouchableOpacity>
252
308
  </View>
253
309
  )}
@@ -267,14 +323,39 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
267
323
  </WrapSearchBar>
268
324
  )}
269
325
  </TopHeader>
326
+ {!hideBusinessNearCity && loading && (
327
+ <NearBusiness style={{ paddingBottom: 10 }}>
328
+ <Placeholder Animation={Fade}>
329
+ <View style={{ flexDirection: 'row' }}>
330
+ {[...Array(10).keys()].map(i => (
331
+ <View style={styles.businessSkeleton} key={i}>
332
+ <PlaceholderLine style={{ width: '100%', height: '100%' }} />
333
+ </View>
334
+ ))}
335
+ </View>
336
+ </Placeholder>
337
+ </NearBusiness>
338
+ )}
339
+ {!loading && !hideBusinessNearCity && businessState?.business?.city_id && (
340
+ <NearBusiness>
341
+ <BusinessesListing
342
+ logosLayout
343
+ propsToFetch={['id', 'logo', 'location', 'timezone', 'schedule', 'open', 'slug']}
344
+ cityId={businessState?.business?.city_id}
345
+ onBusinessClick={onBusinessClick}
346
+ actualSlug={businessState?.business?.slug}
347
+ />
348
+ </NearBusiness>
349
+ )}
270
350
  </Animated.View>
271
351
 
272
352
  {business?.categories?.length > 0 && isOpenFiltProducts && (
273
353
  <FiltProductsContainer
274
- isIos={Platform.OS === 'ios'}
275
354
  style={{
276
- height: Dimensions.get('window').height - filtProductsHeight
355
+ height: Dimensions.get('window').height - filtProductsHeight,
356
+ top: Platform.OS === 'ios' ? searchBarHeight + insets.top : searchBarHeight
277
357
  }}
358
+ contentContainerStyle={{ flexGrow: 1 }}
278
359
  >
279
360
  <View style={{ padding: 20, backgroundColor: theme.colors.white }}>
280
361
  <BusinessProductsList
@@ -302,22 +383,28 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
302
383
  setSubcategoriesSelected={setSubcategoriesSelected}
303
384
  onClickCategory={handleChangeCategory}
304
385
  handleUpdateProducts={handleUpdateProducts}
386
+ previouslyProducts={business?.previously_products}
387
+ navigation={navigation}
305
388
  isFiltMode
306
389
  />
307
390
  </View>
308
391
  </FiltProductsContainer>
309
392
  )}
310
393
  {isOpenFiltProducts && (
311
- <BackgroundGray />
394
+ <BackgroundGray isIos={Platform.OS === 'ios'} />
312
395
  )}
313
- <BusinessProductsListingContainer
314
- stickyHeaderIndices={[2]}
315
- style={styles.mainContainer}
396
+ <IOScrollView
397
+ stickyHeaderIndices={[business?.professionals?.length > 0 ? 3 : 2]}
398
+ style={{
399
+ ...styles.mainContainer,
400
+ marginBottom: currentCart?.products?.length > 0 && categoryState.products.length !== 0 ?
401
+ 50 : 0
402
+ }}
316
403
  ref={scrollViewRef}
317
- isActiveFloatingButtom={currentCart?.products?.length > 0 && categoryState.products.length !== 0}
318
404
  onScroll={handlePageScroll}
319
405
  onScrollBeginDrag={handleTouchDrag}
320
406
  scrollEventThrottle={16}
407
+ bounces={false}
321
408
  >
322
409
  <BusinessBasicInformation
323
410
  navigation={navigation}
@@ -343,32 +430,34 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
343
430
  />
344
431
  </ProfessionalFilterWrapper>
345
432
  )}
346
- <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
347
- {!loading && business?.id && (
348
- <>
349
- {!(business?.categories?.length === 0) && (
350
- <BusinessProductsCategories
351
- categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
352
- categorySelected={categorySelected}
353
- onClickCategory={handleChangeCategory}
354
- featured={featuredProducts}
355
- openBusinessInformation={openBusinessInformation}
356
- scrollViewRef={scrollViewRef}
357
- productListLayout={productListLayout}
358
- categoriesLayout={categoriesLayout}
359
- selectedCategoryId={selectedCategoryId}
360
- lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
361
- setSelectedCategoryId={setSelectedCategoryId}
362
- setCategoryClicked={setCategoryClicked}
363
-
364
- />
365
- )}
366
- </>
433
+ <View
434
+ style={{
435
+ height: 8,
436
+ backgroundColor: theme.colors.backgroundGray100,
437
+ marginTop: isChewLayout && showLogo ? 10 : 0
438
+ }}
439
+ />
440
+ {!loading && business?.id && !(business?.categories?.length === 0) && (
441
+ <BusinessProductsCategories
442
+ categories={[{ id: null, name: t('ALL', 'All') }, { id: 'featured', name: t('FEATURED', 'Featured') }, ...business?.categories.sort((a: any, b: any) => a.rank - b.rank)]}
443
+ categorySelected={categorySelected}
444
+ onClickCategory={handleChangeCategory}
445
+ featured={featuredProducts}
446
+ openBusinessInformation={openBusinessInformation}
447
+ scrollViewRef={scrollViewRef}
448
+ productListLayout={productListLayout}
449
+ categoriesLayout={categoriesLayout}
450
+ selectedCategoryId={selectedCategoryId}
451
+ lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
452
+ setSelectedCategoryId={setSelectedCategoryId}
453
+ setCategoryClicked={setCategoryClicked}
454
+ />
367
455
  )}
368
456
  {!loading && business?.id && (
369
- <IOScrollView rootMargin={{ top: 0, bottom: 0 }}>
457
+ <>
370
458
  <WrapContent
371
459
  onLayout={(event: any) => setProductListLayout(event.nativeEvent.layout)}
460
+ style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
372
461
  >
373
462
  <BusinessProductsList
374
463
  categories={[
@@ -395,9 +484,11 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
395
484
  setSubcategoriesSelected={setSubcategoriesSelected}
396
485
  onClickCategory={handleChangeCategory}
397
486
  handleUpdateProducts={handleUpdateProducts}
487
+ navigation={navigation}
488
+ previouslyProducts={business?.previously_products}
398
489
  />
399
490
  </WrapContent>
400
- </IOScrollView>
491
+ </>
401
492
  )}
402
493
  {loading && !error && (
403
494
  <>
@@ -417,29 +508,32 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
417
508
  isBusinessLoading={loading}
418
509
  errorQuantityProducts={errorQuantityProducts}
419
510
  handleUpdateProducts={handleUpdateProducts}
511
+ navigation={navigation}
420
512
  />
421
513
  </WrapContent>
422
514
  </>
423
515
  )}
424
- </BusinessProductsListingContainer>
425
-
516
+ </IOScrollView>
426
517
  {!loading && auth && currentCart?.products?.length > 0 && categoryState.products.length !== 0 && (
427
- <FloatingButton
428
- btnText={
429
- openUpselling
430
- ? t('LOADING', 'Loading')
431
- : currentCart?.subtotal >= currentCart?.minimum
432
- ? t('VIEW_ORDER', 'View Order')
433
- : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
434
- }
435
- isSecondaryBtn={currentCart?.subtotal < currentCart?.minimum || openUpselling}
436
- btnLeftValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
437
- btnRightValueShow={currentCart?.subtotal >= currentCart?.minimum && currentCart?.products?.length > 0}
438
- btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
439
- btnRightValue={parsePrice(currentCart?.total)}
440
- disabled={currentCart?.subtotal < currentCart?.minimum || openUpselling}
441
- handleClick={() => setOpenUpselling(true)}
442
- />
518
+ <View style={{ marginBottom: Platform.OS === 'ios' ? 20 : 0 }}>
519
+ <FloatingButton
520
+ btnText={
521
+ openUpselling
522
+ ? t('LOADING', 'Loading')
523
+ : subtotalWithTaxes >= currentCart?.minimum
524
+ ? t('VIEW_ORDER', 'View Order')
525
+ : `${t('MINIMUN_SUBTOTAL_ORDER', 'Minimum subtotal order:')} ${parsePrice(currentCart?.minimum)}`
526
+ }
527
+ isSecondaryBtn={subtotalWithTaxes < currentCart?.minimum || openUpselling}
528
+ btnLeftValueShow={subtotalWithTaxes >= currentCart?.minimum && currentCart?.products?.length > 0}
529
+ btnRightValueShow={subtotalWithTaxes >= currentCart?.minimum && currentCart?.products?.length > 0}
530
+ btnLeftValue={currentCart?.products.reduce((prev: number, product: any) => prev + product.quantity, 0)}
531
+ btnRightValue={parsePrice(currentCart?.total)}
532
+ disabled={subtotalWithTaxes < currentCart?.minimum || openUpselling}
533
+ hideButton={isCheckoutMultiBusinessEnabled}
534
+ handleClick={() => setOpenUpselling(true)}
535
+ />
536
+ </View>
443
537
  )}
444
538
  {openUpselling && (
445
539
  <UpsellingRedirect
@@ -463,7 +557,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
463
557
  onAccept={() => setAlertState({ open: false, content: [] })}
464
558
  onClose={() => setAlertState({ open: false, content: [] })}
465
559
  />
466
- </ContainerSafeAreaView>
560
+ </View>
467
561
  <OModal
468
562
  open={openService}
469
563
  onClose={() => setOpenService(false)}
@@ -477,6 +571,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
477
571
  professionalList={business?.professionals}
478
572
  professionalSelected={professionalSelected}
479
573
  handleChangeProfessional={handleChangeProfessionalSelected}
574
+ handleUpdateProfessionals={handleUpdateProfessionals}
480
575
  onSave={() => setOpenService(false)}
481
576
  onClose={() => setOpenService(false)}
482
577
  />
@@ -488,6 +583,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
488
583
  export const BusinessProductsListing = (props: BusinessProductsListingParams) => {
489
584
  const businessProductslistingProps = {
490
585
  ...props,
586
+ isForceSearch: Platform.OS === 'ios',
491
587
  UIComponent: BusinessProductsListingUI
492
588
  }
493
589
  return (