ordering-ui-react-native 0.21.85 → 0.21.86-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 (166) 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/types/index.tsx +3 -1
  7. package/themes/business/index.tsx +2 -0
  8. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  9. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  10. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  11. package/themes/business/src/components/BusinessProductList/index.tsx +2 -1
  12. package/themes/business/src/components/Chat/index.tsx +3 -1
  13. package/themes/business/src/components/DriverMap/index.tsx +44 -27
  14. package/themes/business/src/components/GoogleMap/index.tsx +15 -8
  15. package/themes/business/src/components/Home/index.tsx +5 -1
  16. package/themes/business/src/components/LanguageSelector/index.tsx +2 -3
  17. package/themes/business/src/components/LanguageSelector/lang_country.json +515 -70
  18. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  19. package/themes/business/src/components/MapView/index.tsx +36 -17
  20. package/themes/business/src/components/NewOrderNotification/index.tsx +79 -33
  21. package/themes/business/src/components/OrderDetails/Business.tsx +65 -7
  22. package/themes/business/src/components/OrderDetails/Delivery.tsx +35 -20
  23. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +110 -40
  24. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +50 -24
  25. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  26. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +221 -0
  27. package/themes/business/src/components/OrderSummary/index.tsx +223 -73
  28. package/themes/business/src/components/OrdersListManager/index.tsx +9 -1
  29. package/themes/business/src/components/OrdersOption/index.tsx +247 -159
  30. package/themes/business/src/components/PhoneInputNumber/index.tsx +8 -5
  31. package/themes/business/src/components/PreviousMessages/index.tsx +20 -3
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +27 -16
  33. package/themes/business/src/components/PreviousOrders/index.tsx +5 -3
  34. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  35. package/themes/business/src/components/PrinterEdition/index.tsx +431 -0
  36. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  37. package/themes/business/src/components/PrinterEdition/styles.tsx +61 -0
  38. package/themes/business/src/components/PrinterSettings/index.tsx +267 -0
  39. package/themes/business/src/components/PrinterSettings/styles.tsx +30 -0
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  41. package/themes/business/src/components/Sessions/index.tsx +1 -1
  42. package/themes/business/src/components/StoresList/index.tsx +2 -2
  43. package/themes/business/src/components/UserFormDetails/index.tsx +111 -107
  44. package/themes/business/src/components/UserProfileForm/index.tsx +60 -39
  45. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  46. package/themes/business/src/components/shared/OInput.tsx +2 -0
  47. package/themes/business/src/components/shared/OTextarea.tsx +8 -9
  48. package/themes/business/src/hooks/useLocation.tsx +5 -4
  49. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  50. package/themes/business/src/types/index.tsx +15 -5
  51. package/themes/business/src/utils/index.tsx +19 -1
  52. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  54. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  55. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/original/index.tsx +13 -1
  61. package/themes/original/src/components/AddressDetails/index.tsx +20 -10
  62. package/themes/original/src/components/AddressForm/index.tsx +32 -17
  63. package/themes/original/src/components/AddressList/index.tsx +8 -7
  64. package/themes/original/src/components/AnalyticsSegment/index.tsx +6 -6
  65. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  66. package/themes/original/src/components/BusinessBasicInformation/index.tsx +5 -8
  67. package/themes/original/src/components/BusinessController/index.tsx +12 -7
  68. package/themes/original/src/components/BusinessItemAccordion/index.tsx +13 -5
  69. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +2 -3
  70. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +1 -3
  71. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  72. package/themes/original/src/components/BusinessPreorder/index.tsx +20 -15
  73. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +5 -5
  74. package/themes/original/src/components/BusinessProductsList/index.tsx +2 -2
  75. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  76. package/themes/original/src/components/BusinessProductsListing/index.tsx +18 -6
  77. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  78. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  79. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +1 -1
  80. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  81. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  82. package/themes/original/src/components/Cart/index.tsx +43 -15
  83. package/themes/original/src/components/CartContent/index.tsx +21 -8
  84. package/themes/original/src/components/Checkout/index.tsx +108 -60
  85. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  86. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  87. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  88. package/themes/original/src/components/Favorite/index.tsx +1 -5
  89. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  90. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -7
  91. package/themes/original/src/components/GiftCard/GiftCardOrdersList/index.tsx +64 -0
  92. package/themes/original/src/components/GiftCard/GiftCardOrdersList/styles.tsx +8 -0
  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/SingleGiftCard/index.tsx +101 -0
  98. package/themes/original/src/components/GiftCard/SingleGiftCard/styles.tsx +4 -0
  99. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +82 -0
  100. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/styles.tsx +9 -0
  101. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  102. package/themes/original/src/components/Help/index.tsx +2 -0
  103. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  104. package/themes/original/src/components/Home/index.tsx +2 -10
  105. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  106. package/themes/original/src/components/LoginForm/index.tsx +4 -7
  107. package/themes/original/src/components/MessageListing/index.tsx +1 -0
  108. package/themes/original/src/components/Messages/index.tsx +8 -7
  109. package/themes/original/src/components/MomentOption/index.tsx +13 -2
  110. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +7 -3
  111. package/themes/original/src/components/MultiCheckout/index.tsx +139 -87
  112. package/themes/original/src/components/MultiOrdersDetails/index.tsx +2 -1
  113. package/themes/original/src/components/MyOrders/index.tsx +21 -26
  114. package/themes/original/src/components/NavBar/index.tsx +7 -4
  115. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  116. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  117. package/themes/original/src/components/OrderDetails/OrderEta.tsx +1 -1
  118. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +9 -9
  119. package/themes/original/src/components/OrderDetails/index.tsx +32 -13
  120. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  121. package/themes/original/src/components/OrderProgress/index.tsx +22 -3
  122. package/themes/original/src/components/OrderSummary/index.tsx +28 -9
  123. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -6
  124. package/themes/original/src/components/OrdersOption/index.tsx +2 -4
  125. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  126. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  127. package/themes/original/src/components/PaymentOptions/index.tsx +17 -9
  128. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  129. package/themes/original/src/components/PreviousOrders/index.tsx +1 -2
  130. package/themes/original/src/components/ProductForm/ActionButton.tsx +17 -20
  131. package/themes/original/src/components/ProductForm/index.tsx +107 -102
  132. package/themes/original/src/components/ProductItemAccordion/index.tsx +55 -49
  133. package/themes/original/src/components/ProductItemAccordion/styles.tsx +3 -4
  134. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  135. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  136. package/themes/original/src/components/Promotions/index.tsx +6 -9
  137. package/themes/original/src/components/ReviewDriver/index.tsx +1 -1
  138. package/themes/original/src/components/ReviewOrder/index.tsx +2 -2
  139. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  140. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  141. package/themes/original/src/components/ServiceForm/index.tsx +52 -54
  142. package/themes/original/src/components/Sessions/index.tsx +3 -3
  143. package/themes/original/src/components/SignupForm/index.tsx +86 -78
  144. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -5
  145. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  146. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  147. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  148. package/themes/original/src/components/StripeCardsList/index.tsx +10 -3
  149. package/themes/original/src/components/StripeElementsForm/index.tsx +77 -60
  150. package/themes/original/src/components/StripeElementsForm/naked.tsx +48 -1
  151. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  152. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  153. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +10 -7
  154. package/themes/original/src/components/UpsellingProducts/UpsellingLayout.tsx +8 -3
  155. package/themes/original/src/components/UserDetails/index.tsx +3 -2
  156. package/themes/original/src/components/UserFormDetails/index.tsx +155 -131
  157. package/themes/original/src/components/UserProfile/index.tsx +11 -2
  158. package/themes/original/src/components/Wallets/index.tsx +6 -3
  159. package/themes/original/src/components/WebsocketStatus/index.tsx +169 -0
  160. package/themes/original/src/components/WebsocketStatus/styles.tsx +28 -0
  161. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  162. package/themes/original/src/components/shared/OButton.tsx +5 -4
  163. package/themes/original/src/components/shared/OInput.tsx +4 -8
  164. package/themes/original/src/types/index.tsx +5 -1
  165. package/themes/original/src/utils/index.tsx +12 -1
  166. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -127,12 +127,12 @@ const MessagesUI = (props: MessagesParams) => {
127
127
  return message.change?.attribute !== 'driver_id'
128
128
  ?
129
129
  `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute)
130
- ? `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}`
131
- : `${message.change?.attribute !== 'logistic_status'
132
- ? message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])
133
- : message.change.old !== null && getLogisticTag(message.change.old)} ${t('TO', 'to')} ${message.change?.attribute !== 'logistic_status'
134
- ? t(ORDER_STATUS[parseInt(message.change.new, 10)])
135
- : getLogisticTag(message.change.new)}`
130
+ ? `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}`
131
+ : `${message.change?.attribute !== 'logistic_status'
132
+ ? message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])
133
+ : message.change.old !== null && getLogisticTag(message.change.old)} ${t('TO', 'to')} ${message.change?.attribute !== 'logistic_status'
134
+ ? t(ORDER_STATUS[parseInt(message.change.new, 10)])
135
+ : getLogisticTag(message.change.new)}`
136
136
  }`
137
137
  : message.change.new
138
138
  ?
@@ -461,7 +461,7 @@ const MessagesUI = (props: MessagesParams) => {
461
461
  active={business}
462
462
  >
463
463
  <OIcon
464
- url={order?.business?.logo || theme.images.dummies.businessLogo}
464
+ url={order?.business?.logo}
465
465
  width={32}
466
466
  height={32}
467
467
  style={{ borderRadius: 32 }}
@@ -503,6 +503,7 @@ const MessagesUI = (props: MessagesParams) => {
503
503
  scrollToBottom
504
504
  renderAvatarOnTop
505
505
  renderUsernameOnMessage
506
+ renderAvatar={() => null}
506
507
  renderInputToolbar={renderInputToolbar}
507
508
  renderComposer={renderComposer}
508
509
  renderSend={renderSend}
@@ -29,7 +29,7 @@ import {
29
29
  TimeItem
30
30
  } from './styles';
31
31
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
32
- import { locale, monthsEnum } from '../../utils';
32
+ import { monthsEnum, setLocalMoment } from '../../utils';
33
33
 
34
34
  const MomentOptionUI = (props: MomentOptionParams) => {
35
35
  const {
@@ -323,6 +323,10 @@ const MomentOptionUI = (props: MomentOptionParams) => {
323
323
  }
324
324
  }, [dateSelected, JSON.stringify(hoursList), JSON.stringify(datesWhitelist), cateringPreorder, JSON.stringify(business)])
325
325
 
326
+ useEffect(() => {
327
+ setLocalMoment(moment, t)
328
+ }, [])
329
+
326
330
  return (
327
331
  <>
328
332
  <Container
@@ -468,7 +472,14 @@ const MomentOptionUI = (props: MomentOptionParams) => {
468
472
  </Container>
469
473
  {!isCart && !cateringPreorder && (
470
474
  <View style={{ position: 'absolute', bottom: bottom, paddingBottom: 20, paddingHorizontal: 20, backgroundColor: 'white', width: '100%' }}>
471
- <OButton onClick={() => handleChangeMoment()} isDisabled={!selectedTime} text={t('CONTINUE', 'Continue')} style={{ borderRadius: 7.6, height: 44, shadowOpacity: 0 }} textStyle={{ color: 'white', fontSize: 14 }} showNextIcon />
475
+ <OButton
476
+ onClick={() => handleChangeMoment()}
477
+ isDisabled={!selectedTime}
478
+ text={t('CONTINUE', 'Continue')}
479
+ style={{ borderRadius: 7.6, height: 44, shadowOpacity: 0 }}
480
+ textStyle={{ fontSize: 14 }}
481
+ showNextIcon
482
+ />
472
483
  </View>
473
484
  )}
474
485
  </>
@@ -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,32 +248,43 @@ 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
+ }
271
+
272
+ const handleGoBack = () => {
273
+ if (navigation?.canGoBack()) {
274
+ navigation.goBack()
275
+ } else {
276
+ navigation.navigate('BottomTab', { screen: 'Cart' })
277
+ }
278
+ }
247
279
 
248
280
  useEffect(() => {
249
- if (validationFields && validationFields?.fields?.checkout) {
281
+ if (checkoutFieldsState?.loading || userLoading) return
282
+ if (user?.guest_id) {
283
+ checkGuestValidationFields()
284
+ } else {
250
285
  checkValidationFields()
251
286
  }
252
- }, [validationFields, user])
287
+ }, [checkoutFieldsState, user, options?.type])
253
288
 
254
289
  useEffect(() => {
255
290
  if (cartsToShow?.length === 1) {
@@ -283,13 +318,25 @@ const MultiCheckoutUI = (props: any) => {
283
318
  }
284
319
  }, [paymethodSelected])
285
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
+
286
333
  return (
287
334
  <>
288
335
  <SafeAreaView style={{ backgroundColor: theme.colors.backgroundPage }}>
289
336
  <View style={styles.wrapperNavbar}>
290
337
  <TopHeader>
291
338
  <>
292
- <TopActions onPress={() => navigation?.canGoBack() && navigation.goBack()}>
339
+ <TopActions onPress={() => handleGoBack()}>
293
340
  <IconAntDesign
294
341
  name='arrowleft'
295
342
  size={26}
@@ -310,7 +357,7 @@ const MultiCheckoutUI = (props: any) => {
310
357
  </TopHeader>
311
358
  </View>
312
359
  </SafeAreaView>
313
- <Container pt={0} noPadding onScroll={handleScroll}>
360
+ <Container pt={0} noPadding onScroll={handleScroll} showsVerticalScrollIndicator={false}>
314
361
  <View style={styles.wrapperNavbar}>
315
362
  <NavBar
316
363
  hideArrowLeft
@@ -321,8 +368,8 @@ const MultiCheckoutUI = (props: any) => {
321
368
  paddingTop={Platform.OS === 'ios' ? 0 : 4}
322
369
  btnStyle={{ paddingLeft: 0 }}
323
370
  titleWrapStyle={{ paddingHorizontal: 0 }}
324
- titleStyle={{ marginRight: 0, marginLeft: 0 }}
325
- style={{ marginTop: 20 }}
371
+ titleStyle={{ marginRight: 0, marginLeft: 0 }}
372
+ style={{ marginTop: 20 }}
326
373
  />
327
374
  </View>
328
375
  <ChContainer style={styles.pagePadding}>
@@ -373,15 +420,11 @@ const MultiCheckoutUI = (props: any) => {
373
420
  </OText>
374
421
  <OButton
375
422
  text={t('SIGN_UP', 'Sign up')}
376
- textStyle={{ color: theme.colors.white }}
377
423
  style={{ borderRadius: 7.6, marginTop: 20 }}
378
424
  onClick={() => setOpenModal({ ...openModal, signup: true })}
379
425
  />
380
426
  <OButton
381
427
  text={t('LOGIN', 'Login')}
382
- textStyle={{ color: theme.colors.primary }}
383
- bgColor={theme.colors.white}
384
- borderColor={theme.colors.primary}
385
428
  style={{ borderRadius: 7.6, marginTop: 20 }}
386
429
  onClick={() => setOpenModal({ ...openModal, login: true })}
387
430
  />
@@ -403,6 +446,9 @@ const MultiCheckoutUI = (props: any) => {
403
446
  isCheckout
404
447
  phoneUpdate={phoneUpdate}
405
448
  togglePhoneUpdate={togglePhoneUpdate}
449
+ isOrderTypeValidationField
450
+ requiredFields={requiredFields}
451
+ checkoutFields={checkoutFields}
406
452
  />
407
453
  )}
408
454
  </ChUserDetails>
@@ -514,6 +560,9 @@ const MultiCheckoutUI = (props: any) => {
514
560
  hideDriverTip={configs?.multi_business_checkout_show_combined_driver_tip?.value === '1'}
515
561
  onNavigationRedirect={(route: string, params: any) => props.navigation.navigate(route, params)}
516
562
  businessConfigs={cart?.business?.configs}
563
+ cartsOpened={cartsOpened}
564
+ changeActiveState={changeActiveState}
565
+ isActive={cartsOpened?.includes?.(cart?.uuid)}
517
566
  />
518
567
  {openCarts.length > 1 && (
519
568
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 13, marginHorizontal: -40 }} />
@@ -623,30 +672,33 @@ const MultiCheckoutUI = (props: any) => {
623
672
  </ScrollView>
624
673
  </OModal>
625
674
  <OModal
626
- open={isOpen}
627
- onClose={() => setIsOpen(false)}
628
- >
629
- <View style={styles.detailWrapper}>
630
- <UserDetails
631
- isUserDetailsEdit
632
- useValidationFields
633
- useDefualtSessionManager
634
- useSessionUser
635
- isCheckout
636
- isEdit
637
- phoneUpdate={phoneUpdate}
638
- togglePhoneUpdate={togglePhoneUpdate}
639
- requiredFields={requiredFields}
640
- hideUpdateButton
641
- handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
642
- onClose={() => {
643
- setIsOpen(false)
644
- handlePlaceOrder()
645
- }}
646
- setIsOpen={setIsOpen}
647
- />
648
- </View>
649
- </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>
650
702
  </Container>
651
703
 
652
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
@@ -2,13 +2,14 @@ import React, { useState, useEffect } from 'react'
2
2
  import { useLanguage } from 'ordering-components/native';
3
3
  import { View, StyleSheet, RefreshControl, Platform } from 'react-native';
4
4
  import AntDesignIcon from 'react-native-vector-icons/AntDesign'
5
-
5
+ import { GiftCardOrdersList } from '../GiftCard/GiftCardOrdersList'
6
6
  import { OrdersOption } from '../OrdersOption'
7
7
  import { HeaderTitle, OButton, OText } from '../shared'
8
8
  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 {
@@ -40,7 +41,8 @@ export const MyOrders = (props: any) => {
40
41
  const MyOrdersMenu = [
41
42
  { key: 'orders', value: t('ORDERS', 'Orders'), disabled: false },
42
43
  { key: 'business', value: t('BUSINESS', 'Business'), disabled: hideBusinessTab },
43
- { key: 'products', value: t('PRODUCTS', 'Products'), disabled: hideProductsTab }
44
+ { key: 'products', value: t('PRODUCTS', 'Products'), disabled: hideProductsTab },
45
+ { key: 'giftCards', value: t('GIFT_CARD', 'Gift card'), disabled: false }
44
46
  ]
45
47
  const goToBack = () => navigation?.canGoBack() && navigation.goBack()
46
48
 
@@ -92,29 +94,15 @@ export const MyOrders = (props: any) => {
92
94
  ...props.titleStyle
93
95
  }}>
94
96
  {!props.hideBackBtn && (!isChewLayout || (isChewLayout && hideOrdersTheme)) && (
95
- <OButton
96
- imgLeftStyle={{ width: 18 }}
97
- imgRightSrc={null}
98
- style={{
99
- borderWidth: 0,
100
- width: 26,
101
- height: 26,
102
- backgroundColor: '#FFF',
103
- borderColor: '#FFF',
104
- shadowColor: '#FFF',
105
- paddingLeft: 0,
106
- paddingRight: 0,
107
- marginTop: 30,
108
- }}
109
- onClick={goToBack}
110
- icon={AntDesignIcon}
111
- iconProps={{
112
- name: 'arrowleft',
113
- size: 26
114
- }}
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 }}
115
104
  />
116
105
  )}
117
- <HeaderTitle ph={10} text={t('MY_ORDERS', 'My Orders')} />
118
106
  </View>
119
107
  )}
120
108
  {!hideOrders && !isChewLayout && !showNavbar && (
@@ -124,7 +112,7 @@ export const MyOrders = (props: any) => {
124
112
  <ScrollView
125
113
  horizontal
126
114
  style={{ ...styles.container, borderBottomWidth: 1 }}
127
- contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : 20 }}
115
+ contentContainerStyle={{ paddingHorizontal: !!businessesSearchList ? 0 : 20 }}
128
116
  showsHorizontalScrollIndicator={false}
129
117
  scrollEventThrottle={16}
130
118
  >
@@ -148,7 +136,7 @@ export const MyOrders = (props: any) => {
148
136
  )}
149
137
  {selectedOption === 'orders' && (
150
138
  <>
151
- <View style={{ paddingHorizontal: 20 }}>
139
+ <View style={{ paddingHorizontal: 20 }}>
152
140
  <OrdersOption
153
141
  {...props}
154
142
  preOrders
@@ -215,7 +203,14 @@ export const MyOrders = (props: any) => {
215
203
  setOrdersLength={setOrdersLength}
216
204
  />
217
205
  )}
206
+
207
+ {selectedOption === 'giftCards' && (
208
+ <View style={{ paddingHorizontal: 20 }}>
209
+ <GiftCardOrdersList
210
+ onNavigationRedirect={props?.onNavigationRedirect}
211
+ />
212
+ </View>
213
+ )}
218
214
  </Container>
219
-
220
215
  )
221
216
  }
@@ -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
  )}