ordering-ui-react-native 0.22.22 → 0.22.23-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 (164) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/StripeMethodForm/index.tsx +4 -2
  6. package/src/components/VerifyPhone/styles.tsx +1 -2
  7. package/src/context/OfflineActions/index.tsx +236 -0
  8. package/src/types/index.tsx +2 -1
  9. package/themes/business/index.tsx +2 -0
  10. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  11. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  12. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  13. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  14. package/themes/business/src/components/Chat/index.tsx +15 -3
  15. package/themes/business/src/components/DriverMap/index.tsx +49 -26
  16. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  17. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  18. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  19. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  20. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  21. package/themes/business/src/components/MapView/index.tsx +36 -17
  22. package/themes/business/src/components/NewOrderNotification/index.tsx +38 -19
  23. package/themes/business/src/components/OrderDetails/Business.tsx +47 -27
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +128 -41
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +45 -18
  27. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  28. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  29. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  30. package/themes/business/src/components/OrderSummary/index.tsx +6 -4
  31. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  32. package/themes/business/src/components/OrdersOption/index.tsx +217 -156
  33. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  34. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  35. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +39 -16
  36. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  37. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  38. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  39. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  40. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  41. package/themes/business/src/components/PrinterSettings/index.tsx +162 -174
  42. package/themes/business/src/components/PrinterSettings/styles.tsx +14 -1
  43. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  44. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  45. package/themes/business/src/components/StoresList/index.tsx +2 -2
  46. package/themes/business/src/components/UserProfileForm/index.tsx +55 -22
  47. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  48. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  49. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  50. package/themes/business/src/config/currency.tsx +1010 -0
  51. package/themes/business/src/hooks/useLocation.tsx +16 -12
  52. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  53. package/themes/business/src/types/index.tsx +16 -4
  54. package/themes/business/src/utils/index.tsx +33 -3
  55. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  57. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  58. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  59. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  60. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  61. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  62. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  63. package/themes/original/index.tsx +11 -0
  64. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  65. package/themes/original/src/components/AddressList/index.tsx +8 -7
  66. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  67. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  68. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  69. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  70. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +8 -6
  71. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  72. package/themes/original/src/components/BusinessPreorder/index.tsx +46 -28
  73. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  74. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  75. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  76. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  77. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  78. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  79. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  80. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  81. package/themes/original/src/components/Cart/index.tsx +46 -14
  82. package/themes/original/src/components/CartContent/index.tsx +2 -4
  83. package/themes/original/src/components/Checkout/index.tsx +127 -77
  84. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  85. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  86. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  87. package/themes/original/src/components/Favorite/index.tsx +1 -5
  88. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  89. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  90. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  91. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  92. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  93. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  94. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  95. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  96. package/themes/original/src/components/Help/index.tsx +2 -0
  97. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  98. package/themes/original/src/components/Home/index.tsx +3 -11
  99. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  100. package/themes/original/src/components/LoginForm/index.tsx +12 -9
  101. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  102. package/themes/original/src/components/Messages/index.tsx +27 -19
  103. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  104. package/themes/original/src/components/MomentOption/index.tsx +80 -51
  105. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  106. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  107. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  108. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  109. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  110. package/themes/original/src/components/NavBar/index.tsx +7 -4
  111. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  112. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  113. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  114. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +16 -11
  115. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  116. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  117. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  118. package/themes/original/src/components/OrderSummary/index.tsx +29 -10
  119. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  120. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  121. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  122. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  123. package/themes/original/src/components/PaymentOptions/index.tsx +4 -3
  124. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  125. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  126. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  127. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  128. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  129. package/themes/original/src/components/ProductItemAccordion/index.tsx +75 -77
  130. package/themes/original/src/components/ProductItemAccordion/styles.tsx +0 -3
  131. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  132. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  133. package/themes/original/src/components/Promotions/index.tsx +6 -9
  134. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  135. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  136. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  137. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  138. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  139. package/themes/original/src/components/Sessions/index.tsx +3 -3
  140. package/themes/original/src/components/SignupForm/index.tsx +102 -88
  141. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  142. package/themes/original/src/components/SingleProductCard/index.tsx +5 -5
  143. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  144. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  145. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  146. package/themes/original/src/components/StripeElementsForm/index.tsx +76 -62
  147. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  148. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  149. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  151. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  152. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  153. package/themes/original/src/components/UserFormDetails/index.tsx +163 -136
  154. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  155. package/themes/original/src/components/UserVerification/index.tsx +15 -4
  156. package/themes/original/src/components/Wallets/index.tsx +6 -3
  157. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  158. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  159. package/themes/original/src/components/shared/OButton.tsx +5 -4
  160. package/themes/original/src/components/shared/OInput.tsx +4 -8
  161. package/themes/original/src/components/shared/OModal.tsx +7 -2
  162. package/themes/original/src/types/index.tsx +12 -4
  163. package/themes/original/src/utils/index.tsx +30 -1
  164. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -88,6 +88,7 @@ export const ProductOptionsUI = (props: any) => {
88
88
  const [events] = useEvent()
89
89
  const commentRef = useRef()
90
90
  const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
91
+ const hideProductDummyLogo = theme?.business_view?.components?.products?.components?.product?.components?.dummy?.hidden
91
92
 
92
93
  const styles = StyleSheet.create({
93
94
  mainContainer: {
@@ -487,114 +488,118 @@ export const ProductOptionsUI = (props: any) => {
487
488
  </View>
488
489
  ) : (
489
490
  <>
490
- <Swiper
491
- loop={false}
492
- ref={swiperRef}
493
- showsButtons={true}
494
- style={styles.mainSwiper}
495
- showsPagination={false}
496
- onIndexChanged={(index : any) => handleChangeMainIndex(index)}
497
- prevButton={
498
- <View style={styles.swiperButton}>
499
- <IconAntDesign
500
- name="caretleft"
501
- color={theme.colors.white}
502
- size={13}
503
- // style={styles.starIcon}
504
- />
505
- </View>
506
- }
507
- nextButton={
508
- <View style={styles.swiperButton}>
509
- <IconAntDesign
510
- name="caretright"
511
- color={theme.colors.white}
512
- size={13}
513
- // style={styles.starIcon}
514
- />
515
- </View>
516
- }
517
- >
518
- {gallery && gallery?.length > 0 && gallery.map((img : any, i: number) => (
519
- <View
520
- style={styles.slide1}
521
- key={i}
522
- >
523
- {(String(img).includes('http') || typeof img === 'number') ? (
524
- <FastImage
525
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
526
- source={typeof img !== 'number' ? {
527
- uri: optimizeImage(img, 'h_1024,c_limit'),
528
- priority: FastImage.priority.normal,
529
- } : img}
530
- />
531
- ) : (
532
- <>
533
- <YoutubePlayer
534
- height={'100%'}
535
- width={'100%'}
536
- play={playing}
537
- videoId={img}
538
- onChangeState={onStateChange}
491
+ {(product?.images || !hideProductDummyLogo) && (
492
+ <>
493
+ <Swiper
494
+ loop={false}
495
+ ref={swiperRef}
496
+ showsButtons={true}
497
+ style={styles.mainSwiper}
498
+ showsPagination={false}
499
+ onIndexChanged={(index : any) => handleChangeMainIndex(index)}
500
+ prevButton={
501
+ <View style={styles.swiperButton}>
502
+ <IconAntDesign
503
+ name="caretleft"
504
+ color={theme.colors.white}
505
+ size={13}
506
+ // style={styles.starIcon}
539
507
  />
540
- <Button title={playing ? "pause" : "play"} onPress={togglePlaying} />
541
- </>
542
- )}
543
- </View>
544
- ))}
545
- </Swiper>
546
- <ScrollView
547
- horizontal
548
- contentContainerStyle={{
549
- paddingHorizontal: 20,
550
- paddingVertical: 15
551
- }}
552
- >
553
- {gallery?.length > 1 && gallery.map((img: any, index: number) => (
554
- <TouchableOpacity
555
- key={index}
556
- onPress={() => handleClickThumb(index)}
557
- >
558
- <View
559
- style={{
560
- height: 56,
561
- borderRadius: 8,
562
- margin: 8,
563
- opacity: index === thumbsSwiper ? 1 : 0.8
564
- }}
565
- >
566
- {String(img).includes('http') ? (
567
- <OIcon
568
- url={img}
569
- style={{
570
- borderColor: theme.colors.lightGray,
571
- borderRadius: 8,
572
- minHeight: '100%',
573
- opacity: isSoldOut ? 0.5 : 1
574
- }}
575
- width={56}
576
- height={56}
577
- cover
508
+ </View>
509
+ }
510
+ nextButton={
511
+ <View style={styles.swiperButton}>
512
+ <IconAntDesign
513
+ name="caretright"
514
+ color={theme.colors.white}
515
+ size={13}
516
+ // style={styles.starIcon}
578
517
  />
579
- ) : (
580
- <OIcon
581
- url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
518
+ </View>
519
+ }
520
+ >
521
+ {gallery && gallery?.length > 0 && gallery.map((img : any, i: number) => (
522
+ <View
523
+ style={styles.slide1}
524
+ key={i}
525
+ >
526
+ {(String(img).includes('http') || typeof img === 'number') ? (
527
+ <FastImage
528
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
529
+ source={typeof img !== 'number' ? {
530
+ uri: optimizeImage(img, 'h_1024,c_limit'),
531
+ priority: FastImage.priority.normal,
532
+ } : img}
533
+ />
534
+ ) : (
535
+ <>
536
+ <YoutubePlayer
537
+ height={'100%'}
538
+ width={'100%'}
539
+ play={playing}
540
+ videoId={img}
541
+ onChangeState={onStateChange}
542
+ />
543
+ <Button title={playing ? "pause" : "play"} onPress={togglePlaying} />
544
+ </>
545
+ )}
546
+ </View>
547
+ ))}
548
+ </Swiper>
549
+ <ScrollView
550
+ horizontal
551
+ contentContainerStyle={{
552
+ paddingHorizontal: 20,
553
+ paddingVertical: 15
554
+ }}
555
+ >
556
+ {gallery?.length > 1 && gallery.map((img: any, index: number) => (
557
+ <TouchableOpacity
558
+ key={index}
559
+ onPress={() => handleClickThumb(index)}
560
+ >
561
+ <View
582
562
  style={{
583
- borderColor: theme.colors.lightGray,
563
+ height: 56,
584
564
  borderRadius: 8,
585
- minHeight: '100%',
586
- opacity: isSoldOut ? 0.5 : 1
565
+ margin: 8,
566
+ opacity: index === thumbsSwiper ? 1 : 0.8
587
567
  }}
588
- width={56}
589
- height={56}
590
- cover
591
- />
592
- )}
593
- </View>
594
- </TouchableOpacity>
568
+ >
569
+ {String(img).includes('http') ? (
570
+ <OIcon
571
+ url={img}
572
+ style={{
573
+ borderColor: theme.colors.lightGray,
574
+ borderRadius: 8,
575
+ minHeight: '100%',
576
+ opacity: isSoldOut ? 0.5 : 1
577
+ }}
578
+ width={56}
579
+ height={56}
580
+ cover
581
+ />
582
+ ) : (
583
+ <OIcon
584
+ url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
585
+ style={{
586
+ borderColor: theme.colors.lightGray,
587
+ borderRadius: 8,
588
+ minHeight: '100%',
589
+ opacity: isSoldOut ? 0.5 : 1
590
+ }}
591
+ width={56}
592
+ height={56}
593
+ cover
594
+ />
595
+ )}
596
+ </View>
597
+ </TouchableOpacity>
595
598
 
596
- ))}
597
- </ScrollView>
599
+ ))}
600
+ </ScrollView>
601
+ </>
602
+ )}
598
603
  </>
599
604
  )}
600
605
  </WrapHeader>
@@ -1,6 +1,6 @@
1
- import React, { useState } from 'react'
2
- import { View, Animated, StyleSheet, Platform, TouchableOpacity } from 'react-native'
3
- import { useUtils, useLanguage, useOrder } from 'ordering-components/native'
1
+ import React, { useEffect, useState } from 'react'
2
+ import { View, Animated, StyleSheet, TouchableOpacity } from 'react-native'
3
+ import { useUtils, useLanguage, useOrder, ProductItemAccordion as ProductItemAccordionController } from 'ordering-components/native'
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
6
6
  import RNPickerSelect from 'react-native-picker-select'
@@ -24,7 +24,7 @@ import { OIcon, OText, OAlert, OModal } from '../shared'
24
24
 
25
25
  import { ProductItemAccordionParams } from '../../types'
26
26
 
27
- export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
27
+ export const ProductItemAccordionUI = (props: ProductItemAccordionParams) => {
28
28
 
29
29
  const {
30
30
  isDisabledEdit,
@@ -36,31 +36,55 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
36
36
  onDeleteProduct,
37
37
  onEditProduct,
38
38
  isFromCheckout,
39
+ productInfo
39
40
  } = props
40
41
 
41
42
  const theme = useTheme();
43
+ const hideProductImage = isFromCheckout
44
+ ? theme?.checkout?.components?.cart?.components?.product?.components?.image?.hidden
45
+ : theme?.confirmation?.components?.cart?.components?.products?.components?.photo?.hidden
46
+
47
+ const hideProductDummyLogo = theme?.business_view?.components?.products?.components?.product?.components?.dummy?.hidden
48
+ const hideProductCommentHide = isFromCheckout && theme?.checkout?.components?.cart?.components?.product?.components?.comments?.hidden
49
+
50
+ const styles = StyleSheet.create({
51
+ productImage: {
52
+ borderRadius: 7.6,
53
+ width: 48,
54
+ height: 48
55
+ }
56
+ })
42
57
 
43
58
  const pickerStyle = StyleSheet.create({
44
59
  inputAndroid: {
45
- width: 34,
60
+ width: 45,
46
61
  textAlign: 'center',
47
62
  overflow: 'visible',
48
63
  fontSize: 12,
49
- height: 20,
50
- padding: 0,
51
- color: theme.colors.textNormal
64
+ height: 30,
65
+ color: theme.colors.textNormal,
66
+ backgroundColor: theme.colors.backgroundGray100,
67
+ paddingVertical: 8,
68
+ paddingRight: 10,
69
+ paddingLeft: 0,
70
+ borderRadius: 7.6,
52
71
  },
53
72
  inputIOS: {
54
- width: 34,
73
+ width: 45,
55
74
  textAlign: 'center',
56
75
  overflow: 'visible',
57
76
  fontSize: 12,
77
+ backgroundColor: theme.colors.backgroundGray100,
78
+ paddingVertical: 8,
79
+ paddingRight: 15,
80
+ paddingLeft: 0,
81
+ borderRadius: 7.6,
58
82
  },
59
83
  icon: {
60
84
  position: 'absolute',
61
85
  zIndex: 1,
62
- top: -4,
63
- end: -4,
86
+ top: 0,
87
+ end: 8,
64
88
  },
65
89
  placeholder: {
66
90
  color: theme.colors.secundaryContrast
@@ -74,27 +98,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
74
98
 
75
99
  const [isActive, setActiveState] = useState(false)
76
100
  const [isServiceOpen, setIsServiceOpen] = useState(false)
77
- const [productQuantityState, setProductQuantityState] = useState(product.quantity.toString())
78
- // const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
79
- // const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
80
-
81
- const productInfo = () => {
82
- if (isCartProduct) {
83
- const ingredients = JSON.parse(JSON.stringify(Object.values(product.ingredients ?? {})))
84
- let options = JSON.parse(JSON.stringify(Object.values(product.options ?? {})))
85
-
86
- options = options.map((option: any) => {
87
- option.suboptions = Object.values(option.suboptions ?? {})
88
- return option
89
- })
90
- return {
91
- ...productInfo,
92
- ingredients,
93
- options
94
- }
95
- }
96
- return product
97
- }
101
+ const [productQuantityState, setProductQuantityState] = useState<any>(product.quantity.toString())
98
102
 
99
103
  const handleEditProduct = (curProduct: any) => {
100
104
  if (!curProduct?.calendar_event) {
@@ -104,20 +108,6 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
104
108
  setIsServiceOpen(true)
105
109
  }
106
110
 
107
- /* const toggleAccordion = () => {
108
- if ((!product?.valid_menu && isCartProduct)) return
109
- if (isActive) {
110
- Animated.timing(setHeight.height, {
111
- toValue: 100,
112
- duration: 500,
113
- easing: Easing.linear,
114
- useNativeDriver: false,
115
- }).start()
116
- } else {
117
- setHeightState({height: new Animated.Value(0)})
118
- }
119
- }*/
120
-
121
111
  const handleChangeQuantity = (value: string) => {
122
112
  if (!orderState.loading) {
123
113
  setProductQuantityState(value)
@@ -134,10 +124,6 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
134
124
  return `${quantity} x ${name} ${pos} +${price}`
135
125
  }
136
126
 
137
- /*useEffect(() => {
138
- toggleAccordion()
139
- }, [isActive])*/
140
-
141
127
  const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
142
128
  return {
143
129
  label: opt === 0 ? t('REMOVE', 'Remove') : opt.toString(),
@@ -145,19 +131,27 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
145
131
  }
146
132
  })
147
133
 
134
+ useEffect(() => {
135
+ if (product.quantity.toString() === productQuantityState || productQuantityState) {
136
+ setProductQuantityState(null)
137
+ }
138
+ }, [product.quantity])
139
+
148
140
  return (
149
141
  <>
150
142
  <AccordionSection>
151
143
  <Accordion
152
- isValid={product?.valid ?? true}
153
- onPress={() => (!product?.valid_menu && isCartProduct)
154
- ? {}
155
- : setActiveState(!isActive)}
156
144
  activeOpacity={1}
145
+ isValid={product?.valid ?? true}
146
+ onPress={
147
+ (!product?.valid_menu && isCartProduct) ||
148
+ !(productInfo.ingredients.length > 0 || productInfo.options.length > 0 || !!product.comment)
149
+ ? null : () => setActiveState(!isActive)
150
+ }
157
151
  >
158
152
  <View style={{ flexDirection: 'row', alignItems: 'flex-start' }}>
159
153
  <ContentInfo>
160
- {(product?.images || theme?.images?.dummies?.product) && (
154
+ {(product?.images || (!hideProductDummyLogo && theme?.images?.dummies?.product)) && !hideProductImage && (
161
155
  <ProductImage>
162
156
  {isFromCheckout ? (
163
157
  product?.images ? (
@@ -210,16 +204,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
210
204
  <RNPickerSelect
211
205
  items={productOptions}
212
206
  onValueChange={handleChangeQuantity}
213
- value={productQuantityState}
207
+ value={productQuantityState ?? product.quantity.toString()}
214
208
  style={pickerStyle}
215
209
  useNativeAndroidPickerStyle={false}
216
210
  placeholder={{}}
217
- touchableWrapperProps={{
218
- style: {
219
- width: 40,
220
- }
221
- }}
222
- Icon={() => <View style={pickerStyle.icon}><OIcon src={theme.images.general.arrow_down} color={theme.colors.textNormal} width={8} /></View>}
211
+ touchableWrapperProps={{ style: { width: 45 } }}
212
+ Icon={() => (
213
+ <View style={pickerStyle.icon}>
214
+ <OIcon
215
+ src={theme.images.general.arrow_down}
216
+ color={theme.colors.textNormal}
217
+ width={8}
218
+ />
219
+ </View>
220
+ )}
223
221
  disabled={orderState.loading}
224
222
  />
225
223
  </ProductInfo>
@@ -239,7 +237,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
239
237
  <View style={{ display: 'flex', flexDirection: 'column', flex: 1, alignItems: 'flex-end', maxWidth: 100 }}>
240
238
  <View style={{ flexDirection: 'row' }}>
241
239
  <OText size={12} lineHeight={18} weight={'400'}>{parsePrice(product.total || product.price)}</OText>
242
- {(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || !!product.comment) && (
240
+ {(productInfo.ingredients.length > 0 || productInfo.options.length > 0 || !!product.comment) && (
243
241
  <MaterialCommunityIcon name='chevron-down' size={18} />
244
242
  )}
245
243
  </View>
@@ -283,17 +281,17 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
283
281
  <View style={{ display: isActive ? 'flex' : 'none', paddingStart: isFromCheckout ? 100 : 40, marginTop: isFromCheckout ? -80 : -30 }}>
284
282
  <Animated.View>
285
283
  <AccordionContent>
286
- {productInfo().ingredients.length > 0 && productInfo().ingredients.some((ingredient: any) => !ingredient.selected) && (
284
+ {productInfo.ingredients.length > 0 && productInfo.ingredients.some((ingredient: any) => !ingredient.selected) && (
287
285
  <ProductOptionsList>
288
286
  <OText size={10} color={theme.colors.textSecondary}>{t('INGREDIENTS', 'Ingredients')}</OText>
289
- {productInfo().ingredients.map((ingredient: any, i) => !ingredient.selected && (
287
+ {productInfo.ingredients.map((ingredient: any, i) => !ingredient.selected && (
290
288
  <OText size={10} color={theme.colors.textThird} key={ingredient.id + i} style={{ marginLeft: 10 }}>{t('NO', 'No')} {ingredient.name}</OText>
291
289
  ))}
292
290
  </ProductOptionsList>
293
291
  )}
294
- {productInfo().options.length > 0 && (
292
+ {productInfo.options.length > 0 && (
295
293
  <ProductOptionsList>
296
- {productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => (
294
+ {productInfo.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => (
297
295
  <ProductOption key={option.id}>
298
296
  <OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
299
297
  {option.suboptions.map((suboption: any) => (
@@ -312,7 +310,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
312
310
  ))}
313
311
  </ProductOptionsList>
314
312
  )}
315
- {!!product.comment && (
313
+ {!!product.comment && !hideProductCommentHide && (
316
314
  <ProductComment>
317
315
  <OText size={10} color={theme.colors.textSecondary}>{t('SPECIAL_COMMENT', 'Special Comment')}</OText>
318
316
  <OText size={10} color={theme.colors.textThird}>{product.comment}</OText>
@@ -343,13 +341,13 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
343
341
  )
344
342
  }
345
343
 
346
- const styles = StyleSheet.create({
347
- productImage: {
348
- borderRadius: 7.6,
349
- width: 48,
350
- height: 48
351
- },
352
- test: {
353
- overflow: 'hidden',
344
+ export const ProductItemAccordion = (props: any) => {
345
+ const productItemAccordionProps = {
346
+ ...props,
347
+ UIComponent: ProductItemAccordionUI
354
348
  }
355
- })
349
+
350
+ return (
351
+ <ProductItemAccordionController {...productItemAccordionProps} />
352
+ )
353
+ }
@@ -17,9 +17,6 @@ export const Accordion = styled.TouchableOpacity`
17
17
 
18
18
  export const ProductInfo = styled.View`
19
19
  margin-horizontal: 7px;
20
- background-color: ${(props: any) => props.theme.colors.backgroundGray100};
21
- padding: 4px 12px 4px 0px;
22
- border-radius: 7.6px;
23
20
  `
24
21
 
25
22
  export const ProductQuantity = styled.View`
@@ -35,10 +35,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
35
35
  disabled,
36
36
  setIsScrollAvailable,
37
37
  image,
38
- enableIntersection
38
+ enableIntersection,
39
+ usePizzaValidation,
40
+ pizzaState
39
41
  } = props
40
42
 
41
- const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
43
+ const disableIncrement =
44
+ option?.with_half_option
45
+ ? pizzaState?.[`option:${option?.id}`]?.value === option?.max
46
+ : option?.limit_suboptions_by_max
47
+ ? (balance === option?.max || state.quantity === suboption.max)
48
+ : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
42
49
  const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
43
50
 
44
51
  const theme = useTheme();
@@ -65,8 +72,9 @@ export const ProductOptionSubOptionUI = (props: any) => {
65
72
  const handleSuboptionClick = () => {
66
73
  toggleSelect()
67
74
  setIsDirty(true)
75
+ const minMaxValidation = option?.with_half_option ? usePizzaValidation : (balance === option?.max && option?.suboptions?.length > balance && !(option?.min === 1 && option?.max === 1))
68
76
 
69
- if (balance === option?.max && option?.suboptions?.length > balance && !(option?.min === 1 && option?.max === 1)) {
77
+ if (!state.selected && minMaxValidation) {
70
78
  setShowMessage(true)
71
79
  }
72
80
  }
@@ -86,7 +94,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
86
94
  if (!(balance === option?.max && option?.suboptions?.length > balance && !(option?.min === 1 && option?.max === 1))) {
87
95
  setShowMessage(false)
88
96
  }
89
- }, [balance])
97
+ }, [balance, pizzaState?.[`option:${option?.id}`]?.value])
90
98
 
91
99
  return (
92
100
  <InView onChange={(inView: boolean) => handleChangeInterSection(inView)} triggerOnce={true}>
@@ -122,7 +130,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
122
130
  {suboption?.name}
123
131
  </OText>
124
132
  </IconControl>
125
- {option?.allow_suboption_quantity && state?.selected && (
133
+ {!(option?.max === 1 && option?.min === 1) && option?.allow_suboption_quantity && state?.selected && (
126
134
  <QuantityControl>
127
135
  <>
128
136
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
@@ -135,11 +143,11 @@ export const ProductOptionSubOptionUI = (props: any) => {
135
143
  <OText size={12}>
136
144
  {state.quantity}
137
145
  </OText>
138
- <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
146
+ <Checkbox disabled={disabled || disableIncrement || usePizzaValidation} onPress={increment}>
139
147
  <IconAntDesign
140
148
  name='pluscircleo'
141
149
  size={iconsSize}
142
- color={disableIncrement || disabled ? theme.colors.disabled : theme.colors.primary}
150
+ color={disableIncrement || disabled || usePizzaValidation ? theme.colors.disabled : theme.colors.primary}
143
151
  />
144
152
  </Checkbox>
145
153
  </>
@@ -157,7 +165,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
157
165
  style={styles.inverse}
158
166
  />
159
167
  </Circle>
160
- <Circle disabled={disabled} onPress={() => changePosition('whole')}>
168
+ <Circle disabled={disabled || (pizzaState?.[`option:${option?.id}`]?.value === option?.max)} onPress={() => changePosition('whole')}>
161
169
  <OIcon
162
170
  src={theme.images.general.half_f}
163
171
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
@@ -233,7 +233,7 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
233
233
  <CalendarWrapper>
234
234
  {(timeList?.length > 0 && isEnabled) ? (
235
235
  <SelectDropdown
236
- ref={dropdownRef}
236
+ ref={dropdownRef}
237
237
  data={timeList}
238
238
  onSelect={(selectedItem, index) => {
239
239
  console.log(selectedItem.value)
@@ -244,7 +244,7 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
244
244
  rowTextForSelection={(item, index) => {
245
245
  return item.text
246
246
  }}
247
- buttonStyle={{borderRadius: 7.6, ...styles.selectOption}}
247
+ buttonStyle={{ borderRadius: 7.6, ...styles.selectOption }}
248
248
  buttonTextStyle={{
249
249
  color: theme.colors.disabled,
250
250
  fontSize: 14,
@@ -267,7 +267,7 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
267
267
  }}
268
268
  renderCustomizedRowChild={(item, index) => {
269
269
  return (
270
- <Text style={[styles.dropDownRow, { color: isBusyTime(professional, getMomentTime(item.value)) ? theme.colors.lightGray : theme.colors.primary } ]}>
270
+ <Text style={[styles.dropDownRow, { color: isBusyTime(professional, getMomentTime(item.value)) ? theme.colors.lightGray : theme.colors.primary }]}>
271
271
  {item.text}
272
272
  </Text>
273
273
  )
@@ -326,11 +326,10 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
326
326
  </ScheduleWrapper>
327
327
  <ButtonWrapper>
328
328
  <OButton
329
- bgColor={theme.colors.primary}
330
329
  onClick={() => handleSelectProfessional()}
331
330
  text={t('BOOK', 'Book')}
332
331
  style={styles.buttonStyle}
333
- textStyle={{ fontSize: 14, color: theme.colors.white }}
332
+ textStyle={{ fontSize: 14 }}
334
333
  />
335
334
  </ButtonWrapper>
336
335
  </Container>
@@ -171,7 +171,7 @@ const PromotionsUI = (props: PromotionParams) => {
171
171
  onClick={() => handleClickOffer(offer)}
172
172
  text={t('VIEW', 'View')}
173
173
  style={styles.buttonStyle}
174
- textStyle={{ fontSize: 14, color: '#fff', flexWrap: 'nowrap' }}
174
+ textStyle={{ fontSize: 14, flexWrap: 'nowrap' }}
175
175
  />
176
176
  </WrapperSingleOffer>
177
177
  ))}
@@ -182,7 +182,7 @@ const PromotionsUI = (props: PromotionParams) => {
182
182
  title={``}
183
183
  onClose={() => setOpenModal(false)}
184
184
  >
185
- <View style={{ padding: 20 }}>
185
+ <ScrollView style={{ padding: 20 }}>
186
186
  <OText style={{ alignSelf: 'center', fontWeight: '700' }} mBottom={20}>
187
187
  {offerSelected?.name} / {t('VALUE_OF_OFFER', 'Value of offer')}: {offerSelected?.rate_type === 1 ? `${offerSelected?.rate}%` : `${parsePrice(offerSelected?.rate)}`}
188
188
  </OText>
@@ -210,10 +210,7 @@ const PromotionsUI = (props: PromotionParams) => {
210
210
  <OText style={{ marginTop: 10, marginBottom: 10 }}>
211
211
  {t('AVAILABLE_BUSINESSES_FOR_OFFER', 'Available businesses for this offer')}:
212
212
  </OText>
213
- <ScrollView
214
- showsVerticalScrollIndicator={false}
215
- style={{ height: '68%' }}
216
- >
213
+ <View style={{ marginBottom: 70 }}>
217
214
  {offerSelected?.businesses?.map((business: any) => {
218
215
  return (
219
216
  <SingleBusinessOffer key={business.id}>
@@ -238,14 +235,14 @@ const PromotionsUI = (props: PromotionParams) => {
238
235
  onClick={() => handleBusinessClick(business)}
239
236
  text={t('GO_TO_BUSINESSS', 'Go to business')}
240
237
  style={styles.modalButtonStyle}
241
- textStyle={{ fontSize: 10, color: '#fff' }}
238
+ textStyle={{ fontSize: 10 }}
242
239
  />
243
240
  </BusinessInfo>
244
241
  </SingleBusinessOffer>
245
242
  )
246
243
  })}
247
- </ScrollView>
248
- </View>
244
+ </View>
245
+ </ScrollView>
249
246
  </OModal>
250
247
  </PromotionsContainer>
251
248
  </Container>
@@ -293,7 +293,7 @@ const ReviewDriverUI = (props: ReviewDriverParams) => {
293
293
  <FloatingBottomContainer>
294
294
  <ActionContainer>
295
295
  <OButton
296
- textStyle={{ color: theme.colors.white, paddingRight: 10 }}
296
+ textStyle={{ paddingRight: 10 }}
297
297
  text={t('SEND_REVIEW', 'Send Review')}
298
298
  style={{ borderRadius: 8 }}
299
299
  imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}