ordering-ui-react-native 0.15.40 → 0.15.42-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 (197) hide show
  1. package/package.json +8 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessController/index.tsx +8 -2
  5. package/src/components/BusinessTypeFilter/index.tsx +4 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Checkout/index.tsx +23 -2
  8. package/src/components/DriverTips/index.tsx +11 -6
  9. package/src/components/LanguageSelector/index.tsx +7 -2
  10. package/src/components/LoginForm/index.tsx +3 -1
  11. package/src/components/OrderDetails/index.tsx +2 -2
  12. package/src/components/PaymentOptions/index.tsx +1 -1
  13. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  14. package/src/components/SignupForm/index.tsx +3 -1
  15. package/src/components/SingleProductCard/index.tsx +16 -4
  16. package/src/components/StripeMethodForm/index.tsx +1 -2
  17. package/src/components/UpsellingProducts/index.tsx +1 -1
  18. package/src/components/UserProfileForm/index.tsx +63 -6
  19. package/src/components/UserProfileForm/styles.tsx +8 -0
  20. package/src/components/VerifyPhone/styles.tsx +1 -2
  21. package/src/components/shared/OModal.tsx +1 -1
  22. package/src/hooks/useCountdownTimer.tsx +26 -0
  23. package/src/navigators/CheckoutNavigator.tsx +6 -0
  24. package/src/navigators/HomeNavigator.tsx +12 -0
  25. package/src/pages/BusinessProductsList.tsx +1 -0
  26. package/src/pages/BusinessesListing.tsx +1 -1
  27. package/src/pages/MultiCheckout.tsx +31 -0
  28. package/src/pages/MultiOrdersDetails.tsx +27 -0
  29. package/src/pages/Sessions.tsx +22 -0
  30. package/src/theme.json +0 -1
  31. package/src/types/index.tsx +5 -2
  32. package/src/utils/index.tsx +68 -1
  33. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  34. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  35. package/themes/business/src/components/Chat/index.tsx +38 -86
  36. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  37. package/themes/business/src/components/Home/index.tsx +128 -55
  38. package/themes/business/src/components/Home/styles.tsx +8 -1
  39. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  40. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  41. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  42. package/themes/business/src/components/NewOrderNotification/index.tsx +79 -105
  43. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  44. package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -18
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +157 -89
  46. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  47. package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
  48. package/themes/business/src/components/OrdersListManager/index.tsx +52 -49
  49. package/themes/business/src/components/OrdersOption/index.tsx +57 -50
  50. package/themes/business/src/components/PreviousOrders/index.tsx +50 -14
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  52. package/themes/business/src/components/shared/OModal.tsx +1 -1
  53. package/themes/business/src/types/index.tsx +5 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  58. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  59. package/themes/kiosk/src/components/Cart/index.tsx +99 -26
  60. package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
  61. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  62. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  63. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  64. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  65. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  66. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  67. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  68. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  69. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  70. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  71. package/themes/kiosk/src/components/OrderDetails/index.tsx +165 -65
  72. package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
  73. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  74. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  75. package/themes/kiosk/src/components/ProductForm/index.tsx +8 -9
  76. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  77. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  78. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  79. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  80. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  81. package/themes/kiosk/src/types/index.d.ts +3 -0
  82. package/themes/original/index.tsx +180 -1
  83. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  84. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  85. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  86. package/themes/original/src/components/AddressList/index.tsx +56 -18
  87. package/themes/original/src/components/AppleLogin/index.tsx +117 -78
  88. package/themes/original/src/components/BusinessBasicInformation/index.tsx +96 -45
  89. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
  90. package/themes/original/src/components/BusinessController/index.tsx +50 -12
  91. package/themes/original/src/components/BusinessController/styles.tsx +27 -0
  92. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  93. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  94. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  95. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  96. package/themes/original/src/components/BusinessListingSearch/index.tsx +196 -58
  97. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  98. package/themes/original/src/components/BusinessPreorder/index.tsx +2 -2
  99. package/themes/original/src/components/BusinessProductsCategories/index.tsx +9 -7
  100. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  101. package/themes/original/src/components/BusinessProductsList/index.tsx +139 -36
  102. package/themes/original/src/components/BusinessProductsList/styles.tsx +29 -2
  103. package/themes/original/src/components/BusinessProductsListing/index.tsx +116 -26
  104. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  105. package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
  106. package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
  107. package/themes/original/src/components/BusinessesListing/index.tsx +127 -66
  108. package/themes/original/src/components/BusinessesListing/styles.tsx +11 -3
  109. package/themes/original/src/components/Cart/index.tsx +60 -43
  110. package/themes/original/src/components/CartContent/index.tsx +2 -2
  111. package/themes/original/src/components/Checkout/index.tsx +50 -33
  112. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  113. package/themes/original/src/components/Favorite/index.tsx +91 -0
  114. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  115. package/themes/original/src/components/FavoriteList/index.tsx +287 -0
  116. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  117. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  118. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  119. package/themes/original/src/components/GoogleMap/index.tsx +1 -0
  120. package/themes/original/src/components/Help/index.tsx +21 -4
  121. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  122. package/themes/original/src/components/Home/index.tsx +1 -1
  123. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +90 -0
  125. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  126. package/themes/original/src/components/LoginForm/index.tsx +394 -155
  127. package/themes/original/src/components/LoginForm/styles.tsx +7 -4
  128. package/themes/original/src/components/LogoutButton/index.tsx +7 -1
  129. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  130. package/themes/original/src/components/Messages/index.tsx +6 -1
  131. package/themes/original/src/components/Messages/styles.tsx +1 -3
  132. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  133. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  134. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  135. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  136. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  137. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  138. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  139. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  140. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  141. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  142. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  143. package/themes/original/src/components/OrderDetails/index.tsx +55 -37
  144. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  145. package/themes/original/src/components/OrderProgress/index.tsx +3 -3
  146. package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +3 -3
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  149. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  150. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  151. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  152. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  153. package/themes/original/src/components/OrdersOption/index.tsx +133 -41
  154. package/themes/original/src/components/OrdersOption/styles.tsx +4 -7
  155. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  156. package/themes/original/src/components/PaymentOptionWallet/index.tsx +22 -24
  157. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  158. package/themes/original/src/components/PaymentOptions/index.tsx +19 -15
  159. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  160. package/themes/original/src/components/PreviousOrders/index.tsx +18 -145
  161. package/themes/original/src/components/ProductForm/index.tsx +74 -66
  162. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  165. package/themes/original/src/components/Promotions/index.tsx +250 -0
  166. package/themes/original/src/components/Promotions/styles.tsx +60 -0
  167. package/themes/original/src/components/SearchBar/index.tsx +10 -4
  168. package/themes/original/src/components/Sessions/index.tsx +160 -0
  169. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  170. package/themes/original/src/components/SignupForm/index.tsx +79 -6
  171. package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
  172. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  173. package/themes/original/src/components/SingleProductCard/index.tsx +95 -32
  174. package/themes/original/src/components/SingleProductCard/styles.tsx +28 -1
  175. package/themes/original/src/components/StripeElementsForm/index.tsx +10 -2
  176. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  177. package/themes/original/src/components/TaxInformation/index.tsx +10 -4
  178. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  179. package/themes/original/src/components/UserDetails/index.tsx +5 -96
  180. package/themes/original/src/components/UserFormDetails/index.tsx +34 -24
  181. package/themes/original/src/components/UserProfile/index.tsx +62 -8
  182. package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
  183. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  184. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  185. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  186. package/themes/original/src/components/Wallets/index.tsx +76 -9
  187. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  188. package/themes/original/src/components/shared/HeaderTitle.tsx +21 -0
  189. package/themes/original/src/components/shared/OModal.tsx +4 -2
  190. package/themes/original/src/components/shared/index.tsx +2 -0
  191. package/themes/original/src/config/constants.tsx +6 -6
  192. package/themes/original/src/types/index.tsx +132 -9
  193. package/themes/original/src/utils/index.tsx +28 -2
  194. package/themes/single-business/src/components/AddressList/index.tsx +1 -1
  195. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  196. package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
  197. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -0,0 +1,282 @@
1
+ import React, { useState } from 'react';
2
+ import moment from 'moment';
3
+ import {
4
+ SingleOrderCard as SingleOrderCardController,
5
+ useUtils,
6
+ useLanguage
7
+ } from 'ordering-components/native';
8
+ import { StyleSheet, TouchableOpacity, View } from 'react-native';
9
+ import { useTheme } from 'styled-components/native';
10
+ import { OIcon, OText, OButton } from '../shared';
11
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
12
+ import { SingleOrderCardParams } from '../../types';
13
+
14
+ import {
15
+ Container,
16
+ InnerContainer,
17
+ Logo,
18
+ CardInfoWrapper,
19
+ ContentHeader,
20
+ ButtonWrapper,
21
+ ContentFooter,
22
+ UnreadMessageCounter,
23
+ Price
24
+ } from './styles';
25
+
26
+ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
27
+ const {
28
+ order,
29
+ reorderLoading,
30
+ handleReorder,
31
+ getOrderStatus,
32
+ handleFavoriteOrder,
33
+ onNavigationRedirect,
34
+ pastOrders,
35
+ isMessageView,
36
+ handleClickOrder
37
+ } = props;
38
+
39
+ const [{ parsePrice, optimizeImage }] = useUtils();
40
+ const [, t] = useLanguage();
41
+ const theme = useTheme();
42
+
43
+ const [reorderSelected, setReorderSelected] = useState<number | null>(null);
44
+
45
+ const allowedOrderStatus = [1, 2, 5, 6, 10, 11, 12];
46
+
47
+ const styles = StyleSheet.create({
48
+ logo: {
49
+ borderRadius: 8,
50
+ width: 64,
51
+ height: 64
52
+ },
53
+ logoWrapper: {
54
+ overflow: 'hidden',
55
+ backgroundColor: 'white',
56
+ borderRadius: 8,
57
+ shadowColor: '#000000',
58
+ shadowOffset: { width: 1, height: 1 },
59
+ shadowOpacity: 0.1,
60
+ shadowRadius: 1,
61
+ elevation: 3
62
+ },
63
+ buttonText: {
64
+ color: theme.colors.primary,
65
+ fontSize: 10,
66
+ marginLeft: 2,
67
+ marginRight: 2,
68
+ },
69
+ reorderLoading: {
70
+ width: 80,
71
+ height: 40,
72
+ borderRadius: 10,
73
+ },
74
+ reorderbutton: {
75
+ height: 23,
76
+ paddingLeft: 10,
77
+ paddingRight: 10,
78
+ borderRadius: 23,
79
+ shadowOpacity: 0,
80
+ backgroundColor: theme.colors.primaryContrast,
81
+ borderWidth: 0,
82
+ },
83
+ reviewButton: {
84
+ height: 23,
85
+ maxHeight: 23,
86
+ backgroundColor: theme.colors.white,
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ paddingHorizontal: 10,
90
+ borderRadius: 23,
91
+ borderWidth: 1,
92
+ borderColor: theme.colors.primaryContrast,
93
+ marginRight: 2
94
+ },
95
+ infoText: {
96
+ flexDirection: 'row',
97
+ alignItems: 'center'
98
+ }
99
+ });
100
+
101
+ const handleReorderClick = (id: number) => {
102
+ setReorderSelected(id);
103
+ handleReorder && handleReorder(id);
104
+ };
105
+
106
+ const handleClickOrderReview = (order: any) => {
107
+ if (pastOrders) {
108
+ onNavigationRedirect &&
109
+ onNavigationRedirect('ReviewOrder', {
110
+ order: {
111
+ id: order?.id,
112
+ business_id: order?.business_id,
113
+ logo: order?.business?.logo,
114
+ driver: order?.driver,
115
+ products: order?.products,
116
+ review: order?.review,
117
+ user_review: order?.user_review
118
+ },
119
+ });
120
+ return
121
+ }
122
+ if (isMessageView) {
123
+ handleClickOrder(order?.uuid)
124
+ return
125
+ }
126
+ onNavigationRedirect &&
127
+ onNavigationRedirect('OrderDetails', { orderId: order?.uuid });
128
+ };
129
+
130
+ const handleClickViewOrder = (uuid: string) => {
131
+ onNavigationRedirect &&
132
+ onNavigationRedirect('OrderDetails', { orderId: uuid });
133
+ };
134
+
135
+ const formatDate = (date: string, option?: any) => {
136
+ return option?.utc ? moment.utc(date).format('DD/MM/YY \u2022 h:m a') : moment(date).format('DD/MM/YY \u2022 h:m a');
137
+ };
138
+
139
+ const handleChangeFavorite = () => {
140
+ handleFavoriteOrder && handleFavoriteOrder(!order?.favorite)
141
+ };
142
+
143
+ return (
144
+ <Container
145
+ onPress={() => handleClickViewOrder(order?.uuid)}
146
+ activeOpacity={0.7}
147
+ >
148
+ <InnerContainer>
149
+ {!!order.business?.logo && (
150
+ <Logo style={styles.logoWrapper}>
151
+ <OIcon
152
+ url={optimizeImage(order.business?.logo, 'h_300,c_limit')}
153
+ style={styles.logo}
154
+ />
155
+ </Logo>
156
+ )}
157
+ <CardInfoWrapper>
158
+ <ContentHeader>
159
+ <View style={{ flex: 1 }}>
160
+ <OText size={12} lineHeight={18} weight={'600'} numberOfLines={1} ellipsizeMode={'tail'}>
161
+ {order.business?.name}
162
+ </OText>
163
+ </View>
164
+ {!!!pastOrders && (
165
+ <>
166
+ {isMessageView ? (
167
+ <>
168
+ {order?.unread_count > 0 && (
169
+ <UnreadMessageCounter>
170
+ <OText size={12} color={theme.colors.primary} lineHeight={18} >
171
+ {order?.unread_count}
172
+ </OText>
173
+ </UnreadMessageCounter>
174
+ )}
175
+ </>
176
+ ) : (
177
+ <Price>
178
+ <OText size={12} lineHeight={18}>
179
+ {parsePrice(order?.summary?.total || order?.total)}
180
+ </OText>
181
+ </Price>
182
+ )}
183
+ </>
184
+ )}
185
+ {!!pastOrders && (
186
+ <ButtonWrapper>
187
+ {allowedOrderStatus.includes(parseInt(order?.status)) &&
188
+ !order.review && (
189
+ <TouchableOpacity
190
+ onPress={() => handleClickOrderReview(order)}
191
+ style={styles.reviewButton}>
192
+ <OText size={10} color={theme.colors.primary} numberOfLines={1}>
193
+ {t('REVIEW', 'Review')}
194
+ </OText>
195
+ </TouchableOpacity>
196
+ )}
197
+ {order.cart && (
198
+ <OButton
199
+ text={t('REORDER', 'Reorder')}
200
+ imgRightSrc={''}
201
+ textStyle={styles.buttonText}
202
+ style={
203
+ reorderLoading && order.id === reorderSelected
204
+ ? styles.reorderLoading
205
+ : styles.reorderbutton
206
+ }
207
+ onClick={() => handleReorderClick(order.id)}
208
+ isLoading={reorderLoading && order.id === reorderSelected}
209
+ />
210
+ )}
211
+ </ButtonWrapper>
212
+ )}
213
+ </ContentHeader>
214
+ <ContentFooter>
215
+ <View style={{ flex: 1 }}>
216
+ <View style={styles.infoText}>
217
+ {!!!pastOrders && (
218
+ <>
219
+ <OText
220
+ size={10}
221
+ space
222
+ color={theme.colors.textSecondary}
223
+ style={{ marginVertical: 3 }}
224
+ lineHeight={15}
225
+ numberOfLines={1}
226
+ >
227
+ {t('ORDER_NO', 'Order No') + '.'}
228
+ </OText>
229
+ <OText
230
+ size={10}
231
+ color={theme.colors.textSecondary}
232
+ style={{ marginVertical: 3 }}
233
+ lineHeight={15}
234
+ numberOfLines={1}
235
+ >
236
+ {order.id + ` \u2022 `}
237
+ </OText>
238
+ </>
239
+ )}
240
+ <OText
241
+ size={10}
242
+ lineHeight={15}
243
+ color={theme.colors.textSecondary}
244
+ style={{ marginVertical: 3 }}
245
+ numberOfLines={1}>
246
+ {order?.delivery_datetime_utc
247
+ ? formatDate(order?.delivery_datetime_utc)
248
+ : formatDate(order?.delivery_datetime, { utc: false })}
249
+ </OText>
250
+ </View>
251
+ <OText
252
+ color={theme.colors.primary}
253
+ size={10}
254
+ lineHeight={15}
255
+ numberOfLines={1}>
256
+ {getOrderStatus(order.status)?.value}
257
+ </OText>
258
+ </View>
259
+ <TouchableOpacity
260
+ onPress={handleChangeFavorite}
261
+ style={{ marginTop: 5 }}
262
+ >
263
+ <IconAntDesign
264
+ name={order?.favorite ? 'heart' : 'hearto'}
265
+ color={theme.colors.danger5}
266
+ size={16}
267
+ />
268
+ </TouchableOpacity>
269
+ </ContentFooter>
270
+ </CardInfoWrapper>
271
+ </InnerContainer>
272
+ </Container>
273
+ )
274
+ }
275
+
276
+ export const SingleOrderCard = (props: any) => {
277
+ const singleOrderCardProps = {
278
+ ...props,
279
+ UIComponent: SingleOrderCardUI
280
+ }
281
+ return <SingleOrderCardController {...singleOrderCardProps} />
282
+ }
@@ -0,0 +1,54 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const Container = styled.TouchableOpacity`
4
+ border-radius: 7.6px;
5
+ box-shadow: 0 1px 2px #0000001A;
6
+ margin-bottom: 10px;
7
+ padding-vertical: 5px;
8
+ `
9
+
10
+ export const InnerContainer = styled.View`
11
+ flex-direction: row;
12
+ width: 100%;
13
+ `
14
+
15
+ export const Logo = styled.View`
16
+ border-radius: 7.6px;
17
+ margin-right: 12px;
18
+ `
19
+
20
+ export const CardInfoWrapper = styled.View`
21
+ flex: 1;
22
+ `
23
+
24
+ export const ContentHeader = styled.View`
25
+ flex-direction: row;
26
+ justify-content: space-between;
27
+ `
28
+
29
+ export const ButtonWrapper = styled.View`
30
+ flex-direction: row;
31
+ align-items: center;
32
+ `
33
+
34
+ export const ContentFooter = styled.View`
35
+ flex-direction: row;
36
+ width: 100%;
37
+ `
38
+
39
+ export const UnreadMessageCounter = styled.View`
40
+ justify-content: center;
41
+ align-items: center;
42
+ margin-left: 10px;
43
+ width: 24px;
44
+ height: 24px;
45
+ border-radius: 7.6px;
46
+ background-color: ${(props: any) => props.theme.colors.primaryContrast};
47
+ `
48
+
49
+ export const Price = styled.View`
50
+ justify-content: space-between;
51
+ align-items: flex-end;
52
+ margin-left: 10px;
53
+ width: 30%;
54
+ `
@@ -4,22 +4,32 @@ import {
4
4
  useConfig,
5
5
  useOrder,
6
6
  useUtils,
7
+ SingleProductCard as SingleProductCardController
7
8
  } from 'ordering-components/native';
8
9
  import { useTheme } from 'styled-components/native';
9
10
  import { SingleProductCardParams } from '../../types';
10
- import { CardContainer, CardInfo, SoldOut, QuantityContainer, PricesContainer } from './styles';
11
- import { StyleSheet } from 'react-native';
12
- import { OText, OIcon } from '../shared';
11
+ import { CardContainer, CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper } from './styles';
12
+ import { StyleSheet, View, TouchableOpacity, Image } from 'react-native';
13
+ import { OText } from '../shared';
13
14
  import FastImage from 'react-native-fast-image'
15
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
16
+ import { shape } from '../../utils';
14
17
 
15
- export const SingleProductCard = (props: SingleProductCardParams) => {
18
+ function SingleProductCardPropsAreEqual(prevProps: any, nextProps: any) {
19
+ return JSON.stringify(prevProps.product) === JSON.stringify(nextProps.product) &&
20
+ prevProps.isSoldOut === nextProps.isSoldOut &&
21
+ prevProps.productAddedToCartLength === nextProps.productAddedToCartLength &&
22
+ prevProps.categoryState === nextProps.categoryState
23
+ }
24
+
25
+ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
16
26
  const {
17
- businessId,
18
27
  product,
19
28
  isSoldOut,
20
29
  onProductClick,
21
30
  productAddedToCartLength,
22
- style
31
+ style,
32
+ handleFavoriteProduct
23
33
  } = props;
24
34
 
25
35
  const theme = useTheme();
@@ -31,6 +41,11 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
31
41
  borderColor: theme.colors.border,
32
42
  marginBottom: 28,
33
43
  },
44
+ titleWrapper: {
45
+ flexDirection: 'row',
46
+ alignItems: 'center',
47
+ justifyContent: 'space-between'
48
+ },
34
49
  line18: {
35
50
  lineHeight: 18,
36
51
  },
@@ -46,8 +61,7 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
46
61
  productStyle: {
47
62
  width: 75,
48
63
  height: 75,
49
- borderRadius: 7.6,
50
- marginStart: 12
64
+ borderRadius: 7.6
51
65
  },
52
66
  quantityContainer: {
53
67
  position: 'absolute',
@@ -97,6 +111,11 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
97
111
  maxCartProductConfig,
98
112
  maxCartProductInventory,
99
113
  );
114
+
115
+ const handleChangeFavorite = () => {
116
+ handleFavoriteProduct && handleFavoriteProduct(!product?.favorite)
117
+ }
118
+
100
119
  return (
101
120
  <CardContainer
102
121
  style={[
@@ -113,14 +132,25 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
113
132
  </QuantityContainer>
114
133
  )}
115
134
  <CardInfo>
116
- <OText
117
- size={12}
118
- weight={'500'}
119
- numberOfLines={1}
120
- ellipsizeMode="tail"
121
- style={styles.line18}>
122
- {product?.name}
123
- </OText>
135
+ <View style={styles.titleWrapper}>
136
+ <OText
137
+ size={12}
138
+ weight={'500'}
139
+ numberOfLines={1}
140
+ ellipsizeMode="tail"
141
+ style={styles.line18}>
142
+ {product?.name}
143
+ </OText>
144
+ <TouchableOpacity
145
+ onPress={handleChangeFavorite}
146
+ >
147
+ <IconAntDesign
148
+ name={product?.favorite ? 'heart' : 'hearto'}
149
+ color={theme.colors.danger5}
150
+ size={18}
151
+ />
152
+ </TouchableOpacity>
153
+ </View>
124
154
  <PricesContainer>
125
155
  <OText color={theme.colors.primary}>{product?.price ? parsePrice(product?.price) : ''}</OText>
126
156
  {product?.offer_price !== null && product?.in_offer && (
@@ -136,21 +166,46 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
136
166
  {product?.description}
137
167
  </OText>
138
168
  </CardInfo>
139
- {product?.images ? (
140
- <FastImage
141
- style={styles.productStyle}
142
- source={{
143
- uri: optimizeImage(product?.images, 'h_250,c_limit'),
144
- priority: FastImage.priority.normal,
145
- }}
146
- resizeMode={FastImage.resizeMode.cover}
147
- />
148
- ) : (
149
- <OIcon
150
- src={theme?.images?.dummies?.product}
151
- style={styles.productStyle}
152
- />
153
- )}
169
+ <LogoWrapper>
170
+ {product?.ribbon?.enabled && (
171
+ <RibbonBox
172
+ bgColor={product?.ribbon?.color}
173
+ isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
174
+ isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
175
+ >
176
+ <OText
177
+ size={10}
178
+ weight={'400'}
179
+ color={theme.colors.white}
180
+ numberOfLines={2}
181
+ ellipsizeMode='tail'
182
+ lineHeight={13}
183
+ >
184
+ {product?.ribbon?.text}
185
+ </OText>
186
+ </RibbonBox>
187
+ )}
188
+ {product?.images ? (
189
+ <FastImage
190
+ style={styles.productStyle}
191
+ source={{
192
+ uri: optimizeImage(product?.images, 'h_250,c_limit'),
193
+ priority: FastImage.priority.normal,
194
+ }}
195
+ resizeMode={FastImage.resizeMode.cover}
196
+ />
197
+ ) : (
198
+ <FastImage
199
+ style={styles.productStyle}
200
+ source={{
201
+ uri: Image.resolveAssetSource(theme.images.dummies.product).uri,
202
+ priority: FastImage.priority.normal,
203
+ }}
204
+ resizeMode={FastImage.resizeMode.cover}
205
+ />
206
+ )}
207
+ </LogoWrapper>
208
+
154
209
  {(isSoldOut || maxProductQuantity <= 0) && (
155
210
  <SoldOut>
156
211
  <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
@@ -160,4 +215,12 @@ export const SingleProductCard = (props: SingleProductCardParams) => {
160
215
  )}
161
216
  </CardContainer>
162
217
  );
163
- };
218
+ }, SingleProductCardPropsAreEqual);
219
+
220
+ export const SingleProductCard = (props: SingleProductCardParams) => {
221
+ const singleProductCardProps = {
222
+ ...props,
223
+ UIComponent: SinguleProductCardUI
224
+ }
225
+ return <SingleProductCardController {...singleProductCardProps} />
226
+ }
@@ -1,4 +1,4 @@
1
- import styled from 'styled-components/native'
1
+ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const CardContainer = styled.TouchableOpacity`
4
4
  flex: 1;
@@ -31,3 +31,30 @@ export const PricesContainer = styled.View`
31
31
  flex-direction: row;
32
32
  align-items: center;
33
33
  `
34
+
35
+ export const LogoWrapper = styled.View`
36
+ position: relative;
37
+ margin-left: 12px;
38
+ `
39
+
40
+ export const RibbonBox = styled.View`
41
+ position: absolute;
42
+ z-index: 1;
43
+ top: -4px;
44
+ right: -4px;
45
+ background-color: ${(props: any) => props.theme.colors.primary};
46
+ padding: 1px 8px;
47
+ max-width: 60px;
48
+
49
+ ${(props: any) => props.bgColor && css`
50
+ background-color: ${props.bgColor};
51
+ `}
52
+
53
+ ${(props: any) => props.isRoundRect && css`
54
+ border-radius: 7.6px;
55
+ `}
56
+
57
+ ${(props: any) => props.isCapsule && css`
58
+ border-radius: 50px;
59
+ `}
60
+ `
@@ -27,7 +27,8 @@ const StripeElementsFormUI = (props: any) => {
27
27
  paymethod,
28
28
  onCancel,
29
29
  cart,
30
- merchantId
30
+ merchantId,
31
+ businessIds
31
32
  } = props;
32
33
 
33
34
  const theme = useTheme();
@@ -108,7 +109,14 @@ const StripeElementsFormUI = (props: any) => {
108
109
  const { setupIntent, error } = await confirmSetupIntent(requirements, params);
109
110
 
110
111
  if (setupIntent?.status === 'Succeeded') {
111
- stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId);
112
+ if (businessIds) {
113
+ businessIds.forEach((_businessId: any, index: any) => {
114
+ const _isNewCard = index === 0
115
+ stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId, _isNewCard);
116
+ })
117
+ } else {
118
+ stripeTokenHandler(setupIntent?.paymentMethodId, user, businessId);
119
+ }
112
120
  }
113
121
 
114
122
  if (error) {
@@ -40,7 +40,7 @@ export const StripeElementsForm = (props: any) => {
40
40
  }
41
41
  }
42
42
 
43
- const stripeTokenHandler = async (tokenId: string, user: any, businessId: string) => {
43
+ const stripeTokenHandler = async (tokenId: string, user: any, businessId: string, isNewCard: any = true) => {
44
44
  try {
45
45
  setState({
46
46
  ...state,
@@ -60,7 +60,7 @@ export const StripeElementsForm = (props: any) => {
60
60
  })
61
61
  })
62
62
  const response = await result.json();
63
- props.onSelectCard && props.onSelectCard(response.result);
63
+ isNewCard && props.onSelectCard && props.onSelectCard(response.result);
64
64
  setState({
65
65
  ...state,
66
66
  loadingAdd: false
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { useLanguage } from 'ordering-components/native'
2
+ import { useLanguage, useUtils } from 'ordering-components/native'
3
3
  import { SingleProductCard } from '../SingleProductCard'
4
4
  import { TaxInformationContainer, ProductContainer } from './styles'
5
5
  import { OText } from '../shared'
@@ -13,8 +13,9 @@ interface taxInformationParams {
13
13
  fixed?: number,
14
14
  percentage?: number,
15
15
  id: number,
16
- discounts?: any
17
- } | null,
16
+ discounts?: any,
17
+ rate_type?: number
18
+ },
18
19
  products: Array<any>,
19
20
  type: string
20
21
  }
@@ -27,6 +28,7 @@ export const TaxInformation = (props: taxInformationParams) => {
27
28
  } = props
28
29
 
29
30
  const [, t] = useLanguage()
31
+ const [{ parsePrice }] = useUtils()
30
32
 
31
33
  const includedOnPriceString = data?.type === 1 ? `(${t('INCLUDED_ON_PRICE', 'Included on price')})` : `(${t('NOT_INCLUDED_ON_PRICE', 'Not included on price')})`
32
34
  const offersHideArray = ['offer_target_2', 'offer_target_3']
@@ -56,8 +58,12 @@ export const TaxInformation = (props: taxInformationParams) => {
56
58
 
57
59
  return (
58
60
  <TaxInformationContainer>
61
+ <OText size={24} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
62
+ {`${data?.name ||
63
+ t('INHERIT_FROM_BUSINESS', 'Inherit from business')} ${data?.rate_type !== 2 ? `(${typeof data?.rate === 'number' ? `${data?.rate}%` : `${parsePrice(data?.fixed ?? 0)} + ${data?.percentage}%`})` : ''} `}
64
+ </OText>
59
65
  {!!data?.description ? (
60
- <OText size={24} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
66
+ <OText size={20} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
61
67
  {t('DESCRIPTION', 'Description')}: {data?.description} {data?.type && !type?.includes('offer') && includedOnPriceString}
62
68
  </OText>
63
69
  ) : (