ordering-ui-react-native 0.17.98 → 0.17.99-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 (224) hide show
  1. package/package.json +9 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessInformation/index.tsx +10 -9
  4. package/src/components/BusinessesListing/index.tsx +1 -1
  5. package/src/components/OrderCreating/index.tsx +0 -20
  6. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  7. package/src/components/PhoneInputNumber/index.tsx +6 -2
  8. package/src/components/StripeMethodForm/index.tsx +136 -102
  9. package/src/components/VerifyPhone/styles.tsx +1 -2
  10. package/src/components/shared/OToast.tsx +3 -2
  11. package/src/types/index.tsx +5 -0
  12. package/src/utils/index.tsx +7 -2
  13. package/themes/business/index.tsx +2 -0
  14. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +36 -26
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +163 -123
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +45 -8
  19. package/themes/business/src/components/FloatingButton/index.tsx +34 -31
  20. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  21. package/themes/business/src/components/LoginForm/index.tsx +5 -2
  22. package/themes/business/src/components/MapView/index.tsx +14 -10
  23. package/themes/business/src/components/MessagesOption/index.tsx +22 -94
  24. package/themes/business/src/components/NewOrderNotification/index.tsx +123 -96
  25. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  26. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  27. package/themes/business/src/components/OrderDetails/Delivery.tsx +209 -15
  28. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +84 -37
  29. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +87 -66
  30. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +200 -0
  31. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  32. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  33. package/themes/business/src/components/OrderSummary/index.tsx +114 -123
  34. package/themes/business/src/components/OrdersListManager/index.tsx +7 -2
  35. package/themes/business/src/components/OrdersListManager/utils.tsx +1 -1
  36. package/themes/business/src/components/OrdersOption/index.tsx +60 -47
  37. package/themes/business/src/components/PreviousMessages/FooterMessageComponent.tsx +103 -0
  38. package/themes/business/src/components/PreviousMessages/index.tsx +97 -55
  39. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +21 -29
  40. package/themes/business/src/components/PreviousOrders/OrderList.tsx +93 -0
  41. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +1 -1
  42. package/themes/business/src/components/PreviousOrders/index.tsx +198 -221
  43. package/themes/business/src/components/PreviousOrders/styles.tsx +10 -0
  44. package/themes/business/src/components/ProductItemAccordion/index.tsx +7 -1
  45. package/themes/business/src/components/ReviewCustomer/index.tsx +18 -13
  46. package/themes/business/src/components/StoresList/index.tsx +3 -4
  47. package/themes/business/src/components/UserProfileForm/index.tsx +14 -15
  48. package/themes/business/src/components/WebsocketStatus/index.tsx +171 -0
  49. package/themes/business/src/components/WebsocketStatus/styles.tsx +28 -0
  50. package/themes/business/src/components/shared/OModal.tsx +16 -9
  51. package/themes/business/src/types/index.tsx +24 -10
  52. package/themes/business/src/utils/index.tsx +29 -2
  53. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  55. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  57. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  58. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -5
  59. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  60. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  61. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  62. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  63. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  64. package/themes/original/index.tsx +7 -3
  65. package/themes/original/src/components/AddressDetails/index.tsx +19 -3
  66. package/themes/original/src/components/AddressForm/index.tsx +33 -15
  67. package/themes/original/src/components/AddressList/index.tsx +5 -8
  68. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  69. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  70. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  71. package/themes/original/src/components/BusinessBasicInformation/index.tsx +72 -36
  72. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  73. package/themes/original/src/components/BusinessController/index.tsx +35 -44
  74. package/themes/original/src/components/BusinessController/styles.tsx +12 -5
  75. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  76. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  77. package/themes/original/src/components/BusinessInformation/index.tsx +140 -85
  78. package/themes/original/src/components/BusinessItemAccordion/index.tsx +21 -23
  79. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +1 -1
  80. package/themes/original/src/components/BusinessListingSearch/index.tsx +346 -340
  81. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  82. package/themes/original/src/components/BusinessPreorder/index.tsx +105 -22
  83. package/themes/original/src/components/BusinessPreorder/styles.tsx +14 -0
  84. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  85. package/themes/original/src/components/BusinessProductsList/index.tsx +15 -7
  86. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  87. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  88. package/themes/original/src/components/BusinessProductsListing/index.tsx +137 -32
  89. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -3
  90. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  91. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListFooter.tsx +69 -0
  92. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListHeader.tsx +406 -0
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/FlatListBusinessListing.tsx +76 -0
  94. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +37 -404
  95. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  96. package/themes/original/src/components/Cart/index.tsx +49 -47
  97. package/themes/original/src/components/CartContent/index.tsx +99 -38
  98. package/themes/original/src/components/CartContent/styles.tsx +6 -6
  99. package/themes/original/src/components/Checkout/index.tsx +323 -42
  100. package/themes/original/src/components/CitiesControl/index.tsx +1 -1
  101. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  102. package/themes/original/src/components/DatePicker/index.tsx +17 -0
  103. package/themes/original/src/components/DatePicker/styles.tsx +20 -0
  104. package/themes/original/src/components/DriverTips/index.tsx +12 -4
  105. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  106. package/themes/original/src/components/Favorite/index.tsx +1 -5
  107. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  108. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +8 -3
  109. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +42 -5
  110. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +2 -0
  111. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +84 -8
  112. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  113. package/themes/original/src/components/GoogleMap/index.tsx +63 -7
  114. package/themes/original/src/components/Home/index.tsx +13 -4
  115. package/themes/original/src/components/LastOrder/index.tsx +2 -1
  116. package/themes/original/src/components/LastOrders/index.tsx +2 -1
  117. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -25
  118. package/themes/original/src/components/LoginForm/index.tsx +64 -34
  119. package/themes/original/src/components/LottieAnimation/index.tsx +88 -63
  120. package/themes/original/src/components/MessageListing/index.tsx +9 -2
  121. package/themes/original/src/components/Messages/index.tsx +15 -4
  122. package/themes/original/src/components/MomentOption/index.tsx +44 -39
  123. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  124. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +161 -49
  125. package/themes/original/src/components/MultiCheckout/index.tsx +346 -68
  126. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  127. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -1
  128. package/themes/original/src/components/MyOrders/index.tsx +12 -1
  129. package/themes/original/src/components/NavBar/index.tsx +20 -13
  130. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  131. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  132. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +21 -5
  133. package/themes/original/src/components/OrderDetails/index.tsx +50 -38
  134. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  135. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  136. package/themes/original/src/components/OrderProgress/index.tsx +34 -25
  137. package/themes/original/src/components/OrderSummary/index.tsx +62 -57
  138. package/themes/original/src/components/OrderTypeSelector/index.tsx +5 -6
  139. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +13 -13
  140. package/themes/original/src/components/OrdersOption/index.tsx +43 -20
  141. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  142. package/themes/original/src/components/PageBanner/index.tsx +65 -29
  143. package/themes/original/src/components/PageBanner/styles.tsx +0 -3
  144. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  145. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +3 -0
  146. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  147. package/themes/original/src/components/PaymentOptions/index.tsx +100 -34
  148. package/themes/original/src/components/PhoneInputNumber/index.tsx +18 -4
  149. package/themes/original/src/components/ProductForm/ActionButton.tsx +120 -0
  150. package/themes/original/src/components/ProductForm/index.tsx +65 -34
  151. package/themes/original/src/components/ProductForm/styles.tsx +3 -3
  152. package/themes/original/src/components/ProductItemAccordion/index.tsx +8 -6
  153. package/themes/original/src/components/ProductOptionSubOption/index.tsx +49 -20
  154. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +10 -9
  155. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  156. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  157. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  158. package/themes/original/src/components/Promotions/index.tsx +2 -2
  159. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  160. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  161. package/themes/original/src/components/ScheduleAccordion/index.tsx +3 -3
  162. package/themes/original/src/components/ServiceForm/index.tsx +40 -20
  163. package/themes/original/src/components/SignupForm/index.tsx +27 -16
  164. package/themes/original/src/components/SingleOrderCard/index.tsx +44 -20
  165. package/themes/original/src/components/SingleOrderCard/styles.tsx +1 -1
  166. package/themes/original/src/components/SingleProductCard/index.tsx +13 -10
  167. package/themes/original/src/components/SingleProductCard/styles.tsx +8 -3
  168. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  169. package/themes/original/src/components/StripeCardsList/index.tsx +61 -5
  170. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  171. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  172. package/themes/original/src/components/UpsellingProducts/index.tsx +3 -8
  173. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  174. package/themes/original/src/components/UserFormDetails/index.tsx +84 -19
  175. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  176. package/themes/original/src/components/UserProfile/index.tsx +7 -25
  177. package/themes/original/src/components/UserProfileForm/index.tsx +30 -31
  178. package/themes/original/src/components/UserVerification/index.tsx +55 -50
  179. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  180. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  181. package/themes/original/src/components/Wallets/index.tsx +51 -61
  182. package/themes/original/src/components/Wallets/styles.tsx +2 -4
  183. package/themes/original/src/components/shared/OButton.tsx +3 -3
  184. package/themes/original/src/components/shared/OInput.tsx +4 -5
  185. package/themes/original/src/components/shared/OModal.tsx +3 -3
  186. package/themes/original/src/types/index.tsx +30 -7
  187. package/themes/original/src/utils/index.tsx +180 -13
  188. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  189. package/src/navigators/BottomNavigator.tsx +0 -117
  190. package/src/navigators/CheckoutNavigator.tsx +0 -66
  191. package/src/navigators/HomeNavigator.tsx +0 -202
  192. package/src/navigators/NavigationRef.tsx +0 -7
  193. package/src/navigators/RootNavigator.tsx +0 -269
  194. package/src/pages/Account.tsx +0 -34
  195. package/src/pages/AddressForm.tsx +0 -62
  196. package/src/pages/AddressList.tsx +0 -24
  197. package/src/pages/BusinessProductsList.tsx +0 -81
  198. package/src/pages/BusinessesListing.tsx +0 -43
  199. package/src/pages/CartList.tsx +0 -49
  200. package/src/pages/Checkout.tsx +0 -101
  201. package/src/pages/ForgotPassword.tsx +0 -24
  202. package/src/pages/Help.tsx +0 -23
  203. package/src/pages/HelpAccountAndPayment.tsx +0 -23
  204. package/src/pages/HelpGuide.tsx +0 -23
  205. package/src/pages/HelpOrder.tsx +0 -23
  206. package/src/pages/Home.tsx +0 -36
  207. package/src/pages/IntroductoryTutorial.tsx +0 -170
  208. package/src/pages/Login.tsx +0 -47
  209. package/src/pages/MomentOption.tsx +0 -30
  210. package/src/pages/MultiCheckout.tsx +0 -31
  211. package/src/pages/MultiOrdersDetails.tsx +0 -27
  212. package/src/pages/MyOrders.tsx +0 -40
  213. package/src/pages/NetworkError.tsx +0 -24
  214. package/src/pages/NotFound.tsx +0 -22
  215. package/src/pages/OrderDetails.tsx +0 -25
  216. package/src/pages/ProductDetails.tsx +0 -55
  217. package/src/pages/Profile.tsx +0 -36
  218. package/src/pages/ReviewDriver.tsx +0 -30
  219. package/src/pages/ReviewOrder.tsx +0 -32
  220. package/src/pages/ReviewProducts.tsx +0 -30
  221. package/src/pages/Sessions.tsx +0 -22
  222. package/src/pages/Signup.tsx +0 -53
  223. package/src/pages/SpinnerLoader.tsx +0 -10
  224. package/src/pages/Splash.tsx +0 -21
@@ -0,0 +1,108 @@
1
+ import React from 'react'
2
+ import {
3
+ useSession,
4
+ useUtils,
5
+ SingleProfessionalCard as SingleProfessionalCardController
6
+ } from 'ordering-components/native'
7
+ import { useTheme } from 'styled-components/native'
8
+ import { StyleSheet, TouchableOpacity, View } from 'react-native'
9
+ import FastImage from 'react-native-fast-image'
10
+ import { OIcon, OText } from '../../shared'
11
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
12
+
13
+ const SingleProfessionalCardUI = (props) => {
14
+ const {
15
+ professional,
16
+ handleFavoriteProfessional,
17
+ active,
18
+ handleProfessionalClick
19
+ } = props
20
+
21
+ const theme = useTheme()
22
+ const [{ auth }] = useSession()
23
+ const [{ optimizeImage }] = useUtils()
24
+
25
+ const handleChangeFavorite = () => {
26
+ if (auth) {
27
+ handleFavoriteProfessional && handleFavoriteProfessional(!professional?.favorite)
28
+ }
29
+ }
30
+
31
+ const styles = StyleSheet.create({
32
+ professionalItem: {
33
+ flexDirection: 'row',
34
+ alignItems: 'center',
35
+ borderRadius: 7.6,
36
+ padding: 11,
37
+ borderWidth: 1,
38
+ marginRight: 12,
39
+ minHeight: 64
40
+ },
41
+ photoStyle: {
42
+ width: 42,
43
+ height: 42,
44
+ borderRadius: 7.6
45
+ },
46
+ favoriteIconStyle: {
47
+ width: 16,
48
+ height: 16,
49
+ },
50
+ })
51
+
52
+ return (
53
+ <TouchableOpacity
54
+ onPress={() => handleProfessionalClick(professional)}
55
+ >
56
+ <View
57
+ style={{
58
+ ...styles.professionalItem,
59
+ borderColor: active
60
+ ? theme.colors.primary
61
+ : theme.colors.border
62
+ }}
63
+ >
64
+ {professional?.photo ? (
65
+ <FastImage
66
+ style={styles.photoStyle}
67
+ source={{
68
+ uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
69
+ priority: FastImage.priority.normal,
70
+ }}
71
+ resizeMode={FastImage.resizeMode.cover}
72
+ />
73
+ ) : (
74
+ <OIcon
75
+ src={theme?.images?.general?.user}
76
+ cover={false}
77
+ style={styles.photoStyle}
78
+ />
79
+ )}
80
+ <View style={{ marginLeft: 12 }}>
81
+ <OText
82
+ size={12}
83
+ weight={'400'}
84
+ >
85
+ {professional?.name} {professional?.lastname}
86
+ </OText>
87
+
88
+ <TouchableOpacity
89
+ onPress={() => handleChangeFavorite()}
90
+ >
91
+ {professional?.favorite
92
+ ? <IconAntDesign name='heart' size={16} color={theme.colors.danger5} />
93
+ : <IconAntDesign name='hearto' size={16} color={theme.colors.danger5} />
94
+ }
95
+ </TouchableOpacity>
96
+ </View>
97
+ </View>
98
+ </TouchableOpacity>
99
+ )
100
+ }
101
+
102
+ export const SingleProfessionalCard = (props) => {
103
+ const singleProfessionalCardProps = {
104
+ ...props,
105
+ UIComponent: SingleProfessionalCardUI
106
+ }
107
+ return <SingleProfessionalCardController {...singleProfessionalCardProps} />
108
+ }
@@ -1,21 +1,21 @@
1
1
  import React, { useState } from 'react'
2
- import { ScrollView, TouchableOpacity, View, StyleSheet, Platform } from 'react-native'
3
- import { useUtils, useLanguage } from 'ordering-components/native'
2
+ import { ScrollView, TouchableOpacity, View, StyleSheet } from 'react-native'
3
+ import { useLanguage } from 'ordering-components/native'
4
4
  import { useTheme } from 'styled-components/native'
5
- import FastImage from 'react-native-fast-image'
6
- import { OIcon, OText, OModal } from '../shared'
5
+ import { OText, OModal } from '../shared'
7
6
  import { ProfessionalProfile } from '../ProfessionalProfile'
8
7
  import { ProfessionalFilterParams } from '../../types'
8
+ import { SingleProfessionalCard } from './SingleProfessionalCard'
9
9
 
10
10
  export const ProfessionalFilter = (props: ProfessionalFilterParams) => {
11
11
  const {
12
12
  professionals,
13
13
  professionalSelected,
14
- handleChangeProfessionalSelected
14
+ handleChangeProfessionalSelected,
15
+ handleUpdateProfessionals
15
16
  } = props
16
17
 
17
18
  const theme = useTheme()
18
- const [{ optimizeImage }] = useUtils()
19
19
  const [, t] = useLanguage()
20
20
  const [open, setOpen] = useState(false)
21
21
  const [currentProfessional, setCurrentProfessional] = useState(null)
@@ -30,6 +30,11 @@ export const ProfessionalFilter = (props: ProfessionalFilterParams) => {
30
30
  setOpen(false)
31
31
  }
32
32
 
33
+ const onUpdateProfessionals = (id, changes) => {
34
+ const updatedProfessional = professionals.find(professional => professional.id === id)
35
+ handleUpdateProfessionals({ ...updatedProfessional, ...changes })
36
+ }
37
+
33
38
  const styles = StyleSheet.create({
34
39
  professionalItem: {
35
40
  flexDirection: 'row',
@@ -39,12 +44,7 @@ export const ProfessionalFilter = (props: ProfessionalFilterParams) => {
39
44
  borderWidth: 1,
40
45
  marginRight: 12,
41
46
  minHeight: 64
42
- },
43
- photoStyle: {
44
- width: 42,
45
- height: 42,
46
- borderRadius: 7.6
47
- }
47
+ }
48
48
  })
49
49
 
50
50
  return (
@@ -73,44 +73,14 @@ export const ProfessionalFilter = (props: ProfessionalFilterParams) => {
73
73
  </OText>
74
74
  </View>
75
75
  </TouchableOpacity>
76
- {professionals.map((professional: any, i: number) => (
77
- <TouchableOpacity
78
- key={i}
79
- onPress={() => handleOpenProfile(professional)}
80
- >
81
- <View
82
- style={{
83
- ...styles.professionalItem,
84
- borderColor: (professional?.id === professionalSelected?.id)
85
- ? theme.colors.primary
86
- : theme.colors.border
87
- }}
88
- >
89
- {professional?.photo ? (
90
- <FastImage
91
- style={styles.photoStyle}
92
- source={{
93
- uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
94
- priority: FastImage.priority.normal,
95
- }}
96
- resizeMode={FastImage.resizeMode.cover}
97
- />
98
- ) : (
99
- <OIcon
100
- src={theme?.images?.general?.user}
101
- cover={false}
102
- style={styles.photoStyle}
103
- />
104
- )}
105
- <OText
106
- size={12}
107
- style={{ marginLeft: 12 }}
108
- weight={'400'}
109
- >
110
- {professional?.name} {professional?.lastname}
111
- </OText>
112
- </View>
113
- </TouchableOpacity>
76
+ {professionals.map((professional: any) => (
77
+ <SingleProfessionalCard
78
+ key={professional.id}
79
+ professional={professional}
80
+ active={professional?.id === professionalSelected?.id}
81
+ handleProfessionalClick={handleOpenProfile}
82
+ handleUpdateProfessionals={onUpdateProfessionals}
83
+ />
114
84
  ))}
115
85
  </ScrollView>
116
86
  <OModal
@@ -1,5 +1,5 @@
1
1
  import React, { useState, useEffect, useRef } from 'react'
2
- import { StyleSheet, Platform, View, Dimensions } from 'react-native'
2
+ import { StyleSheet, Platform, View, Dimensions, Text } from 'react-native'
3
3
  import { useUtils, useLanguage, useConfig } from 'ordering-components/native'
4
4
  import { useTheme } from 'styled-components/native'
5
5
  import CalendarPicker from 'react-native-calendar-picker'
@@ -60,7 +60,12 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
60
60
  },
61
61
  photoStyle: {
62
62
  alignSelf: 'center'
63
- }
63
+ },
64
+ dropDownRow: {
65
+ color: theme.colors.primary,
66
+ fontSize: 14,
67
+ marginHorizontal: 0
68
+ },
64
69
  })
65
70
 
66
71
  const onDateChange = (date: any) => {
@@ -92,6 +97,28 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
92
97
  setIsEnabled(menu?.schedule?.[day]?.enabled || false)
93
98
  }
94
99
 
100
+ const getMomentTime = (time) => {
101
+ const _moment = moment(`${moment(selectDate).format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm').toDate()
102
+ return _moment
103
+ }
104
+
105
+ const isBusyTime = (professional, selectedMoment) => {
106
+ if (!selectedMoment) return false
107
+ const startDay = moment(selectedMoment).utc().format('d')
108
+ const isStartScheduleEnabled = professional?.schedule?.[startDay]?.enabled
109
+ if (!isStartScheduleEnabled) return true
110
+
111
+ if (professional?.busy_times?.length === 0) return false
112
+
113
+ const busyTimes = professional?.busy_times
114
+
115
+ const valid = busyTimes.some(item => {
116
+ return (moment.utc(item?.start).local().valueOf() <= moment(selectedMoment).valueOf() &&
117
+ moment(selectedMoment).valueOf() < moment.utc(item?.end).local().valueOf())
118
+ })
119
+ return valid
120
+ }
121
+
95
122
  const getTimes = (curdate: any, menu: any) => {
96
123
  validateSelectedDate(curdate, menu)
97
124
  const date = new Date()
@@ -147,7 +174,7 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
147
174
  }
148
175
 
149
176
  useEffect(() => {
150
- if (selectDate === null) return
177
+ if (selectDate === null || !professional?.schedule) return
151
178
  const _times = getTimes(selectDate, professional)
152
179
  setTimeList(_times)
153
180
  }, [selectDate, professional])
@@ -238,10 +265,12 @@ export const ProfessionalProfile = (props: ProfessionalProfileParams) => {
238
265
  paddingTop: 8,
239
266
  paddingHorizontal: 12
240
267
  }}
241
- rowTextStyle={{
242
- color: theme.colors.disabled,
243
- fontSize: 14,
244
- marginHorizontal: 0
268
+ renderCustomizedRowChild={(item, index) => {
269
+ return (
270
+ <Text style={[styles.dropDownRow, { color: isBusyTime(professional, getMomentTime(item.value)) ? theme.colors.lightGray : theme.colors.primary } ]}>
271
+ {item.text}
272
+ </Text>
273
+ )
245
274
  }}
246
275
  renderDropdownIcon={() => dropDownIcon()}
247
276
  dropdownOverlayColor='transparent'
@@ -143,7 +143,7 @@ const PromotionsUI = (props: PromotionParams) => {
143
143
  <WrapperSingleOffer key={offer.id}>
144
144
  <SingleOfferContainer>
145
145
  <FastImage
146
- style={{ height: 80, width: 80, aspectRatio: 3 / 2, borderRadius: 8 }}
146
+ style={{ height: 80, width: 80, aspectRatio: 1, borderRadius: 8 }}
147
147
  source={typeof offer?.image !== 'number' ? {
148
148
  uri: optimizeImage(offer?.image, 'h_1024,c_limit'),
149
149
  priority: FastImage.priority.normal,
@@ -212,7 +212,7 @@ const PromotionsUI = (props: PromotionParams) => {
212
212
  </OText>
213
213
  <ScrollView
214
214
  showsVerticalScrollIndicator={false}
215
- style={{ height: '75%' }}
215
+ style={{ height: '68%' }}
216
216
  >
217
217
  {offerSelected?.businesses?.map((business: any) => {
218
218
  return (
@@ -9,6 +9,7 @@ export const PromotionsContainer = styled.View`
9
9
  export const WrapperSingleOffer = styled.View`
10
10
  flex-direction: column;
11
11
  width: 100%;
12
+ margin-bottom: 30px;
12
13
  `
13
14
 
14
15
  export const SingleOfferContainer = styled.View`
@@ -16,11 +17,12 @@ export const SingleOfferContainer = styled.View`
16
17
  width: 100%;
17
18
  justify-content: space-between;
18
19
  align-items: center;
19
- margin-bottom: 20px;
20
+ margin-bottom: 10px;
20
21
  `
21
22
 
22
23
  export const OfferInformation = styled.View`
23
24
  justify-content: space-between;
25
+ min-width: 70%;
24
26
  max-width: 70%;
25
27
  `
26
28
 
@@ -74,13 +74,22 @@ const ReviewProductsUI = (props: ReviewProductParams) => {
74
74
  titleWrapStyle={{ paddingHorizontal: 0 }}
75
75
  titleStyle={{ marginRight: 0, marginLeft: 0 }}
76
76
  />
77
- {order?.products?.map((product: any) => !product?.deleted && (
78
- <SingleProductReview
79
- key={product.id}
80
- product={product}
81
- formState={formState}
82
- handleChangeFormState={handleChangeFormState}
83
- />
77
+ {order?.products && order.products.length > 0 && order?.products.map(productsOrder => (
78
+ productsOrder?.length ? productsOrder?.map((product: any, i: any) => !product?.deleted ?
79
+ <SingleProductReview
80
+ key={i}
81
+ product={product}
82
+ formState={formState}
83
+ handleChangeFormState={handleChangeFormState}
84
+ /> : null
85
+ ) : (!productsOrder?.deleted ? (
86
+ <SingleProductReview
87
+ product={productsOrder}
88
+ formState={formState}
89
+ handleChangeFormState={handleChangeFormState}
90
+ />
91
+ ) : null
92
+ )
84
93
  ))}
85
94
  </ReviewProductsContainer>
86
95
 
@@ -13,7 +13,7 @@ import { OIcon, OText } from '../shared';
13
13
  export const ScheduleAccordion = (props: any) => {
14
14
 
15
15
  const {
16
- scheduleFormatted,
16
+ timeFormated,
17
17
  schedule,
18
18
  weekIndex
19
19
  } = props
@@ -52,9 +52,9 @@ export const ScheduleAccordion = (props: any) => {
52
52
  {schedule?.lapses?.map((lapse: any) => (
53
53
  schedule?.enabled ?
54
54
  <OText mBottom={16}>
55
- {scheduleFormatted(lapse.open) +
55
+ {timeFormated(lapse.open) +
56
56
  ' - ' +
57
- scheduleFormatted(lapse.close)}
57
+ timeFormated(lapse.close)}
58
58
  </OText>
59
59
  :
60
60
  <OText color={theme.colors.red} mBottom={16}>
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useEffect, useRef } from 'react'
2
2
  import { useTheme } from 'styled-components/native'
3
- import { Platform, View, StyleSheet, Dimensions, ScrollView, TouchableOpacity } from 'react-native'
3
+ import { Platform, View, StyleSheet, Dimensions, ScrollView, TouchableOpacity, Text } from 'react-native'
4
4
  import { OText, OButton, OModal, OIcon } from '../shared'
5
5
  import FastImage from 'react-native-fast-image'
6
6
  import IconAntDesign from 'react-native-vector-icons/AntDesign'
@@ -110,23 +110,41 @@ const ServiceFormUI = (props: ServiceFormParams) => {
110
110
  height: 40,
111
111
  marginBottom: 30
112
112
  },
113
+ dropDownRow: {
114
+ color: theme.colors.primary,
115
+ fontSize: 14,
116
+ marginHorizontal: 0
117
+ },
113
118
  professionalList: {
114
119
  paddingHorizontal: 40,
115
- paddingVertical: 30
120
+ paddingVertical: 30,
116
121
  }
117
122
  })
118
123
 
119
- const isBusyTime = (professional: any) => {
120
- if (professional?.busy_times?.length === 0 || !dateSelected) return false
124
+ const getMomentTime = (time) => {
125
+ const _moment = moment(`${moment(selectDate).format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm').toDate()
126
+ return _moment
127
+ }
128
+
129
+ const isBusyTime = (professional, selectedMoment) => {
130
+ if (!selectedMoment) return false
131
+ const startDay = moment(selectedMoment).utc().format('d')
132
+ const isStartScheduleEnabled = professional?.schedule?.[startDay]?.enabled
121
133
  const duration = product?.duration ?? 0
134
+ const endDay = moment(selectedMoment).add(duration - 1, 'minutes').utc().format('d')
135
+ const isEndScheduleEnabled = professional?.schedule?.[endDay]?.enabled
136
+ if (!isStartScheduleEnabled || !isEndScheduleEnabled) return true
137
+
138
+ if (professional?.busy_times?.length === 0) return false
139
+
122
140
  const busyTimes = isCartProduct
123
- ? professional?.busy_times.filter((item: any) => !(item.start === productCart?.calendar_event?.start && item.end === productCart?.calendar_event?.end))
141
+ ? professional?.busy_times.filter(item => !(item.start === productCart?.calendar_event?.start && item.end === productCart?.calendar_event?.end))
124
142
  : [...professional?.busy_times]
125
- const valid = busyTimes.some((item: any) => {
126
- return (moment.utc(item?.start).local().valueOf() <= moment(dateSelected).valueOf() &&
127
- moment(dateSelected).valueOf() <= moment.utc(item?.end).local().valueOf()) ||
128
- (moment.utc(item?.start).local().valueOf() <= moment(dateSelected).add(duration, 'minutes').valueOf() &&
129
- moment(dateSelected).add(duration, 'minutes').valueOf() <= moment.utc(item?.end).local().valueOf())
143
+ const valid = busyTimes.some(item => {
144
+ return (moment.utc(item?.start).local().valueOf() <= moment(selectedMoment).valueOf() &&
145
+ moment(selectedMoment).valueOf() < moment.utc(item?.end).local().valueOf()) ||
146
+ (moment.utc(item?.start).local().valueOf() < moment(selectedMoment).add(duration, 'minutes').valueOf() &&
147
+ moment(selectedMoment).add(duration, 'minutes').valueOf() < moment.utc(item?.end).local().valueOf())
130
148
  })
131
149
  return valid
132
150
  }
@@ -383,9 +401,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
383
401
  size={12}
384
402
  weight={'400'}
385
403
  lineHeight={17}
386
- color={isBusyTime(currentProfessional) ? theme.colors.danger5 : theme.colors.success500}
404
+ color={isBusyTime(currentProfessional, dateSelected) ? theme.colors.danger5 : theme.colors.success500}
387
405
  >
388
- {isBusyTime(currentProfessional)
406
+ {isBusyTime(currentProfessional, dateSelected)
389
407
  ? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
390
408
  : t('AVAILABLE', 'Available')
391
409
  }
@@ -465,10 +483,12 @@ const ServiceFormUI = (props: ServiceFormParams) => {
465
483
  paddingTop: 8,
466
484
  paddingHorizontal: 12
467
485
  }}
468
- rowTextStyle={{
469
- color: theme.colors.disabled,
470
- fontSize: 14,
471
- marginHorizontal: 0
486
+ renderCustomizedRowChild={(item, index) => {
487
+ return (
488
+ <Text style={[styles.dropDownRow, { color: isBusyTime(currentProfessional, getMomentTime(item.value)) ? theme.colors.lightGray : theme.colors.primary } ]}>
489
+ {item.text}
490
+ </Text>
491
+ )
472
492
  }}
473
493
  renderDropdownIcon={() => dropDownIcon()}
474
494
  dropdownOverlayColor='transparent'
@@ -541,7 +561,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
541
561
  ? t('SOLD_OUT', 'Sold out')
542
562
  : t('BOOK', 'Book'))}
543
563
  style={styles.buttonStyle}
544
- isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected || isBusyTime(currentProfessional)}
564
+ isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected || isBusyTime(currentProfessional, dateSelected)}
545
565
  textStyle={{ fontSize: 14, color: theme.colors.white }}
546
566
  />
547
567
  )}
@@ -582,7 +602,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
582
602
  <PlaceholderLine width={60} height={20} />
583
603
  </Placeholder>
584
604
  ) : (
585
- <OText color={theme.colors.primary} size={13}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
605
+ <OText color={theme.colors.primary} size={13}>{t('AS_GUEST_USER', 'As guest user')}</OText>
586
606
  )}
587
607
  </TouchableOpacity>
588
608
  )}
@@ -639,9 +659,9 @@ const ServiceFormUI = (props: ServiceFormParams) => {
639
659
  size={12}
640
660
  weight={'400'}
641
661
  lineHeight={17}
642
- color={isBusyTime(professional) ? theme.colors.danger5 : theme.colors.success500}
662
+ color={isBusyTime(professional, dateSelected) ? theme.colors.danger5 : theme.colors.success500}
643
663
  >
644
- {isBusyTime(professional)
664
+ {isBusyTime(professional, dateSelected)
645
665
  ? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
646
666
  : t('AVAILABLE', 'Available')
647
667
  }
@@ -1,5 +1,5 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
- import { View, Pressable, StyleSheet, Linking, Platform, TouchableOpacity, Vibration } from 'react-native';
2
+ import { View, Pressable, StyleSheet, Linking, Platform, TouchableOpacity } from 'react-native';
3
3
  import { useForm, Controller } from 'react-hook-form';
4
4
  import Spinner from 'react-native-loading-spinner-overlay';
5
5
  import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
@@ -8,6 +8,7 @@ import { PhoneInputNumber } from '../PhoneInputNumber';
8
8
  import { FacebookLogin } from '../FacebookLogin';
9
9
  import Recaptcha from 'react-native-recaptcha-that-works'
10
10
  import ReCaptcha from '@fatnlazycat/react-native-recaptcha-v3'
11
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
11
12
 
12
13
  import {
13
14
  SignupForm as SignUpController,
@@ -164,6 +165,14 @@ const SignupFormUI = (props: SignupParams) => {
164
165
  })
165
166
  }
166
167
 
168
+ const vibrateApp = (impact?: string) => {
169
+ const options = {
170
+ enableVibrateFallback: true,
171
+ ignoreAndroidSystemSettings: false
172
+ };
173
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
174
+ }
175
+
167
176
  const handleRefs = (ref: any, code: string) => {
168
177
  switch (code) {
169
178
  case 'name': {
@@ -246,7 +255,7 @@ const SignupFormUI = (props: SignupParams) => {
246
255
  const onSubmit = (values?: any) => {
247
256
  if (phoneInputData.error && signUpTab !== 'otpEmail') {
248
257
  showToast(ToastType.Error, phoneInputData.error);
249
- Vibration.vibrate()
258
+ vibrateApp()
250
259
  return;
251
260
  }
252
261
  if (
@@ -264,7 +273,7 @@ const SignupFormUI = (props: SignupParams) => {
264
273
  'The field Mobile phone is required.',
265
274
  ),
266
275
  );
267
- Vibration.vibrate()
276
+ vibrateApp()
268
277
  return;
269
278
  }
270
279
  if (signUpTab === 'otpEmail' || signUpTab === 'otpCellphone') {
@@ -323,7 +332,7 @@ const SignupFormUI = (props: SignupParams) => {
323
332
  };
324
333
 
325
334
  const handleChangeInputEmail = (value: string, onChange: any) => {
326
- onChange(value.toLowerCase().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
335
+ onChange(value.toLowerCase().trim().replace(/[&,()%";:ç?<>{}\\[\]\s]/g, ''));
327
336
  };
328
337
 
329
338
  const handleOpenTermsUrl = async (url: any) => {
@@ -333,7 +342,7 @@ const SignupFormUI = (props: SignupParams) => {
333
342
  await Linking.openURL(url);
334
343
  } else {
335
344
  showToast(ToastType.Error, t('VALIDATION_ERROR_ACTIVE_URL', 'The _attribute_ is not a valid URL.').replace('_attribute_', t('URL', 'URL')))
336
- Vibration.vibrate()
345
+ vibrateApp()
337
346
  }
338
347
  }
339
348
 
@@ -341,12 +350,12 @@ const SignupFormUI = (props: SignupParams) => {
341
350
  setRecaptchaVerified(false)
342
351
  if (!recaptchaConfig?.siteKey) {
343
352
  showToast(ToastType.Error, t('NO_RECAPTCHA_SITE_KEY', 'The config doesn\'t have recaptcha site key'));
344
- Vibration.vibrate()
353
+ vibrateApp()
345
354
  return
346
355
  }
347
356
  if (!recaptchaConfig?.baseUrl) {
348
357
  showToast(ToastType.Error, t('NO_RECAPTCHA_BASE_URL', 'The config doesn\'t have recaptcha base url'));
349
- Vibration.vibrate()
358
+ vibrateApp()
350
359
  return
351
360
  }
352
361
  recaptchaRef.current.open()
@@ -390,11 +399,13 @@ const SignupFormUI = (props: SignupParams) => {
390
399
  baseUrl: configs?.security_recaptcha_base_url?.value || null
391
400
  })
392
401
  showToast(ToastType.Info, t('TRY_AGAIN', 'Please try again'))
393
- Vibration.vibrate()
402
+ vibrateApp()
394
403
  return
395
404
  }
396
- formState.result?.result && showToast(ToastType.Error, formState.result?.result[0]);
397
- formState.result?.result && Vibration.vibrate()
405
+ formState.result?.result && formState.result?.result[0]?.includes("_") ?
406
+ showToast(ToastType.Error, t(`${formState.result?.result[0]}`, 'Phone number already used')) :
407
+ showToast(ToastType.Error, formState.result?.result[0])
408
+ formState.result?.result && vibrateApp()
398
409
  setIsLoadingVerifyModal(false);
399
410
  }
400
411
  }, [formState]);
@@ -402,7 +413,7 @@ const SignupFormUI = (props: SignupParams) => {
402
413
  useEffect(() => {
403
414
  if (Object.keys(errors).length > 0) {
404
415
  setIsLoadingVerifyModal(false);
405
- Vibration.vibrate()
416
+ vibrateApp()
406
417
  }
407
418
  }, [errors])
408
419
 
@@ -431,7 +442,7 @@ const SignupFormUI = (props: SignupParams) => {
431
442
  ? verifyPhoneState?.result?.result
432
443
  : verifyPhoneState?.result?.result[0];
433
444
  verifyPhoneState.result?.result && showToast(ToastType.Error, message);
434
- verifyPhoneState.result?.result && Vibration.vibrate()
445
+ verifyPhoneState.result?.result && vibrateApp()
435
446
  setIsLoadingVerifyModal(false);
436
447
  return;
437
448
  }
@@ -591,7 +602,7 @@ const SignupFormUI = (props: SignupParams) => {
591
602
  control={control}
592
603
  render={({ onChange, value }: any) => (
593
604
  <OInput
594
- placeholder={t(field.name)}
605
+ placeholder={t(field.name?.replace(/\s/g, '_')?.toUpperCase(), field.name)}
595
606
  style={style.inputStyle}
596
607
  icon={
597
608
  field.code === 'email'
@@ -930,7 +941,7 @@ const SignupFormUI = (props: SignupParams) => {
930
941
  (
931
942
  <FacebookLogin
932
943
  notificationState={notificationState}
933
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
944
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
934
945
  handleLoading={(val: boolean) => setIsFBLoading(val)}
935
946
  handleSuccessFacebookLogin={handleSuccessFacebook}
936
947
  />
@@ -939,7 +950,7 @@ const SignupFormUI = (props: SignupParams) => {
939
950
  <GoogleLogin
940
951
  notificationState={notificationState}
941
952
  webClientId={configs?.google_login_client_id?.value}
942
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
953
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
943
954
  handleLoading={(val: boolean) => setIsFBLoading(val)}
944
955
  handleSuccessGoogleLogin={handleSuccessFacebook}
945
956
  />
@@ -947,7 +958,7 @@ const SignupFormUI = (props: SignupParams) => {
947
958
  {(configs?.apple_login_client_id?.value !== '' && configs?.apple_login_client_id?.value !== null) && appleLoginEnabled && (
948
959
  <AppleLogin
949
960
  notificationState={notificationState}
950
- handleErrors={(err: any) => { showToast(ToastType.Error, err), Vibration.vibrate() }}
961
+ handleErrors={(err: any) => { showToast(ToastType.Error, err), vibrateApp() }}
951
962
  handleLoading={(val: boolean) => setIsFBLoading(val)}
952
963
  handleSuccessAppleLogin={handleSuccessFacebook}
953
964
  />