|
@@ -1,11 +1,4 @@
|
|
-import {
|
|
|
|
- View,
|
|
|
|
- Platform,
|
|
|
|
- TouchableOpacity,
|
|
|
|
- Text,
|
|
|
|
- Linking,
|
|
|
|
- Animated,
|
|
|
|
-} from 'react-native';
|
|
|
|
|
|
+import { View, Platform, TouchableOpacity, Text, Linking, Animated } from 'react-native';
|
|
import React, { useEffect, useState, useRef, useMemo } from 'react';
|
|
import React, { useEffect, useState, useRef, useMemo } from 'react';
|
|
import MapView, { UrlTile, Geojson, Marker } from 'react-native-maps';
|
|
import MapView, { UrlTile, Geojson, Marker } from 'react-native-maps';
|
|
import * as turf from '@turf/turf';
|
|
import * as turf from '@turf/turf';
|
|
@@ -22,7 +15,7 @@ import CloseSvg from '../../../../assets/icons/close.svg';
|
|
import regions from '../../../../assets/geojson/nm2022.json';
|
|
import regions from '../../../../assets/geojson/nm2022.json';
|
|
import dareRegions from '../../../../assets/geojson/mqp.json';
|
|
import dareRegions from '../../../../assets/geojson/mqp.json';
|
|
|
|
|
|
-import NetInfo from "@react-native-community/netinfo";
|
|
|
|
|
|
+import NetInfo from '@react-native-community/netinfo';
|
|
import { getFirstDatabase, getSecondDatabase } from '../../../db';
|
|
import { getFirstDatabase, getSecondDatabase } from '../../../db';
|
|
import { RegionPopup, LocationPopup } from '../../../components';
|
|
import { RegionPopup, LocationPopup } from '../../../components';
|
|
|
|
|
|
@@ -49,7 +42,7 @@ import {
|
|
MapScreenProps,
|
|
MapScreenProps,
|
|
FeatureCollection
|
|
FeatureCollection
|
|
} from '../../../types/map';
|
|
} from '../../../types/map';
|
|
-const MAP_HOST ='https://maps.nomadmania.eu';
|
|
|
|
|
|
+const MAP_HOST = 'https://maps.nomadmania.eu';
|
|
|
|
|
|
const tilesBaseURL = `${MAP_HOST}/tiles_osm`;
|
|
const tilesBaseURL = `${MAP_HOST}/tiles_osm`;
|
|
const localTileDir = `${FileSystem.cacheDirectory}tiles`;
|
|
const localTileDir = `${FileSystem.cacheDirectory}tiles`;
|
|
@@ -91,11 +84,11 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
const fetchData = async () => {
|
|
const fetchData = async () => {
|
|
- const fetchedUserId = await storageGet('uid');
|
|
|
|
- const fetchedToken = await storageGet('token');
|
|
|
|
|
|
+ const fetchedUserId = await storageGet('uid');
|
|
|
|
+ const fetchedToken = await storageGet('token');
|
|
|
|
|
|
- setUserId(fetchedUserId);
|
|
|
|
- setToken(fetchedToken);
|
|
|
|
|
|
+ setUserId(fetchedUserId);
|
|
|
|
+ setToken(fetchedToken);
|
|
};
|
|
};
|
|
|
|
|
|
fetchData();
|
|
fetchData();
|
|
@@ -107,13 +100,13 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
Animated.timing(strokeWidthAnim, {
|
|
Animated.timing(strokeWidthAnim, {
|
|
toValue: 3,
|
|
toValue: 3,
|
|
duration: 700,
|
|
duration: 700,
|
|
- useNativeDriver: false,
|
|
|
|
|
|
+ useNativeDriver: false
|
|
}),
|
|
}),
|
|
Animated.timing(strokeWidthAnim, {
|
|
Animated.timing(strokeWidthAnim, {
|
|
toValue: 2,
|
|
toValue: 2,
|
|
duration: 700,
|
|
duration: 700,
|
|
- useNativeDriver: false,
|
|
|
|
- }),
|
|
|
|
|
|
+ useNativeDriver: false
|
|
|
|
+ })
|
|
])
|
|
])
|
|
).start();
|
|
).start();
|
|
}, [strokeWidthAnim]);
|
|
}, [strokeWidthAnim]);
|
|
@@ -125,18 +118,18 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
position: 'absolute',
|
|
position: 'absolute',
|
|
...Platform.select({
|
|
...Platform.select({
|
|
android: {
|
|
android: {
|
|
- height: 58,
|
|
|
|
- },
|
|
|
|
- }),
|
|
|
|
|
|
+ height: 58
|
|
|
|
+ }
|
|
|
|
+ })
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}, [regionPopupVisible, navigation]);
|
|
}, [regionPopupVisible, navigation]);
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
- const unsubscribe = NetInfo.addEventListener(state => {
|
|
|
|
|
|
+ const unsubscribe = NetInfo.addEventListener((state) => {
|
|
setIsConnected(state.isConnected);
|
|
setIsConnected(state.isConnected);
|
|
});
|
|
});
|
|
-
|
|
|
|
|
|
+
|
|
return () => unsubscribe();
|
|
return () => unsubscribe();
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
@@ -149,17 +142,25 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
|
|
|
|
let currentLocation = await Location.getCurrentPositionAsync({});
|
|
let currentLocation = await Location.getCurrentPositionAsync({});
|
|
setLocation(currentLocation.coords);
|
|
setLocation(currentLocation.coords);
|
|
-
|
|
|
|
- mapRef.current?.animateToRegion({
|
|
|
|
- latitude: currentLocation.coords.latitude,
|
|
|
|
- longitude: currentLocation.coords.longitude,
|
|
|
|
- latitudeDelta: 5,
|
|
|
|
- longitudeDelta: 5,
|
|
|
|
- }, 1000);
|
|
|
|
|
|
+
|
|
|
|
+ mapRef.current?.animateToRegion(
|
|
|
|
+ {
|
|
|
|
+ latitude: currentLocation.coords.latitude,
|
|
|
|
+ longitude: currentLocation.coords.longitude,
|
|
|
|
+ latitudeDelta: 5,
|
|
|
|
+ longitudeDelta: 5
|
|
|
|
+ },
|
|
|
|
+ 1000
|
|
|
|
+ );
|
|
})();
|
|
})();
|
|
}, []);
|
|
}, []);
|
|
|
|
|
|
- const findFeaturesInVisibleMapArea = async (visibleMapArea: { latitude?: any; longitude?: any; latitudeDelta: any; longitudeDelta?: any; }) => {
|
|
|
|
|
|
+ const findFeaturesInVisibleMapArea = async (visibleMapArea: {
|
|
|
|
+ latitude?: any;
|
|
|
|
+ longitude?: any;
|
|
|
|
+ latitudeDelta: any;
|
|
|
|
+ longitudeDelta?: any;
|
|
|
|
+ }) => {
|
|
const currentZoom = Math.log2(360 / visibleMapArea.latitudeDelta);
|
|
const currentZoom = Math.log2(360 / visibleMapArea.latitudeDelta);
|
|
|
|
|
|
if (cancelTokenRef.current) {
|
|
if (cancelTokenRef.current) {
|
|
@@ -177,21 +178,23 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
|
|
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
const { latitude, longitude, latitudeDelta, longitudeDelta } = visibleMapArea;
|
|
const { latitude, longitude, latitudeDelta, longitudeDelta } = visibleMapArea;
|
|
const bbox: turf.BBox = [
|
|
const bbox: turf.BBox = [
|
|
longitude - longitudeDelta / 2,
|
|
longitude - longitudeDelta / 2,
|
|
latitude - latitudeDelta / 2,
|
|
latitude - latitudeDelta / 2,
|
|
longitude + longitudeDelta / 2,
|
|
longitude + longitudeDelta / 2,
|
|
- latitude + latitudeDelta / 2,
|
|
|
|
|
|
+ latitude + latitudeDelta / 2
|
|
];
|
|
];
|
|
const visibleAreaPolygon = turf.bboxPolygon(bbox);
|
|
const visibleAreaPolygon = turf.bboxPolygon(bbox);
|
|
const regionsFound = filterCandidates(regions, bbox);
|
|
const regionsFound = filterCandidates(regions, bbox);
|
|
// const daresFound = filterCandidates(dareRegions, bbox);
|
|
// const daresFound = filterCandidates(dareRegions, bbox);
|
|
-
|
|
|
|
- const regionIds = regionsFound.map((region: { properties: { id: any; }; }) => region.properties.id);
|
|
|
|
|
|
+
|
|
|
|
+ const regionIds = regionsFound.map(
|
|
|
|
+ (region: { properties: { id: any } }) => region.properties.id
|
|
|
|
+ );
|
|
const candidatesMarkers = await fetchSeriesData(token, JSON.stringify(regionIds));
|
|
const candidatesMarkers = await fetchSeriesData(token, JSON.stringify(regionIds));
|
|
-
|
|
|
|
|
|
+
|
|
if (thisToken !== currentTokenRef.current) return;
|
|
if (thisToken !== currentTokenRef.current) return;
|
|
|
|
|
|
setSeries(candidatesMarkers.series);
|
|
setSeries(candidatesMarkers.series);
|
|
@@ -208,19 +211,20 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
|
|
|
|
const singleMarkers = markers.filter((feature) => {
|
|
const singleMarkers = markers.filter((feature) => {
|
|
return feature.properties.dbscan !== 'core';
|
|
return feature.properties.dbscan !== 'core';
|
|
- })
|
|
|
|
|
|
+ });
|
|
|
|
|
|
return (
|
|
return (
|
|
<>
|
|
<>
|
|
{singleMarkers.map((marker, idx) => {
|
|
{singleMarkers.map((marker, idx) => {
|
|
- const markerSeries = series?.find(s => s.id === marker.properties.series_id);
|
|
|
|
|
|
+ const markerSeries = series?.find((s) => s.id === marker.properties.series_id);
|
|
const iconUrl = markerSeries ? processIconUrl(markerSeries.icon) : 'default_icon_url';
|
|
const iconUrl = markerSeries ? processIconUrl(markerSeries.icon) : 'default_icon_url';
|
|
|
|
|
|
return <MarkerItem marker={marker} iconUrl={iconUrl} key={idx} />;
|
|
return <MarkerItem marker={marker} iconUrl={iconUrl} key={idx} />;
|
|
})}
|
|
})}
|
|
- {clusters && Object.entries(clusters).map(([clusterId, data], idx) => (
|
|
|
|
- <ClusterItem clusterId={clusterId} data={data} key={idx} />
|
|
|
|
- ))}
|
|
|
|
|
|
+ {clusters &&
|
|
|
|
+ Object.entries(clusters).map(([clusterId, data], idx) => (
|
|
|
|
+ <ClusterItem clusterId={clusterId} data={data} key={idx} />
|
|
|
|
+ ))}
|
|
</>
|
|
</>
|
|
);
|
|
);
|
|
};
|
|
};
|
|
@@ -240,20 +244,23 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
const getLocation = async () => {
|
|
const getLocation = async () => {
|
|
let currentLocation = await Location.getCurrentPositionAsync();
|
|
let currentLocation = await Location.getCurrentPositionAsync();
|
|
setLocation(currentLocation.coords);
|
|
setLocation(currentLocation.coords);
|
|
-
|
|
|
|
- mapRef.current?.animateToRegion({
|
|
|
|
- latitude: currentLocation.coords.latitude,
|
|
|
|
- longitude: currentLocation.coords.longitude,
|
|
|
|
- latitudeDelta: 5,
|
|
|
|
- longitudeDelta: 5,
|
|
|
|
- }, 800);
|
|
|
|
|
|
+
|
|
|
|
+ mapRef.current?.animateToRegion(
|
|
|
|
+ {
|
|
|
|
+ latitude: currentLocation.coords.latitude,
|
|
|
|
+ longitude: currentLocation.coords.longitude,
|
|
|
|
+ latitudeDelta: 5,
|
|
|
|
+ longitudeDelta: 5
|
|
|
|
+ },
|
|
|
|
+ 800
|
|
|
|
+ );
|
|
|
|
|
|
handleClosePopup();
|
|
handleClosePopup();
|
|
};
|
|
};
|
|
|
|
|
|
const handleAcceptPermission = async () => {
|
|
const handleAcceptPermission = async () => {
|
|
setAskLocationVisible(false);
|
|
setAskLocationVisible(false);
|
|
- let { status, canAskAgain } = await Location.requestForegroundPermissionsAsync();
|
|
|
|
|
|
+ let { status, canAskAgain } = await Location.requestForegroundPermissionsAsync();
|
|
|
|
|
|
if (status === 'granted') {
|
|
if (status === 'granted') {
|
|
getLocation();
|
|
getLocation();
|
|
@@ -267,7 +274,9 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
setUserAvatars(avatars);
|
|
setUserAvatars(avatars);
|
|
};
|
|
};
|
|
|
|
|
|
- const handleMapPress = async (event: { nativeEvent: { coordinate: { latitude: any; longitude: any; }; }; }) => {
|
|
|
|
|
|
+ const handleMapPress = async (event: {
|
|
|
|
+ nativeEvent: { coordinate: { latitude: any; longitude: any } };
|
|
|
|
+ }) => {
|
|
cancelTokenRef.current = true;
|
|
cancelTokenRef.current = true;
|
|
const { latitude, longitude } = event.nativeEvent.coordinate;
|
|
const { latitude, longitude } = event.nativeEvent.coordinate;
|
|
const point = turf.point([longitude, latitude]);
|
|
const point = turf.point([longitude, latitude]);
|
|
@@ -289,31 +298,33 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
|
|
|
|
setSelectedRegion({
|
|
setSelectedRegion({
|
|
type: 'FeatureCollection',
|
|
type: 'FeatureCollection',
|
|
- features: [{
|
|
|
|
- geometry: foundRegion.geometry,
|
|
|
|
- properties: {
|
|
|
|
- ...foundRegion.properties,
|
|
|
|
- fill: "rgba(57, 115, 172, 0.2)",
|
|
|
|
- stroke: "#3973AC",
|
|
|
|
- },
|
|
|
|
- type: 'Feature',
|
|
|
|
- }]
|
|
|
|
|
|
+ features: [
|
|
|
|
+ {
|
|
|
|
+ geometry: foundRegion.geometry,
|
|
|
|
+ properties: {
|
|
|
|
+ ...foundRegion.properties,
|
|
|
|
+ fill: 'rgba(57, 115, 172, 0.2)',
|
|
|
|
+ stroke: '#3973AC'
|
|
|
|
+ },
|
|
|
|
+ type: 'Feature'
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
});
|
|
});
|
|
|
|
|
|
await getData(db, id, tableName, handleRegionData)
|
|
await getData(db, id, tableName, handleRegionData)
|
|
- .then(() => {
|
|
|
|
- setRegionPopupVisible(true);
|
|
|
|
- })
|
|
|
|
- .catch(error => {
|
|
|
|
- console.error("Error fetching data", error);
|
|
|
|
- });
|
|
|
|
|
|
+ .then(() => {
|
|
|
|
+ setRegionPopupVisible(true);
|
|
|
|
+ })
|
|
|
|
+ .catch((error) => {
|
|
|
|
+ console.error('Error fetching data', error);
|
|
|
|
+ });
|
|
|
|
|
|
const bounds = turf.bbox(foundRegion);
|
|
const bounds = turf.bbox(foundRegion);
|
|
const region = calculateMapRegion(bounds);
|
|
const region = calculateMapRegion(bounds);
|
|
|
|
|
|
mapRef.current?.animateToRegion(region, 1000);
|
|
mapRef.current?.animateToRegion(region, 1000);
|
|
|
|
|
|
- if(tableName === 'regions') {
|
|
|
|
|
|
+ if (tableName === 'regions') {
|
|
const seriesData = await fetchSeriesData(token, JSON.stringify([id]));
|
|
const seriesData = await fetchSeriesData(token, JSON.stringify([id]));
|
|
setSeries(seriesData.series);
|
|
setSeries(seriesData.series);
|
|
const allMarkers = seriesData.items.map(processMarkerData);
|
|
const allMarkers = seriesData.items.map(processMarkerData);
|
|
@@ -326,12 +337,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
- const renderMapTiles = (
|
|
|
|
- url: string,
|
|
|
|
- cacheDir: string,
|
|
|
|
- zIndex: number,
|
|
|
|
- opacity = 1
|
|
|
|
- ) => (
|
|
|
|
|
|
+ const renderMapTiles = (url: string, cacheDir: string, zIndex: number, opacity = 1) => (
|
|
<UrlTile
|
|
<UrlTile
|
|
urlTemplate={`${url}/{z}/{x}/{y}`}
|
|
urlTemplate={`${url}/{z}/{x}/{y}`}
|
|
maximumZ={15}
|
|
maximumZ={15}
|
|
@@ -349,15 +355,15 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
if (!selectedRegion) return null;
|
|
if (!selectedRegion) return null;
|
|
|
|
|
|
return (
|
|
return (
|
|
- <Geojson
|
|
|
|
- geojson={selectedRegion as any}
|
|
|
|
- fillColor="rgba(57, 115, 172, 0.2)"
|
|
|
|
- strokeColor="#3973ac"
|
|
|
|
- strokeWidth={Platform.OS == 'android' ? 3 : 2}
|
|
|
|
- zIndex={3}
|
|
|
|
- />
|
|
|
|
|
|
+ <Geojson
|
|
|
|
+ geojson={selectedRegion as any}
|
|
|
|
+ fillColor="rgba(57, 115, 172, 0.2)"
|
|
|
|
+ strokeColor="#3973ac"
|
|
|
|
+ strokeWidth={Platform.OS == 'android' ? 3 : 2}
|
|
|
|
+ zIndex={3}
|
|
|
|
+ />
|
|
);
|
|
);
|
|
- };
|
|
|
|
|
|
+ }
|
|
|
|
|
|
const handleClosePopup = async () => {
|
|
const handleClosePopup = async () => {
|
|
cancelTokenRef.current = false;
|
|
cancelTokenRef.current = false;
|
|
@@ -374,7 +380,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
const longitude = (southWest?.longitude ?? 0) + longitudeDelta / 2;
|
|
const longitude = (southWest?.longitude ?? 0) + longitudeDelta / 2;
|
|
|
|
|
|
findFeaturesInVisibleMapArea({ latitude, longitude, latitudeDelta, longitudeDelta });
|
|
findFeaturesInVisibleMapArea({ latitude, longitude, latitudeDelta, longitudeDelta });
|
|
- }
|
|
|
|
|
|
+ };
|
|
|
|
|
|
const renderedGeoJSON = useMemo(() => renderGeoJSON(), [selectedRegion]);
|
|
const renderedGeoJSON = useMemo(() => renderGeoJSON(), [selectedRegion]);
|
|
|
|
|
|
@@ -398,10 +404,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
{userId && renderMapTiles(visitedTiles, localVisitedDir, 2, 0.5)}
|
|
{userId && renderMapTiles(visitedTiles, localVisitedDir, 2, 0.5)}
|
|
{renderMapTiles(dareTiles, localDareDir, 2, 0.5)}
|
|
{renderMapTiles(dareTiles, localDareDir, 2, 0.5)}
|
|
{location && (
|
|
{location && (
|
|
- <AnimatedMarker
|
|
|
|
- coordinate={location}
|
|
|
|
- anchor={{ x: 0.5, y: 0.5 }}
|
|
|
|
- >
|
|
|
|
|
|
+ <AnimatedMarker coordinate={location} anchor={{ x: 0.5, y: 0.5 }}>
|
|
<Animated.View style={[styles.location, { borderWidth: strokeWidthAnim }]} />
|
|
<Animated.View style={[styles.location, { borderWidth: strokeWidthAnim }]} />
|
|
</AnimatedMarker>
|
|
</AnimatedMarker>
|
|
)}
|
|
)}
|
|
@@ -417,35 +420,33 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
<LocationPopup
|
|
<LocationPopup
|
|
visible={openSettingsVisible}
|
|
visible={openSettingsVisible}
|
|
onClose={() => setOpenSettingsVisible(false)}
|
|
onClose={() => setOpenSettingsVisible(false)}
|
|
- onAccept={() => Platform.OS === 'ios' ? Linking.openURL('app-settings:') : Linking.openSettings()}
|
|
|
|
|
|
+ onAccept={() =>
|
|
|
|
+ Platform.OS === 'ios' ? Linking.openURL('app-settings:') : Linking.openSettings()
|
|
|
|
+ }
|
|
modalText="NomadMania app needs location permissions to function properly. Open settings?"
|
|
modalText="NomadMania app needs location permissions to function properly. Open settings?"
|
|
/>
|
|
/>
|
|
|
|
|
|
{regionPopupVisible && regionData ? (
|
|
{regionPopupVisible && regionData ? (
|
|
<>
|
|
<>
|
|
<TouchableOpacity
|
|
<TouchableOpacity
|
|
- style={[ styles.cornerButton, styles.topLeftButton, styles.closeLeftButton ]}
|
|
|
|
|
|
+ style={[styles.cornerButton, styles.topLeftButton, styles.closeLeftButton]}
|
|
onPress={handleClosePopup}
|
|
onPress={handleClosePopup}
|
|
>
|
|
>
|
|
- <CloseSvg
|
|
|
|
- fill="white"
|
|
|
|
- width={13}
|
|
|
|
- height={13}
|
|
|
|
- />
|
|
|
|
|
|
+ <CloseSvg fill="white" width={13} height={13} />
|
|
<Text style={styles.textClose}>Close</Text>
|
|
<Text style={styles.textClose}>Close</Text>
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
|
|
|
|
<TouchableOpacity
|
|
<TouchableOpacity
|
|
onPress={handleGetLocation}
|
|
onPress={handleGetLocation}
|
|
- style={[ styles.cornerButton, styles.topRightButton, styles.bottomButton ]}
|
|
|
|
|
|
+ style={[styles.cornerButton, styles.topRightButton, styles.bottomButton]}
|
|
>
|
|
>
|
|
<LocationIcon />
|
|
<LocationIcon />
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
|
|
|
|
- <RegionPopup
|
|
|
|
|
|
+ <RegionPopup
|
|
region={regionData}
|
|
region={regionData}
|
|
userAvatars={userAvatars}
|
|
userAvatars={userAvatars}
|
|
- onMarkVisited={() => console.log('Mark as visited')}
|
|
|
|
|
|
+ onMarkVisited={() => console.log('Mark as visited')}
|
|
/>
|
|
/>
|
|
</>
|
|
</>
|
|
) : (
|
|
) : (
|
|
@@ -458,7 +459,9 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
<SearchIcon />
|
|
<SearchIcon />
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
|
|
|
|
- <TouchableOpacity style={[styles.cornerButton, styles.bottomButton, styles.bottomLeftButton]}>
|
|
|
|
|
|
+ <TouchableOpacity
|
|
|
|
+ style={[styles.cornerButton, styles.bottomButton, styles.bottomLeftButton]}
|
|
|
|
+ >
|
|
<RadarIcon />
|
|
<RadarIcon />
|
|
</TouchableOpacity>
|
|
</TouchableOpacity>
|
|
|
|
|
|
@@ -472,6 +475,6 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
|
|
)}
|
|
)}
|
|
</View>
|
|
</View>
|
|
);
|
|
);
|
|
-}
|
|
|
|
|
|
+};
|
|
|
|
|
|
export default MapScreen;
|
|
export default MapScreen;
|