ordering-ui-react-native 0.17.87 → 0.17.88-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 +8 -7
- package/src/DeliveryApp.tsx +43 -1
- package/src/components/BusinessInformation/index.tsx +10 -9
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/OrderCreating/index.tsx +1 -21
- package/src/components/PaymentOptionsWebView/index.tsx +29 -8
- package/src/components/PhoneInputNumber/index.tsx +6 -2
- package/src/components/StripeMethodForm/index.tsx +136 -102
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/components/shared/OToast.tsx +3 -2
- package/src/types/index.tsx +5 -0
- package/src/utils/index.tsx +5 -0
- package/themes/business/index.tsx +2 -0
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +33 -26
- package/themes/business/src/components/BusinessController/index.tsx +0 -1
- package/themes/business/src/components/Chat/index.tsx +163 -123
- package/themes/business/src/components/DriverMap/index.tsx +17 -6
- package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
- package/themes/business/src/components/FloatingButton/index.tsx +34 -31
- package/themes/business/src/components/GoogleMap/index.tsx +58 -57
- package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
- package/themes/business/src/components/LoginForm/index.tsx +15 -22
- package/themes/business/src/components/MapView/index.tsx +8 -8
- package/themes/business/src/components/MessagesOption/index.tsx +20 -93
- package/themes/business/src/components/NewOrderNotification/index.tsx +123 -96
- package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
- package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
- package/themes/business/src/components/OrderDetails/Delivery.tsx +202 -12
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +84 -37
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +81 -66
- package/themes/business/src/components/OrderDetailsLogistic/index.tsx +200 -0
- package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
- package/themes/business/src/components/OrderMessage/index.tsx +19 -18
- package/themes/business/src/components/OrderSummary/index.tsx +114 -123
- package/themes/business/src/components/OrdersOption/index.tsx +22 -22
- package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
- package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
- package/themes/business/src/components/PreviousOrders/OrderItem.tsx +17 -12
- package/themes/business/src/components/PreviousOrders/OrderList.tsx +93 -0
- package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
- package/themes/business/src/components/PreviousOrders/index.tsx +198 -221
- package/themes/business/src/components/ProductItemAccordion/index.tsx +7 -1
- package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
- package/themes/business/src/components/StoresList/index.tsx +3 -4
- package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
- package/themes/business/src/components/shared/OModal.tsx +16 -9
- package/themes/business/src/types/index.tsx +25 -10
- package/themes/business/src/utils/index.tsx +29 -2
- 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/Checkout/index.tsx +6 -0
- package/themes/kiosk/src/components/Intro/index.tsx +16 -1
- package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
- 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/OrderTypeCardSelector/index.tsx +8 -10
- package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/original/index.tsx +1 -1
- package/themes/original/src/components/AddressDetails/index.tsx +19 -3
- package/themes/original/src/components/AddressForm/index.tsx +35 -17
- package/themes/original/src/components/AddressList/index.tsx +5 -8
- package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
- package/themes/original/src/components/AppleLogin/index.tsx +4 -4
- package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +73 -37
- package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
- package/themes/original/src/components/BusinessController/index.tsx +35 -44
- package/themes/original/src/components/BusinessController/styles.tsx +12 -5
- package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
- package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
- package/themes/original/src/components/BusinessInformation/index.tsx +140 -85
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
- package/themes/original/src/components/BusinessListingSearch/index.tsx +347 -336
- package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
- package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
- package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
- package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
- package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
- package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
- package/themes/original/src/components/BusinessProductsListing/index.tsx +663 -556
- package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -3
- package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
- package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
- package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
- package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
- package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +38 -405
- package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
- package/themes/original/src/components/Cart/index.tsx +60 -51
- package/themes/original/src/components/CartContent/index.tsx +102 -58
- package/themes/original/src/components/CartContent/styles.tsx +6 -6
- package/themes/original/src/components/Checkout/index.tsx +280 -35
- package/themes/original/src/components/CitiesControl/index.tsx +1 -1
- package/themes/original/src/components/CouponControl/index.tsx +10 -3
- package/themes/original/src/components/DriverTips/index.tsx +52 -34
- package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
- package/themes/original/src/components/Favorite/index.tsx +1 -5
- package/themes/original/src/components/GPSButton/index.tsx +6 -4
- package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +42 -5
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
- package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +86 -10
- package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
- package/themes/original/src/components/GoogleMap/index.tsx +63 -7
- package/themes/original/src/components/Home/index.tsx +13 -4
- package/themes/original/src/components/LastOrder/index.tsx +2 -1
- package/themes/original/src/components/LastOrders/index.tsx +2 -1
- package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
- package/themes/original/src/components/LoginForm/index.tsx +64 -34
- package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
- package/themes/original/src/components/MessageListing/index.tsx +9 -2
- package/themes/original/src/components/Messages/index.tsx +15 -4
- package/themes/original/src/components/MomentOption/index.tsx +193 -92
- package/themes/original/src/components/MomentSelector/index.tsx +1 -1
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -50
- package/themes/original/src/components/MultiCheckout/index.tsx +385 -52
- package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
- package/themes/original/src/components/MultiOrdersDetails/index.tsx +23 -19
- package/themes/original/src/components/MyOrders/index.tsx +25 -16
- package/themes/original/src/components/NavBar/index.tsx +20 -13
- package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
- package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
- package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
- package/themes/original/src/components/OrderDetails/index.tsx +50 -38
- package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
- package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
- package/themes/original/src/components/OrderProgress/index.tsx +34 -25
- package/themes/original/src/components/OrderSummary/index.tsx +83 -57
- package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
- package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
- package/themes/original/src/components/OrdersOption/index.tsx +59 -46
- package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
- package/themes/original/src/components/PageBanner/index.tsx +65 -29
- package/themes/original/src/components/PageBanner/styles.tsx +0 -3
- package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
- package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
- package/themes/original/src/components/PaymentOptions/index.tsx +100 -34
- package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
- package/themes/original/src/components/ProductForm/index.tsx +88 -31
- package/themes/original/src/components/ProductForm/styles.tsx +3 -3
- package/themes/original/src/components/ProductItemAccordion/index.tsx +8 -6
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +49 -20
- package/themes/original/src/components/ProductOptionSubOption/styles.tsx +10 -9
- package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
- package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
- package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
- package/themes/original/src/components/Promotions/index.tsx +2 -2
- package/themes/original/src/components/Promotions/styles.tsx +3 -1
- package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
- package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
- package/themes/original/src/components/ServiceForm/index.tsx +63 -20
- package/themes/original/src/components/Sessions/styles.tsx +1 -0
- package/themes/original/src/components/SignupForm/index.tsx +43 -27
- package/themes/original/src/components/SingleOrderCard/index.tsx +42 -19
- package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
- package/themes/original/src/components/SingleProductCard/index.tsx +37 -26
- package/themes/original/src/components/SingleProductCard/styles.tsx +9 -3
- package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
- package/themes/original/src/components/StripeCardsList/index.tsx +61 -5
- package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
- package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
- package/themes/original/src/components/UpsellingProducts/index.tsx +5 -10
- package/themes/original/src/components/UserDetails/index.tsx +3 -1
- package/themes/original/src/components/UserFormDetails/index.tsx +78 -9
- package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
- package/themes/original/src/components/UserProfile/index.tsx +8 -26
- package/themes/original/src/components/UserProfileForm/index.tsx +30 -31
- package/themes/original/src/components/UserVerification/index.tsx +55 -50
- package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
- package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
- package/themes/original/src/components/Wallets/index.tsx +52 -62
- package/themes/original/src/components/Wallets/styles.tsx +2 -4
- package/themes/original/src/components/shared/OButton.tsx +3 -3
- package/themes/original/src/components/shared/OInput.tsx +4 -5
- package/themes/original/src/components/shared/OModal.tsx +3 -3
- package/themes/original/src/types/index.tsx +37 -10
- package/themes/original/src/utils/index.tsx +185 -13
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
- package/src/navigators/BottomNavigator.tsx +0 -117
- package/src/navigators/CheckoutNavigator.tsx +0 -66
- package/src/navigators/HomeNavigator.tsx +0 -202
- package/src/navigators/NavigationRef.tsx +0 -7
- package/src/navigators/RootNavigator.tsx +0 -269
- package/src/pages/Account.tsx +0 -34
- package/src/pages/AddressForm.tsx +0 -62
- package/src/pages/AddressList.tsx +0 -24
- package/src/pages/BusinessProductsList.tsx +0 -81
- package/src/pages/BusinessesListing.tsx +0 -43
- package/src/pages/CartList.tsx +0 -49
- package/src/pages/Checkout.tsx +0 -101
- package/src/pages/ForgotPassword.tsx +0 -24
- package/src/pages/Help.tsx +0 -23
- package/src/pages/HelpAccountAndPayment.tsx +0 -23
- package/src/pages/HelpGuide.tsx +0 -23
- package/src/pages/HelpOrder.tsx +0 -23
- package/src/pages/Home.tsx +0 -36
- package/src/pages/IntroductoryTutorial.tsx +0 -170
- package/src/pages/Login.tsx +0 -47
- package/src/pages/MomentOption.tsx +0 -30
- package/src/pages/MultiCheckout.tsx +0 -31
- package/src/pages/MultiOrdersDetails.tsx +0 -27
- package/src/pages/MyOrders.tsx +0 -40
- package/src/pages/NetworkError.tsx +0 -24
- package/src/pages/NotFound.tsx +0 -22
- package/src/pages/OrderDetails.tsx +0 -25
- package/src/pages/ProductDetails.tsx +0 -55
- package/src/pages/Profile.tsx +0 -36
- package/src/pages/ReviewDriver.tsx +0 -30
- package/src/pages/ReviewOrder.tsx +0 -32
- package/src/pages/ReviewProducts.tsx +0 -30
- package/src/pages/Sessions.tsx +0 -22
- package/src/pages/Signup.tsx +0 -53
- package/src/pages/SpinnerLoader.tsx +0 -10
- package/src/pages/Splash.tsx +0 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useState, useEffect, useRef } from 'react'
|
|
2
2
|
import { useTheme } from 'styled-components/native'
|
|
3
|
-
import { Platform, View, StyleSheet, Dimensions, ScrollView, TouchableOpacity } from 'react-native'
|
|
3
|
+
import { Platform, View, StyleSheet, Dimensions, ScrollView, TouchableOpacity, Text } from 'react-native'
|
|
4
4
|
import { OText, OButton, OModal, OIcon } from '../shared'
|
|
5
5
|
import FastImage from 'react-native-fast-image'
|
|
6
6
|
import IconAntDesign from 'react-native-vector-icons/AntDesign'
|
|
@@ -11,6 +11,8 @@ import FeatherIcon from 'react-native-vector-icons/Feather';
|
|
|
11
11
|
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
12
12
|
import { ServiceFormParams } from '../../types'
|
|
13
13
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
14
|
+
import uuid from 'react-native-uuid';
|
|
15
|
+
import { orderTypeList } from '../../utils'
|
|
14
16
|
|
|
15
17
|
import {
|
|
16
18
|
ProductForm as ProductFormController,
|
|
@@ -45,7 +47,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
45
47
|
maxProductQuantity,
|
|
46
48
|
onClose,
|
|
47
49
|
professionalListState,
|
|
48
|
-
isCartProduct
|
|
50
|
+
isCartProduct,
|
|
51
|
+
actionStatus,
|
|
52
|
+
handleCreateGuestUser
|
|
49
53
|
} = props
|
|
50
54
|
|
|
51
55
|
const theme = useTheme()
|
|
@@ -65,6 +69,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
65
69
|
const [isOpen, setIsOpen] = useState(false)
|
|
66
70
|
const [currentProfessional, setCurrentProfessional] = useState<any>(null)
|
|
67
71
|
|
|
72
|
+
const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
|
|
73
|
+
const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
|
|
74
|
+
|
|
68
75
|
const dropdownRef = useRef<any>(null)
|
|
69
76
|
|
|
70
77
|
const styles = StyleSheet.create({
|
|
@@ -103,23 +110,41 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
103
110
|
height: 40,
|
|
104
111
|
marginBottom: 30
|
|
105
112
|
},
|
|
113
|
+
dropDownRow: {
|
|
114
|
+
color: theme.colors.primary,
|
|
115
|
+
fontSize: 14,
|
|
116
|
+
marginHorizontal: 0
|
|
117
|
+
},
|
|
106
118
|
professionalList: {
|
|
107
119
|
paddingHorizontal: 40,
|
|
108
|
-
paddingVertical: 30
|
|
120
|
+
paddingVertical: 30,
|
|
109
121
|
}
|
|
110
122
|
})
|
|
111
123
|
|
|
112
|
-
const
|
|
113
|
-
|
|
124
|
+
const getMomentTime = (time) => {
|
|
125
|
+
const _moment = moment(`${moment(selectDate).format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm').toDate()
|
|
126
|
+
return _moment
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const isBusyTime = (professional, selectedMoment) => {
|
|
130
|
+
if (!selectedMoment) return false
|
|
131
|
+
const startDay = moment(selectedMoment).utc().format('d')
|
|
132
|
+
const isStartScheduleEnabled = professional?.schedule?.[startDay]?.enabled
|
|
114
133
|
const duration = product?.duration ?? 0
|
|
134
|
+
const endDay = moment(selectedMoment).add(duration - 1, 'minutes').utc().format('d')
|
|
135
|
+
const isEndScheduleEnabled = professional?.schedule?.[endDay]?.enabled
|
|
136
|
+
if (!isStartScheduleEnabled || !isEndScheduleEnabled) return true
|
|
137
|
+
|
|
138
|
+
if (professional?.busy_times?.length === 0) return false
|
|
139
|
+
|
|
115
140
|
const busyTimes = isCartProduct
|
|
116
|
-
? professional?.busy_times.filter(
|
|
141
|
+
? professional?.busy_times.filter(item => !(item.start === productCart?.calendar_event?.start && item.end === productCart?.calendar_event?.end))
|
|
117
142
|
: [...professional?.busy_times]
|
|
118
|
-
const valid = busyTimes.some(
|
|
119
|
-
return (moment.utc(item?.start).local().valueOf() <= moment(
|
|
120
|
-
moment(
|
|
121
|
-
(moment.utc(item?.start).local().valueOf()
|
|
122
|
-
moment(
|
|
143
|
+
const valid = busyTimes.some(item => {
|
|
144
|
+
return (moment.utc(item?.start).local().valueOf() <= moment(selectedMoment).valueOf() &&
|
|
145
|
+
moment(selectedMoment).valueOf() < moment.utc(item?.end).local().valueOf()) ||
|
|
146
|
+
(moment.utc(item?.start).local().valueOf() < moment(selectedMoment).add(duration, 'minutes').valueOf() &&
|
|
147
|
+
moment(selectedMoment).add(duration, 'minutes').valueOf() < moment.utc(item?.end).local().valueOf())
|
|
123
148
|
})
|
|
124
149
|
return valid
|
|
125
150
|
}
|
|
@@ -140,6 +165,11 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
140
165
|
)
|
|
141
166
|
}
|
|
142
167
|
|
|
168
|
+
const handleUpdateGuest = () => {
|
|
169
|
+
const guestToken = uuid.v4()
|
|
170
|
+
if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
|
|
171
|
+
}
|
|
172
|
+
|
|
143
173
|
const customDayHeaderStylesCallback = () => {
|
|
144
174
|
return {
|
|
145
175
|
textStyle: {
|
|
@@ -371,9 +401,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
371
401
|
size={12}
|
|
372
402
|
weight={'400'}
|
|
373
403
|
lineHeight={17}
|
|
374
|
-
color={isBusyTime(currentProfessional) ? theme.colors.danger5 : theme.colors.success500}
|
|
404
|
+
color={isBusyTime(currentProfessional, dateSelected) ? theme.colors.danger5 : theme.colors.success500}
|
|
375
405
|
>
|
|
376
|
-
{isBusyTime(currentProfessional)
|
|
406
|
+
{isBusyTime(currentProfessional, dateSelected)
|
|
377
407
|
? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
|
|
378
408
|
: t('AVAILABLE', 'Available')
|
|
379
409
|
}
|
|
@@ -453,10 +483,12 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
453
483
|
paddingTop: 8,
|
|
454
484
|
paddingHorizontal: 12
|
|
455
485
|
}}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
486
|
+
renderCustomizedRowChild={(item, index) => {
|
|
487
|
+
return (
|
|
488
|
+
<Text style={[styles.dropDownRow, { color: isBusyTime(currentProfessional, getMomentTime(item.value)) ? theme.colors.lightGray : theme.colors.primary } ]}>
|
|
489
|
+
{item.text}
|
|
490
|
+
</Text>
|
|
491
|
+
)
|
|
460
492
|
}}
|
|
461
493
|
renderDropdownIcon={() => dropDownIcon()}
|
|
462
494
|
dropdownOverlayColor='transparent'
|
|
@@ -529,7 +561,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
529
561
|
? t('SOLD_OUT', 'Sold out')
|
|
530
562
|
: t('BOOK', 'Book'))}
|
|
531
563
|
style={styles.buttonStyle}
|
|
532
|
-
isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected || isBusyTime(currentProfessional)}
|
|
564
|
+
isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected || isBusyTime(currentProfessional, dateSelected)}
|
|
533
565
|
textStyle={{ fontSize: 14, color: theme.colors.white }}
|
|
534
566
|
/>
|
|
535
567
|
)}
|
|
@@ -563,6 +595,17 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
563
595
|
}}
|
|
564
596
|
/>
|
|
565
597
|
)}
|
|
598
|
+
{!auth && guestCheckoutEnabled && orderTypeEnabled && (
|
|
599
|
+
<TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
|
|
600
|
+
{actionStatus?.loading ? (
|
|
601
|
+
<Placeholder Animation={Fade}>
|
|
602
|
+
<PlaceholderLine width={60} height={20} />
|
|
603
|
+
</Placeholder>
|
|
604
|
+
) : (
|
|
605
|
+
<OText color={theme.colors.primary} size={13}>{t('AS_GUEST_USER', 'As guest user')}</OText>
|
|
606
|
+
)}
|
|
607
|
+
</TouchableOpacity>
|
|
608
|
+
)}
|
|
566
609
|
</ButtonWrapper>
|
|
567
610
|
</Container>
|
|
568
611
|
)}
|
|
@@ -616,9 +659,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
|
|
|
616
659
|
size={12}
|
|
617
660
|
weight={'400'}
|
|
618
661
|
lineHeight={17}
|
|
619
|
-
color={isBusyTime(professional) ? theme.colors.danger5 : theme.colors.success500}
|
|
662
|
+
color={isBusyTime(professional, dateSelected) ? theme.colors.danger5 : theme.colors.success500}
|
|
620
663
|
>
|
|
621
|
-
{isBusyTime(professional)
|
|
664
|
+
{isBusyTime(professional, dateSelected)
|
|
622
665
|
? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
|
|
623
666
|
: t('AVAILABLE', 'Available')
|
|
624
667
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { View, Pressable, StyleSheet, Linking, Platform, TouchableOpacity
|
|
2
|
+
import { View, Pressable, StyleSheet, Linking, Platform, TouchableOpacity } from 'react-native';
|
|
3
3
|
import { useForm, Controller } from 'react-hook-form';
|
|
4
4
|
import Spinner from 'react-native-loading-spinner-overlay';
|
|
5
5
|
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
|
@@ -8,6 +8,7 @@ import { PhoneInputNumber } from '../PhoneInputNumber';
|
|
|
8
8
|
import { FacebookLogin } from '../FacebookLogin';
|
|
9
9
|
import Recaptcha from 'react-native-recaptcha-that-works'
|
|
10
10
|
import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
|
|
11
|
+
import ReactNativeHapticFeedback from "react-native-haptic-feedback";
|
|
11
12
|
|
|
12
13
|
import {
|
|
13
14
|
SignupForm as SignUpController,
|
|
@@ -83,7 +84,8 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
83
84
|
signUpTab,
|
|
84
85
|
useSignUpFullDetails,
|
|
85
86
|
useSignUpOtpEmail,
|
|
86
|
-
useSignUpOtpCellphone
|
|
87
|
+
useSignUpOtpCellphone,
|
|
88
|
+
isGuest
|
|
87
89
|
} = props;
|
|
88
90
|
|
|
89
91
|
const theme = useTheme();
|
|
@@ -163,6 +165,14 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
163
165
|
})
|
|
164
166
|
}
|
|
165
167
|
|
|
168
|
+
const vibrateApp = (impact?: string) => {
|
|
169
|
+
const options = {
|
|
170
|
+
enableVibrateFallback: true,
|
|
171
|
+
ignoreAndroidSystemSettings: false
|
|
172
|
+
};
|
|
173
|
+
ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
|
|
174
|
+
}
|
|
175
|
+
|
|
166
176
|
const handleRefs = (ref: any, code: string) => {
|
|
167
177
|
switch (code) {
|
|
168
178
|
case 'name': {
|
|
@@ -245,7 +255,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
245
255
|
const onSubmit = (values?: any) => {
|
|
246
256
|
if (phoneInputData.error && signUpTab !== 'otpEmail') {
|
|
247
257
|
showToast(ToastType.Error, phoneInputData.error);
|
|
248
|
-
|
|
258
|
+
vibrateApp()
|
|
249
259
|
return;
|
|
250
260
|
}
|
|
251
261
|
if (
|
|
@@ -263,7 +273,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
263
273
|
'The field Mobile phone is required.',
|
|
264
274
|
),
|
|
265
275
|
);
|
|
266
|
-
|
|
276
|
+
vibrateApp()
|
|
267
277
|
return;
|
|
268
278
|
}
|
|
269
279
|
if (signUpTab === 'otpEmail' || signUpTab === 'otpCellphone') {
|
|
@@ -322,7 +332,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
322
332
|
};
|
|
323
333
|
|
|
324
334
|
const handleChangeInputEmail = (value: string, onChange: any) => {
|
|
325
|
-
onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
|
|
335
|
+
onChange(value.toLowerCase().trim().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
|
|
326
336
|
};
|
|
327
337
|
|
|
328
338
|
const handleOpenTermsUrl = async (url: any) => {
|
|
@@ -332,7 +342,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
332
342
|
await Linking.openURL(url);
|
|
333
343
|
} else {
|
|
334
344
|
showToast(ToastType.Error, t('VALIDATION_ERROR_ACTIVE_URL', 'The _attribute_ is not a valid URL.').replace('_attribute_', t('URL', 'URL')))
|
|
335
|
-
|
|
345
|
+
vibrateApp()
|
|
336
346
|
}
|
|
337
347
|
}
|
|
338
348
|
|
|
@@ -340,12 +350,12 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
340
350
|
setRecaptchaVerified(false)
|
|
341
351
|
if (!recaptchaConfig?.siteKey) {
|
|
342
352
|
showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
|
|
343
|
-
|
|
353
|
+
vibrateApp()
|
|
344
354
|
return
|
|
345
355
|
}
|
|
346
356
|
if (!recaptchaConfig?.baseUrl) {
|
|
347
357
|
showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
|
|
348
|
-
|
|
358
|
+
vibrateApp()
|
|
349
359
|
return
|
|
350
360
|
}
|
|
351
361
|
recaptchaRef.current.open()
|
|
@@ -389,11 +399,13 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
389
399
|
baseUrl: configs?.security_recaptcha_base_url?.value || null
|
|
390
400
|
})
|
|
391
401
|
showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
|
|
392
|
-
|
|
402
|
+
vibrateApp()
|
|
393
403
|
return
|
|
394
404
|
}
|
|
395
|
-
formState.result?.result &&
|
|
396
|
-
|
|
405
|
+
formState.result?.result && formState.result?.result[0]?.includes("_") ?
|
|
406
|
+
showToast(ToastType.Error, t(`${formState.result?.result[0]}`, 'Phone number already used')) :
|
|
407
|
+
showToast(ToastType.Error, formState.result?.result[0])
|
|
408
|
+
formState.result?.result && vibrateApp()
|
|
397
409
|
setIsLoadingVerifyModal(false);
|
|
398
410
|
}
|
|
399
411
|
}, [formState]);
|
|
@@ -401,7 +413,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
401
413
|
useEffect(() => {
|
|
402
414
|
if (Object.keys(errors).length > 0) {
|
|
403
415
|
setIsLoadingVerifyModal(false);
|
|
404
|
-
|
|
416
|
+
vibrateApp()
|
|
405
417
|
}
|
|
406
418
|
}, [errors])
|
|
407
419
|
|
|
@@ -430,7 +442,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
430
442
|
? verifyPhoneState?.result?.result
|
|
431
443
|
: verifyPhoneState?.result?.result[0];
|
|
432
444
|
verifyPhoneState.result?.result && showToast(ToastType.Error, message);
|
|
433
|
-
verifyPhoneState.result?.result &&
|
|
445
|
+
verifyPhoneState.result?.result && vibrateApp()
|
|
434
446
|
setIsLoadingVerifyModal(false);
|
|
435
447
|
return;
|
|
436
448
|
}
|
|
@@ -465,15 +477,19 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
465
477
|
|
|
466
478
|
return (
|
|
467
479
|
<View>
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
480
|
+
{isGuest ? (
|
|
481
|
+
<OText style={{ textAlign: 'center', marginBottom: 10 }} size={18}>{t('SIGNUP', 'Signup')}</OText>
|
|
482
|
+
) : (
|
|
483
|
+
<NavBar
|
|
484
|
+
title={t('SIGNUP', 'Signup')}
|
|
485
|
+
titleAlign={'center'}
|
|
486
|
+
onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
|
|
487
|
+
showCall={false}
|
|
488
|
+
btnStyle={{ paddingLeft: 0 }}
|
|
489
|
+
titleWrapStyle={{ paddingHorizontal: 0 }}
|
|
490
|
+
titleStyle={{ marginLeft: 0, marginRight: 0 }}
|
|
491
|
+
/>
|
|
492
|
+
)}
|
|
477
493
|
<FormSide>
|
|
478
494
|
{((Number(useSignUpFullDetails) + Number(useSignUpOtpEmail) + Number(useSignUpOtpCellphone)) > 1) && (
|
|
479
495
|
<SignupWith>
|
|
@@ -586,7 +602,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
586
602
|
control={control}
|
|
587
603
|
render={({ onChange, value }: any) => (
|
|
588
604
|
<OInput
|
|
589
|
-
placeholder={t(field.name)}
|
|
605
|
+
placeholder={t(field.name?.replace(/\s/g, '_')?.toUpperCase(), field.name)}
|
|
590
606
|
style={style.inputStyle}
|
|
591
607
|
icon={
|
|
592
608
|
field.code === 'email'
|
|
@@ -893,7 +909,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
893
909
|
</View>
|
|
894
910
|
)
|
|
895
911
|
}
|
|
896
|
-
{configs && Object.keys(configs).length > 0 && (
|
|
912
|
+
{configs && Object.keys(configs).length > 0 && !isGuest && (
|
|
897
913
|
(((configs?.facebook_login?.value === 'true' || configs?.facebook_login?.value === '1') && configs?.facebook_id?.value && facebookLoginEnabled) ||
|
|
898
914
|
((configs?.google_login_client_id?.value !== '' && configs?.google_login_client_id?.value !== null) && googleLoginEnabled) ||
|
|
899
915
|
((configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled)) &&
|
|
@@ -925,7 +941,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
925
941
|
(
|
|
926
942
|
<FacebookLogin
|
|
927
943
|
notificationState={notificationState}
|
|
928
|
-
handleErrors={(err: any) => { showToast(ToastType.Error, err),
|
|
944
|
+
handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
|
|
929
945
|
handleLoading={(val: boolean) => setIsFBLoading(val)}
|
|
930
946
|
handleSuccessFacebookLogin={handleSuccessFacebook}
|
|
931
947
|
/>
|
|
@@ -934,7 +950,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
934
950
|
<GoogleLogin
|
|
935
951
|
notificationState={notificationState}
|
|
936
952
|
webClientId={configs?.google_login_client_id?.value}
|
|
937
|
-
handleErrors={(err: any) => { showToast(ToastType.Error, err),
|
|
953
|
+
handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
|
|
938
954
|
handleLoading={(val: boolean) => setIsFBLoading(val)}
|
|
939
955
|
handleSuccessGoogleLogin={handleSuccessFacebook}
|
|
940
956
|
/>
|
|
@@ -942,7 +958,7 @@ const SignupFormUI = (props: SignupParams) => {
|
|
|
942
958
|
{(configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled && (
|
|
943
959
|
<AppleLogin
|
|
944
960
|
notificationState={notificationState}
|
|
945
|
-
handleErrors={(err: any) => { showToast(ToastType.Error, err),
|
|
961
|
+
handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
|
|
946
962
|
handleLoading={(val: boolean) => setIsFBLoading(val)}
|
|
947
963
|
handleSuccessAppleLogin={handleSuccessFacebook}
|
|
948
964
|
/>
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
SingleOrderCard as SingleOrderCardController,
|
|
4
4
|
useUtils,
|
|
5
5
|
useOrder,
|
|
6
6
|
useLanguage
|
|
7
7
|
} from 'ordering-components/native';
|
|
8
|
+
import FastImage from 'react-native-fast-image'
|
|
8
9
|
import { StyleSheet, TouchableOpacity, View } from 'react-native';
|
|
9
10
|
import { useTheme } from 'styled-components/native';
|
|
10
11
|
import { OIcon, OText, OButton } from '../shared';
|
|
11
12
|
import { SingleOrderCardParams } from '../../types';
|
|
12
13
|
import { OAlert } from '../../../../../src/components/shared'
|
|
13
|
-
|
|
14
|
+
import { OrderEta } from '../OrderDetails/OrderEta'
|
|
15
|
+
import { useIsFocused } from '@react-navigation/native';
|
|
14
16
|
import {
|
|
15
17
|
InnerContainer,
|
|
16
18
|
Logo,
|
|
@@ -44,12 +46,13 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
44
46
|
const [, t] = useLanguage();
|
|
45
47
|
const [{ carts }] = useOrder()
|
|
46
48
|
const theme = useTheme();
|
|
49
|
+
const isFocused = useIsFocused();
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
let [reorderSelected, setReorderSelected] = useState<number | null>(null);
|
|
49
52
|
const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
|
|
50
53
|
const [isPressed, setIsPressed] = useState(false)
|
|
51
54
|
|
|
52
|
-
const allowedOrderStatus = [1, 2, 5, 6, 10, 11, 12];
|
|
55
|
+
const allowedOrderStatus = [1, 2, 5, 6, 10, 11, 12, 15];
|
|
53
56
|
|
|
54
57
|
const styles = StyleSheet.create({
|
|
55
58
|
container: {
|
|
@@ -128,19 +131,29 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
128
131
|
});
|
|
129
132
|
|
|
130
133
|
const handleReorderClick = (order: any) => {
|
|
131
|
-
|
|
134
|
+
setReorderSelected(null)
|
|
135
|
+
reorderSelected = null
|
|
136
|
+
const isMultiOrders = Array.isArray(order?.id)
|
|
137
|
+
|
|
138
|
+
const isRemoveCart = isMultiOrders
|
|
139
|
+
? order?.business_id?.some((businessId: any) => !!carts[`businessId:${businessId}`]?.uuid)
|
|
140
|
+
: carts[`businessId:${order?.business_id}`] && !!carts[`businessId:${order?.business_id}`]?.uuid
|
|
141
|
+
|
|
142
|
+
if (isRemoveCart) {
|
|
132
143
|
setConfirm({
|
|
133
144
|
open: true,
|
|
134
145
|
content: [t('QUESTION_DELETE_PRODUCTS_FROM_CART', 'Are you sure that you want to delete all products from cart?')],
|
|
135
146
|
title: t('ORDER', 'Order'),
|
|
136
147
|
handleOnAccept: async () => {
|
|
137
|
-
handleRemoveCart()
|
|
148
|
+
handleRemoveCart(order)
|
|
138
149
|
setConfirm({ ...confirm, open: false })
|
|
139
150
|
}
|
|
140
151
|
})
|
|
141
152
|
} else {
|
|
142
|
-
|
|
143
|
-
|
|
153
|
+
const orderId = Array.isArray(order?.id) ? order?.id[0] : order?.id
|
|
154
|
+
setReorderSelected(orderId)
|
|
155
|
+
reorderSelected = orderId
|
|
156
|
+
handleReorder && handleReorder(order?.id)
|
|
144
157
|
}
|
|
145
158
|
};
|
|
146
159
|
|
|
@@ -198,6 +211,10 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
198
211
|
const hideFavorite = theme?.orders?.components?.favorite?.hidden
|
|
199
212
|
const hideOrderStatus = theme?.orders?.components?.order_status?.hidden
|
|
200
213
|
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
if (isFocused) setReorderSelected(null)
|
|
216
|
+
}, [isFocused])
|
|
217
|
+
|
|
201
218
|
return (
|
|
202
219
|
<>
|
|
203
220
|
<CardAnimation
|
|
@@ -215,10 +232,13 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
215
232
|
key={business?.id}
|
|
216
233
|
style={styles.logoWrapper}
|
|
217
234
|
>
|
|
218
|
-
<
|
|
219
|
-
url={optimizeImage(business?.logo, 'h_300,c_limit')}
|
|
220
|
-
src={optimizeImage(!business?.logo && theme?.images?.dummies?.businessLogo, 'h_300,c_limit')}
|
|
235
|
+
<FastImage
|
|
221
236
|
style={styles.minilogo}
|
|
237
|
+
source={business?.logo ? {
|
|
238
|
+
uri: optimizeImage(business?.logo, 'h_300,c_limit'),
|
|
239
|
+
priority: FastImage.priority.normal,
|
|
240
|
+
} : theme?.images?.dummies?.businessLogo}
|
|
241
|
+
resizeMode={FastImage.resizeMode.contain}
|
|
222
242
|
/>
|
|
223
243
|
</Logo>
|
|
224
244
|
))}
|
|
@@ -228,10 +248,13 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
228
248
|
</MultiLogosContainer>
|
|
229
249
|
) : (
|
|
230
250
|
<Logo style={styles.logoWrapper}>
|
|
231
|
-
<
|
|
232
|
-
url={optimizeImage(order.business?.logo, 'h_300,c_limit')}
|
|
233
|
-
src={optimizeImage(!order.business?.logo && theme?.images?.dummies?.businessLogo, 'h_300,c_limit')}
|
|
251
|
+
<FastImage
|
|
234
252
|
style={styles.logo}
|
|
253
|
+
source={order.business?.logo ? {
|
|
254
|
+
uri: optimizeImage(order.business?.logo, 'h_300,c_limit'),
|
|
255
|
+
priority: FastImage.priority.normal,
|
|
256
|
+
} : theme?.images?.dummies?.businessLogo}
|
|
257
|
+
resizeMode={FastImage.resizeMode.contain}
|
|
235
258
|
/>
|
|
236
259
|
</Logo>
|
|
237
260
|
)}
|
|
@@ -271,7 +294,7 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
271
294
|
<ButtonWrapper>
|
|
272
295
|
{!hideReviewOrderButton &&
|
|
273
296
|
allowedOrderStatus.includes(parseInt(order?.status)) &&
|
|
274
|
-
!order.review && (
|
|
297
|
+
!order.review && order?.cart && (
|
|
275
298
|
<TouchableOpacity
|
|
276
299
|
onPress={() => handleClickOrderReview(order)}
|
|
277
300
|
style={styles.reviewButton}>
|
|
@@ -280,7 +303,7 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
280
303
|
</OText>
|
|
281
304
|
</TouchableOpacity>
|
|
282
305
|
)}
|
|
283
|
-
{order
|
|
306
|
+
{!hideReorderButton && typeof order?.id === 'number' && order?.cart && (
|
|
284
307
|
<OButton
|
|
285
308
|
text={t('REORDER', 'Reorder')}
|
|
286
309
|
imgRightSrc={''}
|
|
@@ -333,7 +356,7 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
333
356
|
{
|
|
334
357
|
pastOrders
|
|
335
358
|
? order?.delivery_datetime_utc ? parseDate(order?.delivery_datetime_utc) : parseDate(order?.delivery_datetime, { utc: false })
|
|
336
|
-
: order
|
|
359
|
+
: <OrderEta order={order} />
|
|
337
360
|
}
|
|
338
361
|
</OText>
|
|
339
362
|
)}
|
|
@@ -352,8 +375,8 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
|
|
|
352
375
|
<LottieAnimation
|
|
353
376
|
type='favorite'
|
|
354
377
|
onClick={handleChangeFavorite}
|
|
355
|
-
initialValue={order?.favorite ? 0.
|
|
356
|
-
toValue={order?.favorite ? 0 : 0.
|
|
378
|
+
initialValue={order?.favorite ? 0.5 : 0}
|
|
379
|
+
toValue={order?.favorite ? 0 : 0.5}
|
|
357
380
|
style={{ marginBottom: 5 }}
|
|
358
381
|
iconProps={{ color: theme.colors.danger5, size: 16, style: { top: 7 } }}
|
|
359
382
|
isActive={order?.favorite}
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
} from 'ordering-components/native';
|
|
12
12
|
import { useTheme } from 'styled-components/native';
|
|
13
13
|
import { SingleProductCardParams } from '../../types';
|
|
14
|
-
import { CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper,
|
|
15
|
-
import { StyleSheet, View } from 'react-native';
|
|
14
|
+
import { CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper, TagsContainer } from './styles';
|
|
15
|
+
import { ScrollView, StyleSheet, TouchableWithoutFeedback, View } from 'react-native';
|
|
16
16
|
import { InView } from 'react-native-intersection-observer'
|
|
17
17
|
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
18
18
|
import { OButton, OIcon, OText } from '../shared';
|
|
19
19
|
import FastImage from 'react-native-fast-image'
|
|
20
|
-
import { shape } from '../../utils';
|
|
20
|
+
import { lightenDarkenColor, shape } from '../../utils';
|
|
21
21
|
import { LottieAnimation } from '../LottieAnimation';
|
|
22
22
|
import { CardAnimation } from '../shared/CardAnimation'
|
|
23
23
|
|
|
@@ -40,12 +40,13 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
40
40
|
navigation,
|
|
41
41
|
businessId,
|
|
42
42
|
isPreviously,
|
|
43
|
-
viewString
|
|
43
|
+
viewString,
|
|
44
|
+
businessSingleId
|
|
44
45
|
} = props;
|
|
45
46
|
|
|
46
47
|
const theme = useTheme();
|
|
47
48
|
const hideAddButton = theme?.business_view?.components?.products?.components?.add_to_cart_button?.hidden ?? true
|
|
48
|
-
const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
|
|
49
|
+
const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
49
50
|
const hideProductDescription = theme?.business_view?.components?.products?.components?.product?.components?.description?.hidden
|
|
50
51
|
const hideProductLogo = viewString
|
|
51
52
|
? theme?.[viewString]?.components?.cart?.components?.products?.image?.hidden
|
|
@@ -104,11 +105,11 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
104
105
|
color: '#808080',
|
|
105
106
|
textDecorationLine: 'line-through',
|
|
106
107
|
marginLeft: 7,
|
|
107
|
-
marginRight:
|
|
108
|
+
marginRight: 0
|
|
108
109
|
},
|
|
109
110
|
productTagsStyle: {
|
|
110
111
|
width: 30,
|
|
111
|
-
|
|
112
|
+
height: 30,
|
|
112
113
|
marginRight: 5
|
|
113
114
|
}
|
|
114
115
|
});
|
|
@@ -168,7 +169,7 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
return (
|
|
171
|
-
<InView style={{ minHeight: hideAddButton ? 125 : 190 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeIntersection()}>
|
|
172
|
+
<InView style={{ minHeight: hideAddButton ? 125 : 190, marginLeft: logoPosition === 'left' ? 12.5 : 0 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeIntersection()}>
|
|
172
173
|
{isIntersectionObserver ? (
|
|
173
174
|
<CardAnimation
|
|
174
175
|
onClick={() => handleClickproduct()}
|
|
@@ -180,8 +181,8 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
180
181
|
>
|
|
181
182
|
<View style={{ flexDirection: logoPosition === 'left' ? 'row-reverse' : 'row' }}>
|
|
182
183
|
{productAddedToCartLength > 0 && (
|
|
183
|
-
<QuantityContainer style={[styles.quantityContainer, {
|
|
184
|
-
transform: [{ translateX: 25 }, { translateY: -25 }],
|
|
184
|
+
<QuantityContainer businessSingleId={businessSingleId} style={[styles.quantityContainer, {
|
|
185
|
+
transform: [{ translateX: logoPosition === 'right' ? 25 : -25 }, { translateY: -25 }],
|
|
185
186
|
}]}>
|
|
186
187
|
<OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
|
|
187
188
|
</QuantityContainer>
|
|
@@ -200,8 +201,8 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
200
201
|
<LottieAnimation
|
|
201
202
|
type='favorite'
|
|
202
203
|
onClick={handleChangeFavorite}
|
|
203
|
-
initialValue={product?.favorite ? 0.
|
|
204
|
-
toValue={product?.favorite ? 0 : 0.
|
|
204
|
+
initialValue={product?.favorite ? 0.5 : 0}
|
|
205
|
+
toValue={product?.favorite ? 0 : 0.5}
|
|
205
206
|
disableAnimation={!auth}
|
|
206
207
|
iconProps={{ color: theme.colors.danger5, size: 18 }}
|
|
207
208
|
isActive={product?.favorite}
|
|
@@ -215,21 +216,29 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
215
216
|
{product?.offer_price !== null && !!product?.in_offer && (
|
|
216
217
|
<OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
|
|
217
218
|
)}
|
|
218
|
-
{product?.tags && product?.tags.length > 0 && (
|
|
219
|
-
<
|
|
219
|
+
{!isPreviously && product?.tags && product?.tags.length > 0 && (
|
|
220
|
+
<ScrollView
|
|
221
|
+
showsVerticalScrollIndicator={false}
|
|
222
|
+
showsHorizontalScrollIndicator={false}
|
|
223
|
+
horizontal
|
|
224
|
+
style={{ marginLeft: 10 }}
|
|
225
|
+
contentContainerStyle={{ flexGrow: 1 }}
|
|
226
|
+
>
|
|
220
227
|
{product?.tags.map((tag: any, i: any) => (
|
|
221
|
-
<
|
|
222
|
-
<
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
228
|
+
<TouchableWithoutFeedback key={i}>
|
|
229
|
+
<TagsContainer>
|
|
230
|
+
<FastImage
|
|
231
|
+
style={styles.productTagsStyle}
|
|
232
|
+
source={tag.image ? {
|
|
233
|
+
uri: optimizeImage(tag.image, 'h_250,c_limit'),
|
|
234
|
+
priority: FastImage.priority.normal,
|
|
235
|
+
} : theme?.images?.dummies?.product}
|
|
236
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
237
|
+
/>
|
|
238
|
+
</TagsContainer>
|
|
239
|
+
</TouchableWithoutFeedback>
|
|
231
240
|
))}
|
|
232
|
-
</
|
|
241
|
+
</ScrollView>
|
|
233
242
|
)}
|
|
234
243
|
</PricesContainer>
|
|
235
244
|
{!hideProductDescription && (
|
|
@@ -257,13 +266,15 @@ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
|
|
|
257
266
|
{!!product?.ribbon?.enabled && (
|
|
258
267
|
<RibbonBox
|
|
259
268
|
bgColor={product?.ribbon?.color}
|
|
269
|
+
colorText={lightenDarkenColor(product?.ribbon?.color)}
|
|
270
|
+
borderRibbon={lightenDarkenColor(product?.ribbon?.color)}
|
|
260
271
|
isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
|
|
261
272
|
isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
|
|
262
273
|
>
|
|
263
274
|
<OText
|
|
264
275
|
size={textSize}
|
|
265
276
|
weight={'400'}
|
|
266
|
-
color={theme.colors.white}
|
|
277
|
+
color={lightenDarkenColor(product?.ribbon?.color) ? theme.colors.black : theme.colors.white}
|
|
267
278
|
numberOfLines={2}
|
|
268
279
|
ellipsizeMode='tail'
|
|
269
280
|
lineHeight={13}
|