ordering-ui-react-native 0.15.38 → 0.15.40-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 (197) hide show
  1. package/package.json +8 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessController/index.tsx +8 -2
  5. package/src/components/BusinessTypeFilter/index.tsx +4 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Checkout/index.tsx +23 -2
  8. package/src/components/DriverTips/index.tsx +11 -6
  9. package/src/components/LanguageSelector/index.tsx +7 -2
  10. package/src/components/LoginForm/index.tsx +3 -1
  11. package/src/components/OrderDetails/index.tsx +2 -2
  12. package/src/components/PaymentOptions/index.tsx +1 -1
  13. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  14. package/src/components/SignupForm/index.tsx +3 -1
  15. package/src/components/SingleProductCard/index.tsx +16 -4
  16. package/src/components/StripeMethodForm/index.tsx +1 -2
  17. package/src/components/UpsellingProducts/index.tsx +1 -1
  18. package/src/components/UserProfileForm/index.tsx +63 -6
  19. package/src/components/UserProfileForm/styles.tsx +8 -0
  20. package/src/components/VerifyPhone/styles.tsx +1 -2
  21. package/src/components/shared/OModal.tsx +1 -1
  22. package/src/hooks/useCountdownTimer.tsx +26 -0
  23. package/src/navigators/CheckoutNavigator.tsx +6 -0
  24. package/src/navigators/HomeNavigator.tsx +12 -0
  25. package/src/pages/BusinessProductsList.tsx +1 -0
  26. package/src/pages/BusinessesListing.tsx +1 -1
  27. package/src/pages/MultiCheckout.tsx +31 -0
  28. package/src/pages/MultiOrdersDetails.tsx +27 -0
  29. package/src/pages/Sessions.tsx +22 -0
  30. package/src/theme.json +0 -1
  31. package/src/types/index.tsx +5 -2
  32. package/src/utils/index.tsx +68 -1
  33. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  34. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  35. package/themes/business/src/components/Chat/index.tsx +38 -86
  36. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  37. package/themes/business/src/components/Home/index.tsx +128 -55
  38. package/themes/business/src/components/Home/styles.tsx +8 -1
  39. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  40. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  41. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  42. package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
  43. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  44. package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -18
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +157 -89
  46. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  47. package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
  48. package/themes/business/src/components/OrdersListManager/index.tsx +52 -49
  49. package/themes/business/src/components/OrdersOption/index.tsx +57 -50
  50. package/themes/business/src/components/PreviousOrders/index.tsx +50 -14
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  52. package/themes/business/src/components/shared/OModal.tsx +1 -1
  53. package/themes/business/src/types/index.tsx +5 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  58. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  59. package/themes/kiosk/src/components/Cart/index.tsx +99 -26
  60. package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
  61. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  62. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  63. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  64. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  65. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  66. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  67. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  68. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  69. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  70. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  71. package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
  72. package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
  73. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  74. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  75. package/themes/kiosk/src/components/ProductForm/index.tsx +8 -9
  76. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  77. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  78. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  79. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  80. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  81. package/themes/kiosk/src/types/index.d.ts +3 -0
  82. package/themes/original/index.tsx +180 -1
  83. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  84. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  85. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  86. package/themes/original/src/components/AddressList/index.tsx +56 -18
  87. package/themes/original/src/components/AppleLogin/index.tsx +117 -78
  88. package/themes/original/src/components/BusinessBasicInformation/index.tsx +96 -45
  89. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
  90. package/themes/original/src/components/BusinessController/index.tsx +51 -16
  91. package/themes/original/src/components/BusinessController/styles.tsx +27 -0
  92. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  93. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  94. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  95. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  96. package/themes/original/src/components/BusinessListingSearch/index.tsx +196 -58
  97. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  98. package/themes/original/src/components/BusinessPreorder/index.tsx +73 -56
  99. package/themes/original/src/components/BusinessProductsCategories/index.tsx +9 -7
  100. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  101. package/themes/original/src/components/BusinessProductsList/index.tsx +139 -36
  102. package/themes/original/src/components/BusinessProductsList/styles.tsx +29 -2
  103. package/themes/original/src/components/BusinessProductsListing/index.tsx +116 -26
  104. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  105. package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
  106. package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
  107. package/themes/original/src/components/BusinessesListing/index.tsx +127 -67
  108. package/themes/original/src/components/BusinessesListing/styles.tsx +11 -3
  109. package/themes/original/src/components/Cart/index.tsx +60 -43
  110. package/themes/original/src/components/CartContent/index.tsx +2 -2
  111. package/themes/original/src/components/Checkout/index.tsx +50 -33
  112. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  113. package/themes/original/src/components/Favorite/index.tsx +91 -0
  114. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  115. package/themes/original/src/components/FavoriteList/index.tsx +287 -0
  116. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  117. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  118. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  119. package/themes/original/src/components/GoogleMap/index.tsx +1 -0
  120. package/themes/original/src/components/Help/index.tsx +21 -4
  121. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  122. package/themes/original/src/components/Home/index.tsx +1 -1
  123. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
  125. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  126. package/themes/original/src/components/LoginForm/index.tsx +394 -155
  127. package/themes/original/src/components/LoginForm/styles.tsx +7 -4
  128. package/themes/original/src/components/LogoutButton/index.tsx +7 -1
  129. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  130. package/themes/original/src/components/Messages/index.tsx +6 -1
  131. package/themes/original/src/components/Messages/styles.tsx +1 -3
  132. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  133. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  134. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  135. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  136. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  137. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  138. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  139. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  140. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  141. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  142. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  143. package/themes/original/src/components/OrderDetails/index.tsx +55 -37
  144. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  145. package/themes/original/src/components/OrderProgress/index.tsx +3 -3
  146. package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +3 -3
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  149. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  150. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  151. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  152. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  153. package/themes/original/src/components/OrdersOption/index.tsx +133 -41
  154. package/themes/original/src/components/OrdersOption/styles.tsx +4 -7
  155. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  156. package/themes/original/src/components/PaymentOptionWallet/index.tsx +22 -24
  157. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  158. package/themes/original/src/components/PaymentOptions/index.tsx +19 -15
  159. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  160. package/themes/original/src/components/PreviousOrders/index.tsx +18 -145
  161. package/themes/original/src/components/ProductForm/index.tsx +74 -66
  162. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  165. package/themes/original/src/components/Promotions/index.tsx +250 -0
  166. package/themes/original/src/components/Promotions/styles.tsx +60 -0
  167. package/themes/original/src/components/SearchBar/index.tsx +10 -4
  168. package/themes/original/src/components/Sessions/index.tsx +160 -0
  169. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  170. package/themes/original/src/components/SignupForm/index.tsx +9 -4
  171. package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
  172. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  173. package/themes/original/src/components/SingleProductCard/index.tsx +95 -32
  174. package/themes/original/src/components/SingleProductCard/styles.tsx +28 -1
  175. package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
  176. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  177. package/themes/original/src/components/TaxInformation/index.tsx +10 -4
  178. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  179. package/themes/original/src/components/UserDetails/index.tsx +5 -96
  180. package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
  181. package/themes/original/src/components/UserProfile/index.tsx +62 -8
  182. package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
  183. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  184. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  185. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  186. package/themes/original/src/components/Wallets/index.tsx +76 -9
  187. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  188. package/themes/original/src/components/shared/HeaderTitle.tsx +21 -0
  189. package/themes/original/src/components/shared/OModal.tsx +4 -2
  190. package/themes/original/src/components/shared/index.tsx +2 -0
  191. package/themes/original/src/config/constants.tsx +6 -6
  192. package/themes/original/src/types/index.tsx +132 -9
  193. package/themes/original/src/utils/index.tsx +28 -2
  194. package/themes/single-business/src/components/AddressList/index.tsx +1 -1
  195. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  196. package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
  197. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,4 +1,4 @@
1
- import styled from 'styled-components/native'
1
+ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const WrapHeader = styled.View`
4
4
  width: 100%;
@@ -68,9 +68,29 @@ export const ProgressContentWrapper = styled.View`
68
68
  `
69
69
 
70
70
  export const TagsContainer = styled.View`
71
-
71
+ padding-bottom: 10px;
72
72
  `
73
73
 
74
74
  export const SortContainer = styled.View`
75
75
  margin-bottom: 10px;
76
76
  `
77
+
78
+ export const BrandContainer = styled.View``
79
+
80
+ export const BrandItem = styled.TouchableOpacity`
81
+ flex-direction: row;
82
+ justify-content: space-between;
83
+ margin-bottom: 4px;
84
+ align-items: center;
85
+ `
86
+
87
+ export const PriceFilterWrapper = styled.View`
88
+ margin-bottom: 20px;
89
+ `
90
+
91
+ export const OptionTitle = styled.View`
92
+ margin-top: 24px;
93
+ ${(props: any) => props.titleContent && css`
94
+ margin-left: ${() => props.isBusinessesSearchList ? '0' : '40px'};
95
+ `}
96
+ `
@@ -53,6 +53,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
53
53
  const [isEnabled, setIsEnabled] = useState(false)
54
54
  const { top } = useSafeAreaInsets()
55
55
  const showOrderTime = (selectedPreorderType === 1 && Object.keys(menu)?.length > 0) || selectedPreorderType === 0
56
+ const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
56
57
  const styles = StyleSheet.create({
57
58
  container: {
58
59
  height: windowHeight,
@@ -143,7 +144,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
143
144
 
144
145
  const validateSelectedDate = (curdate: any, menu: any) => {
145
146
  const day = moment(curdate).format('d')
146
- setIsEnabled(menu?.schedule[day]?.enabled || false)
147
+ setIsEnabled(menu?.schedule?.[day]?.enabled || false)
147
148
  }
148
149
 
149
150
  const getTimes = (curdate: any, menu: any) => {
@@ -301,60 +302,62 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
301
302
  />
302
303
  </View>
303
304
  </BusinessInfoWrapper>
304
- <PreorderTypeWrapper>
305
- <OText
306
- size={16}
307
- style={{
308
- fontWeight: '600',
309
- lineHeight: 24,
310
- marginBottom: 12
311
- }}
312
- >
313
- {t('PREORDER_TYPE', 'Preorder type')}
314
- </OText>
315
- <SelectDropdown
316
- defaultValueByIndex={selectedPreorderType}
317
- data={preorderTypeList}
318
- // disabled={orderState.loading}
319
- onSelect={(selectedItem, index) => {
320
- setSelectedPreorderType(index)
321
- }}
322
- buttonTextAfterSelection={(selectedItem, index) => {
323
- return selectedItem.name
324
- }}
325
- rowTextForSelection={(item, index) => {
326
- return item.name
327
- }}
328
- buttonStyle={styles.selectOption}
329
- buttonTextStyle={{
330
- color: theme.colors.disabled,
331
- fontSize: 14,
332
- textAlign: 'left',
333
- marginHorizontal: 0
334
- }}
335
- dropdownStyle={{
336
- borderRadius: 8,
337
- borderColor: theme.colors.lightGray,
338
- marginTop: Platform.OS === 'ios' ? 12 : -top
339
- }}
340
- rowStyle={{
341
- borderBottomColor: theme.colors.backgroundGray100,
342
- backgroundColor: theme.colors.backgroundGray100,
343
- height: 40,
344
- flexDirection: 'column',
345
- alignItems: 'flex-start',
346
- paddingTop: 8,
347
- paddingHorizontal: 14
348
- }}
349
- rowTextStyle={{
350
- color: theme.colors.disabled,
351
- fontSize: 14,
352
- marginHorizontal: 0
353
- }}
354
- renderDropdownIcon={() => dropDownIcon()}
355
- dropdownOverlayColor='transparent'
356
- />
357
- </PreorderTypeWrapper>
305
+ {isPreOrderSetting && (
306
+ <PreorderTypeWrapper>
307
+ <OText
308
+ size={16}
309
+ style={{
310
+ fontWeight: '600',
311
+ lineHeight: 24,
312
+ marginBottom: 12
313
+ }}
314
+ >
315
+ {t('PREORDER_TYPE', 'Preorder type')}
316
+ </OText>
317
+ <SelectDropdown
318
+ defaultValueByIndex={selectedPreorderType}
319
+ data={preorderTypeList}
320
+ // disabled={orderState.loading}
321
+ onSelect={(selectedItem, index) => {
322
+ setSelectedPreorderType(index)
323
+ }}
324
+ buttonTextAfterSelection={(selectedItem, index) => {
325
+ return selectedItem.name
326
+ }}
327
+ rowTextForSelection={(item, index) => {
328
+ return item.name
329
+ }}
330
+ buttonStyle={styles.selectOption}
331
+ buttonTextStyle={{
332
+ color: theme.colors.disabled,
333
+ fontSize: 14,
334
+ textAlign: 'left',
335
+ marginHorizontal: 0
336
+ }}
337
+ dropdownStyle={{
338
+ borderRadius: 8,
339
+ borderColor: theme.colors.lightGray,
340
+ marginTop: Platform.OS === 'ios' ? 12 : -top
341
+ }}
342
+ rowStyle={{
343
+ borderBottomColor: theme.colors.backgroundGray100,
344
+ backgroundColor: theme.colors.backgroundGray100,
345
+ height: 40,
346
+ flexDirection: 'column',
347
+ alignItems: 'flex-start',
348
+ paddingTop: 8,
349
+ paddingHorizontal: 14
350
+ }}
351
+ rowTextStyle={{
352
+ color: theme.colors.disabled,
353
+ fontSize: 14,
354
+ marginHorizontal: 0
355
+ }}
356
+ renderDropdownIcon={() => dropDownIcon()}
357
+ dropdownOverlayColor='transparent'
358
+ />
359
+ </PreorderTypeWrapper>
360
+ )}
358
361
  {selectedPreorderType === 1 && (
359
362
  <MenuWrapper>
360
363
  <OText
@@ -374,7 +377,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
374
377
  />
375
378
  </MenuWrapper>
376
379
  )}
377
- {showOrderTime && (
380
+ {isPreOrderSetting && showOrderTime && (
378
381
  <OrderTimeWrapper>
379
382
  <OText
380
383
  size={16}
@@ -448,6 +451,20 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
448
451
  </TimeListWrapper>
449
452
  </OrderTimeWrapper>
450
453
  )}
454
+ {!isPreOrderSetting && (
455
+ <OText
456
+ size={16}
457
+ style={{
458
+ fontWeight: '600',
459
+ lineHeight: 24,
460
+ marginTop: 30,
461
+ marginBottom: 12,
462
+ textAlign: 'center'
463
+ }}
464
+ >
465
+ {t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
466
+ </OText>
467
+ )}
451
468
  <OButton
452
469
  text={t('GO_TO_MENU', 'Go to menu')}
453
470
  textStyle={{ color: 'white' }}
@@ -44,11 +44,11 @@ const BusinessProductsCategoriesUI = (props: any) => {
44
44
  borderTopStartRadius: 4,
45
45
  borderTopEndRadius: 4,
46
46
  backgroundColor: theme.colors.textPrimary,
47
- },
48
- tabDeactived: {
47
+ },
48
+ tabDeactived: {
49
49
  marginTop: 10,
50
50
  height: 4
51
- }
51
+ }
52
52
  });
53
53
 
54
54
  const handleCategoryScroll = (category: any) => {
@@ -57,12 +57,12 @@ const BusinessProductsCategoriesUI = (props: any) => {
57
57
 
58
58
  if (!lazyLoadProductsRecommended) {
59
59
  if (category?.id) {
60
- scrollViewRef.current.scrollTo({
60
+ scrollViewRef?.current?.scrollTo && scrollViewRef.current.scrollTo({
61
61
  y: categoriesLayout[`cat_${category?.id}`]?.y + productListLayout?.y - 70,
62
62
  animated: true
63
63
  })
64
64
  } else {
65
- scrollViewRef.current.scrollTo({
65
+ scrollViewRef?.current?.scrollTo && scrollViewRef.current.scrollTo({
66
66
  y: productListLayout?.y - 70,
67
67
  animated: true
68
68
  })
@@ -111,8 +111,10 @@ const BusinessProductsCategoriesUI = (props: any) => {
111
111
  categories.length &&
112
112
  categories.map((category: any) => (
113
113
  <Tab
114
- key={category.name}
115
- onPress={() => handleCategoryScroll(category)}
114
+ key={category.id}
115
+ onPress={() => requestAnimationFrame(() => {
116
+ handleCategoryScroll(category)
117
+ })}
116
118
  style={[
117
119
  category.id === 'featured' && !featured && styles.featuredStyle,
118
120
  {
@@ -0,0 +1,44 @@
1
+ import React from 'react'
2
+ import { OModal, OText, OIcon } from '../../shared'
3
+ import { ScrollView } from 'react-native'
4
+ import { useUtils } from 'ordering-components/native'
5
+
6
+ interface CategoryDescriptionParams {
7
+ openDescription?: {name: string, image: string, description: string} | null,
8
+ setOpenDescription: any;
9
+ }
10
+
11
+ function categoryDescriptionPropsAreEqual(prev : any, next : any) {
12
+ return prev.openDescription === next.openDescription
13
+ }
14
+
15
+ const CategoryDescription = (props : CategoryDescriptionParams) => {
16
+ const [{ optimizeImage }] = useUtils()
17
+ return (
18
+ <OModal
19
+ open={!!props.openDescription}
20
+ onClose={() => props.setOpenDescription(null)}
21
+ styleContainerCloseButton={{
22
+ marginLeft: -37,
23
+ width: 55,
24
+ height: 55,
25
+ marginTop: 2
26
+ }}
27
+ >
28
+ <OText size={20} style={{ paddingLeft: 70, paddingRight: 20, bottom: 25 }}>{props.openDescription?.name}</OText>
29
+ <ScrollView style={{ padding: 20 }}>
30
+ {!!props.openDescription?.image && (
31
+ <OIcon
32
+ url={optimizeImage(props.openDescription?.image, 'h_100,c_limit')}
33
+ width={240}
34
+ height={240}
35
+ style={{ borderRadius: 7.6 }}
36
+ />
37
+ )}
38
+ <OText mBottom={60}>{props.openDescription?.description}</OText>
39
+ </ScrollView>
40
+ </OModal>
41
+ )
42
+ }
43
+
44
+ export const CategoryDescriptionMemoized = React.memo(CategoryDescription,categoryDescriptionPropsAreEqual)
@@ -4,11 +4,13 @@ import { SingleProductCard } from '../SingleProductCard';
4
4
  import { NotFoundSource } from '../NotFoundSource';
5
5
  import { BusinessProductsListParams } from '../../types';
6
6
  import { OButton, OIcon, OModal, OText } from '../shared';
7
- import { ProductsContainer, ErrorMessage, WrapperNotFound } from './styles';
7
+ import { ProductsContainer, ErrorMessage, WrapperNotFound, RibbonBox, SubCategoriesContainer, ContainerButton, HeaderWrapper } from './styles';
8
8
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
9
9
  import { View, ScrollView } from 'react-native';
10
10
  import { StyleSheet } from 'react-native';
11
11
  import { useTheme } from 'styled-components/native';
12
+ import { shape } from '../../utils'
13
+ import { CategoryDescriptionMemoized } from './CategoryDescription';
12
14
 
13
15
  const BusinessProductsListUI = (props: BusinessProductsListParams) => {
14
16
  const {
@@ -27,7 +29,13 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
27
29
  handleCancelSearch,
28
30
  categoriesLayout,
29
31
  setCategoriesLayout,
30
- currentCart
32
+ currentCart,
33
+ setSubcategoriesSelected,
34
+ subcategoriesSelected,
35
+ onClickCategory,
36
+ lazyLoadProductsRecommended,
37
+ handleUpdateProducts,
38
+ isFiltMode
31
39
  } = props;
32
40
 
33
41
  const [, t] = useLanguage();
@@ -43,20 +51,86 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
43
51
  setCategoriesLayout(_categoriesLayout)
44
52
  }
45
53
 
46
- return (
47
- <ProductsContainer>
48
- {category.id &&
49
- categoryState.products?.sort((a: any, b: any) => a.rank - b.rank).map((product: any) => (
50
- <SingleProductCard
51
- key={'prod_' + product.id}
52
- isSoldOut={product.inventoried && !product.quantity}
53
- product={product}
54
- businessId={businessId}
55
- onProductClick={() => onProductClick(product)}
56
- productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
54
+ const onClickSubcategory = (subCategory: any, parentCategory: any) => {
55
+ if (parentCategory && lazyLoadProductsRecommended) {
56
+ onClickCategory(parentCategory)
57
+ }
58
+ if (!subCategory) {
59
+ setSubcategoriesSelected?.(subcategoriesSelected.filter((_subcategory: any) => _subcategory?.parent_category_id !== parentCategory?.id))
60
+ return
61
+ }
62
+ const categoryFounded = subcategoriesSelected.find((_subcategory: any) => subCategory?.id === _subcategory?.id)
63
+ if (categoryFounded) {
64
+ setSubcategoriesSelected?.(subcategoriesSelected.filter((_subcategory: any) => subCategory?.id !== _subcategory?.id))
65
+ } else {
66
+ setSubcategoriesSelected?.([...subcategoriesSelected, subCategory])
67
+ }
68
+ }
69
+
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 }}
57
84
  />
58
- ))}
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
+ }
59
107
 
108
+ return (
109
+ <ProductsContainer renderToHardwareTextureAndroid={categoryState.loading || isBusinessLoading}>
110
+ <HeaderWrapper>
111
+ {category?.subcategories?.length > 0 && (
112
+ <SubcategoriesComponent category={category} />
113
+ )}
114
+ </HeaderWrapper>
115
+ {category.id &&
116
+ categoryState.products
117
+ ?.filter((product: any) =>
118
+ !subcategoriesSelected.find((subcategory: any) => subcategory?.parent_category_id === category?.id) ||
119
+ subcategoriesSelected?.some((subcategory: any) => subcategory.id === product?.category_id))
120
+ ?.sort((a: any, b: any) => a.rank - b.rank)
121
+ ?.map((product: any, i: number) => (
122
+ <SingleProductCard
123
+ key={'prod_' + product.id + `_${i}`}
124
+ isSoldOut={product.inventoried && !product.quantity}
125
+ product={product}
126
+ businessId={businessId}
127
+ categoryState={categoryState}
128
+ onProductClick={() => onProductClick(product)}
129
+ productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
130
+ handleUpdateProducts={handleUpdateProducts}
131
+ />
132
+ ))
133
+ }
60
134
  {!category.id &&
61
135
  featured &&
62
136
  categoryState?.products?.find((product: any) => product.featured) && (
@@ -71,11 +145,13 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
71
145
  (product: any, i: any) =>
72
146
  product.featured && (
73
147
  <SingleProductCard
74
- key={i}
148
+ key={'feat_' + product.id + `_${i}`}
75
149
  isSoldOut={product.inventoried && !product.quantity}
76
150
  product={product}
77
151
  businessId={businessId}
152
+ categoryState={categoryState}
78
153
  onProductClick={onProductClick}
154
+ handleUpdateProducts={handleUpdateProducts}
79
155
  productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
80
156
  />
81
157
  ),
@@ -85,9 +161,14 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
85
161
  )}
86
162
 
87
163
  {!category?.id && categories.filter(category => category?.id !== null).map((category, i, _categories) => {
88
- const products = !isUseParentCategory
164
+ const _products = !isUseParentCategory
89
165
  ? categoryState?.products?.filter((product: any) => product?.category_id === category?.id) ?? []
90
166
  : categoryState?.products?.filter((product: any) => category?.children?.some((cat: any) => cat.category_id === product?.category_id)) ?? []
167
+ const products = subcategoriesSelected?.length > 0
168
+ ? _products?.filter((product: any) =>
169
+ !subcategoriesSelected.find((subcategory: any) => subcategory?.parent_category_id === category?.id) ||
170
+ subcategoriesSelected?.some((subcategory: any) => subcategory.id === product?.category_id))
171
+ : _products
91
172
 
92
173
  const shortCategoryDescription = category?.description?.length > 80 ? `${category?.description?.substring(0, 80)}...` : category?.description
93
174
 
@@ -110,15 +191,33 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
110
191
  <OText size={16} weight="600">
111
192
  {category.name}
112
193
  </OText>
194
+ {category?.ribbon?.enabled && (
195
+ <RibbonBox
196
+ bgColor={category?.ribbon?.color}
197
+ isRoundRect={category?.ribbon?.shape === shape?.rectangleRound}
198
+ isCapsule={category?.ribbon?.shape === shape?.capsuleShape}
199
+ >
200
+ <OText
201
+ size={10}
202
+ weight={'400'}
203
+ color={theme.colors.white}
204
+ numberOfLines={2}
205
+ ellipsizeMode='tail'
206
+ lineHeight={13}
207
+ >
208
+ {category?.ribbon?.text}
209
+ </OText>
210
+ </RibbonBox>
211
+ )}
113
212
  </View>
114
213
  {!!category?.description && (
115
214
  <View style={{ position: 'relative' }}>
116
- <OText size={12} weight={'500'} mBottom={5}>
215
+ <OText size={12} weight={'500'} mBottom={10} color='#909BA9'>
117
216
  {shortCategoryDescription}
118
217
  {category?.description?.length > 80 && (
119
218
  <OButton
120
219
  style={{ height: 15, paddingRight: 0, paddingLeft: 0, borderWidth: 0 }}
121
- text={t('SEE_MORE', 'See more')}
220
+ text={t('VIEW_MORE', 'View more')}
122
221
  parentStyle={{ padding: 0 }}
123
222
  onClick={() => setOpenDescription(category)}
124
223
  bgColor='transparent'
@@ -133,14 +232,19 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
133
232
  </OText>
134
233
  </View>
135
234
  )}
235
+ {category?.subcategories?.length > 0 && !isFiltMode && (
236
+ <SubcategoriesComponent category={category} />
237
+ )}
136
238
  <>
137
239
  {products.sort((a: any, b: any) => a.rank - b.rank).map((product: any, i: any) => (
138
240
  <SingleProductCard
139
- key={i}
241
+ key={`${product?.id}_${i}`}
140
242
  isSoldOut={product.inventoried && !product.quantity}
141
243
  businessId={businessId}
142
244
  product={product}
245
+ categoryState={categoryState}
143
246
  onProductClick={onProductClick}
247
+ handleUpdateProducts={handleUpdateProducts}
144
248
  productAddedToCartLength={currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === product?.id ? Cproduct?.quantity : 0) }, 0)}
145
249
  />
146
250
  ))}
@@ -176,6 +280,7 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
176
280
  !isBusinessLoading &&
177
281
  categoryState.products.length === 0 &&
178
282
  !errors &&
283
+ !isFiltMode &&
179
284
  !(
180
285
  (searchValue && errorQuantityProducts) ||
181
286
  (!searchValue && !errorQuantityProducts)
@@ -215,23 +320,12 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
215
320
  <OText>{e}</OText>
216
321
  </ErrorMessage>
217
322
  ))}
218
- <OModal
219
- open={!!openDescription}
220
- title={openDescription?.name}
221
- onClose={() => setOpenDescription(null)}
222
- >
223
- <ScrollView style={{ padding: 20 }}>
224
- {!!openDescription?.image && (
225
- <OIcon
226
- url={optimizeImage(openDescription?.image, 'h_100,c_limit')}
227
- width={240}
228
- height={240}
229
- style={{ borderRadius: 7.6 }}
230
- />
231
- )}
232
- <OText>{openDescription?.description}</OText>
233
- </ScrollView>
234
- </OModal>
323
+ {!!openDescription && (
324
+ <CategoryDescriptionMemoized
325
+ openDescription={openDescription}
326
+ setOpenDescription={setOpenDescription}
327
+ />
328
+ )}
235
329
  </ProductsContainer>
236
330
  );
237
331
  };
@@ -246,6 +340,15 @@ const bpStyles = StyleSheet.create({
246
340
  shadowRadius: 1,
247
341
  marginEnd: 13,
248
342
  },
343
+ categoryButtonStyle: {
344
+ borderWidth: 0,
345
+ marginLeft: 5,
346
+ marginRight: 5,
347
+ marginBottom: 10,
348
+ height: 35,
349
+ paddingLeft: 3,
350
+ paddingRight: 3,
351
+ }
249
352
  });
250
353
 
251
354
  export const BusinessProductsList = (props: BusinessProductsListParams) => {
@@ -1,4 +1,4 @@
1
- import styled from 'styled-components/native'
1
+ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const ProductsContainer = styled.View`
4
4
  `
@@ -11,4 +11,31 @@ export const ErrorMessage = styled.View`
11
11
 
12
12
  export const WrapperNotFound = styled.View`
13
13
  height: 500px;
14
- `
14
+ `
15
+
16
+ export const RibbonBox = styled.View`
17
+ margin-left: 5px;
18
+ background-color: ${(props: any) => props.theme.colors.primary};
19
+ padding: 2px 8px;
20
+ max-width: 180px;
21
+ ${(props: any) => props.bgColor && css`
22
+ background-color: ${props.bgColor};
23
+ `}
24
+ ${(props: any) => props.isRoundRect && css`
25
+ border-radius: 7.6px;
26
+ `}
27
+ ${(props: any) => props.isCapsule && css`
28
+ border-radius: 50px;
29
+ `}
30
+ `
31
+
32
+ export const SubCategoriesContainer = styled.View`
33
+ flex-direction: row;
34
+ flex-wrap: wrap;
35
+ margin-bottom: 10px;
36
+ `
37
+
38
+ export const ContainerButton = styled.View`
39
+ `
40
+
41
+ export const HeaderWrapper = styled.View``