ordering-ui-react-native 0.17.98 → 0.17.99-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 (224) hide show
  1. package/package.json +9 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +0 -20
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +3 -2
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +7 -2
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +36 -26
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +163 -123
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  21. package/themes/business/src/components/LoginForm/index.tsx +5 -2
  22. package/themes/business/src/components/MapView/index.tsx +14 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +22 -94
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +123 -96
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +209 -15
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +84 -37
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +87 -66
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +200 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  35. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  36. package/themes/business/src/components/OrdersOption/index.tsx +60 -47
  37. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  38. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  39. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +21 -29
  40. package/themes/business/src/components/PreviousOrders/OrderList.tsx +93 -0
  41. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  42. package/themes/business/src/components/PreviousOrders/index.tsx +198 -221
  43. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  44. package/themes/business/src/components/ProductItemAccordion/index.tsx +7 -1
  45. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  46. package/themes/business/src/components/StoresList/index.tsx +3 -4
  47. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  48. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  49. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  50. package/themes/business/src/components/shared/OModal.tsx +16 -9
  51. package/themes/business/src/types/index.tsx +24 -10
  52. package/themes/business/src/utils/index.tsx +29 -2
  53. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  55. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  57. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  58. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -5
  59. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  60. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  61. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  62. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  63. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  64. package/themes/original/index.tsx +7 -3
  65. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  66. package/themes/original/src/components/AddressForm/index.tsx +33 -15
  67. package/themes/original/src/components/AddressList/index.tsx +5 -8
  68. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  69. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  70. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +72 -36
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  73. package/themes/original/src/components/BusinessController/index.tsx +35 -44
  74. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  75. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  76. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  77. package/themes/original/src/components/BusinessInformation/index.tsx +140 -85
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +21 -23
  79. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  80. package/themes/original/src/components/BusinessListingSearch/index.tsx +346 -340
  81. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  82. package/themes/original/src/components/BusinessPreorder/index.tsx +105 -22
  83. package/themes/original/src/components/BusinessPreorder/styles.tsx +14 -0
  84. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  85. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  86. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  87. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  88. package/themes/original/src/components/BusinessProductsListing/index.tsx +137 -32
  89. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -3
  90. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  91. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  92. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  94. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +37 -404
  95. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  96. package/themes/original/src/components/Cart/index.tsx +49 -47
  97. package/themes/original/src/components/CartContent/index.tsx +99 -38
  98. package/themes/original/src/components/CartContent/styles.tsx +6 -6
  99. package/themes/original/src/components/Checkout/index.tsx +323 -42
  100. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  101. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  102. package/themes/original/src/components/DatePicker/index.tsx +17 -0
  103. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  104. package/themes/original/src/components/DriverTips/index.tsx +12 -4
  105. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  106. package/themes/original/src/components/Favorite/index.tsx +1 -5
  107. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  108. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +42 -5
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +84 -8
  112. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  113. package/themes/original/src/components/GoogleMap/index.tsx +63 -7
  114. package/themes/original/src/components/Home/index.tsx +13 -4
  115. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  116. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  117. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  118. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  119. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  120. package/themes/original/src/components/MessageListing/index.tsx +9 -2
  121. package/themes/original/src/components/Messages/index.tsx +15 -4
  122. package/themes/original/src/components/MomentOption/index.tsx +44 -39
  123. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  124. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +161 -49
  125. package/themes/original/src/components/MultiCheckout/index.tsx +346 -68
  126. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  127. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -1
  128. package/themes/original/src/components/MyOrders/index.tsx +12 -1
  129. package/themes/original/src/components/NavBar/index.tsx +20 -13
  130. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  131. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  132. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  133. package/themes/original/src/components/OrderDetails/index.tsx +50 -38
  134. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  135. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  136. package/themes/original/src/components/OrderProgress/index.tsx +34 -25
  137. package/themes/original/src/components/OrderSummary/index.tsx +62 -57
  138. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  139. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +13 -13
  140. package/themes/original/src/components/OrdersOption/index.tsx +43 -20
  141. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  142. package/themes/original/src/components/PageBanner/index.tsx +65 -29
  143. package/themes/original/src/components/PageBanner/styles.tsx +0 -3
  144. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  145. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  146. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  147. package/themes/original/src/components/PaymentOptions/index.tsx +100 -34
  148. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  149. package/themes/original/src/components/ProductForm/ActionButton.tsx +120 -0
  150. package/themes/original/src/components/ProductForm/index.tsx +65 -34
  151. package/themes/original/src/components/ProductForm/styles.tsx +3 -3
  152. package/themes/original/src/components/ProductItemAccordion/index.tsx +8 -6
  153. package/themes/original/src/components/ProductOptionSubOption/index.tsx +49 -20
  154. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +10 -9
  155. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  156. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  157. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  158. package/themes/original/src/components/Promotions/index.tsx +2 -2
  159. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  160. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  161. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  162. package/themes/original/src/components/ServiceForm/index.tsx +40 -20
  163. package/themes/original/src/components/SignupForm/index.tsx +27 -16
  164. package/themes/original/src/components/SingleOrderCard/index.tsx +44 -20
  165. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  166. package/themes/original/src/components/SingleProductCard/index.tsx +13 -10
  167. package/themes/original/src/components/SingleProductCard/styles.tsx +8 -3
  168. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  169. package/themes/original/src/components/StripeCardsList/index.tsx +61 -5
  170. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  171. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  172. package/themes/original/src/components/UpsellingProducts/index.tsx +3 -8
  173. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  174. package/themes/original/src/components/UserFormDetails/index.tsx +84 -19
  175. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  176. package/themes/original/src/components/UserProfile/index.tsx +7 -25
  177. package/themes/original/src/components/UserProfileForm/index.tsx +30 -31
  178. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  179. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  180. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  181. package/themes/original/src/components/Wallets/index.tsx +51 -61
  182. package/themes/original/src/components/Wallets/styles.tsx +2 -4
  183. package/themes/original/src/components/shared/OButton.tsx +3 -3
  184. package/themes/original/src/components/shared/OInput.tsx +4 -5
  185. package/themes/original/src/components/shared/OModal.tsx +3 -3
  186. package/themes/original/src/types/index.tsx +30 -7
  187. package/themes/original/src/utils/index.tsx +180 -13
  188. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  189. package/src/navigators/BottomNavigator.tsx +0 -117
  190. package/src/navigators/CheckoutNavigator.tsx +0 -66
  191. package/src/navigators/HomeNavigator.tsx +0 -202
  192. package/src/navigators/NavigationRef.tsx +0 -7
  193. package/src/navigators/RootNavigator.tsx +0 -269
  194. package/src/pages/Account.tsx +0 -34
  195. package/src/pages/AddressForm.tsx +0 -62
  196. package/src/pages/AddressList.tsx +0 -24
  197. package/src/pages/BusinessProductsList.tsx +0 -81
  198. package/src/pages/BusinessesListing.tsx +0 -43
  199. package/src/pages/CartList.tsx +0 -49
  200. package/src/pages/Checkout.tsx +0 -101
  201. package/src/pages/ForgotPassword.tsx +0 -24
  202. package/src/pages/Help.tsx +0 -23
  203. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  204. package/src/pages/HelpGuide.tsx +0 -23
  205. package/src/pages/HelpOrder.tsx +0 -23
  206. package/src/pages/Home.tsx +0 -36
  207. package/src/pages/IntroductoryTutorial.tsx +0 -170
  208. package/src/pages/Login.tsx +0 -47
  209. package/src/pages/MomentOption.tsx +0 -30
  210. package/src/pages/MultiCheckout.tsx +0 -31
  211. package/src/pages/MultiOrdersDetails.tsx +0 -27
  212. package/src/pages/MyOrders.tsx +0 -40
  213. package/src/pages/NetworkError.tsx +0 -24
  214. package/src/pages/NotFound.tsx +0 -22
  215. package/src/pages/OrderDetails.tsx +0 -25
  216. package/src/pages/ProductDetails.tsx +0 -55
  217. package/src/pages/Profile.tsx +0 -36
  218. package/src/pages/ReviewDriver.tsx +0 -30
  219. package/src/pages/ReviewOrder.tsx +0 -32
  220. package/src/pages/ReviewProducts.tsx +0 -30
  221. package/src/pages/Sessions.tsx +0 -22
  222. package/src/pages/Signup.tsx +0 -53
  223. package/src/pages/SpinnerLoader.tsx +0 -10
  224. package/src/pages/Splash.tsx +0 -21
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useRef } from 'react';
2
2
  import { ActivityIndicator, View } from 'react-native'
3
3
  import {
4
4
  Cart,
@@ -20,12 +20,11 @@ import {
20
20
 
21
21
  import { ProductItemAccordion } from '../ProductItemAccordion';
22
22
  import { CouponControl } from '../CouponControl';
23
- import { OInput, OModal, OText } from '../shared';
23
+ import { OInput, OModal, OText, OAlert } from '../shared';
24
24
  import { verifyDecimals } from '../../utils';
25
25
  import AntIcon from 'react-native-vector-icons/AntDesign'
26
26
  import { TaxInformation } from '../TaxInformation';
27
27
  import { TouchableOpacity } from 'react-native';
28
- import { OAlert } from '../../../../../src/components/shared'
29
28
  import { MomentOption } from '../MomentOption';
30
29
 
31
30
  const OrderSummaryUI = (props: any) => {
@@ -46,6 +45,8 @@ const OrderSummaryUI = (props: any) => {
46
45
  preorderMaximumDays,
47
46
  preorderMinimumDays,
48
47
  cateringTypes,
48
+ hideDeliveryFee,
49
+ loyaltyRewardRate,
49
50
  maxDate
50
51
  } = props;
51
52
 
@@ -55,9 +56,34 @@ const OrderSummaryUI = (props: any) => {
55
56
  const [orderState] = useOrder();
56
57
  const [{ parsePrice, parseNumber }] = useUtils();
57
58
  const [validationFields] = useValidationFields();
59
+ const commentRef = useRef()
58
60
  const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null, type: '' })
59
- const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
60
61
  const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled;
62
+ const hideCartComments = !validationFields?.fields?.checkout?.comments?.enabled
63
+
64
+ const cart = orderState?.carts?.[`businessId:${props.cart.business_id}`]
65
+
66
+ const walletName: any = {
67
+ cash: {
68
+ name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
69
+ },
70
+ credit_point: {
71
+ name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
72
+ }
73
+ }
74
+
75
+ const getIncludedTaxes = () => {
76
+ if (cart?.taxes === null || !cart?.taxes) {
77
+ return cart?.business?.tax_type === 1 ? cart?.tax : 0
78
+ } else {
79
+ return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
80
+ return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
81
+ }, 0)
82
+ }
83
+ }
84
+
85
+ const clearAmount = (value: any) => parseFloat((Math.trunc(value * 100) / 100).toFixed(configs.format_number_decimal_length?.value ?? 2))
86
+ const loyaltyRewardValue = clearAmount((cart?.subtotal + getIncludedTaxes()) * loyaltyRewardRate)
61
87
 
62
88
  const handleDeleteClick = (product: any) => {
63
89
  removeProduct(product, cart)
@@ -75,41 +101,20 @@ const OrderSummaryUI = (props: any) => {
75
101
  })
76
102
  }
77
103
 
78
- const getIncludedTaxes = () => {
79
- if (cart?.taxes === null || !cart?.taxes) {
80
- return cart.business.tax_type === 1 ? cart?.tax : 0
81
- } else {
82
- return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
83
- return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
84
- }, 0)
85
- }
86
- }
87
-
88
104
  const getIncludedTaxesDiscounts = () => {
89
105
  return cart?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
90
106
  }
91
107
 
92
- const onRemoveOffer = (id: number) => {
93
- setConfirm({
94
- open: true,
95
- content: [t('QUESTION_DELETE_OFFER', 'Are you sure that you want to delete the offer?')],
96
- title: t('OFFER', 'Offer'),
97
- handleOnAccept: () => {
98
- setConfirm({ ...confirm, open: false })
99
- handleRemoveOfferClick(id)
100
- }
101
- })
102
- }
103
-
104
- const cart = orderState?.carts?.[`businessId:${props.cart.business_id}`]
105
-
106
- const walletName: any = {
107
- cash: {
108
- name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
109
- },
110
- credit_point: {
111
- name: t('PAY_WITH_CREDITS_POINTS_WALLET', 'Pay with Credit Points Wallet'),
112
- }
108
+ const OfferAlert = ({ offerId }: any) => {
109
+ return (
110
+ <OAlert
111
+ title={t('OFFER', 'Offer')}
112
+ message={t('QUESTION_DELETE_OFFER', 'Are you sure that you want to delete the offer?')}
113
+ onAccept={() => handleRemoveOfferClick(offerId)}
114
+ >
115
+ <AntIcon style={{ marginLeft: 3 }} name='closecircle' size={16} color={theme.colors.primary} />
116
+ </OAlert>
117
+ )
113
118
  }
114
119
 
115
120
  return (
@@ -165,9 +170,9 @@ const OrderSummaryUI = (props: any) => {
165
170
  <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_1' })}>
166
171
  <AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
167
172
  </TouchableOpacity>
168
- <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
169
- <AntIcon name='closecircle' size={16} color={theme.colors.primary} />
170
- </TouchableOpacity>
173
+ {!!offer?.id && (
174
+ <OfferAlert offerId={offer?.id} />
175
+ )}
171
176
  </OSRow>
172
177
  <OText size={12}>
173
178
  - {parsePrice(offer?.summary?.discount)}
@@ -205,8 +210,8 @@ const OrderSummaryUI = (props: any) => {
205
210
  ))
206
211
  }
207
212
  {
208
- cart?.fees?.length > 0 && cart?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0)).map((fee: any) => (
209
- <OSTable key={fee?.id}>
213
+ cart?.fees?.length > 0 && cart?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0)).map((fee: any, i: number) => (
214
+ <OSTable key={fee?.id + i}>
210
215
  <OSRow>
211
216
  <OText size={12} numberOfLines={1}>
212
217
  {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
@@ -231,9 +236,9 @@ const OrderSummaryUI = (props: any) => {
231
236
  <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_3' })}>
232
237
  <AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
233
238
  </TouchableOpacity>
234
- <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
235
- <AntIcon name='closecircle' size={16} color={theme.colors.primary} />
236
- </TouchableOpacity>
239
+ {!!offer?.id && (
240
+ <OfferAlert offerId={offer?.id} />
241
+ )}
237
242
  </OSRow>
238
243
  <OText size={12}>
239
244
  - {parsePrice(offer?.summary?.discount)}
@@ -241,10 +246,10 @@ const OrderSummaryUI = (props: any) => {
241
246
  </OSTable>
242
247
  ))
243
248
  }
244
- {orderState?.options?.type === 1 && cart?.delivery_price > 0 && (
249
+ {orderState?.options?.type === 1 && !hideDeliveryFee && (
245
250
  <OSTable>
246
251
  <OText size={12}>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
247
- <OText size={12}>{parsePrice(cart?.delivery_price)}</OText>
252
+ <OText size={12}>{parsePrice(cart?.delivery_price_with_discount)}</OText>
248
253
  </OSTable>
249
254
  )}
250
255
  {
@@ -258,9 +263,9 @@ const OrderSummaryUI = (props: any) => {
258
263
  <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => setOpenTaxModal({ open: true, data: offer, type: 'offer_target_2' })}>
259
264
  <AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
260
265
  </TouchableOpacity>
261
- <TouchableOpacity style={{ marginLeft: 3 }} onPress={() => onRemoveOffer(offer?.id)}>
262
- <AntIcon name='closecircle' size={16} color={theme.colors.primary} />
263
- </TouchableOpacity>
266
+ {!!offer?.id && (
267
+ <OfferAlert offerId={offer?.id} />
268
+ )}
264
269
  </OSRow>
265
270
  <OText size={12}>
266
271
  - {parsePrice(offer?.summary?.discount)}
@@ -310,9 +315,16 @@ const OrderSummaryUI = (props: any) => {
310
315
  {parsePrice(cart?.balance >= 0 ? cart?.balance : 0)}
311
316
  </OText>
312
317
  </OSTable>
318
+ {!!loyaltyRewardValue && (
319
+ <OSTable style={{ justifyContent: 'flex-end' }}>
320
+ <OText size={12} color={theme.colors.textNormal}>
321
+ {t('REWARD_LOYALTY_POINT', 'Reward :amount: on loyalty points').replace(':amount:', loyaltyRewardValue)}
322
+ </OText>
323
+ </OSTable>
324
+ )}
313
325
  </View>
314
326
  )}
315
- {cart?.business_id && cart?.status !== 2 && (
327
+ {cart?.business_id && cart?.status !== 2 && !hideCartComments && (
316
328
  <OSTable>
317
329
  <View style={{ width: '100%', marginTop: 20 }}>
318
330
  <OText size={12}>{t('COMMENTS', 'Comments')}</OText>
@@ -330,6 +342,7 @@ const OrderSummaryUI = (props: any) => {
330
342
  marginTop: 10,
331
343
  borderRadius: 8
332
344
  }}
345
+ forwardRef={commentRef}
333
346
  multiline
334
347
  />
335
348
  {commentState?.loading && (
@@ -375,14 +388,6 @@ const OrderSummaryUI = (props: any) => {
375
388
  products={cart?.products}
376
389
  />
377
390
  </OModal>
378
- <OAlert
379
- open={confirm.open}
380
- title={confirm.title}
381
- content={confirm.content}
382
- onAccept={confirm.handleOnAccept}
383
- onCancel={() => setConfirm({ ...confirm, open: false, title: null })}
384
- onClose={() => setConfirm({ ...confirm, open: false, title: null })}
385
- />
386
391
  </>
387
392
  )}
388
393
  </OSContainer>
@@ -31,14 +31,12 @@ const OrderTypeSelectorUI = (props: OrderTypeSelectParams) => {
31
31
  const [orderState] = useOrder();
32
32
  const [, t] = useLanguage();
33
33
  const _orderTypes = orderTypes.filter((type: any) => configTypes?.includes(type.value));
34
- const orderTypeTitle = (type : string) => theme?.header?.components?.order_types?.components?.[type]?.components?.title
35
- const orderTypeDescription = (type : string) => theme?.header?.components?.order_types?.components?.[type]?.components?.description
36
- const orderTypeCallAction = (type : string) => theme?.header?.components?.order_types?.components?.[type]?.components?.call_to_action
34
+
37
35
  const items = _orderTypes.map((type) => {
38
36
  return {
39
37
  value: type.value,
40
- label: orderTypeTitle(type.value) || t(type.content, type.content),
41
- description: orderTypeDescription(type.value) || t(type.description, 'Lorem ipsum dolor sit amet, consectetur.')
38
+ label: t(type.content, type.content),
39
+ description: t(type.description, 'Lorem ipsum dolor sit amet, consectetur.')
42
40
  }
43
41
  })
44
42
 
@@ -102,6 +100,7 @@ const OrderTypeSelectorUI = (props: OrderTypeSelectParams) => {
102
100
  style={{ paddingBottom: 0 }}
103
101
  title={t('HOW_WILL_YOU_DELIVERY_TYPE', 'How will your order type?')}
104
102
  titleAlign={'center'}
103
+ titleStyle={{ fontSize: 14 }}
105
104
  noMargin
106
105
  />
107
106
  {
@@ -115,7 +114,7 @@ const OrderTypeSelectorUI = (props: OrderTypeSelectParams) => {
115
114
  <OText size={12} lineHeight={18} color={theme.colors.white} weight={Platform.OS === 'android' ? 'bold' : '600'}>{item?.label}</OText>
116
115
  <OText size={10} lineHeight={15} color={theme.colors.white}>{item?.description}</OText>
117
116
  <View style={{ flexDirection: 'row', alignItems: 'center' }}>
118
- <OText size={10} lineHeight={15} color={theme.colors.white}>{orderTypeCallAction(item?.value) || t('START_MY_ORDER', 'Start my order')}</OText>
117
+ <OText size={10} lineHeight={15} color={theme.colors.white}>{t('START_MY_ORDER', 'Start my order')}</OText>
119
118
  <AntDesignIcon name='arrowleft' size={26} color={theme.colors.white} style={{ transform: [{ rotate: '180deg' }], marginStart: 4 }} />
120
119
  </View>
121
120
  </MaskCont>
@@ -23,21 +23,21 @@ export const PreviousProductsOrdered = (props: PreviousProductsOrderedParams) =>
23
23
  },
24
24
  });
25
25
 
26
- const ProductList = ({ style }: any) => {
26
+ const ProductList = () => {
27
27
  return (
28
28
  <>
29
29
  {products?.filter((product : any) => product?.business?.available)?.map((product: any) => (
30
- <SingleProductCard
31
- key={product?.id}
32
- isProductId
33
- isSoldOut={(product.inventoried && !product.quantity)}
34
- product={product}
35
- businessId={product?.business?.id}
36
- onProductClick={onProductClick}
37
- style={style}
38
- productAddedToCartLength={0}
39
- handleUpdateProducts={handleUpdateProducts}
40
- />
30
+ <SingleProductCard
31
+ key={product?.id}
32
+ isProductId
33
+ isSoldOut={(product.inventoried && !product.quantity)}
34
+ product={product}
35
+ businessId={product?.business?.id}
36
+ onProductClick={onProductClick}
37
+ style={{ width: windowWidth - (products?.length > 1 ? 120 : 80), marginRight: 20 }}
38
+ productAddedToCartLength={0}
39
+ handleUpdateProducts={handleUpdateProducts}
40
+ />
41
41
  ))}
42
42
  </>
43
43
  )
@@ -45,7 +45,7 @@ export const PreviousProductsOrdered = (props: PreviousProductsOrderedParams) =>
45
45
  return (
46
46
  <ScrollView horizontal={isBusinessesSearchList} style={styles.container} showsVerticalScrollIndicator={false}>
47
47
  {isBusinessesSearchList ? (
48
- <ProductList style={{ width: windowWidth - 80, marginRight: 20 }} />
48
+ <ProductList />
49
49
  ) : (
50
50
  <ListWrapper isBusinessesSearchList={isBusinessesSearchList}>
51
51
  <ProductList />
@@ -10,6 +10,7 @@ import { PreviousProductsOrdered } from './PreviousProductsOrdered'
10
10
  import { OptionTitle, NoOrdersWrapper } from './styles'
11
11
  import { OrdersOptionParams } from '../../types'
12
12
  import { _setStoreData } from '../../providers/StoreUtil';
13
+ import { NotFoundSource } from '../NotFoundSource';
13
14
  import {
14
15
  Placeholder,
15
16
  PlaceholderLine,
@@ -17,7 +18,7 @@ import {
17
18
  } from "rn-placeholder";
18
19
 
19
20
  import { View, ScrollView } from 'react-native'
20
- import { getOrderStatus } from '../../utils'
21
+ import { getOrderStatus, flatArray } from '../../utils'
21
22
 
22
23
  const OrdersOptionUI = (props: OrdersOptionParams) => {
23
24
  const {
@@ -50,7 +51,8 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
50
51
  businesses,
51
52
  businessPaginationProps,
52
53
  handleUpdateProducts,
53
- handleUpdateBusinesses
54
+ handleUpdateBusinesses,
55
+ businessId
54
56
  } = props
55
57
 
56
58
  const theme = useTheme();
@@ -98,7 +100,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
98
100
  return false
99
101
  })
100
102
  setOrders(orders)
101
- }, [_orders?.length])
103
+ }, [JSON.stringify(_orders)])
102
104
 
103
105
  const onProductClick = (product: any) => {
104
106
  if (product?.product_id && product?.category_id && product?.businessId &&
@@ -120,6 +122,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
120
122
  }
121
123
 
122
124
  useEffect(() => {
125
+ if (reorderState?.loading) return
123
126
  const _businessId = 'businessId:' + reorderState?.result?.business_id
124
127
  if (reorderState?.error) {
125
128
  if (reorderState?.result?.business_id) {
@@ -127,21 +130,39 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
127
130
  navigation.navigate('Business', { store: reorderState?.result?.business?.slug })
128
131
  }
129
132
  }
130
- if (!reorderState?.error && reorderState.loading === false && reorderState?.result?.business_id) {
133
+ if (!reorderState?.error && !reorderState.loading && reorderState?.result?.business_id) {
131
134
  const cartProducts = carts?.[_businessId]?.products
132
- const available = cartProducts.every((product: any) => product.valid === true)
133
- const orderProducts = orders.find((order: any) => order?.id === reorderState?.result?.orderId)?.products
134
135
 
135
- if (available && reorderState?.result?.uuid && (cartProducts?.length === orderProducts?.length)) {
136
- onNavigationRedirect && onNavigationRedirect('CheckoutNavigator', { cartUuid: reorderState?.result.uuid })
136
+ const available = cartProducts.every((product: any) => product.valid)
137
+ const orderProducts = orders.find(
138
+ (order: any) => Array.isArray(order?.id)
139
+ ? order?.id?.includes(reorderState?.result?.orderId)
140
+ : order?.id === reorderState?.result?.orderId
141
+ )?.products
142
+
143
+ const productsFlatten = orderProducts?.length && flatArray(orderProducts)?.filter(product => product?.order_id === reorderState?.result?.orderId)
144
+
145
+ if (available && reorderState?.result?.uuid && (cartProducts?.length === productsFlatten?.length)) {
146
+ const multiOrders = flatArray(orderProducts)?.map(product => product.order_id)
147
+ const params = multiOrders?.length > 1
148
+ ? { screen: 'MultiCheckout', checkCarts: true }
149
+ : { cartUuid: reorderState?.result.uuid }
150
+
151
+ onNavigationRedirect && onNavigationRedirect('CheckoutNavigator', params)
137
152
  } else {
138
153
  _setStoreData('adjust-cart-products', JSON.stringify(_businessId))
139
- cartProducts?.length !== orderProducts?.length && _setStoreData('already-removed', JSON.stringify('removed'))
154
+ cartProducts?.length !== productsFlatten?.length && _setStoreData('already-removed', JSON.stringify('removed'))
140
155
  navigation.navigate('Business', { store: reorderState?.result?.business?.slug })
141
156
  }
142
157
  }
143
158
  }, [reorderState])
144
159
 
160
+ useEffect(() => {
161
+ if (reorderState?.error) {
162
+ showToast(ToastType.Error, reorderState?.result)
163
+ }
164
+ }, [reorderState])
165
+
145
166
  useFocusEffect(
146
167
  React.useCallback(() => {
147
168
  if (!businessesSearchList) {
@@ -166,6 +187,8 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
166
187
  setOrdersLength && setOrdersLength({ ...ordersLength, activeOrdersLength: updateOrders?.length })
167
188
  } else if (!preOrders) {
168
189
  setOrdersLength && setOrdersLength({ ...ordersLength, previousOrdersLength: updateOrders?.length })
190
+ } else {
191
+ setOrdersLength && setOrdersLength({ ...ordersLength, preordersLength: updateOrders?.length })
169
192
  }
170
193
  }, [_orders, activeOrders, preOrders])
171
194
 
@@ -178,21 +201,21 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
178
201
 
179
202
  return (
180
203
  <>
181
- {!loading && ordersLength.activeOrdersLength === 0 && ordersLength.previousOrdersLength === 0 && !activeOrders && (
204
+ {!loading && ordersLength.activeOrdersLength === 0 && ordersLength.previousOrdersLength === 0 && ordersLength?.preordersLength === 0 && !activeOrders && !preOrders && (
182
205
  <NoOrdersWrapper>
183
- <OText size={14} numberOfLines={1}>
184
- {t('YOU_DONT_HAVE_ORDERS', 'You don\'t have any orders')}
185
- </OText>
186
- <OButton
187
- text={t('ORDER_NOW', 'Order now')}
188
- onClick={() => onNavigationRedirect && onNavigationRedirect('BusinessList')}
189
- textStyle={{ color: 'white', fontSize: 14 }}
190
- style={{ borderRadius: 7.6, marginBottom: 10, marginTop: 10, height: 44, paddingLeft: 10, paddingRight: 10 }}
206
+ <NotFoundSource
207
+ hideImage
208
+ btnStyle={{ borderRadius: 8 }}
209
+ content={t('YOU_DONT_HAVE_ORDERS', 'You don\'t have any orders')}
210
+ btnTitle={t('ORDER_NOW', 'Order now')}
211
+ onClickButton={() => onNavigationRedirect && (businessId ? onNavigationRedirect('Business') : onNavigationRedirect('BusinessList'))}
191
212
  />
192
-
193
213
  </NoOrdersWrapper>
194
214
  )}
195
- {((ordersLength?.activeOrdersLength > 0 && activeOrders) || (ordersLength?.previousOrdersLength > 0 && !activeOrders)) && (
215
+ {((ordersLength?.activeOrdersLength > 0 && activeOrders) ||
216
+ (ordersLength?.previousOrdersLength > 0 && !activeOrders && !preOrders) ||
217
+ (ordersLength?.preordersLength > 0 && preOrders)
218
+ ) && (
196
219
  <>
197
220
  {((titleContent && ((isBusiness && businessOrderIds?.length > 0) || isProducts)) || !titleContent) && (
198
221
  <OptionTitle titleContent={!!titleContent} isBusinessesSearchList={!!businessesSearchList}>
@@ -10,5 +10,5 @@ export const OptionTitle = styled.View`
10
10
  export const NoOrdersWrapper = styled.View`
11
11
  flex-direction: column;
12
12
  align-items: center;
13
- margin-top: 50px;
13
+ margin-top: 60px;
14
14
  `
@@ -1,5 +1,5 @@
1
- import React, { useRef } from 'react'
2
- import { useUtils, PageBanner as PageBannerController } from 'ordering-components/native'
1
+ import React, { useEffect, useState, useRef } from 'react'
2
+ import { useUtils, useEvent, PageBanner as PageBannerController } from 'ordering-components/native'
3
3
  import { View, StyleSheet, Dimensions, TouchableOpacity } from 'react-native'
4
4
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
5
5
  import Carousel from 'react-native-snap-carousel'
@@ -16,7 +16,10 @@ const PageBannerUI = (props: any) => {
16
16
 
17
17
  const theme = useTheme();
18
18
  const [{ optimizeImage }] = useUtils();
19
- const carouselRef = useRef(null)
19
+ const [events] = useEvent()
20
+ const carouselRef = useRef<any>(null)
21
+ const [currentIndex, setCurrentIndex] = useState(0)
22
+ const [viewedBanner, setViewedBanner] = useState<any>(null)
20
23
 
21
24
  const windowWidth = Dimensions.get('window').width;
22
25
 
@@ -41,10 +44,11 @@ const PageBannerUI = (props: any) => {
41
44
  })
42
45
 
43
46
  const onRedirect = (route: string, params?: any) => {
44
- navigation.navigate(route, params)
47
+ navigation.push(route, params)
45
48
  }
46
49
 
47
- const handleGoToPage = (action: any) => {
50
+ const handleGoToPage = (item: any) => {
51
+ const action = item.action
48
52
  if (!action?.url) return
49
53
  let slug
50
54
  if (action.type === 'business') {
@@ -59,15 +63,22 @@ const PageBannerUI = (props: any) => {
59
63
  businessSlug: slug,
60
64
  businessId: action.business_id,
61
65
  categoryId: action.category_id,
62
- productId: action.product_id
66
+ productId: action.product_id,
67
+ isRedirect: 'business',
68
+ business: {
69
+ store: slug
70
+ }
63
71
  })
64
72
  }
73
+ const clickedBanner = pageBannerState.result.find(banner => banner.id === item?.banner_id)
74
+ events.emit('promotion_clicked', clickedBanner)
65
75
  }
66
76
 
67
77
  const renderItem = ({ item, index }) => {
68
78
  return (
69
79
  <TouchableOpacity
70
- onPress={() => handleGoToPage(item.action)}
80
+ activeOpacity={1}
81
+ onPress={() => handleGoToPage(item)}
71
82
  >
72
83
  <View style={styles.sliderWrapper}>
73
84
  <FastImage
@@ -80,6 +91,24 @@ const PageBannerUI = (props: any) => {
80
91
  )
81
92
  }
82
93
 
94
+ const updateIndex = () => {
95
+ setCurrentIndex(carouselRef?.current?.currentIndex)
96
+ }
97
+
98
+ useEffect(() => {
99
+ if (pageBannerState.loading) return
100
+ if (pageBannerState.banner?.items && pageBannerState.banner?.items.length > 0) {
101
+ const bannerId = pageBannerState.banner.items[currentIndex]?.banner_id
102
+ if (pageBannerState.result && bannerId) {
103
+ const _viewedBanner = pageBannerState.result.find(banner => banner.id === bannerId)
104
+ if (_viewedBanner?.id !== viewedBanner?.id) {
105
+ setViewedBanner(_viewedBanner)
106
+ events.emit('promotion_viewed', _viewedBanner)
107
+ }
108
+ }
109
+ }
110
+ }, [pageBannerState.loading, currentIndex, viewedBanner])
111
+
83
112
  return (
84
113
  <>
85
114
  {pageBannerState.loading ? (
@@ -97,37 +126,44 @@ const PageBannerUI = (props: any) => {
97
126
  <>
98
127
  {pageBannerState.banner?.items && pageBannerState.banner?.items.length > 0 && (
99
128
  <PageBannerWrapper>
100
- <TouchableOpacity
101
- style={[styles.swiperButton, { left: 25 }]}
102
- onPress={() => carouselRef.current.snapToPrev()}
103
- >
104
- <IconAntDesign
105
- name="caretleft"
106
- color={theme.colors.white}
107
- size={13}
108
- />
109
- </TouchableOpacity>
110
- <TouchableOpacity
111
- style={[styles.swiperButton, { right: 25 }]}
112
- onPress={() => carouselRef.current.snapToNext()}
113
- >
114
- <IconAntDesign
115
- name="caretright"
116
- color={theme.colors.white}
117
- size={13}
118
- />
119
- </TouchableOpacity>
129
+ {pageBannerState.banner?.items.length > 1 && (
130
+ <>
131
+ <TouchableOpacity
132
+ activeOpacity={1}
133
+ style={[styles.swiperButton, { left: 25 }]}
134
+ onPress={() => carouselRef.current.snapToPrev()}
135
+ >
136
+ <IconAntDesign
137
+ name="caretleft"
138
+ color={theme.colors.white}
139
+ size={13}
140
+ />
141
+ </TouchableOpacity>
142
+ <TouchableOpacity
143
+ activeOpacity={1}
144
+ style={[styles.swiperButton, { right: 25 }]}
145
+ onPress={() => carouselRef.current.snapToNext()}
146
+ >
147
+ <IconAntDesign
148
+ name="caretright"
149
+ color={theme.colors.white}
150
+ size={13}
151
+ />
152
+ </TouchableOpacity>
153
+ </>
154
+ )}
120
155
  <Carousel
121
156
  ref={carouselRef}
122
157
  loop={pageBannerState.banner?.items.length > 1}
123
158
  data={pageBannerState.banner?.items}
124
159
  renderItem={renderItem}
125
- sliderWidth={windowWidth - 80}
126
- itemWidth={windowWidth - 80}
160
+ sliderWidth={windowWidth}
161
+ itemWidth={windowWidth}
127
162
  inactiveSlideScale={1}
128
163
  pagingEnabled
129
164
  removeClippedSubviews={false}
130
165
  inactiveSlideOpacity={1}
166
+ onSnapToItem={updateIndex}
131
167
  />
132
168
  </PageBannerWrapper>
133
169
  )}
@@ -1,10 +1,7 @@
1
1
  import styled from 'styled-components/native'
2
2
 
3
3
  export const PageBannerWrapper = styled.View`
4
- margin-horizontal: 40px;
5
- border-radius: 8px;
6
4
  overflow: hidden;
7
- margin-vertical: 30px;
8
5
  position: relative;
9
6
  flex-direction: row;
10
7
  align-items: center;