summaryrefslogtreecommitdiff
path: root/src/Components/Map.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Components/Map.tsx')
-rw-r--r--src/Components/Map.tsx121
1 files changed, 39 insertions, 82 deletions
diff --git a/src/Components/Map.tsx b/src/Components/Map.tsx
index 3e878f8..68698f4 100644
--- a/src/Components/Map.tsx
+++ b/src/Components/Map.tsx
@@ -20,67 +20,64 @@ const draggableRange = {
type Props = any
type State = any
class Map extends Component<Props, State> {
- refresh: number | undefined
+ static navigationOptions = ({ navigation }) => {
+ return {
+ title: 'Карта',
+ };
+ };
+ refreshTimer: number | undefined
map!: MapView;
constructor(props: Props) {
super(props)
this.state = {
user: undefined,
- followUser: true,
- zoom: 15,
region: null,
- loading: false,
- objects: { links: {}, fields: {}, portals: {}, loaded: false },
}
}
+ componentDidMount() {
+ this.refreshTimer = setInterval(() => {
+ this.refresh()
+ }, 30000)
+ }
+ componentWillUnmount() {
+ clearInterval(this.refreshTimer)
+ }
componentWillMount() {
+ const setPosition = (position) => {
+ this.setState({
+ user: {
+ latitude: position.coords.latitude,
+ longitude: position.coords.longitude
+ },
+ });
+ }
navigator.geolocation.getCurrentPosition(
- position => {
- this.setState({
- followUser: true,
- });
- },
+ setPosition,
error => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
);
navigator.geolocation.watchPosition(
- position => {
- this.setState({
- user: {
- latitude: position.coords.latitude,
- longitude: position.coords.longitude
- },
- });
- },
+ setPosition,
error => alert(error.message),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
)
}
onRegionChange = (region: Region) => {
- const zoom = this.getZoomByRegion(width, region)
- this.setState({ region, zoom })
+ this.setState({ region })
setImmediate(() => this.load(false))
}
- getZoomByRegion(width: number, region: Region): number {
- return Math.ceil(Math.log2(360 * ((width / 256) / region.longitudeDelta))) + 1
+
+ refresh = () => {
+ setImmediate(() => this.load(true))
}
+
load = async (refresh: boolean) => {
- if (this.state.region != null && this.props.entities.loading == 0) {
+ if (this.state.region != null) {
this.props.actions.update(this.state.region, width, refresh)
}
return null
}
- refreshByTime = () => {
- setTimeout(() => {
- this.load(true).then(this.refreshByTime)
- }, 30000)
- }
-
- componentDidMount() {
- this.refreshByTime()
- }
-
onPortalClick = (guid: string, coords: LatLng) => {
this.setState({ selectedPortal: { guid, coords } })
}
@@ -93,23 +90,15 @@ class Map extends Component<Props, State> {
this.props.navigation.dispatch(navigateAction);
}
+ goToMe = () => {
+ this.map.animateToCoordinate(this.state.user)
+ }
+
render() {
if (!this.state.user) {
return <View style={styles.spinnerContainer}><ActivityIndicator size={'large'} /></View>
}
- const camera = {
- center: this.state.user,
- altitude: 1000,
- heading: 0,
- pitch: 30,
- zoom: 15,
- }
- const goToMe = () => {
- this.map.animateToCoordinate(this.state.user)
- }
- const refresh = () => {
- setImmediate(() => this.load(true))
- }
+
return (
<>
<MapView
@@ -124,13 +113,13 @@ class Map extends Component<Props, State> {
loadingEnabled
type={'hybrid'}
>
- <MapObjects onPortalClick={this.onPortalClick} zoom={this.state.zoom} />
+ <MapObjects onPortalClick={this.onPortalClick} />
{this.state.selectedPortal && <Marker coordinate={this.state.selectedPortal.coords} />}
</MapView>
<MapOverlay
- goToMe={goToMe}
- refresh={refresh}
- loading={this.props.entities.loading}
+ goToMe={this.goToMe}
+ refresh={this.refresh}
+ loading={this.props.entities.loadQueue.length}
selectedPortal={this.state.selectedPortal}
onOpenPortal={this.onOpenPortal}
/>
@@ -143,38 +132,6 @@ const styles = StyleSheet.create({
container: {
flex: 1,
},
- spinnerContainer: {
- flex: 1,
- justifyContent: 'center',
- alignItems: 'center',
- },
- panel: {
- flex: 1,
- backgroundColor: '#fff',
- position: 'relative',
- borderTopLeftRadius: 20,
- borderTopRightRadius: 20,
- //ios
- shadowOpacity: 0.3,
- shadowRadius: 3,
- shadowOffset: {
- height: 0,
- width: 0
- },
- //android
- elevation: 1
- },
- panelHeader: {
- height: 40,
- alignItems: 'center',
- justifyContent: 'center',
- },
- dash: {
- backgroundColor: 'rgba(200,200,200,0.9)',
- height: 6,
- width: 30,
- borderRadius: 3
- }
});
export default connect({ 'entities': 'entities' }, actions)(Map) \ No newline at end of file