ordering-ui-react-native 0.21.50 → 0.21.51

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 (82) hide show
  1. package/package.json +1 -1
  2. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  3. package/themes/original/src/components/AddressForm/index.tsx +2 -2
  4. package/themes/original/src/components/AddressForm/styles.tsx +1 -1
  5. package/themes/original/src/components/AddressList/styles.tsx +4 -4
  6. package/themes/original/src/components/BusinessBasicInformation/index.tsx +2 -2
  7. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +1 -1
  8. package/themes/original/src/components/BusinessInformation/styles.tsx +2 -2
  9. package/themes/original/src/components/BusinessItemAccordion/index.tsx +4 -3
  10. package/themes/original/src/components/BusinessListingSearch/index.tsx +4 -5
  11. package/themes/original/src/components/BusinessListingSearch/styles.tsx +1 -1
  12. package/themes/original/src/components/BusinessPreorder/index.tsx +2 -2
  13. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  14. package/themes/original/src/components/BusinessProductsListing/index.tsx +7 -7
  15. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  16. package/themes/original/src/components/BusinessReviews/index.tsx +1 -1
  17. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  18. package/themes/original/src/components/BusinessesListing/Layout/Appointment/styles.tsx +5 -5
  19. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +1 -1
  20. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +7 -7
  21. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -1
  22. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  23. package/themes/original/src/components/Cart/index.tsx +13 -4
  24. package/themes/original/src/components/CartContent/index.tsx +59 -38
  25. package/themes/original/src/components/CartStoresListing/styles.tsx +2 -2
  26. package/themes/original/src/components/Checkout/index.tsx +42 -8
  27. package/themes/original/src/components/Checkout/styles.tsx +17 -0
  28. package/themes/original/src/components/CitiesControl/styles.tsx +1 -1
  29. package/themes/original/src/components/Favorite/index.tsx +3 -4
  30. package/themes/original/src/components/Favorite/styles.tsx +0 -2
  31. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  32. package/themes/original/src/components/GPSButton/index.tsx +1 -1
  33. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +1 -1
  34. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +1 -1
  35. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +1 -1
  36. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  37. package/themes/original/src/components/HighestRatedBusinesses/styles.tsx +1 -1
  38. package/themes/original/src/components/Home/index.tsx +1 -1
  39. package/themes/original/src/components/Messages/styles.tsx +1 -1
  40. package/themes/original/src/components/MomentOption/index.tsx +3 -3
  41. package/themes/original/src/components/MultiCart/index.tsx +1 -1
  42. package/themes/original/src/components/MultiCheckout/index.tsx +4 -4
  43. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -1
  44. package/themes/original/src/components/MyOrders/index.tsx +5 -5
  45. package/themes/original/src/components/NetworkError/styles.tsx +2 -2
  46. package/themes/original/src/components/Notifications/index.tsx +2 -4
  47. package/themes/original/src/components/Notifications/styles.tsx +0 -1
  48. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +1 -1
  49. package/themes/original/src/components/OrderDetails/index.tsx +702 -661
  50. package/themes/original/src/components/OrderDetails/styles.tsx +24 -7
  51. package/themes/original/src/components/OrderProgress/styles.tsx +1 -1
  52. package/themes/original/src/components/OrderSummary/index.tsx +3 -1
  53. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +1 -1
  54. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +1 -1
  55. package/themes/original/src/components/OrdersOption/index.tsx +1 -1
  56. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  57. package/themes/original/src/components/ProductForm/ActionButton.tsx +117 -0
  58. package/themes/original/src/components/ProductForm/ExtraOptions.tsx +56 -0
  59. package/themes/original/src/components/ProductForm/index.tsx +52 -145
  60. package/themes/original/src/components/ProductItemAccordion/index.tsx +5 -0
  61. package/themes/original/src/components/ProductOptionSubOption/index.tsx +1 -1
  62. package/themes/original/src/components/ProfessionalProfile/styles.tsx +3 -3
  63. package/themes/original/src/components/Promotions/index.tsx +4 -4
  64. package/themes/original/src/components/Promotions/styles.tsx +0 -2
  65. package/themes/original/src/components/ReviewDriver/styles.tsx +1 -1
  66. package/themes/original/src/components/ReviewOrder/styles.tsx +1 -1
  67. package/themes/original/src/components/ReviewProducts/styles.tsx +1 -1
  68. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  69. package/themes/original/src/components/ServiceForm/styles.tsx +4 -4
  70. package/themes/original/src/components/StripeElementsForm/index.tsx +1 -1
  71. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +170 -0
  72. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +86 -0
  73. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -199
  74. package/themes/original/src/components/UpsellingProducts/styles.tsx +19 -0
  75. package/themes/original/src/components/UserFormDetails/index.tsx +16 -3
  76. package/themes/original/src/components/UserProfile/index.tsx +1 -1
  77. package/themes/original/src/components/WalletTransactions/styles.tsx +1 -0
  78. package/themes/original/src/components/Wallets/index.tsx +1 -3
  79. package/themes/original/src/components/Wallets/styles.tsx +1 -0
  80. package/themes/original/src/components/shared/HeaderTitle.tsx +1 -1
  81. package/themes/original/src/components/shared/OModal.tsx +12 -14
  82. package/themes/original/src/layouts/Container.tsx +1 -1
@@ -19,7 +19,7 @@ import { useTheme } from 'styled-components/native';
19
19
  import { OButton, OIcon, OModal, OText } from '../shared'
20
20
  import { Placeholder, PlaceholderLine } from 'rn-placeholder'
21
21
  import { NotFoundSource } from '../NotFoundSource'
22
- import { View, StyleSheet, ScrollView, RefreshControl } from 'react-native'
22
+ import { View, StyleSheet, ScrollView, RefreshControl, Platform } from 'react-native'
23
23
  import { PromotionParams } from '../../types'
24
24
  import { Container } from '../../layouts/Container'
25
25
 
@@ -98,8 +98,6 @@ const PromotionsUI = (props: PromotionParams) => {
98
98
 
99
99
  return (
100
100
  <Container
101
- noPadding
102
- pt={20}
103
101
  refreshControl={
104
102
  <RefreshControl
105
103
  refreshing={refreshing}
@@ -112,7 +110,9 @@ const PromotionsUI = (props: PromotionParams) => {
112
110
  titleAlign={'center'}
113
111
  onActionLeft={() => navigation.goBack()}
114
112
  showCall={false}
115
- style={{ paddingVertical: 0, marginLeft: 20 }}
113
+ paddingTop={Platform.OS === 'ios' ? 20 : 10}
114
+ style={{ paddingVertical: 0 }}
115
+ btnStyle={{ paddingLeft: 0 }}
116
116
  />
117
117
  <PromotionsContainer>
118
118
  <SearchBarContainer>
@@ -2,8 +2,6 @@ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const PromotionsContainer = styled.View`
4
4
  width: 100%;
5
- padding-left: 40px;
6
- padding-right: 40px;
7
5
  `
8
6
 
9
7
  export const WrapperSingleOffer = styled.View`
@@ -1,7 +1,7 @@
1
1
  import styled from 'styled-components/native'
2
2
 
3
3
  export const ReviewDriverContainer = styled.ScrollView`
4
- padding: 20px 40px;
4
+ padding: 20px;
5
5
  margin-bottom: 100px;
6
6
  `
7
7
 
@@ -1,7 +1,7 @@
1
1
  import styled from 'styled-components/native'
2
2
 
3
3
  export const ReviewOrderContainer = styled.ScrollView`
4
- padding: 20px 40px;
4
+ padding: 20px;
5
5
  margin-bottom: 100px;
6
6
  `
7
7
 
@@ -1,7 +1,7 @@
1
1
  import styled from 'styled-components/native'
2
2
 
3
3
  export const ReviewProductsContainer = styled.ScrollView`
4
- padding: 20px 40px;
4
+ padding: 20px;
5
5
  margin-bottom: 100px;
6
6
  `
7
7
 
@@ -116,7 +116,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
116
116
  marginHorizontal: 0
117
117
  },
118
118
  professionalList: {
119
- paddingHorizontal: 40,
119
+ paddingHorizontal: 20,
120
120
  paddingVertical: 30,
121
121
  }
122
122
  })
@@ -11,7 +11,7 @@ export const ProfessionalPhoto = styled.ImageBackground`
11
11
  `;
12
12
 
13
13
  export const InfoWrapper = styled.View`
14
- padding-horizontal: 40px;
14
+ padding-horizontal: 20px;
15
15
  margin-vertical: 30px;
16
16
  `
17
17
 
@@ -22,7 +22,7 @@ export const Divider = styled.View`
22
22
  `
23
23
 
24
24
  export const ProfessionalWrapper = styled.View`
25
- padding-horizontal: 40px;
25
+ padding-horizontal: 20px;
26
26
  margin-top: 30px;
27
27
  `
28
28
 
@@ -41,10 +41,10 @@ export const ButtonWrapper = styled.View`
41
41
  align-items: center;
42
42
  flex-direction: row;
43
43
  padding-vertical: 13px;
44
- padding-horizontal: 40px;
44
+ padding-horizontal: 20px;
45
45
  margin-top: 30px;
46
46
  margin-bottom: 40px;
47
47
  width: 100%;
48
48
  border-top-width: 1px;
49
49
  border-top-color: ${(props: any) => props.theme.colors.backgroundGray200};
50
- `
50
+ `
@@ -55,7 +55,7 @@ const StripeElementsFormUI = (props: any) => {
55
55
  const styles = StyleSheet.create({
56
56
  container: {
57
57
  width: '100%',
58
- paddingHorizontal: 40,
58
+ paddingHorizontal: 20,
59
59
  justifyContent: 'space-between',
60
60
  paddingBottom: 12
61
61
  },
@@ -0,0 +1,170 @@
1
+ import React, { useState } from 'react'
2
+ import { Platform, StyleSheet, View } from 'react-native'
3
+ import {
4
+ useLanguage,
5
+ useOrder,
6
+ useConfig
7
+ } from 'ordering-components/native'
8
+ import { useTheme } from 'styled-components/native';
9
+ import { OText, OButton } from '../shared'
10
+ import {
11
+ CartList,
12
+ CartDivider,
13
+ TopActionsHeader,
14
+ TopHeader
15
+ } from './styles'
16
+ import { OrderSummary } from '../OrderSummary';
17
+ import { Cart } from '../Cart';
18
+ import { ScrollView } from 'react-native-gesture-handler';
19
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
20
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
21
+ import { UpsellingLayout } from './UpsellingLayout';
22
+
23
+ export const UpsellingContent = (props : any) => {
24
+ const {
25
+ onGoBack,
26
+ handleUpsellingPage,
27
+ onNavigationRedirect,
28
+ cart,
29
+ productsList
30
+ } = props
31
+
32
+ const theme = useTheme();
33
+
34
+ const [{ carts }] = useOrder()
35
+ const [{ configs }] = useConfig()
36
+ const [, t] = useLanguage()
37
+ const { bottom } = useSafeAreaInsets()
38
+ const [isCartsLoading, setIsCartsLoading] = useState(false)
39
+ const [showTitle, setShowTitle] = useState(false)
40
+
41
+ const isMultiCheckout = configs?.checkout_multi_business_enabled?.value === '1'
42
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
43
+ const showCartList = isChewLayout
44
+ const commentDelayTime = isChewLayout ? 500 : null
45
+
46
+ const cartList = (carts && Object.values(carts).filter((_cart: any) => _cart?.products?.length > 0 && _cart.uuid !== cart?.uuid)) || []
47
+
48
+ const styles = StyleSheet.create({
49
+ closeUpsellingButton: {
50
+ borderRadius: 7.6,
51
+ borderColor: theme.colors.primary,
52
+ backgroundColor: theme.colors.primary,
53
+ borderWidth: 1,
54
+ alignSelf: 'center',
55
+ height: 44,
56
+ shadowOpacity: 0,
57
+ width: '80%',
58
+ },
59
+ cancelBtn: {
60
+ paddingHorizontal: 18,
61
+ borderWidth: 1,
62
+ borderRadius: 7.6,
63
+ borderColor: theme.colors.textSecondary,
64
+ height: 38
65
+ },
66
+ headerItem: {
67
+ flexDirection: 'row',
68
+ alignItems: 'center',
69
+ marginVertical: 2,
70
+ marginHorizontal: 20,
71
+ },
72
+ btnBackArrow: {
73
+ borderWidth: 0,
74
+ width: 26,
75
+ height: 26,
76
+ backgroundColor: theme.colors.clear,
77
+ borderColor: theme.colors.clear,
78
+ shadowColor: theme.colors.clear,
79
+ paddingLeft: 0,
80
+ paddingRight: 0,
81
+ marginLeft: 20,
82
+ marginBottom: 10
83
+ },
84
+ wrapperNavbar: {
85
+ paddingHorizontal: 20,
86
+ paddingTop: 0,
87
+ }
88
+ })
89
+
90
+
91
+ const handleScroll = ({ nativeEvent: { contentOffset } }: any) => {
92
+ setShowTitle(contentOffset.y > 30)
93
+ }
94
+
95
+ return (
96
+ <>
97
+ <View style={styles.wrapperNavbar}>
98
+ <TopHeader>
99
+ <>
100
+ <TopActionsHeader onPress={() => onGoBack()}>
101
+ <IconAntDesign
102
+ name='arrowleft'
103
+ size={26}
104
+ />
105
+ </TopActionsHeader>
106
+ {showTitle && (
107
+ <OText
108
+ size={16}
109
+ style={{ flex: 1, textAlign: 'center', right: 15 }}
110
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
111
+ numberOfLines={2}
112
+ ellipsizeMode='tail'
113
+ >
114
+ {t('WANT_SOMETHING_ELSE', 'Do you want something else?')}
115
+ </OText>
116
+ )}
117
+ </>
118
+ </TopHeader>
119
+ </View>
120
+ <ScrollView style={{ marginTop: 10, marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false} onScroll={handleScroll}>
121
+ {productsList.length > 0 &&
122
+ <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
123
+ <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
124
+ <UpsellingLayout {...props} />
125
+ </View>
126
+ }
127
+ <View style={{ paddingHorizontal: 40 }}>
128
+ <OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
129
+ <OrderSummary
130
+ cart={cart}
131
+ commentDelayTime={commentDelayTime}
132
+ isCartPending={cart?.status === 2}
133
+ onNavigationRedirect={onNavigationRedirect}
134
+ />
135
+ </View>
136
+ {showCartList && cartList.map((cart: any, i: number) => (
137
+ <CartList key={i}>
138
+ <Cart
139
+ isFromUpselling
140
+ cart={cart}
141
+ cartuuid={cart.uuid}
142
+ hideUpselling
143
+ singleBusiness={props.singleBusiness}
144
+ isFranchiseApp={props.isFranchiseApp}
145
+ isCartsLoading={isCartsLoading}
146
+ setIsCartsLoading={setIsCartsLoading}
147
+ isMultiCheckout={isMultiCheckout}
148
+ onNavigationRedirect={props.onNavigationRedirect}
149
+ />
150
+ <CartDivider />
151
+ </CartList>
152
+ ))}
153
+ </ScrollView>
154
+ <View
155
+ style={{
156
+ alignItems: 'center',
157
+ bottom: props.isPage ? Platform.OS === 'ios' ? 0 : 20 : Platform.OS === 'ios' ? bottom + 59 : bottom + 125
158
+ }}
159
+ >
160
+ <OButton
161
+ imgRightSrc=''
162
+ text={t('CHECKOUT', 'Checkout')}
163
+ style={{ ...styles.closeUpsellingButton }}
164
+ textStyle={{ color: theme.colors.white, fontSize: 14 }}
165
+ onClick={() => handleUpsellingPage(cart)}
166
+ />
167
+ </View>
168
+ </>
169
+ )
170
+ }
@@ -0,0 +1,86 @@
1
+ import React from 'react'
2
+ import { Platform, StyleSheet, View } from 'react-native'
3
+ import {
4
+ useUtils,
5
+ useLanguage
6
+ } from 'ordering-components/native'
7
+ import {
8
+ Container,
9
+ UpsellingContainer,
10
+ Item,
11
+ Details,
12
+ AddButton,
13
+ } from './styles'
14
+ import { OIcon, OText } from '../shared'
15
+ import { useTheme } from 'styled-components/native';
16
+
17
+ export const UpsellingLayout = (props : any) => {
18
+ const {
19
+ upsellingProducts,
20
+ productsList,
21
+ onNavigationRedirect,
22
+ business
23
+ } = props
24
+ const theme = useTheme()
25
+ const [{ parsePrice }] = useUtils()
26
+ const [, t] = useLanguage()
27
+
28
+ const styles = StyleSheet.create({
29
+ imageStyle: {
30
+ width: 73,
31
+ height: 73,
32
+ resizeMode: 'cover',
33
+ borderRadius: 7.6,
34
+ },
35
+ })
36
+
37
+ const handleFormProduct = (product: any) => {
38
+ onNavigationRedirect && onNavigationRedirect('ProductDetails', {
39
+ product: product,
40
+ businessId: product?.api?.businessId,
41
+ businessSlug: business.slug,
42
+ })
43
+ }
44
+
45
+
46
+ return (
47
+ <>
48
+ <Container>
49
+ <UpsellingContainer
50
+ horizontal
51
+ showsHorizontalScrollIndicator={false}
52
+ contentContainerStyle={{ paddingHorizontal: Platform.OS === 'ios' ? 40 : 0 }}
53
+ >
54
+ {
55
+ !upsellingProducts.loading && (
56
+ <>
57
+ {
58
+ !upsellingProducts.error ? productsList.map((product: any, i: number) => (
59
+ <Item key={`${product.id}_${i}`}>
60
+ <View style={{ flexBasis: '57%' }}>
61
+ <Details>
62
+ <OText size={12} lineHeight={18} numberOfLines={1} ellipsizeMode='tail'>{product.name}</OText>
63
+ <OText size={12} lineHeight={18} color={theme.colors.textNormal}>{parsePrice(product.price)}</OText>
64
+ </Details>
65
+ <AddButton onPress={() => handleFormProduct(product)}>
66
+ <OText size={10} color={theme.colors.primary}>{t('ADD', 'Add')}</OText>
67
+ </AddButton>
68
+ </View>
69
+ <View>
70
+ <OIcon url={product?.images || theme?.images?.dummies?.product} style={styles.imageStyle} />
71
+ </View>
72
+ </Item>
73
+ )) : (
74
+ <OText>
75
+ {upsellingProducts.message}
76
+ </OText>
77
+ )
78
+ }
79
+ </>
80
+ )
81
+ }
82
+ </UpsellingContainer>
83
+ </Container>
84
+ </>
85
+ )
86
+ }
@@ -1,116 +1,41 @@
1
- import React, { useState, useEffect } from 'react'
2
- import { Platform, StyleSheet, TouchableOpacity, View } from 'react-native'
1
+ import React, { useEffect } from 'react'
3
2
  import {
4
3
  UpsellingPage as UpsellingPageController,
5
- useUtils,
6
- useLanguage,
7
4
  useOrder,
8
- useConfig
9
5
  } from 'ordering-components/native'
10
- import { useTheme } from 'styled-components/native';
11
- import { OText, OIcon, OBottomPopup, OButton } from '../shared'
6
+ import { OBottomPopup } from '../shared'
12
7
  import { UpsellingProductsParams } from '../../types'
13
- import {
14
- Container,
15
- UpsellingContainer,
16
- Item,
17
- Details,
18
- AddButton,
19
- CartList,
20
- CartDivider
21
- } from './styles'
22
- import { OrderSummary } from '../OrderSummary';
23
- import { Cart } from '../Cart';
24
- import { ScrollView } from 'react-native-gesture-handler';
25
- import { useSafeAreaInsets } from 'react-native-safe-area-context';
8
+
9
+ import { UpsellingLayout } from './UpsellingLayout';
10
+ import { UpsellingContent } from './UpsellingContent';
26
11
 
27
12
  const UpsellingProductsUI = (props: UpsellingProductsParams) => {
28
13
  const {
29
14
  isCustomMode,
30
15
  upsellingProducts,
31
- business,
32
16
  handleUpsellingPage,
33
17
  openUpselling,
34
18
  canOpenUpselling,
35
19
  setCanOpenUpselling,
36
- isFromCart,
37
- onNavigationRedirect,
38
- onGoBack
20
+ isFromCart
39
21
  } = props
40
22
 
41
- const theme = useTheme();
42
-
43
- const styles = StyleSheet.create({
44
- imageStyle: {
45
- width: 73,
46
- height: 73,
47
- resizeMode: 'cover',
48
- borderRadius: 7.6,
49
- },
50
- closeUpsellingButton: {
51
- borderRadius: 7.6,
52
- borderColor: theme.colors.primary,
53
- backgroundColor: theme.colors.primary,
54
- borderWidth: 1,
55
- alignSelf: 'center',
56
- height: 44,
57
- shadowOpacity: 0,
58
- width: '80%',
59
- },
60
- cancelBtn: {
61
- paddingHorizontal: 18,
62
- borderWidth: 1,
63
- borderRadius: 7.6,
64
- borderColor: theme.colors.textSecondary,
65
- height: 38
66
- },
67
- headerItem: {
68
- flexDirection: 'row',
69
- alignItems: 'center',
70
- marginVertical: 2,
71
- marginHorizontal: 20,
72
- },
73
- btnBackArrow: {
74
- borderWidth: 0,
75
- width: 26,
76
- height: 26,
77
- backgroundColor: theme.colors.clear,
78
- borderColor: theme.colors.clear,
79
- shadowColor: theme.colors.clear,
80
- paddingLeft: 0,
81
- paddingRight: 0,
82
- marginLeft: 20,
83
- marginBottom: 10
84
- },
85
- })
86
-
87
23
  const [{ carts }] = useOrder()
88
- const [{ parsePrice }] = useUtils()
89
- const [{ configs }] = useConfig()
90
- const [, t] = useLanguage()
91
- const { bottom } = useSafeAreaInsets()
92
- const [isCartsLoading, setIsCartsLoading] = useState(false)
93
-
94
- const isMultiCheckout = configs?.checkout_multi_business_enabled?.value === '1'
95
- const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
96
- const showCartList = isChewLayout
97
- const commentDelayTime = isChewLayout ? 500 : null
98
24
 
99
25
  const cart = carts?.[`businessId:${props.businessId}`] ?? {}
100
- const cartList = (carts && Object.values(carts).filter((_cart: any) => _cart?.products?.length > 0 && _cart.uuid !== cart?.uuid)) || []
101
26
  const cartProducts = cart?.products?.length
102
- ? cart?.products.map((product: any) => product.id)
103
- : []
27
+ ? cart?.products.map((product: any) => product.id)
28
+ : []
104
29
 
105
30
  const productsList = !upsellingProducts.loading && !upsellingProducts.error
106
- ? upsellingProducts?.products?.length
31
+ ? upsellingProducts?.products?.length
107
32
  ? upsellingProducts?.products.filter((product: any) => !cartProducts.includes(product.id))
108
33
  : (props?.products ?? []).filter((product: any) => !cartProducts.includes(product.id)) ?? []
109
- : []
34
+ : []
110
35
 
111
36
  useEffect(() => {
112
37
  if (!isCustomMode && !props.products) {
113
- if (!upsellingProducts.loading) {
38
+ if (!upsellingProducts?.loading) {
114
39
  if (upsellingProducts?.products?.length && !isFromCart) {
115
40
  setCanOpenUpselling && setCanOpenUpselling(true)
116
41
  } else {
@@ -118,125 +43,16 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
118
43
  }
119
44
  }
120
45
  }
121
- }, [upsellingProducts.loading, upsellingProducts?.products.length])
122
-
123
- const handleFormProduct = (product: any) => {
124
- onNavigationRedirect && onNavigationRedirect('ProductDetails', {
125
- product: product,
126
- businessId: product?.api?.businessId,
127
- businessSlug: business.slug,
128
- })
129
- }
130
-
131
- const UpsellingLayout = () => {
132
- return (
133
- <Container>
134
- <UpsellingContainer
135
- horizontal
136
- showsHorizontalScrollIndicator={false}
137
- contentContainerStyle={{ paddingHorizontal: Platform.OS === 'ios' ? 40 : 0 }}
138
- >
139
- {
140
- !upsellingProducts.loading && (
141
- <>
142
- {
143
- !upsellingProducts.error ? productsList.map((product: any, i: number) => (
144
- <Item key={`${product.id}_${i}`}>
145
- <View style={{ flexBasis: '57%' }}>
146
- <Details>
147
- <OText size={12} lineHeight={18} numberOfLines={1} ellipsizeMode='tail'>{product.name}</OText>
148
- <OText size={12} lineHeight={18} color={theme.colors.textNormal}>{parsePrice(product.price)}</OText>
149
- </Details>
150
- <AddButton onPress={() => handleFormProduct(product)}>
151
- <OText size={10} color={theme.colors.primary}>{t('ADD', 'Add')}</OText>
152
- </AddButton>
153
- </View>
154
- <View>
155
- <OIcon url={product?.images || theme?.images?.dummies?.product} style={styles.imageStyle} />
156
- </View>
157
- </Item>
158
- )) : (
159
- <OText>
160
- {upsellingProducts.message}
161
- </OText>
162
- )
163
- }
164
- </>
165
- )
166
- }
167
- </UpsellingContainer>
168
- </Container>
169
- )
170
- }
171
-
172
- const UpsellingContent = () => {
173
- return (
174
- <>
175
- <View style={{ ...styles.headerItem, flex: 1, marginTop: Platform.OS == 'ios' ? 35 : 14 }}>
176
- <TouchableOpacity onPress={() => onGoBack()} style={styles.btnBackArrow}>
177
- <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
178
- </TouchableOpacity>
179
- </View>
180
- <ScrollView style={{ marginTop: 10, marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>
181
- {productsList.length > 0 &&
182
- <View style={{ paddingHorizontal: 40, overflow: 'visible' }}>
183
- <OText size={16} lineHeight={24} weight={'500'}>{t('WANT_SOMETHING_ELSE', 'Do you want something else?')}</OText>
184
- <UpsellingLayout />
185
- </View>
186
- }
187
- <View style={{ paddingHorizontal: 40 }}>
188
- <OText size={20} lineHeight={30} weight={600} style={{ marginTop: 10, marginBottom: 17 }}>{t('YOUR_CART', 'Your cart')}</OText>
189
- <OrderSummary
190
- cart={cart}
191
- commentDelayTime={commentDelayTime}
192
- isCartPending={cart?.status === 2}
193
- onNavigationRedirect={onNavigationRedirect}
194
- />
195
- </View>
196
- {showCartList && cartList.map((cart: any, i: number) => (
197
- <CartList key={i}>
198
- <Cart
199
- isFromUpselling
200
- cart={cart}
201
- cartuuid={cart.uuid}
202
- hideUpselling
203
- singleBusiness={props.singleBusiness}
204
- isFranchiseApp={props.isFranchiseApp}
205
- isCartsLoading={isCartsLoading}
206
- setIsCartsLoading={setIsCartsLoading}
207
- isMultiCheckout={isMultiCheckout}
208
- onNavigationRedirect={props.onNavigationRedirect}
209
- />
210
- <CartDivider />
211
- </CartList>
212
- ))}
213
- </ScrollView>
214
- <View
215
- style={{
216
- alignItems: 'center',
217
- bottom: props.isPage ? Platform.OS === 'ios' ? 0 : 20 : Platform.OS === 'ios' ? bottom + 59 : bottom + 125
218
- }}
219
- >
220
- <OButton
221
- imgRightSrc=''
222
- text={t('CHECKOUT', 'Checkout')}
223
- style={{ ...styles.closeUpsellingButton }}
224
- textStyle={{ color: theme.colors.white, fontSize: 14 }}
225
- onClick={() => handleUpsellingPage(cart)}
226
- />
227
- </View>
228
- </>
229
- )
230
- }
46
+ }, [upsellingProducts?.loading, upsellingProducts?.products?.length])
231
47
 
232
48
  return (
233
49
  <>
234
50
  {isCustomMode ? (
235
- <UpsellingLayout />
51
+ <UpsellingLayout {...props} productsList={productsList} />
236
52
  ) : (
237
53
  <>
238
54
  {props.isPage ? (
239
- <UpsellingContent />
55
+ <UpsellingContent {...props} cart={cart} productsList={productsList} />
240
56
  ) : (
241
57
  canOpenUpselling && (
242
58
  <OBottomPopup
@@ -245,7 +61,7 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
245
61
  onClose={() => handleUpsellingPage(cart)}
246
62
  isStatusBar
247
63
  >
248
- <UpsellingContent />
64
+ <UpsellingContent {...props} productsList={productsList} />
249
65
  </OBottomPopup>
250
66
  )
251
67
  )}
@@ -59,3 +59,22 @@ export const CartDivider = styled.View`
59
59
  background-color: ${(props: any) => props.theme.colors.backgroundGray100};
60
60
  margin: 20px -40px 0;
61
61
  `
62
+
63
+
64
+ export const TopActionsHeader = styled.TouchableOpacity`
65
+ height: 60px;
66
+ justify-content: center;
67
+ min-width: 30px;
68
+ padding-right: 15px;
69
+ `;
70
+
71
+ export const TopHeader = styled.View`
72
+ width: 100%;
73
+ flex-direction: row;
74
+ align-items: center;
75
+ justify-content: space-between;
76
+ z-index: 1;
77
+ height: 60px;
78
+ min-height: 60px;
79
+ `
80
+