Viktoriia 1 mēnesi atpakaļ
vecāks
revīzija
dd0b454381
4 mainītis faili ar 456 papildinājumiem un 353 dzēšanām
  1. 18 1
      App.tsx
  2. 8 63
      app.config.ts
  3. 27 0
      config/deepLinks.js
  4. 403 289
      src/contexts/NavigationContext.tsx

+ 18 - 1
App.tsx

@@ -88,7 +88,24 @@ const linking = {
       inAppUNMaster: '/un-masters',
       inAppStatistics: '/statistics',
       inAppTriumphs: '/triumphs',
-      inAppSeriesRanking: '/series-ranking'
+      inAppSeriesRanking: '/series-ranking',
+      inAppMyFriends: '/my-friends',
+      inAppFixers: '/fixers',
+      inAppEarth: '/earth',
+      inAppSeries: '/series',
+      inAppCountries: '/countries',
+      inAppRegions: '/regions',
+      inAppDare: '/dare',
+      inAppRegionPreview: {
+        path: 'region/:id',
+        alias: [
+          'region_mqp/:id',
+          'region/:id/',
+          'region_mqp/:id/',
+        ],
+      },
+      inAppPhotos: '/photos',
+      inAppTrips2025: '/trips'
     }
   }
 };

+ 8 - 63
app.config.ts

@@ -3,7 +3,7 @@ import path from 'path';
 import dotenv from 'dotenv';
 
 import type { ConfigContext, ExpoConfig } from 'expo/config';
-
+const { DEEP_LINK_PATHS } = require('./config/deepLinks');
 const env = process.env;
 
 const API_HOST = env.ENV === 'production' ? env.PRODUCTION_API_HOST : env.DEVELOPMENT_API_HOST;
@@ -18,6 +18,12 @@ dotenv.config({
   path: path.resolve(process.cwd(), '.env')
 });
 
+const intentData = DEEP_LINK_PATHS.map((pathPrefix: string) => ({
+  scheme: 'https',
+  host: 'nomadmania.com',
+  pathPrefix,
+}));
+
 export default ({ config }: ConfigContext): ExpoConfig => ({
   ...config,
   name: 'NomadMania',
@@ -109,68 +115,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({
     intentFilters: [
       {
         action: 'VIEW',
-        data: [
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/profile/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/event/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/map/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/messages/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/lpi/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/master-ranking/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/travellers-in-history/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/triumphs/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/statistics/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/in-memoriam/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/series-ranking/'
-          },
-          {
-            scheme: 'https',
-            host: 'nomadmania.com',
-            pathPrefix: '/un-masters/'
-          }
-        ],
+        data: intentData,
         category: ['BROWSABLE', 'DEFAULT']
       }
     ],

+ 27 - 0
config/deepLinks.js

@@ -0,0 +1,27 @@
+module.exports = {
+  DEEP_LINK_PATHS: [
+    '/profile/',
+    '/event/',
+    '/map/',
+    '/messages/',
+    '/lpi/',
+    '/master-ranking/',
+    '/travellers-in-history/',
+    '/triumphs/',
+    '/statistics/',
+    '/in-memoriam/',
+    '/series-ranking/',
+    '/un-masters/',
+    '/my-friends/',
+    '/fixers/',
+    '/earth/',
+    '/series/',
+    '/countries/',
+    '/regions/',
+    '/region/',
+    '/dare/',
+    '/region_mqp/',
+    '/photos/',
+    '/trips/',
+  ],
+};

+ 403 - 289
src/contexts/NavigationContext.tsx

@@ -19,307 +19,421 @@ const parseURL = (url: string) => {
 
 export const useNavigationContext = () => useContext(NavigationContext);
 
+const resetTo = (routes: any[]) =>
+  CommonActions.reset({
+    index: 1,
+    routes: [
+      {
+        name: 'DrawerApp',
+        state: { routes },
+      },
+    ],
+  });
+
 export const NavigationProvider = ({ children }: { children: React.ReactNode }) => {
   const navigation = useNavigation();
   const token = storage.get('token', StoreType.STRING);
   const [initialUrlProcessed, setInitialUrlProcessed] = useState(false);
 
-  const handleDeepLink = async (url?: string) => {
-    const link = url || (await Linking.getInitialURL());
+  const handleRegion = (
+    path: string,
+    type: 'nm' | 'dare',
+  ) => {
+    const [, , regionId] = path.split('/');
 
-    if (link) {
-      const { path } = parseURL(link);
-      if (path.startsWith('/profile') && token) {
-        const segments = path.split('/');
-        const userId = segments[2];
-        navigation.navigate(...([NAVIGATION_PAGES.PUBLIC_PROFILE_VIEW, { userId }] as never));
-      } else if (path.startsWith('/event')) {
-        const segments = path.split('/');
-        const eventUrl = segments[2];
-
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
+    navigation.dispatch(
+      resetTo([
+        {
+          name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+          state: {
             routes: [
+              { name: NAVIGATION_PAGES.TRAVELS_TAB },
+              {
+                name:
+                  type === 'nm'
+                    ? NAVIGATION_PAGES.REGIONS
+                    : NAVIGATION_PAGES.DARE,
+              },
               {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_EVENTS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.EVENTS },
-                          {
-                            name: NAVIGATION_PAGES.EVENT,
-                            params: { url: eventUrl }
-                          }
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/map')) {
-        const segments = path.split('/');
-        let lon: string | undefined;
-        let lat: string | undefined;
-
-        segments.forEach((segment) => {
-          if (segment.startsWith('lon=')) {
-            lon = segment.replace('lon=', '');
-          } else if (segment.startsWith('lat=')) {
-            lat = segment.replace('lat=', '');
-          }
-        });
-
-        if (lon && lat) {
-          navigation.dispatch(
-            CommonActions.reset({
-              index: 1,
+                name: NAVIGATION_PAGES.REGION_PREVIEW,
+                params: {
+                  regionId,
+                  isTravelsScreen: true,
+                  type,
+                  disabled: !token,
+                },
+              },
+            ],
+          },
+        },
+      ]),
+    );
+  };
+
+  const deepLinkHandlers: Record<
+    string,
+    (path: string) => void
+  > = {
+    '/profile': (path) => {
+      if (!token) return;
+      const [, , userId] = path.split('/');
+      navigation.navigate(...([NAVIGATION_PAGES.PUBLIC_PROFILE_VIEW, { userId }] as never));
+    },
+
+    '/event': (path) => {
+      const [, , eventUrl] = path.split('/');
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_EVENTS_TAB,
+            state: {
               routes: [
+                { name: NAVIGATION_PAGES.EVENTS },
                 {
-                  name: 'DrawerApp',
-                  state: {
-                    routes: [
-                      {
-                        name: NAVIGATION_PAGES.IN_APP_MAP_TAB,
-                        state: {
-                          routes: [
-                            {
-                              name: NAVIGATION_PAGES.MAP_TAB,
-                              params: { lon, lat }
-                            }
-                          ]
-                        }
-                      }
-                    ]
-                  }
-                }
-              ]
-            })
-          );
+                  name: NAVIGATION_PAGES.EVENT,
+                  params: { url: eventUrl },
+                },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/map': (path) => {
+      const segments = path.split('/');
+      let lon: string | undefined;
+      let lat: string | undefined;
+
+      segments.forEach((segment) => {
+        if (segment.startsWith('lon=')) {
+          lon = segment.replace('lon=', '');
+        } else if (segment.startsWith('lat=')) {
+          lat = segment.replace('lat=', '');
         }
-      } else if (path.startsWith('/messages')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_MESSAGES_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.CHATS_LIST },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/lpi')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.LPI_RANKING },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/master-ranking')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.MASTER_RANKING },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/travellers-in-history')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.IN_HISTORY },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/triumphs')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.TRIUMPHS },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/statistics')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.STATISTICS },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/in-memoriam')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.IN_MEMORIAM },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/series-ranking')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.SERIES_RANKING },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      } else if (path.startsWith('/un-masters')) {
-        navigation.dispatch(
-          CommonActions.reset({
-            index: 1,
-            routes: [
-              {
-                name: 'DrawerApp',
-                state: {
-                  routes: [
-                    {
-                      name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
-                      state: {
-                        routes: [
-                          { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
-                          { name: NAVIGATION_PAGES.UN_MASTERS },
-                        ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          })
-        );
-      }
+      });
+
+      if (!lon || !lat) return;
+
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_MAP_TAB,
+            state: {
+              routes: [
+                {
+                  name: NAVIGATION_PAGES.MAP_TAB,
+                  params: { lon, lat },
+                },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/messages': () => {
+      if (!token) return;
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_MESSAGES_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.CHATS_LIST },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/lpi': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.LPI_RANKING },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/master-ranking': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                {
+                  name: NAVIGATION_PAGES.MASTER_RANKING,
+                },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/travellers-in-history': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.IN_HISTORY },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/triumphs': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.TRIUMPHS },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/statistics': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.STATISTICS },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/in-memoriam': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.IN_MEMORIAM },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/series-ranking': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                {
+                  name: NAVIGATION_PAGES.SERIES_RANKING,
+                },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/un-masters': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.UN_MASTERS },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/my-friends': () => {
+      if (!token) return;
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELLERS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELLERS_TAB },
+                { name: NAVIGATION_PAGES.MY_FRIENDS },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/fixers': () => {
+      if (!token) return;
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.FIXERS },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/earth': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.EARTH },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/series': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.SERIES },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/countries': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.COUNTRIES },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/regions': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.REGIONS },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/dare': () =>
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.DARE },
+              ],
+            },
+          },
+        ]),
+      ),
+
+    '/photos': () => {
+      if (!token) return;
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRAVELS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRAVELS_TAB },
+                { name: NAVIGATION_PAGES.PHOTOS },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/trips': () => {
+      if (!token) return;
+      navigation.dispatch(
+        resetTo([
+          {
+            name: NAVIGATION_PAGES.IN_APP_TRIPS_TAB,
+            state: {
+              routes: [
+                { name: NAVIGATION_PAGES.TRIPS_2025 },
+              ],
+            },
+          },
+        ]),
+      );
+    },
+
+    '/region_mqp': (path) =>
+      handleRegion(path, 'dare'),
+
+    '/region': (path) =>
+      handleRegion(path, 'nm'),
+  };
+
+
+  const handleDeepLink = async (url?: string) => {
+    const link = url || (await Linking.getInitialURL());
+    if (link) {
+      const { path } = parseURL(link);
+
+      const entry = Object.entries(deepLinkHandlers).find(
+        ([prefix]) => path.startsWith(prefix),
+      );
+
+      entry?.[1](path);
     }
+
     if (!initialUrlProcessed) {
       setInitialUrlProcessed(true);
     }