ordering-ui-react-native 0.14.22-release → 0.14.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/components/ProductForm/index.tsx +15 -13
- package/themes/doordash/src/components/ProductForm/index.tsx +16 -14
- package/themes/instacart/src/components/BusinessProductsList/styles.tsx +1 -1
- package/themes/instacart/src/components/ProductForm/index.tsx +15 -13
- package/themes/instacart/src/components/SingleProductCard/index.tsx +24 -19
- package/themes/instacart/src/components/SingleProductCard/styles.tsx +4 -6
- package/themes/kiosk/src/components/ProductForm/index.tsx +15 -13
- package/themes/original/index.tsx +4 -0
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +2 -1
- package/themes/original/src/components/BusinessesListing/index.tsx +25 -19
- package/themes/original/src/components/Cart/index.tsx +27 -9
- package/themes/original/src/components/CartContent/index.tsx +1 -0
- package/themes/original/src/components/Checkout/index.tsx +15 -4
- package/themes/original/src/components/Checkout/styles.tsx +5 -1
- package/themes/original/src/components/Help/index.tsx +2 -2
- package/themes/original/src/components/OrderDetails/index.tsx +54 -0
- package/themes/original/src/components/OrderProgress/index.tsx +2 -2
- package/themes/original/src/components/OrderSummary/index.tsx +21 -3
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +163 -0
- package/themes/original/src/components/PaymentOptionWallet/styles.tsx +38 -0
- package/themes/original/src/components/ProductForm/index.tsx +21 -19
- package/themes/original/src/components/UserProfile/index.tsx +5 -0
- package/themes/original/src/components/WalletTransactionItem/index.tsx +68 -0
- package/themes/original/src/components/WalletTransactionItem/styles.tsx +37 -0
- package/themes/original/src/components/Wallets/index.tsx +204 -0
- package/themes/original/src/components/Wallets/styles.tsx +43 -0
- package/themes/original/src/types/index.tsx +4 -2
- package/themes/single-business/src/components/ProductForm/index.tsx +29 -28
- package/themes/uber-eats/src/components/ProductForm/index.tsx +15 -13
|
@@ -28,7 +28,6 @@ import { TouchableOpacity } from 'react-native';
|
|
|
28
28
|
|
|
29
29
|
const OrderSummaryUI = (props: any) => {
|
|
30
30
|
const {
|
|
31
|
-
cart,
|
|
32
31
|
changeQuantity,
|
|
33
32
|
getProductMax,
|
|
34
33
|
offsetDisabled,
|
|
@@ -76,6 +75,16 @@ const OrderSummaryUI = (props: any) => {
|
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
|
|
78
|
+
const cart = orderState?.carts?.[`businessId:${props.cart.business_id}`]
|
|
79
|
+
|
|
80
|
+
const walletName: any = {
|
|
81
|
+
cash: {
|
|
82
|
+
name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
|
|
83
|
+
},
|
|
84
|
+
credit_point: {
|
|
85
|
+
name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
|
|
86
|
+
}
|
|
87
|
+
}
|
|
79
88
|
|
|
80
89
|
return (
|
|
81
90
|
<OSContainer>
|
|
@@ -168,6 +177,14 @@ const OrderSummaryUI = (props: any) => {
|
|
|
168
177
|
<OText size={12}>{parsePrice(cart?.driver_tip)}</OText>
|
|
169
178
|
</OSTable>
|
|
170
179
|
)}
|
|
180
|
+
{cart?.payment_events?.length > 0 && cart?.payment_events?.map((event: any) => (
|
|
181
|
+
<OSTable key={event.id}>
|
|
182
|
+
<OText size={12} numberOfLines={1}>
|
|
183
|
+
{walletName[cart?.wallets?.find((wallet: any) => wallet.id === event.wallet_id)?.type]?.name}
|
|
184
|
+
</OText>
|
|
185
|
+
<OText size={12}>-{parsePrice(event.amount)}</OText>
|
|
186
|
+
</OSTable>
|
|
187
|
+
))}
|
|
171
188
|
{isCouponEnabled && !isCartPending && (
|
|
172
189
|
<View>
|
|
173
190
|
<View style={{ paddingVertical: 5 }}>
|
|
@@ -185,7 +202,7 @@ const OrderSummaryUI = (props: any) => {
|
|
|
185
202
|
{t('TOTAL', 'Total')}
|
|
186
203
|
</OText>
|
|
187
204
|
<OText size={14} style={{ fontWeight: 'bold' }} >
|
|
188
|
-
{parsePrice(cart?.total)}
|
|
205
|
+
{parsePrice(cart?.balance ?? cart?.total)}
|
|
189
206
|
</OText>
|
|
190
207
|
</OSTable>
|
|
191
208
|
</View>
|
|
@@ -205,7 +222,8 @@ const OrderSummaryUI = (props: any) => {
|
|
|
205
222
|
height: 100,
|
|
206
223
|
borderColor: theme.colors.border,
|
|
207
224
|
paddingRight: 50,
|
|
208
|
-
marginTop: 10
|
|
225
|
+
marginTop: 10,
|
|
226
|
+
borderRadius: 8
|
|
209
227
|
}}
|
|
210
228
|
multiline
|
|
211
229
|
/>
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react'
|
|
2
|
+
import { Platform, StyleSheet, View } from 'react-native'
|
|
3
|
+
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
4
|
+
import { useTheme } from 'styled-components/native'
|
|
5
|
+
import CheckBox from '@react-native-community/checkbox';
|
|
6
|
+
import {
|
|
7
|
+
PaymentOptionWallet as PaymentOptionWalletController,
|
|
8
|
+
useLanguage,
|
|
9
|
+
useUtils,
|
|
10
|
+
} from 'ordering-components/native'
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
Container,
|
|
14
|
+
SectionLeft,
|
|
15
|
+
} from './styles'
|
|
16
|
+
|
|
17
|
+
import { OText } from '../shared'
|
|
18
|
+
|
|
19
|
+
const PaymentOptionWalletUI = (props: any) => {
|
|
20
|
+
const {
|
|
21
|
+
cart,
|
|
22
|
+
walletsState,
|
|
23
|
+
selectWallet,
|
|
24
|
+
deletetWalletSelected
|
|
25
|
+
} = props
|
|
26
|
+
|
|
27
|
+
const theme = useTheme()
|
|
28
|
+
const [, t] = useLanguage()
|
|
29
|
+
const [{ parsePrice }] = useUtils()
|
|
30
|
+
|
|
31
|
+
const styles = StyleSheet.create({
|
|
32
|
+
checkBoxStyle: {
|
|
33
|
+
width: 25,
|
|
34
|
+
height: 25,
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const [checkedState, setCheckedState] = useState(
|
|
39
|
+
new Array(walletsState.result?.length).fill(false)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const creditBalance = (wallet: any) => ` = ${parsePrice((wallet.balance * wallet.redemption_rate) / 100)}`
|
|
43
|
+
|
|
44
|
+
const walletName: any = {
|
|
45
|
+
cash: {
|
|
46
|
+
name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
|
|
47
|
+
},
|
|
48
|
+
credit_point: {
|
|
49
|
+
name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const handleOnChange = (position: any, wallet: any) => {
|
|
54
|
+
const updatedCheckedState = checkedState.map((item, index) =>
|
|
55
|
+
index === position ? !item : item
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
if (!checkedState[position]) {
|
|
59
|
+
selectWallet(wallet)
|
|
60
|
+
} else {
|
|
61
|
+
deletetWalletSelected(wallet)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
setCheckedState(updatedCheckedState);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (!walletsState.loading) {
|
|
69
|
+
setCheckedState(
|
|
70
|
+
walletsState.result.map((wallet: any) => {
|
|
71
|
+
return !!cart?.wallets?.find((w: any) => w.id === wallet.id)
|
|
72
|
+
})
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
}, [walletsState.result?.length])
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<>
|
|
79
|
+
{!walletsState.loading &&
|
|
80
|
+
!walletsState.error &&
|
|
81
|
+
walletsState.result?.length > 0 &&
|
|
82
|
+
(
|
|
83
|
+
<>
|
|
84
|
+
{walletsState.result?.map((wallet: any, idx: any) => wallet.valid && (
|
|
85
|
+
<Container
|
|
86
|
+
key={wallet.id}
|
|
87
|
+
isBottomBorder={idx === walletsState.result?.filter((wallet: any) => wallet.valid)?.length - 1}
|
|
88
|
+
>
|
|
89
|
+
<SectionLeft>
|
|
90
|
+
<CheckBox
|
|
91
|
+
value={checkedState[idx]}
|
|
92
|
+
onValueChange={() => handleOnChange(idx, wallet)}
|
|
93
|
+
disabled={(cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0 }
|
|
94
|
+
boxType={'square'}
|
|
95
|
+
tintColors={{
|
|
96
|
+
true: theme.colors.primary,
|
|
97
|
+
false: theme.colors.disabled
|
|
98
|
+
}}
|
|
99
|
+
tintColor={theme.colors.disabled}
|
|
100
|
+
onCheckColor={theme.colors.primary}
|
|
101
|
+
onTintColor={theme.colors.primary}
|
|
102
|
+
style={Platform.OS === 'ios' && styles.checkBoxStyle}
|
|
103
|
+
/>
|
|
104
|
+
<View style={{ alignItems: 'baseline' }}>
|
|
105
|
+
<View>
|
|
106
|
+
<OText
|
|
107
|
+
style={((cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0) ?{
|
|
108
|
+
color: theme.colors.disabled
|
|
109
|
+
} : {}}
|
|
110
|
+
>
|
|
111
|
+
{walletName[wallet.type]?.name}
|
|
112
|
+
</OText>
|
|
113
|
+
</View>
|
|
114
|
+
</View>
|
|
115
|
+
</SectionLeft>
|
|
116
|
+
|
|
117
|
+
<View style={{maxWidth: '40%', alignItems: 'flex-end' }}>
|
|
118
|
+
{wallet.type === 'cash' && (
|
|
119
|
+
<OText>
|
|
120
|
+
{parsePrice(wallet?.balance)}
|
|
121
|
+
</OText>
|
|
122
|
+
)}
|
|
123
|
+
{wallet.type === 'credit_point' && (
|
|
124
|
+
<OText>
|
|
125
|
+
<OText color={theme.colors.primary} weight='bold'>
|
|
126
|
+
{`${wallet?.balance} ${t('POINTS', 'Points')}`}
|
|
127
|
+
</OText>
|
|
128
|
+
<OText>
|
|
129
|
+
{`${wallet.balance > 0 && creditBalance(wallet)}`}
|
|
130
|
+
</OText>
|
|
131
|
+
</OText>
|
|
132
|
+
)}
|
|
133
|
+
</View>
|
|
134
|
+
</Container>
|
|
135
|
+
))}
|
|
136
|
+
</>
|
|
137
|
+
)}
|
|
138
|
+
|
|
139
|
+
{walletsState?.loading && (
|
|
140
|
+
<View>
|
|
141
|
+
{[...Array(2).keys()].map(i => (
|
|
142
|
+
<View style={{ marginBottom: 10 }} key={i}>
|
|
143
|
+
<Placeholder Animation={Fade}>
|
|
144
|
+
<PlaceholderLine width={100} height={40} style={{ marginBottom: 0, borderRadius: 8 }} />
|
|
145
|
+
</Placeholder>
|
|
146
|
+
</View>
|
|
147
|
+
))}
|
|
148
|
+
</View>
|
|
149
|
+
)}
|
|
150
|
+
</>
|
|
151
|
+
)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export const PaymentOptionWallet = (props: any) => {
|
|
155
|
+
const paymentWalletProps = {
|
|
156
|
+
...props,
|
|
157
|
+
UIComponent: PaymentOptionWalletUI
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
<PaymentOptionWalletController {...paymentWalletProps} />
|
|
162
|
+
)
|
|
163
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import styled, { css } from 'styled-components/native'
|
|
2
|
+
|
|
3
|
+
export const Container = styled.View`
|
|
4
|
+
width: 100%;
|
|
5
|
+
display: flex;
|
|
6
|
+
padding: 20px 0;
|
|
7
|
+
margin-top: 10px;
|
|
8
|
+
flex-direction: row;
|
|
9
|
+
justify-content: space-between;
|
|
10
|
+
align-items: center;
|
|
11
|
+
border-top-width: 1px;
|
|
12
|
+
border-top-color: ${(props: any) => props.theme.colors.backgroundGray200};
|
|
13
|
+
${(props: any) => props.isBottomBorder && css`
|
|
14
|
+
border-bottom-width: 1px;
|
|
15
|
+
border-bottom-color: ${(props: any) => props.theme.colors.backgroundGray200};
|
|
16
|
+
`}
|
|
17
|
+
`
|
|
18
|
+
|
|
19
|
+
export const SectionLeft = styled.View`
|
|
20
|
+
max-width: 55%;
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: row;
|
|
23
|
+
align-items: center;
|
|
24
|
+
justify-content: center;
|
|
25
|
+
`
|
|
26
|
+
|
|
27
|
+
export const SectionLeftText = styled.View`
|
|
28
|
+
alignSelf: flex-start;
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
flex-wrap: wrap;
|
|
32
|
+
`
|
|
33
|
+
|
|
34
|
+
export const SectionWrapper = styled.View`
|
|
35
|
+
padding-top: 10px;
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
`
|
|
@@ -663,25 +663,27 @@ export const ProductOptionsUI = (props: any) => {
|
|
|
663
663
|
)}
|
|
664
664
|
</>
|
|
665
665
|
)}
|
|
666
|
-
|
|
667
|
-
<
|
|
668
|
-
<
|
|
669
|
-
{
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
666
|
+
{!product?.hide_special_instructions && (
|
|
667
|
+
<ProductComment>
|
|
668
|
+
<SectionTitle>
|
|
669
|
+
<OText size={16} weight={'600'} lineHeight={24}>
|
|
670
|
+
{t('SPECIAL_COMMENT', 'Special comment')}
|
|
671
|
+
</OText>
|
|
672
|
+
</SectionTitle>
|
|
673
|
+
<OInput
|
|
674
|
+
multiline
|
|
675
|
+
placeholder={t('SPECIAL_COMMENT', 'Special comment')}
|
|
676
|
+
value={productCart.comment}
|
|
677
|
+
onChange={(val: string) =>
|
|
678
|
+
handleChangeCommentState({ target: { value: val } })
|
|
679
|
+
}
|
|
680
|
+
isDisabled={
|
|
681
|
+
!(productCart && !isSoldOut && maxProductQuantity)
|
|
682
|
+
}
|
|
683
|
+
style={styles.comment}
|
|
684
|
+
/>
|
|
685
|
+
</ProductComment>
|
|
686
|
+
)}
|
|
685
687
|
</ProductEditions>
|
|
686
688
|
)}
|
|
687
689
|
</WrapContent>
|
|
@@ -14,6 +14,7 @@ import { ProfileParams } from '../../types';
|
|
|
14
14
|
import { LogoutButton } from '../LogoutButton'
|
|
15
15
|
import { LanguageSelector } from '../LanguageSelector'
|
|
16
16
|
import MessageCircle from 'react-native-vector-icons/AntDesign'
|
|
17
|
+
import Ionicons from 'react-native-vector-icons/Ionicons'
|
|
17
18
|
|
|
18
19
|
import {
|
|
19
20
|
OIcon,
|
|
@@ -160,6 +161,10 @@ const ProfileListUI = (props: ProfileParams) => {
|
|
|
160
161
|
<MessageCircle name='message1' style={styles.messageIconStyle} color={theme.colors.textNormal} />
|
|
161
162
|
<OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('MESSAGES', 'Messages')}</OText>
|
|
162
163
|
</ListItem>
|
|
164
|
+
<ListItem onPress={() => onRedirect('Wallets', { isFromProfile: true, isGoBack: true })} activeOpacity={0.7}>
|
|
165
|
+
<Ionicons name='wallet-outline' style={styles.messageIconStyle} color={theme.colors.textNormal} />
|
|
166
|
+
<OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('WALLETS', 'Wallets')}</OText>
|
|
167
|
+
</ListItem>
|
|
163
168
|
<ListItem onPress={() => navigation.navigate('Help', {})} activeOpacity={0.7}>
|
|
164
169
|
<OIcon src={theme.images.general.ic_help} width={16} color={theme.colors.textNormal} style={{ marginEnd: 14 }} />
|
|
165
170
|
<OText size={14} lineHeight={24} weight={'400'} color={theme.colors.textNormal}>{t('HELP', 'Help')}</OText>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { useTheme } from 'styled-components/native'
|
|
3
|
+
import { useLanguage, useUtils } from 'ordering-components/native'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Container,
|
|
7
|
+
DateBlock,
|
|
8
|
+
MessageBlock,
|
|
9
|
+
DescriptionBlock,
|
|
10
|
+
Dot
|
|
11
|
+
} from './styles'
|
|
12
|
+
import { OIcon, OText } from '../shared';
|
|
13
|
+
|
|
14
|
+
export const WalletTransactionItem = (props: any) => {
|
|
15
|
+
const {
|
|
16
|
+
item,
|
|
17
|
+
idx,
|
|
18
|
+
type
|
|
19
|
+
} = props
|
|
20
|
+
|
|
21
|
+
const theme = useTheme()
|
|
22
|
+
const [{ parsePrice, parseDate }] = useUtils()
|
|
23
|
+
const [, t] = useLanguage()
|
|
24
|
+
|
|
25
|
+
const LANG_EVENT_KEY = `WALLET_${type.toUpperCase()}_${item?.event.toUpperCase()}_${item?.event_type.toUpperCase()}_${item?.amount >= 0 ? 'POSITIVE': 'NEGATIVE'}`
|
|
26
|
+
const lang_event_text = !!item?.event?.order_id
|
|
27
|
+
? `:author ${item?.amount >= 0 ? 'add' : 'reduce'} money in Order No. :order_id`
|
|
28
|
+
: `:author ${item?.amount >= 0 ? 'add' : 'reduce'} money`
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Container>
|
|
32
|
+
<Dot isTop={idx === 0} />
|
|
33
|
+
<DateBlock>
|
|
34
|
+
<OText color={theme.colors.disabled}>{parseDate(item?.created_at)}</OText>
|
|
35
|
+
<OText
|
|
36
|
+
style={{
|
|
37
|
+
color: item?.amount > 0 && theme.colors.primary,
|
|
38
|
+
fontWeight: 'bold'
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
41
|
+
{item?.amount > 0 && '+ '}{parsePrice(item?.amount)}
|
|
42
|
+
</OText>
|
|
43
|
+
</DateBlock>
|
|
44
|
+
<MessageBlock>
|
|
45
|
+
<OText>
|
|
46
|
+
{t(LANG_EVENT_KEY, lang_event_text)
|
|
47
|
+
.replace(':author', item?.event?.author?.name ?? '')
|
|
48
|
+
.replace(':order_id', item?.event?.order_id ?? '')}
|
|
49
|
+
</OText>
|
|
50
|
+
</MessageBlock>
|
|
51
|
+
{!!item?.description && (
|
|
52
|
+
<DescriptionBlock>
|
|
53
|
+
<OText>{item?.description}</OText>
|
|
54
|
+
</DescriptionBlock>
|
|
55
|
+
)}
|
|
56
|
+
{!!item?.code && (
|
|
57
|
+
<DescriptionBlock>
|
|
58
|
+
<OText weight={'bold'}>
|
|
59
|
+
{t('CODE', 'Code')}
|
|
60
|
+
<OText weight={'100'}>
|
|
61
|
+
{': '}{item?.code}
|
|
62
|
+
</OText>
|
|
63
|
+
</OText>
|
|
64
|
+
</DescriptionBlock>
|
|
65
|
+
)}
|
|
66
|
+
</Container>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import styled from 'styled-components/native'
|
|
2
|
+
|
|
3
|
+
export const Container = styled.View`
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
margin-bottom: 20px;
|
|
7
|
+
position: relative;
|
|
8
|
+
padding-left: 10px;
|
|
9
|
+
`
|
|
10
|
+
|
|
11
|
+
export const DateBlock = styled.View`
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: row;
|
|
14
|
+
justify-content: space-between;
|
|
15
|
+
align-items: center;
|
|
16
|
+
`
|
|
17
|
+
|
|
18
|
+
export const MessageBlock = styled.View`
|
|
19
|
+
display: flex;
|
|
20
|
+
font-size: 14px;
|
|
21
|
+
`
|
|
22
|
+
|
|
23
|
+
export const Dot = styled.View`
|
|
24
|
+
position: absolute;
|
|
25
|
+
top: ${(props: any) => props.isTop ? 0 : 6}px;
|
|
26
|
+
left: -4px;
|
|
27
|
+
width: 6px;
|
|
28
|
+
height: 6px;
|
|
29
|
+
border-radius: 50px;
|
|
30
|
+
background-color: ${(props: any) => props.theme.colors.disabled};
|
|
31
|
+
`
|
|
32
|
+
|
|
33
|
+
export const DescriptionBlock = styled(MessageBlock)`
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: row;
|
|
36
|
+
flex-wrap: wrap;
|
|
37
|
+
`
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { Pressable, View } from 'react-native';
|
|
3
|
+
import { useTheme } from 'styled-components/native'
|
|
4
|
+
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
|
|
5
|
+
import {
|
|
6
|
+
WalletList,
|
|
7
|
+
useLanguage,
|
|
8
|
+
useUtils,
|
|
9
|
+
useConfig
|
|
10
|
+
} from 'ordering-components/native'
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
Container,
|
|
14
|
+
BalanceElement,
|
|
15
|
+
TransactionsWrapper,
|
|
16
|
+
OTabs,
|
|
17
|
+
OTab,
|
|
18
|
+
SectionContent
|
|
19
|
+
} from './styles'
|
|
20
|
+
|
|
21
|
+
import NavBar from '../NavBar'
|
|
22
|
+
import { OIcon, OText } from '../shared';
|
|
23
|
+
import { NotFoundSource } from '../NotFoundSource';
|
|
24
|
+
import { WalletTransactionItem } from '../WalletTransactionItem'
|
|
25
|
+
|
|
26
|
+
const WalletsUI = (props: any) => {
|
|
27
|
+
const {
|
|
28
|
+
navigation,
|
|
29
|
+
walletList,
|
|
30
|
+
transactionsList,
|
|
31
|
+
setWalletSelected
|
|
32
|
+
} = props
|
|
33
|
+
|
|
34
|
+
const [, t] = useLanguage()
|
|
35
|
+
const theme = useTheme()
|
|
36
|
+
const [{ parsePrice, parseDate }] = useUtils()
|
|
37
|
+
const [{ configs }] = useConfig()
|
|
38
|
+
|
|
39
|
+
const [tabSelected, setTabSelected] = useState('cash')
|
|
40
|
+
|
|
41
|
+
const currentWalletSelected = (walletList.wallets?.length > 0 && walletList.wallets?.find((w: any) => w.type === tabSelected)) ?? null
|
|
42
|
+
|
|
43
|
+
const walletName: any = {
|
|
44
|
+
cash: {
|
|
45
|
+
name: t('CASH_WALLET', 'Cash Wallet'),
|
|
46
|
+
value: 0
|
|
47
|
+
},
|
|
48
|
+
credit_point: {
|
|
49
|
+
name: t('CREDITS_POINTS_WALLET', 'Credit Points Wallet'),
|
|
50
|
+
value: 1
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const handleChangeTab = (wallet: any) => {
|
|
55
|
+
setTabSelected(wallet.type)
|
|
56
|
+
setWalletSelected(wallet.id)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const goToBack = () => {
|
|
60
|
+
navigation?.canGoBack() && navigation.goBack()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<Container>
|
|
65
|
+
<NavBar
|
|
66
|
+
title={t('WALLETS', 'Wallets')}
|
|
67
|
+
titleAlign={'center'}
|
|
68
|
+
onActionLeft={goToBack}
|
|
69
|
+
showCall={false}
|
|
70
|
+
paddingTop={10}
|
|
71
|
+
btnStyle={{ paddingLeft: 0 }}
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
{!walletList.loading &&
|
|
75
|
+
!walletList.error &&
|
|
76
|
+
walletList.wallets?.length > 0 &&
|
|
77
|
+
(
|
|
78
|
+
<>
|
|
79
|
+
<OTabs>
|
|
80
|
+
{walletList.wallets?.map((wallet: any) =>(
|
|
81
|
+
<Pressable
|
|
82
|
+
key={wallet.id}
|
|
83
|
+
onPress={() => handleChangeTab(wallet)}
|
|
84
|
+
>
|
|
85
|
+
<OTab>
|
|
86
|
+
<OText size={18} color={tabSelected === wallet.type ? theme.colors.primary : theme.colors.disabled}>
|
|
87
|
+
{walletName[wallet.type]?.name}
|
|
88
|
+
</OText>
|
|
89
|
+
</OTab>
|
|
90
|
+
</Pressable>
|
|
91
|
+
))}
|
|
92
|
+
</OTabs>
|
|
93
|
+
|
|
94
|
+
<SectionContent>
|
|
95
|
+
<BalanceElement>
|
|
96
|
+
<OText size={20} style={{fontWeight: '600'}}>
|
|
97
|
+
{currentWalletSelected?.type === 'cash'
|
|
98
|
+
? parsePrice(currentWalletSelected?.balance)
|
|
99
|
+
: currentWalletSelected?.balance
|
|
100
|
+
}
|
|
101
|
+
</OText>
|
|
102
|
+
<OText style={{ paddingLeft: 5 }}>
|
|
103
|
+
{currentWalletSelected?.type === 'cash'
|
|
104
|
+
? configs?.stripe_currency?.value
|
|
105
|
+
: t('POINTS', 'Points')}
|
|
106
|
+
</OText>
|
|
107
|
+
</BalanceElement>
|
|
108
|
+
{console.log(transactionsList)}
|
|
109
|
+
|
|
110
|
+
<View style={{ marginTop: 20, width: '100%', paddingHorizontal: 1, paddingBottom: 40 }}>
|
|
111
|
+
{!transactionsList?.loading &&
|
|
112
|
+
!transactionsList?.error &&
|
|
113
|
+
transactionsList.list?.[`wallet:${currentWalletSelected?.id}`]?.length > 0 &&
|
|
114
|
+
(
|
|
115
|
+
<>
|
|
116
|
+
<OText style={{fontSize: 20}}>
|
|
117
|
+
{t('TRANSACTIONS_HISTORY', 'Transactions history')}
|
|
118
|
+
</OText>
|
|
119
|
+
<TransactionsWrapper>
|
|
120
|
+
{transactionsList.list?.[`wallet:${currentWalletSelected?.id}`]?.map((transaction: any, i: number) =>(
|
|
121
|
+
<WalletTransactionItem
|
|
122
|
+
idx={i}
|
|
123
|
+
type={currentWalletSelected?.type}
|
|
124
|
+
key={transaction.id}
|
|
125
|
+
item={transaction}
|
|
126
|
+
/>
|
|
127
|
+
))}
|
|
128
|
+
</TransactionsWrapper>
|
|
129
|
+
</>
|
|
130
|
+
)}
|
|
131
|
+
|
|
132
|
+
{(transactionsList?.loading || !transactionsList.list?.[`wallet:${currentWalletSelected?.id}`]) && (
|
|
133
|
+
<View>
|
|
134
|
+
{[...Array(4).keys()].map(i => (
|
|
135
|
+
<View style={{ marginBottom: 10 }} key={i}>
|
|
136
|
+
<Placeholder Animation={Fade}>
|
|
137
|
+
<PlaceholderLine width={100} height={100} style={{ marginBottom: 0, borderRadius: 8 }} />
|
|
138
|
+
</Placeholder>
|
|
139
|
+
</View>
|
|
140
|
+
))}
|
|
141
|
+
</View>
|
|
142
|
+
)}
|
|
143
|
+
|
|
144
|
+
{!(transactionsList?.loading && transactionsList.list?.[`wallet:${currentWalletSelected?.id}`]) &&
|
|
145
|
+
(transactionsList?.error ||
|
|
146
|
+
!transactionsList.list?.[`wallet:${currentWalletSelected?.id}`]?.length) &&
|
|
147
|
+
(
|
|
148
|
+
<NotFoundSource
|
|
149
|
+
content={transactionsList?.error
|
|
150
|
+
? t('ERROR_NOT_FOUND_TRANSACTIONS', 'Sorry, an error has occurred')
|
|
151
|
+
: t('NOT_FOUND_TRANSACTIONS', 'No transactions to show at this time.')
|
|
152
|
+
}
|
|
153
|
+
/>
|
|
154
|
+
)}
|
|
155
|
+
</View>
|
|
156
|
+
</SectionContent>
|
|
157
|
+
</>
|
|
158
|
+
)}
|
|
159
|
+
|
|
160
|
+
{walletList?.loading && (
|
|
161
|
+
<>
|
|
162
|
+
<View>
|
|
163
|
+
<Placeholder Animation={Fade}>
|
|
164
|
+
<PlaceholderLine width={100} height={40} style={{ marginBottom: 0 }} />
|
|
165
|
+
</Placeholder>
|
|
166
|
+
</View>
|
|
167
|
+
<View style={{ marginTop: 10, marginBottom: 20 }}>
|
|
168
|
+
<Placeholder Animation={Fade}>
|
|
169
|
+
<PlaceholderLine width={100} height={40} style={{ marginBottom: 0 }} />
|
|
170
|
+
</Placeholder>
|
|
171
|
+
</View>
|
|
172
|
+
<View>
|
|
173
|
+
{[...Array(4).keys()].map(i => (
|
|
174
|
+
<View style={{ marginBottom: 10 }} key={i}>
|
|
175
|
+
<Placeholder Animation={Fade}>
|
|
176
|
+
<PlaceholderLine width={100} height={60} style={{ marginBottom: 0 }} />
|
|
177
|
+
</Placeholder>
|
|
178
|
+
</View>
|
|
179
|
+
))}
|
|
180
|
+
</View>
|
|
181
|
+
</>
|
|
182
|
+
)}
|
|
183
|
+
|
|
184
|
+
{!walletList?.loading && (walletList?.error || !walletList?.wallets?.length) && (
|
|
185
|
+
<NotFoundSource
|
|
186
|
+
content={walletList?.error
|
|
187
|
+
? t('ERROR_NOT_FOUND_WALLETS', 'Sorry, an error has occurred')
|
|
188
|
+
: t('NOT_FOUND_WALLETS', 'No wallets to show at this time.')
|
|
189
|
+
}
|
|
190
|
+
/>
|
|
191
|
+
)}
|
|
192
|
+
</Container>
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export const Wallets = (props: any) => {
|
|
197
|
+
const walletsProps = {
|
|
198
|
+
...props,
|
|
199
|
+
UIComponent: WalletsUI
|
|
200
|
+
}
|
|
201
|
+
return (
|
|
202
|
+
<WalletList {...walletsProps} />
|
|
203
|
+
)
|
|
204
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import styled from 'styled-components/native'
|
|
2
|
+
|
|
3
|
+
export const Container = styled.View`
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
`
|
|
7
|
+
|
|
8
|
+
export const SectionContent = styled.View`
|
|
9
|
+
width: 100%;
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
align-items: center;
|
|
13
|
+
justify-content: center;
|
|
14
|
+
margin-top: 20px;
|
|
15
|
+
`
|
|
16
|
+
|
|
17
|
+
export const TransactionsWrapper = styled.View`
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
border-left-width: 2px;
|
|
21
|
+
border-left-color: ${(props: any) => props.theme.colors.disabled};
|
|
22
|
+
`
|
|
23
|
+
|
|
24
|
+
export const BalanceElement = styled.View`
|
|
25
|
+
width: 100%;
|
|
26
|
+
padding: 10px 0;
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: row;
|
|
29
|
+
justify-content: center;
|
|
30
|
+
align-items: flex-end;
|
|
31
|
+
background-color: ${(props: any) => props.theme.colors.backgroundGray100};
|
|
32
|
+
border-radius: 8px;
|
|
33
|
+
`
|
|
34
|
+
|
|
35
|
+
export const OTabs = styled.View`
|
|
36
|
+
flex-direction: row;
|
|
37
|
+
width: 100%;
|
|
38
|
+
flex-wrap: wrap;
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
export const OTab = styled.View`
|
|
42
|
+
padding-horizontal: 10px;
|
|
43
|
+
`;
|