ordering-ui-react-native 0.16.92 → 0.16.93-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 +5 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/styles.tsx +8 -14
  4. package/src/components/BusinessInformation/index.tsx +19 -4
  5. package/src/components/BusinessInformation/styles.tsx +2 -2
  6. package/src/components/BusinessProductsList/index.tsx +1 -1
  7. package/src/components/BusinessesListing/index.tsx +1 -1
  8. package/src/components/OrderCreating/index.tsx +1 -21
  9. package/src/components/OrdersOption/index.tsx +54 -56
  10. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  11. package/src/components/SingleProductReview/index.tsx +7 -4
  12. package/src/components/VerifyPhone/styles.tsx +1 -2
  13. package/src/components/shared/OToast.tsx +4 -4
  14. package/src/utils/index.tsx +2 -1
  15. package/themes/business/index.tsx +2 -0
  16. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  17. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  18. package/themes/business/src/components/BusinessController/index.tsx +2 -3
  19. package/themes/business/src/components/Chat/index.tsx +30 -30
  20. package/themes/business/src/components/DriverMap/index.tsx +22 -9
  21. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  22. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  23. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  24. package/themes/business/src/components/LoginForm/index.tsx +239 -80
  25. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  26. package/themes/business/src/components/MapView/index.tsx +18 -7
  27. package/themes/business/src/components/NewOrderNotification/index.tsx +31 -41
  28. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  29. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +96 -50
  30. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  31. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  32. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  33. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  34. package/themes/business/src/components/OrdersOption/index.tsx +33 -75
  35. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +1 -1
  36. package/themes/business/src/components/PreviousMessages/index.tsx +16 -18
  37. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  38. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  39. package/themes/business/src/components/PreviousOrders/index.tsx +447 -247
  40. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  41. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  42. package/themes/business/src/components/ReviewCustomer/index.tsx +42 -25
  43. package/themes/business/src/components/StoresList/index.tsx +2 -2
  44. package/themes/business/src/components/shared/OLink.tsx +33 -13
  45. package/themes/business/src/components/shared/OModal.tsx +16 -9
  46. package/themes/business/src/components/shared/OText.tsx +8 -2
  47. package/themes/business/src/types/index.tsx +33 -2
  48. package/themes/business/src/utils/index.tsx +53 -0
  49. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  50. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  51. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  54. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  55. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  56. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  57. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  60. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  61. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +1 -0
  62. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  63. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  64. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  65. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  66. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  67. package/themes/kiosk/src/types/index.d.ts +13 -0
  68. package/themes/kiosk/src/utils/index.tsx +15 -0
  69. package/themes/original/index.tsx +8 -0
  70. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  71. package/themes/original/src/components/AddressForm/index.tsx +143 -115
  72. package/themes/original/src/components/AddressList/index.tsx +26 -21
  73. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  74. package/themes/original/src/components/AnalyticsSegment/index.tsx +164 -8
  75. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  76. package/themes/original/src/components/BusinessBasicInformation/index.tsx +121 -80
  77. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +1 -4
  78. package/themes/original/src/components/BusinessController/index.tsx +100 -47
  79. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  80. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  81. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -5
  82. package/themes/original/src/components/BusinessListingSearch/index.tsx +52 -24
  83. package/themes/original/src/components/BusinessPreorder/index.tsx +96 -15
  84. package/themes/original/src/components/BusinessProductsList/index.tsx +16 -9
  85. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  86. package/themes/original/src/components/BusinessProductsListing/index.tsx +606 -490
  87. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -13
  88. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  89. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  90. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +96 -73
  91. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  92. package/themes/original/src/components/BusinessesListing/index.tsx +6 -6
  93. package/themes/original/src/components/Cart/index.tsx +93 -43
  94. package/themes/original/src/components/CartContent/index.tsx +77 -15
  95. package/themes/original/src/components/CartContent/styles.tsx +11 -1
  96. package/themes/original/src/components/Checkout/index.tsx +294 -175
  97. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  98. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  99. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  100. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  101. package/themes/original/src/components/DriverTips/index.tsx +52 -37
  102. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  103. package/themes/original/src/components/Favorite/index.tsx +7 -4
  104. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  105. package/themes/original/src/components/FavoriteList/index.tsx +70 -80
  106. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  107. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  108. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  109. package/themes/original/src/components/GoogleMap/index.tsx +10 -1
  110. package/themes/original/src/components/Help/index.tsx +8 -8
  111. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  112. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  113. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  114. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  115. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  116. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  117. package/themes/original/src/components/Home/index.tsx +13 -4
  118. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  119. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  120. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  121. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  122. package/themes/original/src/components/LoginForm/index.tsx +43 -19
  123. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  124. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  125. package/themes/original/src/components/Messages/index.tsx +31 -10
  126. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  127. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  128. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  129. package/themes/original/src/components/MultiCheckout/index.tsx +210 -79
  130. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  131. package/themes/original/src/components/MultiOrdersDetails/index.tsx +67 -20
  132. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  133. package/themes/original/src/components/MyOrders/index.tsx +66 -17
  134. package/themes/original/src/components/NavBar/index.tsx +6 -11
  135. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  136. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  137. package/themes/original/src/components/Notifications/index.tsx +144 -0
  138. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  139. package/themes/original/src/components/OrderDetails/OrderEta.tsx +59 -0
  140. package/themes/original/src/components/OrderDetails/index.tsx +110 -221
  141. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  142. package/themes/original/src/components/OrderItAgain/index.tsx +47 -43
  143. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  144. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  145. package/themes/original/src/components/OrderSummary/index.tsx +52 -17
  146. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  147. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +28 -19
  148. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  149. package/themes/original/src/components/OrdersOption/index.tsx +76 -83
  150. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  151. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  152. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  153. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  154. package/themes/original/src/components/PaymentOptions/index.tsx +2 -2
  155. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  156. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  157. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  158. package/themes/original/src/components/ProductForm/index.tsx +247 -269
  159. package/themes/original/src/components/ProductForm/styles.tsx +4 -7
  160. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  161. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  162. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  163. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  164. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -49
  165. package/themes/original/src/components/ProfessionalProfile/index.tsx +54 -14
  166. package/themes/original/src/components/Promotions/index.tsx +234 -220
  167. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  168. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  169. package/themes/original/src/components/ReviewOrder/index.tsx +43 -11
  170. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  171. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  172. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  173. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  174. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  175. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  176. package/themes/original/src/components/ServiceForm/index.tsx +377 -270
  177. package/themes/original/src/components/Sessions/index.tsx +11 -8
  178. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  179. package/themes/original/src/components/SignupForm/index.tsx +79 -66
  180. package/themes/original/src/components/SingleOrderCard/index.tsx +126 -57
  181. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  182. package/themes/original/src/components/SingleProductCard/index.tsx +106 -46
  183. package/themes/original/src/components/SingleProductCard/styles.tsx +19 -13
  184. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  185. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  186. package/themes/original/src/components/StripeCardsList/index.tsx +1 -1
  187. package/themes/original/src/components/StripeElementsForm/index.tsx +4 -1
  188. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -218
  189. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  190. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  191. package/themes/original/src/components/UserFormDetails/index.tsx +53 -54
  192. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  193. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  194. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  195. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  196. package/themes/original/src/components/Wallets/index.tsx +20 -21
  197. package/themes/original/src/components/Wallets/styles.tsx +2 -0
  198. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  199. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  200. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  201. package/themes/original/src/components/shared/OButton.tsx +6 -2
  202. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  203. package/themes/original/src/components/shared/OInput.tsx +10 -1
  204. package/themes/original/src/components/shared/OModal.tsx +3 -3
  205. package/themes/original/src/layouts/Container.tsx +13 -9
  206. package/themes/original/src/types/index.tsx +45 -7
  207. package/themes/original/src/utils/index.tsx +321 -58
  208. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -11,27 +11,28 @@ import {
11
11
  ToastType
12
12
  } from 'ordering-components/native';
13
13
  import { OIcon, OText } from '../shared';
14
- import { StyleSheet, TouchableOpacity, View, Animated } from 'react-native';
14
+ import { Dimensions, StyleSheet, Vibration, View } from 'react-native';
15
15
  import { InView } from 'react-native-intersection-observer'
16
16
  import { BusinessControllerParams } from '../../types';
17
17
  import { convertHoursToMinutes, shape } from '../../utils';
18
+
18
19
  import {
19
- Card,
20
20
  BusinessHero,
21
21
  BusinessContent,
22
- BusinessCategory,
23
22
  BusinessInfo,
24
23
  Metadata,
25
24
  BusinessState,
26
25
  BusinessLogo,
27
26
  Reviews,
28
27
  RibbonBox,
29
- ReviewAndFavorite
28
+ ReviewAndFavorite,
29
+ OfferBox
30
30
  } from './styles';
31
31
  import { useTheme } from 'styled-components/native';
32
32
  import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome5';
33
- import IconAntDesign from 'react-native-vector-icons/AntDesign'
34
33
  import FastImage from 'react-native-fast-image'
34
+ import { LottieAnimation } from '../LottieAnimation';
35
+ import { CardAnimation } from '../shared/CardAnimation';
35
36
 
36
37
  export const BusinessControllerUI = (props: BusinessControllerParams) => {
37
38
  const {
@@ -40,6 +41,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
40
41
  navigation,
41
42
  isBusinessOpen,
42
43
  style,
44
+ isCustomLayout,
43
45
  businessHeader,
44
46
  businessFeatured,
45
47
  businessLogo,
@@ -49,18 +51,31 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
49
51
  businessPickupTime,
50
52
  businessDistance,
51
53
  handleFavoriteBusiness,
52
- enableIntersection
54
+ enableIntersection,
55
+ getBusinessOffer
53
56
  } = props;
57
+
54
58
  const [{ parsePrice, parseDistance, parseNumber, optimizeImage }] = useUtils();
55
59
  const [, { showToast }] = useToast()
56
60
  const [orderState] = useOrder();
57
- const [ { auth }] = useSession()
61
+ const [{ auth }] = useSession()
58
62
  const [configState] = useConfig();
59
63
  const [, t] = useLanguage();
60
64
  const theme = useTheme()
65
+ const windowHeight = Dimensions.get('window').height
61
66
  const [isIntersectionObserver, setIsIntersectionObserver] = useState(!enableIntersection)
62
67
 
68
+ const textSize = isCustomLayout ? 12 : 10
69
+ const cardHeight = windowHeight * 0.3
70
+
63
71
  const styles = StyleSheet.create({
72
+ container: {
73
+ marginVertical: 20,
74
+ borderRadius: 7.6,
75
+ width: '100%',
76
+ position: 'relative',
77
+ height: cardHeight
78
+ },
64
79
  headerStyle: {
65
80
  borderTopLeftRadius: 7.6,
66
81
  borderTopRightRadius: 7.6,
@@ -110,7 +125,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
110
125
  flexDirection: 'row',
111
126
  alignItems: 'center',
112
127
  justifyContent: 'flex-start',
113
- },
128
+ }
114
129
  });
115
130
 
116
131
  const types = ['food', 'laundry', 'alcohol', 'groceries'];
@@ -127,6 +142,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
127
142
  };
128
143
 
129
144
  const handleBusinessClick = (selectedBusiness: any) => {
145
+ Vibration.vibrate()
130
146
  if (business?.open) handleClick && handleClick(selectedBusiness)
131
147
  else {
132
148
  if (configState?.configs?.preorder_status_enabled?.value === '1') {
@@ -152,7 +168,10 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
152
168
  return (
153
169
  <InView style={{ minHeight: 200 }} triggerOnce={true} onChange={(inView: boolean) => handleChangeInterSection(inView)}>
154
170
  {isIntersectionObserver ? (
155
- <Card activeOpacity={1} onPress={() => handleBusinessClick(business)} style={style}>
171
+ <CardAnimation
172
+ style={[style, styles.container]}
173
+ onClick={() => handleBusinessClick(business)}
174
+ >
156
175
  {business?.ribbon?.enabled && (
157
176
  <RibbonBox
158
177
  bgColor={business?.ribbon?.color}
@@ -173,11 +192,11 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
173
192
  )}
174
193
  <BusinessHero>
175
194
  <FastImage
176
- style={{ height: 120 }}
177
- source={{
195
+ style={{ height: isCustomLayout ? cardHeight * 0.66 : 120 }}
196
+ source={(businessHeader || business?.header) ? {
178
197
  uri: optimizeImage(businessHeader || business?.header, 'h_500,c_limit'),
179
198
  priority: FastImage.priority.normal,
180
- }}
199
+ } : theme.images.dummies.businessHeader}
181
200
  resizeMode={FastImage.resizeMode.cover}
182
201
  />
183
202
  {(businessFeatured ?? business?.featured) && (
@@ -185,6 +204,18 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
185
204
  <FontAwesomeIcon name="crown" size={26} color="gold" />
186
205
  </View>
187
206
  )}
207
+ {(!isCustomLayout) && (
208
+ getBusinessOffer((business?.offers)) &&
209
+ <OfferBox>
210
+ <OText
211
+ size={10}
212
+ weight={'400'}
213
+ numberOfLines={2}
214
+ ellipsizeMode='tail'
215
+ lineHeight={13}
216
+ >{getBusinessOffer((business?.offers)) || parsePrice(0)}</OText>
217
+ </OfferBox>
218
+ )}
188
219
  <BusinessState>
189
220
  {!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1') && (
190
221
  <View style={styles.businessStateView}>
@@ -199,49 +230,71 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
199
230
  </BusinessState>
200
231
  </BusinessHero>
201
232
  <BusinessContent>
202
- <BusinessInfo>
233
+ <BusinessInfo style={isCustomLayout && { position: 'absolute', bottom: 85, left: 15 }}>
203
234
  <BusinessLogo style={styles.businessLogo}>
204
235
  <FastImage
205
236
  style={{ width: 56, height: 56 }}
206
- source={{
237
+ source={(businessLogo || business?.logo) ? {
207
238
  uri: optimizeImage(businessLogo || business?.logo, 'h_150,c_limit'),
208
239
  priority: FastImage.priority.normal,
209
- }}
240
+ } : theme.images.dummies.businessLogo}
210
241
  resizeMode={FastImage.resizeMode.cover}
211
242
  />
212
243
  </BusinessLogo>
213
- <ReviewAndFavorite>
214
- {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
215
- <Reviews>
216
- <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
217
- <OText size={10} style={{ lineHeight: 15 }}>
218
- {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
219
- </OText>
220
- </Reviews>
221
- )}
222
- <TouchableOpacity
223
- onPress={handleChangeFavorite}
224
- >
225
- <IconAntDesign
226
- name={business?.favorite ? 'heart' : 'hearto'}
227
- color={theme.colors.danger5}
228
- size={18}
244
+ {!isCustomLayout && (
245
+ <ReviewAndFavorite>
246
+ {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
247
+ <Reviews>
248
+ <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
249
+ <OText size={10} style={{ lineHeight: 15 }}>
250
+ {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
251
+ </OText>
252
+ </Reviews>
253
+ )}
254
+ <LottieAnimation
255
+ type='favorite'
256
+ onClick={handleChangeFavorite}
257
+ initialValue={business?.favorite ? 0.75 : 0}
258
+ toValue={business?.favorite ? 0 : 0.75}
259
+ disableAnimation={!auth}
260
+ iconProps={{ color: theme.colors.danger5, size: 18 }}
261
+ isActive={business?.favorite}
229
262
  />
230
- </TouchableOpacity>
231
- </ReviewAndFavorite>
263
+ </ReviewAndFavorite>
264
+ )}
232
265
  </BusinessInfo>
233
- <OText
234
- size={12}
235
- style={{ lineHeight: 18, marginBottom: 6 }}
236
- weight={'500'}>
237
- {business?.name}
238
- </OText>
239
- <OText size={10} style={{ lineHeight: 15, marginBottom: 3 }}>
266
+ <View style={isCustomLayout && { width: '100%', flexDirection: 'row', justifyContent: 'space-between', marginTop: 5 }}>
267
+ <OText
268
+ size={textSize + 2}
269
+ style={{ lineHeight: 18, marginBottom: 6 }}
270
+ weight={'500'}>
271
+ {business?.name}
272
+ </OText>
273
+ {isCustomLayout && (
274
+ <ReviewAndFavorite>
275
+ {(businessReviews?.reviews?.total > 0 ?? business?.reviews?.total > 0) && (
276
+ <Reviews>
277
+ <OIcon src={theme.images.general.star} width={12} style={styles.starIcon} />
278
+ <OText size={10} style={{ lineHeight: 15 }}>
279
+ {parseNumber(businessReviews?.reviews?.total ?? business?.reviews?.total, { separator: '.' })}
280
+ </OText>
281
+ </Reviews>
282
+ )}
283
+ <LottieAnimation
284
+ type='favorite'
285
+ onClick={handleChangeFavorite}
286
+ initialValue={business?.favorite ? 0.75 : 0}
287
+ toValue={business?.favorite ? 0 : 0.75}
288
+ disableAnimation={!auth}
289
+ iconProps={{ color: theme.colors.danger5, size: 18 }}
290
+ isActive={business?.favorite}
291
+ />
292
+ </ReviewAndFavorite>
293
+ )}
294
+ </View>
295
+ <OText size={textSize} style={{ lineHeight: 15, marginBottom: 3 }} numberOfLines={isCustomLayout ? 1 : 2}>
240
296
  {business?.address}
241
297
  </OText>
242
- {/* <BusinessCategory>
243
- <OText>{getBusinessType()}</OText>
244
- </BusinessCategory> */}
245
298
  <Metadata>
246
299
  {!isBusinessOpen ? (
247
300
  <View style={styles.closed}>
@@ -252,21 +305,21 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
252
305
  ) : (
253
306
  <View style={styles.bullet}>
254
307
  {orderState?.options?.type === 1 && (
255
- <OText size={10} color={theme.colors.textSecondary}>
308
+ <OText size={textSize} color={theme.colors.textSecondary}>
256
309
  {`${t('DELIVERY_FEE', 'Delivery fee')} ${parsePrice(businessDeliveryPrice ?? business?.delivery_price) + ' \u2022 '}`}
257
310
  </OText>
258
311
  )}
259
- <OText size={10} color={theme.colors.textSecondary}>{`${convertHoursToMinutes(
312
+ <OText size={textSize} color={theme.colors.textSecondary}>{`${convertHoursToMinutes(
260
313
  orderState?.options?.type === 1
261
314
  ? (businessDeliveryTime ?? business?.delivery_time)
262
315
  : (businessPickupTime ?? business?.pickup_time),
263
316
  )} \u2022 `}</OText>
264
- <OText size={10} color={theme.colors.textSecondary}>{parseDistance(businessDistance ?? business?.distance)}</OText>
317
+ <OText size={textSize} color={theme.colors.textSecondary}>{parseDistance(businessDistance ?? business?.distance)}</OText>
265
318
  </View>
266
319
  )}
267
320
  </Metadata>
268
321
  </BusinessContent>
269
- </Card>
322
+ </CardAnimation>
270
323
  ) : (
271
324
  <Placeholder
272
325
  Animation={Fade}
@@ -1,12 +1,5 @@
1
1
  import styled, { css } from 'styled-components/native';
2
2
 
3
- export const Card = styled.TouchableOpacity`
4
- margin-vertical: 20px;
5
- border-radius: 7.6px;
6
- width: 100%;
7
- position: relative;
8
- `
9
-
10
3
  export const BusinessHero = styled.View`
11
4
  position: relative;
12
5
  border-top-right-radius: 7.6px;
@@ -16,7 +9,7 @@ export const BusinessHero = styled.View`
16
9
 
17
10
  export const BusinessContent = styled.View`
18
11
  padding-horizontal: 18px;
19
- padding-bottom: 18px;
12
+ padding-bottom: 10px;
20
13
  border-bottom-left-radius: 7.6px;
21
14
  border-bottom-right-radius: 7.6px;
22
15
  border-width: 1px;
@@ -46,7 +39,7 @@ export const BusinessState = styled.View`
46
39
  `
47
40
 
48
41
  export const BusinessLogo = styled.View`
49
-
42
+
50
43
  `
51
44
 
52
45
  export const ReviewAndFavorite = styled.View`
@@ -80,3 +73,15 @@ export const RibbonBox = styled.View`
80
73
  border-radius: 50px;
81
74
  `}
82
75
  `
76
+
77
+ export const OfferBox = styled.View`
78
+ position: absolute;
79
+ z-index: 1;
80
+ top: 20px;
81
+ right: 10px;
82
+ border-radius: 50px;
83
+ color: ${(props: any) => props.theme.colors.textThird};
84
+ background: ${(props: any) => props.theme.colors.inputBorderColor};
85
+ padding: 3px 8px;
86
+ max-width: 180px;
87
+ `
@@ -16,26 +16,19 @@ import {
16
16
  DivideView,
17
17
  MediaWrapper,
18
18
  } from './styles';
19
- import { Platform, StyleSheet, View } from 'react-native';
19
+ import { StyleSheet, View } from 'react-native';
20
20
  import { BusinessInformationParams } from '../../types';
21
21
  import { GoogleMap } from '../GoogleMap';
22
22
  import { WebView } from 'react-native-webview';
23
23
  import { formatUrlVideo } from '../../utils'
24
+ import { ScheduleAccordion } from '../ScheduleAccordion';
24
25
  const BusinessInformationUI = (props: BusinessInformationParams) => {
25
26
  const { businessState, businessSchedule, businessLocation } = props;
26
27
 
27
28
  const theme = useTheme();
28
29
  const [, t] = useLanguage();
29
30
  const [{ optimizeImage }] = useUtils();
30
- const daysOfWeek = [
31
- t('SUNDAY_ABBREVIATION', 'Sun'),
32
- t('MONDAY_ABBREVIATION', 'Mon'),
33
- t('TUESDAY_ABBREVIATION', 'Tues'),
34
- t('WEDNESDAY_ABBREVIATION', 'Wed'),
35
- t('THURSDAY_ABBREVIATION', 'Thur'),
36
- t('FRIDAY_ABBREVIATION', 'Fri'),
37
- t('SATURDAY_ABBREVIATION', 'Sat'),
38
- ];
31
+
39
32
  const scheduleFormatted = ({
40
33
  hour,
41
34
  minute,
@@ -112,25 +105,11 @@ const BusinessInformationUI = (props: BusinessInformationParams) => {
112
105
  <WrapScheduleBlock>
113
106
  {businessSchedule.map((schedule: any, i: number) => (
114
107
  <ScheduleBlock key={i}>
115
- <OText
116
- lineHeight={21}
117
- mBottom={16}
118
- size={14}
119
- weight={Platform.OS === 'android' ? 'bold' : '600'}
120
- style={{ flexBasis: '20%' }}>
121
- {daysOfWeek[i].toUpperCase()}
122
- </OText>
123
- {schedule.enabled ? (
124
- <OText mBottom={16}>
125
- {scheduleFormatted(schedule.lapses[0].open) +
126
- ' - ' +
127
- scheduleFormatted(schedule.lapses[0].close)}
128
- </OText>
129
- ) : (
130
- <OText color={theme.colors.red} mBottom={16}>
131
- {t('CLOSED', 'Closed')}
132
- </OText>
133
- )}
108
+ <ScheduleAccordion
109
+ weekIndex={i}
110
+ scheduleFormatted={scheduleFormatted}
111
+ schedule={schedule}
112
+ />
134
113
  </ScheduleBlock>
135
114
  ))}
136
115
  </WrapScheduleBlock>
@@ -152,10 +131,10 @@ const BusinessInformationUI = (props: BusinessInformationParams) => {
152
131
  style={{ width: 210, height: 127, borderRadius: 7.6 }}
153
132
  javaScriptEnabled={true}
154
133
  domStorageEnabled={true}
155
- source={{
134
+ source={{
156
135
  html: `
157
136
  <iframe width='80%' height='80%' src="${formatUrlVideo(v.video)}" frameBorder='0' allow='autoplay; encrypted-media' allowFullScreen />
158
- `,
137
+ `,
159
138
  }}
160
139
  mediaPlaybackRequiresUserAction={true}
161
140
  />
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useRef, useEffect } from 'react';
2
2
  import { TouchableOpacity, View } from 'react-native';
3
- import { useOrder, useLanguage, useUtils, useConfig } from 'ordering-components/native';
3
+ import { useOrder, useLanguage, useUtils, useConfig, useEvent } from 'ordering-components/native';
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import {
6
6
  BIContainer,
@@ -22,7 +22,8 @@ export const BusinessItemAccordion = (props: any) => {
22
22
  handleClearProducts,
23
23
  handleClickCheckout,
24
24
  checkoutButtonDisabled,
25
- isMultiCheckout
25
+ isMultiCheckout,
26
+ isFromUpselling
26
27
  } = props
27
28
 
28
29
  const [orderState] = useOrder();
@@ -30,6 +31,7 @@ export const BusinessItemAccordion = (props: any) => {
30
31
  const [{ parsePrice }] = useUtils();
31
32
  const [{ configs }] = useConfig()
32
33
  const theme = useTheme();
34
+ const [events] = useEvent()
33
35
 
34
36
  const isCartPending = cart?.status === 2
35
37
  const isClosed = !cart?.valid_schedule
@@ -37,6 +39,7 @@ export const BusinessItemAccordion = (props: any) => {
37
39
  const isBusinessChangeEnabled = configs?.cart_change_business_validation?.value === '1'
38
40
 
39
41
  const [isActive, setActiveState] = useState(!!singleBusiness)
42
+ const [viewedCart, setViewedCart] = useState<any>(null)
40
43
 
41
44
  useEffect(() => {
42
45
  const cartsArray = Object.values(orderState?.carts)
@@ -46,6 +49,21 @@ export const BusinessItemAccordion = (props: any) => {
46
49
  }
47
50
  }, [orderState?.carts, isClosed])
48
51
 
52
+ const subtotalWithTaxes = cart?.taxes?.reduce((acc: any, item: any) => {
53
+ if (item?.type === 1)
54
+ return acc = acc + item?.summary?.tax
55
+ return acc = acc
56
+ }, cart?.subtotal)
57
+
58
+ useEffect(() => {
59
+ if (isActive && !isFromUpselling) {
60
+ if (cart?.uuid !== viewedCart?.uuid) {
61
+ setViewedCart(cart)
62
+ events.emit('cart_viewed', cart)
63
+ }
64
+ }
65
+ }, [isActive, viewedCart])
66
+
49
67
  return (
50
68
  <BIContainer isClosed={isClosed} isMultiCheckout={isMultiCheckout} checkoutVisible={!isActive && !isClosed && !!isProducts && !checkoutButtonDisabled}>
51
69
  <BIHeader
@@ -102,7 +120,7 @@ export const BusinessItemAccordion = (props: any) => {
102
120
  <OText
103
121
  size={12}
104
122
  lineHeight={18}
105
- color={theme.colors.textSecondary}
123
+ color={theme.colors.primary}
106
124
  style={{ textDecorationLine: 'underline' }}
107
125
  >
108
126
  {t('CHANGE_STORE', 'Change store')}
@@ -149,9 +167,9 @@ export const BusinessItemAccordion = (props: any) => {
149
167
  <OButton
150
168
  onClick={handleClickCheckout}
151
169
  textStyle={{ color: 'white', textAlign: 'center', flex: 1 }}
152
- style={{ width: 160, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
170
+ style={{ width: 180, flexDirection: 'row', justifyContent: 'center', borderRadius: 7.6, shadowOpacity: 0 }}
153
171
  text={t('CHECKOUT', 'Checkout')}
154
- bgColor={(cart?.subtotal < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
172
+ bgColor={(subtotalWithTaxes < cart?.minimum || !cart?.valid_address) ? theme.colors.secundary : theme.colors.primary}
155
173
  borderColor={theme.colors.primary}
156
174
  isDisabled={checkoutButtonDisabled}
157
175
  />
@@ -52,7 +52,8 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
52
52
  brandList,
53
53
  onNavigationRedirect,
54
54
  handleUpdateBusinessList,
55
- handleUpdateProducts
55
+ handleUpdateProducts,
56
+ brandId
56
57
  } = props
57
58
 
58
59
  const screenHeight = Dimensions.get('window').height;
@@ -75,6 +76,8 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
75
76
  { text: t('PICKUP_TIME', 'Pickup time'), value: 'pickup_time' }
76
77
  ]
77
78
 
79
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
80
+
78
81
  const priceList = [
79
82
  { level: '1', content: '$' },
80
83
  { level: '2', content: '$$' },
@@ -96,7 +99,7 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
96
99
  width: '100%'
97
100
  },
98
101
  searchInput: {
99
- fontSize: 10,
102
+ fontSize: 12,
100
103
  },
101
104
  productsContainer: {
102
105
  marginTop: 20
@@ -188,7 +191,8 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
188
191
 
189
192
  const isInteger = (val: any) => Number.isInteger(Number(val)) && !!val
190
193
 
191
- const onProductClick = (business: any, categoryId: any, productId: any) => {
194
+
195
+ const onProductClick = (business: any, categoryId: any, productId: any, product: any) => {
192
196
  if (!isInteger(business?.id) ||
193
197
  !isInteger(categoryId) ||
194
198
  !isInteger(productId) ||
@@ -196,17 +200,20 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
196
200
  showToast(ToastType.error, t('NOT_AVAILABLE', 'Not Available'))
197
201
  return
198
202
  }
199
-
203
+ const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {}
204
+ const productAddedToCartLength = currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === productId ? Cproduct?.quantity : 0) }, 0) || 0
200
205
  navigation.navigate('ProductDetails', {
201
206
  isRedirect: 'business',
202
207
  businessId: business?.id,
203
208
  categoryId: categoryId,
204
209
  productId: productId,
210
+ product: product,
205
211
  business: {
206
212
  store: business.slug,
207
213
  header: business.header,
208
214
  logo: business.logo,
209
- }
215
+ },
216
+ productAddedToCartLength
210
217
  })
211
218
  }
212
219
 
@@ -226,17 +233,23 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
226
233
  }, [isFocused])
227
234
 
228
235
  return (
229
- <BContainer>
236
+ <BContainer
237
+ style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
238
+ >
230
239
  <SearchWrapper>
231
240
  <SearchBar
232
241
  lazyLoad
233
- inputStyle={{ ...styles.searchInput, ...Platform.OS === 'ios' ? {} : { paddingBottom: 4 } }}
234
- placeholder={`${t('SEARCH_BUSINESSES', 'Search Businesses')} / ${t('TYPE_AT_LEAST_3_CHARACTERS', 'type at least 3 characters')}`}
242
+ {...(isChewLayout && { height: 55 })}
243
+ inputStyle={{ ...styles.searchInput }}
244
+ placeholder={t('SEARCH_BUSINESSES', 'Search Businesses')}
235
245
  onSearch={(val: string) => handleChangeTermValue(val)}
236
246
  value={termValue}
237
247
  iconCustomRight={<AntDesignIcon name='filter' size={16} style={{ bottom: 2 }} onPress={() => handleOpenfilters()} />}
238
248
  />
239
249
  </SearchWrapper>
250
+ <OText size={12} lineHeight={20} color={theme.colors.textThird} mLeft={5}>
251
+ {t('TYPE_AT_LEAST_3_CHARACTERS', 'Type at least 3 characters')}
252
+ </OText>
240
253
  {
241
254
  noResults && (
242
255
  <View>
@@ -253,26 +266,41 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
253
266
  onNavigationRedirect={onNavigationRedirect}
254
267
  BusinessControllerSkeletons={BusinessControllerSkeletons}
255
268
  businessPaginationProps={paginationProps}
269
+ franchiseId={brandId}
270
+ hideBackBtn
271
+ titleStyle={{
272
+ paddingHorizontal: 0,
273
+ marginTop: 0,
274
+ marginLeft: 0
275
+ }}
256
276
  />
257
277
  )}
258
278
 
259
- <OptionTitle isBusinessesSearchList={!!businessesSearchList}>
260
- <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={10}>
261
- {t('BUSINESSES', 'Businesses')}
262
- </OText>
263
- </OptionTitle>
264
- <ScrollView horizontal>
279
+ {businessesSearchList.businesses?.length > 0 && (
280
+ <OptionTitle isBusinessesSearchList={!!businessesSearchList}>
281
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={10}>
282
+ {t('BUSINESSES', 'Businesses')}
283
+ </OText>
284
+ </OptionTitle>
285
+ )}
286
+ <ScrollView horizontal showsHorizontalScrollIndicator={false}>
265
287
  {businessesSearchList.businesses?.length > 0 && businessesSearchList.businesses.map((business: any, i: number) => (
266
- <BusinessController
288
+ <View
267
289
  key={business.id}
268
- business={business}
269
- isBusinessOpen={business.open}
270
- enableIntersection={false}
271
- handleCustomClick={() => onBusinessClick(business)}
272
- handleUpdateBusinessList={handleUpdateBusinessList}
273
- orderType={orderState?.options?.type}
274
- style={{ width: screenWidth - 120, marginRight: (businessesSearchList.loading || i !== businessesSearchList.businesses?.length - 1) ? 20 : 0 }}
275
- />
290
+ style={{
291
+ width: screenWidth - 120,
292
+ marginRight: (businessesSearchList.loading || i !== businessesSearchList.businesses?.length - 1) ? 20 : 0
293
+ }}
294
+ >
295
+ <BusinessController
296
+ business={business}
297
+ isBusinessOpen={business.open}
298
+ enableIntersection={false}
299
+ handleCustomClick={() => onBusinessClick(business)}
300
+ handleUpdateBusinessList={handleUpdateBusinessList}
301
+ orderType={orderState?.options?.type}
302
+ />
303
+ </View>
276
304
  ))}
277
305
  {!businessesSearchList.loading && paginationProps?.totalPages && paginationProps?.currentPage < paginationProps?.totalPages && (
278
306
  <LoadMoreBusinessContainer>
@@ -341,7 +369,7 @@ export const BusinessListingSearchUI = (props: BusinessSearchParams) => {
341
369
  product={product}
342
370
  enableIntersection={false}
343
371
  businessId={business?.id}
344
- onProductClick={(product: any) => onProductClick(business, category?.id, product?.id)}
372
+ onProductClick={(product: any) => onProductClick(business, category?.id, product?.id, product)}
345
373
  productAddedToCartLength={0}
346
374
  handleUpdateProducts={(productId: number, changes: any) => handleUpdateProducts(productId, category?.id, business?.id, changes)}
347
375
  style={{ width: screenWidth - 80, maxWidth: screenWidth - 80, marginRight: 20 }}