ordering-ui-react-native 0.16.17 → 0.16.18-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 (203) 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 +33 -4
  9. package/src/components/BusinessInformation/styles.tsx +2 -2
  10. package/src/components/BusinessProductsList/index.tsx +10 -10
  11. package/src/components/BusinessTypeFilter/index.tsx +1 -2
  12. package/src/components/BusinessesListing/index.tsx +1 -1
  13. package/src/components/Checkout/index.tsx +2 -1
  14. package/src/components/LanguageSelector/index.tsx +21 -16
  15. package/src/components/LoginForm/index.tsx +118 -30
  16. package/src/components/LoginForm/styles.tsx +6 -0
  17. package/src/components/Messages/index.tsx +2 -2
  18. package/src/components/NotificationSetting/index.tsx +85 -0
  19. package/src/components/OrderDetails/index.tsx +2 -20
  20. package/src/components/OrdersOption/index.tsx +54 -56
  21. package/src/components/PaymentOptions/index.tsx +335 -365
  22. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  23. package/src/components/ReviewDriver/index.tsx +1 -1
  24. package/src/components/ReviewOrder/index.tsx +2 -1
  25. package/src/components/ReviewProducts/index.tsx +11 -0
  26. package/src/components/SignupForm/index.tsx +143 -61
  27. package/src/components/SingleProductReview/index.tsx +8 -5
  28. package/src/components/StripeElementsForm/index.tsx +25 -16
  29. package/src/components/VerifyPhone/styles.tsx +1 -2
  30. package/src/components/shared/OBottomPopup.tsx +6 -2
  31. package/src/index.tsx +2 -0
  32. package/src/pages/BusinessesListing.tsx +7 -6
  33. package/src/pages/OrderDetails.tsx +1 -1
  34. package/src/pages/ReviewDriver.tsx +2 -2
  35. package/src/pages/ReviewOrder.tsx +2 -2
  36. package/src/theme.json +0 -1
  37. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  38. package/src/types/index.tsx +13 -9
  39. package/src/utils/index.tsx +0 -1
  40. package/themes/business/index.tsx +4 -0
  41. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  42. package/themes/business/src/components/Chat/index.tsx +42 -34
  43. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  44. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  45. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  46. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  47. package/themes/business/src/components/MapView/index.tsx +12 -1
  48. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  49. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  50. package/themes/business/src/components/OrderDetails/Delivery.tsx +3 -3
  51. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  52. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  53. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  54. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  55. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  56. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  57. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  58. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  59. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  60. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  61. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  62. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  63. package/themes/business/src/components/PreviousOrders/index.tsx +21 -23
  64. package/themes/business/src/components/ProductItemAccordion/index.tsx +5 -4
  65. package/themes/business/src/components/ReviewCustomer/index.tsx +1 -1
  66. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  67. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  68. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  69. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  70. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  71. package/themes/business/src/components/shared/OModal.tsx +40 -37
  72. package/themes/business/src/types/index.tsx +15 -9
  73. package/themes/business/src/utils/index.tsx +10 -0
  74. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  75. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  76. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  77. package/themes/kiosk/src/components/BusinessMenu/index.tsx +2 -1
  78. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  79. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +1 -0
  80. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  81. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  82. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  83. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  84. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  85. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  86. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  87. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  88. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  89. package/themes/kiosk/src/types/index.d.ts +2 -0
  90. package/themes/original/index.tsx +12 -0
  91. package/themes/original/src/components/AddressForm/index.tsx +136 -133
  92. package/themes/original/src/components/AddressList/index.tsx +1 -1
  93. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  94. package/themes/original/src/components/BusinessBasicInformation/index.tsx +302 -160
  95. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  96. package/themes/original/src/components/BusinessController/index.tsx +173 -108
  97. package/themes/original/src/components/BusinessItemAccordion/index.tsx +9 -7
  98. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +4 -0
  99. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  100. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  101. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  102. package/themes/original/src/components/BusinessListingSearch/index.tsx +106 -126
  103. package/themes/original/src/components/BusinessListingSearch/styles.tsx +18 -13
  104. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  105. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  106. package/themes/original/src/components/BusinessProductsList/index.tsx +49 -52
  107. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  108. package/themes/original/src/components/BusinessProductsListing/index.tsx +278 -175
  109. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -8
  110. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  111. package/themes/original/src/components/BusinessTypeFilter/index.tsx +109 -40
  112. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  113. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +561 -0
  114. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -2
  115. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +676 -0
  116. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  117. package/themes/original/src/components/BusinessesListing/index.tsx +103 -495
  118. package/themes/original/src/components/Cart/index.tsx +42 -10
  119. package/themes/original/src/components/Cart/styles.tsx +4 -0
  120. package/themes/original/src/components/CartContent/index.tsx +22 -16
  121. package/themes/original/src/components/Checkout/index.tsx +106 -66
  122. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  123. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  124. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  125. package/themes/original/src/components/Favorite/index.tsx +1 -0
  126. package/themes/original/src/components/Favorite/styles.tsx +1 -0
  127. package/themes/original/src/components/FavoriteList/index.tsx +142 -93
  128. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  129. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  130. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +8 -3
  131. package/themes/original/src/components/HelpGuide/index.tsx +8 -3
  132. package/themes/original/src/components/HelpOrder/index.tsx +8 -3
  133. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  134. package/themes/original/src/components/LoginForm/Otp/index.tsx +3 -2
  135. package/themes/original/src/components/LoginForm/index.tsx +79 -42
  136. package/themes/original/src/components/Messages/index.tsx +17 -17
  137. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  138. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  139. package/themes/original/src/components/MultiCheckout/index.tsx +13 -1
  140. package/themes/original/src/components/MultiOrdersDetails/index.tsx +21 -17
  141. package/themes/original/src/components/MyOrders/index.tsx +68 -6
  142. package/themes/original/src/components/NavBar/index.tsx +11 -5
  143. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  144. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  145. package/themes/original/src/components/Notifications/index.tsx +148 -0
  146. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  147. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  148. package/themes/original/src/components/OrderDetails/index.tsx +200 -42
  149. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  150. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  151. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  152. package/themes/original/src/components/OrderProgress/index.tsx +8 -2
  153. package/themes/original/src/components/OrderSummary/index.tsx +1 -34
  154. package/themes/original/src/components/OrderTypeSelector/index.tsx +84 -36
  155. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  156. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +100 -106
  157. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +17 -12
  158. package/themes/original/src/components/OrdersOption/index.tsx +38 -23
  159. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  160. package/themes/original/src/components/PaymentOptions/index.tsx +57 -37
  161. package/themes/original/src/components/PhoneInputNumber/index.tsx +4 -10
  162. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  163. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  164. package/themes/original/src/components/ProductForm/index.tsx +712 -655
  165. package/themes/original/src/components/ProductForm/styles.tsx +9 -7
  166. package/themes/original/src/components/ProductItemAccordion/index.tsx +170 -128
  167. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  168. package/themes/original/src/components/ProfessionalFilter/index.tsx +129 -0
  169. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  170. package/themes/original/src/components/ProfessionalProfile/index.tsx +309 -0
  171. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  172. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  173. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  174. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  175. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  176. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  177. package/themes/original/src/components/SearchBar/index.tsx +10 -5
  178. package/themes/original/src/components/ServiceForm/index.tsx +631 -0
  179. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  180. package/themes/original/src/components/SignupForm/index.tsx +301 -158
  181. package/themes/original/src/components/SingleOrderCard/index.tsx +213 -179
  182. package/themes/original/src/components/SingleProductCard/index.tsx +194 -108
  183. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -2
  184. package/themes/original/src/components/SingleProductReview/index.tsx +30 -3
  185. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  186. package/themes/original/src/components/StripeElementsForm/index.tsx +15 -7
  187. package/themes/original/src/components/UpsellingProducts/index.tsx +14 -4
  188. package/themes/original/src/components/UserDetails/index.tsx +31 -17
  189. package/themes/original/src/components/UserFormDetails/index.tsx +74 -81
  190. package/themes/original/src/components/UserProfile/index.tsx +57 -29
  191. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  192. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  193. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  194. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  195. package/themes/original/src/components/Wallets/index.tsx +174 -162
  196. package/themes/original/src/components/Wallets/styles.tsx +10 -8
  197. package/themes/original/src/components/shared/OBottomPopup.tsx +47 -14
  198. package/themes/original/src/components/shared/OButton.tsx +10 -3
  199. package/themes/original/src/components/shared/OInput.tsx +3 -2
  200. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  201. package/themes/original/src/types/index.tsx +123 -30
  202. package/themes/original/src/utils/index.tsx +77 -0
  203. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,28 +1,33 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import {
3
3
  useLanguage,
4
4
  useConfig,
5
5
  useOrder,
6
6
  useUtils,
7
+ useSession,
8
+ ToastType,
9
+ useToast,
7
10
  SingleProductCard as SingleProductCardController
8
11
  } from 'ordering-components/native';
9
12
  import { useTheme } from 'styled-components/native';
10
13
  import { SingleProductCardParams } from '../../types';
11
14
  import { CardContainer, CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper } from './styles';
12
- import { StyleSheet, View, TouchableOpacity } from 'react-native';
13
- import { OText, OIcon } from '../shared';
15
+ import { StyleSheet, View, TouchableOpacity, Image, Animated } from 'react-native';
16
+ import { InView } from 'react-native-intersection-observer'
17
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
18
+ import { OButton, OIcon, OText } from '../shared';
14
19
  import FastImage from 'react-native-fast-image'
15
20
  import IconAntDesign from 'react-native-vector-icons/AntDesign'
16
21
  import { shape } from '../../utils';
17
22
 
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
+ function SingleProductCardPropsAreEqual(prevProps: any, nextProps: any) {
24
+ return JSON.stringify(prevProps.product) === JSON.stringify(nextProps.product) &&
25
+ prevProps.isSoldOut === nextProps.isSoldOut &&
26
+ prevProps.productAddedToCartLength === nextProps.productAddedToCartLength &&
27
+ prevProps.categoryState === nextProps.categoryState
23
28
  }
24
29
 
25
- const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
30
+ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
26
31
  const {
27
32
  product,
28
33
  isSoldOut,
@@ -30,17 +35,22 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
30
35
  productAddedToCartLength,
31
36
  style,
32
37
  handleFavoriteProduct,
33
- handleUpdateProducts
38
+ enableIntersection,
39
+ navigation,
40
+ businessId,
41
+ isPreviously
34
42
  } = props;
35
43
 
36
44
  const theme = useTheme();
45
+ const hideAddButton = theme?.business_view?.components?.products?.components?.add_to_cart_button?.hidden ?? true
37
46
 
38
47
  const styles = StyleSheet.create({
39
48
  container: {
40
49
  borderWidth: 1,
41
50
  borderRadius: 7.6,
42
51
  borderColor: theme.colors.border,
43
- marginBottom: 28,
52
+ marginBottom: 25,
53
+ minHeight: hideAddButton ? 100 : 165
44
54
  },
45
55
  titleWrapper: {
46
56
  flexDirection: 'row',
@@ -66,8 +76,8 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
66
76
  },
67
77
  quantityContainer: {
68
78
  position: 'absolute',
69
- left: '100%',
70
- bottom: '100%',
79
+ right: 0,
80
+ top: 0,
71
81
  width: 25,
72
82
  height: 25,
73
83
  textAlign: 'center',
@@ -83,11 +93,13 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
83
93
  }
84
94
  });
85
95
 
86
-
87
96
  const [, t] = useLanguage();
88
97
  const [stateConfig] = useConfig();
89
- const [{ parsePrice, optimizeImage }] = useUtils();
90
- const [orderState] = useOrder();
98
+ const [{ auth }] = useSession()
99
+ const [{ parsePrice, optimizeImage, parseDate }] = useUtils();
100
+ const [orderState] = useOrder()
101
+ const [, { showToast }] = useToast()
102
+ const [isIntersectionObserver, setIsIntersectionObserver] = useState(!enableIntersection)
91
103
 
92
104
  const editMode = typeof product?.code !== 'undefined';
93
105
 
@@ -114,110 +126,184 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
114
126
  );
115
127
 
116
128
  const handleChangeFavorite = () => {
117
- handleFavoriteProduct && handleFavoriteProduct(!product?.favorite)
129
+ if (auth) {
130
+ handleFavoriteProduct && handleFavoriteProduct(!product?.favorite)
131
+ } else {
132
+ navigation && navigation.navigate('Login');
133
+ }
134
+ }
135
+
136
+ const handleChangeIntersection = () => {
137
+ if (enableIntersection) {
138
+ setIsIntersectionObserver(true);
139
+ }
140
+ }
141
+
142
+ const handleClickproduct = () => {
143
+ if (productAddedToCartLength && product?.maximum_per_order && productAddedToCartLength >= product?.maximum_per_order) {
144
+ showToast(ToastType.Error, t('PRODUCT_ON_MAXIMUM_ORDER', 'The product is on maximum order'))
145
+ return
146
+ }
147
+ onProductClick?.(product)
118
148
  }
119
149
 
120
150
  return (
121
- <CardContainer
122
- style={[
123
- styles.container,
124
- (isSoldOut || maxProductQuantity <= 0) && styles.soldOutBackgroundStyle,
125
- (style && { ...style }),
126
- ]}
127
- onPress={() => onProductClick?.(product)}>
128
- {productAddedToCartLength > 0 && (
129
- <QuantityContainer style={[styles.quantityContainer, {
130
- transform: [{ translateX: 10 }, { translateY: -10 }],
131
- }]}>
132
- <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
133
- </QuantityContainer>
134
- )}
135
- <CardInfo>
136
- <View style={styles.titleWrapper}>
137
- <OText
138
- size={12}
139
- weight={'500'}
140
- numberOfLines={1}
141
- ellipsizeMode="tail"
142
- style={styles.line18}>
143
- {product?.name}
144
- </OText>
145
- <TouchableOpacity
146
- onPress={handleChangeFavorite}
147
- >
148
- <IconAntDesign
149
- name={product?.favorite ? 'heart' : 'hearto'}
150
- color={theme.colors.danger5}
151
- size={18}
151
+ <InView style={{ minHeight: hideAddButton ? 125 : 190 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeIntersection()}>
152
+ {isIntersectionObserver ? (
153
+ <CardContainer
154
+ showAddButton={!hideAddButton}
155
+ style={[
156
+ styles.container,
157
+ (isSoldOut || maxProductQuantity <= 0) && styles.soldOutBackgroundStyle,
158
+ (style && { ...style }),
159
+ ]}
160
+ onPress={() => handleClickproduct()}
161
+ >
162
+ <View style={{ flexDirection: 'row' }}>
163
+ {productAddedToCartLength > 0 && (
164
+ <QuantityContainer style={[styles.quantityContainer, {
165
+ transform: [{ translateX: 25 }, { translateY: hideAddButton ? -25 : -55 }],
166
+ }]}>
167
+ <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
168
+ </QuantityContainer>
169
+ )}
170
+ <CardInfo>
171
+ <View style={styles.titleWrapper}>
172
+ <OText
173
+ size={12}
174
+ weight={'500'}
175
+ numberOfLines={1}
176
+ ellipsizeMode="tail"
177
+ style={{ ...styles.line18, flex: 1 }}>
178
+ {product?.name}
179
+ </OText>
180
+ {!isPreviously && (
181
+ <TouchableOpacity
182
+ onPress={handleChangeFavorite}
183
+ >
184
+ <IconAntDesign
185
+ name={product?.favorite ? 'heart' : 'hearto'}
186
+ color={theme.colors.danger5}
187
+ size={18}
188
+ />
189
+ </TouchableOpacity>
190
+ )}
191
+ </View>
192
+ <PricesContainer>
193
+ {!!product?.price && (
194
+ <OText color={theme.colors.primary}>{parsePrice(product?.price)}</OText>
195
+ )}
196
+ {product?.offer_price !== null && !!product?.in_offer && (
197
+ <OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
198
+ )}
199
+ </PricesContainer>
200
+ <OText
201
+ size={10}
202
+ numberOfLines={!isPreviously ? 2 : 1}
203
+ ellipsizeMode="tail"
204
+ color={theme.colors.textSecondary}
205
+ style={styles.line15}>
206
+ {product?.description}
207
+ </OText>
208
+ {isPreviously && (
209
+ <OText
210
+ size={10}
211
+ numberOfLines={1}
212
+ ellipsizeMode="tail"
213
+ color={theme.colors.primary}
214
+ style={styles.line15}>
215
+ {t('LAST_ORDERED_ON', 'Last ordered on')} {parseDate(product?.last_ordered_date, { outputFormat: 'MMM DD, YYYY' })}
216
+ </OText>
217
+ )}
218
+ </CardInfo>
219
+ <LogoWrapper>
220
+ {!!product?.ribbon?.enabled && (
221
+ <RibbonBox
222
+ bgColor={product?.ribbon?.color}
223
+ isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
224
+ isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
225
+ >
226
+ <OText
227
+ size={10}
228
+ weight={'400'}
229
+ color={theme.colors.white}
230
+ numberOfLines={2}
231
+ ellipsizeMode='tail'
232
+ lineHeight={13}
233
+ >
234
+ {product?.ribbon?.text}
235
+ </OText>
236
+ </RibbonBox>
237
+ )}
238
+ {product?.images ? (
239
+ <FastImage
240
+ style={styles.productStyle}
241
+ source={{
242
+ uri: optimizeImage(product?.images, 'h_250,c_limit'),
243
+ priority: FastImage.priority.normal,
244
+ }}
245
+ resizeMode={FastImage.resizeMode.cover}
246
+ />
247
+ ) : (
248
+ <OIcon
249
+ src={theme?.images?.dummies?.product}
250
+ style={styles.productStyle}
251
+ />
252
+ )}
253
+ </LogoWrapper>
254
+
255
+ {(isSoldOut || maxProductQuantity <= 0) && (
256
+ <SoldOut>
257
+ <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
258
+ {t('SOLD_OUT', 'SOLD OUT')}
259
+ </OText>
260
+ </SoldOut>
261
+ )}
262
+ </View>
263
+ {!hideAddButton && (
264
+ <OButton
265
+ onClick={() => handleClickproduct()}
266
+ style={{
267
+ width: '100%',
268
+ borderRadius: 7.6,
269
+ marginTop: 10,
270
+
271
+ }}
272
+ bgColor={isSoldOut ? '#B8B8B8' : theme?.colors?.white}
273
+ borderColor={theme?.colors.primary}
274
+ textStyle={{ color: theme.colors.primary }}
275
+ text={t('ADD', 'Add')}
152
276
  />
153
- </TouchableOpacity>
154
- </View>
155
- <PricesContainer>
156
- <OText color={theme.colors.primary}>{product?.price ? parsePrice(product?.price) : ''}</OText>
157
- {product?.offer_price !== null && product?.in_offer && (
158
- <OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
159
277
  )}
160
- </PricesContainer>
161
- <OText
162
- size={10}
163
- numberOfLines={2}
164
- ellipsizeMode="tail"
165
- color={theme.colors.textSecondary}
166
- style={styles.line15}>
167
- {product?.description}
168
- </OText>
169
- </CardInfo>
170
- <LogoWrapper>
171
- {product?.ribbon?.enabled && (
172
- <RibbonBox
173
- bgColor={product?.ribbon?.color}
174
- isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
175
- isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
176
- >
177
- <OText
178
- size={10}
179
- weight={'400'}
180
- color={theme.colors.white}
181
- numberOfLines={2}
182
- ellipsizeMode='tail'
183
- lineHeight={13}
184
- >
185
- {product?.ribbon?.text}
186
- </OText>
187
- </RibbonBox>
188
- )}
189
- {product?.images ? (
190
- <FastImage
191
- style={styles.productStyle}
192
- source={{
193
- uri: optimizeImage(product?.images, 'h_250,c_limit'),
194
- priority: FastImage.priority.normal,
195
- }}
196
- resizeMode={FastImage.resizeMode.cover}
197
- />
198
- ) : (
199
- <OIcon
200
- src={theme?.images?.dummies?.product}
201
- style={styles.productStyle}
202
- />
203
- )}
204
- </LogoWrapper>
205
-
206
- {(isSoldOut || maxProductQuantity <= 0) && (
207
- <SoldOut>
208
- <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
209
- {t('SOLD_OUT', 'SOLD OUT')}
210
- </OText>
211
- </SoldOut>
278
+ </CardContainer>
279
+ ) : (
280
+ <View style={{ marginBottom: 28, padding: 12, height: hideAddButton ? 125 : 165 }}>
281
+ <Placeholder style={{ padding: 5 }} Animation={Fade}>
282
+ <View style={{ flexDirection: 'row' }}>
283
+ <Placeholder style={{ paddingVertical: 10, flex: 1 }}>
284
+ <PlaceholderLine width={60} style={{ marginBottom: 15 }} />
285
+ <PlaceholderLine width={20} />
286
+ </Placeholder>
287
+ <PlaceholderLine
288
+ width={24}
289
+ height={70}
290
+ style={{ marginLeft: 10, marginBottom: 10 }}
291
+ />
292
+ </View>
293
+ <PlaceholderLine
294
+ height={52}
295
+ />
296
+ </Placeholder>
297
+ </View>
212
298
  )}
213
- </CardContainer>
299
+ </InView>
214
300
  );
215
301
  }, SingleProductCardPropsAreEqual);
216
302
 
217
303
  export const SingleProductCard = (props: SingleProductCardParams) => {
218
304
  const singleProductCardProps = {
219
305
  ...props,
220
- UIComponent: SinguleProductCardUI
306
+ UIComponent: SingleProductCardUI
221
307
  }
222
308
  return <SingleProductCardController {...singleProductCardProps} />
223
309
  }
@@ -2,7 +2,7 @@ import styled, { css } from 'styled-components/native'
2
2
 
3
3
  export const CardContainer = styled.TouchableOpacity`
4
4
  flex: 1;
5
- flex-direction: row;
5
+ flex-direction: ${(props : any) => props.showAddButton ? 'column' : 'row'};
6
6
  justify-content: space-between;
7
7
  align-items: center;
8
8
  padding: 12px;
@@ -23,7 +23,7 @@ export const SoldOut = styled.View`
23
23
  `
24
24
 
25
25
  export const QuantityContainer = styled.View`
26
- background: ${({ theme } : any) => theme.colors.primary};
26
+ background: ${({ theme }: any) => theme.colors.primary};
27
27
  align-items: center;
28
28
  justify-content: center;
29
29
  `
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useEffect } from 'react'
2
- import { useLanguage } from 'ordering-components/native'
3
- import { OText, OButton, OInput } from '../shared'
2
+ import { useLanguage, useUtils } from 'ordering-components/native'
3
+ import { OText, OButton, OInput, OIcon } from '../shared'
4
4
  import { StyleSheet, TouchableOpacity, View } from 'react-native'
5
5
  import AntDesignIcons from 'react-native-vector-icons/AntDesign'
6
6
  import { useTheme } from 'styled-components/native'
@@ -14,7 +14,9 @@ import {
14
14
  LikeHandsActionContainer,
15
15
  LikeHandsButton,
16
16
  CommentsButtonGroup,
17
+ LogoWrapper,
17
18
  } from './styles'
19
+ import FastImage from 'react-native-fast-image'
18
20
 
19
21
  export const SingleProductReview = (props: SingleProductReviewParams) => {
20
22
  const {
@@ -25,6 +27,7 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
25
27
 
26
28
  const [, t] = useLanguage()
27
29
  const theme = useTheme()
30
+ const [{ optimizeImage }] = useUtils()
28
31
 
29
32
  const styles = StyleSheet.create({
30
33
  inputTextArea: {
@@ -40,6 +43,12 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
40
43
  justifyContent: 'center',
41
44
  marginVertical: 10,
42
45
  },
46
+ productStyle: {
47
+ width: 80,
48
+ height: 80,
49
+ marginLeft: 'auto',
50
+ marginRight: 'auto'
51
+ }
43
52
  })
44
53
 
45
54
  const [comments, setComments] = useState<Array<any>>([])
@@ -100,6 +109,24 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
100
109
  return (
101
110
  <>
102
111
  <ProductContainer>
112
+ <LogoWrapper>
113
+ {product?.images ? (
114
+ <FastImage
115
+ style={styles.productStyle}
116
+ source={{
117
+ uri: optimizeImage(product?.images, 'h_250,c_limit'),
118
+ priority: FastImage.priority.normal,
119
+ }}
120
+ resizeMode={FastImage.resizeMode.cover}
121
+ />
122
+ ) : (
123
+ <OIcon
124
+ src={theme?.images?.dummies?.product}
125
+ width={80}
126
+ height={80}
127
+ />
128
+ )}
129
+ </LogoWrapper>
103
130
  <ProductHeader>
104
131
  <OText numberOfLines={1} style={{ flex: 1 }} color={theme.colors.textNormal}>{product?.name}</OText>
105
132
  <LikeHandsActionContainer>
@@ -129,7 +156,7 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
129
156
  style={{ height: 35, paddingLeft: 5, paddingRight: 5, marginHorizontal: 3, marginVertical: 10 }}
130
157
  imgRightSrc={isSelectedComment(commentItem.key) ? theme.images.general.close : null}
131
158
  imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}
132
- onClick={() => handleChangeComment(commentItem) }
159
+ onClick={() => handleChangeComment(commentItem)}
133
160
  />
134
161
  ))}
135
162
  </CommentsButtonGroup>
@@ -15,6 +15,18 @@ export const LikeHandsActionContainer = styled.View`
15
15
  flex-direction: row;
16
16
  `
17
17
 
18
+ export const LogoWrapper = styled.View`
19
+ shadowRadius: 3;
20
+ shadowOffset: { width: 1, height: 4 };
21
+ elevation: 3;
22
+ borderRadius: 8;
23
+ shadowOpacity: 0.1;
24
+ overflow: hidden;
25
+ width: 80;
26
+ marginLeft: auto;
27
+ marginRight: auto;
28
+ `
29
+
18
30
  export const LikeHandsButton = styled.TouchableOpacity`
19
31
  ${(props: any) => props.isLike && css`
20
32
  margin-horizontal: 15px;
@@ -61,17 +61,25 @@ const StripeElementsFormUI = (props: any) => {
61
61
  }
62
62
 
63
63
  if (user?.address) {
64
- billingDetails.addressLine1 = user?.address
64
+ billingDetails.address = {
65
+ line1: user?.address
66
+ }
65
67
  }
66
68
 
67
69
  const createPayMethod = async () => {
68
- const params: any = { type: 'Card' }
70
+ const params: any = { paymentMethodType: 'Card', paymentMethodData: {} }
69
71
  if (Object.keys(billingDetails).length > 0) {
70
- params.billingDetails = billingDetails
72
+ params.paymentMethodData.billingDetails = {...billingDetails, token: card?.last4}
71
73
  }
72
74
  try {
73
75
  setCreatePmLoading(true)
74
- const { paymentMethod } = await createPaymentMethod(params);
76
+ const { paymentMethod, error } = await createPaymentMethod(params);
77
+
78
+ if (error) {
79
+ setErrors(error?.message);
80
+ setCreatePmLoading(false)
81
+ return
82
+ }
75
83
 
76
84
  setCreatePmLoading(false)
77
85
  handleSource && handleSource({
@@ -94,16 +102,16 @@ const StripeElementsFormUI = (props: any) => {
94
102
  setErrors(error?.message || error?.toString());
95
103
  }
96
104
  }
97
-
105
+
98
106
  const handleSaveCard = async () => {
99
107
  setErrors('');
100
108
  if (!requirements) {
101
109
  createPayMethod();
102
110
  return
103
111
  }
104
- const params: any = { type: 'Card' }
112
+ const params: any = { paymentMethodType: 'Card', paymentMethodData: {} }
105
113
  if (Object.keys(billingDetails).length > 0) {
106
- params.billingDetails = billingDetails
114
+ params.paymentMethodData.billingDetails = {...billingDetails, token: card?.last4}
107
115
  }
108
116
  try {
109
117
  const { setupIntent, error } = await confirmSetupIntent(requirements, params);
@@ -1,5 +1,5 @@
1
1
  import React, { useState, useEffect } from 'react'
2
- import { Platform, StyleSheet, View } from 'react-native'
2
+ import { Platform, StyleSheet, TouchableOpacity, View } from 'react-native'
3
3
  import {
4
4
  UpsellingPage as UpsellingPageController,
5
5
  useUtils,
@@ -21,6 +21,7 @@ import {
21
21
  import { OrderSummary } from '../OrderSummary';
22
22
  import { ScrollView } from 'react-native-gesture-handler';
23
23
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
24
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
24
25
 
25
26
  const UpsellingProductsUI = (props: UpsellingProductsParams) => {
26
27
  const {
@@ -71,9 +72,15 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
71
72
  },
72
73
  btnBackArrow: {
73
74
  borderWidth: 0,
75
+ width: 26,
76
+ height: 26,
74
77
  backgroundColor: theme.colors.clear,
78
+ borderColor: theme.colors.clear,
75
79
  shadowColor: theme.colors.clear,
76
- padding: 40,
80
+ paddingLeft: 0,
81
+ paddingRight: 0,
82
+ marginLeft: 20,
83
+ marginBottom: 10
77
84
  },
78
85
  })
79
86
 
@@ -161,11 +168,14 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
161
168
  <>
162
169
  <View style={{ ...styles.headerItem, flex: 1, marginTop: Platform.OS == 'ios' ? 35 : 70 }}>
163
170
  <OButton
164
- imgLeftSrc={theme.images.general.arrow_left}
165
171
  imgRightSrc={null}
166
172
  style={styles.btnBackArrow}
167
173
  onClick={() => onGoBack()}
168
- imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 16 }}
174
+ icon={AntDesignIcon}
175
+ iconProps={{
176
+ name: 'arrowleft',
177
+ size: 26
178
+ }}
169
179
  />
170
180
  </View>
171
181
  <ScrollView style={{ marginTop: 10, marginBottom: props.isPage ? 40 : bottom + (Platform.OS == 'ios' ? 96 : 130) }} showsVerticalScrollIndicator={false}>