ordering-ui-react-native 0.16.14 → 0.16.15-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 (216) hide show
  1. package/package.json +7 -4
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/AddressForm/index.tsx +18 -2
  6. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  7. package/src/components/BusinessController/index.tsx +10 -8
  8. package/src/components/BusinessInformation/index.tsx +22 -0
  9. package/src/components/BusinessProductsList/index.tsx +10 -10
  10. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  11. package/src/components/BusinessesListing/index.tsx +1 -1
  12. package/src/components/Checkout/index.tsx +2 -1
  13. package/src/components/LanguageSelector/index.tsx +21 -16
  14. package/src/components/LoginForm/index.tsx +118 -30
  15. package/src/components/LoginForm/styles.tsx +6 -0
  16. package/src/components/Messages/index.tsx +2 -2
  17. package/src/components/NotificationSetting/index.tsx +85 -0
  18. package/src/components/OrderDetails/index.tsx +7 -21
  19. package/src/components/OrdersOption/index.tsx +54 -56
  20. package/src/components/PaymentOptions/index.tsx +335 -365
  21. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  22. package/src/components/ReviewDriver/index.tsx +1 -1
  23. package/src/components/ReviewOrder/index.tsx +2 -1
  24. package/src/components/ReviewProducts/index.tsx +11 -0
  25. package/src/components/SignupForm/index.tsx +143 -61
  26. package/src/components/SingleProductReview/index.tsx +8 -5
  27. package/src/components/StripeElementsForm/index.tsx +25 -16
  28. package/src/components/VerifyPhone/styles.tsx +1 -2
  29. package/src/components/shared/OBottomPopup.tsx +6 -2
  30. package/src/index.tsx +2 -0
  31. package/src/navigators/CheckoutNavigator.tsx +6 -0
  32. package/src/navigators/HomeNavigator.tsx +6 -0
  33. package/src/pages/BusinessesListing.tsx +7 -6
  34. package/src/pages/MultiCheckout.tsx +31 -0
  35. package/src/pages/MultiOrdersDetails.tsx +27 -0
  36. package/src/pages/OrderDetails.tsx +1 -1
  37. package/src/pages/ReviewDriver.tsx +2 -2
  38. package/src/pages/ReviewOrder.tsx +2 -2
  39. package/src/theme.json +0 -1
  40. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  41. package/src/types/index.tsx +13 -9
  42. package/src/utils/index.tsx +0 -1
  43. package/themes/business/index.tsx +4 -0
  44. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  45. package/themes/business/src/components/Chat/index.tsx +42 -34
  46. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  47. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  48. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  49. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  50. package/themes/business/src/components/MapView/index.tsx +1 -1
  51. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  52. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  53. package/themes/business/src/components/OrderDetails/Delivery.tsx +3 -3
  54. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +19 -18
  55. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  56. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  57. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  58. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  59. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  60. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  61. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  62. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  63. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  64. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  65. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  66. package/themes/business/src/components/PreviousOrders/index.tsx +21 -23
  67. package/themes/business/src/components/ProductItemAccordion/index.tsx +5 -4
  68. package/themes/business/src/components/ReviewCustomer/index.tsx +1 -1
  69. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  70. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  71. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  72. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  73. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  74. package/themes/business/src/components/shared/OModal.tsx +40 -37
  75. package/themes/business/src/types/index.tsx +14 -9
  76. package/themes/business/src/utils/index.tsx +10 -0
  77. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  78. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  79. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  80. package/themes/kiosk/src/components/BusinessMenu/index.tsx +2 -1
  81. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  82. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +1 -0
  83. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  84. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  85. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  86. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  87. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  88. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  89. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  90. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  91. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  92. package/themes/kiosk/src/types/index.d.ts +2 -0
  93. package/themes/original/index.tsx +18 -0
  94. package/themes/original/src/components/AddressForm/index.tsx +136 -133
  95. package/themes/original/src/components/AddressList/index.tsx +1 -1
  96. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  97. package/themes/original/src/components/BusinessBasicInformation/index.tsx +302 -160
  98. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  99. package/themes/original/src/components/BusinessController/index.tsx +173 -108
  100. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -9
  101. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  102. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  103. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  104. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  105. package/themes/original/src/components/BusinessListingSearch/index.tsx +106 -126
  106. package/themes/original/src/components/BusinessListingSearch/styles.tsx +18 -13
  107. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  108. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  109. package/themes/original/src/components/BusinessProductsList/index.tsx +53 -53
  110. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  111. package/themes/original/src/components/BusinessProductsListing/index.tsx +290 -181
  112. package/themes/original/src/components/BusinessProductsListing/styles.tsx +18 -0
  113. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  114. package/themes/original/src/components/BusinessTypeFilter/index.tsx +109 -40
  115. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  116. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +561 -0
  117. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  118. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +676 -0
  119. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  120. package/themes/original/src/components/BusinessesListing/index.tsx +100 -495
  121. package/themes/original/src/components/Cart/index.tsx +81 -36
  122. package/themes/original/src/components/Cart/styles.tsx +4 -0
  123. package/themes/original/src/components/CartContent/index.tsx +22 -16
  124. package/themes/original/src/components/Checkout/index.tsx +106 -66
  125. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  126. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  127. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  128. package/themes/original/src/components/Favorite/index.tsx +1 -0
  129. package/themes/original/src/components/Favorite/styles.tsx +1 -0
  130. package/themes/original/src/components/FavoriteList/index.tsx +143 -94
  131. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  132. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  133. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +8 -3
  134. package/themes/original/src/components/HelpGuide/index.tsx +8 -3
  135. package/themes/original/src/components/HelpOrder/index.tsx +8 -3
  136. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  137. package/themes/original/src/components/LoginForm/Otp/index.tsx +3 -2
  138. package/themes/original/src/components/LoginForm/index.tsx +79 -42
  139. package/themes/original/src/components/Messages/index.tsx +17 -17
  140. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  141. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  142. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  143. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  144. package/themes/original/src/components/MultiCheckout/index.tsx +304 -0
  145. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  146. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  147. package/themes/original/src/components/MultiOrdersDetails/index.tsx +262 -0
  148. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  149. package/themes/original/src/components/MyOrders/index.tsx +177 -27
  150. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  151. package/themes/original/src/components/NavBar/index.tsx +11 -5
  152. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  153. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  154. package/themes/original/src/components/Notifications/index.tsx +148 -0
  155. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  156. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  157. package/themes/original/src/components/OrderDetails/index.tsx +187 -49
  158. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  159. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  160. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  161. package/themes/original/src/components/OrderProgress/index.tsx +8 -2
  162. package/themes/original/src/components/OrderSummary/index.tsx +1 -34
  163. package/themes/original/src/components/OrderTypeSelector/index.tsx +84 -36
  164. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  165. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +144 -0
  166. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  167. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +56 -0
  168. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  169. package/themes/original/src/components/OrdersOption/index.tsx +126 -37
  170. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  171. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  172. package/themes/original/src/components/PaymentOptions/index.tsx +57 -37
  173. package/themes/original/src/components/PhoneInputNumber/index.tsx +4 -10
  174. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  175. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  176. package/themes/original/src/components/ProductForm/index.tsx +712 -655
  177. package/themes/original/src/components/ProductForm/styles.tsx +9 -7
  178. package/themes/original/src/components/ProductItemAccordion/index.tsx +170 -128
  179. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  180. package/themes/original/src/components/ProfessionalFilter/index.tsx +129 -0
  181. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  182. package/themes/original/src/components/ProfessionalProfile/index.tsx +309 -0
  183. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  184. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  185. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  186. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  187. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  188. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  189. package/themes/original/src/components/SearchBar/index.tsx +10 -5
  190. package/themes/original/src/components/ServiceForm/index.tsx +631 -0
  191. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  192. package/themes/original/src/components/SignupForm/index.tsx +301 -158
  193. package/themes/original/src/components/SingleOrderCard/index.tsx +213 -177
  194. package/themes/original/src/components/SingleProductCard/index.tsx +198 -110
  195. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  196. package/themes/original/src/components/SingleProductReview/index.tsx +30 -3
  197. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  198. package/themes/original/src/components/StripeElementsForm/index.tsx +25 -9
  199. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  200. package/themes/original/src/components/UpsellingProducts/index.tsx +14 -4
  201. package/themes/original/src/components/UserDetails/index.tsx +32 -18
  202. package/themes/original/src/components/UserFormDetails/index.tsx +74 -81
  203. package/themes/original/src/components/UserProfile/index.tsx +57 -29
  204. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  205. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  206. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  207. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  208. package/themes/original/src/components/Wallets/index.tsx +174 -162
  209. package/themes/original/src/components/Wallets/styles.tsx +10 -8
  210. package/themes/original/src/components/shared/OBottomPopup.tsx +47 -14
  211. package/themes/original/src/components/shared/OButton.tsx +10 -3
  212. package/themes/original/src/components/shared/OInput.tsx +3 -2
  213. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  214. package/themes/original/src/types/index.tsx +164 -46
  215. package/themes/original/src/utils/index.tsx +77 -0
  216. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -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, marginBottom: 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,304 @@
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 maximumCarts = 5
81
+ const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || openCarts.length > maximumCarts
82
+ const walletCarts = (Object.values(carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && cart?.wallets) || null) || []
83
+
84
+ const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
85
+ const [phoneUpdate, setPhoneUpdate] = useState(false);
86
+ const [userErrors, setUserErrors] = useState<any>([]);
87
+ const handleMomentClick = () => {
88
+ if (isPreOrder) {
89
+ navigation.navigate('MomentOption')
90
+ }
91
+ }
92
+
93
+ const checkValidationFields = () => {
94
+ setUserErrors([])
95
+ const errors = []
96
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
97
+
98
+ Object.values(validationFields?.fields?.checkout).map((field: any) => {
99
+ if (field?.required && !notFields.includes(field.code)) {
100
+ if (!user[field?.code]) {
101
+ errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
102
+ }
103
+ }
104
+ })
105
+
106
+ if (
107
+ !user?.cellphone &&
108
+ ((validationFields?.fields?.checkout?.cellphone?.enabled &&
109
+ validationFields?.fields?.checkout?.cellphone?.required) ||
110
+ configs?.verification_phone_required?.value === '1')
111
+ ) {
112
+ errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
113
+ }
114
+
115
+ if (phoneUpdate) {
116
+ errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
117
+ }
118
+
119
+ setUserErrors(errors)
120
+ }
121
+
122
+ const togglePhoneUpdate = (val: boolean) => {
123
+ setPhoneUpdate(val)
124
+ }
125
+
126
+ const handlePlaceOrder = () => {
127
+ if (!userErrors.length) {
128
+ handleGroupPlaceOrder && handleGroupPlaceOrder()
129
+ return
130
+ }
131
+ let stringError = ''
132
+ Object.values(userErrors).map((item: any, i: number) => {
133
+ stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
134
+ })
135
+ showToast(ToastType.Error, stringError)
136
+ setIsUserDetailsEdit(true)
137
+ }
138
+
139
+ useEffect(() => {
140
+ if (validationFields && validationFields?.fields?.checkout) {
141
+ checkValidationFields()
142
+ }
143
+ }, [validationFields, user])
144
+
145
+ return (
146
+ <>
147
+ <Container noPadding>
148
+ <View style={styles.wrapperNavbar}>
149
+ <NavBar
150
+ isVertical
151
+ title={t('CHECKOUT', 'Checkout')}
152
+ titleAlign={'center'}
153
+ onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
154
+ showCall={false}
155
+ btnStyle={{ paddingLeft: 0 }}
156
+ style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
157
+ titleWrapStyle={{ paddingHorizontal: 0 }}
158
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
159
+ />
160
+ </View>
161
+ <ChContainer style={styles.pagePadding}>
162
+ <ChSection style={{ paddingTop: 0 }}>
163
+ <ChHeader>
164
+ <CHMomentWrapper onPress={() => navigation.navigate('OrderTypes', { configTypes: configTypes })}>
165
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textSecondary}>{t(getTypesText(options?.type || 1), 'Delivery')}</OText>
166
+ <OIcon
167
+ src={theme.images.general.arrow_down}
168
+ width={10}
169
+ style={{ marginStart: 8 }}
170
+ />
171
+ </CHMomentWrapper>
172
+ <CHMomentWrapper
173
+ onPress={() => handleMomentClick()}
174
+ disabled={loading}
175
+ >
176
+ <OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
177
+ {options?.moment
178
+ ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
179
+ : t('ASAP_ABBREVIATION', 'ASAP')}
180
+ </OText>
181
+ {isPreOrder && (
182
+ <OIcon
183
+ src={theme.images.general.arrow_down}
184
+ width={10}
185
+ style={{ marginStart: 8 }}
186
+ />
187
+ )}
188
+ </CHMomentWrapper>
189
+ </ChHeader>
190
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
191
+ </ChSection>
192
+
193
+ <ChSection>
194
+ <ChUserDetails>
195
+ <UserDetails
196
+ isUserDetailsEdit={isUserDetailsEdit}
197
+ useValidationFields
198
+ useDefualtSessionManager
199
+ useSessionUser
200
+ isCheckout
201
+ phoneUpdate={phoneUpdate}
202
+ togglePhoneUpdate={togglePhoneUpdate}
203
+ />
204
+ </ChUserDetails>
205
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginHorizontal: -40 }} />
206
+ </ChSection>
207
+
208
+ <ChSection>
209
+ <ChAddress>
210
+ <AddressDetails
211
+ navigation={navigation}
212
+ isMultiCheckout
213
+ openCarts={openCarts}
214
+ apiKey={configs?.google_maps_api_key?.value}
215
+ mapConfigs={mapConfigs}
216
+ />
217
+ </ChAddress>
218
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
219
+ </ChSection>
220
+
221
+ <ChSection>
222
+ <MultiCartsPaymethodsAndWallets
223
+ openCarts={openCarts}
224
+ paymethodSelected={paymethodSelected}
225
+ handleSelectPaymethod={handleSelectPaymethod}
226
+ handleSelectWallet={handleSelectWallet}
227
+ handlePaymethodDataChange={handlePaymethodDataChange}
228
+ />
229
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
230
+ </ChSection>
231
+
232
+ <ChSection>
233
+ <ChCarts>
234
+ <CartsHeader>
235
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} style={{ fontWeight: '500' }}>
236
+ {t('MOBILE_FRONT_YOUR_ORDER', 'Your order')}
237
+ </OText>
238
+ </CartsHeader>
239
+ {openCarts.map((cart: any) => (
240
+ <React.Fragment key={cart.uuid}>
241
+ <Cart
242
+ cart={cart}
243
+ cartuuid={cart.uuid}
244
+ isMultiCheckout
245
+ onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
246
+ />
247
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
248
+ </React.Fragment>
249
+ ))}
250
+ {openCarts.length === 0 && (
251
+ <CCNotCarts>
252
+ <OText size={24} style={{ textAlign: 'center' }}>
253
+ {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
254
+ </OText>
255
+ </CCNotCarts>
256
+ )}
257
+ {walletCarts.length > 0 && (
258
+ <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
259
+ {t('WARNING_PARTIAL_WALLET_CARTS', 'Important: One or more carts can`t be completed due a partial payment with cash/points wallet and requires to be paid individually')}
260
+ </OText>
261
+ )}
262
+ {openCarts.length > 0 && (
263
+ <ChCartsTotal>
264
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
265
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
266
+ {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
267
+ </OText>
268
+ <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>{parsePrice(totalCartsPrice)}</OText>
269
+ </View>
270
+ <OText size={12} color={theme.colors.mediumGray} mRight={70} style={{ marginTop: 10 }}>
271
+ {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')}
272
+ </OText>
273
+ </ChCartsTotal>
274
+ )}
275
+ {openCarts.length > maximumCarts && (
276
+ <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
277
+ {t('WARNING_MAXIMUM_CARTS', 'You can only pay for a maximum of 5 carts, please discard one or more to continue.')}
278
+ </OText>
279
+ )}
280
+ </ChCarts>
281
+ </ChSection>
282
+ </ChContainer>
283
+ </Container>
284
+
285
+ <FloatingButton
286
+ handleClick={() => handlePlaceOrder()}
287
+ isSecondaryBtn={isDisablePlaceOrderButton}
288
+ disabled={isDisablePlaceOrderButton}
289
+ btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
290
+ btnRightValueShow
291
+ btnRightValue={parsePrice(totalCartsPrice)}
292
+ iosBottom={30}
293
+ />
294
+ </>
295
+ )
296
+ }
297
+
298
+ export const MultiCheckout = (props: any) => {
299
+ const multiCheckoutProps = {
300
+ ...props,
301
+ UIComponent: MultiCheckoutUI
302
+ }
303
+ return <MultiCheckoutController {...multiCheckoutProps} />
304
+ }
@@ -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
+ `