ordering-ui-react-native 0.14.82 → 0.14.83-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 (151) 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 +2 -2
  7. package/src/components/Cart/index.tsx +1 -1
  8. package/src/components/Checkout/index.tsx +1 -2
  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 +29 -6
  15. package/src/components/OrdersOption/index.tsx +4 -2
  16. package/src/components/PaymentOptions/index.tsx +7 -16
  17. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  18. package/src/components/ProductForm/index.tsx +1 -1
  19. package/src/components/ProductForm/styles.tsx +1 -0
  20. package/src/components/StripeElementsForm/index.tsx +27 -48
  21. package/src/components/UserProfileForm/index.tsx +35 -1
  22. package/src/components/VerifyPhone/styles.tsx +1 -2
  23. package/src/config.json +0 -2
  24. package/src/pages/Checkout.tsx +1 -1
  25. package/src/providers/AlertProvider.tsx +4 -1
  26. package/src/theme.json +2 -1
  27. package/src/types/index.tsx +2 -9
  28. package/src/utils/index.tsx +196 -1
  29. package/themes/business/index.tsx +4 -0
  30. package/themes/business/src/components/Chat/index.tsx +32 -31
  31. package/themes/business/src/components/NetworkError/index.tsx +61 -0
  32. package/themes/business/src/components/NetworkError/styles.tsx +11 -0
  33. package/themes/business/src/components/OrderDetails/Business.tsx +1 -0
  34. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +85 -17
  35. package/themes/business/src/components/OrdersListManager/index.tsx +871 -0
  36. package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
  37. package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
  38. package/themes/business/src/components/OrdersOption/index.tsx +354 -54
  39. package/themes/business/src/components/OrdersOption/styles.tsx +95 -7
  40. package/themes/business/src/components/PreviousMessages/index.tsx +12 -0
  41. package/themes/business/src/components/PreviousOrders/index.tsx +65 -46
  42. package/themes/business/src/components/PreviousOrders/styles.tsx +5 -10
  43. package/themes/business/src/components/ReviewCustomer/index.tsx +11 -8
  44. package/themes/business/src/types/index.tsx +4 -0
  45. package/themes/business/src/utils/index.tsx +12 -0
  46. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  47. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  48. package/themes/doordash/src/components/OrderDetails/index.tsx +3 -1
  49. package/themes/doordash/src/components/OrdersOption/index.tsx +4 -2
  50. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/instacart/src/components/OrderDetails/index.tsx +3 -1
  52. package/themes/instacart/src/components/OrdersOption/index.tsx +4 -2
  53. package/themes/kiosk/index.tsx +2 -0
  54. package/themes/kiosk/src/components/BusinessController/index.tsx +27 -6
  55. package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
  56. package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +51 -24
  57. package/themes/kiosk/src/components/Cart/index.tsx +1 -1
  58. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
  59. package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
  60. package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
  61. package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
  62. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +7 -5
  63. package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
  64. package/themes/kiosk/src/components/Intro/index.tsx +13 -13
  65. package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
  66. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  67. package/themes/kiosk/src/components/NetworkError/index.tsx +60 -0
  68. package/themes/kiosk/src/components/NetworkError/styles.tsx +11 -0
  69. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  70. package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
  71. package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
  72. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
  73. package/themes/kiosk/src/components/ProductForm/index.tsx +172 -124
  74. package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
  75. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
  76. package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
  77. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
  78. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  79. package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
  80. package/themes/kiosk/src/types/index.d.ts +4 -0
  81. package/themes/original/index.tsx +28 -6
  82. package/themes/original/src/components/AnalyticsSegment/index.tsx +127 -0
  83. package/themes/original/src/components/BusinessBasicInformation/index.tsx +12 -39
  84. package/themes/original/src/components/BusinessController/index.tsx +2 -2
  85. package/themes/original/src/components/BusinessMenuList/index.tsx +4 -2
  86. package/themes/original/src/components/BusinessPreorder/index.tsx +3 -2
  87. package/themes/original/src/components/BusinessProductsList/index.tsx +50 -6
  88. package/themes/original/src/components/BusinessProductsListing/index.tsx +13 -10
  89. package/themes/original/src/components/BusinessReviews/index.tsx +4 -3
  90. package/themes/original/src/components/BusinessesListing/index.tsx +22 -18
  91. package/themes/original/src/components/Cart/index.tsx +43 -10
  92. package/themes/original/src/components/Checkout/index.tsx +55 -20
  93. package/themes/original/src/components/Checkout/styles.tsx +7 -0
  94. package/themes/original/src/components/CouponControl/index.tsx +1 -0
  95. package/themes/original/src/components/DriverTips/index.tsx +1 -1
  96. package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
  97. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +9 -2
  98. package/themes/original/src/components/LastOrder/index.tsx +3 -1
  99. package/themes/original/src/components/LoginForm/index.tsx +83 -68
  100. package/themes/original/src/components/MessageListing/index.tsx +4 -2
  101. package/themes/original/src/components/Messages/index.tsx +19 -21
  102. package/themes/original/src/components/MomentOption/index.tsx +127 -152
  103. package/themes/original/src/components/MomentOption/styles.tsx +42 -18
  104. package/themes/original/src/components/NetworkError/index.tsx +61 -0
  105. package/themes/original/src/components/NetworkError/styles.tsx +11 -0
  106. package/themes/original/src/components/OrderDetails/index.tsx +106 -113
  107. package/themes/original/src/components/OrderProgress/index.tsx +6 -5
  108. package/themes/original/src/components/OrderSummary/index.tsx +34 -1
  109. package/themes/original/src/components/OrdersOption/index.tsx +20 -42
  110. package/themes/original/src/components/OrdersOption/styles.tsx +0 -5
  111. package/themes/original/src/components/PaymentOptionWallet/index.tsx +1 -1
  112. package/themes/original/src/components/PaymentOptions/index.tsx +20 -23
  113. package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
  114. package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
  115. package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
  116. package/themes/original/src/components/PreviousOrders/index.tsx +4 -0
  117. package/themes/original/src/components/ProductForm/index.tsx +33 -18
  118. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  119. package/themes/original/src/components/ProductOptionSubOption/index.tsx +81 -74
  120. package/themes/original/src/components/ReviewDriver/index.tsx +315 -0
  121. package/themes/original/src/components/ReviewDriver/styles.tsx +38 -0
  122. package/themes/original/src/components/ReviewOrder/index.tsx +307 -186
  123. package/themes/original/src/components/ReviewOrder/styles.tsx +24 -13
  124. package/themes/original/src/components/ReviewProducts/index.tsx +116 -0
  125. package/themes/original/src/components/ReviewProducts/styles.tsx +16 -0
  126. package/themes/original/src/components/SignupForm/index.tsx +173 -154
  127. package/themes/original/src/components/SingleProductCard/index.tsx +6 -13
  128. package/themes/original/src/components/SingleProductCard/styles.tsx +1 -1
  129. package/themes/original/src/components/SingleProductReview/index.tsx +166 -0
  130. package/themes/original/src/components/SingleProductReview/styles.tsx +27 -0
  131. package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
  132. package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
  133. package/themes/original/src/components/UserDetails/index.tsx +4 -95
  134. package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
  135. package/themes/original/src/components/UserProfile/index.tsx +13 -6
  136. package/themes/original/src/components/UserProfileForm/index.tsx +16 -8
  137. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  138. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  139. package/themes/original/src/components/WalletTransactionItem/index.tsx +3 -2
  140. package/themes/original/src/components/Wallets/index.tsx +16 -8
  141. package/themes/original/src/layouts/FloatingBottomContainer.tsx +26 -0
  142. package/themes/original/src/types/index.tsx +47 -10
  143. package/themes/single-business/src/components/LastOrder/index.tsx +3 -1
  144. package/themes/single-business/src/components/OrderDetails/index.tsx +15 -0
  145. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +5 -5
  146. package/themes/single-business/src/components/OrdersOption/index.tsx +4 -2
  147. package/themes/single-business/src/utils/index.tsx +7 -1
  148. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  149. package/themes/uber-eats/src/components/OrderDetails/index.tsx +3 -1
  150. package/themes/uber-eats/src/components/OrdersOption/index.tsx +4 -2
  151. package/src/components/StripeMethodForm/index.tsx +0 -163
@@ -2,12 +2,12 @@ import React, { useState, useEffect } from 'react'
2
2
  import { OrderList, useLanguage, useOrder, ToastType, useToast } from 'ordering-components/native'
3
3
  import { useTheme } from 'styled-components/native';
4
4
  import { useFocusEffect } from '@react-navigation/native'
5
- import { OText, OButton } from '../shared'
5
+ import { OText } from '../shared'
6
6
  import { NotFoundSource } from '../NotFoundSource'
7
7
  import { ActiveOrders } from '../ActiveOrders'
8
8
  import { PreviousOrders } from '../PreviousOrders'
9
9
 
10
- import { OptionTitle, NoOrdersWrapper } from './styles'
10
+ import { OptionTitle } from './styles'
11
11
  import { OrdersOptionParams } from '../../types'
12
12
 
13
13
  import {
@@ -32,8 +32,6 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
32
32
  loadMoreStatus,
33
33
  loadMoreOrders,
34
34
  loadOrders,
35
- setOrdersLength,
36
- ordersLength
37
35
  } = props
38
36
 
39
37
  const theme = useTheme();
@@ -93,7 +91,9 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
93
91
  { key: 18, value: t('DRIVER_ALMOST_ARRIVED_TO_BUSINESS', 'Driver almost arrived to business') },
94
92
  { key: 19, value: t('DRIVER_ALMOST_ARRIVED_TO_CUSTOMER', 'Driver almost arrived to customer') },
95
93
  { key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', 'Customer almost arrived to business') },
96
- { key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', 'Customer arrived to business') }
94
+ { key: 21, value: t('ORDER_CUSTOMER_ARRIVED_BUSINESS', 'Customer arrived to business') },
95
+ { key: 22, value: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver') },
96
+ { key: 23, value: t('ORDER_DRIVER_ON_WAY', 'Driver on way') }
97
97
  ]
98
98
 
99
99
  const objectStatus = orderStatus.find((o) => o.key === status)
@@ -114,50 +114,28 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
114
114
  }
115
115
  }, [loadMoreStatus, loading, pagination])
116
116
 
117
- useEffect(() => {
118
- if (loading) return
119
-
120
- const updateOrders = orders.filter((order: any) => orderStatus.includes(order.status))
121
-
122
- if (activeOrders) {
123
- setOrdersLength && setOrdersLength({ ...ordersLength, activeOrdersLength: updateOrders?.length })
124
- } else if (!preOrders) {
125
- setOrdersLength && setOrdersLength({ ...ordersLength, previousOrdersLength: updateOrders?.length })
126
- }
127
- }, [orders?.length])
128
-
129
117
  return (
130
118
  <>
131
- <OptionTitle>
132
- <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={10} >
133
- {titleContent || (activeOrders
134
- ? t('ACTIVE', 'Active')
135
- : preOrders
136
- ? t('PREORDERS', 'Preorders')
137
- : t('PAST', 'Past'))}
138
- </OText>
139
- </OptionTitle>
140
- {!(activeOrders && ordersLength.activeOrdersLength === 0 && ordersLength.previousOrdersLength === 0) && !loading && orders.length === 0 && (
119
+ {(orders.length > 0) && (
120
+ <>
121
+ <OptionTitle>
122
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={10} >
123
+ {titleContent || (activeOrders
124
+ ? t('ACTIVE', 'Active')
125
+ : preOrders
126
+ ? t('PREORDERS', 'Preorders')
127
+ : t('PAST', 'Past'))}
128
+ </OText>
129
+ </OptionTitle>
130
+ </>
131
+ )}
132
+ {!loading && orders.length === 0 && (
141
133
  <NotFoundSource
142
134
  content={t('NO_RESULTS_FOUND', 'Sorry, no results found')}
143
135
  image={imageFails}
144
136
  conditioned
145
137
  />
146
138
  )}
147
- {!loading && ordersLength.activeOrdersLength === 0 && ordersLength.previousOrdersLength === 0 && activeOrders && (
148
- <NoOrdersWrapper>
149
- <OText size={14} numberOfLines={1}>
150
- {t('YOU_DONT_HAVE_ORDERS', 'You don\'t have any orders')}
151
- </OText>
152
- <OButton
153
- text={t('ORDER_NOW', 'Order now')}
154
- onClick={() => onNavigationRedirect && onNavigationRedirect('BusinessList')}
155
- textStyle={{ color: 'white', fontSize: 14 }}
156
- style={{ borderRadius: 7.6, marginBottom: 10, marginTop: 10, height: 44, paddingLeft: 10, paddingRight: 10 }}
157
- />
158
-
159
- </NoOrdersWrapper>
160
- )}
161
139
  {loading && (
162
140
  <>
163
141
  {!activeOrders ? (
@@ -230,7 +208,7 @@ export const OrdersOption = (props: OrdersOptionParams) => {
230
208
  ...props,
231
209
  UIComponent: OrdersOptionUI,
232
210
  orderStatus: props.preOrders ? [13] : props.activeOrders
233
- ? [0, 3, 4, 7, 8, 9, 14, 15, 18, 19, 20, 21]
211
+ ? [0, 3, 4, 7, 8, 9, 14, 15, 18, 19, 20, 21, 22, 23]
234
212
  : [1, 2, 5, 6, 10, 11, 12, 16, 17],
235
213
  useDefualtSessionManager: true,
236
214
  }
@@ -3,8 +3,3 @@ import styled from 'styled-components/native'
3
3
  export const OptionTitle = styled.View`
4
4
  margin-top: 24px;
5
5
  `
6
-
7
- export const NoOrdersWrapper = styled.View`
8
- flex-direction: column;
9
- align-items: center;
10
- `
@@ -48,7 +48,7 @@ const PaymentOptionWalletUI = (props: any) => {
48
48
  new Array(walletsState.result?.length).fill(false)
49
49
  );
50
50
 
51
- const creditBalance: any = (wallet: any) => ` = ${parsePrice((wallet.balance * wallet.redemption_rate) / 100)}`
51
+ const creditBalance: any = (wallet: any) => ` = ${parsePrice(wallet.balance / wallet.redemption_rate)}`
52
52
 
53
53
  const walletName: any = {
54
54
  cash: {
@@ -9,6 +9,8 @@ import {
9
9
  import {
10
10
  PaymentOptions as PaymentOptionsController,
11
11
  useLanguage,
12
+ ToastType,
13
+ useToast,
12
14
  } from 'ordering-components/native';
13
15
  import { useTheme } from 'styled-components/native';
14
16
  import { PaymentOptionCash } from '../PaymentOptionCash';
@@ -30,8 +32,6 @@ import {
30
32
  import { getIconCard, flatArray } from '../../utils';
31
33
 
32
34
  const stripeOptions: any = ['stripe_direct', 'stripe', 'stripe_connect']
33
- const methodsPay = ['google_pay', 'apple_pay']
34
- const stripeDirectMethods = ['stripe_direct', ...methodsPay]
35
35
  // const stripeRedirectOptions = [
36
36
  // { name: 'Bancontact', value: 'bancontact' },
37
37
  // { name: 'Alipay', value: 'alipay' },
@@ -54,12 +54,11 @@ const PaymentOptionsUI = (props: any) => {
54
54
  handlePaymethodClick,
55
55
  handlePaymethodDataChange,
56
56
  isOpenMethod,
57
- handlePaymentMethodClickCustom,
58
- handlePlaceOrder
57
+ handlePaymentMethodClickCustom
59
58
  } = props
60
59
 
61
60
  const theme = useTheme();
62
-
61
+ const [, { showToast }] = useToast();
63
62
 
64
63
  const getPayIcon = (method: string) => {
65
64
  switch (method) {
@@ -95,11 +94,18 @@ const PaymentOptionsUI = (props: any) => {
95
94
  // ]
96
95
 
97
96
  const handlePaymentMethodClick = (paymethod: any) => {
98
- const isPopupMethod = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect', 'paypal'].includes(paymethod?.gateway)
99
- if (webViewPaymentGateway.includes(paymethod?.gateway)) {
100
- handlePaymentMethodClickCustom(paymethod)
101
- }
102
- handlePaymethodClick(paymethod, isPopupMethod)
97
+ if (cart?.balance > 0) {
98
+ const isPopupMethod = ['stripe', 'stripe_direct', 'stripe_connect', 'stripe_redirect', 'paypal'].includes(paymethod?.gateway)
99
+ if (webViewPaymentGateway.includes(paymethod?.gateway)) {
100
+ handlePaymentMethodClickCustom(paymethod)
101
+ }
102
+ handlePaymethodClick(paymethod, isPopupMethod)
103
+ return
104
+ }
105
+ showToast(
106
+ ToastType.Error,
107
+ t('CART_BALANCE_ZERO', 'Sorry, the amount to pay is equal to zero and it is not necessary to select a payment method'))
108
+ ;
103
109
  }
104
110
 
105
111
  useEffect(() => {
@@ -120,12 +126,6 @@ const PaymentOptionsUI = (props: any) => {
120
126
  }
121
127
  }, [props.paySelected])
122
128
 
123
- useEffect(() => {
124
- if (methodsPay.includes(paymethodSelected?.gateway) && paymethodData?.id && paymethodSelected?.data?.card) {
125
- handlePlaceOrder()
126
- }
127
- }, [paymethodData, paymethodSelected])
128
-
129
129
  const renderPaymethods = ({ item }: any) => {
130
130
  return (
131
131
  <TouchableOpacity
@@ -287,11 +287,11 @@ const PaymentOptionsUI = (props: any) => {
287
287
  </KeyboardAvoidingView>
288
288
  </OModal>
289
289
 
290
- {/* Stripe direct, Google pay, Apple pay */}
290
+ {/* Stripe direct */}
291
291
  <OModal
292
292
  entireModal
293
293
  title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
294
- open={stripeDirectMethods?.includes(isOpenMethod?.paymethod?.gateway) && !paymethodData.id}
294
+ open={isOpenMethod?.paymethod?.gateway === 'stripe_direct' && !paymethodData?.id}
295
295
  onClose={() => handlePaymethodClick(null)}
296
296
  >
297
297
  <KeyboardAvoidingView
@@ -300,13 +300,10 @@ const PaymentOptionsUI = (props: any) => {
300
300
  enabled={Platform.OS === 'ios' ? true : false}
301
301
  >
302
302
  <StripeElementsForm
303
- cart={cart}
304
- paymethod={isOpenMethod?.paymethod?.gateway}
305
- methodsPay={methodsPay}
306
303
  businessId={props.businessId}
307
- publicKey={isOpenMethod?.paymethod?.credentials?.publishable || isOpenMethod?.paymethod?.credentials?.publishable_key}
304
+ publicKey={isOpenMethod?.paymethod?.credentials?.publishable}
308
305
  handleSource={handlePaymethodDataChange}
309
- onCancel={() => handlePaymethodClick(null)}
306
+ onCancel={() => handlePaymethodClick(false)}
310
307
  />
311
308
  </KeyboardAvoidingView>
312
309
  </OModal>
@@ -22,18 +22,23 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
22
22
  textStyle,
23
23
  flagStyle,
24
24
  noDropIcon,
25
- isDisabled
25
+ isDisabled,
26
+ isStartValidation
26
27
  } = props
27
28
 
28
29
  const theme = useTheme();
29
30
 
31
+ const [, t] = useLanguage()
32
+ const [{ configs }] = useConfig()
33
+ const phoneInput = useRef<PhoneInput>(null);
34
+ const [userphoneNumber, setUserphoneNumber] = useState('');
30
35
 
31
36
  const style = StyleSheet.create({
32
37
  input: {
33
38
  backgroundColor: theme.colors.white,
34
39
  borderRadius: 7.6,
35
40
  borderWidth: 1,
36
- borderColor: theme.colors.border,
41
+ borderColor: (isStartValidation && userphoneNumber === '') ? theme.colors.danger5 : theme.colors.border,
37
42
  paddingBottom: 0,
38
43
  paddingTop: 0,
39
44
  flexGrow: 1,
@@ -48,12 +53,6 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
48
53
  }
49
54
  })
50
55
 
51
-
52
- const [, t] = useLanguage()
53
- const [{ configs }] = useConfig()
54
- const phoneInput = useRef<PhoneInput>(null);
55
- const [userphoneNumber, setUserphoneNumber] = useState('');
56
-
57
56
  const handleChangeNumber = (number: any) => {
58
57
  setUserphoneNumber(number)
59
58
  }
@@ -97,6 +96,14 @@ export const PhoneInputNumber = (props: PhoneInputParams) => {
97
96
 
98
97
  return (
99
98
  <Wrapper onPress={() => forwardRef?.current?.focus?.()}>
99
+ {(isStartValidation && userphoneNumber === '') && (
100
+ <OText
101
+ size={14}
102
+ color={theme.colors.danger5}
103
+ >
104
+ {t('VALIDATION_ERROR_MOBILE_PHONE_REQUIRED', 'The field Mobile phone is required').replace('_attribute_', t('CELLPHONE', 'Cellphone'))}*
105
+ </OText>
106
+ )}
100
107
  <PhoneInput
101
108
  ref={phoneInput}
102
109
  disabled={isDisabled}
@@ -0,0 +1,114 @@
1
+ import React, { useEffect, useState } from 'react'
2
+ import { View } from 'react-native'
3
+ import { PlaceSpot as PlaceSpotController, useLanguage } from 'ordering-components/native'
4
+ import { PlaceGroupContainer, PlaceSpotContainer } from './styles'
5
+ import { NotFoundSource } from '../NotFoundSource'
6
+ import { OText, ODropDown } from '../shared'
7
+ import { Placeholder, PlaceholderLine } from 'rn-placeholder'
8
+ import { PlaceSpotParams } from '../../types'
9
+
10
+ const PlaceSpotUI = (props: PlaceSpotParams) => {
11
+ const {
12
+ isOpenPlaceSpot,
13
+ cart,
14
+ placesState,
15
+ handleChangePlace,
16
+ getPlacesList,
17
+ setOpenPlaceModal
18
+ } = props
19
+
20
+ const [, t] = useLanguage()
21
+ const [placeGroupSelected, setPlaceGroupSelected] = useState<any>(null)
22
+
23
+ const getPlacesGroups = () => {
24
+ const groups = placesState.placeGroups?.filter((group: any) => group?.enabled && placesState?.places?.find((place: any) => place?.enabled && place?.place_group_id === group?.id))
25
+ return groups.map((group: any) => ({
26
+ value: group,
27
+ content: group?.name,
28
+ showOnSelected: group?.name
29
+ }))
30
+ }
31
+
32
+ const getPlaces = () => {
33
+ const places = placeGroupSelected && placesState?.places?.filter((place: any) => place?.enabled && place?.place_group_id === placeGroupSelected?.id)
34
+ return places.map((place: any) => ({
35
+ value: place,
36
+ content: place.name,
37
+ showOnSelected: place.name
38
+ }))
39
+ }
40
+
41
+ const handlerChangePlace = (place: any) => {
42
+ setOpenPlaceModal(false)
43
+ handleChangePlace(place)
44
+ }
45
+
46
+
47
+ useEffect(() => {
48
+ if (!placesState?.loading) {
49
+ const placeGroupOnCart = placesState?.placeGroups.find((group: any) => group?.id === cart?.place?.place_group_id)
50
+ setPlaceGroupSelected(placeGroupOnCart)
51
+ }
52
+ }, [placesState])
53
+
54
+ useEffect(() => {
55
+ getPlacesList()
56
+ }, [isOpenPlaceSpot])
57
+
58
+ return (
59
+ <PlaceSpotContainer>
60
+ {(placesState.error || placesState?.placeGroups?.length === 0) && !placesState?.loading && (
61
+ <NotFoundSource
62
+ content={t('NO_PLACES_THIS_BUSINESS', 'There are not places for this business')}
63
+ />
64
+ )}
65
+ {placesState?.loading && (
66
+ <Placeholder>
67
+ <PlaceGroupContainer>
68
+ <PlaceholderLine width={100} height={25} />
69
+ <PlaceholderLine height={30} />
70
+ </PlaceGroupContainer>
71
+ <View>
72
+ <PlaceholderLine width={120} height={25} />
73
+ <PlaceholderLine height={30} />
74
+ </View>
75
+ </Placeholder>
76
+ )}
77
+ {!(placesState.error || placesState?.placeGroups?.length === 0) && !placesState?.loading && (
78
+ <>
79
+ <PlaceGroupContainer>
80
+ <OText size={16} mBottom={10}>{t('PLACE_GROUP', 'Place group')}</OText>
81
+ <ODropDown
82
+ placeholder={t('PLACE_GROUP', 'Place group')}
83
+ options={getPlacesGroups()}
84
+ onSelect={(group: any) => setPlaceGroupSelected(group)}
85
+ defaultValue={placeGroupSelected ?? cart?.place}
86
+ isModal
87
+ />
88
+ </PlaceGroupContainer>
89
+ {placeGroupSelected && (
90
+ <View>
91
+ <OText size={16} mBottom={10}>{t('SELECT_YOUR_SPOT', 'Select your spot')}</OText>
92
+ <ODropDown
93
+ onSelect={(place: any) => handlerChangePlace(place)}
94
+ placeholder={t('SELECT_YOUR_SPOT', 'Select your spot')}
95
+ options={getPlaces()}
96
+ defaultValue={placesState?.places?.find((place : any) => place?.id === cart?.place_id)}
97
+ isModal
98
+ />
99
+ </View>
100
+ )}
101
+ </>
102
+ )}
103
+ </PlaceSpotContainer>
104
+ )
105
+ }
106
+
107
+ export const PlaceSpot = (props: PlaceSpotParams) => {
108
+ const placeSpotProps = {
109
+ ...props,
110
+ UIComponent: PlaceSpotUI
111
+ }
112
+
113
+ return <PlaceSpotController {...placeSpotProps} />
114
+ }
@@ -0,0 +1,11 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const PlaceSpotContainer = styled.View`
4
+ min-height: 300px;
5
+ padding: 20px;
6
+ `
7
+
8
+ export const PlaceGroupContainer = styled.View`
9
+ margin-bottom: 40px;
10
+ margin-top: 20px;
11
+ `
@@ -86,6 +86,10 @@ export const PreviousOrders = (props: PreviousOrdersParams) => {
86
86
  id: order?.id,
87
87
  business_id: order?.business_id,
88
88
  logo: order.business?.logo,
89
+ driver: order?.driver,
90
+ products: order?.products,
91
+ review: order?.review,
92
+ user_review: order?.user_review
89
93
  },
90
94
  });
91
95
  };
@@ -264,7 +264,15 @@ export const ProductOptionsUI = (props: any) => {
264
264
  }
265
265
  if (img?.video) {
266
266
  const keys = img?.video.split('/')
267
- const _videoId = keys[keys.length - 1]
267
+ let _videoId = keys[keys.length - 1]
268
+ if (_videoId.includes('watch')) {
269
+ const __url = _videoId.split('=')[1]
270
+ _videoId = __url
271
+ }
272
+ if (_videoId.includes('?')) {
273
+ const __url = _videoId.split('?')[0]
274
+ _videoId = __url
275
+ }
268
276
  videoList.push(_videoId)
269
277
  }
270
278
  }
@@ -396,7 +404,7 @@ export const ProductOptionsUI = (props: any) => {
396
404
  <FastImage
397
405
  style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1 }}
398
406
  source={{
399
- uri: optimizeImage(img, 'h_258,c_limit'),
407
+ uri: optimizeImage(img, 'h_1024,c_limit'),
400
408
  priority: FastImage.priority.normal,
401
409
  }}
402
410
  />
@@ -436,7 +444,7 @@ export const ProductOptionsUI = (props: any) => {
436
444
  >
437
445
  {img.includes('image') ? (
438
446
  <OIcon
439
- url={img}
447
+ url={optimizeImage(img, 'h_250,c_limit')}
440
448
  style={{
441
449
  borderColor: theme.colors.lightGray,
442
450
  borderRadius: 8,
@@ -834,9 +842,13 @@ export const ProductOptionsUI = (props: any) => {
834
842
  </ScrollView>
835
843
  {!loading && !error && product && (
836
844
  <ProductActions ios={Platform?.OS === 'ios'}>
837
- <OText size={16} lineHeight={24} weight={'600'}>
838
- {productCart.total ? parsePrice(productCart?.total) : ''}
839
- </OText>
845
+ <View>
846
+ <OText size={16} lineHeight={24} weight={'600'}>
847
+ {productCart.total ? parsePrice(productCart?.total) : ''}
848
+ </OText>
849
+ {product?.minimum_per_order && productCart?.quantity < product?.minimum_per_order && <OText size={12} color={theme.colors?.red}>{t('MOBILE_MINIMUM_TO_ORDER', 'Min. _number_ ').replace('_number_', product?.minimum_per_order)}</OText>}
850
+ {product?.maximum_per_order && productCart?.quantity > product?.maximum_per_order && <OText size={12} color={theme.colors?.red}>{t('MOBILE_MAXIMUM_TO_ORDER', 'Max. _number_'.replace('_number_', product?.maximum_per_order))}</OText>}
851
+ </View>
840
852
  {productCart && !isSoldOut && maxProductQuantity > 0 && (
841
853
  <View style={styles.quantityControl}>
842
854
  <TouchableOpacity
@@ -845,6 +857,7 @@ export const ProductOptionsUI = (props: any) => {
845
857
  <OIcon
846
858
  src={theme.images.general.minus}
847
859
  width={16}
860
+ style={{ borderWidth: 1, borderColor: 'red' }}
848
861
  color={
849
862
  productCart.quantity === 1 || isSoldOut
850
863
  ? theme.colors.backgroundGray
@@ -888,6 +901,7 @@ export const ProductOptionsUI = (props: any) => {
888
901
  <OIcon
889
902
  src={theme.images.general.plus}
890
903
  width={16}
904
+ style={{ borderWidth: 1, borderColor: 'red' }}
891
905
  color={
892
906
  maxProductQuantity <= 0 ||
893
907
  productCart.quantity >= maxProductQuantity ||
@@ -935,28 +949,29 @@ export const ProductOptionsUI = (props: any) => {
935
949
  style={{
936
950
  width: isSoldOut || maxProductQuantity <= 0 ? '60%' : '40%',
937
951
  }}>
938
- {productCart &&
939
- !isSoldOut &&
940
- maxProductQuantity > 0 &&
952
+ {((productCart &&
941
953
  auth &&
942
- orderState.options?.address_id && (
954
+ orderState.options?.address_id) || (isSoldOut || maxProductQuantity <= 0)) && (
943
955
  <OButton
944
956
  onClick={() => handleSaveProduct()}
945
957
  imgRightSrc=""
946
958
  text={`${orderState.loading
947
959
  ? t('LOADING', 'Loading')
948
- : editMode
949
- ? t('UPDATE', 'Update')
950
- : t('ADD', 'Add')
960
+ : (isSoldOut || maxProductQuantity <= 0)
961
+ ? t('SOLD_OUT', 'Sold out')
962
+ : editMode
963
+ ? t('UPDATE', 'Update')
964
+ : t('ADD', 'Add')
951
965
  }`}
966
+ isDisabled={isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order))}
952
967
  textStyle={{
953
- color: (saveErrors || !productCart.quantity) ? theme.colors.primary : theme.colors.white,
968
+ color: saveErrors || isSoldOut || maxProductQuantity <= 0 ? theme.colors.primary : theme.colors.white,
954
969
  fontSize: orderState.loading || editMode ? 10 : 14
955
970
  }}
956
971
  style={{
957
- backgroundColor: (saveErrors || !productCart.quantity) ? theme.colors.lightGray : theme.colors.primary,
958
- borderColor: (saveErrors || !productCart.quantity) ? theme.colors.white : theme.colors.primary,
959
- opacity: (saveErrors || !productCart.quantity) ? 0.3 : 1,
972
+ backgroundColor: saveErrors || isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order)) ? theme.colors.lightGray : theme.colors.primary,
973
+ borderColor: saveErrors || isSoldOut || maxProductQuantity <= 0 || (product?.minimum_per_order && (productCart?.quantity < product?.minimum_per_order)) || (product?.maximum_per_order && (productCart?.quantity > product?.maximum_per_order)) ? theme.colors.white : theme.colors.primary,
974
+ opacity: saveErrors || isSoldOut || maxProductQuantity <= 0 ? 0.3 : 1,
960
975
  borderRadius: 7.6,
961
976
  height: 44,
962
977
  shadowOpacity: 0,
@@ -976,7 +991,7 @@ export const ProductOptionsUI = (props: any) => {
976
991
  ) : (
977
992
  <OButton onClick={navigation.navigate('AddressList')} />
978
993
  ))}
979
- {(!auth || isSoldOut || maxProductQuantity <= 0) && (
994
+ {!auth && (
980
995
  <OButton
981
996
  isDisabled={isSoldOut || maxProductQuantity <= 0}
982
997
  onClick={() => handleRedirectLogin()}
@@ -48,7 +48,6 @@ export const ProductDescription = styled.View`
48
48
  `
49
49
 
50
50
  export const ProductEditions = styled.View`
51
-
52
51
  `
53
52
 
54
53
  export const SectionTitle = styled.View`