ordering-ui-react-native 0.15.46 → 0.15.47-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 (191) hide show
  1. package/package.json +6 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessController/index.tsx +16 -8
  5. package/src/components/BusinessTypeFilter/index.tsx +3 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Checkout/index.tsx +23 -2
  8. package/src/components/DriverTips/index.tsx +11 -6
  9. package/src/components/LanguageSelector/index.tsx +7 -2
  10. package/src/components/LoginForm/index.tsx +120 -30
  11. package/src/components/LoginForm/styles.tsx +6 -0
  12. package/src/components/OrderDetails/index.tsx +9 -23
  13. package/src/components/PaymentOptions/index.tsx +1 -1
  14. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  15. package/src/components/SignupForm/index.tsx +145 -61
  16. package/src/components/SingleProductCard/index.tsx +16 -4
  17. package/src/components/StripeMethodForm/index.tsx +1 -2
  18. package/src/components/UpsellingProducts/index.tsx +1 -1
  19. package/src/components/UserProfileForm/index.tsx +63 -6
  20. package/src/components/UserProfileForm/styles.tsx +8 -0
  21. package/src/components/VerifyPhone/styles.tsx +1 -2
  22. package/src/components/shared/OModal.tsx +1 -1
  23. package/src/hooks/useCountdownTimer.tsx +26 -0
  24. package/src/navigators/CheckoutNavigator.tsx +6 -0
  25. package/src/navigators/HomeNavigator.tsx +12 -0
  26. package/src/pages/BusinessesListing.tsx +1 -1
  27. package/src/pages/MultiCheckout.tsx +31 -0
  28. package/src/pages/MultiOrdersDetails.tsx +27 -0
  29. package/src/pages/Sessions.tsx +22 -0
  30. package/src/theme.json +0 -1
  31. package/src/types/index.tsx +18 -11
  32. package/src/utils/index.tsx +68 -1
  33. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  34. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  35. package/themes/business/src/components/Chat/index.tsx +42 -90
  36. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  37. package/themes/business/src/components/Home/index.tsx +128 -55
  38. package/themes/business/src/components/Home/styles.tsx +8 -1
  39. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  40. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  41. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  42. package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
  43. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  44. package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -18
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +159 -91
  46. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  47. package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
  48. package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
  49. package/themes/business/src/components/OrdersOption/index.tsx +5 -2
  50. package/themes/business/src/components/PreviousOrders/index.tsx +7 -5
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  52. package/themes/business/src/components/shared/OModal.tsx +1 -1
  53. package/themes/business/src/types/index.tsx +5 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  58. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  59. package/themes/kiosk/src/components/Cart/index.tsx +99 -26
  60. package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
  61. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  62. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  63. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  64. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  65. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  66. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  67. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  68. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  69. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  70. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  71. package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
  72. package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
  73. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  74. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  75. package/themes/kiosk/src/components/ProductForm/index.tsx +8 -9
  76. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  77. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  78. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  79. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  80. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  81. package/themes/kiosk/src/types/index.d.ts +3 -0
  82. package/themes/original/index.tsx +169 -4
  83. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  84. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  85. package/themes/original/src/components/AddressForm/index.tsx +1 -1
  86. package/themes/original/src/components/AddressList/index.tsx +30 -18
  87. package/themes/original/src/components/AppleLogin/index.tsx +117 -78
  88. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  89. package/themes/original/src/components/BusinessController/index.tsx +48 -11
  90. package/themes/original/src/components/BusinessController/styles.tsx +27 -0
  91. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  92. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  93. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  94. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  95. package/themes/original/src/components/BusinessListingSearch/index.tsx +196 -58
  96. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  97. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  98. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  99. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  100. package/themes/original/src/components/BusinessProductsList/index.tsx +119 -35
  101. package/themes/original/src/components/BusinessProductsList/styles.tsx +12 -4
  102. package/themes/original/src/components/BusinessProductsListing/index.tsx +109 -21
  103. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  104. package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
  105. package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
  106. package/themes/original/src/components/BusinessesListing/index.tsx +127 -66
  107. package/themes/original/src/components/BusinessesListing/styles.tsx +11 -3
  108. package/themes/original/src/components/Cart/index.tsx +60 -41
  109. package/themes/original/src/components/Checkout/index.tsx +48 -32
  110. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  111. package/themes/original/src/components/Favorite/index.tsx +91 -0
  112. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  113. package/themes/original/src/components/FavoriteList/index.tsx +287 -0
  114. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  115. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  116. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  117. package/themes/original/src/components/GoogleMap/index.tsx +1 -0
  118. package/themes/original/src/components/Help/index.tsx +21 -4
  119. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  120. package/themes/original/src/components/Home/index.tsx +1 -1
  121. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
  123. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  124. package/themes/original/src/components/LoginForm/index.tsx +394 -155
  125. package/themes/original/src/components/LoginForm/styles.tsx +7 -4
  126. package/themes/original/src/components/LogoutButton/index.tsx +7 -1
  127. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  128. package/themes/original/src/components/Messages/index.tsx +1 -1
  129. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  130. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  132. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  133. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  134. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  135. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  136. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  137. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  138. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  139. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  140. package/themes/original/src/components/OrderDetails/index.tsx +64 -42
  141. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  142. package/themes/original/src/components/OrderProgress/index.tsx +1 -1
  143. package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
  144. package/themes/original/src/components/OrderSummary/index.tsx +3 -3
  145. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  146. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  147. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  148. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  149. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  150. package/themes/original/src/components/OrdersOption/index.tsx +133 -41
  151. package/themes/original/src/components/OrdersOption/styles.tsx +4 -7
  152. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  153. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  154. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  155. package/themes/original/src/components/PaymentOptions/index.tsx +16 -14
  156. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  157. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  158. package/themes/original/src/components/ProductForm/index.tsx +74 -66
  159. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  160. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  161. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  162. package/themes/original/src/components/Promotions/index.tsx +250 -0
  163. package/themes/original/src/components/Promotions/styles.tsx +60 -0
  164. package/themes/original/src/components/SearchBar/index.tsx +10 -4
  165. package/themes/original/src/components/Sessions/index.tsx +160 -0
  166. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  167. package/themes/original/src/components/SignupForm/index.tsx +79 -6
  168. package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
  169. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  170. package/themes/original/src/components/SingleProductCard/index.tsx +59 -17
  171. package/themes/original/src/components/StripeElementsForm/index.tsx +16 -8
  172. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  173. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  174. package/themes/original/src/components/UserDetails/index.tsx +5 -96
  175. package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
  176. package/themes/original/src/components/UserProfile/index.tsx +59 -5
  177. package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
  178. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  179. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  180. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  181. package/themes/original/src/components/Wallets/index.tsx +76 -9
  182. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  183. package/themes/original/src/components/shared/HeaderTitle.tsx +2 -1
  184. package/themes/original/src/components/shared/OModal.tsx +4 -2
  185. package/themes/original/src/config/constants.tsx +6 -6
  186. package/themes/original/src/types/index.tsx +132 -9
  187. package/themes/original/src/utils/index.tsx +19 -2
  188. package/themes/single-business/src/components/AddressList/index.tsx +1 -1
  189. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  190. package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
  191. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -3,57 +3,3 @@ import styled from 'styled-components/native'
3
3
  export const ActiveOrdersContainer = styled.View`
4
4
  margin-bottom: 20px;
5
5
  `
6
-
7
- export const Card = styled.TouchableOpacity`
8
- `
9
-
10
- export const Map = styled.View`
11
- flex: 1;
12
- height: 125px;
13
- margin-bottom: 10px;
14
- `
15
-
16
- export const Information = styled.View`
17
- flex-direction: row;
18
- height: 100px;
19
- align-items: center;
20
- padding-vertical: 5px;
21
- `
22
-
23
- export const Logo = styled.View`
24
- border-radius: 7.6px;
25
- box-shadow: 0 1px 2px #0000001A;
26
- `
27
-
28
- export const OrderInformation = styled.View`
29
- flex-direction: row;
30
- justify-content: space-between;
31
- flex: 1;
32
- padding-left: 14px;
33
- `
34
-
35
- export const BusinessInformation = styled.View`
36
- flex-basis: 65%;
37
- `
38
-
39
- export const Price = styled.View`
40
- justify-content: space-between;
41
- align-items: flex-end;
42
- margin-left: 10px;
43
- width: 30%;
44
- `
45
-
46
- export const UnreadMessageCounter = styled.View`
47
- justify-content: center;
48
- align-items: center;
49
- margin-left: 10px;
50
- width: 24px;
51
- height: 24px;
52
- border-radius: 7.6px;
53
- background-color: ${(props: any) => props.theme.colors.primaryContrast};
54
- `
55
- export const LoadMore = styled.View`
56
- flex-direction: row;
57
- justify-content: center;
58
- margin-top: 10px;
59
- `
@@ -510,7 +510,7 @@ const AddressFormUI = (props: AddressFormParams) => {
510
510
  onActionLeft={goToBack}
511
511
  showCall={false}
512
512
  btnStyle={{ paddingLeft: 0 }}
513
- style={{ flexDirection: 'column', alignItems: 'flex-start' }}
513
+ style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
514
514
  titleWrapStyle={{ paddingHorizontal: 0 }}
515
515
  titleStyle={{ marginRight: 0, marginLeft: 0 }}
516
516
  />
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect } from 'react'
2
2
  import { AddressList as AddressListController, useLanguage, useOrder, useSession } from 'ordering-components/native'
3
3
  import { AddressListContainer, AddressItem } from './styles'
4
- import { Platform, StyleSheet, View } from 'react-native'
4
+ import { Platform, RefreshControl, StyleSheet, View } from 'react-native'
5
5
  import { OButton, OText, OAlert, OModal, OIcon } from '../shared'
6
6
  import { Container } from '../../layouts/Container'
7
7
  import { AddressListParams } from '../../types'
@@ -27,7 +27,8 @@ const AddressListUI = (props: AddressListParams) => {
27
27
  actionStatus,
28
28
  isFromBusinesses,
29
29
  isFromProductsList,
30
- afterSignup
30
+ afterSignup,
31
+ loadAddresses
31
32
  } = props
32
33
 
33
34
  const theme = useTheme();
@@ -35,6 +36,7 @@ const AddressListUI = (props: AddressListParams) => {
35
36
  const [orderState] = useOrder()
36
37
  const [, t] = useLanguage()
37
38
  const [{ auth }] = useSession()
39
+ const [refreshing] = useState(false);
38
40
 
39
41
  const [isProfile, setIsProfile] = useState(isFromProfile || route?.params?.isFromProfile);
40
42
 
@@ -121,6 +123,12 @@ const AddressListUI = (props: AddressListParams) => {
121
123
  })
122
124
  }
123
125
 
126
+ const handleOnRefresh = () => {
127
+ if (!addressList.loading) {
128
+ loadAddresses();
129
+ }
130
+ }
131
+
124
132
  const goToBack = () => navigation?.canGoBack() && navigation.goBack()
125
133
  const onNavigationRedirect = (route: string, params?: any) => navigation.navigate(route, params)
126
134
 
@@ -135,22 +143,26 @@ const AddressListUI = (props: AddressListParams) => {
135
143
  }, [])
136
144
 
137
145
  return (
138
- <Container noPadding>
146
+ <Container
147
+ noPadding
148
+ refreshControl={
149
+ <RefreshControl
150
+ refreshing={refreshing}
151
+ onRefresh={() => handleOnRefresh()}
152
+ />
153
+ }
154
+ >
155
+ {isProfile && (
156
+ <NavBar
157
+ title={t('SAVED_PLACES', 'My saved places')}
158
+ titleAlign={'center'}
159
+ onActionLeft={goToBack}
160
+ showCall={false}
161
+ style={{ paddingHorizontal: 40, paddingVertical: Platform.OS === 'ios' ? 0 : 20, marginTop: Platform.OS === 'ios' ? 0 : 30 }}
162
+ />
163
+ )}
139
164
  {(!addressList.loading || (isFromProductsList || isFromBusinesses || isFromProfile || isProfile)) && (
140
165
  <AddressListContainer>
141
- {isProfile && (
142
- <NavBar
143
- title={t('MY_SAVED_PLACES', 'My saved places')}
144
- titleAlign={'center'}
145
- onActionLeft={() => goToBack()}
146
- showCall={false}
147
- btnStyle={{ paddingLeft: 0 }}
148
- paddingTop={0}
149
- isVertical
150
- titleWrapStyle={{ paddingHorizontal: 0 }}
151
- titleStyle={{ marginLeft: 0, marginRight: 0 }}
152
- />
153
- )}
154
166
  {
155
167
  route &&
156
168
  (
@@ -167,12 +179,12 @@ const AddressListUI = (props: AddressListParams) => {
167
179
  showCall={false}
168
180
  btnStyle={{ paddingLeft: 0 }}
169
181
  paddingTop={0}
170
- style={{ flexDirection: 'column', alignItems: 'flex-start' }}
182
+ style={{ marginTop: Platform.OS === 'ios' ? 0 : 40 }}
171
183
  titleWrapStyle={{ paddingHorizontal: 0 }}
172
184
  titleStyle={{ marginLeft: 0, marginRight: 0 }}
173
185
  />
174
186
  )}
175
- {addressList.loading && (
187
+ {addressList.loading && addressList?.addresses?.length === 0 && (
176
188
  <>
177
189
  {[...Array(5)].map((item, i) => (
178
190
  <Placeholder key={i} style={{ paddingVertical: 20 }} Animation={Fade}>
@@ -1,6 +1,6 @@
1
- import React, { useEffect } from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { Platform, Text, StyleSheet } from 'react-native';
3
- import { useApi, useSession, useLanguage } from 'ordering-components/native';
3
+ import { useApi, useSession, useLanguage, useConfig } from 'ordering-components/native';
4
4
  import { appleAuthAndroid, appleAuth } from '@invertase/react-native-apple-authentication';
5
5
  import uuid from 'react-native-uuid';
6
6
  import Icon from 'react-native-vector-icons/FontAwesome5';
@@ -16,12 +16,16 @@ export const AppleLogin = (props: any) => {
16
16
  } = props
17
17
 
18
18
  const [ordering] = useApi();
19
- const [{ auth }] = useSession();
20
- const [, t] = useLanguage();
19
+ const [{ auth }] = useSession();
20
+ const [, t] = useLanguage();
21
+ const [{ configs }] = useConfig();
22
+ const [credentialStateForUser, updateCredentialStateForUser] = useState<any>(-1);
21
23
 
22
- const buttonText = auth
23
- ? t('CONTINUE_WITH_APPLE', 'Logout with Apple')
24
- : t('CONTINUE_WITH_FACEBOOK', 'Continue with Apple');
24
+ let user: any = null
25
+
26
+ const buttonText = auth
27
+ ? t('CONTINUE_WITH_APPLE', 'Logout with Apple')
28
+ : t('CONTINUE_WITH_APPLE', 'Continue with Apple');
25
29
 
26
30
  const performAppleLogin = async (code: string) => {
27
31
  try {
@@ -29,17 +33,19 @@ export const AppleLogin = (props: any) => {
29
33
  method: 'POST',
30
34
  headers: { 'Content-Type': 'application/json' },
31
35
  body: JSON.stringify({
32
- code: code
36
+ code: code,
37
+ platform: Platform.OS === 'ios' ? 'ios' : 'other'
33
38
  })
34
39
  })
35
- if (!response.content.error) {
40
+ const { result, error } = await response.json()
41
+ if (!error) {
36
42
  if (handleSuccessAppleLogin) {
37
- handleSuccessAppleLogin(response.content.result)
43
+ handleSuccessAppleLogin(result)
38
44
  handleLoading && handleLoading(false)
39
45
  }
40
46
  } else {
47
+ handleErrors && handleErrors(result)
41
48
  handleLoading && handleLoading(false)
42
- logoutFromApple()
43
49
  }
44
50
  } catch (err: any) {
45
51
  handleLoading && handleLoading(false)
@@ -47,66 +53,98 @@ export const AppleLogin = (props: any) => {
47
53
  }
48
54
  }
49
55
 
50
- const logoutFromApple = () => {
51
-
56
+ const fetchAndUpdateCredentialState = async (updateCredentialStateForUser: any) => {
57
+ if (user === null) {
58
+ updateCredentialStateForUser('N/A');
59
+ } else {
60
+ const credentialState = await appleAuth.getCredentialStateForUser(user);
61
+ if (credentialState === appleAuth.State.AUTHORIZED) {
62
+ updateCredentialStateForUser('AUTHORIZED');
63
+ } else {
64
+ updateCredentialStateForUser(credentialState);
65
+ }
66
+ }
52
67
  }
53
68
 
54
- const onIOSButtonPress = async () => {
55
-
56
- const appleAuthRequestResponse = await appleAuth.performRequest({
57
- requestedOperation: appleAuth.Operation.LOGIN,
58
- requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
59
- });
60
-
61
- // get current authentication state for user
62
- // /!\ This method must be tested on a real device. On the iOS simulator it always throws an error.
63
- const credentialState = await appleAuth.getCredentialStateForUser(appleAuthRequestResponse.user);
64
-
65
- // use credentialState response to ensure the user is authenticated
66
- if (credentialState === appleAuth.State.AUTHORIZED) {
67
- // user is authenticated
68
- if (appleAuthRequestResponse.authorizationCode) {
69
- performAppleLogin(appleAuthRequestResponse.authorizationCode)
69
+ const onIOSButtonPress = async (updateCredentialStateForUser: any) => {
70
+ try {
71
+ const appleAuthRequestResponse = await appleAuth.performRequest({
72
+ requestedOperation: appleAuth.Operation.LOGIN,
73
+ requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
74
+ });
75
+
76
+ const {
77
+ user: newUser,
78
+ email,
79
+ identityToken,
80
+ authorizationCode
81
+ } = appleAuthRequestResponse;
82
+
83
+ user = newUser;
84
+
85
+ fetchAndUpdateCredentialState(updateCredentialStateForUser).catch(error =>
86
+ updateCredentialStateForUser(`Error: ${error.code}`),
87
+ );
88
+
89
+ if (identityToken && authorizationCode) {
90
+ performAppleLogin(authorizationCode)
91
+ } else {
92
+ handleErrors && handleErrors('UNABLE_LOGIN_TOKEN', 'Unable to login, no token found')
70
93
  }
71
- }
72
94
 
95
+ } catch (err: any) {
96
+ handleLoading && handleLoading(false)
97
+ handleErrors && handleErrors(err.message)
98
+ }
73
99
  }
74
100
 
75
101
  const onAndroidButtonPress = async () => {
76
- // Generate secure, random values for state and nonce
77
- const rawNonce: any = uuid.v4();
78
- const state: any = uuid.v4();
79
-
80
- // Configure the request
81
- appleAuthAndroid.configure({
82
- clientId: 'com.example.client-android',
83
- // Return URL added to your Apple dev console. We intercept this redirect, but it must still match
84
- // the URL you provided to Apple. It can be an empty route on your backend as it's never called.
85
- redirectUri: 'https://example.com/auth/callback',
86
- responseType: appleAuthAndroid.ResponseType.ALL,
87
- scope: appleAuthAndroid.Scope.ALL,
88
- // Random nonce value that will be SHA256 hashed before sending to Apple.
89
- nonce: rawNonce,
90
- state,
91
- });
92
-
93
- // Open the browser window for user sign in
94
- const response = await appleAuthAndroid.signIn();
95
-
96
102
  try {
103
+ // Generate secure, random values for state and nonce
104
+ const rawNonce: any = uuid.v4();
105
+ const state: any = uuid.v4();
106
+
107
+ // Configure the request
108
+ appleAuthAndroid.configure({
109
+ // The Service ID you registered with Apple
110
+ clientId: configs?.apple_login_client_id?.value,
111
+ // Return URL added to your Apple dev console. We intercept this redirect, but it must still match
112
+ // the URL you provided to Apple. It can be an empty route on your backend as it's never called.
113
+ redirectUri: 'https://example.com/auth/callback',
114
+ responseType: appleAuthAndroid.ResponseType.ALL,
115
+ scope: appleAuthAndroid.Scope.ALL,
116
+ // Random nonce value that will be SHA256 hashed before sending to Apple.
117
+ nonce: rawNonce,
118
+ state,
119
+ });
120
+
121
+ // Open the browser window for user sign in
122
+ const response = await appleAuthAndroid.signIn();
97
123
  if (response.code) {
98
124
  performAppleLogin(response.code)
99
125
  }
100
126
  } catch (err: any) {
101
-
127
+ handleLoading && handleLoading(false)
128
+ handleErrors && handleErrors(err.message)
102
129
  }
130
+
103
131
  }
104
132
 
105
133
  useEffect(() => {
106
- if (Platform.OS == 'android') return;
107
- // onCredentialRevoked returns a function that will remove the event listener. useEffect will call this function when the component unmounts
134
+ if (!appleAuth.isSupported || Platform.OS === 'android') return;
135
+
136
+ fetchAndUpdateCredentialState(updateCredentialStateForUser).catch(error =>
137
+ updateCredentialStateForUser(`Error: ${error.code}`),
138
+ );
139
+ }, []);
140
+
141
+ useEffect(() => {
142
+ if (!appleAuth.isSupported || Platform.OS === 'android') return;
143
+
108
144
  return appleAuth.onCredentialRevoked(async () => {
109
- console.warn('If this function executes, User Credentials have been Revoked');
145
+ fetchAndUpdateCredentialState(updateCredentialStateForUser).catch(error =>
146
+ updateCredentialStateForUser(`Error: ${error.code}`),
147
+ );
110
148
  });
111
149
  }, []);
112
150
 
@@ -115,35 +153,36 @@ export const AppleLogin = (props: any) => {
115
153
  if (Platform.OS === 'android') return appleAuthAndroid.isSupported;
116
154
  return false;
117
155
  }
156
+
118
157
  return (
119
158
  <Container>
120
- {canShowButton() &&
121
- <AppleButton
122
- onPress={() => Platform.OS == 'android' ? onAndroidButtonPress() : onIOSButtonPress()}
123
- >
124
- <Icon
125
- name="apple"
126
- size={20}
127
- color={'black'}
128
- style={style.fbBtn}
129
- />
130
- <Text style={style.textBtn}>
131
- {buttonText}
132
- </Text>
133
- </AppleButton>
159
+ {canShowButton() &&
160
+ <AppleButton
161
+ onPress={() => Platform.OS == 'android' ? onAndroidButtonPress() : onIOSButtonPress(updateCredentialStateForUser)}
162
+ >
163
+ <Icon
164
+ name="apple"
165
+ size={20}
166
+ color={'black'}
167
+ style={style.fbBtn}
168
+ />
169
+ <Text style={style.textBtn}>
170
+ {buttonText}
171
+ </Text>
172
+ </AppleButton>
134
173
  }
135
174
  </Container>
136
175
  );
137
176
  }
138
177
 
139
178
  const style = StyleSheet.create({
140
- fbBtn: {
141
- position: 'absolute',
142
- left: 0,
143
- marginHorizontal: 16
144
- },
145
- textBtn: {
146
- fontSize: 14,
147
- color: '#000000'
148
- }
149
- })
179
+ fbBtn: {
180
+ position: 'absolute',
181
+ left: 0,
182
+ marginHorizontal: 16
183
+ },
184
+ textBtn: {
185
+ fontSize: 14,
186
+ color: '#000000'
187
+ }
188
+ })
@@ -4,7 +4,7 @@ import { useUtils, useOrder, useLanguage } from 'ordering-components/native';
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import { OIcon, OText, OModal } from '../shared';
6
6
  import { BusinessBasicInformationParams } from '../../types';
7
- import { convertHoursToMinutes } from '../../utils';
7
+ import { convertHoursToMinutes, shape } from '../../utils';
8
8
  import dayjs from 'dayjs';
9
9
  import timezone from 'dayjs/plugin/timezone';
10
10
  import isBetween from 'dayjs/plugin/isBetween';
@@ -7,9 +7,9 @@ import {
7
7
  useConfig
8
8
  } from 'ordering-components/native';
9
9
  import { OIcon, OText } from '../shared';
10
- import { StyleSheet, View } from 'react-native';
10
+ import { StyleSheet, TouchableOpacity, View } from 'react-native';
11
11
  import { BusinessControllerParams } from '../../types';
12
- import { convertHoursToMinutes } from '../../utils';
12
+ import { convertHoursToMinutes, shape } from '../../utils';
13
13
  import {
14
14
  Card,
15
15
  BusinessHero,
@@ -20,9 +20,12 @@ import {
20
20
  BusinessState,
21
21
  BusinessLogo,
22
22
  Reviews,
23
+ RibbonBox,
24
+ ReviewAndFavorite
23
25
  } from './styles';
24
26
  import { useTheme } from 'styled-components/native';
25
27
  import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome5';
28
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
26
29
  import FastImage from 'react-native-fast-image'
27
30
 
28
31
  export const BusinessControllerUI = (props: BusinessControllerParams) => {
@@ -39,7 +42,8 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
39
42
  businessDeliveryPrice,
40
43
  businessDeliveryTime,
41
44
  businessPickupTime,
42
- businessDistance
45
+ businessDistance,
46
+ handleFavoriteBusiness
43
47
  } = props;
44
48
  const [{ parsePrice, parseDistance, parseNumber, optimizeImage }] = useUtils();
45
49
  const [orderState] = useOrder();
@@ -119,8 +123,30 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
119
123
  }
120
124
  }
121
125
 
126
+ const handleChangeFavorite = () => {
127
+ handleFavoriteBusiness && handleFavoriteBusiness(!business?.favorite)
128
+ }
129
+
122
130
  return (
123
131
  <Card activeOpacity={1} onPress={() => handleBusinessClick(business)} style={style}>
132
+ {business?.ribbon?.enabled && (
133
+ <RibbonBox
134
+ bgColor={business?.ribbon?.color}
135
+ isRoundRect={business?.ribbon?.shape === shape?.rectangleRound}
136
+ isCapsule={business?.ribbon?.shape === shape?.capsuleShape}
137
+ >
138
+ <OText
139
+ size={10}
140
+ weight={'400'}
141
+ color={theme.colors.white}
142
+ numberOfLines={2}
143
+ ellipsizeMode='tail'
144
+ lineHeight={13}
145
+ >
146
+ {business?.ribbon?.text}
147
+ </OText>
148
+ </RibbonBox>
149
+ )}
124
150
  <BusinessHero>
125
151
  <FastImage
126
152
  style={{ height: 120 }}
@@ -160,14 +186,25 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
160
186
  resizeMode={FastImage.resizeMode.cover}
161
187
  />
162
188
  </BusinessLogo>
163
- {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
164
- <Reviews>
165
- <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
166
- <OText size={10} style={{ lineHeight: 15 }}>
167
- {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
168
- </OText>
169
- </Reviews>
170
- )}
189
+ <ReviewAndFavorite>
190
+ {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
191
+ <Reviews>
192
+ <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
193
+ <OText size={10} style={{ lineHeight: 15 }}>
194
+ {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
195
+ </OText>
196
+ </Reviews>
197
+ )}
198
+ <TouchableOpacity
199
+ onPress={handleChangeFavorite}
200
+ >
201
+ <IconAntDesign
202
+ name={business?.favorite ? 'heart' : 'hearto'}
203
+ color={theme.colors.danger5}
204
+ size={18}
205
+ />
206
+ </TouchableOpacity>
207
+ </ReviewAndFavorite>
171
208
  </BusinessInfo>
172
209
  <OText
173
210
  size={12}
@@ -49,7 +49,34 @@ export const BusinessLogo = styled.View`
49
49
 
50
50
  `
51
51
 
52
+ export const ReviewAndFavorite = styled.View`
53
+ flex-direction: row;
54
+ align-items: center;
55
+ `
56
+
52
57
  export const Reviews = styled.View`
53
58
  flex-direction: row;
54
59
  align-items: center;
55
60
  `
61
+
62
+ export const RibbonBox = styled.View`
63
+ position: absolute;
64
+ z-index: 1;
65
+ top: -4px;
66
+ right: -4px;
67
+ background-color: ${(props: any) => props.theme.colors.primary};
68
+ padding: 1px 8px;
69
+ max-width: 180px;
70
+
71
+ ${(props: any) => props.bgColor && css`
72
+ background-color: ${props.bgColor};
73
+ `}
74
+
75
+ ${(props: any) => props.isRoundRect && css`
76
+ border-radius: 7.6px;
77
+ `}
78
+
79
+ ${(props: any) => props.isCapsule && css`
80
+ border-radius: 50px;
81
+ `}
82
+ `
@@ -9,7 +9,7 @@ import { useTheme } from 'styled-components/native';
9
9
  import { OIcon, OText } from '../shared';
10
10
  import { StyleSheet, useWindowDimensions, View } from 'react-native';
11
11
  import { BusinessControllerParams } from '../../types';
12
- import { convertHoursToMinutes } from '../../utils';
12
+ import { convertHoursToMinutes, shape } from '../../utils';
13
13
  import {
14
14
  Card,
15
15
  BusinessHero,
@@ -20,6 +20,7 @@ import {
20
20
  BusinessState,
21
21
  BusinessLogo,
22
22
  Reviews,
23
+ RibbonBox
23
24
  } from './styles';
24
25
 
25
26
  export const BusinessFeaturedCtrlUI = (props: BusinessControllerParams) => {
@@ -97,6 +98,24 @@ export const BusinessFeaturedCtrlUI = (props: BusinessControllerParams) => {
97
98
 
98
99
  return (
99
100
  <Card activeOpacity={1} onPress={() => handleClick(business)}>
101
+ {business?.ribbon?.enabled && (
102
+ <RibbonBox
103
+ bgColor={business?.ribbon?.color}
104
+ isRoundRect={business?.ribbon?.shape === shape?.rectangleRound}
105
+ isCapsule={business?.ribbon?.shape === shape?.capsuleShape}
106
+ >
107
+ <OText
108
+ size={10}
109
+ weight={'400'}
110
+ color={theme.colors.white}
111
+ numberOfLines={2}
112
+ ellipsizeMode='tail'
113
+ lineHeight={13}
114
+ >
115
+ {business?.ribbon?.text}
116
+ </OText>
117
+ </RibbonBox>
118
+ )}
100
119
  <BusinessHero>
101
120
  <BusinessLogo>
102
121
  <OIcon
@@ -4,6 +4,7 @@ export const Card = styled.TouchableOpacity`
4
4
  margin-vertical: 4px;
5
5
  height: 60px;
6
6
  overflow: hidden;
7
+ position: relative;
7
8
  `;
8
9
 
9
10
  export const BusinessHero = styled.View`
@@ -48,3 +49,25 @@ export const BusinessLogo = styled.View`
48
49
  export const Reviews = styled.View`
49
50
  flex-direction: row;
50
51
  `
52
+
53
+ export const RibbonBox = styled.View`
54
+ position: absolute;
55
+ z-index: 1;
56
+ top: 0px;
57
+ right: 5px;
58
+ background-color: ${(props: any) => props.theme.colors.primary};
59
+ padding: 1px 8px;
60
+ max-width: 160px;
61
+
62
+ ${(props: any) => props.bgColor && css`
63
+ background-color: ${props.bgColor};
64
+ `}
65
+
66
+ ${(props: any) => props.isRoundRect && css`
67
+ border-radius: 7.6px;
68
+ `}
69
+
70
+ ${(props: any) => props.isCapsule && css`
71
+ border-radius: 50px;
72
+ `}
73
+ `