ordering-ui-react-native 0.16.64 → 0.16.65-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 (207) hide show
  1. package/package.json +6 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/BusinessInformation/index.tsx +19 -4
  6. package/src/components/BusinessInformation/styles.tsx +2 -2
  7. package/src/components/BusinessProductsList/index.tsx +10 -10
  8. package/src/components/BusinessesListing/index.tsx +1 -1
  9. package/src/components/Checkout/index.tsx +2 -1
  10. package/src/components/LanguageSelector/index.tsx +21 -16
  11. package/src/components/Messages/index.tsx +2 -2
  12. package/src/components/NotificationSetting/index.tsx +85 -0
  13. package/src/components/OrdersOption/index.tsx +54 -56
  14. package/src/components/PaymentOptions/index.tsx +298 -345
  15. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  16. package/src/components/SingleProductReview/index.tsx +7 -4
  17. package/src/components/StripeElementsForm/index.tsx +25 -16
  18. package/src/components/VerifyPhone/styles.tsx +1 -2
  19. package/src/components/shared/OBottomPopup.tsx +6 -2
  20. package/src/components/shared/OToast.tsx +4 -4
  21. package/src/index.tsx +2 -0
  22. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  23. package/src/utils/index.tsx +2 -1
  24. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +260 -238
  25. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  26. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  27. package/themes/business/src/components/Chat/index.tsx +31 -31
  28. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  29. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  30. package/themes/business/src/components/MapView/index.tsx +14 -3
  31. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  32. package/themes/business/src/components/NewOrderNotification/index.tsx +31 -41
  33. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +70 -43
  34. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +3 -3
  35. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  36. package/themes/business/src/components/OrdersOption/index.tsx +74 -76
  37. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  38. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  39. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  40. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  41. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  42. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  43. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  44. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  45. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  46. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  47. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  48. package/themes/business/src/components/PreviousOrders/index.tsx +440 -245
  49. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  50. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  51. package/themes/business/src/components/ReviewCustomer/index.tsx +39 -15
  52. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  53. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  54. package/themes/business/src/components/shared/OLink.tsx +33 -13
  55. package/themes/business/src/components/shared/OText.tsx +8 -2
  56. package/themes/business/src/types/index.tsx +22 -10
  57. package/themes/business/src/utils/index.tsx +10 -0
  58. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  59. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  60. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  61. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  62. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  63. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  64. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  65. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  66. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  67. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  68. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  69. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  70. package/themes/kiosk/src/types/index.d.ts +2 -0
  71. package/themes/original/index.tsx +8 -0
  72. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  73. package/themes/original/src/components/AddressForm/index.tsx +153 -137
  74. package/themes/original/src/components/AddressList/index.tsx +18 -18
  75. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  76. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  77. package/themes/original/src/components/BusinessBasicInformation/index.tsx +49 -33
  78. package/themes/original/src/components/BusinessController/index.tsx +106 -48
  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 +12 -6
  82. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  83. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  84. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  85. package/themes/original/src/components/BusinessListingSearch/index.tsx +87 -142
  86. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  87. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  88. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  89. package/themes/original/src/components/BusinessProductsList/index.tsx +55 -61
  90. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  91. package/themes/original/src/components/BusinessProductsListing/index.tsx +175 -94
  92. package/themes/original/src/components/BusinessProductsListing/styles.tsx +13 -12
  93. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  94. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  95. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +93 -98
  96. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  97. package/themes/original/src/components/BusinessesListing/index.tsx +13 -8
  98. package/themes/original/src/components/Cart/index.tsx +74 -21
  99. package/themes/original/src/components/Cart/styles.tsx +4 -0
  100. package/themes/original/src/components/CartContent/index.tsx +77 -18
  101. package/themes/original/src/components/CartContent/styles.tsx +11 -1
  102. package/themes/original/src/components/Checkout/index.tsx +110 -114
  103. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  104. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  105. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  106. package/themes/original/src/components/DriverTips/index.tsx +47 -37
  107. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  108. package/themes/original/src/components/Favorite/index.tsx +7 -4
  109. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  110. package/themes/original/src/components/FavoriteList/index.tsx +69 -45
  111. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  112. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  113. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  114. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  115. package/themes/original/src/components/GoogleMap/index.tsx +10 -1
  116. package/themes/original/src/components/Help/index.tsx +7 -7
  117. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +14 -20
  118. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  119. package/themes/original/src/components/HelpGuide/index.tsx +12 -11
  120. package/themes/original/src/components/HelpGuide/styles.tsx +5 -0
  121. package/themes/original/src/components/HelpOrder/index.tsx +12 -20
  122. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  123. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  125. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  126. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  127. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  128. package/themes/original/src/components/MessageListing/index.tsx +7 -7
  129. package/themes/original/src/components/Messages/index.tsx +35 -20
  130. package/themes/original/src/components/MomentOption/index.tsx +17 -11
  131. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  132. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  133. package/themes/original/src/components/MultiCheckout/index.tsx +131 -76
  134. package/themes/original/src/components/MultiOrdersDetails/index.tsx +60 -33
  135. package/themes/original/src/components/MyOrders/index.tsx +86 -20
  136. package/themes/original/src/components/NavBar/index.tsx +7 -6
  137. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  138. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  139. package/themes/original/src/components/Notifications/index.tsx +144 -0
  140. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  141. package/themes/original/src/components/OrderDetails/index.tsx +114 -15
  142. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  143. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  144. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  145. package/themes/original/src/components/OrderProgress/index.tsx +77 -66
  146. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  147. package/themes/original/src/components/OrderSummary/index.tsx +3 -36
  148. package/themes/original/src/components/OrderTypeSelector/index.tsx +13 -6
  149. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +94 -98
  150. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  151. package/themes/original/src/components/OrdersOption/index.tsx +97 -55
  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 +1 -2
  155. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  156. package/themes/original/src/components/PlaceSpot/index.tsx +249 -47
  157. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  158. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  159. package/themes/original/src/components/ProductForm/index.tsx +212 -253
  160. package/themes/original/src/components/ProductForm/styles.tsx +5 -8
  161. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  162. package/themes/original/src/components/ProductOptionSubOption/index.tsx +17 -9
  163. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +0 -1
  164. package/themes/original/src/components/ProfessionalFilter/index.tsx +2 -1
  165. package/themes/original/src/components/ProfessionalProfile/index.tsx +19 -8
  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 +328 -264
  177. package/themes/original/src/components/SignupForm/index.tsx +134 -89
  178. package/themes/original/src/components/SingleOrderCard/index.tsx +129 -54
  179. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  180. package/themes/original/src/components/SingleProductCard/index.tsx +105 -70
  181. package/themes/original/src/components/SingleProductCard/styles.tsx +2 -9
  182. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  183. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  184. package/themes/original/src/components/StripeCardsList/index.tsx +1 -1
  185. package/themes/original/src/components/StripeElementsForm/index.tsx +13 -2
  186. package/themes/original/src/components/UpsellingProducts/index.tsx +244 -215
  187. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  188. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  189. package/themes/original/src/components/UserFormDetails/index.tsx +6 -48
  190. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  191. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  192. package/themes/original/src/components/UserProfileForm/index.tsx +19 -28
  193. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  194. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  195. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  196. package/themes/original/src/components/Wallets/index.tsx +176 -164
  197. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  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 +6 -4
  201. package/themes/original/src/components/shared/OButton.tsx +9 -4
  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/layouts/Container.tsx +13 -9
  205. package/themes/original/src/types/index.tsx +55 -5
  206. package/themes/original/src/utils/index.tsx +103 -58
  207. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -7,7 +7,7 @@ import {
7
7
  useValidationFields,
8
8
  useSession,
9
9
  useToast,
10
- ToastType,
10
+ ToastType,
11
11
  MultiCheckout as MultiCheckoutController
12
12
  } from 'ordering-components/native'
13
13
  import { View, StyleSheet, Platform } from 'react-native'
@@ -21,6 +21,8 @@ import { AddressDetails } from '../AddressDetails'
21
21
  import { MultiCartsPaymethodsAndWallets } from '../MultiCartsPaymethodsAndWallets'
22
22
  import { Cart } from '../Cart'
23
23
  import { FloatingButton } from '../FloatingButton'
24
+ import { DriverTips } from '../DriverTips'
25
+ import { DriverTipsContainer } from '../Cart/styles'
24
26
 
25
27
  import {
26
28
  ChContainer,
@@ -36,11 +38,11 @@ import {
36
38
  } from './styles'
37
39
 
38
40
  const mapConfigs = {
39
- mapZoom: 16,
40
- mapSize: {
41
- width: 640,
42
- height: 190
43
- }
41
+ mapZoom: 16,
42
+ mapSize: {
43
+ width: 640,
44
+ height: 190
45
+ }
44
46
  }
45
47
 
46
48
  const MultiCheckoutUI = (props: any) => {
@@ -53,74 +55,79 @@ const MultiCheckoutUI = (props: any) => {
53
55
  paymethodSelected,
54
56
  handleSelectPaymethod,
55
57
  handleSelectWallet,
56
- handlePaymethodDataChange
58
+ handlePaymethodDataChange,
59
+ cartUuid,
60
+ totalCartsFee,
61
+ cartGroup
57
62
  } = props
58
63
 
59
- const theme = useTheme();
64
+ const theme = useTheme();
60
65
  const styles = StyleSheet.create({
61
66
  pagePadding: {
62
- paddingLeft: 40,
63
- paddingRight: 40
64
- },
65
- wrapperNavbar: Platform.OS === 'ios'
66
- ? { paddingVertical: 0, paddingHorizontal: 40 }
67
- : { paddingVertical: 20, paddingHorizontal: 40 }
67
+ paddingLeft: 40,
68
+ paddingRight: 40
69
+ },
70
+ wrapperNavbar: { paddingHorizontal: 40 }
68
71
  })
69
72
 
70
- const [, { showToast }] = useToast();
73
+ const [, { showToast }] = useToast();
71
74
  const [, t] = useLanguage()
72
- const [{ configs }] = useConfig();
73
- const [{ parsePrice, parseDate }] = useUtils();
74
- const [{ options, carts, loading }, { confirmCart }] = useOrder();
75
- const [validationFields] = useValidationFields();
75
+ const [{ configs }] = useConfig();
76
+ const [{ parsePrice, parseDate }] = useUtils();
77
+ const [{ options, carts, loading }, { confirmCart }] = useOrder();
78
+ const [validationFields] = useValidationFields();
76
79
  const [{ user }] = useSession()
77
80
 
78
- const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
79
- const isPreOrder = configs?.preorder_status_enabled?.value === '1'
80
- const maximumCarts = 5
81
- const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || openCarts.length > maximumCarts
81
+ const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
82
+ const isPreOrder = configs?.preorder_status_enabled?.value === '1'
83
+ const isMultiDriverTips = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
84
+ const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || (paymethodSelected?.paymethod?.gateway === 'stripe' && !paymethodSelected?.paymethod_data)
85
+ const walletCarts = (Object.values(carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && cart?.wallets) || null) || []
86
+ const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
87
+ ? JSON.parse(configs?.driver_tip_options?.value) || []
88
+ : configs?.driver_tip_options?.value || []
82
89
 
83
- const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
84
- const [phoneUpdate, setPhoneUpdate] = useState(false);
85
- const [userErrors, setUserErrors] = useState<any>([]);
90
+ const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
91
+ const [phoneUpdate, setPhoneUpdate] = useState(false);
92
+ const [userErrors, setUserErrors] = useState<any>([]);
86
93
  const handleMomentClick = () => {
87
- if (isPreOrder) {
88
- navigation.navigate('MomentOption')
89
- }
90
- }
94
+ if (isPreOrder) {
95
+ navigation.navigate('MomentOption')
96
+ }
97
+ }
91
98
 
92
99
  const checkValidationFields = () => {
93
- setUserErrors([])
94
- const errors = []
95
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
100
+ setUserErrors([])
101
+ const errors = []
102
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
96
103
 
97
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
98
- if (field?.required && !notFields.includes(field.code)) {
99
- if (!user[field?.code]) {
100
- errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
101
- }
102
- }
103
- })
104
+ Object.values(validationFields?.fields?.checkout).map((field: any) => {
105
+ if (field?.required && !notFields.includes(field.code)) {
106
+ if (!user[field?.code]) {
107
+ errors.push(t(`VALIDATION_ERROR_${field.code.toUpperCase()}_REQUIRED`, `The field ${field?.name} is required`))
108
+ }
109
+ }
110
+ })
104
111
 
105
- if (
106
- !user?.cellphone &&
107
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
108
- validationFields?.fields?.checkout?.cellphone?.required) ||
109
- configs?.verification_phone_required?.value === '1')
110
- ) {
111
- errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
112
- }
112
+ if (
113
+ !user?.cellphone &&
114
+ ((validationFields?.fields?.checkout?.cellphone?.enabled &&
115
+ validationFields?.fields?.checkout?.cellphone?.required) ||
116
+ configs?.verification_phone_required?.value === '1')
117
+ ) {
118
+ errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
119
+ }
113
120
 
114
- if (phoneUpdate) {
115
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
116
- }
121
+ if (phoneUpdate) {
122
+ errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
123
+ }
117
124
 
118
- setUserErrors(errors)
119
- }
125
+ setUserErrors(errors)
126
+ }
120
127
 
121
128
  const togglePhoneUpdate = (val: boolean) => {
122
- setPhoneUpdate(val)
123
- }
129
+ setPhoneUpdate(val)
130
+ }
124
131
 
125
132
  const handlePlaceOrder = () => {
126
133
  if (!userErrors.length) {
@@ -128,33 +135,30 @@ const MultiCheckoutUI = (props: any) => {
128
135
  return
129
136
  }
130
137
  let stringError = ''
131
- Object.values(userErrors).map((item: any, i: number) => {
132
- stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
133
- })
134
- showToast(ToastType.Error, stringError)
138
+ Object.values(userErrors).map((item: any, i: number) => {
139
+ stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
140
+ })
141
+ showToast(ToastType.Error, stringError)
135
142
  setIsUserDetailsEdit(true)
136
143
  }
137
144
 
138
145
  useEffect(() => {
139
- if (validationFields && validationFields?.fields?.checkout) {
140
- checkValidationFields()
141
- }
142
- }, [validationFields, user])
146
+ if (validationFields && validationFields?.fields?.checkout) {
147
+ checkValidationFields()
148
+ }
149
+ }, [validationFields, user])
143
150
 
144
151
  return (
145
152
  <>
146
153
  <Container noPadding>
147
154
  <View style={styles.wrapperNavbar}>
148
155
  <NavBar
149
- isVertical
150
156
  title={t('CHECKOUT', 'Checkout')}
151
157
  titleAlign={'center'}
152
158
  onActionLeft={() => navigation?.canGoBack() && navigation.goBack()}
153
159
  showCall={false}
160
+ paddingTop={Platform.OS === 'ios' ? 0 : 4}
154
161
  btnStyle={{ paddingLeft: 0 }}
155
- style={{ marginTop: Platform.OS === 'ios' ? 0 : 30 }}
156
- titleWrapStyle={{ paddingHorizontal: 0 }}
157
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
158
162
  />
159
163
  </View>
160
164
  <ChContainer style={styles.pagePadding}>
@@ -224,10 +228,40 @@ const MultiCheckoutUI = (props: any) => {
224
228
  handleSelectPaymethod={handleSelectPaymethod}
225
229
  handleSelectWallet={handleSelectWallet}
226
230
  handlePaymethodDataChange={handlePaymethodDataChange}
231
+ cartUuid={cartUuid}
227
232
  />
228
233
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
229
234
  </ChSection>
230
235
 
236
+ {
237
+ isMultiDriverTips &&
238
+ options?.type === 1 &&
239
+ validationFields?.fields?.checkout?.driver_tip?.enabled &&
240
+ openCarts.every((cart: any) => cart.business_id && cart.status !== 2) &&
241
+ driverTipsOptions && driverTipsOptions?.length > 0 &&
242
+ (
243
+ <ChSection>
244
+ <DriverTipsContainer>
245
+ <OText size={14} lineHeight={20} color={theme.colors.textNormal}>
246
+ {t('DRIVER_TIPS', 'Driver Tips')}
247
+ </OText>
248
+ <DriverTips
249
+ isMulti
250
+ carts={openCarts}
251
+ businessIds={openCarts.map((cart: any) => cart.business_id)}
252
+ driverTipsOptions={driverTipsOptions}
253
+ isFixedPrice={parseInt(configs?.driver_tip_type?.value, 10) === 1}
254
+ isDriverTipUseCustom={!!parseInt(configs?.driver_tip_use_custom?.value, 10)}
255
+ driverTip={parseInt(configs?.driver_tip_type?.value, 10) === 1
256
+ ? openCarts[0]?.driver_tip
257
+ : openCarts[0]?.driver_tip_rate}
258
+ useOrderContext
259
+ />
260
+ </DriverTipsContainer>
261
+ <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
262
+ </ChSection>
263
+ )}
264
+
231
265
  <ChSection>
232
266
  <ChCarts>
233
267
  <CartsHeader>
@@ -241,20 +275,46 @@ const MultiCheckoutUI = (props: any) => {
241
275
  cart={cart}
242
276
  cartuuid={cart.uuid}
243
277
  isMultiCheckout
278
+ hideDeliveryFee={configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1'}
279
+ hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
244
280
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
245
281
  />
246
282
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
247
283
  </React.Fragment>
248
284
  ))}
249
- {openCarts.length === 0 && (
285
+ {!cartGroup?.loading && openCarts.length === 0 && (
250
286
  <CCNotCarts>
251
287
  <OText size={24} style={{ textAlign: 'center' }}>
252
288
  {t('CARTS_NOT_FOUND', 'You don\'t have carts available')}
253
289
  </OText>
254
290
  </CCNotCarts>
255
291
  )}
292
+ {walletCarts.length > 0 && (
293
+ <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
294
+ {t('WARNING_PARTIAL_WALLET_CARTS', 'Important: One or more carts can`t be completed due a partial payment with cash/points wallet and requires to be paid individually')}
295
+ </OText>
296
+ )}
256
297
  {openCarts.length > 0 && (
257
298
  <ChCartsTotal>
299
+ {totalCartsFee && configs?.multi_business_checkout_show_combined_delivery_fee?.value === '1' && (
300
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
301
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
302
+ {t('TOTAL_DELIVERY_FEE', 'Total delivery fee')}
303
+ </OText>
304
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>{parsePrice(totalCartsFee)}</OText>
305
+ </View>
306
+ )}
307
+ {openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0) > 0 &&
308
+ configs?.multi_business_checkout_show_combined_driver_tip?.value === '1' && (
309
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
310
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
311
+ {t('DRIVER_TIP', 'Driver tip')}
312
+ </OText>
313
+ <OText size={14} lineHeight={24} color={theme.colors.textNormal} weight={'400'}>
314
+ {parsePrice(openCarts.reduce((sum: any, cart: any) => sum + cart?.driver_tip, 0))}
315
+ </OText>
316
+ </View>
317
+ )}
258
318
  <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
259
319
  <OText size={16} lineHeight={24} color={theme.colors.textNormal} weight={'500'}>
260
320
  {t('TOTAL_FOR_ALL_CARTS', 'Total for all Carts')}
@@ -266,23 +326,18 @@ const MultiCheckoutUI = (props: any) => {
266
326
  </OText>
267
327
  </ChCartsTotal>
268
328
  )}
269
- {openCarts.length > maximumCarts && (
270
- <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
271
- {t('WARNING_MAXIMUM_CARTS', 'You can only pay for a maximum of 5 carts, please discard one or more to continue.')}
272
- </OText>
273
- )}
274
329
  </ChCarts>
275
330
  </ChSection>
276
331
  </ChContainer>
277
332
  </Container>
278
-
333
+
279
334
  <FloatingButton
280
- handleClick={() => handlePlaceOrder()}
335
+ handleClick={() => handlePlaceOrder()}
281
336
  isSecondaryBtn={isDisablePlaceOrderButton}
282
337
  disabled={isDisablePlaceOrderButton}
283
338
  btnText={placing ? t('PLACING', 'Placing') : t('PLACE_ORDER', 'Place Order')}
284
339
  btnRightValueShow
285
- btnRightValue={parsePrice(totalCartsPrice)}
340
+ btnRightValue={parsePrice(totalCartsPrice)}
286
341
  iosBottom={30}
287
342
  />
288
343
  </>
@@ -1,11 +1,11 @@
1
1
  import React, { useEffect } from 'react'
2
- import { useLanguage, useUtils, useToast, ToastType, MultiOrdersDetails as MultiOrdersDetailsController } from 'ordering-components/native'
3
- import { View, StyleSheet, BackHandler } from 'react-native'
2
+ import { useLanguage, useUtils, useToast, ToastType, MultiOrdersDetails as MultiOrdersDetailsController } from 'ordering-components/native'
3
+ import { View, StyleSheet, BackHandler, TouchableOpacity } from 'react-native'
4
4
  import { useTheme } from 'styled-components/native'
5
5
  import { OText, OButton } from '../shared'
6
- import { Container } from '../../layouts/Container'
7
6
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder'
8
7
  import { SingleOrderCard } from './SingleOrderCard'
8
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
9
9
 
10
10
  import {
11
11
  OrdersDetailsContainer,
@@ -18,6 +18,7 @@ import {
18
18
  OrdersSummary,
19
19
  BorderLine
20
20
  } from './styles'
21
+ import { NotFoundSource } from '../NotFoundSource'
21
22
 
22
23
  export const MultiOrdersDetailsUI = (props: any) => {
23
24
  const {
@@ -29,20 +30,26 @@ export const MultiOrdersDetailsUI = (props: any) => {
29
30
  } = props
30
31
 
31
32
  const theme = useTheme()
32
- const styles = StyleSheet.create({
33
+ const styles = StyleSheet.create({
33
34
  btnBackArrow: {
34
- borderWidth: 0,
35
- backgroundColor: theme.colors.clear,
36
- shadowColor: theme.colors.clear,
37
- padding: 0,
35
+ borderWidth: 0,
36
+ backgroundColor: theme.colors.clear,
37
+ shadowColor: theme.colors.clear,
38
+ padding: 0,
38
39
  marginLeft: -20
39
- },
40
- })
41
-
40
+ },
41
+ })
42
+
42
43
  const { loading, orders, error } = props.ordersList
43
44
  const [, t] = useLanguage()
44
45
  const [{ parsePrice, parseNumber, parseDate }] = useUtils();
45
- const [, { showToast }] = useToast();
46
+ const [, { showToast }] = useToast();
47
+ const [{ configs }] = useConfig()
48
+
49
+ const isTaxIncludedOnPrice = orders.every((_order: any) => _order.taxes?.length ? _order.taxes?.every((_tax: any) => _tax.type === 1) : true)
50
+ const progressBarStyle = configs.multi_business_checkout_progress_bar_style?.value
51
+ const showBarInOrder = ['group', 'both']
52
+ const showBarInIndividual = ['individual', 'both']
46
53
 
47
54
  const walletName: any = {
48
55
  cash: {
@@ -60,7 +67,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
60
67
  }
61
68
  navigation.navigate('BusinessList');
62
69
  return true
63
- }
70
+ }
64
71
 
65
72
  const handleGoToOrderDetails = (uuid: any) => {
66
73
  navigation.navigate('OrderDetails', { orderId: uuid })
@@ -68,7 +75,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
68
75
 
69
76
  useEffect(() => {
70
77
  if (error) {
71
- showToast(ToastType.Error, error)
78
+ showToast(ToastType.Error, error)
72
79
  }
73
80
  }, [error])
74
81
 
@@ -83,11 +90,14 @@ export const MultiOrdersDetailsUI = (props: any) => {
83
90
  <OrdersDetailsContainer keyboardShouldPersistTaps="handled" contentContainerStyle={{ paddingHorizontal: 40 }}>
84
91
  <View style={{ flexDirection: 'row' }}>
85
92
  <OButton
86
- imgLeftSrc={theme.images.general.arrow_left}
87
93
  imgRightSrc={null}
88
94
  style={styles.btnBackArrow}
89
95
  onClick={() => handleArrowBack()}
90
- imgLeftStyle={{ tintColor: theme.colors.textNormal, width: 16 }}
96
+ icon={AntDesignIcon}
97
+ iconProps={{
98
+ name: 'arrowleft',
99
+ size: 26
100
+ }}
91
101
  />
92
102
  </View>
93
103
  <Header>
@@ -192,23 +202,27 @@ export const MultiOrdersDetailsUI = (props: any) => {
192
202
  </Row>
193
203
  ))}
194
204
  <BorderLine />
195
- <Row>
196
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
197
- {t('TOTAL_BEFORE_TAX', 'Total before tax')}:
198
- </OText>
199
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
200
- {parsePrice(ordersSummary?.subtotal)}
201
- </OText>
202
- </Row>
203
- <Row>
204
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
205
- {t('ESTIMATED_TAX_TO_BE_COLLECTED', 'Estimated tax to be collected')}:
206
- </OText>
207
- <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
208
- {parsePrice(ordersSummary?.tax)}
209
- </OText>
210
- </Row>
211
- <BorderLine />
205
+ {!isTaxIncludedOnPrice && (
206
+ <>
207
+ <Row>
208
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
209
+ {t('TOTAL_BEFORE_TAX', 'Total before tax')}:
210
+ </OText>
211
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
212
+ {parsePrice(ordersSummary?.subtotal)}
213
+ </OText>
214
+ </Row>
215
+ <Row>
216
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
217
+ {t('ESTIMATED_TAX_TO_BE_COLLECTED', 'Estimated tax to be collected')}:
218
+ </OText>
219
+ <OText size={12} lineHeight={18} weight={'400'} color={theme.colors.textNormal}>
220
+ {parsePrice(ordersSummary?.tax)}
221
+ </OText>
222
+ </Row>
223
+ <BorderLine />
224
+ </>
225
+ )}
212
226
  <Row style={{ marginTop: 10 }}>
213
227
  <OText size={14} lineHeight={18} weight={'500'} color={theme.colors.textNormal}>
214
228
  {t('PAYMENT_TOTAL', 'Payment total')}:
@@ -244,6 +258,19 @@ export const MultiOrdersDetailsUI = (props: any) => {
244
258
  ))}
245
259
  </>
246
260
  )}
261
+ {!loading && (error || orders?.length === 0) && (
262
+ error?.includes('ERROR_ACCESS_EXPIRED') ? (
263
+ <NotFoundSource
264
+ content={t(error[0], 'Sorry, the order has expired.')}
265
+ />
266
+ ) : (
267
+ <NotFoundSource
268
+ content={t('NOT_FOUND_ORDER', theme?.defaultLanguages?.NOT_FOUND_ORDER || 'Sorry, we couldn\'t find the requested order.')}
269
+ btnTitle={t('ORDERS_REDIRECT', theme?.defaultLanguages?.ORDERS_REDIRECT || 'Go to Orders')}
270
+ onClickButton={navigation.navigate('BusinessList')}
271
+ />
272
+ )
273
+ )}
247
274
  <Divider />
248
275
  </OrdersDetailsContainer>
249
276
  )
@@ -1,9 +1,10 @@
1
1
  import React, { useState, useEffect } from 'react'
2
2
  import { useLanguage } from 'ordering-components/native';
3
- import { View, StyleSheet, RefreshControl } from 'react-native';
3
+ import { View, StyleSheet, RefreshControl, Platform } from 'react-native';
4
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
4
5
 
5
6
  import { OrdersOption } from '../OrdersOption'
6
- import { HeaderTitle, OText } from '../shared'
7
+ import { HeaderTitle, OButton, OText } from '../shared'
7
8
  import { ScrollView } from 'react-native-gesture-handler';
8
9
  import { Tab } from './styles'
9
10
  import { useTheme } from 'styled-components/native';
@@ -11,6 +12,7 @@ import { Container } from '../../layouts/Container';
11
12
 
12
13
  export const MyOrders = (props: any) => {
13
14
  const {
15
+ navigation,
14
16
  hideOrders,
15
17
  businessesSearchList
16
18
  } = props
@@ -21,18 +23,25 @@ export const MyOrders = (props: any) => {
21
23
  const [isEmptyBusinesses, setIsEmptyBusinesses] = useState(false)
22
24
  const [businessOrderIds, setBusinessOrderIds] = useState([])
23
25
  const [ordersLength, setOrdersLength] = useState({
24
- activeOrdersLength: 0,
26
+ activeOrdersLength: null,
25
27
  previousOrdersLength: 0,
26
28
  });
27
29
  const [selectedOption, setSelectedOption] = useState(!hideOrders ? 'orders' : 'business')
28
30
 
29
31
  const notOrderOptions = ['business', 'products']
30
32
  const allEmpty = (ordersLength?.activeOrdersLength === 0 && ordersLength?.previousOrdersLength === 0) || ((isEmptyBusinesses || businessOrderIds?.length === 0) && hideOrders)
33
+
34
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
35
+ const showNavbar = theme?.bar_menu?.components?.orders?.hidden
36
+ const hideOrdersTheme = theme?.bar_menu?.components?.orders?.hidden
37
+ const hideProductsTab = theme?.orders?.components?.products_tab?.hidden
38
+ const hideBusinessTab = theme?.orders?.components?.business_tab?.hidden
31
39
  const MyOrdersMenu = [
32
- { key: 'orders', value: t('ORDERS', 'Orders') },
33
- { key: 'business', value: t('BUSINESS', 'Business') },
34
- { key: 'products', value: t('PRODUCTS', 'Products') }
40
+ { key: 'orders', value: t('ORDERS', 'Orders'), disabled: false },
41
+ { key: 'business', value: t('BUSINESS', 'Business'), disabled: hideBusinessTab },
42
+ { key: 'products', value: t('PRODUCTS', 'Products'), disabled: hideProductsTab }
35
43
  ]
44
+ const goToBack = () => navigation?.canGoBack() && navigation.goBack()
36
45
 
37
46
  const handleOnRefresh = () => {
38
47
  setRefreshOrders(true);
@@ -61,24 +70,64 @@ export const MyOrders = (props: any) => {
61
70
  });
62
71
 
63
72
  return (
64
- <Container noPadding refreshControl={
65
- <RefreshControl
66
- refreshing={refreshing}
67
- onRefresh={() => handleOnRefresh()}
68
- />
69
- }>
70
- {!hideOrders && (
73
+ <Container
74
+ noPadding
75
+ refreshControl={
76
+ <RefreshControl
77
+ refreshing={refreshing}
78
+ onRefresh={() => handleOnRefresh()}
79
+ />
80
+ }
81
+ >
82
+ {(isChewLayout || showNavbar) && (
83
+ <View style={{
84
+ ...{
85
+ width: '100%',
86
+ display: 'flex',
87
+ flexDirection: 'row',
88
+ alignItems: 'center',
89
+ paddingHorizontal: isChewLayout ? 20 : 40,
90
+ },
91
+ ...props.titleStyle
92
+ }}>
93
+ {!props.hideBackBtn && (!isChewLayout || (isChewLayout && hideOrdersTheme)) && (
94
+ <OButton
95
+ imgLeftStyle={{ width: 18 }}
96
+ imgRightSrc={null}
97
+ style={{
98
+ borderWidth: 0,
99
+ width: 26,
100
+ height: 26,
101
+ backgroundColor: '#FFF',
102
+ borderColor: '#FFF',
103
+ shadowColor: '#FFF',
104
+ paddingLeft: 0,
105
+ paddingRight: 0,
106
+ marginTop: 30,
107
+ }}
108
+ onClick={goToBack}
109
+ icon={AntDesignIcon}
110
+ iconProps={{
111
+ name: 'arrowleft',
112
+ size: 26
113
+ }}
114
+ />
115
+ )}
116
+ <HeaderTitle ph={10} text={t('MY_ORDERS', 'My Orders')} />
117
+ </View>
118
+ )}
119
+ {!hideOrders && !isChewLayout && !showNavbar && (
71
120
  <HeaderTitle text={t('MY_ORDERS', 'My Orders')} />
72
121
  )}
73
122
  {!allEmpty && (
74
123
  <ScrollView
75
124
  horizontal
76
125
  style={{ ...styles.container, borderBottomWidth: 1 }}
77
- contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : 40 }}
126
+ contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : isChewLayout ? 20 : 40 }}
78
127
  showsHorizontalScrollIndicator={false}
79
128
  scrollEventThrottle={16}
80
129
  >
81
- {MyOrdersMenu.filter(option => !hideOrders || option.key !== 'orders').map(option => (
130
+ {MyOrdersMenu.filter(option => (!hideOrders || option.key !== 'orders') && !option.disabled).map(option => (
82
131
  <Tab
83
132
  key={option.key}
84
133
  onPress={() => setSelectedOption(option.key)}
@@ -98,7 +147,7 @@ export const MyOrders = (props: any) => {
98
147
  )}
99
148
  {selectedOption === 'orders' && (
100
149
  <>
101
- <View style={{ paddingLeft: 40, paddingRight: 40 }}>
150
+ <View style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}>
102
151
  <OrdersOption
103
152
  {...props}
104
153
  activeOrders
@@ -108,7 +157,7 @@ export const MyOrders = (props: any) => {
108
157
  refreshOrders={refreshOrders}
109
158
  />
110
159
  </View>
111
- <View style={{ paddingLeft: 40, paddingRight: 40 }}>
160
+ <View style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}>
112
161
  <OrdersOption
113
162
  {...props}
114
163
  ordersLength={ordersLength}
@@ -119,14 +168,31 @@ export const MyOrders = (props: any) => {
119
168
  </View>
120
169
  </>
121
170
  )}
122
- {notOrderOptions.includes(selectedOption) && (
171
+ {selectedOption === 'business' && (
172
+ <OrdersOption
173
+ {...props}
174
+ isBusiness
175
+ titleContent={t('PREVIOUSLY_ORDERED', 'Previously ordered')}
176
+ hideOrders
177
+ horizontal
178
+ activeOrders
179
+ pastOrders
180
+ preOrders
181
+ businessesSearchList={businessesSearchList}
182
+ setIsEmptyBusinesses={setIsEmptyBusinesses}
183
+ businessOrderIds={businessOrderIds}
184
+ setBusinessOrderIds={setBusinessOrderIds}
185
+ ordersLength={ordersLength}
186
+ setOrdersLength={setOrdersLength}
187
+ />
188
+ )}
189
+ {selectedOption === 'products' && (
123
190
  <OrdersOption
124
191
  {...props}
192
+ isProducts
125
193
  titleContent={t('PREVIOUSLY_ORDERED', 'Previously ordered')}
126
194
  hideOrders
127
195
  horizontal
128
- isBusiness={selectedOption === 'business'}
129
- isProducts={selectedOption === 'products'}
130
196
  activeOrders
131
197
  pastOrders
132
198
  preOrders