ordering-ui-react-native 0.15.64 → 0.15.65-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 (211) 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 +6 -8
  94. package/themes/original/src/components/BusinessBasicInformation/index.tsx +304 -158
  95. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  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 +318 -155
  108. package/themes/original/src/components/BusinessProductsListing/styles.tsx +32 -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/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  114. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +679 -0
  115. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  116. package/themes/original/src/components/BusinessesListing/index.tsx +99 -458
  117. package/themes/original/src/components/Cart/index.tsx +61 -42
  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/MomentSelector/index.tsx +197 -0
  137. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  138. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  139. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  140. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  141. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  142. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  143. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  144. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  145. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  146. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  147. package/themes/original/src/components/NavBar/index.tsx +4 -4
  148. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  149. package/themes/original/src/components/OrderDetails/index.tsx +150 -64
  150. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  151. package/themes/original/src/components/OrderSummary/index.tsx +6 -6
  152. package/themes/original/src/components/OrderTypeSelector/index.tsx +79 -35
  153. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  154. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  155. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  156. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  157. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  158. package/themes/original/src/components/OrdersOption/index.tsx +137 -38
  159. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  160. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  161. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  162. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  163. package/themes/original/src/components/PaymentOptions/index.tsx +58 -37
  164. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  165. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  166. package/themes/original/src/components/ProductForm/index.tsx +718 -679
  167. package/themes/original/src/components/ProductForm/styles.tsx +6 -2
  168. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  169. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  170. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  171. package/themes/original/src/components/ProfessionalFilter/index.tsx +128 -0
  172. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  173. package/themes/original/src/components/ProfessionalProfile/index.tsx +298 -0
  174. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  175. package/themes/original/src/components/Promotions/index.tsx +151 -133
  176. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  177. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  178. package/themes/original/src/components/ReviewOrder/index.tsx +1 -1
  179. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  180. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  181. package/themes/original/src/components/SearchBar/index.tsx +13 -5
  182. package/themes/original/src/components/ServiceForm/index.tsx +579 -0
  183. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  184. package/themes/original/src/components/Sessions/index.tsx +160 -0
  185. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  186. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  187. package/themes/original/src/components/SingleOrderCard/index.tsx +275 -0
  188. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  189. package/themes/original/src/components/SingleProductCard/index.tsx +161 -88
  190. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  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/OButton.tsx +2 -0
  205. package/themes/original/src/components/shared/OInput.tsx +3 -2
  206. package/themes/original/src/components/shared/OModal.tsx +4 -2
  207. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  208. package/themes/original/src/types/index.tsx +187 -35
  209. package/themes/original/src/utils/index.tsx +96 -2
  210. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  211. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ordering-ui-react-native",
3
- "version": "0.15.64",
3
+ "version": "0.15.65-release",
4
4
  "description": "Reusable components made in react native",
5
5
  "main": "src/index.tsx",
6
6
  "author": "ordering.inc",
@@ -57,7 +57,7 @@
57
57
  "@types/styled-components": "^5.1.3",
58
58
  "axios": "^0.21.0",
59
59
  "moment": "^2.29.1",
60
- "ordering-components": "github:Ordering-Inc/ordering-components#development",
60
+ "ordering-components": "github:Ordering-Inc/ordering-components#release",
61
61
  "patch-package": "^6.4.7",
62
62
  "postinstall-postinstall": "^2.1.0",
63
63
  "prop-types": "^15.7.2",
@@ -86,6 +86,7 @@
86
86
  "react-native-google-places-autocomplete": "^2.1.3",
87
87
  "react-native-html-to-pdf": "^0.10.0",
88
88
  "react-native-image-picker": "^4.0.6",
89
+ "react-native-intersection-observer": "^0.0.9",
89
90
  "react-native-lightbox": "^0.8.1",
90
91
  "react-native-linear-gradient": "^2.5.6",
91
92
  "react-native-loading-spinner-overlay": "^2.0.0",
@@ -109,6 +110,7 @@
109
110
  "react-native-sound": "^0.11.1",
110
111
  "react-native-swipe-gestures": "^1.0.5",
111
112
  "react-native-swiper": "^1.6.0",
113
+ "react-native-tracking-transparency": "^0.1.1",
112
114
  "react-native-uuid": "^2.0.1",
113
115
  "react-native-vector-icons": "^7.1.0",
114
116
  "react-native-webview": "^11.6.4",
@@ -123,8 +125,10 @@
123
125
  "@babel/core": "^7.11.6",
124
126
  "@babel/runtime": "^7.11.2",
125
127
  "@react-native-community/eslint-config": "^2.0.0",
126
- "@types/react": "^16.9.51",
128
+ "@types/react": "^18.0.15",
129
+ "@types/react-dom": "^18.0.6",
127
130
  "@types/react-native": "^0.63.25",
131
+ "@types/react-native-calendar-picker": "^7.0.2",
128
132
  "babel-jest": "^26.3.0",
129
133
  "eslint": "^7.10.0",
130
134
  "jest": "^26.4.2",
@@ -7,7 +7,8 @@
7
7
  */
8
8
 
9
9
  import * as React from 'react';
10
- import { LogBox } from 'react-native';
10
+ import { LogBox, Platform } from 'react-native';
11
+ import * as Sentry from "@sentry/react-native";
11
12
  import { OrderingProvider } from 'ordering-components/native';
12
13
  import RNBootSplash from "react-native-bootsplash";
13
14
 
@@ -22,6 +23,47 @@ import theme from './theme.json';
22
23
  import AppContainer from './AppContainer';
23
24
  import { FacebookPixel } from './components/FacebookPixel';
24
25
 
26
+ Sentry.init({
27
+ environment: Platform.OS === 'ios' ? 'ios' : 'android',
28
+ dsn: 'https://e5e1115dc93b49109f4ab65f2098bef9@o460529.ingest.sentry.io/5722123',
29
+ release: 'ordering-ui-native@' + process.env.npm_package_version,
30
+ ignoreErrors: [
31
+ 'is not defined',
32
+ 'is not a function',
33
+ 'can\'t find variable',
34
+ 'objects are not valid',
35
+ 'element type is invalid',
36
+ 'requiring module',
37
+ 'has not been registered',
38
+ 'failed to connect to debugger!',
39
+ 'rendered more hooks than',
40
+ 'rendered fewer hooks than',
41
+ 'should have a queue',
42
+ 'the OS most likely terminated',
43
+ 'Connection timed out',
44
+ 'java.io.EOFException',
45
+ 'Abort',
46
+ 'Segfault',
47
+ 'Failed to allocate a',
48
+ 'Application Not Responding',
49
+ 'connection no longer valid',
50
+ 'IllegalInstruction',
51
+ 'React.Children.only expected to receive a single React element child.',
52
+ 'unrecognized selector sent to instance'
53
+ ],
54
+ tracesSampleRate: 0.2,
55
+ // Release health
56
+ enableAutoSessionTracking: true,
57
+ // Sessions close after app is 10 seconds in the background.
58
+ sessionTrackingIntervalMillis: 10000,
59
+
60
+ integrations: [
61
+ new Sentry.ReactNativeTracing({
62
+ routingInstrumentation: reactNavigationV5Instrumentation,
63
+ })
64
+ ]
65
+ });
66
+
25
67
  LogBox.ignoreLogs([
26
68
  'Sending \`onAnimatedValueUpdate` with no listeners registered.',
27
69
  'Non-serializable values were found in the navigation state.',
@@ -210,9 +210,25 @@ const AddressFormUI = (props: AddressFormParams) => {
210
210
  }
211
211
  if ( addressType === 'postal_code') {
212
212
  postalCode = component.short_name
213
+ if (isObjet) {
214
+ setValue('zipcode', postalCode)
215
+ handleChangeInput({ target: { name: 'zipcode', value: postalCode } })
216
+ }
213
217
  }
214
218
  }
215
219
  isObjet ? address = addressValue.join(', ') : address
220
+
221
+ if (isObjet) {
222
+ setValue('address', address)
223
+ googleInput?.current?.setAddressText(address)
224
+ setLoadingLocation(false)
225
+ updateChanges({
226
+ address: address,
227
+ location: json.results[0].geometry.location
228
+ })
229
+ return
230
+ }
231
+
216
232
  data.address = {
217
233
  address,
218
234
  location: json.results[0].geometry.location,
@@ -597,7 +613,7 @@ const AddressFormUI = (props: AddressFormParams) => {
597
613
  name='zipcode'
598
614
  rules={{ required: isRequiredField && isRequiredField('zipcode') ? t(`VALIDATION_ERROR_ZIP_CODE_REQUIRED`, `The field Zip Code is required`) : null }}
599
615
  defaultValue={address?.zipcode || formState.changes?.zipcode || addressState.address.zipcode || ''}
600
- render={() => (
616
+ render={({ value }) => (
601
617
  <OInput
602
618
  name='zipcode'
603
619
  placeholder={t('ZIP_CODE', 'Zip code')}
@@ -605,7 +621,7 @@ const AddressFormUI = (props: AddressFormParams) => {
605
621
  handleChangeInput(text)
606
622
  setValue('zipcode', text)
607
623
  }}
608
- value={address?.zipcode || formState.changes?.zipcode || addressState.address.zipcode || ''}
624
+ value={value || address?.zipcode || formState.changes?.zipcode || addressState.address.zipcode || ''}
609
625
  style={styles.inputsStyle}
610
626
  forwardRef={zipCodeRef}
611
627
  returnKeyType='next'
@@ -56,22 +56,14 @@ export const BusinessBasicInformation = (props: BusinessBasicInformationParams)
56
56
  }
57
57
  source={{ uri: header || optimizeImage(businessState?.business?.header, 'h_400,c_limit') }}
58
58
  >
59
- <BusinessLogo>
60
- {loading ? (
61
- <View style={{ marginLeft: 20 }}>
62
- <Placeholder Animation={Fade}>
63
- <PlaceholderLine height={50} width={20} />
64
- </Placeholder>
65
- </View>
66
- ) : (
67
- !isBusinessInfoShow && (
68
- <OIcon
69
- url={logo || optimizeImage(businessState?.business?.logo, 'h_300,c_limit')}
70
- style={styles.businessLogo}
71
- />
72
- )
73
- )}
74
- </BusinessLogo>
59
+ {!isBusinessInfoShow && (
60
+ <BusinessLogo>
61
+ <OIcon
62
+ url={logo || optimizeImage(businessState?.business?.logo, 'h_300,c_limit')}
63
+ style={styles.businessLogo}
64
+ />
65
+ </BusinessLogo>
66
+ )}
75
67
  </BusinessHeader>
76
68
  <BusinessInfo
77
69
  style={styles.businessInfo}
@@ -117,7 +109,7 @@ export const BusinessBasicInformation = (props: BusinessBasicInformationParams)
117
109
  <PlaceholderLine width={10} />
118
110
  </Placeholder>
119
111
  ) : (
120
- <View style={{width: '75%'}}>
112
+ <View style={{ width: '75%' }}>
121
113
  <OText color={theme.colors.textSecondary}>{getBusinessType()}</OText>
122
114
  </View>
123
115
  )}
@@ -187,7 +179,7 @@ export const BusinessBasicInformation = (props: BusinessBasicInformationParams)
187
179
  titleSectionStyle={styles.modalTitleSectionStyle}
188
180
  open={openBusinessInformation}
189
181
  onClose={() => setOpenBusinessInformation(false)}
190
- styleCloseButton={{color: theme.colors.white, backgroundColor: 'rgba(0,0,0,0.3)'}}
182
+ styleCloseButton={{ color: theme.colors.white, backgroundColor: 'rgba(0,0,0,0.3)' }}
191
183
  isNotDecoration
192
184
  >
193
185
  <BusinessInformation
@@ -199,7 +191,7 @@ export const BusinessBasicInformation = (props: BusinessBasicInformationParams)
199
191
  titleSectionStyle={styles.modalTitleSectionStyle}
200
192
  open={openBusinessReviews}
201
193
  onClose={() => setOpenBusinessReviews(false)}
202
- styleCloseButton={{color: theme.colors.white, backgroundColor: 'rgba(0,0,0,0.3)'}}
194
+ styleCloseButton={{ color: theme.colors.white, backgroundColor: 'rgba(0,0,0,0.3)' }}
203
195
  isNotDecoration
204
196
  >
205
197
  <BusinessReviews
@@ -32,6 +32,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
32
32
  business,
33
33
  handleClick,
34
34
  isBusinessOpen,
35
+ getBusinessOffer,
35
36
  businessWillCloseSoonMinutes,
36
37
  isBusinessClose
37
38
  } = props;
@@ -145,11 +146,18 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
145
146
  />
146
147
  </BusinessLogo>
147
148
  <BusinessState>
148
- {!isBusinessOpen && (
149
+ {(!isBusinessOpen || !!getBusinessOffer(business?.offers)) && (
149
150
  <View style={styles.businessStateView}>
150
- <OText color={theme.colors.white} size={20} style={styles.businessStateText}>
151
- {t('PREORDER', 'PREORDER')}
152
- </OText>
151
+ {getBusinessOffer(business?.offers) && (
152
+ <OText color={theme.colors.white} size={18} style={styles.businessStateText}>
153
+ {getBusinessOffer(business?.offers) || parsePrice(0)}
154
+ </OText>
155
+ )}
156
+ {!isBusinessOpen && (
157
+ <OText color={theme.colors.white} size={18} style={styles.businessStateText}>
158
+ {t('PREORDER', 'PREORDER')}
159
+ </OText>
160
+ )}
153
161
  </View>
154
162
  )}
155
163
  </BusinessState>
@@ -158,10 +166,10 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
158
166
  <BusinessInfo>
159
167
  <View style={{ width: '70%', alignItems: 'flex-start' }}>
160
168
  <OText
161
- size={20}
162
- numberOfLines={1}
163
- ellipsizeMode='tail'
164
- >
169
+ size={20}
170
+ numberOfLines={1}
171
+ ellipsizeMode='tail'
172
+ >
165
173
  {business?.name}
166
174
  </OText>
167
175
  </View>
@@ -48,6 +48,20 @@ const BusinessInformationUI = (props: BusinessInformationParams) => {
48
48
  />
49
49
  <WrapMainContent>
50
50
  <InnerContent>
51
+ {(!!businessState?.business?.email || !!businessState?.business?.cellphone) && (
52
+ <>
53
+ <GrayBackground>
54
+ <OText size={16} weight='bold'>{t('BUSINESS_DETAILS', 'Business Details')}</OText>
55
+ </GrayBackground>
56
+ {!!businessState?.business?.email && (
57
+ <OText size={14} mBottom={5} mLeft={15} style={{ marginTop: 10 }}>{t('EMAIL', 'Email')}: <OText color={theme.colors.textSecondary}>{businessState?.business?.email}</OText></OText>
58
+ )}
59
+ {!!businessState?.business?.cellphone && (
60
+ <OText size={14} mBottom={20} mLeft={15}>{t('CELLPHONE', 'Cellphone')}: <OText color={theme.colors.textSecondary}>{businessState?.business?.cellphone}</OText></OText>
61
+ )}
62
+ </>
63
+ )}
64
+
51
65
  <GrayBackground>
52
66
  <OText size={16} weight='bold'>{t('BUSINESS_LOCATION', 'Business Location')}</OText>
53
67
  </GrayBackground>
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react'
2
- import { StyleSheet, View, ScrollView, Dimensions, Platform, PlatformIOSStatic, Pressable } from 'react-native'
2
+ import { StyleSheet, View, ScrollView, Dimensions, Platform, PlatformIOSStatic, TouchableOpacity } from 'react-native'
3
3
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder'
4
4
  import { BusinessTypeFilter as BusinessTypeFilterController, useLanguage } from 'ordering-components/native'
5
5
 
@@ -9,7 +9,6 @@ import { BusinessTypeFilterParams } from '../../types'
9
9
  import { useTheme } from 'styled-components/native'
10
10
  import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons';
11
11
  import DeviceInfo from 'react-native-device-info';
12
- import { TouchableOpacity } from 'react-native-gesture-handler'
13
12
 
14
13
  const windowWidth = Dimensions.get('window').width;
15
14
 
@@ -191,7 +191,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
191
191
  {isFarAway && (
192
192
  <FarAwayMessage style={styles.farAwayMsg}>
193
193
  <Ionicons name='md-warning-outline' style={styles.iconStyle} />
194
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
194
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
195
195
  </FarAwayMessage>
196
196
  )}
197
197
  </OrderControlContainer>
@@ -592,6 +592,19 @@ const CheckoutUI = (props: any) => {
592
592
  {t('WARNING_INVALID_PRODUCTS', 'Some products are invalid, please check them.')}
593
593
  </OText>
594
594
  )}
595
+
596
+ {options.type === 1 &&
597
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
598
+ validationFields?.fields?.checkout?.driver_tip?.required &&
599
+ (Number(cart?.driver_tip) <= 0) && (
600
+ <OText
601
+ style={{ textAlign: 'center' }}
602
+ color={theme.colors.error}
603
+ size={14}
604
+ >
605
+ {t('WARNING_INVALID_DRIVER_TIP', 'Driver Tip is required.')}
606
+ </OText>
607
+ )}
595
608
  </ChErrors>
596
609
  </ChSection>
597
610
  )}
@@ -602,8 +615,16 @@ const CheckoutUI = (props: any) => {
602
615
  <>
603
616
  <FloatingButton
604
617
  handleClick={() => handlePlaceOrder()}
605
- isSecondaryBtn={loading || !cart?.valid || !paymethodSelected || placing || errorCash || cart?.subtotal_to_calculate < cart?.minimum || paymethodSelected?.gateway === 'paypal'}
606
- disabled={loading || !cart?.valid || !paymethodSelected || placing || errorCash || cart?.subtotal_to_calculate < cart?.minimum || paymethodSelected?.gateway === 'paypal'}
618
+ isSecondaryBtn={loading || !cart?.valid || !paymethodSelected || placing || errorCash || cart?.subtotal_to_calculate < cart?.minimum || paymethodSelected?.gateway === 'paypal' ||
619
+ (options.type === 1 &&
620
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
621
+ validationFields?.fields?.checkout?.driver_tip?.required &&
622
+ (Number(cart?.driver_tip) <= 0))}
623
+ disabled={loading || !cart?.valid || !paymethodSelected || placing || errorCash || cart?.subtotal_to_calculate < cart?.minimum || paymethodSelected?.gateway === 'paypal' ||
624
+ (options.type === 1 &&
625
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
626
+ validationFields?.fields?.checkout?.driver_tip?.required &&
627
+ (Number(cart?.driver_tip) <= 0))}
607
628
  btnText={cart?.subtotal_to_calculate >= cart?.minimum
608
629
  ? (
609
630
  placing
@@ -49,7 +49,7 @@ const DriverTipsUI = (props: any) => {
49
49
  const [{ configs }] = useConfig();
50
50
  const [{loading}] = useOrder()
51
51
 
52
- const [value, setvalue] = useState(0);
52
+ const [value, setvalue] = useState('');
53
53
  const [valueOption,setValueOption] = useState(0)
54
54
 
55
55
  const placeholderCurrency = (configs?.currency_position?.value || 'left') === 'left'
@@ -57,9 +57,12 @@ const DriverTipsUI = (props: any) => {
57
57
  : `0${configs?.format_number_currency?.value}`
58
58
 
59
59
  const handleChangeDriverTip = (val: any) => {
60
- let tip = parseFloat(val)
61
- tip = isNaN(tip) ? 0 : tip
62
- setvalue(tip)
60
+ const tip = Number(val)
61
+ if ((isNaN(tip) || tip < 0)) {
62
+ setvalue(value)
63
+ return
64
+ }
65
+ setvalue(val)
63
66
  }
64
67
 
65
68
  const handleChangeOptionCustom = (val : any) => {
@@ -110,6 +113,8 @@ const DriverTipsUI = (props: any) => {
110
113
  <OInput
111
114
  placeholder={placeholderCurrency}
112
115
  style={style.inputStyle}
116
+ value={value}
117
+ type={'numeric'}
113
118
  onChange={handleChangeDriverTip}
114
119
  autoCapitalize='none'
115
120
  autoCorrect={false}
@@ -121,10 +126,10 @@ const DriverTipsUI = (props: any) => {
121
126
  textStyle={{ color: 'white', fontSize: 18, maxWidth: 110, minWidth: 60 }}
122
127
  imgRightSrc={null}
123
128
  textProps={{numberOfLines: 1}}
124
- isDisabled={!(value > 0 && value !== driverTip) || !value}
129
+ isDisabled={parseFloat(value || '0') < 0 || parseFloat(value || '0') === driverTip || value === ''}
125
130
  onClick={() => {
126
131
  handlerChangeOption(value)
127
- setvalue(0)
132
+ setvalue('')
128
133
  }}
129
134
  />
130
135
  </DTWrapperInput>
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react'
1
+ import React, { useEffect, useState } from 'react'
2
2
  import { LanguageSelector as LanguageSelectorController, useOrder } from 'ordering-components/native'
3
3
  import { useTheme } from 'styled-components/native';
4
4
  import { I18nManager, Platform, StyleSheet, View } from 'react-native'
@@ -87,7 +87,11 @@ const LanguageSelectorUI = (props: LanguageSelectorParams) => {
87
87
  changeDirection(Platform.OS === 'ios' ? language : langCode)
88
88
  handleChangeLanguage(Platform.OS === 'ios' ? language : langCode)
89
89
  }
90
-
90
+
91
+ useEffect(() => {
92
+ changeDirection(currentLanguage)
93
+ }, [])
94
+
91
95
  return (
92
96
  <Container>
93
97
  {languagesState?.languages ? (
@@ -1,9 +1,11 @@
1
1
  import React, { useEffect, useState, useRef } from 'react';
2
2
  import { Pressable, StyleSheet, View, Keyboard } from 'react-native';
3
3
  import Spinner from 'react-native-loading-spinner-overlay';
4
+ import { TouchableOpacity } from 'react-native-gesture-handler';
4
5
  import { useForm, Controller } from 'react-hook-form';
5
6
  import { PhoneInputNumber } from '../PhoneInputNumber'
6
7
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
8
+ import Recaptcha from 'react-native-recaptcha-that-works'
7
9
 
8
10
  import {
9
11
  LoginForm as LoginFormController,
@@ -28,7 +30,8 @@ import {
28
30
  OTab,
29
31
  SocialButtons,
30
32
  OrSeparator,
31
- LineSeparator
33
+ LineSeparator,
34
+ RecaptchaButton
32
35
  } from './styles';
33
36
 
34
37
  import { _removeStoreData } from '../../providers/StoreUtil';
@@ -56,7 +59,9 @@ const LoginFormUI = (props: LoginParams) => {
56
59
  handleSendVerifyCode,
57
60
  handleCheckPhoneCode,
58
61
  onNavigationRedirect,
59
- notificationState
62
+ notificationState,
63
+ handleReCaptcha,
64
+ enableReCaptcha
60
65
  } = props
61
66
 
62
67
  const theme = useTheme()
@@ -70,6 +75,10 @@ const LoginFormUI = (props: LoginParams) => {
70
75
  marginBottom: 25,
71
76
  borderWidth: 1,
72
77
  borderColor: theme.colors.disabled
78
+ },
79
+ recaptchaIcon: {
80
+ width: 100,
81
+ height: 100,
73
82
  }
74
83
  });
75
84
 
@@ -89,9 +98,13 @@ const LoginFormUI = (props: LoginParams) => {
89
98
  cellphone: null
90
99
  }
91
100
  });
92
-
101
+ const [recaptchaConfig, setRecaptchaConfig] = useState<any>({})
102
+ const [recaptchaVerified, setRecaptchaVerified] = useState(false)
103
+ const recaptchaRef = useRef<any>({});
93
104
  const inputRef = useRef<any>({})
94
105
 
106
+ const googleLoginEnabled = configs?.google_login_enabled?.value === '1' || !configs?.google_login_enabled?.enabled
107
+
95
108
  const anySocialButtonActivated = ((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value) ||
96
109
  (configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) ||
97
110
  (configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null)
@@ -150,6 +163,40 @@ const LoginFormUI = (props: LoginParams) => {
150
163
  onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''))
151
164
  }
152
165
 
166
+ const handleOpenRecaptcha = () => {
167
+ setRecaptchaVerified(false)
168
+
169
+ if (recaptchaVerified) {
170
+ handleReCaptcha && handleReCaptcha('')
171
+ return
172
+ }
173
+
174
+ if (!recaptchaConfig?.siteKey) {
175
+ showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
176
+ return
177
+ }
178
+ if (!recaptchaConfig?.baseUrl) {
179
+ showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
180
+ return
181
+ }
182
+
183
+ recaptchaRef.current.open()
184
+ }
185
+
186
+ const onRecaptchaVerify = (token: any) => {
187
+ setRecaptchaVerified(true)
188
+ handleReCaptcha && handleReCaptcha(token)
189
+ }
190
+
191
+ useEffect(() => {
192
+ if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
193
+ setRecaptchaConfig({
194
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
195
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
196
+ })
197
+ }
198
+ }, [configs, enableReCaptcha])
199
+
153
200
  useEffect(() => {
154
201
  if (!formState.loading && formState.result?.error) {
155
202
  formState.result?.result && showToast(
@@ -315,6 +362,48 @@ const LoginFormUI = (props: LoginParams) => {
315
362
  rules={{ required: t('VALIDATION_ERROR_PASSWORD_REQUIRED', 'The field Password is required').replace('_attribute_', t('PASSWORD', 'Password')) }}
316
363
  defaultValue=""
317
364
  />
365
+
366
+ {enableReCaptcha && (
367
+ <>
368
+ <TouchableOpacity
369
+ onPress={handleOpenRecaptcha}
370
+ >
371
+ <RecaptchaButton>
372
+ {recaptchaVerified ? (
373
+ <MaterialCommunityIcons
374
+ name="checkbox-marked"
375
+ size={26}
376
+ color={theme.colors.primary}
377
+ />
378
+ ) : (
379
+ <MaterialCommunityIcons
380
+ name="checkbox-blank-outline"
381
+ size={26}
382
+ color={theme.colors.mediumGray}
383
+ />
384
+ )}
385
+ <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
386
+ </RecaptchaButton>
387
+ </TouchableOpacity>
388
+ <Recaptcha
389
+ ref={recaptchaRef}
390
+ siteKey={recaptchaConfig?.siteKey}
391
+ baseUrl={recaptchaConfig?.baseUrl}
392
+ onVerify={onRecaptchaVerify}
393
+ onExpire={() => setRecaptchaVerified(false)}
394
+ footerComponent={<OButton
395
+ onClick={() => recaptchaRef.current.close()}
396
+ style={{ borderRadius: 0 }}
397
+ text={t('CLOSE', 'Close')}
398
+ bgColor={theme.colors.primary}
399
+ borderColor={theme.colors.primary}
400
+ textStyle={{ color: 'white' }}
401
+ imgRightSrc={null}
402
+ />}
403
+ />
404
+ </>
405
+ )}
406
+
318
407
  <OButton
319
408
  onClick={handleSubmit(onSubmit)}
320
409
  text={loginButtonText}
@@ -367,13 +456,13 @@ const LoginFormUI = (props: LoginParams) => {
367
456
  }
368
457
 
369
458
  {configs && Object.keys(configs).length > 0 && anySocialButtonActivated && (
370
- <ButtonsWrapper>
371
- <OText size={18} mBottom={10} color={theme.colors.disabled}>
372
- {t('SELECT_AN_OPTION_TO_LOGIN', 'Select an option to login')}
373
- </OText>
374
- <SocialButtons>
375
- {(configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') &&
376
- configs?.facebook_id?.value && (
459
+ <ButtonsWrapper>
460
+ <OText size={18} mBottom={10} color={theme.colors.disabled}>
461
+ {t('SELECT_AN_OPTION_TO_LOGIN', 'Select an option to login')}
462
+ </OText>
463
+ <SocialButtons>
464
+ {(configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') &&
465
+ configs?.facebook_id?.value && (
377
466
  <FacebookLogin
378
467
  notificationState={notificationState}
379
468
  handleErrors={(err: any) => showToast(ToastType.Error, err)}
@@ -381,26 +470,26 @@ const LoginFormUI = (props: LoginParams) => {
381
470
  handleSuccessFacebookLogin={handleSuccessFacebook}
382
471
  />
383
472
  )}
384
- {(configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && (
385
- <GoogleLogin
386
- notificationState={notificationState}
387
- webClientId={configs?.google_login_client_id?.value}
388
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
389
- handleLoading={(val: boolean) => setIsLoadingSocialButton(val)}
390
- handleSuccessGoogleLogin={handleSuccessFacebook}
391
- />
392
- )}
393
- {(configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && (
394
- <AppleLogin
395
- notificationState={notificationState}
396
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
397
- handleLoading={(val: boolean) => setIsLoadingSocialButton(val)}
398
- handleSuccessApple={handleSuccessApple}
399
- />
400
- )}
401
- </SocialButtons>
402
- </ButtonsWrapper>
403
- )}
473
+ {(configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled && (
474
+ <GoogleLogin
475
+ notificationState={notificationState}
476
+ webClientId={configs?.google_login_client_id?.value}
477
+ handleErrors={(err: any) => showToast(ToastType.Error, err)}
478
+ handleLoading={(val: boolean) => setIsLoadingSocialButton(val)}
479
+ handleSuccessGoogleLogin={handleSuccessFacebook}
480
+ />
481
+ )}
482
+ {(configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && (
483
+ <AppleLogin
484
+ notificationState={notificationState}
485
+ handleErrors={(err: any) => showToast(ToastType.Error, err)}
486
+ handleLoading={(val: boolean) => setIsLoadingSocialButton(val)}
487
+ handleSuccessApple={handleSuccessApple}
488
+ />
489
+ )}
490
+ </SocialButtons>
491
+ </ButtonsWrapper>
492
+ )}
404
493
 
405
494
  {onNavigationRedirect && registerButtonText && (
406
495
  <ButtonsWrapper>
@@ -438,6 +527,7 @@ const LoginFormUI = (props: LoginParams) => {
438
527
  export const LoginForm = (props: any) => {
439
528
  const loginProps = {
440
529
  ...props,
530
+ isRecaptchaEnable: true,
441
531
  UIComponent: LoginFormUI,
442
532
  handleSuccessLogin: () => _removeStoreData('isGuestUser')
443
533
  };
@@ -67,3 +67,9 @@ export const LineSeparator = styled.View`
67
67
  export const SkeletonWrapper = styled.View`
68
68
  width: 90%;
69
69
  `
70
+ export const RecaptchaButton = styled.View`
71
+ flex-direction: row;
72
+ align-items: center;
73
+ margin-bottom: 10px;
74
+ justify-content: center;
75
+ `