diff --git a/amnet-native/app/ServerAddModal.tsx b/amnet-native/app/ServerAddModal.tsx index b4d78dc..2d50615 100644 --- a/amnet-native/app/ServerAddModal.tsx +++ b/amnet-native/app/ServerAddModal.tsx @@ -1,6 +1,6 @@ -import {useCallback, useEffect, useLayoutEffect, useState} from "react"; import {Card, Paragraph, useTheme} from "react-native-paper"; import {TextInput, TouchableOpacity, View} from "react-native"; +import {useCallback, useEffect, useLayoutEffect, useState} from "react"; import {useModalStyles} from "../utils/ModalStyles"; import RealmContext from "../models/RealmContext"; @@ -17,8 +17,8 @@ export default function ServerAddModal({route, navigation}) { // add option to add server address when loading a share link useEffect(() => { - setServerAddress(route.params?.address || ''); - }, [route.params]); + handleDeepLink(realm, navigation, route, setServerAddress); + }, [route]); useLayoutEffect(() => { navigation.setOptions({ @@ -39,7 +39,6 @@ export default function ServerAddModal({route, navigation}) { } const themeOptions = urlValid ? modalStyles.headerText : {color: theme.colors.outline}; - navigation.setOptions({ headerRight: () => saveServer()}> Save @@ -88,3 +87,24 @@ export default function ServerAddModal({route, navigation}) { ) } + +function handleDeepLink(realm, navigation, route, setAddress: (address: string) => void) { + if (!route.params?.serverAddress) { + return; + } + + const serverUrl = decodeURIComponent(route.params.serverAddress); + const item = realm.objects(AMServer).filtered("serverAddress = $0", serverUrl); + + if (item.length) { + navigation.goBack(); + navigation.navigate('server', { + serverId: item._id.toHexString() + }); + } else { + setAddress(serverUrl); + } + + // clear param from route + navigation.setParams({serverAddress: null}); +} diff --git a/amnet-native/app/ServerManager.tsx b/amnet-native/app/ServerManager.tsx index 531f31d..2d9a201 100644 --- a/amnet-native/app/ServerManager.tsx +++ b/amnet-native/app/ServerManager.tsx @@ -1,8 +1,7 @@ -import {BSON} from "realm"; import {Button, Paragraph, useTheme} from "react-native-paper"; import {Globe, History, Plus, ServerOff} from "lucide-react-native"; -import {Alert, FlatList, NativeSyntheticEvent, Text, View} from "react-native"; -import React, {useCallback, useEffect, useLayoutEffect, useMemo, useState} from "react"; +import {FlatList, NativeSyntheticEvent, Text, View} from "react-native"; +import React, {useCallback, useLayoutEffect, useMemo, useState} from "react"; import ContextMenu, {ContextMenuOnPressNativeEvent} from "react-native-context-menu-view"; import {EmptyStatePlaceholder} from "../components/EmptyStatePlaceholder"; import {AMUICard, AMUICardDetail} from "../components/AMUICard"; @@ -10,7 +9,6 @@ import TimeAgo from "../components/TimeAgo"; import RealmContext from "../models/RealmContext"; import {AMServer} from "../models/AMServer"; -import ObjectId = BSON.ObjectId; const {useRealm, useQuery} = RealmContext; @@ -59,8 +57,7 @@ function ServerCard(props: { server: AMServer, navigation: any }) { ) } -export default function ServerManager({route, navigation}) { - const realm = useRealm(); +export default function ServerManager({navigation}) { const theme = useTheme(); const [searchQuery, setSearchQuery] = useState(''); @@ -88,17 +85,13 @@ export default function ServerManager({route, navigation}) { }) }, [navigation, setSearchQuery]); - // handle deep links once/render - useEffect(() => { - handleDeepLink(realm, navigation, route); - }, []); - if (!servers.length) { return ( }/> {(!searchQuery || !query.length) && ( - )} ); @@ -113,44 +106,4 @@ export default function ServerManager({route, navigation}) { ItemSeparatorComponent={() => } renderItem={i => }/> ) -} - -async function handleDeepLink(realm, navigation, route) { - if (!route.params?.serverAddress) { - return; - } - - let serverId: ObjectId; - - const serverUrl = decodeURIComponent(route.params.serverAddress); - const item = realm.objects(AMServer).filtered("serverAddress = $0", serverUrl); - - if (item.length) { - serverId = item[0]._id; - } else { - try { - new URL(serverUrl); - realm.write(() => { - const newServer = realm.create(AMServer, AMServer.generate(serverUrl)); - newServer.serverName = "Imported Server"; - - serverId = newServer._id; - }); - } catch (TypeError) { - Alert.alert("Invalid Server URL", "The server URL provided is invalid."); - } - } - - // clear param from route - navigation.setParams({serverAddress: null}); - - if (serverId) { - // give it some time to let everything load (and the user sees the initial list) - await new Promise(resolve => setTimeout(resolve, 500)); - navigation.navigate('server', { - serverId: serverId.toHexString() - }); - } - - return null; } \ No newline at end of file