ordering-ui-react-native 0.17.71 → 0.17.72-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 (201) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +1 -21
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +3 -2
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +5 -0
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +28 -24
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +149 -118
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
  19. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  21. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +20 -93
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +191 -6
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +103 -39
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +61 -60
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersOption/index.tsx +17 -15
  35. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  36. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +17 -12
  38. package/themes/business/src/components/PreviousOrders/OrderList.tsx +88 -0
  39. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  40. package/themes/business/src/components/PreviousOrders/index.tsx +186 -114
  41. package/themes/business/src/components/PreviousOrders/styles.tsx +1 -1
  42. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  43. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  44. package/themes/business/src/components/StoresList/index.tsx +3 -4
  45. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  46. package/themes/business/src/components/shared/OLink.tsx +11 -3
  47. package/themes/business/src/components/shared/OModal.tsx +16 -9
  48. package/themes/business/src/components/shared/OText.tsx +6 -1
  49. package/themes/business/src/types/index.tsx +25 -10
  50. package/themes/business/src/utils/index.tsx +29 -2
  51. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  53. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  55. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  56. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  57. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  58. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  59. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  60. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  61. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  62. package/themes/original/index.tsx +1 -1
  63. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  64. package/themes/original/src/components/AddressForm/index.tsx +61 -39
  65. package/themes/original/src/components/AddressList/index.tsx +25 -24
  66. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  67. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  68. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  69. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  70. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  71. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  72. package/themes/original/src/components/BusinessController/index.tsx +80 -66
  73. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  74. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  75. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  76. package/themes/original/src/components/BusinessInformation/index.tsx +139 -85
  77. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  78. package/themes/original/src/components/BusinessListingSearch/index.tsx +349 -339
  79. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  81. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  82. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  83. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  84. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  85. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -555
  86. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  87. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +69 -38
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  90. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  91. package/themes/original/src/components/Cart/index.tsx +77 -79
  92. package/themes/original/src/components/CartContent/index.tsx +117 -20
  93. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  94. package/themes/original/src/components/Checkout/index.tsx +356 -124
  95. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  96. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  97. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  98. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  99. package/themes/original/src/components/Favorite/index.tsx +2 -6
  100. package/themes/original/src/components/FavoriteList/index.tsx +1 -35
  101. package/themes/original/src/components/FloatingButton/index.tsx +10 -13
  102. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  103. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  104. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  105. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  106. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  107. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  108. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  110. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  111. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  112. package/themes/original/src/components/GoogleMap/index.tsx +60 -5
  113. package/themes/original/src/components/Help/index.tsx +2 -2
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  116. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  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/LastOrder/index.tsx +1 -34
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  123. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  124. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  125. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  126. package/themes/original/src/components/Messages/index.tsx +14 -7
  127. package/themes/original/src/components/MomentOption/index.tsx +193 -90
  128. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  129. package/themes/original/src/components/MultiCart/index.tsx +41 -54
  130. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -50
  131. package/themes/original/src/components/MultiCheckout/index.tsx +329 -100
  132. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  133. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +54 -21
  135. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  136. package/themes/original/src/components/MyOrders/index.tsx +40 -29
  137. package/themes/original/src/components/NavBar/index.tsx +20 -17
  138. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  139. package/themes/original/src/components/Notifications/index.tsx +42 -52
  140. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  141. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  142. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  143. package/themes/original/src/components/OrderDetails/index.tsx +191 -363
  144. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  145. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  146. package/themes/original/src/components/OrderProgress/index.tsx +30 -56
  147. package/themes/original/src/components/OrderSummary/index.tsx +88 -59
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  149. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  150. package/themes/original/src/components/OrdersOption/index.tsx +68 -87
  151. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  152. package/themes/original/src/components/PageBanner/index.tsx +98 -38
  153. package/themes/original/src/components/PageBanner/styles.tsx +0 -10
  154. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -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 +78 -35
  158. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  159. package/themes/original/src/components/ProductForm/index.tsx +104 -29
  160. package/themes/original/src/components/ProductForm/styles.tsx +5 -5
  161. package/themes/original/src/components/ProductItemAccordion/index.tsx +12 -9
  162. package/themes/original/src/components/ProductOptionSubOption/index.tsx +20 -18
  163. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -9
  164. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  165. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  166. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  167. package/themes/original/src/components/Promotions/index.tsx +2 -2
  168. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  169. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  170. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  171. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  172. package/themes/original/src/components/Sessions/index.tsx +11 -8
  173. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  174. package/themes/original/src/components/SignupForm/index.tsx +43 -27
  175. package/themes/original/src/components/SingleOrderCard/index.tsx +102 -63
  176. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  177. package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
  178. package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
  179. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  180. package/themes/original/src/components/StripeCardsList/index.tsx +49 -5
  181. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  182. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  183. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  184. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  185. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  186. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  187. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  188. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  189. package/themes/original/src/components/UserProfileForm/index.tsx +17 -21
  190. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  191. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  192. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  193. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  194. package/themes/original/src/components/Wallets/index.tsx +66 -30
  195. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  196. package/themes/original/src/components/shared/OButton.tsx +6 -2
  197. package/themes/original/src/components/shared/OInput.tsx +6 -1
  198. package/themes/original/src/components/shared/OModal.tsx +3 -3
  199. package/themes/original/src/types/index.tsx +41 -11
  200. package/themes/original/src/utils/index.tsx +273 -1
  201. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -18,8 +18,11 @@ import {
18
18
  useOrder,
19
19
  useUtils,
20
20
  ToastType,
21
- useToast
21
+ useToast,
22
+ useConfig,
23
+ useEvent
22
24
  } from 'ordering-components/native';
25
+ import uuid from 'react-native-uuid';
23
26
  import { useTheme } from 'styled-components/native';
24
27
  import { ProductIngredient } from '../ProductIngredient';
25
28
  import { ProductOption } from '../ProductOption';
@@ -27,6 +30,7 @@ import Swiper from 'react-native-swiper'
27
30
  import FastImage from 'react-native-fast-image';
28
31
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
29
32
  import YoutubePlayer from "react-native-youtube-iframe"
33
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
30
34
 
31
35
  import {
32
36
  WrapHeader,
@@ -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, vibrateApp } 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: {
@@ -163,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
163
174
  justifyContent: 'space-between',
164
175
  width: '100%',
165
176
  marginTop: 10
177
+ },
178
+ wrapperNavbar: {
179
+ paddingHorizontal: 30,
180
+ paddingTop: 0,
166
181
  }
167
182
  });
168
183
 
@@ -170,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
170
185
  const [, t] = useLanguage();
171
186
  const [orderState] = useOrder();
172
187
  const [{ auth }] = useSession();
188
+ const [{ configs }] = useConfig()
173
189
  const { product, loading, error } = productObject;
174
190
  const [gallery, setGallery] = useState([])
175
191
  const [thumbsSwiper, setThumbsSwiper] = useState(0)
@@ -189,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
189
205
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
190
206
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
191
207
  const [editionsLayoutY, setEditionsLayoutY] = useState(null)
208
+ const [viewedProduct, setViewedProduct] = useState<any>(null)
209
+ const [showTitle, setShowTitle] = useState(false)
210
+
211
+ const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
212
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
213
+
214
+ const vibrateApp = (impact?: string) => {
215
+ const options = {
216
+ enableVibrateFallback: true,
217
+ ignoreAndroidSystemSettings: false
218
+ };
219
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
220
+ }
192
221
 
193
222
  const isError = (id: number) => {
194
223
  let bgColor = theme.colors.white;
@@ -205,11 +234,12 @@ export const ProductOptionsUI = (props: any) => {
205
234
  };
206
235
 
207
236
  const handleSaveProduct = () => {
237
+ vibrateApp()
208
238
  if (!productCart.quantity) {
209
239
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
210
240
  return
211
241
  }
212
- const isErrors = Object.values(errors).length > 0;
242
+ const isErrors = Object.values(errors)?.length > 0;
213
243
  if (!isErrors) {
214
244
  handleSave && handleSave();
215
245
  return;
@@ -228,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
228
258
  };
229
259
 
230
260
  const handleChangeMainIndex = (index: number) => {
231
- if (index < 0 || index > gallery.length - 1) {
261
+ if (index < 0 || index > gallery?.length - 1) {
232
262
  setThumbsSwiper(0)
233
263
  return
234
264
  }
@@ -271,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
271
301
  }
272
302
 
273
303
  const scrollDown = (id: any) => {
274
- const isErrors = Object.values(errors).length > 0
304
+ const isErrors = Object.values(errors)?.length > 0
275
305
  if (!isErrors) {
276
306
  return
277
307
  }
@@ -285,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
285
315
  }
286
316
  }
287
317
 
318
+ const handleUpdateGuest = () => {
319
+ const guestToken = uuid.v4()
320
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
321
+ }
322
+
288
323
  const handleOnLayout = (event: any, optionId: any) => {
289
324
  const _optionLayout = { ...optionLayout }
290
325
  const optionKey = 'id:' + optionId
@@ -295,7 +330,7 @@ export const ProductOptionsUI = (props: any) => {
295
330
  const saveErrors =
296
331
  orderState.loading ||
297
332
  maxProductQuantity === 0 ||
298
- Object.keys(errors).length > 0;
333
+ Object.keys(errors)?.length > 0;
299
334
 
300
335
 
301
336
  const ExtraOptions = ({ eID, options }: any) => (
@@ -337,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
337
372
  );
338
373
 
339
374
  const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
340
-
375
+ setShowTitle(contentOffset.y > 30)
341
376
  const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
342
377
  if (_topOption) {
343
378
  const _topOptionId = Number(_topOption.replace('id:', ''))
@@ -362,14 +397,14 @@ export const ProductOptionsUI = (props: any) => {
362
397
  ? product.images
363
398
  : theme?.images?.dummies?.product)
364
399
 
365
- if (product?.gallery && product?.gallery.length > 0) {
400
+ if (product?.gallery && product?.gallery?.length > 0) {
366
401
  for (const img of product?.gallery) {
367
402
  if (img?.file) {
368
403
  imageList.push(img?.file)
369
404
  }
370
405
  if (img?.video) {
371
406
  const keys = img?.video.split('/')
372
- let _videoId = keys[keys.length - 1]
407
+ let _videoId = keys[keys?.length - 1]
373
408
 
374
409
  if (_videoId.includes('watch')) {
375
410
  const __url = _videoId.split('=')[1]
@@ -384,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
384
419
  } else if (_videoId.search(/\?/i) >= 0) {
385
420
  _videoId = _videoId.split('?')[0]
386
421
  }
387
- if ((_videoId.length === 11)) {
422
+ if ((_videoId?.length === 11)) {
388
423
  videoList.push(_videoId)
389
424
  }
390
425
  }
@@ -458,14 +493,27 @@ export const ProductOptionsUI = (props: any) => {
458
493
  : t('LOGIN_SIGNUP', 'Login / Sign Up')
459
494
  }
460
495
  imgRightSrc=""
461
- textStyle={{ color: theme.colors.primary, fontSize: 14 }}
496
+ textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
462
497
  style={{
463
- height: 44,
498
+ height: 42,
464
499
  borderColor: theme.colors.primary,
465
500
  backgroundColor: theme.colors.white,
501
+ paddingLeft: 0,
502
+ paddingRight: 0
466
503
  }}
467
504
  />
468
505
  )}
506
+ {!auth && guestCheckoutEnabled && orderTypeEnabled && (
507
+ <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
508
+ {actionStatus?.loading ? (
509
+ <Placeholder Animation={Fade}>
510
+ <PlaceholderLine width={60} height={20} />
511
+ </Placeholder>
512
+ ) : (
513
+ <OText color={theme.colors.primary} size={13} style={{ textAlign: 'center' }}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
514
+ )}
515
+ </TouchableOpacity>
516
+ )}
469
517
  </View>
470
518
  )
471
519
  }
@@ -479,14 +527,37 @@ export const ProductOptionsUI = (props: any) => {
479
527
  }
480
528
  }, [])
481
529
 
530
+ useEffect(() => {
531
+ if (!product?.id || product?.id === viewedProduct?.id) return
532
+ setViewedProduct(product)
533
+ events.emit('product_viewed', product)
534
+ }, [product?.id, viewedProduct])
482
535
 
483
536
  return (
484
537
  <SafeAreaView style={{ flex: 1 }}>
485
- <TopHeader>
486
- <TopActions onPress={() => handleGoBack()}>
487
- <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
488
- </TopActions>
489
- </TopHeader>
538
+ <View style={styles.wrapperNavbar}>
539
+ <TopHeader>
540
+ <>
541
+ <TopActions onPress={() => handleGoBack()}>
542
+ <IconAntDesign
543
+ name='arrowleft'
544
+ size={26}
545
+ />
546
+ </TopActions>
547
+ {showTitle && (
548
+ <OText
549
+ size={16}
550
+ style={{ flex: 1, textAlign: 'center' }}
551
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
552
+ numberOfLines={2}
553
+ ellipsizeMode='tail'
554
+ >
555
+ {product?.name}
556
+ </OText>
557
+ )}
558
+ </>
559
+ </TopHeader>
560
+ </View>
490
561
  {!error && (
491
562
  <ScrollView
492
563
  ref={scrollViewRef}
@@ -535,14 +606,14 @@ export const ProductOptionsUI = (props: any) => {
535
606
  </View>
536
607
  }
537
608
  >
538
- {gallery && gallery.length > 0 && gallery.map((img, i) => (
609
+ {gallery && gallery?.length > 0 && gallery.map((img, i) => (
539
610
  <View
540
611
  style={styles.slide1}
541
612
  key={i}
542
613
  >
543
614
  {(String(img).includes('http') || typeof img === 'number') ? (
544
615
  <FastImage
545
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 3 / 2 }}
616
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
546
617
  source={typeof img !== 'number' ? {
547
618
  uri: optimizeImage(img, 'h_1024,c_limit'),
548
619
  priority: FastImage.priority.normal,
@@ -570,7 +641,7 @@ export const ProductOptionsUI = (props: any) => {
570
641
  paddingVertical: 15
571
642
  }}
572
643
  >
573
- {gallery.length > 0 && gallery.map((img, index) => (
644
+ {gallery?.length > 1 && gallery.map((img, index) => (
574
645
  <TouchableOpacity
575
646
  key={index}
576
647
  onPress={() => handleClickThumb(index)}
@@ -618,7 +689,10 @@ export const ProductOptionsUI = (props: any) => {
618
689
  </>
619
690
  )}
620
691
  </WrapHeader>
621
- <ProductSummary onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}>
692
+ <ProductSummary
693
+ ph={isChewLayout ? 20 : 30}
694
+ onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
695
+ >
622
696
  <ProductTitle>
623
697
  {loading && !product ? (
624
698
  <Placeholder Animation={Fade}>
@@ -718,11 +792,11 @@ export const ProductOptionsUI = (props: any) => {
718
792
  marginBottom: 20,
719
793
  borderBottomWidth: 1,
720
794
  borderBottomColor: theme.colors.border,
721
- marginHorizontal: 30,
795
+ marginHorizontal: 20,
722
796
  backgroundColor: theme.colors.backgroundPage,
723
797
  }}
724
798
  >
725
- {product?.ingredients.length > 0 && (
799
+ {product?.ingredients?.length > 0 && (
726
800
  <TouchableOpacity
727
801
  key={`eopt_key_01`}
728
802
  onPress={() => {
@@ -747,7 +821,7 @@ export const ProductOptionsUI = (props: any) => {
747
821
  </OText>
748
822
  </TouchableOpacity>
749
823
  )}
750
- {product?.extras.map((extra: any) =>
824
+ {product?.extras?.map((extra: any) =>
751
825
  <ExtraOptions key={extra.id} options={extra.options} />
752
826
  )}
753
827
  </ExtraOptionWrap>
@@ -792,12 +866,13 @@ export const ProductOptionsUI = (props: any) => {
792
866
  </>
793
867
  ) : (
794
868
  <ProductEditions
869
+ style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
795
870
  onLayout={(event: any) => {
796
871
  setEditionsLayoutY(event.nativeEvent.layout?.y)
797
872
  }}
798
873
  >
799
874
  <>
800
- {product?.ingredients.length > 0 && (
875
+ {product?.ingredients?.length > 0 && (
801
876
  <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
802
877
  <SectionTitle>
803
878
  <OText size={16}>
@@ -819,8 +894,8 @@ export const ProductOptionsUI = (props: any) => {
819
894
  </WrapperIngredients>
820
895
  </View>
821
896
  )}
822
- {product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
823
- extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
897
+ {product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
898
+ extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
824
899
  const currentState =
825
900
  productCart.options[`id:${option.id}`] || {};
826
901
  return (
@@ -836,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
836
911
  backgroundColor: isError(option.id),
837
912
  borderRadius: 7.6
838
913
  }}>
839
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
914
+ {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
840
915
  (suboption: any) => {
841
916
  const currentState =
842
917
  productCart.options[
@@ -901,7 +976,7 @@ export const ProductOptionsUI = (props: any) => {
901
976
  )}
902
977
  </ProductEditions>
903
978
  )}
904
- {!!error && error.length > 0 && (
979
+ {!!error && error?.length > 0 && (
905
980
  <NotFoundSource content={error[0]?.message || error[0]} />
906
981
  )}
907
982
  </ScrollView>
@@ -8,8 +8,8 @@ export const WrapHeader = styled.View`
8
8
  export const TopActions = styled.TouchableOpacity`
9
9
  height: 60px;
10
10
  justify-content: center;
11
- padding-horizontal: 30px;
12
- width: 100px;
11
+ min-width: 30px;
12
+ padding-right: 15px;
13
13
  `;
14
14
 
15
15
  export const TopHeader = styled.View`
@@ -47,7 +47,7 @@ export const ProductTitle = styled.View`
47
47
  export const ProductDescription = styled.View``
48
48
 
49
49
  export const ProductEditions = styled.View`
50
- padding: 0 40px;
50
+ padding-vertical: 0;
51
51
  `
52
52
 
53
53
  export const SectionTitle = styled.View`
@@ -70,7 +70,7 @@ export const ProductActions = styled.View`
70
70
  position: absolute;
71
71
  bottom: 0px;
72
72
  padding-top: ${(props: any) => props.ios ? '20px' : '0'};
73
- padding-horizontal: 40px;
73
+ padding-horizontal: 30px;
74
74
  padding-vertical: 20px;
75
75
  width: 100%;
76
76
  flex-direction: ${(props: any) => props.isColumn ? 'column' : 'row'};
@@ -94,7 +94,7 @@ export const WeightUnitItem = styled.View`
94
94
  `}
95
95
  `
96
96
  export const ProductSummary = styled.View`
97
- padding: 26px 40px 0;
97
+ padding: 26px ${(props: any) => props.ph}px 0;
98
98
  position: relative;
99
99
  background-color: white;
100
100
  z-index: 100;
@@ -27,6 +27,7 @@ import { ProductItemAccordionParams } from '../../types'
27
27
  export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
28
28
 
29
29
  const {
30
+ isDisabledEdit,
30
31
  isCartPending,
31
32
  isCartProduct,
32
33
  product,
@@ -76,6 +77,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
76
77
  const [isServiceOpen, setIsServiceOpen] = useState(false)
77
78
  // const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
78
79
  // const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
80
+ const [productQuantity, setProductQuantity] = useState(product.quantity.toString())
79
81
 
80
82
  const productInfo = () => {
81
83
  if (isCartProduct) {
@@ -106,19 +108,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
106
108
  /* const toggleAccordion = () => {
107
109
  if ((!product?.valid_menu && isCartProduct)) return
108
110
  if (isActive) {
109
- Animated.timing(setHeight.height, {
111
+ Animated.timing(setHeight.height, {
110
112
  toValue: 100,
111
113
  duration: 500,
112
114
  easing: Easing.linear,
113
115
  useNativeDriver: false,
114
- }).start()
116
+ }).start()
115
117
  } else {
116
- setHeightState({height: new Animated.Value(0)})
118
+ setHeightState({height: new Animated.Value(0)})
117
119
  }
118
120
  }*/
119
121
 
120
122
  const handleChangeQuantity = (value: string) => {
121
123
  if (!orderState.loading) {
124
+ setProductQuantity(value)
122
125
  if (parseInt(value) === 0) {
123
126
  onDeleteProduct && onDeleteProduct(product)
124
127
  } else {
@@ -133,7 +136,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
133
136
  }
134
137
 
135
138
  /*useEffect(() => {
136
- toggleAccordion()
139
+ toggleAccordion()
137
140
  }, [isActive])*/
138
141
 
139
142
  const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
@@ -203,12 +206,12 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
203
206
  </View>
204
207
  ) : (
205
208
  <>
206
- {isCartProduct && !isCartPending && getProductMax && (
209
+ {!isDisabledEdit && isCartProduct && !isCartPending && getProductMax && (
207
210
  <ProductInfo>
208
211
  <RNPickerSelect
209
212
  items={productOptions}
210
213
  onValueChange={handleChangeQuantity}
211
- value={product.quantity.toString()}
214
+ value={productQuantity}
212
215
  style={pickerStyle}
213
216
  useNativeAndroidPickerStyle={false}
214
217
  placeholder={{}}
@@ -225,7 +228,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
225
228
  </ProductQuantity>
226
229
  )}
227
230
  <View style={{ flex: 1 }}>
228
- <OText size={12} lineHeight={18} weight={'400'}>{product.name}</OText>
231
+ <OText size={12} lineHeight={18} weight={'400'} mLeft={8}>{product.name}</OText>
229
232
  </View>
230
233
  </>
231
234
  )}
@@ -237,7 +240,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
237
240
  )}
238
241
  </View>
239
242
  <View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', height: 20 }}>
240
- {onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
243
+ {!isDisabledEdit && onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
241
244
  <TouchableOpacity onPress={() => handleEditProduct(product)} style={{ marginRight: 5 }}>
242
245
  <MaterialCommunityIcon
243
246
  name='pencil-outline'
@@ -286,7 +289,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
286
289
  )}
287
290
  {productInfo().options.length > 0 && (
288
291
  <ProductOptionsList>
289
- {productInfo().options.map((option: any, i: number) => (
292
+ {productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any, i: number) => (
290
293
  <ProductOption key={option.id + i}>
291
294
  <OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
292
295
  {option.suboptions.map((suboption: any) => (
@@ -32,7 +32,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
32
32
  setIsScrollAvailable
33
33
  } = props
34
34
 
35
- const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
35
+ const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
36
36
  const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
37
37
 
38
38
  const theme = useTheme();
@@ -41,8 +41,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
41
41
  const [showMessage, setShowMessage] = useState(false)
42
42
  const [isDirty, setIsDirty] = useState(false)
43
43
 
44
- const isChewLayout = theme?.business_view?.components?.header?.components?.layout?.type === 'chew'
45
- const iconsSize = isChewLayout ? 20 : 16
44
+ const iconsSize = 20
46
45
 
47
46
  const handleSuboptionClick = () => {
48
47
  toggleSelect()
@@ -68,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
68
67
 
69
68
  return (
70
69
  <View>
71
- <Container>
70
+ <Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
72
71
  <IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
73
72
  {((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
74
73
  state?.selected ? (
@@ -83,12 +82,12 @@ export const ProductOptionSubOptionUI = (props: any) => {
83
82
  <OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
84
83
  )
85
84
  )}
86
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={10} style={{ flex: 1 }}>
85
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={5} style={{ flex: 1 }}>
87
86
  {suboption?.name}
88
87
  </OText>
89
88
  </IconControl>
90
- <QuantityControl>
91
- {option?.allow_suboption_quantity && state?.selected && (
89
+ {option?.allow_suboption_quantity && state?.selected && (
90
+ <QuantityControl>
92
91
  <>
93
92
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
94
93
  <IconAntDesign
@@ -97,7 +96,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
97
96
  color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
98
97
  />
99
98
  </Checkbox>
100
- <OText size={12} mLeft={5} mRight={5}>
99
+ <OText size={12}>
101
100
  {state.quantity}
102
101
  </OText>
103
102
  <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
@@ -108,16 +107,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
108
107
  />
109
108
  </Checkbox>
110
109
  </>
111
- )}
112
- </QuantityControl>
113
- <PositionControl>
114
- {option?.with_half_option && state?.selected && (
110
+ </QuantityControl>
111
+ )}
112
+ {option?.with_half_option && state?.selected && (
113
+ <PositionControl>
115
114
  <>
116
115
  <Circle disabled={disabled} onPress={() => changePosition('left')}>
117
116
  <OIcon
118
117
  src={theme.images.general.half_l}
119
118
  color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
120
- width={16}
119
+ width={20}
120
+ height={20}
121
121
  style={styles.inverse}
122
122
  />
123
123
  </Circle>
@@ -125,21 +125,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
125
125
  <OIcon
126
126
  src={theme.images.general.half_f}
127
127
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
128
- width={16}
128
+ width={20}
129
+ height={20}
129
130
  />
130
131
  </Circle>
131
132
  <Circle disabled={disabled} onPress={() => changePosition('right')}>
132
133
  <OIcon
133
134
  src={theme.images.general.half_r}
134
135
  color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
135
- width={16}
136
+ width={20}
137
+ height={20}
136
138
  />
137
139
  </Circle>
138
140
  </>
139
- )}
140
- </PositionControl>
141
+ </PositionControl>
142
+ )}
141
143
  {price > 0 && (
142
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
144
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{width: 70, maxWidth: 70}}>
143
145
  + {parsePrice(price)}
144
146
  </OText>
145
147
  )}
@@ -4,35 +4,31 @@ export const Container = styled.TouchableOpacity`
4
4
  flex-direction: row;
5
5
  align-items: center;
6
6
  justify-content: space-between;
7
- padding: 10px;
8
7
  width: 100%;
9
8
  `
10
9
 
11
10
  export const IconControl = styled.TouchableOpacity`
12
11
  flex-direction: row;
13
- width: 45%;
12
+ padding: 10px 0 10px 10px;
13
+ width: 35%;
14
14
  align-items: center;
15
15
  `
16
16
 
17
17
  export const QuantityControl = styled.View`
18
18
  flex-direction: row;
19
19
  align-items: center;
20
- justify-content: flex-start;
21
- margin-horizontal: 5px;
22
- flex: 1;
23
- width: 60px;
20
+ justify-content: space-between;
21
+ width: 62px;
24
22
  `
25
23
 
26
24
  export const PositionControl = styled.View`
27
25
  flex-direction: row;
28
26
  align-items: center;
29
- margin-right: 5px;
30
- flex: 1;
31
27
  `
32
28
 
33
29
  export const Checkbox = styled.TouchableOpacity`
34
30
  `
35
31
 
36
32
  export const Circle = styled.TouchableOpacity`
37
- margin: 0 1px;
33
+ margin: 0 1.5px;
38
34
  `