From ddf594f5af2652cd0d216fac02ca90954810ef89 Mon Sep 17 00:00:00 2001 From: ppc Date: Fri, 16 Aug 2024 14:41:50 +0100 Subject: [PATCH] add deep linking support --- amnet-native/App.tsx | 30 ++++++++++++++++++++++--- amnet-native/app.json | 1 + amnet-native/app/ServerAddModal.tsx | 12 +++++++--- amnet-native/app/ServerCardIn.tsx | 6 ++--- amnet-native/app/ServerManager.tsx | 2 +- amnet-native/app/ServerManagerStack.tsx | 7 +----- 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/amnet-native/App.tsx b/amnet-native/App.tsx index 5f7ae3d..f73a81a 100644 --- a/amnet-native/App.tsx +++ b/amnet-native/App.tsx @@ -1,4 +1,5 @@ import React from "react"; +import * as Linking from 'expo-linking'; import {useColorScheme, View} from "react-native"; import RealmContext from "./models/RealmContext"; import {StatusBar} from "expo-status-bar"; @@ -23,6 +24,7 @@ import CardAddModal from "./app/CardAddModal"; import CardManagerStack from "./app/CardManagerStack"; import ServerManagerStack from "./app/ServerManagerStack"; import {MD3Colors} from "react-native-paper/lib/typescript/types"; +import ServerAddModal from "./app/ServerAddModal"; const AMColors: Partial = { primary: '#e11d48', @@ -92,6 +94,26 @@ export default function AppRoot() { JetBrainsMono_400Regular }); + const linking = { + prefixes: [Linking.createURL('/')], + config: { + screens: { + "add-card": "cards/add", + "add-server": "servers/add", + "app": { + screens: { + "servers": { + screens: { + "server-listing": "servers", + } + }, + "cards": "cards" + } + } + } + } + }; + if (!fontsLoaded) { return ( @@ -105,13 +127,15 @@ export default function AppRoot() { - + {/* @ts-ignore */} + - + {/* main app */} - + + diff --git a/amnet-native/app.json b/amnet-native/app.json index d1d4a6c..404d6b8 100644 --- a/amnet-native/app.json +++ b/amnet-native/app.json @@ -1,5 +1,6 @@ { "name": "AMNet", + "scheme": "amnet", "version": "1.0.0", "slug": "amnet-native", "icon": "./assets/icon.png", diff --git a/amnet-native/app/ServerAddModal.tsx b/amnet-native/app/ServerAddModal.tsx index e094de5..6d03a72 100644 --- a/amnet-native/app/ServerAddModal.tsx +++ b/amnet-native/app/ServerAddModal.tsx @@ -1,4 +1,4 @@ -import {useCallback, useLayoutEffect, useState} from "react"; +import {useCallback, useEffect, useLayoutEffect, useState} from "react"; import {Card, Paragraph, useTheme} from "react-native-paper"; import {TextInput, TouchableOpacity, View} from "react-native"; import {useModalStyles} from "../utils/ModalStyles"; @@ -8,12 +8,18 @@ import {AMServer} from "../models/AMServer"; const {useRealm} = RealmContext; -export default function ServerAddModal({navigation}) { +export default function ServerAddModal({route, navigation}) { const realm = useRealm(); const theme = useTheme(); const modalStyles = useModalStyles(); const [serverAddress, setServerAddress] = useState(''); + + // add option to add server address when loading a share link + const {address} = route.params; + useEffect(() => { + setServerAddress(address || ''); + }, [address]); useLayoutEffect(() => { navigation.setOptions({ @@ -51,7 +57,7 @@ export default function ServerAddModal({navigation}) { } navigation.goBack(); - setTimeout(() => navigation.navigate('server-card-in', { + setTimeout(() => navigation.navigate('server', { serverId: serverObject._id.toHexString() }), 500); }, [serverAddress, realm]); diff --git a/amnet-native/app/ServerCardIn.tsx b/amnet-native/app/ServerCardIn.tsx index afe6342..b2465cb 100644 --- a/amnet-native/app/ServerCardIn.tsx +++ b/amnet-native/app/ServerCardIn.tsx @@ -45,8 +45,8 @@ export default function ServerCardIn({route, navigation}) { const [serverReloadCounter, setServerReloadCounter] = useState(0); const [connectionTestResult, setConnectionTestResult] = useState(null); - const {serverId} = route.params; - const server = useObject(AMServer, ObjectId.createFromHexString(serverId)) + let {serverId} = route.params; + const server = useObject(AMServer, ObjectId.createFromHexString(serverId)); useLayoutEffect(() => { if (!server) { @@ -72,7 +72,7 @@ export default function ServerCardIn({route, navigation}) { if (!server) { Alert.alert("Server not found", "The server you are looking for does not exist."); } - + return; } diff --git a/amnet-native/app/ServerManager.tsx b/amnet-native/app/ServerManager.tsx index 4eeba7c..1557b96 100644 --- a/amnet-native/app/ServerManager.tsx +++ b/amnet-native/app/ServerManager.tsx @@ -15,7 +15,7 @@ const {useRealm, useQuery} = RealmContext; function ServerCard(props: { server: AMServer, navigation: any }) { const realm = useRealm(); const pageCallback = useCallback(() => { - props.navigation.navigate('server-card-in', { + props.navigation.navigate('server', { serverId: props.server._id.toHexString() }); }, [props.navigation, props.server]); diff --git a/amnet-native/app/ServerManagerStack.tsx b/amnet-native/app/ServerManagerStack.tsx index 9d9cc3d..0b2be4c 100644 --- a/amnet-native/app/ServerManagerStack.tsx +++ b/amnet-native/app/ServerManagerStack.tsx @@ -5,7 +5,6 @@ import {createNativeStackNavigator} from "@react-navigation/native-stack"; import ServerCardIn from "./ServerCardIn"; import ServerManager from "./ServerManager"; -import ServerAddModal from "./ServerAddModal"; const Stack = createNativeStackNavigator(); @@ -31,11 +30,7 @@ export default function ServerManagerStack({navigation}) { }}/> - - - - - + );