ソースを参照

Merge branch 'dare-update' of SashaGoncharov19/nomadmania-app into dev

Viktoriia 1 年間 前
コミット
fe0fa59a16

+ 66 - 0
src/database/geojsonService/index.ts

@@ -0,0 +1,66 @@
+import * as FileSystem from 'expo-file-system';
+import { Asset } from 'expo-asset';
+import { API_HOST } from 'src/constants';
+import axios from 'axios';
+
+const jsonFileName = 'mqp.json';
+const jsonFileUri = `${FileSystem.documentDirectory}${jsonFileName}`;
+
+let jsonData: any = null;
+
+const fetchLocalJsonData = async () => {
+  try {
+    const fileInfo = await FileSystem.getInfoAsync(jsonFileUri);
+    if (fileInfo.exists) {
+      const json = await FileSystem.readAsStringAsync(jsonFileUri);
+      return JSON.parse(json);
+    } else {
+      const asset = Asset.fromModule(require('../../../assets/geojson/mqp.json'));
+      await asset.downloadAsync();
+      const json = await FileSystem.readAsStringAsync(asset?.localUri as string);
+      return JSON.parse(json);
+    }
+  } catch (error) {
+    console.error('Failed to load local JSON data:', error);
+    return null;
+  }
+};
+
+const saveJsonDataToLocal = async (data: any) => {
+  try {
+    await FileSystem.writeAsStringAsync(jsonFileUri, JSON.stringify(data));
+  } catch (error) {
+    console.error('Failed to save JSON data to local storage:', error);
+  }
+};
+
+export const fetchJsonData = async () => {
+  if (jsonData) {
+    return jsonData;
+  }
+
+  try {
+    const response = await axios.get(`${API_HOST}/static/json/mqp.geojson`);
+    if (response.status !== 200) {
+      throw new Error('Network response error');
+    }
+    jsonData = response.data;
+    await saveJsonDataToLocal(jsonData);
+  } catch (error) {
+    console.error('Failed to fetch JSON data from server:', error);
+    jsonData = await fetchLocalJsonData();
+  }
+
+  return jsonData;
+};
+
+export const refreshJsonData = async () => {
+  jsonData = null;
+  return await fetchJsonData();
+};
+
+(async () => {
+  jsonData = await fetchJsonData();
+})();
+
+export default jsonData;

+ 2 - 0
src/database/index.ts

@@ -10,6 +10,7 @@ import { fetchAndSaveStatistics } from './statisticsService';
 import { saveTriumphsData } from './triumphsService';
 import { saveSeriesRankingData } from './seriesRankingService';
 import { updateDarePlacesDb, updateNmRegionsDb } from 'src/db';
+import { refreshJsonData } from './geojsonService';
 
 const db = SQLite.openDatabase('nomadManiaDb.db');
 const lastUpdateDate = storage.get('lastUpdateDate', StoreType.STRING) as string || '1990-01-01';
@@ -44,6 +45,7 @@ export const syncDataWithServer = async (): Promise<void> => {
   if (isConnected) {
     console.log('Syncing data with server...');
     processSyncQueue();
+    await refreshJsonData();
     await updateMasterRanking();
     await downloadFlags();
     await updateAvatars(lastUpdateDate);

+ 15 - 3
src/screens/InAppScreens/MapScreen/index.tsx

@@ -13,7 +13,7 @@ import LocationIcon from '../../../../assets/icons/location.svg';
 import CloseSvg from '../../../../assets/icons/close.svg';
 
 import regions from '../../../../assets/geojson/nm2022.json';
-import dareRegions from '../../../../assets/geojson/mqp.json';
+import jsonData, { fetchJsonData } from '../../../database/geojsonService';
 
 import { getFirstDatabase, getSecondDatabase, refreshDatabases } from '../../../db';
 import { LocationPopup, WarningModal, EditNmModal } from '../../../components';
@@ -50,6 +50,7 @@ const localDareDir = `${FileSystem.cacheDirectory}tiles/regions_mqp`;
 const AnimatedMarker = Animated.createAnimatedComponent(Marker);
 
 const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
+  const [dareData, setDareData] = useState(jsonData);
   const tilesBaseURL = `${FASTEST_MAP_HOST}/tiles_osm`;
   const gridUrl = `${FASTEST_MAP_HOST}/tiles_nm/grid`;
   const dareTiles = `${FASTEST_MAP_HOST}/tiles_nm/regions_mqp`;
@@ -91,6 +92,17 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
     years: [],
     id: null
   });
+  
+  useEffect(() => {
+    if (!dareData) {
+      const fetchData = async () => {
+        const fetchedData = await fetchJsonData();
+        setDareData(fetchedData);
+      };
+
+      fetchData();
+    }
+  }, [dareData]);
 
   const handleModalStateChange = (updates: { [key: string]: any }) => {
     setModalState((prevState) => ({ ...prevState, ...updates }));
@@ -216,7 +228,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
     }
     const thisToken = ++currentTokenRef.current;
 
-    if (!regions || !dareRegions) return;
+    if (!regions || !dareData) return;
 
     if (currentZoom < 7) {
       setMarkers([]);
@@ -315,7 +327,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation }) => {
     let db = getSecondDatabase();
     let tableName = 'places';
 
-    let foundRegion = findRegionInDataset(dareRegions, point);
+    let foundRegion = findRegionInDataset(dareData, point);
 
     if (!foundRegion) {
       foundRegion = findRegionInDataset(regions, point);