ordering-ui-react-native 0.16.44 → 0.16.45-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 (198) hide show
  1. package/package.json +7 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  6. package/src/components/BusinessInformation/index.tsx +33 -4
  7. package/src/components/BusinessInformation/styles.tsx +2 -2
  8. package/src/components/BusinessProductsList/index.tsx +10 -10
  9. package/src/components/BusinessesListing/index.tsx +1 -1
  10. package/src/components/Checkout/index.tsx +2 -1
  11. package/src/components/LanguageSelector/index.tsx +21 -16
  12. package/src/components/Messages/index.tsx +2 -2
  13. package/src/components/NotificationSetting/index.tsx +85 -0
  14. package/src/components/OrdersOption/index.tsx +54 -56
  15. package/src/components/PaymentOptions/index.tsx +298 -345
  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 -2
  19. package/src/components/ReviewProducts/index.tsx +11 -0
  20. package/src/components/SingleProductReview/index.tsx +8 -5
  21. package/src/components/StripeElementsForm/index.tsx +25 -16
  22. package/src/components/VerifyPhone/styles.tsx +1 -2
  23. package/src/components/shared/OBottomPopup.tsx +6 -2
  24. package/src/components/shared/OToast.tsx +3 -3
  25. package/src/index.tsx +2 -0
  26. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  27. package/src/utils/index.tsx +2 -1
  28. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  29. package/themes/business/src/components/Chat/index.tsx +40 -32
  30. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  31. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  32. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  33. package/themes/business/src/components/MapView/index.tsx +12 -1
  34. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  35. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  36. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  37. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  38. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  39. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  40. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  41. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  42. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  43. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  44. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  45. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  46. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  47. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  48. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  49. package/themes/business/src/components/PreviousOrders/index.tsx +18 -20
  50. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  51. package/themes/business/src/components/ReviewCustomer/index.tsx +27 -13
  52. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  53. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  54. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  55. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  56. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  57. package/themes/business/src/types/index.tsx +15 -9
  58. package/themes/business/src/utils/index.tsx +10 -0
  59. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  60. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  61. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  62. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  63. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  64. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  65. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  66. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  67. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  68. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  69. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  70. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  71. package/themes/kiosk/src/types/index.d.ts +2 -0
  72. package/themes/original/index.tsx +4 -0
  73. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  74. package/themes/original/src/components/AddressForm/index.tsx +157 -140
  75. package/themes/original/src/components/AddressList/index.tsx +1 -1
  76. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  77. package/themes/original/src/components/BusinessBasicInformation/index.tsx +218 -147
  78. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +2 -2
  79. package/themes/original/src/components/BusinessController/index.tsx +231 -114
  80. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  81. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  82. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  83. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  84. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  85. package/themes/original/src/components/BusinessListingSearch/index.tsx +109 -139
  86. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  87. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  88. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  89. package/themes/original/src/components/BusinessProductsList/index.tsx +59 -60
  90. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  91. package/themes/original/src/components/BusinessProductsListing/index.tsx +210 -115
  92. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -11
  93. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  94. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +37 -25
  95. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -4
  96. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +275 -120
  97. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -10
  98. package/themes/original/src/components/BusinessesListing/index.tsx +80 -25
  99. package/themes/original/src/components/Cart/index.tsx +53 -15
  100. package/themes/original/src/components/Cart/styles.tsx +4 -0
  101. package/themes/original/src/components/CartContent/index.tsx +22 -16
  102. package/themes/original/src/components/Checkout/index.tsx +113 -117
  103. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  104. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  105. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  106. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  107. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  108. package/themes/original/src/components/FavoriteList/index.tsx +69 -45
  109. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  110. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  111. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  112. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  113. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  114. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  115. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  116. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  117. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  118. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  119. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  120. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  121. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  122. package/themes/original/src/components/Messages/index.tsx +35 -20
  123. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  124. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -92
  125. package/themes/original/src/components/MultiCheckout/index.tsx +6 -0
  126. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -16
  127. package/themes/original/src/components/MyOrders/index.tsx +88 -22
  128. package/themes/original/src/components/NavBar/index.tsx +11 -5
  129. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  130. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  131. package/themes/original/src/components/Notifications/index.tsx +148 -0
  132. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  133. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  134. package/themes/original/src/components/OrderDetails/index.tsx +200 -39
  135. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  136. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  137. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  138. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  139. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  140. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  141. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  142. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  143. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +94 -98
  144. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  145. package/themes/original/src/components/OrdersOption/index.tsx +71 -55
  146. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  147. package/themes/original/src/components/PaymentOptions/index.tsx +1 -2
  148. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  149. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  150. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  151. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  152. package/themes/original/src/components/ProductForm/index.tsx +639 -664
  153. package/themes/original/src/components/ProductForm/styles.tsx +10 -11
  154. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  155. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  156. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  157. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  158. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  159. package/themes/original/src/components/ProfessionalProfile/index.tsx +26 -14
  160. package/themes/original/src/components/Promotions/index.tsx +232 -219
  161. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  162. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  163. package/themes/original/src/components/ReviewOrder/index.tsx +96 -101
  164. package/themes/original/src/components/ReviewOrder/styles.tsx +0 -9
  165. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  166. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  167. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  168. package/themes/original/src/components/SearchBar/index.tsx +5 -3
  169. package/themes/original/src/components/ServiceForm/index.tsx +410 -258
  170. package/themes/original/src/components/SignupForm/index.tsx +160 -113
  171. package/themes/original/src/components/SingleOrderCard/index.tsx +229 -181
  172. package/themes/original/src/components/SingleOrderCard/styles.tsx +0 -7
  173. package/themes/original/src/components/SingleProductCard/index.tsx +198 -112
  174. package/themes/original/src/components/SingleProductCard/styles.tsx +3 -10
  175. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  176. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  177. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  178. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  179. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  180. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  181. package/themes/original/src/components/UserProfile/index.tsx +56 -31
  182. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  183. package/themes/original/src/components/UserProfileForm/index.tsx +10 -10
  184. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  185. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  186. package/themes/original/src/components/Wallets/index.tsx +176 -164
  187. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  188. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  189. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  190. package/themes/original/src/components/shared/OBottomPopup.tsx +48 -15
  191. package/themes/original/src/components/shared/OButton.tsx +10 -3
  192. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  193. package/themes/original/src/components/shared/OInput.tsx +13 -3
  194. package/themes/original/src/layouts/Container.tsx +13 -9
  195. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  196. package/themes/original/src/types/index.tsx +83 -28
  197. package/themes/original/src/utils/index.tsx +103 -58
  198. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -21,8 +21,8 @@ export interface LoginParams {
21
21
  allowedLevels?: any;
22
22
  useRootPoint?: any;
23
23
  notificationState?: any;
24
- handleReCaptcha?: any;
25
- enableReCaptcha?: any;
24
+ handleReCaptcha?: any;
25
+ enableReCaptcha?: any;
26
26
  }
27
27
  export interface ProfileParams {
28
28
  navigation?: any;
@@ -41,6 +41,7 @@ export interface ProfileParams {
41
41
  validationFields?: any;
42
42
  showField?: any;
43
43
  isRequiredField?: any;
44
+ isAlsea?: boolean;
44
45
  }
45
46
 
46
47
  export interface AddressListParams {
@@ -255,6 +256,7 @@ export interface MessagesOptionParams {
255
256
  messagesReadList?: any;
256
257
  onNavigationRedirect?: any;
257
258
  setSortBy?: any;
259
+ getOrders: any
258
260
  }
259
261
  export interface OrdersOptionParams {
260
262
  orderList?: any;
@@ -265,7 +267,7 @@ export interface OrdersOptionParams {
265
267
  titleContent?: string;
266
268
  customArray?: Array<any>;
267
269
  loadMoreOrders?: () => {};
268
- loadOrders?: ({}: any) => {};
270
+ loadOrders?: ({ }: any) => {};
269
271
  messages?: any;
270
272
  setMessages?: () => {};
271
273
  loadMessages?: () => {};
@@ -279,7 +281,7 @@ export interface OrdersOptionParams {
279
281
  ordersGroup?: any;
280
282
  setOrdersGroup?: any;
281
283
  setCurrentFilters?: any;
282
- onFiltered?: ({}: any) => {};
284
+ onFiltered?: ({ }: any) => {};
283
285
  filtered?: any;
284
286
  handleClickOrder?: any;
285
287
  orderGroupStatusCustom?: {
@@ -290,9 +292,11 @@ export interface OrdersOptionParams {
290
292
  };
291
293
  isBusinessApp?: boolean;
292
294
  handleClickLogisticOrder: (status: number, orderId: number) => void,
293
- logisticOrders: {orders: Array<any>, loading: boolean, error: Array<string> | string},
295
+ logisticOrders: { orders: Array<any>, loading: boolean, error: Array<string> | string },
294
296
  loadLogisticOrders: () => void;
295
- isLogisticActivated?: boolean
297
+ isLogisticActivated?: boolean;
298
+ isAlsea?: boolean;
299
+ checkNotification?: boolean;
296
300
  }
297
301
  export interface ActiveOrdersParams {
298
302
  orders?: any;
@@ -390,6 +394,7 @@ export interface ProductItemAccordionParams {
390
394
  offsetDisabled?: any;
391
395
  isFromCheckout?: any;
392
396
  isClickableEvent?: any;
397
+ currency?: any;
393
398
  }
394
399
  export interface ReviewOrderParams {
395
400
  order?: { orderId: number; businessId: number; logo: string };
@@ -405,7 +410,7 @@ export interface MessagesParams {
405
410
  order?: any;
406
411
  orderId?: number;
407
412
  messages?: any;
408
- message?: string;
413
+ message: string;
409
414
  image?: string;
410
415
  messagesToShow?: any;
411
416
  sendMessage?: any;
@@ -561,13 +566,14 @@ export interface AcceptOrRejectOrderParams {
561
566
  }
562
567
 
563
568
  export interface MapViewParams {
564
- onNavigationRedirect: (page : string, params ?: any) => void,
569
+ onNavigationRedirect: (page: string, params?: any) => void,
565
570
  getBusinessLocations: () => void,
571
+ setDriverLocation: (location: any) => void,
566
572
  isLoadingBusinessMarkers?: boolean,
567
573
  markerGroups: Array<any>,
568
574
  customerMarkerGroups: Array<any>,
569
575
  alertState: { open: boolean, content: Array<string>, key?: string | null },
570
- setAlertState: ({open, content, key} : { open: boolean, content: Array<string>, key?: string | null }) => void
576
+ setAlertState: ({ open, content, key }: { open: boolean, content: Array<string>, key?: string | null }) => void
571
577
  }
572
578
 
573
579
  export interface ReviewCustomerParams {
@@ -38,6 +38,8 @@ export const getTraduction = (key: string, t: any) => {
38
38
  ERROR_PRODUCT_NOT_FOUND: 'Error with the product',
39
39
  ERROR_USER_UPDATE_YOU_HAVE_ASSIGNED_ORDERS:
40
40
  "You can't because you have assigned orders",
41
+ ERROR_INVALID_OFFER: 'The offer doesn\'t exist',
42
+ ERROR_AUTH_DRIVER_LOGIN_VALIDATION: 'Error auth driver login validation'
41
43
  };
42
44
 
43
45
  return keyList[key] ? t(key, keyList[key]) : t(key);
@@ -343,3 +345,11 @@ export const getOrderStatus = (s: string, t: any) => {
343
345
 
344
346
  return objectStatus && objectStatus;
345
347
  };
348
+
349
+ export const transformDistance = (value : number, distanceUnit?: string) => {
350
+ return distanceUnit === 'mi'
351
+ ? (value / 1.609).toFixed(2)
352
+ : distanceUnit === 'ft'
353
+ ? (value * 3280.84).toFixed(0)
354
+ : (value).toFixed(2)
355
+ }
@@ -197,7 +197,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
197
197
  {isFarAway && (
198
198
  <FarAwayMessage style={styles.farAwayMsg}>
199
199
  <Ionicons name='md-warning-outline' style={styles.iconStyle} />
200
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
200
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
201
201
  </FarAwayMessage>
202
202
  )}
203
203
  {!auth && (
@@ -410,8 +410,7 @@ const LoginFormUI = (props: LoginParams) => {
410
410
  textInputProps={{
411
411
  returnKeyType: 'next',
412
412
  onSubmitEditing: () => inputRef?.current?.focus?.(),
413
- style: { borderWidth: 0, fontSize: 12 },
414
- maxLength: 10
413
+ style: { borderWidth: 0, fontSize: 12 }
415
414
  }}
416
415
  textWrapStyle={{ borderColor: theme.colors.clear, borderWidth: 0, height: 40, paddingStart: 0 }}
417
416
  />
@@ -155,7 +155,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
155
155
  {isFarAway && (
156
156
  <FarAwayMessage style={styles.farAwayMsg}>
157
157
  <Ionicons name='md-warning-outline' style={styles.iconStyle} />
158
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
158
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
159
159
  </FarAwayMessage>
160
160
  )}
161
161
  <View style={styles.wrapperOrderOptions}>
@@ -20,6 +20,7 @@ const BusinessesListingUI = (props: any) => {
20
20
  const {
21
21
  navigation,
22
22
  businessesList,
23
+ paginationProps,
23
24
  handleBusinessClick,
24
25
  } = props;
25
26
 
@@ -78,7 +79,7 @@ const BusinessesListingUI = (props: any) => {
78
79
  </CardsContainer>
79
80
 
80
81
 
81
- {!businessesList.loading && businessesList.businesses.length === 0 && (
82
+ {!businessesList.loading && businessesList.businesses.length === 0 && paginationProps.totalPages !== null && (
82
83
  <NotFoundSource
83
84
  content={t(
84
85
  'NOT_FOUND_BUSINESSES',
@@ -50,6 +50,12 @@ const CheckoutUI = (props: any) => {
50
50
  }
51
51
  }, [cart])
52
52
 
53
+ useEffect(() => {
54
+ if (!cartState.loading && cart && !cart?.valid && cart?.status === 2) {
55
+ navigation?.canGoBack() && navigation.goBack()
56
+ }
57
+ }, [cart])
58
+
53
59
  return (
54
60
  <>
55
61
  <PaymentOptions
@@ -1,10 +1,15 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React, { useEffect, useState, useRef } from 'react';
2
2
  import { StyleSheet, View } from 'react-native';
3
3
  import { useForm, Controller } from 'react-hook-form';
4
4
  import { useTheme } from 'styled-components/native';
5
+ import { TouchableOpacity } from 'react-native-gesture-handler';
6
+ import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
7
+ import Recaptcha from 'react-native-recaptcha-that-works'
8
+ import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
5
9
 
6
10
  import {
7
11
  LoginForm as LoginFormController,
12
+ useConfig,
8
13
  useLanguage,
9
14
  ToastType,
10
15
  useToast,
@@ -13,7 +18,8 @@ import {
13
18
 
14
19
  import {
15
20
  WelcomeTextContainer,
16
- LogoWrapper
21
+ LogoWrapper,
22
+ RecaptchaButton
17
23
  } from './styles';
18
24
 
19
25
  import { OText, OButton, OInput, OIcon } from '../shared';
@@ -26,14 +32,20 @@ const LoginFormUI = (props: LoginParams) => {
26
32
  loginButtonText,
27
33
  formState,
28
34
  handleButtonLoginClick,
29
- useRootPoint
35
+ useRootPoint,
36
+ handleReCaptcha,
37
+ enableReCaptcha
30
38
  } = props;
31
39
 
32
40
  const theme = useTheme()
41
+ const [{ configs }] = useConfig()
33
42
  const [ordering, { setOrdering }] = useApi();
34
43
  const [, { showToast }] = useToast();
35
44
  const [, t] = useLanguage();
36
- const {control, handleSubmit, formState: {errors}} = useForm();
45
+ const [recaptchaConfig, setRecaptchaConfig] = useState<any>({})
46
+ const [recaptchaVerified, setRecaptchaVerified] = useState(false)
47
+ const recaptchaRef = useRef<any>({});
48
+ const { control, handleSubmit, formState: { errors } } = useForm();
37
49
  const [orientationState] = useDeviceOrientation();
38
50
 
39
51
  const [formsStateValues, setFormsStateValues] = useState<any>({ isSubmitted: false })
@@ -60,6 +72,25 @@ const LoginFormUI = (props: LoginParams) => {
60
72
  onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
61
73
  };
62
74
 
75
+ const handleOpenRecaptcha = () => {
76
+ setRecaptchaVerified(false)
77
+ if (!recaptchaConfig?.siteKey) {
78
+ showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
79
+ return
80
+ }
81
+ if (!recaptchaConfig?.baseUrl) {
82
+ showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
83
+ return
84
+ }
85
+
86
+ recaptchaRef.current.open()
87
+ }
88
+
89
+ const onRecaptchaVerify = (token: any) => {
90
+ setRecaptchaVerified(true)
91
+ handleReCaptcha && handleReCaptcha({ code: token, version: recaptchaConfig?.version })
92
+ }
93
+
63
94
  const styles = StyleSheet.create({
64
95
  logo: {
65
96
  height: 80,
@@ -87,6 +118,20 @@ const LoginFormUI = (props: LoginParams) => {
87
118
 
88
119
  useEffect(() => {
89
120
  if (!formState.loading && formState.result?.error) {
121
+ if (formState.result?.result?.[0] === 'ERROR_AUTH_VERIFICATION_CODE') {
122
+ setRecaptchaVerified(false)
123
+ setRecaptchaConfig({
124
+ version: 'v2',
125
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
126
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
127
+ })
128
+ showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
129
+ setFormsStateValues({
130
+ ...formsStateValues,
131
+ isSubmitted: false,
132
+ })
133
+ return
134
+ }
90
135
  formState.result?.result && showToast(
91
136
  ToastType.Error,
92
137
  typeof formState.result?.result === 'string'
@@ -122,9 +167,32 @@ const LoginFormUI = (props: LoginParams) => {
122
167
  }
123
168
  }, [errors]);
124
169
 
170
+ useEffect(() => {
171
+ if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
172
+ if (configs?.security_recaptcha_type?.value === 'v3' &&
173
+ configs?.security_recaptcha_score_v3?.value > 0 &&
174
+ configs?.security_recaptcha_site_key_v3?.value
175
+ ) {
176
+ setRecaptchaConfig({
177
+ version: 'v3',
178
+ siteKey: configs?.security_recaptcha_site_key_v3?.value || null,
179
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
180
+ })
181
+ return
182
+ }
183
+ if (configs?.security_recaptcha_site_key?.value) {
184
+ setRecaptchaConfig({
185
+ version: 'v2',
186
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
187
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
188
+ })
189
+ }
190
+ }
191
+ }, [configs, enableReCaptcha])
192
+
125
193
  const logo = (
126
194
  <LogoWrapper>
127
- <OIcon src={theme.images.logos.logotype} style={styles.logo}/>
195
+ <OIcon src={theme.images.logos.logotype} style={styles.logo} />
128
196
  </LogoWrapper>
129
197
  );
130
198
 
@@ -144,7 +212,7 @@ const LoginFormUI = (props: LoginParams) => {
144
212
  value={value}
145
213
  autoCapitalize='none'
146
214
  autoCorrect={false}
147
- inputStyle={{textAlign: 'center'}}
215
+ inputStyle={{ textAlign: 'center' }}
148
216
  onChange={(e: any) => {
149
217
  onChange(e?.target?.value);
150
218
  setFormsStateValues({
@@ -167,7 +235,7 @@ const LoginFormUI = (props: LoginParams) => {
167
235
  autoCapitalize="none"
168
236
  autoCorrect={false}
169
237
  type="email-address"
170
- inputStyle={{textAlign: 'center'}}
238
+ inputStyle={{ textAlign: 'center' }}
171
239
  onChange={(e: any) => {
172
240
  handleChangeInputEmail(e, onChange);
173
241
  }}
@@ -199,7 +267,7 @@ const LoginFormUI = (props: LoginParams) => {
199
267
  style={styles.inputStyle}
200
268
  value={value}
201
269
  onChange={(val: any) => onChange(val)}
202
- inputStyle={{textAlign: 'center'}}
270
+ inputStyle={{ textAlign: 'center' }}
203
271
  />
204
272
  )}
205
273
  name="password"
@@ -211,7 +279,49 @@ const LoginFormUI = (props: LoginParams) => {
211
279
  }}
212
280
  defaultValue=""
213
281
  />
214
-
282
+ {(recaptchaConfig?.version) && (
283
+ <>
284
+ {recaptchaConfig?.version === 'v3' ? (
285
+ <ReCaptcha
286
+ url={recaptchaConfig?.baseUrl}
287
+ siteKey={recaptchaConfig?.siteKey}
288
+ containerStyle={{ height: 40 }}
289
+ onExecute={onRecaptchaVerify}
290
+ reCaptchaType={1}
291
+ />
292
+ ) : (
293
+ <>
294
+ <TouchableOpacity
295
+ onPress={handleOpenRecaptcha}
296
+ >
297
+ <RecaptchaButton>
298
+ {recaptchaVerified ? (
299
+ <MaterialCommunityIcons
300
+ name="checkbox-marked"
301
+ size={26}
302
+ color={theme.colors.primary}
303
+ />
304
+ ) : (
305
+ <MaterialCommunityIcons
306
+ name="checkbox-blank-outline"
307
+ size={26}
308
+ color={theme.colors.mediumGray}
309
+ />
310
+ )}
311
+ <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
312
+ </RecaptchaButton>
313
+ </TouchableOpacity>
314
+ <Recaptcha
315
+ ref={recaptchaRef}
316
+ siteKey={recaptchaConfig?.siteKey}
317
+ baseUrl={recaptchaConfig?.baseUrl}
318
+ onVerify={onRecaptchaVerify}
319
+ onExpire={() => setRecaptchaVerified(false)}
320
+ />
321
+ </>)
322
+ }
323
+ </>
324
+ )}
215
325
  <OButton
216
326
  onClick={handleSubmit(onSubmit)}
217
327
  text={loginButtonText}
@@ -280,7 +390,7 @@ const LoginFormUI = (props: LoginParams) => {
280
390
  ? 0 : 0,
281
391
  }}
282
392
  >
283
- { welcome }
393
+ {welcome}
284
394
  {orientationState?.orientation === LANDSCAPE && (
285
395
  <View style={{
286
396
  justifyContent: 'flex-end',
@@ -327,6 +437,7 @@ export const LoginForm = (props: any) => {
327
437
  const loginProps = {
328
438
  ...props,
329
439
  UIComponent: LoginFormUI,
440
+ isRecaptchaEnable: true
330
441
  };
331
442
  return <LoginFormController {...loginProps} />;
332
443
  };
@@ -7,3 +7,8 @@ export const LogoWrapper = styled.View`
7
7
  export const WelcomeTextContainer = styled.View`
8
8
  margin-bottom: 30px;
9
9
  `;
10
+ export const RecaptchaButton = styled.View`
11
+ flex-direction: row;
12
+ align-items: center;
13
+ margin-bottom: 10px;
14
+ `
@@ -4,6 +4,7 @@ import { OIcon, OButton, OText } from '../shared'
4
4
  import { ImageStyle, TextStyle, View, Platform, TouchableOpacity } from 'react-native'
5
5
  import { useConfig, useLanguage, useOrder } from 'ordering-components/native'
6
6
  import { useTheme } from 'styled-components/native'
7
+
7
8
  const Wrapper = styled.View`
8
9
  background-color: ${(props: any) => props.theme.colors.white};
9
10
  padding: 10px 0px 20px 0px;
@@ -65,28 +66,27 @@ const NavBar = (props: Props) => {
65
66
 
66
67
  return (
67
68
  <Wrapper style={{ paddingTop: props.paddingTop, ...props.style }}>
68
- {(props?.onActionLeft) && (
69
+ {(props?.onActionLeft || props?.leftImg) && (
69
70
  <OButton
70
- imgLeftSrc={props.leftImg}
71
+ imgLeftSrc={props.leftImg || theme.images.general.arrow_left}
71
72
  imgRightSrc={null}
72
73
  style={{ ...btnBackArrow, ...props.btnStyle }}
73
74
  onClick={props.onActionLeft}
74
- imgLeftStyle={props.imgLeftStyle}
75
- {...(!props.leftImg && { iconProps: { name: 'arrowleft', size: 28, color: props.btnStyle?.color } })}
75
+ imgLeftStyle= {props.imgLeftStyle}
76
76
  />)
77
77
  }
78
78
  <TitleTopWrapper>
79
79
  {props.withIcon
80
80
  ? (
81
- <OIcon
82
- url={props.icon}
83
- style={{
84
- borderColor: theme.colors.lightGray,
85
- borderRadius: 20,
86
- }}
87
- width={60}
88
- height={60}
89
- />
81
+ <OIcon
82
+ url={props.icon}
83
+ style={{
84
+ borderColor: theme.colors.lightGray,
85
+ borderRadius: 20,
86
+ }}
87
+ width={60}
88
+ height={60}
89
+ />
90
90
  )
91
91
  : null
92
92
  }
@@ -134,7 +134,7 @@ const NavBar = (props: Props) => {
134
134
  </View>
135
135
  )}
136
136
 
137
- {props.rightComponent}
137
+ { props.rightComponent }
138
138
  </Wrapper>
139
139
  )
140
140
  }
@@ -95,7 +95,7 @@ interface Props {
95
95
  style?: ViewStyle;
96
96
  bgImage: ImageSourcePropType;
97
97
  innerStyle?: ViewStyle;
98
- icon?: ImageSourcePropType;
98
+ icon: ImageSourcePropType;
99
99
  iconStyle?: ImageStyle;
100
100
  callToActionText: string;
101
101
  callToActionTextStyle?: TextStyle;
@@ -15,8 +15,6 @@ import { Container } from '../../layouts/Container'
15
15
  import NavBar from '../NavBar'
16
16
  import { LANDSCAPE, PORTRAIT, useDeviceOrientation } from '../../../../../src/hooks/DeviceOrientation'
17
17
  import GridContainer from '../../layouts/GridContainer'
18
- import AntDesignIcon from 'react-native-vector-icons/AntDesign'
19
- import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons'
20
18
 
21
19
  const OrderTypeSelectorCardUI = (props: OrderTypeSelectParams) => {
22
20
  const {
@@ -29,7 +27,7 @@ const OrderTypeSelectorCardUI = (props: OrderTypeSelectParams) => {
29
27
  callback
30
28
  } = props
31
29
 
32
- const theme = useTheme();
30
+ const theme = useTheme();
33
31
  const [, t] = useLanguage();
34
32
  const [orientationState] = useDeviceOrientation();
35
33
  const [orderState] = useOrder()
@@ -47,7 +45,7 @@ const OrderTypeSelectorCardUI = (props: OrderTypeSelectParams) => {
47
45
  }
48
46
 
49
47
  useEffect(() => {
50
- if (isCardCliked) {
48
+ if(isCardCliked){
51
49
  callback?.()
52
50
  setIsCardClicked(false)
53
51
  setIsLoadingCard(null)
@@ -85,13 +83,13 @@ const OrderTypeSelectorCardUI = (props: OrderTypeSelectParams) => {
85
83
  style={cardStyle}
86
84
  isDisabled={isCardCliked}
87
85
  isLoading={isLoadingCard === 'Eat In'}
88
- title={t('EAT_IN', 'Eat In')}
86
+ title={t('EAT_IN','Eat In')}
89
87
  description={t('EAT_IN_DESCRIPTION', 'We are very glad to have you here. Bon appetit!')}
90
88
  bgImage={theme.images.general.eatIn}
91
- VectorIcon={() => <MaterialIcon name='pin-outline' size={28} color='white' style={{ marginBottom: 10 }} />}
89
+ icon={theme.images.general.pushPin}
92
90
  callToActionText={t('START_MY_ORDER', 'Start my order')}
93
91
  onClick={() => {
94
- if (_eatIn?.value !== orderState?.options?.type) {
92
+ if(_eatIn?.value !== orderState?.options?.type){
95
93
  handleChangeOrderType(_eatIn?.value);
96
94
  setIsCardClicked(true)
97
95
  setIsLoadingCard('Eat In')
@@ -108,15 +106,15 @@ const OrderTypeSelectorCardUI = (props: OrderTypeSelectParams) => {
108
106
 
109
107
  <OptionCard
110
108
  style={cardStyle}
111
- title={t('TAKE_OUT', 'Take out')}
109
+ title={t('TAKE_OUT','Take out')}
112
110
  isDisabled={isCardCliked}
113
111
  isLoading={isLoadingCard === 'Take out'}
114
112
  description={t('TAKE_OUT_DESCRIPTION', 'You are very welcome anytime you visit us!')}
115
113
  bgImage={theme.images.general.takeOut}
116
- VectorIcon={() => <AntDesignIcon name='shoppingcart' size={28} color='white' style={{ marginBottom: 10 }} />}
114
+ icon={theme.images.general.shoppingCart}
117
115
  callToActionText={t('START_MY_ORDER', 'Start my order')}
118
116
  onClick={() => {
119
- if (_takeOut?.value !== orderState?.options?.type) {
117
+ if(_takeOut?.value !== orderState?.options?.type){
120
118
  handleChangeOrderType(_takeOut?.value);
121
119
  setIsCardClicked(true)
122
120
  setIsLoadingCard('Take out')
@@ -550,7 +550,7 @@ export const ProductOptionsUI = (props: any) => {
550
550
  </View>
551
551
  )}
552
552
  <View style={{ width: isSoldOut || maxProductQuantity <= 0 ? '100%' : isDrawer ? '70%' : '80%' }}>
553
- {productCart && !isSoldOut && maxProductQuantity > 0 && auth && orderState.options?.address_id && (
553
+ {productCart && !isSoldOut && maxProductQuantity > 0 && auth && (
554
554
  <OButton
555
555
  onClick={() => handleSaveProduct()}
556
556
  imgRightSrc=''
@@ -563,19 +563,6 @@ export const ProductOptionsUI = (props: any) => {
563
563
  }}
564
564
  />
565
565
  )}
566
- {auth && !orderState.options?.address_id && (
567
- orderState.loading ? (
568
- <OButton
569
- isDisabled
570
- text={t('LOADING', 'Loading')}
571
- imgRightSrc=''
572
- />
573
- ) : (
574
- <OButton
575
- onClick={navigation?.navigate('AddressList')}
576
- />
577
- )
578
- )}
579
566
  {(!auth || isSoldOut || maxProductQuantity <= 0) && (
580
567
  <OButton
581
568
  isDisabled={isSoldOut || maxProductQuantity <= 0}
@@ -10,8 +10,6 @@ import {
10
10
 
11
11
  import * as React from 'react';
12
12
  import styled from 'styled-components/native';
13
- import AntDesignIcon from 'react-native-vector-icons/AntDesign'
14
- import { Icon, IconProps } from 'react-native-vector-icons/Icon';
15
13
 
16
14
  const StyledButton = styled.View<Props>`
17
15
  background-color: ${(props: any) => props.theme.colors.primary};
@@ -79,19 +77,17 @@ interface Props {
79
77
  isCircle?: boolean;
80
78
  bgColor?: string;
81
79
  borderColor?: string;
82
- iconProps?: IconProps;
83
- IconCustom?: React.FunctionComponent
84
80
  }
85
81
 
86
82
  const OButton = (props: Props): React.ReactElement => {
87
83
  if (props.isDisabled) {
88
84
  return (
89
85
  <View style={props.parentStyle}>
90
- <StyledButtonDisabled style={props.style}>
91
- <StyledTextDisabled style={props.disabledTextStyle ? props.disabledTextStyle : props.textStyle}>
92
- {props.text}
93
- </StyledTextDisabled>
94
- </StyledButtonDisabled>
86
+ <StyledButtonDisabled style={props.style}>
87
+ <StyledTextDisabled style={props.disabledTextStyle ? props.disabledTextStyle : props.textStyle}>
88
+ {props.text}
89
+ </StyledTextDisabled>
90
+ </StyledButtonDisabled>
95
91
  </View>
96
92
  );
97
93
  }
@@ -115,15 +111,6 @@ const OButton = (props: Props): React.ReactElement => {
115
111
  {props.imgLeftSrc ? (
116
112
  <StyledImage style={props.imgLeftStyle} source={props.imgLeftSrc} />
117
113
  ) : null}
118
- {props.iconProps ? (
119
- <>
120
- {props?.IconCustom ? (
121
- <props.IconCustom {...props.iconProps} />
122
- ) : (
123
- <AntDesignIcon {...props.iconProps} />
124
- )}
125
- </>
126
- ) : null}
127
114
  {props.text ? (
128
115
  <StyledText style={props.textStyle}>{props.text}</StyledText>
129
116
  ) : null}
@@ -82,6 +82,8 @@ export interface LoginParams {
82
82
  handleSendVerifyCode?: any;
83
83
  handleCheckPhoneCode?: any;
84
84
  useRootPoint?: any;
85
+ enableReCaptcha?: boolean;
86
+ handleReCaptcha?: (vlaue: any) => void;
85
87
  }
86
88
 
87
89
  export interface ProductItemAccordionParams {
@@ -51,6 +51,7 @@ import { LastOrders } from './src/components/LastOrders';
51
51
  import { MultiCheckout } from './src/components/MultiCheckout'
52
52
  import { MultiOrdersDetails } from './src/components/MultiOrdersDetails'
53
53
  import NavBar from './src/components/NavBar';
54
+ import { NotificationsList } from './src/components/Notifications'
54
55
  import { BusinessTypeFilter } from './src/components/BusinessTypeFilter';
55
56
  import { BusinessController } from './src/components/BusinessController';
56
57
  import { BusinessFeaturedController } from './src/components/BusinessFeaturedController';
@@ -59,6 +60,7 @@ import { PaymentOptions } from './src/components/PaymentOptions';
59
60
  import { DriverTips } from './src/components/DriverTips';
60
61
  import { UserDetails } from './src/components/UserDetails';
61
62
  import { OrderSummary } from './src/components/OrderSummary';
63
+ import { OrderItAgain } from './src/components/OrderItAgain';
62
64
  import { CartStoresListing } from './src/components/CartStoresListing';
63
65
  import { PaymentOptionsWebView } from '../../src/components/PaymentOptionsWebView';
64
66
  import { GoogleMap } from './src/components/GoogleMap';
@@ -182,6 +184,7 @@ export {
182
184
  OrderDetails,
183
185
  OrderProgress,
184
186
  BusinessPreorder,
187
+ NotificationsList,
185
188
  UserProfileForm,
186
189
  ReviewOrder,
187
190
  ReviewProducts,
@@ -219,6 +222,7 @@ export {
219
222
  DriverTips,
220
223
  UserDetails,
221
224
  OrderSummary,
225
+ OrderItAgain,
222
226
  CartStoresListing,
223
227
  PaymentOptionsWebView,
224
228
  GoogleMap,