ordering-ui-react-native 0.16.94 → 0.16.95-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 (210) hide show
  1. package/package.json +5 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/styles.tsx +8 -14
  4. package/src/components/BusinessInformation/index.tsx +11 -4
  5. package/src/components/BusinessInformation/styles.tsx +2 -2
  6. package/src/components/BusinessProductsList/index.tsx +1 -1
  7. package/src/components/BusinessesListing/index.tsx +1 -1
  8. package/src/components/OrderCreating/index.tsx +1 -21
  9. package/src/components/OrdersOption/index.tsx +54 -56
  10. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  11. package/src/components/SingleProductReview/index.tsx +7 -4
  12. package/src/components/VerifyPhone/styles.tsx +1 -2
  13. package/src/components/shared/OToast.tsx +4 -4
  14. package/src/utils/index.tsx +7 -1
  15. package/themes/business/index.tsx +2 -0
  16. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  17. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  18. package/themes/business/src/components/BusinessController/index.tsx +2 -3
  19. package/themes/business/src/components/Chat/index.tsx +146 -135
  20. package/themes/business/src/components/DriverMap/index.tsx +22 -9
  21. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  22. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  23. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  24. package/themes/business/src/components/LoginForm/index.tsx +239 -80
  25. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  26. package/themes/business/src/components/MapView/index.tsx +18 -7
  27. package/themes/business/src/components/NewOrderNotification/index.tsx +33 -43
  28. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  29. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +96 -50
  30. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  31. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  32. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  33. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  34. package/themes/business/src/components/OrdersOption/index.tsx +33 -75
  35. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +1 -1
  36. package/themes/business/src/components/PreviousMessages/index.tsx +16 -18
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  38. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  39. package/themes/business/src/components/PreviousOrders/index.tsx +447 -247
  40. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  41. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  42. package/themes/business/src/components/ReviewCustomer/index.tsx +42 -25
  43. package/themes/business/src/components/StoresList/index.tsx +2 -2
  44. package/themes/business/src/components/shared/OLink.tsx +33 -13
  45. package/themes/business/src/components/shared/OModal.tsx +16 -9
  46. package/themes/business/src/components/shared/OText.tsx +8 -2
  47. package/themes/business/src/types/index.tsx +33 -2
  48. package/themes/business/src/utils/index.tsx +53 -0
  49. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  50. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  51. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  54. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  55. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  56. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  57. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  60. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  61. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  62. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  63. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  64. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  65. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  66. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  67. package/themes/kiosk/src/types/index.d.ts +13 -0
  68. package/themes/kiosk/src/utils/index.tsx +15 -0
  69. package/themes/original/index.tsx +8 -0
  70. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  71. package/themes/original/src/components/AddressForm/index.tsx +152 -116
  72. package/themes/original/src/components/AddressList/index.tsx +26 -21
  73. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  74. package/themes/original/src/components/AnalyticsSegment/index.tsx +164 -8
  75. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  76. package/themes/original/src/components/BusinessBasicInformation/index.tsx +125 -82
  77. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -4
  78. package/themes/original/src/components/BusinessController/index.tsx +145 -68
  79. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  80. package/themes/original/src/components/BusinessFeaturedController/index.tsx +4 -2
  81. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  82. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  83. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -5
  84. package/themes/original/src/components/BusinessListingSearch/index.tsx +52 -24
  85. package/themes/original/src/components/BusinessPreorder/index.tsx +96 -15
  86. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  87. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  88. package/themes/original/src/components/BusinessProductsListing/index.tsx +617 -490
  89. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -13
  90. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  91. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -3
  92. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +98 -78
  94. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  95. package/themes/original/src/components/BusinessesListing/index.tsx +6 -6
  96. package/themes/original/src/components/Cart/index.tsx +93 -43
  97. package/themes/original/src/components/CartContent/index.tsx +77 -15
  98. package/themes/original/src/components/CartContent/styles.tsx +11 -1
  99. package/themes/original/src/components/Checkout/index.tsx +294 -175
  100. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  101. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  102. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  103. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  104. package/themes/original/src/components/DriverTips/index.tsx +52 -37
  105. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  106. package/themes/original/src/components/Favorite/index.tsx +7 -4
  107. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  108. package/themes/original/src/components/FavoriteList/index.tsx +70 -80
  109. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  110. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  111. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  112. package/themes/original/src/components/GoogleMap/index.tsx +10 -1
  113. package/themes/original/src/components/Help/index.tsx +8 -8
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  116. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  119. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  120. package/themes/original/src/components/Home/index.tsx +13 -4
  121. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  122. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  123. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  124. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  125. package/themes/original/src/components/LoginForm/index.tsx +43 -19
  126. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  127. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  128. package/themes/original/src/components/Messages/index.tsx +32 -10
  129. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  130. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +117 -96
  132. package/themes/original/src/components/MultiCheckout/index.tsx +233 -83
  133. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +67 -20
  135. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  136. package/themes/original/src/components/MyOrders/index.tsx +66 -17
  137. package/themes/original/src/components/NavBar/index.tsx +6 -11
  138. package/themes/original/src/components/NotFoundSource/index.tsx +1 -1
  139. package/themes/original/src/components/Notifications/index.tsx +144 -0
  140. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  141. package/themes/original/src/components/OrderDetails/OrderEta.tsx +59 -0
  142. package/themes/original/src/components/OrderDetails/index.tsx +110 -221
  143. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  144. package/themes/original/src/components/OrderItAgain/index.tsx +47 -43
  145. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  146. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +52 -17
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  149. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +28 -19
  150. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  151. package/themes/original/src/components/OrdersOption/index.tsx +76 -83
  152. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  153. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  154. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  155. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  156. package/themes/original/src/components/PaymentOptions/index.tsx +2 -2
  157. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  158. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  159. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  160. package/themes/original/src/components/ProductForm/index.tsx +247 -269
  161. package/themes/original/src/components/ProductForm/styles.tsx +4 -7
  162. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  163. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  164. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  165. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  166. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -49
  167. package/themes/original/src/components/ProfessionalProfile/index.tsx +54 -14
  168. package/themes/original/src/components/Promotions/index.tsx +234 -220
  169. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  170. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  171. package/themes/original/src/components/ReviewOrder/index.tsx +43 -11
  172. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  173. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  174. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  175. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  176. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  177. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  178. package/themes/original/src/components/ServiceForm/index.tsx +377 -270
  179. package/themes/original/src/components/Sessions/index.tsx +11 -8
  180. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  181. package/themes/original/src/components/SignupForm/index.tsx +79 -66
  182. package/themes/original/src/components/SingleOrderCard/index.tsx +126 -57
  183. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  184. package/themes/original/src/components/SingleProductCard/index.tsx +111 -49
  185. package/themes/original/src/components/SingleProductCard/styles.tsx +27 -13
  186. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  187. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  188. package/themes/original/src/components/StripeCardsList/index.tsx +1 -1
  189. package/themes/original/src/components/StripeElementsForm/index.tsx +4 -1
  190. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -218
  191. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  192. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  193. package/themes/original/src/components/UserFormDetails/index.tsx +53 -54
  194. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  195. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  196. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  197. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  198. package/themes/original/src/components/Wallets/index.tsx +20 -19
  199. package/themes/original/src/components/Wallets/styles.tsx +2 -0
  200. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  201. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  202. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  203. package/themes/original/src/components/shared/OButton.tsx +6 -2
  204. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  205. package/themes/original/src/components/shared/OInput.tsx +10 -1
  206. package/themes/original/src/components/shared/OModal.tsx +3 -3
  207. package/themes/original/src/layouts/Container.tsx +13 -9
  208. package/themes/original/src/types/index.tsx +45 -7
  209. package/themes/original/src/utils/index.tsx +359 -58
  210. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,4 +1,17 @@
1
- import React, { useEffect, useRef, useCallback } from 'react';
1
+ import React, { useEffect, useRef, useState, useCallback } from 'react';
2
+ import {
3
+ View,
4
+ Keyboard,
5
+ TextInput,
6
+ TouchableOpacity,
7
+ StyleSheet,
8
+ Dimensions,
9
+ I18nManager,
10
+ SafeAreaView,
11
+ Platform,
12
+ Button,
13
+ Vibration
14
+ } from 'react-native';
2
15
  import {
3
16
  ProductForm as ProductOptions,
4
17
  useSession,
@@ -6,8 +19,11 @@ import {
6
19
  useOrder,
7
20
  useUtils,
8
21
  ToastType,
9
- useToast
22
+ useToast,
23
+ useConfig,
24
+ useEvent
10
25
  } from 'ordering-components/native';
26
+ import uuid from 'react-native-uuid';
11
27
  import { useTheme } from 'styled-components/native';
12
28
  import { ProductIngredient } from '../ProductIngredient';
13
29
  import { ProductOption } from '../ProductOption';
@@ -15,17 +31,10 @@ import Swiper from 'react-native-swiper'
15
31
  import FastImage from 'react-native-fast-image';
16
32
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
17
33
  import YoutubePlayer from "react-native-youtube-iframe"
18
- import { Keyboard, TextInput } from 'react-native'
19
- import {
20
- Grayscale
21
- } from 'react-native-color-matrix-image-filters'
22
-
23
- import { View, TouchableOpacity, StyleSheet, Dimensions, I18nManager, SafeAreaView, Platform, Button } from 'react-native';
24
34
 
25
35
  import {
26
36
  WrapHeader,
27
37
  TopHeader,
28
- WrapContent,
29
38
  ProductTitle,
30
39
  ProductDescription,
31
40
  ProductEditions,
@@ -45,8 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
45
54
  import { ProductOptionSubOption } from '../ProductOptionSubOption';
46
55
  import { NotFoundSource } from '../NotFoundSource';
47
56
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
48
- import { useState } from 'react';
49
- const windowHeight = Dimensions.get('window').height;
57
+ import NavBar from '../NavBar';
58
+ import { orderTypeList } from '../../utils';
50
59
  const windowWidth = Dimensions.get('window').width;
51
60
 
52
61
  export const ProductOptionsUI = (props: any) => {
@@ -66,10 +75,16 @@ export const ProductOptionsUI = (props: any) => {
66
75
  handleChangeSuboptionState,
67
76
  handleChangeCommentState,
68
77
  productObject,
78
+ productAddedToCartLength,
79
+ actionStatus,
80
+ handleCreateGuestUser
69
81
  } = props;
70
82
 
71
83
  const theme = useTheme();
72
84
  const [, { showToast }] = useToast()
85
+ const [events] = useEvent()
86
+
87
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
73
88
 
74
89
  const styles = StyleSheet.create({
75
90
  mainContainer: {
@@ -122,6 +137,7 @@ export const ProductOptionsUI = (props: any) => {
122
137
  },
123
138
  slide1: {
124
139
  flex: 1,
140
+ alignItems: 'center'
125
141
  },
126
142
  mainSwiper: {
127
143
  height: 258,
@@ -158,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
158
174
  justifyContent: 'space-between',
159
175
  width: '100%',
160
176
  marginTop: 10
177
+ },
178
+ wrapperNavbar: {
179
+ paddingHorizontal: 40,
180
+ paddingTop: 0,
161
181
  }
162
182
  });
163
183
 
@@ -165,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
165
185
  const [, t] = useLanguage();
166
186
  const [orderState] = useOrder();
167
187
  const [{ auth }] = useSession();
188
+ const [{ configs }] = useConfig()
168
189
  const { product, loading, error } = productObject;
169
190
  const [gallery, setGallery] = useState([])
170
191
  const [thumbsSwiper, setThumbsSwiper] = useState(0)
@@ -183,7 +204,11 @@ export const ProductOptionsUI = (props: any) => {
183
204
  const [headerRefHeight, setHeaderRefHeight] = useState(0)
184
205
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
185
206
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
186
- const [isKeyboardShow, setIsKeyboardShow] = useState(false)
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])
187
212
 
188
213
  const isError = (id: number) => {
189
214
  let bgColor = theme.colors.white;
@@ -200,11 +225,12 @@ export const ProductOptionsUI = (props: any) => {
200
225
  };
201
226
 
202
227
  const handleSaveProduct = () => {
228
+ Vibration.vibrate()
203
229
  if (!productCart.quantity) {
204
230
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
205
231
  return
206
232
  }
207
- const isErrors = Object.values(errors).length > 0;
233
+ const isErrors = Object.values(errors)?.length > 0;
208
234
  if (!isErrors) {
209
235
  handleSave && handleSave();
210
236
  return;
@@ -223,7 +249,7 @@ export const ProductOptionsUI = (props: any) => {
223
249
  };
224
250
 
225
251
  const handleChangeMainIndex = (index: number) => {
226
- if (index < 0 || index > gallery.length - 1) {
252
+ if (index < 0 || index > gallery?.length - 1) {
227
253
  setThumbsSwiper(0)
228
254
  return
229
255
  }
@@ -266,7 +292,7 @@ export const ProductOptionsUI = (props: any) => {
266
292
  }
267
293
 
268
294
  const scrollDown = (id: any) => {
269
- const isErrors = Object.values(errors).length > 0
295
+ const isErrors = Object.values(errors)?.length > 0
270
296
  if (!isErrors) {
271
297
  return
272
298
  }
@@ -280,6 +306,11 @@ export const ProductOptionsUI = (props: any) => {
280
306
  }
281
307
  }
282
308
 
309
+ const handleUpdateGuest = () => {
310
+ const guestToken = uuid.v4()
311
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
312
+ }
313
+
283
314
  const handleOnLayout = (event: any, optionId: any) => {
284
315
  const _optionLayout = { ...optionLayout }
285
316
  const optionKey = 'id:' + optionId
@@ -290,7 +321,8 @@ export const ProductOptionsUI = (props: any) => {
290
321
  const saveErrors =
291
322
  orderState.loading ||
292
323
  maxProductQuantity === 0 ||
293
- Object.keys(errors).length > 0;
324
+ Object.keys(errors)?.length > 0;
325
+
294
326
 
295
327
  const ExtraOptions = ({ eID, options }: any) => (
296
328
  <>
@@ -299,19 +331,25 @@ export const ProductOptionsUI = (props: any) => {
299
331
  {respect_to == null && suboptions?.length > 0 && (
300
332
  <TouchableOpacity
301
333
  key={`eopt_key_${id}`}
302
- 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
+ }}
303
341
  style={[
304
342
  styles.extraItem,
305
343
  {
306
344
  borderBottomColor:
307
- selOpt == id ? theme.colors.textNormal : theme.colors.border,
345
+ selOpt == id ? theme.colors.textNormal : theme.colors.backgroundPage,
308
346
  },
309
347
  ]}>
310
348
  <OText
311
349
  color={
312
350
  selOpt == id ? theme.colors.textNormal : theme.colors.textSecondary
313
351
  }
314
- size={selOpt == id ? 14 : 12}
352
+ size={12}
315
353
  weight={selOpt == id ? '600' : 'normal'}
316
354
  style={{ maxWidth: 150 }}
317
355
  numberOfLines={1}>
@@ -346,15 +384,18 @@ export const ProductOptionsUI = (props: any) => {
346
384
  useEffect(() => {
347
385
  const imageList: any = []
348
386
  const videoList: any = []
349
- product?.images?.length > 0 ? imageList.push(product.images) : imageList.push(theme?.images?.dummies?.product)
350
- 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) {
351
392
  for (const img of product?.gallery) {
352
393
  if (img?.file) {
353
394
  imageList.push(img?.file)
354
395
  }
355
396
  if (img?.video) {
356
397
  const keys = img?.video.split('/')
357
- let _videoId = keys[keys.length - 1]
398
+ let _videoId = keys[keys?.length - 1]
358
399
 
359
400
  if (_videoId.includes('watch')) {
360
401
  const __url = _videoId.split('=')[1]
@@ -369,7 +410,7 @@ export const ProductOptionsUI = (props: any) => {
369
410
  } else if (_videoId.search(/\?/i) >= 0) {
370
411
  _videoId = _videoId.split('?')[0]
371
412
  }
372
- if ((_videoId.length === 11)) {
413
+ if ((_videoId?.length === 11)) {
373
414
  videoList.push(_videoId)
374
415
  }
375
416
  }
@@ -404,14 +445,14 @@ export const ProductOptionsUI = (props: any) => {
404
445
  ? t('UPDATE', 'Update')
405
446
  : t('ADD', 'Add')
406
447
  }`}
407
- 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))}
408
449
  textStyle={{
409
450
  color: saveErrors || isSoldOut || maxProductQuantity <= 0 ? theme.colors.primary : theme.colors.white,
410
451
  fontSize: orderState.loading || editMode ? 10 : 14
411
452
  }}
412
453
  style={{
413
- 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,
414
- 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,
415
456
  opacity: saveErrors || isSoldOut || maxProductQuantity <= 0 ? 0.3 : 1,
416
457
  borderRadius: 7.6,
417
458
  height: 44,
@@ -448,40 +489,58 @@ export const ProductOptionsUI = (props: any) => {
448
489
  height: 44,
449
490
  borderColor: theme.colors.primary,
450
491
  backgroundColor: theme.colors.white,
492
+ paddingLeft: 0,
493
+ paddingRight: 0
451
494
  }}
452
495
  />
453
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
+ )}
454
508
  </View>
455
509
  )
456
510
  }
457
511
 
458
512
  useEffect(() => {
459
- const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
460
- setIsKeyboardShow(true)
461
- })
462
- const keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', () => {
463
- setIsKeyboardShow(false)
464
- })
465
- return () => {
466
- keyboardDidShowListener.remove()
467
- keyboardDidHideListener.remove()
468
- }
469
- }, [])
513
+ const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
514
+ scrollViewRef.current.scrollToEnd({ animated: true })
515
+ })
516
+ return () => {
517
+ keyboardDidShowListener.remove()
518
+ }
519
+ }, [])
470
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])
471
526
 
472
527
  return (
473
528
  <SafeAreaView style={{ flex: 1 }}>
474
- <TopHeader>
475
- <TopActions onPress={() => handleGoBack()}>
476
- <IconAntDesign name='arrowleft' size={26} />
477
- </TopActions>
478
- </TopHeader>
529
+ <View style={styles.wrapperNavbar}>
530
+ <NavBar
531
+ onActionLeft={() => handleGoBack()}
532
+ showCall={false}
533
+ btnStyle={{ paddingLeft: 0 }}
534
+ paddingTop={4}
535
+ />
536
+ </View>
479
537
  {!error && (
480
538
  <ScrollView
481
539
  ref={scrollViewRef}
482
540
  contentContainerStyle={{ paddingBottom: 80 }}
483
541
  stickyHeaderIndices={[2]}
484
- onScroll={handleScroll}>
542
+ onScroll={handleScroll}
543
+ >
485
544
  <WrapHeader onLayout={(event: any) => setHeaderRefHeight(event.nativeEvent.layout?.height)}>
486
545
  {loading && !product ? (
487
546
  <View style={styles.productHeaderSkeleton}>
@@ -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
- {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
- {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,186 +841,96 @@ 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
- <ProductComment pb={isKeyboardShow && Platform.OS === 'ios' && 320}>
933
+ <ProductComment>
966
934
  <SectionTitle>
967
935
  <OText size={16} weight={'600'} lineHeight={24}>
968
936
  {t('SPECIAL_COMMENT', 'Special comment')}
@@ -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>
@@ -996,18 +964,18 @@ export const ProductOptionsUI = (props: any) => {
996
964
  <OText size={16} lineHeight={24} weight={'600'}>
997
965
  {productCart.total ? parsePrice(productCart?.total) : ''}
998
966
  </OText>
999
- {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>}
1000
- {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>}
1001
969
  </View>
1002
970
  {productCart && !isSoldOut && maxProductQuantity > 0 && (
1003
971
  <>
1004
972
  <View style={styles.quantityControl}>
1005
973
  <TouchableOpacity
1006
974
  onPress={decrement}
1007
- 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)}>
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
  )}
@@ -1045,17 +1014,17 @@ export const ProductOptionsUI = (props: any) => {
1045
1014
  onPress={increment}
1046
1015
  disabled={
1047
1016
  maxProductQuantity <= 0 ||
1048
- productCart.quantity >= maxProductQuantity ||
1049
- (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) ||
1050
1019
  isSoldOut
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 >= maxProductQuantity ||
1058
- (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) ||
1059
1028
  isSoldOut
1060
1029
  ? theme.colors.backgroundGray
1061
1030
  : theme.colors.backgroundDark
@@ -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
+ }