ordering-ui-react-native 0.16.53 → 0.16.54-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 (208) hide show
  1. package/package.json +6 -5
  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/BusinessInformation/index.tsx +33 -4
  6. package/src/components/BusinessInformation/styles.tsx +2 -2
  7. package/src/components/BusinessProductsList/index.tsx +10 -10
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +2 -1
  10. package/src/components/LanguageSelector/index.tsx +21 -16
  11. package/src/components/Messages/index.tsx +2 -2
  12. package/src/components/NotificationSetting/index.tsx +85 -0
  13. package/src/components/OrdersOption/index.tsx +54 -56
  14. package/src/components/PaymentOptions/index.tsx +298 -345
  15. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  16. package/src/components/SingleProductReview/index.tsx +7 -4
  17. package/src/components/StripeElementsForm/index.tsx +25 -16
  18. package/src/components/VerifyPhone/styles.tsx +1 -2
  19. package/src/components/shared/OBottomPopup.tsx +6 -2
  20. package/src/components/shared/OToast.tsx +4 -4
  21. package/src/index.tsx +2 -0
  22. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  23. package/src/utils/index.tsx +2 -1
  24. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +260 -238
  25. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  26. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  27. package/themes/business/src/components/Chat/index.tsx +40 -32
  28. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  29. package/themes/business/src/components/DriverSchedule/index.tsx +36 -19
  30. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  31. package/themes/business/src/components/MapView/index.tsx +12 -1
  32. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  33. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -41
  34. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +40 -30
  35. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +3 -3
  36. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  37. package/themes/business/src/components/OrdersOption/index.tsx +76 -77
  38. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  39. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  40. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  41. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  42. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  43. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  44. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  45. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  46. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  47. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  48. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  49. package/themes/business/src/components/PreviousOrders/index.tsx +440 -245
  50. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  51. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  52. package/themes/business/src/components/ReviewCustomer/index.tsx +39 -15
  53. package/themes/business/src/components/ScheduleBlocked/index.tsx +2 -2
  54. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  55. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  56. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  57. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  58. package/themes/business/src/components/shared/OLink.tsx +24 -12
  59. package/themes/business/src/components/shared/OText.tsx +3 -2
  60. package/themes/business/src/types/index.tsx +25 -11
  61. package/themes/business/src/utils/index.tsx +10 -0
  62. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  63. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  64. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  65. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  66. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  67. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  68. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  69. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  70. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  71. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  72. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  73. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  74. package/themes/kiosk/src/types/index.d.ts +2 -0
  75. package/themes/original/index.tsx +8 -6
  76. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  77. package/themes/original/src/components/AddressForm/index.tsx +157 -140
  78. package/themes/original/src/components/AddressList/index.tsx +1 -1
  79. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  80. package/themes/original/src/components/BusinessBasicInformation/index.tsx +53 -37
  81. package/themes/original/src/components/BusinessController/index.tsx +193 -91
  82. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  83. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  84. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  85. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  86. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  87. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  88. package/themes/original/src/components/BusinessListingSearch/index.tsx +85 -137
  89. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  90. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  91. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  92. package/themes/original/src/components/BusinessProductsList/index.tsx +59 -61
  93. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  94. package/themes/original/src/components/BusinessProductsListing/index.tsx +156 -86
  95. package/themes/original/src/components/BusinessProductsListing/styles.tsx +14 -12
  96. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  97. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +28 -29
  98. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +118 -111
  99. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  100. package/themes/original/src/components/BusinessesListing/index.tsx +51 -71
  101. package/themes/original/src/components/Cart/index.tsx +82 -15
  102. package/themes/original/src/components/Cart/styles.tsx +4 -0
  103. package/themes/original/src/components/CartContent/index.tsx +27 -17
  104. package/themes/original/src/components/CartContent/styles.tsx +1 -1
  105. package/themes/original/src/components/Checkout/index.tsx +115 -118
  106. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  107. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  108. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  109. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  110. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  111. package/themes/original/src/components/FavoriteList/index.tsx +69 -45
  112. package/themes/original/src/components/FloatingButton/index.tsx +13 -11
  113. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  114. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  115. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  116. package/themes/original/src/components/GoogleMap/index.tsx +10 -1
  117. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +25 -10
  118. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +4 -0
  119. package/themes/original/src/components/HelpGuide/index.tsx +9 -8
  120. package/themes/original/src/components/HelpOrder/index.tsx +9 -8
  121. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  123. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  124. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  125. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  126. package/themes/original/src/components/Messages/index.tsx +35 -20
  127. package/themes/original/src/components/MomentOption/index.tsx +8 -6
  128. package/themes/original/src/components/MultiCart/index.tsx +63 -0
  129. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  130. package/themes/original/src/components/MultiCheckout/index.tsx +10 -2
  131. package/themes/original/src/components/MultiOrdersDetails/index.tsx +34 -16
  132. package/themes/original/src/components/MyOrders/index.tsx +88 -24
  133. package/themes/original/src/components/NavBar/index.tsx +11 -5
  134. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  135. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  136. package/themes/original/src/components/Notifications/index.tsx +148 -0
  137. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  138. package/themes/original/src/components/OrderDetails/index.tsx +162 -50
  139. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  140. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  141. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  142. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  143. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  144. package/themes/original/src/components/OrderSummary/index.tsx +2 -35
  145. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  146. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  147. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +94 -98
  148. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  149. package/themes/original/src/components/OrdersOption/index.tsx +93 -53
  150. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  151. package/themes/original/src/components/PaymentOptions/index.tsx +1 -2
  152. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  153. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  154. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  155. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  156. package/themes/original/src/components/ProductForm/index.tsx +367 -384
  157. package/themes/original/src/components/ProductForm/styles.tsx +7 -12
  158. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  159. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  160. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  161. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  162. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  163. package/themes/original/src/components/ProfessionalProfile/index.tsx +19 -8
  164. package/themes/original/src/components/Promotions/index.tsx +232 -219
  165. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  166. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  167. package/themes/original/src/components/ReviewOrder/index.tsx +120 -108
  168. package/themes/original/src/components/ReviewOrder/styles.tsx +5 -7
  169. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  170. package/themes/original/src/components/ReviewTrigger/index.tsx +136 -0
  171. package/themes/original/src/components/{Reviews/ReviewOrder → ReviewTrigger}/styles.tsx +10 -22
  172. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  173. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  174. package/themes/original/src/components/ServiceForm/index.tsx +330 -266
  175. package/themes/original/src/components/SignupForm/index.tsx +134 -89
  176. package/themes/original/src/components/SingleOrderCard/index.tsx +219 -129
  177. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  178. package/themes/original/src/components/SingleProductCard/index.tsx +194 -128
  179. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -9
  180. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  181. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  182. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  183. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  184. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  185. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  186. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  187. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  188. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  189. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  190. package/themes/original/src/components/Wallets/index.tsx +176 -164
  191. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  192. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  193. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  194. package/themes/original/src/components/shared/OBottomPopup.tsx +36 -22
  195. package/themes/original/src/components/shared/OButton.tsx +8 -3
  196. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  197. package/themes/original/src/components/shared/OInput.tsx +10 -1
  198. package/themes/original/src/layouts/Container.tsx +13 -9
  199. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  200. package/themes/original/src/types/index.tsx +65 -13
  201. package/themes/original/src/utils/index.tsx +103 -58
  202. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  203. package/themes/original/src/components/Reviews/ReviewDriver/index.tsx +0 -301
  204. package/themes/original/src/components/Reviews/ReviewDriver/styles.tsx +0 -39
  205. package/themes/original/src/components/Reviews/ReviewOrder/index.tsx +0 -326
  206. package/themes/original/src/components/Reviews/ReviewProducts/index.tsx +0 -101
  207. package/themes/original/src/components/Reviews/ReviewProducts/styles.tsx +0 -17
  208. package/themes/original/src/components/Reviews/index.tsx +0 -9
@@ -1,19 +1,25 @@
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
- import { CardContainer, CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper } from './styles';
12
- import { StyleSheet, View, TouchableOpacity, Image } from 'react-native';
13
- import { OButton, OText } from '../shared';
14
+ import { CardInfo, SoldOut, QuantityContainer, PricesContainer, RibbonBox, LogoWrapper } from './styles';
15
+ import { StyleSheet, View } 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
- import IconAntDesign from 'react-native-vector-icons/AntDesign'
16
20
  import { shape } from '../../utils';
21
+ import { LottieAnimation } from '../LottieAnimation';
22
+ import { CardAnimation } from '../shared/CardAnimation'
17
23
 
18
24
  function SingleProductCardPropsAreEqual(prevProps: any, nextProps: any) {
19
25
  return JSON.stringify(prevProps.product) === JSON.stringify(nextProps.product) &&
@@ -22,25 +28,39 @@ function SingleProductCardPropsAreEqual(prevProps: any, nextProps: any) {
22
28
  prevProps.categoryState === nextProps.categoryState
23
29
  }
24
30
 
25
- const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
31
+ const SingleProductCardUI = React.memo((props: SingleProductCardParams) => {
26
32
  const {
27
33
  product,
28
34
  isSoldOut,
29
35
  onProductClick,
30
36
  productAddedToCartLength,
31
37
  style,
32
- handleFavoriteProduct
38
+ handleFavoriteProduct,
39
+ enableIntersection,
40
+ navigation,
41
+ businessId,
42
+ isPreviously
33
43
  } = props;
34
44
 
35
45
  const theme = useTheme();
36
- const showAddButton = !theme?.layouts?.business_view?.components?.products?.components?.add_to_cart_button?.hidden
46
+ const hideAddButton = theme?.business_view?.components?.products?.components?.add_to_cart_button?.hidden ?? true
47
+ const isChewLayout = theme?.header?.components?.layout?.type === 'chew'
48
+
49
+ const textSize = isChewLayout ? 12 : 10
37
50
 
38
51
  const styles = StyleSheet.create({
39
52
  container: {
40
53
  borderWidth: 1,
41
- borderRadius: 7.6,
42
54
  borderColor: theme.colors.border,
43
- marginBottom: 28,
55
+ marginBottom: 25,
56
+ minHeight: hideAddButton ? 100 : 165,
57
+ flex: 1,
58
+ flexDirection: hideAddButton ? 'row' : 'column',
59
+ justifyContent: 'space-between',
60
+ alignItems: 'center',
61
+ padding: 12,
62
+ borderRadius: 10,
63
+ position: 'relative'
44
64
  },
45
65
  titleWrapper: {
46
66
  flexDirection: 'row',
@@ -60,14 +80,14 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
60
80
  textTransform: 'uppercase',
61
81
  },
62
82
  productStyle: {
63
- width: 75,
64
- height: 75,
83
+ width: 85,
84
+ height: 85,
65
85
  borderRadius: 7.6
66
86
  },
67
87
  quantityContainer: {
68
88
  position: 'absolute',
69
- left: '100%',
70
- bottom: '100%',
89
+ right: 0,
90
+ top: 0,
71
91
  width: 25,
72
92
  height: 25,
73
93
  textAlign: 'center',
@@ -83,11 +103,13 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
83
103
  }
84
104
  });
85
105
 
86
-
87
106
  const [, t] = useLanguage();
88
107
  const [stateConfig] = useConfig();
89
- const [{ parsePrice, optimizeImage }] = useUtils();
90
- const [orderState] = useOrder();
108
+ const [{ auth }] = useSession()
109
+ const [{ parsePrice, optimizeImage, parseDate }] = useUtils();
110
+ const [orderState] = useOrder()
111
+ const [, { showToast }] = useToast()
112
+ const [isIntersectionObserver, setIsIntersectionObserver] = useState(!enableIntersection)
91
113
 
92
114
  const editMode = typeof product?.code !== 'undefined';
93
115
 
@@ -114,133 +136,177 @@ const SinguleProductCardUI = React.memo((props: SingleProductCardParams) => {
114
136
  );
115
137
 
116
138
  const handleChangeFavorite = () => {
117
- handleFavoriteProduct && handleFavoriteProduct(!product?.favorite)
139
+ if (auth) {
140
+ handleFavoriteProduct && handleFavoriteProduct(!product?.favorite)
141
+ } else {
142
+ navigation && navigation.navigate('Login');
143
+ }
144
+ }
145
+
146
+ const handleChangeIntersection = () => {
147
+ if (enableIntersection) {
148
+ setIsIntersectionObserver(true);
149
+ }
150
+ }
151
+
152
+ const handleClickproduct = () => {
153
+ if (productAddedToCartLength && product?.maximum_per_order && productAddedToCartLength >= product?.maximum_per_order) {
154
+ showToast(ToastType.Error, t('PRODUCT_ON_MAXIMUM_ORDER', 'The product is on maximum order'))
155
+ return
156
+ }
157
+ onProductClick?.(product)
118
158
  }
119
159
 
120
160
  return (
121
- <CardContainer
122
- showAddButton={showAddButton}
123
- style={[
124
- styles.container,
125
- (isSoldOut || maxProductQuantity <= 0) && styles.soldOutBackgroundStyle,
126
- (style && { ...style }),
127
- ]}
128
- onPress={() => onProductClick?.(product)}
129
- >
130
- <View style={{ flexDirection: 'row' }}>
131
- {productAddedToCartLength > 0 && (
132
- <QuantityContainer style={[styles.quantityContainer, {
133
- transform: [{ translateX: 10 }, { translateY: -10 }],
134
- }]}>
135
- <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
136
- </QuantityContainer>
137
- )}
138
- <CardInfo>
139
- <View style={styles.titleWrapper}>
140
- <OText
141
- size={12}
142
- weight={'500'}
143
- numberOfLines={1}
144
- ellipsizeMode="tail"
145
- style={styles.line18}>
146
- {product?.name}
147
- </OText>
148
- <TouchableOpacity
149
- onPress={handleChangeFavorite}
150
- >
151
- <IconAntDesign
152
- name={product?.favorite ? 'heart' : 'hearto'}
153
- color={theme.colors.danger5}
154
- size={18}
155
- />
156
- </TouchableOpacity>
157
- </View>
158
- <PricesContainer>
159
- <OText color={theme.colors.primary}>{product?.price ? parsePrice(product?.price) : ''}</OText>
160
- {product?.offer_price !== null && product?.in_offer && (
161
- <OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
161
+ <InView style={{ minHeight: hideAddButton ? 125 : 190 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeIntersection()}>
162
+ {isIntersectionObserver ? (
163
+ <CardAnimation
164
+ onClick={() => handleClickproduct()}
165
+ style={[
166
+ styles.container,
167
+ (isSoldOut || maxProductQuantity <= 0) && styles.soldOutBackgroundStyle,
168
+ (style && { ...style })
169
+ ]}
170
+ >
171
+ <View style={{ flexDirection: 'row' }}>
172
+ {productAddedToCartLength > 0 && (
173
+ <QuantityContainer style={[styles.quantityContainer, {
174
+ transform: [{ translateX: 25 }, { translateY: -25 }],
175
+ }]}>
176
+ <OText size={12} color={theme.colors.white}>{productAddedToCartLength.toString()}</OText>
177
+ </QuantityContainer>
162
178
  )}
163
- </PricesContainer>
164
- <OText
165
- size={10}
166
- numberOfLines={2}
167
- ellipsizeMode="tail"
168
- color={theme.colors.textSecondary}
169
- style={styles.line15}>
170
- {product?.description}
171
- </OText>
172
- </CardInfo>
173
- <LogoWrapper>
174
- {product?.ribbon?.enabled && (
175
- <RibbonBox
176
- bgColor={product?.ribbon?.color}
177
- isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
178
- isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
179
- >
179
+ <CardInfo>
180
+ <View style={styles.titleWrapper}>
181
+ <OText
182
+ size={textSize + 2}
183
+ weight={'500'}
184
+ numberOfLines={1}
185
+ ellipsizeMode="tail"
186
+ style={{ ...styles.line18, flex: 1 }}>
187
+ {product?.name}
188
+ </OText>
189
+ {!isPreviously && (
190
+ <LottieAnimation
191
+ type='favorite'
192
+ onClick={handleChangeFavorite}
193
+ initialValue={product?.favorite ? 0.75 : 0}
194
+ toValue={product?.favorite ? 0 : 0.75}
195
+ disableAnimation={!auth}
196
+ iconProps={{ color: theme.colors.danger5, size: 18 }}
197
+ isActive={product?.favorite}
198
+ />
199
+ )}
200
+ </View>
201
+ <PricesContainer>
202
+ {!!product?.price && (
203
+ <OText color={theme.colors.primary}>{parsePrice(product?.price)}</OText>
204
+ )}
205
+ {product?.offer_price !== null && !!product?.in_offer && (
206
+ <OText style={styles.regularPriceStyle}>{product?.offer_price ? parsePrice(product?.offer_price) : ''}</OText>
207
+ )}
208
+ </PricesContainer>
180
209
  <OText
181
- size={10}
182
- weight={'400'}
183
- color={theme.colors.white}
184
- numberOfLines={2}
185
- ellipsizeMode='tail'
186
- lineHeight={13}
187
- >
188
- {product?.ribbon?.text}
210
+ size={textSize}
211
+ numberOfLines={!isPreviously ? 2 : 1}
212
+ ellipsizeMode="tail"
213
+ color={theme.colors.textSecondary}
214
+ style={styles.line15}>
215
+ {product?.description}
189
216
  </OText>
190
- </RibbonBox>
191
- )}
192
- {product?.images ? (
193
- <FastImage
194
- style={styles.productStyle}
195
- source={{
196
- uri: optimizeImage(product?.images, 'h_250,c_limit'),
197
- priority: FastImage.priority.normal,
198
- }}
199
- resizeMode={FastImage.resizeMode.cover}
200
- />
201
- ) : (
202
- <FastImage
203
- style={styles.productStyle}
204
- source={{
205
- uri: Image.resolveAssetSource(theme.images.dummies.product).uri,
206
- priority: FastImage.priority.normal,
217
+ {isPreviously && (
218
+ <OText
219
+ size={textSize}
220
+ numberOfLines={1}
221
+ ellipsizeMode="tail"
222
+ color={theme.colors.primary}
223
+ style={styles.line15}>
224
+ {t('LAST_ORDERED_ON', 'Last ordered on')} {parseDate(product?.last_ordered_date, { outputFormat: 'MMM DD, YYYY' })}
225
+ </OText>
226
+ )}
227
+ </CardInfo>
228
+ <LogoWrapper>
229
+ {!!product?.ribbon?.enabled && (
230
+ <RibbonBox
231
+ bgColor={product?.ribbon?.color}
232
+ isRoundRect={product?.ribbon?.shape === shape?.rectangleRound}
233
+ isCapsule={product?.ribbon?.shape === shape?.capsuleShape}
234
+ >
235
+ <OText
236
+ size={textSize}
237
+ weight={'400'}
238
+ color={theme.colors.white}
239
+ numberOfLines={2}
240
+ ellipsizeMode='tail'
241
+ lineHeight={13}
242
+ >
243
+ {product?.ribbon?.text}
244
+ </OText>
245
+ </RibbonBox>
246
+ )}
247
+ <FastImage
248
+ style={styles.productStyle}
249
+ source={product?.images ? {
250
+ uri: optimizeImage(product?.images, 'h_250,c_limit'),
251
+ priority: FastImage.priority.normal,
252
+ } : theme?.images?.dummies?.product}
253
+ resizeMode={FastImage.resizeMode.cover}
254
+ />
255
+ </LogoWrapper>
256
+
257
+ {(isSoldOut || maxProductQuantity <= 0) && (
258
+ <SoldOut>
259
+ <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
260
+ {t('SOLD_OUT', 'SOLD OUT')}
261
+ </OText>
262
+ </SoldOut>
263
+ )}
264
+ </View>
265
+ {!hideAddButton && (
266
+ <OButton
267
+ onClick={() => handleClickproduct()}
268
+ style={{
269
+ width: '100%',
270
+ borderRadius: 7.6,
271
+ marginTop: 10,
272
+ height: 40
273
+
207
274
  }}
208
- resizeMode={FastImage.resizeMode.cover}
275
+ bgColor={isSoldOut ? '#B8B8B8' : theme?.colors?.white}
276
+ borderColor={theme?.colors.primary}
277
+ textStyle={{ color: theme.colors.primary }}
278
+ text={t('ADD', 'Add')}
209
279
  />
210
280
  )}
211
- </LogoWrapper>
212
-
213
- {(isSoldOut || maxProductQuantity <= 0) && (
214
- <SoldOut>
215
- <OText size={12} weight="bold" color={theme.colors.textSecondary} style={styles.soldOutTextStyle}>
216
- {t('SOLD_OUT', 'SOLD OUT')}
217
- </OText>
218
- </SoldOut>
219
- )}
220
- </View>
221
- {showAddButton && (
222
- <OButton
223
- onClick={() => onProductClick?.(product)}
224
- style={{
225
- width: '100%',
226
- borderRadius: 7.6,
227
- marginTop: 10,
228
-
229
- }}
230
- bgColor={isSoldOut ? '#B8B8B8' : theme?.colors?.white}
231
- borderColor={theme?.colors.primary}
232
- textStyle={{color: theme.colors.primary}}
233
- text={t('ADD', 'Add')}
234
- />
281
+ </CardAnimation>
282
+ ) : (
283
+ <View style={{ marginBottom: 28, padding: 12, height: hideAddButton ? 125 : 165 }}>
284
+ <Placeholder style={{ padding: 5 }} Animation={Fade}>
285
+ <View style={{ flexDirection: 'row' }}>
286
+ <Placeholder style={{ paddingVertical: 10, flex: 1 }}>
287
+ <PlaceholderLine width={60} style={{ marginBottom: 15 }} />
288
+ <PlaceholderLine width={20} />
289
+ </Placeholder>
290
+ <PlaceholderLine
291
+ width={24}
292
+ height={70}
293
+ style={{ marginLeft: 10, marginBottom: 10 }}
294
+ />
295
+ </View>
296
+ <PlaceholderLine
297
+ height={52}
298
+ />
299
+ </Placeholder>
300
+ </View>
235
301
  )}
236
- </CardContainer>
302
+ </InView>
237
303
  );
238
304
  }, SingleProductCardPropsAreEqual);
239
305
 
240
306
  export const SingleProductCard = (props: SingleProductCardParams) => {
241
307
  const singleProductCardProps = {
242
308
  ...props,
243
- UIComponent: SinguleProductCardUI
309
+ UIComponent: SingleProductCardUI
244
310
  }
245
311
  return <SingleProductCardController {...singleProductCardProps} />
246
312
  }
@@ -1,17 +1,9 @@
1
1
  import styled, { css } from 'styled-components/native'
2
2
 
3
- export const CardContainer = styled.TouchableOpacity`
4
- flex: 1;
5
- flex-direction: ${(props : any) => props.showAddButton ? 'column' : 'row'};
6
- justify-content: space-between;
7
- align-items: center;
8
- padding: 12px;
9
- border-radius: 10px;
10
- position: relative;
11
- `
12
3
  export const CardInfo = styled.View`
13
4
  padding-start: 3px;
14
5
  flex: 1;
6
+ min-height: 85px;
15
7
  `
16
8
  export const SoldOut = styled.View`
17
9
  position: absolute;
@@ -30,6 +22,7 @@ export const QuantityContainer = styled.View`
30
22
  export const PricesContainer = styled.View`
31
23
  flex-direction: row;
32
24
  align-items: center;
25
+ margin-vertical: 6px;
33
26
  `
34
27
 
35
28
  export const LogoWrapper = styled.View`
@@ -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>>([])
@@ -55,6 +64,12 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
55
64
  return found
56
65
  }
57
66
 
67
+ const handleChangeQualification = (index: number) => {
68
+ if (qualification === index) return
69
+ setQualification(index)
70
+ setComments([])
71
+ }
72
+
58
73
  const handleChangeComment = (commentItem: any) => {
59
74
  const found = comments.find((comment: any) => comment?.key === commentItem.key)
60
75
  if (found) {
@@ -100,16 +115,34 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
100
115
  return (
101
116
  <>
102
117
  <ProductContainer>
118
+ <LogoWrapper>
119
+ {product?.images ? (
120
+ <FastImage
121
+ style={styles.productStyle}
122
+ source={{
123
+ uri: optimizeImage(product?.images, 'h_250,c_limit'),
124
+ priority: FastImage.priority.normal,
125
+ }}
126
+ resizeMode={FastImage.resizeMode.cover}
127
+ />
128
+ ) : (
129
+ <OIcon
130
+ src={theme?.images?.dummies?.product}
131
+ width={80}
132
+ height={80}
133
+ />
134
+ )}
135
+ </LogoWrapper>
103
136
  <ProductHeader>
104
137
  <OText numberOfLines={1} style={{ flex: 1 }} color={theme.colors.textNormal}>{product?.name}</OText>
105
138
  <LikeHandsActionContainer>
106
139
  <LikeHandsButton
107
140
  isLike
108
- onPress={() => setQualification(5)}
141
+ onPress={() => handleChangeQualification(5)}
109
142
  >
110
143
  <AntDesignIcons name='like2' size={20} color={qualification === 5 ? theme.colors.primary : theme.colors.lightGray} />
111
144
  </LikeHandsButton>
112
- <LikeHandsButton onPress={() => setQualification(1)}>
145
+ <LikeHandsButton onPress={() => handleChangeQualification(1)}>
113
146
  <AntDesignIcons name='dislike2' size={20} color={qualification === 1 ? theme.colors.primary : theme.colors.lightGray} />
114
147
  </LikeHandsButton>
115
148
  </LikeHandsActionContainer>
@@ -129,7 +162,7 @@ export const SingleProductReview = (props: SingleProductReviewParams) => {
129
162
  style={{ height: 35, paddingLeft: 5, paddingRight: 5, marginHorizontal: 3, marginVertical: 10 }}
130
163
  imgRightSrc={isSelectedComment(commentItem.key) ? theme.images.general.close : null}
131
164
  imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}
132
- onClick={() => handleChangeComment(commentItem) }
165
+ onClick={() => handleChangeComment(commentItem)}
133
166
  />
134
167
  ))}
135
168
  </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,7 +61,9 @@ const StripeElementsFormUI = (props: any) => {
61
61
  }
62
62
 
63
63
  if (user?.address) {
64
- billingDetails.address.line1 = user?.address
64
+ billingDetails.address = {
65
+ line1: user?.address
66
+ }
65
67
  }
66
68
 
67
69
  const createPayMethod = async () => {
@@ -71,7 +73,13 @@ const StripeElementsFormUI = (props: any) => {
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({
@@ -187,6 +195,9 @@ const StripeElementsFormUI = (props: any) => {
187
195
  cardStyle={{
188
196
  backgroundColor: '#FFFFFF',
189
197
  textColor: '#000000',
198
+ borderWidth: 1,
199
+ borderRadius: 8,
200
+ borderColor: theme.colors.border
190
201
  }}
191
202
  style={{
192
203
  width: '100%',
@@ -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
 
@@ -139,7 +146,7 @@ const UpsellingProductsUI = (props: UpsellingProductsParams) => {
139
146
  </AddButton>
140
147
  </View>
141
148
  <View>
142
- <OIcon url={product.images} style={styles.imageStyle} />
149
+ <OIcon url={product?.images || theme?.images?.dummies?.product} style={styles.imageStyle} />
143
150
  </View>
144
151
  </Item>
145
152
  )) : (
@@ -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}>
@@ -152,9 +152,11 @@ const UserDetailsUI = (props: any) => {
152
152
  {!(validationFields.loading || formState.loading) && (
153
153
  <UDContainer>
154
154
  <UDHeader>
155
- <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal}>
156
- {t('CUSTOMER_DETAILS', 'Customer Details')}
157
- </OText>
155
+ {props.HeaderTitle ?? (
156
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal}>
157
+ {t('CUSTOMER_DETAILS', 'Customer Details')}
158
+ </OText>
159
+ )}
158
160
  {cartStatus !== 2 && !requiredFields && (
159
161
  !isEdit ? (
160
162
  <EditBtn onPress={() => toggleIsEdit()} activeOpacity={0.7}>