Viktoriia 9 月之前
父节点
当前提交
b9615b754b

+ 3 - 1
app.config.ts

@@ -68,7 +68,9 @@ export default ({ config }: ConfigContext): ExpoConfig => ({
       NSPhotoLibraryAddUsageDescription:
         'Enable NomadMania.com to access your photo library to upload your profile picture. Any violence, excess of nudity, stolen picture, or scam is forbidden',
       NSPushNotificationsDescription:
-        'This will allow NomadMania.com to send you notifications. Also you can disable it in app settings'
+        'This will allow NomadMania.com to send you notifications. Also you can disable it in app settings',
+      NSLocationWhenInUseUsageDescription:
+        'NomadMania app needs access to your location to show relevant data.',
     },
     privacyManifests: {
       NSPrivacyAccessedAPITypes: [

+ 17 - 6
src/db/index.ts

@@ -113,17 +113,28 @@ export async function refreshDatabases() {
   }
 }
 
-export function getFirstDatabase() {
+export const loadDatabases = async () => {
+  if (!db1 || !db2 || !db3) {
+    await openDatabases();
+  }
+
+  return { db1, db2, db3 };
+};
+
+export const getFirstDatabase = async () => {
+  const { db1 } = await loadDatabases();
   return db1;
-}
+};
 
-export function getSecondDatabase() {
+export const getSecondDatabase = async () => {
+  const { db2 } = await loadDatabases();
   return db2;
-}
+};
 
-export function getCountriesDatabase() {
+export const getCountriesDatabase = async () => {
+  const { db3 } = await loadDatabases();
   return db3;
-}
+};
 
 const openDatabase = (dbName: string) => SQLite.openDatabase(dbName);
 

+ 25 - 7
src/screens/InAppScreens/MapScreen/index.tsx

@@ -66,6 +66,7 @@ import { useFocusEffect } from '@react-navigation/native';
 import { openstreetmapUrl } from 'src/constants/constants';
 import { fetchCountryUserData } from '@api/countries';
 import EditModal from '../TravelsScreen/Components/EditSlowModal';
+import { SQLiteDatabase } from 'expo-sqlite/legacy';
 
 const localTileDir = `${FileSystem.cacheDirectory}tiles/background`;
 const localGridDir = `${FileSystem.cacheDirectory}tiles/grid`;
@@ -149,6 +150,23 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
   const [userInfoData, setUserInfoData] = useState<any>(null);
 
   const [initialRegion, setInitialRegion] = useState(INITIAL_REGION);
+  const [db1, setDb1] = useState<SQLiteDatabase | null>(null);
+  const [db2, setDb2] = useState<SQLiteDatabase | null>(null);
+  const [db3, setDb3] = useState<SQLiteDatabase | null>(null);
+
+  useEffect(() => {
+    const loadDatabases = async () => {
+      const firstDb = await getFirstDatabase();
+      const secondDb = await getSecondDatabase();
+      const countriesDb = await getCountriesDatabase();
+
+      setDb1(firstDb);
+      setDb2(secondDb);
+      setDb3(countriesDb);
+    };
+
+    loadDatabases();
+  }, []);
 
   useFocusEffect(
     useCallback(() => {
@@ -440,7 +458,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
     const { latitude, longitude } = event.nativeEvent.coordinate;
     const point = turf.point([longitude, latitude]);
 
-    let db = getSecondDatabase();
+    let db = db2;
     let tableName = 'places';
     let foundRegion: any;
 
@@ -448,7 +466,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
 
     if (type === 1) {
       foundRegion = regions ? findRegionInDataset(regions, point) : null;
-      db = getFirstDatabase();
+      db = db1;
       tableName = 'regions';
 
       if (foundRegion) {
@@ -461,7 +479,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
           setMarkers([]);
           setProcessedMarkers([]);
 
-          db = getCountriesDatabase();
+          db = db3;
           tableName = 'countries';
 
           await getData(db, countryId, tableName, handleRegionData)
@@ -495,7 +513,7 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
 
     if (!foundRegion) {
       foundRegion = regions ? findRegionInDataset(regions, point) : null;
-      db = getFirstDatabase();
+      db = db1;
       tableName = 'regions';
     }
 
@@ -575,10 +593,10 @@ const MapScreen: React.FC<MapScreenProps> = ({ navigation, route }) => {
     cancelTokenRef.current = true;
     const db =
       type === 'regions'
-        ? getFirstDatabase()
+        ? db1
         : type === 'countries'
-          ? getCountriesDatabase()
-          : getSecondDatabase();
+          ? db3
+          : db2;
 
     if (type === 'countries') {
       setSelectedRegion(null);

+ 19 - 2
src/screens/InAppScreens/TravelsScreen/utils/useRegionData.ts

@@ -3,15 +3,32 @@ import { useState, useEffect } from 'react';
 import { getFirstDatabase, getSecondDatabase, refreshDatabases } from 'src/db';
 import { getData } from 'src/modules/map/regionData';
 import { DbRegion } from './types';
+import { SQLiteDatabase } from 'expo-sqlite/legacy';
 
 const useRegionData = (regionId: number, dare: boolean = false) => {
   const [regionData, setRegionData] = useState<DbRegion | null>(null);
   const [avatars, setAvatars] = useState<string[] | null>(null);
+  const [db1, setDb1] = useState<SQLiteDatabase | null>(null);
+  const [db2, setDb2] = useState<SQLiteDatabase | null>(null);
+
+  useEffect(() => {
+    const loadDatabases = async () => {
+      const firstDb = await getFirstDatabase();
+      const secondDb = await getSecondDatabase();
+
+      setDb1(firstDb);
+      setDb2(secondDb);
+    };
+
+    loadDatabases();
+  }, []);
 
   useEffect(() => {
     const fetchRegionData = async () => {
-      const db = dare ? getSecondDatabase() : getFirstDatabase();
+      const db = dare ? db2 : db1;
       const tableName = dare ? 'places' : 'regions';
+      if (!db) return;
+      
       try {
         await getData(db, regionId, tableName, (data, avatars) => {
           setRegionData(data);
@@ -24,7 +41,7 @@ const useRegionData = (regionId: number, dare: boolean = false) => {
     };
 
     fetchRegionData();
-  }, [regionId]);
+  }, [regionId, db1, db2]);
 
   return { regionData, avatars };
 };