ordering-ui-react-native 0.16.13 → 0.16.16

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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/components/OrderDetails/index.tsx +5 -1
  3. package/src/navigators/CheckoutNavigator.tsx +6 -0
  4. package/src/navigators/HomeNavigator.tsx +6 -0
  5. package/src/pages/MultiCheckout.tsx +31 -0
  6. package/src/pages/MultiOrdersDetails.tsx +27 -0
  7. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +2 -2
  8. package/themes/original/index.tsx +6 -0
  9. package/themes/original/src/components/BusinessItemAccordion/index.tsx +3 -2
  10. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +0 -2
  11. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +1 -1
  12. package/themes/original/src/components/BusinessProductsList/index.tsx +4 -1
  13. package/themes/original/src/components/BusinessProductsListing/index.tsx +16 -7
  14. package/themes/original/src/components/BusinessesListing/index.tsx +1 -1
  15. package/themes/original/src/components/Cart/index.tsx +17 -8
  16. package/themes/original/src/components/FavoriteList/index.tsx +4 -4
  17. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  18. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  19. package/themes/original/src/components/MultiCheckout/index.tsx +291 -0
  20. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  21. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +370 -0
  22. package/themes/original/src/components/MultiOrdersDetails/index.tsx +250 -0
  23. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  24. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  25. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  26. package/themes/original/src/components/OrderDetails/index.tsx +9 -7
  27. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +150 -0
  28. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  29. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +51 -0
  30. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  31. package/themes/original/src/components/OrdersOption/index.tsx +102 -28
  32. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  33. package/themes/original/src/components/SingleOrderCard/index.tsx +5 -3
  34. package/themes/original/src/components/SingleProductCard/index.tsx +8 -6
  35. package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
  36. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  37. package/themes/original/src/components/UserDetails/index.tsx +1 -1
  38. package/themes/original/src/types/index.tsx +44 -19
@@ -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
+ `