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
@@ -1,13 +1,14 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { ProductsList, useLanguage, useUtils, useConfig } from 'ordering-components/native';
3
3
  import { SingleProductCard } from '../SingleProductCard';
4
4
  import { NotFoundSource } from '../NotFoundSource';
5
5
  import { BusinessProductsListParams } from '../../types';
6
- import { OIcon, OText } from '../shared';
6
+ import { OButton, OIcon, OModal, OText } from '../shared';
7
7
  import { ProductsContainer, ErrorMessage, WrapperNotFound } from './styles';
8
8
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
9
9
  import { View } from 'react-native';
10
10
  import { StyleSheet } from 'react-native';
11
+ import { useTheme } from 'styled-components/native';
11
12
 
12
13
  const BusinessProductsListUI = (props: BusinessProductsListParams) => {
13
14
  const {
@@ -32,8 +33,9 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
32
33
  const [, t] = useLanguage();
33
34
  const [{ optimizeImage }] = useUtils()
34
35
  const [{ configs }] = useConfig()
36
+ const theme = useTheme()
35
37
  const isUseParentCategory = configs?.use_parent_category?.value === 'true' || configs?.use_parent_category?.value === '1'
36
-
38
+ const [openDescription, setOpenDescription] = useState<any>(null)
37
39
  const handleOnLayout = (event: any, categoryId: any) => {
38
40
  const _categoriesLayout = { ...categoriesLayout }
39
41
  const categoryKey = 'cat_' + categoryId
@@ -84,8 +86,11 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
84
86
 
85
87
  {!category?.id && categories.filter(category => category?.id !== null).map((category, i, _categories) => {
86
88
  const products = !isUseParentCategory
87
- ? categoryState?.products?.filter((product : any) => product?.category_id === category?.id) ?? []
88
- : categoryState?.products?.filter((product : any) => category?.children?.some((cat : any) => cat.category_id === product?.category_id)) ?? []
89
+ ? categoryState?.products?.filter((product: any) => product?.category_id === category?.id) ?? []
90
+ : categoryState?.products?.filter((product: any) => category?.children?.some((cat: any) => cat.category_id === product?.category_id)) ?? []
91
+
92
+ const shortCategoryDescription = category?.description?.length > 80 ? `${category?.description?.substring(0, 80)}...` : category?.description
93
+
89
94
  return (
90
95
  <React.Fragment key={'cat_' + category.id}>
91
96
  {products.length > 0 && (
@@ -96,7 +101,7 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
96
101
  >
97
102
  <View style={bpStyles.catIcon}>
98
103
  <OIcon
99
- url={optimizeImage(category.image, 'h_100,c_limit')}
104
+ url={optimizeImage(category.image, 'h_250,c_limit')}
100
105
  width={41}
101
106
  height={41}
102
107
  style={{ borderRadius: 7.6 }}
@@ -106,6 +111,28 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
106
111
  {category.name}
107
112
  </OText>
108
113
  </View>
114
+ {!!category?.description && (
115
+ <View style={{ position: 'relative' }}>
116
+ <OText size={12} weight={'500'} mBottom={5}>
117
+ {shortCategoryDescription}
118
+ {category?.description?.length > 80 && (
119
+ <OButton
120
+ style={{ height: 15, paddingRight: 0, paddingLeft: 0, borderWidth: 0 }}
121
+ text={t('SEE_MORE', 'See more')}
122
+ parentStyle={{ padding: 0 }}
123
+ onClick={() => setOpenDescription(category)}
124
+ bgColor='transparent'
125
+ textStyle={{
126
+ fontSize: 12,
127
+ borderBottomWidth: 1,
128
+ borderBottomColor: theme.colors.primary,
129
+ color: theme.colors.primary
130
+ }}
131
+ />
132
+ )}
133
+ </OText>
134
+ </View>
135
+ )}
109
136
  <>
110
137
  {products.sort((a: any, b: any) => a.rank - b.rank).map((product: any, i: any) => (
111
138
  <SingleProductCard
@@ -188,6 +215,23 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
188
215
  <OText>{e}</OText>
189
216
  </ErrorMessage>
190
217
  ))}
218
+ <OModal
219
+ open={!!openDescription}
220
+ title={openDescription?.name}
221
+ onClose={() => setOpenDescription(null)}
222
+ >
223
+ <View style={{ padding: 20 }}>
224
+ {!!openDescription?.image && (
225
+ <OIcon
226
+ url={optimizeImage(openDescription?.image, 'h_100,c_limit')}
227
+ width={240}
228
+ height={240}
229
+ style={{ borderRadius: 7.6 }}
230
+ />
231
+ )}
232
+ <OText>{openDescription?.description}</OText>
233
+ </View>
234
+ </OModal>
191
235
  </ProductsContainer>
192
236
  );
193
237
  };
@@ -8,7 +8,8 @@ import {
8
8
  useSession,
9
9
  useUtils,
10
10
  ToastType,
11
- useToast
11
+ useToast,
12
+ useConfig
12
13
  } from 'ordering-components/native'
13
14
  import { OButton, OIcon, OModal, OText } from '../shared'
14
15
  import { BusinessBasicInformation } from '../BusinessBasicInformation'
@@ -52,7 +53,8 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
52
53
  const [orderState] = useOrder()
53
54
  const [{ parsePrice }] = useUtils()
54
55
  const [, { showToast }] = useToast()
55
-
56
+ const [{ configs }] = useConfig()
57
+ const isPreOrder = configs?.preorder_status_enabled?.value === '1'
56
58
  const styles = StyleSheet.create({
57
59
  mainContainer: {
58
60
  flex: 1,
@@ -96,10 +98,10 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
96
98
  }
97
99
 
98
100
  const onProductClick = (product: any) => {
99
- onRedirect('ProductDetails', {
101
+ onRedirect('ProductDetails', {
100
102
  product: product,
101
- businessSlug: business.slug,
102
- businessId: business.id,
103
+ businessSlug: business.slug,
104
+ businessId: business.id,
103
105
  })
104
106
  }
105
107
 
@@ -154,8 +156,8 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
154
156
 
155
157
  const handleTouchDrag = useCallback(() => {
156
158
  setCategoryClicked(false);
157
- }, []);
158
-
159
+ }, []);
160
+
159
161
  const handleBackNavigation = () => {
160
162
  navigation?.canGoBack() ? navigation.goBack() : navigation.navigate('BottomTab')
161
163
  }
@@ -218,6 +220,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
218
220
  openBusinessInformation={openBusinessInformation}
219
221
  header={header}
220
222
  logo={logo}
223
+ isPreOrder={isPreOrder}
221
224
  />
222
225
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100 }} />
223
226
  {!loading && business?.id && (
@@ -235,7 +238,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
235
238
  selectedCategoryId={selectedCategoryId}
236
239
  lazyLoadProductsRecommended={business?.lazy_load_products_recommended}
237
240
  setSelectedCategoryId={setSelectedCategoryId}
238
- setCategoryClicked={setCategoryClicked}
241
+ setCategoryClicked={setCategoryClicked}
239
242
  />
240
243
  )}
241
244
  </>
@@ -313,13 +316,13 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
313
316
  business={currentCart?.business}
314
317
  cartProducts={currentCart?.products}
315
318
  cart={currentCart}
316
- setOpenUpselling={setOpenUpselling}
319
+ setOpenUpselling={setOpenUpselling}
317
320
  handleUpsellingPage={handleUpsellingPage}
318
321
  handleCloseUpsellingPage={handleCloseUpsellingPage}
319
322
  openUpselling={openUpselling}
320
323
  canOpenUpselling={canOpenUpselling}
321
324
  setCanOpenUpselling={setCanOpenUpselling}
322
- onRedirect={onRedirect}
325
+ onRedirect={onRedirect}
323
326
  />
324
327
  )}
325
328
  </SafeAreaView>
@@ -237,9 +237,10 @@ const BusinessReviewsUI = (props: BusinessReviewsParams) => {
237
237
  ))}
238
238
  </>
239
239
  )}
240
- {!reviewsList.loading && reviewsList?.reviews.length === 0 && (
241
- <OText>{t('REVIEWS_NOT_FOUND', 'Reviews Not Found')}</OText>
242
- )}
240
+ {reviewsList?.reviews
241
+ .filter((review: any) => searchReview !== '' ? review.comment?.toLowerCase()?.includes(searchReview?.toLowerCase()) : true).length === 0 && (
242
+ <OText>{t('REVIEWS_NOT_FOUND', 'Reviews Not Found')}</OText>
243
+ )}
243
244
  </BusinessReviewContent>
244
245
  </BusinessReviewsContainer>
245
246
  );
@@ -117,6 +117,9 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
117
117
  const [featuredBusiness, setFeaturedBusinesses] = useState(Array);
118
118
  const [isFarAway, setIsFarAway] = useState(false)
119
119
 
120
+ const isPreorderEnabled = (configs?.preorder_status_enabled?.value === '1' || configs?.preorder_status_enabled?.value === 'true') &&
121
+ Number(configs?.max_days_preorder?.value) > 0
122
+
120
123
  const timerId = useRef<any>(false)
121
124
  // const panResponder = useRef(
122
125
  // PanResponder.create({
@@ -128,6 +131,12 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
128
131
  // })
129
132
  // ).current
130
133
 
134
+ const handleMomentClick = () => {
135
+ if (isPreorderEnabled) {
136
+ navigation.navigate('MomentOption')
137
+ }
138
+ }
139
+
131
140
  const configTypes =
132
141
  configs?.order_types_allowed?.value
133
142
  .split('|')
@@ -158,7 +167,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
158
167
 
159
168
  useEffect(() => {
160
169
  if (businessesList.businesses.length > 0) {
161
- const fb = businessesList.businesses.filter((b) => b.featured == true);
170
+ const fb = businessesList.businesses.filter((b) => b.featured === true && b?.open);
162
171
  const ary = [];
163
172
  while (fb.length > 0) {
164
173
  ary.push(fb.splice(0, 2));
@@ -198,14 +207,12 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
198
207
  }, [orderState?.options?.address?.location])
199
208
 
200
209
  useEffect(() => {
201
- const onFocusApp = (nextAppState : any) => {
210
+ const onFocusApp = (nextAppState: any) => {
202
211
  if (
203
212
  appState.current.match(/inactive|background/) &&
204
213
  nextAppState === "active"
205
214
  ) {
206
- if (!businessesList.loading) {
207
- getBusinesses(true);
208
- }
215
+ getBusinesses(true);
209
216
  }
210
217
  appState.current = nextAppState;
211
218
  setAppStateVisible(appState.current);
@@ -281,26 +288,23 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
281
288
  />
282
289
  </WrapMomentOption>
283
290
  <WrapMomentOption
284
- onPress={() => navigation.navigate('MomentOption')}>
291
+ onPress={() => handleMomentClick()}>
285
292
  <OText
286
293
  size={12}
287
294
  numberOfLines={1}
288
295
  ellipsizeMode="tail"
289
296
  color={theme.colors.textSecondary}>
290
- {orderState.options?.moment
291
- ? parseDate(orderState.options?.moment, {
292
- outputFormat:
293
- configs?.format_time?.value === '12'
294
- ? 'MM/DD hh:mma'
295
- : 'MM/DD HH:mm',
296
- })
297
+ {orderState.options?.momentß
298
+ ? parseDate(orderState.options?.moment, { outputFormat: configs?.dates_moment_format?.value })
297
299
  : t('ASAP_ABBREVIATION', 'ASAP')}
298
300
  </OText>
299
- <OIcon
300
- src={theme.images.general.arrow_down}
301
- width={10}
302
- style={{ marginStart: 8 }}
303
- />
301
+ {isPreorderEnabled && (
302
+ <OIcon
303
+ src={theme.images.general.arrow_down}
304
+ width={10}
305
+ style={{ marginStart: 8 }}
306
+ />
307
+ )}
304
308
  </WrapMomentOption>
305
309
 
306
310
  {!businessId && (
@@ -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} />
@@ -329,7 +332,7 @@ const CartUI = (props: any) => {
329
332
  <OText size={12} numberOfLines={1}>
330
333
  {walletName[cart?.wallets?.find((wallet: any) => wallet.id === event.wallet_id)?.type]?.name}
331
334
  </OText>
332
- <OText size={12}>-{parsePrice(event.amount)}</OText>
335
+ <OText size={12}>-{parsePrice(event.amount, { isTruncable: true })}</OText>
333
336
  </OSTable>
334
337
  ))}
335
338
  {isCouponEnabled && !isCartPending && (
@@ -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
  }
@@ -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,21 +269,21 @@ 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}>
267
276
  {options?.moment
268
- ? parseDate(options?.moment, {
269
- outputFormat: configs?.format_time?.value === '12' ? 'MM/DD hh:mma' : 'MM/DD HH:mm'
270
- })
277
+ ? parseDate(options?.moment, { outputFormat: configs?.dates_moment_format?.value })
271
278
  : t('ASAP_ABBREVIATION', 'ASAP')}
272
279
  </OText>
273
- <OIcon
274
- src={theme.images.general.arrow_down}
275
- width={10}
276
- style={{ marginStart: 8 }}
277
- />
280
+ {isPreOrder && (
281
+ <OIcon
282
+ src={theme.images.general.arrow_down}
283
+ width={10}
284
+ style={{ marginStart: 8 }}
285
+ />
286
+ )}
278
287
  </CHMomentWrapper>
279
288
  </ChHeader>
280
289
  <View style={{ height: 8, backgroundColor: theme.colors.backgroundGray100, marginTop: 18, marginHorizontal: -40 }} />
@@ -537,7 +546,6 @@ const CheckoutUI = (props: any) => {
537
546
  onNavigationRedirect={onNavigationRedirect}
538
547
  paySelected={paymethodSelected}
539
548
  handlePaymentMethodClickCustom={handlePaymentMethodClick}
540
- handlePlaceOrder={handlePlaceOrder}
541
549
  />
542
550
  </ChPaymethods>
543
551
  </ChSection>
@@ -563,9 +571,28 @@ const CheckoutUI = (props: any) => {
563
571
  />
564
572
  ) : (
565
573
  <>
566
- <OText size={16} lineHeight={24} color={theme.colors.textNormal}>
567
- {t('ORDER_SUMMARY', 'Order Summary')}
568
- </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>
569
596
  {props.isFranchiseApp && (
570
597
  <TouchableOpacity
571
598
  onPress={() => setOpenChangeStore(true)}
@@ -621,6 +648,14 @@ const CheckoutUI = (props: any) => {
621
648
  {t('WARNING_INVALID_PRODUCTS', 'Some products are invalid, please check them.')}
622
649
  </OText>
623
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
+ )}
624
659
  </ChErrors>
625
660
  </View>
626
661
  )}
@@ -640,8 +675,8 @@ const CheckoutUI = (props: any) => {
640
675
  {!cartState.loading && cart && cart?.status !== 2 && (
641
676
  <FloatingButton
642
677
  handleClick={() => handlePlaceOrder()}
643
- isSecondaryBtn={loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum}
644
- disabled={loading || !cart?.valid || (!paymethodSelected && cart?.balance > 0) || placing || errorCash || cart?.subtotal < cart?.minimum}
678
+ isSecondaryBtn={isDisabledButtonPlace}
679
+ disabled={isDisabledButtonPlace}
645
680
  btnText={cart?.subtotal >= cart?.minimum
646
681
  ? (
647
682
  placing
@@ -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>
@@ -91,7 +91,9 @@ const OrdersOptionUI = (props: OrdersOptionParams) => {
91
91
  { key: 18, value: t('DRIVER_ALMOST_ARRIVED_TO_BUSINESS', 'Driver almost arrived to business') },
92
92
  { key: 19, value: t('DRIVER_ALMOST_ARRIVED_TO_CUSTOMER', 'Driver almost arrived to customer') },
93
93
  { key: 20, value: t('ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS', 'Customer almost arrived to business') },
94
- { 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') }
95
97
  ]
96
98
 
97
99
  const objectStatus = orderStatus.find((o) => o.key === status)