ordering-ui-react-native 0.17.1 → 0.17.2-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 (207) 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 +11 -4
  5. package/src/components/BusinessInformation/styles.tsx +2 -2
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/OrderCreating/index.tsx +1 -21
  8. package/src/components/OrdersOption/index.tsx +54 -56
  9. package/src/components/PaymentOptionsWebView/index.tsx +119 -120
  10. package/src/components/SingleProductReview/index.tsx +7 -4
  11. package/src/components/StripeMethodForm/index.tsx +1 -1
  12. package/src/components/VerifyPhone/styles.tsx +1 -2
  13. package/src/components/shared/OToast.tsx +4 -4
  14. package/src/utils/index.tsx +7 -1
  15. package/themes/business/index.tsx +2 -0
  16. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  17. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  18. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  19. package/themes/business/src/components/Chat/index.tsx +118 -107
  20. package/themes/business/src/components/DriverMap/index.tsx +22 -9
  21. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  22. package/themes/business/src/components/LoginForm/Otp/index.tsx +120 -0
  23. package/themes/business/src/components/LoginForm/Otp/styles.tsx +7 -0
  24. package/themes/business/src/components/LoginForm/index.tsx +238 -80
  25. package/themes/business/src/components/LoginForm/styles.tsx +10 -0
  26. package/themes/business/src/components/MapView/index.tsx +18 -7
  27. package/themes/business/src/components/NewOrderNotification/index.tsx +34 -44
  28. package/themes/business/src/components/OrderDetails/Delivery.tsx +4 -3
  29. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +96 -50
  30. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +59 -62
  31. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  32. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  33. package/themes/business/src/components/OrderMessage/index.tsx +18 -17
  34. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  35. package/themes/business/src/components/OrdersOption/index.tsx +33 -75
  36. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +250 -0
  37. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  38. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  39. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  40. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  41. package/themes/business/src/components/ReviewCustomer/index.tsx +41 -24
  42. package/themes/business/src/components/StoresList/index.tsx +2 -2
  43. package/themes/business/src/components/shared/OLink.tsx +33 -13
  44. package/themes/business/src/components/shared/OModal.tsx +16 -9
  45. package/themes/business/src/components/shared/OText.tsx +8 -2
  46. package/themes/business/src/types/index.tsx +33 -2
  47. package/themes/business/src/utils/index.tsx +51 -0
  48. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  49. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  50. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -1
  52. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  53. package/themes/kiosk/src/components/LoginForm/Otp/index.tsx +92 -0
  54. package/themes/kiosk/src/components/LoginForm/Otp/styles.tsx +7 -0
  55. package/themes/kiosk/src/components/LoginForm/index.tsx +473 -151
  56. package/themes/kiosk/src/components/LoginForm/styles.tsx +14 -1
  57. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  58. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  59. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  60. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +3 -2
  61. package/themes/kiosk/src/components/PhoneInputNumber/styles.tsx +1 -3
  62. package/themes/kiosk/src/components/ProductForm/index.tsx +1 -14
  63. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  64. package/themes/kiosk/src/components/shared/OModal.tsx +14 -11
  65. package/themes/kiosk/src/layouts/Container.tsx +7 -1
  66. package/themes/kiosk/src/types/index.d.ts +13 -0
  67. package/themes/kiosk/src/utils/index.tsx +15 -0
  68. package/themes/original/index.tsx +8 -0
  69. package/themes/original/src/components/AddressDetails/index.tsx +29 -11
  70. package/themes/original/src/components/AddressForm/index.tsx +41 -16
  71. package/themes/original/src/components/AddressList/index.tsx +26 -21
  72. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  73. package/themes/original/src/components/AnalyticsSegment/index.tsx +189 -9
  74. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  75. package/themes/original/src/components/BusinessBasicInformation/index.tsx +125 -82
  76. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +9 -4
  77. package/themes/original/src/components/BusinessController/index.tsx +145 -68
  78. package/themes/original/src/components/BusinessController/styles.tsx +22 -9
  79. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  80. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  81. package/themes/original/src/components/BusinessInformation/index.tsx +10 -31
  82. package/themes/original/src/components/BusinessItemAccordion/index.tsx +24 -23
  83. package/themes/original/src/components/BusinessListingSearch/index.tsx +52 -24
  84. package/themes/original/src/components/BusinessPreorder/index.tsx +97 -16
  85. package/themes/original/src/components/BusinessProductsList/index.tsx +20 -11
  86. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  87. package/themes/original/src/components/BusinessProductsListing/index.tsx +617 -490
  88. package/themes/original/src/components/BusinessProductsListing/styles.tsx +7 -13
  89. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  90. package/themes/original/src/components/BusinessTypeFilter/index.tsx +3 -3
  91. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  92. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +98 -78
  93. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -9
  94. package/themes/original/src/components/BusinessesListing/index.tsx +5 -3
  95. package/themes/original/src/components/Cart/index.tsx +87 -43
  96. package/themes/original/src/components/CartContent/index.tsx +102 -3
  97. package/themes/original/src/components/CartContent/styles.tsx +15 -1
  98. package/themes/original/src/components/Checkout/index.tsx +294 -175
  99. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  100. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  101. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  102. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  103. package/themes/original/src/components/DriverTips/index.tsx +52 -37
  104. package/themes/original/src/components/DriverTips/styles.tsx +2 -1
  105. package/themes/original/src/components/Favorite/index.tsx +7 -4
  106. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  107. package/themes/original/src/components/FavoriteList/index.tsx +70 -80
  108. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  109. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  110. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  111. package/themes/original/src/components/Help/index.tsx +8 -8
  112. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +11 -22
  113. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +6 -0
  114. package/themes/original/src/components/HelpGuide/index.tsx +12 -16
  115. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  116. package/themes/original/src/components/HelpOrder/index.tsx +12 -25
  117. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  118. package/themes/original/src/components/Home/index.tsx +13 -4
  119. package/themes/original/src/components/LanguageSelector/index.tsx +19 -14
  120. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  121. package/themes/original/src/components/LoginForm/Otp/index.tsx +89 -73
  122. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  123. package/themes/original/src/components/LoginForm/index.tsx +43 -19
  124. package/themes/original/src/components/LottieAnimation/index.tsx +78 -0
  125. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  126. package/themes/original/src/components/Messages/index.tsx +32 -10
  127. package/themes/original/src/components/MomentOption/index.tsx +195 -88
  128. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  129. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +117 -96
  130. package/themes/original/src/components/MultiCheckout/index.tsx +248 -83
  131. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  132. package/themes/original/src/components/MultiOrdersDetails/index.tsx +67 -20
  133. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  134. package/themes/original/src/components/MyOrders/index.tsx +66 -17
  135. package/themes/original/src/components/NavBar/index.tsx +6 -11
  136. package/themes/original/src/components/Notifications/index.tsx +144 -0
  137. package/themes/original/src/components/Notifications/styles.tsx +20 -0
  138. package/themes/original/src/components/OrderDetails/OrderEta.tsx +59 -0
  139. package/themes/original/src/components/OrderDetails/index.tsx +109 -221
  140. package/themes/original/src/components/OrderDetails/styles.tsx +10 -1
  141. package/themes/original/src/components/OrderItAgain/index.tsx +47 -43
  142. package/themes/original/src/components/OrderProgress/index.tsx +74 -112
  143. package/themes/original/src/components/OrderProgress/styles.tsx +5 -0
  144. package/themes/original/src/components/OrderSummary/index.tsx +68 -29
  145. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  146. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +28 -19
  147. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +3 -0
  148. package/themes/original/src/components/OrdersOption/index.tsx +76 -83
  149. package/themes/original/src/components/PageBanner/index.tsx +171 -0
  150. package/themes/original/src/components/PageBanner/styles.tsx +11 -0
  151. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  152. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  153. package/themes/original/src/components/PaymentOptions/index.tsx +2 -2
  154. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  155. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  156. package/themes/original/src/components/PreviousOrders/index.tsx +3 -2
  157. package/themes/original/src/components/ProductForm/index.tsx +240 -261
  158. package/themes/original/src/components/ProductForm/styles.tsx +4 -7
  159. package/themes/original/src/components/ProductItemAccordion/index.tsx +199 -128
  160. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -10
  161. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +1 -2
  162. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  163. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -49
  164. package/themes/original/src/components/ProfessionalProfile/index.tsx +54 -14
  165. package/themes/original/src/components/Promotions/index.tsx +234 -220
  166. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  167. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  168. package/themes/original/src/components/ReviewOrder/index.tsx +43 -11
  169. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  170. package/themes/original/src/components/ReviewProducts/index.tsx +8 -5
  171. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  172. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  173. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  174. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  175. package/themes/original/src/components/ServiceForm/index.tsx +377 -270
  176. package/themes/original/src/components/Sessions/index.tsx +11 -8
  177. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  178. package/themes/original/src/components/SignupForm/index.tsx +79 -66
  179. package/themes/original/src/components/SingleOrderCard/index.tsx +126 -57
  180. package/themes/original/src/components/SingleOrderCard/styles.tsx +10 -8
  181. package/themes/original/src/components/SingleProductCard/index.tsx +111 -56
  182. package/themes/original/src/components/SingleProductCard/styles.tsx +27 -13
  183. package/themes/original/src/components/SingleProductReview/index.tsx +38 -5
  184. package/themes/original/src/components/SingleProductReview/styles.tsx +12 -0
  185. package/themes/original/src/components/StripeCardsList/index.tsx +1 -1
  186. package/themes/original/src/components/StripeElementsForm/index.tsx +4 -1
  187. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -218
  188. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  189. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  190. package/themes/original/src/components/UserFormDetails/index.tsx +53 -54
  191. package/themes/original/src/components/UserProfile/index.tsx +58 -35
  192. package/themes/original/src/components/UserProfile/styles.ts +17 -0
  193. package/themes/original/src/components/UserProfileForm/index.tsx +21 -28
  194. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  195. package/themes/original/src/components/Wallets/index.tsx +18 -17
  196. package/themes/original/src/components/Wallets/styles.tsx +2 -0
  197. package/themes/original/src/components/shared/CardAnimation.tsx +47 -0
  198. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  199. package/themes/original/src/components/shared/OBottomPopup.tsx +1 -1
  200. package/themes/original/src/components/shared/OButton.tsx +6 -2
  201. package/themes/original/src/components/shared/OIcon.tsx +8 -1
  202. package/themes/original/src/components/shared/OInput.tsx +10 -1
  203. package/themes/original/src/components/shared/OModal.tsx +3 -3
  204. package/themes/original/src/layouts/Container.tsx +13 -9
  205. package/themes/original/src/types/index.tsx +44 -7
  206. package/themes/original/src/utils/index.tsx +364 -58
  207. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -0,0 +1,144 @@
1
+ import React, { useEffect } from 'react'
2
+ import {
3
+ UserFormDetails as NotificationsController,
4
+ useLanguage,
5
+ useSession,
6
+ useOrderingTheme,
7
+ useToast,
8
+ ToastType,
9
+ } from 'ordering-components/native'
10
+ import { NotificationsGroupSwitchWrapper, SwitchWrapper, Container } from './styles'
11
+ import { StyleSheet, View } from 'react-native'
12
+ import { useState } from 'react'
13
+ import { useTheme } from 'styled-components/native';
14
+ import Spinner from 'react-native-loading-spinner-overlay';
15
+ import ToggleSwitch from 'toggle-switch-react-native'
16
+ import NavBar from '../NavBar'
17
+ import { OText } from '../shared'
18
+
19
+ const NotificationsUI = (props: any) => {
20
+ const {
21
+ navigation,
22
+ singleNotifications,
23
+ handleChangePromotions,
24
+ userData
25
+ } = props
26
+
27
+ const theme = useTheme();
28
+ const [{ user: userSession }] = useSession()
29
+ const [, t] = useLanguage();
30
+ const [, { showToast }] = useToast();
31
+ const [orderingTheme] = useOrderingTheme()
32
+
33
+ const user = userData || userSession
34
+
35
+ const [notificationsList, setNotificationsList] = useState({
36
+ email: singleNotifications?.result?.result
37
+ ? !!singleNotifications?.result?.result?.settings?.email?.newsletter
38
+ : !!(singleNotifications?.changes?.settings?.email?.newsletter ?? (user && user?.settings?.email?.newsletter)),
39
+ sms: singleNotifications?.result?.result
40
+ ? !!singleNotifications?.result?.result?.settings?.sms?.newsletter
41
+ : !!(singleNotifications?.changes?.settings?.sms?.newsletter ?? (user && user?.settings?.sms?.newsletter)),
42
+ notification: singleNotifications?.result?.result
43
+ ? !!singleNotifications?.result?.result?.settings?.notification?.newsletter
44
+ : !!(singleNotifications?.changes?.settings?.notification?.newsletter ?? (user && user?.settings?.notification?.newsletter))
45
+ })
46
+
47
+ const goToBack = () => navigation?.canGoBack() && navigation.goBack()
48
+ const showCustomerPromotions = !orderingTheme?.theme?.profile?.components?.promotions?.hidden
49
+ const showNotifications = !orderingTheme?.theme?.profile?.components?.notification_settings?.hidden
50
+
51
+ const handleEditNotifications = (key: any, value: any) => {
52
+ setNotificationsList({
53
+ ...notificationsList,
54
+ [key]: value
55
+ })
56
+ }
57
+
58
+ useEffect(() => {
59
+ if (singleNotifications.result.result && !singleNotifications.loading) {
60
+ if (!singleNotifications.result?.error) {
61
+ showToast(ToastType.Success, t('UPDATE_SUCCESSFULLY', 'Update successfully'));
62
+ }
63
+ }
64
+ }, [singleNotifications.result])
65
+
66
+ useEffect(() => {
67
+ const isSingle = true
68
+ handleChangePromotions(notificationsList, isSingle)
69
+ }, [notificationsList])
70
+
71
+ return (
72
+ <Container>
73
+ <NavBar
74
+ title={t('NOTIFICATIONS', 'Notifications')}
75
+ titleAlign={'center'}
76
+ onActionLeft={goToBack}
77
+ showCall={false}
78
+ style={{
79
+ paddingHorizontal: 40,
80
+ paddingVertical: 0,
81
+ }}
82
+ />
83
+ {showCustomerPromotions && showNotifications && (
84
+ <>
85
+ <Spinner visible={singleNotifications?.loading} />
86
+ <NotificationsGroupSwitchWrapper>
87
+ <OText style={{ ...styles.title }}>{t('MARKETING_NOTIFICATIONS', 'Marketing Notifications')}</OText>
88
+ <SwitchWrapper>
89
+ <OText>{t('EMAILS', 'Emails')}</OText>
90
+ <ToggleSwitch
91
+ isOn={notificationsList?.email}
92
+ onColor={theme.colors.primary}
93
+ size="small"
94
+ disabled={singleNotifications?.loading}
95
+ offColor={theme.colors.disabled}
96
+ animationSpeed={400}
97
+ onToggle={() => handleEditNotifications('email', !notificationsList?.email)}
98
+ />
99
+ </SwitchWrapper>
100
+ <SwitchWrapper>
101
+ <OText>{t('SMS', 'Sms')}</OText>
102
+ <ToggleSwitch
103
+ isOn={notificationsList?.sms}
104
+ onColor={theme.colors.primary}
105
+ size="small"
106
+ disabled={singleNotifications?.loading}
107
+ offColor={theme.colors.disabled}
108
+ animationSpeed={400}
109
+ onToggle={() => handleEditNotifications('sms', !notificationsList?.sms)}
110
+ />
111
+ </SwitchWrapper>
112
+ <SwitchWrapper>
113
+ <OText>{t('PUSH_NOTIFICATIONS', 'Push Notifications')}</OText>
114
+ <ToggleSwitch
115
+ isOn={notificationsList?.notification}
116
+ onColor={theme.colors.primary}
117
+ size="small"
118
+ disabled={singleNotifications?.loading}
119
+ offColor={theme.colors.disabled}
120
+ animationSpeed={400}
121
+ onToggle={() => handleEditNotifications('notification', !notificationsList?.notification)}
122
+ />
123
+ </SwitchWrapper>
124
+ </NotificationsGroupSwitchWrapper>
125
+ </>
126
+ )}
127
+ </Container>
128
+ )
129
+ }
130
+
131
+ const styles = StyleSheet.create({
132
+ title: {
133
+ marginBottom: 24,
134
+ fontWeight: 'bold',
135
+ }
136
+ });
137
+
138
+ export const NotificationsList = (props: any) => {
139
+ const notificationsListProps = {
140
+ ...props,
141
+ UIComponent: NotificationsUI
142
+ }
143
+ return <NotificationsController {...notificationsListProps} />
144
+ }
@@ -0,0 +1,20 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const Container = styled.ScrollView`
4
+ position: relative;
5
+ flex: 1;
6
+ padding: 20px;
7
+ `
8
+
9
+ export const NotificationsGroupSwitchWrapper = styled.View`
10
+ flex-grow: 1;
11
+ justify-content: space-between;
12
+ padding: 0 20px;
13
+ `
14
+
15
+ export const SwitchWrapper = styled.View`
16
+ flex-direction: row;
17
+ justify-content: space-between;
18
+ align-items: center;
19
+ margin-bottom: 12px;
20
+ `
@@ -0,0 +1,59 @@
1
+ import React, { useEffect, useState } from 'react'
2
+ import { useUtils } from 'ordering-components/native'
3
+ import moment from 'moment'
4
+
5
+ export const OrderEta = (props: any) => {
6
+ const {
7
+ order,
8
+ outputFormat
9
+ } = props
10
+
11
+ const [{ parseDate }] = useUtils()
12
+ const [estimatedDeliveryTime, setEstimatedDeliveryTime] = useState(null)
13
+
14
+ const getEstimatedDeliveryTime = () => {
15
+ let _estimatedTime
16
+ let totalEta = 0
17
+ const _delivery = order?.delivery_datetime_utc
18
+ ? order?.delivery_datetime_utc
19
+ : order?.delivery_datetime
20
+ if (order?.eta_current_status_time) {
21
+ const currentStatueEta = order?.eta_current_status_time
22
+ totalEta += currentStatueEta
23
+ let nextStatusTimes = 0
24
+ if (order?.eta_next_status_times) {
25
+ Object.keys(order.eta_next_status_times).map(key => {
26
+ if (!key.includes('status_penalty')) {
27
+ nextStatusTimes += order.eta_next_status_times[key]
28
+ }
29
+ })
30
+ }
31
+
32
+ totalEta += nextStatusTimes
33
+
34
+ const diffTimeAsSeconds = moment.utc(order?.reporting_data?.at[`status:${order.status}`]).add(order?.eta_current_status_time, 'minutes').diff(moment().utc(), 'seconds')
35
+ const diffTimeAsMinutes = Math.ceil(diffTimeAsSeconds / 60)
36
+ if (diffTimeAsMinutes <= 0) {
37
+ totalEta += (Math.floor(Math.abs(diffTimeAsMinutes / order?.eta_current_status_time) + 1) * order?.eta_current_status_penalty_time)
38
+ }
39
+ _estimatedTime = parseDate(moment(_delivery).add(totalEta, 'minutes'))
40
+ } else {
41
+ _estimatedTime = parseDate(moment(_delivery).add(order?.eta_time, 'minutes'))
42
+ }
43
+ setEstimatedDeliveryTime(_estimatedTime)
44
+ }
45
+
46
+ useEffect(() => {
47
+ getEstimatedDeliveryTime()
48
+ const interval = setInterval(() => {
49
+ getEstimatedDeliveryTime()
50
+ }, 1000)
51
+ return () => clearInterval(interval)
52
+ }, [order])
53
+
54
+ return (
55
+ <>
56
+ {!outputFormat ? estimatedDeliveryTime : moment(estimatedDeliveryTime).format(outputFormat)}
57
+ </>
58
+ )
59
+ }
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from 'react';
1
+ import React, { useState, useEffect, useMemo } from 'react';
2
2
  import { View, StyleSheet, BackHandler, Platform, Linking, RefreshControl } from 'react-native';
3
3
  import LinearGradient from 'react-native-linear-gradient';
4
4
  import { _setStoreData } from '../../providers/StoreUtil';
@@ -10,6 +10,7 @@ import {
10
10
  useConfig
11
11
  } from 'ordering-components/native';
12
12
  import { useTheme } from 'styled-components/native';
13
+ import { showLocation } from 'react-native-map-link';
13
14
  import {
14
15
  OrderDetailsContainer,
15
16
  Header,
@@ -31,14 +32,15 @@ import {
31
32
  Map,
32
33
  Divider,
33
34
  OrderAction,
34
- PlaceSpotWrapper
35
+ PlaceSpotWrapper,
36
+ ProfessionalPhoto
35
37
  } from './styles';
36
38
  import { OButton, OIcon, OModal, OText } from '../shared';
37
39
  import { ProductItemAccordion } from '../ProductItemAccordion';
38
40
  import { TouchableOpacity } from 'react-native-gesture-handler';
39
41
  import { OrderDetailsParams } from '../../types';
40
42
  import { GoogleMap } from '../GoogleMap';
41
- import { verifyDecimals } from '../../utils';
43
+ import { verifyDecimals, getOrderStatus } from '../../utils';
42
44
  import { OSRow } from '../OrderSummary/styles';
43
45
  import AntIcon from 'react-native-vector-icons/AntDesign'
44
46
  import { TaxInformation } from '../TaxInformation';
@@ -46,6 +48,7 @@ import { Placeholder, PlaceholderLine } from 'rn-placeholder';
46
48
  import NavBar from '../NavBar'
47
49
  import { OrderHistory } from './OrderHistory';
48
50
  import { PlaceSpot } from '../PlaceSpot'
51
+ import { OrderEta } from './OrderEta'
49
52
  export const OrderDetailsUI = (props: OrderDetailsParams) => {
50
53
  const {
51
54
  navigation,
@@ -94,6 +97,12 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
94
97
  display: 'flex',
95
98
  alignItems: 'center',
96
99
  flexDirection: 'row'
100
+ },
101
+ professionalBlock: {
102
+ borderBottomColor: theme.colors.border,
103
+ borderBottomWidth: 1,
104
+ marginVertical: 10,
105
+ paddingVertical: 5
97
106
  }
98
107
  });
99
108
 
@@ -109,7 +118,10 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
109
118
  const { order, businessData } = props.order;
110
119
  const mapValidStatuses = [9, 19, 23]
111
120
  const placeSpotTypes = [3, 4, 5]
112
-
121
+ const directionTypes = [2, 3, 4, 5]
122
+ const activeStatus = [0, 3, 4, 7, 8, 9, 14, 18, 19, 20, 21, 22, 23]
123
+ const enabledPoweredByOrdering = configs?.powered_by_ordering_module?.value
124
+ const hideDeliveryDate = theme?.confirmation?.components?.order?.components?.date?.hidden
113
125
  const walletName: any = {
114
126
  cash: {
115
127
  name: t('PAY_WITH_CASH_WALLET', 'Pay with Cash Wallet'),
@@ -119,205 +131,6 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
119
131
  }
120
132
  }
121
133
 
122
- const getOrderStatus = (s: string) => {
123
- const status = parseInt(s);
124
- const orderStatus = [
125
- {
126
- key: 0,
127
- value: t('PENDING', 'Pending'),
128
- slug: 'PENDING',
129
- percentage: 0.25,
130
- image: theme.images.order.status0,
131
- },
132
- {
133
- key: 1,
134
- value: t('COMPLETED', 'Completed'),
135
- slug: 'COMPLETED',
136
- percentage: 1,
137
- image: theme.images.order.status1,
138
- },
139
- {
140
- key: 2,
141
- value: t('REJECTED', 'Rejected'),
142
- slug: 'REJECTED',
143
- percentage: 0,
144
- image: theme.images.order.status2,
145
- },
146
- {
147
- key: 3,
148
- value: t('DRIVER_IN_BUSINESS', 'Driver in business'),
149
- slug: 'DRIVER_IN_BUSINESS',
150
- percentage: 0.6,
151
- image: theme.images.order.status3,
152
- },
153
- {
154
- key: 4,
155
- value: t('PREPARATION_COMPLETED', 'Preparation Completed'),
156
- slug: 'PREPARATION_COMPLETED',
157
- percentage: 0.7,
158
- image: theme.images.order.status4,
159
- },
160
- {
161
- key: 5,
162
- value: t('REJECTED_BY_BUSINESS', 'Rejected by business'),
163
- slug: 'REJECTED_BY_BUSINESS',
164
- percentage: 0,
165
- image: theme.images.order.status5,
166
- },
167
- {
168
- key: 6,
169
- value: t('REJECTED_BY_DRIVER', 'Rejected by Driver'),
170
- slug: 'REJECTED_BY_DRIVER',
171
- percentage: 0,
172
- image: theme.images.order.status6,
173
- },
174
- {
175
- key: 7,
176
- value: t('ACCEPTED_BY_BUSINESS', 'Accepted by business'),
177
- slug: 'ACCEPTED_BY_BUSINESS',
178
- percentage: 0.35,
179
- image: theme.images.order.status7,
180
- },
181
- {
182
- key: 8,
183
- value: t('ACCEPTED_BY_DRIVER', 'Accepted by driver'),
184
- slug: 'ACCEPTED_BY_DRIVER',
185
- percentage: 0.45,
186
- image: theme.images.order.status8,
187
- },
188
- {
189
- key: 9,
190
- value: t('PICK_UP_COMPLETED_BY_DRIVER', 'Pick up completed by driver'),
191
- slug: 'PICK_UP_COMPLETED_BY_DRIVER',
192
- percentage: 0.8,
193
- image: theme.images.order.status9,
194
- },
195
- {
196
- key: 10,
197
- value: t('PICK_UP_FAILED_BY_DRIVER', 'Pick up Failed by driver'),
198
- slug: 'PICK_UP_FAILED_BY_DRIVER',
199
- percentage: 0,
200
- image: theme.images.order.status10,
201
- },
202
- {
203
- key: 11,
204
- value: t(
205
- 'DELIVERY_COMPLETED_BY_DRIVER',
206
- 'Delivery completed by driver',
207
- ),
208
- slug: 'DELIVERY_COMPLETED_BY_DRIVER',
209
- percentage: 1,
210
- image: theme.images.order.status11,
211
- },
212
- {
213
- key: 12,
214
- value: t('DELIVERY_FAILED_BY_DRIVER', 'Delivery Failed by driver'),
215
- slug: 'DELIVERY_FAILED_BY_DRIVER',
216
- percentage: 0,
217
- image: theme.images.order.status12,
218
- },
219
- {
220
- key: 13,
221
- value: t('PREORDER', 'PreOrder'),
222
- slug: 'PREORDER',
223
- percentage: 0,
224
- image: theme.images.order.status13,
225
- },
226
- {
227
- key: 14,
228
- value: t('ORDER_NOT_READY', 'Order not ready'),
229
- slug: 'ORDER_NOT_READY',
230
- percentage: 0,
231
- image: theme.images.order.status13,
232
- },
233
- {
234
- key: 15,
235
- value: t(
236
- 'ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER',
237
- 'Order picked up completed by customer',
238
- ),
239
- slug: 'ORDER_PICKEDUP_COMPLETED_BY_CUSTOMER',
240
- percentage: 100,
241
- image: theme.images.order.status1,
242
- },
243
- {
244
- key: 16,
245
- value: t('CANCELLED_BY_CUSTOMER', 'Cancelled by customer'),
246
- slug: 'CANCELLED_BY_CUSTOMER',
247
- percentage: 0,
248
- image: theme.images.order.status2,
249
- },
250
- {
251
- key: 17,
252
- value: t(
253
- 'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
254
- 'Order not picked up by customer',
255
- ),
256
- slug: 'ORDER_NOT_PICKEDUP_BY_CUSTOMER',
257
- percentage: 0,
258
- image: theme.images.order.status2,
259
- },
260
- {
261
- key: 18,
262
- value: t(
263
- 'DRIVER_ALMOST_ARRIVED_TO_BUSINESS',
264
- 'Driver almost arrived to business',
265
- ),
266
- slug: 'DRIVER_ALMOST_ARRIVED_TO_BUSINESS',
267
- percentage: 0.15,
268
- image: theme.images.order.status3,
269
- },
270
- {
271
- key: 19,
272
- value: t(
273
- 'DRIVER_ALMOST_ARRIVED_TO_CUSTOMER',
274
- 'Driver almost arrived to customer',
275
- ),
276
- slug: 'DRIVER_ALMOST_ARRIVED_TO_CUSTOMER',
277
- percentage: 0.9,
278
- image: theme.images.order.status11,
279
- },
280
- {
281
- key: 20,
282
- value: t(
283
- 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
284
- 'Customer almost arrived to business',
285
- ),
286
- slug: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
287
- percentage: 90,
288
- image: theme.images.order.status7,
289
- },
290
- {
291
- key: 21,
292
- value: t(
293
- 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
294
- 'Customer arrived to business',
295
- ),
296
- slug: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
297
- percentage: 95,
298
- image: theme.images.order.status7,
299
- },
300
- {
301
- key: 22,
302
- value: t('ORDER_LOOKING_FOR_DRIVER', 'Looking for driver'),
303
- slug: 'ORDER_LOOKING_FOR_DRIVER',
304
- percentage: 35,
305
- image: theme.images.order.status8
306
- },
307
- {
308
- key: 23,
309
- value: t('ORDER_DRIVER_ON_WAY', 'Driver on way'),
310
- slug: 'ORDER_DRIVER_ON_WAY',
311
- percentage: 45,
312
- image: theme.images.order.status8
313
- }
314
- ];
315
-
316
- const objectStatus = orderStatus.find((o) => o.key === status);
317
-
318
- return objectStatus && objectStatus;
319
- };
320
-
321
134
  const handleGoToMessages = (type: string) => {
322
135
  readMessages && readMessages();
323
136
  navigation.navigate(
@@ -448,6 +261,59 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
448
261
  lng: parseFloat(location?.location?.split(',')[1].replace(/[^-.0-9]/g, ''))
449
262
  } : location)
450
263
 
264
+ const getProductList = () => {
265
+ const professionalList = order?.products.reduce((prev: any, current: any) => {
266
+ const found = prev.find((item: any) => item.id === current?.calendar_event?.professional?.id)
267
+ if (found || !current?.calendar_event) {
268
+ return prev
269
+ }
270
+ return [...prev, current?.calendar_event?.professional]
271
+ }, [])
272
+
273
+ return (
274
+ <>
275
+ {professionalList?.length > 0 && professionalList.map((professional: any, i: number) => (
276
+ <View key={i} style={styles.professionalBlock}>
277
+ <View style={{ flexDirection: 'row', alignItems: 'center', width: '100%' }}>
278
+ {professional?.photo ? (
279
+ <ProfessionalPhoto
280
+ source={{
281
+ uri: professional?.photo
282
+ }}
283
+ imageStyle={{ borderRadius: 8 }}
284
+ />
285
+ ) : (
286
+ <OIcon
287
+ src={theme.images.general.user}
288
+ cover={false}
289
+ width={80}
290
+ height={80}
291
+ />
292
+ )}
293
+ <OText size={12} lineHeight={18} weight={'500'} numberOfLines={1}>{professional?.name} {professional?.lastname}</OText>
294
+ </View>
295
+ {order?.products.filter((product: any) => product?.calendar_event?.professional?.id === professional?.id).map((product: any, i: number) => (
296
+ <ProductItemAccordion
297
+ key={product?.id || i}
298
+ product={product}
299
+ isFromCheckout
300
+ />
301
+ ))}
302
+ </View>
303
+ ))}
304
+ {order?.products.filter((product: any) => !product?.calendar_event).map((product: any, i: number) => (
305
+ <ProductItemAccordion
306
+ key={product?.id || i}
307
+ product={product}
308
+ isFromCheckout
309
+ />
310
+ ))}
311
+ </>
312
+ )
313
+ }
314
+
315
+ const sortedProductList = useMemo(() => getProductList(), [order?.products])
316
+
451
317
  useEffect(() => {
452
318
  if (driverLocation) {
453
319
  parsedLocations[0] = {
@@ -531,12 +397,21 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
531
397
  style={{ marginTop: Platform.OS === 'ios' ? 0 : 20 }}
532
398
  titleWrapStyle={{ paddingHorizontal: 0 }}
533
399
  titleStyle={{ marginRight: 0, marginLeft: 0 }}
534
- subTitle={<OText size={12} lineHeight={18} color={theme.colors.textNormal}>
535
- {order?.delivery_datetime_utc
536
- ? parseDate(order?.delivery_datetime_utc)
537
- : parseDate(order?.delivery_datetime, { utc: false })}
400
+ subTitle={!hideDeliveryDate && <OText size={12} lineHeight={18} color={theme.colors.textNormal}>
401
+ {activeStatus.includes(order?.status) ? (
402
+ <OrderEta order={order} />
403
+ ) : (
404
+ parseDate(order?.reporting_data?.at[`status:${order.status}`])
405
+ )}
538
406
  </OText>}
539
407
  />
408
+ {enabledPoweredByOrdering && (
409
+ <View style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
410
+ <OText>
411
+ Powered By Ordering.co
412
+ </OText>
413
+ </View>
414
+ )}
540
415
  <OrderInfo>
541
416
  <OrderData>
542
417
  <View style={styles.linkWrapper}>
@@ -552,7 +427,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
552
427
  onPress={() => handleClickOrderReview(order)}
553
428
  >
554
429
  <OText
555
- size={10}
430
+ size={12}
556
431
  lineHeight={15}
557
432
  color={theme.colors.primary}
558
433
  style={{ textDecorationLine: 'underline' }}
@@ -568,7 +443,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
568
443
 
569
444
  >
570
445
  <OText
571
- size={10}
446
+ size={12}
572
447
  lineHeight={15}
573
448
  color={theme.colors.primary}
574
449
  style={{ textDecorationLine: 'underline', textTransform: 'capitalize' }}
@@ -683,6 +558,26 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
683
558
  {order?.business?.address}
684
559
  </OText>
685
560
  </View>
561
+ {directionTypes.includes(order?.delivery_type) && (
562
+ <OButton
563
+ text={t('GET_DIRECTIONS', 'Get Directions')}
564
+ imgRightSrc=''
565
+ textStyle={{ color: theme.colors.white }}
566
+ style={{
567
+ alignSelf: 'center',
568
+ borderRadius: 10,
569
+ marginTop: 30
570
+ }}
571
+ onClick={() => showLocation({
572
+ latitude: order?.business?.location?.lat,
573
+ longitude: order?.business?.location?.lng,
574
+ naverCallerName: 'com.reactnativeappstemplate5',
575
+ dialogTitle: t('GET_DIRECTIONS', 'Get Directions'),
576
+ dialogMessage: t('WHAT_APP_WOULD_YOU_USE', 'What app would you like to use?'),
577
+ cancelText: t('CANCEL', 'Cancel'),
578
+ })}
579
+ />
580
+ )}
686
581
  </OrderBusiness>
687
582
 
688
583
  {placeSpotTypes.includes(order?.delivery_type) && (
@@ -762,7 +657,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
762
657
  <>
763
658
  {order?.driver?.location && mapValidStatuses.includes(parseInt(order?.status)) && (
764
659
  <Map>
765
- <GoogleMap
660
+ <GoogleMap
766
661
  location={typeof order?.driver?.location?.location === 'string'
767
662
  ? {
768
663
  lat: parseFloat(driverLocationString[0]),
@@ -876,14 +771,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
876
771
  </OrderAction>
877
772
  </HeaderInfo>
878
773
  <OrderProducts>
879
- {order?.products?.length &&
880
- order?.products.map((product: any, i: number) => (
881
- <ProductItemAccordion
882
- key={product?.id || i}
883
- product={product}
884
- isFromCheckout
885
- />
886
- ))}
774
+ {sortedProductList}
887
775
  </OrderProducts>
888
776
  <OrderBill>
889
777
  <View style={{ height: 1, backgroundColor: theme.colors.border, marginBottom: 17 }} />
@@ -1051,8 +939,8 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
1051
939
  )}
1052
940
  <Total>
1053
941
  <Table>
1054
- <OText size={20} lineHeight={30} weight={'600'} color={theme.colors.textNormal}>{t('TOTAL', 'Total')}</OText>
1055
- <OText size={20} lineHeight={30} weight={'600'} color={theme.colors.textNormal}>
942
+ <OText size={14} style={{ fontWeight: 'bold' }} color={theme.colors.textNormal}>{t('TOTAL', 'Total')}</OText>
943
+ <OText size={14} style={{ fontWeight: 'bold' }} color={theme.colors.textNormal}>
1056
944
  {parsePrice(order?.summary?.total ?? order?.total)}
1057
945
  </OText>
1058
946
  </Table>
@@ -1086,7 +974,7 @@ export const OrderDetailsUI = (props: OrderDetailsParams) => {
1086
974
  <OText>
1087
975
  {event?.wallet_event
1088
976
  ? walletName[event?.wallet_event?.wallet?.type]?.name
1089
- : event?.paymethod?.name}
977
+ : t(event?.paymethod?.name.toUpperCase()?.replace(/ /g, '_'), event?.paymethod?.name)}
1090
978
  </OText>
1091
979
  {event?.data?.charge_id && (
1092
980
  <OText>
@@ -5,7 +5,6 @@ export const OrderDetailsContainer = styled.ScrollView`
5
5
  `
6
6
 
7
7
  export const NavBack = styled.TouchableOpacity`
8
-
9
8
  `
10
9
 
11
10
 
@@ -132,3 +131,13 @@ export const OrderAction = styled.View`
132
131
  export const PlaceSpotWrapper = styled.View`
133
132
  padding-horizontal: 40px;
134
133
  `
134
+
135
+ export const ProfessionalPhoto = styled.ImageBackground`
136
+ width: 100%;
137
+ position: relative;
138
+ max-height: 80px;
139
+ height: 80px;
140
+ width: 80px;
141
+ resize-mode: cover;
142
+ margin-right: 10px;
143
+ `;