edited
This commit is contained in:
		
							
								
								
									
										185
									
								
								app/containers/Location/location.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										185
									
								
								app/containers/Location/location.js
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,185 @@ | ||||
| import React, { Component } from "react"; | ||||
| import { | ||||
|   Platform, | ||||
|   StyleSheet, | ||||
|   Text, | ||||
|   View, | ||||
|   Alert, | ||||
|   NetInfo, | ||||
|   Geolocation | ||||
| } from "react-native"; | ||||
| import Header from "../../components/Public/header"; | ||||
| import { observer, inject } from "mobx-react/native"; | ||||
| import { observable, transaction } from "mobx"; | ||||
| import { width, height } from "../../config/screen"; | ||||
| import MapView, { Polyline } from "react-native-maps"; | ||||
| import MapViewDirections from "react-native-maps-directions"; | ||||
| import AsyncStorageHelper from "../../config/asyncStorageHelper"; | ||||
|  | ||||
| const asyncStorageHelper = new AsyncStorageHelper(); | ||||
|  | ||||
| const origin = { latitude: 22.320508, longitude: 114.170222 }; | ||||
| const destination = { latitude: 22.320568, longitude: 114.171273 }; | ||||
| const GOOGLE_MAPS_APIKEY = "AIzaSyB_9Wi7BcAgqMPxZvW_5DWb8UxF5W9tWz0"; | ||||
|  | ||||
| export const getCurrentLocation = () => { | ||||
|   return new Promise((resolve, reject) => { | ||||
|     navigator.geolocation.getCurrentPosition( | ||||
|       position => resolve(position), | ||||
|       e => reject(e) | ||||
|     ); | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| @inject(["menuStore"], ["userStore"]) | ||||
| @observer | ||||
| export default class Location extends Component { | ||||
|   title = ""; | ||||
|   pickUpPointLoaction = { latitude: 0, longitude: 0 }; | ||||
|  | ||||
|   static navigationOptions = { | ||||
|     drawerLabel: "My Orders" | ||||
|   }; | ||||
|  | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     this.store = this.props.menuStore; | ||||
|     this.userStore = this.props.userStore; | ||||
|     this.state = { | ||||
|       region: { | ||||
|         latitude: null, | ||||
|         longitude: null, | ||||
|         latitudeDelta: 1, | ||||
|         longitudeDelta: 1 | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   getIndex(id) { | ||||
|     var index = this.userStore.pickupPointLabel.findIndex(function(item, i) { | ||||
|       return item.id == parseInt(id); | ||||
|     }); | ||||
|  | ||||
|     return index; | ||||
|   } | ||||
|  | ||||
|   getUserLocation() { | ||||
|     navigator.geolocation.getCurrentPosition( | ||||
|       position => { | ||||
|         this.userStore.userLocation = position; | ||||
|       }, | ||||
|       error => { | ||||
|         console.log(error); | ||||
|       }, | ||||
|       { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 } | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   componentWillMount() { | ||||
|     const { navigation } = this.props; | ||||
|     this.getUserLocation(); | ||||
|     this.title = navigation.getParam("title", "Location"); | ||||
|     this.pickUpPointLoaction = navigation.getParam("location", { | ||||
|       latitude: 0, | ||||
|       longitude: 0 | ||||
|     }); | ||||
|     this.setState({ | ||||
|       region: { | ||||
|         latitude: this.userStore.userLocation.coords.latitude, | ||||
|         longitude: this.userStore.userLocation.coords.longitude, | ||||
|         latitudeDelta: 0.02, | ||||
|         longitudeDelta: 0.02 | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   clickMarkerAction(id) { | ||||
|     Alert.alert( | ||||
|       "", | ||||
|       "Select " + | ||||
|         this.userStore.pickupPointLabel[this.getIndex(id)].value + | ||||
|         "?", | ||||
|       [ | ||||
|         { text: "Cancel", onPress: () => console.log("Cancel") }, | ||||
|         { text: "Yes", onPress: () => this.picked(id) } | ||||
|       ] | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   picked(id) { | ||||
|     asyncStorageHelper.saveData("pickupPointId", id); | ||||
|     this.store.getMenuItem(); | ||||
|     this.props.navigation.goBack(); | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     console.log(this.userStore.userLocation); | ||||
|     if (this.title == "Pick the loaction") { | ||||
|       return ( | ||||
|         <View style={styles.container}> | ||||
|           <Header title={this.title} navigation={this.props.navigation} /> | ||||
|           <MapView | ||||
|             style={{ width: width, height: 400 }} | ||||
|             showsUserLocation={true} | ||||
|             initialRegion={this.state.region} | ||||
|           > | ||||
|             {this.userStore.pickupLoactionPoint.data.content.map(marker => ( | ||||
|               <MapView.Marker | ||||
|                 coordinate={{ latitude: marker.lat, longitude: marker.lng }} | ||||
|                 title={marker.name} | ||||
|                 onPress={() => this.clickMarkerAction(marker.id)} | ||||
|               /> | ||||
|             ))} | ||||
|           </MapView> | ||||
|         </View> | ||||
|       ); | ||||
|     } else { | ||||
|       return ( | ||||
|         <View style={styles.container}> | ||||
|           <Header title={this.title} navigation={this.props.navigation} /> | ||||
|           <MapView | ||||
|             style={{ width: width, height: 400 }} | ||||
|             showsUserLocation={true} | ||||
|             initialRegion={this.state.region} | ||||
|           > | ||||
|             <MapView.Marker | ||||
|               coordinate={{ | ||||
|                 latitude: this.userStore.userLocation.coords.latitude, | ||||
|                 longitude: this.userStore.userLocation.coords.longitude | ||||
|               }} | ||||
|             /> | ||||
|             <MapView.Marker coordinate={this.pickUpPointLoaction} /> | ||||
|             <MapViewDirections | ||||
|               origin={{latitude: this.userStore.userLocation.coords.latitude, | ||||
|                 longitude: this.userStore.userLocation.coords.longitude,}} | ||||
|               destination={this.pickUpPointLoaction} | ||||
|               apikey={GOOGLE_MAPS_APIKEY} | ||||
|               mode = 'walking' | ||||
|               strokeWidth={3} | ||||
|               strokeColor="red" | ||||
|             /> | ||||
|             ) | ||||
|           </MapView> | ||||
|         </View> | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| const styles = StyleSheet.create({ | ||||
|   container: { | ||||
|     flex: 1, | ||||
|     alignItems: "center", | ||||
|     backgroundColor: "#F5FCFF" | ||||
|   }, | ||||
|   welcome: { | ||||
|     fontSize: 20, | ||||
|     textAlign: "center", | ||||
|     margin: 10 | ||||
|   }, | ||||
|   instructions: { | ||||
|     textAlign: "center", | ||||
|     color: "#333333", | ||||
|     marginBottom: 5 | ||||
|   } | ||||
| }); | ||||
							
								
								
									
										390
									
								
								app/containers/Location/locationRequest.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										390
									
								
								app/containers/Location/locationRequest.js
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,390 @@ | ||||
| import React, { Component } from "react"; | ||||
| import { | ||||
|   Platform, | ||||
|   StyleSheet, | ||||
|   View, | ||||
|   Alert, | ||||
|   NetInfo, | ||||
|   Geolocation, | ||||
|   TouchableOpacity, | ||||
|   SafeAreaView, | ||||
|   StatusBar, | ||||
|   Image, | ||||
|   ImageBackground | ||||
| } from "react-native"; | ||||
| import Header from "../../components/Public/header"; | ||||
| import Text from "react-native-text"; | ||||
| import { SearchBar } from "react-native-elements"; | ||||
| import { observer, inject } from "mobx-react/native" | ||||
| import { Fonts } from "../../config/fonts";; | ||||
| import { observable, transaction } from "mobx"; | ||||
| import { scale, verticalScale, moderateScale } from "react-native-size-matters"; | ||||
| import { width, height } from "../../config/screen"; | ||||
| import MapView, { Polyline } from "react-native-maps"; | ||||
| import MapViewDirections from "react-native-maps-directions"; | ||||
| import AsyncStorageHelper from "../../config/asyncStorageHelper"; | ||||
| import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; | ||||
| import { ifIphoneX } from 'react-native-iphone-x-helper' | ||||
| import theme from "../../config/colors"; | ||||
| import FastImage from "react-native-fast-image"; | ||||
| import MyStatusBar from "../../components/Public/statusBar"; | ||||
| const asyncStorageHelper = new AsyncStorageHelper(); | ||||
| import Log from '../../config/log' | ||||
| import { GooglePlacesAutocomplete } from "react-native-google-places-autocomplete"; | ||||
| const origin = { latitude: 22.320508, longitude: 114.170222 }; | ||||
| const destination = { latitude: 22.320568, longitude: 114.171273 }; | ||||
| const GOOGLE_MAPS_APIKEY = "AIzaSyBM8eEWcSWBuZcM0lGH_JSoDjgImlqHwPs"; | ||||
| const log = new Log() | ||||
| export const getCurrentLocation = () => { | ||||
|   return new Promise((resolve, reject) => { | ||||
|     navigator.geolocation.getCurrentPosition( | ||||
|       position => resolve(position), | ||||
|       e => reject(e) | ||||
|     ); | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| @inject(["menuStore"], ["userStore"]) | ||||
| @observer | ||||
| export default class LocationRequest extends Component { | ||||
|   @observable | ||||
|   markerId = null; | ||||
|   title = ""; | ||||
|   pickUpPointLoaction = { latitude: 0, longitude: 0 }; | ||||
|   perdefinedPlaces = []; | ||||
|  | ||||
|   static navigationOptions = { | ||||
|     drawerLabel: "My Orders" | ||||
|   }; | ||||
|  | ||||
|   constructor(props) { | ||||
|     super(props); | ||||
|     this.store = this.props.menuStore; | ||||
|     this.userStore = this.props.userStore; | ||||
|     this.state = { | ||||
|       region: { | ||||
|         latitude: null, | ||||
|         longitude: null, | ||||
|         latitudeDelta: 1, | ||||
|         longitudeDelta: 1 | ||||
|       } | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   navigatieAction(page) { | ||||
|     this.props.navigation.navigate(page); | ||||
|   } | ||||
|  | ||||
|   _requestPermission() { | ||||
|     Permissions.request("location").then(response => { | ||||
|       | ||||
|       if ( | ||||
|         response == "allow" || | ||||
|         response == "restricted" || | ||||
|         response == "authorized" | ||||
|       ) { | ||||
|         navigator.geolocation.getCurrentPosition( | ||||
|           position => { | ||||
|             this.userStore.userLocation = position; | ||||
|             console.log(position); | ||||
|           //  self.navigatieAction("LocationRequest"); | ||||
|           }, | ||||
|           error => { | ||||
|             console.log(error); | ||||
|           //  self.navigatieAction("LocationRequest"); | ||||
|           }, | ||||
|           { enableHighAccuracy: false, timeout: 4000, maximumAge: 10000 } | ||||
|         ); | ||||
|       } else { | ||||
|       //  self.navigatieAction("LocationRequest"); | ||||
|       } | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   onClickAction(data, details) { | ||||
|     this.map.animateToRegion({ | ||||
|       latitude: details.geometry.location.lat, | ||||
|       longitude: details.geometry.location.lng, | ||||
|       latitudeDelta: 0.02, | ||||
|       longitudeDelta: 0.02 | ||||
|     }); | ||||
|  | ||||
|     for (var i = 0; i < this.userStore.perdefinedPlaces.length; i++) { | ||||
|       if ( | ||||
|         this.userStore.perdefinedPlaces[i].geometry.location.lat == | ||||
|           details.geometry.location.lat && | ||||
|         this.userStore.perdefinedPlaces[i].geometry.location.lng == | ||||
|           details.geometry.location.lng | ||||
|       ) { | ||||
|         this.markerId = this.userStore.perdefinedPlaces[i].id | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     console.log(details); | ||||
|   } | ||||
|  | ||||
|   googlePlacesAutoComplete() { | ||||
|     return ( | ||||
|       <View | ||||
|  | ||||
|         style={{ | ||||
|           position: "absolute", | ||||
|           top: 0, | ||||
|           backgroundColor: theme.mainColor, | ||||
|           ...ifIphoneX( | ||||
|             { | ||||
|               //height:'10%' | ||||
|             },{ | ||||
|  | ||||
|             } | ||||
|           ) | ||||
|         }} | ||||
|       > | ||||
|         | ||||
|           <GooglePlacesAutocomplete | ||||
|             placeholder={this.userStore.text.googleSearch} | ||||
|             placeholderTextColor="white" | ||||
|             minLength={1} // minimum length of text to search | ||||
|             autoFocus={false} | ||||
|             returnKeyType={"search"} // Can be left out for default return key https://facebook.github.io/react-native/docs/textinput.html#returnkeytype | ||||
|             listViewDisplayed="false" // true/false/undefined | ||||
|             fetchDetails={true} | ||||
|             renderDescription={row => row.description} // custom description render | ||||
|             onPress={(data, details = null) => { | ||||
|               this.onClickAction(data, details); | ||||
|             }} | ||||
|             getDefaultValue={() => ""} | ||||
|             query={{ | ||||
|               // available options: https://developers.google.com/places/web-service/autocomplete | ||||
|               key: GOOGLE_MAPS_APIKEY, | ||||
|               language: "zh-TW||en", // language of the results | ||||
|               types: ["(cities)", "(country)"], | ||||
|               components: "country:hk" // default: 'geocode' | ||||
|             }} | ||||
|             styles={{ | ||||
|               textInputContainer: { | ||||
|                 backgroundColor: theme.mainColor, | ||||
|                 borderTopWidth: 0, | ||||
|                 borderBottomWidth: 0, | ||||
|                 width: width, | ||||
|                 paddingRight: 20, | ||||
|                 paddingLeft: 20, | ||||
|                 marginBottom: 10 | ||||
|               }, | ||||
|               textInput: { | ||||
|                 textAlign: "center", | ||||
|                 height: verticalScale(40), | ||||
|                 color: "white", | ||||
|                 fontSize: 16, | ||||
|                 borderWidth: 0, | ||||
|                 backgroundColor: theme.searchMapInputColor, | ||||
|                 fontFamily: Fonts.century, | ||||
|                 fontWeight: "bold" | ||||
|               }, | ||||
|               description: { | ||||
|                 fontWeight: "bold" | ||||
|               }, | ||||
|               listView: { | ||||
|                 backgroundColor: "white" | ||||
|               }, | ||||
|               predefinedPlacesDescription: { | ||||
|                 color: "#1faadb", | ||||
|               } | ||||
|             }} | ||||
|             currentLocation={false} // Will add a 'Current location' button at the top of the predefined places list | ||||
|             currentLocationLabel="Current location" | ||||
|             nearbyPlacesAPI="GooglePlacesSearch" // Which API to use: GoogleReverseGeocoding or GooglePlacesSearch | ||||
|             GoogleReverseGeocodingQuery={ | ||||
|               { | ||||
|                 // available options for GoogleReverseGeocoding API : https://developers.google.com/maps/documentation/geocoding/intro | ||||
|               } | ||||
|             } | ||||
|             GooglePlacesSearchQuery={{ | ||||
|               // available options for GooglePlacesSearch API : https://developers.google.com/places/web-service/search | ||||
|               rankby: "distance", | ||||
|               types: "food" | ||||
|             }} | ||||
|             filterReverseGeocodingByTypes={[ | ||||
|               "locality", | ||||
|               "administrative_area_level_3" | ||||
|             ]} // filter the reverse geocoding results by types - ['locality', 'administrative_area_level_3'] if you want to display only cities | ||||
|             predefinedPlaces={this.userStore.perdefinedPlaces} | ||||
|             debounce={200} // debounce the requests in ms. Set to 0 to remove debounce. By default 0ms. | ||||
|             // renderLeftButton={()  => <Image source={require('path/custom/left-icon')} />} | ||||
|             //renderRightButton={() => <Text>Custom text </Text>} | ||||
|           /> | ||||
|     | ||||
|       </View> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   getIndex(id) { | ||||
|     var index = this.userStore.pickupPointLabel.findIndex(function(item, i) { | ||||
|       return item.id == parseInt(id); | ||||
|     }); | ||||
|  | ||||
|     return index; | ||||
|   } | ||||
|  | ||||
|   getUserLocation() { | ||||
|     navigator.geolocation.getCurrentPosition( | ||||
|       position => { | ||||
|         this.userStore.userLocation = position; | ||||
|       }, | ||||
|       error => { | ||||
|         console.log(error); | ||||
|       }, | ||||
|       { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 } | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   componentWillMount() { | ||||
|     const { navigation } = this.props; | ||||
|     this.title = navigation.getParam("title", "Location"); | ||||
|     this.pickUpPointLoaction = navigation.getParam("location", { | ||||
|       latitude: 0, | ||||
|       longitude: 0 | ||||
|     }); | ||||
|     this.setUserLocation(); | ||||
|     this.userStore.pickupLoactionPoint.data.content.forEach(element => { | ||||
|       var place = { | ||||
|         description: element.name, | ||||
|         geometry: { location: { lat: element.lat, lng: element.lng } } | ||||
|       }; | ||||
|       this.perdefinedPlaces.push(place); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   setUserLocation() { | ||||
|     console.log(this.userStore.userLocation); | ||||
|     if (this.userStore.userLocation === null) { | ||||
|       this.setState({ | ||||
|         region: { | ||||
|           latitude: 22.396427, | ||||
|           longitude: 114.109497, | ||||
|           latitudeDelta: 1, | ||||
|           longitudeDelta: 1 | ||||
|         } | ||||
|       }); | ||||
|     } else { | ||||
|       this.setState({ | ||||
|         region: { | ||||
|           latitude: this.userStore.userLocation.coords.latitude, | ||||
|           longitude: this.userStore.userLocation.coords.longitude, | ||||
|  | ||||
|           latitudeDelta: 0.02, | ||||
|           longitudeDelta: 0.02 | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   clickMarkerAction(id) { | ||||
|     this.markerId = id; | ||||
|   } | ||||
|  | ||||
|   confirmAction() { | ||||
|     Alert.alert( | ||||
|       "", | ||||
|       "Select " + | ||||
|         this.userStore.pickupPointLabel[this.getIndex(this.markerId)].value + | ||||
|         "?", | ||||
|       [ | ||||
|         { text: "Cancel", onPress: () => console.log("Cancel") }, | ||||
|         { text: "Yes", onPress: () => this.picked(this.markerId) } | ||||
|       ] | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   picked(id) { | ||||
|     if(this.markerId != null){ | ||||
|     asyncStorageHelper.saveData("pickupPointId", id); | ||||
|     this.userStore.pickupPointId = id; | ||||
|     this.store.pickupPointId = id; | ||||
|     log.firebaseLog("select_pickuppoint_first_time_start_app",{pickuppointid:id}) | ||||
|     this.store.getMenuItem(this); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   searchClear() {} | ||||
|  | ||||
|   searchChangeText() {} | ||||
|  | ||||
|   confirmButton() { | ||||
|     if (!this.markerId) { | ||||
|       return null; | ||||
|     } else { | ||||
|       return ( | ||||
|         <TouchableOpacity | ||||
|           style={{ | ||||
|             height: verticalScale(60), | ||||
|             width: width, | ||||
|             backgroundColor: theme.mainColor, | ||||
|             alignItems: "center", | ||||
|             justifyContent: "center" | ||||
|           }} | ||||
|           onPress={() => this.confirmAction()} | ||||
|         > | ||||
|           <Text style={{ color: "white", fontWeight: "bold" }}>confirm</Text> | ||||
|         </TouchableOpacity> | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     return ( | ||||
|       <SafeAreaView style={{ flex: 1, backgroundColor: theme.mainColor }}> | ||||
|         <MyStatusBar | ||||
|           backgroundColor={theme.mainColor} | ||||
|           barStyle="light-content" | ||||
|         /> | ||||
|         <View style={styles.container}> | ||||
|           <MapView | ||||
|             ref={ref => { | ||||
|               this.map = ref; | ||||
|             }} | ||||
|             style={{ width: width, flex: 1 }} | ||||
|             showsUserLocation={true} | ||||
|             initialRegion={this.state.region} | ||||
|           > | ||||
|             {this.userStore.pickupPointLabel.map(marker => ( | ||||
|               <MapView.Marker | ||||
|                 coordinate={{ latitude: marker.lat, longitude: marker.lng }} | ||||
|                 title={marker.name} | ||||
|                 onPress={() => this.clickMarkerAction(marker.id)} | ||||
|               > | ||||
|       <Image | ||||
|                 resizeMode={"contain"} | ||||
|                 source={require("../../images/maplocator.png")} | ||||
|                 style={{ width: scale(50), height: scale(50) }} | ||||
|               />  | ||||
|               </MapView.Marker> | ||||
|             ))} | ||||
|           </MapView> | ||||
|  | ||||
|           {this.confirmButton()} | ||||
|           {this.googlePlacesAutoComplete()} | ||||
|         </View> | ||||
|       </SafeAreaView> | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| const styles = StyleSheet.create({ | ||||
|   container: { | ||||
|     flex: 1, | ||||
|     alignItems: "center", | ||||
|     backgroundColor: "#F5FCFF" | ||||
|   }, | ||||
|   welcome: { | ||||
|     fontSize: 20, | ||||
|     textAlign: "center", | ||||
|     margin: 10 | ||||
|   }, | ||||
|   instructions: { | ||||
|     textAlign: "center", | ||||
|     color: "#333333", | ||||
|     marginBottom: 5 | ||||
|   } | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user