ordering-ui-react-native 0.15.81 → 0.15.82-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 (217) hide show
  1. package/package.json +7 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +1 -1
  5. package/src/components/AddressForm/index.tsx +18 -2
  6. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  7. package/src/components/BusinessController/index.tsx +16 -8
  8. package/src/components/BusinessInformation/index.tsx +14 -0
  9. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  10. package/src/components/BusinessesListing/index.tsx +1 -1
  11. package/src/components/Checkout/index.tsx +25 -3
  12. package/src/components/DriverTips/index.tsx +11 -6
  13. package/src/components/LanguageSelector/index.tsx +24 -15
  14. package/src/components/LoginForm/index.tsx +120 -30
  15. package/src/components/LoginForm/styles.tsx +6 -0
  16. package/src/components/NotificationSetting/index.tsx +85 -0
  17. package/src/components/OrderDetails/index.tsx +7 -21
  18. package/src/components/PaymentOptions/index.tsx +335 -365
  19. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  20. package/src/components/ReviewDriver/index.tsx +1 -1
  21. package/src/components/ReviewOrder/index.tsx +2 -1
  22. package/src/components/ReviewProducts/index.tsx +11 -0
  23. package/src/components/SignupForm/index.tsx +145 -61
  24. package/src/components/SingleProductCard/index.tsx +16 -4
  25. package/src/components/SingleProductReview/index.tsx +1 -1
  26. package/src/components/StripeElementsForm/index.tsx +25 -16
  27. package/src/components/StripeMethodForm/index.tsx +22 -24
  28. package/src/components/UpsellingProducts/index.tsx +1 -1
  29. package/src/components/UserProfileForm/index.tsx +63 -6
  30. package/src/components/UserProfileForm/styles.tsx +8 -0
  31. package/src/components/VerifyPhone/styles.tsx +1 -2
  32. package/src/components/shared/OBottomPopup.tsx +6 -2
  33. package/src/components/shared/OModal.tsx +1 -1
  34. package/src/hooks/useCountdownTimer.tsx +26 -0
  35. package/src/index.tsx +2 -0
  36. package/src/navigators/CheckoutNavigator.tsx +6 -0
  37. package/src/navigators/HomeNavigator.tsx +6 -0
  38. package/src/pages/BusinessesListing.tsx +7 -6
  39. package/src/pages/MultiCheckout.tsx +31 -0
  40. package/src/pages/MultiOrdersDetails.tsx +27 -0
  41. package/src/pages/OrderDetails.tsx +1 -1
  42. package/src/pages/ReviewDriver.tsx +2 -2
  43. package/src/pages/ReviewOrder.tsx +2 -2
  44. package/src/theme.json +0 -1
  45. package/src/types/index.tsx +18 -11
  46. package/src/utils/index.tsx +28 -29
  47. package/themes/business/index.tsx +4 -0
  48. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +100 -60
  49. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  50. package/themes/business/src/components/Chat/index.tsx +51 -91
  51. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  52. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  53. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  54. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  55. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  56. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  57. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  58. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  59. package/themes/business/src/components/OrderDetails/Delivery.tsx +28 -11
  60. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +26 -18
  61. package/themes/business/src/components/OrdersListManager/index.tsx +11 -4
  62. package/themes/business/src/components/OrdersOption/index.tsx +16 -4
  63. package/themes/business/src/components/PreviousOrders/index.tsx +7 -7
  64. package/themes/business/src/components/ProductItemAccordion/index.tsx +5 -4
  65. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  66. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  67. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  68. package/themes/business/src/components/shared/OModal.tsx +41 -38
  69. package/themes/business/src/types/index.tsx +15 -7
  70. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  71. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  72. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  73. package/themes/kiosk/src/components/BusinessMenu/index.tsx +25 -26
  74. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  75. package/themes/kiosk/src/components/Cart/index.tsx +10 -11
  76. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  77. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  78. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  79. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  80. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  81. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  82. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  83. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  84. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  85. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  86. package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
  87. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  88. package/themes/kiosk/src/components/PaymentOptions/index.tsx +55 -53
  89. package/themes/kiosk/src/components/ProductForm/index.tsx +6 -7
  90. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  91. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  92. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  93. package/themes/kiosk/src/types/index.d.ts +1 -0
  94. package/themes/original/index.tsx +22 -0
  95. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  96. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  97. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  98. package/themes/original/src/components/AddressList/index.tsx +1 -1
  99. package/themes/original/src/components/AppleLogin/index.tsx +6 -8
  100. package/themes/original/src/components/BusinessBasicInformation/index.tsx +291 -150
  101. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  102. package/themes/original/src/components/BusinessController/index.tsx +179 -96
  103. package/themes/original/src/components/BusinessController/styles.tsx +5 -0
  104. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  105. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  106. package/themes/original/src/components/BusinessListingSearch/index.tsx +234 -64
  107. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  108. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  109. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  110. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  111. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  112. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  113. package/themes/original/src/components/BusinessProductsList/index.tsx +65 -73
  114. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  115. package/themes/original/src/components/BusinessProductsListing/index.tsx +315 -176
  116. package/themes/original/src/components/BusinessProductsListing/styles.tsx +11 -0
  117. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  118. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -38
  119. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  120. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +560 -0
  121. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  122. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +661 -0
  123. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  124. package/themes/original/src/components/BusinessesListing/index.tsx +104 -462
  125. package/themes/original/src/components/Cart/index.tsx +84 -39
  126. package/themes/original/src/components/Cart/styles.tsx +4 -0
  127. package/themes/original/src/components/Checkout/index.tsx +117 -58
  128. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  129. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  130. package/themes/original/src/components/Favorite/index.tsx +92 -0
  131. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  132. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  133. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  134. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  135. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  136. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  137. package/themes/original/src/components/Help/index.tsx +21 -4
  138. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  139. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  140. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  141. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  142. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  143. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  144. package/themes/original/src/components/Messages/index.tsx +1 -1
  145. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  146. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  147. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  148. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  149. package/themes/original/src/components/MultiCheckout/index.tsx +304 -0
  150. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  151. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  152. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  153. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  154. package/themes/original/src/components/MyOrders/index.tsx +132 -27
  155. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  156. package/themes/original/src/components/NavBar/index.tsx +4 -4
  157. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  158. package/themes/original/src/components/OrderDetails/index.tsx +164 -64
  159. package/themes/original/src/components/OrderDetails/styles.tsx +5 -2
  160. package/themes/original/src/components/OrderItAgain/index.tsx +72 -0
  161. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  162. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  163. package/themes/original/src/components/OrderTypeSelector/index.tsx +77 -35
  164. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  165. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  166. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  167. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  168. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  169. package/themes/original/src/components/OrdersOption/index.tsx +139 -46
  170. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  171. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  172. package/themes/original/src/components/PaymentOptionWallet/index.tsx +15 -22
  173. package/themes/original/src/components/PaymentOptions/index.tsx +57 -37
  174. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  175. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  176. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  177. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  178. package/themes/original/src/components/ProductForm/index.tsx +712 -673
  179. package/themes/original/src/components/ProductForm/styles.tsx +9 -7
  180. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  181. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  182. package/themes/original/src/components/ProductOptionSubOption/index.tsx +13 -9
  183. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  184. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  185. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  186. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  187. package/themes/original/src/components/Promotions/index.tsx +23 -6
  188. package/themes/original/src/components/Promotions/styles.tsx +2 -0
  189. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  190. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  191. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  192. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  193. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  194. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  195. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  196. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  197. package/themes/original/src/components/SingleOrderCard/index.tsx +316 -0
  198. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  199. package/themes/original/src/components/SingleProductCard/index.tsx +196 -94
  200. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  201. package/themes/original/src/components/StripeElementsForm/index.tsx +25 -9
  202. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  203. package/themes/original/src/components/UpsellingProducts/index.tsx +0 -4
  204. package/themes/original/src/components/UserDetails/index.tsx +32 -18
  205. package/themes/original/src/components/UserFormDetails/index.tsx +108 -74
  206. package/themes/original/src/components/UserProfile/index.tsx +5 -1
  207. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  208. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  209. package/themes/original/src/components/Wallets/index.tsx +2 -2
  210. package/themes/original/src/components/shared/OBottomPopup.tsx +47 -14
  211. package/themes/original/src/components/shared/OButton.tsx +2 -0
  212. package/themes/original/src/components/shared/OInput.tsx +3 -2
  213. package/themes/original/src/components/shared/OModal.tsx +4 -2
  214. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  215. package/themes/original/src/types/index.tsx +208 -44
  216. package/themes/original/src/utils/index.tsx +94 -1
  217. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,6 +1,6 @@
1
1
  import React, { useEffect, useState } from 'react'
2
- import { useLanguage, BusinessSearchList, useOrder, useUtils } from 'ordering-components/native'
3
- import { ScrollView, StyleSheet, TouchableOpacity, Platform, View } from 'react-native'
2
+ import { useLanguage, BusinessSearchList, useOrder, useUtils, showToast, ToastType } from 'ordering-components/native'
3
+ import { ScrollView, StyleSheet, TouchableOpacity, Platform, View, Dimensions } from 'react-native'
4
4
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
5
5
  import { useTheme } from 'styled-components/native'
6
6
  import { OButton, OIcon, OModal, OText } from '../shared'
@@ -22,15 +22,21 @@ import {
22
22
  ProgressContentWrapper,
23
23
  ProgressBar,
24
24
  TagsContainer,
25
- SortContainer
25
+ SortContainer,
26
+ BrandContainer,
27
+ BrandItem,
28
+ PriceFilterWrapper,
29
+ OptionTitle
26
30
  } from './styles'
27
31
  import FastImage from 'react-native-fast-image'
28
32
  import { convertHoursToMinutes } from '../../utils'
29
33
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder'
30
34
  import { BusinessSearchParams } from '../../types'
35
+ import { MyOrders } from '../MyOrders'
36
+ import { useIsFocused } from '@react-navigation/native';
31
37
 
32
- export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
33
38
 
39
+ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
34
40
  const {
35
41
  navigation,
36
42
  businessesSearchList,
@@ -42,9 +48,15 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
42
48
  handleChangeFilters,
43
49
  filters,
44
50
  businessTypes,
45
- setFilters
51
+ setFilters,
52
+ brandList,
53
+ onNavigationRedirect,
54
+ handleUpdateBusinessList,
55
+ handleUpdateProducts
46
56
  } = props
47
57
 
58
+ const screenHeight = Dimensions.get('window').height;
59
+ const screenWidth = Dimensions.get('window').width;
48
60
  const theme = useTheme()
49
61
  const [orderState] = useOrder()
50
62
  const { top } = useSafeAreaInsets();
@@ -63,11 +75,26 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
63
75
  { text: t('PICKUP_TIME', 'Pickup time'), value: 'pickup_time' }
64
76
  ]
65
77
 
78
+ const priceList = [
79
+ { level: '1', content: '$' },
80
+ { level: '2', content: '$$' },
81
+ { level: '3', content: '$$$' },
82
+ { level: '4', content: '$$$$' },
83
+ { level: '5', content: '$$$$$' }
84
+ ]
85
+
86
+ const isFocused = useIsFocused();
87
+
66
88
  const styles = StyleSheet.create({
67
89
  container: {
68
90
  paddingHorizontal: 40,
69
91
  width: '100%'
70
92
  },
93
+ filterContainer: {
94
+ maxHeight: screenHeight - 150,
95
+ paddingHorizontal: 40,
96
+ width: '100%'
97
+ },
71
98
  searchInput: {
72
99
  fontSize: 10,
73
100
  },
@@ -84,6 +111,12 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
84
111
  flexWrap: 'wrap',
85
112
  justifyContent: 'center'
86
113
  },
114
+ priceContainer: {
115
+ width: '100%',
116
+ flexDirection: 'row',
117
+ flexWrap: 'wrap',
118
+ justifyContent: 'space-between'
119
+ },
87
120
  categoryStyle: {
88
121
  marginRight: 10,
89
122
  marginTop: 10,
@@ -95,6 +128,16 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
95
128
  height: 28,
96
129
  borderWidth: 0
97
130
  },
131
+ priceItem: {
132
+ marginRight: 10,
133
+ marginTop: 10,
134
+ borderRadius: 50,
135
+ paddingVertical: 4,
136
+ paddingLeft: 5,
137
+ paddingRight: 5,
138
+ height: 27,
139
+ borderWidth: 0
140
+ },
98
141
  applyButton: {
99
142
  paddingHorizontal: 40,
100
143
  width: '100%',
@@ -107,7 +150,7 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
107
150
  }
108
151
 
109
152
  const handleCloseFilters = () => {
110
- setFilters({ business_types: [], orderBy: 'default' })
153
+ setFilters({ business_types: [], orderBy: 'default', franchise_ids: [], price_level: null })
111
154
  setOpenFilters(false)
112
155
  }
113
156
 
@@ -126,11 +169,47 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
126
169
  }
127
170
  }
128
171
 
172
+ const handleChangeBrandFilter = (brandId: number) => {
173
+ let franchiseIds = [...filters?.franchise_ids]
174
+ if (filters?.franchise_ids?.includes(brandId)) franchiseIds = filters?.franchise_ids?.filter((item: any) => item !== brandId)
175
+ else franchiseIds.push(brandId)
176
+ handleChangeFilters && handleChangeFilters('franchise_ids', franchiseIds)
177
+ }
178
+
179
+ const handleChangePriceRange = (value: string) => {
180
+ if (value === filters?.price_level) handleChangeFilters('price_level', null)
181
+ else handleChangeFilters('price_level', value)
182
+ }
183
+
129
184
  const handleApplyFilters = () => {
130
185
  handleSearchbusinessAndProducts(true)
131
186
  setOpenFilters(false)
132
187
  }
133
188
 
189
+ const isInteger = (val: any) => Number.isInteger(Number(val)) && !!val
190
+
191
+ const onProductClick = (business: any, categoryId: any, productId: any) => {
192
+ if (!isInteger(business?.id) ||
193
+ !isInteger(categoryId) ||
194
+ !isInteger(productId) ||
195
+ !business.slug || !business.header || !business.logo) {
196
+ showToast(ToastType.error, t('NOT_AVAILABLE', 'Not Available'))
197
+ return
198
+ }
199
+
200
+ navigation.navigate('ProductDetails', {
201
+ isRedirect: 'business',
202
+ businessId: business?.id,
203
+ categoryId: categoryId,
204
+ productId: productId,
205
+ business: {
206
+ store: business.slug,
207
+ header: business.header,
208
+ logo: business.logo,
209
+ }
210
+ })
211
+ }
212
+
134
213
  useEffect(() => {
135
214
  if (filters.business_types?.length === 0 && filters.orderBy === 'default' && Object.keys(filters)?.length === 2 && !openFilters) {
136
215
  handleSearchbusinessAndProducts(true)
@@ -141,6 +220,11 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
141
220
  handleSearchbusinessAndProducts(true)
142
221
  }, [])
143
222
 
223
+
224
+ useEffect(() => {
225
+ handleChangeTermValue('')
226
+ }, [isFocused])
227
+
144
228
  const MaxSectionItem = ({ title, options, filter }: any) => {
145
229
  const parseValue = (option: number) => {
146
230
  return filter === 'max_distance'
@@ -176,12 +260,63 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
176
260
  )
177
261
  }
178
262
 
263
+ const BusinessControllerSkeletons = () => {
264
+ return (
265
+ <>
266
+ {[
267
+ ...Array(
268
+ paginationProps.nextPageItems
269
+ ? paginationProps.nextPageItems
270
+ : 3,
271
+ ).keys(),
272
+ ].map((item, i) => (
273
+ <Placeholder
274
+ Animation={Fade}
275
+ key={i}
276
+ style={{ width: 320, marginRight: 20, marginTop: 20 }}>
277
+ <View style={{ width: 320 }}>
278
+ <PlaceholderLine
279
+ height={155}
280
+ style={{ marginBottom: 20, borderRadius: 25 }}
281
+ />
282
+ <View style={{ paddingHorizontal: 10 }}>
283
+ <View
284
+ style={{
285
+ flexDirection: 'row',
286
+ justifyContent: 'space-between',
287
+ }}>
288
+ <PlaceholderLine
289
+ height={25}
290
+ width={40}
291
+ style={{ marginBottom: 10 }}
292
+ />
293
+ <PlaceholderLine
294
+ height={25}
295
+ width={20}
296
+ style={{ marginBottom: 10 }}
297
+ />
298
+ </View>
299
+ <PlaceholderLine
300
+ height={20}
301
+ width={30}
302
+ style={{ marginBottom: 10 }}
303
+ />
304
+ <PlaceholderLine
305
+ height={20}
306
+ width={80}
307
+ style={{ marginBottom: 0 }}
308
+ />
309
+ </View>
310
+ </View>
311
+ </Placeholder>
312
+ ))}
313
+ </>
314
+ )
315
+ }
316
+
179
317
  return (
180
318
  <ScrollView style={styles.container}>
181
319
  <WrapHeader style={{ paddingTop: top + 20, marginVertical: 2 }}>
182
- <TouchableOpacity onPress={() => navigation?.canGoBack() && navigation.goBack()} style={{ position: 'absolute', paddingVertical: 20 }}>
183
- <OIcon src={theme.images.general.arrow_left} width={20} />
184
- </TouchableOpacity>
185
320
  <OText
186
321
  size={20}
187
322
  mBottom={15}
@@ -193,6 +328,7 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
193
328
  </WrapHeader>
194
329
  <SearchWrapper>
195
330
  <SearchBar
331
+ autoFocus
196
332
  lazyLoad
197
333
  inputStyle={{ ...styles.searchInput, ...Platform.OS === 'ios' ? {} : { paddingBottom: 4 } }}
198
334
  placeholder={`${t('SEARCH_BUSINESSES', 'Search Businesses')} / ${t('TYPE_AT_LEAST_3_CHARACTERS', 'type at least 3 characters')}`}
@@ -211,15 +347,31 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
211
347
  </View>
212
348
  )
213
349
  }
350
+ {businessesSearchList.businesses?.length > 0 && (
351
+ <MyOrders
352
+ hideOrders
353
+ businessesSearchList={businessesSearchList}
354
+ onNavigationRedirect={onNavigationRedirect}
355
+ BusinessControllerSkeletons={BusinessControllerSkeletons}
356
+ />
357
+ )}
358
+
359
+ <OptionTitle isBusinessesSearchList={!!businessesSearchList}>
360
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={10}>
361
+ {t('BUSINESSES', 'Businesses')}
362
+ </OText>
363
+ </OptionTitle>
214
364
  <ScrollView horizontal>
215
365
  {businessesSearchList.businesses?.length > 0 && businessesSearchList.businesses.map((business: any, i: number) => (
216
366
  <BusinessController
217
367
  key={business.id}
218
368
  business={business}
219
369
  isBusinessOpen={business.open}
370
+ enableIntersection={false}
220
371
  handleCustomClick={() => onBusinessClick(business)}
372
+ handleUpdateBusinessList={handleUpdateBusinessList}
221
373
  orderType={orderState?.options?.type}
222
- style={{ width: 320, marginRight: (businessesSearchList.loading || i !== businessesSearchList.businesses?.length - 1) ? 20 : 0 }}
374
+ style={{ width: screenWidth - 120, marginRight: (businessesSearchList.loading || i !== businessesSearchList.businesses?.length - 1) ? 20 : 0 }}
223
375
  />
224
376
  ))}
225
377
  {!businessesSearchList.loading && paginationProps?.totalPages && paginationProps?.currentPage < paginationProps?.totalPages && (
@@ -234,55 +386,7 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
234
386
  </LoadMoreBusinessContainer>
235
387
  )}
236
388
  {businessesSearchList.loading && (
237
- <>
238
- {[
239
- ...Array(
240
- paginationProps.nextPageItems
241
- ? paginationProps.nextPageItems
242
- : 3,
243
- ).keys(),
244
- ].map((item, i) => (
245
- <Placeholder
246
- Animation={Fade}
247
- key={i}
248
- style={{ width: 320, marginRight: 20, marginTop: 20 }}>
249
- <View style={{ width: 320 }}>
250
- <PlaceholderLine
251
- height={155}
252
- style={{ marginBottom: 20, borderRadius: 25 }}
253
- />
254
- <View style={{ paddingHorizontal: 10 }}>
255
- <View
256
- style={{
257
- flexDirection: 'row',
258
- justifyContent: 'space-between',
259
- }}>
260
- <PlaceholderLine
261
- height={25}
262
- width={40}
263
- style={{ marginBottom: 10 }}
264
- />
265
- <PlaceholderLine
266
- height={25}
267
- width={20}
268
- style={{ marginBottom: 10 }}
269
- />
270
- </View>
271
- <PlaceholderLine
272
- height={20}
273
- width={30}
274
- style={{ marginBottom: 10 }}
275
- />
276
- <PlaceholderLine
277
- height={20}
278
- width={80}
279
- style={{ marginBottom: 0 }}
280
- />
281
- </View>
282
- </View>
283
- </Placeholder>
284
- ))}
285
- </>
389
+ <BusinessControllerSkeletons />
286
390
  )}
287
391
  </ScrollView>
288
392
  <ProductsList>
@@ -329,16 +433,18 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
329
433
  style={{ borderRadius: 50, paddingLeft: 5, paddingRight: 5, height: 20 }}
330
434
  />
331
435
  </SingleBusinessContainer>
332
- <ScrollView horizontal style={styles.productsContainer}>
436
+ <ScrollView horizontal style={styles.productsContainer} contentContainerStyle={{ flexGrow: 1 }}>
333
437
  {business?.categories?.map((category: any) => category?.products?.map((product: any, i: number) => (
334
438
  <SingleProductCard
335
439
  key={product?.id}
336
440
  isSoldOut={(product.inventoried && !product.quantity)}
337
441
  product={product}
442
+ enableIntersection={false}
338
443
  businessId={business?.id}
339
- onProductClick={() => { }}
444
+ onProductClick={(product: any) => onProductClick(business, category?.id, product?.id)}
340
445
  productAddedToCartLength={0}
341
- style={{ width: 320, marginRight: i === category?.products?.length - 1 ? 0 : 20 }}
446
+ handleUpdateProducts={(productId: number, changes: any) => handleUpdateProducts(productId, category?.id, business?.id, changes)}
447
+ style={{ width: screenWidth - 80, maxWidth: screenWidth - 80, marginRight: 20 }}
342
448
  />
343
449
  )))}
344
450
 
@@ -388,7 +494,7 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
388
494
  onCancel={() => handleCloseFilters()}
389
495
  onClose={() => handleCloseFilters()}
390
496
  >
391
- <ScrollView style={styles.container}>
497
+ <ScrollView style={styles.filterContainer}>
392
498
  <OText
393
499
  size={20}
394
500
  mBottom={15}
@@ -406,7 +512,7 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
406
512
  onPress={() => handleChangeFilters('orderBy', item?.value)}
407
513
  style={{ marginBottom: 7 }}
408
514
  >
409
- <OText
515
+ <OText
410
516
  weight={filters?.orderBy?.includes(item?.value) ? 'bold' : '500'}
411
517
  mBottom={filters?.orderBy?.includes(item?.value) ? 5 : 0}
412
518
  >
@@ -415,6 +521,70 @@ export const BusinessListingSearchUI = (props : BusinessSearchParams) => {
415
521
  </TouchableOpacity>
416
522
  ))}
417
523
  </SortContainer>
524
+ <BrandContainer>
525
+ <OText
526
+ size={16}
527
+ weight='bold'
528
+ lineHeight={24}
529
+ style={{ marginBottom: 10 }}
530
+ >
531
+ {t('BRANDS', 'Brands')}
532
+ </OText>
533
+ {!brandList?.loading && !brandList?.error && brandList?.brands?.length > 0 && (
534
+ <ScrollView
535
+ style={{ maxHeight: 300, marginBottom: 10 }}
536
+ showsVerticalScrollIndicator={true}
537
+ nestedScrollEnabled={true}
538
+ >
539
+ {brandList?.brands.map((brand: any, i: number) => brand?.enabled && (
540
+ <BrandItem
541
+ key={i}
542
+ onPress={() => handleChangeBrandFilter(brand?.id)}
543
+ >
544
+ <OText
545
+ size={14}
546
+ weight={'400'}
547
+ lineHeight={24}
548
+ >
549
+ {brand?.name}
550
+ </OText>
551
+ {filters?.franchise_ids?.includes(brand?.id) && (
552
+ <AntDesignIcon
553
+ name='check'
554
+ color={theme.colors.success500}
555
+ size={16}
556
+ />
557
+ )}
558
+ </BrandItem>
559
+ ))}
560
+ </ScrollView>
561
+ )}
562
+ {!brandList?.loading && ((brandList?.brands?.filter((brand: any) => brand?.enabled))?.length === 0) && (
563
+ <OText size={14} weight='400'>{t('NO_RESULTS_FOUND', 'Sorry, no results found')}</OText>
564
+ )}
565
+ </BrandContainer>
566
+ <PriceFilterWrapper>
567
+ <OText
568
+ size={16}
569
+ weight='bold'
570
+ lineHeight={24}
571
+ style={{ marginBottom: 5 }}
572
+ >
573
+ {t('PRICE_RANGE', 'Price range')}
574
+ </OText>
575
+ <View style={styles.priceContainer}>
576
+ {priceList.map((price: any, i: number) => (
577
+ <OButton
578
+ key={i}
579
+ bgColor={(filters?.price_level === price?.level) ? theme.colors.primary : theme.colors.backgroundGray200}
580
+ onClick={() => handleChangePriceRange(price?.level)}
581
+ text={`${price.content} ${(filters?.price_level === price?.level) ? ' X' : ''}`}
582
+ style={styles.priceItem}
583
+ textStyle={{ fontSize: 10, color: (filters?.price_level === price?.level) ? theme.colors.backgroundLight : theme.colors.textNormal }}
584
+ />
585
+ ))}
586
+ </View>
587
+ </PriceFilterWrapper>
418
588
  {orderState?.options?.type === 1 && (
419
589
  <MaxSectionItem
420
590
  title={t('MAX_DELIVERY_FEE', 'Max delivery fee')}
@@ -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) => {
@@ -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
  })
@@ -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)
@@ -0,0 +1,87 @@
1
+ import React from 'react'
2
+ import { useTheme } from 'styled-components/native'
3
+ import { StyleSheet } from 'react-native'
4
+ import { SubCategoriesContainer, ContainerButton } from './styles'
5
+ import { OButton } from '../../shared'
6
+ import { useLanguage } from 'ordering-components/native'
7
+
8
+ function SubcategoriesComponentPropsAreEqual(prev: any, next: any) {
9
+ return prev.subcategoriesSelected === next.subcategoriesSelected &&
10
+ prev.category === next.category
11
+ }
12
+
13
+ interface SubcategoriesComponentParams {
14
+ subcategoriesSelected?: any,
15
+ category?: any,
16
+ onClickSubcategory: any
17
+ }
18
+
19
+ const SubcategoriesComponent = (props : SubcategoriesComponentParams) => {
20
+ const {
21
+ subcategoriesSelected,
22
+ category,
23
+ onClickSubcategory
24
+ } = props
25
+
26
+ const theme = useTheme()
27
+ const [, t] = useLanguage()
28
+ const allsubcategorySelected = !subcategoriesSelected?.some((subcategory: any) => category?.id === subcategory?.parent_category_id)
29
+
30
+ const bpStyles = StyleSheet.create({
31
+ catWrap: { flexDirection: 'row', alignItems: 'center', marginBottom: 19 },
32
+ catIcon: {
33
+ borderRadius: 7.6,
34
+ shadowColor: '#000000',
35
+ shadowOpacity: 0.1,
36
+ shadowOffset: { width: 0, height: 0 },
37
+ shadowRadius: 1,
38
+ marginEnd: 13,
39
+ },
40
+ categoryButtonStyle: {
41
+ borderWidth: 0,
42
+ marginLeft: 5,
43
+ marginRight: 5,
44
+ marginBottom: 10,
45
+ height: 35,
46
+ paddingLeft: 3,
47
+ paddingRight: 3,
48
+ }
49
+ });
50
+
51
+
52
+ return (
53
+ <SubCategoriesContainer>
54
+ <ContainerButton
55
+ isSelected={allsubcategorySelected}
56
+ >
57
+ <OButton
58
+ onClick={() => onClickSubcategory(null, category)}
59
+ bgColor={allsubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
60
+ text={`${t('ALL', 'All')} ${allsubcategorySelected ? 'X' : ''}`}
61
+ style={bpStyles.categoryButtonStyle}
62
+ textStyle={{ color: allsubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
63
+ />
64
+ </ContainerButton>
65
+ {category?.subcategories?.map((subcategory: any) => {
66
+ const isSubcategorySelected = subcategoriesSelected?.find((_subcategory: any) => _subcategory?.id === subcategory?.id)
67
+ return (
68
+ <ContainerButton
69
+ key={subcategory?.id}
70
+ isSelected={isSubcategorySelected}
71
+ >
72
+ <OButton
73
+ onClick={() => onClickSubcategory(subcategory, category)}
74
+ bgColor={isSubcategorySelected ? theme.colors.primary : theme.colors.backgroundGray}
75
+ text={`${subcategory?.name} ${isSubcategorySelected ? 'X' : ''}`}
76
+ style={bpStyles.categoryButtonStyle}
77
+ textStyle={{ color: isSubcategorySelected ? theme.colors.white : theme.colors.textNormal, fontSize: 12 }}
78
+ />
79
+ </ContainerButton>
80
+ )
81
+ }
82
+ )}
83
+ </SubCategoriesContainer>
84
+ )
85
+ }
86
+
87
+ export const SubcategoriesComponentMemoized = React.memo(SubcategoriesComponent, SubcategoriesComponentPropsAreEqual)
@@ -0,0 +1,12 @@
1
+ import styled from "styled-components/native";
2
+
3
+ export const SubCategoriesContainer = styled.View`
4
+ flex-direction: row;
5
+ flex-wrap: wrap;
6
+ margin-bottom: 10px;
7
+ `
8
+
9
+ export const ContainerButton = styled.View`
10
+ `
11
+
12
+ export const HeaderWrapper = styled.View``