ordering-ui-react-native 0.22.53 → 0.22.54-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 (129) hide show
  1. package/package.json +5 -7
  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/src/providers/AlertProvider.tsx +3 -1
  8. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  9. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  10. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  11. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  12. package/themes/business/src/components/Chat/index.tsx +15 -3
  13. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  14. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  15. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  16. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  17. package/themes/business/src/components/LogoutButton/index.tsx +13 -4
  18. package/themes/business/src/components/MapView/index.tsx +22 -17
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +25 -14
  20. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  21. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  22. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
  23. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  24. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  25. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  26. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  27. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  28. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  29. package/themes/business/src/components/OrdersOption/index.tsx +345 -231
  30. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  31. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
  33. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  34. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  35. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  36. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  37. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  38. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  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/config/currency.tsx +1010 -0
  46. package/themes/business/src/hooks/useLocation.tsx +16 -12
  47. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  48. package/themes/business/src/types/index.tsx +22 -7
  49. package/themes/business/src/utils/index.tsx +28 -3
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  54. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  55. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  56. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  57. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  58. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/original/index.tsx +9 -1
  61. package/themes/original/src/components/AddressForm/index.tsx +19 -8
  62. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  63. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  64. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  65. package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  68. package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
  69. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  70. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  71. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  72. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  73. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  74. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  75. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  76. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  77. package/themes/original/src/components/Cart/index.tsx +48 -13
  78. package/themes/original/src/components/CartContent/index.tsx +2 -3
  79. package/themes/original/src/components/Checkout/index.tsx +109 -82
  80. package/themes/original/src/components/Favorite/index.tsx +1 -5
  81. package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
  82. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  83. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  84. package/themes/original/src/components/Home/index.tsx +35 -16
  85. package/themes/original/src/components/LoginForm/index.tsx +12 -5
  86. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  87. package/themes/original/src/components/Messages/index.tsx +20 -13
  88. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  89. package/themes/original/src/components/MomentOption/index.tsx +72 -51
  90. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  91. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +1 -0
  92. package/themes/original/src/components/MultiCheckout/index.tsx +55 -26
  93. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  94. package/themes/original/src/components/NavBar/index.tsx +6 -2
  95. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  96. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  97. package/themes/original/src/components/OrderDetails/index.tsx +44 -19
  98. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  99. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  100. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  101. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  102. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  103. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  104. package/themes/original/src/components/PaymentOptions/index.tsx +462 -459
  105. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  106. package/themes/original/src/components/ProductForm/ActionButton.tsx +7 -11
  107. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  108. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  109. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  110. package/themes/original/src/components/SignupForm/index.tsx +41 -24
  111. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  112. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  113. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  114. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  115. package/themes/original/src/components/StripeElementsForm/index.tsx +6 -3
  116. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  117. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  118. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  119. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  120. package/themes/original/src/components/UserFormDetails/index.tsx +112 -68
  121. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  122. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  123. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  124. package/themes/original/src/components/shared/OButton.tsx +2 -2
  125. package/themes/original/src/components/shared/OInput.tsx +4 -8
  126. package/themes/original/src/components/shared/OModal.tsx +7 -2
  127. package/themes/original/src/types/index.tsx +12 -4
  128. package/themes/original/src/utils/index.tsx +29 -0
  129. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -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,7 +35,7 @@ const StripeElementsFormUI = (props: any) => {
35
35
  setPlaceByMethodPay,
36
36
  cartTotal,
37
37
  publicKeyAddCard,
38
- urlScheme,
38
+ urlscheme,
39
39
  androidAppId,
40
40
  businessNames,
41
41
  setNewCardAdded
@@ -151,7 +151,10 @@ const StripeElementsFormUI = (props: any) => {
151
151
  const _isNewCard = index === 0
152
152
  stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId, _isNewCard);
153
153
  })
154
- setNewCardAdded(card)
154
+ setNewCardAdded?.({
155
+ ...card,
156
+ id: setupIntent?.paymentMethodId
157
+ })
155
158
  } else {
156
159
  stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId);
157
160
  }
@@ -215,7 +218,7 @@ const StripeElementsFormUI = (props: any) => {
215
218
  <StripeProvider
216
219
  publishableKey={isToSave}
217
220
  merchantIdentifier={merchantId}
218
- urlScheme={`${urlScheme}://checkout/${cart?.uuid}`}
221
+ urlscheme={`${urlscheme}://checkout/${cart?.uuid}`}
219
222
  >
220
223
  {methodsPay?.includes(paymethod) ? (
221
224
  <StripeMethodForm
@@ -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({
@@ -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}>
@@ -160,7 +165,7 @@ export const UpsellingContent = (props: any) => {
160
165
  text={t('CHECKOUT', 'Checkout')}
161
166
  textStyle={{ fontSize: 14 }}
162
167
  style={{ ...styles.closeUpsellingButton }}
163
- onClick={() => handleUpsellingPage(cart)}
168
+ onClick={() => handleClickCheckout()}
164
169
  />
165
170
  </View>
166
171
  </>
@@ -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,15 @@ 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,
47
+ setPhoneState,
48
+ isPhoneVerifyRequired,
49
+ cellphoneOtpSent
40
50
  } = props;
41
51
 
42
52
  const theme = useTheme();
@@ -78,7 +88,7 @@ export const UserFormDetailsUI = (props: any) => {
78
88
  const [, { showToast }] = useToast();
79
89
  const { handleSubmit, control, errors, setValue } = useForm();
80
90
 
81
- const [{ user }, { login }] = useSession();
91
+ const [{ user }, { login, logout }] = useSession();
82
92
  const [userPhoneNumber, setUserPhoneNumber] = useState<any>(null);
83
93
  const [isValid, setIsValid] = useState(false)
84
94
  const [isChanged, setIsChanged] = useState(false)
@@ -95,8 +105,8 @@ export const UserFormDetailsUI = (props: any) => {
95
105
  const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
96
106
 
97
107
  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
108
+ const showInputPhoneNumber = isOrderTypeValidationField ? checkoutFields?.find(field => field?.validation_field?.code === 'mobile_phone')?.enabled : (validationFields?.fields?.checkout?.cellphone?.enabled ?? false)
109
+ const showInputBirthday = isOrderTypeValidationField ? checkoutFields?.find(field => field?.validation_field?.code === 'birthdate')?.enabled : (validationFields?.fields?.checkout?.birthdate?.enabled ?? false)
100
110
 
101
111
  const handleSuccessSignup = (user: any) => {
102
112
  login({
@@ -127,15 +137,27 @@ export const UserFormDetailsUI = (props: any) => {
127
137
  return rules;
128
138
  };
129
139
 
140
+ const cellphoneValue = () => {
141
+ let cellphone = user?.guest_id ? user?.guest_cellphone : user?.cellphone
142
+ if (cellphone && CONDITIONAL_CODES.includes(user?.country_code)) {
143
+ if (user?.country_code === 'PR') {
144
+ cellphone = user?.cellphone?.slice(3)
145
+ }
146
+ }
147
+ return cellphone
148
+ }
149
+
130
150
  const setUserCellPhone = (isEdit = false) => {
131
151
  if (userPhoneNumber && !userPhoneNumber.includes('null') && !isEdit) {
132
152
  setUserPhoneNumber(userPhoneNumber);
133
153
  return;
134
154
  }
135
- if (user?.cellphone) {
155
+ const cellphone = user?.guest_id ? user?.guest_cellphone : user?.cellphone
156
+
157
+ if (cellphone) {
136
158
  let phone = null;
137
159
  if (user?.country_phone_code) {
138
- phone = `+${user?.country_phone_code} ${user?.cellphone}`;
160
+ phone = `+${user?.country_phone_code} ${cellphone}`;
139
161
  } else {
140
162
  phone = user?.cellphone;
141
163
  }
@@ -144,17 +166,22 @@ export const UserFormDetailsUI = (props: any) => {
144
166
  ...phoneInputData,
145
167
  phone: {
146
168
  country_phone_code: user?.country_phone_code || null,
147
- cellphone: user?.cellphone || null,
169
+ cellphone: cellphoneValue()
148
170
  },
149
171
  });
150
172
  return;
151
173
  }
152
- setUserPhoneNumber(user?.cellphone || '');
174
+ setUserPhoneNumber(cellphone || '');
153
175
  };
154
176
 
155
177
  const onSubmit = () => {
178
+ let content = ''
179
+ if (requiredFields?.includes?.('birthdate') && !birthdate) {
180
+ content = content + `${t('VALIDATION_ERROR_BIRTHDATE_REQUIRED', 'Birthdate is required')}\n`
181
+ }
156
182
  if (phoneInputData.error) {
157
- showToast(ToastType.Error, phoneInputData.error);
183
+ content = content + `${phoneInputData.error}\n`
184
+ showToast(ToastType.Error, content);
158
185
  return;
159
186
  }
160
187
  if (Object.keys(formState.changes).length > 0) {
@@ -162,17 +189,16 @@ export const UserFormDetailsUI = (props: any) => {
162
189
  formState.changes?.cellphone === null &&
163
190
  ((validationFields?.fields?.checkout?.cellphone?.enabled &&
164
191
  validationFields?.fields?.checkout?.cellphone?.required) ||
165
- configs?.verification_phone_required?.value === '1')
192
+ (configs?.verification_phone_required?.value === '1' && !user?.guest_id))
166
193
  ) {
167
- showToast(
168
- ToastType.Error,
169
- t(
170
- 'VALIDATION_ERROR_MOBILE_PHONE_REQUIRED',
171
- 'The field Phone Number is required.',
172
- ),
173
- );
194
+ content = content + `${t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone Number is required.',)}\n`
195
+ showToast(ToastType.Error, content);
174
196
  return;
175
197
  }
198
+ if (content.length > 0) {
199
+ showToast(ToastType.Error, content);
200
+ return
201
+ }
176
202
  let changes = null;
177
203
  if (user?.cellphone && !userPhoneNumber) {
178
204
  changes = {
@@ -185,7 +211,7 @@ export const UserFormDetailsUI = (props: any) => {
185
211
  }
186
212
  };
187
213
 
188
- const handleChangePhoneNumber = (number: any) => {
214
+ const handleChangePhoneNumber = (number: any, rawNumber : any) => {
189
215
  setPhoneInputData(number);
190
216
  setIsChanged(true)
191
217
  let phoneNumber = {
@@ -198,6 +224,7 @@ export const UserFormDetailsUI = (props: any) => {
198
224
  value: number.phone.cellphone,
199
225
  },
200
226
  };
227
+ setCellphoneStartZero && setCellphoneStartZero(rawNumber?.number && rawNumber?.countryCallingCode ? rawNumber?.number : null)
201
228
  handleChangeInput(phoneNumber, true);
202
229
  };
203
230
 
@@ -223,9 +250,12 @@ export const UserFormDetailsUI = (props: any) => {
223
250
  open: true,
224
251
  content: [t('QUESTION_REMOVE_ACCOUNT', 'Are you sure that you want to remove your account?')],
225
252
  title: t('ACCOUNT_ALERT', 'Account alert'),
226
- handleOnAccept: () => {
253
+ handleOnAccept: async () => {
227
254
  setConfirm({ ...confirm, open: false })
228
- handleRemoveAccount && handleRemoveAccount(user?.id)
255
+ const response = await handleRemoveAccount?.(user?.id)
256
+ if (response === 'OK'){
257
+ logout()
258
+ }
229
259
  }
230
260
  })
231
261
  }
@@ -294,20 +324,29 @@ export const UserFormDetailsUI = (props: any) => {
294
324
  setIsValid(_isValid)
295
325
  }, [formState?.changes, requiredFields])
296
326
 
327
+ useEffect(() => {
328
+ if (!isPhoneVerifyRequired || cellphoneOtpSent || formState?.changes?.length === 0) return
329
+ setPhoneState?.({
330
+ cellphone: formState?.changes?.country_code === "PR" ? formState?.changes?.cellphone.replace('787', '') : formState?.changes?.cellphone,
331
+ country_phone_code: formState?.changes?.country_code === "PR" ? '1787' : formState?.changes?.country_phone_code,
332
+ formatted: `+${formState?.changes?.country_phone_code} ${formState?.changes?.cellphone}`
333
+ })
334
+ }, [formState?.changes, cellphoneOtpSent])
335
+
297
336
  return (
298
337
  <>
299
338
  <UDForm>
300
339
  {!validationFields?.loading &&
301
- sortInputFields({ values: validationFields?.fields?.checkout })
340
+ sortInputFields({ values: isOrderTypeValidationField ? checkoutFields : validationFields?.fields?.checkout })
302
341
  .length > 0 && (
303
342
  <UDWrapper>
304
343
  {sortInputFields({
305
- values: validationFields.fields?.checkout,
344
+ values: isOrderTypeValidationField ? checkoutFields : validationFields?.fields?.checkout,
306
345
  }).map(
307
346
  (item: any) => {
308
347
  const field = item?.validation_field || item
309
- return (showField &&
310
- showField(field.code) && ((requiredFields && requiredFields?.includes?.(field.code)) || !requiredFields) && (
348
+ return (
349
+ ((isOrderTypeValidationField ? item?.enabled : (showField && showField(field.code))) && ((requiredFields && requiredFields?.includes?.(field.code)) || !requiredFields || !isCheckoutPlace)) && (
311
350
  <React.Fragment key={field.id}>
312
351
  <Controller
313
352
  key={field.id}
@@ -331,7 +370,7 @@ export const UserFormDetailsUI = (props: any) => {
331
370
  isDisabled={false}
332
371
  value={
333
372
  formState?.changes[field.code] ??
334
- (user && user[field.code]) ??
373
+ (user && user?.guest_id && field.code === 'email' ? user?.guest_email : user?.[field.code]) ??
335
374
  ''
336
375
  }
337
376
  onChange={(val: any) => {
@@ -375,52 +414,58 @@ export const UserFormDetailsUI = (props: any) => {
375
414
  )}
376
415
  name={field.code}
377
416
  rules={getInputRules(field)}
378
- defaultValue={user && user[field.code]}
417
+ defaultValue={user && (field.code === 'email' && user?.guest_id ? user?.guest_email : user?.[field.code])}
379
418
  />
380
419
  </React.Fragment>
381
420
  ))
382
421
  },
383
422
  )}
384
- {showInputBirthday && ((requiredFields && requiredFields?.includes?.('birthdate')) || !requiredFields) && (
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') : ''}
423
+ {((!user?.guest_id && showInputBirthday) || (isOrderTypeValidationField || user?.guest_id)) &&
424
+ showInputBirthday &&
425
+ ((requiredFields && requiredFields?.includes?.('birthdate')) || !requiredFields || !isCheckoutPlace) &&
426
+ (
427
+ <>
428
+ <WrapperBirthdate>
429
+ <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ textTransform: 'capitalize', alignSelf: 'flex-start' }}>
430
+ {t('BIRTHDATE', 'Birthdate')}
393
431
  </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
- )}
432
+ <TouchableOpacity onPress={() => setShowDatePicker(!showDatePicker)}>
433
+ <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ marginTop: 6 }}>
434
+ {birthdate ? moment(birthdate).format('YYYY-MM-DD') : ''}
435
+ </OText>
436
+ </TouchableOpacity>
437
+ </WrapperBirthdate>
438
+ <DatePickerUI open={showDatePicker} birthdate={birthdate} onConfirm={_handleChangeDate} onCancel={() => setShowDatePicker(false)} />
439
+ </>
440
+ )}
441
+ {((!user?.guest_id && !!showInputPhoneNumber) || (isOrderTypeValidationField || user?.guest_id)) &&
442
+ ((requiredFields && requiredFields?.includes?.('cellphone')) || !requiredFields || !isCheckoutPlace) &&
443
+ (
444
+ <WrapperPhone>
445
+ <OText size={14} lineHeight={21} weight={'500'} color={theme.colors.textNormal}>{t('PHONE', 'Phone')}</OText>
446
+ <PhoneInputNumber
447
+ data={phoneInputData}
448
+ handleData={handleChangePhoneNumber}
449
+ changeCountry={(val: any) => changeCountry(val)}
450
+ defaultValue={phoneUpdate ? '' : cellphoneValue()}
451
+ defaultCode={user?.country_code ?? user?.country_phone_code ?? null}
452
+ defaultCodeFallback={user?.country_phone_code}
453
+ boxStyle={styles.phoneSelect}
454
+ inputStyle={styles.phoneInputStyle}
455
+ textStyle={{ color: theme.colors.textNormal, fontSize: 12, padding: 0 }}
456
+ noDropIcon
457
+ />
458
+ {phoneUpdate && (
459
+ <OText
460
+ size={10}
461
+ color={theme.colors.error}
462
+ style={{ marginHorizontal: 10, textAlign: 'center' }}>
463
+ {t('YOUR_PREVIOUS_CELLPHONE', 'Your previous cellphone')}:{' '}
464
+ {cellphoneValue()}
465
+ </OText>
466
+ )}
467
+ </WrapperPhone>
468
+ )}
424
469
  {!requiredFields && (
425
470
  <Controller
426
471
  control={control}
@@ -472,7 +517,7 @@ export const UserFormDetailsUI = (props: any) => {
472
517
  </UDLoader>
473
518
  )}
474
519
  </UDForm>
475
- {!hideUpdateButton && (
520
+ {!hideUpdateButton && !isPhoneVerifyRequired && (
476
521
  <>
477
522
  {((formState &&
478
523
  Object.keys(formState?.changes).length > 0 &&
@@ -493,7 +538,7 @@ export const UserFormDetailsUI = (props: any) => {
493
538
  )}
494
539
  </>
495
540
  )}
496
- {requiredFields && (
541
+ {isCheckoutPlace && (
497
542
  <OButton
498
543
  text={
499
544
  formState.loading
@@ -552,4 +597,3 @@ export const UserFormDetailsUI = (props: any) => {
552
597
  </>
553
598
  );
554
599
  };
555
-
@@ -44,6 +44,7 @@ const ProfileListUI = (props: ProfileParams) => {
44
44
  handleRemoveAccount,
45
45
  removeAccountState,
46
46
  handleChangePromotions,
47
+ appVersion
47
48
  } = props;
48
49
 
49
50
  const theme = useTheme();
@@ -151,7 +152,7 @@ const ProfileListUI = (props: ProfileParams) => {
151
152
  const detailProps = {
152
153
  goToBack: () => props.navigation?.canGoBack() && props.navigation.goBack(),
153
154
  onNavigationRedirect: (route: string, params: any) => props.navigation.navigate(route, params),
154
- handleRemoveAccount
155
+ handleRemoveAccount,
155
156
  }
156
157
 
157
158
  useEffect(() => {
@@ -271,6 +272,13 @@ const ProfileListUI = (props: ProfileParams) => {
271
272
  </Actions>
272
273
  </ListWrap>
273
274
  <WebsocketStatus />
275
+ {appVersion && (
276
+ <View
277
+ style={{ alignItems: 'center' }}
278
+ >
279
+ <OText>v{appVersion}</OText>
280
+ </View>
281
+ )}
274
282
  <OAlert
275
283
  open={confirm.open}
276
284
  title={confirm.title}
@@ -37,6 +37,7 @@ import {
37
37
  WrapperActions
38
38
  } from './styles'
39
39
 
40
+ const CONDITIONAL_CODES = [1787]
40
41
  const TIME_COUNTDOWN = 60 * 10 // 10 minutes
41
42
 
42
43
  const UserDetails = (props: any) => {
@@ -176,9 +177,18 @@ const UserVerificationUI = (props: any) => {
176
177
  setTimer(`${TIME_COUNTDOWN / 60}:00`)
177
178
  setIsSendCodeAgain(true)
178
179
  if (opt === 'phone') {
180
+ let cellphone = phoneState?.cellphone
181
+ let country_phone_code = phoneState?.country_phone_code
182
+
183
+ if (CONDITIONAL_CODES.includes(Number(country_phone_code))) {
184
+ if (Number(country_phone_code) === 1787) {
185
+ cellphone = `787${cellphone}`
186
+ country_phone_code = '1'
187
+ }
188
+ }
179
189
  sendVerifyPhoneCode({
180
- cellphone: phoneState?.cellphone,
181
- country_phone_code: phoneState?.country_phone_code
190
+ cellphone,
191
+ country_phone_code
182
192
  })
183
193
  return
184
194
  }
@@ -188,8 +198,8 @@ const UserVerificationUI = (props: any) => {
188
198
  const setupUserPhoneNumber = () => {
189
199
  if (!user || !user?.cellphone || !user?.country_phone_code) return
190
200
  setPhoneState({
191
- cellphone: user?.cellphone,
192
- country_phone_code: user?.country_phone_code,
201
+ cellphone: user?.country_code === "PR" ? user?.cellphone.replace('787', '') : user?.cellphone,
202
+ country_phone_code: user?.country_code === "PR" ? '1787' : user?.country_phone_code,
193
203
  formatted: `+${user?.country_phone_code} ${user?.cellphone}`
194
204
  })
195
205
  }
@@ -399,6 +409,7 @@ const UserVerificationUI = (props: any) => {
399
409
  defaultCode={phoneState?.country_phone_code.replace('+', '')}
400
410
  boxStyle={style.phoneSelect}
401
411
  inputStyle={style.phoneInputStyle}
412
+ defaultCodeFallback={phoneState?.country_phone_code.replace('+', '')}
402
413
  textStyle={{ color: theme.colors.textNormal, fontSize: 12, padding: 0 }}
403
414
  noDropIcon
404
415
  isDisabled
@@ -485,7 +496,9 @@ const UserVerificationUI = (props: any) => {
485
496
  <UserDetails
486
497
  user={user}
487
498
  isEdit
488
- isVerifiedPhone
499
+ isPhoneVerifyRequired={isPhoneVerifyRequired}
500
+ cellphoneOtpSent={verificationState.phone}
501
+ setPhoneState={setPhoneState}
489
502
  dontToggleEditMode
490
503
  />
491
504
  </View>
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react'
2
2
  import styled, { css } from 'styled-components/native'
3
- import { Alert } from 'react-native'
3
+ import { Alert, Vibration } from 'react-native'
4
4
  import { useLanguage } from 'ordering-components/native'
5
5
 
6
6
  const Wrapper = styled.TouchableOpacity`
@@ -41,6 +41,7 @@ const OAlert = (props: Props) => {
41
41
  }
42
42
 
43
43
  const handleClick = () => {
44
+ Vibration.vibrate(100)
44
45
  props.onClick && props.onClick()
45
46
  createTwoButtonAlert()
46
47
  }
@@ -95,8 +95,8 @@ const OButton = (props: Props): React.ReactElement => {
95
95
  if (props.isDisabled) {
96
96
  return (
97
97
  <View style={props.parentStyle}>
98
- <StyledButtonDisabled style={props.style}>
99
- <StyledTextDisabled style={props.textStyle}>
98
+ <StyledButtonDisabled style={{ ...props.style, backgroundColor: theme.colors.disabled }}>
99
+ <StyledTextDisabled style={{ ...props.textStyle, color: theme.colors.backgroundGray200 }}>
100
100
  {props.text}
101
101
  </StyledTextDisabled>
102
102
  </StyledButtonDisabled>