ordering-ui-react-native 0.16.25 → 0.16.26-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 (198) hide show
  1. package/package.json +7 -4
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/ActiveOrders/index.tsx +61 -63
  4. package/src/components/ActiveOrders/styles.tsx +8 -14
  5. package/src/components/AddressForm/index.tsx +18 -2
  6. package/src/components/BusinessBasicInformation/index.tsx +11 -19
  7. package/src/components/BusinessInformation/index.tsx +33 -4
  8. package/src/components/BusinessInformation/styles.tsx +2 -2
  9. package/src/components/BusinessProductsList/index.tsx +10 -10
  10. package/src/components/BusinessesListing/index.tsx +1 -1
  11. package/src/components/Checkout/index.tsx +2 -1
  12. package/src/components/LanguageSelector/index.tsx +21 -16
  13. package/src/components/LoginForm/index.tsx +15 -0
  14. package/src/components/Messages/index.tsx +2 -2
  15. package/src/components/NotificationSetting/index.tsx +85 -0
  16. package/src/components/OrderDetails/index.tsx +2 -20
  17. package/src/components/OrdersOption/index.tsx +54 -56
  18. package/src/components/PaymentOptions/index.tsx +335 -365
  19. package/src/components/PaymentOptionsWebView/index.tsx +120 -121
  20. package/src/components/ReviewDriver/index.tsx +1 -1
  21. package/src/components/ReviewOrder/index.tsx +2 -1
  22. package/src/components/ReviewProducts/index.tsx +11 -0
  23. package/src/components/SignupForm/index.tsx +15 -0
  24. package/src/components/SingleProductReview/index.tsx +8 -5
  25. package/src/components/StripeElementsForm/index.tsx +25 -16
  26. package/src/components/VerifyPhone/styles.tsx +1 -2
  27. package/src/components/shared/OBottomPopup.tsx +6 -2
  28. package/src/index.tsx +2 -0
  29. package/src/pages/BusinessesListing.tsx +7 -6
  30. package/src/pages/OrderDetails.tsx +1 -1
  31. package/src/pages/ReviewDriver.tsx +2 -2
  32. package/src/pages/ReviewOrder.tsx +2 -2
  33. package/src/types/@fatnlazycat/react-native-recaptcha-v3/index.d.ts +1 -0
  34. package/src/utils/index.tsx +0 -1
  35. package/themes/business/index.tsx +4 -0
  36. package/themes/business/src/components/BusinessController/index.tsx +2 -2
  37. package/themes/business/src/components/Chat/index.tsx +42 -34
  38. package/themes/business/src/components/DriverMap/index.tsx +7 -5
  39. package/themes/business/src/components/DriverSchedule/index.tsx +71 -0
  40. package/themes/business/src/components/DriverSchedule/styles.tsx +6 -0
  41. package/themes/business/src/components/LoginForm/index.tsx +111 -74
  42. package/themes/business/src/components/MapView/index.tsx +12 -1
  43. package/themes/business/src/components/MessagesOption/index.tsx +11 -1
  44. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  45. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +25 -19
  46. package/themes/business/src/components/OrdersListManager/index.tsx +10 -3
  47. package/themes/business/src/components/OrdersOption/index.tsx +65 -21
  48. package/themes/business/src/components/OrdersOption/styles.tsx +5 -1
  49. package/themes/business/src/components/OrdersOptionBusiness/index.tsx +15 -1
  50. package/themes/business/src/components/OrdersOptionCity/index.tsx +15 -1
  51. package/themes/business/src/components/OrdersOptionDate/index.tsx +19 -6
  52. package/themes/business/src/components/OrdersOptionDelivery/index.tsx +15 -1
  53. package/themes/business/src/components/OrdersOptionDriver/index.tsx +15 -1
  54. package/themes/business/src/components/OrdersOptionPaymethod/index.tsx +15 -1
  55. package/themes/business/src/components/OrdersOptionStatus/index.tsx +10 -1
  56. package/themes/business/src/components/PreviousMessages/index.tsx +17 -18
  57. package/themes/business/src/components/PreviousOrders/index.tsx +21 -23
  58. package/themes/business/src/components/ProductItemAccordion/index.tsx +5 -4
  59. package/themes/business/src/components/ReviewCustomer/index.tsx +1 -1
  60. package/themes/business/src/components/ScheduleBlocked/index.tsx +53 -0
  61. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  62. package/themes/business/src/components/UserProfileForm/index.tsx +28 -4
  63. package/themes/business/src/components/shared/ODropDown.tsx +42 -8
  64. package/themes/business/src/components/shared/ODropDownCalendar.tsx +36 -7
  65. package/themes/business/src/components/shared/OModal.tsx +40 -37
  66. package/themes/business/src/types/index.tsx +15 -9
  67. package/themes/business/src/utils/index.tsx +10 -0
  68. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  69. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  70. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  71. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  72. package/themes/kiosk/src/components/LoginForm/index.tsx +121 -10
  73. package/themes/kiosk/src/components/LoginForm/styles.tsx +5 -0
  74. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  75. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  76. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  77. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  78. package/themes/kiosk/src/types/index.d.ts +2 -0
  79. package/themes/original/index.tsx +12 -0
  80. package/themes/original/src/components/AddressForm/index.tsx +139 -135
  81. package/themes/original/src/components/AddressList/index.tsx +1 -1
  82. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  83. package/themes/original/src/components/BusinessBasicInformation/index.tsx +311 -161
  84. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +6 -2
  85. package/themes/original/src/components/BusinessController/index.tsx +190 -113
  86. package/themes/original/src/components/BusinessController/styles.tsx +0 -7
  87. package/themes/original/src/components/BusinessItemAccordion/index.tsx +4 -4
  88. package/themes/original/src/components/BusinessListingSearch/BusinessControllerSkeletons/index.tsx +57 -0
  89. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/index.tsx +59 -0
  90. package/themes/original/src/components/BusinessListingSearch/MaxSectionItem/styles.tsx +13 -0
  91. package/themes/original/src/components/BusinessListingSearch/index.tsx +81 -128
  92. package/themes/original/src/components/BusinessListingSearch/styles.tsx +10 -12
  93. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +87 -0
  94. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/styles.tsx +12 -0
  95. package/themes/original/src/components/BusinessProductsList/index.tsx +49 -52
  96. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  97. package/themes/original/src/components/BusinessProductsListing/index.tsx +289 -175
  98. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -8
  99. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  100. package/themes/original/src/components/BusinessTypeFilter/index.tsx +109 -40
  101. package/themes/original/src/components/BusinessTypeFilter/styles.tsx +2 -0
  102. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +561 -0
  103. package/themes/original/src/components/BusinessesListing/{styles.tsx → Layout/Appointment/styles.tsx} +24 -10
  104. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +676 -0
  105. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +137 -0
  106. package/themes/original/src/components/BusinessesListing/index.tsx +105 -519
  107. package/themes/original/src/components/Cart/index.tsx +42 -10
  108. package/themes/original/src/components/Cart/styles.tsx +4 -0
  109. package/themes/original/src/components/CartContent/index.tsx +22 -16
  110. package/themes/original/src/components/Checkout/index.tsx +93 -53
  111. package/themes/original/src/components/Checkout/styles.tsx +0 -1
  112. package/themes/original/src/components/DriverTips/index.tsx +4 -4
  113. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  114. package/themes/original/src/components/Favorite/index.tsx +1 -0
  115. package/themes/original/src/components/FavoriteList/index.tsx +32 -2
  116. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  117. package/themes/original/src/components/GPSButton/index.tsx +20 -19
  118. package/themes/original/src/components/GoogleMap/index.tsx +20 -12
  119. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +8 -3
  120. package/themes/original/src/components/HelpGuide/index.tsx +8 -3
  121. package/themes/original/src/components/HelpOrder/index.tsx +8 -3
  122. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  123. package/themes/original/src/components/LoginForm/Otp/index.tsx +95 -72
  124. package/themes/original/src/components/LoginForm/index.tsx +82 -44
  125. package/themes/original/src/components/LottieAnimation/index.tsx +69 -0
  126. package/themes/original/src/components/Messages/index.tsx +17 -17
  127. package/themes/original/src/components/MomentSelector/index.tsx +197 -0
  128. package/themes/original/src/components/MomentSelector/styles.tsx +6 -0
  129. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +92 -92
  130. package/themes/original/src/components/MultiCheckout/index.tsx +6 -0
  131. package/themes/original/src/components/MultiOrdersDetails/index.tsx +20 -16
  132. package/themes/original/src/components/MyOrders/index.tsx +70 -6
  133. package/themes/original/src/components/NavBar/index.tsx +15 -9
  134. package/themes/original/src/components/NetworkError/index.tsx +5 -3
  135. package/themes/original/src/components/NotFoundSource/index.tsx +2 -1
  136. package/themes/original/src/components/Notifications/index.tsx +148 -0
  137. package/themes/original/src/components/Notifications/styles.tsx +17 -0
  138. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  139. package/themes/original/src/components/OrderDetails/index.tsx +190 -35
  140. package/themes/original/src/components/OrderDetails/styles.tsx +15 -2
  141. package/themes/original/src/components/OrderItAgain/index.tsx +75 -0
  142. package/themes/original/src/components/OrderItAgain/styles.tsx +10 -0
  143. package/themes/original/src/components/OrderProgress/index.tsx +8 -2
  144. package/themes/original/src/components/OrderSummary/index.tsx +1 -34
  145. package/themes/original/src/components/OrderTypeSelector/index.tsx +85 -36
  146. package/themes/original/src/components/OrderTypeSelector/styles.tsx +19 -1
  147. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +100 -106
  148. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +17 -12
  149. package/themes/original/src/components/OrdersOption/index.tsx +71 -55
  150. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  151. package/themes/original/src/components/PaymentOptions/index.tsx +41 -23
  152. package/themes/original/src/components/PhoneInputNumber/index.tsx +4 -10
  153. package/themes/original/src/components/PlaceSpot/index.tsx +243 -47
  154. package/themes/original/src/components/PlaceSpot/styles.tsx +0 -2
  155. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  156. package/themes/original/src/components/ProductForm/index.tsx +710 -653
  157. package/themes/original/src/components/ProductForm/styles.tsx +9 -7
  158. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  159. package/themes/original/src/components/ProductOption/index.tsx +1 -1
  160. package/themes/original/src/components/ProfessionalFilter/index.tsx +129 -0
  161. package/themes/original/src/components/ProfessionalFilter/styles.tsx +0 -0
  162. package/themes/original/src/components/ProfessionalProfile/index.tsx +309 -0
  163. package/themes/original/src/components/ProfessionalProfile/styles.tsx +46 -0
  164. package/themes/original/src/components/ReviewDriver/index.tsx +6 -6
  165. package/themes/original/src/components/ReviewOrder/index.tsx +18 -3
  166. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  167. package/themes/original/src/components/ReviewTrigger/index.tsx +118 -0
  168. package/themes/original/src/components/ReviewTrigger/styles.tsx +34 -0
  169. package/themes/original/src/components/SearchBar/index.tsx +5 -3
  170. package/themes/original/src/components/ServiceForm/index.tsx +631 -0
  171. package/themes/original/src/components/ServiceForm/styles.tsx +50 -0
  172. package/themes/original/src/components/SignupForm/index.tsx +350 -206
  173. package/themes/original/src/components/SingleOrderCard/index.tsx +229 -181
  174. package/themes/original/src/components/SingleOrderCard/styles.tsx +0 -7
  175. package/themes/original/src/components/SingleProductCard/index.tsx +207 -107
  176. package/themes/original/src/components/SingleProductCard/styles.tsx +1 -10
  177. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  178. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  179. package/themes/original/src/components/StripeElementsForm/index.tsx +15 -7
  180. package/themes/original/src/components/UpsellingProducts/index.tsx +15 -5
  181. package/themes/original/src/components/UserDetails/index.tsx +31 -17
  182. package/themes/original/src/components/UserFormDetails/index.tsx +74 -81
  183. package/themes/original/src/components/UserProfile/index.tsx +54 -29
  184. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  185. package/themes/original/src/components/UserProfileForm/index.tsx +15 -10
  186. package/themes/original/src/components/WalletTransactions/index.tsx +76 -0
  187. package/themes/original/src/components/WalletTransactions/styles.tsx +13 -0
  188. package/themes/original/src/components/Wallets/index.tsx +174 -162
  189. package/themes/original/src/components/Wallets/styles.tsx +10 -8
  190. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  191. package/themes/original/src/components/shared/OBottomPopup.tsx +47 -14
  192. package/themes/original/src/components/shared/OButton.tsx +10 -3
  193. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  194. package/themes/original/src/components/shared/OInput.tsx +3 -2
  195. package/themes/original/src/layouts/FloatingBottomContainer.tsx +5 -1
  196. package/themes/original/src/types/index.tsx +121 -30
  197. package/themes/original/src/utils/index.tsx +77 -0
  198. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -0,0 +1,69 @@
1
+ import React, { useRef } from 'react'
2
+ import Lottie from 'lottie-react-native';
3
+ import { TouchableOpacity, Easing, ViewStyle, Animated } from 'react-native';
4
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
5
+ import { useTheme } from 'styled-components';
6
+
7
+ interface Props {
8
+ initialValue: number,
9
+ onClick: any,
10
+ disableAnimation?: boolean
11
+ toValue: number,
12
+ style?: ViewStyle,
13
+ duration?: number,
14
+ type: 'favorite', // animation types
15
+ isActive: boolean,
16
+ animationType?: ((value : number) => number);
17
+ useNativeDriver?: boolean,
18
+ iconProps?: {color?: string, size?: number, style?: ViewStyle}
19
+ }
20
+
21
+ export const LottieAnimation = (props: Props) => {
22
+ const {
23
+ initialValue,
24
+ onClick,
25
+ disableAnimation,
26
+ toValue,
27
+ style,
28
+ duration,
29
+ type,
30
+ isActive,
31
+ useNativeDriver,
32
+ animationType,
33
+ iconProps
34
+ } = props
35
+ const theme = useTheme()
36
+ const animationProgress = useRef(new Animated.Value(initialValue))
37
+ const favoriteArray = ['heart', 'hearto']
38
+ const icon = type === 'favorite' ? favoriteArray : []
39
+ const animationGif = type === 'favorite' ? theme.images?.general?.heart : ''
40
+ const onPressLottie = () => {
41
+ if (!disableAnimation) {
42
+ Animated.timing(animationProgress.current, {
43
+ toValue,
44
+ duration: duration || 5000,
45
+ easing: animationType || Easing.linear,
46
+ useNativeDriver: useNativeDriver ?? true
47
+ }).start();
48
+ }
49
+ onClick()
50
+ }
51
+
52
+ return (
53
+ <TouchableOpacity
54
+ onPress={onPressLottie}
55
+ style={style}
56
+ >
57
+ <Lottie
58
+ progress={animationProgress.current}
59
+ source={animationGif}
60
+ />
61
+ <IconAntDesign
62
+ name={isActive ? icon[0] : icon[1]}
63
+ color={iconProps?.color || theme.colors.danger5}
64
+ size={iconProps?.size || 16}
65
+ style={iconProps?.style}
66
+ />
67
+ </TouchableOpacity>
68
+ )
69
+ }
@@ -5,6 +5,7 @@ import { launchImageLibrary } from 'react-native-image-picker'
5
5
  import { GiftedChat, Actions, ActionsProps, InputToolbar, Composer, Send, Bubble, MessageImage, InputToolbarProps, ComposerProps } from 'react-native-gifted-chat'
6
6
  import { USER_TYPE } from '../../config/constants'
7
7
  import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
8
+ import AntDesignIcon from 'react-native-vector-icons/AntDesign'
8
9
  import { OIcon, OIconButton, OText, OButton } from '../shared'
9
10
  import { TouchableOpacity, ActivityIndicator, StyleSheet, View, Platform, Keyboard } from 'react-native'
10
11
  import { Header, TitleHeader, Wrapper, QuickMessageContainer, ProfileMessageHeader, MessageTypeItem } from './styles'
@@ -36,7 +37,7 @@ const ORDER_STATUS: any = {
36
37
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
37
38
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
38
39
  22: 'ORDER_LOOKING_FOR_DRIVER',
39
- 23: 'ORDER_DRIVER_ON_WAY'
40
+ 23: 'ORDER_DRIVER_ON_WAY'
40
41
  }
41
42
 
42
43
  const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
@@ -122,18 +123,17 @@ const MessagesUI = (props: MessagesParams) => {
122
123
 
123
124
  const messageConsole = (message: any) => {
124
125
  return message.change?.attribute !== 'driver_id'
125
- ?
126
- `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${
127
- filterSpecialStatus.includes(message.change.attribute) ?
128
- `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
129
- `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
130
- }`
131
- : message.change.new
132
126
  ?
133
- `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
- :
135
- `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
- }
127
+ `${t('ORDER', 'Order')} ${t(message.change.attribute.toUpperCase(), message.change.attribute.replace('_', ' '))} ${t('CHANGED_FROM', 'Changed from')} ${filterSpecialStatus.includes(message.change.attribute) ?
128
+ `${message.change.old === null ? '0' : message.change.old} ${t('TO', 'to')} ${message.change.new} ${t('MINUTES', 'Minutes')}` :
129
+ `${message.change.old !== null && t(ORDER_STATUS[parseInt(message.change.old, 10)])} ${t('TO', 'to')} ${t(ORDER_STATUS[parseInt(message.change.new, 10)])}`
130
+ }`
131
+ : message.change.new
132
+ ?
133
+ `${message.driver?.name} ${message.driver?.lastname !== null ? message.driver.lastname : ''} ${t('WAS_ASSIGNED_AS_DRIVER', 'Was assigned as driver')} ${message.comment ? message.comment.length : ''}`
134
+ :
135
+ `${t('DRIVER_UNASSIGNED', 'Driver unassigned')}`
136
+ }
137
137
 
138
138
  useEffect(() => {
139
139
  let newMessages: Array<any> = []
@@ -402,7 +402,9 @@ const MessagesUI = (props: MessagesParams) => {
402
402
  <Wrapper>
403
403
  {!isMeesageListing ? (
404
404
  <Header>
405
- <OIconButton icon={theme.images.general.arrow_left} style={{ paddingStart: 10, borderColor: theme.colors.clear }} onClick={onClose} />
405
+ <TouchableOpacity onPress={onClose} style={{ paddingStart: 10, borderColor: theme.colors.clear }}>
406
+ <AntDesignIcon name='arrowleft' size={26} />
407
+ </TouchableOpacity>
406
408
  <View style={{ marginRight: 10, shadowColor: theme.colors.black, shadowOpacity: 0.1, shadowOffset: { width: 0, height: 1 }, shadowRadius: 2 }}>
407
409
  <OIcon
408
410
  url={type === USER_TYPE.DRIVER ? order?.driver?.photo : order?.business?.logo}
@@ -419,10 +421,8 @@ const MessagesUI = (props: MessagesParams) => {
419
421
  ) : (
420
422
  <ProfileMessageHeader>
421
423
  <View style={{ ...styles.headerTitle }}>
422
- <TouchableOpacity
423
- style={styles.headerItem}
424
- onPress={onClose}>
425
- <OIcon src={theme.images.general.arrow_left} width={16} />
424
+ <TouchableOpacity onPress={onClose} style={styles.headerItem}>
425
+ <AntDesignIcon name='arrowleft' size={26} />
426
426
  </TouchableOpacity>
427
427
  <OText size={18}>{t('ORDER', theme?.defaultLanguages?.ORDER || 'Order')} #{order?.id}</OText>
428
428
  </View>
@@ -0,0 +1,197 @@
1
+ import React, { useEffect, useState } from 'react'
2
+ import { StyleSheet, View, Platform } from 'react-native'
3
+ import SelectDropdown from 'react-native-select-dropdown'
4
+ import { useTheme } from 'styled-components/native'
5
+ import {
6
+ MomentOption as MomentOptionController,
7
+ useConfig,
8
+ useUtils
9
+ } from 'ordering-components/native'
10
+ import { useSafeAreaInsets } from 'react-native-safe-area-context'
11
+ import IconAntDesign from 'react-native-vector-icons/AntDesign'
12
+ import { Container } from './styles'
13
+ import moment from 'moment'
14
+
15
+ const MomentSelectorUI = (props: any) => {
16
+ const {
17
+ datesList,
18
+ hoursList,
19
+ dateSelected,
20
+ timeSelected,
21
+ handleChangeDate,
22
+ handleChangeTime,
23
+ } = props
24
+
25
+ const theme = useTheme()
26
+ const { top } = useSafeAreaInsets()
27
+ const [{ configs }] = useConfig()
28
+ const [{ parseTime }] = useUtils()
29
+
30
+ const [customizedDateList, setCustomizedDateList] = useState([])
31
+ const [customizedTimeList, setCustomizedTimeList] = useState([])
32
+
33
+ const is12hours = configs?.dates_moment_format?.value?.includes('hh:mm')
34
+
35
+ const styles = StyleSheet.create({
36
+ selectOption: {
37
+ width: '100%',
38
+ backgroundColor: theme.colors.backgroundGray100,
39
+ paddingVertical: 5,
40
+ paddingHorizontal: 14,
41
+ flexDirection: 'row-reverse',
42
+ alignItems: 'center',
43
+ justifyContent: 'space-between',
44
+ height: 30
45
+ },
46
+ selectWrapper: {
47
+ flex: 1
48
+ }
49
+ })
50
+
51
+ useEffect(() => {
52
+ const updatedDatesList = datesList?.map((date: any) => {
53
+ return { value: moment(date).format('MMM DD, YYYY'), key: date }
54
+ })
55
+ setCustomizedDateList(updatedDatesList)
56
+ }, [datesList])
57
+
58
+ useEffect(() => {
59
+ if (hoursList?.length > 0) {
60
+
61
+ const updatedHoursList = hoursList?.map((hour: any) => {
62
+ const timeValue = is12hours ? (
63
+ hour?.startTime?.includes('12')
64
+ ? `${hour.startTime}PM`
65
+ : parseTime(moment(hour.startTime, 'HH:mm'), { outputFormat: 'hh:mma' })
66
+ ) : (
67
+ parseTime(moment(hour.startTime, 'HH:mm'), { outputFormat: 'HH:mm' })
68
+ )
69
+ return { value: timeValue, key: hour.startTime }
70
+ })
71
+ setCustomizedTimeList(updatedHoursList)
72
+ }
73
+ }, [hoursList])
74
+
75
+ const dropDownIcon = () => {
76
+ return (
77
+ <IconAntDesign
78
+ name='down'
79
+ color={theme.colors.textThird}
80
+ size={12}
81
+ />
82
+ )
83
+ }
84
+
85
+ return (
86
+ <Container>
87
+ <View style={styles.selectWrapper}>
88
+ <SelectDropdown
89
+ defaultValue={customizedDateList?.find((item: any) => item.key === dateSelected)}
90
+ data={customizedDateList}
91
+ onSelect={(selectedItem, index) => {
92
+ handleChangeDate(selectedItem?.key)
93
+ }}
94
+ buttonTextAfterSelection={(selectedItem, index) => {
95
+ return selectedItem?.value
96
+ }}
97
+ rowTextForSelection={(item, index) => {
98
+ return item.value
99
+ }}
100
+ buttonStyle={{borderTopLeftRadius: 7.6, borderBottomLeftRadius: 7.6, ...styles.selectOption}}
101
+ buttonTextStyle={{
102
+ color: theme.colors.disabled,
103
+ fontSize: 12,
104
+ textAlign: 'left',
105
+ marginHorizontal: 0
106
+ }}
107
+ dropdownStyle={{
108
+ borderRadius: 8,
109
+ borderColor: theme.colors.lightGray,
110
+ marginTop: Platform.OS === 'ios' ? 12 : -top
111
+ }}
112
+ rowStyle={{
113
+ borderBottomColor: theme.colors.backgroundGray100,
114
+ backgroundColor: theme.colors.backgroundGray100,
115
+ height: 30,
116
+ flexDirection: 'column',
117
+ alignItems: 'flex-start',
118
+ paddingTop: 8,
119
+ paddingHorizontal: 12
120
+ }}
121
+ rowTextStyle={{
122
+ color: theme.colors.disabled,
123
+ fontSize: 12,
124
+ marginHorizontal: 0
125
+ }}
126
+ renderDropdownIcon={() => dropDownIcon()}
127
+ dropdownOverlayColor='transparent'
128
+ />
129
+ </View>
130
+ <View style={styles.selectWrapper}>
131
+ <SelectDropdown
132
+ defaultValue={customizedTimeList?.find((item: any) => item.key === timeSelected)}
133
+ data={customizedTimeList}
134
+ onSelect={(selectedItem, index) => {
135
+ handleChangeTime(selectedItem.key)
136
+ }}
137
+ buttonTextAfterSelection={(selectedItem, index) => {
138
+ return selectedItem.value
139
+ }}
140
+ rowTextForSelection={(item, index) => {
141
+ return item.value
142
+ }}
143
+ buttonStyle={{borderTopRightRadius: 7.6, borderBottomRightRadius: 7.6, ...styles.selectOption}}
144
+ buttonTextStyle={{
145
+ color: theme.colors.disabled,
146
+ fontSize: 12,
147
+ textAlign: 'left',
148
+ marginHorizontal: 0
149
+ }}
150
+ dropdownStyle={{
151
+ borderRadius: 8,
152
+ borderColor: theme.colors.lightGray,
153
+ marginTop: Platform.OS === 'ios' ? 12 : -top
154
+ }}
155
+ rowStyle={{
156
+ borderBottomColor: theme.colors.backgroundGray100,
157
+ backgroundColor: theme.colors.backgroundGray100,
158
+ height: 30,
159
+ flexDirection: 'column',
160
+ alignItems: 'flex-start',
161
+ paddingTop: 8,
162
+ paddingHorizontal: 14
163
+ }}
164
+ rowTextStyle={{
165
+ color: theme.colors.disabled,
166
+ fontSize: 12,
167
+ marginHorizontal: 0
168
+ }}
169
+ renderDropdownIcon={() => dropDownIcon()}
170
+ dropdownOverlayColor='transparent'
171
+ />
172
+ </View>
173
+ </Container>
174
+ )
175
+ }
176
+
177
+ export const MomentSelector = (props: any) => {
178
+ const [{ configs }] = useConfig()
179
+
180
+ const limitDays = parseInt(configs?.max_days_preorder?.value, 10)
181
+
182
+ const currentDate = new Date()
183
+ const time = limitDays > 1
184
+ ? currentDate.getTime() + ((limitDays - 1) * 24 * 60 * 60 * 1000)
185
+ : limitDays === 1 ? currentDate.getTime() : currentDate.getTime() + (6 * 24 * 60 * 60 * 1000)
186
+
187
+ currentDate.setTime(time)
188
+ currentDate.setHours(23)
189
+ currentDate.setMinutes(59)
190
+
191
+ const businessPreorderProps = {
192
+ ...props,
193
+ UIComponent: MomentSelectorUI,
194
+ maxDate: currentDate
195
+ }
196
+ return <MomentOptionController {...businessPreorderProps} />
197
+ }
@@ -0,0 +1,6 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const Container = styled.View`
4
+ flex-direction: row;
5
+ width: 100%;
6
+ `
@@ -7,7 +7,7 @@ import {
7
7
  } from 'ordering-components/native'
8
8
  import { useTheme } from 'styled-components/native'
9
9
  import { View, TouchableOpacity, FlatList, StyleSheet, KeyboardAvoidingView, Platform } from 'react-native'
10
- import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder'
10
+ import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder'
11
11
  import { OText, OIcon, OModal, OButton } from '../shared'
12
12
  import { getIconCard, flatArray } from '../../utils'
13
13
  import { StripeElementsForm } from '../StripeElementsForm'
@@ -37,7 +37,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
37
37
  const [{ configs }] = useConfig()
38
38
  const [{ parsePrice }] = useUtils()
39
39
 
40
- const [addCardOpen, setAddCardOpen] = useState({ stripe: false, stripeConnect: false });
40
+ const [addCardOpen, setAddCardOpen] = useState({ stripe: false, stripeConnect: false });
41
41
 
42
42
  const isWalletCashEnabled = configs?.wallet_cash_enabled?.value === '1'
43
43
  const isWalletPointsEnabled = configs?.wallet_credit_point_enabled?.value === '1'
@@ -54,52 +54,52 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
54
54
  }
55
55
 
56
56
  const getPayIcon = (method: string) => {
57
- switch (method) {
58
- case 'cash':
59
- return theme.images.general.cash
60
- case 'card_delivery':
61
- return theme.images.general.carddelivery
62
- case 'paypal':
63
- return theme.images.general.paypal
64
- case 'stripe':
65
- return theme.images.general.stripe
66
- case 'stripe_direct':
67
- return theme.images.general.stripecc
68
- case 'stripe_connect':
69
- return theme.images.general.stripes
70
- case 'stripe_redirect':
71
- return theme.images.general.stripesb
72
- default:
73
- return theme.images.general.creditCard
74
- }
75
- }
57
+ switch (method) {
58
+ case 'cash':
59
+ return theme.images.general.cash
60
+ case 'card_delivery':
61
+ return theme.images.general.carddelivery
62
+ case 'paypal':
63
+ return theme.images.general.paypal
64
+ case 'stripe':
65
+ return theme.images.general.stripe
66
+ case 'stripe_direct':
67
+ return theme.images.general.stripecc
68
+ case 'stripe_connect':
69
+ return theme.images.general.stripes
70
+ case 'stripe_redirect':
71
+ return theme.images.general.stripesb
72
+ default:
73
+ return theme.images.general.creditCard
74
+ }
75
+ }
76
76
 
77
77
  const renderPaymethods = ({ item }: any) => {
78
- return (
79
- <TouchableOpacity
80
- onPress={() => handleSelectPaymethod(item)}
81
- >
82
- <PMItem
83
- key={item.id}
84
- isActive={paymethodSelected?.paymethod_id === item.paymethod_id}
85
- >
86
- <OIcon
87
- src={getPayIcon(item.paymethod?.gateway)}
88
- width={20}
89
- height={20}
90
- color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : theme.colors.backgroundDark}
91
- />
92
- <OText
93
- size={10}
94
- style={{ margin: 0, marginTop: 4 }}
95
- color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : '#000'}
96
- >
97
- {t(item?.paymethod?.gateway.toUpperCase(), item?.paymethod?.name)}
98
- </OText>
99
- </PMItem>
100
- </TouchableOpacity>
101
- )
102
- }
78
+ return (
79
+ <TouchableOpacity
80
+ onPress={() => handleSelectPaymethod(item)}
81
+ >
82
+ <PMItem
83
+ key={item.id}
84
+ isActive={paymethodSelected?.paymethod_id === item.paymethod_id}
85
+ >
86
+ <OIcon
87
+ src={getPayIcon(item.paymethod?.gateway)}
88
+ width={20}
89
+ height={20}
90
+ color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : theme.colors.backgroundDark}
91
+ />
92
+ <OText
93
+ size={10}
94
+ style={{ margin: 0, marginTop: 4 }}
95
+ color={paymethodSelected?.paymethod_id === item.paymethod_id ? theme.colors.white : '#000'}
96
+ >
97
+ {t(item?.paymethod?.gateway.toUpperCase(), item?.paymethod?.name)}
98
+ </OText>
99
+ </PMItem>
100
+ </TouchableOpacity>
101
+ )
102
+ }
103
103
 
104
104
  return (
105
105
  <PMContainer>
@@ -123,10 +123,10 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
123
123
  ) : (
124
124
  <FlatList
125
125
  horizontal
126
- showsHorizontalScrollIndicator={false}
127
- data={businessPaymethods.result.filter((paymethod: any) => paymethodsAndWallets.paymethods.find((item: any) => item.id === paymethod.paymethod_id))}
128
- renderItem={renderPaymethods}
129
- keyExtractor={(paymethod: any) => paymethod?.id?.toString?.()}
126
+ showsHorizontalScrollIndicator={false}
127
+ data={businessPaymethods?.result?.filter((paymethod: any) => paymethodsAndWallets.paymethods.find((item: any) => item.id === paymethod.paymethod_id))}
128
+ renderItem={renderPaymethods}
129
+ keyExtractor={(paymethod: any) => paymethod?.id?.toString?.()}
130
130
  />
131
131
  )}
132
132
  {!paymethodsAndWallets.loading && !paymethodsAndWallets.error && paymethodsAndWallets.paymethods.length === 0 && (
@@ -138,22 +138,22 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
138
138
  {paymethodSelected?.paymethod?.gateway === 'stripe' && (
139
139
  <View>
140
140
  <OButton
141
- text={t('ADD_PAYMENT_CARD', 'Add New Payment Card')}
142
- bgColor={theme.colors.white}
143
- borderColor={theme.colors.primary}
144
- style={styles.btnAddStyle}
145
- textStyle={{ color: theme.colors.primary, fontSize: 12 }}
146
- imgRightSrc={null}
147
- onClick={() => setAddCardOpen({ ...addCardOpen, stripe: true })}
148
- />
141
+ text={t('ADD_PAYMENT_CARD', 'Add New Payment Card')}
142
+ bgColor={theme.colors.white}
143
+ borderColor={theme.colors.primary}
144
+ style={styles.btnAddStyle}
145
+ textStyle={{ color: theme.colors.primary, fontSize: 12 }}
146
+ imgRightSrc={null}
147
+ onClick={() => setAddCardOpen({ ...addCardOpen, stripe: true })}
148
+ />
149
149
  <StripeCardsList
150
- paymethod={paymethodSelected?.paymethod}
151
- businessId={businessIds[0]}
150
+ paymethod={paymethodSelected?.paymethod}
151
+ businessId={businessIds[0]}
152
152
  businessIds={businessIds}
153
- publicKey={paymethodSelected?.data?.publishable}
154
- payType={paymethodSelected?.paymethod?.name}
155
- onSelectCard={handlePaymethodDataChange}
156
- />
153
+ publicKey={paymethodSelected?.data?.publishable}
154
+ payType={paymethodSelected?.paymethod?.name}
155
+ onSelectCard={handlePaymethodDataChange}
156
+ />
157
157
  </View>
158
158
  )}
159
159
 
@@ -170,7 +170,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
170
170
  </>
171
171
  ) : (
172
172
  <>
173
- {walletsState.result.filter((wallet: any) => paymethodsAndWallets.wallets.find((item: any) => item.type === wallet.type)).map((wallet: any, idx: any) => walletName[wallet.type]?.isActive && (
173
+ {walletsState?.result?.filter((wallet: any) => paymethodsAndWallets.wallets.find((item: any) => item.type === wallet.type)).map((wallet: any, idx: any) => walletName[wallet.type]?.isActive && (
174
174
  <WalletItem
175
175
  key={wallet.type}
176
176
  isBottomBorder={idx === paymethodsAndWallets.wallets?.length - 1}
@@ -197,40 +197,40 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
197
197
  )}
198
198
 
199
199
  <OModal
200
- entireModal
201
- title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
202
- open={addCardOpen.stripe}
203
- onClose={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
204
- style={{ backgroundColor: 'red' }}
205
- >
206
- <KeyboardAvoidingView
207
- behavior={Platform.OS == 'ios' ? 'padding' : 'height'}
208
- keyboardVerticalOffset={Platform.OS == 'ios' ? 0 : 0}
209
- enabled={Platform.OS === 'ios' ? true : false}
210
- >
211
- <StripeElementsForm
212
- toSave
213
- businessId={businessIds[0]}
200
+ entireModal
201
+ title={t('ADD_CREDIT_OR_DEBIT_CARD', 'Add credit or debit card')}
202
+ open={addCardOpen.stripe}
203
+ onClose={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
204
+ style={{ backgroundColor: 'red' }}
205
+ >
206
+ <KeyboardAvoidingView
207
+ behavior={Platform.OS == 'ios' ? 'padding' : 'height'}
208
+ keyboardVerticalOffset={Platform.OS == 'ios' ? 0 : 0}
209
+ enabled={Platform.OS === 'ios' ? true : false}
210
+ >
211
+ <StripeElementsForm
212
+ toSave
213
+ businessId={businessIds[0]}
214
214
  businessIds={businessIds}
215
215
  publicKey={paymethodSelected?.data?.publishable}
216
- requirements={props.clientSecret}
217
- onSelectCard={handlePaymethodDataChange}
218
- onCancel={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
219
- />
220
- </KeyboardAvoidingView>
221
- </OModal>
216
+ requirements={props.clientSecret}
217
+ onSelectCard={handlePaymethodDataChange}
218
+ onCancel={() => setAddCardOpen({ ...addCardOpen, stripe: false })}
219
+ />
220
+ </KeyboardAvoidingView>
221
+ </OModal>
222
222
  </PMContainer>
223
223
  )
224
224
  }
225
225
 
226
226
  const styles = StyleSheet.create({
227
- btnAddStyle: {
228
- marginVertical: 20,
229
- borderRadius: 7.6,
230
- shadowOpacity: 0,
231
- height: 44,
232
- borderWidth: 1
233
- },
227
+ btnAddStyle: {
228
+ marginVertical: 20,
229
+ borderRadius: 7.6,
230
+ shadowOpacity: 0,
231
+ height: 44,
232
+ borderWidth: 1
233
+ },
234
234
  })
235
235
 
236
236
 
@@ -79,6 +79,7 @@ const MultiCheckoutUI = (props: any) => {
79
79
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
80
80
  const maximumCarts = 5
81
81
  const isDisablePlaceOrderButton = !(paymethodSelected?.paymethod_id || paymethodSelected?.wallet_id) || openCarts.length > maximumCarts
82
+ const walletCarts = (Object.values(carts)?.filter((cart: any) => cart?.products && cart?.products?.length && cart?.status !== 2 && cart?.valid_schedule && cart?.valid_products && cart?.valid_address && cart?.valid_maximum && cart?.valid_minimum && cart?.wallets) || null) || []
82
83
 
83
84
  const [isUserDetailsEdit, setIsUserDetailsEdit] = useState(false);
84
85
  const [phoneUpdate, setPhoneUpdate] = useState(false);
@@ -253,6 +254,11 @@ const MultiCheckoutUI = (props: any) => {
253
254
  </OText>
254
255
  </CCNotCarts>
255
256
  )}
257
+ {walletCarts.length > 0 && (
258
+ <OText size={14} color={theme.colors.danger5} style={{ marginVertical: 20 }}>
259
+ {t('WARNING_PARTIAL_WALLET_CARTS', 'Important: One or more carts can`t be completed due a partial payment with cash/points wallet and requires to be paid individually')}
260
+ </OText>
261
+ )}
256
262
  {openCarts.length > 0 && (
257
263
  <ChCartsTotal>
258
264
  <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>