ordering-ui-react-native 0.17.75 → 0.17.76-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 +28 -25
- package/themes/business/src/components/BusinessController/index.tsx +0 -1
- package/themes/business/src/components/Chat/index.tsx +149 -118
- 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/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 +10 -10
- package/themes/business/src/components/MessagesOption/index.tsx +20 -93
- package/themes/business/src/components/NewOrderNotification/index.tsx +128 -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 +191 -6
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +102 -40
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +61 -60
- package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -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 +20 -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 +88 -0
- package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
- package/themes/business/src/components/PreviousOrders/index.tsx +139 -174
- package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
- 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/OLink.tsx +9 -2
- package/themes/business/src/components/shared/OModal.tsx +16 -9
- package/themes/business/src/components/shared/OText.tsx +6 -1
- 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 +61 -39
- package/themes/original/src/components/AddressList/index.tsx +11 -6
- 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 +153 -96
- package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
- package/themes/original/src/components/BusinessController/index.tsx +81 -68
- 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 +348 -340
- 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 +684 -559
- package/themes/original/src/components/BusinessProductsListing/styles.tsx +1 -1
- package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
- package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +69 -38
- package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
- package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
- package/themes/original/src/components/Cart/index.tsx +76 -79
- package/themes/original/src/components/CartContent/index.tsx +112 -19
- package/themes/original/src/components/CartContent/styles.tsx +16 -6
- package/themes/original/src/components/Checkout/index.tsx +281 -55
- 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 +2 -6
- package/themes/original/src/components/FavoriteList/index.tsx +1 -35
- package/themes/original/src/components/FloatingButton/index.tsx +10 -13
- package/themes/original/src/components/GPSButton/index.tsx +6 -4
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +7 -3
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
- package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +19 -6
- package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
- package/themes/original/src/components/GoogleMap/index.tsx +60 -5
- package/themes/original/src/components/Help/index.tsx +2 -2
- package/themes/original/src/components/HelpGuide/index.tsx +2 -2
- package/themes/original/src/components/HelpGuide/styles.tsx +1 -0
- package/themes/original/src/components/Home/index.tsx +13 -4
- package/themes/original/src/components/LastOrder/index.tsx +1 -34
- 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 +16 -42
- package/themes/original/src/components/Messages/index.tsx +14 -7
- package/themes/original/src/components/MomentOption/index.tsx +193 -90
- package/themes/original/src/components/MomentSelector/index.tsx +1 -1
- package/themes/original/src/components/MultiCart/index.tsx +41 -54
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -50
- package/themes/original/src/components/MultiCheckout/index.tsx +329 -100
- package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
- package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
- package/themes/original/src/components/MultiOrdersDetails/index.tsx +54 -21
- package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
- package/themes/original/src/components/MyOrders/index.tsx +37 -24
- package/themes/original/src/components/NavBar/index.tsx +20 -12
- package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
- package/themes/original/src/components/Notifications/styles.tsx +1 -5
- 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 +28 -233
- 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 +30 -56
- package/themes/original/src/components/OrderSummary/index.tsx +83 -57
- package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
- package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
- package/themes/original/src/components/OrdersOption/index.tsx +67 -85
- package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
- package/themes/original/src/components/PageBanner/index.tsx +98 -38
- package/themes/original/src/components/PageBanner/styles.tsx +0 -10
- package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
- package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
- package/themes/original/src/components/PaymentOptions/index.tsx +77 -34
- package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
- package/themes/original/src/components/ProductForm/index.tsx +101 -34
- 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 +20 -18
- package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -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/index.tsx +11 -8
- package/themes/original/src/components/Sessions/styles.tsx +5 -0
- package/themes/original/src/components/SignupForm/index.tsx +43 -27
- package/themes/original/src/components/SingleOrderCard/index.tsx +102 -63
- package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
- package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
- package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
- package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
- package/themes/original/src/components/StripeCardsList/index.tsx +49 -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 +238 -224
- package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
- 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 +87 -76
- package/themes/original/src/components/UserProfileForm/index.tsx +10 -3
- package/themes/original/src/components/UserProfileForm/styles.tsx +1 -1
- 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 +56 -33
- package/themes/original/src/components/Wallets/styles.tsx +3 -4
- package/themes/original/src/components/shared/OButton.tsx +6 -2
- package/themes/original/src/components/shared/OInput.tsx +6 -1
- package/themes/original/src/components/shared/OModal.tsx +3 -3
- package/themes/original/src/types/index.tsx +39 -10
- package/themes/original/src/utils/index.tsx +273 -1
- 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
|
@@ -9,8 +9,7 @@ import {
|
|
|
9
9
|
I18nManager,
|
|
10
10
|
SafeAreaView,
|
|
11
11
|
Platform,
|
|
12
|
-
Button
|
|
13
|
-
Vibration
|
|
12
|
+
Button
|
|
14
13
|
} from 'react-native';
|
|
15
14
|
import {
|
|
16
15
|
ProductForm as ProductOptions,
|
|
@@ -19,8 +18,11 @@ import {
|
|
|
19
18
|
useOrder,
|
|
20
19
|
useUtils,
|
|
21
20
|
ToastType,
|
|
22
|
-
useToast
|
|
21
|
+
useToast,
|
|
22
|
+
useConfig,
|
|
23
|
+
useEvent
|
|
23
24
|
} from 'ordering-components/native';
|
|
25
|
+
import uuid from 'react-native-uuid';
|
|
24
26
|
import { useTheme } from 'styled-components/native';
|
|
25
27
|
import { ProductIngredient } from '../ProductIngredient';
|
|
26
28
|
import { ProductOption } from '../ProductOption';
|
|
@@ -28,6 +30,7 @@ import Swiper from 'react-native-swiper'
|
|
|
28
30
|
import FastImage from 'react-native-fast-image';
|
|
29
31
|
import IconAntDesign from 'react-native-vector-icons/AntDesign';
|
|
30
32
|
import YoutubePlayer from "react-native-youtube-iframe"
|
|
33
|
+
import ReactNativeHapticFeedback from "react-native-haptic-feedback";
|
|
31
34
|
|
|
32
35
|
import {
|
|
33
36
|
WrapHeader,
|
|
@@ -51,6 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
|
|
|
51
54
|
import { ProductOptionSubOption } from '../ProductOptionSubOption';
|
|
52
55
|
import { NotFoundSource } from '../NotFoundSource';
|
|
53
56
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
57
|
+
import NavBar from '../NavBar';
|
|
58
|
+
import { orderTypeList, vibrateApp } from '../../utils';
|
|
54
59
|
const windowWidth = Dimensions.get('window').width;
|
|
55
60
|
|
|
56
61
|
export const ProductOptionsUI = (props: any) => {
|
|
@@ -70,13 +75,16 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
70
75
|
handleChangeSuboptionState,
|
|
71
76
|
handleChangeCommentState,
|
|
72
77
|
productObject,
|
|
73
|
-
productAddedToCartLength
|
|
78
|
+
productAddedToCartLength,
|
|
79
|
+
actionStatus,
|
|
80
|
+
handleCreateGuestUser
|
|
74
81
|
} = props;
|
|
75
82
|
|
|
76
83
|
const theme = useTheme();
|
|
77
84
|
const [, { showToast }] = useToast()
|
|
85
|
+
const [events] = useEvent()
|
|
78
86
|
|
|
79
|
-
const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
|
|
87
|
+
const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
80
88
|
|
|
81
89
|
const styles = StyleSheet.create({
|
|
82
90
|
mainContainer: {
|
|
@@ -166,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
166
174
|
justifyContent: 'space-between',
|
|
167
175
|
width: '100%',
|
|
168
176
|
marginTop: 10
|
|
177
|
+
},
|
|
178
|
+
wrapperNavbar: {
|
|
179
|
+
paddingHorizontal: 30,
|
|
180
|
+
paddingTop: 0,
|
|
169
181
|
}
|
|
170
182
|
});
|
|
171
183
|
|
|
@@ -173,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
173
185
|
const [, t] = useLanguage();
|
|
174
186
|
const [orderState] = useOrder();
|
|
175
187
|
const [{ auth }] = useSession();
|
|
188
|
+
const [{ configs }] = useConfig()
|
|
176
189
|
const { product, loading, error } = productObject;
|
|
177
190
|
const [gallery, setGallery] = useState([])
|
|
178
191
|
const [thumbsSwiper, setThumbsSwiper] = useState(0)
|
|
@@ -192,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
192
205
|
const [summaryRefHeight, setSummaryRefHeight] = useState(0)
|
|
193
206
|
const [isScrollAvailable, setIsScrollAvailable] = useState(null)
|
|
194
207
|
const [editionsLayoutY, setEditionsLayoutY] = useState(null)
|
|
208
|
+
const [viewedProduct, setViewedProduct] = useState<any>(null)
|
|
209
|
+
const [showTitle, setShowTitle] = useState(false)
|
|
210
|
+
|
|
211
|
+
const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
|
|
212
|
+
const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
|
|
213
|
+
|
|
214
|
+
const vibrateApp = (impact?: string) => {
|
|
215
|
+
const options = {
|
|
216
|
+
enableVibrateFallback: true,
|
|
217
|
+
ignoreAndroidSystemSettings: false
|
|
218
|
+
};
|
|
219
|
+
ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
|
|
220
|
+
}
|
|
195
221
|
|
|
196
222
|
const isError = (id: number) => {
|
|
197
223
|
let bgColor = theme.colors.white;
|
|
@@ -208,12 +234,12 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
208
234
|
};
|
|
209
235
|
|
|
210
236
|
const handleSaveProduct = () => {
|
|
211
|
-
|
|
237
|
+
vibrateApp()
|
|
212
238
|
if (!productCart.quantity) {
|
|
213
239
|
showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
|
|
214
240
|
return
|
|
215
241
|
}
|
|
216
|
-
const isErrors = Object.values(errors)
|
|
242
|
+
const isErrors = Object.values(errors)?.length > 0;
|
|
217
243
|
if (!isErrors) {
|
|
218
244
|
handleSave && handleSave();
|
|
219
245
|
return;
|
|
@@ -232,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
232
258
|
};
|
|
233
259
|
|
|
234
260
|
const handleChangeMainIndex = (index: number) => {
|
|
235
|
-
if (index < 0 || index > gallery
|
|
261
|
+
if (index < 0 || index > gallery?.length - 1) {
|
|
236
262
|
setThumbsSwiper(0)
|
|
237
263
|
return
|
|
238
264
|
}
|
|
@@ -275,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
275
301
|
}
|
|
276
302
|
|
|
277
303
|
const scrollDown = (id: any) => {
|
|
278
|
-
const isErrors = Object.values(errors)
|
|
304
|
+
const isErrors = Object.values(errors)?.length > 0
|
|
279
305
|
if (!isErrors) {
|
|
280
306
|
return
|
|
281
307
|
}
|
|
@@ -289,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
289
315
|
}
|
|
290
316
|
}
|
|
291
317
|
|
|
318
|
+
const handleUpdateGuest = () => {
|
|
319
|
+
const guestToken = uuid.v4()
|
|
320
|
+
if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
|
|
321
|
+
}
|
|
322
|
+
|
|
292
323
|
const handleOnLayout = (event: any, optionId: any) => {
|
|
293
324
|
const _optionLayout = { ...optionLayout }
|
|
294
325
|
const optionKey = 'id:' + optionId
|
|
@@ -299,7 +330,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
299
330
|
const saveErrors =
|
|
300
331
|
orderState.loading ||
|
|
301
332
|
maxProductQuantity === 0 ||
|
|
302
|
-
Object.keys(errors)
|
|
333
|
+
Object.keys(errors)?.length > 0;
|
|
303
334
|
|
|
304
335
|
|
|
305
336
|
const ExtraOptions = ({ eID, options }: any) => (
|
|
@@ -341,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
341
372
|
);
|
|
342
373
|
|
|
343
374
|
const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
|
|
344
|
-
|
|
375
|
+
setShowTitle(contentOffset.y > 30)
|
|
345
376
|
const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
|
|
346
377
|
if (_topOption) {
|
|
347
378
|
const _topOptionId = Number(_topOption.replace('id:', ''))
|
|
@@ -366,14 +397,14 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
366
397
|
? product.images
|
|
367
398
|
: theme?.images?.dummies?.product)
|
|
368
399
|
|
|
369
|
-
if (product?.gallery && product?.gallery
|
|
400
|
+
if (product?.gallery && product?.gallery?.length > 0) {
|
|
370
401
|
for (const img of product?.gallery) {
|
|
371
402
|
if (img?.file) {
|
|
372
403
|
imageList.push(img?.file)
|
|
373
404
|
}
|
|
374
405
|
if (img?.video) {
|
|
375
406
|
const keys = img?.video.split('/')
|
|
376
|
-
let _videoId = keys[keys
|
|
407
|
+
let _videoId = keys[keys?.length - 1]
|
|
377
408
|
|
|
378
409
|
if (_videoId.includes('watch')) {
|
|
379
410
|
const __url = _videoId.split('=')[1]
|
|
@@ -388,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
388
419
|
} else if (_videoId.search(/\?/i) >= 0) {
|
|
389
420
|
_videoId = _videoId.split('?')[0]
|
|
390
421
|
}
|
|
391
|
-
if ((_videoId
|
|
422
|
+
if ((_videoId?.length === 11)) {
|
|
392
423
|
videoList.push(_videoId)
|
|
393
424
|
}
|
|
394
425
|
}
|
|
@@ -462,14 +493,27 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
462
493
|
: t('LOGIN_SIGNUP', 'Login / Sign Up')
|
|
463
494
|
}
|
|
464
495
|
imgRightSrc=""
|
|
465
|
-
textStyle={{ color: theme.colors.primary, fontSize:
|
|
496
|
+
textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
|
|
466
497
|
style={{
|
|
467
|
-
height:
|
|
498
|
+
height: 42,
|
|
468
499
|
borderColor: theme.colors.primary,
|
|
469
500
|
backgroundColor: theme.colors.white,
|
|
501
|
+
paddingLeft: 0,
|
|
502
|
+
paddingRight: 0
|
|
470
503
|
}}
|
|
471
504
|
/>
|
|
472
505
|
)}
|
|
506
|
+
{!auth && guestCheckoutEnabled && orderTypeEnabled && (
|
|
507
|
+
<TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
|
|
508
|
+
{actionStatus?.loading ? (
|
|
509
|
+
<Placeholder Animation={Fade}>
|
|
510
|
+
<PlaceholderLine width={60} height={20} />
|
|
511
|
+
</Placeholder>
|
|
512
|
+
) : (
|
|
513
|
+
<OText color={theme.colors.primary} size={13} style={{ textAlign: 'center' }}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
|
|
514
|
+
)}
|
|
515
|
+
</TouchableOpacity>
|
|
516
|
+
)}
|
|
473
517
|
</View>
|
|
474
518
|
)
|
|
475
519
|
}
|
|
@@ -483,14 +527,37 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
483
527
|
}
|
|
484
528
|
}, [])
|
|
485
529
|
|
|
530
|
+
useEffect(() => {
|
|
531
|
+
if (!product?.id || product?.id === viewedProduct?.id) return
|
|
532
|
+
setViewedProduct(product)
|
|
533
|
+
events.emit('product_viewed', product)
|
|
534
|
+
}, [product?.id, viewedProduct])
|
|
486
535
|
|
|
487
536
|
return (
|
|
488
537
|
<SafeAreaView style={{ flex: 1 }}>
|
|
489
|
-
<
|
|
490
|
-
<
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
538
|
+
<View style={styles.wrapperNavbar}>
|
|
539
|
+
<TopHeader>
|
|
540
|
+
<>
|
|
541
|
+
<TopActions onPress={() => handleGoBack()}>
|
|
542
|
+
<IconAntDesign
|
|
543
|
+
name='arrowleft'
|
|
544
|
+
size={26}
|
|
545
|
+
/>
|
|
546
|
+
</TopActions>
|
|
547
|
+
{showTitle && (
|
|
548
|
+
<OText
|
|
549
|
+
size={16}
|
|
550
|
+
style={{ flex: 1, textAlign: 'center' }}
|
|
551
|
+
weight={Platform.OS === 'ios' ? '600' : 'bold'}
|
|
552
|
+
numberOfLines={2}
|
|
553
|
+
ellipsizeMode='tail'
|
|
554
|
+
>
|
|
555
|
+
{product?.name}
|
|
556
|
+
</OText>
|
|
557
|
+
)}
|
|
558
|
+
</>
|
|
559
|
+
</TopHeader>
|
|
560
|
+
</View>
|
|
494
561
|
{!error && (
|
|
495
562
|
<ScrollView
|
|
496
563
|
ref={scrollViewRef}
|
|
@@ -539,14 +606,14 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
539
606
|
</View>
|
|
540
607
|
}
|
|
541
608
|
>
|
|
542
|
-
{gallery && gallery
|
|
609
|
+
{gallery && gallery?.length > 0 && gallery.map((img, i) => (
|
|
543
610
|
<View
|
|
544
611
|
style={styles.slide1}
|
|
545
612
|
key={i}
|
|
546
613
|
>
|
|
547
614
|
{(String(img).includes('http') || typeof img === 'number') ? (
|
|
548
615
|
<FastImage
|
|
549
|
-
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio:
|
|
616
|
+
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
|
|
550
617
|
source={typeof img !== 'number' ? {
|
|
551
618
|
uri: optimizeImage(img, 'h_1024,c_limit'),
|
|
552
619
|
priority: FastImage.priority.normal,
|
|
@@ -574,7 +641,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
574
641
|
paddingVertical: 15
|
|
575
642
|
}}
|
|
576
643
|
>
|
|
577
|
-
{gallery
|
|
644
|
+
{gallery?.length > 1 && gallery.map((img, index) => (
|
|
578
645
|
<TouchableOpacity
|
|
579
646
|
key={index}
|
|
580
647
|
onPress={() => handleClickThumb(index)}
|
|
@@ -623,7 +690,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
623
690
|
)}
|
|
624
691
|
</WrapHeader>
|
|
625
692
|
<ProductSummary
|
|
626
|
-
ph={isChewLayout ? 20 :
|
|
693
|
+
ph={isChewLayout ? 20 : 30}
|
|
627
694
|
onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
|
|
628
695
|
>
|
|
629
696
|
<ProductTitle>
|
|
@@ -725,11 +792,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
725
792
|
marginBottom: 20,
|
|
726
793
|
borderBottomWidth: 1,
|
|
727
794
|
borderBottomColor: theme.colors.border,
|
|
728
|
-
marginHorizontal:
|
|
795
|
+
marginHorizontal: 20,
|
|
729
796
|
backgroundColor: theme.colors.backgroundPage,
|
|
730
797
|
}}
|
|
731
798
|
>
|
|
732
|
-
{product?.ingredients
|
|
799
|
+
{product?.ingredients?.length > 0 && (
|
|
733
800
|
<TouchableOpacity
|
|
734
801
|
key={`eopt_key_01`}
|
|
735
802
|
onPress={() => {
|
|
@@ -754,7 +821,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
754
821
|
</OText>
|
|
755
822
|
</TouchableOpacity>
|
|
756
823
|
)}
|
|
757
|
-
{product?.extras
|
|
824
|
+
{product?.extras?.map((extra: any) =>
|
|
758
825
|
<ExtraOptions key={extra.id} options={extra.options} />
|
|
759
826
|
)}
|
|
760
827
|
</ExtraOptionWrap>
|
|
@@ -799,13 +866,13 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
799
866
|
</>
|
|
800
867
|
) : (
|
|
801
868
|
<ProductEditions
|
|
802
|
-
style={{ paddingHorizontal: isChewLayout ? 20 :
|
|
869
|
+
style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
|
|
803
870
|
onLayout={(event: any) => {
|
|
804
871
|
setEditionsLayoutY(event.nativeEvent.layout?.y)
|
|
805
872
|
}}
|
|
806
873
|
>
|
|
807
874
|
<>
|
|
808
|
-
{product?.ingredients
|
|
875
|
+
{product?.ingredients?.length > 0 && (
|
|
809
876
|
<View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
|
|
810
877
|
<SectionTitle>
|
|
811
878
|
<OText size={16}>
|
|
@@ -827,8 +894,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
827
894
|
</WrapperIngredients>
|
|
828
895
|
</View>
|
|
829
896
|
)}
|
|
830
|
-
{product?.extras
|
|
831
|
-
extra.options
|
|
897
|
+
{product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
|
|
898
|
+
extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
|
|
832
899
|
const currentState =
|
|
833
900
|
productCart.options[`id:${option.id}`] || {};
|
|
834
901
|
return (
|
|
@@ -844,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
844
911
|
backgroundColor: isError(option.id),
|
|
845
912
|
borderRadius: 7.6
|
|
846
913
|
}}>
|
|
847
|
-
{option
|
|
914
|
+
{option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
|
|
848
915
|
(suboption: any) => {
|
|
849
916
|
const currentState =
|
|
850
917
|
productCart.options[
|
|
@@ -909,7 +976,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
909
976
|
)}
|
|
910
977
|
</ProductEditions>
|
|
911
978
|
)}
|
|
912
|
-
{!!error && error
|
|
979
|
+
{!!error && error?.length > 0 && (
|
|
913
980
|
<NotFoundSource content={error[0]?.message || error[0]} />
|
|
914
981
|
)}
|
|
915
982
|
</ScrollView>
|
|
@@ -8,8 +8,8 @@ export const WrapHeader = styled.View`
|
|
|
8
8
|
export const TopActions = styled.TouchableOpacity`
|
|
9
9
|
height: 60px;
|
|
10
10
|
justify-content: center;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
min-width: 30px;
|
|
12
|
+
padding-right: 15px;
|
|
13
13
|
`;
|
|
14
14
|
|
|
15
15
|
export const TopHeader = styled.View`
|
|
@@ -70,7 +70,7 @@ export const ProductActions = styled.View`
|
|
|
70
70
|
position: absolute;
|
|
71
71
|
bottom: 0px;
|
|
72
72
|
padding-top: ${(props: any) => props.ios ? '20px' : '0'};
|
|
73
|
-
padding-horizontal:
|
|
73
|
+
padding-horizontal: 30px;
|
|
74
74
|
padding-vertical: 20px;
|
|
75
75
|
width: 100%;
|
|
76
76
|
flex-direction: ${(props: any) => props.isColumn ? 'column' : 'row'};
|
|
@@ -77,6 +77,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
77
77
|
const [isServiceOpen, setIsServiceOpen] = useState(false)
|
|
78
78
|
// const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
|
|
79
79
|
// const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
|
|
80
|
+
const [productQuantity, setProductQuantity] = useState(product.quantity.toString())
|
|
80
81
|
|
|
81
82
|
const productInfo = () => {
|
|
82
83
|
if (isCartProduct) {
|
|
@@ -107,19 +108,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
107
108
|
/* const toggleAccordion = () => {
|
|
108
109
|
if ((!product?.valid_menu && isCartProduct)) return
|
|
109
110
|
if (isActive) {
|
|
110
|
-
|
|
111
|
+
Animated.timing(setHeight.height, {
|
|
111
112
|
toValue: 100,
|
|
112
113
|
duration: 500,
|
|
113
114
|
easing: Easing.linear,
|
|
114
115
|
useNativeDriver: false,
|
|
115
|
-
|
|
116
|
+
}).start()
|
|
116
117
|
} else {
|
|
117
|
-
|
|
118
|
+
setHeightState({height: new Animated.Value(0)})
|
|
118
119
|
}
|
|
119
120
|
}*/
|
|
120
121
|
|
|
121
122
|
const handleChangeQuantity = (value: string) => {
|
|
122
123
|
if (!orderState.loading) {
|
|
124
|
+
setProductQuantity(value)
|
|
123
125
|
if (parseInt(value) === 0) {
|
|
124
126
|
onDeleteProduct && onDeleteProduct(product)
|
|
125
127
|
} else {
|
|
@@ -134,7 +136,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
134
136
|
}
|
|
135
137
|
|
|
136
138
|
/*useEffect(() => {
|
|
137
|
-
|
|
139
|
+
toggleAccordion()
|
|
138
140
|
}, [isActive])*/
|
|
139
141
|
|
|
140
142
|
const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
|
|
@@ -209,7 +211,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
209
211
|
<RNPickerSelect
|
|
210
212
|
items={productOptions}
|
|
211
213
|
onValueChange={handleChangeQuantity}
|
|
212
|
-
value={
|
|
214
|
+
value={productQuantity}
|
|
213
215
|
style={pickerStyle}
|
|
214
216
|
useNativeAndroidPickerStyle={false}
|
|
215
217
|
placeholder={{}}
|
|
@@ -287,7 +289,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
287
289
|
)}
|
|
288
290
|
{productInfo().options.length > 0 && (
|
|
289
291
|
<ProductOptionsList>
|
|
290
|
-
{productInfo().options.map((option: any, i: number) => (
|
|
292
|
+
{productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any, i: number) => (
|
|
291
293
|
<ProductOption key={option.id + i}>
|
|
292
294
|
<OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
|
|
293
295
|
{option.suboptions.map((suboption: any) => (
|
|
@@ -32,7 +32,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
32
32
|
setIsScrollAvailable
|
|
33
33
|
} = props
|
|
34
34
|
|
|
35
|
-
const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
|
|
35
|
+
const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
|
|
36
36
|
const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
|
|
37
37
|
|
|
38
38
|
const theme = useTheme();
|
|
@@ -41,8 +41,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
41
41
|
const [showMessage, setShowMessage] = useState(false)
|
|
42
42
|
const [isDirty, setIsDirty] = useState(false)
|
|
43
43
|
|
|
44
|
-
const
|
|
45
|
-
const iconsSize = isChewLayout ? 20 : 16
|
|
44
|
+
const iconsSize = 20
|
|
46
45
|
|
|
47
46
|
const handleSuboptionClick = () => {
|
|
48
47
|
toggleSelect()
|
|
@@ -68,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
68
67
|
|
|
69
68
|
return (
|
|
70
69
|
<View>
|
|
71
|
-
<Container>
|
|
70
|
+
<Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
|
|
72
71
|
<IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
|
|
73
72
|
{((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
|
|
74
73
|
state?.selected ? (
|
|
@@ -83,12 +82,12 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
83
82
|
<OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
|
|
84
83
|
)
|
|
85
84
|
)}
|
|
86
|
-
<OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={
|
|
85
|
+
<OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={5} style={{ flex: 1 }}>
|
|
87
86
|
{suboption?.name}
|
|
88
87
|
</OText>
|
|
89
88
|
</IconControl>
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
{option?.allow_suboption_quantity && state?.selected && (
|
|
90
|
+
<QuantityControl>
|
|
92
91
|
<>
|
|
93
92
|
<Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
|
|
94
93
|
<IconAntDesign
|
|
@@ -97,7 +96,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
97
96
|
color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
|
|
98
97
|
/>
|
|
99
98
|
</Checkbox>
|
|
100
|
-
<OText size={12}
|
|
99
|
+
<OText size={12}>
|
|
101
100
|
{state.quantity}
|
|
102
101
|
</OText>
|
|
103
102
|
<Checkbox disabled={disabled || disableIncrement} onPress={increment}>
|
|
@@ -108,16 +107,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
108
107
|
/>
|
|
109
108
|
</Checkbox>
|
|
110
109
|
</>
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
110
|
+
</QuantityControl>
|
|
111
|
+
)}
|
|
112
|
+
{option?.with_half_option && state?.selected && (
|
|
113
|
+
<PositionControl>
|
|
115
114
|
<>
|
|
116
115
|
<Circle disabled={disabled} onPress={() => changePosition('left')}>
|
|
117
116
|
<OIcon
|
|
118
117
|
src={theme.images.general.half_l}
|
|
119
118
|
color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
|
|
120
|
-
width={
|
|
119
|
+
width={20}
|
|
120
|
+
height={20}
|
|
121
121
|
style={styles.inverse}
|
|
122
122
|
/>
|
|
123
123
|
</Circle>
|
|
@@ -125,21 +125,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
125
125
|
<OIcon
|
|
126
126
|
src={theme.images.general.half_f}
|
|
127
127
|
color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
|
|
128
|
-
width={
|
|
128
|
+
width={20}
|
|
129
|
+
height={20}
|
|
129
130
|
/>
|
|
130
131
|
</Circle>
|
|
131
132
|
<Circle disabled={disabled} onPress={() => changePosition('right')}>
|
|
132
133
|
<OIcon
|
|
133
134
|
src={theme.images.general.half_r}
|
|
134
135
|
color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
|
|
135
|
-
width={
|
|
136
|
+
width={20}
|
|
137
|
+
height={20}
|
|
136
138
|
/>
|
|
137
139
|
</Circle>
|
|
138
140
|
</>
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
</PositionControl>
|
|
142
|
+
)}
|
|
141
143
|
{price > 0 && (
|
|
142
|
-
<OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
|
|
144
|
+
<OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{width: 70, maxWidth: 70}}>
|
|
143
145
|
+ {parsePrice(price)}
|
|
144
146
|
</OText>
|
|
145
147
|
)}
|
|
@@ -4,35 +4,31 @@ export const Container = styled.TouchableOpacity`
|
|
|
4
4
|
flex-direction: row;
|
|
5
5
|
align-items: center;
|
|
6
6
|
justify-content: space-between;
|
|
7
|
-
padding: 10px;
|
|
8
7
|
width: 100%;
|
|
9
8
|
`
|
|
10
9
|
|
|
11
10
|
export const IconControl = styled.TouchableOpacity`
|
|
12
11
|
flex-direction: row;
|
|
13
|
-
|
|
12
|
+
padding: 10px 0 10px 10px;
|
|
13
|
+
width: 35%;
|
|
14
14
|
align-items: center;
|
|
15
15
|
`
|
|
16
16
|
|
|
17
17
|
export const QuantityControl = styled.View`
|
|
18
18
|
flex-direction: row;
|
|
19
19
|
align-items: center;
|
|
20
|
-
justify-content:
|
|
21
|
-
|
|
22
|
-
flex: 1;
|
|
23
|
-
width: 60px;
|
|
20
|
+
justify-content: space-between;
|
|
21
|
+
width: 62px;
|
|
24
22
|
`
|
|
25
23
|
|
|
26
24
|
export const PositionControl = styled.View`
|
|
27
25
|
flex-direction: row;
|
|
28
26
|
align-items: center;
|
|
29
|
-
margin-right: 5px;
|
|
30
|
-
flex: 1;
|
|
31
27
|
`
|
|
32
28
|
|
|
33
29
|
export const Checkbox = styled.TouchableOpacity`
|
|
34
30
|
`
|
|
35
31
|
|
|
36
32
|
export const Circle = styled.TouchableOpacity`
|
|
37
|
-
margin: 0
|
|
33
|
+
margin: 0 1.5px;
|
|
38
34
|
`
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import {
|
|
3
|
+
useSession,
|
|
4
|
+
useUtils,
|
|
5
|
+
SingleProfessionalCard as SingleProfessionalCardController
|
|
6
|
+
} from 'ordering-components/native'
|
|
7
|
+
import { useTheme } from 'styled-components/native'
|
|
8
|
+
import { StyleSheet, TouchableOpacity, View } from 'react-native'
|
|
9
|
+
import FastImage from 'react-native-fast-image'
|
|
10
|
+
import { OIcon, OText } from '../../shared'
|
|
11
|
+
import IconAntDesign from 'react-native-vector-icons/AntDesign';
|
|
12
|
+
|
|
13
|
+
const SingleProfessionalCardUI = (props) => {
|
|
14
|
+
const {
|
|
15
|
+
professional,
|
|
16
|
+
handleFavoriteProfessional,
|
|
17
|
+
active,
|
|
18
|
+
handleProfessionalClick
|
|
19
|
+
} = props
|
|
20
|
+
|
|
21
|
+
const theme = useTheme()
|
|
22
|
+
const [{ auth }] = useSession()
|
|
23
|
+
const [{ optimizeImage }] = useUtils()
|
|
24
|
+
|
|
25
|
+
const handleChangeFavorite = () => {
|
|
26
|
+
if (auth) {
|
|
27
|
+
handleFavoriteProfessional && handleFavoriteProfessional(!professional?.favorite)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const styles = StyleSheet.create({
|
|
32
|
+
professionalItem: {
|
|
33
|
+
flexDirection: 'row',
|
|
34
|
+
alignItems: 'center',
|
|
35
|
+
borderRadius: 7.6,
|
|
36
|
+
padding: 11,
|
|
37
|
+
borderWidth: 1,
|
|
38
|
+
marginRight: 12,
|
|
39
|
+
minHeight: 64
|
|
40
|
+
},
|
|
41
|
+
photoStyle: {
|
|
42
|
+
width: 42,
|
|
43
|
+
height: 42,
|
|
44
|
+
borderRadius: 7.6
|
|
45
|
+
},
|
|
46
|
+
favoriteIconStyle: {
|
|
47
|
+
width: 16,
|
|
48
|
+
height: 16,
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<TouchableOpacity
|
|
54
|
+
onPress={() => handleProfessionalClick(professional)}
|
|
55
|
+
>
|
|
56
|
+
<View
|
|
57
|
+
style={{
|
|
58
|
+
...styles.professionalItem,
|
|
59
|
+
borderColor: active
|
|
60
|
+
? theme.colors.primary
|
|
61
|
+
: theme.colors.border
|
|
62
|
+
}}
|
|
63
|
+
>
|
|
64
|
+
{professional?.photo ? (
|
|
65
|
+
<FastImage
|
|
66
|
+
style={styles.photoStyle}
|
|
67
|
+
source={{
|
|
68
|
+
uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
|
|
69
|
+
priority: FastImage.priority.normal,
|
|
70
|
+
}}
|
|
71
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
72
|
+
/>
|
|
73
|
+
) : (
|
|
74
|
+
<OIcon
|
|
75
|
+
src={theme?.images?.general?.user}
|
|
76
|
+
cover={false}
|
|
77
|
+
style={styles.photoStyle}
|
|
78
|
+
/>
|
|
79
|
+
)}
|
|
80
|
+
<View style={{ marginLeft: 12 }}>
|
|
81
|
+
<OText
|
|
82
|
+
size={12}
|
|
83
|
+
weight={'400'}
|
|
84
|
+
>
|
|
85
|
+
{professional?.name} {professional?.lastname}
|
|
86
|
+
</OText>
|
|
87
|
+
|
|
88
|
+
<TouchableOpacity
|
|
89
|
+
onPress={() => handleChangeFavorite()}
|
|
90
|
+
>
|
|
91
|
+
{professional?.favorite
|
|
92
|
+
? <IconAntDesign name='heart' size={16} color={theme.colors.danger5} />
|
|
93
|
+
: <IconAntDesign name='hearto' size={16} color={theme.colors.danger5} />
|
|
94
|
+
}
|
|
95
|
+
</TouchableOpacity>
|
|
96
|
+
</View>
|
|
97
|
+
</View>
|
|
98
|
+
</TouchableOpacity>
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const SingleProfessionalCard = (props) => {
|
|
103
|
+
const singleProfessionalCardProps = {
|
|
104
|
+
...props,
|
|
105
|
+
UIComponent: SingleProfessionalCardUI
|
|
106
|
+
}
|
|
107
|
+
return <SingleProfessionalCardController {...singleProfessionalCardProps} />
|
|
108
|
+
}
|