ordering-ui-react-native 0.17.13 → 0.17.14-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 (211) hide show
  1. package/package.json +5 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/OrderCreating/index.tsx +1 -21
  5. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  6. package/src/components/StripeMethodForm/index.tsx +108 -77
  7. package/src/components/VerifyPhone/styles.tsx +1 -2
  8. package/src/components/shared/OToast.tsx +4 -4
  9. package/src/types/index.tsx +5 -0
  10. package/src/utils/index.tsx +7 -1
  11. package/themes/business/index.tsx +2 -0
  12. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  13. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  14. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  15. package/themes/business/src/components/Chat/index.tsx +118 -107
  16. package/themes/business/src/components/DriverMap/index.tsx +17 -7
  17. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  18. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  19. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  20. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  21. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +43 -50
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +90 -47
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  28. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  29. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  30. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  31. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  33. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  34. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  36. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  37. package/themes/business/src/components/ReviewCustomer/index.tsx +41 -24
  38. package/themes/business/src/components/StoresList/index.tsx +2 -2
  39. package/themes/business/src/components/shared/OLink.tsx +33 -13
  40. package/themes/business/src/components/shared/OModal.tsx +16 -9
  41. package/themes/business/src/components/shared/OText.tsx +8 -2
  42. package/themes/business/src/types/index.tsx +32 -2
  43. package/themes/business/src/utils/index.tsx +44 -1
  44. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  46. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  47. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  48. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  49. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  50. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  51. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  52. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  53. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  54. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  55. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  56. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  57. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  58. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  61. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  62. package/themes/kiosk/src/types/index.d.ts +13 -0
  63. package/themes/kiosk/src/utils/index.tsx +15 -0
  64. package/themes/original/index.tsx +10 -2
  65. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  66. package/themes/original/src/components/AddressForm/index.tsx +41 -16
  67. package/themes/original/src/components/AddressList/index.tsx +26 -21
  68. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  69. package/themes/original/src/components/AnalyticsSegment/index.tsx +195 -12
  70. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +125 -82
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -4
  73. package/themes/original/src/components/BusinessController/index.tsx +145 -68
  74. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  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 +10 -31
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
  79. package/themes/original/src/components/BusinessListingSearch/index.tsx +350 -323
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +97 -16
  81. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  82. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  83. package/themes/original/src/components/BusinessProductsListing/index.tsx +617 -492
  84. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -13
  85. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  86. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -3
  87. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +105 -78
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  90. package/themes/original/src/components/BusinessesListing/index.tsx +5 -3
  91. package/themes/original/src/components/Cart/index.tsx +88 -43
  92. package/themes/original/src/components/CartContent/index.tsx +110 -19
  93. package/themes/original/src/components/CartContent/styles.tsx +15 -1
  94. package/themes/original/src/components/Checkout/index.tsx +323 -178
  95. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  96. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  97. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  98. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  99. package/themes/original/src/components/DriverTips/index.tsx +52 -37
  100. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  101. package/themes/original/src/components/Favorite/index.tsx +7 -4
  102. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  103. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  104. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  105. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  106. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  107. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  108. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +178 -0
  112. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  113. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  114. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  115. package/themes/original/src/components/Help/index.tsx +8 -8
  116. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  117. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  119. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  120. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  121. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  122. package/themes/original/src/components/Home/index.tsx +13 -4
  123. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  124. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  125. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  126. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  127. package/themes/original/src/components/LoginForm/index.tsx +48 -19
  128. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  129. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  130. package/themes/original/src/components/Messages/index.tsx +32 -10
  131. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  132. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  133. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +195 -116
  134. package/themes/original/src/components/MultiCheckout/index.tsx +262 -83
  135. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  136. package/themes/original/src/components/MultiOrdersDetails/index.tsx +67 -20
  137. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  138. package/themes/original/src/components/MyOrders/index.tsx +66 -17
  139. package/themes/original/src/components/NavBar/index.tsx +6 -11
  140. package/themes/original/src/components/Notifications/index.tsx +144 -0
  141. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  142. package/themes/original/src/components/OrderDetails/OrderEta.tsx +61 -0
  143. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +10 -3
  144. package/themes/original/src/components/OrderDetails/index.tsx +262 -347
  145. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  146. package/themes/original/src/components/OrderItAgain/index.tsx +47 -43
  147. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  148. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  149. package/themes/original/src/components/OrderSummary/index.tsx +67 -29
  150. package/themes/original/src/components/OrderTypeSelector/index.tsx +3 -2
  151. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +28 -19
  152. package/themes/original/src/components/OrdersOption/index.tsx +99 -89
  153. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  154. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  155. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  156. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  157. package/themes/original/src/components/PaymentOptions/index.tsx +34 -6
  158. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  159. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  160. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  161. package/themes/original/src/components/ProductForm/index.tsx +231 -253
  162. package/themes/original/src/components/ProductForm/styles.tsx +4 -7
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +197 -138
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  165. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  166. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  167. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  168. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  169. package/themes/original/src/components/Promotions/index.tsx +234 -220
  170. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  171. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  172. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  173. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  174. package/themes/original/src/components/ReviewProducts/index.tsx +7 -4
  175. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  176. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  177. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  178. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  179. package/themes/original/src/components/ServiceForm/index.tsx +358 -275
  180. package/themes/original/src/components/Sessions/index.tsx +11 -8
  181. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  182. package/themes/original/src/components/SignupForm/index.tsx +82 -67
  183. package/themes/original/src/components/SingleOrderCard/index.tsx +148 -62
  184. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -9
  185. package/themes/original/src/components/SingleProductCard/index.tsx +99 -55
  186. package/themes/original/src/components/SingleProductCard/styles.tsx +27 -13
  187. package/themes/original/src/components/SingleProductReview/index.tsx +8 -2
  188. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  189. package/themes/original/src/components/StripeCardsList/index.tsx +9 -2
  190. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -15
  191. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -218
  192. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  193. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  194. package/themes/original/src/components/UserFormDetails/index.tsx +53 -54
  195. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  196. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  197. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  198. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  199. package/themes/original/src/components/Wallets/index.tsx +31 -17
  200. package/themes/original/src/components/Wallets/styles.tsx +2 -0
  201. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  202. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  203. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  204. package/themes/original/src/components/shared/OButton.tsx +6 -2
  205. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  206. package/themes/original/src/components/shared/OInput.tsx +10 -1
  207. package/themes/original/src/components/shared/OModal.tsx +3 -3
  208. package/themes/original/src/layouts/Container.tsx +13 -9
  209. package/themes/original/src/types/index.tsx +43 -9
  210. package/themes/original/src/utils/index.tsx +375 -58
  211. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,15 +1,16 @@
1
1
  import React, { useEffect, useRef, useState, useCallback } from 'react';
2
2
  import {
3
- View,
4
- Keyboard,
5
- TextInput,
6
- TouchableOpacity,
7
- StyleSheet,
8
- Dimensions,
9
- I18nManager,
10
- SafeAreaView,
11
- Platform,
12
- Button
3
+ View,
4
+ Keyboard,
5
+ TextInput,
6
+ TouchableOpacity,
7
+ StyleSheet,
8
+ Dimensions,
9
+ I18nManager,
10
+ SafeAreaView,
11
+ Platform,
12
+ Button,
13
+ Vibration
13
14
  } from 'react-native';
14
15
  import {
15
16
  ProductForm as ProductOptions,
@@ -18,8 +19,11 @@ import {
18
19
  useOrder,
19
20
  useUtils,
20
21
  ToastType,
21
- useToast
22
+ useToast,
23
+ useConfig,
24
+ useEvent
22
25
  } from 'ordering-components/native';
26
+ import uuid from 'react-native-uuid';
23
27
  import { useTheme } from 'styled-components/native';
24
28
  import { ProductIngredient } from '../ProductIngredient';
25
29
  import { ProductOption } from '../ProductOption';
@@ -50,6 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
50
54
  import { ProductOptionSubOption } from '../ProductOptionSubOption';
51
55
  import { NotFoundSource } from '../NotFoundSource';
52
56
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
57
+ import NavBar from '../NavBar';
58
+ import { orderTypeList } from '../../utils';
53
59
  const windowWidth = Dimensions.get('window').width;
54
60
 
55
61
  export const ProductOptionsUI = (props: any) => {
@@ -69,11 +75,16 @@ export const ProductOptionsUI = (props: any) => {
69
75
  handleChangeSuboptionState,
70
76
  handleChangeCommentState,
71
77
  productObject,
72
- productAddedToCartLength
78
+ productAddedToCartLength,
79
+ actionStatus,
80
+ handleCreateGuestUser
73
81
  } = props;
74
82
 
75
83
  const theme = useTheme();
76
84
  const [, { showToast }] = useToast()
85
+ const [events] = useEvent()
86
+
87
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
77
88
 
78
89
  const styles = StyleSheet.create({
79
90
  mainContainer: {
@@ -126,6 +137,7 @@ export const ProductOptionsUI = (props: any) => {
126
137
  },
127
138
  slide1: {
128
139
  flex: 1,
140
+ alignItems: 'center'
129
141
  },
130
142
  mainSwiper: {
131
143
  height: 258,
@@ -162,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
162
174
  justifyContent: 'space-between',
163
175
  width: '100%',
164
176
  marginTop: 10
177
+ },
178
+ wrapperNavbar: {
179
+ paddingHorizontal: 40,
180
+ paddingTop: 0,
165
181
  }
166
182
  });
167
183
 
@@ -169,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
169
185
  const [, t] = useLanguage();
170
186
  const [orderState] = useOrder();
171
187
  const [{ auth }] = useSession();
188
+ const [{ configs }] = useConfig()
172
189
  const { product, loading, error } = productObject;
173
190
  const [gallery, setGallery] = useState([])
174
191
  const [thumbsSwiper, setThumbsSwiper] = useState(0)
@@ -187,6 +204,11 @@ export const ProductOptionsUI = (props: any) => {
187
204
  const [headerRefHeight, setHeaderRefHeight] = useState(0)
188
205
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
189
206
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
207
+ const [editionsLayoutY, setEditionsLayoutY] = useState(null)
208
+ const [viewedProduct, setViewedProduct] = useState<any>(null)
209
+
210
+ const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
211
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
190
212
 
191
213
  const isError = (id: number) => {
192
214
  let bgColor = theme.colors.white;
@@ -203,11 +225,12 @@ export const ProductOptionsUI = (props: any) => {
203
225
  };
204
226
 
205
227
  const handleSaveProduct = () => {
228
+ Vibration.vibrate()
206
229
  if (!productCart.quantity) {
207
230
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
208
231
  return
209
232
  }
210
- const isErrors = Object.values(errors).length > 0;
233
+ const isErrors = Object.values(errors)?.length > 0;
211
234
  if (!isErrors) {
212
235
  handleSave && handleSave();
213
236
  return;
@@ -226,7 +249,7 @@ export const ProductOptionsUI = (props: any) => {
226
249
  };
227
250
 
228
251
  const handleChangeMainIndex = (index: number) => {
229
- if (index < 0 || index > gallery.length - 1) {
252
+ if (index < 0 || index > gallery?.length - 1) {
230
253
  setThumbsSwiper(0)
231
254
  return
232
255
  }
@@ -269,7 +292,7 @@ export const ProductOptionsUI = (props: any) => {
269
292
  }
270
293
 
271
294
  const scrollDown = (id: any) => {
272
- const isErrors = Object.values(errors).length > 0
295
+ const isErrors = Object.values(errors)?.length > 0
273
296
  if (!isErrors) {
274
297
  return
275
298
  }
@@ -283,6 +306,11 @@ export const ProductOptionsUI = (props: any) => {
283
306
  }
284
307
  }
285
308
 
309
+ const handleUpdateGuest = () => {
310
+ const guestToken = uuid.v4()
311
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
312
+ }
313
+
286
314
  const handleOnLayout = (event: any, optionId: any) => {
287
315
  const _optionLayout = { ...optionLayout }
288
316
  const optionKey = 'id:' + optionId
@@ -293,7 +321,8 @@ export const ProductOptionsUI = (props: any) => {
293
321
  const saveErrors =
294
322
  orderState.loading ||
295
323
  maxProductQuantity === 0 ||
296
- Object.keys(errors).length > 0;
324
+ Object.keys(errors)?.length > 0;
325
+
297
326
 
298
327
  const ExtraOptions = ({ eID, options }: any) => (
299
328
  <>
@@ -302,19 +331,25 @@ export const ProductOptionsUI = (props: any) => {
302
331
  {respect_to == null && suboptions?.length > 0 && (
303
332
  <TouchableOpacity
304
333
  key={`eopt_key_${id}`}
305
- onPress={() => setSelectedOpt(id)}
334
+ onPress={() => {
335
+ setSelectedOpt(id)
336
+ scrollViewRef?.current?.scrollTo && scrollViewRef.current.scrollTo({
337
+ y: optionLayout[`id:${id}`]?.y + editionsLayoutY - 50,
338
+ animated: true
339
+ })
340
+ }}
306
341
  style={[
307
342
  styles.extraItem,
308
343
  {
309
344
  borderBottomColor:
310
- selOpt == id ? theme.colors.textNormal : theme.colors.border,
345
+ selOpt == id ? theme.colors.textNormal : theme.colors.backgroundPage,
311
346
  },
312
347
  ]}>
313
348
  <OText
314
349
  color={
315
350
  selOpt == id ? theme.colors.textNormal : theme.colors.textSecondary
316
351
  }
317
- size={selOpt == id ? 14 : 12}
352
+ size={12}
318
353
  weight={selOpt == id ? '600' : 'normal'}
319
354
  style={{ maxWidth: 150 }}
320
355
  numberOfLines={1}>
@@ -349,15 +384,18 @@ export const ProductOptionsUI = (props: any) => {
349
384
  useEffect(() => {
350
385
  const imageList: any = []
351
386
  const videoList: any = []
352
- product?.images?.length > 0 ? imageList.push(product.images) : imageList.push(theme?.images?.dummies?.product)
353
- if (product?.gallery && product?.gallery.length > 0) {
387
+ imageList.push(product?.images?.length > 0
388
+ ? product.images
389
+ : theme?.images?.dummies?.product)
390
+
391
+ if (product?.gallery && product?.gallery?.length > 0) {
354
392
  for (const img of product?.gallery) {
355
393
  if (img?.file) {
356
394
  imageList.push(img?.file)
357
395
  }
358
396
  if (img?.video) {
359
397
  const keys = img?.video.split('/')
360
- let _videoId = keys[keys.length - 1]
398
+ let _videoId = keys[keys?.length - 1]
361
399
 
362
400
  if (_videoId.includes('watch')) {
363
401
  const __url = _videoId.split('=')[1]
@@ -372,7 +410,7 @@ export const ProductOptionsUI = (props: any) => {
372
410
  } else if (_videoId.search(/\?/i) >= 0) {
373
411
  _videoId = _videoId.split('?')[0]
374
412
  }
375
- if ((_videoId.length === 11)) {
413
+ if ((_videoId?.length === 11)) {
376
414
  videoList.push(_videoId)
377
415
  }
378
416
  }
@@ -451,30 +489,51 @@ export const ProductOptionsUI = (props: any) => {
451
489
  height: 44,
452
490
  borderColor: theme.colors.primary,
453
491
  backgroundColor: theme.colors.white,
492
+ paddingLeft: 0,
493
+ paddingRight: 0
454
494
  }}
455
495
  />
456
496
  )}
497
+ {!auth && guestCheckoutEnabled && orderTypeEnabled && (
498
+ <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
499
+ {actionStatus?.loading ? (
500
+ <Placeholder Animation={Fade}>
501
+ <PlaceholderLine width={60} height={20} />
502
+ </Placeholder>
503
+ ) : (
504
+ <OText color={theme.colors.primary} size={13}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
505
+ )}
506
+ </TouchableOpacity>
507
+ )}
457
508
  </View>
458
509
  )
459
510
  }
460
511
 
461
512
  useEffect(() => {
462
- const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
513
+ const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
463
514
  scrollViewRef.current.scrollToEnd({ animated: true })
464
- })
465
- return () => {
466
- keyboardDidShowListener.remove()
467
- }
468
- }, [])
515
+ })
516
+ return () => {
517
+ keyboardDidShowListener.remove()
518
+ }
519
+ }, [])
469
520
 
521
+ useEffect(() => {
522
+ if (!product?.id || product?.id === viewedProduct?.id) return
523
+ setViewedProduct(product)
524
+ events.emit('product_viewed', product)
525
+ }, [product?.id, viewedProduct])
470
526
 
471
527
  return (
472
528
  <SafeAreaView style={{ flex: 1 }}>
473
- <TopHeader>
474
- <TopActions onPress={() => handleGoBack()}>
475
- <IconAntDesign name='arrowleft' size={26} />
476
- </TopActions>
477
- </TopHeader>
529
+ <View style={styles.wrapperNavbar}>
530
+ <NavBar
531
+ onActionLeft={() => handleGoBack()}
532
+ showCall={false}
533
+ btnStyle={{ paddingLeft: 0 }}
534
+ paddingTop={4}
535
+ />
536
+ </View>
478
537
  {!error && (
479
538
  <ScrollView
480
539
  ref={scrollViewRef}
@@ -523,23 +582,24 @@ export const ProductOptionsUI = (props: any) => {
523
582
  </View>
524
583
  }
525
584
  >
526
- {gallery && gallery.length > 0 && gallery.map((img, i) => (
585
+ {gallery && gallery?.length > 0 && gallery.map((img, i) => (
527
586
  <View
528
587
  style={styles.slide1}
529
588
  key={i}
530
589
  >
531
- {String(img).includes('image') ? (
590
+ {(String(img).includes('http') || typeof img === 'number') ? (
532
591
  <FastImage
533
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1 }}
534
- source={{
592
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
593
+ source={typeof img !== 'number' ? {
535
594
  uri: optimizeImage(img, 'h_1024,c_limit'),
536
595
  priority: FastImage.priority.normal,
537
- }}
596
+ } : img}
538
597
  />
539
598
  ) : (
540
599
  <>
541
600
  <YoutubePlayer
542
- height={300}
601
+ height={'100%'}
602
+ width={'100%'}
543
603
  play={playing}
544
604
  videoId={img}
545
605
  onChangeState={onStateChange}
@@ -557,7 +617,7 @@ export const ProductOptionsUI = (props: any) => {
557
617
  paddingVertical: 15
558
618
  }}
559
619
  >
560
- {gallery.length > 0 && gallery.map((img, index) => (
620
+ {gallery?.length > 1 && gallery.map((img, index) => (
561
621
  <TouchableOpacity
562
622
  key={index}
563
623
  onPress={() => handleClickThumb(index)}
@@ -570,7 +630,7 @@ export const ProductOptionsUI = (props: any) => {
570
630
  opacity: index === thumbsSwiper ? 1 : 0.8
571
631
  }}
572
632
  >
573
- {String(img).includes('image') ? (
633
+ {String(img).includes('http') ? (
574
634
  <OIcon
575
635
  url={img}
576
636
  style={{
@@ -585,7 +645,7 @@ export const ProductOptionsUI = (props: any) => {
585
645
  />
586
646
  ) : (
587
647
  <OIcon
588
- url={'http://img.youtube.com/vi/' + img + '/0.jpg'}
648
+ url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
589
649
  style={{
590
650
  borderColor: theme.colors.lightGray,
591
651
  borderRadius: 8,
@@ -605,7 +665,10 @@ export const ProductOptionsUI = (props: any) => {
605
665
  </>
606
666
  )}
607
667
  </WrapHeader>
608
- <ProductSummary onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}>
668
+ <ProductSummary
669
+ ph={isChewLayout ? 20 : 40}
670
+ onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
671
+ >
609
672
  <ProductTitle>
610
673
  {loading && !product ? (
611
674
  <Placeholder Animation={Fade}>
@@ -701,45 +764,40 @@ export const ProductOptionsUI = (props: any) => {
701
764
  <ExtraOptionWrap
702
765
  horizontal
703
766
  showsHorizontalScrollIndicator={false}
704
- style={{ marginBottom: 20 }}
705
- contentContainerStyle={{ paddingHorizontal: 33, backgroundColor: theme.colors.white }}
767
+ style={{
768
+ marginBottom: 20,
769
+ borderBottomWidth: 1,
770
+ borderBottomColor: theme.colors.border,
771
+ marginHorizontal: isChewLayout ? 20 : 30,
772
+ backgroundColor: theme.colors.backgroundPage,
773
+ }}
706
774
  >
707
- <TouchableOpacity
708
- key={`eopt_key_00`}
709
- onPress={() => setSelectedOpt(-1)}
710
- style={[
711
- styles.extraItem,
712
- {
713
- borderBottomColor: selOpt == -1 ? theme.colors.textNormal : theme.colors.border,
714
- },
715
- ]}>
716
- <OText
717
- color={selOpt == -1 ? theme.colors.textNormal : theme.colors.textSecondary}
718
- size={selOpt == -1 ? 14 : 12}
719
- weight={selOpt == -1 ? '600' : 'normal'}>
720
- {t('ALL', 'All')}
721
- </OText>
722
- </TouchableOpacity>
723
- {product?.ingredients.length > 0 && (
775
+ {product?.ingredients?.length > 0 && (
724
776
  <TouchableOpacity
725
777
  key={`eopt_key_01`}
726
- onPress={() => setSelectedOpt(0)}
778
+ onPress={() => {
779
+ setSelectedOpt(0)
780
+ scrollViewRef?.current?.scrollTo && scrollViewRef.current.scrollTo({
781
+ y: optionLayout[`id:0`]?.y + editionsLayoutY - 50,
782
+ animated: true
783
+ })
784
+ }}
727
785
  style={[
728
786
  styles.extraItem,
729
787
  {
730
788
  borderBottomColor:
731
- selOpt == 0 ? theme.colors.textNormal : theme.colors.border,
789
+ selOpt == 0 ? theme.colors.textNormal : theme.colors.backgroundPage,
732
790
  },
733
791
  ]}>
734
792
  <OText
735
793
  color={selOpt == 0 ? theme.colors.textNormal : theme.colors.textSecondary}
736
- size={selOpt == 0 ? 14 : 12}
794
+ size={12}
737
795
  weight={selOpt == 0 ? '600' : 'normal'}>
738
796
  {t('INGREDIENTS', 'Ingredients')}
739
797
  </OText>
740
798
  </TouchableOpacity>
741
799
  )}
742
- {product?.extras.map((extra: any) =>
800
+ {product?.extras?.map((extra: any) =>
743
801
  <ExtraOptions key={extra.id} options={extra.options} />
744
802
  )}
745
803
  </ExtraOptionWrap>
@@ -783,184 +841,94 @@ export const ProductOptionsUI = (props: any) => {
783
841
  ))}
784
842
  </>
785
843
  ) : (
786
- <ProductEditions>
787
- {selOpt === -1 ? (
788
- <>
789
- {product?.ingredients.length > 0 && (
790
- <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
791
- <SectionTitle>
792
- <OText size={16}>
793
- {t('INGREDIENTS', 'Ingredients')}
794
- </OText>
795
- </SectionTitle>
796
- <WrapperIngredients>
797
- {product?.ingredients.map((ingredient: any) => (
798
- <ProductIngredient
799
- key={ingredient.id}
800
- ingredient={ingredient}
801
- state={
802
- productCart.ingredients[`id:${ingredient.id}`]
803
- }
804
- onChange={handleChangeIngredientState}
805
- isSoldOut={isSoldOut}
806
- />
807
- ))}
808
- </WrapperIngredients>
809
- </View>
810
- )}
811
- {product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
812
- extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
813
- const currentState =
814
- productCart.options[`id:${option.id}`] || {};
815
- return (
816
- <React.Fragment key={`popt_${option.id}`}>
817
- {showOption(option) && (
818
- <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, option?.id)}>
819
- <ProductOption
820
- option={option}
821
- currentState={currentState}
822
- error={errors[`id:${option.id}`]}>
823
- <WrapperSubOption
824
- style={{
825
- backgroundColor: isError(option.id),
826
- borderRadius: 7.6
827
- }}>
828
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
829
- (suboption: any) => {
830
- const currentState =
831
- productCart.options[
832
- `id:${option.id}`
833
- ]?.suboptions[
834
- `id:${suboption.id}`
835
- ] || {};
836
- const balance =
837
- productCart.options[
838
- `id:${option.id}`
839
- ]?.balance || 0;
840
- return (
841
- <ProductOptionSubOption
842
- key={suboption.id}
843
- isSoldOut={isSoldOut}
844
- onChange={
845
- handleChangeSuboptionState
846
- }
847
- balance={balance}
848
- option={option}
849
- suboption={suboption}
850
- state={currentState}
851
- disabled={
852
- isSoldOut ||
853
- maxProductQuantity <= 0
854
- }
855
- setIsScrollAvailable={setIsScrollAvailable}
856
- error={errors[`id:${option.id}`]}
857
- />
858
- );
859
- },
860
- )}
861
- </WrapperSubOption>
862
- </ProductOption>
863
- </View>
864
- )}
865
- </React.Fragment>
866
- );
867
- }),
868
- )}
869
- </>
870
- ) : (
871
- <>
872
- {selOpt === 0 ? (
873
- <View style={styles.optionContainer}>
874
- <SectionTitle>
875
- <OText size={16}>
876
- {t('INGREDIENTS', 'Ingredients')}
877
- </OText>
878
- </SectionTitle>
879
- <WrapperIngredients>
880
- {product?.ingredients.map((ingredient: any) => (
881
- <ProductIngredient
882
- key={ingredient.id}
883
- ingredient={ingredient}
884
- state={
885
- productCart.ingredients[`id:${ingredient.id}`]
886
- }
887
- onChange={handleChangeIngredientState}
888
- isSoldOut={isSoldOut}
889
- />
890
- ))}
891
- </WrapperIngredients>
892
- </View>
893
- ) : (
894
- <>
895
- {product?.extras.map((extra: any) =>
896
- extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
897
- if (
898
- option.id == selOpt ||
899
- (hasRespected(
900
- extra.options,
901
- option.respect_to,
902
- ) &&
903
- showOption(option))
904
- ) {
905
- const currentState =
906
- productCart.options[`id:${option.id}`] || {};
907
- return (
908
- <React.Fragment key={option.id}>
909
- {showOption(option) && (
910
- <View style={styles.optionContainer}>
911
- <ProductOption
912
- option={option}
913
- currentState={currentState}
914
- error={errors[`id:${option.id}`]}>
915
- <WrapperSubOption
916
- style={{
917
- backgroundColor: isError(
918
- option.id,
919
- ),
920
- }}>
921
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
922
- (suboption: any) => {
923
- const currentState =
924
- productCart.options[
925
- `id:${option.id}`
926
- ]?.suboptions[
927
- `id:${suboption.id}`
928
- ] || {};
929
- const balance =
930
- productCart.options[
931
- `id:${option.id}`
932
- ]?.balance || 0;
933
- return (
934
- <ProductOptionSubOption
935
- key={suboption.id}
936
- onChange={
937
- handleChangeSuboptionState
938
- }
939
- balance={balance}
940
- option={option}
941
- suboption={suboption}
942
- state={currentState}
943
- disabled={
944
- isSoldOut ||
945
- maxProductQuantity <= 0
946
- }
947
- />
948
- );
949
- },
950
- )}
951
- </WrapperSubOption>
952
- </ProductOption>
953
- </View>
954
- )}
955
- </React.Fragment>
956
- );
844
+ <ProductEditions
845
+ style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
846
+ onLayout={(event: any) => {
847
+ setEditionsLayoutY(event.nativeEvent.layout?.y)
848
+ }}
849
+ >
850
+ <>
851
+ {product?.ingredients?.length > 0 && (
852
+ <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
853
+ <SectionTitle>
854
+ <OText size={16}>
855
+ {t('INGREDIENTS', 'Ingredients')}
856
+ </OText>
857
+ </SectionTitle>
858
+ <WrapperIngredients>
859
+ {product?.ingredients.map((ingredient: any) => (
860
+ <ProductIngredient
861
+ key={ingredient.id}
862
+ ingredient={ingredient}
863
+ state={
864
+ productCart.ingredients[`id:${ingredient.id}`]
957
865
  }
958
- }),
959
- )}
960
- </>
961
- )}
962
- </>
963
- )}
866
+ onChange={handleChangeIngredientState}
867
+ isSoldOut={isSoldOut}
868
+ />
869
+ ))}
870
+ </WrapperIngredients>
871
+ </View>
872
+ )}
873
+ {product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
874
+ extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
875
+ const currentState =
876
+ productCart.options[`id:${option.id}`] || {};
877
+ return (
878
+ <React.Fragment key={`popt_${option.id}`}>
879
+ {showOption(option) && (
880
+ <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, option?.id)}>
881
+ <ProductOption
882
+ option={option}
883
+ currentState={currentState}
884
+ error={errors[`id:${option.id}`]}>
885
+ <WrapperSubOption
886
+ style={{
887
+ backgroundColor: isError(option.id),
888
+ borderRadius: 7.6
889
+ }}>
890
+ {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
891
+ (suboption: any) => {
892
+ const currentState =
893
+ productCart.options[
894
+ `id:${option.id}`
895
+ ]?.suboptions[
896
+ `id:${suboption.id}`
897
+ ] || {};
898
+ const balance =
899
+ productCart.options[
900
+ `id:${option.id}`
901
+ ]?.balance || 0;
902
+ return (
903
+ <ProductOptionSubOption
904
+ key={suboption.id}
905
+ isSoldOut={isSoldOut}
906
+ onChange={
907
+ handleChangeSuboptionState
908
+ }
909
+ balance={balance}
910
+ option={option}
911
+ suboption={suboption}
912
+ state={currentState}
913
+ disabled={
914
+ isSoldOut ||
915
+ maxProductQuantity <= 0
916
+ }
917
+ setIsScrollAvailable={setIsScrollAvailable}
918
+ error={errors[`id:${option.id}`]}
919
+ />
920
+ );
921
+ },
922
+ )}
923
+ </WrapperSubOption>
924
+ </ProductOption>
925
+ </View>
926
+ )}
927
+ </React.Fragment>
928
+ );
929
+ }),
930
+ )}
931
+ </>
964
932
  {!product?.hide_special_instructions && (
965
933
  <ProductComment>
966
934
  <SectionTitle>
@@ -984,7 +952,7 @@ export const ProductOptionsUI = (props: any) => {
984
952
  )}
985
953
  </ProductEditions>
986
954
  )}
987
- {!!error && error.length > 0 && (
955
+ {!!error && error?.length > 0 && (
988
956
  <NotFoundSource content={error[0]?.message || error[0]} />
989
957
  )}
990
958
  </ScrollView>
@@ -1007,7 +975,7 @@ export const ProductOptionsUI = (props: any) => {
1007
975
  disabled={productCart.quantity === 1 || !productCart.quantity || isSoldOut || ((productCart?.quantity + productAddedToCartLength) <= product?.minimum_per_order)}>
1008
976
  <OIcon
1009
977
  src={theme.images.general.minus}
1010
- width={16}
978
+ width={20}
1011
979
  color={
1012
980
  productCart.quantity === 1 || isSoldOut
1013
981
  ? theme.colors.backgroundGray
@@ -1028,7 +996,8 @@ export const ProductOptionsUI = (props: any) => {
1028
996
  borderRadius: 8,
1029
997
  borderColor: theme.colors.inputBorderColor,
1030
998
  height: 44,
1031
- marginHorizontal: 10
999
+ marginHorizontal: 10,
1000
+ fontSize: 16
1032
1001
  }}
1033
1002
  />
1034
1003
  )}
@@ -1051,10 +1020,10 @@ export const ProductOptionsUI = (props: any) => {
1051
1020
  }>
1052
1021
  <OIcon
1053
1022
  src={theme.images.general.plus}
1054
- width={16}
1023
+ width={20}
1055
1024
  color={
1056
1025
  maxProductQuantity <= 0 ||
1057
- (productCart?.quantity + productAddedToCartLength) >= maxProductQuantity ||
1026
+ (productCart?.quantity + productAddedToCartLength) >= maxProductQuantity ||
1058
1027
  ((productCart?.quantity + productAddedToCartLength) >= product?.maximum_per_order && product?.maximum_per_order) ||
1059
1028
  isSoldOut
1060
1029
  ? theme.colors.backgroundGray
@@ -1110,9 +1079,18 @@ export const ProductOptionsUI = (props: any) => {
1110
1079
  export const ProductForm = (props: any) => {
1111
1080
  const productOptionsProps = {
1112
1081
  ...props,
1113
- productCart: { quantity: props?.product?.maximum_per_order || props?.product?.minimum_per_order || 1 },
1114
- UIComponent: ProductOptionsUI,
1115
- };
1082
+ productCart: {
1083
+ ...props.productCart,
1084
+ quantity: props.productCart?.code
1085
+ ? props.productCart?.quantity
1086
+ : props?.product?.minimum_per_order || 1
1087
+ },
1088
+ UIComponent: ProductOptionsUI
1089
+ }
1116
1090
 
1117
- return <ProductOptions {...productOptionsProps} />;
1091
+ return <ProductOptions {...productOptionsProps} />
1118
1092
  };
1093
+
1094
+ ProductForm.defaultProps = {
1095
+ productAddedToCartLength: 0
1096
+ }