add live updating for realm objects, fix object.assign not working

This commit is contained in:
ppc
2024-08-15 10:01:11 +01:00
parent c8f38ebed3
commit 51fbfb4357
+10 -18
View File
@@ -11,7 +11,7 @@ import {AMServer} from "../models/AMServer";
import {AMCard} from "../models/AMCard";
import ObjectId = BSON.ObjectId;
const {useRealm, useQuery} = RealmContext;
const {useRealm, useQuery, useObject} = RealmContext;
export default function ServerCardIn({route, navigation}) {
const realm = useRealm();
@@ -41,23 +41,22 @@ export default function ServerCardIn({route, navigation}) {
}, [cards, selectedCard]);
// server state
const [serverInfo, setServerInfo] = useState<AMServer>(null);
const [serverRefreshing, setServerRefreshing] = useState<boolean>(false);
const [serverReloadCounter, setServerReloadCounter] = useState<number>(0);
const [connectionTestResult, setConnectionTestResult] = useState<boolean | null>(null);
const {serverId} = route.params;
const server = useObject(AMServer, ObjectId.createFromHexString(serverId))
useLayoutEffect(() => {
if (!serverInfo) {
if (!server) {
return;
}
navigation.setOptions({
title: serverInfo.serverName,
})
}, [navigation, serverInfo]);
title: server.serverName,
});
}, [navigation, server]);
// set selected card (once)
useEffect(() => {
@@ -66,8 +65,6 @@ export default function ServerCardIn({route, navigation}) {
// refresh server info (server change or reload request)
useEffect(() => {
const server = realm.objectForPrimaryKey<AMServer>(AMServer, ObjectId.createFromHexString(serverId));
if (!server) {
navigation.goBack();
@@ -75,20 +72,15 @@ export default function ServerCardIn({route, navigation}) {
return;
}
setServerInfo(server);
const abortController = new AbortController();
server.getInfo(abortController.signal).then(r => {
if (r) {
setConnectionTestResult(true);
realm.write(() => {
Object.apply(server, r);
server.lastUsed = new Date();
Object.keys(r).forEach(x => server[x] = r[x]);
});
// reset server to reflect changes
setServerInfo(server);
} else {
setConnectionTestResult(false);
}
@@ -107,7 +99,7 @@ export default function ServerCardIn({route, navigation}) {
setCardInCompleted(false);
const abortController = new AbortController();
serverInfo.submitCard(selectedCard.code, abortController.signal).then(r => {
server.submitCard(selectedCard.code, abortController.signal).then(r => {
setCardInCompleted(r);
realm.write(() => {
selectedCard.lastUsed = new Date();
@@ -121,7 +113,7 @@ export default function ServerCardIn({route, navigation}) {
setTimeout(() => abortController.abort(), 5000);
return () => abortController.abort();
}, [serverInfo, selectedCard]);
}, [server, selectedCard]);
if (connectionTestResult === null) {
return (
@@ -153,7 +145,7 @@ export default function ServerCardIn({route, navigation}) {
</View>
<Paragraph>
There was an issue connecting to the AimeNet server at <Paragraph
style={{fontFamily: "JetBrainsMono_400Regular"}}>{serverInfo.serverAddress}</Paragraph>.
style={{fontFamily: "JetBrainsMono_400Regular"}}>{server.serverAddress}</Paragraph>.
Check connections and game status and try again.
</Paragraph>
</Card.Content>