ordering-ui-react-native 0.14.39 → 0.14.41-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.
Files changed (51) hide show
  1. package/package.json +2 -2
  2. package/src/components/BusinessItemAccordion/index.tsx +2 -2
  3. package/src/components/Cart/index.tsx +135 -42
  4. package/src/components/Cart/styles.tsx +7 -0
  5. package/src/components/Checkout/index.tsx +28 -166
  6. package/src/components/OrderDetails/index.tsx +102 -34
  7. package/src/components/OrderDetails/styles.tsx +7 -0
  8. package/src/components/OrderSummary/index.tsx +140 -37
  9. package/src/components/OrderSummary/styles.tsx +10 -2
  10. package/src/components/PaymentOptions/index.tsx +3 -1
  11. package/src/components/PaymentOptionsWebView/index.tsx +150 -0
  12. package/src/components/ProductForm/index.tsx +6 -6
  13. package/src/components/SingleProductCard/index.tsx +1 -1
  14. package/src/components/StripeElementsForm/index.tsx +28 -13
  15. package/src/components/TaxInformation/index.tsx +58 -26
  16. package/src/components/VerifyPhone/styles.tsx +1 -2
  17. package/src/components/shared/OIcon.tsx +4 -1
  18. package/src/index.tsx +2 -0
  19. package/src/navigators/HomeNavigator.tsx +6 -0
  20. package/src/pages/ProductDetails.tsx +55 -0
  21. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  22. package/themes/kiosk/src/components/Cart/index.tsx +14 -21
  23. package/themes/kiosk/src/components/CartItem/index.tsx +9 -7
  24. package/themes/kiosk/src/components/CustomerName/index.tsx +2 -1
  25. package/themes/kiosk/src/components/Intro/index.tsx +4 -4
  26. package/themes/kiosk/src/components/OptionCard/index.tsx +11 -6
  27. package/themes/kiosk/src/components/PaymentOptions/index.tsx +46 -44
  28. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -9
  29. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -2
  30. package/themes/original/src/components/BusinessProductsListing/index.tsx +8 -4
  31. package/themes/original/src/components/BusinessesListing/index.tsx +100 -75
  32. package/themes/original/src/components/Cart/index.tsx +122 -24
  33. package/themes/original/src/components/Cart/styles.tsx +8 -1
  34. package/themes/original/src/components/Checkout/index.tsx +38 -3
  35. package/themes/original/src/components/Help/index.tsx +1 -1
  36. package/themes/original/src/components/MessageListing/index.tsx +4 -2
  37. package/themes/original/src/components/OrderDetails/index.tsx +114 -42
  38. package/themes/original/src/components/OrderDetails/styles.tsx +8 -1
  39. package/themes/original/src/components/OrderProgress/index.tsx +2 -1
  40. package/themes/original/src/components/OrderSummary/index.tsx +132 -23
  41. package/themes/original/src/components/OrderSummary/styles.tsx +7 -0
  42. package/themes/original/src/components/PaymentOptionWallet/index.tsx +6 -2
  43. package/themes/original/src/components/PaymentOptions/index.tsx +8 -2
  44. package/themes/original/src/components/ProductForm/index.tsx +61 -60
  45. package/themes/original/src/components/ProductOptionSubOption/index.tsx +3 -2
  46. package/themes/original/src/components/SingleProductCard/index.tsx +36 -19
  47. package/themes/original/src/components/SingleProductCard/styles.tsx +4 -0
  48. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -13
  49. package/themes/original/src/components/TaxInformation/index.tsx +59 -27
  50. package/themes/original/src/components/UpsellingProducts/index.tsx +26 -18
  51. package/themes/original/src/types/index.tsx +2 -0
@@ -212,7 +212,9 @@ export const ProductOptionsUI = (props: any) => {
212
212
  }
213
213
 
214
214
  const handleRedirectLogin = () => {
215
- navigation.navigate('Login');
215
+ navigation.navigate('Login', {
216
+ store_slug: props.businessSlug
217
+ });
216
218
  };
217
219
 
218
220
  const handleSwitchQtyUnit = (val: string) => {
@@ -289,16 +291,16 @@ export const ProductOptionsUI = (props: any) => {
289
291
  </>
290
292
  );
291
293
 
292
- const handleGoBack = navigation?.canGoBack()
293
- ? () => navigation.goBack()
294
- : () => navigation.navigate('Business', { store: props.businessSlug })
294
+ const handleGoBack = navigation?.canGoBack()
295
+ ? () => navigation.goBack()
296
+ : () => navigation.navigate('Business', { store: props.businessSlug })
295
297
 
296
298
  return (
297
- <SafeAreaView style={{ flex: 1 }}>
298
- <TopHeader>
299
- <TopActions onPress={() => handleGoBack()}>
300
- <OIcon src={theme.images.general.arrow_left} width={15} />
301
- </TopActions>
299
+ <SafeAreaView style={{ flex: 1 }}>
300
+ <TopHeader>
301
+ <TopActions onPress={() => handleGoBack()}>
302
+ <OIcon src={theme.images.general.arrow_left} width={15} />
303
+ </TopActions>
302
304
  </TopHeader>
303
305
  <ScrollView>
304
306
  {!error && (
@@ -349,15 +351,13 @@ export const ProductOptionsUI = (props: any) => {
349
351
  style={styles.slide1}
350
352
  key={i}
351
353
  >
352
- <Grayscale amount={isSoldOut ? 1 : 0}>
353
- <FastImage
354
- style={{ height: '100%' }}
355
- source={{
356
- uri: optimizeImage(img, 'h_258,c_limit'),
357
- priority: FastImage.priority.normal,
358
- }}
359
- />
360
- </Grayscale>
354
+ <FastImage
355
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1 }}
356
+ source={{
357
+ uri: optimizeImage(img, 'h_258,c_limit'),
358
+ priority: FastImage.priority.normal,
359
+ }}
360
+ />
361
361
  </View>
362
362
  ))}
363
363
  </Swiper>
@@ -381,19 +381,18 @@ export const ProductOptionsUI = (props: any) => {
381
381
  opacity: index === thumbsSwiper ? 1 : 0.8
382
382
  }}
383
383
  >
384
- <Grayscale amount={isSoldOut ? 1 : 0}>
385
- <OIcon
386
- url={img}
387
- style={{
388
- borderColor: theme.colors.lightGray,
389
- borderRadius: 8,
390
- minHeight: '100%'
391
- }}
392
- width={56}
393
- height={56}
394
- cover
395
- />
396
- </Grayscale>
384
+ <OIcon
385
+ url={img}
386
+ style={{
387
+ borderColor: theme.colors.lightGray,
388
+ borderRadius: 8,
389
+ minHeight: '100%',
390
+ opacity: isSoldOut ? 0.5 : 1
391
+ }}
392
+ width={56}
393
+ height={56}
394
+ cover
395
+ />
397
396
  </View>
398
397
  </TouchableOpacity>
399
398
 
@@ -425,12 +424,12 @@ export const ProductOptionsUI = (props: any) => {
425
424
  style={{ flex: 1, marginBottom: 10 }}>
426
425
  {product?.name || productCart.name}
427
426
  </OText>
428
- {product?.calories && (
427
+ {!!product?.calories && (
429
428
  <OText size={16} style={{ color: '#808080' }}>{product?.calories} cal
430
429
  </OText>
431
430
  )}
432
431
  </View>
433
- {((product?.sku && product?.sku !== '-1' && product?.sku !== '1') || (product?.estimated_person)) && (
432
+ {((!!product?.sku && product?.sku !== '-1' && product?.sku !== '1') || (!!product?.estimated_person)) && (
434
433
  <OText size={14} style={{ flex: I18nManager.isRTL ? 1 : 0 }} color={'#909BA9'} mBottom={7}>
435
434
  {
436
435
  ((product?.sku && product?.sku !== '-1' && product?.sku !== '1') || (productCart?.sku && productCart?.sku !== '-1' && productCart?.sku !== '1'))
@@ -449,14 +448,14 @@ export const ProductOptionsUI = (props: any) => {
449
448
  ) : (
450
449
  <View style={{ flexDirection: 'row', marginBottom: 10 }}>
451
450
  <OText size={16} style={{ flex: I18nManager.isRTL ? 1 : 0 }} color={theme.colors.primary}>{productCart.price ? parsePrice(productCart.price) : ''}</OText>
452
- {product?.offer_price && (
451
+ {product?.offer_price !== null && product?.in_offer && (
453
452
  <OText style={{
454
453
  fontSize: 14,
455
454
  color: '#808080',
456
455
  textDecorationLine: 'line-through',
457
456
  marginLeft: 7,
458
457
  marginRight: 7
459
- }}>{parsePrice(product?.offer_price)}</OText>
458
+ }}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
460
459
  )}
461
460
  </View>
462
461
  )}
@@ -478,7 +477,7 @@ export const ProductOptionsUI = (props: any) => {
478
477
  key={tag.id}
479
478
  style={styles.productTagWrapper}
480
479
  >
481
- {tag?.image ? (
480
+ {!!tag?.image ? (
482
481
  <OIcon
483
482
  url={optimizeImage(tag?.image, 'h_40,c_limit')}
484
483
  style={styles.productTagImageStyle}
@@ -761,7 +760,7 @@ export const ProductOptionsUI = (props: any) => {
761
760
  </WrapContent>
762
761
  </View>
763
762
  )}
764
- {error && error.length > 0 && (
763
+ {!!error && error.length > 0 && (
765
764
  <NotFoundSource content={error[0]?.message || error[0]} />
766
765
  )}
767
766
  </ScrollView>
@@ -788,7 +787,7 @@ export const ProductOptionsUI = (props: any) => {
788
787
  <OText
789
788
  size={12}
790
789
  lineHeight={18}
791
- style={{ minWidth: 29, textAlign: 'center' }}
790
+ style={{ minWidth: 40, textAlign: 'center' }}
792
791
  >
793
792
  {qtyBy?.pieces && productCart.quantity}
794
793
  {qtyBy?.weight_unit && productCart.quantity * product?.weight}
@@ -812,36 +811,38 @@ export const ProductOptionsUI = (props: any) => {
812
811
  }
813
812
  />
814
813
  </TouchableOpacity>
815
- <WeightUnitSwitch>
816
- <TouchableOpacity
817
- onPress={() => handleSwitchQtyUnit('pieces')}
818
- >
819
- <WeightUnitItem active={qtyBy?.pieces}>
820
- <OText
821
- size={12}
822
- lineHeight={18}
823
- color={qtyBy?.pieces ? theme.colors.primary : theme.colors.textNormal}
824
- >
825
- {t('PIECES', 'pieces')}
826
- </OText>
827
- </WeightUnitItem>
828
- </TouchableOpacity>
829
- <View style={{ alignItems: 'flex-start' }}>
814
+ {isHaveWeight && (
815
+ <WeightUnitSwitch>
830
816
  <TouchableOpacity
831
- onPress={() => handleSwitchQtyUnit('weight_unit')}
817
+ onPress={() => handleSwitchQtyUnit('pieces')}
832
818
  >
833
- <WeightUnitItem active={qtyBy?.weight_unit}>
819
+ <WeightUnitItem active={qtyBy?.pieces}>
834
820
  <OText
835
821
  size={12}
836
822
  lineHeight={18}
837
- color={qtyBy?.weight_unit ? theme.colors.primary : theme.colors.textNormal}
823
+ color={qtyBy?.pieces ? theme.colors.primary : theme.colors.textNormal}
838
824
  >
839
- {product?.weight_unit}
825
+ {t('PIECES', 'pcs')}
840
826
  </OText>
841
827
  </WeightUnitItem>
842
828
  </TouchableOpacity>
843
- </View>
844
- </WeightUnitSwitch>
829
+ <View style={{ alignItems: 'flex-start' }}>
830
+ <TouchableOpacity
831
+ onPress={() => handleSwitchQtyUnit('weight_unit')}
832
+ >
833
+ <WeightUnitItem active={qtyBy?.weight_unit}>
834
+ <OText
835
+ size={12}
836
+ lineHeight={18}
837
+ color={qtyBy?.weight_unit ? theme.colors.primary : theme.colors.textNormal}
838
+ >
839
+ {product?.weight_unit}
840
+ </OText>
841
+ </WeightUnitItem>
842
+ </TouchableOpacity>
843
+ </View>
844
+ </WeightUnitSwitch>
845
+ )}
845
846
  </View>
846
847
  )}
847
848
  <View
@@ -910,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
910
911
  </View>
911
912
  </ProductActions>
912
913
  )}
913
- </SafeAreaView>
914
+ </SafeAreaView>
914
915
  );
915
916
  };
916
917
 
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'
2
2
  import {
3
3
  useUtils,
4
4
  useLanguage,
5
- ProductOptionSuboption as ProductSubOptionController,
5
+ ProductOptionSuboption as ProductSubOptionController
6
6
  } from 'ordering-components/native'
7
7
  import { useTheme } from 'styled-components/native';
8
8
  import { StyleSheet } from 'react-native'
@@ -137,7 +137,8 @@ const styles = StyleSheet.create({
137
137
  export const ProductOptionSubOption = (props: any) => {
138
138
  const productOptionSubOptionProps = {
139
139
  ...props,
140
- UIComponent: ProductOptionSubOptionUI
140
+ UIComponent: ProductOptionSubOptionUI,
141
+ isOrigin: true
141
142
  }
142
143
 
143
144
  return (
@@ -7,7 +7,7 @@ import {
7
7
  } from 'ordering-components/native';
8
8
  import { useTheme } from 'styled-components/native';
9
9
  import { SingleProductCardParams } from '../../types';
10
- import { CardContainer, CardInfo, SoldOut, QuantityContainer } from './styles';
10
+ import { CardContainer, CardInfo, SoldOut, QuantityContainer, PricesContainer } from './styles';
11
11
  import { StyleSheet } from 'react-native';
12
12
  import { OText, OIcon } from '../shared';
13
13
  import FastImage from 'react-native-fast-image'
@@ -51,6 +51,13 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
51
51
  textAlign: 'center',
52
52
  borderRadius: 25,
53
53
  alignItems: 'center'
54
+ },
55
+ regularPriceStyle: {
56
+ fontSize: 12,
57
+ color: '#808080',
58
+ textDecorationLine: 'line-through',
59
+ marginLeft: 7,
60
+ marginRight: 7
54
61
  }
55
62
  });
56
63
 
@@ -97,13 +104,13 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
97
104
  (isSoldOut || maxProductQuantity <= 0) && styles.soldOutBackgroundStyle,
98
105
  ]}
99
106
  onPress={() => onProductClick?.(product)}>
100
- {productAddedToCartLength > 0 && (
101
- <QuantityContainer style={[styles.quantityContainer, {
102
- transform: [{ translateX: 10 }, { translateY: -10 }],
103
- }]}>
104
- <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
105
- </QuantityContainer>
106
- )}
107
+ {productAddedToCartLength > 0 && (
108
+ <QuantityContainer style={[styles.quantityContainer, {
109
+ transform: [{ translateX: 10 }, { translateY: -10 }],
110
+ }]}>
111
+ <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
112
+ </QuantityContainer>
113
+ )}
107
114
  <CardInfo>
108
115
  <OText
109
116
  size={12}
@@ -113,9 +120,12 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
113
120
  style={styles.line18}>
114
121
  {product?.name}
115
122
  </OText>
116
- <OText size={12} weight={'400'} style={styles.line18} color={theme.colors.textNormal}>
117
- {parsePrice(product?.price)}
118
- </OText>
123
+ <PricesContainer>
124
+ <OText color={theme.colors.primary}>{product?.price ? parsePrice(product?.price) : ''}</OText>
125
+ {product?.offer_price !== null && product?.in_offer && (
126
+ <OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
127
+ )}
128
+ </PricesContainer>
119
129
  <OText
120
130
  size={10}
121
131
  numberOfLines={2}
@@ -125,14 +135,21 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
125
135
  {product?.description}
126
136
  </OText>
127
137
  </CardInfo>
128
- <FastImage
129
- style={styles.productStyle}
130
- source={{
131
- uri: optimizeImage(product?.images, 'h_75,c_limit'),
132
- priority: FastImage.priority.normal,
133
- }}
134
- resizeMode={FastImage.resizeMode.cover}
135
- />
138
+ {product?.images ? (
139
+ <FastImage
140
+ style={styles.productStyle}
141
+ source={{
142
+ uri: optimizeImage(product?.images, 'h_75,c_limit'),
143
+ priority: FastImage.priority.normal,
144
+ }}
145
+ resizeMode={FastImage.resizeMode.cover}
146
+ />
147
+ ) : (
148
+ <OIcon
149
+ src={theme?.images?.dummies?.product}
150
+ style={styles.productStyle}
151
+ />
152
+ )}
136
153
  {(isSoldOut || maxProductQuantity <= 0) && (
137
154
  <SoldOut>
138
155
  <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
@@ -27,3 +27,7 @@ export const QuantityContainer = styled.View`
27
27
  align-items: center;
28
28
  justify-content: center;
29
29
  `
30
+ export const PricesContainer = styled.View`
31
+ flex-direction: row;
32
+ align-items: center;
33
+ `
@@ -37,19 +37,33 @@ const StripeElementsFormUI = (props: any) => {
37
37
  const { top, bottom } = useSafeAreaInsets();
38
38
  const [isKeyboardShow, setIsKeyboardShow] = useState(false);
39
39
 
40
- const billingDetails = {
41
- name: `${user.name} ${user.lastname}`,
42
- email: user.email,
43
- addressLine1: user.address
44
- };
40
+ let billingDetails: any = {}
41
+
42
+ if (user?.name || user?.lastname) {
43
+ if (user?.name) {
44
+ billingDetails.name = user?.name
45
+ }
46
+ if (user?.lastname) {
47
+ billingDetails.name = `${billingDetails?.name} ${user?.lastname}`
48
+ }
49
+ }
50
+
51
+ if (user?.email) {
52
+ billingDetails.email = user?.email
53
+ }
54
+
55
+ if (user?.address) {
56
+ billingDetails.addressLine1 = user?.address
57
+ }
45
58
 
46
59
  const createPayMethod = async () => {
60
+ const params: any = { type: 'Card' }
61
+ if (Object.keys(billingDetails).length > 0) {
62
+ params.billingDetails = billingDetails
63
+ }
47
64
  try {
48
65
  setCreatePmLoading(true)
49
- const { paymentMethod } = await createPaymentMethod({
50
- type: 'Card',
51
- billingDetails,
52
- });
66
+ const { paymentMethod } = await createPaymentMethod(params);
53
67
 
54
68
  setCreatePmLoading(false)
55
69
  handleSource && handleSource({
@@ -79,11 +93,12 @@ const StripeElementsFormUI = (props: any) => {
79
93
  createPayMethod();
80
94
  return
81
95
  }
96
+ const params: any = { type: 'Card' }
97
+ if (Object.keys(billingDetails).length > 0) {
98
+ params.billingDetails = billingDetails
99
+ }
82
100
  try {
83
- const { setupIntent, error } = await confirmSetupIntent(requirements, {
84
- type: 'Card',
85
- billingDetails,
86
- });
101
+ const { setupIntent, error } = await confirmSetupIntent(requirements, params);
87
102
 
88
103
  if (setupIntent?.status === 'Succeeded') {
89
104
  stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId);
@@ -1,51 +1,83 @@
1
- import React from 'react'
2
- import { useLanguage, useUtils } from 'ordering-components/native'
1
+ import React, { Mixin } from 'react'
2
+ import { useLanguage } from 'ordering-components/native'
3
3
  import { SingleProductCard } from '../SingleProductCard'
4
4
  import { TaxInformationContainer, ProductContainer } from './styles'
5
5
  import { OText } from '../shared'
6
6
 
7
7
  interface taxInformationParams {
8
- data: { name: string, description?: string, rate: string | number, type: number, fixed?: number, percentage?: number, id: number },
9
- products: Array<any>
8
+ data: {
9
+ name: string,
10
+ description?: string,
11
+ rate: string | number,
12
+ type: number,
13
+ fixed?: number,
14
+ percentage?: number,
15
+ id: number,
16
+ discounts?: any
17
+ } | null,
18
+ products: Array<any>,
19
+ type: string
10
20
  }
11
21
 
12
22
  export const TaxInformation = (props: taxInformationParams) => {
13
23
  const {
14
24
  data,
15
- products
25
+ products,
26
+ type
16
27
  } = props
17
28
 
18
29
  const [, t] = useLanguage()
19
- const [{ parsePrice }] = useUtils()
20
30
 
21
- const isTax = typeof data?.rate === 'number'
22
- const TaxFeeString = isTax ? 'tax' : 'fee'
23
31
  const includedOnPriceString = data?.type === 1 ? `(${t('INCLUDED_ON_PRICE', 'Included on price')})` : `(${t('NOT_INCLUDED_ON_PRICE', 'Not included on price')})`
24
32
 
33
+ const getFilterValidation = (product: any) => {
34
+ return (
35
+ type === 'tax'
36
+ ? (product.tax?.id ? product.tax?.id === data?.id : product.tax?.id === null && data?.id === null)
37
+ : type === 'fee'
38
+ ? (product.fee?.id ? product.fee?.id === data?.id : (product.fee?.id === null && data?.id === null))
39
+ : Object.keys(data?.discounts ?? {}).map(code => code.includes(product?.code)) && product?.offers?.find((offer : any) => offer?.name === data?.name)
40
+ )
41
+ }
42
+
43
+ const getTypeString = () => {
44
+ return (
45
+ type === 'offer_target_1'
46
+ ? t('PRODUCT_DISCOUNT', 'Product discount')
47
+ : type === 'tax'
48
+ ? t('TAX', 'Tax')
49
+ : t('Fee', 'Fee')
50
+ )
51
+ }
52
+
25
53
  return (
26
54
  <TaxInformationContainer>
27
- <OText size={24} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
28
- {`${data?.name ||
29
- t('INHERIT_FROM_BUSINESS', 'Inherit from business')} (${typeof data?.rate === 'number' ? `${data?.rate}%` : `${parsePrice(data?.fixed ?? 0)} + ${data?.percentage}%`})`}
30
- </OText>
31
- {data?.description && (
55
+ {!!data?.description ? (
56
+ <OText size={24} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
57
+ {t('DESCRIPTION', 'Description')}: {data?.description} {data?.type && !type?.includes('offer') && includedOnPriceString}
58
+ </OText>
59
+ ) : (
32
60
  <OText mBottom={10} size={18} style={{ alignSelf: 'center', textAlign: 'center' }}>
33
- {t('DESCRIPTION', 'Description')}: {data?.description} {data?.type && includedOnPriceString}
61
+ {t('WITHOUT_DESCRIPTION', 'Without description')}
34
62
  </OText>
35
63
  )}
36
- <OText>{t(`OTHER_PRODUCTS_WITH_THIS_${TaxFeeString.toUpperCase()}`, `Other products with this ${TaxFeeString}`)}:</OText>
37
- <ProductContainer>
38
- {
39
- products.filter((product: any) => isTax ? (product.tax?.id ? product.tax?.id === data?.id : product.tax?.id === null && data?.id === null) : (product.fee?.id ? product.fee?.id === data?.id : (product.fee?.id === null && data?.id === null))).map(product => (
40
- <SingleProductCard
41
- key={product.id}
42
- product={product}
43
- isSoldOut={false}
44
- businessId={product?.business_id}
45
- />
46
- ))
47
- }
48
- </ProductContainer>
64
+ {!(type === 'offer_target_2' || type === 'offer_target_3') && (
65
+ <>
66
+ <OText>{t('OTHER_PRODUCTS_WITH_THIS', 'Other products with this')} {getTypeString()}:</OText>
67
+ <ProductContainer>
68
+ {
69
+ products.filter((product: any) => getFilterValidation(product)).map(product => (
70
+ <SingleProductCard
71
+ key={product.id}
72
+ product={product}
73
+ isSoldOut={false}
74
+ businessId={product?.business_id}
75
+ />
76
+ ))
77
+ }
78
+ </ProductContainer>
79
+ </>
80
+ )}
49
81
  </TaxInformationContainer>
50
82
  )
51
83
  }
@@ -33,8 +33,8 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
33
33
  canOpenUpselling,
34
34
  setCanOpenUpselling,
35
35
  isFromCart,
36
- onNavigationRedirect,
37
- onGoBack
36
+ onNavigationRedirect,
37
+ onGoBack
38
38
  } = props
39
39
 
40
40
  const theme = useTheme();
@@ -70,17 +70,18 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
70
70
  const [{ parsePrice }] = useUtils()
71
71
  const [, t] = useLanguage()
72
72
  const { bottom } = useSafeAreaInsets()
73
+ const [isCheckout, setIsCheckout] = useState(false)
73
74
 
74
- const cart = carts?.[`businessId:${props.businessId}`] ?? {}
75
- const cartProducts = cart?.products?.length
76
- ? cart?.products.map((product: any) => product.id)
77
- : []
75
+ const cart = carts?.[`businessId:${props.businessId}`] ?? {}
76
+ const cartProducts = cart?.products?.length
77
+ ? cart?.products.map((product: any) => product.id)
78
+ : []
78
79
 
79
- const productsList = !upsellingProducts.loading && !upsellingProducts.error
80
- ? upsellingProducts?.products?.length
81
- ? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
82
- : (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
83
- : []
80
+ const productsList = !upsellingProducts.loading && !upsellingProducts.error
81
+ ? upsellingProducts?.products?.length
82
+ ? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
83
+ : (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
84
+ : []
84
85
 
85
86
  useEffect(() => {
86
87
  if (!isCustomMode && !props.products) {
@@ -94,6 +95,10 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
94
95
  }
95
96
  }, [upsellingProducts.loading, upsellingProducts?.products.length])
96
97
 
98
+ useEffect(() => {
99
+ isCheckout && Object.keys(cart).length === 0 && onNavigationRedirect && onNavigationRedirect('MyOrders')
100
+ }, [cart, isCheckout])
101
+
97
102
  const handleFormProduct = (product: any) => {
98
103
  onNavigationRedirect && onNavigationRedirect('ProductDetails', {
99
104
  product: product,
@@ -155,12 +160,6 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
155
160
  </TopActions>
156
161
  </TopBar>
157
162
  <ScrollView style={{ marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
158
- {productsList.length > 0 &&
159
- <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
160
- <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
161
- <UpsellingLayout />
162
- </View>
163
- }
164
163
  <View style={{ paddingHorizontal: 40 }}>
165
164
  <OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
166
165
  <OrderSummary
@@ -169,6 +168,12 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
169
168
  onNavigationRedirect={onNavigationRedirect}
170
169
  />
171
170
  </View>
171
+ {productsList.length > 0 &&
172
+ <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
173
+ <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
174
+ <UpsellingLayout />
175
+ </View>
176
+ }
172
177
  </ScrollView>
173
178
  <View
174
179
  style={{
@@ -181,7 +186,10 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
181
186
  text={t('CHECKOUT', 'Checkout')}
182
187
  style={{...styles.closeUpsellingButton}}
183
188
  textStyle={{ color: theme.colors.white, fontSize: 14 }}
184
- onClick={() => handleUpsellingPage()}
189
+ onClick={() => {
190
+ handleUpsellingPage()
191
+ setIsCheckout(true)
192
+ }}
185
193
  />
186
194
  </View>
187
195
  </>
@@ -253,6 +253,7 @@ export interface NotFoundSourceParams {
253
253
  }
254
254
  export interface OrdersOptionParams {
255
255
  orderList?: any,
256
+ franchiseId?: any,
256
257
  activeOrders?: boolean,
257
258
  pagination?: any,
258
259
  titleContent?: string,
@@ -482,4 +483,5 @@ export interface HelpAccountAndPaymentParams {
482
483
 
483
484
  export interface MessageListingParams {
484
485
  navigation: any;
486
+ franchiseId?: any;
485
487
  }