ordering-ui-react-native 0.12.58 → 0.12.62

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.
@@ -1,25 +1,25 @@
1
1
  import React, { useState } from 'react';
2
- import { TouchableOpacity, View } from 'react-native'
2
+ import { ActivityIndicator, TouchableOpacity, View } from 'react-native'
3
3
  import {
4
- Cart,
5
- useOrder,
6
- useLanguage,
7
- useUtils,
8
- useConfig,
9
- useValidationFields,
4
+ Cart,
5
+ useOrder,
6
+ useLanguage,
7
+ useUtils,
8
+ useConfig,
9
+ useValidationFields,
10
10
  } from 'ordering-components/native';
11
11
 
12
12
  import {
13
- OSContainer,
14
- OSProductList,
15
- OSBill,
16
- OSTable,
13
+ OSContainer,
14
+ OSProductList,
15
+ OSBill,
16
+ OSTable,
17
17
  OSRow
18
18
  } from './styles';
19
19
 
20
20
  import { ProductItemAccordion } from '../ProductItemAccordion';
21
21
  import { CouponControl } from '../CouponControl';
22
- import { OModal, OText } from '../shared';
22
+ import { OInput, OModal, OText } from '../shared';
23
23
  import { ProductForm } from '../ProductForm';
24
24
  import { verifyDecimals } from '../../utils';
25
25
  import { useTheme } from 'styled-components/native';
@@ -27,42 +27,44 @@ import { TaxInformation } from '../TaxInformation';
27
27
  import AntIcon from 'react-native-vector-icons/AntDesign'
28
28
 
29
29
  const OrderSummaryUI = (props: any) => {
30
- const {
31
- cart,
32
- changeQuantity,
33
- getProductMax,
34
- offsetDisabled,
35
- removeProduct,
36
- isCartPending,
37
- isFromCheckout
38
- } = props;
30
+ const {
31
+ cart,
32
+ changeQuantity,
33
+ getProductMax,
34
+ offsetDisabled,
35
+ removeProduct,
36
+ isCartPending,
37
+ isFromCheckout,
38
+ handleChangeComment,
39
+ commentState
40
+ } = props;
39
41
 
40
42
  const theme = useTheme()
41
- const [, t] = useLanguage();
42
- const [{ configs }] = useConfig();
43
- const [orderState] = useOrder();
44
- const [{ parsePrice, parseNumber }] = useUtils();
45
- const [validationFields] = useValidationFields();
46
- const [openProduct, setModalIsOpen] = useState(false)
47
- const [curProduct, setCurProduct] = useState<any>(null)
43
+ const [, t] = useLanguage();
44
+ const [{ configs }] = useConfig();
45
+ const [orderState] = useOrder();
46
+ const [{ parsePrice, parseNumber }] = useUtils();
47
+ const [validationFields] = useValidationFields();
48
+ const [openProduct, setModalIsOpen] = useState(false)
49
+ const [curProduct, setCurProduct] = useState<any>(null)
48
50
  const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null })
49
51
 
50
- const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled;
52
+ const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled;
51
53
 
52
- const handleDeleteClick = (product: any) => {
53
- removeProduct(product, cart)
54
- }
54
+ const handleDeleteClick = (product: any) => {
55
+ removeProduct(product, cart)
56
+ }
55
57
 
56
- const handleEditProduct = (product: any) => {
57
- setCurProduct(product)
58
- setModalIsOpen(true)
59
- }
58
+ const handleEditProduct = (product: any) => {
59
+ setCurProduct(product)
60
+ setModalIsOpen(true)
61
+ }
60
62
 
61
- const handlerProductAction = (product: any) => {
62
- if (Object.keys(product).length) {
63
- setModalIsOpen(false)
64
- }
65
- }
63
+ const handlerProductAction = (product: any) => {
64
+ if (Object.keys(product).length) {
65
+ setModalIsOpen(false)
66
+ }
67
+ }
66
68
 
67
69
  const getIncludedTaxes = () => {
68
70
  if (cart?.taxes === null) {
@@ -74,46 +76,46 @@ const OrderSummaryUI = (props: any) => {
74
76
  }
75
77
  }
76
78
 
77
- return (
78
- <OSContainer>
79
- {cart?.products?.length > 0 && (
80
- <>
81
- <OSProductList>
82
- {cart?.products.map((product: any) => (
83
- <ProductItemAccordion
84
- key={product.code}
85
- product={product}
86
- isCartPending={isCartPending}
87
- isCartProduct
88
- changeQuantity={changeQuantity}
89
- getProductMax={getProductMax}
90
- offsetDisabled={offsetDisabled}
91
- onDeleteProduct={handleDeleteClick}
92
- onEditProduct={handleEditProduct}
93
- isFromCheckout={isFromCheckout}
94
- />
95
- ))}
96
- </OSProductList>
97
- {cart?.valid && (
98
- <OSBill>
99
- <OSTable>
100
- <OText size={12}>{t('SUBTOTAL', 'Subtotal')}</OText>
101
- <OText size={12}>{parsePrice(cart?.subtotal + getIncludedTaxes())}</OText>
102
- </OSTable>
103
- {cart?.discount > 0 && cart?.total >= 0 && (
104
- <OSTable>
105
- {cart?.discount_type === 1 ? (
106
- <OText size={12}>
107
- {t('DISCOUNT', 'Discount')}
108
- <OText size={12}>{`(${verifyDecimals(cart?.discount_rate, parsePrice)}%)`}</OText>
109
- </OText>
110
- ) : (
111
- <OText size={12}>{t('DISCOUNT', 'Discount')}</OText>
112
- )}
113
- <OText size={12}>- {parsePrice(cart?.discount || 0)}</OText>
114
- </OSTable>
115
- )}
116
- {
79
+ return (
80
+ <OSContainer>
81
+ {cart?.products?.length > 0 && (
82
+ <>
83
+ <OSProductList>
84
+ {cart?.products.map((product: any) => (
85
+ <ProductItemAccordion
86
+ key={product.code}
87
+ product={product}
88
+ isCartPending={isCartPending}
89
+ isCartProduct
90
+ changeQuantity={changeQuantity}
91
+ getProductMax={getProductMax}
92
+ offsetDisabled={offsetDisabled}
93
+ onDeleteProduct={handleDeleteClick}
94
+ onEditProduct={handleEditProduct}
95
+ isFromCheckout={isFromCheckout}
96
+ />
97
+ ))}
98
+ </OSProductList>
99
+ {cart?.valid && (
100
+ <OSBill>
101
+ <OSTable>
102
+ <OText size={12}>{t('SUBTOTAL', 'Subtotal')}</OText>
103
+ <OText size={12}>{parsePrice(cart?.subtotal + getIncludedTaxes())}</OText>
104
+ </OSTable>
105
+ {cart?.discount > 0 && cart?.total >= 0 && (
106
+ <OSTable>
107
+ {cart?.discount_type === 1 ? (
108
+ <OText size={12}>
109
+ {t('DISCOUNT', 'Discount')}
110
+ <OText size={12}>{`(${verifyDecimals(cart?.discount_rate, parsePrice)}%)`}</OText>
111
+ </OText>
112
+ ) : (
113
+ <OText size={12}>{t('DISCOUNT', 'Discount')}</OText>
114
+ )}
115
+ <OText size={12}>- {parsePrice(cart?.discount || 0)}</OText>
116
+ </OSTable>
117
+ )}
118
+ {
117
119
  cart?.taxes?.length > 0 && cart?.taxes?.filter((tax: any) => tax?.type === 2 && tax?.rate !== 0).map((tax: any) => (
118
120
  <OSTable key={tax?.id}>
119
121
  <OSRow>
@@ -145,68 +147,101 @@ const OrderSummaryUI = (props: any) => {
145
147
  </OSTable>
146
148
  ))
147
149
  }
148
- {orderState?.options?.type === 1 && cart?.delivery_price > 0 && (
149
- <OSTable>
150
- <OText size={12}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
151
- <OText size={12}>{parsePrice(cart?.delivery_price)}</OText>
152
- </OSTable>
153
- )}
154
- {cart?.driver_tip > 0 && (
155
- <OSTable>
156
- <OText size={12}>
157
- {t('DRIVER_TIP', 'Driver tip')}
158
- {cart?.driver_tip_rate > 0 &&
159
- parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
160
- !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
161
- (
162
- `(${verifyDecimals(cart?.driver_tip_rate, parseNumber)}%)`
163
- )}
164
- </OText>
165
- <OText size={12}>{parsePrice(cart?.driver_tip)}</OText>
166
- </OSTable>
167
- )}
168
- {isCouponEnabled && !isCartPending && (
169
- <View>
170
- <View style={{ paddingVertical: 5 }}>
171
- <CouponControl
172
- businessId={cart.business_id}
173
- price={cart.total}
174
- />
175
- </View>
176
- </View>
177
- )}
178
- {cart?.total >= 1 && (
179
- <View style={{ marginTop: 15, borderTopWidth: 1, borderTopColor: '#d9d9d9' }}>
180
- <OSTable style={{ marginTop: 15 }}>
181
- <OText size={14} style={{ fontWeight: 'bold' }}>
182
- {t('TOTAL', 'Total')}
183
- </OText>
184
- <OText size={14} style={{ fontWeight: 'bold' }} >
185
- {parsePrice(cart?.total)}
186
- </OText>
187
- </OSTable>
188
- </View>
189
- )}
190
- </OSBill>
191
- )}
192
- <OModal
193
- open={openProduct}
194
- entireModal
195
- customClose
196
- onClose={() => setModalIsOpen(false)}
197
- >
198
- <ProductForm
199
- isCartProduct
200
- productCart={curProduct}
201
- businessSlug={cart?.business?.slug}
202
- businessId={cart?.business_id}
203
- categoryId={curProduct?.category_id}
204
- productId={curProduct?.id}
205
- onSave={handlerProductAction}
206
- onClose={() => setModalIsOpen(false)}
207
- isFromCheckout={isFromCheckout}
208
- />
209
- </OModal>
150
+ {orderState?.options?.type === 1 && cart?.delivery_price > 0 && (
151
+ <OSTable>
152
+ <OText size={12}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
153
+ <OText size={12}>{parsePrice(cart?.delivery_price)}</OText>
154
+ </OSTable>
155
+ )}
156
+ {cart?.driver_tip > 0 && (
157
+ <OSTable>
158
+ <OText size={12}>
159
+ {t('DRIVER_TIP', 'Driver tip')}
160
+ {cart?.driver_tip_rate > 0 &&
161
+ parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
162
+ !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
163
+ (
164
+ `(${verifyDecimals(cart?.driver_tip_rate, parseNumber)}%)`
165
+ )}
166
+ </OText>
167
+ <OText size={12}>{parsePrice(cart?.driver_tip)}</OText>
168
+ </OSTable>
169
+ )}
170
+ {isCouponEnabled && !isCartPending && (
171
+ <View>
172
+ <View style={{ paddingVertical: 5 }}>
173
+ <CouponControl
174
+ businessId={cart.business_id}
175
+ price={cart.total}
176
+ />
177
+ </View>
178
+ </View>
179
+ )}
180
+ {cart?.total >= 1 && (
181
+ <View style={{ marginTop: 15, borderTopWidth: 1, borderTopColor: '#d9d9d9' }}>
182
+ <OSTable style={{ marginTop: 15 }}>
183
+ <OText size={14} style={{ fontWeight: 'bold' }}>
184
+ {t('TOTAL', 'Total')}
185
+ </OText>
186
+ <OText size={14} style={{ fontWeight: 'bold' }} >
187
+ {parsePrice(cart?.total)}
188
+ </OText>
189
+ </OSTable>
190
+ </View>
191
+ )}
192
+ {cart?.status !== 2 && (
193
+ <OSTable>
194
+ <View style={{ width: '100%', marginTop: 20 }}>
195
+ <OText size={12}>{t('COMMENTS', 'Comments')}</OText>
196
+ <View style={{ flex: 1, width: '100%' }}>
197
+ <OInput
198
+ value={cart?.comment}
199
+ placeholder={t('SPECIAL_COMMENTS', 'Special Comments')}
200
+ onChange={(value: string) => handleChangeComment(value)}
201
+ style={{
202
+ alignItems: 'flex-start',
203
+ width: '100%',
204
+ height: 100,
205
+ borderColor: theme.colors.textSecondary,
206
+ paddingRight: 50,
207
+ marginTop: 10
208
+ }}
209
+ multiline
210
+ inputStyle={{ color: theme.colors.textPrimary, fontSize: 12 }}
211
+ />
212
+ {commentState?.loading && (
213
+ <View style={{ position: 'absolute', right: 20 }}>
214
+ <ActivityIndicator
215
+ size='large'
216
+ style={{ height: 100 }}
217
+ color={theme.colors.primary}
218
+ />
219
+ </View>
220
+ )}
221
+ </View>
222
+ </View>
223
+ </OSTable>
224
+ )}
225
+ </OSBill>
226
+ )}
227
+ <OModal
228
+ open={openProduct}
229
+ entireModal
230
+ customClose
231
+ onClose={() => setModalIsOpen(false)}
232
+ >
233
+ <ProductForm
234
+ isCartProduct
235
+ productCart={curProduct}
236
+ businessSlug={cart?.business?.slug}
237
+ businessId={cart?.business_id}
238
+ categoryId={curProduct?.category_id}
239
+ productId={curProduct?.id}
240
+ onSave={handlerProductAction}
241
+ onClose={() => setModalIsOpen(false)}
242
+ isFromCheckout={isFromCheckout}
243
+ />
244
+ </OModal>
210
245
  <OModal
211
246
  open={openTaxModal.open}
212
247
  onClose={() => setOpenTaxModal({ open: false, data: null })}
@@ -214,19 +249,19 @@ const OrderSummaryUI = (props: any) => {
214
249
  >
215
250
  <TaxInformation data={openTaxModal.data} products={cart.products} />
216
251
  </OModal>
217
- </>
218
- )}
219
- </OSContainer>
220
- )
252
+ </>
253
+ )}
254
+ </OSContainer>
255
+ )
221
256
  }
222
257
 
223
258
  export const OrderSummary = (props: any) => {
224
- const orderSummaryProps = {
225
- ...props,
226
- UIComponent: OrderSummaryUI
227
- }
259
+ const orderSummaryProps = {
260
+ ...props,
261
+ UIComponent: OrderSummaryUI
262
+ }
228
263
 
229
- return (
230
- <Cart {...orderSummaryProps} />
231
- )
264
+ return (
265
+ <Cart {...orderSummaryProps} />
266
+ )
232
267
  }
@@ -21,31 +21,36 @@ export const TaxInformation = (props: taxInformationParams) => {
21
21
  const isTax = typeof data?.rate === 'number'
22
22
  const TaxFeeString = isTax ? 'tax' : 'fee'
23
23
  const includedOnPriceString = data?.type === 1 ? `(${t('INCLUDED_ON_PRICE', 'Included on price')})` : `(${t('NOT_INCLUDED_ON_PRICE', 'Not included on price')})`
24
+ const productsWithTaxes = products
25
+ .filter((product: any) => isTax
26
+ ? (product.tax?.id ? product.tax?.id === data?.id: product.tax?.id === null && data?.id === null)
27
+ : (product.fee?.id ? product.fee?.id === data?.id : (product.fee?.id === null && data?.id === null))) ?? []
24
28
 
25
29
  return (
26
30
  <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}%`})`}
31
+ <OText size={18} style={{ alignSelf: 'flex-start', textAlign: 'left' }} mBottom={10}>
32
+ {`${data?.name ?? t('INHERIT_FROM_BUSINESS', 'Inherit from business')} (${typeof data?.rate === 'number' ? `${data?.rate}%` : `${parsePrice(data?.fixed ?? 0)} + ${data?.percentage}%`})`}
30
33
  </OText>
31
34
  {data?.description && (
32
- <OText mBottom={10} size={18} style={{ alignSelf: 'center', textAlign: 'center' }}>
35
+ <OText mBottom={10} size={16} style={{ alignSelf: 'flex-start', textAlign: 'left' }}>
33
36
  {t('DESCRIPTION', 'Description')}: {data?.description} {data?.type && includedOnPriceString}
34
37
  </OText>
35
38
  )}
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>
39
+ {productsWithTaxes.length > 0 && (
40
+ <>
41
+ <OText>{`${t(`OTHER_PRODUCTS_WITH_THIS_${TaxFeeString.toUpperCase()}`, `Other products with this ${TaxFeeString}`)}:`}</OText>
42
+ <ProductContainer>
43
+ {productsWithTaxes.map(product => (
44
+ <SingleProductCard
45
+ key={product.id}
46
+ product={product}
47
+ isSoldOut={false}
48
+ businessId={product?.business_id}
49
+ />
50
+ ))}
51
+ </ProductContainer>
52
+ </>
53
+ )}
49
54
  </TaxInformationContainer>
50
55
  )
51
56
  }
@@ -1,9 +1,10 @@
1
1
  import styled from 'styled-components/native'
2
2
 
3
3
  export const TaxInformationContainer = styled.ScrollView`
4
- padding: 10px;
4
+ padding: 10px 40px;
5
5
  `
6
6
 
7
7
  export const ProductContainer = styled.View`
8
- flex: 1
8
+ flex: 1;
9
+ margin-top: 10px;
9
10
  `
@@ -215,7 +215,7 @@ export interface SingleProductCardParams {
215
215
  businessId: any,
216
216
  product: any;
217
217
  isSoldOut: boolean;
218
- onProductClick: any;
218
+ onProductClick?: any;
219
219
  }
220
220
  export interface BusinessInformationParams {
221
221
  navigation?: any,