ordering-ui-react-native 0.16.36 → 0.16.37-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 (195) 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/LoginForm/index.tsx +15 -0
  13. package/src/components/Messages/index.tsx +2 -2
  14. package/src/components/NotificationSetting/index.tsx +85 -0
  15. package/src/components/OrderDetails/index.tsx +2 -20
  16. package/src/components/OrdersOption/index.tsx +54 -56
  17. package/src/components/PaymentOptions/index.tsx +335 -365
  18. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  19. package/src/components/ReviewDriver/index.tsx +1 -1
  20. package/src/components/ReviewOrder/index.tsx +2 -1
  21. package/src/components/ReviewProducts/index.tsx +11 -0
  22. package/src/components/SignupForm/index.tsx +15 -0
  23. package/src/components/SingleProductReview/index.tsx +8 -5
  24. package/src/components/StripeElementsForm/index.tsx +25 -16
  25. package/src/components/VerifyPhone/styles.tsx +1 -2
  26. package/src/components/shared/OBottomPopup.tsx +6 -2
  27. package/src/index.tsx +2 -0
  28. package/src/pages/BusinessesListing.tsx +7 -6
  29. package/src/pages/OrderDetails.tsx +1 -1
  30. package/src/pages/ReviewDriver.tsx +2 -2
  31. package/src/pages/ReviewOrder.tsx +2 -2
  32. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  33. package/src/utils/index.tsx +2 -1
  34. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  35. package/themes/business/src/components/Chat/index.tsx +38 -30
  36. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  37. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  38. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  39. package/themes/business/src/components/MapView/index.tsx +12 -1
  40. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  41. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  42. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  43. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  44. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  45. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  46. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  47. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  48. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  49. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  50. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  51. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  52. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  53. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  54. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  55. package/themes/business/src/components/PreviousOrders/index.tsx +22 -24
  56. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  57. package/themes/business/src/components/ReviewCustomer/index.tsx +27 -13
  58. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  59. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  60. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  61. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  62. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  63. package/themes/business/src/types/index.tsx +15 -9
  64. package/themes/business/src/utils/index.tsx +10 -0
  65. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  66. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  67. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  68. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  69. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  70. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  71. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  72. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  73. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  74. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  75. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  76. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  77. package/themes/kiosk/src/types/index.d.ts +2 -0
  78. package/themes/original/index.tsx +4 -0
  79. package/themes/original/src/components/AddressDetails/index.tsx +2 -2
  80. package/themes/original/src/components/AddressForm/index.tsx +151 -140
  81. package/themes/original/src/components/AddressList/index.tsx +1 -1
  82. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  83. package/themes/original/src/components/BusinessBasicInformation/index.tsx +324 -162
  84. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  85. package/themes/original/src/components/BusinessController/index.tsx +190 -113
  86. package/themes/original/src/components/BusinessController/styles.tsx +0 -7
  87. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  88. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  89. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  90. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  91. package/themes/original/src/components/BusinessListingSearch/index.tsx +80 -128
  92. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  93. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  94. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  95. package/themes/original/src/components/BusinessProductsList/index.tsx +49 -52
  96. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  97. package/themes/original/src/components/BusinessProductsListing/index.tsx +179 -104
  98. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -11
  99. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  100. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  101. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +37 -25
  102. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -4
  103. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +278 -104
  104. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +47 -10
  105. package/themes/original/src/components/BusinessesListing/index.tsx +95 -7
  106. package/themes/original/src/components/Cart/index.tsx +54 -16
  107. package/themes/original/src/components/Cart/styles.tsx +4 -0
  108. package/themes/original/src/components/CartContent/index.tsx +22 -16
  109. package/themes/original/src/components/Checkout/index.tsx +78 -67
  110. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  111. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  112. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  113. package/themes/original/src/components/Favorite/index.tsx +1 -0
  114. package/themes/original/src/components/FavoriteList/index.tsx +32 -2
  115. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  116. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  117. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  118. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  119. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  120. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  121. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  122. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  123. package/themes/original/src/components/LoginForm/Otp/index.tsx +95 -72
  124. package/themes/original/src/components/LoginForm/index.tsx +107 -50
  125. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  126. package/themes/original/src/components/Messages/index.tsx +17 -17
  127. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  128. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -92
  129. package/themes/original/src/components/MultiCheckout/index.tsx +6 -0
  130. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -16
  131. package/themes/original/src/components/MyOrders/index.tsx +70 -6
  132. package/themes/original/src/components/NavBar/index.tsx +15 -9
  133. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  134. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  135. package/themes/original/src/components/Notifications/index.tsx +148 -0
  136. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  137. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  138. package/themes/original/src/components/OrderDetails/index.tsx +200 -37
  139. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  140. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  141. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  142. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  143. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  144. package/themes/original/src/components/OrderSummary/index.tsx +3 -36
  145. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  146. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  147. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +97 -106
  148. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  149. package/themes/original/src/components/OrdersOption/index.tsx +71 -55
  150. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  151. package/themes/original/src/components/PaymentOptions/index.tsx +41 -23
  152. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  153. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  154. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  155. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  156. package/themes/original/src/components/ProductForm/index.tsx +635 -664
  157. package/themes/original/src/components/ProductForm/styles.tsx +9 -8
  158. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  159. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  160. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  161. package/themes/original/src/components/ProfessionalProfile/index.tsx +26 -14
  162. package/themes/original/src/components/ReviewDriver/index.tsx +7 -7
  163. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  164. package/themes/original/src/components/ReviewProducts/index.tsx +2 -2
  165. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  166. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  167. package/themes/original/src/components/SearchBar/index.tsx +5 -3
  168. package/themes/original/src/components/ServiceForm/index.tsx +410 -258
  169. package/themes/original/src/components/SignupForm/index.tsx +362 -210
  170. package/themes/original/src/components/SingleOrderCard/index.tsx +229 -181
  171. package/themes/original/src/components/SingleOrderCard/styles.tsx +0 -7
  172. package/themes/original/src/components/SingleProductCard/index.tsx +200 -110
  173. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -10
  174. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  175. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  176. package/themes/original/src/components/StripeElementsForm/index.tsx +18 -7
  177. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  178. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  179. package/themes/original/src/components/UserProfile/index.tsx +56 -31
  180. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  181. package/themes/original/src/components/UserProfileForm/index.tsx +10 -10
  182. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  183. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  184. package/themes/original/src/components/Wallets/index.tsx +176 -164
  185. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  186. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  187. package/themes/original/src/components/shared/OBottomPopup.tsx +48 -15
  188. package/themes/original/src/components/shared/OButton.tsx +10 -3
  189. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  190. package/themes/original/src/components/shared/OInput.tsx +13 -3
  191. package/themes/original/src/layouts/Container.tsx +13 -9
  192. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  193. package/themes/original/src/types/index.tsx +91 -30
  194. package/themes/original/src/utils/index.tsx +121 -10
  195. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,90 +1,113 @@
1
- import React, { useEffect } from 'react'
1
+ import React, { useEffect, useState } from 'react'
2
2
  import { formatSeconds } from '../../../utils'
3
3
  import { StyleSheet, TouchableOpacity } from 'react-native';
4
4
  import { useCountdownTimer } from '../../../../../../src/hooks/useCountdownTimer';
5
5
  import { useLanguage } from 'ordering-components/native';
6
6
  import { OTPContainer } from './styles';
7
7
  import { OText, OButton } from '../../shared';
8
- import OTPInputView from '@twotalltotems/react-native-otp-input'
8
+ import OtpInputs from 'react-native-otp-inputs';
9
9
  import { useTheme } from 'styled-components/native';
10
10
  import { otpParams } from '../../../types'
11
11
 
12
12
  export const Otp = (props: otpParams) => {
13
- const {
14
- willVerifyOtpState,
15
- setWillVerifyOtpState,
16
- onSubmit,
17
- handleLoginOtp,
18
- setAlertState
19
- } = props
13
+ const {
14
+ willVerifyOtpState,
15
+ setWillVerifyOtpState,
16
+ onSubmit,
17
+ handleLoginOtp,
18
+ setAlertState,
19
+ pinCount
20
+ } = props
20
21
 
21
- const theme = useTheme();
22
- const [, t] = useLanguage();
23
- const [otpLeftTime, _, resetOtpLeftTime]: any = useCountdownTimer(
24
- 600, willVerifyOtpState)
22
+ const theme = useTheme();
23
+ const [, t] = useLanguage();
24
+ const [otpLeftTime, _, resetOtpLeftTime]: any = useCountdownTimer(
25
+ 600, willVerifyOtpState)
25
26
 
27
+ const [code, setCode] = useState('')
26
28
 
27
- const handleOnSubmit = () => {
28
- setAlertState({
29
- open: true,
30
- title: t('CODE_SENT', 'The code has been sent'),
31
- })
32
- resetOtpLeftTime()
33
- onSubmit()
29
+
30
+ const handleOnSubmit = () => {
31
+ setAlertState({
32
+ open: true,
33
+ title: t('CODE_SENT', 'The code has been sent'),
34
+ })
35
+ resetOtpLeftTime()
36
+ onSubmit()
37
+ }
38
+
39
+ useEffect(() => {
40
+ if (otpLeftTime === 0) {
41
+ setAlertState({
42
+ open: true,
43
+ title: t('TIME_IS_UP', 'Time is up'),
44
+ content: t('PLEASE_RESEND_CODE', 'Please resend code again')
45
+ })
34
46
  }
47
+ }, [otpLeftTime])
35
48
 
36
- useEffect(() => {
37
- if (otpLeftTime === 0) {
38
- setAlertState({
39
- open: true,
40
- title: t('TIME_IS_UP', 'Time is up'),
41
- content: t('PLEASE_RESEND_CODE', 'Please resend code again')
42
- })
43
- }
44
- }, [otpLeftTime])
49
+ useEffect(() => {
50
+ if (code?.length === (pinCount || 6)) {
51
+ handleLoginOtp(code)
52
+ }
53
+ }, [code])
45
54
 
46
- const loginStyle = StyleSheet.create({
47
- underlineStyleBase: {
48
- width: 45,
49
- height: 60,
50
- borderWidth: 1,
51
- fontSize: 16
52
- },
53
- underlineStyleHighLighted: {
54
- borderColor: theme.colors.primary,
55
- color: theme.colors.primary,
56
- fontSize: 16
57
- },
58
- });
55
+ const loginStyle = StyleSheet.create({
56
+ container: {
57
+ width: '100%',
58
+ flexDirection: 'row',
59
+ justifyContent: 'space-between',
60
+ marginVertical: 30
61
+ },
62
+ focusStyles: {
63
+ borderColor: theme.colors.primary,
64
+ borderWidth: 1,
65
+ borderRadius: 8
66
+ },
67
+ underlineStyleBase: {
68
+ width: 45,
69
+ height: 50,
70
+ borderWidth: 1,
71
+ fontSize: 16,
72
+ borderRadius: 8,
73
+ borderColor: theme.colors.lightGray,
74
+ textAlign: 'center'
75
+ },
76
+ underlineStyleHighLighted: {
77
+ borderColor: theme.colors.primary,
78
+ color: theme.colors.primary,
79
+ fontSize: 16
80
+ },
81
+ });
59
82
 
60
- return (
61
- <>
62
- <OTPContainer>
63
- <OText size={24}>
64
- {formatSeconds(otpLeftTime)}
65
- </OText>
66
- <OTPInputView
67
- style={{ width: '100%', height: 150 }}
68
- pinCount={6}
69
- codeInputFieldStyle={loginStyle.underlineStyleBase}
70
- codeInputHighlightStyle={loginStyle.underlineStyleHighLighted}
71
- onCodeFilled={(code: string) => handleLoginOtp(code)}
72
- selectionColor={theme.colors.primary}
73
- />
74
- <TouchableOpacity onPress={() => handleOnSubmit()} disabled={otpLeftTime > 520}>
75
- <OText size={16} mBottom={30} color={otpLeftTime > 520 ? theme.colors.disabled : theme.colors.primary}>
76
- {t('RESEND_CODE', 'Resend code')}
77
- </OText>
78
- </TouchableOpacity>
79
- <OButton
80
- onClick={() => setWillVerifyOtpState(false)}
81
- bgColor={theme.colors.white}
82
- borderColor={theme.colors.primary}
83
- textStyle={{ color: theme.colors.primary }}
84
- style={{ borderRadius: 8, width: '100%' }}
85
- text={t('CANCEL', 'Cancel')}
86
- />
87
- </OTPContainer>
88
- </>
89
- )
83
+ return (
84
+ <>
85
+ <OTPContainer>
86
+ <OText size={24}>
87
+ {formatSeconds(otpLeftTime)}
88
+ </OText>
89
+ <OtpInputs
90
+ autofillFromClipboard
91
+ numberOfInputs={pinCount || 6}
92
+ style={loginStyle.container}
93
+ inputStyles={loginStyle.underlineStyleBase}
94
+ focusStyles={loginStyle.focusStyles}
95
+ handleChange={setCode}
96
+ />
97
+ <TouchableOpacity onPress={() => handleOnSubmit()} disabled={otpLeftTime > 520}>
98
+ <OText size={16} mBottom={30} color={otpLeftTime > 520 ? theme.colors.disabled : theme.colors.primary}>
99
+ {t('RESEND_CODE', 'Resend code')}
100
+ </OText>
101
+ </TouchableOpacity>
102
+ <OButton
103
+ onClick={() => setWillVerifyOtpState(false)}
104
+ bgColor={theme.colors.white}
105
+ borderColor={theme.colors.primary}
106
+ textStyle={{ color: theme.colors.primary }}
107
+ style={{ borderRadius: 8, width: '100%' }}
108
+ text={t('CANCEL', 'Cancel')}
109
+ />
110
+ </OTPContainer>
111
+ </>
112
+ )
90
113
  }
@@ -1,10 +1,11 @@
1
1
  import React, { useEffect, useState, useRef } from 'react';
2
- import { StyleSheet, View, Keyboard } from 'react-native';
2
+ import { StyleSheet, View, Keyboard, Vibration } from 'react-native';
3
3
  import Spinner from 'react-native-loading-spinner-overlay';
4
4
  import { useForm, Controller } from 'react-hook-form';
5
5
  import { PhoneInputNumber } from '../PhoneInputNumber';
6
6
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
7
7
  import Recaptcha from 'react-native-recaptcha-that-works'
8
+ import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
8
9
 
9
10
  import {
10
11
  LoginForm as LoginFormController,
@@ -95,14 +96,14 @@ const LoginFormUI = (props: LoginParams) => {
95
96
  const [alertState, setAlertState] = useState({ open: false, title: '', content: [] })
96
97
  const [tabLayouts, setTabLayouts] = useState<any>({})
97
98
  const tabsRef = useRef<any>(null)
98
-
99
+ const enabledPoweredByOrdering = configs?.powered_by_ordering_module?.value
99
100
  const theme = useTheme();
100
101
  const isOtpEmail = loginTab === 'otp' && otpType === 'email'
101
102
  const isOtpCellphone = loginTab === 'otp' && otpType === 'cellphone'
102
103
 
103
104
  const googleLoginEnabled = configs?.google_login_enabled?.value === '1' || !configs?.google_login_enabled?.enabled
104
105
  const facebookLoginEnabled = configs?.facebook_login_enabled?.value === '1' || !configs?.facebook_login_enabled?.enabled
105
- const appleLoginEnabled = configs?.apple_login_enabled?.value === '1' || !configs?.apple_login_enabled?.enabled
106
+ const appleLoginEnabled = configs?.apple_login_enabled?.value === '1' || !configs?.apple_login_enabled?.enabled
106
107
 
107
108
  const loginStyle = StyleSheet.create({
108
109
  btnOutline: {
@@ -164,6 +165,7 @@ const LoginFormUI = (props: LoginParams) => {
164
165
  if (loginTab === 'otp') {
165
166
  if (phoneInputData.error && (loginTab !== 'otp' || (otpType === 'cellphone' && loginTab === 'otp'))) {
166
167
  showToast(ToastType.Error, t('INVALID_PHONE_NUMBER', 'Invalid phone number'));
168
+ Vibration.vibrate()
167
169
  return
168
170
  }
169
171
  if (loginTab === 'otp') {
@@ -176,6 +178,7 @@ const LoginFormUI = (props: LoginParams) => {
176
178
  } else {
177
179
  if (phoneInputData.error) {
178
180
  showToast(ToastType.Error, phoneInputData.error);
181
+ Vibration.vibrate()
179
182
  return;
180
183
  }
181
184
  handleButtonLoginClick({
@@ -188,6 +191,7 @@ const LoginFormUI = (props: LoginParams) => {
188
191
  const handleVerifyCodeClick = () => {
189
192
  if (phoneInputData.error) {
190
193
  showToast(ToastType.Error, phoneInputData.error);
194
+ Vibration.vibrate()
191
195
  return;
192
196
  }
193
197
  if (
@@ -202,6 +206,7 @@ const LoginFormUI = (props: LoginParams) => {
202
206
  'The field Mobile phone is required.',
203
207
  ),
204
208
  );
209
+ Vibration.vibrate()
205
210
  return;
206
211
  }
207
212
  handleSendVerifyCode && handleSendVerifyCode(phoneInputData.phone);
@@ -223,10 +228,12 @@ const LoginFormUI = (props: LoginParams) => {
223
228
  setRecaptchaVerified(false)
224
229
  if (!recaptchaConfig?.siteKey) {
225
230
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
231
+ Vibration.vibrate()
226
232
  return
227
233
  }
228
234
  if (!recaptchaConfig?.baseUrl) {
229
235
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
236
+ Vibration.vibrate()
230
237
  return
231
238
  }
232
239
 
@@ -235,7 +242,7 @@ const LoginFormUI = (props: LoginParams) => {
235
242
 
236
243
  const onRecaptchaVerify = (token: any) => {
237
244
  setRecaptchaVerified(true)
238
- handleReCaptcha(token)
245
+ handleReCaptcha({ code: token, version: recaptchaConfig?.version })
239
246
  }
240
247
 
241
248
  const handleChangeOtpType = (type: string) => {
@@ -256,7 +263,7 @@ const LoginFormUI = (props: LoginParams) => {
256
263
  })
257
264
  }
258
265
 
259
- const handleCategoryScroll = (opc : string) => {
266
+ const handleCategoryScroll = (opc: string) => {
260
267
  tabsRef.current.scrollTo({
261
268
  x: tabLayouts?.[opc]?.x - 40,
262
269
  animated: true
@@ -272,15 +279,40 @@ const LoginFormUI = (props: LoginParams) => {
272
279
 
273
280
  useEffect(() => {
274
281
  if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
275
- setRecaptchaConfig({
276
- siteKey: configs?.security_recaptcha_site_key?.value || null,
277
- baseUrl: configs?.security_recaptcha_base_url?.value || null
278
- })
282
+ if (configs?.security_recaptcha_type?.value === 'v3' &&
283
+ configs?.security_recaptcha_score_v3?.value > 0 &&
284
+ configs?.security_recaptcha_site_key_v3?.value
285
+ ) {
286
+ setRecaptchaConfig({
287
+ version: 'v3',
288
+ siteKey: configs?.security_recaptcha_site_key_v3?.value || null,
289
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
290
+ })
291
+ return
292
+ }
293
+ if (configs?.security_recaptcha_site_key?.value) {
294
+ setRecaptchaConfig({
295
+ version: 'v2',
296
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
297
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
298
+ })
299
+ }
279
300
  }
280
301
  }, [configs, enableReCaptcha])
281
302
 
282
303
  useEffect(() => {
283
304
  if (!formState.loading && formState.result?.error) {
305
+ if (formState.result?.result?.[0] === 'ERROR_AUTH_VERIFICATION_CODE') {
306
+ setRecaptchaVerified(false)
307
+ setRecaptchaConfig({
308
+ version: 'v2',
309
+ siteKey: configs?.security_recaptcha_site_key?.value || null,
310
+ baseUrl: configs?.security_recaptcha_base_url?.value || null
311
+ })
312
+ showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
313
+ Vibration.vibrate()
314
+ return
315
+ }
284
316
  formState.result?.result &&
285
317
  showToast(
286
318
  ToastType.Error,
@@ -288,6 +320,7 @@ const LoginFormUI = (props: LoginParams) => {
288
320
  ? formState.result?.result
289
321
  : formState.result?.result[0],
290
322
  );
323
+ formState.result?.result && Vibration.vibrate()
291
324
  }
292
325
  }, [formState]);
293
326
 
@@ -299,6 +332,7 @@ const LoginFormUI = (props: LoginParams) => {
299
332
  ? verifyPhoneState?.result?.result
300
333
  : verifyPhoneState?.result?.result[0];
301
334
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
335
+ verifyPhoneState.result?.result && Vibration.vibrate();
302
336
  setIsLoadingVerifyModal(false);
303
337
  return;
304
338
  }
@@ -338,6 +372,10 @@ const LoginFormUI = (props: LoginParams) => {
338
372
  }
339
373
  }, [checkPhoneCodeState])
340
374
 
375
+ useEffect(() => {
376
+ if (!!Object.values(errors)?.length) Vibration.vibrate()
377
+ }, [errors])
378
+
341
379
  return (
342
380
  <Container>
343
381
  <NavBar
@@ -351,15 +389,15 @@ const LoginFormUI = (props: LoginParams) => {
351
389
  titleStyle={{ marginRight: 0, marginLeft: 0 }}
352
390
  />
353
391
  <FormSide>
354
- {((useLoginByEmail && useLoginByCellphone) || useLoginOtp) && (
392
+ {(Number(useLoginByEmail) + Number(useLoginByCellphone) + Number(useLoginOtpEmail) + Number(useLoginOtpCellphone) > 1) && (
355
393
  <LoginWith>
356
394
  <OTabs
357
- horizontal
395
+ horizontal
358
396
  showsHorizontalScrollIndicator={false}
359
397
  ref={tabsRef}
360
398
  >
361
399
  {useLoginByEmail && (
362
- <TabBtn
400
+ <TabBtn
363
401
  onPress={() => handleChangeTab('email')}
364
402
  onLayout={(event: any) => handleOnLayout(event, 'email')}
365
403
  >
@@ -384,7 +422,7 @@ const LoginFormUI = (props: LoginParams) => {
384
422
  </TabBtn>
385
423
  )}
386
424
  {useLoginByCellphone && (
387
- <TabBtn
425
+ <TabBtn
388
426
  onPress={() => handleChangeTab('cellphone')}
389
427
  onLayout={(event: any) => handleOnLayout(event, 'cellphone')}
390
428
  >
@@ -409,7 +447,7 @@ const LoginFormUI = (props: LoginParams) => {
409
447
  </TabBtn>
410
448
  )}
411
449
  {useLoginOtpEmail && (
412
- <TabBtn
450
+ <TabBtn
413
451
  onPress={() => handleChangeOtpType('email')}
414
452
  onLayout={(event: any) => handleOnLayout(event, 'otp_email')}
415
453
  >
@@ -434,7 +472,7 @@ const LoginFormUI = (props: LoginParams) => {
434
472
  </TabBtn>
435
473
  )}
436
474
  {useLoginOtpCellphone && (
437
- <TabBtn
475
+ <TabBtn
438
476
  onPress={() => handleChangeOtpType('cellphone')}
439
477
  onLayout={(event: any) => handleOnLayout(event, 'otp_cellphone')}
440
478
  >
@@ -596,35 +634,47 @@ const LoginFormUI = (props: LoginParams) => {
596
634
  </TouchableOpacity>
597
635
  )}
598
636
 
599
- {enableReCaptcha && (
637
+ {(enableReCaptcha && recaptchaConfig?.version) && (
600
638
  <>
601
- <TouchableOpacity
602
- onPress={handleOpenRecaptcha}
603
- >
604
- <RecaptchaButton>
605
- {recaptchaVerified ? (
606
- <MaterialCommunityIcons
607
- name="checkbox-marked"
608
- size={26}
609
- color={theme.colors.primary}
610
- />
611
- ) : (
612
- <MaterialCommunityIcons
613
- name="checkbox-blank-outline"
614
- size={26}
615
- color={theme.colors.mediumGray}
616
- />
617
- )}
618
- <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
619
- </RecaptchaButton>
620
- </TouchableOpacity>
621
- <Recaptcha
622
- ref={recaptchaRef}
623
- siteKey={recaptchaConfig?.siteKey}
624
- baseUrl={recaptchaConfig?.baseUrl}
625
- onVerify={onRecaptchaVerify}
626
- onExpire={() => setRecaptchaVerified(false)}
627
- />
639
+ {recaptchaConfig?.version === 'v3' ? (
640
+ <ReCaptcha
641
+ url={recaptchaConfig?.baseUrl}
642
+ siteKey={recaptchaConfig?.siteKey}
643
+ containerStyle={{ height: 40 }}
644
+ onExecute={onRecaptchaVerify}
645
+ reCaptchaType={1}
646
+ />
647
+ ) : (
648
+ <>
649
+ <TouchableOpacity
650
+ onPress={handleOpenRecaptcha}
651
+ >
652
+ <RecaptchaButton>
653
+ {recaptchaVerified ? (
654
+ <MaterialCommunityIcons
655
+ name="checkbox-marked"
656
+ size={26}
657
+ color={theme.colors.primary}
658
+ />
659
+ ) : (
660
+ <MaterialCommunityIcons
661
+ name="checkbox-blank-outline"
662
+ size={26}
663
+ color={theme.colors.mediumGray}
664
+ />
665
+ )}
666
+ <OText size={14} mLeft={8}>{t('VERIFY_ReCAPTCHA', 'Verify reCAPTCHA')}</OText>
667
+ </RecaptchaButton>
668
+ </TouchableOpacity>
669
+ <Recaptcha
670
+ ref={recaptchaRef}
671
+ siteKey={recaptchaConfig?.siteKey}
672
+ baseUrl={recaptchaConfig?.baseUrl}
673
+ onVerify={onRecaptchaVerify}
674
+ onExpire={() => setRecaptchaVerified(false)}
675
+ />
676
+ </>)
677
+ }
628
678
  </>
629
679
  )}
630
680
  <OButton
@@ -643,7 +693,7 @@ const LoginFormUI = (props: LoginParams) => {
643
693
  {t('NEW_ON_PLATFORM', 'New on Ordering?')}
644
694
  </OText>
645
695
  <TouchableOpacity onPress={() => onNavigationRedirect('Signup')}>
646
- <OText size={14} mLeft={5} color={theme.colors.skyBlue}>
696
+ <OText size={14} mLeft={5} color={theme.colors.primary}>
647
697
  {t('CREATE_ACCOUNT', 'Create account')}
648
698
  </OText>
649
699
  </TouchableOpacity>
@@ -682,8 +732,9 @@ const LoginFormUI = (props: LoginParams) => {
682
732
  )}
683
733
 
684
734
  {configs && Object.keys(configs).length > 0 ? (
685
- (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value) ||
686
- (configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null)) &&
735
+ (((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value && facebookLoginEnabled) ||
736
+ ((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
737
+ ((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) &&
687
738
  (
688
739
  <>
689
740
  <View
@@ -707,11 +758,11 @@ const LoginFormUI = (props: LoginParams) => {
707
758
  <ButtonsWrapper>
708
759
  <SocialButtons>
709
760
  {(configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') &&
710
- configs?.facebook_id?.value &&
761
+ configs?.facebook_id?.value &&
711
762
  facebookLoginEnabled && (
712
763
  <FacebookLogin
713
764
  notificationState={notificationState}
714
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
765
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
715
766
  handleLoading={(val: boolean) => setIsFBLoading(val)}
716
767
  handleSuccessFacebookLogin={handleSuccessFacebook}
717
768
  />
@@ -720,7 +771,7 @@ const LoginFormUI = (props: LoginParams) => {
720
771
  <GoogleLogin
721
772
  notificationState={notificationState}
722
773
  webClientId={configs?.google_login_client_id?.value}
723
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
774
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
724
775
  handleLoading={(val: boolean) => setIsFBLoading(val)}
725
776
  handleSuccessGoogleLogin={handleSuccessFacebook}
726
777
  />
@@ -728,7 +779,7 @@ const LoginFormUI = (props: LoginParams) => {
728
779
  {(configs?.apple_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && appleLoginEnabled && (
729
780
  <AppleLogin
730
781
  notificationState={notificationState}
731
- handleErrors={(err: any) => showToast(ToastType.Error, err)}
782
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
732
783
  handleLoading={(val: boolean) => setIsFBLoading(val)}
733
784
  handleSuccessAppleLogin={handleSuccessFacebook}
734
785
  />
@@ -751,6 +802,12 @@ const LoginFormUI = (props: LoginParams) => {
751
802
  </Placeholder>
752
803
  </SkeletonWrapper>
753
804
  )}
805
+
806
+ {enabledPoweredByOrdering && (
807
+ <OText>
808
+ Powered By Ordering.co
809
+ </OText>
810
+ )}
754
811
  </FormSide>
755
812
  <OModal
756
813
  open={isModalVisible}
@@ -0,0 +1,69 @@
1
+ import React, { useRef } from 'react'
2
+ import Lottie from 'lottie-react-native';
3
+ import { TouchableOpacity, Easing, ViewStyle, Animated } from 'react-native';
4
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
5
+ import { useTheme } from 'styled-components';
6
+
7
+ interface Props {
8
+ initialValue: number,
9
+ onClick: any,
10
+ disableAnimation?: boolean
11
+ toValue: number,
12
+ style?: ViewStyle,
13
+ duration?: number,
14
+ type: 'favorite', // animation types
15
+ isActive: boolean,
16
+ animationType?: ((value : number) => number);
17
+ useNativeDriver?: boolean,
18
+ iconProps?: {color?: string, size?: number, style?: ViewStyle}
19
+ }
20
+
21
+ export const LottieAnimation = (props: Props) => {
22
+ const {
23
+ initialValue,
24
+ onClick,
25
+ disableAnimation,
26
+ toValue,
27
+ style,
28
+ duration,
29
+ type,
30
+ isActive,
31
+ useNativeDriver,
32
+ animationType,
33
+ iconProps
34
+ } = props
35
+ const theme = useTheme()
36
+ const animationProgress = useRef(new Animated.Value(initialValue))
37
+ const favoriteArray = ['heart', 'hearto']
38
+ const icon = type === 'favorite' ? favoriteArray : []
39
+ const animationGif = type === 'favorite' ? theme.images?.general?.heart : ''
40
+ const onPressLottie = () => {
41
+ if (!disableAnimation) {
42
+ Animated.timing(animationProgress.current, {
43
+ toValue,
44
+ duration: duration || 5000,
45
+ easing: animationType || Easing.linear,
46
+ useNativeDriver: useNativeDriver ?? true
47
+ }).start();
48
+ }
49
+ onClick()
50
+ }
51
+
52
+ return (
53
+ <TouchableOpacity
54
+ onPress={onPressLottie}
55
+ style={style}
56
+ >
57
+ <Lottie
58
+ progress={animationProgress.current}
59
+ source={animationGif}
60
+ />
61
+ <IconAntDesign
62
+ name={isActive ? icon[0] : icon[1]}
63
+ color={iconProps?.color || theme.colors.danger5}
64
+ size={iconProps?.size || 16}
65
+ style={iconProps?.style}
66
+ />
67
+ </TouchableOpacity>
68
+ )
69
+ }
@@ -5,6 +5,7 @@ import { launchImageLibrary } from 'react-native-image-picker'
5
5
  import { GiftedChat, Actions, ActionsProps, InputToolbar, Composer, Send, Bubble, MessageImage, InputToolbarProps, ComposerProps } from 'react-native-gifted-chat'
6
6
  import { USER_TYPE } from '../../config/constants'
7
7
  import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
8
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
8
9
  import { OIcon, OIconButton, OText, OButton } from '../shared'
9
10
  import { TouchableOpacity, ActivityIndicator, StyleSheet, View, Platform, Keyboard } from 'react-native'
10
11
  import { Header, TitleHeader, Wrapper, QuickMessageContainer, ProfileMessageHeader, MessageTypeItem } from './styles'
@@ -36,7 +37,7 @@ const ORDER_STATUS: any = {
36
37
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
37
38
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
38
39
  22: 'ORDER_LOOKING_FOR_DRIVER',
39
- 23: 'ORDER_DRIVER_ON_WAY'
40
+ 23: 'ORDER_DRIVER_ON_WAY'
40
41
  }
41
42
 
42
43
  const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
@@ -122,18 +123,17 @@ const MessagesUI = (props: MessagesParams) => {
122
123
 
123
124
  const messageConsole = (message: any) => {
124
125
  return message.change?.attribute !== 'driver_id'
125
- ?
126
- `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${
127
- filterSpecialStatus.includes(message.change.attribute) ?
128
- `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
129
- `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
130
- }`
131
- : message.change.new
132
126
  ?
133
- `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
- :
135
- `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
- }
127
+ `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute) ?
128
+ `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
129
+ `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
130
+ }`
131
+ : message.change.new
132
+ ?
133
+ `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
+ :
135
+ `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
+ }
137
137
 
138
138
  useEffect(() => {
139
139
  let newMessages: Array<any> = []
@@ -402,7 +402,9 @@ const MessagesUI = (props: MessagesParams) => {
402
402
  <Wrapper>
403
403
  {!isMeesageListing ? (
404
404
  <Header>
405
- <OIconButton icon={theme.images.general.arrow_left} style={{ paddingStart: 10, borderColor: theme.colors.clear }} onClick={onClose} />
405
+ <TouchableOpacity onPress={onClose} style={{ paddingStart: 10, borderColor: theme.colors.clear }}>
406
+ <AntDesignIcon name='arrowleft' size={26} />
407
+ </TouchableOpacity>
406
408
  <View style={{ marginRight: 10, shadowColor: theme.colors.black, shadowOpacity: 0.1, shadowOffset: { width: 0, height: 1 }, shadowRadius: 2 }}>
407
409
  <OIcon
408
410
  url={type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo}
@@ -419,10 +421,8 @@ const MessagesUI = (props: MessagesParams) => {
419
421
  ) : (
420
422
  <ProfileMessageHeader>
421
423
  <View style={{ ...styles.headerTitle }}>
422
- <TouchableOpacity
423
- style={styles.headerItem}
424
- onPress={onClose}>
425
- <OIcon src={theme.images.general.arrow_left} width={16} />
424
+ <TouchableOpacity onPress={onClose} style={styles.headerItem}>
425
+ <AntDesignIcon name='arrowleft' size={26} />
426
426
  </TouchableOpacity>
427
427
  <OText size={18}>{t('ORDER', theme?.defaultLanguages?.ORDER || 'Order')} #{order?.id}</OText>
428
428
  </View>