ordering-ui-react-native 0.12.79 → 0.12.83

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 (29) hide show
  1. package/package.json +1 -1
  2. package/src/components/BusinessesListing/index.tsx +35 -3
  3. package/src/components/BusinessesListing/styles.tsx +10 -0
  4. package/src/theme.json +3 -1
  5. package/src/utils/index.tsx +27 -0
  6. package/themes/doordash/src/components/BusinessesListing/index.tsx +33 -1
  7. package/themes/doordash/src/components/BusinessesListing/styles.tsx +11 -1
  8. package/themes/doordash/src/utils/index.tsx +27 -0
  9. package/themes/instacart/src/components/BusinessesListing/index.tsx +35 -3
  10. package/themes/instacart/src/components/BusinessesListing/styles.tsx +11 -1
  11. package/themes/instacart/src/utils/index.tsx +27 -0
  12. package/themes/original/index.tsx +2 -0
  13. package/themes/original/src/components/ActiveOrders/index.tsx +36 -16
  14. package/themes/original/src/components/ActiveOrders/styles.tsx +10 -0
  15. package/themes/original/src/components/MessageListing/index.tsx +297 -0
  16. package/themes/original/src/components/MessageListing/styles.tsx +16 -0
  17. package/themes/original/src/components/Messages/index.tsx +123 -81
  18. package/themes/original/src/components/Messages/styles.tsx +8 -0
  19. package/themes/original/src/components/UserProfile/index.tsx +10 -0
  20. package/themes/original/src/types/index.tsx +11 -3
  21. package/themes/original/src/utils/index.tsx +18 -0
  22. package/themes/single-business/src/components/BusinessesListing/index.tsx +33 -0
  23. package/themes/single-business/src/components/BusinessesListing/styles.tsx +9 -0
  24. package/themes/single-business/src/components/ProductForm/index.tsx +5 -2
  25. package/themes/single-business/src/components/ReviewOrder/index.tsx +18 -3
  26. package/themes/single-business/src/utils/index.tsx +27 -0
  27. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +36 -3
  28. package/themes/uber-eats/src/components/BusinessesListing/styles.tsx +8 -0
  29. package/themes/uber-eats/src/utils/index.tsx +27 -0
@@ -1,5 +1,6 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
3
+ import Geolocation from '@react-native-community/geolocation'
3
4
  import {
4
5
  View,
5
6
  StyleSheet,
@@ -28,6 +29,7 @@ import {
28
29
  TopHeader,
29
30
  DropOptionButton,
30
31
  WrapSearchBar,
32
+ FarAwayMessage
31
33
  } from './styles';
32
34
 
33
35
  import { SearchBar } from '../SearchBar';
@@ -41,6 +43,8 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
41
43
  import { BusinessFeaturedController } from '../BusinessFeaturedController';
42
44
  import { getTypesText } from '../../utils';
43
45
  import NavBar from '../NavBar';
46
+ import { getDistance } from '../../utils'
47
+ import Ionicons from 'react-native-vector-icons/Ionicons'
44
48
 
45
49
  const PIXELS_TO_SCROLL = 1000;
46
50
 
@@ -97,6 +101,15 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
97
101
  height: 260,
98
102
  paddingHorizontal: 40
99
103
  },
104
+ iconStyle: {
105
+ fontSize: 18,
106
+ color: theme.colors.warning5,
107
+ marginRight: 8
108
+ },
109
+ farAwayMsg: {
110
+ paddingVertical: 6,
111
+ paddingHorizontal: 20
112
+ }
100
113
  });
101
114
 
102
115
 
@@ -109,6 +122,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
109
122
  const { top } = useSafeAreaInsets();
110
123
 
111
124
  const [featuredBusiness, setFeaturedBusinesses] = useState(Array);
125
+ const [isFarAway, setIsFarAway] = useState(false)
112
126
 
113
127
  const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || [];
114
128
 
@@ -135,6 +149,19 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
135
149
  }
136
150
  }, [businessesList.businesses]);
137
151
 
152
+ useEffect(() => {
153
+ Geolocation.getCurrentPosition((pos) => {
154
+ const crd = pos.coords
155
+ const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
156
+ if (distance > 20) setIsFarAway(true)
157
+ else setIsFarAway(false)
158
+ }, (err) => {
159
+ console.log(`ERROR(${err.code}): ${err.message}`)
160
+ }, {
161
+ enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
162
+ })
163
+ }, [orderState?.options?.address?.location])
164
+
138
165
  return (
139
166
  <ScrollView
140
167
  style={styles.container}
@@ -171,6 +198,12 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
171
198
  {orderState?.options?.address?.address}
172
199
  </OText>
173
200
  </AddressInput>
201
+ {isFarAway && (
202
+ <FarAwayMessage style={styles.farAwayMsg}>
203
+ <Ionicons name='md-warning-outline' style={styles.iconStyle} />
204
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
205
+ </FarAwayMessage>
206
+ )}
174
207
  <OrderControlContainer>
175
208
  <View style={styles.wrapperOrderOptions}>
176
209
  <DropOptionButton
@@ -95,3 +95,12 @@ export const WrapSearchBar = styled.View`
95
95
  background-color: ${(props: any) => props.theme.colors.white};
96
96
  flex: 1;
97
97
  `
98
+
99
+ export const FarAwayMessage = styled.View`
100
+ flex-direction: row;
101
+ align-items: center;
102
+ background-color: ${(props: any) => props.theme.colors.warning1};
103
+ border-radius: 7.6px;
104
+ border: 1px solid ${(props: any) => props.theme.colors.warning5};
105
+ width: 100%;
106
+ `
@@ -259,7 +259,10 @@ export const ProductOptionsUI = (props: any) => {
259
259
  }, []);
260
260
 
261
261
  return (
262
- <>
262
+ <KeyboardAvoidingView
263
+ enabled
264
+ behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
265
+ >
263
266
  <ScrollView ref={scrollViewRef}>
264
267
  {!error && (
265
268
  <>
@@ -710,7 +713,7 @@ export const ProductOptionsUI = (props: any) => {
710
713
  </View>
711
714
  </ProductActions>
712
715
  )}
713
- </>
716
+ </KeyboardAvoidingView>
714
717
  );
715
718
  };
716
719
 
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect } from 'react'
1
+ import React, { useState, useEffect, useRef } from 'react'
2
2
  import { OrderReview as ReviewOrderController, useLanguage, useToast, ToastType } from 'ordering-components/native'
3
3
  import { useForm, Controller } from 'react-hook-form'
4
4
  import LinearGradient from 'react-native-linear-gradient'
@@ -14,7 +14,7 @@ import {
14
14
  RatingTextContainer
15
15
  } from './styles'
16
16
  import { OButton, OIcon, OInput, OText } from '../shared'
17
- import { TouchableOpacity, StyleSheet, View, I18nManager } from 'react-native';
17
+ import { TouchableOpacity, StyleSheet, View, I18nManager, Keyboard } from 'react-native';
18
18
  import NavBar from '../NavBar'
19
19
  import { FloatingBottomContainer } from '../../../../../src/layouts/FloatingBottomContainer'
20
20
  import Spinner from 'react-native-loading-spinner-overlay'
@@ -90,6 +90,7 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
90
90
  const [alertState, setAlertState] = useState<{ open: boolean, content: Array<any>, success?: boolean }>({ open: false, content: [], success: false })
91
91
  const [comments, setComments] = useState<Array<any>>([])
92
92
  const [extraComment, setExtraComment] = useState('')
93
+ const scrollViewRef = useRef<any>()
93
94
 
94
95
  const onSubmit = () => {
95
96
  if (Object.values(stars).some((value: any) => value === 0)) {
@@ -199,9 +200,23 @@ export const ReviewOrderUI = (props: ReviewOrderParams) => {
199
200
  setStars({ ...stars, comments: _comment })
200
201
  }, [comments, extraComment])
201
202
 
203
+ useEffect(() => {
204
+ const keyboardDidShowListener = Keyboard.addListener(
205
+ 'keyboardDidShow',
206
+ () => {
207
+ scrollViewRef?.current && scrollViewRef?.current?.scrollToEnd()
208
+ }
209
+ );
210
+
211
+ return () => {
212
+ keyboardDidShowListener.remove();
213
+ };
214
+ }, []);
215
+
216
+
202
217
  return (
203
218
  <>
204
- <ReviewOrderContainer>
219
+ <ReviewOrderContainer ref={scrollViewRef}>
205
220
  <NavBar
206
221
  title={t('REVIEW_ORDER', 'Review Order')}
207
222
  titleAlign={'center'}
@@ -251,3 +251,30 @@ export const getTextOrderStatus = (s: string, t: any) => {
251
251
  const objectStatus = orderStatus.find((o) => o.key === status)
252
252
  return objectStatus && objectStatus
253
253
  }
254
+
255
+ /**
256
+ * Function to transform degree to radian
257
+ * @param {number} value for transform
258
+ *
259
+ */
260
+ export const convertToRadian = (value: number) => {
261
+ return value * Math.PI / 180
262
+ }
263
+
264
+ /**
265
+ * Function to distance between two locations
266
+ * @param lat1 Lat for first location
267
+ * @param lon1 Lon for first location
268
+ * @param lat2 Lat for second location
269
+ * @param lon2 Lon for second location
270
+ */
271
+ export const getDistance = (lat1: any, lon1: any, lat2: any, lon2: any) => {
272
+ const R = 6371 // km
273
+ const dLat = convertToRadian(lat2 - lat1)
274
+ const dLon = convertToRadian(lon2 - lon1)
275
+ const curLat1 = convertToRadian(lat1)
276
+ const curLat2 = convertToRadian(lat2)
277
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(curLat1) * Math.cos(curLat2)
278
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
279
+ return R * c
280
+ }
@@ -1,7 +1,10 @@
1
- import React, { useState } from 'react'
1
+ import React, { useState, useEffect } from 'react'
2
2
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder'
3
3
  import { View, StyleSheet, ScrollView, Platform, PanResponder, I18nManager } from 'react-native'
4
4
  import MaterialIcon from 'react-native-vector-icons/MaterialIcons'
5
+ import Geolocation from '@react-native-community/geolocation'
6
+ import Ionicons from 'react-native-vector-icons/Ionicons'
7
+
5
8
  import {
6
9
  BusinessList as BusinessesListingController,
7
10
  useLanguage,
@@ -13,7 +16,7 @@ import {
13
16
  useToast
14
17
  } from 'ordering-components/native'
15
18
 
16
- import { BusinessListContainer, Divider, Search, OrderControlContainer, AddressInput, WrapMomentOption } from './styles'
19
+ import { BusinessListContainer, Divider, Search, OrderControlContainer, AddressInput, WrapMomentOption, FarAwayMessage } from './styles'
17
20
 
18
21
  import NavBar from '../NavBar'
19
22
  import { SearchBar } from '../SearchBar'
@@ -27,6 +30,7 @@ import { OrderTypeSelector } from '../OrderTypeSelector'
27
30
  import { MomentOption } from '../MomentOption'
28
31
  import { HighestRatedBusinesses } from '../HighestRatedBusinesses'
29
32
  import { useTheme } from 'styled-components/native'
33
+ import { getDistance } from '../../utils'
30
34
 
31
35
  const PIXELS_TO_SCROLL = 1200
32
36
 
@@ -61,7 +65,16 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
61
65
  borderColor: theme.colors.backgroundGray,
62
66
  borderWidth: 1,
63
67
  borderRadius: 10,
64
- }
68
+ },
69
+ iconStyle: {
70
+ fontSize: 18,
71
+ color: theme.colors.warning5,
72
+ marginRight: 8
73
+ },
74
+ farAwayMsg: {
75
+ paddingVertical: 6,
76
+ paddingHorizontal: 20
77
+ }
65
78
  })
66
79
 
67
80
  const [, t] = useLanguage()
@@ -73,6 +86,7 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
73
86
 
74
87
  const [openMomentOption, setOpenMomentOption] = useState(false)
75
88
  const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
89
+ const [isFarAway, setIsFarAway] = useState(false)
76
90
 
77
91
  const handleScroll = ({ nativeEvent }: any) => {
78
92
  const y = nativeEvent.contentOffset.y
@@ -85,6 +99,19 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
85
99
  }
86
100
  }
87
101
 
102
+ useEffect(() => {
103
+ Geolocation.getCurrentPosition((pos) => {
104
+ const crd = pos.coords
105
+ const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
106
+ if (distance > 20) setIsFarAway(true)
107
+ else setIsFarAway(false)
108
+ }, (err) => {
109
+ console.log(`ERROR(${err.code}): ${err.message}`)
110
+ }, {
111
+ enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
112
+ })
113
+ }, [orderState?.options?.address?.location])
114
+
88
115
  return (
89
116
  <BusinessListContainer>
90
117
  {!auth && (
@@ -114,6 +141,12 @@ const BusinessesListingUI = (props: BusinessesListingParams) => {
114
141
  style={{ marginRight: 10 }}
115
142
  />
116
143
  </AddressInput>
144
+ {isFarAway && (
145
+ <FarAwayMessage style={styles.farAwayMsg}>
146
+ <Ionicons name='md-warning-outline' style={styles.iconStyle} />
147
+ <OText size={12} numberOfLines={1} ellipsizeMode={'tail'} color={theme.colors.textNormal}>{t('YOU_ARE_FAR_FROM_ADDRESS', 'Your are far from this address')}</OText>
148
+ </FarAwayMessage>
149
+ )}
117
150
  <View style={styles.wrapperOrderOptions}>
118
151
  <OrderTypeSelector configTypes={configTypes} />
119
152
  <WrapMomentOption
@@ -52,3 +52,11 @@ export const WrapMomentOption = styled.TouchableOpacity`
52
52
  margin-horizontal: 10px;
53
53
  max-width: 240px;
54
54
  `
55
+
56
+ export const FarAwayMessage = styled.View`
57
+ flex-direction: row;
58
+ align-items: center;
59
+ background-color: ${(props: any) => props.theme.colors.warning1};
60
+ border-radius: 7.6px;
61
+ border: 1px solid ${(props: any) => props.theme.colors.warning5};
62
+ `
@@ -162,3 +162,30 @@ export const transformCountryCode = (countryCode : number) => {
162
162
  return parser(value)
163
163
  }
164
164
  }
165
+
166
+ /**
167
+ * Function to transform degree to radian
168
+ * @param {number} value for transform
169
+ *
170
+ */
171
+ export const convertToRadian = (value: number) => {
172
+ return value * Math.PI / 180
173
+ }
174
+
175
+ /**
176
+ * Function to distance between two locations
177
+ * @param lat1 Lat for first location
178
+ * @param lon1 Lon for first location
179
+ * @param lat2 Lat for second location
180
+ * @param lon2 Lon for second location
181
+ */
182
+ export const getDistance = (lat1: any, lon1: any, lat2: any, lon2: any) => {
183
+ const R = 6371 // km
184
+ const dLat = convertToRadian(lat2 - lat1)
185
+ const dLon = convertToRadian(lon2 - lon1)
186
+ const curLat1 = convertToRadian(lat1)
187
+ const curLat2 = convertToRadian(lat2)
188
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(curLat1) * Math.cos(curLat2)
189
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
190
+ return R * c
191
+ }