Viktoriia 2 minggu lalu
induk
melakukan
1601a60739

+ 1 - 1
app.config.ts

@@ -26,7 +26,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({
   // Should be updated after every production release (deploy to AppStore/PlayMarket)
   version: '2.0.42',
   // Should be updated after every dependency change
-  runtimeVersion: '1.6',
+  runtimeVersion: '1.7',
   orientation: 'portrait',
   icon: './assets/icon.png',
   userInterfaceStyle: 'light',

+ 2 - 1
package.json

@@ -36,6 +36,7 @@
   },
   "dependencies": {
     "@expo/config-plugins": "~10.1.1",
+    "@expo/vector-icons": "^15.0.2",
     "@maplibre/maplibre-react-native": "^10.2.0",
     "@react-native-camera-roll/camera-roll": "^7.10.1",
     "@react-native-clipboard/clipboard": "^1.14.2",
@@ -64,7 +65,7 @@
     "expo-constants": "~17.1.7",
     "expo-dev-client": "~5.2.4",
     "expo-file-system": "~18.1.11",
-    "expo-font": "~13.3.2",
+    "expo-font": "14.0.8",
     "expo-image": "~2.4.0",
     "expo-image-picker": "~16.1.4",
     "expo-location": "~18.1.6",

+ 0 - 13
patches/react-native-tab-view+3.5.2.patch

@@ -1,13 +0,0 @@
-diff --git a/node_modules/react-native-tab-view/src/TabBar.tsx b/node_modules/react-native-tab-view/src/TabBar.tsx
-index e8d0b4c..cd5a424 100644
---- a/node_modules/react-native-tab-view/src/TabBar.tsx
-+++ b/node_modules/react-native-tab-view/src/TabBar.tsx
-@@ -405,6 +405,8 @@ export function TabBar<T extends Route>({
-                 // When we have measured widths for all of the tabs, we should updates the state
-                 // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app
-                 setTabWidths({ ...measuredTabWidths.current });
-+              } else {
-+                setTabWidths({ ...measuredTabWidths?.current });
-               }
-             }
-           : undefined,

+ 13 - 0
patches/react-native-tab-view+4.1.3.patch

@@ -0,0 +1,13 @@
+diff --git a/node_modules/react-native-tab-view/src/TabBar.tsx b/node_modules/react-native-tab-view/src/TabBar.tsx
+index d35c78b..cfe1e2f 100644
+--- a/node_modules/react-native-tab-view/src/TabBar.tsx
++++ b/node_modules/react-native-tab-view/src/TabBar.tsx
+@@ -479,6 +479,8 @@ export function TabBar<T extends Route>({
+               // When we have measured widths for all of the tabs, we should updates the state
+               // We avoid doing separate setState for each layout since it triggers multiple renders and slows down app
+               setTabWidths({ ...measuredTabWidths.current });
++            }else {
++              setTabWidths({ ...measuredTabWidths?.current });
+             }
+           }
+         : undefined;

+ 1 - 1
src/components/HorizontalTabView/index.tsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import { StyleProp, Text, View, ViewStyle } from 'react-native';
+import { StyleProp, Text, View, ViewStyle, TouchableOpacity } from 'react-native';
 import { Route, TabBar, TabView } from 'react-native-tab-view';
 
 import { styles } from './styles';

+ 30 - 47
src/modules/map/regionData.ts

@@ -1,52 +1,35 @@
 import { SQLiteDatabase } from 'expo-sqlite';
 
 export const getData = async (
-  db: SQLiteDatabase | null, 
-  regionId: number, 
-  name: string, 
+  db: SQLiteDatabase | null,
+  regionId: number,
+  name: string,
   callback: (data: any, avatars: string[]) => void
-) => {
-  return new Promise<void>((resolve, reject) => {
-    db?.transaction(tx => {
-      tx.executeSql(
-        `SELECT * FROM ${name} WHERE id = ${regionId};`,
-        [],
-        (_, { rows }) => {
-          const regionData = rows._array[0];
-  
-          const avatarPromises = regionData?.visitors_avatars
-            ? JSON.parse(regionData.visitors_avatars)?.map((avatarId: number) => {
-              return new Promise<string>((resolveAvatar, rejectAvatar) => {
-                tx.executeSql(
-                  `SELECT * FROM avatars WHERE id = ${avatarId};`,
-                  [],
-                  (_, { rows }) => resolveAvatar(rows._array[0].data),
-                  (_, error) => {
-                    console.error('error', error);
-                    rejectAvatar(error);
-                    return false;
-                  }
-                );
-              });
-            })
-            : [];
-  
-          Promise.all(avatarPromises)
-            .then(avatars => {
-              callback(regionData, avatars);
-              resolve();
-            })
-            .catch(error => {
-              console.error('Error processing avatars', error);
-              reject(error);
-            });
-        },
-        (_, error) => {
-          console.error('error', error);
-          reject(error);
-          return false;
-        }
-      );
-    });
-  });
+): Promise<void> => {
+  if (!db) throw new Error('Database is null');
+
+  try {
+    const regionRows = await db.getAllAsync<any>(`SELECT * FROM ${name} WHERE id = ?;`, [regionId]);
+
+    const regionData = regionRows[0] ?? null;
+
+    const avatarIds: number[] = regionData?.visitors_avatars
+      ? JSON.parse(regionData.visitors_avatars)
+      : [];
+
+    const avatars: string[] = [];
+    for (const avatarId of avatarIds) {
+      const avatarRows = await db.getAllAsync<any>(`SELECT * FROM avatars WHERE id = ?;`, [
+        avatarId
+      ]);
+      if (avatarRows.length > 0) {
+        avatars.push(avatarRows[0].data);
+      }
+    }
+
+    setTimeout(() => callback(regionData, avatars), 0);
+  } catch (error) {
+    console.error('Error in getData:', error);
+    throw error;
+  }
 };

+ 5 - 0
src/screens/InAppScreens/MapScreen/index.tsx

@@ -34,6 +34,7 @@ import { AvatarWithInitials, EditNmModal, WarningModal } from 'src/components';
 import { API_HOST, VECTOR_MAP_HOST } from 'src/constants';
 import { NAVIGATION_PAGES } from 'src/types';
 import Animated, {
+  configureReanimatedLogger,
   Easing,
   useAnimatedStyle,
   useSharedValue,
@@ -100,6 +101,10 @@ const defaultUserAvatar = require('assets/icon-user-share-location-solid.png');
 const logo = require('assets/logo-ua.png');
 const defaultSeriesIcon = require('assets/series-default.png');
 
+configureReanimatedLogger({
+  strict: false,
+});
+
 MapLibreRN.Logger.setLogLevel('error');
 
 const generateFilter = (ids: number[]) => {

+ 17 - 5
src/screens/InAppScreens/TravelsScreen/utils/useRegionData.ts

@@ -11,6 +11,20 @@ const useRegionData = (regionId: number, dare: boolean = false) => {
   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);
+  //   };
+
+  //   if (!db1 || !db2) {
+  //     loadDatabases();
+  //   }
+  // }, [db1, db2]);
+
   useEffect(() => {
     const loadDatabases = async () => {
       const firstDb = await getFirstDatabase();
@@ -20,10 +34,8 @@ const useRegionData = (regionId: number, dare: boolean = false) => {
       setDb2(secondDb);
     };
 
-    if (!db1 || !db2) {
-      loadDatabases();
-    }
-  }, [db1, db2]);
+    loadDatabases();
+  }, []);
 
   useEffect(() => {
     const fetchRegionData = async () => {
@@ -43,7 +55,7 @@ const useRegionData = (regionId: number, dare: boolean = false) => {
     };
 
     fetchRegionData();
-  }, [regionId, db1, db2]);
+  }, [regionId, dare, db1, db2]);
 
   return { regionData, avatars };
 };