From c30abfe4820cb0596ea44491368fffb643f9f504 Mon Sep 17 00:00:00 2001 From: ppc Date: Fri, 20 Sep 2024 11:57:06 +0100 Subject: [PATCH] auto-select card last used with specific game --- amnet-native/app/ServerCardIn.tsx | 21 ++++++++++++++------- amnet-native/models/AMCard.ts | 4 +++- amnet-native/models/RealmContext.ts | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/amnet-native/app/ServerCardIn.tsx b/amnet-native/app/ServerCardIn.tsx index 0f557d0..f5e26dd 100644 --- a/amnet-native/app/ServerCardIn.tsx +++ b/amnet-native/app/ServerCardIn.tsx @@ -29,11 +29,12 @@ const {useRealm, useQuery, useObject} = RealmContext; export default function ServerCardIn({route, navigation}) { const realm = useRealm(); const theme = useTheme(); - const safeArea = useSafeAreaInsets(); // card listing state - const query = useQuery(AMCard); - const cards = useMemo(() => query.sorted("lastUsed", true), [query]); + const cards = useQuery({ + type: AMCard, + query: q => q.sorted("lastUsed", true) + }); const [selectedCard, setSelectedCard] = useState(null); const [cardInCompleted, setCardInCompleted] = useState(null); @@ -82,7 +83,6 @@ export default function ServerCardIn({route, navigation}) { if (server?.isValid() !== true) { navigation.goBack(); - // don't show error on invalid server, just means it was deleted if (!server) { Alert.alert("Server not found", "The server you are looking for does not exist."); } @@ -90,7 +90,9 @@ export default function ServerCardIn({route, navigation}) { return; } - if (selectedCard?.isValid() !== true) { + // select a card if there's none selected + let setCard = selectedCard?.isValid() !== true; + if (setCard) { setSelectedCard(cards.length ? cards[0] : null); } @@ -102,6 +104,11 @@ export default function ServerCardIn({route, navigation}) { server.lastUsed = new Date(); Object.keys(r).forEach(x => server[x] = r[x]); }); + + if (setCard) { + // only reselect card if it was set by us previously + setSelectedCard(cards.find(x => x.lastUsedGameId === server.gameId) || cards[0]); + } } else { setConnectionTestResult(false); } @@ -122,13 +129,13 @@ export default function ServerCardIn({route, navigation}) { const abortController = new AbortController(); performCardIn(server, {cardId: selectedCard.code}, abortController.signal).then(async r => { const now = new Date(); - - setCardInCompleted(r); realm.write(() => { server.lastUsed = now; selectedCard.lastUsed = now; + selectedCard.lastUsedGameId = server.gameId; }); + setCardInCompleted(r); setSelectedCard(selectedCard); }).catch(() => { setCardInCompleted(false); diff --git a/amnet-native/models/AMCard.ts b/amnet-native/models/AMCard.ts index 72948b4..978faba 100644 --- a/amnet-native/models/AMCard.ts +++ b/amnet-native/models/AMCard.ts @@ -16,6 +16,7 @@ export class AMCard extends Realm.Object implements AMCardData { added: Date; lastUsed?: Date; + lastUsedGameId?: string | null; static generate(code: string, name: string) { return { @@ -35,7 +36,8 @@ export class AMCard extends Realm.Object implements AMCardData { code: "string", name: {type: "string", default: "New Card"}, added: {type: "date", default: new Date()}, - lastUsed: {type: "date", optional: true} + lastUsed: {type: "date", optional: true}, + lastUsedGameId: {type: "string", optional: true} } }; } \ No newline at end of file diff --git a/amnet-native/models/RealmContext.ts b/amnet-native/models/RealmContext.ts index 7c9fd60..5bd5ecf 100644 --- a/amnet-native/models/RealmContext.ts +++ b/amnet-native/models/RealmContext.ts @@ -4,7 +4,7 @@ import {AMServer} from "./AMServer"; // @ts-ignore export default createRealmContext({ - schemaVersion: 2, + schemaVersion: 3, schema: [AMCard, AMServer], deleteRealmIfMigrationNeeded: false }); \ No newline at end of file