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