ordering-ui-react-native 0.14.90 → 0.14.91-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 (134) hide show
  1. package/package.json +6 -3
  2. package/src/DeliveryApp.tsx +34 -2
  3. package/src/assets/images/no-network.png +0 -0
  4. package/src/components/BusinessTypeFilter/index.tsx +9 -2
  5. package/src/components/BusinessTypeFilter/styles.tsx +1 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Cart/index.tsx +1 -1
  8. package/src/components/Checkout/index.tsx +0 -1
  9. package/src/components/Home/index.tsx +3 -5
  10. package/src/components/LanguageSelector/index.tsx +65 -97
  11. package/src/components/LanguageSelector/styles.tsx +4 -17
  12. package/src/components/Messages/index.tsx +38 -30
  13. package/src/components/MomentOption/index.tsx +3 -1
  14. package/src/components/OrderDetails/index.tsx +26 -5
  15. package/src/components/PaymentOptions/index.tsx +7 -16
  16. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  17. package/src/components/ProductForm/index.tsx +1 -1
  18. package/src/components/ProductForm/styles.tsx +1 -0
  19. package/src/components/StripeElementsForm/index.tsx +27 -48
  20. package/src/components/UserProfileForm/index.tsx +35 -1
  21. package/src/components/VerifyPhone/styles.tsx +1 -2
  22. package/src/config.json +0 -2
  23. package/src/pages/Checkout.tsx +1 -1
  24. package/src/providers/AlertProvider.tsx +4 -1
  25. package/src/theme.json +2 -1
  26. package/src/types/index.tsx +2 -9
  27. package/src/utils/index.tsx +2 -1
  28. package/themes/business/index.tsx +4 -0
  29. package/themes/business/src/components/Chat/index.tsx +32 -31
  30. package/themes/business/src/components/NetworkError/index.tsx +61 -0
  31. package/themes/business/src/components/NetworkError/styles.tsx +11 -0
  32. package/themes/business/src/components/OrderDetails/Business.tsx +1 -0
  33. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +85 -17
  34. package/themes/business/src/components/OrdersListManager/index.tsx +871 -0
  35. package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
  36. package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
  37. package/themes/business/src/components/OrdersOption/index.tsx +18 -68
  38. package/themes/business/src/components/OrdersOption/styles.tsx +2 -5
  39. package/themes/business/src/components/PreviousOrders/index.tsx +80 -23
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +5 -1
  41. package/themes/business/src/types/index.tsx +4 -0
  42. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  43. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  44. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/kiosk/index.tsx +2 -0
  46. package/themes/kiosk/src/components/BusinessController/index.tsx +27 -6
  47. package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
  48. package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +51 -24
  49. package/themes/kiosk/src/components/Cart/index.tsx +1 -1
  50. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
  51. package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
  52. package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
  53. package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
  54. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +7 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
  56. package/themes/kiosk/src/components/Intro/index.tsx +13 -13
  57. package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/NetworkError/index.tsx +60 -0
  60. package/themes/kiosk/src/components/NetworkError/styles.tsx +11 -0
  61. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  62. package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
  63. package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
  64. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
  65. package/themes/kiosk/src/components/ProductForm/index.tsx +172 -124
  66. package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
  67. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
  68. package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
  69. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
  70. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  71. package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
  72. package/themes/kiosk/src/types/index.d.ts +4 -0
  73. package/themes/original/index.tsx +36 -6
  74. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  75. package/themes/original/src/components/AddressList/index.tsx +27 -1
  76. package/themes/original/src/components/AnalyticsSegment/index.tsx +127 -0
  77. package/themes/original/src/components/BusinessBasicInformation/index.tsx +11 -7
  78. package/themes/original/src/components/BusinessController/index.tsx +5 -4
  79. package/themes/original/src/components/BusinessMenuList/index.tsx +4 -2
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +142 -121
  81. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  82. package/themes/original/src/components/BusinessProductsList/index.tsx +50 -6
  83. package/themes/original/src/components/BusinessProductsListing/index.tsx +13 -10
  84. package/themes/original/src/components/BusinessReviews/index.tsx +4 -3
  85. package/themes/original/src/components/BusinessesListing/index.tsx +23 -22
  86. package/themes/original/src/components/Cart/index.tsx +42 -9
  87. package/themes/original/src/components/CartContent/index.tsx +2 -2
  88. package/themes/original/src/components/Checkout/index.tsx +54 -30
  89. package/themes/original/src/components/Checkout/styles.tsx +7 -0
  90. package/themes/original/src/components/CouponControl/index.tsx +1 -0
  91. package/themes/original/src/components/DriverTips/index.tsx +1 -1
  92. package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
  93. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +9 -2
  94. package/themes/original/src/components/LoginForm/index.tsx +83 -68
  95. package/themes/original/src/components/Messages/index.tsx +24 -21
  96. package/themes/original/src/components/Messages/styles.tsx +1 -3
  97. package/themes/original/src/components/MomentOption/index.tsx +127 -152
  98. package/themes/original/src/components/MomentOption/styles.tsx +42 -18
  99. package/themes/original/src/components/NetworkError/index.tsx +61 -0
  100. package/themes/original/src/components/NetworkError/styles.tsx +11 -0
  101. package/themes/original/src/components/OrderDetails/index.tsx +103 -124
  102. package/themes/original/src/components/OrderDetails/styles.tsx +3 -1
  103. package/themes/original/src/components/OrderProgress/index.tsx +2 -3
  104. package/themes/original/src/components/OrderSummary/index.tsx +34 -1
  105. package/themes/original/src/components/OrdersOption/index.tsx +16 -40
  106. package/themes/original/src/components/OrdersOption/styles.tsx +0 -5
  107. package/themes/original/src/components/PaymentOptions/index.tsx +21 -24
  108. package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
  109. package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
  110. package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
  111. package/themes/original/src/components/PreviousOrders/index.tsx +4 -0
  112. package/themes/original/src/components/ProductForm/index.tsx +154 -105
  113. package/themes/original/src/components/ProductForm/styles.tsx +5 -3
  114. package/themes/original/src/components/ProductOptionSubOption/index.tsx +6 -1
  115. package/themes/original/src/components/ReviewDriver/index.tsx +2 -1
  116. package/themes/original/src/components/ReviewOrder/index.tsx +2 -17
  117. package/themes/original/src/components/SignupForm/index.tsx +173 -154
  118. package/themes/original/src/components/SingleProductCard/index.tsx +6 -13
  119. package/themes/original/src/components/SingleProductCard/styles.tsx +1 -1
  120. package/themes/original/src/components/SingleProductReview/index.tsx +4 -0
  121. package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
  122. package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
  123. package/themes/original/src/components/UserDetails/index.tsx +4 -95
  124. package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
  125. package/themes/original/src/components/UserProfile/index.tsx +16 -9
  126. package/themes/original/src/components/UserProfileForm/index.tsx +16 -8
  127. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  128. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  129. package/themes/original/src/components/shared/HeaderTitle.tsx +20 -0
  130. package/themes/original/src/components/shared/index.tsx +2 -0
  131. package/themes/original/src/types/index.tsx +18 -8
  132. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +5 -5
  133. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  134. package/src/components/StripeMethodForm/index.tsx +0 -163
@@ -24,6 +24,7 @@ import AntIcon from 'react-native-vector-icons/AntDesign'
24
24
  import { TaxInformation } from '../TaxInformation';
25
25
  import { CartStoresListing } from '../CartStoresListing';
26
26
  import { OAlert } from '../../../../../src/components/shared'
27
+ import { PlaceSpot } from '../PlaceSpot'
27
28
 
28
29
  const CartUI = (props: any) => {
29
30
  const {
@@ -54,12 +55,14 @@ const CartUI = (props: any) => {
54
55
  const [canOpenUpselling, setCanOpenUpselling] = useState(false)
55
56
  const [openTaxModal, setOpenTaxModal] = useState<any>({ open: false, data: null, type: '' })
56
57
  const [confirm, setConfirm] = useState<any>({ open: false, content: null, handleOnAccept: null, id: null, title: null })
58
+ const [openPlaceModal, setOpenPlaceModal] = useState(false)
57
59
 
58
60
  const isCartPending = cart?.status === 2
59
61
  const isCouponEnabled = validationFields?.fields?.checkout?.coupon?.enabled
60
62
 
61
63
  const business: any = (orderState?.carts && Object.values(orderState.carts).find((_cart: any) => _cart?.uuid === props.cartuuid)) ?? {}
62
64
  const businessId = business?.business_id ?? null
65
+ const placeSpotTypes = [3, 4]
63
66
 
64
67
  const momentFormatted = !orderState?.option?.moment
65
68
  ? t('RIGHT_NOW', 'Right Now')
@@ -219,7 +222,7 @@ const CartUI = (props: any) => {
219
222
  </OSTable>
220
223
  ))
221
224
  }
222
- <Divider />
225
+ {/* <Divider /> */}
223
226
  {cart?.subtotal_with_discount > 0 && cart?.discount > 0 && cart?.total >= 0 && (
224
227
  <OSTable>
225
228
  <OText size={12} lineHeight={18} numberOfLines={1}>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</OText>
@@ -252,7 +255,7 @@ const CartUI = (props: any) => {
252
255
  <OSRow>
253
256
  <OText size={12} lineHeight={18} numberOfLines={1}>
254
257
  {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
255
- ({parsePrice(fee?.fixed)} + {fee?.percentage}%){' '}
258
+ ({fee?.fixed > 0 && `${parsePrice(fee?.fixed)} + `}{fee.percentage}%){' '}
256
259
  </OText>
257
260
  <TouchableOpacity onPress={() => setOpenTaxModal({ open: true, data: fee, type: 'fee' })} >
258
261
  <AntIcon name='infocirlceo' size={16} color={theme.colors.primary} />
@@ -353,6 +356,24 @@ const CartUI = (props: any) => {
353
356
  </OText>
354
357
  </OSTable>
355
358
  </OSTotal>
359
+ {placeSpotTypes.includes(orderState?.options?.type) && (
360
+ <OSTable style={{ marginTop: 15 }}>
361
+ <OText size={14} lineHeight={21} weight={'600'}>
362
+ {t('SPOT', 'Spot')}: {cart?.place?.name || t('NO_SELECTED', 'No selected')}
363
+ </OText>
364
+ <TouchableOpacity onPress={() => setOpenPlaceModal(true)}>
365
+ <OText
366
+ size={14}
367
+ lineHeight={21}
368
+ weight={'600'}
369
+ color={theme.colors.primary}
370
+ style={{ textDecorationLine: 'underline' }}
371
+ >
372
+ {t('EDIT', 'Edit')}
373
+ </OText>
374
+ </TouchableOpacity>
375
+ </OSTable>
376
+ )}
356
377
  {cart?.status !== 2 && (
357
378
  <OSTable>
358
379
  <View style={{ width: '100%', marginTop: 20 }}>
@@ -434,14 +455,26 @@ const CartUI = (props: any) => {
434
455
  products={cart?.products}
435
456
  />
436
457
  </OModal>
437
- <OAlert
438
- open={confirm.open}
439
- title={confirm.title}
440
- content={confirm.content}
441
- onAccept={confirm.handleOnAccept}
442
- onCancel={() => setConfirm({ ...confirm, open: false, title: null })}
443
- onClose={() => setConfirm({ ...confirm, open: false, title: null })}
458
+ <OModal
459
+ open={openPlaceModal}
460
+ title={t('CHOOSE_YOUR_SPOT', 'Choose your spot')}
461
+ onClose={() => setOpenPlaceModal(false)}
462
+ entireModal
463
+ >
464
+ <PlaceSpot
465
+ cart={cart}
466
+ isOpenPlaceSpot={openPlaceModal}
467
+ setOpenPlaceModal={setOpenPlaceModal}
444
468
  />
469
+ </OModal>
470
+ <OAlert
471
+ open={confirm.open}
472
+ title={confirm.title}
473
+ content={confirm.content}
474
+ onAccept={confirm.handleOnAccept}
475
+ onCancel={() => setConfirm({ ...confirm, open: false, title: null })}
476
+ onClose={() => setConfirm({ ...confirm, open: false, title: null })}
477
+ />
445
478
  </CContainer>
446
479
  )
447
480
  }
@@ -22,9 +22,9 @@ export const CartContent = (props: any) => {
22
22
  <CCContainer>
23
23
  {isOrderStateCarts && carts?.length > 0 && (
24
24
  <>
25
- <OText size={24} lineHeight={36} weight={'600'} style={{ marginBottom: 20 }}>
25
+ {/* <OText size={24} lineHeight={36} weight={'600'} style={{ marginBottom: 20 }}>
26
26
  {carts.length > 1 ? t('MY_CARTS', 'My Carts') : t('CART', 'Cart')}
27
- </OText>
27
+ </OText> */}
28
28
  {carts.map((cart: any, i: number) => (
29
29
  <CCList key={i} style={{ overflow: 'visible' }}>
30
30
  {cart.products.length > 0 && (
@@ -39,7 +39,8 @@ import {
39
39
  ChCart,
40
40
  DeliveryOptionsContainer,
41
41
  DeliveryOptionItem,
42
- WalletPaymentOptionContainer
42
+ WalletPaymentOptionContainer,
43
+ CartHeader
43
44
  } from './styles';
44
45
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
45
46
 
@@ -131,9 +132,11 @@ const CheckoutUI = (props: any) => {
131
132
  const [isDeliveryOptionModalVisible, setIsDeliveryOptionModalVisible] = useState(false)
132
133
  const [showGateway, setShowGateway] = useState<any>({ closedByUsed: false, open: false });
133
134
  const [webviewPaymethod, setWebviewPaymethod] = useState<any>(null)
134
-
135
-
135
+
136
+ const placeSpotTypes = [3, 4]
136
137
  const isWalletEnabled = configs?.wallet_enabled?.value === '1' && (configs?.wallet_cash_enabled?.value === '1' || configs?.wallet_credit_point_enabled?.value === '1')
138
+ const isPreOrder = configs?.preorder_status_enabled?.value === '1'
139
+ const isDisabledButtonPlace = loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum || (placeSpotTypes.includes(options?.type) && !cart?.place)
137
140
 
138
141
  const driverTipsOptions = typeof configs?.driver_tip_options?.value === 'string'
139
142
  ? JSON.parse(configs?.driver_tip_options?.value) || []
@@ -149,6 +152,12 @@ const CheckoutUI = (props: any) => {
149
152
  }
150
153
  })
151
154
 
155
+ const handleMomentClick = () => {
156
+ if (isPreOrder) {
157
+ navigation.navigate('MomentOption')
158
+ }
159
+ }
160
+
152
161
  const handlePlaceOrder = () => {
153
162
  if (!userErrors.length) {
154
163
  handlerClickPlaceOrder && handlerClickPlaceOrder()
@@ -193,8 +202,8 @@ const CheckoutUI = (props: any) => {
193
202
  if (
194
203
  !user?.cellphone &&
195
204
  ((validationFields?.fields?.checkout?.cellphone?.enabled &&
196
- validationFields?.fields?.checkout?.cellphone?.required) ||
197
- configs?.verification_phone_required?.value === '1')
205
+ validationFields?.fields?.checkout?.cellphone?.required) ||
206
+ configs?.verification_phone_required?.value === '1')
198
207
  ) {
199
208
  errors.push(t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Phone number is required'))
200
209
  }
@@ -260,7 +269,7 @@ const CheckoutUI = (props: any) => {
260
269
  />
261
270
  </CHMomentWrapper>
262
271
  <CHMomentWrapper
263
- onPress={() => navigation.navigate('MomentOption')}
272
+ onPress={() => handleMomentClick()}
264
273
  disabled={loading}
265
274
  >
266
275
  <OText size={12} numberOfLines={1} ellipsizeMode='tail' color={theme.colors.textSecondary}>
@@ -268,11 +277,13 @@ const CheckoutUI = (props: any) => {
268
277
  ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
269
278
  : t('ASAP_ABBREVIATION', 'ASAP')}
270
279
  </OText>
271
- <OIcon
272
- src={theme.images.general.arrow_down}
273
- width={10}
274
- style={{ marginStart: 8 }}
275
- />
280
+ {isPreOrder && (
281
+ <OIcon
282
+ src={theme.images.general.arrow_down}
283
+ width={10}
284
+ style={{ marginStart: 8 }}
285
+ />
286
+ )}
276
287
  </CHMomentWrapper>
277
288
  </ChHeader>
278
289
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
@@ -535,7 +546,6 @@ const CheckoutUI = (props: any) => {
535
546
  onNavigationRedirect={onNavigationRedirect}
536
547
  paySelected={paymethodSelected}
537
548
  handlePaymentMethodClickCustom={handlePaymentMethodClick}
538
- handlePlaceOrder={handlePlaceOrder}
539
549
  />
540
550
  </ChPaymethods>
541
551
  </ChSection>
@@ -561,9 +571,28 @@ const CheckoutUI = (props: any) => {
561
571
  />
562
572
  ) : (
563
573
  <>
564
- <OText size={16} lineHeight={24} color={theme.colors.textNormal}>
565
- {t('ORDER_SUMMARY', 'Order Summary')}
566
- </OText>
574
+ <CartHeader>
575
+ <OText
576
+ size={16}
577
+ lineHeight={24}
578
+ color={theme.colors.textNormal}
579
+ style={{ fontWeight: '500' }}
580
+ >
581
+ {t('MOBILE_FRONT_YOUR_ORDER', 'Your order')}
582
+ </OText>
583
+ <TouchableOpacity
584
+ onPress={() => onNavigationRedirect('Business', { store: cart?.business?.slug })}
585
+ >
586
+ <OText
587
+ size={10}
588
+ lineHeight={15}
589
+ color={theme.colors.primary}
590
+ style={{ textDecorationLine: 'underline' }}
591
+ >
592
+ {t('ADD_PRODUCTS', 'Add products')}
593
+ </OText>
594
+ </TouchableOpacity>
595
+ </CartHeader>
567
596
  {props.isFranchiseApp && (
568
597
  <TouchableOpacity
569
598
  onPress={() => setOpenChangeStore(true)}
@@ -619,6 +648,14 @@ const CheckoutUI = (props: any) => {
619
648
  {t('WARNING_INVALID_PRODUCTS', 'Some products are invalid, please check them.')}
620
649
  </OText>
621
650
  )}
651
+ {placeSpotTypes.includes(options?.type) && !cart?.place && (
652
+ <OText
653
+ color={theme.colors.error}
654
+ size={12}
655
+ >
656
+ {t('WARNING_PLACE_SPOT', 'Please, select your spot to place order.')}
657
+ </OText>
658
+ )}
622
659
  </ChErrors>
623
660
  </View>
624
661
  )}
@@ -638,8 +675,8 @@ const CheckoutUI = (props: any) => {
638
675
  {!cartState.loading && cart && cart?.status !== 2 && (
639
676
  <FloatingButton
640
677
  handleClick={() => handlePlaceOrder()}
641
- isSecondaryBtn={loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum}
642
- disabled={loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum}
678
+ isSecondaryBtn={isDisabledButtonPlace}
679
+ disabled={isDisabledButtonPlace}
643
680
  btnText={cart?.subtotal >= cart?.minimum
644
681
  ? (
645
682
  placing
@@ -667,19 +704,6 @@ const CheckoutUI = (props: any) => {
667
704
  setShowGateway={setShowGateway}
668
705
  />
669
706
  )}
670
- {webviewPaymethod?.gateway === 'square' && showGateway.open && (
671
- <PaymentOptionsWebView
672
- onNavigationRedirect={onNavigationRedirect}
673
- uri={`https://test-square-f50f7.web.app`}
674
- user={user}
675
- token={token}
676
- cart={cart}
677
- currency={currency}
678
- webviewPaymethod={webviewPaymethod}
679
- setShowGateway={setShowGateway}
680
- locationId={'L1NGAY5M6KJRX'}
681
- />
682
- )}
683
707
  </>
684
708
  )
685
709
  }
@@ -105,3 +105,10 @@ export const DeliveryOptionItem = styled.View`
105
105
  flex-direction: row;
106
106
  background-color: ${(props : any) => props?.backgroundColor ?? '#fff'};
107
107
  `;
108
+
109
+ export const CartHeader = styled.View`
110
+ align-items: center;
111
+ flex-direction: row;
112
+ justify-content: space-between;
113
+ margin-bottom: 10px;
114
+ `
@@ -87,6 +87,7 @@ const CouponControlUI = (props: any) => {
87
87
  ) : (
88
88
  <CCWrapper>
89
89
  <OInput
90
+ value={couponInput}
90
91
  placeholder={t('DISCOUNT_COUPON', 'Discount coupon')}
91
92
  onChange={(e: any) => onChangeInputCoupon(e)}
92
93
  style={styles.inputsStyle}
@@ -63,7 +63,7 @@ const DriverTipsUI = (props: any) => {
63
63
  return (
64
64
  <DTContainer>
65
65
  <DTWrapperTips>
66
- {driverTipsOptions.map((option: any, i: number) => (
66
+ {driverTipsOptions.map((option: any, i: number) => (
67
67
  <TouchableOpacity
68
68
  key={i}
69
69
  onPress={() => handlerChangeOption(option)}
@@ -65,18 +65,6 @@ const ForgotPasswordUI = (props: any) => {
65
65
  }
66
66
  }, [formState])
67
67
 
68
- useEffect(() => {
69
- if (Object.keys(errors).length > 0) {
70
- // Convert all errors in one string to show in toast provider
71
- const list = Object.values(errors)
72
- let stringError = ''
73
- list.map((item: any, i: number) => {
74
- stringError += (i + 1) === list.length ? `- ${item.message}` : `- ${item.message}\n`
75
- })
76
- showToast(ToastType.Error, stringError)
77
- }
78
- }, [errors])
79
-
80
68
  return (
81
69
  <Container>
82
70
  <NavBar
@@ -100,6 +88,14 @@ const ForgotPasswordUI = (props: any) => {
100
88
  {t('FORGOT_PASSWORD_TEXT_MESSAGE', "Enter your email address and we'll sent a link to reset your password.")}
101
89
  </OText>
102
90
  <FormInput>
91
+ {errors?.email && (
92
+ <OText
93
+ size={14}
94
+ color={theme.colors.danger5}
95
+ weight={'normal'}>
96
+ {errors?.email?.message}{errors?.email?.type === 'required' && '*'}
97
+ </OText>
98
+ )}
103
99
  <Controller
104
100
  control={control}
105
101
  render={({ onChange, value }: any) => (
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import {
3
3
  BusinessList as BusinessesListingController,
4
4
  useLanguage,
@@ -18,7 +18,9 @@ const HighestRatedBusinessesUI = (props: HighestRatedBusinessesParams) => {
18
18
  const {
19
19
  businessesList,
20
20
  onBusinessClick,
21
- navigation
21
+ navigation,
22
+ isLoading,
23
+ getBusinesses
22
24
  } = props;
23
25
 
24
26
  const [, t] = useLanguage()
@@ -26,6 +28,11 @@ const HighestRatedBusinessesUI = (props: HighestRatedBusinessesParams) => {
26
28
 
27
29
  const windowWidth = Dimensions.get('window').width;
28
30
 
31
+ useEffect(() => {
32
+ if (businessesList?.loading || !isLoading) return
33
+ getBusinesses(true)
34
+ }, [isLoading])
35
+
29
36
  return (
30
37
  <>
31
38
  <ListWrapper>
@@ -67,7 +67,7 @@ const LoginFormUI = (props: LoginParams) => {
67
67
  const [, t] = useLanguage();
68
68
  const [{ configs }] = useConfig();
69
69
  const [, { login }] = useSession();
70
- const { control, handleSubmit, errors } = useForm();
70
+ const { control, handleSubmit, errors, reset, register, setValue } = useForm();
71
71
  const [passwordSee, setPasswordSee] = useState(false);
72
72
  const [isLoadingVerifyModal, setIsLoadingVerifyModal] = useState(false);
73
73
  const [isModalVisible, setIsModalVisible] = useState(false);
@@ -91,7 +91,7 @@ const LoginFormUI = (props: LoginParams) => {
91
91
  inputStyle: {
92
92
  marginBottom: 28,
93
93
  borderWidth: 1,
94
- borderColor: theme.colors.border,
94
+ // borderColor: theme.colors.border,
95
95
  borderRadius: 7.6,
96
96
  },
97
97
  line: {
@@ -189,33 +189,21 @@ const LoginFormUI = (props: LoginParams) => {
189
189
  }, [verifyPhoneState]);
190
190
 
191
191
  useEffect(() => {
192
- if (Object.keys(errors).length > 0) {
193
- // Convert all errors in one string to show in toast provider
194
- const list = Object.values(errors);
195
- let stringError = '';
196
- if (phoneInputData.error) {
197
- list.unshift({ message: phoneInputData.error });
198
- }
199
- if (
200
- loginTab === 'cellphone' &&
201
- !phoneInputData.error &&
202
- !phoneInputData.phone.country_phone_code &&
203
- !phoneInputData.phone.cellphone
204
- ) {
205
- list.unshift({
206
- message: t(
207
- 'VALIDATION_ERROR_MOBILE_PHONE_REQUIRED',
208
- 'The field Mobile phone is required.',
209
- ),
210
- });
211
- }
212
- list.map((item: any, i: number) => {
213
- stringError +=
214
- i + 1 === list.length ? `- ${item.message}` : `- ${item.message}\n`;
215
- });
216
- showToast(ToastType.Error, stringError);
217
- }
218
- }, [errors]);
192
+ if (phoneInputData?.phone?.cellphone) setValue('cellphone', phoneInputData?.phone?.cellphone, '')
193
+ else setValue('cellphone', '')
194
+ }, [phoneInputData?.phone?.cellphone])
195
+
196
+ useEffect(() => {
197
+ register('cellphone', {
198
+ required: loginTab === 'cellphone'
199
+ ? t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Mobile phone is required').replace('_attribute_', t('CELLPHONE', 'Cellphone'))
200
+ : null
201
+ })
202
+ }, [register])
203
+
204
+ useEffect(() => {
205
+ reset()
206
+ }, [loginTab])
219
207
 
220
208
  return (
221
209
  <Container>
@@ -284,43 +272,58 @@ const LoginFormUI = (props: LoginParams) => {
284
272
  {(useLoginByCellphone || useLoginByEmail) && (
285
273
  <FormInput>
286
274
  {useLoginByEmail && loginTab === 'email' && (
287
- <Controller
288
- control={control}
289
- render={({ onChange, value }: any) => (
290
- <OInput
291
- placeholder={t('EMAIL', 'Email')}
292
- style={loginStyle.inputStyle}
293
- icon={theme.images.general.email}
294
- onChange={(e: any) => {
295
- handleChangeInputEmail(e, onChange);
296
- }}
297
- value={value}
298
- autoCapitalize="none"
299
- autoCorrect={false}
300
- type="email-address"
301
- autoCompleteType="email"
302
- returnKeyType="next"
303
- onSubmitEditing={() => passwordRef.current?.focus()}
304
- blurOnSubmit={false}
305
- forwardRef={emailRef}
306
- />
275
+ <>
276
+ {errors?.email && (
277
+ <OText
278
+ size={14}
279
+ color={theme.colors.danger5}
280
+ weight={'normal'}>
281
+ {errors?.email?.message}{errors?.email?.type === 'required' && '*'}
282
+ </OText>
307
283
  )}
308
- name="email"
309
- rules={{
310
- required: t(
311
- 'VALIDATION_ERROR_EMAIL_REQUIRED',
312
- 'The field Email is required',
313
- ).replace('_attribute_', t('EMAIL', 'Email')),
314
- pattern: {
315
- value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
316
- message: t(
317
- 'INVALID_ERROR_EMAIL',
318
- 'Invalid email address',
319
- ).replace('_attribute_', t('EMAIL', 'Email')),
320
- },
321
- }}
322
- defaultValue=""
323
- />
284
+ <Controller
285
+ control={control}
286
+ render={({ onChange, value }: any) => (
287
+ <OInput
288
+ placeholder={t('EMAIL', 'Email')}
289
+ style={loginStyle.inputStyle}
290
+ icon={theme.images.general.email}
291
+ onChange={(e: any) => {
292
+ handleChangeInputEmail(e, onChange);
293
+ }}
294
+ value={value}
295
+ autoCapitalize="none"
296
+ autoCorrect={false}
297
+ type="email-address"
298
+ autoCompleteType="email"
299
+ returnKeyType="next"
300
+ onSubmitEditing={() => passwordRef.current?.focus()}
301
+ blurOnSubmit={false}
302
+ forwardRef={emailRef}
303
+ borderColor={errors?.email ? theme.colors.danger5 : theme.colors.border}
304
+ />
305
+ )}
306
+ name="email"
307
+ rules={{
308
+ required: {
309
+ value: true,
310
+ message: t(
311
+ 'VALIDATION_ERROR_EMAIL_REQUIRED',
312
+ 'The field Email is required',
313
+ ).replace('_attribute_', t('EMAIL', 'Email'))
314
+ },
315
+ pattern: {
316
+ value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
317
+ message: t(
318
+ 'INVALID_ERROR_EMAIL',
319
+ 'Invalid email address',
320
+ ).replace('_attribute_', t('EMAIL', 'Email')),
321
+ }
322
+ }}
323
+ defaultValue=""
324
+ />
325
+ </>
326
+
324
327
  )}
325
328
  {useLoginByCellphone && loginTab === 'cellphone' && (
326
329
  <View style={{ marginBottom: 28 }}>
@@ -331,10 +334,18 @@ const LoginFormUI = (props: LoginParams) => {
331
334
  returnKeyType: 'next',
332
335
  onSubmitEditing: () => passwordRef?.current?.focus?.(),
333
336
  }}
337
+ isStartValidation={errors?.cellphone}
334
338
  />
335
339
  </View>
336
340
  )}
337
-
341
+ {errors?.password && (
342
+ <OText
343
+ size={14}
344
+ color={theme.colors.danger5}
345
+ weight={'normal'}>
346
+ {errors?.password?.message}{errors?.password?.type === 'required' && '*'}
347
+ </OText>
348
+ )}
338
349
  <Controller
339
350
  control={control}
340
351
  render={({ onChange, value }: any) => (
@@ -366,14 +377,18 @@ const LoginFormUI = (props: LoginParams) => {
366
377
  returnKeyType="done"
367
378
  onSubmitEditing={handleSubmit(onSubmit)}
368
379
  blurOnSubmit
380
+ borderColor={errors?.password ? theme.colors.danger5 : theme.colors.border}
369
381
  />
370
382
  )}
371
383
  name="password"
372
384
  rules={{
373
- required: t(
385
+ required: {
386
+ value: true,
387
+ message: t(
374
388
  'VALIDATION_ERROR_PASSWORD_REQUIRED',
375
389
  'The field Password is required',
376
- ).replace('_attribute_', t('PASSWORD', 'Password')),
390
+ ).replace('_attribute_', t('PASSWORD', 'Password'))
391
+ }
377
392
  }}
378
393
  defaultValue=""
379
394
  />
@@ -35,6 +35,8 @@ const ORDER_STATUS: any = {
35
35
  19: 'ORDER_DRIVER_ALMOST_ARRIVED_CUSTOMER',
36
36
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
37
37
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
38
+ 22: 'ORDER_LOOKING_FOR_DRIVER',
39
+ 23: 'ORDER_DRIVER_ON_WAY'
38
40
  }
39
41
 
40
42
  const filterSpecialStatus = ['prepared_in', 'delivered_in']
@@ -95,28 +97,18 @@ const MessagesUI = (props: MessagesParams) => {
95
97
  }
96
98
 
97
99
  const handleImagePicker = () => {
98
- launchImageLibrary({ mediaType: 'photo', maxHeight: 300, maxWidth: 300, includeBase64: true }, (response: any) => {
99
- if (response.didCancel) {
100
- console.log('User cancelled image picker');
101
- } else if (response.errorMessage) {
102
- console.log('ImagePicker Error: ', response.errorMessage);
100
+ launchImageLibrary({ mediaType: 'photo', maxHeight: 2048, maxWidth: 2048, includeBase64: true }, (response: any) => {
101
+ if (response?.didCancel) {
102
+ showToast(ToastType.Error, t('IMAGE_CANCELLED', 'User cancelled image picker'));
103
+ } else if (response?.errorMessage) {
103
104
  showToast(ToastType.Error, response.errorMessage);
104
105
  } else {
105
- if (Platform.OS === 'ios') {
106
- if (response.uri) {
107
- const url = `data:${response.type};base64,${response.base64}`
108
- setImage && setImage(url);
109
- } else {
110
- showToast(ToastType.Error, t('IMAGE_NOT_FOUND', 'Image not found'));
111
- }
106
+ if (response?.assets?.length > 0) {
107
+ const image = response?.assets[0]
108
+ const url = `data:${image.type};base64,${image.base64}`
109
+ setImage && setImage(url);
112
110
  } else {
113
- if (response?.assets?.length > 0) {
114
- const image = response?.assets[0]
115
- const url = `data:${image.type};base64,${image.base64}`
116
- setImage && setImage(url);
117
- } else {
118
- showToast(ToastType.Error, t('IMAGE_NOT_FOUND', 'Image not found'));
119
- }
111
+ showToast(ToastType.Error, t('IMAGE_NOT_FOUND', 'Image not found'));
120
112
  }
121
113
  }
122
114
  });
@@ -235,7 +227,7 @@ const MessagesUI = (props: MessagesParams) => {
235
227
  {image && (
236
228
  <TouchableOpacity
237
229
  style={{ position: 'absolute', top: -5, right: -5, borderColor: theme.colors.backgroundDark, backgroundColor: theme.colors.white, borderRadius: 25 }}
238
- onPress={() => removeImage()}
230
+ onPress={removeImage}
239
231
  >
240
232
  <MaterialCommunityIcon name='close-circle-outline' color={theme.colors.backgroundDark} size={24} />
241
233
  </TouchableOpacity>
@@ -543,9 +535,20 @@ const styles = StyleSheet.create({
543
535
  })
544
536
 
545
537
  export const Messages = (props: MessagesParams) => {
538
+ const [allMessages, setAllMessages] = useState(props.messages)
539
+
540
+ useEffect(() => {
541
+ setAllMessages(props.messages)
542
+ }, [props.messages])
543
+
546
544
  const MessagesProps = {
547
545
  ...props,
548
- UIComponent: MessagesUI
546
+ UIComponent: MessagesUI,
547
+ messages: allMessages,
548
+ setMessages: (values: any) => {
549
+ props.setMessages && props.setMessages(values)
550
+ setAllMessages(values)
551
+ }
549
552
  }
550
553
  return <MessagesController {...MessagesProps} />
551
554
  }
@@ -1,7 +1,5 @@
1
-
2
1
  import styled, { css } from 'styled-components/native'
3
2
 
4
-
5
3
  export const Wrapper = styled.View`
6
4
  flex: 1;
7
5
  background-color: ${(props: any) => props.theme.colors.white};
@@ -39,4 +37,4 @@ export const MessageTypeItem = styled.View`
39
37
  ${({ active }: any) => active && css`
40
38
  background-color: ${(props: any) => props.theme.colors.whiteGray};
41
39
  `}
42
- `
40
+ `