ordering-ui-react-native 0.21.89 → 0.21.90-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 (163) hide show
  1. package/package.json +6 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/StripeMethodForm/index.tsx +6 -4
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/src/types/index.tsx +3 -1
  8. package/themes/business/index.tsx +2 -0
  9. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  10. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  11. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  12. package/themes/business/src/components/BusinessProductList/index.tsx +2 -1
  13. package/themes/business/src/components/Chat/index.tsx +5 -2
  14. package/themes/business/src/components/DriverMap/index.tsx +49 -27
  15. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  16. package/themes/business/src/components/Home/index.tsx +5 -1
  17. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  18. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  19. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  20. package/themes/business/src/components/MapView/index.tsx +36 -17
  21. package/themes/business/src/components/NewOrderNotification/index.tsx +69 -33
  22. package/themes/business/src/components/OrderDetails/Business.tsx +74 -9
  23. package/themes/business/src/components/OrderDetails/Delivery.tsx +131 -51
  24. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +112 -41
  25. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +62 -24
  26. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  27. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +221 -0
  28. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  29. package/themes/business/src/components/OrderSummary/index.tsx +223 -73
  30. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  31. package/themes/business/src/components/OrdersOption/index.tsx +251 -159
  32. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  33. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  34. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +42 -20
  35. package/themes/business/src/components/PreviousOrders/index.tsx +76 -66
  36. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  37. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  38. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  39. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  40. package/themes/business/src/components/PrinterSettings/index.tsx +267 -0
  41. package/themes/business/src/components/PrinterSettings/styles.tsx +30 -0
  42. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  43. package/themes/business/src/components/Sessions/index.tsx +1 -1
  44. package/themes/business/src/components/StoresList/index.tsx +2 -2
  45. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  46. package/themes/business/src/components/UserProfileForm/index.tsx +43 -25
  47. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  48. package/themes/business/src/components/shared/OInput.tsx +2 -0
  49. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  50. package/themes/business/src/hooks/useLocation.tsx +5 -4
  51. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  52. package/themes/business/src/types/index.tsx +14 -4
  53. package/themes/business/src/utils/index.tsx +25 -1
  54. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  56. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  57. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  60. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  61. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  62. package/themes/original/index.tsx +11 -0
  63. package/themes/original/src/components/AddressDetails/index.tsx +18 -8
  64. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  65. package/themes/original/src/components/AddressList/index.tsx +8 -7
  66. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  67. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  68. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  69. package/themes/original/src/components/BusinessController/index.tsx +12 -7
  70. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  71. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +2 -3
  72. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +1 -3
  73. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  74. package/themes/original/src/components/BusinessPreorder/index.tsx +20 -15
  75. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +5 -5
  76. package/themes/original/src/components/BusinessProductsList/index.tsx +2 -2
  77. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  78. package/themes/original/src/components/BusinessProductsListing/index.tsx +18 -6
  79. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  80. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  81. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -1
  82. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  83. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  84. package/themes/original/src/components/Cart/index.tsx +43 -15
  85. package/themes/original/src/components/CartContent/index.tsx +2 -4
  86. package/themes/original/src/components/Checkout/index.tsx +104 -58
  87. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  88. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  89. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  90. package/themes/original/src/components/Favorite/index.tsx +1 -5
  91. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  92. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  93. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  94. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  95. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  96. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  97. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  98. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  99. package/themes/original/src/components/Help/index.tsx +2 -0
  100. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  101. package/themes/original/src/components/Home/index.tsx +2 -10
  102. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  103. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  104. package/themes/original/src/components/MessageListing/index.tsx +2 -1
  105. package/themes/original/src/components/Messages/index.tsx +13 -9
  106. package/themes/original/src/components/MomentOption/index.tsx +13 -2
  107. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  108. package/themes/original/src/components/MultiCheckout/index.tsx +130 -86
  109. package/themes/original/src/components/MultiOrdersDetails/index.tsx +2 -1
  110. package/themes/original/src/components/MyOrders/index.tsx +10 -23
  111. package/themes/original/src/components/NavBar/index.tsx +7 -4
  112. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  113. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  114. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  115. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +13 -10
  116. package/themes/original/src/components/OrderDetails/index.tsx +42 -19
  117. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  118. package/themes/original/src/components/OrderProgress/index.tsx +16 -6
  119. package/themes/original/src/components/OrderSummary/index.tsx +28 -9
  120. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  121. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  122. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  123. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  124. package/themes/original/src/components/PaymentOptions/index.tsx +17 -9
  125. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  126. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  127. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  128. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  129. package/themes/original/src/components/ProductItemAccordion/index.tsx +55 -49
  130. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  131. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  132. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  133. package/themes/original/src/components/Promotions/index.tsx +6 -9
  134. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  135. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  136. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  137. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  138. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  139. package/themes/original/src/components/Sessions/index.tsx +3 -3
  140. package/themes/original/src/components/SignupForm/index.tsx +86 -78
  141. package/themes/original/src/components/SingleOrderCard/index.tsx +6 -4
  142. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  143. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  144. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  145. package/themes/original/src/components/StripeCardsList/index.tsx +10 -3
  146. package/themes/original/src/components/StripeElementsForm/index.tsx +77 -60
  147. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  148. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  149. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  151. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  152. package/themes/original/src/components/UserDetails/index.tsx +3 -2
  153. package/themes/original/src/components/UserFormDetails/index.tsx +154 -130
  154. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  155. package/themes/original/src/components/Wallets/index.tsx +6 -3
  156. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  157. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  158. package/themes/original/src/components/shared/OButton.tsx +5 -4
  159. package/themes/original/src/components/shared/OInput.tsx +4 -8
  160. package/themes/original/src/components/shared/OModal.tsx +7 -2
  161. package/themes/original/src/types/index.tsx +5 -1
  162. package/themes/original/src/utils/index.tsx +30 -1
  163. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -51,7 +51,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
51
51
  const { confirmApplePayPayment } = useApplePay()
52
52
 
53
53
  const [addCardOpen, setAddCardOpen] = useState({ stripe: false, stripeConnect: false });
54
-
54
+ const [newCardAdded, setNewCardAdded] = useState(null)
55
55
  const isWalletCashEnabled = configs?.wallet_cash_enabled?.value === '1'
56
56
  const isWalletPointsEnabled = configs?.wallet_credit_point_enabled?.value === '1'
57
57
 
@@ -223,6 +223,8 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
223
223
  handlePaymethodDataChange={handlePaymethodDataChange}
224
224
  clientSecret={props.clientSecret}
225
225
  onPaymentChange={handlePaymethodDataChange}
226
+ newCardAdded={newCardAdded}
227
+ addNewCardAsDefault
226
228
  />
227
229
  </View>
228
230
  )}
@@ -233,6 +235,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
233
235
  toSave
234
236
  businessId={businessIds[0]}
235
237
  businessIds={businessIds}
238
+ businessNames={openCarts?.map?.((cart: any) => cart?.business?.name)}
236
239
  publicKey={paymethodSelected?.data?.publishable}
237
240
  requirements={props.clientSecret}
238
241
  handleSource={handlePaymethodDataChange}
@@ -306,7 +309,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
306
309
  </>
307
310
  )}
308
311
 
309
- {/* <OModal
312
+ <OModal
310
313
  entireModal
311
314
  title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
312
315
  open={addCardOpen.stripe}
@@ -326,10 +329,11 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
326
329
  publicKey={paymethodSelected?.data?.publishable}
327
330
  requirements={props.clientSecret}
328
331
  onSelectCard={handlePaymethodDataChange}
332
+ setNewCardAdded={setNewCardAdded}
329
333
  onCancel={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
330
334
  />
331
335
  </KeyboardAvoidingView>
332
- </OModal> */}
336
+ </OModal>
333
337
  </PMContainer>
334
338
  )
335
339
  }
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from 'react'
1
+ import React, { useState, useEffect, useCallback, useMemo } from 'react'
2
2
  import {
3
3
  useLanguage,
4
4
  useConfig,
@@ -70,7 +70,8 @@ const MultiCheckoutUI = (props: any) => {
70
70
  walletState,
71
71
  onNavigationRedirectReplace,
72
72
  merchantId,
73
- cartsInvalid
73
+ cartsInvalid,
74
+ checkoutFieldsState
74
75
  } = props
75
76
 
76
77
  const theme = useTheme();
@@ -82,12 +83,12 @@ const MultiCheckoutUI = (props: any) => {
82
83
  wrapperNavbar: {
83
84
  paddingHorizontal: 20,
84
85
  backgroundColor: theme?.colors?.white,
85
- borderWidth: 0
86
+ borderWidth: 0
86
87
  },
87
88
  detailWrapper: {
88
- paddingHorizontal: 20,
89
- width: '100%'
90
- },
89
+ paddingHorizontal: 20,
90
+ width: '100%'
91
+ },
91
92
  })
92
93
 
93
94
  const [, { showToast }] = useToast();
@@ -96,8 +97,9 @@ const MultiCheckoutUI = (props: any) => {
96
97
  const [{ parsePrice, parseDate }] = useUtils();
97
98
  const [{ options, carts, loading }, { confirmCart }] = useOrder();
98
99
  const [validationFields] = useValidationFields();
99
- const [{ user }, { login }] = useSession()
100
+ const [{ user, loading: userLoading }, { login }] = useSession()
100
101
 
102
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
101
103
  const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
102
104
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
103
105
  const isMultiDriverTips = configs?.checkout_multi_business_enabled?.value === '1'
@@ -121,6 +123,7 @@ const MultiCheckoutUI = (props: any) => {
121
123
 
122
124
  const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
123
125
  const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
126
+ const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field : any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
124
127
 
125
128
  const accumulationRateBusiness = (businessId: number) => {
126
129
  const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
@@ -143,16 +146,17 @@ const MultiCheckoutUI = (props: any) => {
143
146
  ?.reduce((sum: any, cart: any) => sum + clearAmount((cart?.subtotal + getIncludedTaxes(cart)) * accumulationRateBusiness(cart?.business_id)), 0)
144
147
  ?.toFixed(configs.format_number_decimal_length?.value ?? 2)
145
148
 
146
- const [showTitle, setShowTitle] = useState(false)
149
+ const [showTitle, setShowTitle] = useState(false)
147
150
  const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
148
151
  const [phoneUpdate, setPhoneUpdate] = useState(false);
149
152
  const [userErrors, setUserErrors] = useState<any>([]);
153
+ const [cartsOpened, setCartsOpened] = useState([])
150
154
  const [placeByMethodPay, setPlaceByMethodPay] = useState(false)
151
- const [allowedGuest, setAllowedGuest] = useState(false)
152
- const [isOpen, setIsOpen] = useState(false)
153
- const [requiredFields, setRequiredFields] = useState<any>([])
154
- const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
155
- const [openModal, setOpenModal] = useState({ login: false, signup: false, isGuest: false })
155
+ const [allowedGuest, setAllowedGuest] = useState(false)
156
+ const [isOpen, setIsOpen] = useState(false)
157
+ const [requiredFields, setRequiredFields] = useState<any>([])
158
+ const stripePaymethods: any = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect']
159
+ const [openModal, setOpenModal] = useState({ login: false, signup: false, isGuest: false })
156
160
  const [methodPaySupported, setMethodPaySupported] = useState({ enabled: false, message: null, loading: true })
157
161
  const methodsPay = ['global_google_pay', 'global_apple_pay']
158
162
  const isDisablePlaceOrderButton = cartGroup?.loading || placing || (!(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) && cartGroup?.result?.balance > 0) ||
@@ -168,53 +172,73 @@ const MultiCheckoutUI = (props: any) => {
168
172
 
169
173
  const checkValidationFields = () => {
170
174
  setUserErrors([])
171
- const errors = []
172
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
173
- const _requiredFields: any = []
174
-
175
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
176
- if (field?.required && !notFields.includes(field.code)) {
177
- if (!user[field?.code]) {
178
- _requiredFields.push(field?.code)
175
+ const errors: Array<string> = []
176
+ const userSelected = user
177
+ const _requiredFields: Array<string> = []
178
+ Object.values(checkoutFieldsState?.fields).map((field: any) => {
179
+ if (options?.type === field?.order_type_id &&
180
+ field?.enabled &&
181
+ field?.required &&
182
+ !notFields.includes(field?.validation_field?.code)
183
+ ) {
184
+ if (userSelected && !userSelected[field?.validation_field?.code]) {
185
+ _requiredFields.push(field?.validation_field?.code)
179
186
  }
180
187
  }
181
188
  })
182
-
189
+ const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
183
190
  if (
184
- !user?.cellphone &&
185
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
186
- validationFields?.fields?.checkout?.cellphone?.required) ||
191
+ userSelected &&
192
+ !userSelected?.cellphone &&
193
+ ((mobilePhoneField?.enabled &&
194
+ mobilePhoneField?.required) ||
187
195
  configs?.verification_phone_required?.value === '1')
188
196
  ) {
189
197
  _requiredFields.push('cellphone')
190
198
  }
191
- setRequiredFields(_requiredFields)
192
-
193
- if (phoneUpdate) {
194
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
195
- }
199
+ setRequiredFields(_requiredFields)
196
200
 
197
201
  setUserErrors(errors)
198
202
  }
199
203
 
204
+ const checkGuestValidationFields = () => {
205
+ const userSelected = user
206
+ const _requiredFields = checkoutFieldsState?.fields
207
+ .filter((field) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
208
+ !notFields.includes(field?.validation_field?.code) &&
209
+ userSelected && !userSelected[field?.validation_field?.code])
210
+ const requiredFieldsCode = _requiredFields.map((item) => item?.validation_field?.code)
211
+ const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
212
+ if (
213
+ userSelected &&
214
+ !userSelected?.cellphone &&
215
+ ((guestCheckoutCellPhone?.enabled &&
216
+ guestCheckoutCellPhone?.required_with_guest) ||
217
+ configs?.verification_phone_required?.value === '1')
218
+ ) {
219
+ requiredFieldsCode.push('cellphone')
220
+ }
221
+ setRequiredFields(requiredFieldsCode)
222
+ }
223
+
200
224
  const togglePhoneUpdate = (val: boolean) => {
201
225
  setPhoneUpdate(val)
202
226
  }
203
227
 
204
228
  const handlePlaceOrder = (confirmPayment?: any) => {
205
229
  if (stripePaymethods.includes(paymethodSelected?.gateway) && user?.guest_id) {
206
- setOpenModal({ ...openModal, signup: true, isGuest: true })
207
- return
208
- }
230
+ setOpenModal({ ...openModal, signup: true, isGuest: true })
231
+ return
232
+ }
209
233
 
210
- if (!userErrors.length && (!requiredFields?.length || allowedGuest)) {
234
+ if (!userErrors.length && !requiredFields?.length) {
211
235
  handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
212
236
  return
213
237
  }
214
238
  if (requiredFields?.length) {
215
- setIsOpen(true)
216
- return
217
- }
239
+ setIsOpen(true)
240
+ return
241
+ }
218
242
  let stringError = ''
219
243
  Object.values(userErrors).map((item: any, i: number) => {
220
244
  stringError += (i + 1) === userErrors.length ? `- ${item?.message || item}` : `- ${item?.message || item}\n`
@@ -224,26 +248,26 @@ const MultiCheckoutUI = (props: any) => {
224
248
  }
225
249
 
226
250
  const handlePlaceOrderAsGuest = () => {
227
- setIsOpen(false)
228
- handleGroupPlaceOrder && handleGroupPlaceOrder()
229
- }
251
+ setIsOpen(false)
252
+ handleGroupPlaceOrder && handleGroupPlaceOrder()
253
+ }
230
254
 
231
255
  const handleSuccessSignup = (user: any) => {
232
- login({
233
- user,
234
- token: user?.session?.access_token
235
- })
236
- openModal?.isGuest && handlePlaceOrderAsGuest()
237
- setOpenModal({ ...openModal, signup: false, isGuest: false })
238
- }
239
-
240
- const handleSuccessLogin = (user: any) => {
241
- if (user) setOpenModal({ ...openModal, login: false })
242
- }
256
+ login({
257
+ user,
258
+ token: user?.session?.access_token
259
+ })
260
+ openModal?.isGuest && handlePlaceOrderAsGuest()
261
+ setOpenModal({ ...openModal, signup: false, isGuest: false })
262
+ }
263
+
264
+ const handleSuccessLogin = (user: any) => {
265
+ if (user) setOpenModal({ ...openModal, login: false })
266
+ }
243
267
 
244
268
  const handleScroll = ({ nativeEvent: { contentOffset } }: any) => {
245
- setShowTitle(contentOffset.y > 30)
246
- }
269
+ setShowTitle(contentOffset.y > 30)
270
+ }
247
271
 
248
272
  const handleGoBack = () => {
249
273
  if (navigation?.canGoBack()) {
@@ -254,10 +278,13 @@ const MultiCheckoutUI = (props: any) => {
254
278
  }
255
279
 
256
280
  useEffect(() => {
257
- if (validationFields && validationFields?.fields?.checkout) {
281
+ if (checkoutFieldsState?.loading || userLoading) return
282
+ if (user?.guest_id) {
283
+ checkGuestValidationFields()
284
+ } else {
258
285
  checkValidationFields()
259
286
  }
260
- }, [validationFields, user])
287
+ }, [checkoutFieldsState, user, options?.type])
261
288
 
262
289
  useEffect(() => {
263
290
  if (cartsToShow?.length === 1) {
@@ -291,6 +318,18 @@ const MultiCheckoutUI = (props: any) => {
291
318
  }
292
319
  }, [paymethodSelected])
293
320
 
321
+ const changeActiveState = useCallback((isClosed: boolean, uuid: string) => {
322
+ const isActive = cartsOpened?.includes?.(uuid)
323
+ if (isActive || !isClosed) {
324
+ setCartsOpened(cartsOpened?.filter?.((_uuid) => _uuid !== uuid))
325
+ } else {
326
+ setCartsOpened([
327
+ ...cartsOpened,
328
+ uuid
329
+ ])
330
+ }
331
+ }, [cartsOpened])
332
+
294
333
  return (
295
334
  <>
296
335
  <SafeAreaView style={{ backgroundColor: theme.colors.backgroundPage }}>
@@ -318,7 +357,7 @@ const MultiCheckoutUI = (props: any) => {
318
357
  </TopHeader>
319
358
  </View>
320
359
  </SafeAreaView>
321
- <Container pt={0} noPadding onScroll={handleScroll}>
360
+ <Container pt={0} noPadding onScroll={handleScroll} showsVerticalScrollIndicator={false}>
322
361
  <View style={styles.wrapperNavbar}>
323
362
  <NavBar
324
363
  hideArrowLeft
@@ -329,8 +368,8 @@ const MultiCheckoutUI = (props: any) => {
329
368
  paddingTop={Platform.OS === 'ios' ? 0 : 4}
330
369
  btnStyle={{ paddingLeft: 0 }}
331
370
  titleWrapStyle={{ paddingHorizontal: 0 }}
332
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
333
- style={{ marginTop: 20 }}
371
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
372
+ style={{ marginTop: 20 }}
334
373
  />
335
374
  </View>
336
375
  <ChContainer style={styles.pagePadding}>
@@ -381,15 +420,11 @@ const MultiCheckoutUI = (props: any) => {
381
420
  </OText>
382
421
  <OButton
383
422
  text={t('SIGN_UP', 'Sign up')}
384
- textStyle={{ color: theme.colors.white }}
385
423
  style={{ borderRadius: 7.6, marginTop: 20 }}
386
424
  onClick={() => setOpenModal({ ...openModal, signup: true })}
387
425
  />
388
426
  <OButton
389
427
  text={t('LOGIN', 'Login')}
390
- textStyle={{ color: theme.colors.primary }}
391
- bgColor={theme.colors.white}
392
- borderColor={theme.colors.primary}
393
428
  style={{ borderRadius: 7.6, marginTop: 20 }}
394
429
  onClick={() => setOpenModal({ ...openModal, login: true })}
395
430
  />
@@ -411,6 +446,9 @@ const MultiCheckoutUI = (props: any) => {
411
446
  isCheckout
412
447
  phoneUpdate={phoneUpdate}
413
448
  togglePhoneUpdate={togglePhoneUpdate}
449
+ isOrderTypeValidationField
450
+ requiredFields={requiredFields}
451
+ checkoutFields={checkoutFields}
414
452
  />
415
453
  )}
416
454
  </ChUserDetails>
@@ -522,6 +560,9 @@ const MultiCheckoutUI = (props: any) => {
522
560
  hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
523
561
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
524
562
  businessConfigs={cart?.business?.configs}
563
+ cartsOpened={cartsOpened}
564
+ changeActiveState={changeActiveState}
565
+ isActive={cartsOpened?.includes?.(cart?.uuid)}
525
566
  />
526
567
  {openCarts.length > 1 && (
527
568
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
@@ -631,30 +672,33 @@ const MultiCheckoutUI = (props: any) => {
631
672
  </ScrollView>
632
673
  </OModal>
633
674
  <OModal
634
- open={isOpen}
635
- onClose={() => setIsOpen(false)}
636
- >
637
- <View style={styles.detailWrapper}>
638
- <UserDetails
639
- isUserDetailsEdit
640
- useValidationFields
641
- useDefualtSessionManager
642
- useSessionUser
643
- isCheckout
644
- isEdit
645
- phoneUpdate={phoneUpdate}
646
- togglePhoneUpdate={togglePhoneUpdate}
647
- requiredFields={requiredFields}
648
- hideUpdateButton
649
- handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
650
- onClose={() => {
651
- setIsOpen(false)
652
- handlePlaceOrder()
653
- }}
654
- setIsOpen={setIsOpen}
655
- />
656
- </View>
657
- </OModal>
675
+ open={isOpen}
676
+ onClose={() => setIsOpen(false)}
677
+ >
678
+ <View style={styles.detailWrapper}>
679
+ <UserDetails
680
+ isUserDetailsEdit
681
+ useValidationFields
682
+ useDefualtSessionManager
683
+ useSessionUser
684
+ isCheckout
685
+ isEdit
686
+ phoneUpdate={phoneUpdate}
687
+ togglePhoneUpdate={togglePhoneUpdate}
688
+ hideUpdateButton
689
+ handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
690
+ isCheckoutPlace
691
+ isOrderTypeValidationField
692
+ requiredFields={requiredFields}
693
+ checkoutFields={checkoutFields}
694
+ onClose={() => {
695
+ setIsOpen(false)
696
+ handlePlaceOrder()
697
+ }}
698
+ setIsOpen={setIsOpen}
699
+ />
700
+ </View>
701
+ </OModal>
658
702
  </Container>
659
703
 
660
704
  <FloatingButton
@@ -72,7 +72,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
72
72
  navigation?.canGoBack() && navigation.goBack();
73
73
  return;
74
74
  }
75
- navigation.navigate('BusinessList');
75
+ navigation.navigate('BottomTab');
76
76
  return true
77
77
  }
78
78
 
@@ -101,6 +101,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
101
101
  style={styles.btnBackArrow}
102
102
  onClick={() => handleArrowBack()}
103
103
  icon={AntDesignIcon}
104
+ useArrow
104
105
  iconProps={{
105
106
  name: 'arrowleft',
106
107
  size: 26
@@ -9,6 +9,7 @@ import { ScrollView } from 'react-native-gesture-handler';
9
9
  import { Tab } from './styles'
10
10
  import { useTheme } from 'styled-components/native';
11
11
  import { Container } from '../../layouts/Container';
12
+ import NavBar from '../NavBar'
12
13
 
13
14
  export const MyOrders = (props: any) => {
14
15
  const {
@@ -93,29 +94,15 @@ export const MyOrders = (props: any) => {
93
94
  ...props.titleStyle
94
95
  }}>
95
96
  {!props.hideBackBtn && (!isChewLayout || (isChewLayout && hideOrdersTheme)) && (
96
- <OButton
97
- imgLeftStyle={{ width: 18 }}
98
- imgRightSrc={null}
99
- style={{
100
- borderWidth: 0,
101
- width: 26,
102
- height: 26,
103
- backgroundColor: '#FFF',
104
- borderColor: '#FFF',
105
- shadowColor: '#FFF',
106
- paddingLeft: 0,
107
- paddingRight: 0,
108
- marginTop: 30,
109
- }}
110
- onClick={goToBack}
111
- icon={AntDesignIcon}
112
- iconProps={{
113
- name: 'arrowleft',
114
- size: 26
115
- }}
97
+ <NavBar
98
+ title={t('MY_ORDERS', 'My Orders')}
99
+ titleAlign={'center'}
100
+ onActionLeft={goToBack}
101
+ showCall={false}
102
+ paddingTop={30}
103
+ btnStyle={{ paddingLeft: 0 }}
116
104
  />
117
105
  )}
118
- <HeaderTitle ph={10} text={t('MY_ORDERS', 'My Orders')} />
119
106
  </View>
120
107
  )}
121
108
  {!hideOrders && !isChewLayout && !showNavbar && (
@@ -125,7 +112,7 @@ export const MyOrders = (props: any) => {
125
112
  <ScrollView
126
113
  horizontal
127
114
  style={{ ...styles.container, borderBottomWidth: 1 }}
128
- contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : 20 }}
115
+ contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : 20 }}
129
116
  showsHorizontalScrollIndicator={false}
130
117
  scrollEventThrottle={16}
131
118
  >
@@ -149,7 +136,7 @@ export const MyOrders = (props: any) => {
149
136
  )}
150
137
  {selectedOption === 'orders' && (
151
138
  <>
152
- <View style={{ paddingHorizontal: 20 }}>
139
+ <View style={{ paddingHorizontal: 20 }}>
153
140
  <OrdersOption
154
141
  {...props}
155
142
  preOrders
@@ -1,3 +1,6 @@
1
+
2
+
3
+
1
4
  import * as React from 'react'
2
5
  import styled, { useTheme } from 'styled-components/native'
3
6
  import { OButton, OIcon, OText } from '../shared'
@@ -64,6 +67,7 @@ const NavBar = (props: Props) => {
64
67
  <Wrapper style={{ paddingTop: props.paddingTop, ...{ flexDirection: props.isVertical ? 'column' : 'row', alignItems: props.isVertical ? 'flex-start' : 'center' }, ...props.style }}>
65
68
  {!props.hideArrowLeft && (
66
69
  <OButton
70
+ useArrow
67
71
  iconProps={{
68
72
  name: 'arrowleft',
69
73
  size: 26
@@ -114,8 +118,6 @@ const NavBar = (props: Props) => {
114
118
  {props.showCall
115
119
  ? (<OButton
116
120
  isCircle={true}
117
- bgColor={theme.colors.primary}
118
- borderColor={theme.colors.primary}
119
121
  imgRightSrc={null}
120
122
  imgLeftStyle={{ tintColor: 'white', width: 30, height: 30 }}
121
123
  imgLeftSrc={theme.images.general.support}
@@ -131,8 +133,9 @@ NavBar.defaultProps = {
131
133
  textAlign: 'center'
132
134
  };
133
135
 
134
- const areEqual = (prevProps: { route?: any; }, nextProps: { route?: any; }) => {
135
- return prevProps.route === nextProps.route
136
+ const areEqual = (prevProps: { route?: any, title?: string }, nextProps: { route?: any, title?: string }) => {
137
+ return prevProps.route === nextProps.route &&
138
+ JSON.stringify(prevProps.title) === JSON.stringify(nextProps.title)
136
139
  return true
137
140
  }
138
141
 
@@ -45,15 +45,10 @@ export const NetworkError = (props: NoNetworkParams) => {
45
45
  />
46
46
  <OButton
47
47
  text={t('REFRESH', 'Refresh')}
48
- bgColor={theme.colors.primary}
49
- borderColor={theme.colors.primary}
50
48
  style={{
51
49
  borderRadius: 8,
52
50
  marginTop: 45
53
51
  }}
54
- textStyle={{
55
- color: theme.colors.white
56
- }}
57
52
  onClick={() => RNRestart.Restart()}
58
53
  />
59
54
  </ImageContainer>
@@ -42,11 +42,8 @@ export const NotFoundSource = (props: NotFoundSourceParams) => {
42
42
  <View style={{ marginTop: 10, width: '100%' }}>
43
43
  <OButton
44
44
  style={{ width: '100%', height: 50, ...btnStyle }}
45
- bgColor={theme.colors.primary}
46
- borderColor={theme.colors.primary}
47
45
  onClick={() => onClickButton()}
48
46
  text={btnTitle}
49
- textStyle={{ color: theme.colors.white }}
50
47
  />
51
48
  </View>
52
49
  )}
@@ -10,13 +10,14 @@ export const OrderEta = (props: any) => {
10
10
 
11
11
  const [{ parseDate }] = useUtils()
12
12
  const [estimatedDeliveryTime, setEstimatedDeliveryTime] = useState(null)
13
-
13
+ const deliveryTypes = [1, 7]
14
+
14
15
  const getEstimatedDeliveryTime = () => {
15
16
  let estimatedUtcTime = null
16
17
  let totalEta = 0
17
18
  if (order?.delivered_in) totalEta += order?.delivered_in
18
19
  if (order?.prepared_in) totalEta += order?.prepared_in
19
- if (order?.delivery_type === 1 && order?.eta_drive_time) {
20
+ if (deliveryTypes?.includes?.(order?.delivery_type) && order?.eta_drive_time) {
20
21
  totalEta += order?.eta_drive_time
21
22
  }
22
23
 
@@ -57,7 +58,7 @@ export const OrderEta = (props: any) => {
57
58
  }
58
59
  estimatedUtcTime = moment.utc(_delivery).add(totalEta, 'minutes')
59
60
  const _estimatedTime = outputFormat ? moment(estimatedUtcTime).local().format(outputFormat) : parseDate(estimatedUtcTime, { utc: false })
60
- setEstimatedDeliveryTime(_estimatedTime)
61
+ setEstimatedDeliveryTime(order?.status === 13 ? parseDate(_delivery, { utc: !!order?.delivery_datetime_utc, outputFormat: outputFormat }) : _estimatedTime)
61
62
  }
62
63
 
63
64
  useEffect(() => {
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
2
  import { useTheme } from 'styled-components/native'
3
3
  import { ScrollView, StyleSheet, View } from 'react-native'
4
- import { useLanguage, useUtils } from 'ordering-components/native'
4
+ import { useLanguage, useUtils, useConfig } from 'ordering-components/native'
5
5
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'
6
6
  import { OText, OButton } from '../shared'
7
7
  import { formatSeconds } from '../../utils'
@@ -17,7 +17,9 @@ export const OrderHistory = (props: any) => {
17
17
 
18
18
  const [, t] = useLanguage()
19
19
  const [{ parseDate }] = useUtils()
20
+ const [{ configs }] = useConfig();
20
21
  const theme = useTheme()
22
+ const changeIdToExternalId = configs?.change_order_id?.value === '1'
21
23
 
22
24
  const styles = StyleSheet.create({
23
25
  historyItem: {
@@ -62,7 +64,10 @@ export const OrderHistory = (props: any) => {
62
64
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
63
65
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
64
66
  22: 'ORDER_LOOKING_FOR_DRIVER',
65
- 23: 'ORDER_DRIVER_ON_WAY'
67
+ 23: 'ORDER_DRIVER_ON_WAY',
68
+ 24: 'ORDER_DRIVER_WAITING_FOR_ORDER',
69
+ 25: 'ORDER_ACCEPTED_BY_DRIVER_COMPANY',
70
+ 26: 'ORDER_DRIVER_ARRIVED_CUSTOMER'
66
71
  }
67
72
 
68
73
  const getLogisticTagStatus = (status: any) => {
@@ -90,7 +95,7 @@ export const OrderHistory = (props: any) => {
90
95
  return (
91
96
  <ScrollView contentContainerStyle={styles.container}>
92
97
  <OText size={20} style={{ alignSelf: 'center', textAlign: 'center' }} mBottom={10}>
93
- {t('DETAILS_OF_ORDER', 'Details of Order_NUMBER_').replace('_NUMBER_', ` # ${order?.id}`)}
98
+ {t('DETAILS_OF_ORDER', 'Details of Order_NUMBER_').replace('_NUMBER_', (changeIdToExternalId && order?.external_id) || `# ${order?.id}`)}
94
99
  </OText>
95
100
  {!messages?.loading && order && (
96
101
  <View style={styles.historyItem}>
@@ -145,10 +150,10 @@ export const OrderHistory = (props: any) => {
145
150
  </>
146
151
  )
147
152
  : message.change?.attribute === 'prepared_in' ? (
148
- <>
149
- {t('TIME_ADDED_BY_BUSINESS', 'Time added by business')}{'\n'}
150
- {formatSeconds(parseInt(message.change.new, 10))}
151
- </>
153
+ <>
154
+ {t('TIME_ADDED_BY_BUSINESS', 'Time added by business')}{'\n'}
155
+ {formatSeconds(parseInt(message.change.new, 10))}
156
+ </>
152
157
  ) : t(ORDER_STATUS[parseInt(message.change.new, 10)])
153
158
  }
154
159
  </OText>
@@ -170,11 +175,9 @@ export const OrderHistory = (props: any) => {
170
175
  ))}
171
176
  <OButton
172
177
  text={enableReview ? t('REVIEW_ORDER', 'Review order') : t('CONTINUE', 'Continue')}
173
- textStyle={{ fontSize: 14, color: theme.colors.white }}
178
+ textStyle={{ fontSize: 14 }}
174
179
  imgRightSrc={theme.images.general.arrow_right}
175
180
  imgRightStyle={{ tintColor: theme.colors.white, right: 5, margin: 5 }}
176
- borderColor='transparent'
177
- bgColor={theme.colors.primary}
178
181
  style={{ borderRadius: 7.6, borderWidth: 1, height: 44, shadowOpacity: 0, marginBottom: 30, marginTop: 20 }}
179
182
  onClick={() => handleReview()}
180
183
  />