diff options
Diffstat (limited to 'src/Components/Map.tsx')
-rw-r--r-- | src/Components/Map.tsx | 121 |
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 |