ordering-ui-react-native 0.14.29 → 0.14.31-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 (61) hide show
  1. package/package.json +2 -2
  2. package/src/components/BusinessItemAccordion/index.tsx +2 -2
  3. package/src/components/BusinessProductsListing/index.tsx +10 -26
  4. package/src/components/Cart/index.tsx +136 -62
  5. package/src/components/Cart/styles.tsx +7 -0
  6. package/src/components/Checkout/index.tsx +10 -6
  7. package/src/components/LogoutButton/index.tsx +14 -0
  8. package/src/components/OrderDetails/index.tsx +102 -34
  9. package/src/components/OrderDetails/styles.tsx +7 -0
  10. package/src/components/OrderSummary/index.tsx +142 -58
  11. package/src/components/OrderSummary/styles.tsx +10 -2
  12. package/src/components/ProductForm/index.tsx +72 -27
  13. package/src/components/ProductForm/styles.tsx +1 -1
  14. package/src/components/SingleProductCard/index.tsx +1 -1
  15. package/src/components/TaxInformation/index.tsx +58 -26
  16. package/src/components/UpsellingProducts/index.tsx +13 -31
  17. package/src/components/VerifyPhone/styles.tsx +1 -2
  18. package/src/navigators/HomeNavigator.tsx +6 -0
  19. package/src/pages/ProductDetails.tsx +55 -0
  20. package/src/types/index.tsx +2 -0
  21. package/src/types/react-native-color-matrix-image-filters/index.d.ts +1 -0
  22. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  23. package/themes/doordash/src/components/ProductForm/index.tsx +41 -2
  24. package/themes/doordash/src/components/ProductForm/styles.tsx +1 -1
  25. package/themes/instacart/src/components/ProductForm/index.tsx +40 -1
  26. package/themes/instacart/src/components/ProductForm/styles.tsx +1 -1
  27. package/themes/kiosk/src/components/Cart/index.tsx +14 -21
  28. package/themes/kiosk/src/components/CartItem/index.tsx +9 -7
  29. package/themes/kiosk/src/components/CustomerName/index.tsx +2 -1
  30. package/themes/kiosk/src/components/Intro/index.tsx +4 -4
  31. package/themes/kiosk/src/components/OptionCard/index.tsx +11 -6
  32. package/themes/kiosk/src/components/PaymentOptions/index.tsx +46 -44
  33. package/themes/original/index.tsx +4 -0
  34. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -9
  35. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -2
  36. package/themes/original/src/components/BusinessPreorder/index.tsx +37 -34
  37. package/themes/original/src/components/BusinessProductsList/index.tsx +3 -3
  38. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +35 -0
  39. package/themes/original/src/components/BusinessProductsListing/index.tsx +16 -47
  40. package/themes/original/src/components/Cart/index.tsx +10 -31
  41. package/themes/original/src/components/Checkout/index.tsx +2 -0
  42. package/themes/original/src/components/Checkout/styles.tsx +1 -0
  43. package/themes/original/src/components/DriverTips/index.tsx +3 -3
  44. package/themes/original/src/components/DriverTips/styles.tsx +5 -5
  45. package/themes/original/src/components/FacebookLogin/index.tsx +20 -5
  46. package/themes/original/src/components/Help/index.tsx +1 -1
  47. package/themes/original/src/components/Home/index.tsx +5 -3
  48. package/themes/original/src/components/LoginForm/index.tsx +50 -49
  49. package/themes/original/src/components/MessageListing/index.tsx +4 -2
  50. package/themes/original/src/components/OrderDetails/index.tsx +3 -1
  51. package/themes/original/src/components/OrderSummary/index.tsx +11 -30
  52. package/themes/original/src/components/PaymentOptionWallet/index.tsx +10 -6
  53. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -0
  54. package/themes/original/src/components/ProductForm/index.tsx +125 -83
  55. package/themes/original/src/components/ProductForm/styles.tsx +10 -3
  56. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  57. package/themes/original/src/components/SingleProductCard/index.tsx +22 -13
  58. package/themes/original/src/components/SingleProductCard/styles.tsx +6 -0
  59. package/themes/original/src/components/UpsellingProducts/index.tsx +84 -86
  60. package/themes/original/src/types/index.tsx +7 -1
  61. package/themes/uber-eats/src/components/ProductForm/index.tsx +43 -2
@@ -27,7 +27,7 @@ import {
27
27
  ProductComment,
28
28
  ProductActions
29
29
  } from './styles'
30
- import { OButton, OInput, OText } from '../shared'
30
+ import { OButton, OIcon, OInput, OText } from '../shared'
31
31
  import { ProductOptionSubOption } from '../ProductOptionSubOption'
32
32
  import { NotFoundSource } from '../NotFoundSource'
33
33
  import { Placeholder,PlaceholderLine,Fade } from 'rn-placeholder'
@@ -52,13 +52,12 @@ export const ProductOptionsUI = (props: any) => {
52
52
  handleChangeSuboptionState,
53
53
  handleChangeCommentState,
54
54
  productObject,
55
- onClose,
56
55
  businessSlug
57
56
  } = props
58
57
 
59
58
  const theme = useTheme();
60
59
 
61
- const [{ parsePrice }] = useUtils()
60
+ const [{ optimizeImage, parsePrice }] = useUtils()
62
61
  const [, t] = useLanguage()
63
62
  const [orderState] = useOrder()
64
63
  const [{ auth }] = useSession()
@@ -84,7 +83,6 @@ export const ProductOptionsUI = (props: any) => {
84
83
  }
85
84
 
86
85
  const handleRedirectLogin = (product : any) => {
87
- onClose()
88
86
  navigation.navigate('Login', {product: {businessId: product?.businessId, id: product?.id, categoryId: product?.categoryId, slug: businessSlug} })
89
87
  }
90
88
 
@@ -110,7 +108,7 @@ export const ProductOptionsUI = (props: any) => {
110
108
  name="x"
111
109
  size={35}
112
110
  style={{ color: theme.colors.white, backgroundColor: 'rgba(0,0,0,0.3)' }}
113
- onPress={onClose}
111
+ onPress={props.handleGoBack}
114
112
  />
115
113
  </View>
116
114
  </TopHeader>
@@ -132,27 +130,32 @@ export const ProductOptionsUI = (props: any) => {
132
130
  ) : (
133
131
  <>
134
132
  <View style={{ flexDirection: 'column', width: '100%' }}>
135
- <OText size={20} style={{ flex: I18nManager.isRTL ? 0 : 1, marginBottom: 10 }}>{product?.name || productCart.name}</OText>
136
- {(product?.estimated_person || (product?.sku && product?.sku !== '-1' && product?.sku !== '1')) && (
133
+ <View style={{ flexDirection: 'row', marginTop: 15 }}>
134
+ <OText size={20} style={{ flex: I18nManager.isRTL ? 0 : 1, marginBottom: 10 }}>{product?.name || productCart.name}{' '}</OText>
135
+ {!!product?.calories && (
136
+ <OText size={16} style={styles.caloriesStyle}>{product?.calories} cal</OText>
137
+ )}
138
+ </View>
139
+ <View style={{ flexDirection: 'row', marginBottom: 10 }}>
140
+ <OText size={16} style={{ flex: I18nManager.isRTL ? 1 : 0 }} color={theme.colors.primary}>{productCart.price ? parsePrice(productCart.price) : ''}</OText>
141
+ {product?.offer_price !== null && product?.in_offer && (
142
+ <OText style={styles.regularPriceStyle}>{parsePrice(product?.offer_price)}</OText>
143
+ )}
144
+ </View>
145
+ {(!!product?.estimated_person || (!!product?.sku && product?.sku !== '-1' && product?.sku !== '1')) && (
137
146
  <OText size={14} style={{ flex: I18nManager.isRTL ? 1 : 0, marginBottom: 10 }} color={'#909BA9'}>
138
147
  {
139
148
  ((product?.sku && product?.sku !== '-1' && product?.sku !== '1') || (productCart?.sku && productCart?.sku !== '-1' && productCart?.sku !== '1'))
140
149
  && <>{t('SKU', 'Sku')}{' '}{product?.sku || productCart?.sku}</>
141
150
  }
142
- {product?.sku && product?.sku !== '-1' && product?.sku !== '1' && product?.estimated_person && (
151
+ {!!product?.sku && product?.sku !== '-1' && product?.sku !== '1' && !!product?.estimated_person && (
143
152
  <>&nbsp;&#183;&nbsp;</>
144
153
  )}
145
- {product?.estimated_person
154
+ {!!product?.estimated_person
146
155
  && <>{product?.estimated_person}{' '}{t('ESTIMATED_PERSONS', 'persons')}</>
147
156
  }
148
157
  </OText>
149
158
  )}
150
- <View style={{ flexDirection: 'row', marginBottom: 10}}>
151
- <OText size={16} style={{ flex: I18nManager.isRTL ? 1 : 0 }} color={theme.colors.primary}>{productCart.price ? parsePrice(productCart.price) : ''}</OText>
152
- {product?.offer_price && (
153
- <OText style={styles.regularPriceStyle}>{parsePrice(product?.offer_price)}</OText>
154
- )}
155
- </View>
156
159
  </View>
157
160
  </>
158
161
  )}
@@ -160,19 +163,44 @@ export const ProductOptionsUI = (props: any) => {
160
163
  <ProductDescription>
161
164
  <OText>{product?.description || productCart?.description}</OText>
162
165
  </ProductDescription>
166
+ <ScrollView
167
+ horizontal
168
+ showsHorizontalScrollIndicator={false}
169
+ contentContainerStyle={{ paddingBottom: 20 }}
170
+ >
171
+ {product?.tags?.map((tag: any) => (
172
+ <View
173
+ key={tag.id}
174
+ style={styles.productTagWrapper}
175
+ >
176
+ {tag?.image ? (
177
+ <OIcon
178
+ url={optimizeImage(tag?.image, 'h_40,c_limit')}
179
+ style={styles.productTagImageStyle}
180
+ />
181
+ ) : (
182
+ <OIcon
183
+ src={theme.images?.dummies?.product}
184
+ style={styles.productTagImageStyle}
185
+ />
186
+ )}
187
+ <OText size={14} style={styles.productTagNameStyle}>{tag.name}</OText>
188
+ </View>
189
+ ))}
190
+ </ScrollView>
163
191
  {loading && !product ? (
164
192
  <>
165
- {[...Array(2)].map((item,i) => (
166
- <Placeholder key={i} style={{marginBottom: 20}} Animation={Fade}>
167
- <PlaceholderLine height={40} style={{ flex: 1, marginTop: 10 }} />
168
- {[...Array(3)].map((item,i) => (
169
- <View key={i} style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
170
- <PlaceholderLine height={30} width={10} style={{marginBottom: 20}} />
171
- <PlaceholderLine height={30} width={50} style={{marginBottom: 20}} />
172
- <PlaceholderLine height={30} width={30} style={{marginBottom: 20}} />
173
- </View>
174
- ))}
175
- </Placeholder>
193
+ {[...Array(2)].map((item, i) => (
194
+ <Placeholder key={i} style={{ marginBottom: 20 }} Animation={Fade}>
195
+ <PlaceholderLine height={40} style={{ flex: 1, marginTop: 10 }} />
196
+ {[...Array(3)].map((item, i) => (
197
+ <View key={i} style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
198
+ <PlaceholderLine height={30} width={10} style={{ marginBottom: 20 }} />
199
+ <PlaceholderLine height={30} width={50} style={{ marginBottom: 20 }} />
200
+ <PlaceholderLine height={30} width={30} style={{ marginBottom: 20 }} />
201
+ </View>
202
+ ))}
203
+ </Placeholder>
176
204
  ))}
177
205
  </>
178
206
  ) : (
@@ -221,7 +249,7 @@ export const ProductOptionsUI = (props: any) => {
221
249
  state={currentState}
222
250
  disabled={isSoldOut || maxProductQuantity <= 0}
223
251
  />
224
- ): null
252
+ ) : null
225
253
  })
226
254
  }
227
255
  </WrapperSubOption>
@@ -383,6 +411,23 @@ const styles = StyleSheet.create({
383
411
  textDecorationLine: 'line-through',
384
412
  marginLeft: 7,
385
413
  marginRight: 7
414
+ },
415
+ caloriesStyle: {
416
+ color: '#808080'
417
+ },
418
+ productTagWrapper: {
419
+ flexDirection: 'row',
420
+ alignItems: 'center'
421
+ },
422
+ productTagImageStyle: {
423
+ width: 32,
424
+ height: 32,
425
+ borderRadius: 8,
426
+ resizeMode: 'cover'
427
+ },
428
+ productTagNameStyle: {
429
+ paddingHorizontal: 6,
430
+ marginRight: 5
386
431
  }
387
432
  })
388
433
 
@@ -41,7 +41,7 @@ export const ProductTitle = styled.View`
41
41
  `
42
42
 
43
43
  export const ProductDescription = styled.View`
44
- margin-bottom: 30px;
44
+ margin-bottom: 20px;
45
45
  `
46
46
 
47
47
  export const ProductEditions = styled.View`
@@ -86,7 +86,7 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
86
86
  <OText size={12} numberOfLines={2} ellipsizeMode='tail' style={styles.textStyle}>{product?.description}</OText>
87
87
  <PricesContainer>
88
88
  <OText color={theme.colors.primary}>{parsePrice(product?.price)}</OText>
89
- {product?.offer_price && (
89
+ {product?.offer_price !== null && product?.in_offer && (
90
90
  <OText style={styles.regularPriceStyle}>{parsePrice(product?.offer_price)}</OText>
91
91
  )}
92
92
  </PricesContainer>
@@ -1,51 +1,83 @@
1
1
  import React from 'react'
2
- import { useLanguage, useUtils } from 'ordering-components/native'
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
+ },
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))
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
  }
@@ -16,7 +16,6 @@ import {
16
16
  AddButton,
17
17
  CloseUpselling
18
18
  } from './styles'
19
- import { ProductForm } from '../ProductForm';
20
19
  import { useTheme } from 'styled-components/native'
21
20
 
22
21
  const UpsellingProductsUI = (props: UpsellingProductsParams) => {
@@ -27,7 +26,9 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
27
26
  handleUpsellingPage,
28
27
  openUpselling,
29
28
  canOpenUpselling,
30
- setCanOpenUpselling
29
+ setCanOpenUpselling,
30
+ onRedirect,
31
+ setOpenUpselling
31
32
  } = props
32
33
 
33
34
  const theme = useTheme();
@@ -53,8 +54,6 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
53
54
  }
54
55
  })
55
56
 
56
- const [actualProduct, setActualProduct] = useState<any>(null)
57
- const [modalIsOpen, setModalIsOpen] = useState(false)
58
57
  const [{ parsePrice }] = useUtils()
59
58
  const [, t] = useLanguage()
60
59
 
@@ -71,13 +70,15 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
71
70
  }, [upsellingProducts.loading, upsellingProducts?.products.length])
72
71
 
73
72
  const handleFormProduct = (product: any) => {
74
- setActualProduct(product)
75
- setModalIsOpen(true)
76
- }
77
-
78
- const handleSaveProduct = () => {
79
- setActualProduct(null)
80
- setModalIsOpen(false)
73
+ setOpenUpselling && setOpenUpselling(false)
74
+ onRedirect && onRedirect('ProductDetails', {
75
+ product: product,
76
+ businessId: product?.api?.businessId,
77
+ businessSlug: business.slug,
78
+ onAction: () => {
79
+ setOpenUpselling && setOpenUpselling(true)
80
+ }
81
+ })
81
82
  }
82
83
 
83
84
  const UpsellingLayout = () => {
@@ -132,13 +133,12 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
132
133
  <>
133
134
  {!canOpenUpselling || upsellingProducts?.products?.length === 0 ? null : (
134
135
  <>
135
- {!modalIsOpen && (
136
136
  <OBottomPopup
137
137
  title={t('WANT_SOMETHING_ELSE', 'Do you want something else?')}
138
138
  open={openUpselling}
139
139
  onClose={() => handleUpsellingPage()}
140
140
  >
141
- <UpsellingLayout />
141
+ <UpsellingLayout />
142
142
  <CloseUpselling>
143
143
  <OButton
144
144
  imgRightSrc=''
@@ -148,28 +148,10 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
148
148
  />
149
149
  </CloseUpselling>
150
150
  </OBottomPopup>
151
- )}
152
151
  </>
153
152
  )}
154
153
  </>
155
154
  )}
156
- <OModal
157
- open={modalIsOpen}
158
- onClose={() => setModalIsOpen(false)}
159
- entireModal
160
- customClose
161
- isAvoidKeyBoardView
162
- >
163
- {actualProduct && (
164
- <ProductForm
165
- product={actualProduct}
166
- businessId={actualProduct?.api?.businessId}
167
- businessSlug={business.slug}
168
- onSave={() => handleSaveProduct()}
169
- onClose={() => setModalIsOpen(false)}
170
- />
171
- )}
172
- </OModal>
173
155
  </>
174
156
  )
175
157
  }
@@ -2,7 +2,7 @@ import styled from 'styled-components/native';
2
2
 
3
3
  export const Container = styled.View`
4
4
  width: 100%;
5
- padding: 0 43px;
5
+ padding: 0 30px;
6
6
  `
7
7
 
8
8
  export const CountDownContainer = styled.View`
@@ -20,7 +20,6 @@ export const ResendSection = styled.View`
20
20
  display: flex;
21
21
  flex-direction: row;
22
22
  justify-content: center;
23
- flex-wrap: wrap;
24
23
  `
25
24
 
26
25
  export const WrappCountdown = styled.View`
@@ -21,6 +21,7 @@ import HelpOrder from '../pages/HelpOrder'
21
21
  import HelpGuide from '../pages/HelpGuide'
22
22
  import HelpAccountAndPayment from '../pages/HelpAccountAndPayment'
23
23
  import Splash from '../pages/Splash';
24
+ import ProductDetails from '../pages/ProductDetails';
24
25
  const Stack = createStackNavigator();
25
26
 
26
27
  const HomeNavigator = (e : any) => {
@@ -101,6 +102,11 @@ const HomeNavigator = (e : any) => {
101
102
  component={BusinessProductsList}
102
103
  options={{ headerShown: false }}
103
104
  />
105
+ <Stack.Screen
106
+ name="ProductDetails"
107
+ component={ProductDetails}
108
+ options={{ headerShown: false }}
109
+ />
104
110
  <Stack.Screen
105
111
  name="ReviewOrder"
106
112
  component={ReviewOrder}
@@ -0,0 +1,55 @@
1
+ import * as React from 'react';
2
+ import styled, { useTheme } from 'styled-components/native';
3
+ import { Platform } from 'react-native';
4
+ import { ProductForm as ProductFormController } from '../components/ProductForm';
5
+ interface Props {
6
+ navigation: any;
7
+ route: any;
8
+ }
9
+
10
+ const ProductDetails = (props: Props) => {
11
+ const theme = useTheme()
12
+
13
+ const productProps = {
14
+ ...props,
15
+ isCartProduct: props.route.params?.isCartProduct,
16
+ isFromCheckout: props.route.params?.isFromCheckout,
17
+ productCart: props.route.params?.productCart,
18
+ product: props.route.params?.product,
19
+ businessSlug: props.route.params?.businessSlug,
20
+ businessId: props.route.params?.businessId,
21
+ categoryId: props.route.params?.categoryId,
22
+ productId: props.route.params?.productId,
23
+ onSave: props?.navigation?.canGoBack()
24
+ ? () => { props.route.params?.onAction && props.route.params?.onAction(); props?.navigation?.goBack(); }
25
+ : () => { props.route.params?.onAction && props.route.params?.onAction(); props?.navigation?.navigate('BottomTab') }
26
+ ,
27
+ handleGoBack: props?.navigation?.canGoBack()
28
+ ? () => {
29
+ props.route.params?.onAction &&
30
+ props.route.params?.onAction();
31
+ props?.navigation?.goBack();
32
+ }
33
+ : (businessSlug: any) => {
34
+ props.route.params?.onAction &&
35
+ props.route.params?.onAction();
36
+ businessSlug
37
+ ? props?.navigation.navigate('Business', { store: businessSlug })
38
+ : props?.navigation.navigate('BottomTab')
39
+ }
40
+ };
41
+
42
+ const BusinessProductsListView = styled.SafeAreaView`
43
+ flex: 1;
44
+ background-color: ${theme.colors.backgroundPage};
45
+ padding-top: ${Platform.OS === 'ios' ? '0px' : '20px'};
46
+ `;
47
+
48
+ return (
49
+ <BusinessProductsListView>
50
+ <ProductFormController {...productProps} />
51
+ </BusinessProductsListView>
52
+ );
53
+ };
54
+
55
+ export default ProductDetails;
@@ -408,6 +408,8 @@ export interface UpsellingProductsParams {
408
408
  isCustomMode?: boolean;
409
409
  upsellingProducts?: any;
410
410
  business?: any;
411
+ setOpenUpselling?: any;
412
+ onRedirect?: any;
411
413
  businessId?: number;
412
414
  cartProducts?: Array<any>;
413
415
  handleUpsellingPage: () => void;
@@ -0,0 +1 @@
1
+ declare module 'react-native-color-matrix-image-filters'
@@ -410,8 +410,7 @@ const LoginFormUI = (props: LoginParams) => {
410
410
  textInputProps={{
411
411
  returnKeyType: 'next',
412
412
  onSubmitEditing: () => inputRef?.current?.focus?.(),
413
- style: { borderWidth: 0, fontSize: 12 },
414
- maxLength: 10
413
+ style: { borderWidth: 0, fontSize: 12 }
415
414
  }}
416
415
  textWrapStyle={{ borderColor: theme.colors.clear, borderWidth: 0, height: 40, paddingStart: 0 }}
417
416
  />
@@ -100,9 +100,23 @@ export const ProductOptionsUI = (props: any) => {
100
100
  zIndex: 0
101
101
  },
102
102
  closeButton: { width: 11, height: 32, backgroundColor: theme.colors.white, alignItems: 'center', justifyContent: 'center' },
103
- quantityWrap: { width: 40, height: 24, alignItems: 'center', justifyContent: 'center', borderRadius: 7.6, backgroundColor: theme.colors.inputDisabled }
103
+ quantityWrap: { width: 40, height: 24, alignItems: 'center', justifyContent: 'center', borderRadius: 7.6, backgroundColor: theme.colors.inputDisabled },
104
+ productTagWrapper: {
105
+ flexDirection: 'row',
106
+ alignItems: 'center'
107
+ },
108
+ productTagImageStyle: {
109
+ width: 32,
110
+ height: 32,
111
+ borderRadius: 8,
112
+ resizeMode: 'cover'
113
+ },
114
+ productTagNameStyle: {
115
+ paddingHorizontal: 6,
116
+ marginRight: 5
117
+ }
104
118
  })
105
- const [{ parsePrice }] = useUtils()
119
+ const [{ optimizeImage, parsePrice }] = useUtils()
106
120
  const [, t] = useLanguage()
107
121
  const [orderState] = useOrder()
108
122
  const [{ auth }] = useSession()
@@ -215,6 +229,31 @@ export const ProductOptionsUI = (props: any) => {
215
229
  <OText color={theme.colors.textSecondary}>{product?.description || productCart?.description}</OText>
216
230
  </ProductDescription>
217
231
  )}
232
+ <ScrollView
233
+ horizontal
234
+ showsHorizontalScrollIndicator={false}
235
+ contentContainerStyle={{ paddingBottom: 20 }}
236
+ >
237
+ {product?.tags?.map((tag: any) => (
238
+ <View
239
+ key={tag.id}
240
+ style={styles.productTagWrapper}
241
+ >
242
+ {tag?.image ? (
243
+ <OIcon
244
+ url={optimizeImage(tag?.image, 'h_40,c_limit')}
245
+ style={styles.productTagImageStyle}
246
+ />
247
+ ) : (
248
+ <OIcon
249
+ src={theme.images?.dummies?.product}
250
+ style={styles.productTagImageStyle}
251
+ />
252
+ )}
253
+ <OText color={theme.colors.textSecondary} style={styles.productTagNameStyle}>{tag.name}</OText>
254
+ </View>
255
+ ))}
256
+ </ScrollView>
218
257
  {loading && !product ? (
219
258
  <>
220
259
  {[...Array(2)].map((item, i) => (
@@ -40,7 +40,7 @@ export const ProductTitle = styled.View`
40
40
 
41
41
  export const ProductDescription = styled.View`
42
42
  margin-top: 10px;
43
- margin-bottom: 30px;
43
+ margin-bottom: 20px;
44
44
  `
45
45
 
46
46
  export const ProductEditions = styled.View`
@@ -59,7 +59,7 @@ export const ProductOptionsUI = (props: any) => {
59
59
 
60
60
  const theme = useTheme();
61
61
 
62
- const [{ parsePrice }] = useUtils()
62
+ const [{ optimizeImage, parsePrice }] = useUtils()
63
63
  const [, t] = useLanguage()
64
64
  const [orderState] = useOrder()
65
65
  const [{ auth }] = useSession()
@@ -162,6 +162,31 @@ export const ProductOptionsUI = (props: any) => {
162
162
  <OText mBottom={7} style={{ ...theme.labels.small }} color={theme.colors.textSecondary}>{product?.description?.trim() || productCart?.description?.trim()}</OText>
163
163
  </ProductDescription>
164
164
  )}
165
+ <ScrollView
166
+ horizontal
167
+ showsHorizontalScrollIndicator={false}
168
+ contentContainerStyle={{ paddingBottom: 20 }}
169
+ >
170
+ {product?.tags?.map((tag: any) => (
171
+ <View
172
+ key={tag.id}
173
+ style={styles.productTagWrapper}
174
+ >
175
+ {tag?.image ? (
176
+ <OIcon
177
+ url={optimizeImage(tag?.image, 'h_40,c_limit')}
178
+ style={styles.productTagImageStyle}
179
+ />
180
+ ) : (
181
+ <OIcon
182
+ src={theme.images?.dummies?.product}
183
+ style={styles.productTagImageStyle}
184
+ />
185
+ )}
186
+ <OText color={theme.colors.textSecondary} style={{ ...styles.productTagNameStyle, ...theme.labels.small}}>{tag.name}</OText>
187
+ </View>
188
+ ))}
189
+ </ScrollView>
165
190
  <View style={{ height: 16, backgroundColor: theme.colors.secundary, marginHorizontal: -40, marginBottom: 20 }} />
166
191
  {loading && !product ? (
167
192
  <>
@@ -392,6 +417,20 @@ const styles = StyleSheet.create({
392
417
  paddingStart: 4,
393
418
  paddingEnd: 4,
394
419
  borderWidth: 1
420
+ },
421
+ productTagWrapper: {
422
+ flexDirection: 'row',
423
+ alignItems: 'center'
424
+ },
425
+ productTagImageStyle: {
426
+ width: 32,
427
+ height: 32,
428
+ borderRadius: 8,
429
+ resizeMode: 'cover'
430
+ },
431
+ productTagNameStyle: {
432
+ paddingHorizontal: 6,
433
+ marginRight: 5
395
434
  }
396
435
  })
397
436
 
@@ -38,7 +38,7 @@ export const ProductTitle = styled.View`
38
38
  `
39
39
 
40
40
  export const ProductDescription = styled.View`
41
- margin-bottom: 30px;
41
+ margin-bottom: 10px;
42
42
  `
43
43
 
44
44
  export const ProductEditions = styled.View`