ordering-ui-react-native 0.15.11 → 0.15.13-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 (147) hide show
  1. package/package.json +5 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessTypeFilter/index.tsx +12 -2
  4. package/src/components/BusinessTypeFilter/styles.tsx +1 -1
  5. package/src/components/BusinessesListing/index.tsx +1 -1
  6. package/src/components/Checkout/index.tsx +0 -1
  7. package/src/components/LanguageSelector/index.tsx +1 -0
  8. package/src/components/OrderDetails/index.tsx +26 -5
  9. package/src/components/PaymentOptions/index.tsx +9 -16
  10. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  11. package/src/components/ProductForm/index.tsx +1 -1
  12. package/src/components/ProductForm/styles.tsx +1 -0
  13. package/src/components/StripeElementsForm/index.tsx +27 -48
  14. package/src/components/VerifyPhone/styles.tsx +1 -2
  15. package/src/config.json +0 -2
  16. package/src/navigators/HomeNavigator.tsx +6 -0
  17. package/src/pages/BusinessProductsList.tsx +1 -0
  18. package/src/pages/BusinessesListing.tsx +1 -1
  19. package/src/pages/Checkout.tsx +1 -1
  20. package/src/pages/Sessions.tsx +22 -0
  21. package/src/types/index.tsx +1 -9
  22. package/themes/business/index.tsx +2 -0
  23. package/themes/business/src/components/Chat/index.tsx +3 -2
  24. package/themes/business/src/components/Home/index.tsx +128 -55
  25. package/themes/business/src/components/Home/styles.tsx +8 -1
  26. package/themes/business/src/components/NewOrderNotification/index.tsx +59 -98
  27. package/themes/business/src/components/OrderDetails/Business.tsx +2 -1
  28. package/themes/business/src/components/OrderDetails/Delivery.tsx +9 -9
  29. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +150 -89
  30. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +91 -17
  31. package/themes/business/src/components/OrderDetails/styles.tsx +7 -0
  32. package/themes/business/src/components/OrdersListManager/index.tsx +874 -0
  33. package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
  34. package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
  35. package/themes/business/src/components/OrdersOption/index.tsx +70 -116
  36. package/themes/business/src/components/OrdersOption/styles.tsx +2 -5
  37. package/themes/business/src/components/PreviousOrders/index.tsx +82 -23
  38. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  39. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  40. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  41. package/themes/kiosk/src/components/BusinessController/index.tsx +27 -6
  42. package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
  43. package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +48 -21
  44. package/themes/kiosk/src/components/Cart/index.tsx +98 -24
  45. package/themes/kiosk/src/components/Cart/styles.tsx +6 -0
  46. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
  47. package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
  48. package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
  49. package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
  50. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +6 -5
  51. package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
  52. package/themes/kiosk/src/components/Intro/index.tsx +13 -13
  53. package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
  54. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  55. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  56. package/themes/kiosk/src/components/OrderDetails/index.tsx +136 -41
  57. package/themes/kiosk/src/components/OrderDetails/styles.tsx +5 -0
  58. package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
  59. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
  60. package/themes/kiosk/src/components/ProductForm/index.tsx +174 -125
  61. package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
  62. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
  63. package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
  64. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
  65. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  66. package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
  67. package/themes/kiosk/src/types/index.d.ts +2 -0
  68. package/themes/original/index.tsx +179 -0
  69. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  70. package/themes/original/src/components/AddressList/index.tsx +28 -2
  71. package/themes/original/src/components/AppleLogin/index.tsx +119 -78
  72. package/themes/original/src/components/BusinessBasicInformation/index.tsx +96 -45
  73. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +28 -1
  74. package/themes/original/src/components/BusinessController/index.tsx +52 -22
  75. package/themes/original/src/components/BusinessController/styles.tsx +22 -0
  76. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  77. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  78. package/themes/original/src/components/BusinessListingSearch/index.tsx +4 -0
  79. package/themes/original/src/components/BusinessMenuList/index.tsx +11 -4
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +141 -121
  81. package/themes/original/src/components/BusinessProductsCategories/index.tsx +7 -5
  82. package/themes/original/src/components/BusinessProductsList/index.tsx +129 -22
  83. package/themes/original/src/components/BusinessProductsList/styles.tsx +29 -2
  84. package/themes/original/src/components/BusinessProductsListing/index.tsx +92 -37
  85. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  86. package/themes/original/src/components/BusinessReviews/index.tsx +4 -25
  87. package/themes/original/src/components/BusinessesListing/index.tsx +40 -53
  88. package/themes/original/src/components/Cart/index.tsx +41 -10
  89. package/themes/original/src/components/CartContent/index.tsx +2 -2
  90. package/themes/original/src/components/Checkout/index.tsx +23 -27
  91. package/themes/original/src/components/CouponControl/index.tsx +1 -0
  92. package/themes/original/src/components/DriverTips/index.tsx +1 -1
  93. package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
  94. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +97 -89
  95. package/themes/original/src/components/Home/index.tsx +1 -1
  96. package/themes/original/src/components/LoginForm/index.tsx +156 -70
  97. package/themes/original/src/components/LoginForm/styles.tsx +6 -1
  98. package/themes/original/src/components/Messages/index.tsx +50 -45
  99. package/themes/original/src/components/Messages/styles.tsx +1 -3
  100. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  101. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  102. package/themes/original/src/components/OrderDetails/index.tsx +105 -127
  103. package/themes/original/src/components/OrderDetails/styles.tsx +3 -1
  104. package/themes/original/src/components/OrderProgress/index.tsx +4 -4
  105. package/themes/original/src/components/OrderProgress/styles.tsx +1 -0
  106. package/themes/original/src/components/OrderSummary/index.tsx +35 -2
  107. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  108. package/themes/original/src/components/OrdersOption/index.tsx +15 -46
  109. package/themes/original/src/components/OrdersOption/styles.tsx +0 -6
  110. package/themes/original/src/components/PaymentOptionWallet/index.tsx +6 -2
  111. package/themes/original/src/components/PaymentOptions/index.tsx +24 -25
  112. package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
  113. package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
  114. package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
  115. package/themes/original/src/components/PreviousOrders/index.tsx +19 -13
  116. package/themes/original/src/components/ProductForm/index.tsx +47 -36
  117. package/themes/original/src/components/ProductForm/styles.tsx +2 -2
  118. package/themes/original/src/components/Promotions/index.tsx +233 -0
  119. package/themes/original/src/components/Promotions/styles.tsx +58 -0
  120. package/themes/original/src/components/ReviewOrder/index.tsx +10 -9
  121. package/themes/original/src/components/ReviewProducts/index.tsx +1 -1
  122. package/themes/original/src/components/Sessions/index.tsx +160 -0
  123. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  124. package/themes/original/src/components/SignupForm/index.tsx +173 -154
  125. package/themes/original/src/components/SingleProductCard/index.tsx +39 -18
  126. package/themes/original/src/components/SingleProductCard/styles.tsx +28 -1
  127. package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
  128. package/themes/original/src/components/TaxInformation/index.tsx +17 -7
  129. package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
  130. package/themes/original/src/components/UserDetails/index.tsx +4 -95
  131. package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
  132. package/themes/original/src/components/UserProfile/index.tsx +29 -17
  133. package/themes/original/src/components/UserProfileForm/index.tsx +8 -6
  134. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  135. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  136. package/themes/original/src/components/Wallets/index.tsx +58 -4
  137. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  138. package/themes/original/src/components/shared/HeaderTitle.tsx +21 -0
  139. package/themes/original/src/components/shared/index.tsx +2 -0
  140. package/themes/original/src/config/constants.tsx +6 -6
  141. package/themes/original/src/types/index.tsx +70 -23
  142. package/themes/original/src/utils/index.tsx +12 -2
  143. package/themes/single-business/src/components/AddressList/index.tsx +1 -1
  144. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +6 -6
  145. package/themes/single-business/src/components/UserProfile/index.tsx +1 -1
  146. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  147. package/src/components/StripeMethodForm/index.tsx +0 -168
@@ -1,13 +1,17 @@
1
1
  import React, { useState, useEffect } from 'react';
2
- import { StyleSheet, TouchableOpacity, View } from 'react-native';
2
+ import { StyleSheet, TouchableOpacity, View, Platform, PlatformIOSStatic } from 'react-native';
3
3
  import { useTheme } from 'styled-components/native';
4
4
  import moment from 'moment'
5
- import { useLanguage, useUtils } from 'ordering-components/native';
5
+ import { useLanguage, useUtils, useConfig } from 'ordering-components/native';
6
6
  import { OButton, OIcon, OText } from '../shared';
7
7
  import {
8
8
  Card, Logo, Information, MyOrderOptions, NotificationIcon, AcceptOrRejectOrder, Timestatus
9
9
  } from './styles';
10
10
  import EntypoIcon from 'react-native-vector-icons/Entypo'
11
+ import { DeviceOrientationMethods } from '../../../../../src/hooks/DeviceOrientation'
12
+ import DeviceInfo from 'react-native-device-info';
13
+
14
+ const { useDeviceOrientation, PORTRAIT } = DeviceOrientationMethods
11
15
 
12
16
  export const PreviousOrders = (props: any) => {
13
17
  const {
@@ -17,25 +21,44 @@ export const PreviousOrders = (props: any) => {
17
21
  handleClickOrder,
18
22
  isLogisticOrder,
19
23
  handleClickLogisticOrder,
20
- slaSettingTime
24
+ slaSettingTime,
25
+ currentTabSelected,
26
+ currentOrdenSelected
21
27
  } = props;
22
28
  const [, t] = useLanguage();
23
29
  const [{ parseDate, optimizeImage }] = useUtils();
30
+ const [configState] = useConfig()
24
31
  const theme = useTheme();
25
- const [currentTime, setCurrentTime] = useState()
32
+ const [, setCurrentTime] = useState()
33
+ const [allowColumns, setAllowColumns] = useState({
34
+ timer: true,
35
+ slaBar: true,
36
+ })
37
+
38
+ const [orientationState] = useDeviceOrientation();
39
+
40
+ const IS_PORTRAIT = orientationState.orientation === PORTRAIT
41
+
42
+ const platformIOS = Platform as PlatformIOSStatic
43
+ const isIpad = platformIOS.isPad
44
+ const isTablet = DeviceInfo.isTablet();
26
45
 
27
46
  const handlePressOrder = (order: any) => {
28
47
  if (order?.locked && isLogisticOrder) return
29
48
  handleClickOrder && handleClickOrder(order)
30
- onNavigationRedirect &&
31
- onNavigationRedirect('OrderDetails', { order: { ...order, isLogistic: isLogisticOrder }, handleClickLogisticOrder });
49
+ if (props.handleClickEvent) {
50
+ props.handleClickEvent({ ...order, isLogistic: isLogisticOrder })
51
+ } else {
52
+ onNavigationRedirect &&
53
+ onNavigationRedirect('OrderDetails', { order: { ...order, isLogistic: isLogisticOrder }, handleClickLogisticOrder });
54
+ }
32
55
  };
33
56
 
34
57
  const styles = StyleSheet.create({
35
58
  cardButton: {
36
59
  flex: 1,
37
- minHeight: isLogisticOrder ? 50 : 64,
38
- marginBottom: isLogisticOrder ? 0 : 30,
60
+ paddingVertical: (isIpad || isTablet) ? 20 : 0,
61
+ marginBottom: IS_PORTRAIT ? 25 : 0,
39
62
  marginLeft: 3,
40
63
  },
41
64
  icon: {
@@ -76,23 +99,42 @@ export const PreviousOrders = (props: any) => {
76
99
  },
77
100
  });
78
101
 
79
- const getDelayTime = (order: any) => {
102
+ const getDelayMinutes = (order: any) => {
80
103
  // targetMin = delivery_datetime + eta_time - now()
104
+ const offset = 300
105
+ const cdtToutc = moment(order?.delivery_datetime).add(offset, 'minutes').format('YYYY-MM-DD HH:mm:ss')
81
106
  const _delivery = order?.delivery_datetime_utc
107
+ ? parseDate(order?.delivery_datetime_utc)
108
+ : parseDate(cdtToutc)
82
109
  const _eta = order?.eta_time
83
- const tagetedMin = moment(_delivery).add(_eta, 'minutes').diff(moment().utc(), 'minutes')
84
- let day = Math.floor(tagetedMin / 1440)
110
+ const diffTimeAsSeconds = moment(_delivery, 'YYYY-MM-DD hh:mm A').add(_eta, 'minutes').diff(moment().utc(), 'seconds')
111
+ return Math.ceil(diffTimeAsSeconds / 60)
112
+ }
113
+
114
+ const displayDelayedTime = (order: any) => {
115
+ let tagetedMin = getDelayMinutes(order)
116
+ // get day, hour and minutes
117
+ const sign = tagetedMin >= 0 ? '' : '- '
118
+ tagetedMin = Math.abs(tagetedMin)
119
+ let day: string | number = Math.floor(tagetedMin / 1440)
85
120
  const restMinOfTargetedMin = tagetedMin - 1440 * day
86
- let restHours: any = Math.floor(restMinOfTargetedMin / 60)
87
- let restMins: any = restMinOfTargetedMin - 60 * restHours
121
+ let restHours: string | number = Math.floor(restMinOfTargetedMin / 60)
122
+ let restMins: string | number = restMinOfTargetedMin - 60 * restHours
123
+ // make standard time format
124
+ day = day === 0 ? '' : day + 'day '
125
+ restHours = restHours < 10 ? '0' + restHours : restHours
126
+ restMins = restMins < 10 ? '0' + restMins : restMins
88
127
 
89
- if (order?.time_status === 'in_time' || order?.time_status === 'at_risk') day = Math.abs(day)
90
- if (restHours < 10) restHours = ('0' + restHours)
91
- if (restMins < 10) restMins = ('0' + restMins)
92
- const finalTaget = day + 'day ' + restHours + ':' + restMins
128
+ const finalTaget = sign + day + restHours + ':' + restMins
93
129
  return finalTaget
94
130
  }
95
131
 
132
+ const getStatusClassName = (minutes: number) => {
133
+ if (isNaN(Number(minutes))) return 'in_time'
134
+ const delayTime = configState?.configs?.order_deadlines_delayed_time?.value
135
+ return minutes > 0 ? 'in_time' : Math.abs(minutes) <= delayTime ? 'at_risk' : 'delayed'
136
+ }
137
+
96
138
  useEffect(() => {
97
139
  const interval = setInterval(() => {
98
140
  const date: any = Date.now()
@@ -102,6 +144,15 @@ export const PreviousOrders = (props: any) => {
102
144
  return () => clearInterval(interval)
103
145
  }, [])
104
146
 
147
+ useEffect(() => {
148
+ const slaSettings = configState?.configs?.order_deadlines_enabled?.value === '1'
149
+ setAllowColumns({
150
+ ...allowColumns,
151
+ timer: slaSettings,
152
+ slaBar: slaSettings
153
+ })
154
+ }, [configState.loading])
155
+
105
156
  let hash: any = {};
106
157
 
107
158
  return (
@@ -114,8 +165,9 @@ export const PreviousOrders = (props: any) => {
114
165
  return (
115
166
  <View
116
167
  style={{
117
- backgroundColor: order?.locked && isLogisticOrder ? '#ccc' : '#fff',
118
- marginBottom: isLogisticOrder ? 10 : 0
168
+ backgroundColor: currentOrdenSelected === order?.id ? theme.colors.gray100 : order?.locked && isLogisticOrder ? '#ccc' : '#fff',
169
+ marginBottom: isLogisticOrder ? 10 : 0,
170
+ // justifyContent: 'center'
119
171
  }}
120
172
  key={order.id}
121
173
  >
@@ -126,7 +178,9 @@ export const PreviousOrders = (props: any) => {
126
178
  activeOpacity={1}
127
179
  >
128
180
  <Card key={order.id}>
129
- <Timestatus style={{ backgroundColor: order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : '' }} />
181
+ {allowColumns?.slaBar && (
182
+ <Timestatus style={{ backgroundColor: getStatusClassName(getDelayMinutes(order)) === 'in_time' ? '#00D27A' : getStatusClassName(getDelayMinutes(order)) === 'at_risk' ? '#FFC700' : getStatusClassName(getDelayMinutes(order)) === 'delayed' ? '#E63757' : '' }} />
183
+ )}
130
184
  {
131
185
  order.business?.logo && (
132
186
  <Logo style={styles.logo}>
@@ -159,7 +213,7 @@ export const PreviousOrders = (props: any) => {
159
213
  />
160
214
  </NotificationIcon>
161
215
  )}
162
- <View style={{ flexDirection: 'row' }}>
216
+ <View style={{ flexDirection: 'row', flexWrap: 'wrap' }}>
163
217
  <OText
164
218
  style={styles.date}
165
219
  color={theme.colors.unselectText}
@@ -169,9 +223,14 @@ export const PreviousOrders = (props: any) => {
169
223
  {(order?.order_group_id && order?.order_group && isLogisticOrder ? `${order?.order_group?.orders?.length} ${t('ORDERS', 'Orders')}` : (t('NO', 'Order No.') + order.id)) + ' · '}
170
224
  {order?.delivery_datetime_utc
171
225
  ? parseDate(order?.delivery_datetime_utc, { outputFormat: 'MM/DD/YY · HH:mm a' })
172
- : parseDate(order?.delivery_datetime, { utc: false })}{' · '}
226
+ : parseDate(order?.delivery_datetime, { utc: false })}
173
227
  </OText>
174
- <OText style={styles.date} color={order?.time_status === 'in_time' ? '#00D27A' : order?.time_status === 'at_risk' ? '#FFC700' : order?.time_status === 'delayed' ? '#E63757' : ''} >{getDelayTime(order)}</OText>
228
+ {((currentTabSelected === 'pending' || currentTabSelected === 'inProgress') && allowColumns?.timer) && (
229
+ <>
230
+ <OText> · </OText>
231
+ <OText style={styles.date} color={getStatusClassName(getDelayMinutes(order)) === 'in_time' ? '#00D27A' : getStatusClassName(getDelayMinutes(order)) === 'at_risk' ? '#FFC700' : getStatusClassName(getDelayMinutes(order)) === 'delayed' ? '#E63757' : ''} >{displayDelayedTime(order)}</OText>
232
+ </>
233
+ )}
175
234
  </View>
176
235
  {!isLogisticOrder && (
177
236
  <MyOrderOptions>
@@ -197,7 +197,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
197
197
  {isFarAway && (
198
198
  <FarAwayMessage style={styles.farAwayMsg}>
199
199
  <Ionicons name='md-warning-outline' style={styles.iconStyle} />
200
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
200
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
201
201
  </FarAwayMessage>
202
202
  )}
203
203
  {!auth && (
@@ -410,8 +410,7 @@ const LoginFormUI = (props: LoginParams) => {
410
410
  textInputProps={{
411
411
  returnKeyType: 'next',
412
412
  onSubmitEditing: () => inputRef?.current?.focus?.(),
413
- style: { borderWidth: 0, fontSize: 12 },
414
- maxLength: 10
413
+ style: { borderWidth: 0, fontSize: 12 }
415
414
  }}
416
415
  textWrapStyle={{ borderColor: theme.colors.clear, borderWidth: 0, height: 40, paddingStart: 0 }}
417
416
  />
@@ -155,7 +155,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
155
155
  {isFarAway && (
156
156
  <FarAwayMessage style={styles.farAwayMsg}>
157
157
  <Ionicons name='md-warning-outline' style={styles.iconStyle} />
158
- <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}</OText>
158
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
159
159
  </FarAwayMessage>
160
160
  )}
161
161
  <View style={styles.wrapperOrderOptions}>
@@ -6,6 +6,7 @@ import {
6
6
  BusinessController as BusinessSingleCard,
7
7
  useUtils,
8
8
  } from 'ordering-components/native';
9
+ import FastImage from 'react-native-fast-image'
9
10
 
10
11
  import { Card, BusinessLogo } from './styles';
11
12
 
@@ -26,6 +27,16 @@ export const BusinessControllerUI = (props: any) => {
26
27
  alignItems: 'center',
27
28
  textAlign: 'center',
28
29
  marginTop: 10
30
+ },
31
+ logoStyle: {
32
+ width: 120,
33
+ height: 120,
34
+ borderRadius: 8,
35
+ borderWidth: 1,
36
+ borderColor: theme.colors.border,
37
+ flexDirection: 'column',
38
+ justifyContent: 'center',
39
+ alignItems: 'center',
29
40
  }
30
41
  });
31
42
 
@@ -39,12 +50,22 @@ export const BusinessControllerUI = (props: any) => {
39
50
  activeOpacity={1}
40
51
  onPress={() => handleBusinessClick(business)}
41
52
  >
42
- <BusinessLogo
43
- source={business?.logo ? {
44
- uri: optimizeImage(business?.logo, 'h_120,c_limit'),
45
- } : theme.images.dummies.businessLogo}
46
- resizeMode='contain'
47
- />
53
+ {business?.logo ? (
54
+ <FastImage
55
+ style={styles.logoStyle}
56
+ source={{
57
+ uri: business?.logo,
58
+ priority: FastImage.priority.high,
59
+ cache:FastImage.cacheControl.web
60
+ }}
61
+ resizeMode={FastImage.resizeMode.contain}
62
+ />
63
+ ) : (
64
+ <BusinessLogo
65
+ source={theme.images.dummies.businessLogo}
66
+ resizeMode='contain'
67
+ />
68
+ )}
48
69
  <OText
49
70
  size={WIDTH_SCREEN * 0.012}
50
71
  numberOfLines={2}
@@ -3,7 +3,7 @@ import styled, { css } from 'styled-components/native';
3
3
  export const Card = styled.TouchableOpacity`
4
4
  display: flex;
5
5
  flex-direction: column;
6
- justify-content: center;
6
+ justify-content: flex-start;
7
7
  align-items: center;
8
8
  margin: 0 15px 20px;
9
9
  width: 120px;
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { View, StyleSheet, ScrollView, TouchableOpacity } from 'react-native'
2
+ import { View, StyleSheet, ScrollView, TouchableOpacity, ImageBackground } from 'react-native'
3
3
  import { BusinessAndProductList, useLanguage } from 'ordering-components/native'
4
4
  import { BusinessProductsListingParams, Business } from '../../types'
5
5
  import { OCard, OText, OIcon } from '../shared'
@@ -7,6 +7,7 @@ import GridContainer from '../../layouts/GridContainer'
7
7
  import Spinner from 'react-native-loading-spinner-overlay';
8
8
  import { LANDSCAPE, useDeviceOrientation } from '../../../../../src/hooks/DeviceOrientation';
9
9
  import styled, { useTheme } from 'styled-components/native';
10
+ import FastImage from 'react-native-fast-image'
10
11
 
11
12
  const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
12
13
  const {navigation, businessState, resetInactivityTimeout, clearInactivityTimeout, bottomSheetVisibility } = props;
@@ -59,17 +60,17 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
59
60
  );
60
61
 
61
62
  const RenderCategories = ({ item, cardStyle, widthScreen }: any) => {
62
- const Category = styled.ImageBackground`
63
- position: relative;
64
- height: 150px;
65
- width: ${(props: any) => props.w * 0.45}px;
66
- border-radius: 10px;
67
- padding: 10px;
68
- display: flex;
69
- flex-direction: column;
70
- justify-content: center;
71
- align-items: center;
72
- `
63
+ const stylesCat = StyleSheet.create({
64
+ categoryStyle: {
65
+ height: 150,
66
+ borderRadius: 10,
67
+ padding: 10,
68
+ flexDirection: 'column',
69
+ justifyContent: 'center',
70
+ alignItems: 'center',
71
+ }
72
+ })
73
+
73
74
  const WrapText = styled.View`
74
75
  height: 90px;
75
76
  display: flex;
@@ -78,6 +79,25 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
78
79
  border-radius: 10px;
79
80
  `
80
81
 
82
+ const Category = (props: any) => {
83
+ const imageProps = {
84
+ style: props.style,
85
+ source: props.source,
86
+ resizeMode: props.resizeMode,
87
+ }
88
+ return (
89
+ props.uri ? (
90
+ <FastImage {...imageProps}>
91
+ {props.children}
92
+ </FastImage>
93
+ ) : (
94
+ <ImageBackground {...imageProps}>
95
+ {props.children}
96
+ </ImageBackground>
97
+ )
98
+ )
99
+ }
100
+
81
101
  return (
82
102
  <TouchableOpacity
83
103
  key={item.id}
@@ -92,11 +112,17 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
92
112
  }}
93
113
  >
94
114
  <Category
95
- style={cardStyle}
96
- source={{uri: item.images}}
97
- resizeMode="cover"
98
- w={widthScreen}
99
- borderRadius={16}
115
+ style={{ ...cardStyle, ...stylesCat.categoryStyle, width: widthScreen * 0.45 }}
116
+ uri={!!item.images}
117
+ source={!!item.images
118
+ ? {
119
+ uri: item.images,
120
+ priority: FastImage.priority.high,
121
+ cache:FastImage.cacheControl.web
122
+ }
123
+ : theme.images.categories.all
124
+ }
125
+ resizeMode={FastImage.resizeMode.cover}
100
126
  >
101
127
  {item?.inventoried && (
102
128
  <View style={styles.soldOut}>
@@ -111,7 +137,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
111
137
  mLeft={0}
112
138
  size={32}
113
139
  numberOfLines={1}
114
- // mBottom={8}
115
140
  style={{...props?.titleStyle}}
116
141
  weight="bold"
117
142
  >
@@ -121,7 +146,6 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
121
146
  <OText
122
147
  color={theme.colors.white}
123
148
  numberOfLines={1}
124
- // mBottom={4}
125
149
  size={18}
126
150
  style={{...props?.descriptionStyle}}
127
151
  weight="400"
@@ -161,7 +185,7 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
161
185
  const _renderCategories = (): React.ReactElement => (
162
186
  <>
163
187
  {_renderTitle(t('CATEGORIES', 'Categories'))}
164
- <GridContainer
188
+ <GridContainer
165
189
  style={{
166
190
  paddingLeft: orientationState?.orientation === LANDSCAPE
167
191
  ? bottomSheetVisibility ? orientationState?.dimensions?.width * 0.004 :orientationState?.dimensions?.width * 0.008
@@ -171,9 +195,12 @@ const BusinessProductsListingUI = (props: BusinessProductsListingParams) => {
171
195
  {_categories && _categories.map((category: any) => (
172
196
  <OCard
173
197
  key={category.id}
198
+ isCentered
199
+ isUri={!!category.image}
174
200
  title={category?.name || ''}
175
- image={{uri: category?.image}}
201
+ image={category.image ? {uri: category.image} : theme.images.categories.all}
176
202
  style={{
203
+ borderRadius: 10,
177
204
  width:
178
205
  orientationState?.orientation === LANDSCAPE
179
206
  ? bottomSheetVisibility ? orientationState?.dimensions?.width * 0.145 :orientationState?.dimensions?.width * 0.16
@@ -10,7 +10,7 @@ import {
10
10
  useValidationFields,
11
11
  } from 'ordering-components/native';
12
12
 
13
- import { CheckoutAction, OrderTypeWrapper, FloatingLayout } from './styles';
13
+ import { CheckoutAction, OrderTypeWrapper, FloatingLayout, OSRow } from './styles';
14
14
 
15
15
  import { OSBill, OSCoupon, OSTable } from '../OrderSummary/styles';
16
16
 
@@ -90,6 +90,20 @@ const CartUI = (props: any) => {
90
90
 
91
91
  const goToBack = () => navigation.goBack();
92
92
 
93
+ const getIncludedTaxes = () => {
94
+ if (cart?.taxes === null) {
95
+ return cart.business.tax_type === 1 ? cart?.tax : 0
96
+ } else {
97
+ return cart?.taxes.reduce((taxIncluded: number, tax: any) => {
98
+ return taxIncluded + (tax.type === 1 ? tax.summary?.tax : 0)
99
+ }, 0)
100
+ }
101
+ }
102
+
103
+ const getIncludedTaxesDiscounts = () => {
104
+ return cart?.taxes?.filter((tax: any) => tax?.type === 1)?.reduce((carry: number, tax: any) => carry + (tax?.summary?.tax_after_discount ?? tax?.summary?.tax), 0)
105
+ }
106
+
93
107
  return (
94
108
  <>
95
109
  <Container>
@@ -177,13 +191,10 @@ const CartUI = (props: any) => {
177
191
  <OSTable>
178
192
  <OText>{t('SUBTOTAL', 'Subtotal')}</OText>
179
193
  <OText>
180
- {cart.business.tax_type === 1
181
- ? parsePrice((cart?.subtotal + cart?.tax) || 0)
182
- : parsePrice(cart?.subtotal || 0)}
194
+ {parsePrice(cart?.subtotal + getIncludedTaxes())}
183
195
  </OText>
184
196
  </OSTable>
185
- {cart?.discount > 0 && cart?.total >= 0 && orientationState?.orientation == PORTRAIT && (
186
-
197
+ {cart?.discount > 0 && cart?.total >= 0 && cart?.offers?.length === 0 && orientationState?.orientation == PORTRAIT && (
187
198
  <OSTable
188
199
  style={{
189
200
  backgroundColor: theme.colors.success,
@@ -226,44 +237,107 @@ const CartUI = (props: any) => {
226
237
  </OText>
227
238
  </OSTable>
228
239
  )}
229
- {cart.business.tax_type !== 1 && (
240
+ {
241
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 1)?.map((offer: any) => (
242
+ <OSTable key={offer.id}>
243
+ <OSRow>
244
+ <OText>{offer.name}</OText>
245
+ {offer.rate_type === 1 && (
246
+ <OText>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
247
+ )}
248
+ </OSRow>
249
+ <OText>
250
+ - {parsePrice(offer?.summary?.discount)}
251
+ </OText>
252
+ </OSTable>
253
+ ))
254
+ }
255
+ {cart?.subtotal_with_discount > 0 && cart?.discount > 0 && cart?.total >= 0 && (
230
256
  <OSTable>
231
- <OText>
232
- {t('TAX', 'Tax')}
233
- {`(${verifyDecimals(cart?.business?.tax, parseNumber)}%)`}
234
- </OText>
235
- <OText>{parsePrice(cart?.tax || 0)}</OText>
257
+ <OText numberOfLines={1}>{t('SUBTOTAL_WITH_DISCOUNT', 'Subtotal with discount')}</OText>
258
+ {cart?.business?.tax_type === 1 ? (
259
+ <OText>{parsePrice(cart?.subtotal_with_discount + getIncludedTaxesDiscounts() ?? 0)}</OText>
260
+ ) : (
261
+ <OText>{parsePrice(cart?.subtotal_with_discount ?? 0)}</OText>
262
+ )}
236
263
  </OSTable>
237
264
  )}
265
+ {
266
+ cart.taxes?.length > 0 && cart.taxes.filter((tax: any) => tax.type === 2 && tax?.rate !== 0).map((tax: any) => (
267
+ <OSTable key={tax.id}>
268
+ <OSRow>
269
+ <OText>
270
+ {tax.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
271
+ {`(${verifyDecimals(tax?.rate, parseNumber)}%)`}{' '}
272
+ </OText>
273
+ </OSRow>
274
+ <OText>{parsePrice(tax?.summary?.tax_after_discount ?? tax?.summary?.tax ?? 0)}</OText>
275
+ </OSTable>
276
+ ))
277
+ }
278
+ {
279
+ cart?.fees?.length > 0 && cart?.fees?.filter((fee: any) => !(fee.fixed === 0 && fee.percentage === 0)).map((fee: any) => (
280
+ <OSTable key={fee?.id}>
281
+ <OSRow>
282
+ <OText>
283
+ {fee.name || t('INHERIT_FROM_BUSINESS', 'Inherit from business')}{' '}
284
+ ({fee?.fixed > 0 && `${parsePrice(fee?.fixed)}${fee.percentage > 0 ? ' + ' : ''}`}{fee.percentage > 0 && `${fee.percentage}%`}){' '}
285
+ </OText>
286
+ </OSRow>
287
+ <OText>{parsePrice(fee?.summary?.fixed + (fee?.summary?.percentage_after_discount ?? fee?.summary?.percentage) ?? 0)}</OText>
288
+ </OSTable>
289
+ ))
290
+ }
291
+ {
292
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 3)?.map((offer: any) => (
293
+ <OSTable key={offer.id}>
294
+ <OSRow>
295
+ <OText>{offer.name}</OText>
296
+ {offer.rate_type === 1 && (
297
+ <OText>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
298
+ )}
299
+ </OSRow>
300
+ <OText>
301
+ - {parsePrice(offer?.summary?.discount)}
302
+ </OText>
303
+ </OSTable>
304
+ ))
305
+ }
238
306
  {selectedOrderType === 1 && cart?.delivery_price > 0 && (
239
307
  <OSTable>
240
308
  <OText>{t('DELIVERY_FEE', 'Delivery Fee')}</OText>
241
309
  <OText>{parsePrice(cart?.delivery_price)}</OText>
242
310
  </OSTable>
243
311
  )}
312
+ {
313
+ cart?.offers?.length > 0 && cart?.offers?.filter((offer: any) => offer?.target === 2)?.map((offer: any) => (
314
+ <OSTable key={offer.id}>
315
+ <OSRow>
316
+ <OText>{offer.name}</OText>
317
+ {offer.rate_type === 1 && (
318
+ <OText>{`(${verifyDecimals(offer?.rate, parsePrice)}%)`}</OText>
319
+ )}
320
+ </OSRow>
321
+ <OText>
322
+ - {parsePrice(offer?.summary?.discount)}
323
+ </OText>
324
+ </OSTable>
325
+ ))
326
+ }
244
327
  {cart?.driver_tip > 0 && (
245
328
  <OSTable>
246
329
  <OText>
247
330
  {t('DRIVER_TIP', 'Driver tip')}
248
331
  {cart?.driver_tip_rate > 0 &&
249
332
  parseInt(configs?.driver_tip_type?.value, 10) === 2 &&
250
- !!!parseInt(configs?.driver_tip_use_custom?.value, 10) &&
333
+ !parseInt(configs?.driver_tip_use_custom?.value, 10) &&
251
334
  (
252
- `(${parseNumber(cart?.driver_tip_rate)}%)`
335
+ `(${verifyDecimals(cart?.driver_tip_rate, parseNumber)}%)`
253
336
  )}
254
337
  </OText>
255
338
  <OText>{parsePrice(cart?.driver_tip)}</OText>
256
339
  </OSTable>
257
340
  )}
258
- {cart?.service_fee > 0 && (
259
- <OSTable>
260
- <OText>
261
- {t('SERVICE_FEE', 'Service Fee')}
262
- {`(${verifyDecimals(cart?.business?.service_fee, parseNumber)}%)`}
263
- </OText>
264
- <OText>{parsePrice(cart?.service_fee)}</OText>
265
- </OSTable>
266
- )}
267
341
  {!cart?.discount_type && isCouponEnabled && !isCartPending && orientationState?.orientation == PORTRAIT && (
268
342
  <OSTable>
269
343
  <OSCoupon>
@@ -279,7 +353,7 @@ const CartUI = (props: any) => {
279
353
  {t('TOTAL', 'Total')}
280
354
  </OText>
281
355
  <OText weight='bold' color={theme.colors.primary}>
282
- {cart?.total >= 1 && parsePrice(cart?.total)}
356
+ {parsePrice(cart?.total >= 0 ? cart?.total : 0)}
283
357
  </OText>
284
358
  </OSTable>
285
359
  </OSBill>
@@ -68,3 +68,9 @@ export const FloatingLayout = styled.View`
68
68
  padding-bottom: 20px;
69
69
  `)}
70
70
  `
71
+
72
+ export const OSRow = styled.View`
73
+ flex-direction: row;
74
+ overflow: hidden;
75
+ width: 80%;
76
+ `
@@ -179,7 +179,7 @@ const CartBottomSheetUI = (props: CartBottomSheetUIProps): React.ReactElement |
179
179
  <ProductForm
180
180
  productCart={curProduct}
181
181
  businessSlug={cart?.business?.slug}
182
- businessId={curProduct?.business_id}
182
+ businessId={cart?.business_id}
183
183
  categoryId={curProduct?.category_id}
184
184
  productId={curProduct?.id}
185
185
  onSave={handlerProductAction}
@@ -5,7 +5,7 @@ export const StyledContainer = styled.ScrollView`
5
5
  zIndex: 1000;
6
6
  width: 100%;
7
7
  background-color: #fff;
8
- padding: 20px 20px 20px 0px;
8
+ padding: 20px 0 0;
9
9
  bottom: 0;
10
10
  shadow-color: #000;
11
11
  shadow-opacity: 0.4;