diff options
Diffstat (limited to 'mobile')
| -rw-r--r-- | mobile/App.js | 3 | ||||
| -rw-r--r-- | mobile/components/GreetingPage.js | 58 | ||||
| -rw-r--r-- | mobile/screens/Form1.js | 3 | ||||
| -rw-r--r-- | mobile/screens/MapPage.js | 121 |
4 files changed, 158 insertions, 27 deletions
diff --git a/mobile/App.js b/mobile/App.js index f36b696..703c6eb 100644 --- a/mobile/App.js +++ b/mobile/App.js @@ -5,9 +5,10 @@ import { createStackNavigator, createAppContainer } from 'react-navigation'; import GreetingPage from './components/GreetingPage'; import FormPage from './screens/Form1'; +import MapPage from './screens/MapPage'; -const RootStack = createStackNavigator( {GreetingPage: GreetingPage, FormPage: FormPage,}, +const RootStack = createStackNavigator( {GreetingPage: GreetingPage, FormPage: FormPage, MapPage: MapPage}, {headerMode: 'none'}) const App = createAppContainer(RootStack) diff --git a/mobile/components/GreetingPage.js b/mobile/components/GreetingPage.js index 0bc61cf..0bfa63b 100644 --- a/mobile/components/GreetingPage.js +++ b/mobile/components/GreetingPage.js @@ -6,28 +6,31 @@ import { Location, Permissions, Constants } from 'expo'; export default class GreetingPage extends Component { state = { - isLoading: true, + isLoading: false, errorMessage: null, locationResult: null, }; - // runs as soon as page is loaded - componentDidMount() { - // immediately attempt to get the location - this._getLocationAsync(); - } - - _getLocationAsync = async () => { + moveToFormPage = async () => { + this.setState({isLoading: true}); // ask location services to allow location access to THIS app. // Note: location services itself must still be enabled for this! const {status} = await Permissions.askAsync(Permissions.LOCATION); if (status === 'granted') { // try to actually get the location asynchronously - a Promise Location.getCurrentPositionAsync({enableHighAccuracy: true}).then((position) => { - this.setState({locationResult: position.coords}); + this.setState({locationResult: position.coords}, () => { + this.props.navigation.navigate('FormPage', + {coordinates : [ + this.state.locationResult.longitude, + this.state.locationResult.latitude] + }); + }); // since we are guaranteed to have the location here, its safe to load the full view this.setState({isLoading: false}); + // move to form page }).catch((e) => { + this.setState({isLoading: false}); alert(e + ' Please make sure your location (GPS) is turned on.'); }); @@ -37,13 +40,13 @@ export default class GreetingPage extends Component { } }; - moveToFormPage = () => { - this.props.navigation.navigate('FormPage', - {coordinates : [ - this.state.locationResult.longitude, - this.state.locationResult.latitude] - }); - }; + moveToMapPage = () => { + this.props.navigation.navigate('MapPage'); + } + + moveToMapPage = () => { + this.props.navigation.navigate('MapPage'); + } render() { @@ -84,13 +87,13 @@ export default class GreetingPage extends Component { <View style={styles.press_button}> - <View> + <View padding={15}> <Text style={styles.current_location_title}> Use Current Location </Text> </View> - <View marginTop = {20}> + <View marginTop = {5}> <Ionicons name="md-locate" size={40} color="white"/> </View> @@ -98,16 +101,18 @@ export default class GreetingPage extends Component { </TouchableHighlight> - <TouchableHighlight disabled style={styles.second_button_container}> + <TouchableHighlight + style={styles.second_button_container} + onPress={() => { this.moveToMapPage() }}> <View style={styles.press_button}> - <View> + <View padding={15}> <Text style={styles.current_location_title}> Drop Pin </Text> </View> - <View marginTop = {20}> + <View> <Ionicons name="md-pin" size={40} color="white"/> </View> @@ -149,7 +154,6 @@ const styles = StyleSheet.create( { }, current_location_title: { color: '#FFF', - marginTop: 15, textAlign: 'center', opacity: 0.9, fontSize: 20 @@ -164,12 +168,16 @@ const styles = StyleSheet.create( { alignItems: 'stretch' }, press_button: { - flexDirection: 'column', - justifyContent: 'center', + flexDirection: 'row', + justifyContent: 'space-between', + // padding:5, alignItems: 'center' }, second_button_container: { flex: 1, - backgroundColor: '#535c68' + backgroundColor: '#535c68', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'stretch' } }) diff --git a/mobile/screens/Form1.js b/mobile/screens/Form1.js index a14d647..de538d7 100644 --- a/mobile/screens/Form1.js +++ b/mobile/screens/Form1.js @@ -101,7 +101,8 @@ export default class Form1 extends Component { race : values.race, longhair : values.longhair, longbeard : values.longbeard, - extra : (values.extra) ? values.extra : "" + extra : (values.extra) ? values.extra : "", + status : "new" }), }); //// TODO: handle the response from the serve and decide what to display diff --git a/mobile/screens/MapPage.js b/mobile/screens/MapPage.js new file mode 100644 index 0000000..f8e2a79 --- /dev/null +++ b/mobile/screens/MapPage.js @@ -0,0 +1,121 @@ +import React, { Component } from 'react'; +import { Text, View, Alert, StyleSheet, Button, AppRegistry, Navigator, TouchableHighlight, Platform} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { createStackNavigator, createAppContainer } from 'react-navigation'; +import { Location, Permissions, Constants } from 'expo'; +import {MapView} from 'expo'; + +// press location on map +// on press, drop pin at location +// press proceed to redirect to the formpage + + +// default initial map region is Toronto + +export default class Form1 extends Component { + + constructor(props) { + super(props); + this.state = { + initial_region_coordinates: [-79.3832, 43.6532], + markers: [], + canProceed: false, + } + } + + addMarker(e) { + this.setState( + { markers : [{ latlng: e.nativeEvent.coordinate}], canProceed: true} + ); + } + deleteMarker() { + this.setState( + { markers : [], canProceed: false} + ); + } + moveToFormPage = () => { + if(this.state.canProceed === false) { + alert("Please press on the map to drop a pin"); + return; + } + this.props.navigation.navigate('FormPage', + {coordinates : [ + this.state.markers[0].latlng.longitude, + this.state.markers[0].latlng.latitude] + }); + }; + moveToGreetingPage = () => { + this.props.navigation.navigate('GreetingPage'); + } + + render() { + return ( + <View style={{flex:1,}}> + <View style={{flex:3}}> + <MapView + style={{ flex: 1 }} + initialRegion={{ + latitude: this.state.initial_region_coordinates[1], + longitude: this.state.initial_region_coordinates[0], + latitudeDelta: 0.0922, + longitudeDelta: 0.0421, + }} + onPress={this.addMarker.bind(this)} + > + + { + this.state.markers.map((marker, i) => (<MapView.Marker key={i} coordinate={marker.latlng} + onPress={(e) => {e.stopPropagation(); this.deleteMarker(i)}} />)) + } + </MapView> + </View> + + <TouchableHighlight + style={styles.first_button_container} + onPress={() => { this.moveToFormPage() }}> + <Text style={styles.proceed_title}> + Proceed + </Text> + </TouchableHighlight> + <TouchableHighlight + style={styles.second_button_container} + onPress={() => { this.moveToGreetingPage() }}> + <Text style={styles.proceed_title}> + Back + </Text> + </TouchableHighlight> + </View> + ); + } + +} +const styles = StyleSheet.create( { + first_button_container: { + width: '100%', + flex: 1, + position: 'absolute', + bottom:60, + backgroundColor: '#c0392b', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'stretch' + }, + second_button_container: { + width: '100%', + flex: 1, + position: 'absolute', + bottom:0, + backgroundColor: '#535c68', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'stretch' + }, + proceed_title: { + color: '#FFF', + marginTop: 15, + marginBottom: 35, + textAlign: 'center', + opacity: 0.9, + fontSize: 20 + } +})
\ No newline at end of file |
