ordering-ui-react-native 0.15.62 → 0.15.63-release

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/package.json +7 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  5. package/src/components/BusinessController/index.tsx +16 -8
  6. package/src/components/BusinessInformation/index.tsx +14 -0
  7. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +23 -2
  10. package/src/components/DriverTips/index.tsx +11 -6
  11. package/src/components/LanguageSelector/index.tsx +6 -2
  12. package/src/components/LoginForm/index.tsx +120 -30
  13. package/src/components/LoginForm/styles.tsx +6 -0
  14. package/src/components/OrderDetails/index.tsx +7 -21
  15. package/src/components/PaymentOptions/index.tsx +67 -50
  16. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  17. package/src/components/ReviewDriver/index.tsx +1 -1
  18. package/src/components/ReviewOrder/index.tsx +2 -1
  19. package/src/components/ReviewProducts/index.tsx +11 -0
  20. package/src/components/SignupForm/index.tsx +145 -61
  21. package/src/components/SingleProductCard/index.tsx +16 -4
  22. package/src/components/SingleProductReview/index.tsx +1 -1
  23. package/src/components/StripeMethodForm/index.tsx +22 -24
  24. package/src/components/UpsellingProducts/index.tsx +1 -1
  25. package/src/components/UserProfileForm/index.tsx +63 -6
  26. package/src/components/UserProfileForm/styles.tsx +8 -0
  27. package/src/components/VerifyPhone/styles.tsx +1 -2
  28. package/src/components/shared/OModal.tsx +1 -1
  29. package/src/hooks/useCountdownTimer.tsx +26 -0
  30. package/src/navigators/CheckoutNavigator.tsx +6 -0
  31. package/src/navigators/HomeNavigator.tsx +12 -0
  32. package/src/pages/BusinessesListing.tsx +7 -6
  33. package/src/pages/MultiCheckout.tsx +31 -0
  34. package/src/pages/MultiOrdersDetails.tsx +27 -0
  35. package/src/pages/OrderDetails.tsx +1 -1
  36. package/src/pages/ReviewDriver.tsx +2 -2
  37. package/src/pages/ReviewOrder.tsx +2 -2
  38. package/src/pages/Sessions.tsx +22 -0
  39. package/src/theme.json +0 -1
  40. package/src/types/index.tsx +18 -11
  41. package/src/utils/index.tsx +68 -1
  42. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  43. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  44. package/themes/business/src/components/Chat/index.tsx +42 -90
  45. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  46. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  47. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  48. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  49. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  50. package/themes/business/src/components/OrderDetails/Business.tsx +2 -2
  51. package/themes/business/src/components/OrderDetails/Delivery.tsx +28 -11
  52. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +14 -7
  53. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  54. package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
  55. package/themes/business/src/components/OrdersOption/index.tsx +8 -4
  56. package/themes/business/src/components/PreviousOrders/index.tsx +7 -7
  57. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  58. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  59. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  60. package/themes/business/src/components/shared/OModal.tsx +1 -1
  61. package/themes/business/src/types/index.tsx +8 -2
  62. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  63. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  64. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  65. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  66. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  67. package/themes/kiosk/src/components/Cart/index.tsx +11 -12
  68. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  69. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  70. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  71. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  72. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  73. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  74. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  75. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  76. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  77. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  78. package/themes/kiosk/src/components/OrderDetails/index.tsx +32 -27
  79. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  80. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  81. package/themes/kiosk/src/components/ProductForm/index.tsx +7 -8
  82. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  83. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  84. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  85. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  86. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  87. package/themes/kiosk/src/types/index.d.ts +1 -0
  88. package/themes/original/index.tsx +30 -8
  89. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  90. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  91. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  92. package/themes/original/src/components/AddressList/index.tsx +30 -18
  93. package/themes/original/src/components/AppleLogin/index.tsx +7 -12
  94. package/themes/original/src/components/BusinessBasicInformation/index.tsx +137 -46
  95. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +4 -0
  96. package/themes/original/src/components/BusinessController/index.tsx +168 -96
  97. package/themes/original/src/components/BusinessController/styles.tsx +5 -0
  98. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  99. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  100. package/themes/original/src/components/BusinessListingSearch/index.tsx +231 -63
  101. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  102. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  103. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  104. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  105. package/themes/original/src/components/BusinessProductsList/index.tsx +51 -52
  106. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  107. package/themes/original/src/components/BusinessProductsListing/index.tsx +291 -155
  108. package/themes/original/src/components/BusinessProductsListing/styles.tsx +27 -0
  109. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  110. package/themes/original/src/components/BusinessTypeFilter/index.tsx +106 -39
  111. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  112. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +560 -0
  113. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +107 -0
  114. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +559 -0
  115. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Original/styles.tsx} +11 -3
  116. package/themes/original/src/components/BusinessesListing/index.tsx +99 -458
  117. package/themes/original/src/components/Cart/index.tsx +62 -43
  118. package/themes/original/src/components/Checkout/index.tsx +90 -39
  119. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  120. package/themes/original/src/components/Favorite/index.tsx +92 -0
  121. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  122. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  123. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  124. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  125. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  126. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  127. package/themes/original/src/components/Help/index.tsx +21 -4
  128. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  129. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  130. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  131. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  132. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  133. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  134. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  135. package/themes/original/src/components/Messages/index.tsx +1 -1
  136. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  137. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  138. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  139. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  140. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  141. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  142. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  143. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  144. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  145. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  146. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  147. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  148. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  149. package/themes/original/src/components/NavBar/index.tsx +4 -4
  150. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  151. package/themes/original/src/components/OrderDetails/index.tsx +151 -65
  152. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  153. package/themes/original/src/components/OrderSummary/index.tsx +6 -6
  154. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  155. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  156. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  157. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  158. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  159. package/themes/original/src/components/OrdersOption/index.tsx +137 -38
  160. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  161. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  162. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  163. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  164. package/themes/original/src/components/PaymentOptions/index.tsx +58 -37
  165. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  166. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  167. package/themes/original/src/components/ProductForm/index.tsx +718 -679
  168. package/themes/original/src/components/ProductForm/styles.tsx +6 -2
  169. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  170. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  171. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  172. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  173. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  174. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  175. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  176. package/themes/original/src/components/Promotions/index.tsx +151 -133
  177. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  178. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  179. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  180. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  181. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  182. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  183. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  184. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  185. package/themes/original/src/components/Sessions/index.tsx +160 -0
  186. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  187. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  188. package/themes/original/src/components/SingleOrderCard/index.tsx +275 -0
  189. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  190. package/themes/original/src/components/SingleProductCard/index.tsx +150 -84
  191. package/themes/original/src/components/StripeElementsForm/index.tsx +16 -8
  192. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  193. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  194. package/themes/original/src/components/UserDetails/index.tsx +15 -81
  195. package/themes/original/src/components/UserFormDetails/index.tsx +98 -66
  196. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  197. package/themes/original/src/components/UserProfileForm/index.tsx +33 -22
  198. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  199. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  200. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  201. package/themes/original/src/components/Wallets/index.tsx +76 -9
  202. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  203. package/themes/original/src/components/shared/OBottomPopup.tsx +44 -13
  204. package/themes/original/src/components/shared/OInput.tsx +3 -2
  205. package/themes/original/src/components/shared/OModal.tsx +4 -2
  206. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  207. package/themes/original/src/types/index.tsx +184 -35
  208. package/themes/original/src/utils/index.tsx +96 -2
  209. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  210. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -4,7 +4,7 @@ import {
4
4
  UpsellingPage as UpsellingPageController,
5
5
  useUtils,
6
6
  useLanguage,
7
- useOrder
7
+ useOrder
8
8
  } from 'ordering-components/native'
9
9
  import { useTheme } from 'styled-components/native';
10
10
  import { OText, OIcon, OBottomPopup, OButton } from '../shared'
@@ -62,7 +62,19 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
62
62
  borderRadius: 7.6,
63
63
  borderColor: theme.colors.textSecondary,
64
64
  height: 38
65
- }
65
+ },
66
+ headerItem: {
67
+ flexDirection: 'row',
68
+ alignItems: 'center',
69
+ marginVertical: 2,
70
+ marginHorizontal: 20,
71
+ },
72
+ btnBackArrow: {
73
+ borderWidth: 0,
74
+ backgroundColor: theme.colors.clear,
75
+ shadowColor: theme.colors.clear,
76
+ padding: 40,
77
+ },
66
78
  })
67
79
 
68
80
  const [modalIsOpen, setModalIsOpen] = useState(false)
@@ -77,11 +89,11 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
77
89
  ? cart?.products.map((product: any) => product.id)
78
90
  : []
79
91
 
80
- const productsList = !upsellingProducts.loading && !upsellingProducts.error
81
- ? upsellingProducts?.products?.length
82
- ? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
83
- : (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
84
- : []
92
+ const productsList = !upsellingProducts.loading && !upsellingProducts.error
93
+ ? upsellingProducts?.products?.length
94
+ ? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
95
+ : (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
96
+ : []
85
97
 
86
98
  useEffect(() => {
87
99
  if (!isCustomMode && !props.products) {
@@ -95,15 +107,11 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
95
107
  }
96
108
  }, [upsellingProducts.loading, upsellingProducts?.products.length])
97
109
 
98
- useEffect(() => {
99
- isCheckout && Object.keys(cart).length === 0 && onNavigationRedirect && onNavigationRedirect('MyOrders')
100
- }, [cart, isCheckout])
101
-
102
110
  const handleFormProduct = (product: any) => {
103
- onNavigationRedirect && onNavigationRedirect('ProductDetails', {
104
- product: product,
105
- businessId: product?.api?.businessId,
106
- businessSlug: business.slug,
111
+ onNavigationRedirect && onNavigationRedirect('ProductDetails', {
112
+ product: product,
113
+ businessId: product?.api?.businessId,
114
+ businessSlug: business.slug,
107
115
  })
108
116
  }
109
117
 
@@ -119,8 +127,8 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
119
127
  !upsellingProducts.loading && (
120
128
  <>
121
129
  {
122
- !upsellingProducts.error ? productsList.map((product: any) => (
123
- <Item key={product.id}>
130
+ !upsellingProducts.error ? productsList.map((product: any, i: number) => (
131
+ <Item key={`${product.id}_${i}`}>
124
132
  <View style={{ flexBasis: '57%' }}>
125
133
  <Details>
126
134
  <OText size={12} lineHeight={18} numberOfLines={1} ellipsizeMode='tail'>{product.name}</OText>
@@ -148,50 +156,54 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
148
156
  )
149
157
  }
150
158
 
151
- const UpsellingContent = () => {
152
- return (
153
- <>
154
- <TopBar style={{ paddingTop: Platform.OS == 'ios' ? 10 : 30 }}>
155
- <TopActions onPress={() => onGoBack()}>
156
- <OIcon src={theme.images.general.arrow_left} width={15} />
157
- </TopActions>
158
- </TopBar>
159
- <ScrollView style={{ marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
159
+ const UpsellingContent = () => {
160
+ return (
161
+ <>
162
+ <View style={{ ...styles.headerItem, flex: 1, marginTop: Platform.OS == 'ios' ? 35 : 70 }}>
163
+ <OButton
164
+ imgLeftSrc={theme.images.general.arrow_left}
165
+ imgRightSrc={null}
166
+ style={styles.btnBackArrow}
167
+ onClick={() => onGoBack()}
168
+ imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 16 }}
169
+ />
170
+ </View>
171
+ <ScrollView style={{ marginTop: 10, marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
160
172
  {productsList.length > 0 &&
161
- <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
162
- <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
163
- <UpsellingLayout />
164
- </View>
165
- }
166
- <View style={{ paddingHorizontal: 40 }}>
167
- <OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
168
- <OrderSummary
169
- cart={cart}
170
- isCartPending={cart?.status === 2}
171
- onNavigationRedirect={onNavigationRedirect}
172
- />
173
- </View>
174
- </ScrollView>
175
- <View
176
- style={{
177
- alignItems: 'center',
178
- bottom: props.isPage ? Platform.OS === 'ios' ? 0 : 20 : Platform.OS === 'ios' ? bottom + 59 : bottom + 125
179
- }}
180
- >
181
- <OButton
182
- imgRightSrc=''
183
- text={t('CHECKOUT', 'Checkout')}
184
- style={{...styles.closeUpsellingButton}}
185
- textStyle={{ color: theme.colors.white, fontSize: 14 }}
186
- onClick={() => {
187
- handleUpsellingPage()
188
- setIsCheckout(true)
189
- }}
190
- />
191
- </View>
192
- </>
193
- )
194
- }
173
+ <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
174
+ <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
175
+ <UpsellingLayout />
176
+ </View>
177
+ }
178
+ <View style={{ paddingHorizontal: 40 }}>
179
+ <OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
180
+ <OrderSummary
181
+ cart={cart}
182
+ isCartPending={cart?.status === 2}
183
+ onNavigationRedirect={onNavigationRedirect}
184
+ />
185
+ </View>
186
+ </ScrollView>
187
+ <View
188
+ style={{
189
+ alignItems: 'center',
190
+ bottom: props.isPage ? Platform.OS === 'ios' ? 0 : 20 : Platform.OS === 'ios' ? bottom + 59 : bottom + 125
191
+ }}
192
+ >
193
+ <OButton
194
+ imgRightSrc=''
195
+ text={t('CHECKOUT', 'Checkout')}
196
+ style={{ ...styles.closeUpsellingButton }}
197
+ textStyle={{ color: theme.colors.white, fontSize: 14 }}
198
+ onClick={() => {
199
+ handleUpsellingPage()
200
+ setIsCheckout(true)
201
+ }}
202
+ />
203
+ </View>
204
+ </>
205
+ )
206
+ }
195
207
 
196
208
  return (
197
209
  <>
@@ -199,20 +211,20 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
199
211
  <UpsellingLayout />
200
212
  ) : (
201
213
  <>
202
- {props.isPage ? (
203
- <UpsellingContent />
204
- ) : (
205
- canOpenUpselling && !modalIsOpen && (
206
- <OBottomPopup
207
- title={''}
208
- open={openUpselling}
209
- onClose={() => handleUpsellingPage()}
210
- isStatusBar
211
- >
212
- <UpsellingContent />
213
- </OBottomPopup>
214
- )
215
- )}
214
+ {props.isPage ? (
215
+ <UpsellingContent />
216
+ ) : (
217
+ canOpenUpselling && !modalIsOpen && (
218
+ <OBottomPopup
219
+ title={''}
220
+ open={openUpselling}
221
+ onClose={() => handleUpsellingPage()}
222
+ isStatusBar
223
+ >
224
+ <UpsellingContent />
225
+ </OBottomPopup>
226
+ )
227
+ )}
216
228
  </>
217
229
  )}
218
230
  </>
@@ -3,17 +3,14 @@ import { TouchableOpacity, View } from 'react-native';
3
3
  import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons';
4
4
 
5
5
  import { UDContainer, UDHeader, UDForm, UDInfo, EditBtn } from './styles';
6
+
6
7
  import {
7
8
  UserFormDetails as UserFormController,
8
9
  useLanguage,
9
10
  useSession,
10
- ToastType,
11
- useToast
12
11
  } from 'ordering-components/native';
13
12
  import { useTheme } from 'styled-components/native';
14
- import { OIcon, OText, OModal } from '../shared';
15
- import { VerifyPhone } from '../VerifyPhone';
16
- import Spinner from 'react-native-loading-spinner-overlay';
13
+ import { OIcon, OText } from '../shared';
17
14
 
18
15
  import { UserFormDetailsUI } from '../UserFormDetails';
19
16
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
@@ -23,31 +20,27 @@ const UserDetailsUI = (props: any) => {
23
20
  isEdit,
24
21
  formState,
25
22
  cleanFormState,
23
+ requiredFields,
24
+ onClose,
26
25
  cartStatus,
27
26
  toggleIsEdit,
28
27
  validationFields,
29
28
  isUserDetailsEdit,
30
29
  phoneUpdate,
31
30
  togglePhoneUpdate,
32
- isCheckout,
33
- checkPhoneCodeState,
34
- handleSendVerifyCode,
35
- handleCheckPhoneCode,
36
- verifyPhoneState,
37
- isVerifiedPhone,
38
- setCheckPhoneCodeState
31
+ isCheckout
39
32
  } = props
40
33
 
41
34
  const theme = useTheme();
42
35
 
43
36
  const [, t] = useLanguage()
44
37
  const [{ user }] = useSession()
45
- const [, { showToast }] = useToast();
46
-
47
38
  const userData = props.userData || (!formState.result.error && formState.result?.result) || user
48
39
 
49
40
  const [isModalVisible, setIsModalVisible] = useState(false);
41
+ const [isSubmit, setIsSubmit] = useState(false)
50
42
  const [willVerifyOtpState, setWillVerifyOtpState] = useState(false);
43
+ const [checkPhoneCodeState, setCheckPhoneCodeState] = useState({ loading: false, result: { error: false } })
51
44
  const [phoneInputData, setPhoneInputData] = useState({
52
45
  error: '',
53
46
  phone: {
@@ -56,7 +49,6 @@ const UserDetailsUI = (props: any) => {
56
49
  },
57
50
  });
58
51
 
59
-
60
52
  useEffect(() => {
61
53
  if (isUserDetailsEdit) {
62
54
  !isEdit && toggleIsEdit()
@@ -68,6 +60,12 @@ const UserDetailsUI = (props: any) => {
68
60
  cleanFormState({ changes: {} })
69
61
  }
70
62
 
63
+ useEffect(() => {
64
+ if (isSubmit && !isEdit && requiredFields) {
65
+ onClose && onClose()
66
+ }
67
+ }, [isSubmit, requiredFields, isEdit])
68
+
71
69
  useEffect(() => {
72
70
  if (user?.cellphone && !user?.country_phone_code) {
73
71
  togglePhoneUpdate(true)
@@ -76,54 +74,6 @@ const UserDetailsUI = (props: any) => {
76
74
  }
77
75
  }, [user?.country_phone_code])
78
76
 
79
- const handleVerifyCodeClick = () => {
80
- if (formState?.changes?.cellphone && formState?.changes?.country_phone_code) {
81
- const { cellphone, country_phone_code: countryPhoneCode } = formState?.changes
82
-
83
- setPhoneInputData({
84
- error: '',
85
- phone: {
86
- country_phone_code: countryPhoneCode,
87
- cellphone: cellphone,
88
- },
89
- });
90
- handleSendVerifyCode({
91
- cellphone: cellphone,
92
- country_phone_code: countryPhoneCode
93
- })
94
- }
95
- }
96
-
97
- useEffect(() => {
98
- if (willVerifyOtpState) handleVerifyCodeClick()
99
- }, [willVerifyOtpState])
100
-
101
- useEffect(() => {
102
- if (verifyPhoneState && !verifyPhoneState?.loading) {
103
- if (verifyPhoneState.result?.error) {
104
- const message = typeof verifyPhoneState?.result?.result === 'string'
105
- ? verifyPhoneState?.result?.result
106
- : verifyPhoneState?.result?.result[0]
107
- verifyPhoneState.result?.result && showToast(
108
- ToastType.Error,
109
- message
110
- )
111
- setWillVerifyOtpState(false)
112
- return
113
- }
114
-
115
- const okResult = verifyPhoneState.result?.result === 'OK'
116
- if (okResult) {
117
- !isModalVisible && setIsModalVisible(true)
118
- setWillVerifyOtpState(false)
119
- }
120
- }
121
- }, [verifyPhoneState])
122
-
123
- useEffect(() => {
124
- if (isVerifiedPhone) setIsModalVisible(false)
125
- }, [isVerifiedPhone])
126
-
127
77
  return (
128
78
  <>
129
79
  {(validationFields.loading || formState.loading) && (
@@ -138,10 +88,10 @@ const UserDetailsUI = (props: any) => {
138
88
  {!(validationFields.loading || formState.loading) && (
139
89
  <UDContainer>
140
90
  <UDHeader>
141
- <OText size={16} lineHeight={24} weight={'500'}>
91
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal}>
142
92
  {t('CUSTOMER_DETAILS', 'Customer Details')}
143
93
  </OText>
144
- {cartStatus !== 2 && (
94
+ {cartStatus !== 2 && !requiredFields && (
145
95
  !isEdit ? (
146
96
  <EditBtn onPress={() => toggleIsEdit()} activeOpacity={0.7}>
147
97
  <OIcon
@@ -196,22 +146,6 @@ const UserDetailsUI = (props: any) => {
196
146
  )}
197
147
  </UDContainer>
198
148
  )}
199
- <OModal
200
- open={isModalVisible}
201
- onClose={() => setIsModalVisible(false)}
202
- entireModal
203
- >
204
- <VerifyPhone
205
- phone={phoneInputData.phone}
206
- verifyPhoneState={verifyPhoneState}
207
- checkPhoneCodeState={checkPhoneCodeState}
208
- handleCheckPhoneCode={handleCheckPhoneCode}
209
- setCheckPhoneCodeState={setCheckPhoneCodeState}
210
- handleVerifyCodeClick={handleVerifyCodeClick}
211
- onClose={() => setIsModalVisible(false)}
212
- />
213
- </OModal>
214
- <Spinner visible={verifyPhoneState?.loading} />
215
149
  </>
216
150
  )
217
151
  }
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { Platform, StyleSheet, View } from 'react-native';
2
+ import { Platform, StyleSheet, TouchableOpacity } from 'react-native';
3
3
  import { useSession, useLanguage, ToastType, useToast, useConfig } from 'ordering-components/native';
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import { useForm, Controller } from 'react-hook-form';
@@ -17,6 +17,9 @@ export const UserFormDetailsUI = (props: any) => {
17
17
  isEdit,
18
18
  formState,
19
19
  showField,
20
+ requiredFields,
21
+ onClose,
22
+ setIsSubmit,
20
23
  cleanFormState,
21
24
  onCloseProfile,
22
25
  isRequiredField,
@@ -76,6 +79,8 @@ export const UserFormDetailsUI = (props: any) => {
76
79
 
77
80
  const [{ user }] = useSession();
78
81
  const [userPhoneNumber, setUserPhoneNumber] = useState<any>(null);
82
+ const [isValid, setIsValid] = useState(false)
83
+ const [isChanged, setIsChanged] = useState(false)
79
84
  const [phoneInputData, setPhoneInputData] = useState({
80
85
  error: '',
81
86
  phone: {
@@ -141,8 +146,8 @@ export const UserFormDetailsUI = (props: any) => {
141
146
  if (
142
147
  formState.changes?.cellphone === null &&
143
148
  ((validationFields?.fields?.checkout?.cellphone?.enabled &&
144
- validationFields?.fields?.checkout?.cellphone?.required) ||
145
- configs?.verification_phone_required?.value === '1')
149
+ validationFields?.fields?.checkout?.cellphone?.required) ||
150
+ configs?.verification_phone_required?.value === '1')
146
151
  ) {
147
152
  showToast(
148
153
  ToastType.Error,
@@ -153,9 +158,6 @@ export const UserFormDetailsUI = (props: any) => {
153
158
  );
154
159
  return;
155
160
  }
156
- if (formState?.changes?.cellphone && !isVerifiedPhone) {
157
- showToast(ToastType.Error, t('VERIFY_ERROR_PHONE_NUMBER', 'The Phone Number field is not verified'))
158
- }
159
161
  let changes = null;
160
162
  if (user?.cellphone && !userPhoneNumber) {
161
163
  changes = {
@@ -163,6 +165,7 @@ export const UserFormDetailsUI = (props: any) => {
163
165
  cellphone: '',
164
166
  };
165
167
  }
168
+ setIsSubmit && setIsSubmit(true)
166
169
  handleButtonUpdateClick(changes);
167
170
  }
168
171
  };
@@ -182,7 +185,7 @@ export const UserFormDetailsUI = (props: any) => {
182
185
  handleChangeInput(phoneNumber, true);
183
186
  };
184
187
 
185
- const changeCountry = (country : any) => {
188
+ const changeCountry = (country: any) => {
186
189
  let countryCode = {
187
190
  country_code: {
188
191
  name: 'country_code',
@@ -229,10 +232,16 @@ export const UserFormDetailsUI = (props: any) => {
229
232
 
230
233
  useEffect(() => {
231
234
  if (!phoneInputData.error && phoneInputData?.phone?.country_phone_code && phoneInputData?.phone?.cellphone) {
232
- setWillVerifyOtpState(true)
235
+ setWillVerifyOtpState?.(true)
233
236
  }
234
- }, [phoneInputData])
237
+ }, [phoneInputData, configs?.verification_phone_required?.value, isChanged])
235
238
 
239
+ useEffect(() => {
240
+ if (!requiredFields || formState?.changes?.length === 0) return
241
+ const _isValid = requiredFields.every((key: any) => formState?.changes[key])
242
+ setIsValid(_isValid)
243
+ }, [formState?.changes, requiredFields])
244
+
236
245
  return (
237
246
  <>
238
247
  <UDForm>
@@ -245,7 +254,7 @@ export const UserFormDetailsUI = (props: any) => {
245
254
  }).map(
246
255
  (field: any) =>
247
256
  showField &&
248
- showField(field.code) && (
257
+ showField(field.code) && ((requiredFields && requiredFields.includes(field.code)) || !requiredFields) && (
249
258
  <React.Fragment key={field.id}>
250
259
  <Controller
251
260
  key={field.id}
@@ -319,15 +328,15 @@ export const UserFormDetailsUI = (props: any) => {
319
328
  ),
320
329
  )}
321
330
 
322
- {!!showInputPhoneNumber && (
331
+ {!!showInputPhoneNumber &&((requiredFields && requiredFields.includes('cellphone')) || !requiredFields) && (
323
332
  <WrapperPhone>
324
333
  <OText size={14} lineHeight={21} weight={'500'} color={theme.colors.textNormal}>{t('PHONE', 'Phone')}</OText>
325
334
  <PhoneInputNumber
326
335
  data={phoneInputData}
327
336
  handleData={(val: any) => handleChangePhoneNumber(val)}
328
- changeCountry={(val : any) => changeCountry(val)}
337
+ changeCountry={(val: any) => changeCountry(val)}
329
338
  defaultValue={phoneUpdate ? '' : user?.cellphone}
330
- defaultCode={user?.country_code ?? user?.country_phone_code ?? null}
339
+ defaultCode={user?.country_phone_code || null}
331
340
  boxStyle={styles.phoneSelect}
332
341
  inputStyle={styles.phoneInputStyle}
333
342
  textStyle={{ color: theme.colors.textNormal, fontSize: 12, padding: 0 }}
@@ -344,69 +353,76 @@ export const UserFormDetailsUI = (props: any) => {
344
353
  )}
345
354
  </WrapperPhone>
346
355
  )}
347
- <Controller
348
- control={control}
349
- render={() => (
350
- <>
351
- <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ textTransform: 'capitalize', alignSelf: 'flex-start' }}>
352
- {t('PASSWORD', 'Password')}
353
- </OText>
354
- <OInput
355
- name='password'
356
- placeholder={t('FRONT_VISUALS_PASSWORD', 'Password')}
357
- inputStyle={styles.inputStyle}
358
- style={{ paddingLeft: 0, paddingRight: 0, marginTop: 6, height: 44, minHeight: 44 }}
359
- autoCapitalize='none'
360
- isDisabled={false}
361
- value={
362
- formState?.changes['password'] ??
363
- (user && user['password']) ??
364
- ''
365
- }
366
- onChange={(val: any) => {
367
- setValue('password', val.target.value)
368
- handleChangeInput(val)
369
- }}
370
- autoCorrect
371
- type='default'
372
- returnKeyType="done"
373
- autoCompleteType='off'
374
- isSecured
375
- />
376
- </>
377
- )}
378
- name='password'
379
- rules={getInputRules({ name: 'password', code: 'password' })}
380
- defaultValue=''
381
- />
382
- <View style={{ flexDirection: 'row', alignItems: 'center', marginBottom: 20, width: '100%' }}>
356
+ {!requiredFields && (
357
+ <Controller
358
+ control={control}
359
+ render={() => (
360
+ <>
361
+ <OText size={14} lineHeight={21} color={theme.colors.textNormal} weight={'500'} style={{ textTransform: 'capitalize', alignSelf: 'flex-start' }}>
362
+ {t('PASSWORD', 'Password')}
363
+ </OText>
364
+ <OInput
365
+ name='password'
366
+ placeholder={t('FRONT_VISUALS_PASSWORD', 'Password')}
367
+ inputStyle={styles.inputStyle}
368
+ style={{ paddingLeft: 0, paddingRight: 0, marginTop: 6, height: 44, minHeight: 44 }}
369
+ autoCapitalize='none'
370
+ isDisabled={false}
371
+ value={
372
+ formState?.changes['password'] ??
373
+ (user && user['password']) ??
374
+ ''
375
+ }
376
+ onChange={(val: any) => {
377
+ setValue('password', val.target.value)
378
+ handleChangeInput(val)
379
+ }}
380
+ autoCorrect
381
+ type='default'
382
+ returnKeyType="done"
383
+ autoCompleteType='off'
384
+ isSecured
385
+ />
386
+ </>
387
+ )}
388
+ name='password'
389
+ rules={getInputRules({ name: 'password', code: 'password' })}
390
+ defaultValue=''
391
+ />
392
+ )}
393
+ {!requiredFields && (
383
394
  <Controller
384
395
  control={control}
385
396
  render={({ onChange, value }: any) => (
386
- <CheckBox
387
- value={value}
388
- onValueChange={newValue => {
389
- onChange(newValue)
390
- handleChangePromotions(newValue)
391
- }}
392
- boxType={'square'}
393
- tintColors={{
394
- true: theme.colors.primary,
395
- false: theme.colors.disabled
397
+ <TouchableOpacity
398
+ style={{ flexDirection: 'row', alignItems: 'center', marginBottom: 20, width: '100%' }}
399
+ onPress={() => {
400
+ onChange(!value)
401
+ handleChangePromotions(!value)
396
402
  }}
397
- tintColor={theme.colors.disabled}
398
- onCheckColor={theme.colors.primary}
399
- onTintColor={theme.colors.primary}
400
- style={Platform.OS === 'ios' && styles.checkBoxStyle}
401
- />
403
+ >
404
+ <CheckBox
405
+ value={value}
406
+ boxType={'square'}
407
+ tintColors={{
408
+ true: theme.colors.primary,
409
+ false: theme.colors.disabled
410
+ }}
411
+ tintColor={theme.colors.disabled}
412
+ onCheckColor={theme.colors.primary}
413
+ onTintColor={theme.colors.primary}
414
+ style={Platform.OS === 'ios' && styles.checkBoxStyle}
415
+ />
416
+ <OText style={{ fontSize: 14, paddingHorizontal: 5, paddingLeft: 10 }}>{t('RECEIVE_NEWS_EXCLUSIVE_PROMOTIONS', 'Receive newsletters and exclusive promotions')}</OText>
417
+ </TouchableOpacity>
402
418
  )}
403
419
  name='promotions'
404
420
  defaultValue={formState?.result?.result
405
421
  ? !!formState?.result?.result?.settings?.notification?.newsletter
406
422
  : !!(formState?.changes?.settings?.notification?.newsletter ?? (user && user?.settings?.notification?.newsletter))}
407
423
  />
408
- <OText style={{ fontSize: 14, paddingHorizontal: 5 }}>{t('RECEIVE_NEWS_EXCLUSIVE_PROMOTIONS', 'Receive newsletters and exclusive promotions')}</OText>
409
- </View>
424
+ )}
425
+
410
426
  </UDWrapper>
411
427
  )}
412
428
  {validationFields?.loading && (
@@ -438,6 +454,22 @@ export const UserFormDetailsUI = (props: any) => {
438
454
  )}
439
455
  </>
440
456
  )}
457
+ {requiredFields && (
458
+ <OButton
459
+ text={
460
+ formState.loading
461
+ ? t('UPDATING', 'Updating...')
462
+ : t('CONTINUE', 'Continue')
463
+ }
464
+ bgColor={theme.colors.white}
465
+ textStyle={{ color: theme.colors.primary, fontSize: 14 }}
466
+ borderColor={theme.colors.primary}
467
+ isDisabled={formState.loading || !isValid}
468
+ imgRightSrc={null}
469
+ style={{ borderRadius: 7.6, shadowOpacity: 0, width: '100%', borderWidth: 1, marginTop: 20, marginBottom: 20 }}
470
+ onClick={handleSubmit(onSubmit)}
471
+ />
472
+ )}
441
473
  </>
442
474
  );
443
475
  };
@@ -17,6 +17,7 @@ import { LanguageSelector } from '../LanguageSelector'
17
17
  import MessageCircle from 'react-native-vector-icons/AntDesign'
18
18
  import Ionicons from 'react-native-vector-icons/Ionicons'
19
19
  import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
20
+ import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
20
21
  import FastImage from 'react-native-fast-image'
21
22
  import { OAlert } from '../../../../../src/components/shared'
22
23
 
@@ -108,8 +109,8 @@ const ProfileListUI = (props: ProfileParams) => {
108
109
 
109
110
  const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
110
111
 
111
- const isWalletEnabled = configs?.wallet_enabled?.value === '1' && (configs?.wallet_cash_enabled?.value === '1' || configs?.wallet_credit_point_enabled?.value === '1')
112
- const IsPromotionsEnabled = configs?.advanced_offers_module === '1' || configs?.advanced_offers_module === 'true'
112
+ const isWalletEnabled = configs?.cash_wallet?.value && configs?.wallet_enabled?.value === '1' && (configs?.wallet_cash_enabled?.value === '1' || configs?.wallet_credit_point_enabled?.value === '1')
113
+ const IsPromotionsEnabled = configs?.advanced_offers_module?.value === '1' || configs?.advanced_offers_module?.value === true
113
114
  const onRedirect = (route: string, params?: any) => {
114
115
  navigation.navigate(route, params)
115
116
  }
@@ -214,6 +215,14 @@ const ProfileListUI = (props: ProfileParams) => {
214
215
  <OIcon src={theme.images.general.ic_help} width={16} color={theme.colors.textNormal} style={{ marginEnd: 14 }} />
215
216
  <OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('HELP', 'Help')}</OText>
216
217
  </ListItem>
218
+ <ListItem onPress={() => navigation.navigate('Sessions')} activeOpacity={0.7}>
219
+ <Ionicons name='md-list-outline' style={styles.messageIconStyle} color={theme.colors.textNormal} />
220
+ <OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('SESSIONS', 'Sessions')}</OText>
221
+ </ListItem>
222
+ <ListItem onPress={() => navigation.navigate('Favorite')} activeOpacity={0.7}>
223
+ <Ionicons name='heart-outline' style={styles.messageIconStyle} color={theme.colors.textNormal} />
224
+ <OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('FAVORITES', 'Favorites')}</OText>
225
+ </ListItem>
217
226
  </Actions>
218
227
 
219
228
  <Actions>