ordering-ui-react-native 0.16.12 → 0.16.15

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 (34) hide show
  1. package/package.json +2 -1
  2. package/src/navigators/CheckoutNavigator.tsx +6 -0
  3. package/src/navigators/HomeNavigator.tsx +6 -0
  4. package/src/pages/MultiCheckout.tsx +31 -0
  5. package/src/pages/MultiOrdersDetails.tsx +27 -0
  6. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  7. package/themes/original/index.tsx +6 -0
  8. package/themes/original/src/components/BusinessItemAccordion/index.tsx +3 -2
  9. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +0 -2
  10. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  11. package/themes/original/src/components/BusinessProductsList/index.tsx +9 -26
  12. package/themes/original/src/components/BusinessProductsListing/index.tsx +14 -7
  13. package/themes/original/src/components/BusinessesListing/index.tsx +21 -10
  14. package/themes/original/src/components/Cart/index.tsx +17 -8
  15. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  16. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  17. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  18. package/themes/original/src/components/MultiCheckout/index.tsx +291 -0
  19. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  20. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +370 -0
  21. package/themes/original/src/components/MultiOrdersDetails/index.tsx +250 -0
  22. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  23. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  24. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  25. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +150 -0
  26. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  27. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +51 -0
  28. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  29. package/themes/original/src/components/OrdersOption/index.tsx +102 -28
  30. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  31. package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
  32. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  33. package/themes/original/src/components/UserDetails/index.tsx +1 -1
  34. package/themes/original/src/types/index.tsx +43 -19
@@ -0,0 +1,243 @@
1
+ import React, { useState } from 'react'
2
+ import {
3
+ useLanguage,
4
+ useConfig,
5
+ useUtils,
6
+ MultiCartsPaymethodsAndWallets as MultiCartsPaymethodsAndWalletsController
7
+ } from 'ordering-components/native'
8
+ import { useTheme } from 'styled-components/native'
9
+ import { View, TouchableOpacity, FlatList, StyleSheet, KeyboardAvoidingView, Platform } from 'react-native'
10
+ import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder'
11
+ import { OText, OIcon, OModal, OButton } from '../shared'
12
+ import { getIconCard, flatArray } from '../../utils'
13
+ import { StripeElementsForm } from '../StripeElementsForm'
14
+ import { StripeCardsList } from '../StripeCardsList'
15
+ import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
16
+
17
+ import {
18
+ PMContainer,
19
+ PMItem,
20
+ WalletItem
21
+ } from './styles'
22
+
23
+ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
24
+ const {
25
+ businessIds,
26
+ paymethodsAndWallets,
27
+ walletsState,
28
+ businessPaymethods,
29
+ paymethodSelected,
30
+ handleSelectPaymethod,
31
+ handleSelectWallet,
32
+ handlePaymethodDataChange
33
+ } = props
34
+
35
+ const theme = useTheme()
36
+ const [, t] = useLanguage()
37
+ const [{ configs }] = useConfig()
38
+ const [{ parsePrice }] = useUtils()
39
+
40
+ const [addCardOpen, setAddCardOpen] = useState({ stripe: false, stripeConnect: false });
41
+
42
+ const isWalletCashEnabled = configs?.wallet_cash_enabled?.value === '1'
43
+ const isWalletPointsEnabled = configs?.wallet_credit_point_enabled?.value === '1'
44
+
45
+ const walletName: any = {
46
+ cash: {
47
+ name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
48
+ isActive: isWalletCashEnabled
49
+ },
50
+ credit_point: {
51
+ name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
52
+ isActive: isWalletPointsEnabled
53
+ }
54
+ }
55
+
56
+ const getPayIcon = (method: string) => {
57
+ switch (method) {
58
+ case 'cash':
59
+ return theme.images.general.cash
60
+ case 'card_delivery':
61
+ return theme.images.general.carddelivery
62
+ case 'paypal':
63
+ return theme.images.general.paypal
64
+ case 'stripe':
65
+ return theme.images.general.stripe
66
+ case 'stripe_direct':
67
+ return theme.images.general.stripecc
68
+ case 'stripe_connect':
69
+ return theme.images.general.stripes
70
+ case 'stripe_redirect':
71
+ return theme.images.general.stripesb
72
+ default:
73
+ return theme.images.general.creditCard
74
+ }
75
+ }
76
+
77
+ const renderPaymethods = ({ item }: any) => {
78
+ return (
79
+ <TouchableOpacity
80
+ onPress={() => handleSelectPaymethod(item)}
81
+ >
82
+ <PMItem
83
+ key={item.id}
84
+ isActive={paymethodSelected?.paymethod_id === item.paymethod_id}
85
+ >
86
+ <OIcon
87
+ src={getPayIcon(item.paymethod?.gateway)}
88
+ width={20}
89
+ height={20}
90
+ color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : theme.colors.backgroundDark}
91
+ />
92
+ <OText
93
+ size={10}
94
+ style={{ margin: 0, marginTop: 4 }}
95
+ color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : '#000'}
96
+ >
97
+ {t(item?.paymethod?.gateway.toUpperCase(), item?.paymethod?.name)}
98
+ </OText>
99
+ </PMItem>
100
+ </TouchableOpacity>
101
+ )
102
+ }
103
+
104
+ return (
105
+ <PMContainer>
106
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
107
+ {t('PAYMENT_METHODS', 'Payment Methods')}
108
+ </OText>
109
+ {paymethodsAndWallets.loading ? (
110
+ <Placeholder style={{ marginTop: 10 }} Animation={Fade}>
111
+ <View style={{ display: 'flex', flexDirection: 'row' }}>
112
+ {[...Array(3)].map((_, i) => (
113
+ <PlaceholderLine
114
+ key={i}
115
+ width={37}
116
+ height={80}
117
+ noMargin
118
+ style={{ borderRadius: 10, marginRight: 10 }}
119
+ />
120
+ ))}
121
+ </View>
122
+ </Placeholder>
123
+ ) : (
124
+ <FlatList
125
+ horizontal
126
+ showsHorizontalScrollIndicator={false}
127
+ data={businessPaymethods.result.filter((paymethod: any) => paymethodsAndWallets.paymethods.find((item: any) => item.id === paymethod.paymethod_id))}
128
+ renderItem={renderPaymethods}
129
+ keyExtractor={(paymethod: any) => paymethod?.id?.toString?.()}
130
+ />
131
+ )}
132
+ {!paymethodsAndWallets.loading && !paymethodsAndWallets.error && paymethodsAndWallets.paymethods.length === 0 && (
133
+ <OText size={12} style={{ margin: 0 }}>
134
+ {t('NO_PAYMENT_METHODS', 'No payment methods!')}
135
+ </OText>
136
+ )}
137
+
138
+ {paymethodSelected?.paymethod?.gateway === 'stripe' && (
139
+ <View>
140
+ <OButton
141
+ text={t('ADD_PAYMENT_CARD', 'Add New Payment Card')}
142
+ bgColor={theme.colors.white}
143
+ borderColor={theme.colors.primary}
144
+ style={styles.btnAddStyle}
145
+ textStyle={{ color: theme.colors.primary, fontSize: 12 }}
146
+ imgRightSrc={null}
147
+ onClick={() => setAddCardOpen({ ...addCardOpen, stripe: true })}
148
+ />
149
+ <StripeCardsList
150
+ paymethod={paymethodSelected?.paymethod}
151
+ businessId={businessIds[0]}
152
+ businessIds={businessIds}
153
+ publicKey={paymethodSelected?.data?.publishable}
154
+ payType={paymethodSelected?.paymethod?.name}
155
+ onSelectCard={handlePaymethodDataChange}
156
+ />
157
+ </View>
158
+ )}
159
+
160
+ {(paymethodsAndWallets.loading || walletsState.loading) ? (
161
+ <>
162
+ {[...Array(2).keys()].map(i => (
163
+ <PlaceholderLine
164
+ key={i}
165
+ height={40}
166
+ noMargin
167
+ style={{ marginBottom: 10 }}
168
+ />
169
+ ))}
170
+ </>
171
+ ) : (
172
+ <>
173
+ {walletsState.result.filter((wallet: any) => paymethodsAndWallets.wallets.find((item: any) => item.type === wallet.type)).map((wallet: any, idx: any) => walletName[wallet.type]?.isActive && (
174
+ <WalletItem
175
+ key={wallet.type}
176
+ isBottomBorder={idx === paymethodsAndWallets.wallets?.length - 1}
177
+ onPress={() => handleSelectWallet(paymethodSelected.wallet_id === wallet.id ? false : true, wallet)}
178
+ >
179
+ {paymethodSelected.wallet_id === wallet.id ? (
180
+ <MaterialCommunityIcons
181
+ name="checkbox-marked"
182
+ size={25}
183
+ color={theme.colors.primary}
184
+ />
185
+ ) : (
186
+ <MaterialCommunityIcons
187
+ name="checkbox-blank-outline"
188
+ size={25}
189
+ color={theme.colors.disabled}
190
+ />
191
+ )}
192
+ <OText size={12} style={{ flex: 1, marginLeft: 15 }}>{walletName[wallet.type]?.name}</OText>
193
+ <OText size={12}>{parsePrice(wallet.balance)}</OText>
194
+ </WalletItem>
195
+ ))}
196
+ </>
197
+ )}
198
+
199
+ <OModal
200
+ entireModal
201
+ title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
202
+ open={addCardOpen.stripe}
203
+ onClose={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
204
+ style={{ backgroundColor: 'red' }}
205
+ >
206
+ <KeyboardAvoidingView
207
+ behavior={Platform.OS == 'ios' ? 'padding' : 'height'}
208
+ keyboardVerticalOffset={Platform.OS == 'ios' ? 0 : 0}
209
+ enabled={Platform.OS === 'ios' ? true : false}
210
+ >
211
+ <StripeElementsForm
212
+ toSave
213
+ businessId={businessIds[0]}
214
+ businessIds={businessIds}
215
+ publicKey={paymethodSelected?.data?.publishable}
216
+ requirements={props.clientSecret}
217
+ onSelectCard={handlePaymethodDataChange}
218
+ onCancel={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
219
+ />
220
+ </KeyboardAvoidingView>
221
+ </OModal>
222
+ </PMContainer>
223
+ )
224
+ }
225
+
226
+ const styles = StyleSheet.create({
227
+ btnAddStyle: {
228
+ marginVertical: 20,
229
+ borderRadius: 7.6,
230
+ shadowOpacity: 0,
231
+ height: 44,
232
+ borderWidth: 1
233
+ },
234
+ })
235
+
236
+
237
+ export const MultiCartsPaymethodsAndWallets = (props: any) => {
238
+ const multiCartsPaymethodsAndWalletsProps = {
239
+ ...props,
240
+ UIComponent: MultiCartsPaymethodsAndWalletsUI
241
+ }
242
+ return <MultiCartsPaymethodsAndWalletsController {...multiCartsPaymethodsAndWalletsProps} />
243
+ }
@@ -0,0 +1,46 @@
1
+ import styled, { css } from 'styled-components/native'
2
+
3
+ export const PMContainer = styled.View`
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: 100%;
7
+ `
8
+ export const PMItem = styled.View`
9
+ width: 120px;
10
+ height: 50px;
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: center;
14
+ justify-content: center;
15
+ border-radius: 10px;
16
+ margin-right: 10px;
17
+ margin-top: 10px;
18
+ text-align: center;
19
+ background-color: ${(props: any) => props.theme.colors.inputDisabled};
20
+
21
+ ${(props: any) => props.theme?.rtl && css`
22
+ margin-left: 10px;
23
+ margin-right: 0;
24
+ `}
25
+
26
+ ${(props: any) => props.isActive ? css`
27
+ background-color: ${(props: any) => props.theme.colors.primary};
28
+ ` : css`
29
+ border: 1px solid #EAEAEA;
30
+ `}
31
+ `
32
+ export const WalletItem = styled.TouchableOpacity`
33
+ width: 100%;
34
+ display: flex;
35
+ padding: 20px 0;
36
+ margin-top: 10px;
37
+ flex-direction: row;
38
+ justify-content: space-between;
39
+ align-items: center;
40
+ border-top-width: 1px;
41
+ border-top-color: ${(props: any) => props.theme.colors.backgroundGray200};
42
+ ${(props: any) => props.isBottomBorder && css`
43
+ border-bottom-width: 1px;
44
+ border-bottom-color: ${(props: any) => props.theme.colors.backgroundGray200};
45
+ `}
46
+ `
@@ -0,0 +1,291 @@
1
+ import React, { useState, useEffect } from 'react'
2
+ import {
3
+ useLanguage,
4
+ useConfig,
5
+ useUtils,
6
+ useOrder,
7
+ useValidationFields,
8
+ useSession,
9
+ useToast,
10
+ ToastType,
11
+ MultiCheckout as MultiCheckoutController
12
+ } from 'ordering-components/native'
13
+ import { View, StyleSheet, Platform } from 'react-native'
14
+ import { useTheme } from 'styled-components/native';
15
+ import { Container } from '../../layouts/Container';
16
+ import NavBar from '../NavBar';
17
+ import { OText, OIcon, OModal } from '../shared';
18
+ import { getTypesText } from '../../utils';
19
+ import { UserDetails } from '../UserDetails'
20
+ import { AddressDetails } from '../AddressDetails'
21
+ import { MultiCartsPaymethodsAndWallets } from '../MultiCartsPaymethodsAndWallets'
22
+ import { Cart } from '../Cart'
23
+ import { FloatingButton } from '../FloatingButton'
24
+
25
+ import {
26
+ ChContainer,
27
+ ChSection,
28
+ ChHeader,
29
+ CHMomentWrapper,
30
+ ChUserDetails,
31
+ ChAddress,
32
+ ChCarts,
33
+ CartsHeader,
34
+ CCNotCarts,
35
+ ChCartsTotal
36
+ } from './styles'
37
+
38
+ const mapConfigs = {
39
+ mapZoom: 16,
40
+ mapSize: {
41
+ width: 640,
42
+ height: 190
43
+ }
44
+ }
45
+
46
+ const MultiCheckoutUI = (props: any) => {
47
+ const {
48
+ navigation,
49
+ placing,
50
+ openCarts,
51
+ totalCartsPrice,
52
+ handleGroupPlaceOrder,
53
+ paymethodSelected,
54
+ handleSelectPaymethod,
55
+ handleSelectWallet,
56
+ handlePaymethodDataChange
57
+ } = props
58
+
59
+ const theme = useTheme();
60
+ const styles = StyleSheet.create({
61
+ pagePadding: {
62
+ paddingLeft: 40,
63
+ paddingRight: 40
64
+ },
65
+ wrapperNavbar: Platform.OS === 'ios'
66
+ ? { paddingVertical: 0, paddingHorizontal: 40 }
67
+ : { paddingVertical: 20, paddingHorizontal: 40 }
68
+ })
69
+
70
+ const [, { showToast }] = useToast();
71
+ const [, t] = useLanguage()
72
+ const [{ configs }] = useConfig();
73
+ const [{ parsePrice, parseDate }] = useUtils();
74
+ const [{ options, carts, loading }, { confirmCart }] = useOrder();
75
+ const [validationFields] = useValidationFields();
76
+ const [{ user }] = useSession()
77
+
78
+ const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
79
+ const isPreOrder = configs?.preorder_status_enabled?.value === '1'
80
+ const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || placing
81
+
82
+ const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
83
+ const [phoneUpdate, setPhoneUpdate] = useState(false);
84
+ const [userErrors, setUserErrors] = useState<any>([]);
85
+ const handleMomentClick = () => {
86
+ if (isPreOrder) {
87
+ navigation.navigate('MomentOption')
88
+ }
89
+ }
90
+
91
+ const checkValidationFields = () => {
92
+ setUserErrors([])
93
+ const errors = []
94
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
95
+
96
+ Object.values(validationFields?.fields?.checkout).map((field: any) => {
97
+ if (field?.required && !notFields.includes(field.code)) {
98
+ if (!user[field?.code]) {
99
+ errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
100
+ }
101
+ }
102
+ })
103
+
104
+ if (
105
+ !user?.cellphone &&
106
+ ((validationFields?.fields?.checkout?.cellphone?.enabled &&
107
+ validationFields?.fields?.checkout?.cellphone?.required) ||
108
+ configs?.verification_phone_required?.value === '1')
109
+ ) {
110
+ errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
111
+ }
112
+
113
+ if (phoneUpdate) {
114
+ errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
115
+ }
116
+
117
+ setUserErrors(errors)
118
+ }
119
+
120
+ const togglePhoneUpdate = (val: boolean) => {
121
+ setPhoneUpdate(val)
122
+ }
123
+
124
+ const handlePlaceOrder = () => {
125
+ if (!userErrors.length) {
126
+ handleGroupPlaceOrder && handleGroupPlaceOrder()
127
+ return
128
+ }
129
+ let stringError = ''
130
+ Object.values(userErrors).map((item: any, i: number) => {
131
+ stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
132
+ })
133
+ showToast(ToastType.Error, stringError)
134
+ setIsUserDetailsEdit(true)
135
+ }
136
+
137
+ useEffect(() => {
138
+ if (validationFields && validationFields?.fields?.checkout) {
139
+ checkValidationFields()
140
+ }
141
+ }, [validationFields, user])
142
+
143
+ return (
144
+ <>
145
+ <Container noPadding>
146
+ <View style={styles.wrapperNavbar}>
147
+ <NavBar
148
+ isVertical
149
+ title={t('CHECKOUT', 'Checkout')}
150
+ titleAlign={'center'}
151
+ onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
152
+ showCall={false}
153
+ btnStyle={{ paddingLeft: 0 }}
154
+ style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
155
+ titleWrapStyle={{ paddingHorizontal: 0 }}
156
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
157
+ />
158
+ </View>
159
+ <ChContainer style={styles.pagePadding}>
160
+ <ChSection style={{ paddingTop: 0 }}>
161
+ <ChHeader>
162
+ <CHMomentWrapper onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
163
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(options?.type || 1), 'Delivery')}</OText>
164
+ <OIcon
165
+ src={theme.images.general.arrow_down}
166
+ width={10}
167
+ style={{ marginStart: 8 }}
168
+ />
169
+ </CHMomentWrapper>
170
+ <CHMomentWrapper
171
+ onPress={() => handleMomentClick()}
172
+ disabled={loading}
173
+ >
174
+ <OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
175
+ {options?.moment
176
+ ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
177
+ : t('ASAP_ABBREVIATION', 'ASAP')}
178
+ </OText>
179
+ {isPreOrder && (
180
+ <OIcon
181
+ src={theme.images.general.arrow_down}
182
+ width={10}
183
+ style={{ marginStart: 8 }}
184
+ />
185
+ )}
186
+ </CHMomentWrapper>
187
+ </ChHeader>
188
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
189
+ </ChSection>
190
+
191
+ <ChSection>
192
+ <ChUserDetails>
193
+ <UserDetails
194
+ isUserDetailsEdit={isUserDetailsEdit}
195
+ useValidationFields
196
+ useDefualtSessionManager
197
+ useSessionUser
198
+ isCheckout
199
+ phoneUpdate={phoneUpdate}
200
+ togglePhoneUpdate={togglePhoneUpdate}
201
+ />
202
+ </ChUserDetails>
203
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
204
+ </ChSection>
205
+
206
+ <ChSection>
207
+ <ChAddress>
208
+ <AddressDetails
209
+ navigation={navigation}
210
+ isMultiCheckout
211
+ openCarts={openCarts}
212
+ apiKey={configs?.google_maps_api_key?.value}
213
+ mapConfigs={mapConfigs}
214
+ />
215
+ </ChAddress>
216
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
217
+ </ChSection>
218
+
219
+ <ChSection>
220
+ <MultiCartsPaymethodsAndWallets
221
+ openCarts={openCarts}
222
+ paymethodSelected={paymethodSelected}
223
+ handleSelectPaymethod={handleSelectPaymethod}
224
+ handleSelectWallet={handleSelectWallet}
225
+ handlePaymethodDataChange={handlePaymethodDataChange}
226
+ />
227
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
228
+ </ChSection>
229
+
230
+ <ChSection>
231
+ <ChCarts>
232
+ <CartsHeader>
233
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} style={{ fontWeight: '500' }}>
234
+ {t('MOBILE_FRONT_YOUR_ORDER', 'Your order')}
235
+ </OText>
236
+ </CartsHeader>
237
+ {openCarts.map((cart: any) => (
238
+ <React.Fragment key={cart.uuid}>
239
+ <Cart
240
+ cart={cart}
241
+ cartuuid={cart.uuid}
242
+ isMultiCheckout
243
+ />
244
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
245
+ </React.Fragment>
246
+ ))}
247
+ {openCarts.length === 0 && (
248
+ <CCNotCarts>
249
+ <OText size={24} style={{ textAlign: 'center' }}>
250
+ {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
251
+ </OText>
252
+ </CCNotCarts>
253
+ )}
254
+ {openCarts.length > 0 && (
255
+ <ChCartsTotal>
256
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
257
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
258
+ {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
259
+ </OText>
260
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
261
+ </View>
262
+ <OText size={12} color={theme.colors.mediumGray} mRight={70} style={{ marginTop: 10 }}>
263
+ {t('MULTI_CHECKOUT_DESCRIPTION', 'You will receive a receipt for each business. The payment is not combined between multiple stores. Each payment is processed by the store')}
264
+ </OText>
265
+ </ChCartsTotal>
266
+ )}
267
+ </ChCarts>
268
+ </ChSection>
269
+ </ChContainer>
270
+ </Container>
271
+
272
+ <FloatingButton
273
+ handleClick={() => handlePlaceOrder()}
274
+ isSecondaryBtn={isDisablePlaceOrderButton}
275
+ disabled={isDisablePlaceOrderButton}
276
+ btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
277
+ btnRightValueShow
278
+ btnRightValue={parsePrice(totalCartsPrice)}
279
+ iosBottom={30}
280
+ />
281
+ </>
282
+ )
283
+ }
284
+
285
+ export const MultiCheckout = (props: any) => {
286
+ const multiCheckoutProps = {
287
+ ...props,
288
+ UIComponent: MultiCheckoutUI
289
+ }
290
+ return <MultiCheckoutController {...multiCheckoutProps} />
291
+ }
@@ -0,0 +1,59 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const ChContainer = styled.View`
4
+ margin-bottom: 60px;
5
+ `
6
+ export const ChSection = styled.View`
7
+ padding-top: 30px;
8
+ `
9
+ export const ChHeader = styled.View`
10
+ justify-content: flex-start;
11
+ flex-direction: row;
12
+ align-items: center;
13
+ margin: 0px;
14
+ `
15
+ export const CHMomentWrapper = styled.TouchableOpacity`
16
+ background-color: ${(props: any) => props.theme.colors.backgroundGray100};
17
+ border-radius: 7.6px;
18
+ font-size: 12px;
19
+ max-width: 240px;
20
+ height: 26px;
21
+ align-items: center;
22
+ justify-content: center;
23
+ padding-horizontal: 8px;
24
+ flex-direction: row;
25
+ margin-end: 12px;
26
+ `
27
+ export const ChUserDetails = styled.View`
28
+ display: flex;
29
+ justify-content: center;
30
+ flex-direction: column;
31
+ width: 100%;
32
+ padding-bottom: 34px;
33
+ `
34
+ export const ChAddress = styled.View`
35
+ width: 100%;
36
+ `
37
+ export const ChCarts = styled.View`
38
+ display: flex;
39
+ flex-direction: column;
40
+ padding: 0 0 20px;
41
+ `
42
+ export const CartsHeader = styled.View`
43
+ align-items: center;
44
+ flex-direction: row;
45
+ justify-content: space-between;
46
+ margin-bottom: 10px;
47
+ `
48
+ export const CCNotCarts = styled.View`
49
+ height: 300px;
50
+ display: flex;
51
+ flex-direction: column;
52
+ justify-content: center;
53
+ align-items: center;
54
+ width: 80%;
55
+ margin: auto;
56
+ `
57
+ export const ChCartsTotal = styled.View`
58
+ margin-top: 16px;
59
+ `