ordering-ui-react-native 0.15.8 → 0.15.10-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 +5 -3
- package/src/DeliveryApp.tsx +43 -1
- package/src/components/BusinessTypeFilter/index.tsx +12 -2
- package/src/components/BusinessTypeFilter/styles.tsx +1 -1
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +0 -1
- package/src/components/LanguageSelector/index.tsx +1 -0
- package/src/components/Messages/index.tsx +38 -30
- package/src/components/MomentOption/index.tsx +3 -1
- package/src/components/OrderDetails/index.tsx +25 -4
- package/src/components/PaymentOptions/index.tsx +9 -16
- package/src/components/PaymentOptionsWebView/index.tsx +123 -124
- package/src/components/ProductForm/index.tsx +1 -1
- package/src/components/ProductForm/styles.tsx +1 -0
- package/src/components/StripeElementsForm/index.tsx +27 -48
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/config.json +0 -2
- package/src/pages/Checkout.tsx +1 -1
- package/src/types/index.tsx +1 -9
- package/src/utils/index.tsx +2 -1
- package/themes/business/index.tsx +2 -0
- package/themes/business/src/components/Chat/index.tsx +32 -31
- 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/NewOrderNotification/index.tsx +59 -98
- package/themes/business/src/components/OrderDetails/Business.tsx +1 -0
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +27 -0
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +85 -17
- package/themes/business/src/components/OrdersListManager/index.tsx +874 -0
- package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
- package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
- package/themes/business/src/components/OrdersOption/index.tsx +70 -116
- package/themes/business/src/components/OrdersOption/styles.tsx +2 -5
- package/themes/business/src/components/PreviousOrders/index.tsx +82 -23
- 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/BusinessController/index.tsx +27 -6
- package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
- package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +51 -24
- package/themes/kiosk/src/components/Cart/index.tsx +1 -1
- package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
- package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
- package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
- package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
- package/themes/kiosk/src/components/CategoriesMenu/index.tsx +7 -5
- package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
- package/themes/kiosk/src/components/Intro/index.tsx +13 -13
- package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
- package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
- package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
- package/themes/kiosk/src/components/ProductForm/index.tsx +174 -126
- package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
- package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
- package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
- package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
- package/themes/original/index.tsx +177 -0
- package/themes/original/src/components/AddressForm/index.tsx +15 -10
- package/themes/original/src/components/AddressList/index.tsx +28 -2
- package/themes/original/src/components/AppleLogin/index.tsx +119 -78
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +95 -44
- package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
- package/themes/original/src/components/BusinessController/index.tsx +32 -21
- package/themes/original/src/components/BusinessListingSearch/index.tsx +7 -3
- package/themes/original/src/components/BusinessMenuList/index.tsx +11 -4
- package/themes/original/src/components/BusinessPreorder/index.tsx +141 -121
- package/themes/original/src/components/BusinessProductsCategories/index.tsx +7 -5
- package/themes/original/src/components/BusinessProductsList/index.tsx +129 -22
- package/themes/original/src/components/BusinessProductsList/styles.tsx +32 -2
- package/themes/original/src/components/BusinessProductsListing/index.tsx +92 -37
- 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/BusinessesListing/index.tsx +40 -53
- package/themes/original/src/components/Cart/index.tsx +40 -9
- package/themes/original/src/components/CartContent/index.tsx +2 -2
- package/themes/original/src/components/Checkout/index.tsx +47 -31
- package/themes/original/src/components/Checkout/styles.tsx +7 -0
- package/themes/original/src/components/CouponControl/index.tsx +1 -0
- package/themes/original/src/components/DriverTips/index.tsx +1 -1
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +97 -89
- package/themes/original/src/components/Home/index.tsx +1 -1
- package/themes/original/src/components/LoginForm/index.tsx +156 -70
- package/themes/original/src/components/LoginForm/styles.tsx +6 -1
- package/themes/original/src/components/Messages/index.tsx +52 -45
- package/themes/original/src/components/Messages/styles.tsx +1 -3
- 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/OrderDetails/index.tsx +104 -126
- package/themes/original/src/components/OrderDetails/styles.tsx +3 -1
- package/themes/original/src/components/OrderProgress/index.tsx +4 -4
- package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
- package/themes/original/src/components/OrderSummary/index.tsx +34 -1
- package/themes/original/src/components/OrdersOption/index.tsx +15 -46
- package/themes/original/src/components/OrdersOption/styles.tsx +0 -6
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +6 -2
- package/themes/original/src/components/PaymentOptions/index.tsx +24 -25
- package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
- package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
- package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
- package/themes/original/src/components/PreviousOrders/index.tsx +19 -13
- package/themes/original/src/components/ProductForm/index.tsx +31 -20
- package/themes/original/src/components/ProductForm/styles.tsx +2 -2
- package/themes/original/src/components/ReviewOrder/index.tsx +10 -9
- package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
- package/themes/original/src/components/SignupForm/index.tsx +173 -154
- package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
- package/themes/original/src/components/TaxInformation/index.tsx +17 -7
- package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
- package/themes/original/src/components/UserDetails/index.tsx +4 -95
- package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
- package/themes/original/src/components/UserProfile/index.tsx +16 -16
- package/themes/original/src/components/UserProfileForm/index.tsx +8 -6
- 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/shared/HeaderTitle.tsx +21 -0
- package/themes/original/src/components/shared/index.tsx +2 -0
- package/themes/original/src/config/constants.tsx +6 -6
- package/themes/original/src/types/index.tsx +63 -23
- package/themes/original/src/utils/index.tsx +12 -2
- package/themes/single-business/src/components/AddressList/index.tsx +1 -1
- package/themes/single-business/src/components/OrderTypeSelector/index.tsx +5 -5
- package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/StripeMethodForm/index.tsx +0 -168
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
PaymentOptions as PaymentOptionsController,
|
|
11
11
|
useLanguage,
|
|
12
|
+
ToastType,
|
|
13
|
+
useToast,
|
|
12
14
|
} from 'ordering-components/native';
|
|
13
15
|
import { useTheme } from 'styled-components/native';
|
|
14
16
|
import { PaymentOptionCash } from '../PaymentOptionCash';
|
|
@@ -30,8 +32,6 @@ import {
|
|
|
30
32
|
import { getIconCard, flatArray } from '../../utils';
|
|
31
33
|
|
|
32
34
|
const stripeOptions: any = ['stripe_direct', 'stripe', 'stripe_connect']
|
|
33
|
-
const methodsPay = ['google_pay', 'apple_pay']
|
|
34
|
-
const stripeDirectMethods = ['stripe_direct', ...methodsPay]
|
|
35
35
|
// const stripeRedirectOptions = [
|
|
36
36
|
// { name: 'Bancontact', value: 'bancontact' },
|
|
37
37
|
// { name: 'Alipay', value: 'alipay' },
|
|
@@ -54,12 +54,11 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
54
54
|
handlePaymethodClick,
|
|
55
55
|
handlePaymethodDataChange,
|
|
56
56
|
isOpenMethod,
|
|
57
|
-
handlePaymentMethodClickCustom
|
|
58
|
-
handlePlaceOrder
|
|
57
|
+
handlePaymentMethodClickCustom
|
|
59
58
|
} = props
|
|
60
59
|
|
|
61
60
|
const theme = useTheme();
|
|
62
|
-
|
|
61
|
+
const [, { showToast }] = useToast();
|
|
63
62
|
|
|
64
63
|
const getPayIcon = (method: string) => {
|
|
65
64
|
switch (method) {
|
|
@@ -95,11 +94,18 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
95
94
|
// ]
|
|
96
95
|
|
|
97
96
|
const handlePaymentMethodClick = (paymethod: any) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
97
|
+
if (cart?.balance > 0) {
|
|
98
|
+
const isPopupMethod = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect', 'paypal'].includes(paymethod?.gateway)
|
|
99
|
+
if (webViewPaymentGateway.includes(paymethod?.gateway)) {
|
|
100
|
+
handlePaymentMethodClickCustom(paymethod)
|
|
101
|
+
}
|
|
102
|
+
handlePaymethodClick(paymethod, isPopupMethod)
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
showToast(
|
|
106
|
+
ToastType.Error,
|
|
107
|
+
t('CART_BALANCE_ZERO', 'Sorry, the amount to pay is equal to zero and it is not necessary to select a payment method'))
|
|
108
|
+
;
|
|
103
109
|
}
|
|
104
110
|
|
|
105
111
|
useEffect(() => {
|
|
@@ -116,16 +122,12 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
116
122
|
|
|
117
123
|
useEffect(() => {
|
|
118
124
|
if (props.paySelected && props.paySelected?.data) {
|
|
119
|
-
|
|
125
|
+
requestAnimationFrame(() => {
|
|
126
|
+
setPaymethodData && setPaymethodData(props.paySelected?.data)
|
|
127
|
+
})
|
|
120
128
|
}
|
|
121
129
|
}, [props.paySelected])
|
|
122
130
|
|
|
123
|
-
useEffect(() => {
|
|
124
|
-
if (methodsPay.includes(paymethodSelected?.gateway) && paymethodData?.id && paymethodSelected?.data?.card) {
|
|
125
|
-
handlePlaceOrder()
|
|
126
|
-
}
|
|
127
|
-
}, [paymethodData, paymethodSelected])
|
|
128
|
-
|
|
129
131
|
const renderPaymethods = ({ item }: any) => {
|
|
130
132
|
return (
|
|
131
133
|
<TouchableOpacity
|
|
@@ -154,7 +156,7 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
154
156
|
)
|
|
155
157
|
}
|
|
156
158
|
|
|
157
|
-
const excludeIds: any = [32]; //exclude paypal & connect & redirect
|
|
159
|
+
const excludeIds: any = [32, 66]; //exclude paypal & connect & redirect
|
|
158
160
|
|
|
159
161
|
return (
|
|
160
162
|
<PMContainer>
|
|
@@ -287,11 +289,11 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
287
289
|
</KeyboardAvoidingView>
|
|
288
290
|
</OModal>
|
|
289
291
|
|
|
290
|
-
{/* Stripe direct
|
|
292
|
+
{/* Stripe direct */}
|
|
291
293
|
<OModal
|
|
292
294
|
entireModal
|
|
293
295
|
title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
|
|
294
|
-
open={
|
|
296
|
+
open={isOpenMethod?.paymethod?.gateway === 'stripe_direct' && !paymethodData?.id}
|
|
295
297
|
onClose={() => handlePaymethodClick(null)}
|
|
296
298
|
>
|
|
297
299
|
<KeyboardAvoidingView
|
|
@@ -300,13 +302,10 @@ const PaymentOptionsUI = (props: any) => {
|
|
|
300
302
|
enabled={Platform.OS === 'ios' ? true : false}
|
|
301
303
|
>
|
|
302
304
|
<StripeElementsForm
|
|
303
|
-
cart={cart}
|
|
304
|
-
paymethod={isOpenMethod?.paymethod?.gateway}
|
|
305
|
-
methodsPay={methodsPay}
|
|
306
305
|
businessId={props.businessId}
|
|
307
|
-
publicKey={isOpenMethod?.paymethod?.credentials?.publishable
|
|
306
|
+
publicKey={isOpenMethod?.paymethod?.credentials?.publishable}
|
|
308
307
|
handleSource={handlePaymethodDataChange}
|
|
309
|
-
onCancel={() => handlePaymethodClick(
|
|
308
|
+
onCancel={() => handlePaymethodClick(false)}
|
|
310
309
|
/>
|
|
311
310
|
</KeyboardAvoidingView>
|
|
312
311
|
</OModal>
|
|
@@ -22,18 +22,23 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
|
|
|
22
22
|
textStyle,
|
|
23
23
|
flagStyle,
|
|
24
24
|
noDropIcon,
|
|
25
|
-
isDisabled
|
|
25
|
+
isDisabled,
|
|
26
|
+
isStartValidation
|
|
26
27
|
} = props
|
|
27
28
|
|
|
28
29
|
const theme = useTheme();
|
|
29
30
|
|
|
31
|
+
const [, t] = useLanguage()
|
|
32
|
+
const [{ configs }] = useConfig()
|
|
33
|
+
const phoneInput = useRef<PhoneInput>(null);
|
|
34
|
+
const [userphoneNumber, setUserphoneNumber] = useState('');
|
|
30
35
|
|
|
31
36
|
const style = StyleSheet.create({
|
|
32
37
|
input: {
|
|
33
38
|
backgroundColor: theme.colors.white,
|
|
34
39
|
borderRadius: 7.6,
|
|
35
40
|
borderWidth: 1,
|
|
36
|
-
borderColor: theme.colors.border,
|
|
41
|
+
borderColor: (isStartValidation && userphoneNumber === '') ? theme.colors.danger5 : theme.colors.border,
|
|
37
42
|
paddingBottom: 0,
|
|
38
43
|
paddingTop: 0,
|
|
39
44
|
flexGrow: 1,
|
|
@@ -48,12 +53,6 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
|
|
|
48
53
|
}
|
|
49
54
|
})
|
|
50
55
|
|
|
51
|
-
|
|
52
|
-
const [, t] = useLanguage()
|
|
53
|
-
const [{ configs }] = useConfig()
|
|
54
|
-
const phoneInput = useRef<PhoneInput>(null);
|
|
55
|
-
const [userphoneNumber, setUserphoneNumber] = useState('');
|
|
56
|
-
|
|
57
56
|
const handleChangeNumber = (number: any) => {
|
|
58
57
|
setUserphoneNumber(number)
|
|
59
58
|
}
|
|
@@ -97,6 +96,14 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
|
|
|
97
96
|
|
|
98
97
|
return (
|
|
99
98
|
<Wrapper onPress={() => forwardRef?.current?.focus?.()}>
|
|
99
|
+
{(isStartValidation && userphoneNumber === '') && (
|
|
100
|
+
<OText
|
|
101
|
+
size={14}
|
|
102
|
+
color={theme.colors.danger5}
|
|
103
|
+
>
|
|
104
|
+
{t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Mobile phone is required').replace('_attribute_', t('CELLPHONE', 'Cellphone'))}*
|
|
105
|
+
</OText>
|
|
106
|
+
)}
|
|
100
107
|
<PhoneInput
|
|
101
108
|
ref={phoneInput}
|
|
102
109
|
disabled={isDisabled}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react'
|
|
2
|
+
import { View } from 'react-native'
|
|
3
|
+
import { PlaceSpot as PlaceSpotController, useLanguage } from 'ordering-components/native'
|
|
4
|
+
import { PlaceGroupContainer, PlaceSpotContainer } from './styles'
|
|
5
|
+
import { NotFoundSource } from '../NotFoundSource'
|
|
6
|
+
import { OText, ODropDown } from '../shared'
|
|
7
|
+
import { Placeholder, PlaceholderLine } from 'rn-placeholder'
|
|
8
|
+
import { PlaceSpotParams } from '../../types'
|
|
9
|
+
|
|
10
|
+
const PlaceSpotUI = (props: PlaceSpotParams) => {
|
|
11
|
+
const {
|
|
12
|
+
isOpenPlaceSpot,
|
|
13
|
+
cart,
|
|
14
|
+
placesState,
|
|
15
|
+
handleChangePlace,
|
|
16
|
+
getPlacesList,
|
|
17
|
+
setOpenPlaceModal
|
|
18
|
+
} = props
|
|
19
|
+
|
|
20
|
+
const [, t] = useLanguage()
|
|
21
|
+
const [placeGroupSelected, setPlaceGroupSelected] = useState<any>(null)
|
|
22
|
+
|
|
23
|
+
const getPlacesGroups = () => {
|
|
24
|
+
const groups = placesState.placeGroups?.filter((group: any) => group?.enabled && placesState?.places?.find((place: any) => place?.enabled && place?.place_group_id === group?.id))
|
|
25
|
+
return groups.map((group: any) => ({
|
|
26
|
+
value: group,
|
|
27
|
+
content: group?.name,
|
|
28
|
+
showOnSelected: group?.name
|
|
29
|
+
}))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const getPlaces = () => {
|
|
33
|
+
const places = placeGroupSelected && placesState?.places?.filter((place: any) => place?.enabled && place?.place_group_id === placeGroupSelected?.id)
|
|
34
|
+
return places.map((place: any) => ({
|
|
35
|
+
value: place,
|
|
36
|
+
content: place.name,
|
|
37
|
+
showOnSelected: place.name
|
|
38
|
+
}))
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const handlerChangePlace = (place: any) => {
|
|
42
|
+
setOpenPlaceModal(false)
|
|
43
|
+
handleChangePlace(place)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!placesState?.loading) {
|
|
49
|
+
const placeGroupOnCart = placesState?.placeGroups.find((group: any) => group?.id === cart?.place?.place_group_id)
|
|
50
|
+
setPlaceGroupSelected(placeGroupOnCart)
|
|
51
|
+
}
|
|
52
|
+
}, [placesState])
|
|
53
|
+
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
getPlacesList()
|
|
56
|
+
}, [isOpenPlaceSpot])
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<PlaceSpotContainer>
|
|
60
|
+
{(placesState.error || placesState?.placeGroups?.length === 0) && !placesState?.loading && (
|
|
61
|
+
<NotFoundSource
|
|
62
|
+
content={t('NO_PLACES_THIS_BUSINESS', 'There are not places for this business')}
|
|
63
|
+
/>
|
|
64
|
+
)}
|
|
65
|
+
{placesState?.loading && (
|
|
66
|
+
<Placeholder>
|
|
67
|
+
<PlaceGroupContainer>
|
|
68
|
+
<PlaceholderLine width={100} height={25} />
|
|
69
|
+
<PlaceholderLine height={30} />
|
|
70
|
+
</PlaceGroupContainer>
|
|
71
|
+
<View>
|
|
72
|
+
<PlaceholderLine width={120} height={25} />
|
|
73
|
+
<PlaceholderLine height={30} />
|
|
74
|
+
</View>
|
|
75
|
+
</Placeholder>
|
|
76
|
+
)}
|
|
77
|
+
{!(placesState.error || placesState?.placeGroups?.length === 0) && !placesState?.loading && (
|
|
78
|
+
<>
|
|
79
|
+
<PlaceGroupContainer>
|
|
80
|
+
<OText size={16} mBottom={10}>{t('PLACE_GROUP', 'Place group')}</OText>
|
|
81
|
+
<ODropDown
|
|
82
|
+
placeholder={t('PLACE_GROUP', 'Place group')}
|
|
83
|
+
options={getPlacesGroups()}
|
|
84
|
+
onSelect={(group: any) => setPlaceGroupSelected(group)}
|
|
85
|
+
defaultValue={placeGroupSelected ?? cart?.place}
|
|
86
|
+
isModal
|
|
87
|
+
/>
|
|
88
|
+
</PlaceGroupContainer>
|
|
89
|
+
{placeGroupSelected && (
|
|
90
|
+
<View>
|
|
91
|
+
<OText size={16} mBottom={10}>{t('SELECT_YOUR_SPOT', 'Select your spot')}</OText>
|
|
92
|
+
<ODropDown
|
|
93
|
+
onSelect={(place: any) => handlerChangePlace(place)}
|
|
94
|
+
placeholder={t('SELECT_YOUR_SPOT', 'Select your spot')}
|
|
95
|
+
options={getPlaces()}
|
|
96
|
+
defaultValue={placesState?.places?.find((place : any) => place?.id === cart?.place_id)}
|
|
97
|
+
isModal
|
|
98
|
+
/>
|
|
99
|
+
</View>
|
|
100
|
+
)}
|
|
101
|
+
</>
|
|
102
|
+
)}
|
|
103
|
+
</PlaceSpotContainer>
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const PlaceSpot = (props: PlaceSpotParams) => {
|
|
108
|
+
const placeSpotProps = {
|
|
109
|
+
...props,
|
|
110
|
+
UIComponent: PlaceSpotUI
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return <PlaceSpotController {...placeSpotProps} />
|
|
114
|
+
}
|
|
@@ -85,7 +85,11 @@ export const PreviousOrders = (props: PreviousOrdersParams) => {
|
|
|
85
85
|
order: {
|
|
86
86
|
id: order?.id,
|
|
87
87
|
business_id: order?.business_id,
|
|
88
|
-
logo: order
|
|
88
|
+
logo: order?.business?.logo,
|
|
89
|
+
driver: order?.driver,
|
|
90
|
+
products: order?.products,
|
|
91
|
+
review: order?.review,
|
|
92
|
+
user_review: order?.user_review
|
|
89
93
|
},
|
|
90
94
|
});
|
|
91
95
|
};
|
|
@@ -139,18 +143,20 @@ export const PreviousOrders = (props: PreviousOrdersParams) => {
|
|
|
139
143
|
</OText>
|
|
140
144
|
</Information>
|
|
141
145
|
<Status>
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
146
|
+
{order.cart && (
|
|
147
|
+
<OButton
|
|
148
|
+
text={t('REORDER', 'Reorder')}
|
|
149
|
+
imgRightSrc={''}
|
|
150
|
+
textStyle={styles.buttonText}
|
|
151
|
+
style={
|
|
152
|
+
reorderLoading && order.id === reorderSelected
|
|
153
|
+
? styles.reorderLoading
|
|
154
|
+
: styles.reorderbutton
|
|
155
|
+
}
|
|
156
|
+
onClick={() => handleReorderClick(order.id)}
|
|
157
|
+
isLoading={reorderLoading && order.id === reorderSelected}
|
|
158
|
+
/>
|
|
159
|
+
)}
|
|
154
160
|
{allowedOrderStatus.includes(parseInt(order?.status)) &&
|
|
155
161
|
!order.review && (
|
|
156
162
|
<TouchableOpacity
|
|
@@ -46,7 +46,6 @@ import { ProductOptionSubOption } from '../ProductOptionSubOption';
|
|
|
46
46
|
import { NotFoundSource } from '../NotFoundSource';
|
|
47
47
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
48
48
|
import { useState } from 'react';
|
|
49
|
-
|
|
50
49
|
const windowHeight = Dimensions.get('window').height;
|
|
51
50
|
const windowWidth = Dimensions.get('window').width;
|
|
52
51
|
|
|
@@ -291,15 +290,23 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
291
290
|
if (img?.video) {
|
|
292
291
|
const keys = img?.video.split('/')
|
|
293
292
|
let _videoId = keys[keys.length - 1]
|
|
293
|
+
|
|
294
294
|
if (_videoId.includes('watch')) {
|
|
295
|
-
|
|
296
|
-
|
|
295
|
+
const __url = _videoId.split('=')[1]
|
|
296
|
+
_videoId = __url
|
|
297
|
+
} else if (_videoId.includes('?')) {
|
|
298
|
+
const __url = _videoId.split('?')[0]
|
|
299
|
+
_videoId = __url
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (_videoId.search(/&/i) >= 0) {
|
|
303
|
+
_videoId = _videoId.split('&')[0]
|
|
304
|
+
} else if (_videoId.search(/\?/i) >= 0) {
|
|
305
|
+
_videoId = _videoId.split('?')[0]
|
|
297
306
|
}
|
|
298
|
-
if (_videoId.
|
|
299
|
-
|
|
300
|
-
_videoId = __url
|
|
307
|
+
if ((_videoId.length === 11)) {
|
|
308
|
+
videoList.push(_videoId)
|
|
301
309
|
}
|
|
302
|
-
videoList.push(_videoId)
|
|
303
310
|
}
|
|
304
311
|
}
|
|
305
312
|
}
|
|
@@ -338,9 +345,9 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
338
345
|
</OText>
|
|
339
346
|
</TouchableOpacity>
|
|
340
347
|
)}
|
|
341
|
-
{options.map(({ id, name, respect_to }: any) => (
|
|
348
|
+
{options.map(({ id, name, respect_to, suboptions }: any) => (
|
|
342
349
|
<React.Fragment key={`cont_key_${id}`}>
|
|
343
|
-
{respect_to == null && (
|
|
350
|
+
{respect_to == null && suboptions?.length > 0 && (
|
|
344
351
|
<TouchableOpacity
|
|
345
352
|
key={`eopt_key_${id}`}
|
|
346
353
|
onPress={() => setSelectedOpt(id)}
|
|
@@ -687,8 +694,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
687
694
|
</WrapperIngredients>
|
|
688
695
|
</View>
|
|
689
696
|
)}
|
|
690
|
-
{product?.extras.map((extra: any) =>
|
|
691
|
-
extra.options.map((option: any) => {
|
|
697
|
+
{product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
|
|
698
|
+
extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
|
|
692
699
|
const currentState =
|
|
693
700
|
productCart.options[`id:${option.id}`] || {};
|
|
694
701
|
return (
|
|
@@ -704,7 +711,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
704
711
|
backgroundColor: isError(option.id),
|
|
705
712
|
borderRadius: 7.6
|
|
706
713
|
}}>
|
|
707
|
-
{option.suboptions.map(
|
|
714
|
+
{option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
|
|
708
715
|
(suboption: any) => {
|
|
709
716
|
const currentState =
|
|
710
717
|
productCart.options[
|
|
@@ -772,7 +779,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
772
779
|
) : (
|
|
773
780
|
<>
|
|
774
781
|
{product?.extras.map((extra: any) =>
|
|
775
|
-
extra.options.map((option: any) => {
|
|
782
|
+
extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
|
|
776
783
|
if (
|
|
777
784
|
option.id == selOpt ||
|
|
778
785
|
(hasRespected(
|
|
@@ -797,7 +804,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
797
804
|
option.id,
|
|
798
805
|
),
|
|
799
806
|
}}>
|
|
800
|
-
{option.suboptions.map(
|
|
807
|
+
{option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
|
|
801
808
|
(suboption: any) => {
|
|
802
809
|
const currentState =
|
|
803
810
|
productCart.options[
|
|
@@ -872,9 +879,13 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
872
879
|
</ScrollView>
|
|
873
880
|
{!loading && !error && product && (
|
|
874
881
|
<ProductActions ios={Platform?.OS === 'ios'}>
|
|
875
|
-
<
|
|
876
|
-
{
|
|
877
|
-
|
|
882
|
+
<View>
|
|
883
|
+
<OText size={16} lineHeight={24} weight={'600'}>
|
|
884
|
+
{productCart.total ? parsePrice(productCart?.total) : ''}
|
|
885
|
+
</OText>
|
|
886
|
+
{product?.minimum_per_order && productCart?.quantity < product?.minimum_per_order && <OText size={12} color={theme.colors?.red}>{t('MOBILE_MINIMUM_TO_ORDER', 'Min. _number_ ').replace('_number_', product?.minimum_per_order)}</OText>}
|
|
887
|
+
{product?.maximum_per_order && productCart?.quantity > product?.maximum_per_order && <OText size={12} color={theme.colors?.red}>{t('MOBILE_MAXIMUM_TO_ORDER', 'Max. _number_'.replace('_number_', product?.maximum_per_order))}</OText>}
|
|
888
|
+
</View>
|
|
878
889
|
{productCart && !isSoldOut && maxProductQuantity > 0 && (
|
|
879
890
|
<View style={styles.quantityControl}>
|
|
880
891
|
<TouchableOpacity
|
|
@@ -987,14 +998,14 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
987
998
|
? t('UPDATE', 'Update')
|
|
988
999
|
: t('ADD', 'Add')
|
|
989
1000
|
}`}
|
|
990
|
-
isDisabled={isSoldOut || maxProductQuantity <= 0}
|
|
1001
|
+
isDisabled={isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order))}
|
|
991
1002
|
textStyle={{
|
|
992
1003
|
color: saveErrors || isSoldOut || maxProductQuantity <= 0 ? theme.colors.primary : theme.colors.white,
|
|
993
1004
|
fontSize: orderState.loading || editMode ? 10 : 14
|
|
994
1005
|
}}
|
|
995
1006
|
style={{
|
|
996
|
-
backgroundColor: saveErrors || isSoldOut || maxProductQuantity <= 0 ? theme.colors.lightGray : theme.colors.primary,
|
|
997
|
-
borderColor: saveErrors || isSoldOut || maxProductQuantity <= 0 ? theme.colors.white : theme.colors.primary,
|
|
1007
|
+
backgroundColor: saveErrors || isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order)) ? theme.colors.lightGray : theme.colors.primary,
|
|
1008
|
+
borderColor: saveErrors || isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order)) ? theme.colors.white : theme.colors.primary,
|
|
998
1009
|
opacity: saveErrors || isSoldOut || maxProductQuantity <= 0 ? 0.3 : 1,
|
|
999
1010
|
borderRadius: 7.6,
|
|
1000
1011
|
height: 44,
|
|
@@ -6,9 +6,10 @@ export const WrapHeader = styled.View`
|
|
|
6
6
|
`
|
|
7
7
|
|
|
8
8
|
export const TopActions = styled.TouchableOpacity`
|
|
9
|
-
height:
|
|
9
|
+
height: 60px;
|
|
10
10
|
justify-content: center;
|
|
11
11
|
padding-horizontal: 30px;
|
|
12
|
+
width: 80px;
|
|
12
13
|
`;
|
|
13
14
|
|
|
14
15
|
export const TopHeader = styled.View`
|
|
@@ -48,7 +49,6 @@ export const ProductDescription = styled.View`
|
|
|
48
49
|
`
|
|
49
50
|
|
|
50
51
|
export const ProductEditions = styled.View`
|
|
51
|
-
|
|
52
52
|
`
|
|
53
53
|
|
|
54
54
|
export const SectionTitle = styled.View`
|
|
@@ -43,7 +43,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
43
43
|
logoWrapper: {
|
|
44
44
|
shadowColor: theme.colors.black,
|
|
45
45
|
shadowRadius: 3,
|
|
46
|
-
shadowOffset: {width: 1, height: 4},
|
|
46
|
+
shadowOffset: { width: 1, height: 4 },
|
|
47
47
|
elevation: 3,
|
|
48
48
|
borderRadius: 8,
|
|
49
49
|
shadowOpacity: 0.1,
|
|
@@ -108,11 +108,11 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
const qualificationList = [
|
|
111
|
-
{ key: 1, text: t('TERRIBLE', 'Terrible'), percent: 0,
|
|
111
|
+
{ key: 1, text: t('TERRIBLE', 'Terrible'), percent: 0, parentStyle: { left: '0%' }, isInnerStyle: false, pointerColor: false },
|
|
112
112
|
{ key: 2, text: t('BAD', 'Bad'), percent: 0.25, parentStyle: { left: '25%' }, isInnerStyle: true, pointerColor: true },
|
|
113
113
|
{ key: 3, text: t('OKAY', 'Okay'), percent: 0.5, parentStyle: { left: '50%' }, isInnerStyle: true, pointerColor: true },
|
|
114
114
|
{ key: 4, text: t('GOOD', 'Good'), percent: 0.75, parentStyle: { left: '75%' }, isInnerStyle: true, pointerColor: true },
|
|
115
|
-
{ key: 5, text: t('GREAT', 'Great'), percent: 1, parentStyle: { right: '0%' }, isInnerStyle: false,
|
|
115
|
+
{ key: 5, text: t('GREAT', 'Great'), percent: 1, parentStyle: { right: '0%' }, isInnerStyle: false, pointerColor: false }
|
|
116
116
|
]
|
|
117
117
|
|
|
118
118
|
const commentsList = reviewCommentList('order')
|
|
@@ -137,7 +137,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
137
137
|
return found
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
const handleContinueClick
|
|
140
|
+
const handleContinueClick = () => {
|
|
141
141
|
if (!order?.review) {
|
|
142
142
|
onSubmit()
|
|
143
143
|
} else {
|
|
@@ -183,7 +183,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
183
183
|
comments.map(comment => _comments += comment.content + '. ')
|
|
184
184
|
}
|
|
185
185
|
let _comment
|
|
186
|
-
_comment = _comments
|
|
186
|
+
_comment = _comments + extraComment
|
|
187
187
|
setStars({ ...stars, comments: _comment })
|
|
188
188
|
}, [comments, extraComment])
|
|
189
189
|
|
|
@@ -214,7 +214,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
214
214
|
<OText color={theme.colors.primary}>{t('ORDER_REVIEWED', 'This order has been already reviewed')}</OText>
|
|
215
215
|
</View>
|
|
216
216
|
) : (
|
|
217
|
-
<View style={{flex: 1, justifyContent: 'flex-end'}}>
|
|
217
|
+
<View style={{ flex: 1, justifyContent: 'flex-end' }}>
|
|
218
218
|
<FormReviews>
|
|
219
219
|
<OText mBottom={13} color={theme.colors.textNormal}>{t('HOW_WAS_YOUR_ORDER', 'How was your order?')}</OText>
|
|
220
220
|
<RatingBarContainer>
|
|
@@ -266,7 +266,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
266
266
|
style={{ height: 35, paddingLeft: 5, paddingRight: 5, marginHorizontal: 3, marginVertical: 10 }}
|
|
267
267
|
imgRightSrc={isSelectedComment(commentItem.key) ? theme.images.general.close : null}
|
|
268
268
|
imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}
|
|
269
|
-
onClick={() => handleChangeComment(commentItem)
|
|
269
|
+
onClick={() => handleChangeComment(commentItem)}
|
|
270
270
|
/>
|
|
271
271
|
))}
|
|
272
272
|
</CommentsButtonGroup>
|
|
@@ -304,7 +304,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
304
304
|
textStyle={{ color: theme.colors.white, paddingRight: 10 }}
|
|
305
305
|
text={t('CONTINUE', 'Continue')}
|
|
306
306
|
style={{ borderRadius: 8 }}
|
|
307
|
-
|
|
307
|
+
imgRightSrc={theme.images.general.arrow_right}
|
|
308
308
|
imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}
|
|
309
309
|
onClick={handleSubmit(handleContinueClick)}
|
|
310
310
|
/>
|
|
@@ -317,7 +317,8 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
|
|
|
317
317
|
export const ReviewOrder = (props: ReviewOrderParams) => {
|
|
318
318
|
const reviewOrderProps = {
|
|
319
319
|
...props,
|
|
320
|
-
UIComponent: ReviewOrderUI
|
|
320
|
+
UIComponent: ReviewOrderUI,
|
|
321
|
+
defaultStar: 5
|
|
321
322
|
}
|
|
322
323
|
return <ReviewOrderController {...reviewOrderProps} />
|
|
323
324
|
}
|
|
@@ -74,7 +74,7 @@ const ReviewProductsUI = (props: ReviewProductParams) => {
|
|
|
74
74
|
titleWrapStyle={{ paddingHorizontal: 0 }}
|
|
75
75
|
titleStyle={{ marginRight: 0, marginLeft: 0 }}
|
|
76
76
|
/>
|
|
77
|
-
{order?.products
|
|
77
|
+
{order?.products?.map((product: any) => (
|
|
78
78
|
<SingleProductReview
|
|
79
79
|
key={product.id}
|
|
80
80
|
product={product}
|