ordering-ui-react-native 0.15.43 → 0.15.44-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.
- package/package.json +6 -3
- package/src/DeliveryApp.tsx +43 -1
- package/src/components/AddressForm/index.tsx +18 -2
- package/src/components/BusinessController/index.tsx +8 -2
- package/src/components/BusinessTypeFilter/index.tsx +3 -1
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +23 -2
- package/src/components/DriverTips/index.tsx +11 -6
- package/src/components/LanguageSelector/index.tsx +7 -2
- package/src/components/LoginForm/index.tsx +3 -1
- package/src/components/OrderDetails/index.tsx +9 -23
- package/src/components/PaymentOptions/index.tsx +1 -1
- package/src/components/PaymentOptionsWebView/index.tsx +123 -124
- package/src/components/SignupForm/index.tsx +3 -1
- package/src/components/SingleProductCard/index.tsx +16 -4
- package/src/components/StripeMethodForm/index.tsx +1 -2
- package/src/components/UpsellingProducts/index.tsx +1 -1
- package/src/components/UserProfileForm/index.tsx +63 -6
- package/src/components/UserProfileForm/styles.tsx +8 -0
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/components/shared/OModal.tsx +1 -1
- package/src/hooks/useCountdownTimer.tsx +26 -0
- package/src/navigators/CheckoutNavigator.tsx +6 -0
- package/src/navigators/HomeNavigator.tsx +12 -0
- package/src/pages/BusinessesListing.tsx +1 -1
- package/src/pages/MultiCheckout.tsx +31 -0
- package/src/pages/MultiOrdersDetails.tsx +27 -0
- package/src/pages/Sessions.tsx +22 -0
- package/src/theme.json +0 -1
- package/src/types/index.tsx +5 -2
- package/src/utils/index.tsx +68 -1
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
- package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
- package/themes/business/src/components/Chat/index.tsx +42 -90
- package/themes/business/src/components/DriverMap/index.tsx +6 -5
- package/themes/business/src/components/Home/index.tsx +128 -55
- package/themes/business/src/components/Home/styles.tsx +8 -1
- package/themes/business/src/components/LoginForm/index.tsx +89 -2
- package/themes/business/src/components/LoginForm/styles.tsx +6 -0
- package/themes/business/src/components/LogoutButton/index.tsx +1 -1
- package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
- package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
- package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -18
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +159 -91
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
- package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
- package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
- package/themes/business/src/components/OrdersOption/index.tsx +5 -2
- package/themes/business/src/components/PreviousOrders/index.tsx +10 -9
- package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
- package/themes/business/src/components/shared/OModal.tsx +1 -1
- package/themes/business/src/types/index.tsx +5 -1
- package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
- package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
- package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
- package/themes/kiosk/src/components/Cart/index.tsx +99 -26
- package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
- package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
- package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
- package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
- package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
- package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
- package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
- package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
- package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
- package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
- package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
- package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
- package/themes/kiosk/src/components/ProductForm/index.tsx +8 -9
- package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
- package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
- package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
- package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/kiosk/src/types/index.d.ts +3 -0
- package/themes/original/index.tsx +180 -3
- package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
- package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
- package/themes/original/src/components/AddressForm/index.tsx +1 -1
- package/themes/original/src/components/AddressList/index.tsx +30 -18
- package/themes/original/src/components/AppleLogin/index.tsx +117 -78
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +70 -41
- package/themes/original/src/components/BusinessController/index.tsx +50 -12
- package/themes/original/src/components/BusinessController/styles.tsx +27 -0
- package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
- package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
- package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
- package/themes/original/src/components/BusinessListingSearch/index.tsx +196 -58
- package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
- package/themes/original/src/components/BusinessPreorder/index.tsx +2 -2
- package/themes/original/src/components/BusinessProductsCategories/index.tsx +8 -6
- package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
- package/themes/original/src/components/BusinessProductsList/index.tsx +120 -36
- package/themes/original/src/components/BusinessProductsList/styles.tsx +12 -4
- package/themes/original/src/components/BusinessProductsListing/index.tsx +116 -26
- package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
- package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
- package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
- package/themes/original/src/components/BusinessesListing/index.tsx +127 -66
- package/themes/original/src/components/BusinessesListing/styles.tsx +11 -3
- package/themes/original/src/components/Cart/index.tsx +60 -43
- package/themes/original/src/components/Checkout/index.tsx +50 -33
- package/themes/original/src/components/DriverTips/index.tsx +17 -12
- package/themes/original/src/components/Favorite/index.tsx +91 -0
- package/themes/original/src/components/Favorite/styles.tsx +22 -0
- package/themes/original/src/components/FavoriteList/index.tsx +287 -0
- package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
- package/themes/original/src/components/GPSButton/index.tsx +15 -8
- package/themes/original/src/components/GoogleMap/index.tsx +1 -0
- package/themes/original/src/components/Help/index.tsx +21 -4
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
- package/themes/original/src/components/Home/index.tsx +1 -1
- package/themes/original/src/components/LastOrders/index.tsx +12 -1
- package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
- package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
- package/themes/original/src/components/LoginForm/index.tsx +394 -155
- package/themes/original/src/components/LoginForm/styles.tsx +7 -4
- package/themes/original/src/components/LogoutButton/index.tsx +7 -1
- package/themes/original/src/components/MessageListing/index.tsx +10 -1
- package/themes/original/src/components/Messages/index.tsx +1 -1
- package/themes/original/src/components/MomentOption/index.tsx +10 -1
- package/themes/original/src/components/MomentOption/styles.tsx +1 -1
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
- package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
- package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
- package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
- package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
- package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
- package/themes/original/src/components/MyOrders/index.tsx +120 -32
- package/themes/original/src/components/MyOrders/styles.tsx +8 -1
- package/themes/original/src/components/OrderDetails/index.tsx +64 -44
- package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
- package/themes/original/src/components/OrderProgress/index.tsx +3 -3
- package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
- package/themes/original/src/components/OrderSummary/index.tsx +3 -3
- package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
- package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
- package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
- package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
- package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
- package/themes/original/src/components/OrdersOption/index.tsx +133 -41
- package/themes/original/src/components/OrdersOption/styles.tsx +4 -7
- package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +22 -24
- package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
- package/themes/original/src/components/PaymentOptions/index.tsx +19 -15
- package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
- package/themes/original/src/components/PreviousOrders/index.tsx +18 -145
- package/themes/original/src/components/ProductForm/index.tsx +74 -66
- package/themes/original/src/components/ProductForm/styles.tsx +0 -1
- package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
- package/themes/original/src/components/Promotions/index.tsx +250 -0
- package/themes/original/src/components/Promotions/styles.tsx +60 -0
- package/themes/original/src/components/SearchBar/index.tsx +10 -4
- package/themes/original/src/components/Sessions/index.tsx +160 -0
- package/themes/original/src/components/Sessions/styles.tsx +15 -0
- package/themes/original/src/components/SignupForm/index.tsx +79 -6
- package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
- package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
- package/themes/original/src/components/SingleProductCard/index.tsx +59 -17
- package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
- package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
- package/themes/original/src/components/TaxInformation/index.tsx +10 -4
- package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
- package/themes/original/src/components/UserDetails/index.tsx +5 -96
- package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
- package/themes/original/src/components/UserProfile/index.tsx +59 -5
- package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
- package/themes/original/src/components/UserVerification/index.tsx +178 -192
- package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
- package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
- package/themes/original/src/components/Wallets/index.tsx +76 -9
- package/themes/original/src/components/Wallets/styles.tsx +21 -0
- package/themes/original/src/components/shared/HeaderTitle.tsx +2 -1
- package/themes/original/src/components/shared/OModal.tsx +4 -2
- package/themes/original/src/config/constants.tsx +6 -6
- package/themes/original/src/types/index.tsx +132 -9
- package/themes/original/src/utils/index.tsx +19 -2
- package/themes/single-business/src/components/AddressList/index.tsx +1 -1
- package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
- package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
|
@@ -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
|
|
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={{
|
|
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
|
-
|
|
20
|
-
|
|
19
|
+
const [{ auth }] = useSession();
|
|
20
|
+
const [, t] = useLanguage();
|
|
21
|
+
const [{ configs }] = useConfig();
|
|
22
|
+
const [credentialStateForUser, updateCredentialStateForUser] = useState<any>(-1);
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
40
|
+
const { result, error } = await response.json()
|
|
41
|
+
if (!error) {
|
|
36
42
|
if (handleSuccessAppleLogin) {
|
|
37
|
-
handleSuccessAppleLogin(
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
})
|
|
179
|
+
fbBtn: {
|
|
180
|
+
position: 'absolute',
|
|
181
|
+
left: 0,
|
|
182
|
+
marginHorizontal: 16
|
|
183
|
+
},
|
|
184
|
+
textBtn: {
|
|
185
|
+
fontSize: 14,
|
|
186
|
+
color: '#000000'
|
|
187
|
+
}
|
|
188
|
+
})
|
|
@@ -5,8 +5,6 @@ import { useTheme } from 'styled-components/native';
|
|
|
5
5
|
import { OIcon, OText, OModal } from '../shared';
|
|
6
6
|
import { BusinessBasicInformationParams } from '../../types';
|
|
7
7
|
import { convertHoursToMinutes, shape } from '../../utils';
|
|
8
|
-
import { BusinessInformation } from '../BusinessInformation';
|
|
9
|
-
import { BusinessReviews } from '../BusinessReviews';
|
|
10
8
|
import dayjs from 'dayjs';
|
|
11
9
|
import timezone from 'dayjs/plugin/timezone';
|
|
12
10
|
import isBetween from 'dayjs/plugin/isBetween';
|
|
@@ -28,6 +26,9 @@ import {
|
|
|
28
26
|
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
29
27
|
const types = ['food', 'laundry', 'alcohol', 'groceries'];
|
|
30
28
|
|
|
29
|
+
let BusinessInformation: null | React.ElementType = null
|
|
30
|
+
let BusinessReviews: null | React.ElementType = null
|
|
31
|
+
|
|
31
32
|
export const BusinessBasicInformation = (
|
|
32
33
|
props: BusinessBasicInformationParams,
|
|
33
34
|
) => {
|
|
@@ -40,6 +41,25 @@ export const BusinessBasicInformation = (
|
|
|
40
41
|
const [{ parsePrice, parseDistance, optimizeImage }] = useUtils();
|
|
41
42
|
const [openBusinessInformation, setOpenBusinessInformation] = useState(false);
|
|
42
43
|
const [openBusinessReviews, setOpenBusinessReviews] = useState(false);
|
|
44
|
+
const [businessInformationObtained, setBusinessInformationObtained] = useState(false)
|
|
45
|
+
const [businessReviewsObtained, setBusinessReviewsObtainedbtained] = useState(false)
|
|
46
|
+
|
|
47
|
+
const handleClickBusinessInformation = () => {
|
|
48
|
+
if (!businessInformationObtained) {
|
|
49
|
+
BusinessInformation = require('../BusinessInformation').BusinessInformation
|
|
50
|
+
setBusinessInformationObtained(true)
|
|
51
|
+
}
|
|
52
|
+
setOpenBusinessInformation(true)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const handleClickBusinessReviews = () => {
|
|
56
|
+
if (!businessReviewsObtained) {
|
|
57
|
+
BusinessReviews = require('../BusinessReviews').BusinessReviews
|
|
58
|
+
setBusinessReviewsObtainedbtained(true)
|
|
59
|
+
}
|
|
60
|
+
setOpenBusinessReviews(true)
|
|
61
|
+
}
|
|
62
|
+
|
|
43
63
|
const getBusinessType = () => {
|
|
44
64
|
if (Object.keys(business).length <= 0) return t('GENERAL', 'General');
|
|
45
65
|
const _types: any = [];
|
|
@@ -53,7 +73,7 @@ export const BusinessBasicInformation = (
|
|
|
53
73
|
return _types.join(', ');
|
|
54
74
|
};
|
|
55
75
|
|
|
56
|
-
|
|
76
|
+
|
|
57
77
|
useEffect(() => {
|
|
58
78
|
if (businessState?.loading) return
|
|
59
79
|
let timeout: any = null
|
|
@@ -67,16 +87,16 @@ export const BusinessBasicInformation = (
|
|
|
67
87
|
})
|
|
68
88
|
}
|
|
69
89
|
if (lapse) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
const to = currentDate.hour(lapse.close.hour).minute(lapse.close.minute)
|
|
91
|
+
const timeToClose = (to.unix() - currentDate.unix()) * 1000
|
|
92
|
+
timeout = setTimeout(() => {
|
|
93
|
+
navigation.navigate('BusinessPreorder', { business: businessState?.business, handleBusinessClick: () => navigation?.goBack() })
|
|
94
|
+
}, timeToClose)
|
|
75
95
|
}
|
|
76
96
|
return () => {
|
|
77
|
-
|
|
97
|
+
timeout && clearTimeout(timeout)
|
|
78
98
|
}
|
|
79
|
-
|
|
99
|
+
}, [businessState?.business])
|
|
80
100
|
|
|
81
101
|
return (
|
|
82
102
|
<BusinessContainer>
|
|
@@ -92,7 +112,7 @@ export const BusinessBasicInformation = (
|
|
|
92
112
|
optimizeImage(businessState?.business?.header, 'h_250,c_limit'),
|
|
93
113
|
}}>
|
|
94
114
|
{!isBusinessInfoShow && (
|
|
95
|
-
<WrapBusinessInfo onPress={() =>
|
|
115
|
+
<WrapBusinessInfo onPress={() => handleClickBusinessInformation()}>
|
|
96
116
|
<OIcon src={theme.images.general.info} width={24} />
|
|
97
117
|
</WrapBusinessInfo>
|
|
98
118
|
)}
|
|
@@ -203,17 +223,17 @@ export const BusinessBasicInformation = (
|
|
|
203
223
|
<WrapReviews>
|
|
204
224
|
{!isBusinessInfoShow && (
|
|
205
225
|
<>
|
|
206
|
-
{
|
|
226
|
+
{isPreOrder && (
|
|
207
227
|
<>
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
228
|
+
<TouchableOpacity onPress={() => navigation.navigate('BusinessPreorder', { business: businessState?.business, handleBusinessClick: () => navigation?.goBack() })}>
|
|
229
|
+
<OText color={theme.colors.textSecondary} style={{ textDecorationLine: 'underline' }}>
|
|
230
|
+
{t('PRE_ORDER', 'Preorder')}
|
|
231
|
+
</OText>
|
|
232
|
+
</TouchableOpacity>
|
|
233
|
+
<OText size={12} color={theme.colors.textSecondary}>{' \u2022 '}</OText>
|
|
214
234
|
</>
|
|
215
235
|
)}
|
|
216
|
-
<TouchableOpacity onPress={() =>
|
|
236
|
+
<TouchableOpacity onPress={() => handleClickBusinessReviews()}>
|
|
217
237
|
<OText color={theme.colors.textSecondary} style={{ textDecorationLine: 'underline' }}>
|
|
218
238
|
{t('REVIEWS', 'Reviews')}
|
|
219
239
|
</OText>
|
|
@@ -222,28 +242,37 @@ export const BusinessBasicInformation = (
|
|
|
222
242
|
)}
|
|
223
243
|
</WrapReviews>
|
|
224
244
|
</BusinessInfo>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
{businessInformationObtained ? (
|
|
246
|
+
<OModal
|
|
247
|
+
titleSectionStyle={styles.modalTitleSectionStyle}
|
|
248
|
+
open={openBusinessInformation}
|
|
249
|
+
onClose={() => setOpenBusinessInformation(false)}
|
|
250
|
+
isNotDecoration>
|
|
251
|
+
{BusinessInformation && (
|
|
252
|
+
<BusinessInformation
|
|
253
|
+
businessState={businessState}
|
|
254
|
+
business={business}
|
|
255
|
+
/>
|
|
256
|
+
)}
|
|
257
|
+
</OModal>
|
|
258
|
+
) : null}
|
|
259
|
+
{businessReviewsObtained ? (
|
|
260
|
+
<OModal
|
|
261
|
+
entireModal
|
|
262
|
+
titleSectionStyle={styles.modalTitleSectionStyle}
|
|
263
|
+
open={openBusinessReviews}
|
|
264
|
+
onClose={() => setOpenBusinessReviews(false)}
|
|
265
|
+
isNotDecoration
|
|
266
|
+
>
|
|
267
|
+
{BusinessReviews && (
|
|
268
|
+
<BusinessReviews
|
|
269
|
+
businessState={businessState}
|
|
270
|
+
businessId={business.id}
|
|
271
|
+
reviews={business.reviews?.reviews}
|
|
272
|
+
/>
|
|
273
|
+
)}
|
|
274
|
+
</OModal>
|
|
275
|
+
) : null}
|
|
247
276
|
</BusinessContainer>
|
|
248
277
|
);
|
|
249
278
|
};
|
|
@@ -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,10 +42,12 @@ 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();
|
|
50
|
+
const [configState] = useConfig();
|
|
46
51
|
const [, t] = useLanguage();
|
|
47
52
|
const theme = useTheme()
|
|
48
53
|
const styles = StyleSheet.create({
|
|
@@ -118,8 +123,30 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
|
|
|
118
123
|
}
|
|
119
124
|
}
|
|
120
125
|
|
|
126
|
+
const handleChangeFavorite = () => {
|
|
127
|
+
handleFavoriteBusiness && handleFavoriteBusiness(!business?.favorite)
|
|
128
|
+
}
|
|
129
|
+
|
|
121
130
|
return (
|
|
122
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
|
+
)}
|
|
123
150
|
<BusinessHero>
|
|
124
151
|
<FastImage
|
|
125
152
|
style={{ height: 120 }}
|
|
@@ -135,7 +162,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
|
|
|
135
162
|
</View>
|
|
136
163
|
)}
|
|
137
164
|
<BusinessState>
|
|
138
|
-
{!isBusinessOpen && (
|
|
165
|
+
{!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1') && (
|
|
139
166
|
<View style={styles.businessStateView}>
|
|
140
167
|
<OText
|
|
141
168
|
color={theme.colors.textThird}
|
|
@@ -159,14 +186,25 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
|
|
|
159
186
|
resizeMode={FastImage.resizeMode.cover}
|
|
160
187
|
/>
|
|
161
188
|
</BusinessLogo>
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
<
|
|
165
|
-
|
|
166
|
-
{
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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>
|
|
170
208
|
</BusinessInfo>
|
|
171
209
|
<OText
|
|
172
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
|
+
`
|