ordering-ui-react-native 0.17.75 → 0.17.76-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 (225) hide show
  1. package/package.json +8 -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 +1 -21
  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 +5 -0
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +28 -25
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +149 -118
  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/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  21. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +20 -93
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +128 -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 +191 -6
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +102 -40
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +61 -60
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -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/OrdersOption/index.tsx +20 -22
  35. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  36. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +17 -12
  38. package/themes/business/src/components/PreviousOrders/OrderList.tsx +88 -0
  39. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  40. package/themes/business/src/components/PreviousOrders/index.tsx +139 -174
  41. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  42. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  43. package/themes/business/src/components/StoresList/index.tsx +3 -4
  44. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  45. package/themes/business/src/components/shared/OLink.tsx +9 -2
  46. package/themes/business/src/components/shared/OModal.tsx +16 -9
  47. package/themes/business/src/components/shared/OText.tsx +6 -1
  48. package/themes/business/src/types/index.tsx +25 -10
  49. package/themes/business/src/utils/index.tsx +29 -2
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  54. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  55. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +1 -1
  62. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  63. package/themes/original/src/components/AddressForm/index.tsx +61 -39
  64. package/themes/original/src/components/AddressList/index.tsx +11 -6
  65. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  66. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  67. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  68. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  69. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  70. package/themes/original/src/components/BusinessController/index.tsx +81 -68
  71. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  72. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  73. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  74. package/themes/original/src/components/BusinessInformation/index.tsx +140 -85
  75. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  76. package/themes/original/src/components/BusinessListingSearch/index.tsx +348 -340
  77. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  78. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  79. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  80. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  81. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  82. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  83. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -559
  84. package/themes/original/src/components/BusinessProductsListing/styles.tsx +1 -1
  85. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  86. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +69 -38
  87. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  88. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  89. package/themes/original/src/components/Cart/index.tsx +76 -79
  90. package/themes/original/src/components/CartContent/index.tsx +112 -19
  91. package/themes/original/src/components/CartContent/styles.tsx +16 -6
  92. package/themes/original/src/components/Checkout/index.tsx +281 -55
  93. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  94. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  95. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  96. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  97. package/themes/original/src/components/Favorite/index.tsx +2 -6
  98. package/themes/original/src/components/FavoriteList/index.tsx +1 -35
  99. package/themes/original/src/components/FloatingButton/index.tsx +10 -13
  100. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  101. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +7 -3
  102. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
  103. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +19 -6
  104. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  105. package/themes/original/src/components/GoogleMap/index.tsx +60 -5
  106. package/themes/original/src/components/Help/index.tsx +2 -2
  107. package/themes/original/src/components/HelpGuide/index.tsx +2 -2
  108. package/themes/original/src/components/HelpGuide/styles.tsx +1 -0
  109. package/themes/original/src/components/Home/index.tsx +13 -4
  110. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  111. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  112. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  113. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  114. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  115. package/themes/original/src/components/Messages/index.tsx +14 -7
  116. package/themes/original/src/components/MomentOption/index.tsx +193 -90
  117. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  118. package/themes/original/src/components/MultiCart/index.tsx +41 -54
  119. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -50
  120. package/themes/original/src/components/MultiCheckout/index.tsx +329 -100
  121. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  122. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  123. package/themes/original/src/components/MultiOrdersDetails/index.tsx +54 -21
  124. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  125. package/themes/original/src/components/MyOrders/index.tsx +37 -24
  126. package/themes/original/src/components/NavBar/index.tsx +20 -12
  127. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  128. package/themes/original/src/components/Notifications/styles.tsx +1 -5
  129. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  130. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  131. package/themes/original/src/components/OrderDetails/index.tsx +28 -233
  132. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  133. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  134. package/themes/original/src/components/OrderProgress/index.tsx +30 -56
  135. package/themes/original/src/components/OrderSummary/index.tsx +83 -57
  136. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  137. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  138. package/themes/original/src/components/OrdersOption/index.tsx +67 -85
  139. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  140. package/themes/original/src/components/PageBanner/index.tsx +98 -38
  141. package/themes/original/src/components/PageBanner/styles.tsx +0 -10
  142. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  143. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  144. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  145. package/themes/original/src/components/PaymentOptions/index.tsx +77 -34
  146. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  147. package/themes/original/src/components/ProductForm/index.tsx +101 -34
  148. package/themes/original/src/components/ProductForm/styles.tsx +3 -3
  149. package/themes/original/src/components/ProductItemAccordion/index.tsx +8 -6
  150. package/themes/original/src/components/ProductOptionSubOption/index.tsx +20 -18
  151. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -9
  152. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  153. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  154. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  155. package/themes/original/src/components/Promotions/index.tsx +2 -2
  156. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  157. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  158. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  159. package/themes/original/src/components/ServiceForm/index.tsx +63 -20
  160. package/themes/original/src/components/Sessions/index.tsx +11 -8
  161. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  162. package/themes/original/src/components/SignupForm/index.tsx +43 -27
  163. package/themes/original/src/components/SingleOrderCard/index.tsx +102 -63
  164. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  165. package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
  166. package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
  167. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  168. package/themes/original/src/components/StripeCardsList/index.tsx +49 -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 +238 -224
  172. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  173. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  174. package/themes/original/src/components/UserFormDetails/index.tsx +78 -9
  175. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  176. package/themes/original/src/components/UserProfile/index.tsx +87 -76
  177. package/themes/original/src/components/UserProfileForm/index.tsx +10 -3
  178. package/themes/original/src/components/UserProfileForm/styles.tsx +1 -1
  179. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  180. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  181. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  182. package/themes/original/src/components/Wallets/index.tsx +56 -33
  183. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  184. package/themes/original/src/components/shared/OButton.tsx +6 -2
  185. package/themes/original/src/components/shared/OInput.tsx +6 -1
  186. package/themes/original/src/components/shared/OModal.tsx +3 -3
  187. package/themes/original/src/types/index.tsx +39 -10
  188. package/themes/original/src/utils/index.tsx +273 -1
  189. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  190. package/src/navigators/BottomNavigator.tsx +0 -117
  191. package/src/navigators/CheckoutNavigator.tsx +0 -66
  192. package/src/navigators/HomeNavigator.tsx +0 -202
  193. package/src/navigators/NavigationRef.tsx +0 -7
  194. package/src/navigators/RootNavigator.tsx +0 -269
  195. package/src/pages/Account.tsx +0 -34
  196. package/src/pages/AddressForm.tsx +0 -62
  197. package/src/pages/AddressList.tsx +0 -24
  198. package/src/pages/BusinessProductsList.tsx +0 -81
  199. package/src/pages/BusinessesListing.tsx +0 -43
  200. package/src/pages/CartList.tsx +0 -49
  201. package/src/pages/Checkout.tsx +0 -101
  202. package/src/pages/ForgotPassword.tsx +0 -24
  203. package/src/pages/Help.tsx +0 -23
  204. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  205. package/src/pages/HelpGuide.tsx +0 -23
  206. package/src/pages/HelpOrder.tsx +0 -23
  207. package/src/pages/Home.tsx +0 -36
  208. package/src/pages/IntroductoryTutorial.tsx +0 -170
  209. package/src/pages/Login.tsx +0 -47
  210. package/src/pages/MomentOption.tsx +0 -30
  211. package/src/pages/MultiCheckout.tsx +0 -31
  212. package/src/pages/MultiOrdersDetails.tsx +0 -27
  213. package/src/pages/MyOrders.tsx +0 -40
  214. package/src/pages/NetworkError.tsx +0 -24
  215. package/src/pages/NotFound.tsx +0 -22
  216. package/src/pages/OrderDetails.tsx +0 -25
  217. package/src/pages/ProductDetails.tsx +0 -55
  218. package/src/pages/Profile.tsx +0 -36
  219. package/src/pages/ReviewDriver.tsx +0 -30
  220. package/src/pages/ReviewOrder.tsx +0 -32
  221. package/src/pages/ReviewProducts.tsx +0 -30
  222. package/src/pages/Sessions.tsx +0 -22
  223. package/src/pages/Signup.tsx +0 -53
  224. package/src/pages/SpinnerLoader.tsx +0 -10
  225. 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,
@@ -19,8 +18,11 @@ import {
19
18
  useOrder,
20
19
  useUtils,
21
20
  ToastType,
22
- useToast
21
+ useToast,
22
+ useConfig,
23
+ useEvent
23
24
  } from 'ordering-components/native';
25
+ import uuid from 'react-native-uuid';
24
26
  import { useTheme } from 'styled-components/native';
25
27
  import { ProductIngredient } from '../ProductIngredient';
26
28
  import { ProductOption } from '../ProductOption';
@@ -28,6 +30,7 @@ import Swiper from 'react-native-swiper'
28
30
  import FastImage from 'react-native-fast-image';
29
31
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
30
32
  import YoutubePlayer from "react-native-youtube-iframe"
33
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
31
34
 
32
35
  import {
33
36
  WrapHeader,
@@ -51,6 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
51
54
  import { ProductOptionSubOption } from '../ProductOptionSubOption';
52
55
  import { NotFoundSource } from '../NotFoundSource';
53
56
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
57
+ import NavBar from '../NavBar';
58
+ import { orderTypeList, vibrateApp } from '../../utils';
54
59
  const windowWidth = Dimensions.get('window').width;
55
60
 
56
61
  export const ProductOptionsUI = (props: any) => {
@@ -70,13 +75,16 @@ export const ProductOptionsUI = (props: any) => {
70
75
  handleChangeSuboptionState,
71
76
  handleChangeCommentState,
72
77
  productObject,
73
- productAddedToCartLength
78
+ productAddedToCartLength,
79
+ actionStatus,
80
+ handleCreateGuestUser
74
81
  } = props;
75
82
 
76
83
  const theme = useTheme();
77
84
  const [, { showToast }] = useToast()
85
+ const [events] = useEvent()
78
86
 
79
- const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
87
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
80
88
 
81
89
  const styles = StyleSheet.create({
82
90
  mainContainer: {
@@ -166,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
166
174
  justifyContent: 'space-between',
167
175
  width: '100%',
168
176
  marginTop: 10
177
+ },
178
+ wrapperNavbar: {
179
+ paddingHorizontal: 30,
180
+ paddingTop: 0,
169
181
  }
170
182
  });
171
183
 
@@ -173,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
173
185
  const [, t] = useLanguage();
174
186
  const [orderState] = useOrder();
175
187
  const [{ auth }] = useSession();
188
+ const [{ configs }] = useConfig()
176
189
  const { product, loading, error } = productObject;
177
190
  const [gallery, setGallery] = useState([])
178
191
  const [thumbsSwiper, setThumbsSwiper] = useState(0)
@@ -192,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
192
205
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
193
206
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
194
207
  const [editionsLayoutY, setEditionsLayoutY] = useState(null)
208
+ const [viewedProduct, setViewedProduct] = useState<any>(null)
209
+ const [showTitle, setShowTitle] = useState(false)
210
+
211
+ const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
212
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
213
+
214
+ const vibrateApp = (impact?: string) => {
215
+ const options = {
216
+ enableVibrateFallback: true,
217
+ ignoreAndroidSystemSettings: false
218
+ };
219
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
220
+ }
195
221
 
196
222
  const isError = (id: number) => {
197
223
  let bgColor = theme.colors.white;
@@ -208,12 +234,12 @@ export const ProductOptionsUI = (props: any) => {
208
234
  };
209
235
 
210
236
  const handleSaveProduct = () => {
211
- Vibration.vibrate()
237
+ vibrateApp()
212
238
  if (!productCart.quantity) {
213
239
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
214
240
  return
215
241
  }
216
- const isErrors = Object.values(errors).length > 0;
242
+ const isErrors = Object.values(errors)?.length > 0;
217
243
  if (!isErrors) {
218
244
  handleSave && handleSave();
219
245
  return;
@@ -232,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
232
258
  };
233
259
 
234
260
  const handleChangeMainIndex = (index: number) => {
235
- if (index < 0 || index > gallery.length - 1) {
261
+ if (index < 0 || index > gallery?.length - 1) {
236
262
  setThumbsSwiper(0)
237
263
  return
238
264
  }
@@ -275,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
275
301
  }
276
302
 
277
303
  const scrollDown = (id: any) => {
278
- const isErrors = Object.values(errors).length > 0
304
+ const isErrors = Object.values(errors)?.length > 0
279
305
  if (!isErrors) {
280
306
  return
281
307
  }
@@ -289,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
289
315
  }
290
316
  }
291
317
 
318
+ const handleUpdateGuest = () => {
319
+ const guestToken = uuid.v4()
320
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
321
+ }
322
+
292
323
  const handleOnLayout = (event: any, optionId: any) => {
293
324
  const _optionLayout = { ...optionLayout }
294
325
  const optionKey = 'id:' + optionId
@@ -299,7 +330,7 @@ export const ProductOptionsUI = (props: any) => {
299
330
  const saveErrors =
300
331
  orderState.loading ||
301
332
  maxProductQuantity === 0 ||
302
- Object.keys(errors).length > 0;
333
+ Object.keys(errors)?.length > 0;
303
334
 
304
335
 
305
336
  const ExtraOptions = ({ eID, options }: any) => (
@@ -341,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
341
372
  );
342
373
 
343
374
  const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
344
-
375
+ setShowTitle(contentOffset.y > 30)
345
376
  const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
346
377
  if (_topOption) {
347
378
  const _topOptionId = Number(_topOption.replace('id:', ''))
@@ -366,14 +397,14 @@ export const ProductOptionsUI = (props: any) => {
366
397
  ? product.images
367
398
  : theme?.images?.dummies?.product)
368
399
 
369
- if (product?.gallery && product?.gallery.length > 0) {
400
+ if (product?.gallery && product?.gallery?.length > 0) {
370
401
  for (const img of product?.gallery) {
371
402
  if (img?.file) {
372
403
  imageList.push(img?.file)
373
404
  }
374
405
  if (img?.video) {
375
406
  const keys = img?.video.split('/')
376
- let _videoId = keys[keys.length - 1]
407
+ let _videoId = keys[keys?.length - 1]
377
408
 
378
409
  if (_videoId.includes('watch')) {
379
410
  const __url = _videoId.split('=')[1]
@@ -388,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
388
419
  } else if (_videoId.search(/\?/i) >= 0) {
389
420
  _videoId = _videoId.split('?')[0]
390
421
  }
391
- if ((_videoId.length === 11)) {
422
+ if ((_videoId?.length === 11)) {
392
423
  videoList.push(_videoId)
393
424
  }
394
425
  }
@@ -462,14 +493,27 @@ export const ProductOptionsUI = (props: any) => {
462
493
  : t('LOGIN_SIGNUP', 'Login / Sign Up')
463
494
  }
464
495
  imgRightSrc=""
465
- textStyle={{ color: theme.colors.primary, fontSize: 14 }}
496
+ textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
466
497
  style={{
467
- height: 44,
498
+ height: 42,
468
499
  borderColor: theme.colors.primary,
469
500
  backgroundColor: theme.colors.white,
501
+ paddingLeft: 0,
502
+ paddingRight: 0
470
503
  }}
471
504
  />
472
505
  )}
506
+ {!auth && guestCheckoutEnabled && orderTypeEnabled && (
507
+ <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
508
+ {actionStatus?.loading ? (
509
+ <Placeholder Animation={Fade}>
510
+ <PlaceholderLine width={60} height={20} />
511
+ </Placeholder>
512
+ ) : (
513
+ <OText color={theme.colors.primary} size={13} style={{ textAlign: 'center' }}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
514
+ )}
515
+ </TouchableOpacity>
516
+ )}
473
517
  </View>
474
518
  )
475
519
  }
@@ -483,14 +527,37 @@ export const ProductOptionsUI = (props: any) => {
483
527
  }
484
528
  }, [])
485
529
 
530
+ useEffect(() => {
531
+ if (!product?.id || product?.id === viewedProduct?.id) return
532
+ setViewedProduct(product)
533
+ events.emit('product_viewed', product)
534
+ }, [product?.id, viewedProduct])
486
535
 
487
536
  return (
488
537
  <SafeAreaView style={{ flex: 1 }}>
489
- <TopHeader>
490
- <TopActions onPress={() => handleGoBack()}>
491
- <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
492
- </TopActions>
493
- </TopHeader>
538
+ <View style={styles.wrapperNavbar}>
539
+ <TopHeader>
540
+ <>
541
+ <TopActions onPress={() => handleGoBack()}>
542
+ <IconAntDesign
543
+ name='arrowleft'
544
+ size={26}
545
+ />
546
+ </TopActions>
547
+ {showTitle && (
548
+ <OText
549
+ size={16}
550
+ style={{ flex: 1, textAlign: 'center' }}
551
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
552
+ numberOfLines={2}
553
+ ellipsizeMode='tail'
554
+ >
555
+ {product?.name}
556
+ </OText>
557
+ )}
558
+ </>
559
+ </TopHeader>
560
+ </View>
494
561
  {!error && (
495
562
  <ScrollView
496
563
  ref={scrollViewRef}
@@ -539,14 +606,14 @@ export const ProductOptionsUI = (props: any) => {
539
606
  </View>
540
607
  }
541
608
  >
542
- {gallery && gallery.length > 0 && gallery.map((img, i) => (
609
+ {gallery && gallery?.length > 0 && gallery.map((img, i) => (
543
610
  <View
544
611
  style={styles.slide1}
545
612
  key={i}
546
613
  >
547
614
  {(String(img).includes('http') || typeof img === 'number') ? (
548
615
  <FastImage
549
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 3 / 2 }}
616
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
550
617
  source={typeof img !== 'number' ? {
551
618
  uri: optimizeImage(img, 'h_1024,c_limit'),
552
619
  priority: FastImage.priority.normal,
@@ -574,7 +641,7 @@ export const ProductOptionsUI = (props: any) => {
574
641
  paddingVertical: 15
575
642
  }}
576
643
  >
577
- {gallery.length > 0 && gallery.map((img, index) => (
644
+ {gallery?.length > 1 && gallery.map((img, index) => (
578
645
  <TouchableOpacity
579
646
  key={index}
580
647
  onPress={() => handleClickThumb(index)}
@@ -623,7 +690,7 @@ export const ProductOptionsUI = (props: any) => {
623
690
  )}
624
691
  </WrapHeader>
625
692
  <ProductSummary
626
- ph={isChewLayout ? 20 : 40}
693
+ ph={isChewLayout ? 20 : 30}
627
694
  onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
628
695
  >
629
696
  <ProductTitle>
@@ -725,11 +792,11 @@ export const ProductOptionsUI = (props: any) => {
725
792
  marginBottom: 20,
726
793
  borderBottomWidth: 1,
727
794
  borderBottomColor: theme.colors.border,
728
- marginHorizontal: isChewLayout ? 20 : 30,
795
+ marginHorizontal: 20,
729
796
  backgroundColor: theme.colors.backgroundPage,
730
797
  }}
731
798
  >
732
- {product?.ingredients.length > 0 && (
799
+ {product?.ingredients?.length > 0 && (
733
800
  <TouchableOpacity
734
801
  key={`eopt_key_01`}
735
802
  onPress={() => {
@@ -754,7 +821,7 @@ export const ProductOptionsUI = (props: any) => {
754
821
  </OText>
755
822
  </TouchableOpacity>
756
823
  )}
757
- {product?.extras.map((extra: any) =>
824
+ {product?.extras?.map((extra: any) =>
758
825
  <ExtraOptions key={extra.id} options={extra.options} />
759
826
  )}
760
827
  </ExtraOptionWrap>
@@ -799,13 +866,13 @@ export const ProductOptionsUI = (props: any) => {
799
866
  </>
800
867
  ) : (
801
868
  <ProductEditions
802
- style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
869
+ style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
803
870
  onLayout={(event: any) => {
804
871
  setEditionsLayoutY(event.nativeEvent.layout?.y)
805
872
  }}
806
873
  >
807
874
  <>
808
- {product?.ingredients.length > 0 && (
875
+ {product?.ingredients?.length > 0 && (
809
876
  <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
810
877
  <SectionTitle>
811
878
  <OText size={16}>
@@ -827,8 +894,8 @@ export const ProductOptionsUI = (props: any) => {
827
894
  </WrapperIngredients>
828
895
  </View>
829
896
  )}
830
- {product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
831
- extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
897
+ {product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
898
+ extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
832
899
  const currentState =
833
900
  productCart.options[`id:${option.id}`] || {};
834
901
  return (
@@ -844,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
844
911
  backgroundColor: isError(option.id),
845
912
  borderRadius: 7.6
846
913
  }}>
847
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
914
+ {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
848
915
  (suboption: any) => {
849
916
  const currentState =
850
917
  productCart.options[
@@ -909,7 +976,7 @@ export const ProductOptionsUI = (props: any) => {
909
976
  )}
910
977
  </ProductEditions>
911
978
  )}
912
- {!!error && error.length > 0 && (
979
+ {!!error && error?.length > 0 && (
913
980
  <NotFoundSource content={error[0]?.message || error[0]} />
914
981
  )}
915
982
  </ScrollView>
@@ -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) => (
@@ -32,7 +32,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
32
32
  setIsScrollAvailable
33
33
  } = props
34
34
 
35
- const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
35
+ const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
36
36
  const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
37
37
 
38
38
  const theme = useTheme();
@@ -41,8 +41,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
41
41
  const [showMessage, setShowMessage] = useState(false)
42
42
  const [isDirty, setIsDirty] = useState(false)
43
43
 
44
- const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
45
- const iconsSize = isChewLayout ? 20 : 16
44
+ const iconsSize = 20
46
45
 
47
46
  const handleSuboptionClick = () => {
48
47
  toggleSelect()
@@ -68,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
68
67
 
69
68
  return (
70
69
  <View>
71
- <Container>
70
+ <Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
72
71
  <IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
73
72
  {((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
74
73
  state?.selected ? (
@@ -83,12 +82,12 @@ export const ProductOptionSubOptionUI = (props: any) => {
83
82
  <OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
84
83
  )
85
84
  )}
86
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={10} style={{ flex: 1 }}>
85
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={5} style={{ flex: 1 }}>
87
86
  {suboption?.name}
88
87
  </OText>
89
88
  </IconControl>
90
- <QuantityControl>
91
- {option?.allow_suboption_quantity && state?.selected && (
89
+ {option?.allow_suboption_quantity && state?.selected && (
90
+ <QuantityControl>
92
91
  <>
93
92
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
94
93
  <IconAntDesign
@@ -97,7 +96,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
97
96
  color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
98
97
  />
99
98
  </Checkbox>
100
- <OText size={12} mLeft={5} mRight={5}>
99
+ <OText size={12}>
101
100
  {state.quantity}
102
101
  </OText>
103
102
  <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
@@ -108,16 +107,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
108
107
  />
109
108
  </Checkbox>
110
109
  </>
111
- )}
112
- </QuantityControl>
113
- <PositionControl>
114
- {option?.with_half_option && state?.selected && (
110
+ </QuantityControl>
111
+ )}
112
+ {option?.with_half_option && state?.selected && (
113
+ <PositionControl>
115
114
  <>
116
115
  <Circle disabled={disabled} onPress={() => changePosition('left')}>
117
116
  <OIcon
118
117
  src={theme.images.general.half_l}
119
118
  color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
120
- width={16}
119
+ width={20}
120
+ height={20}
121
121
  style={styles.inverse}
122
122
  />
123
123
  </Circle>
@@ -125,21 +125,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
125
125
  <OIcon
126
126
  src={theme.images.general.half_f}
127
127
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
128
- width={16}
128
+ width={20}
129
+ height={20}
129
130
  />
130
131
  </Circle>
131
132
  <Circle disabled={disabled} onPress={() => changePosition('right')}>
132
133
  <OIcon
133
134
  src={theme.images.general.half_r}
134
135
  color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
135
- width={16}
136
+ width={20}
137
+ height={20}
136
138
  />
137
139
  </Circle>
138
140
  </>
139
- )}
140
- </PositionControl>
141
+ </PositionControl>
142
+ )}
141
143
  {price > 0 && (
142
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
144
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{width: 70, maxWidth: 70}}>
143
145
  + {parsePrice(price)}
144
146
  </OText>
145
147
  )}
@@ -4,35 +4,31 @@ 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: 35%;
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
  `
@@ -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
+ }