ordering-ui-react-native 0.15.39 → 0.15.41-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 +2 -2
  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 +79 -6
  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
+ `
@@ -144,7 +144,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
144
144
 
145
145
  const validateSelectedDate = (curdate: any, menu: any) => {
146
146
  const day = moment(curdate).format('d')
147
- setIsEnabled(menu?.schedule[day]?.enabled || false)
147
+ setIsEnabled(menu?.schedule?.[day]?.enabled || false)
148
148
  }
149
149
 
150
150
  const getTimes = (curdate: any, menu: any) => {
@@ -377,7 +377,7 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
377
377
  />
378
378
  </MenuWrapper>
379
379
  )}
380
- {isPreOrderSetting && (
380
+ {isPreOrderSetting && showOrderTime && (
381
381
  <OrderTimeWrapper>
382
382
  <OText
383
383
  size={16}
@@ -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``