ordering-ui-react-native 0.17.50 → 0.17.51-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 +7 -1
- package/themes/business/index.tsx +2 -0
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
- 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 +29 -2
- package/themes/business/src/components/GoogleMap/index.tsx +58 -57
- package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
- package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
- package/themes/business/src/components/LoginForm/index.tsx +238 -80
- package/themes/business/src/components/LoginForm/styles.tsx +10 -0
- 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/OrderDetails/Delivery.tsx +31 -5
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +93 -50
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
- 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 +18 -17
- 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 +29 -14
- package/themes/business/src/components/StoresList/index.tsx +2 -2
- 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 +32 -2
- package/themes/business/src/utils/index.tsx +44 -1
- package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
- package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
- package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
- package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
- package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
- package/themes/kiosk/src/components/LoginForm/index.tsx +480 -156
- package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
- 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 +3 -2
- package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
- package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
- package/themes/kiosk/src/layouts/Container.tsx +7 -1
- package/themes/kiosk/src/types/index.d.ts +13 -0
- package/themes/kiosk/src/utils/index.tsx +15 -0
- package/themes/original/index.tsx +4 -0
- package/themes/original/src/components/AddressDetails/index.tsx +29 -11
- package/themes/original/src/components/AddressForm/index.tsx +79 -44
- 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 +160 -91
- package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
- 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 +110 -108
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
- package/themes/original/src/components/BusinessListingSearch/index.tsx +352 -326
- 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 +23 -14
- 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 +668 -514
- 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 +95 -80
- package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -11
- package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
- package/themes/original/src/components/Cart/index.tsx +100 -67
- package/themes/original/src/components/CartContent/index.tsx +115 -19
- package/themes/original/src/components/CartContent/styles.tsx +17 -7
- package/themes/original/src/components/Checkout/index.tsx +367 -174
- 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 +15 -4
- 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 +64 -26
- 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 -88
- package/themes/original/src/components/MultiCart/index.tsx +50 -0
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +151 -49
- 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 +18 -18
- 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 +93 -114
- package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
- package/themes/original/src/components/OrderSummary/index.tsx +85 -57
- package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -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 +76 -66
- package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
- package/themes/original/src/components/PageBanner/index.tsx +107 -40
- package/themes/original/src/components/PageBanner/styles.tsx +4 -1
- 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 +64 -7
- package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
- package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
- package/themes/original/src/components/ProductForm/index.tsx +114 -36
- package/themes/original/src/components/ProductForm/styles.tsx +5 -7
- package/themes/original/src/components/ProductItemAccordion/index.tsx +22 -19
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +24 -14
- package/themes/original/src/components/ProductOptionSubOption/styles.tsx +3 -4
- 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 -20
- 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 +72 -34
- package/themes/original/src/components/SingleProductCard/styles.tsx +22 -4
- package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
- package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
- package/themes/original/src/components/StripeElementsForm/index.tsx +67 -34
- 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 +67 -24
- package/themes/original/src/components/Wallets/styles.tsx +3 -4
- package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
- package/themes/original/src/components/shared/OButton.tsx +6 -2
- package/themes/original/src/components/shared/OInput.tsx +16 -2
- 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 -11
- package/themes/original/src/utils/index.tsx +375 -58
- 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: {
|
|
@@ -126,6 +137,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
126
137
|
},
|
|
127
138
|
slide1: {
|
|
128
139
|
flex: 1,
|
|
140
|
+
alignItems: 'center'
|
|
129
141
|
},
|
|
130
142
|
mainSwiper: {
|
|
131
143
|
height: 258,
|
|
@@ -162,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
162
174
|
justifyContent: 'space-between',
|
|
163
175
|
width: '100%',
|
|
164
176
|
marginTop: 10
|
|
177
|
+
},
|
|
178
|
+
wrapperNavbar: {
|
|
179
|
+
paddingHorizontal: 40,
|
|
180
|
+
paddingTop: 0,
|
|
165
181
|
}
|
|
166
182
|
});
|
|
167
183
|
|
|
@@ -169,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
169
185
|
const [, t] = useLanguage();
|
|
170
186
|
const [orderState] = useOrder();
|
|
171
187
|
const [{ auth }] = useSession();
|
|
188
|
+
const [{ configs }] = useConfig()
|
|
172
189
|
const { product, loading, error } = productObject;
|
|
173
190
|
const [gallery, setGallery] = useState([])
|
|
174
191
|
const [thumbsSwiper, setThumbsSwiper] = useState(0)
|
|
@@ -188,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
188
205
|
const [summaryRefHeight, setSummaryRefHeight] = useState(0)
|
|
189
206
|
const [isScrollAvailable, setIsScrollAvailable] = useState(null)
|
|
190
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
|
+
}
|
|
191
221
|
|
|
192
222
|
const isError = (id: number) => {
|
|
193
223
|
let bgColor = theme.colors.white;
|
|
@@ -204,11 +234,12 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
204
234
|
};
|
|
205
235
|
|
|
206
236
|
const handleSaveProduct = () => {
|
|
237
|
+
vibrateApp()
|
|
207
238
|
if (!productCart.quantity) {
|
|
208
239
|
showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
|
|
209
240
|
return
|
|
210
241
|
}
|
|
211
|
-
const isErrors = Object.values(errors)
|
|
242
|
+
const isErrors = Object.values(errors)?.length > 0;
|
|
212
243
|
if (!isErrors) {
|
|
213
244
|
handleSave && handleSave();
|
|
214
245
|
return;
|
|
@@ -227,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
227
258
|
};
|
|
228
259
|
|
|
229
260
|
const handleChangeMainIndex = (index: number) => {
|
|
230
|
-
if (index < 0 || index > gallery
|
|
261
|
+
if (index < 0 || index > gallery?.length - 1) {
|
|
231
262
|
setThumbsSwiper(0)
|
|
232
263
|
return
|
|
233
264
|
}
|
|
@@ -270,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
270
301
|
}
|
|
271
302
|
|
|
272
303
|
const scrollDown = (id: any) => {
|
|
273
|
-
const isErrors = Object.values(errors)
|
|
304
|
+
const isErrors = Object.values(errors)?.length > 0
|
|
274
305
|
if (!isErrors) {
|
|
275
306
|
return
|
|
276
307
|
}
|
|
@@ -284,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
284
315
|
}
|
|
285
316
|
}
|
|
286
317
|
|
|
318
|
+
const handleUpdateGuest = () => {
|
|
319
|
+
const guestToken = uuid.v4()
|
|
320
|
+
if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
|
|
321
|
+
}
|
|
322
|
+
|
|
287
323
|
const handleOnLayout = (event: any, optionId: any) => {
|
|
288
324
|
const _optionLayout = { ...optionLayout }
|
|
289
325
|
const optionKey = 'id:' + optionId
|
|
@@ -294,9 +330,9 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
294
330
|
const saveErrors =
|
|
295
331
|
orderState.loading ||
|
|
296
332
|
maxProductQuantity === 0 ||
|
|
297
|
-
Object.keys(errors)
|
|
333
|
+
Object.keys(errors)?.length > 0;
|
|
334
|
+
|
|
298
335
|
|
|
299
|
-
|
|
300
336
|
const ExtraOptions = ({ eID, options }: any) => (
|
|
301
337
|
<>
|
|
302
338
|
{options.map(({ id, name, respect_to, suboptions }: any) => (
|
|
@@ -336,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
336
372
|
);
|
|
337
373
|
|
|
338
374
|
const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
|
|
339
|
-
|
|
375
|
+
setShowTitle(contentOffset.y > 30)
|
|
340
376
|
const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
|
|
341
377
|
if (_topOption) {
|
|
342
378
|
const _topOptionId = Number(_topOption.replace('id:', ''))
|
|
@@ -357,15 +393,18 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
357
393
|
useEffect(() => {
|
|
358
394
|
const imageList: any = []
|
|
359
395
|
const videoList: any = []
|
|
360
|
-
product?.images?.length > 0
|
|
361
|
-
|
|
396
|
+
imageList.push(product?.images?.length > 0
|
|
397
|
+
? product.images
|
|
398
|
+
: theme?.images?.dummies?.product)
|
|
399
|
+
|
|
400
|
+
if (product?.gallery && product?.gallery?.length > 0) {
|
|
362
401
|
for (const img of product?.gallery) {
|
|
363
402
|
if (img?.file) {
|
|
364
403
|
imageList.push(img?.file)
|
|
365
404
|
}
|
|
366
405
|
if (img?.video) {
|
|
367
406
|
const keys = img?.video.split('/')
|
|
368
|
-
let _videoId = keys[keys
|
|
407
|
+
let _videoId = keys[keys?.length - 1]
|
|
369
408
|
|
|
370
409
|
if (_videoId.includes('watch')) {
|
|
371
410
|
const __url = _videoId.split('=')[1]
|
|
@@ -380,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
380
419
|
} else if (_videoId.search(/\?/i) >= 0) {
|
|
381
420
|
_videoId = _videoId.split('?')[0]
|
|
382
421
|
}
|
|
383
|
-
if ((_videoId
|
|
422
|
+
if ((_videoId?.length === 11)) {
|
|
384
423
|
videoList.push(_videoId)
|
|
385
424
|
}
|
|
386
425
|
}
|
|
@@ -459,9 +498,22 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
459
498
|
height: 44,
|
|
460
499
|
borderColor: theme.colors.primary,
|
|
461
500
|
backgroundColor: theme.colors.white,
|
|
501
|
+
paddingLeft: 0,
|
|
502
|
+
paddingRight: 0
|
|
462
503
|
}}
|
|
463
504
|
/>
|
|
464
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}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
|
|
514
|
+
)}
|
|
515
|
+
</TouchableOpacity>
|
|
516
|
+
)}
|
|
465
517
|
</View>
|
|
466
518
|
)
|
|
467
519
|
}
|
|
@@ -475,14 +527,34 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
475
527
|
}
|
|
476
528
|
}, [])
|
|
477
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])
|
|
478
535
|
|
|
479
536
|
return (
|
|
480
537
|
<SafeAreaView style={{ flex: 1 }}>
|
|
481
|
-
<
|
|
482
|
-
<
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
538
|
+
<View style={styles.wrapperNavbar}>
|
|
539
|
+
<TopHeader>
|
|
540
|
+
<>
|
|
541
|
+
<TopActions onPress={() => handleGoBack()}>
|
|
542
|
+
<OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
|
|
543
|
+
</TopActions>
|
|
544
|
+
{showTitle && (
|
|
545
|
+
<OText
|
|
546
|
+
size={16}
|
|
547
|
+
style={{ flex: 1, textAlign: 'center' }}
|
|
548
|
+
weight={Platform.OS === 'ios' ? '600' : 'bold'}
|
|
549
|
+
numberOfLines={2}
|
|
550
|
+
ellipsizeMode='tail'
|
|
551
|
+
>
|
|
552
|
+
{product?.name}
|
|
553
|
+
</OText>
|
|
554
|
+
)}
|
|
555
|
+
</>
|
|
556
|
+
</TopHeader>
|
|
557
|
+
</View>
|
|
486
558
|
{!error && (
|
|
487
559
|
<ScrollView
|
|
488
560
|
ref={scrollViewRef}
|
|
@@ -531,14 +603,14 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
531
603
|
</View>
|
|
532
604
|
}
|
|
533
605
|
>
|
|
534
|
-
{gallery && gallery
|
|
606
|
+
{gallery && gallery?.length > 0 && gallery.map((img, i) => (
|
|
535
607
|
<View
|
|
536
608
|
style={styles.slide1}
|
|
537
609
|
key={i}
|
|
538
610
|
>
|
|
539
|
-
{String(img).includes('
|
|
611
|
+
{(String(img).includes('http') || typeof img === 'number') ? (
|
|
540
612
|
<FastImage
|
|
541
|
-
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio:
|
|
613
|
+
style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
|
|
542
614
|
source={typeof img !== 'number' ? {
|
|
543
615
|
uri: optimizeImage(img, 'h_1024,c_limit'),
|
|
544
616
|
priority: FastImage.priority.normal,
|
|
@@ -547,7 +619,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
547
619
|
) : (
|
|
548
620
|
<>
|
|
549
621
|
<YoutubePlayer
|
|
550
|
-
height={
|
|
622
|
+
height={'100%'}
|
|
623
|
+
width={'100%'}
|
|
551
624
|
play={playing}
|
|
552
625
|
videoId={img}
|
|
553
626
|
onChangeState={onStateChange}
|
|
@@ -565,7 +638,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
565
638
|
paddingVertical: 15
|
|
566
639
|
}}
|
|
567
640
|
>
|
|
568
|
-
{gallery
|
|
641
|
+
{gallery?.length > 1 && gallery.map((img, index) => (
|
|
569
642
|
<TouchableOpacity
|
|
570
643
|
key={index}
|
|
571
644
|
onPress={() => handleClickThumb(index)}
|
|
@@ -578,7 +651,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
578
651
|
opacity: index === thumbsSwiper ? 1 : 0.8
|
|
579
652
|
}}
|
|
580
653
|
>
|
|
581
|
-
{String(img).includes('
|
|
654
|
+
{String(img).includes('http') ? (
|
|
582
655
|
<OIcon
|
|
583
656
|
url={img}
|
|
584
657
|
style={{
|
|
@@ -593,7 +666,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
593
666
|
/>
|
|
594
667
|
) : (
|
|
595
668
|
<OIcon
|
|
596
|
-
url={'
|
|
669
|
+
url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
|
|
597
670
|
style={{
|
|
598
671
|
borderColor: theme.colors.lightGray,
|
|
599
672
|
borderRadius: 8,
|
|
@@ -613,7 +686,10 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
613
686
|
</>
|
|
614
687
|
)}
|
|
615
688
|
</WrapHeader>
|
|
616
|
-
<ProductSummary
|
|
689
|
+
<ProductSummary
|
|
690
|
+
ph={isChewLayout ? 20 : 40}
|
|
691
|
+
onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
|
|
692
|
+
>
|
|
617
693
|
<ProductTitle>
|
|
618
694
|
{loading && !product ? (
|
|
619
695
|
<Placeholder Animation={Fade}>
|
|
@@ -713,11 +789,11 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
713
789
|
marginBottom: 20,
|
|
714
790
|
borderBottomWidth: 1,
|
|
715
791
|
borderBottomColor: theme.colors.border,
|
|
716
|
-
marginHorizontal: 30,
|
|
792
|
+
marginHorizontal: isChewLayout ? 20 : 30,
|
|
717
793
|
backgroundColor: theme.colors.backgroundPage,
|
|
718
794
|
}}
|
|
719
795
|
>
|
|
720
|
-
{product?.ingredients
|
|
796
|
+
{product?.ingredients?.length > 0 && (
|
|
721
797
|
<TouchableOpacity
|
|
722
798
|
key={`eopt_key_01`}
|
|
723
799
|
onPress={() => {
|
|
@@ -742,7 +818,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
742
818
|
</OText>
|
|
743
819
|
</TouchableOpacity>
|
|
744
820
|
)}
|
|
745
|
-
{product?.extras
|
|
821
|
+
{product?.extras?.map((extra: any) =>
|
|
746
822
|
<ExtraOptions key={extra.id} options={extra.options} />
|
|
747
823
|
)}
|
|
748
824
|
</ExtraOptionWrap>
|
|
@@ -787,12 +863,13 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
787
863
|
</>
|
|
788
864
|
) : (
|
|
789
865
|
<ProductEditions
|
|
866
|
+
style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
|
|
790
867
|
onLayout={(event: any) => {
|
|
791
868
|
setEditionsLayoutY(event.nativeEvent.layout?.y)
|
|
792
869
|
}}
|
|
793
870
|
>
|
|
794
871
|
<>
|
|
795
|
-
{product?.ingredients
|
|
872
|
+
{product?.ingredients?.length > 0 && (
|
|
796
873
|
<View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
|
|
797
874
|
<SectionTitle>
|
|
798
875
|
<OText size={16}>
|
|
@@ -814,8 +891,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
814
891
|
</WrapperIngredients>
|
|
815
892
|
</View>
|
|
816
893
|
)}
|
|
817
|
-
{product?.extras
|
|
818
|
-
extra.options
|
|
894
|
+
{product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
|
|
895
|
+
extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
|
|
819
896
|
const currentState =
|
|
820
897
|
productCart.options[`id:${option.id}`] || {};
|
|
821
898
|
return (
|
|
@@ -831,7 +908,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
831
908
|
backgroundColor: isError(option.id),
|
|
832
909
|
borderRadius: 7.6
|
|
833
910
|
}}>
|
|
834
|
-
{option
|
|
911
|
+
{option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
|
|
835
912
|
(suboption: any) => {
|
|
836
913
|
const currentState =
|
|
837
914
|
productCart.options[
|
|
@@ -896,7 +973,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
896
973
|
)}
|
|
897
974
|
</ProductEditions>
|
|
898
975
|
)}
|
|
899
|
-
{!!error && error
|
|
976
|
+
{!!error && error?.length > 0 && (
|
|
900
977
|
<NotFoundSource content={error[0]?.message || error[0]} />
|
|
901
978
|
)}
|
|
902
979
|
</ScrollView>
|
|
@@ -919,7 +996,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
919
996
|
disabled={productCart.quantity === 1 || !productCart.quantity || isSoldOut || ((productCart?.quantity + productAddedToCartLength) <= product?.minimum_per_order)}>
|
|
920
997
|
<OIcon
|
|
921
998
|
src={theme.images.general.minus}
|
|
922
|
-
width={
|
|
999
|
+
width={20}
|
|
923
1000
|
color={
|
|
924
1001
|
productCart.quantity === 1 || isSoldOut
|
|
925
1002
|
? theme.colors.backgroundGray
|
|
@@ -940,7 +1017,8 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
940
1017
|
borderRadius: 8,
|
|
941
1018
|
borderColor: theme.colors.inputBorderColor,
|
|
942
1019
|
height: 44,
|
|
943
|
-
marginHorizontal: 10
|
|
1020
|
+
marginHorizontal: 10,
|
|
1021
|
+
fontSize: 16
|
|
944
1022
|
}}
|
|
945
1023
|
/>
|
|
946
1024
|
)}
|
|
@@ -963,7 +1041,7 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
963
1041
|
}>
|
|
964
1042
|
<OIcon
|
|
965
1043
|
src={theme.images.general.plus}
|
|
966
|
-
width={
|
|
1044
|
+
width={20}
|
|
967
1045
|
color={
|
|
968
1046
|
maxProductQuantity <= 0 ||
|
|
969
1047
|
(productCart?.quantity + productAddedToCartLength) >= maxProductQuantity ||
|
|
@@ -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`
|
|
@@ -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 ? (
|
|
@@ -87,9 +90,9 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
87
90
|
{option?.allow_suboption_quantity && state?.selected && (
|
|
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>
|
|
@@ -97,9 +100,9 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
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>
|
|
@@ -113,7 +116,8 @@ export const ProductOptionSubOptionUI = (props: any) => {
|
|
|
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
141
|
)}
|
|
136
142
|
</PositionControl>
|
|
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={{ paddingRight: 10 }}>
|
|
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
|
}
|