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