ordering-ui-react-native 0.17.34 → 0.17.35-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 (211) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/OrderCreating/index.tsx +1 -21
  5. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  6. package/src/components/StripeMethodForm/index.tsx +108 -79
  7. package/src/components/VerifyPhone/styles.tsx +1 -2
  8. package/src/components/shared/OToast.tsx +4 -4
  9. package/src/types/index.tsx +5 -0
  10. package/src/utils/index.tsx +7 -1
  11. package/themes/business/index.tsx +2 -0
  12. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  13. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  14. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  15. package/themes/business/src/components/Chat/index.tsx +118 -107
  16. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  17. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  18. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  19. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  20. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  21. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +43 -50
  24. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  25. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +90 -47
  26. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  27. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  28. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  29. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  30. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  31. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  33. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  34. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  35. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  36. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  37. package/themes/business/src/components/ReviewCustomer/index.tsx +41 -24
  38. package/themes/business/src/components/StoresList/index.tsx +2 -2
  39. package/themes/business/src/components/shared/OLink.tsx +33 -13
  40. package/themes/business/src/components/shared/OModal.tsx +16 -9
  41. package/themes/business/src/components/shared/OText.tsx +8 -2
  42. package/themes/business/src/types/index.tsx +32 -2
  43. package/themes/business/src/utils/index.tsx +44 -1
  44. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  46. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  47. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  48. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  49. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  50. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  51. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  52. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  53. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  54. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  55. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  56. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  57. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  58. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  61. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  62. package/themes/kiosk/src/types/index.d.ts +13 -0
  63. package/themes/kiosk/src/utils/index.tsx +15 -0
  64. package/themes/original/index.tsx +6 -0
  65. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  66. package/themes/original/src/components/AddressForm/index.tsx +85 -49
  67. package/themes/original/src/components/AddressList/index.tsx +26 -21
  68. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  69. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  70. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +159 -90
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -7
  73. package/themes/original/src/components/BusinessController/index.tsx +154 -68
  74. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  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 +10 -31
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +23 -22
  79. package/themes/original/src/components/BusinessListingSearch/index.tsx +350 -323
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +97 -16
  81. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  82. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  83. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  84. package/themes/original/src/components/BusinessProductsListing/index.tsx +684 -524
  85. package/themes/original/src/components/BusinessProductsListing/styles.tsx +4 -6
  86. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  87. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  88. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +105 -78
  89. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  90. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  91. package/themes/original/src/components/Cart/index.tsx +102 -69
  92. package/themes/original/src/components/CartContent/index.tsx +115 -19
  93. package/themes/original/src/components/CartContent/styles.tsx +15 -1
  94. package/themes/original/src/components/Checkout/index.tsx +331 -177
  95. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  96. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  97. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  98. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  99. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  100. package/themes/original/src/components/Favorite/index.tsx +7 -4
  101. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  102. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  103. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  104. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  105. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  106. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  107. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  108. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  112. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  113. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  114. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  115. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  116. package/themes/original/src/components/Help/index.tsx +8 -8
  117. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  118. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  119. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  120. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  121. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  122. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  123. package/themes/original/src/components/Home/index.tsx +13 -4
  124. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  125. package/themes/original/src/components/LoginForm/Otp/index.tsx +139 -75
  126. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  127. package/themes/original/src/components/LoginForm/index.tsx +71 -28
  128. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  129. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  130. package/themes/original/src/components/Messages/index.tsx +32 -10
  131. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  132. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  133. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +197 -116
  134. package/themes/original/src/components/MultiCheckout/index.tsx +298 -88
  135. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  136. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  137. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  138. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  139. package/themes/original/src/components/MyOrders/index.tsx +53 -51
  140. package/themes/original/src/components/NavBar/index.tsx +18 -18
  141. package/themes/original/src/components/Notifications/index.tsx +46 -50
  142. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  143. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  144. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  145. package/themes/original/src/components/OrderDetails/index.tsx +199 -359
  146. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  147. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  148. package/themes/original/src/components/OrderProgress/index.tsx +93 -114
  149. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  150. package/themes/original/src/components/OrderSummary/index.tsx +87 -59
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  153. package/themes/original/src/components/OrdersOption/index.tsx +63 -56
  154. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  155. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  156. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  157. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  158. package/themes/original/src/components/PaymentOptions/index.tsx +34 -6
  159. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  160. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  161. package/themes/original/src/components/ProductForm/index.tsx +223 -232
  162. package/themes/original/src/components/ProductForm/styles.tsx +5 -8
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +59 -29
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +19 -11
  165. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  166. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  167. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  168. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  169. package/themes/original/src/components/Promotions/index.tsx +234 -220
  170. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  171. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  172. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  173. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  174. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  175. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  176. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  177. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  178. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  179. package/themes/original/src/components/ServiceForm/index.tsx +74 -19
  180. package/themes/original/src/components/Sessions/index.tsx +11 -8
  181. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  182. package/themes/original/src/components/SignupForm/index.tsx +42 -19
  183. package/themes/original/src/components/SingleOrderCard/index.tsx +156 -65
  184. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -9
  185. package/themes/original/src/components/SingleProductCard/index.tsx +100 -56
  186. package/themes/original/src/components/SingleProductCard/styles.tsx +22 -13
  187. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  188. package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
  189. package/themes/original/src/components/StripeElementsForm/index.tsx +28 -15
  190. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  191. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  192. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  193. package/themes/original/src/components/UserFormDetails/index.tsx +47 -7
  194. package/themes/original/src/components/UserProfile/index.tsx +5 -7
  195. package/themes/original/src/components/UserProfileForm/index.tsx +25 -28
  196. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  197. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  198. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  199. package/themes/original/src/components/Wallets/index.tsx +79 -36
  200. package/themes/original/src/components/Wallets/styles.tsx +5 -4
  201. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  202. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  203. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  204. package/themes/original/src/components/shared/OButton.tsx +6 -2
  205. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  206. package/themes/original/src/components/shared/OInput.tsx +16 -2
  207. package/themes/original/src/components/shared/OModal.tsx +3 -3
  208. package/themes/original/src/layouts/Container.tsx +13 -9
  209. package/themes/original/src/types/index.tsx +37 -9
  210. package/themes/original/src/utils/index.tsx +364 -58
  211. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -3,7 +3,6 @@ import { OrderList, useLanguage, useOrder, ToastType, useToast } from 'ordering-
3
3
  import { useTheme } from 'styled-components/native';
4
4
  import { useFocusEffect } from '@react-navigation/native'
5
5
  import { OText, OButton } from '../shared'
6
- import { NotFoundSource } from '../NotFoundSource'
7
6
  import { ActiveOrders } from '../ActiveOrders'
8
7
  import { PreviousOrders } from '../PreviousOrders'
9
8
  import { PreviousBusinessOrdered } from './PreviousBusinessOrdered'
@@ -18,6 +17,7 @@ import {
18
17
  } from "rn-placeholder";
19
18
 
20
19
  import { View, ScrollView } from 'react-native'
20
+ import { getOrderStatus, flatArray } from '../../utils'
21
21
 
22
22
  const OrdersOptionUI = (props: OrdersOptionParams) => {
23
23
  const {
@@ -60,46 +60,45 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
60
60
  const [, { showToast }] = useToast()
61
61
  const { loading, error, orders: values } = orderList
62
62
  const [businessLoading, setBusinessLoading] = useState(true)
63
+ const [orders, setOrders] = useState([])
63
64
 
64
65
  const imageFails = activeOrders
65
66
  ? theme.images.general.emptyActiveOrders
66
67
  : theme.images.general.emptyPastOrders
67
68
 
68
- const orders = customArray || values || []
69
+ const _orders = customArray || values || []
70
+ const uniqueOrders: any = []
69
71
 
70
- const getOrderStatus = (s: string) => {
71
- const status = parseInt(s)
72
- const orderStatus = [
73
- { key: 0, value: t('PENDING', 'Pending') },
74
- { key: 1, value: t('COMPLETED', 'Completed') },
75
- { key: 2, value: t('REJECTED', 'Rejected') },
76
- { key: 3, value: t('DRIVER_IN_BUSINESS', 'Driver in business') },
77
- { key: 4, value: t('PREPARATION_COMPLETED', 'Preparation Completed') },
78
- { key: 5, value: t('REJECTED_BY_BUSINESS', 'Rejected by business') },
79
- { key: 6, value: t('REJECTED_BY_DRIVER', 'Rejected by Driver') },
80
- { key: 7, value: t('ACCEPTED_BY_BUSINESS', 'Accepted by business') },
81
- { key: 8, value: t('ACCEPTED_BY_DRIVER', 'Accepted by driver') },
82
- { key: 9, value: t('PICK_UP_COMPLETED_BY_DRIVER', 'Pick up completed by driver') },
83
- { key: 10, value: t('PICK_UP_FAILED_BY_DRIVER', 'Pick up Failed by driver') },
84
- { key: 11, value: t('DELIVERY_COMPLETED_BY_DRIVER', 'Delivery completed by driver') },
85
- { key: 12, value: t('DELIVERY_FAILED_BY_DRIVER', 'Delivery Failed by driver') },
86
- { key: 13, value: t('PREORDER', 'PreOrder') },
87
- { key: 14, value: t('ORDER_NOT_READY', 'Order not ready') },
88
- { key: 15, value: t('ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER', 'Order picked up completed by customer') },
89
- { key: 16, value: t('CANCELLED_BY_CUSTOMER', 'Cancelled by customer') },
90
- { key: 17, value: t('ORDER_NOT_PICKEDUP_BY_CUSTOMER', 'Order not picked up by customer') },
91
- { key: 18, value: t('DRIVER_ALMOST_ARRIVED_TO_BUSINESS', 'Driver almost arrived to business') },
92
- { key: 19, value: t('DRIVER_ALMOST_ARRIVED_TO_CUSTOMER', 'Driver almost arrived to customer') },
93
- { key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', 'Customer almost arrived to business') },
94
- { key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', 'Customer arrived to business') },
95
- { key: 22, value: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver') },
96
- { key: 23, value: t('ORDER_DRIVER_ON_WAY', 'Driver on way') }
97
- ]
98
-
99
- const objectStatus = orderStatus.find((o) => o.key === status)
100
-
101
- return objectStatus && objectStatus
102
- }
72
+ useEffect(() => {
73
+ if (loading || error) return
74
+ const ordersReduced = _orders.map((order: any) => order?.cart_group_id
75
+ ? _orders
76
+ .filter((_order: any) => _order?.cart_group_id === order?.cart_group_id)
77
+ .map((_o: any, _: any, _ordersList: any) => {
78
+ const obj = {
79
+ ..._o,
80
+ id: _ordersList.map(o => o.id),
81
+ review: _o.review,
82
+ user_review: _o.user_review,
83
+ total: _ordersList.reduce((acc: any, o: any) => acc + o.summary.total, 0),
84
+ business: _ordersList.map((o: any) => o.business),
85
+ business_id: _ordersList.map((o: any) => o.business_id),
86
+ products: _ordersList.map((o: any) => o.products)
87
+ }
88
+ return obj
89
+ }).find((o: any) => o)
90
+ : order)
91
+ const orders = ordersReduced?.filter((order: any) => {
92
+ if (!order?.cart_group_id) return true
93
+ const isDuplicate = uniqueOrders.includes(order?.cart_group_id)
94
+ if (!isDuplicate) {
95
+ uniqueOrders.push(order?.cart_group_id)
96
+ return true
97
+ }
98
+ return false
99
+ })
100
+ setOrders(orders)
101
+ }, [_orders?.length])
103
102
 
104
103
  const onProductClick = (product: any) => {
105
104
  if (product?.product_id && product?.category_id && product?.businessId &&
@@ -121,6 +120,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
121
120
  }
122
121
 
123
122
  useEffect(() => {
123
+ if (reorderState?.loading) return
124
124
  const _businessId = 'businessId:' + reorderState?.result?.business_id
125
125
  if (reorderState?.error) {
126
126
  if (reorderState?.result?.business_id) {
@@ -128,21 +128,39 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
128
128
  navigation.navigate('Business', { store: reorderState?.result?.business?.slug })
129
129
  }
130
130
  }
131
- if (!reorderState?.error && reorderState.loading === false && reorderState?.result?.business_id) {
131
+ if (!reorderState?.error && !reorderState.loading && reorderState?.result?.business_id) {
132
132
  const cartProducts = carts?.[_businessId]?.products
133
- const available = cartProducts.every((product: any) => product.valid === true)
134
- const orderProducts = orders.find((order: any) => order?.id === reorderState?.result?.orderId)?.products
135
133
 
136
- if (available && reorderState?.result?.uuid && (cartProducts?.length === orderProducts?.length)) {
137
- onNavigationRedirect && onNavigationRedirect('CheckoutNavigator', { cartUuid: reorderState?.result.uuid })
134
+ const available = cartProducts.every((product: any) => product.valid)
135
+ const orderProducts = orders.find(
136
+ (order: any) => Array.isArray(order?.id)
137
+ ? order?.id?.includes(reorderState?.result?.orderId)
138
+ : order?.id === reorderState?.result?.orderId
139
+ )?.products
140
+
141
+ const productsFlatten = orderProducts?.length && flatArray(orderProducts)?.filter(product => product?.order_id === reorderState?.result?.orderId)
142
+
143
+ if (available && reorderState?.result?.uuid && (cartProducts?.length === productsFlatten?.length)) {
144
+ const multiOrders = flatArray(orderProducts)?.map(product => product.order_id)
145
+ const params = multiOrders?.length > 1
146
+ ? { screen: 'MultiCheckout', checkCarts: true }
147
+ : { cartUuid: reorderState?.result.uuid }
148
+
149
+ onNavigationRedirect && onNavigationRedirect('CheckoutNavigator', params)
138
150
  } else {
139
151
  _setStoreData('adjust-cart-products', JSON.stringify(_businessId))
140
- cartProducts?.length !== orderProducts?.length && _setStoreData('already-removed', JSON.stringify('removed'))
152
+ cartProducts?.length !== productsFlatten?.length && _setStoreData('already-removed', JSON.stringify('removed'))
141
153
  navigation.navigate('Business', { store: reorderState?.result?.business?.slug })
142
154
  }
143
155
  }
144
156
  }, [reorderState])
145
157
 
158
+ useEffect(() => {
159
+ if (reorderState?.error) {
160
+ showToast(ToastType.Error, reorderState?.result)
161
+ }
162
+ }, [reorderState])
163
+
146
164
  useFocusEffect(
147
165
  React.useCallback(() => {
148
166
  if (!businessesSearchList) {
@@ -161,14 +179,14 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
161
179
  useEffect(() => {
162
180
  if (loading) return
163
181
 
164
- const updateOrders = orders.filter((order: any) => orderStatus.includes(order.status))
182
+ const updateOrders = _orders.filter((order: any) => orderStatus.includes(order.status))
165
183
 
166
184
  if (activeOrders) {
167
185
  setOrdersLength && setOrdersLength({ ...ordersLength, activeOrdersLength: updateOrders?.length })
168
186
  } else if (!preOrders) {
169
187
  setOrdersLength && setOrdersLength({ ...ordersLength, previousOrdersLength: updateOrders?.length })
170
188
  }
171
- }, [orders, activeOrders, preOrders])
189
+ }, [_orders, activeOrders, preOrders])
172
190
 
173
191
  useEffect(() => {
174
192
  if (refreshOrders) {
@@ -193,7 +211,7 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
193
211
 
194
212
  </NoOrdersWrapper>
195
213
  )}
196
- {(ordersLength?.activeOrdersLength > 0 || ordersLength?.previousOrdersLength > 0) && (
214
+ {((ordersLength?.activeOrdersLength > 0 && activeOrders) || (ordersLength?.previousOrdersLength > 0 && !activeOrders)) && (
197
215
  <>
198
216
  {((titleContent && ((isBusiness && businessOrderIds?.length > 0) || isProducts)) || !titleContent) && (
199
217
  <OptionTitle titleContent={!!titleContent} isBusinessesSearchList={!!businessesSearchList}>
@@ -206,20 +224,9 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
206
224
  </OText>
207
225
  </OptionTitle>
208
226
  )}
209
-
210
- {!(ordersLength?.activeOrdersLength === 0 && ordersLength?.previousOrdersLength === 0) &&
211
- !loading &&
212
- orders.filter((order: any) => orderStatus.includes(order.status)).length === 0 &&
213
- (
214
- <NotFoundSource
215
- content={t('NO_RESULTS_FOUND', 'Sorry, no results found')}
216
- image={imageFails}
217
- conditioned
218
- />
219
- )}
220
227
  </>
221
228
  )}
222
- {isBusiness && !!businessesSearchList && businesses?.loading && (
229
+ {isBusiness && !!businessesSearchList && businesses?.loading && (
223
230
  <ScrollView horizontal>
224
231
  <BusinessControllerSkeletons paginationProps={businessPaginationProps} />
225
232
  </ScrollView>
@@ -0,0 +1,171 @@
1
+ import React, { useEffect, useState, useRef } from 'react'
2
+ import { useUtils, useEvent, PageBanner as PageBannerController } from 'ordering-components/native'
3
+ import { View, StyleSheet, Dimensions, TouchableOpacity } from 'react-native'
4
+ import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
5
+ import Carousel from 'react-native-snap-carousel'
6
+ import FastImage from 'react-native-fast-image';
7
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
8
+ import { useTheme } from 'styled-components/native';
9
+ import { PageBannerWrapper } from './styles'
10
+
11
+ const PageBannerUI = (props: any) => {
12
+ const {
13
+ pageBannerState,
14
+ navigation
15
+ } = props
16
+
17
+ const theme = useTheme();
18
+ const [{ optimizeImage }] = useUtils();
19
+ const [events] = useEvent()
20
+ const carouselRef = useRef<any>(null)
21
+ const [currentIndex, setCurrentIndex] = useState(0)
22
+ const [viewedBanner, setViewedBanner] = useState<any>(null)
23
+
24
+ const windowWidth = Dimensions.get('window').width;
25
+
26
+ const styles = StyleSheet.create({
27
+ mainSwiper: {
28
+ height: 300,
29
+ },
30
+ swiperButton: {
31
+ position: 'absolute',
32
+ zIndex: 100,
33
+ alignItems: 'center',
34
+ justifyContent: 'center',
35
+ width: 32,
36
+ height: 32,
37
+ borderRadius: 16,
38
+ backgroundColor: 'rgba(208,208,208,0.5)'
39
+ },
40
+ sliderWrapper: {
41
+ width: '100%',
42
+ height: 300
43
+ }
44
+ })
45
+
46
+ const onRedirect = (route: string, params?: any) => {
47
+ navigation.push(route, params)
48
+ }
49
+
50
+ const handleGoToPage = (item: any) => {
51
+ const action = item.action
52
+ if (!action?.url) return
53
+ let slug
54
+ if (action.type === 'business') {
55
+ slug = action.url.split('store/')[1]
56
+ onRedirect('Business', {
57
+ store: slug
58
+ })
59
+ }
60
+ if (action.type === 'product') {
61
+ slug = action.url.split('store/')[1]?.split('?')[0]
62
+ onRedirect('ProductDetails', {
63
+ businessSlug: slug,
64
+ businessId: action.business_id,
65
+ categoryId: action.category_id,
66
+ productId: action.product_id
67
+ })
68
+ }
69
+ const clickedBanner = pageBannerState.result.find(banner => banner.id === item?.banner_id)
70
+ events.emit('promotion_clicked', clickedBanner)
71
+ }
72
+
73
+ const renderItem = ({ item, index }) => {
74
+ return (
75
+ <TouchableOpacity
76
+ onPress={() => handleGoToPage(item)}
77
+ >
78
+ <View style={styles.sliderWrapper}>
79
+ <FastImage
80
+ style={{ height: '100%', width: '100%' }}
81
+ resizeMode='cover'
82
+ source={{ uri: optimizeImage(item.url, 'h_300,c_limit') }}
83
+ />
84
+ </View>
85
+ </TouchableOpacity>
86
+ )
87
+ }
88
+
89
+ const updateIndex = () => {
90
+ setCurrentIndex(carouselRef?.current?.currentIndex)
91
+ }
92
+
93
+ useEffect(() => {
94
+ if (pageBannerState.loading) return
95
+ if (pageBannerState.banner?.items && pageBannerState.banner?.items.length > 0) {
96
+ const bannerId = pageBannerState.banner.items[currentIndex]?.banner_id
97
+ if (pageBannerState.result && bannerId) {
98
+ const _viewedBanner = pageBannerState.result.find(banner => banner.id === bannerId)
99
+ if (_viewedBanner?.id !== viewedBanner?.id) {
100
+ setViewedBanner(_viewedBanner)
101
+ events.emit('promotion_viewed', _viewedBanner)
102
+ }
103
+ }
104
+ }
105
+ }, [pageBannerState.loading, currentIndex, viewedBanner])
106
+
107
+ return (
108
+ <>
109
+ {pageBannerState.loading ? (
110
+ <PageBannerWrapper>
111
+ <Placeholder
112
+ Animation={Fade}
113
+ >
114
+ <PlaceholderLine
115
+ height={300}
116
+ style={{ marginBottom: 20, borderRadius: 8 }}
117
+ />
118
+ </Placeholder>
119
+ </PageBannerWrapper>
120
+ ) : (
121
+ <>
122
+ {pageBannerState.banner?.items && pageBannerState.banner?.items.length > 0 && (
123
+ <PageBannerWrapper>
124
+ <TouchableOpacity
125
+ style={[styles.swiperButton, { left: 25 }]}
126
+ onPress={() => carouselRef.current.snapToPrev()}
127
+ >
128
+ <IconAntDesign
129
+ name="caretleft"
130
+ color={theme.colors.white}
131
+ size={13}
132
+ />
133
+ </TouchableOpacity>
134
+ <TouchableOpacity
135
+ style={[styles.swiperButton, { right: 25 }]}
136
+ onPress={() => carouselRef.current.snapToNext()}
137
+ >
138
+ <IconAntDesign
139
+ name="caretright"
140
+ color={theme.colors.white}
141
+ size={13}
142
+ />
143
+ </TouchableOpacity>
144
+ <Carousel
145
+ ref={carouselRef}
146
+ loop={pageBannerState.banner?.items.length > 1}
147
+ data={pageBannerState.banner?.items}
148
+ renderItem={renderItem}
149
+ sliderWidth={windowWidth - 80}
150
+ itemWidth={windowWidth - 80}
151
+ inactiveSlideScale={1}
152
+ pagingEnabled
153
+ removeClippedSubviews={false}
154
+ inactiveSlideOpacity={1}
155
+ onSnapToItem={updateIndex}
156
+ />
157
+ </PageBannerWrapper>
158
+ )}
159
+ </>
160
+ )}
161
+ </>
162
+ )
163
+ }
164
+
165
+ export const PageBanner = (props: any) => {
166
+ const pageBannerProps = {
167
+ ...props,
168
+ UIComponent: PageBannerUI
169
+ }
170
+ return <PageBannerController {...pageBannerProps} />
171
+ }
@@ -0,0 +1,11 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const PageBannerWrapper = styled.View`
4
+ margin-horizontal: 40px;
5
+ border-radius: 8px;
6
+ overflow: hidden;
7
+ margin-vertical: 30px;
8
+ position: relative;
9
+ flex-direction: row;
10
+ align-items: center;
11
+ `
@@ -39,7 +39,7 @@ export const OSItem = styled.View`
39
39
  flex-direction: row;
40
40
  justify-content: space-between;
41
41
  align-items: center;
42
- padding: 20px 0px;
42
+ padding: 10px 0px;
43
43
  `;
44
44
 
45
45
  export const OSItemContent = styled.TouchableOpacity`
@@ -45,7 +45,7 @@ const PaymentOptionWalletUI = (props: any) => {
45
45
  new Array(walletsState.result?.length).fill(false)
46
46
  );
47
47
 
48
- const creditBalance: any = (wallet: any) => ` = ${parsePrice(wallet.balance / wallet.redemption_rate, { isTruncable: true })}`
48
+ const creditBalance: any = (wallet: any) => ` = ${parsePrice(wallet.balance / wallet.redemption_rate)}`
49
49
 
50
50
  const walletName: any = {
51
51
  cash: {
@@ -87,65 +87,65 @@ const PaymentOptionWalletUI = (props: any) => {
87
87
  {!walletsState.loading &&
88
88
  !walletsState.error &&
89
89
  walletsState.result?.length > 0 &&
90
- (
91
- <>
92
- {walletsState.result?.map((wallet: any, idx: any) => wallet.valid && wallet.balance >= 0 && walletName[wallet.type]?.isActive && (
93
- <Container
94
- key={wallet.id}
95
- isBottomBorder={idx === walletsState.result?.filter((wallet: any) => wallet.valid)?.length - 1}
96
- onPress={() => handleOnChange(idx, wallet)}
97
- disabled={(cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0}
98
- >
99
- <SectionLeft>
100
- {checkedState[idx] ? (
101
- <MaterialCommunityIcons
102
- name="checkbox-marked"
103
- size={25}
104
- color={theme.colors.primary}
105
- />
106
- ) : (
107
- <MaterialCommunityIcons
108
- name="checkbox-blank-outline"
109
- size={25}
110
- color={theme.colors.disabled}
111
- />
112
- )}
113
- <View style={{ alignItems: 'baseline', marginLeft: 5 }}>
114
- <View>
115
- <OText
116
- style={((cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0) ? {
117
- color: theme.colors.disabled
118
- } : {}}
119
- >
120
- {walletName[wallet.type]?.name}
121
- </OText>
122
- </View>
90
+ (
91
+ <>
92
+ {walletsState.result?.map((wallet: any, idx: any) => wallet.valid && wallet.balance >= 0 && walletName[wallet.type]?.isActive && (
93
+ <Container
94
+ key={wallet.id}
95
+ isBottomBorder={idx === walletsState.result?.filter((wallet: any) => wallet.valid)?.length - 1}
96
+ onPress={() => handleOnChange(idx, wallet)}
97
+ disabled={(cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0}
98
+ >
99
+ <SectionLeft>
100
+ {checkedState[idx] ? (
101
+ <MaterialCommunityIcons
102
+ name="checkbox-marked"
103
+ size={25}
104
+ color={theme.colors.primary}
105
+ />
106
+ ) : (
107
+ <MaterialCommunityIcons
108
+ name="checkbox-blank-outline"
109
+ size={25}
110
+ color={theme.colors.disabled}
111
+ />
112
+ )}
113
+ <View style={{ alignItems: 'baseline', marginLeft: 5 }}>
114
+ <View>
115
+ <OText
116
+ style={((cart?.balance === 0 && !checkedState[idx]) || wallet.balance === 0) ?{
117
+ color: theme.colors.disabled
118
+ } : {}}
119
+ >
120
+ {walletName[wallet.type]?.name}
121
+ </OText>
123
122
  </View>
124
- </SectionLeft>
125
-
126
- <View style={{ maxWidth: '35%', alignItems: 'flex-end' }}>
127
- {wallet.type === 'cash' && (
128
- <OText>
129
- {parsePrice(wallet?.balance, { isTruncable: true })}
123
+ </View>
124
+ </SectionLeft>
125
+
126
+ <View style={{maxWidth: '35%', alignItems: 'flex-end' }}>
127
+ {wallet.type === 'cash' && (
128
+ <OText>
129
+ {parsePrice(wallet?.balance)}
130
+ </OText>
131
+ )}
132
+ {wallet.type === 'credit_point' && (
133
+ <OText>
134
+ <OText color={theme.colors.primary} weight='bold'>
135
+ {`${wallet?.balance} ${t('POINTS', 'Points')}`}
130
136
  </OText>
131
- )}
132
- {wallet.type === 'credit_point' && (
133
137
  <OText>
134
- <OText color={theme.colors.primary} weight='bold'>
135
- {`${wallet?.balance} ${t('POINTS', 'Points')}`}
136
- </OText>
137
- <OText>
138
- {wallet?.balance > 0
139
- ? creditBalance(wallet)
140
- : null}
141
- </OText>
138
+ {wallet?.balance > 0
139
+ ? creditBalance(wallet)
140
+ : null}
142
141
  </OText>
143
- )}
144
- </View>
145
- </Container>
146
- ))}
147
- </>
148
- )}
142
+ </OText>
143
+ )}
144
+ </View>
145
+ </Container>
146
+ ))}
147
+ </>
148
+ )}
149
149
 
150
150
  {walletsState?.loading && (
151
151
  <View>
@@ -34,7 +34,7 @@ import { useApplePay } from '@stripe/stripe-react-native';
34
34
 
35
35
  const stripeOptions: any = ['stripe_direct', 'stripe', 'stripe_connect']
36
36
  const methodsPay = ['google_pay', 'apple_pay']
37
- const stripeDirectMethods = ['stripe_direct', ...methodsPay]
37
+ const stripeDirectMethods = ['stripe_direct']
38
38
  // const stripeRedirectOptions = [
39
39
  // { name: 'Bancontact', value: 'bancontact' },
40
40
  // { name: 'Alipay', value: 'alipay' },
@@ -43,6 +43,7 @@ const stripeDirectMethods = ['stripe_direct', ...methodsPay]
43
43
  // ]
44
44
 
45
45
  const webViewPaymentGateway: any = ['paypal', 'square']
46
+ const multiCheckoutMethods = ['global_google_pay', 'global_apple_pay']
46
47
 
47
48
  const PaymentOptionsUI = (props: any) => {
48
49
  const {
@@ -59,7 +60,11 @@ const PaymentOptionsUI = (props: any) => {
59
60
  isOpenMethod,
60
61
  handlePaymentMethodClickCustom,
61
62
  handlePlaceOrder,
62
- merchantId
63
+ merchantId,
64
+ setMethodPaySupported,
65
+ placeByMethodPay,
66
+ methodPaySupported,
67
+ setPlaceByMethodPay
63
68
  } = props
64
69
 
65
70
  const theme = useTheme();
@@ -75,7 +80,7 @@ const PaymentOptionsUI = (props: any) => {
75
80
  case 'paypal':
76
81
  return theme.images.general.paypal
77
82
  case 'stripe':
78
- return theme.images.general.stripe
83
+ return theme.images.general.creditCard
79
84
  case 'stripe_direct':
80
85
  return theme.images.general.stripecc
81
86
  case 'stripe_connect':
@@ -187,6 +192,7 @@ const PaymentOptionsUI = (props: any) => {
187
192
  }
188
193
 
189
194
  const excludeIds: any = [32]; //exclude paypal & connect & redirect
195
+ const filterMethodsPay = (gateway : string) => Platform.OS === 'ios' ? gateway !== 'google_pay' : gateway !== 'apple_pay'
190
196
 
191
197
  return (
192
198
  <PMContainer>
@@ -195,7 +201,11 @@ const PaymentOptionsUI = (props: any) => {
195
201
  horizontal
196
202
  showsHorizontalScrollIndicator={false}
197
203
  // data={paymethodsList.paymethods.sort((a: any, b: any) => a.id - b.id)}
198
- data={paymethodsList.paymethods.sort((a: any, b: any) => a.id - b.id).filter((p: any) => !excludeIds.includes(p.id))}
204
+ data={paymethodsList.paymethods.sort((a: any, b: any) => a.id - b.id)
205
+ .filter((p: any) =>
206
+ !multiCheckoutMethods.includes(p.gateway) &&
207
+ filterMethodsPay(p.gateway) &&
208
+ !excludeIds.includes(p.id))}
199
209
  renderItem={renderPaymethods}
200
210
  keyExtractor={(paymethod: any) => paymethod?.id?.toString?.()}
201
211
  />
@@ -287,14 +297,32 @@ const PaymentOptionsUI = (props: any) => {
287
297
  <StripeCardsList
288
298
  paymethod={isOpenMethod?.paymethod}
289
299
  businessId={props.businessId}
290
- publicKey={isOpenMethod?.paymethod?.credentials.publishable}
300
+ publicKey={isOpenMethod?.paymethod?.credentials?.publishable}
291
301
  payType={paymethodsList?.name}
292
302
  onSelectCard={handlePaymethodDataChange}
293
303
  onNavigationRedirect={onNavigationRedirect}
294
304
  onCancel={() => handlePaymethodClick(null)}
305
+ setAddCardOpen={() => setAddCardOpen({ ...addCardOpen, stripe: true })}
295
306
  />
296
307
  </View>
297
308
  )}
309
+ {/* Google pay, Apple pay */}
310
+ {methodsPay.includes(isOpenMethod?.paymethod?.gateway) && (
311
+ <StripeElementsForm
312
+ cart={cart}
313
+ paymethod={isOpenMethod?.paymethod?.gateway}
314
+ methodsPay={methodsPay}
315
+ businessId={props.businessId}
316
+ publicKey={isOpenMethod?.paymethod?.credentials?.publishable || isOpenMethod?.paymethod?.credentials?.publishable_key}
317
+ handleSource={handlePaymethodDataChange}
318
+ onCancel={() => handlePaymethodClick(null)}
319
+ merchantId={merchantId}
320
+ setMethodPaySupported={setMethodPaySupported}
321
+ methodPaySupported={methodPaySupported}
322
+ placeByMethodPay={placeByMethodPay}
323
+ setPlaceByMethodPay={setPlaceByMethodPay}
324
+ />
325
+ )}
298
326
 
299
327
  <OModal
300
328
  entireModal
@@ -319,7 +347,7 @@ const PaymentOptionsUI = (props: any) => {
319
347
  </KeyboardAvoidingView>
320
348
  </OModal>
321
349
 
322
- {/* Stripe direct, Google pay, Apple pay */}
350
+ {/* Stripe direct */}
323
351
  <OModal
324
352
  entireModal
325
353
  title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
@@ -7,7 +7,7 @@ import { Wrapper } from './styles'
7
7
 
8
8
  import { PhoneInputParams } from '../../types';
9
9
  import { OIcon, OText } from '../shared';
10
- import { transformCountryCode } from '../../utils'
10
+ import { findExitingCode, transformCountryCode } from '../../utils'
11
11
 
12
12
  export const PhoneInputNumber = (props: PhoneInputParams) => {
13
13
  const {
@@ -113,7 +113,7 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
113
113
  !isNaN(defaultCode)
114
114
  ? transformCountryCode(defaultCode)
115
115
  : defaultCode
116
- : configs?.default_country_code?.value}
116
+ : findExitingCode(configs?.default_country_code?.value?.toUpperCase())}
117
117
  onChangeFormattedText={(text: string) => handleChangeNumber(text)}
118
118
  withDarkTheme
119
119
  onChangeCountry={(country) => changeCountry?.(country)}
@@ -124,7 +124,7 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
124
124
  flagButtonStyle={flagStyle}
125
125
  countryPickerButtonStyle={{ ...style.countryBtn, ...boxStyle ? boxStyle : {} }}
126
126
  placeholder={t('PHONE_NUMBER', 'Phone Number')}
127
- textInputProps={{ autoCompleteType: 'tel', ref: forwardRef, ...textInputProps }}
127
+ textInputProps={{ keyboardType: 'number-pad', autoCompleteType: 'tel', textContentType: 'telephoneNumber', dataDetectorTypes: 'phoneNumber', ref: forwardRef, ...textInputProps }}
128
128
  containerStyle={{ width: '100%' }}
129
129
  renderDropdownImage={noDropIcon ? <View /> : <OIcon src={theme.images.general.arrow_down} width={13} color={'#B1BCCC'}></OIcon>}
130
130
  />