ordering-ui-react-native 0.16.75 → 0.16.76-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 (216) hide show
  1. package/package.json +6 -5
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/styles.tsx +8 -14
  4. package/src/components/BusinessInformation/index.tsx +19 -4
  5. package/src/components/BusinessInformation/styles.tsx +2 -2
  6. package/src/components/BusinessProductsList/index.tsx +10 -10
  7. package/src/components/BusinessesListing/index.tsx +1 -1
  8. package/src/components/LanguageSelector/index.tsx +21 -16
  9. package/src/components/Messages/index.tsx +2 -2
  10. package/src/components/OrderCreating/index.tsx +2 -2
  11. package/src/components/OrdersOption/index.tsx +54 -56
  12. package/src/components/PaymentOptions/index.tsx +298 -347
  13. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  14. package/src/components/SingleProductReview/index.tsx +7 -4
  15. package/src/components/VerifyPhone/styles.tsx +1 -2
  16. package/src/components/shared/OToast.tsx +4 -4
  17. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  18. package/src/utils/index.tsx +2 -1
  19. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +260 -238
  20. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  21. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  22. package/themes/business/src/components/Chat/index.tsx +31 -31
  23. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  24. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  25. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  26. package/themes/business/src/components/LoginForm/index.tsx +332 -140
  27. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  28. package/themes/business/src/components/MapView/index.tsx +14 -3
  29. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  30. package/themes/business/src/components/NewOrderNotification/index.tsx +31 -41
  31. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +70 -43
  32. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +3 -3
  33. package/themes/business/src/components/OrdersOption/index.tsx +63 -73
  34. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  35. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  36. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  37. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  38. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  39. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  40. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  41. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  42. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  43. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  44. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  45. package/themes/business/src/components/PreviousOrders/index.tsx +440 -245
  46. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  47. package/themes/business/src/components/ProductItemAccordion/index.tsx +24 -5
  48. package/themes/business/src/components/ReviewCustomer/index.tsx +39 -15
  49. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  50. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  51. package/themes/business/src/components/shared/OLink.tsx +33 -13
  52. package/themes/business/src/components/shared/OText.tsx +8 -2
  53. package/themes/business/src/types/index.tsx +29 -3
  54. package/themes/business/src/utils/index.tsx +26 -0
  55. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  57. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  58. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  59. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  60. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  61. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  62. package/themes/kiosk/src/components/LoginForm/index.tsx +545 -112
  63. package/themes/kiosk/src/components/LoginForm/styles.tsx +18 -0
  64. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  65. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  66. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  67. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +1 -0
  68. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  69. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  70. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  71. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  72. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  73. package/themes/kiosk/src/types/index.d.ts +15 -0
  74. package/themes/kiosk/src/utils/index.tsx +15 -0
  75. package/themes/original/index.tsx +8 -0
  76. package/themes/original/src/components/AddressDetails/index.tsx +10 -8
  77. package/themes/original/src/components/AddressForm/index.tsx +155 -139
  78. package/themes/original/src/components/AddressList/index.tsx +18 -18
  79. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  80. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  81. package/themes/original/src/components/BusinessBasicInformation/index.tsx +47 -22
  82. package/themes/original/src/components/BusinessController/index.tsx +101 -70
  83. package/themes/original/src/components/BusinessController/styles.tsx +14 -9
  84. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  85. package/themes/original/src/components/BusinessItemAccordion/index.tsx +12 -6
  86. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  87. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  88. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  89. package/themes/original/src/components/BusinessListingSearch/index.tsx +104 -155
  90. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  91. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  92. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  93. package/themes/original/src/components/BusinessProductsList/index.tsx +26 -52
  94. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  95. package/themes/original/src/components/BusinessProductsListing/index.tsx +563 -493
  96. package/themes/original/src/components/BusinessProductsListing/styles.tsx +13 -12
  97. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -2
  98. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  99. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +116 -81
  100. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  101. package/themes/original/src/components/BusinessesListing/index.tsx +7 -6
  102. package/themes/original/src/components/Cart/index.tsx +75 -40
  103. package/themes/original/src/components/CartContent/index.tsx +80 -18
  104. package/themes/original/src/components/CartContent/styles.tsx +11 -1
  105. package/themes/original/src/components/Checkout/index.tsx +102 -108
  106. package/themes/original/src/components/Checkout/styles.tsx +4 -3
  107. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  108. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  109. package/themes/original/src/components/DriverTips/index.tsx +47 -37
  110. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  111. package/themes/original/src/components/Favorite/index.tsx +7 -4
  112. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  113. package/themes/original/src/components/FavoriteList/index.tsx +70 -80
  114. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  115. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  116. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  117. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  118. package/themes/original/src/components/GoogleMap/index.tsx +10 -1
  119. package/themes/original/src/components/Help/index.tsx +8 -8
  120. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +14 -20
  121. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  122. package/themes/original/src/components/HelpGuide/index.tsx +13 -12
  123. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  124. package/themes/original/src/components/HelpOrder/index.tsx +12 -20
  125. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  126. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  127. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  128. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  129. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  130. package/themes/original/src/components/LoginForm/index.tsx +98 -41
  131. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  132. package/themes/original/src/components/MessageListing/index.tsx +7 -40
  133. package/themes/original/src/components/Messages/index.tsx +42 -26
  134. package/themes/original/src/components/MomentOption/index.tsx +23 -14
  135. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  136. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -93
  137. package/themes/original/src/components/MultiCheckout/index.tsx +158 -77
  138. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  139. package/themes/original/src/components/MultiOrdersDetails/index.tsx +85 -34
  140. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  141. package/themes/original/src/components/MyOrders/index.tsx +66 -17
  142. package/themes/original/src/components/NavBar/index.tsx +7 -6
  143. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  144. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  145. package/themes/original/src/components/Notifications/index.tsx +144 -0
  146. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  147. package/themes/original/src/components/OrderDetails/index.tsx +108 -218
  148. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  149. package/themes/original/src/components/OrderItAgain/index.tsx +46 -43
  150. package/themes/original/src/components/OrderProgress/index.tsx +81 -105
  151. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  152. package/themes/original/src/components/OrderSummary/index.tsx +2 -2
  153. package/themes/original/src/components/OrderTypeSelector/index.tsx +13 -6
  154. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +93 -97
  155. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  156. package/themes/original/src/components/OrdersOption/index.tsx +86 -92
  157. package/themes/original/src/components/PageBanner/index.tsx +146 -0
  158. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  159. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  160. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  161. package/themes/original/src/components/PaymentOptions/index.tsx +1 -1
  162. package/themes/original/src/components/PhoneInputNumber/index.tsx +1 -1
  163. package/themes/original/src/components/PlaceSpot/index.tsx +16 -6
  164. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  165. package/themes/original/src/components/ProductForm/index.tsx +240 -254
  166. package/themes/original/src/components/ProductForm/styles.tsx +5 -8
  167. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  168. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  169. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  170. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  171. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -49
  172. package/themes/original/src/components/ProfessionalProfile/index.tsx +20 -9
  173. package/themes/original/src/components/Promotions/index.tsx +234 -220
  174. package/themes/original/src/components/Promotions/styles.tsx +7 -2
  175. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  176. package/themes/original/src/components/ReviewOrder/index.tsx +43 -11
  177. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  178. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  179. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  180. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  181. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  182. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  183. package/themes/original/src/components/ServiceForm/index.tsx +360 -265
  184. package/themes/original/src/components/Sessions/index.tsx +11 -8
  185. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  186. package/themes/original/src/components/SignupForm/index.tsx +150 -100
  187. package/themes/original/src/components/SingleOrderCard/index.tsx +125 -56
  188. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  189. package/themes/original/src/components/SingleProductCard/index.tsx +116 -79
  190. package/themes/original/src/components/SingleProductCard/styles.tsx +14 -13
  191. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  192. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  193. package/themes/original/src/components/StripeCardsList/index.tsx +1 -1
  194. package/themes/original/src/components/StripeElementsForm/index.tsx +3 -0
  195. package/themes/original/src/components/UpsellingProducts/index.tsx +244 -215
  196. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  197. package/themes/original/src/components/UserDetails/index.tsx +5 -3
  198. package/themes/original/src/components/UserFormDetails/index.tsx +50 -54
  199. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  200. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  201. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  202. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  203. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  204. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  205. package/themes/original/src/components/Wallets/index.tsx +177 -164
  206. package/themes/original/src/components/Wallets/styles.tsx +12 -8
  207. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  208. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  209. package/themes/original/src/components/shared/OBottomPopup.tsx +6 -4
  210. package/themes/original/src/components/shared/OButton.tsx +9 -4
  211. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  212. package/themes/original/src/components/shared/OInput.tsx +10 -1
  213. package/themes/original/src/layouts/Container.tsx +13 -9
  214. package/themes/original/src/types/index.tsx +42 -7
  215. package/themes/original/src/utils/index.tsx +322 -58
  216. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,7 +1,7 @@
1
1
  import React, { useState, useEffect, useRef } from 'react'
2
2
  import { useTheme } from 'styled-components/native'
3
3
  import { Platform, View, StyleSheet, Dimensions, ScrollView, TouchableOpacity } from 'react-native'
4
- import { OText, OButton, OModal } from '../shared'
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'
7
7
  import SelectDropdown from 'react-native-select-dropdown'
@@ -10,6 +10,10 @@ import CalendarPicker from 'react-native-calendar-picker'
10
10
  import FeatherIcon from 'react-native-vector-icons/Feather';
11
11
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
12
12
  import { ServiceFormParams } from '../../types'
13
+ import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
14
+ import uuid from 'react-native-uuid';
15
+ import { orderTypeList } from '../../utils'
16
+
13
17
  import {
14
18
  ProductForm as ProductFormController,
15
19
  useUtils,
@@ -35,14 +39,17 @@ const screenWidth = Dimensions.get('window').width
35
39
  const ServiceFormUI = (props: ServiceFormParams) => {
36
40
  const {
37
41
  professionalSelected,
38
- product,
42
+ productObject,
39
43
  handleSave,
40
44
  productCart,
41
45
  navigation,
42
46
  isSoldOut,
43
47
  maxProductQuantity,
44
48
  onClose,
45
- professionalList
49
+ professionalListState,
50
+ isCartProduct,
51
+ actionStatus,
52
+ handleCreateGuestUser
46
53
  } = props
47
54
 
48
55
  const theme = useTheme()
@@ -52,15 +59,19 @@ const ServiceFormUI = (props: ServiceFormParams) => {
52
59
  const [{ configs }] = useConfig()
53
60
  const [orderState] = useOrder()
54
61
  const [{ auth }] = useSession()
62
+ const { product, loading, error } = productObject;
55
63
 
56
64
  const [selectDate, setSelectedDate] = useState<any>(new Date())
57
65
  const [timeList, setTimeList] = useState<any>([])
58
66
  const [isEnabled, setIsEnabled] = useState(false)
59
- const [timeSelected, setTimeSelected] = useState(null)
67
+ const [timeSelected, setTimeSelected] = useState<string | null>(null)
60
68
  const [dateSelected, setDateSelected] = useState<any>(null)
61
69
  const [isOpen, setIsOpen] = useState(false)
62
70
  const [currentProfessional, setCurrentProfessional] = useState<any>(null)
63
71
 
72
+ const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
73
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
74
+
64
75
  const dropdownRef = useRef<any>(null)
65
76
 
66
77
  const styles = StyleSheet.create({
@@ -106,10 +117,24 @@ const ServiceFormUI = (props: ServiceFormParams) => {
106
117
  })
107
118
 
108
119
  const isBusyTime = (professional: any) => {
109
- if (professional?.busy_times?.length === 0 || !dateSelected) return false
110
- const valid = professional?.busy_times.some((item: any) => {
111
- return moment(item?.start).valueOf() <= moment(dateSelected).valueOf() &&
112
- moment(dateSelected).valueOf() <= moment(item?.end).valueOf()
120
+ if (!dateSelected) return false
121
+ const startDay = moment(dateSelected).utc().format('d')
122
+ const isStartScheduleEnabled = professional?.schedule?.[startDay]?.enabled
123
+ const duration = product?.duration ?? 0
124
+ const endDay = moment(dateSelected).add(duration - 1, 'minutes').utc().format('d')
125
+ const isEndScheduleEnabled = professional?.schedule?.[endDay]?.enabled
126
+ if (!isStartScheduleEnabled || !isEndScheduleEnabled) return true
127
+
128
+ if (professional?.busy_times?.length === 0) return false
129
+
130
+ const busyTimes = isCartProduct
131
+ ? professional?.busy_times.filter((item: any) => !(item.start === productCart?.calendar_event?.start && item.end === productCart?.calendar_event?.end))
132
+ : [...professional?.busy_times]
133
+ const valid = busyTimes.some((item: any) => {
134
+ return (moment.utc(item?.start).local().valueOf() <= moment(dateSelected).valueOf() &&
135
+ moment(dateSelected).valueOf() < moment.utc(item?.end).local().valueOf()) ||
136
+ (moment.utc(item?.start).local().valueOf() <= moment(dateSelected).add(duration, 'minutes').valueOf() &&
137
+ moment(dateSelected).add(duration, 'minutes').valueOf() < moment.utc(item?.end).local().valueOf())
113
138
  })
114
139
  return valid
115
140
  }
@@ -130,6 +155,11 @@ const ServiceFormUI = (props: ServiceFormParams) => {
130
155
  )
131
156
  }
132
157
 
158
+ const handleUpdateGuest = () => {
159
+ const guestToken = uuid.v4()
160
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
161
+ }
162
+
133
163
  const customDayHeaderStylesCallback = () => {
134
164
  return {
135
165
  textStyle: {
@@ -141,7 +171,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
141
171
 
142
172
  const handleSaveService = () => {
143
173
  const updated = {
144
- serviceTime: dateSelected,
174
+ serviceTime: moment(dateSelected).utc().format('YYYY-MM-DD HH:mm:00'),
145
175
  professional: currentProfessional
146
176
  }
147
177
  handleSave && handleSave(updated)
@@ -153,7 +183,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
153
183
  }
154
184
 
155
185
  const handleRedirectLogin = () => {
156
- navigation.navigate('Login', {
186
+ navigation && navigation.navigate('Login', {
157
187
  store_slug: props.businessSlug
158
188
  });
159
189
  onClose && onClose()
@@ -209,7 +239,7 @@ const ServiceFormUI = (props: ServiceFormParams) => {
209
239
  }
210
240
 
211
241
  const addressRedirect = () => {
212
- navigation.navigate('AddressList')
242
+ navigation && navigation.navigate('AddressList')
213
243
  onClose && onClose()
214
244
  }
215
245
 
@@ -234,102 +264,146 @@ const ServiceFormUI = (props: ServiceFormParams) => {
234
264
  }, [selectDate, timeSelected])
235
265
 
236
266
  useEffect(() => {
237
- if (!professionalSelected) return
267
+ if (!professionalSelected?.schedule) return
238
268
  setCurrentProfessional(professionalSelected)
239
269
  }, [professionalSelected])
270
+
271
+ useEffect(() => {
272
+ if (isCartProduct && professionalListState?.professionals?.length > 0) {
273
+ const professional = professionalListState?.professionals?.find((item: any) => item.id === professionalSelected?.id)
274
+ setCurrentProfessional(professional)
275
+ }
276
+ }, [isCartProduct, professionalListState?.professionals])
277
+
278
+ useEffect(() => {
279
+ if (!productCart?.calendar_event?.start) return
280
+ setSelectedDate(moment.utc(productCart?.calendar_event?.start).local())
281
+ setTimeSelected(moment.utc(productCart?.calendar_event?.start).local().format('HH:mm'))
282
+ }, [productCart])
240
283
 
241
284
  return (
242
285
  <>
243
- <Container>
244
- <ProfessionalPhoto
245
- source={{
246
- uri:
247
- product?.images ||
248
- optimizeImage(theme?.images?.dummies?.product, 'h_250,c_limit'),
249
- }}
250
- />
251
- <InfoWrapper>
252
- <OText
253
- size={20}
254
- style={{ marginBottom: 4 }}
255
- weight={Platform.OS === 'ios' ? '600' : 'bold'}
256
- >
257
- {product?.name}
258
- </OText>
259
- <OText
260
- size={16}
261
- style={{ marginBottom: 10 }}
262
- weight={'400'}
263
- >
264
- {parsePrice(product?.price)} {product?.duration}min
265
- </OText>
266
- <OText
267
- size={14}
268
- weight={'400'}
269
- color={theme?.colors?.disabled}
270
- >
271
- {product?.description}
272
- </OText>
273
- </InfoWrapper>
274
- <Divider />
275
- <ProfessionalWrapper>
276
- <View
277
- style={{
278
- flexDirection: 'row',
279
- justifyContent: 'space-between',
280
- alignItems: 'center',
281
- marginBottom: 23
282
- }}
283
- >
286
+ {loading && !error && (
287
+ <Placeholder Animation={Fade}>
288
+ <PlaceholderLine
289
+ height={258}
290
+ style={{ borderRadius: 0 }}
291
+ width={screenWidth}
292
+ />
293
+ </Placeholder>
294
+ )}
295
+ {!loading && !error && (
296
+ <Container>
297
+ {!!product?.images ? (
298
+ <ProfessionalPhoto
299
+ source={{
300
+ uri: product?.images
301
+ }}
302
+ />
303
+ ) : (
304
+ <OIcon
305
+ src={theme?.images?.dummies?.product}
306
+ cover={false}
307
+ style={{ alignSelf: 'center' }}
308
+ width={200}
309
+ height={200}
310
+ />
311
+ )}
312
+ <InfoWrapper>
284
313
  <OText
285
- size={16}
314
+ size={20}
315
+ style={{ marginBottom: 4 }}
286
316
  weight={Platform.OS === 'ios' ? '600' : 'bold'}
287
317
  >
288
- {t('PROFESSIONAL', 'Professional')}
318
+ {product?.name}
289
319
  </OText>
290
320
  <OText
291
- size={10}
321
+ size={16}
322
+ style={{ marginBottom: 10 }}
292
323
  weight={'400'}
293
- color={theme.colors?.danger5}
294
324
  >
295
- {t('REQUIRED', 'Required')}
325
+ {parsePrice(product?.price)} • {product?.duration}min
296
326
  </OText>
297
- </View>
298
- {currentProfessional && (
327
+ <OText
328
+ size={14}
329
+ weight={'400'}
330
+ color={theme?.colors?.disabled}
331
+ >
332
+ {product?.description}
333
+ </OText>
334
+ </InfoWrapper>
335
+ <Divider />
336
+ <ProfessionalWrapper>
337
+ <View
338
+ style={{
339
+ flexDirection: 'row',
340
+ justifyContent: 'space-between',
341
+ alignItems: 'center',
342
+ marginBottom: 23
343
+ }}
344
+ >
345
+ <OText
346
+ size={16}
347
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
348
+ >
349
+ {t('PROFESSIONAL', 'Professional')}
350
+ </OText>
351
+ <OText
352
+ size={10}
353
+ weight={'400'}
354
+ color={theme.colors?.danger5}
355
+ >
356
+ {t('REQUIRED', 'Required')}
357
+ </OText>
358
+ </View>
299
359
  <TouchableOpacity
300
360
  style={styles.professionalSelect}
301
361
  onPress={() => setIsOpen(true)}
302
362
  >
303
- <View style={{ flexDirection: 'row' }}>
304
- <FastImage
305
- style={styles.photoStyle}
306
- source={{
307
- uri: optimizeImage(currentProfessional?.photo, 'h_250,c_limit'),
308
- priority: FastImage.priority.normal,
309
- }}
310
- resizeMode={FastImage.resizeMode.cover}
311
- />
312
- <View style={{ marginLeft: 14 }}>
313
- <OText
314
- size={14}
315
- weight={'400'}
316
- lineHeight={22}
317
- >
318
- {currentProfessional?.name} {currentProfessional?.lastname}
319
- </OText>
320
- <OText
321
- size={12}
322
- weight={'400'}
323
- lineHeight={17}
324
- color={isBusyTime(currentProfessional) ? theme.colors.danger5 : theme.colors.success500}
325
- >
326
- {isBusyTime(currentProfessional)
327
- ? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
328
- : t('AVAILABLE', 'Available')
329
- }
330
- </OText>
331
- </View>
332
- </View>
363
+ {!!currentProfessional ? (
364
+ <>
365
+ <View style={{ flexDirection: 'row' }}>
366
+ {!!currentProfessional?.photo ? (
367
+ <FastImage
368
+ style={styles.photoStyle}
369
+ source={{
370
+ uri: optimizeImage(currentProfessional?.photo, 'h_250,c_limit'),
371
+ priority: FastImage.priority.normal,
372
+ }}
373
+ resizeMode={FastImage.resizeMode.cover}
374
+ />
375
+ ) : (
376
+ <OIcon
377
+ src={theme?.images?.general?.user}
378
+ cover={false}
379
+ style={styles.photoStyle}
380
+ />
381
+ )}
382
+ <View style={{ marginLeft: 14 }}>
383
+ <OText
384
+ size={14}
385
+ weight={'400'}
386
+ lineHeight={22}
387
+ >
388
+ {currentProfessional?.name} {currentProfessional?.lastname}
389
+ </OText>
390
+ <OText
391
+ size={12}
392
+ weight={'400'}
393
+ lineHeight={17}
394
+ color={isBusyTime(currentProfessional) ? theme.colors.danger5 : theme.colors.success500}
395
+ >
396
+ {isBusyTime(currentProfessional)
397
+ ? t('BUSY_ON_SELECTED_TIME', 'Busy on selected time')
398
+ : t('AVAILABLE', 'Available')
399
+ }
400
+ </OText>
401
+ </View>
402
+ </View>
403
+ </>
404
+ ) : (
405
+ <OText size={12}>{t('SELECT_PROFESSIONAL', 'Select professional')}</OText>
406
+ )}
333
407
  <View style={{ marginLeft: 5 }}>
334
408
  <IconAntDesign
335
409
  name='down'
@@ -338,179 +412,192 @@ const ServiceFormUI = (props: ServiceFormParams) => {
338
412
  />
339
413
  </View>
340
414
  </TouchableOpacity>
341
- )}
342
- </ProfessionalWrapper>
343
- <ScheduleWrapper>
344
- <View
345
- style={{
346
- flexDirection: 'row',
347
- justifyContent: 'space-between',
348
- alignItems: 'center',
349
- marginBottom: 23
350
- }}
351
- >
352
- <OText
353
- size={16}
354
- weight={Platform.OS === 'ios' ? '600' : 'bold'}
415
+ </ProfessionalWrapper>
416
+ <ScheduleWrapper>
417
+ <View
418
+ style={{
419
+ flexDirection: 'row',
420
+ justifyContent: 'space-between',
421
+ alignItems: 'center',
422
+ marginBottom: 23
423
+ }}
355
424
  >
356
- {t('SCHEDULE', 'Schedule')}
357
- </OText>
425
+ <OText
426
+ size={16}
427
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
428
+ >
429
+ {t('SCHEDULE', 'Schedule')}
430
+ </OText>
431
+ <OText
432
+ size={10}
433
+ weight={'400'}
434
+ color={theme.colors?.danger5}
435
+ >
436
+ {t('REQUIRED', 'Required')}
437
+ </OText>
438
+ </View>
439
+ {!!currentProfessional?.schedule ? (
440
+ <CalendarWrapper>
441
+ {(timeList?.length > 0 && isEnabled) ? (
442
+ <SelectDropdown
443
+ ref={dropdownRef}
444
+ defaultValueByIndex={timeList.findIndex((item: any) => item.value === timeSelected)}
445
+ data={timeList}
446
+ onSelect={(selectedItem, index) => {
447
+ setTimeSelected(selectedItem?.value)
448
+ }}
449
+ buttonTextAfterSelection={(selectedItem, index) => {
450
+ return selectedItem?.text
451
+ }}
452
+ rowTextForSelection={(item, index) => {
453
+ return item.text
454
+ }}
455
+ buttonStyle={{borderRadius: 7.6, ...styles.selectOption}}
456
+ buttonTextStyle={{
457
+ color: theme.colors.disabled,
458
+ fontSize: 14,
459
+ textAlign: 'left',
460
+ marginHorizontal: 0
461
+ }}
462
+ dropdownStyle={{
463
+ borderRadius: 8,
464
+ borderColor: theme.colors.lightGray,
465
+ marginTop: Platform.OS === 'ios' ? 12 : -top
466
+ }}
467
+ rowStyle={{
468
+ borderBottomColor: theme.colors.backgroundGray100,
469
+ backgroundColor: theme.colors.backgroundGray100,
470
+ height: 30,
471
+ flexDirection: 'column',
472
+ alignItems: 'flex-start',
473
+ paddingTop: 8,
474
+ paddingHorizontal: 12
475
+ }}
476
+ rowTextStyle={{
477
+ color: theme.colors.disabled,
478
+ fontSize: 14,
479
+ marginHorizontal: 0
480
+ }}
481
+ renderDropdownIcon={() => dropDownIcon()}
482
+ dropdownOverlayColor='transparent'
483
+ />
484
+ ) : (
485
+ <OText
486
+ size={12}
487
+ style={{ marginBottom: 30 }}
488
+ weight={'400'}
489
+ color={theme.colors?.danger5}
490
+ >
491
+ {t('PROFESSIONAL_NOT_AVAILABLE', 'Professional is not available at the moment')}
492
+ </OText>
493
+ )}
494
+ <CalendarPicker
495
+ previousComponent={
496
+ <FeatherIcon
497
+ name='chevron-left'
498
+ color={theme.colors.disabled}
499
+ size={24}
500
+ style={{ marginHorizontal: 4 }}
501
+ />
502
+ }
503
+ nextComponent={
504
+ <FeatherIcon
505
+ name='chevron-right'
506
+ color={theme.colors.disabled}
507
+ size={24}
508
+ style={{ marginHorizontal: 4 }}
509
+ />
510
+ }
511
+ width={screenWidth - 110}
512
+ selectedDayTextColor={theme.colors.white}
513
+ selectedDayColor={theme.colors.primary}
514
+ todayBackgroundColor={theme.colors.border}
515
+ dayLabelsWrapper={{ borderColor: theme.colors.clear }}
516
+ onDateChange={onDateChange}
517
+ minDate={new Date()}
518
+ customDayHeaderStyles={customDayHeaderStylesCallback}
519
+ selectedStartDate={selectDate}
520
+ />
521
+ </CalendarWrapper>
522
+ ) : (
523
+ <OText
524
+ size={16}
525
+ style={{ marginBottom: 30, textAlign: 'center' }}
526
+ color={theme?.colors?.disabled}
527
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
528
+ >
529
+ {t('NO_SCHEDULE', 'No schedule')}
530
+ </OText>
531
+ )}
532
+ </ScheduleWrapper>
533
+ <ButtonWrapper>
358
534
  <OText
359
- size={10}
360
- weight={'400'}
361
- color={theme.colors?.danger5}
535
+ size={14}
536
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
362
537
  >
363
- {t('REQUIRED', 'Required')}
538
+ {dateSelected && moment(dateSelected).format('hh:mm A')}
364
539
  </OText>
365
- </View>
366
- {!!currentProfessional?.schedule ? (
367
- <CalendarWrapper>
368
- {(timeList?.length > 0 && isEnabled) ? (
369
- <SelectDropdown
370
- ref={dropdownRef}
371
- defaultValue={timeSelected}
372
- data={timeList}
373
- onSelect={(selectedItem, index) => {
374
- setTimeSelected(selectedItem?.value)
375
- }}
376
- buttonTextAfterSelection={(selectedItem, index) => {
377
- return selectedItem?.text
378
- }}
379
- rowTextForSelection={(item, index) => {
380
- return item.text
381
- }}
382
- buttonStyle={{borderRadius: 7.6, ...styles.selectOption}}
383
- buttonTextStyle={{
384
- color: theme.colors.disabled,
385
- fontSize: 14,
386
- textAlign: 'left',
387
- marginHorizontal: 0
388
- }}
389
- dropdownStyle={{
390
- borderRadius: 8,
391
- borderColor: theme.colors.lightGray,
392
- marginTop: Platform.OS === 'ios' ? 12 : -top
393
- }}
394
- rowStyle={{
395
- borderBottomColor: theme.colors.backgroundGray100,
396
- backgroundColor: theme.colors.backgroundGray100,
397
- height: 30,
398
- flexDirection: 'column',
399
- alignItems: 'flex-start',
400
- paddingTop: 8,
401
- paddingHorizontal: 12
402
- }}
403
- rowTextStyle={{
404
- color: theme.colors.disabled,
405
- fontSize: 14,
406
- marginHorizontal: 0
407
- }}
408
- renderDropdownIcon={() => dropDownIcon()}
409
- dropdownOverlayColor='transparent'
540
+ {((productCart &&
541
+ auth &&
542
+ orderState.options?.address_id)) && (
543
+ <OButton
544
+ bgColor={theme.colors.primary}
545
+ onClick={() => handleSaveService()}
546
+ text={orderState.loading
547
+ ? t('LOADING', 'Loading')
548
+ : ((isSoldOut || maxProductQuantity <= 0)
549
+ ? t('SOLD_OUT', 'Sold out')
550
+ : t('BOOK', 'Book'))}
551
+ style={styles.buttonStyle}
552
+ isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected || isBusyTime(currentProfessional)}
553
+ textStyle={{ fontSize: 14, color: theme.colors.white }}
554
+ />
555
+ )}
556
+ {auth &&
557
+ !orderState.options?.address_id &&
558
+ (orderState.loading ? (
559
+ <OButton
560
+ isDisabled
561
+ text={t('LOADING', 'Loading')}
562
+ imgRightSrc=""
563
+ textStyle={{ fontSize: 10 }}
410
564
  />
411
565
  ) : (
412
- <OText
413
- size={12}
414
- style={{ marginBottom: 30 }}
415
- weight={'400'}
416
- color={theme.colors?.danger5}
417
- >
418
- {t('PROFESSIONAL_NOT_AVAILABLE', 'Professional is not available at the moment')}
419
- </OText>
566
+ <OButton onClick={() => addressRedirect()} />
567
+ ))}
568
+ {!auth && (
569
+ <OButton
570
+ isDisabled={isSoldOut || maxProductQuantity <= 0}
571
+ onClick={() => handleRedirectLogin()}
572
+ text={
573
+ isSoldOut || maxProductQuantity <= 0
574
+ ? t('SOLD_OUT', 'Sold out')
575
+ : t('LOGIN_SIGNUP', 'Login / Sign Up')
576
+ }
577
+ imgRightSrc=""
578
+ textStyle={{ color: theme.colors.primary, fontSize: 14 }}
579
+ style={{
580
+ height: 44,
581
+ borderColor: theme.colors.primary,
582
+ backgroundColor: theme.colors.white,
583
+ }}
584
+ />
420
585
  )}
421
- <CalendarPicker
422
- previousComponent={
423
- <FeatherIcon
424
- name='chevron-left'
425
- color={theme.colors.disabled}
426
- size={24}
427
- style={{ marginHorizontal: 4 }}
428
- />
429
- }
430
- nextComponent={
431
- <FeatherIcon
432
- name='chevron-right'
433
- color={theme.colors.disabled}
434
- size={24}
435
- style={{ marginHorizontal: 4 }}
436
- />
437
- }
438
- width={screenWidth - 110}
439
- selectedDayTextColor={theme.colors.white}
440
- selectedDayColor={theme.colors.primary}
441
- todayBackgroundColor={theme.colors.border}
442
- dayLabelsWrapper={{ borderColor: theme.colors.clear }}
443
- onDateChange={onDateChange}
444
- minDate={new Date()}
445
- customDayHeaderStyles={customDayHeaderStylesCallback}
446
- selectedStartDate={selectDate}
447
- />
448
- </CalendarWrapper>
449
- ) : (
450
- <OText
451
- size={20}
452
- style={{ marginBottom: 30 }}
453
- weight={Platform.OS === 'ios' ? '600' : 'bold'}
454
- >
455
- {t('NO_SCHEDULE', 'No schedule')}
456
- </OText>
457
- )}
458
- </ScheduleWrapper>
459
- <ButtonWrapper>
460
- <OText
461
- size={14}
462
- weight={Platform.OS === 'ios' ? '600' : 'bold'}
463
- >
464
- {dateSelected && moment(dateSelected).format('hh:mm A')}
465
- </OText>
466
- {((productCart &&
467
- auth &&
468
- orderState.options?.address_id)) && (
469
- <OButton
470
- bgColor={theme.colors.primary}
471
- onClick={() => handleSaveService()}
472
- text={orderState.loading
473
- ? t('LOADING', 'Loading')
474
- : ((isSoldOut || maxProductQuantity <= 0)
475
- ? t('SOLD_OUT', 'Sold out')
476
- : t('BOOK', 'Book'))}
477
- style={styles.buttonStyle}
478
- isDisabled={isSoldOut || maxProductQuantity <= 0 || !currentProfessional?.id || !dateSelected}
479
- textStyle={{ fontSize: 14, color: theme.colors.white }}
480
- />
481
- )}
482
- {auth &&
483
- !orderState.options?.address_id &&
484
- (orderState.loading ? (
485
- <OButton
486
- isDisabled
487
- text={t('LOADING', 'Loading')}
488
- imgRightSrc=""
489
- textStyle={{ fontSize: 10 }}
490
- />
491
- ) : (
492
- <OButton onClick={() => addressRedirect()} />
493
- ))}
494
- {!auth && (
495
- <OButton
496
- isDisabled={isSoldOut || maxProductQuantity <= 0}
497
- onClick={() => handleRedirectLogin()}
498
- text={
499
- isSoldOut || maxProductQuantity <= 0
500
- ? t('SOLD_OUT', 'Sold out')
501
- : t('LOGIN_SIGNUP', 'Login / Sign Up')
502
- }
503
- imgRightSrc=""
504
- textStyle={{ color: theme.colors.primary, fontSize: 14 }}
505
- style={{
506
- height: 44,
507
- borderColor: theme.colors.primary,
508
- backgroundColor: theme.colors.white,
509
- }}
510
- />
511
- )}
512
- </ButtonWrapper>
513
- </Container>
586
+ {!auth && guestCheckoutEnabled && orderTypeEnabled && (
587
+ <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
588
+ {actionStatus?.loading ? (
589
+ <Placeholder Animation={Fade}>
590
+ <PlaceholderLine width={60} height={20} />
591
+ </Placeholder>
592
+ ) : (
593
+ <OText color={theme.colors.primary} size={13}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
594
+ )}
595
+ </TouchableOpacity>
596
+ )}
597
+ </ButtonWrapper>
598
+ </Container>
599
+ )}
600
+
514
601
  <OModal
515
602
  open={isOpen}
516
603
  onClose={() => setIsOpen(false)}
@@ -525,21 +612,29 @@ const ServiceFormUI = (props: ServiceFormParams) => {
525
612
  {t('ANY_OROFESSIONAL_MEMBER', 'Any professional member')}
526
613
  </OText>
527
614
  </View>
528
- {professionalList?.map((professional: any) => professional?.products?.includes(product?.id) && (
615
+ {professionalListState?.professionals?.map((professional: any) => (
529
616
  <TouchableOpacity
530
617
  key={professional?.id}
531
618
  style={styles.professionalItem}
532
619
  onPress={() => handleChangeProfessional(professional)}
533
620
  >
534
621
  <View style={{ flexDirection: 'row' }}>
535
- <FastImage
536
- style={styles.photoStyle}
537
- source={{
538
- uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
539
- priority: FastImage.priority.normal,
540
- }}
541
- resizeMode={FastImage.resizeMode.cover}
542
- />
622
+ {!!professional?.photo ? (
623
+ <FastImage
624
+ style={styles.photoStyle}
625
+ source={{
626
+ uri: optimizeImage(professional?.photo, 'h_250,c_limit'),
627
+ priority: FastImage.priority.normal,
628
+ }}
629
+ resizeMode={FastImage.resizeMode.cover}
630
+ />
631
+ ) : (
632
+ <OIcon
633
+ src={theme?.images?.general?.user}
634
+ cover={false}
635
+ style={styles.photoStyle}
636
+ />
637
+ )}
543
638
  <View style={{ marginLeft: 14 }}>
544
639
  <OText
545
640
  size={14}