ordering-ui-react-native 0.22.41 → 0.22.42-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 (161) hide show
  1. package/package.json +6 -8
  2. package/src/DeliveryApp.tsx +1 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  8. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  9. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  10. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  11. package/themes/business/src/components/Chat/index.tsx +15 -3
  12. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  13. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  14. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  15. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  16. package/themes/business/src/components/LogoutButton/index.tsx +14 -5
  17. package/themes/business/src/components/MapView/index.tsx +42 -22
  18. package/themes/business/src/components/NewOrderNotification/index.tsx +38 -19
  19. package/themes/business/src/components/OrderDetails/Business.tsx +34 -16
  20. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  21. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
  22. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  23. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  24. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  25. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  26. package/themes/business/src/components/OrderSummary/index.tsx +6 -4
  27. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  28. package/themes/business/src/components/OrdersOption/index.tsx +332 -231
  29. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  30. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  31. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +29 -18
  32. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  33. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  34. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  35. package/themes/business/src/components/PrinterEdition/index.tsx +310 -97
  36. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  37. package/themes/business/src/components/PrinterSettings/index.tsx +101 -90
  38. package/themes/business/src/components/PrinterSettings/styles.tsx +9 -0
  39. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  41. package/themes/business/src/components/StoresList/index.tsx +2 -2
  42. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  43. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  44. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  45. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  46. package/themes/business/src/config/currency.tsx +1010 -0
  47. package/themes/business/src/hooks/useLocation.tsx +16 -12
  48. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  49. package/themes/business/src/types/index.tsx +22 -7
  50. package/themes/business/src/utils/index.tsx +28 -3
  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 +9 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +11 -0
  62. package/themes/original/src/components/AddressForm/index.tsx +25 -17
  63. package/themes/original/src/components/AddressList/index.tsx +8 -7
  64. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  65. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  66. package/themes/original/src/components/BusinessItemAccordion/index.tsx +14 -6
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  68. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +8 -6
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  70. package/themes/original/src/components/BusinessPreorder/index.tsx +46 -28
  71. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  72. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  73. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  74. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  75. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  76. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  77. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  79. package/themes/original/src/components/Cart/index.tsx +49 -15
  80. package/themes/original/src/components/CartContent/index.tsx +2 -4
  81. package/themes/original/src/components/Checkout/index.tsx +127 -79
  82. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  83. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  84. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  85. package/themes/original/src/components/Favorite/index.tsx +1 -5
  86. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  87. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  88. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  89. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  90. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  91. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  92. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  93. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  94. package/themes/original/src/components/Help/index.tsx +2 -0
  95. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  96. package/themes/original/src/components/Home/index.tsx +35 -19
  97. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  98. package/themes/original/src/components/LoginForm/index.tsx +13 -10
  99. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  100. package/themes/original/src/components/Messages/index.tsx +20 -13
  101. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  102. package/themes/original/src/components/MomentOption/index.tsx +80 -52
  103. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  104. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -4
  105. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  106. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  107. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  108. package/themes/original/src/components/NavBar/index.tsx +7 -4
  109. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  110. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  111. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  112. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +16 -11
  113. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  114. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  115. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  116. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  117. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  118. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  119. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  120. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  121. package/themes/original/src/components/PaymentOptions/index.tsx +462 -461
  122. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  123. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  124. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  125. package/themes/original/src/components/ProductForm/ActionButton.tsx +7 -12
  126. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  127. package/themes/original/src/components/ProductItemAccordion/index.tsx +30 -38
  128. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  129. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  130. package/themes/original/src/components/Promotions/index.tsx +2 -2
  131. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  132. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  133. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  134. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  135. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  136. package/themes/original/src/components/Sessions/index.tsx +3 -3
  137. package/themes/original/src/components/SignupForm/index.tsx +44 -32
  138. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  139. package/themes/original/src/components/SingleProductCard/index.tsx +5 -5
  140. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  141. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  142. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  143. package/themes/original/src/components/StripeElementsForm/index.tsx +8 -4
  144. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  145. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  146. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  147. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +8 -5
  148. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  149. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  150. package/themes/original/src/components/UserFormDetails/index.tsx +102 -74
  151. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  152. package/themes/original/src/components/UserVerification/index.tsx +15 -4
  153. package/themes/original/src/components/Wallets/index.tsx +6 -3
  154. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  155. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  156. package/themes/original/src/components/shared/OButton.tsx +5 -4
  157. package/themes/original/src/components/shared/OInput.tsx +4 -8
  158. package/themes/original/src/components/shared/OModal.tsx +7 -2
  159. package/themes/original/src/types/index.tsx +12 -4
  160. package/themes/original/src/utils/index.tsx +29 -0
  161. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -48,11 +48,13 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
48
48
  const hideAddButton = theme?.business_view?.components?.products?.components?.add_to_cart_button?.hidden ?? true
49
49
  const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
50
50
  const hideProductDescription = theme?.business_view?.components?.products?.components?.product?.components?.description?.hidden
51
+ const hideProductDummyLogo = theme?.business_view?.components?.products?.components?.product?.components?.dummy?.hidden
51
52
  const hideProductLogo = viewString
52
53
  ? theme?.[viewString]?.components?.cart?.components?.products?.image?.hidden
53
54
  : theme?.business_view?.components?.products?.components?.product?.components?.image?.hidden
54
55
  const textSize = isChewLayout ? 12 : 10
55
56
  const logoPosition = theme?.business_view?.components?.products?.components?.product?.components?.image?.position
57
+ const hideFavoriteIcon = theme?.business_view?.components?.products?.components?.product?.components?.favorite?.hidden
56
58
 
57
59
  const styles = StyleSheet.create({
58
60
  container: {
@@ -197,7 +199,7 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
197
199
  style={{ ...styles.line18, flex: 1 }}>
198
200
  {product?.name}
199
201
  </OText>
200
- {!isPreviously && (
202
+ {!isPreviously && !hideFavoriteIcon && (
201
203
  <LottieAnimation
202
204
  type='favorite'
203
205
  onClick={handleChangeFavorite}
@@ -283,7 +285,7 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
283
285
  </OText>
284
286
  </RibbonBox>
285
287
  )}
286
- {!hideProductLogo && (
288
+ {(!hideProductLogo && (product?.images || !hideProductDummyLogo)) && (
287
289
  <FastImage
288
290
  style={styles.productStyle}
289
291
  source={product?.images ? {
@@ -313,9 +315,7 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
313
315
  height: 40
314
316
 
315
317
  }}
316
- bgColor={isSoldOut ? '#B8B8B8' : theme?.colors?.white}
317
- borderColor={theme?.colors.primary}
318
- textStyle={{ color: theme.colors.primary }}
318
+ isDisabled={isSoldOut}
319
319
  text={t('ADD', 'Add')}
320
320
  />
321
321
  )}
@@ -49,15 +49,12 @@ export const RibbonBox = styled.View`
49
49
  background-color: ${(props: any) => props.theme.colors.primary};
50
50
  padding: 1px 8px;
51
51
  max-width: 60px;
52
-
53
52
  ${(props: any) => props.bgColor && css`
54
53
  background-color: ${props.bgColor};
55
54
  `}
56
-
57
55
  ${(props: any) => props.isRoundRect && css`
58
56
  border-radius: 7.6px;
59
57
  `}
60
-
61
58
  ${(props: any) => props.isCapsule && css`
62
59
  border-radius: 50px;
63
60
  `}
@@ -65,9 +65,6 @@ const StripeCardFormUI = (props: any) => {
65
65
  <OButton
66
66
  text={loading ? t('LOADING', 'Loading...') : t('ADD', 'Add')}
67
67
  isDisabled={!cardState?.valid || loading}
68
- bgColor={theme.colors.primary}
69
- borderColor={theme.colors.primary}
70
- textStyle={{ color: 'white' }}
71
68
  imgRightSrc={null}
72
69
  onClick={handleSubmit}
73
70
  />
@@ -26,12 +26,14 @@ export const StripeCardsListUI = (props: any) => {
26
26
  const {
27
27
  onSelectCard,
28
28
  deleteCard,
29
- cardSelected,
30
29
  cardsList,
31
30
  handleCardClick,
32
31
  onOpen,
33
32
  gateway,
34
- paySelected
33
+ paySelected,
34
+ newCardAdded,
35
+ addNewCardAsDefault,
36
+ setUserHasCards
35
37
  } = props;
36
38
 
37
39
  const theme = useTheme();
@@ -55,6 +57,17 @@ export const StripeCardsListUI = (props: any) => {
55
57
  }
56
58
  }, [cardsList?.loading])
57
59
 
60
+ useEffect(() => {
61
+ if (newCardAdded && addNewCardAsDefault) {
62
+ handleCardSelected(newCardAdded)
63
+ }
64
+ }, [JSON.stringify(newCardAdded)])
65
+
66
+ useEffect(() => {
67
+ const hasCardSelected = cardsList?.cards?.some?.((card : any) => card?.id === paySelected?.data?.id)
68
+ setUserHasCards && setUserHasCards(cardsList?.cards?.length > 0 && hasCardSelected)
69
+ }, [cardsList?.cards?.length, paySelected])
70
+
58
71
  return (
59
72
  <>
60
73
  {token && !cardsList.loading && cardsList.cards && cardsList.cards.length === 0 && (
@@ -96,7 +109,7 @@ export const StripeCardsListUI = (props: any) => {
96
109
  <OSItem key={card.id} isUnique={cardsList.cards.length} isInvalid={!card?.zipcode && validateZipcodeCard}>
97
110
  <OSItemContent onPress={() => handleCardSelected(card)}>
98
111
  <View style={styles.viewStyle}>
99
- {(card.id === cardSelected?.id || card.id === paySelected?.data?.id) ? (
112
+ {(card.id === paySelected?.data?.id) ? (
100
113
  <OIcon
101
114
  src={theme.images.general.radio_act}
102
115
  width={16}
@@ -35,9 +35,10 @@ const StripeElementsFormUI = (props: any) => {
35
35
  setPlaceByMethodPay,
36
36
  cartTotal,
37
37
  publicKeyAddCard,
38
- urlScheme,
38
+ urlscheme,
39
39
  androidAppId,
40
- businessNames
40
+ businessNames,
41
+ setNewCardAdded
41
42
  } = props;
42
43
 
43
44
  const theme = useTheme();
@@ -150,6 +151,10 @@ const StripeElementsFormUI = (props: any) => {
150
151
  const _isNewCard = index === 0
151
152
  stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId, _isNewCard);
152
153
  })
154
+ setNewCardAdded?.({
155
+ ...card,
156
+ id: setupIntent?.paymentMethodId
157
+ })
153
158
  } else {
154
159
  stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId);
155
160
  }
@@ -213,7 +218,7 @@ const StripeElementsFormUI = (props: any) => {
213
218
  <StripeProvider
214
219
  publishableKey={isToSave}
215
220
  merchantIdentifier={merchantId}
216
- urlScheme={`${urlScheme}://checkout/${cart?.uuid}`}
221
+ urlscheme={`${urlscheme}://checkout/${cart?.uuid}`}
217
222
  >
218
223
  {methodsPay?.includes(paymethod) ? (
219
224
  <StripeMethodForm
@@ -282,7 +287,6 @@ const StripeElementsFormUI = (props: any) => {
282
287
  bgColor={isCompleted ? theme.colors.primary : theme.colors.backgroundGray}
283
288
  borderColor={isCompleted ? theme.colors.primary : theme.colors.backgroundGray}
284
289
  style={styles.btnAddStyle}
285
- textStyle={{ color: 'white' }}
286
290
  imgRightSrc={null}
287
291
  onClick={() => handleSaveCard()}
288
292
  isDisabled={!isCompleted}
@@ -53,7 +53,7 @@ export const StripeElementsForm = (props: any) => {
53
53
  const result = await fetch(`${ordering.root}/payments/stripe/cards`, {
54
54
  method: 'POST',
55
55
  headers: {
56
- Authorization: `Bearer ${user?.session?.access_token}`,
56
+ Authorization: `Bearer ${token}`,
57
57
  'Content-Type': 'application/json'
58
58
  },
59
59
  body: JSON.stringify({
@@ -138,9 +138,6 @@ const StripeRedirectFormUI = (props: any) => {
138
138
  <OButton
139
139
  // text={formState.isSubmitting ? t('LOADING', 'Loading...') : t('OK', 'OK')}
140
140
  text={t('OK', 'OK')}
141
- bgColor={theme.colors.primary}
142
- borderColor={theme.colors.primary}
143
- textStyle={{ color: 'white' }}
144
141
  imgRightSrc={null}
145
142
  // isDisabled={formState.isSubmitting}
146
143
  // onClick={() => handleSubmit(onSubmit)}
@@ -14,7 +14,8 @@ interface taxInformationParams {
14
14
  percentage?: number,
15
15
  id: number,
16
16
  discounts?: any,
17
- rate_type?: number
17
+ rate_type?: number,
18
+ target?: string
18
19
  },
19
20
  products: Array<any>,
20
21
  type: string
@@ -34,7 +35,7 @@ export const TaxInformation = (props: taxInformationParams) => {
34
35
  const offersHideArray = ['offer_target_2', 'offer_target_3']
35
36
  const hideProductsSectionOffers = offersHideArray.includes(type)
36
37
  const dataHideArray : Array<string | number> = ['platform', 'business']
37
- const hideProductsSectionData = dataHideArray.includes(data.type)
38
+ const hideProductsSectionData = dataHideArray.includes(data.type) || data?.target === 'delivery_fee'
38
39
 
39
40
  const getFilterValidation = (product: any) => {
40
41
  return (
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react'
2
- import { Platform, StyleSheet, View } from 'react-native'
2
+ import { Platform, StyleSheet, View, Vibration } from 'react-native'
3
3
  import {
4
4
  useLanguage,
5
5
  useOrder,
@@ -90,6 +90,11 @@ export const UpsellingContent = (props: any) => {
90
90
  setShowTitle(contentOffset.y > 30)
91
91
  }
92
92
 
93
+ const handleClickCheckout = () => {
94
+ Vibration.vibrate(100)
95
+ handleUpsellingPage(cart)
96
+ }
97
+
93
98
  return (
94
99
  <>
95
100
  <View style={styles.wrapperNavbar}>
@@ -158,11 +163,9 @@ export const UpsellingContent = (props: any) => {
158
163
  <OButton
159
164
  imgRightSrc=''
160
165
  text={t('CHECKOUT', 'Checkout')}
161
- textStyle={{ color: theme.colors.white, fontSize: 14 }}
162
- bgColor={theme.colors.primary}
163
- borderColor={theme.colors.primary}
166
+ textStyle={{ fontSize: 14 }}
164
167
  style={{ ...styles.closeUpsellingButton }}
165
- onClick={() => handleUpsellingPage(cart)}
168
+ onClick={() => handleClickCheckout()}
166
169
  />
167
170
  </View>
168
171
  </>
@@ -25,6 +25,9 @@ export const UpsellingLayout = (props : any) => {
25
25
  const [{ parsePrice }] = useUtils()
26
26
  const [, t] = useLanguage()
27
27
 
28
+ const hideProductDummyLogo = theme?.business_view?.components?.products?.components?.product?.components?.dummy?.hidden
29
+
30
+
28
31
  const styles = StyleSheet.create({
29
32
  imageStyle: {
30
33
  width: 73,
@@ -66,9 +69,11 @@ export const UpsellingLayout = (props : any) => {
66
69
  <OText size={10} color={theme.colors.primary}>{t('ADD', 'Add')}</OText>
67
70
  </AddButton>
68
71
  </View>
69
- <View>
70
- <OIcon url={product?.images || theme?.images?.dummies?.product} style={styles.imageStyle} />
71
- </View>
72
+ {(product?.images || !hideProductDummyLogo) && (
73
+ <View>
74
+ <OIcon url={product?.images || theme?.images?.dummies?.product} style={styles.imageStyle} />
75
+ </View>
76
+ )}
72
77
  </Item>
73
78
  )) : (
74
79
  <OText>
@@ -35,7 +35,8 @@ const UserDetailsUI = (props: any) => {
35
35
  handleSendVerifyCode,
36
36
  verifyPhoneState,
37
37
  setFormState,
38
- setIsOpen
38
+ setIsOpen,
39
+ isCheckoutPlace
39
40
  } = props
40
41
 
41
42
  const theme = useTheme();
@@ -95,23 +96,23 @@ const UserDetailsUI = (props: any) => {
95
96
  },
96
97
  });
97
98
  handleSendVerifyCode({
98
- cellphone: cellphone,
99
- country_phone_code: countryPhoneCode
99
+ cellphone: cellphone,
100
+ country_phone_code: countryPhoneCode
100
101
  })
101
102
  }
102
103
  }
103
104
 
104
105
  const handleSendPhoneCode = (values: any) => {
105
- setWillVerifyOtpState(false)
106
+ setWillVerifyOtpState(false)
106
107
  setIsModalVisible(false)
107
- setFormState({
108
- ...formState,
109
- changes: {
110
- ...formState?.changes,
111
- verification_code: values?.code
112
- }
113
- })
114
- }
108
+ setFormState({
109
+ ...formState,
110
+ changes: {
111
+ ...formState?.changes,
112
+ verification_code: values?.code
113
+ }
114
+ })
115
+ }
115
116
 
116
117
  useEffect(() => {
117
118
  if (willVerifyOtpState) handleVerifyCodeClick()
@@ -158,7 +159,7 @@ const UserDetailsUI = (props: any) => {
158
159
  {t('CUSTOMER_DETAILS', 'Customer Details')}
159
160
  </OText>
160
161
  )}
161
- {cartStatus !== 2 && !requiredFields && (
162
+ {cartStatus !== 2 && !isCheckoutPlace && (
162
163
  !isEdit ? (
163
164
  <EditBtn onPress={() => toggleIsEdit()} activeOpacity={0.7}>
164
165
  <OIcon
@@ -189,12 +190,12 @@ const UserDetailsUI = (props: any) => {
189
190
  {userData?.name} {userData?.middle_name} {userData?.lastname} {userData?.second_lastname}
190
191
  </OText>
191
192
  <OText size={12} lineHeight={18} weight={'400'}>
192
- {userData?.email}
193
+ {userData?.guest_id ? userData?.guest_email : userData?.email}
193
194
  </OText>
194
- {!!(userData?.cellphone || user?.cellphone) && (
195
+ {!!((userData?.cellphone ?? userData?.guest_cellphone) || (user?.cellphone ?? user?.guest_cellphone)) && (
195
196
  <>
196
197
  <OText size={12} lineHeight={18} weight={'400'}>
197
- {(userData?.country_phone_code) && `+${(userData?.country_phone_code)} `}{(userData?.cellphone)}
198
+ {(userData?.country_phone_code) && `+${(userData?.country_phone_code)} `}{(userData?.guest_id ? user?.guest_cellphone : userData?.cellphone)}
198
199
  </OText>
199
200
  {!!phoneUpdate && (
200
201
  <OText color={theme.colors.error} style={{ textAlign: 'center' }}>{t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number')}</OText>
@@ -16,6 +16,8 @@ import { ListItem } from '../UserProfile/styles';
16
16
  import moment from 'moment';
17
17
  import { DatePickerUI } from '../DatePicker';
18
18
 
19
+ const CONDITIONAL_CODES = ['PR']
20
+
19
21
  export const UserFormDetailsUI = (props: any) => {
20
22
  const {
21
23
  isEdit,
@@ -36,7 +38,12 @@ export const UserFormDetailsUI = (props: any) => {
36
38
  isCheckout,
37
39
  setIsOpen,
38
40
  handleRemoveAccount,
39
- isProfile
41
+ isProfile,
42
+ isGuest,
43
+ isOrderTypeValidationField,
44
+ checkoutFields,
45
+ isCheckoutPlace,
46
+ setCellphoneStartZero
40
47
  } = props;
41
48
 
42
49
  const theme = useTheme();
@@ -78,7 +85,7 @@ export const UserFormDetailsUI = (props: any) => {
78
85
  const [, { showToast }] = useToast();
79
86
  const { handleSubmit, control, errors, setValue } = useForm();
80
87
 
81
- const [{ user }, { login }] = useSession();
88
+ const [{ user }, { login, logout }] = useSession();
82
89
  const [userPhoneNumber, setUserPhoneNumber] = useState<any>(null);
83
90
  const [isValid, setIsValid] = useState(false)
84
91
  const [isChanged, setIsChanged] = useState(false)
@@ -95,8 +102,8 @@ export const UserFormDetailsUI = (props: any) => {
95
102
  const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
96
103
 
97
104
  const isAdmin = user?.level === 0
98
- const showInputPhoneNumber = (validationFields?.fields?.checkout?.cellphone?.enabled ?? false) || configs?.verification_phone_required?.value === '1'
99
- const showInputBirthday = validationFields?.fields?.checkout?.birthdate?.enabled ?? false
105
+ const showInputPhoneNumber = isOrderTypeValidationField ? checkoutFields?.find(field => field?.validation_field?.code === 'mobile_phone')?.enabled : (validationFields?.fields?.checkout?.cellphone?.enabled ?? false)
106
+ const showInputBirthday = isOrderTypeValidationField ? checkoutFields?.find(field => field?.validation_field?.code === 'birthdate')?.enabled : (validationFields?.fields?.checkout?.birthdate?.enabled ?? false)
100
107
 
101
108
  const handleSuccessSignup = (user: any) => {
102
109
  login({
@@ -127,15 +134,27 @@ export const UserFormDetailsUI = (props: any) => {
127
134
  return rules;
128
135
  };
129
136
 
137
+ const cellphoneValue = () => {
138
+ let cellphone = user?.guest_id ? user?.guest_cellphone : user?.cellphone
139
+ if (cellphone && CONDITIONAL_CODES.includes(user?.country_code)) {
140
+ if (user?.country_code === 'PR') {
141
+ cellphone = user?.cellphone?.slice(3)
142
+ }
143
+ }
144
+ return cellphone
145
+ }
146
+
130
147
  const setUserCellPhone = (isEdit = false) => {
131
148
  if (userPhoneNumber && !userPhoneNumber.includes('null') && !isEdit) {
132
149
  setUserPhoneNumber(userPhoneNumber);
133
150
  return;
134
151
  }
135
- if (user?.cellphone) {
152
+ const cellphone = user?.guest_id ? user?.guest_cellphone : user?.cellphone
153
+
154
+ if (cellphone) {
136
155
  let phone = null;
137
156
  if (user?.country_phone_code) {
138
- phone = `+${user?.country_phone_code} ${user?.cellphone}`;
157
+ phone = `+${user?.country_phone_code} ${cellphone}`;
139
158
  } else {
140
159
  phone = user?.cellphone;
141
160
  }
@@ -144,17 +163,22 @@ export const UserFormDetailsUI = (props: any) => {
144
163
  ...phoneInputData,
145
164
  phone: {
146
165
  country_phone_code: user?.country_phone_code || null,
147
- cellphone: user?.cellphone || null,
166
+ cellphone: cellphoneValue()
148
167
  },
149
168
  });
150
169
  return;
151
170
  }
152
- setUserPhoneNumber(user?.cellphone || '');
171
+ setUserPhoneNumber(cellphone || '');
153
172
  };
154
173
 
155
174
  const onSubmit = () => {
175
+ let content = ''
176
+ if (requiredFields?.includes?.('birthdate') && !birthdate) {
177
+ content = content + `${t('VALIDATION_ERROR_BIRTHDATE_REQUIRED', 'Birthdate is required')}\n`
178
+ }
156
179
  if (phoneInputData.error) {
157
- showToast(ToastType.Error, phoneInputData.error);
180
+ content = content + `${phoneInputData.error}\n`
181
+ showToast(ToastType.Error, content);
158
182
  return;
159
183
  }
160
184
  if (Object.keys(formState.changes).length > 0) {
@@ -162,17 +186,16 @@ export const UserFormDetailsUI = (props: any) => {
162
186
  formState.changes?.cellphone === null &&
163
187
  ((validationFields?.fields?.checkout?.cellphone?.enabled &&
164
188
  validationFields?.fields?.checkout?.cellphone?.required) ||
165
- configs?.verification_phone_required?.value === '1')
189
+ (configs?.verification_phone_required?.value === '1' && !user?.guest_id))
166
190
  ) {
167
- showToast(
168
- ToastType.Error,
169
- t(
170
- 'VALIDATION_ERROR_MOBILE_PHONE_REQUIRED',
171
- 'The field Phone Number is required.',
172
- ),
173
- );
191
+ content = content + `${t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone Number is required.',)}\n`
192
+ showToast(ToastType.Error, content);
174
193
  return;
175
194
  }
195
+ if (content.length > 0) {
196
+ showToast(ToastType.Error, content);
197
+ return
198
+ }
176
199
  let changes = null;
177
200
  if (user?.cellphone && !userPhoneNumber) {
178
201
  changes = {
@@ -185,7 +208,7 @@ export const UserFormDetailsUI = (props: any) => {
185
208
  }
186
209
  };
187
210
 
188
- const handleChangePhoneNumber = (number: any) => {
211
+ const handleChangePhoneNumber = (number: any, rawNumber : any) => {
189
212
  setPhoneInputData(number);
190
213
  setIsChanged(true)
191
214
  let phoneNumber = {
@@ -198,6 +221,7 @@ export const UserFormDetailsUI = (props: any) => {
198
221
  value: number.phone.cellphone,
199
222
  },
200
223
  };
224
+ setCellphoneStartZero && setCellphoneStartZero(rawNumber?.number && rawNumber?.countryCallingCode ? rawNumber?.number : null)
201
225
  handleChangeInput(phoneNumber, true);
202
226
  };
203
227
 
@@ -223,9 +247,12 @@ export const UserFormDetailsUI = (props: any) => {
223
247
  open: true,
224
248
  content: [t('QUESTION_REMOVE_ACCOUNT', 'Are you sure that you want to remove your account?')],
225
249
  title: t('ACCOUNT_ALERT', 'Account alert'),
226
- handleOnAccept: () => {
250
+ handleOnAccept: async () => {
227
251
  setConfirm({ ...confirm, open: false })
228
- handleRemoveAccount && handleRemoveAccount(user?.id)
252
+ const response = await handleRemoveAccount?.(user?.id)
253
+ if (response === 'OK'){
254
+ logout()
255
+ }
229
256
  }
230
257
  })
231
258
  }
@@ -298,16 +325,16 @@ export const UserFormDetailsUI = (props: any) => {
298
325
  <>
299
326
  <UDForm>
300
327
  {!validationFields?.loading &&
301
- sortInputFields({ values: validationFields?.fields?.checkout })
328
+ sortInputFields({ values: isOrderTypeValidationField ? checkoutFields : validationFields?.fields?.checkout })
302
329
  .length > 0 && (
303
330
  <UDWrapper>
304
331
  {sortInputFields({
305
- values: validationFields.fields?.checkout,
332
+ values: isOrderTypeValidationField ? checkoutFields : validationFields?.fields?.checkout,
306
333
  }).map(
307
334
  (item: any) => {
308
335
  const field = item?.validation_field || item
309
- return (showField &&
310
- showField(field.code) && ((requiredFields && requiredFields.includes(field.code)) || !requiredFields) && (
336
+ return (
337
+ ((isOrderTypeValidationField ? item?.enabled : (showField && showField(field.code))) && ((requiredFields && requiredFields?.includes?.(field.code)) || !requiredFields || !isCheckoutPlace)) && (
311
338
  <React.Fragment key={field.id}>
312
339
  <Controller
313
340
  key={field.id}
@@ -331,7 +358,7 @@ export const UserFormDetailsUI = (props: any) => {
331
358
  isDisabled={false}
332
359
  value={
333
360
  formState?.changes[field.code] ??
334
- (user && user[field.code]) ??
361
+ (user && user?.guest_id && field.code === 'email' ? user?.guest_email : user?.[field.code]) ??
335
362
  ''
336
363
  }
337
364
  onChange={(val: any) => {
@@ -375,52 +402,58 @@ export const UserFormDetailsUI = (props: any) => {
375
402
  )}
376
403
  name={field.code}
377
404
  rules={getInputRules(field)}
378
- defaultValue={user && user[field.code]}
405
+ defaultValue={user && (field.code === 'email' && user?.guest_id ? user?.guest_email : user?.[field.code])}
379
406
  />
380
407
  </React.Fragment>
381
408
  ))
382
409
  },
383
410
  )}
384
- {showInputBirthday && (
385
- <>
386
- <WrapperBirthdate>
387
- <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ textTransform: 'capitalize', alignSelf: 'flex-start' }}>
388
- {t('BIRTHDATE', 'Birthdate')}
389
- </OText>
390
- <TouchableOpacity onPress={() => setShowDatePicker(!showDatePicker)}>
391
- <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ marginTop: 6 }}>
392
- {birthdate ? moment(birthdate).format('YYYY-MM-DD') : ''}
411
+ {((!user?.guest_id && showInputBirthday) || (isOrderTypeValidationField || user?.guest_id)) &&
412
+ showInputBirthday &&
413
+ ((requiredFields && requiredFields?.includes?.('birthdate')) || !requiredFields || !isCheckoutPlace) &&
414
+ (
415
+ <>
416
+ <WrapperBirthdate>
417
+ <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ textTransform: 'capitalize', alignSelf: 'flex-start' }}>
418
+ {t('BIRTHDATE', 'Birthdate')}
393
419
  </OText>
394
- </TouchableOpacity>
395
- </WrapperBirthdate>
396
- <DatePickerUI open={showDatePicker} birthdate={birthdate} onConfirm={_handleChangeDate} onCancel={() => setShowDatePicker(false)} />
397
- </>
398
- )}
399
- {!!showInputPhoneNumber && ((requiredFields && requiredFields.includes('cellphone')) || !requiredFields) && (
400
- <WrapperPhone>
401
- <OText size={14} lineHeight={21} weight={'500'} color={theme.colors.textNormal}>{t('PHONE', 'Phone')}</OText>
402
- <PhoneInputNumber
403
- data={phoneInputData}
404
- handleData={(val: any) => handleChangePhoneNumber(val)}
405
- changeCountry={(val: any) => changeCountry(val)}
406
- defaultValue={phoneUpdate ? '' : user?.cellphone}
407
- defaultCode={user?.country_code ?? user?.country_phone_code ?? null}
408
- boxStyle={styles.phoneSelect}
409
- inputStyle={styles.phoneInputStyle}
410
- textStyle={{ color: theme.colors.textNormal, fontSize: 12, padding: 0 }}
411
- noDropIcon
412
- />
413
- {phoneUpdate && (
414
- <OText
415
- size={10}
416
- color={theme.colors.error}
417
- style={{ marginHorizontal: 10, textAlign: 'center' }}>
418
- {t('YOUR_PREVIOUS_CELLPHONE', 'Your previous cellphone')}:{' '}
419
- {user?.cellphone}
420
- </OText>
421
- )}
422
- </WrapperPhone>
423
- )}
420
+ <TouchableOpacity onPress={() => setShowDatePicker(!showDatePicker)}>
421
+ <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ marginTop: 6 }}>
422
+ {birthdate ? moment(birthdate).format('YYYY-MM-DD') : ''}
423
+ </OText>
424
+ </TouchableOpacity>
425
+ </WrapperBirthdate>
426
+ <DatePickerUI open={showDatePicker} birthdate={birthdate} onConfirm={_handleChangeDate} onCancel={() => setShowDatePicker(false)} />
427
+ </>
428
+ )}
429
+ {((!user?.guest_id && !!showInputPhoneNumber) || (isOrderTypeValidationField || user?.guest_id)) &&
430
+ ((requiredFields && requiredFields?.includes?.('cellphone')) || !requiredFields || !isCheckoutPlace) &&
431
+ (
432
+ <WrapperPhone>
433
+ <OText size={14} lineHeight={21} weight={'500'} color={theme.colors.textNormal}>{t('PHONE', 'Phone')}</OText>
434
+ <PhoneInputNumber
435
+ data={phoneInputData}
436
+ handleData={handleChangePhoneNumber}
437
+ changeCountry={(val: any) => changeCountry(val)}
438
+ defaultValue={phoneUpdate ? '' : cellphoneValue()}
439
+ defaultCode={user?.country_code ?? user?.country_phone_code ?? null}
440
+ defaultCodeFallback={user?.country_phone_code}
441
+ boxStyle={styles.phoneSelect}
442
+ inputStyle={styles.phoneInputStyle}
443
+ textStyle={{ color: theme.colors.textNormal, fontSize: 12, padding: 0 }}
444
+ noDropIcon
445
+ />
446
+ {phoneUpdate && (
447
+ <OText
448
+ size={10}
449
+ color={theme.colors.error}
450
+ style={{ marginHorizontal: 10, textAlign: 'center' }}>
451
+ {t('YOUR_PREVIOUS_CELLPHONE', 'Your previous cellphone')}:{' '}
452
+ {cellphoneValue()}
453
+ </OText>
454
+ )}
455
+ </WrapperPhone>
456
+ )}
424
457
  {!requiredFields && (
425
458
  <Controller
426
459
  control={control}
@@ -484,9 +517,7 @@ export const UserFormDetailsUI = (props: any) => {
484
517
  ? t('UPDATING', 'Updating...')
485
518
  : t('UPDATE', 'Update')
486
519
  }
487
- bgColor={theme.colors.primary}
488
- textStyle={{ color: theme.colors.white, fontSize: 14 }}
489
- borderColor={theme.colors.primary}
520
+ textStyle={{ fontSize: 14 }}
490
521
  isDisabled={formState.loading}
491
522
  imgRightSrc={null}
492
523
  style={{ borderRadius: 7.6, shadowOpacity: 0, width: '100%', borderWidth: 1, marginTop: 20, marginBottom: 20 }}
@@ -495,7 +526,7 @@ export const UserFormDetailsUI = (props: any) => {
495
526
  )}
496
527
  </>
497
528
  )}
498
- {requiredFields && (
529
+ {isCheckoutPlace && (
499
530
  <OButton
500
531
  text={
501
532
  formState.loading
@@ -504,12 +535,10 @@ export const UserFormDetailsUI = (props: any) => {
504
535
  ? t('SIGN_UP_AND_PLACE_ORDER', 'Sign up and place order')
505
536
  : t('CONTINUE', 'Continue'))
506
537
  }
507
- bgColor={theme.colors.primary}
508
538
  textStyle={{
509
539
  color: !user?.guest_id && (formState.loading || !isValid) ? theme.colors.primary : theme.colors.white,
510
540
  fontSize: 14
511
541
  }}
512
- borderColor={theme.colors.primary}
513
542
  isDisabled={!user?.guest_id && (formState.loading || !isValid)}
514
543
  imgRightSrc={null}
515
544
  style={{
@@ -523,10 +552,10 @@ export const UserFormDetailsUI = (props: any) => {
523
552
  borderColor: !user?.guest_id && (formState.loading || !isValid) ? theme.colors.white : theme.colors.primary,
524
553
  opacity: !user?.guest_id && (formState.loading || !isValid) ? 0.3 : 1,
525
554
  }}
526
- onClick={!user?.guest_id ? handleSubmit(onSubmit) : () => setIsModalOpen(true)}
555
+ onClick={handleSubmit(onSubmit)}
527
556
  />
528
557
  )}
529
- {isCheckout && !!user?.guest_id && (
558
+ {isCheckout && !!user?.guest_id && !requiredFields && (
530
559
  <TouchableOpacity style={{ marginTop: 10 }} onPress={() => handlePlaceOrderAsGuest()}>
531
560
  <OText color={theme.colors.primary} style={{ textAlign: 'center' }}>{t('PLACE_ORDER_AS_GUEST', 'Place order as guest')}</OText>
532
561
  </TouchableOpacity>
@@ -556,4 +585,3 @@ export const UserFormDetailsUI = (props: any) => {
556
585
  </>
557
586
  );
558
587
  };
559
-