ordering-ui-react-native 0.17.59 → 0.17.60-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/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 +4 -4
- 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 +270 -245
- package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
- package/themes/business/src/components/BusinessController/index.tsx +0 -1
- package/themes/business/src/components/Chat/index.tsx +125 -113
- package/themes/business/src/components/DriverMap/index.tsx +17 -6
- package/themes/business/src/components/DriverSchedule/index.tsx +42 -5
- 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/NewOrderNotification/index.tsx +35 -21
- 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 +130 -61
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +64 -63
- 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 +113 -121
- package/themes/business/src/components/OrdersOption/index.tsx +32 -75
- package/themes/business/src/components/PreviousOrders/OrderItem.tsx +249 -0
- package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
- package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
- package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
- package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
- package/themes/business/src/components/ReviewCustomer/index.tsx +30 -15
- package/themes/business/src/components/StoresList/index.tsx +3 -4
- package/themes/business/src/components/UserProfileForm/index.tsx +11 -13
- package/themes/business/src/components/shared/OLink.tsx +33 -13
- package/themes/business/src/components/shared/OModal.tsx +16 -9
- package/themes/business/src/components/shared/OText.tsx +8 -2
- package/themes/business/src/types/index.tsx +28 -12
- 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 +4 -0
- package/themes/original/src/components/AddressDetails/index.tsx +28 -10
- package/themes/original/src/components/AddressForm/index.tsx +68 -40
- package/themes/original/src/components/AddressList/index.tsx +27 -22
- package/themes/original/src/components/AddressList/styles.tsx +4 -2
- 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 +122 -68
- package/themes/original/src/components/BusinessController/styles.tsx +23 -4
- 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 +142 -109
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
- package/themes/original/src/components/BusinessListingSearch/index.tsx +352 -326
- 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 +25 -15
- 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 -555
- package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
- package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
- package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
- package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +97 -91
- 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 +77 -50
- package/themes/original/src/components/CartContent/index.tsx +117 -20
- package/themes/original/src/components/CartContent/styles.tsx +17 -7
- package/themes/original/src/components/Checkout/index.tsx +387 -172
- package/themes/original/src/components/Checkout/styles.tsx +4 -2
- package/themes/original/src/components/CitiesControl/index.tsx +89 -0
- package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
- 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 +8 -9
- package/themes/original/src/components/Favorite/styles.tsx +1 -1
- package/themes/original/src/components/FavoriteList/index.tsx +51 -80
- package/themes/original/src/components/FloatingButton/index.tsx +1 -2
- package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
- package/themes/original/src/components/GPSButton/index.tsx +6 -4
- package/themes/original/src/components/GPSButton/styles.ts +3 -3
- package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
- package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
- package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
- package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
- package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
- package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
- package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
- 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 +8 -8
- package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
- package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
- package/themes/original/src/components/HelpGuide/index.tsx +6 -6
- package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
- package/themes/original/src/components/HelpOrder/index.tsx +6 -15
- package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
- 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 +55 -13
- package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
- package/themes/original/src/components/LoginForm/index.tsx +59 -34
- package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
- package/themes/original/src/components/MessageListing/index.tsx +16 -42
- package/themes/original/src/components/Messages/index.tsx +32 -10
- package/themes/original/src/components/MomentOption/index.tsx +195 -90
- package/themes/original/src/components/MomentSelector/index.tsx +1 -1
- package/themes/original/src/components/MultiCart/index.tsx +50 -0
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -51
- package/themes/original/src/components/MultiCheckout/index.tsx +308 -88
- 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 +68 -21
- package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
- package/themes/original/src/components/MyOrders/index.tsx +77 -52
- package/themes/original/src/components/NavBar/index.tsx +20 -17
- package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
- package/themes/original/src/components/Notifications/index.tsx +46 -50
- package/themes/original/src/components/Notifications/styles.tsx +6 -3
- package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
- package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
- package/themes/original/src/components/OrderDetails/index.tsx +190 -358
- 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 +33 -59
- package/themes/original/src/components/OrderSummary/index.tsx +88 -59
- package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
- package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
- package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
- package/themes/original/src/components/OrdersOption/index.tsx +78 -67
- package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
- package/themes/original/src/components/PageBanner/index.tsx +106 -31
- package/themes/original/src/components/PageBanner/styles.tsx +4 -4
- 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 +78 -35
- package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
- package/themes/original/src/components/ProductForm/index.tsx +114 -35
- package/themes/original/src/components/ProductForm/styles.tsx +6 -8
- package/themes/original/src/components/ProductItemAccordion/index.tsx +22 -19
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +34 -24
- package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -10
- 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 +234 -220
- package/themes/original/src/components/Promotions/styles.tsx +10 -3
- package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
- package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
- package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
- package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
- package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
- package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
- package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
- package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
- package/themes/original/src/components/ServiceForm/index.tsx +66 -17
- 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 +130 -52
- package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
- package/themes/original/src/components/SingleProductCard/index.tsx +71 -34
- package/themes/original/src/components/SingleProductCard/styles.tsx +21 -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 +8 -4
- package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
- package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
- package/themes/original/src/components/UserProfile/index.tsx +88 -79
- package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
- package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
- 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 +66 -30
- package/themes/original/src/components/Wallets/styles.tsx +3 -4
- package/themes/original/src/components/shared/HeaderTitle.tsx +1 -1
- 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/layouts/Container.tsx +1 -1
- package/themes/original/src/types/index.tsx +40 -10
- package/themes/original/src/utils/index.tsx +273 -1
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
|
@@ -18,8 +18,11 @@ import {
|
|
|
18
18
|
useOrder,
|
|
19
19
|
useUtils,
|
|
20
20
|
ToastType,
|
|
21
|
-
useToast
|
|
21
|
+
useToast,
|
|
22
|
+
useConfig,
|
|
23
|
+
useEvent
|
|
22
24
|
} from 'ordering-components/native';
|
|
25
|
+
import uuid from 'react-native-uuid';
|
|
23
26
|
import { useTheme } from 'styled-components/native';
|
|
24
27
|
import { ProductIngredient } from '../ProductIngredient';
|
|
25
28
|
import { ProductOption } from '../ProductOption';
|
|
@@ -27,6 +30,7 @@ import Swiper from 'react-native-swiper'
|
|
|
27
30
|
import FastImage from 'react-native-fast-image';
|
|
28
31
|
import IconAntDesign from 'react-native-vector-icons/AntDesign';
|
|
29
32
|
import YoutubePlayer from "react-native-youtube-iframe"
|
|
33
|
+
import ReactNativeHapticFeedback from "react-native-haptic-feedback";
|
|
30
34
|
|
|
31
35
|
import {
|
|
32
36
|
WrapHeader,
|
|
@@ -50,6 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
|
|
|
50
54
|
import { ProductOptionSubOption } from '../ProductOptionSubOption';
|
|
51
55
|
import { NotFoundSource } from '../NotFoundSource';
|
|
52
56
|
import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
|
|
57
|
+
import NavBar from '../NavBar';
|
|
58
|
+
import { orderTypeList, vibrateApp } from '../../utils';
|
|
53
59
|
const windowWidth = Dimensions.get('window').width;
|
|
54
60
|
|
|
55
61
|
export const ProductOptionsUI = (props: any) => {
|
|
@@ -69,11 +75,16 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
69
75
|
handleChangeSuboptionState,
|
|
70
76
|
handleChangeCommentState,
|
|
71
77
|
productObject,
|
|
72
|
-
productAddedToCartLength
|
|
78
|
+
productAddedToCartLength,
|
|
79
|
+
actionStatus,
|
|
80
|
+
handleCreateGuestUser
|
|
73
81
|
} = props;
|
|
74
82
|
|
|
75
83
|
const theme = useTheme();
|
|
76
84
|
const [, { showToast }] = useToast()
|
|
85
|
+
const [events] = useEvent()
|
|
86
|
+
|
|
87
|
+
const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
|
|
77
88
|
|
|
78
89
|
const styles = StyleSheet.create({
|
|
79
90
|
mainContainer: {
|
|
@@ -163,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
163
174
|
justifyContent: 'space-between',
|
|
164
175
|
width: '100%',
|
|
165
176
|
marginTop: 10
|
|
177
|
+
},
|
|
178
|
+
wrapperNavbar: {
|
|
179
|
+
paddingHorizontal: 30,
|
|
180
|
+
paddingTop: 0,
|
|
166
181
|
}
|
|
167
182
|
});
|
|
168
183
|
|
|
@@ -170,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
170
185
|
const [, t] = useLanguage();
|
|
171
186
|
const [orderState] = useOrder();
|
|
172
187
|
const [{ auth }] = useSession();
|
|
188
|
+
const [{ configs }] = useConfig()
|
|
173
189
|
const { product, loading, error } = productObject;
|
|
174
190
|
const [gallery, setGallery] = useState([])
|
|
175
191
|
const [thumbsSwiper, setThumbsSwiper] = useState(0)
|
|
@@ -189,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
189
205
|
const [summaryRefHeight, setSummaryRefHeight] = useState(0)
|
|
190
206
|
const [isScrollAvailable, setIsScrollAvailable] = useState(null)
|
|
191
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
|
+
}
|
|
192
221
|
|
|
193
222
|
const isError = (id: number) => {
|
|
194
223
|
let bgColor = theme.colors.white;
|
|
@@ -205,11 +234,12 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
205
234
|
};
|
|
206
235
|
|
|
207
236
|
const handleSaveProduct = () => {
|
|
237
|
+
vibrateApp()
|
|
208
238
|
if (!productCart.quantity) {
|
|
209
239
|
showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
|
|
210
240
|
return
|
|
211
241
|
}
|
|
212
|
-
const isErrors = Object.values(errors)
|
|
242
|
+
const isErrors = Object.values(errors)?.length > 0;
|
|
213
243
|
if (!isErrors) {
|
|
214
244
|
handleSave && handleSave();
|
|
215
245
|
return;
|
|
@@ -228,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
228
258
|
};
|
|
229
259
|
|
|
230
260
|
const handleChangeMainIndex = (index: number) => {
|
|
231
|
-
if (index < 0 || index > gallery
|
|
261
|
+
if (index < 0 || index > gallery?.length - 1) {
|
|
232
262
|
setThumbsSwiper(0)
|
|
233
263
|
return
|
|
234
264
|
}
|
|
@@ -271,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
271
301
|
}
|
|
272
302
|
|
|
273
303
|
const scrollDown = (id: any) => {
|
|
274
|
-
const isErrors = Object.values(errors)
|
|
304
|
+
const isErrors = Object.values(errors)?.length > 0
|
|
275
305
|
if (!isErrors) {
|
|
276
306
|
return
|
|
277
307
|
}
|
|
@@ -285,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
285
315
|
}
|
|
286
316
|
}
|
|
287
317
|
|
|
318
|
+
const handleUpdateGuest = () => {
|
|
319
|
+
const guestToken = uuid.v4()
|
|
320
|
+
if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
|
|
321
|
+
}
|
|
322
|
+
|
|
288
323
|
const handleOnLayout = (event: any, optionId: any) => {
|
|
289
324
|
const _optionLayout = { ...optionLayout }
|
|
290
325
|
const optionKey = 'id:' + optionId
|
|
@@ -295,9 +330,9 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
295
330
|
const saveErrors =
|
|
296
331
|
orderState.loading ||
|
|
297
332
|
maxProductQuantity === 0 ||
|
|
298
|
-
Object.keys(errors)
|
|
333
|
+
Object.keys(errors)?.length > 0;
|
|
334
|
+
|
|
299
335
|
|
|
300
|
-
|
|
301
336
|
const ExtraOptions = ({ eID, options }: any) => (
|
|
302
337
|
<>
|
|
303
338
|
{options.map(({ id, name, respect_to, suboptions }: any) => (
|
|
@@ -337,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
337
372
|
);
|
|
338
373
|
|
|
339
374
|
const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
|
|
340
|
-
|
|
375
|
+
setShowTitle(contentOffset.y > 30)
|
|
341
376
|
const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
|
|
342
377
|
if (_topOption) {
|
|
343
378
|
const _topOptionId = Number(_topOption.replace('id:', ''))
|
|
@@ -358,15 +393,18 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
358
393
|
useEffect(() => {
|
|
359
394
|
const imageList: any = []
|
|
360
395
|
const videoList: any = []
|
|
361
|
-
product?.images?.length > 0
|
|
362
|
-
|
|
396
|
+
imageList.push(product?.images?.length > 0
|
|
397
|
+
? product.images
|
|
398
|
+
: theme?.images?.dummies?.product)
|
|
399
|
+
|
|
400
|
+
if (product?.gallery && product?.gallery?.length > 0) {
|
|
363
401
|
for (const img of product?.gallery) {
|
|
364
402
|
if (img?.file) {
|
|
365
403
|
imageList.push(img?.file)
|
|
366
404
|
}
|
|
367
405
|
if (img?.video) {
|
|
368
406
|
const keys = img?.video.split('/')
|
|
369
|
-
let _videoId = keys[keys
|
|
407
|
+
let _videoId = keys[keys?.length - 1]
|
|
370
408
|
|
|
371
409
|
if (_videoId.includes('watch')) {
|
|
372
410
|
const __url = _videoId.split('=')[1]
|
|
@@ -381,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
381
419
|
} else if (_videoId.search(/\?/i) >= 0) {
|
|
382
420
|
_videoId = _videoId.split('?')[0]
|
|
383
421
|
}
|
|
384
|
-
if ((_videoId
|
|
422
|
+
if ((_videoId?.length === 11)) {
|
|
385
423
|
videoList.push(_videoId)
|
|
386
424
|
}
|
|
387
425
|
}
|
|
@@ -455,14 +493,27 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
455
493
|
: t('LOGIN_SIGNUP', 'Login / Sign Up')
|
|
456
494
|
}
|
|
457
495
|
imgRightSrc=""
|
|
458
|
-
textStyle={{ color: theme.colors.primary, fontSize:
|
|
496
|
+
textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
|
|
459
497
|
style={{
|
|
460
|
-
height:
|
|
498
|
+
height: 42,
|
|
461
499
|
borderColor: theme.colors.primary,
|
|
462
500
|
backgroundColor: theme.colors.white,
|
|
501
|
+
paddingLeft: 0,
|
|
502
|
+
paddingRight: 0
|
|
463
503
|
}}
|
|
464
504
|
/>
|
|
465
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
|
+
)}
|
|
466
517
|
</View>
|
|
467
518
|
)
|
|
468
519
|
}
|
|
@@ -476,14 +527,37 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
476
527
|
}
|
|
477
528
|
}, [])
|
|
478
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])
|
|
479
535
|
|
|
480
536
|
return (
|
|
481
537
|
<SafeAreaView style={{ flex: 1 }}>
|
|
482
|
-
<
|
|
483
|
-
<
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
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>
|
|
487
561
|
{!error && (
|
|
488
562
|
<ScrollView
|
|
489
563
|
ref={scrollViewRef}
|
|
@@ -532,14 +606,14 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
532
606
|
</View>
|
|
533
607
|
}
|
|
534
608
|
>
|
|
535
|
-
{gallery && gallery
|
|
609
|
+
{gallery && gallery?.length > 0 && gallery.map((img, i) => (
|
|
536
610
|
<View
|
|
537
611
|
style={styles.slide1}
|
|
538
612
|
key={i}
|
|
539
613
|
>
|
|
540
|
-
{String(img).includes('
|
|
614
|
+
{(String(img).includes('http') || typeof img === 'number') ? (
|
|
541
615
|
<FastImage
|
|
542
|
-
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio:
|
|
616
|
+
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 4 / 3 }}
|
|
543
617
|
source={typeof img !== 'number' ? {
|
|
544
618
|
uri: optimizeImage(img, 'h_1024,c_limit'),
|
|
545
619
|
priority: FastImage.priority.normal,
|
|
@@ -548,7 +622,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
548
622
|
) : (
|
|
549
623
|
<>
|
|
550
624
|
<YoutubePlayer
|
|
551
|
-
height={
|
|
625
|
+
height={'100%'}
|
|
626
|
+
width={'100%'}
|
|
552
627
|
play={playing}
|
|
553
628
|
videoId={img}
|
|
554
629
|
onChangeState={onStateChange}
|
|
@@ -566,7 +641,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
566
641
|
paddingVertical: 15
|
|
567
642
|
}}
|
|
568
643
|
>
|
|
569
|
-
{gallery
|
|
644
|
+
{gallery?.length > 1 && gallery.map((img, index) => (
|
|
570
645
|
<TouchableOpacity
|
|
571
646
|
key={index}
|
|
572
647
|
onPress={() => handleClickThumb(index)}
|
|
@@ -579,7 +654,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
579
654
|
opacity: index === thumbsSwiper ? 1 : 0.8
|
|
580
655
|
}}
|
|
581
656
|
>
|
|
582
|
-
{String(img).includes('
|
|
657
|
+
{String(img).includes('http') ? (
|
|
583
658
|
<OIcon
|
|
584
659
|
url={img}
|
|
585
660
|
style={{
|
|
@@ -594,7 +669,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
594
669
|
/>
|
|
595
670
|
) : (
|
|
596
671
|
<OIcon
|
|
597
|
-
url={'
|
|
672
|
+
url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
|
|
598
673
|
style={{
|
|
599
674
|
borderColor: theme.colors.lightGray,
|
|
600
675
|
borderRadius: 8,
|
|
@@ -614,7 +689,10 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
614
689
|
</>
|
|
615
690
|
)}
|
|
616
691
|
</WrapHeader>
|
|
617
|
-
<ProductSummary
|
|
692
|
+
<ProductSummary
|
|
693
|
+
ph={isChewLayout ? 20 : 30}
|
|
694
|
+
onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
|
|
695
|
+
>
|
|
618
696
|
<ProductTitle>
|
|
619
697
|
{loading && !product ? (
|
|
620
698
|
<Placeholder Animation={Fade}>
|
|
@@ -714,11 +792,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
714
792
|
marginBottom: 20,
|
|
715
793
|
borderBottomWidth: 1,
|
|
716
794
|
borderBottomColor: theme.colors.border,
|
|
717
|
-
marginHorizontal:
|
|
795
|
+
marginHorizontal: 20,
|
|
718
796
|
backgroundColor: theme.colors.backgroundPage,
|
|
719
797
|
}}
|
|
720
798
|
>
|
|
721
|
-
{product?.ingredients
|
|
799
|
+
{product?.ingredients?.length > 0 && (
|
|
722
800
|
<TouchableOpacity
|
|
723
801
|
key={`eopt_key_01`}
|
|
724
802
|
onPress={() => {
|
|
@@ -743,7 +821,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
743
821
|
</OText>
|
|
744
822
|
</TouchableOpacity>
|
|
745
823
|
)}
|
|
746
|
-
{product?.extras
|
|
824
|
+
{product?.extras?.map((extra: any) =>
|
|
747
825
|
<ExtraOptions key={extra.id} options={extra.options} />
|
|
748
826
|
)}
|
|
749
827
|
</ExtraOptionWrap>
|
|
@@ -788,12 +866,13 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
788
866
|
</>
|
|
789
867
|
) : (
|
|
790
868
|
<ProductEditions
|
|
869
|
+
style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
|
|
791
870
|
onLayout={(event: any) => {
|
|
792
871
|
setEditionsLayoutY(event.nativeEvent.layout?.y)
|
|
793
872
|
}}
|
|
794
873
|
>
|
|
795
874
|
<>
|
|
796
|
-
{product?.ingredients
|
|
875
|
+
{product?.ingredients?.length > 0 && (
|
|
797
876
|
<View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
|
|
798
877
|
<SectionTitle>
|
|
799
878
|
<OText size={16}>
|
|
@@ -815,8 +894,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
815
894
|
</WrapperIngredients>
|
|
816
895
|
</View>
|
|
817
896
|
)}
|
|
818
|
-
{product?.extras
|
|
819
|
-
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) => {
|
|
820
899
|
const currentState =
|
|
821
900
|
productCart.options[`id:${option.id}`] || {};
|
|
822
901
|
return (
|
|
@@ -832,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
832
911
|
backgroundColor: isError(option.id),
|
|
833
912
|
borderRadius: 7.6
|
|
834
913
|
}}>
|
|
835
|
-
{option
|
|
914
|
+
{option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
|
|
836
915
|
(suboption: any) => {
|
|
837
916
|
const currentState =
|
|
838
917
|
productCart.options[
|
|
@@ -897,7 +976,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
897
976
|
)}
|
|
898
977
|
</ProductEditions>
|
|
899
978
|
)}
|
|
900
|
-
{!!error && error
|
|
979
|
+
{!!error && error?.length > 0 && (
|
|
901
980
|
<NotFoundSource content={error[0]?.message || error[0]} />
|
|
902
981
|
)}
|
|
903
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`
|
|
@@ -44,12 +44,10 @@ export const ProductTitle = styled.View`
|
|
|
44
44
|
padding-bottom: 7px;
|
|
45
45
|
`
|
|
46
46
|
|
|
47
|
-
export const ProductDescription = styled.View
|
|
48
|
-
margin-bottom: 20px;
|
|
49
|
-
`
|
|
47
|
+
export const ProductDescription = styled.View``
|
|
50
48
|
|
|
51
49
|
export const ProductEditions = styled.View`
|
|
52
|
-
padding: 0
|
|
50
|
+
padding-vertical: 0;
|
|
53
51
|
`
|
|
54
52
|
|
|
55
53
|
export const SectionTitle = styled.View`
|
|
@@ -72,7 +70,7 @@ export const ProductActions = styled.View`
|
|
|
72
70
|
position: absolute;
|
|
73
71
|
bottom: 0px;
|
|
74
72
|
padding-top: ${(props: any) => props.ios ? '20px' : '0'};
|
|
75
|
-
padding-horizontal:
|
|
73
|
+
padding-horizontal: 30px;
|
|
76
74
|
padding-vertical: 20px;
|
|
77
75
|
width: 100%;
|
|
78
76
|
flex-direction: ${(props: any) => props.isColumn ? 'column' : 'row'};
|
|
@@ -96,7 +94,7 @@ export const WeightUnitItem = styled.View`
|
|
|
96
94
|
`}
|
|
97
95
|
`
|
|
98
96
|
export const ProductSummary = styled.View`
|
|
99
|
-
padding: 26px
|
|
97
|
+
padding: 26px ${(props: any) => props.ph}px 0;
|
|
100
98
|
position: relative;
|
|
101
99
|
background-color: white;
|
|
102
100
|
z-index: 100;
|
|
@@ -27,6 +27,7 @@ import { ProductItemAccordionParams } from '../../types'
|
|
|
27
27
|
export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
28
28
|
|
|
29
29
|
const {
|
|
30
|
+
isDisabledEdit,
|
|
30
31
|
isCartPending,
|
|
31
32
|
isCartProduct,
|
|
32
33
|
product,
|
|
@@ -76,6 +77,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
76
77
|
const [isServiceOpen, setIsServiceOpen] = useState(false)
|
|
77
78
|
// const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
|
|
78
79
|
// const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
|
|
80
|
+
const [productQuantity, setProductQuantity] = useState(product.quantity.toString())
|
|
79
81
|
|
|
80
82
|
const productInfo = () => {
|
|
81
83
|
if (isCartProduct) {
|
|
@@ -106,19 +108,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
106
108
|
/* const toggleAccordion = () => {
|
|
107
109
|
if ((!product?.valid_menu && isCartProduct)) return
|
|
108
110
|
if (isActive) {
|
|
109
|
-
|
|
111
|
+
Animated.timing(setHeight.height, {
|
|
110
112
|
toValue: 100,
|
|
111
113
|
duration: 500,
|
|
112
114
|
easing: Easing.linear,
|
|
113
115
|
useNativeDriver: false,
|
|
114
|
-
|
|
116
|
+
}).start()
|
|
115
117
|
} else {
|
|
116
|
-
|
|
118
|
+
setHeightState({height: new Animated.Value(0)})
|
|
117
119
|
}
|
|
118
120
|
}*/
|
|
119
121
|
|
|
120
122
|
const handleChangeQuantity = (value: string) => {
|
|
121
123
|
if (!orderState.loading) {
|
|
124
|
+
setProductQuantity(value)
|
|
122
125
|
if (parseInt(value) === 0) {
|
|
123
126
|
onDeleteProduct && onDeleteProduct(product)
|
|
124
127
|
} else {
|
|
@@ -133,7 +136,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
133
136
|
}
|
|
134
137
|
|
|
135
138
|
/*useEffect(() => {
|
|
136
|
-
|
|
139
|
+
toggleAccordion()
|
|
137
140
|
}, [isActive])*/
|
|
138
141
|
|
|
139
142
|
const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
|
|
@@ -203,12 +206,12 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
203
206
|
</View>
|
|
204
207
|
) : (
|
|
205
208
|
<>
|
|
206
|
-
{isCartProduct && !isCartPending && getProductMax && (
|
|
209
|
+
{!isDisabledEdit && isCartProduct && !isCartPending && getProductMax && (
|
|
207
210
|
<ProductInfo>
|
|
208
211
|
<RNPickerSelect
|
|
209
212
|
items={productOptions}
|
|
210
213
|
onValueChange={handleChangeQuantity}
|
|
211
|
-
value={
|
|
214
|
+
value={productQuantity}
|
|
212
215
|
style={pickerStyle}
|
|
213
216
|
useNativeAndroidPickerStyle={false}
|
|
214
217
|
placeholder={{}}
|
|
@@ -225,23 +228,23 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
225
228
|
</ProductQuantity>
|
|
226
229
|
)}
|
|
227
230
|
<View style={{ flex: 1 }}>
|
|
228
|
-
<OText size={12} lineHeight={18} weight={'400'}>{product.name}</OText>
|
|
231
|
+
<OText size={12} lineHeight={18} weight={'400'} mLeft={8}>{product.name}</OText>
|
|
229
232
|
</View>
|
|
230
233
|
</>
|
|
231
234
|
)}
|
|
232
235
|
<View style={{ display: 'flex', flexDirection: 'column', flex: 1, alignItems: 'flex-end', maxWidth: 100 }}>
|
|
233
236
|
<View style={{ flexDirection: 'row' }}>
|
|
234
237
|
<OText size={12} lineHeight={18} weight={'400'}>{parsePrice(product.total || product.price)}</OText>
|
|
235
|
-
{(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || product.comment) && (
|
|
238
|
+
{(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || !!product.comment) && (
|
|
236
239
|
<MaterialCommunityIcon name='chevron-down' size={18} />
|
|
237
240
|
)}
|
|
238
241
|
</View>
|
|
239
|
-
<View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start' }}>
|
|
240
|
-
{onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
|
|
241
|
-
<TouchableOpacity onPress={() => handleEditProduct(product)} style={{
|
|
242
|
-
<
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
<View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', height: 20 }}>
|
|
243
|
+
{!isDisabledEdit && onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
|
|
244
|
+
<TouchableOpacity onPress={() => handleEditProduct(product)} style={{ marginRight: 5 }}>
|
|
245
|
+
<MaterialCommunityIcon
|
|
246
|
+
name='pencil-outline'
|
|
247
|
+
size={20}
|
|
245
248
|
color={theme.colors.textSecondary}
|
|
246
249
|
/>
|
|
247
250
|
</TouchableOpacity>
|
|
@@ -252,9 +255,9 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
252
255
|
message={t('QUESTION_DELETE_PRODUCT', 'Are you sure that you want to delete the product?')}
|
|
253
256
|
onAccept={() => onDeleteProduct(product)}
|
|
254
257
|
>
|
|
255
|
-
<
|
|
256
|
-
|
|
257
|
-
|
|
258
|
+
<MaterialCommunityIcon
|
|
259
|
+
name='trash-can-outline'
|
|
260
|
+
size={20}
|
|
258
261
|
color={theme.colors.textSecondary}
|
|
259
262
|
/>
|
|
260
263
|
</OAlert>
|
|
@@ -286,7 +289,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
286
289
|
)}
|
|
287
290
|
{productInfo().options.length > 0 && (
|
|
288
291
|
<ProductOptionsList>
|
|
289
|
-
{productInfo().options.map((option: any, i: number) => (
|
|
292
|
+
{productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any, i: number) => (
|
|
290
293
|
<ProductOption key={option.id + i}>
|
|
291
294
|
<OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
|
|
292
295
|
{option.suboptions.map((suboption: any) => (
|
|
@@ -305,7 +308,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
|
|
|
305
308
|
))}
|
|
306
309
|
</ProductOptionsList>
|
|
307
310
|
)}
|
|
308
|
-
{product.comment && (
|
|
311
|
+
{!!product.comment && (
|
|
309
312
|
<ProductComment>
|
|
310
313
|
<OText size={10} color={theme.colors.textSecondary}>{t('SPECIAL_COMMENT', 'Special Comment')}</OText>
|
|
311
314
|
<OText size={10} color={theme.colors.textThird}>{product.comment}</OText>
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from 'ordering-components/native'
|
|
7
7
|
import { useTheme } from 'styled-components/native';
|
|
8
8
|
import { StyleSheet, View } from 'react-native'
|
|
9
|
+
import IconAntDesign from 'react-native-vector-icons/AntDesign';
|
|
9
10
|
|
|
10
11
|
import {
|
|
11
12
|
Container,
|
|
@@ -31,15 +32,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
31
32
|
setIsScrollAvailable
|
|
32
33
|
} = props
|
|
33
34
|
|
|
34
|
-
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)
|
|
35
36
|
const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
|
|
36
|
-
|
|
37
|
+
|
|
37
38
|
const theme = useTheme();
|
|
38
39
|
const [, t] = useLanguage()
|
|
39
40
|
const [{ parsePrice }] = useUtils()
|
|
40
41
|
const [showMessage, setShowMessage] = useState(false)
|
|
41
42
|
const [isDirty, setIsDirty] = useState(false)
|
|
42
43
|
|
|
44
|
+
const iconsSize = 20
|
|
45
|
+
|
|
43
46
|
const handleSuboptionClick = () => {
|
|
44
47
|
toggleSelect()
|
|
45
48
|
setIsDirty(true)
|
|
@@ -64,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
64
67
|
|
|
65
68
|
return (
|
|
66
69
|
<View>
|
|
67
|
-
<Container onPress={() => handleSuboptionClick()}>
|
|
70
|
+
<Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
|
|
68
71
|
<IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
|
|
69
72
|
{((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
|
|
70
73
|
state?.selected ? (
|
|
@@ -79,41 +82,42 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
79
82
|
<OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
|
|
80
83
|
)
|
|
81
84
|
)}
|
|
82
|
-
<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 }}>
|
|
83
86
|
{suboption?.name}
|
|
84
87
|
</OText>
|
|
85
88
|
</IconControl>
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
{option?.allow_suboption_quantity && state?.selected && (
|
|
90
|
+
<QuantityControl>
|
|
88
91
|
<>
|
|
89
92
|
<Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
|
|
90
|
-
<
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
<IconAntDesign
|
|
94
|
+
name='minuscircleo'
|
|
95
|
+
size={iconsSize}
|
|
93
96
|
color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
|
|
94
97
|
/>
|
|
95
98
|
</Checkbox>
|
|
96
|
-
<OText size={12}
|
|
99
|
+
<OText size={12}>
|
|
97
100
|
{state.quantity}
|
|
98
101
|
</OText>
|
|
99
102
|
<Checkbox disabled={disabled || disableIncrement} onPress={increment}>
|
|
100
|
-
<
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
<IconAntDesign
|
|
104
|
+
name='pluscircleo'
|
|
105
|
+
size={iconsSize}
|
|
103
106
|
color={disableIncrement || disabled ? theme.colors.disabled : theme.colors.primary}
|
|
104
107
|
/>
|
|
105
108
|
</Checkbox>
|
|
106
109
|
</>
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
</QuantityControl>
|
|
111
|
+
)}
|
|
112
|
+
{option?.with_half_option && state?.selected && (
|
|
113
|
+
<PositionControl>
|
|
111
114
|
<>
|
|
112
115
|
<Circle disabled={disabled} onPress={() => changePosition('left')}>
|
|
113
116
|
<OIcon
|
|
114
117
|
src={theme.images.general.half_l}
|
|
115
118
|
color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
|
|
116
|
-
width={
|
|
119
|
+
width={20}
|
|
120
|
+
height={20}
|
|
117
121
|
style={styles.inverse}
|
|
118
122
|
/>
|
|
119
123
|
</Circle>
|
|
@@ -121,26 +125,32 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
121
125
|
<OIcon
|
|
122
126
|
src={theme.images.general.half_f}
|
|
123
127
|
color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
|
|
124
|
-
width={
|
|
128
|
+
width={20}
|
|
129
|
+
height={20}
|
|
125
130
|
/>
|
|
126
131
|
</Circle>
|
|
127
132
|
<Circle disabled={disabled} onPress={() => changePosition('right')}>
|
|
128
133
|
<OIcon
|
|
129
134
|
src={theme.images.general.half_r}
|
|
130
135
|
color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
|
|
131
|
-
width={
|
|
136
|
+
width={20}
|
|
137
|
+
height={20}
|
|
132
138
|
/>
|
|
133
139
|
</Circle>
|
|
134
140
|
</>
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
</PositionControl>
|
|
142
|
+
)}
|
|
137
143
|
{price > 0 && (
|
|
138
|
-
<OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
|
|
144
|
+
<OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{width: 70, maxWidth: 70}}>
|
|
139
145
|
+ {parsePrice(price)}
|
|
140
146
|
</OText>
|
|
141
147
|
)}
|
|
142
148
|
</Container>
|
|
143
|
-
{showMessage &&
|
|
149
|
+
{showMessage && (
|
|
150
|
+
<OText size={10} mLeft={4} mRight={4} style={{ flex: 1, textAlign: 'center' }} color={theme.colors.primary}>
|
|
151
|
+
{`${t('OPTIONS_MAX_LIMIT', 'Maximum options to choose')}: ${option?.max}`}
|
|
152
|
+
</OText>
|
|
153
|
+
)}
|
|
144
154
|
</View>
|
|
145
155
|
)
|
|
146
156
|
}
|