mirror of
https://gitea.tendokyu.moe/ppc/amnet.git
synced 2026-09-29 18:28:06 +03:00
add deep link handling
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import {useCallback, useEffect, useLayoutEffect, useState} from "react";
|
|
||||||
import {Card, Paragraph, useTheme} from "react-native-paper";
|
import {Card, Paragraph, useTheme} from "react-native-paper";
|
||||||
import {TextInput, TouchableOpacity, View} from "react-native";
|
import {TextInput, TouchableOpacity, View} from "react-native";
|
||||||
|
import {useCallback, useEffect, useLayoutEffect, useState} from "react";
|
||||||
import {useModalStyles} from "../utils/ModalStyles";
|
import {useModalStyles} from "../utils/ModalStyles";
|
||||||
|
|
||||||
import RealmContext from "../models/RealmContext";
|
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
|
// add option to add server address when loading a share link
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setServerAddress(route.params?.address || '');
|
handleDeepLink(realm, navigation, route, setServerAddress);
|
||||||
}, [route.params]);
|
}, [route]);
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
navigation.setOptions({
|
navigation.setOptions({
|
||||||
@@ -39,7 +39,6 @@ export default function ServerAddModal({route, navigation}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const themeOptions = urlValid ? modalStyles.headerText : {color: theme.colors.outline};
|
const themeOptions = urlValid ? modalStyles.headerText : {color: theme.colors.outline};
|
||||||
|
|
||||||
navigation.setOptions({
|
navigation.setOptions({
|
||||||
headerRight: () => <TouchableOpacity disabled={!urlValid} onPress={() => saveServer()}>
|
headerRight: () => <TouchableOpacity disabled={!urlValid} onPress={() => saveServer()}>
|
||||||
<Paragraph style={{...themeOptions, fontWeight: "600"}}>Save</Paragraph>
|
<Paragraph style={{...themeOptions, fontWeight: "600"}}>Save</Paragraph>
|
||||||
@@ -88,3 +87,24 @@ export default function ServerAddModal({route, navigation}) {
|
|||||||
</Paragraph>
|
</Paragraph>
|
||||||
</View>)
|
</View>)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import {BSON} from "realm";
|
|
||||||
import {Button, Paragraph, useTheme} from "react-native-paper";
|
import {Button, Paragraph, useTheme} from "react-native-paper";
|
||||||
import {Globe, History, Plus, ServerOff} from "lucide-react-native";
|
import {Globe, History, Plus, ServerOff} from "lucide-react-native";
|
||||||
import {Alert, FlatList, NativeSyntheticEvent, Text, View} from "react-native";
|
import {FlatList, NativeSyntheticEvent, Text, View} from "react-native";
|
||||||
import React, {useCallback, useEffect, useLayoutEffect, useMemo, useState} from "react";
|
import React, {useCallback, useLayoutEffect, useMemo, useState} from "react";
|
||||||
import ContextMenu, {ContextMenuOnPressNativeEvent} from "react-native-context-menu-view";
|
import ContextMenu, {ContextMenuOnPressNativeEvent} from "react-native-context-menu-view";
|
||||||
import {EmptyStatePlaceholder} from "../components/EmptyStatePlaceholder";
|
import {EmptyStatePlaceholder} from "../components/EmptyStatePlaceholder";
|
||||||
import {AMUICard, AMUICardDetail} from "../components/AMUICard";
|
import {AMUICard, AMUICardDetail} from "../components/AMUICard";
|
||||||
@@ -10,7 +9,6 @@ import TimeAgo from "../components/TimeAgo";
|
|||||||
|
|
||||||
import RealmContext from "../models/RealmContext";
|
import RealmContext from "../models/RealmContext";
|
||||||
import {AMServer} from "../models/AMServer";
|
import {AMServer} from "../models/AMServer";
|
||||||
import ObjectId = BSON.ObjectId;
|
|
||||||
|
|
||||||
const {useRealm, useQuery} = RealmContext;
|
const {useRealm, useQuery} = RealmContext;
|
||||||
|
|
||||||
@@ -59,8 +57,7 @@ function ServerCard(props: { server: AMServer, navigation: any }) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function ServerManager({route, navigation}) {
|
export default function ServerManager({navigation}) {
|
||||||
const realm = useRealm();
|
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const [searchQuery, setSearchQuery] = useState('');
|
const [searchQuery, setSearchQuery] = useState('');
|
||||||
|
|
||||||
@@ -88,17 +85,13 @@ export default function ServerManager({route, navigation}) {
|
|||||||
})
|
})
|
||||||
}, [navigation, setSearchQuery]);
|
}, [navigation, setSearchQuery]);
|
||||||
|
|
||||||
// handle deep links once/render
|
|
||||||
useEffect(() => {
|
|
||||||
handleDeepLink(realm, navigation, route);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
if (!servers.length) {
|
if (!servers.length) {
|
||||||
return (
|
return (
|
||||||
<View style={{gap: 10, flex: 1, justifyContent: "center", alignItems: "center"}}>
|
<View style={{gap: 10, flex: 1, justifyContent: "center", alignItems: "center"}}>
|
||||||
<EmptyStatePlaceholder message="No servers found" icon={<ServerOff color="gray"/>}/>
|
<EmptyStatePlaceholder message="No servers found" icon={<ServerOff color="gray"/>}/>
|
||||||
{(!searchQuery || !query.length) && (
|
{(!searchQuery || !query.length) && (
|
||||||
<Button mode="text" onPress={() => navigation.navigate('add-server')}
|
<Button mode="text"
|
||||||
|
onPress={() => navigation.navigate('add-server')}
|
||||||
icon={() => <Plus size={18} color={theme.colors.primary}/>}>Add Server</Button>)}
|
icon={() => <Plus size={18} color={theme.colors.primary}/>}>Add Server</Button>)}
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
@@ -113,44 +106,4 @@ export default function ServerManager({route, navigation}) {
|
|||||||
ItemSeparatorComponent={() => <View style={{height: 15}}/>}
|
ItemSeparatorComponent={() => <View style={{height: 15}}/>}
|
||||||
renderItem={i => <ServerCard navigation={navigation} server={i.item}/>}/>
|
renderItem={i => <ServerCard navigation={navigation} server={i.item}/>}/>
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user