ordering-ui-react-native 0.17.95 → 0.17.96-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 (224) hide show
  1. package/package.json +9 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +0 -20
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +3 -2
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +7 -2
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +36 -26
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +163 -123
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  21. package/themes/business/src/components/LoginForm/index.tsx +5 -2
  22. package/themes/business/src/components/MapView/index.tsx +14 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +22 -94
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +123 -96
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +202 -12
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +84 -37
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +87 -66
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +200 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  35. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  36. package/themes/business/src/components/OrdersOption/index.tsx +60 -47
  37. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  38. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  39. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +21 -29
  40. package/themes/business/src/components/PreviousOrders/OrderList.tsx +93 -0
  41. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  42. package/themes/business/src/components/PreviousOrders/index.tsx +198 -221
  43. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  44. package/themes/business/src/components/ProductItemAccordion/index.tsx +7 -1
  45. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  46. package/themes/business/src/components/StoresList/index.tsx +3 -4
  47. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  48. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  49. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  50. package/themes/business/src/components/shared/OModal.tsx +16 -9
  51. package/themes/business/src/types/index.tsx +24 -10
  52. package/themes/business/src/utils/index.tsx +29 -2
  53. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  55. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  57. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  58. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -5
  59. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  60. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  61. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  62. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  63. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  64. package/themes/original/index.tsx +7 -3
  65. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  66. package/themes/original/src/components/AddressForm/index.tsx +33 -15
  67. package/themes/original/src/components/AddressList/index.tsx +5 -8
  68. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  69. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  70. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +72 -36
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  73. package/themes/original/src/components/BusinessController/index.tsx +35 -44
  74. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  75. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  76. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  77. package/themes/original/src/components/BusinessInformation/index.tsx +140 -85
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +21 -23
  79. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  80. package/themes/original/src/components/BusinessListingSearch/index.tsx +346 -340
  81. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  82. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  83. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  84. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  85. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  86. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  87. package/themes/original/src/components/BusinessProductsListing/index.tsx +137 -32
  88. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -3
  89. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  90. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  91. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  92. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +36 -403
  94. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  95. package/themes/original/src/components/Cart/index.tsx +51 -87
  96. package/themes/original/src/components/CartContent/index.tsx +70 -30
  97. package/themes/original/src/components/CartContent/styles.tsx +6 -6
  98. package/themes/original/src/components/Checkout/index.tsx +262 -35
  99. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  100. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  101. package/themes/original/src/components/DatePicker/index.tsx +17 -0
  102. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  103. package/themes/original/src/components/DriverTips/index.tsx +12 -4
  104. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  105. package/themes/original/src/components/Favorite/index.tsx +1 -5
  106. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  107. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  108. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +42 -5
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
  110. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +84 -8
  111. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  112. package/themes/original/src/components/GoogleMap/index.tsx +63 -7
  113. package/themes/original/src/components/Home/index.tsx +13 -4
  114. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  115. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  116. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  117. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  118. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  119. package/themes/original/src/components/MessageListing/index.tsx +9 -2
  120. package/themes/original/src/components/Messages/index.tsx +15 -4
  121. package/themes/original/src/components/MomentOption/index.tsx +41 -36
  122. package/themes/original/src/components/MomentOption/styles.tsx +0 -15
  123. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  124. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +161 -49
  125. package/themes/original/src/components/MultiCheckout/index.tsx +347 -69
  126. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  127. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -1
  128. package/themes/original/src/components/MyOrders/index.tsx +12 -1
  129. package/themes/original/src/components/NavBar/index.tsx +20 -13
  130. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  131. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  132. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  133. package/themes/original/src/components/OrderDetails/index.tsx +50 -38
  134. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  135. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  136. package/themes/original/src/components/OrderProgress/index.tsx +34 -25
  137. package/themes/original/src/components/OrderSummary/index.tsx +59 -56
  138. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  139. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +13 -13
  140. package/themes/original/src/components/OrdersOption/index.tsx +43 -20
  141. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  142. package/themes/original/src/components/PageBanner/index.tsx +65 -29
  143. package/themes/original/src/components/PageBanner/styles.tsx +0 -3
  144. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  145. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  146. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  147. package/themes/original/src/components/PaymentOptions/index.tsx +100 -34
  148. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  149. package/themes/original/src/components/ProductForm/index.tsx +62 -33
  150. package/themes/original/src/components/ProductForm/styles.tsx +3 -3
  151. package/themes/original/src/components/ProductItemAccordion/index.tsx +8 -6
  152. package/themes/original/src/components/ProductOptionSubOption/index.tsx +49 -20
  153. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +10 -9
  154. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  155. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  156. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  157. package/themes/original/src/components/Promotions/index.tsx +2 -2
  158. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  159. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  160. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  161. package/themes/original/src/components/ServiceForm/index.tsx +40 -20
  162. package/themes/original/src/components/SignupForm/index.tsx +27 -16
  163. package/themes/original/src/components/SingleOrderCard/index.tsx +44 -20
  164. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  165. package/themes/original/src/components/SingleProductCard/index.tsx +13 -10
  166. package/themes/original/src/components/SingleProductCard/styles.tsx +8 -3
  167. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  168. package/themes/original/src/components/StripeCardsList/index.tsx +61 -5
  169. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  170. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  171. package/themes/original/src/components/UpsellingProducts/index.tsx +5 -10
  172. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  173. package/themes/original/src/components/UserFormDetails/index.tsx +84 -19
  174. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  175. package/themes/original/src/components/UserProfile/index.tsx +7 -25
  176. package/themes/original/src/components/UserProfileForm/index.tsx +30 -31
  177. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  178. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  179. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  180. package/themes/original/src/components/Wallets/index.tsx +51 -61
  181. package/themes/original/src/components/Wallets/styles.tsx +2 -4
  182. package/themes/original/src/components/shared/OButton.tsx +3 -3
  183. package/themes/original/src/components/shared/OInput.tsx +4 -5
  184. package/themes/original/src/components/shared/OModal.tsx +3 -3
  185. package/themes/original/src/config/constants.tsx +0 -10
  186. package/themes/original/src/types/index.tsx +32 -16
  187. package/themes/original/src/utils/index.tsx +180 -13
  188. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  189. package/src/navigators/BottomNavigator.tsx +0 -117
  190. package/src/navigators/CheckoutNavigator.tsx +0 -66
  191. package/src/navigators/HomeNavigator.tsx +0 -202
  192. package/src/navigators/NavigationRef.tsx +0 -7
  193. package/src/navigators/RootNavigator.tsx +0 -269
  194. package/src/pages/Account.tsx +0 -34
  195. package/src/pages/AddressForm.tsx +0 -62
  196. package/src/pages/AddressList.tsx +0 -24
  197. package/src/pages/BusinessProductsList.tsx +0 -81
  198. package/src/pages/BusinessesListing.tsx +0 -43
  199. package/src/pages/CartList.tsx +0 -49
  200. package/src/pages/Checkout.tsx +0 -101
  201. package/src/pages/ForgotPassword.tsx +0 -24
  202. package/src/pages/Help.tsx +0 -23
  203. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  204. package/src/pages/HelpGuide.tsx +0 -23
  205. package/src/pages/HelpOrder.tsx +0 -23
  206. package/src/pages/Home.tsx +0 -36
  207. package/src/pages/IntroductoryTutorial.tsx +0 -170
  208. package/src/pages/Login.tsx +0 -47
  209. package/src/pages/MomentOption.tsx +0 -30
  210. package/src/pages/MultiCheckout.tsx +0 -31
  211. package/src/pages/MultiOrdersDetails.tsx +0 -27
  212. package/src/pages/MyOrders.tsx +0 -40
  213. package/src/pages/NetworkError.tsx +0 -24
  214. package/src/pages/NotFound.tsx +0 -22
  215. package/src/pages/OrderDetails.tsx +0 -25
  216. package/src/pages/ProductDetails.tsx +0 -55
  217. package/src/pages/Profile.tsx +0 -36
  218. package/src/pages/ReviewDriver.tsx +0 -30
  219. package/src/pages/ReviewOrder.tsx +0 -32
  220. package/src/pages/ReviewProducts.tsx +0 -30
  221. package/src/pages/Sessions.tsx +0 -22
  222. package/src/pages/Signup.tsx +0 -53
  223. package/src/pages/SpinnerLoader.tsx +0 -10
  224. package/src/pages/Splash.tsx +0 -21
@@ -9,8 +9,7 @@ import {
9
9
  I18nManager,
10
10
  SafeAreaView,
11
11
  Platform,
12
- Button,
13
- Vibration
12
+ Button
14
13
  } from 'react-native';
15
14
  import {
16
15
  ProductForm as ProductOptions,
@@ -20,7 +19,8 @@ import {
20
19
  useUtils,
21
20
  ToastType,
22
21
  useToast,
23
- useConfig
22
+ useConfig,
23
+ useEvent
24
24
  } from 'ordering-components/native';
25
25
  import uuid from 'react-native-uuid';
26
26
  import { useTheme } from 'styled-components/native';
@@ -30,6 +30,7 @@ import Swiper from 'react-native-swiper'
30
30
  import FastImage from 'react-native-fast-image';
31
31
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
32
32
  import YoutubePlayer from "react-native-youtube-iframe"
33
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
33
34
 
34
35
  import {
35
36
  WrapHeader,
@@ -54,7 +55,7 @@ import { ProductOptionSubOption } from '../ProductOptionSubOption';
54
55
  import { NotFoundSource } from '../NotFoundSource';
55
56
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
56
57
  import NavBar from '../NavBar';
57
- import { orderTypeList } from '../../utils';
58
+ import { orderTypeList, vibrateApp } from '../../utils';
58
59
  const windowWidth = Dimensions.get('window').width;
59
60
 
60
61
  export const ProductOptionsUI = (props: any) => {
@@ -81,6 +82,7 @@ export const ProductOptionsUI = (props: any) => {
81
82
 
82
83
  const theme = useTheme();
83
84
  const [, { showToast }] = useToast()
85
+ const [events] = useEvent()
84
86
 
85
87
  const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
86
88
 
@@ -135,7 +137,8 @@ export const ProductOptionsUI = (props: any) => {
135
137
  },
136
138
  slide1: {
137
139
  flex: 1,
138
- alignItems: 'center'
140
+ alignItems: 'center',
141
+ width: '100%',
139
142
  },
140
143
  mainSwiper: {
141
144
  height: 258,
@@ -174,7 +177,7 @@ export const ProductOptionsUI = (props: any) => {
174
177
  marginTop: 10
175
178
  },
176
179
  wrapperNavbar: {
177
- paddingHorizontal: 40,
180
+ paddingHorizontal: 30,
178
181
  paddingTop: 0,
179
182
  }
180
183
  });
@@ -203,9 +206,19 @@ export const ProductOptionsUI = (props: any) => {
203
206
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
204
207
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
205
208
  const [editionsLayoutY, setEditionsLayoutY] = useState(null)
209
+ const [viewedProduct, setViewedProduct] = useState<any>(null)
210
+ const [showTitle, setShowTitle] = useState(false)
206
211
 
207
212
  const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
208
- const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
213
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
214
+
215
+ const vibrateApp = (impact?: string) => {
216
+ const options = {
217
+ enableVibrateFallback: true,
218
+ ignoreAndroidSystemSettings: false
219
+ };
220
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
221
+ }
209
222
 
210
223
  const isError = (id: number) => {
211
224
  let bgColor = theme.colors.white;
@@ -222,7 +235,7 @@ export const ProductOptionsUI = (props: any) => {
222
235
  };
223
236
 
224
237
  const handleSaveProduct = () => {
225
- Vibration.vibrate()
238
+ vibrateApp()
226
239
  if (!productCart.quantity) {
227
240
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
228
241
  return
@@ -359,12 +372,8 @@ export const ProductOptionsUI = (props: any) => {
359
372
  </>
360
373
  );
361
374
 
362
- const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
363
-
364
- const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
365
- if (_topOption) {
366
- const _topOptionId = Number(_topOption.replace('id:', ''))
367
- }
375
+ const handleScroll = ({ nativeEvent: { contentOffset } }: any) => {
376
+ setShowTitle(contentOffset.y > 30)
368
377
  }
369
378
 
370
379
  const handleGoBack = navigation?.canGoBack()
@@ -481,9 +490,9 @@ export const ProductOptionsUI = (props: any) => {
481
490
  : t('LOGIN_SIGNUP', 'Login / Sign Up')
482
491
  }
483
492
  imgRightSrc=""
484
- textStyle={{ color: theme.colors.primary, fontSize: 14 }}
493
+ textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
485
494
  style={{
486
- height: 44,
495
+ height: 42,
487
496
  borderColor: theme.colors.primary,
488
497
  backgroundColor: theme.colors.white,
489
498
  paddingLeft: 0,
@@ -495,10 +504,10 @@ export const ProductOptionsUI = (props: any) => {
495
504
  <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
496
505
  {actionStatus?.loading ? (
497
506
  <Placeholder Animation={Fade}>
498
- <PlaceholderLine width={60} height={20} />
507
+ <PlaceholderLine height={20} />
499
508
  </Placeholder>
500
509
  ) : (
501
- <OText color={theme.colors.primary} size={13}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
510
+ <OText color={theme.colors.primary} size={13} style={{ textAlign: 'center' }}>{t('AS_GUEST_USER', 'As guest user')}</OText>
502
511
  )}
503
512
  </TouchableOpacity>
504
513
  )}
@@ -515,21 +524,43 @@ export const ProductOptionsUI = (props: any) => {
515
524
  }
516
525
  }, [])
517
526
 
527
+ useEffect(() => {
528
+ if (!product?.id || product?.id === viewedProduct?.id) return
529
+ setViewedProduct(product)
530
+ events.emit('product_viewed', product)
531
+ }, [product?.id, viewedProduct])
532
+
518
533
  return (
519
534
  <SafeAreaView style={{ flex: 1 }}>
520
535
  <View style={styles.wrapperNavbar}>
521
- <NavBar
522
- onActionLeft={() => handleGoBack()}
523
- showCall={false}
524
- btnStyle={{ paddingLeft: 0 }}
525
- paddingTop={4}
526
- />
536
+ <TopHeader>
537
+ <>
538
+ <TopActions onPress={() => handleGoBack()}>
539
+ <IconAntDesign
540
+ name='arrowleft'
541
+ size={26}
542
+ />
543
+ </TopActions>
544
+ {showTitle && (
545
+ <OText
546
+ size={16}
547
+ style={{ flex: 1, textAlign: 'center' }}
548
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
549
+ numberOfLines={2}
550
+ ellipsizeMode='tail'
551
+ >
552
+ {product?.name}
553
+ </OText>
554
+ )}
555
+ </>
556
+ </TopHeader>
527
557
  </View>
528
558
  {!error && (
529
559
  <ScrollView
530
560
  ref={scrollViewRef}
531
561
  contentContainerStyle={{ paddingBottom: 80 }}
532
562
  stickyHeaderIndices={[2]}
563
+ scrollEventThrottle={100}
533
564
  onScroll={handleScroll}
534
565
  >
535
566
  <WrapHeader onLayout={(event: any) => setHeaderRefHeight(event.nativeEvent.layout?.height)}>
@@ -657,7 +688,7 @@ export const ProductOptionsUI = (props: any) => {
657
688
  )}
658
689
  </WrapHeader>
659
690
  <ProductSummary
660
- ph={isChewLayout ? 20 : 40}
691
+ ph={isChewLayout ? 20 : 30}
661
692
  onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
662
693
  >
663
694
  <ProductTitle>
@@ -727,6 +758,7 @@ export const ProductOptionsUI = (props: any) => {
727
758
  </ProductDescription>
728
759
  <ScrollView
729
760
  horizontal
761
+ scrollEventThrottle={100}
730
762
  showsHorizontalScrollIndicator={false}
731
763
  contentContainerStyle={{ paddingBottom: 30 }}
732
764
  >
@@ -754,12 +786,13 @@ export const ProductOptionsUI = (props: any) => {
754
786
  {(!loading && product) && (
755
787
  <ExtraOptionWrap
756
788
  horizontal
789
+ scrollEventThrottle={100}
757
790
  showsHorizontalScrollIndicator={false}
758
791
  style={{
759
792
  marginBottom: 20,
760
793
  borderBottomWidth: 1,
761
794
  borderBottomColor: theme.colors.border,
762
- marginHorizontal: isChewLayout ? 20 : 30,
795
+ marginHorizontal: 20,
763
796
  backgroundColor: theme.colors.backgroundPage,
764
797
  }}
765
798
  >
@@ -833,7 +866,7 @@ export const ProductOptionsUI = (props: any) => {
833
866
  </>
834
867
  ) : (
835
868
  <ProductEditions
836
- style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
869
+ style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
837
870
  onLayout={(event: any) => {
838
871
  setEditionsLayoutY(event.nativeEvent.layout?.y)
839
872
  }}
@@ -880,12 +913,7 @@ export const ProductOptionsUI = (props: any) => {
880
913
  }}>
881
914
  {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
882
915
  (suboption: any) => {
883
- const currentState =
884
- productCart.options[
885
- `id:${option.id}`
886
- ]?.suboptions[
887
- `id:${suboption.id}`
888
- ] || {};
916
+ const currentState = productCart.options[`id:${option.id}`]?.suboptions[`id:${suboption.id}`] || {};
889
917
  const balance =
890
918
  productCart.options[
891
919
  `id:${option.id}`
@@ -900,6 +928,7 @@ export const ProductOptionsUI = (props: any) => {
900
928
  balance={balance}
901
929
  option={option}
902
930
  suboption={suboption}
931
+ image={suboption.image}
903
932
  state={currentState}
904
933
  disabled={
905
934
  isSoldOut ||
@@ -8,8 +8,8 @@ export const WrapHeader = styled.View`
8
8
  export const TopActions = styled.TouchableOpacity`
9
9
  height: 60px;
10
10
  justify-content: center;
11
- padding-horizontal: 30px;
12
- width: 100px;
11
+ min-width: 30px;
12
+ padding-right: 15px;
13
13
  `;
14
14
 
15
15
  export const TopHeader = styled.View`
@@ -70,7 +70,7 @@ export const ProductActions = styled.View`
70
70
  position: absolute;
71
71
  bottom: 0px;
72
72
  padding-top: ${(props: any) => props.ios ? '20px' : '0'};
73
- padding-horizontal: 40px;
73
+ padding-horizontal: 30px;
74
74
  padding-vertical: 20px;
75
75
  width: 100%;
76
76
  flex-direction: ${(props: any) => props.isColumn ? 'column' : 'row'};
@@ -77,6 +77,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
77
77
  const [isServiceOpen, setIsServiceOpen] = useState(false)
78
78
  // const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
79
79
  // const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
80
+ const [productQuantity, setProductQuantity] = useState(product.quantity.toString())
80
81
 
81
82
  const productInfo = () => {
82
83
  if (isCartProduct) {
@@ -107,19 +108,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
107
108
  /* const toggleAccordion = () => {
108
109
  if ((!product?.valid_menu && isCartProduct)) return
109
110
  if (isActive) {
110
- Animated.timing(setHeight.height, {
111
+ Animated.timing(setHeight.height, {
111
112
  toValue: 100,
112
113
  duration: 500,
113
114
  easing: Easing.linear,
114
115
  useNativeDriver: false,
115
- }).start()
116
+ }).start()
116
117
  } else {
117
- setHeightState({height: new Animated.Value(0)})
118
+ setHeightState({height: new Animated.Value(0)})
118
119
  }
119
120
  }*/
120
121
 
121
122
  const handleChangeQuantity = (value: string) => {
122
123
  if (!orderState.loading) {
124
+ setProductQuantity(value)
123
125
  if (parseInt(value) === 0) {
124
126
  onDeleteProduct && onDeleteProduct(product)
125
127
  } else {
@@ -134,7 +136,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
134
136
  }
135
137
 
136
138
  /*useEffect(() => {
137
- toggleAccordion()
139
+ toggleAccordion()
138
140
  }, [isActive])*/
139
141
 
140
142
  const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
@@ -209,7 +211,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
209
211
  <RNPickerSelect
210
212
  items={productOptions}
211
213
  onValueChange={handleChangeQuantity}
212
- value={product.quantity.toString()}
214
+ value={productQuantity}
213
215
  style={pickerStyle}
214
216
  useNativeAndroidPickerStyle={false}
215
217
  placeholder={{}}
@@ -287,7 +289,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
287
289
  )}
288
290
  {productInfo().options.length > 0 && (
289
291
  <ProductOptionsList>
290
- {productInfo().options.map((option: any, i: number) => (
292
+ {productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any, i: number) => (
291
293
  <ProductOption key={option.id + i}>
292
294
  <OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
293
295
  {option.suboptions.map((suboption: any) => (
@@ -7,6 +7,7 @@ import {
7
7
  import { useTheme } from 'styled-components/native';
8
8
  import { StyleSheet, View } from 'react-native'
9
9
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
10
+ import FastImage from 'react-native-fast-image';
10
11
 
11
12
  import {
12
13
  Container,
@@ -14,7 +15,8 @@ import {
14
15
  QuantityControl,
15
16
  Checkbox,
16
17
  PositionControl,
17
- Circle
18
+ Circle,
19
+ Logo
18
20
  } from './styles'
19
21
  import { OIcon, OText } from '../shared'
20
22
 
@@ -29,7 +31,8 @@ export const ProductOptionSubOptionUI = (props: any) => {
29
31
  toggleSelect,
30
32
  changePosition,
31
33
  disabled,
32
- setIsScrollAvailable
34
+ setIsScrollAvailable,
35
+ image
33
36
  } = props
34
37
 
35
38
  const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
@@ -37,12 +40,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
37
40
 
38
41
  const theme = useTheme();
39
42
  const [, t] = useLanguage()
40
- const [{ parsePrice }] = useUtils()
43
+ const [{ parsePrice, optimizeImage }] = useUtils()
41
44
  const [showMessage, setShowMessage] = useState(false)
42
45
  const [isDirty, setIsDirty] = useState(false)
43
46
 
44
- const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
45
- const iconsSize = isChewLayout ? 20 : 16
47
+ const iconsSize = 20
48
+
49
+ const styles = StyleSheet.create({
50
+ icon: {
51
+ borderRadius: 7.6,
52
+ width: 60,
53
+ height: 60
54
+ },
55
+ logo: {
56
+ borderRadius: 10,
57
+ marginLeft: 3,
58
+ },
59
+ });
46
60
 
47
61
  const handleSuboptionClick = () => {
48
62
  toggleSelect()
@@ -68,7 +82,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
68
82
 
69
83
  return (
70
84
  <View>
71
- <Container>
85
+ <Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
72
86
  <IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
73
87
  {((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
74
88
  state?.selected ? (
@@ -83,12 +97,24 @@ export const ProductOptionSubOptionUI = (props: any) => {
83
97
  <OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
84
98
  )
85
99
  )}
86
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={10} style={{ flex: 1 }}>
100
+ {image && (
101
+ <Logo style={styles.logo}>
102
+ <FastImage
103
+ style={styles.icon}
104
+ source={{
105
+ uri: optimizeImage(image, 'h_100,c_limit'),
106
+ priority: FastImage.priority.normal,
107
+ }}
108
+ resizeMode={FastImage.resizeMode.cover}
109
+ />
110
+ </Logo>
111
+ )}
112
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={5} style={{ flex: 1 }}>
87
113
  {suboption?.name}
88
114
  </OText>
89
115
  </IconControl>
90
- <QuantityControl>
91
- {option?.allow_suboption_quantity && state?.selected && (
116
+ {option?.allow_suboption_quantity && state?.selected && (
117
+ <QuantityControl>
92
118
  <>
93
119
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
94
120
  <IconAntDesign
@@ -97,7 +123,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
97
123
  color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
98
124
  />
99
125
  </Checkbox>
100
- <OText size={12} mLeft={5} mRight={5}>
126
+ <OText size={12}>
101
127
  {state.quantity}
102
128
  </OText>
103
129
  <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
@@ -108,16 +134,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
108
134
  />
109
135
  </Checkbox>
110
136
  </>
111
- )}
112
- </QuantityControl>
113
- <PositionControl>
114
- {option?.with_half_option && state?.selected && (
137
+ </QuantityControl>
138
+ )}
139
+ {option?.with_half_option && state?.selected && (
140
+ <PositionControl>
115
141
  <>
116
142
  <Circle disabled={disabled} onPress={() => changePosition('left')}>
117
143
  <OIcon
118
144
  src={theme.images.general.half_l}
119
145
  color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
120
- width={16}
146
+ width={20}
147
+ height={20}
121
148
  style={styles.inverse}
122
149
  />
123
150
  </Circle>
@@ -125,21 +152,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
125
152
  <OIcon
126
153
  src={theme.images.general.half_f}
127
154
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
128
- width={16}
155
+ width={20}
156
+ height={20}
129
157
  />
130
158
  </Circle>
131
159
  <Circle disabled={disabled} onPress={() => changePosition('right')}>
132
160
  <OIcon
133
161
  src={theme.images.general.half_r}
134
162
  color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
135
- width={16}
163
+ width={20}
164
+ height={20}
136
165
  />
137
166
  </Circle>
138
167
  </>
139
- )}
140
- </PositionControl>
168
+ </PositionControl>
169
+ )}
141
170
  {price > 0 && (
142
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
171
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{ width: 70, maxWidth: 70 }}>
143
172
  + {parsePrice(price)}
144
173
  </OText>
145
174
  )}
@@ -4,35 +4,36 @@ export const Container = styled.TouchableOpacity`
4
4
  flex-direction: row;
5
5
  align-items: center;
6
6
  justify-content: space-between;
7
- padding: 10px;
8
7
  width: 100%;
9
8
  `
10
9
 
11
10
  export const IconControl = styled.TouchableOpacity`
12
11
  flex-direction: row;
13
- width: 45%;
12
+ padding: 10px 0 10px 10px;
13
+ width: 50%;
14
14
  align-items: center;
15
15
  `
16
16
 
17
17
  export const QuantityControl = styled.View`
18
18
  flex-direction: row;
19
19
  align-items: center;
20
- justify-content: flex-start;
21
- margin-horizontal: 5px;
22
- flex: 1;
23
- width: 60px;
20
+ justify-content: space-between;
21
+ width: 62px;
24
22
  `
25
23
 
26
24
  export const PositionControl = styled.View`
27
25
  flex-direction: row;
28
26
  align-items: center;
29
- margin-right: 5px;
30
- flex: 1;
31
27
  `
32
28
 
33
29
  export const Checkbox = styled.TouchableOpacity`
34
30
  `
35
31
 
36
32
  export const Circle = styled.TouchableOpacity`
37
- margin: 0 1px;
33
+ margin: 0 1.5px;
38
34
  `
35
+
36
+ export const Logo = styled.View`
37
+ height: 65px;
38
+ width: 65px;
39
+ `;
@@ -0,0 +1,108 @@
1
+ import React from 'react'
2
+ import {
3
+ useSession,
4
+ useUtils,
5
+ SingleProfessionalCard as SingleProfessionalCardController
6
+ } from 'ordering-components/native'
7
+ import { useTheme } from 'styled-components/native'
8
+ import { StyleSheet, TouchableOpacity, View } from 'react-native'
9
+ import FastImage from 'react-native-fast-image'
10
+ import { OIcon, OText } from '../../shared'
11
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
12
+
13
+ const SingleProfessionalCardUI = (props) => {
14
+ const {
15
+ professional,
16
+ handleFavoriteProfessional,
17
+ active,
18
+ handleProfessionalClick
19
+ } = props
20
+
21
+ const theme = useTheme()
22
+ const [{ auth }] = useSession()
23
+ const [{ optimizeImage }] = useUtils()
24
+
25
+ const handleChangeFavorite = () => {
26
+ if (auth) {
27
+ handleFavoriteProfessional && handleFavoriteProfessional(!professional?.favorite)
28
+ }
29
+ }
30
+
31
+ const styles = StyleSheet.create({
32
+ professionalItem: {
33
+ flexDirection: 'row',
34
+ alignItems: 'center',
35
+ borderRadius: 7.6,
36
+ padding: 11,
37
+ borderWidth: 1,
38
+ marginRight: 12,
39
+ minHeight: 64
40
+ },
41
+ photoStyle: {
42
+ width: 42,
43
+ height: 42,
44
+ borderRadius: 7.6
45
+ },
46
+ favoriteIconStyle: {
47
+ width: 16,
48
+ height: 16,
49
+ },
50
+ })
51
+
52
+ return (
53
+ <TouchableOpacity
54
+ onPress={() => handleProfessionalClick(professional)}
55
+ >
56
+ <View
57
+ style={{
58
+ ...styles.professionalItem,
59
+ borderColor: active
60
+ ? theme.colors.primary
61
+ : theme.colors.border
62
+ }}
63
+ >
64
+ {professional?.photo ? (
65
+ <FastImage
66
+ style={styles.photoStyle}
67
+ source={{
68
+ uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
69
+ priority: FastImage.priority.normal,
70
+ }}
71
+ resizeMode={FastImage.resizeMode.cover}
72
+ />
73
+ ) : (
74
+ <OIcon
75
+ src={theme?.images?.general?.user}
76
+ cover={false}
77
+ style={styles.photoStyle}
78
+ />
79
+ )}
80
+ <View style={{ marginLeft: 12 }}>
81
+ <OText
82
+ size={12}
83
+ weight={'400'}
84
+ >
85
+ {professional?.name} {professional?.lastname}
86
+ </OText>
87
+
88
+ <TouchableOpacity
89
+ onPress={() => handleChangeFavorite()}
90
+ >
91
+ {professional?.favorite
92
+ ? <IconAntDesign name='heart' size={16} color={theme.colors.danger5} />
93
+ : <IconAntDesign name='hearto' size={16} color={theme.colors.danger5} />
94
+ }
95
+ </TouchableOpacity>
96
+ </View>
97
+ </View>
98
+ </TouchableOpacity>
99
+ )
100
+ }
101
+
102
+ export const SingleProfessionalCard = (props) => {
103
+ const singleProfessionalCardProps = {
104
+ ...props,
105
+ UIComponent: SingleProfessionalCardUI
106
+ }
107
+ return <SingleProfessionalCardController {...singleProfessionalCardProps} />
108
+ }