diff --git a/amnet-native/app/ServerCardIn.tsx b/amnet-native/app/ServerCardIn.tsx index 12ffead..baa5e61 100644 --- a/amnet-native/app/ServerCardIn.tsx +++ b/amnet-native/app/ServerCardIn.tsx @@ -1,27 +1,19 @@ import {BSON} from "realm"; import React, {useCallback, useEffect, useLayoutEffect, useMemo, useState} from "react"; -import {ActivityIndicator, Button, Paragraph, Title, useTheme} from "react-native-paper"; -import { - Platform, - RefreshControl, - ScrollView, - Share, - StyleSheet, - Text, - TouchableOpacity, - View -} from "react-native"; +import {ActivityIndicator, Button, IconButton, Paragraph, Title, useTheme} from "react-native-paper"; +import {Platform, RefreshControl, ScrollView, Share, StyleSheet, Text, TouchableOpacity, View} from "react-native"; import { CircleCheck, CircleDot, CreditCard, - Nfc, Plus, SmartphoneNfcIcon, Share as ShareIcon, WifiOff, TvMinimalPlay, - Star + Star, + SmartphoneNfc, + SquareArrowOutUpRight } from "lucide-react-native"; import {EmptyStatePlaceholder} from "../components/EmptyStatePlaceholder"; @@ -33,14 +25,8 @@ import RealmContext from "../models/RealmContext"; import {AMServer} from "../models/AMServer"; import {AMCard} from "../models/AMCard"; -import {icCard0008Number} from "../lib/iccard"; -import { - AMServerConnectionInfo, - AMServerInstanceMetrics, - fetchServerInfo, - getGameName, - performCardIn -} from "amnet-shared"; +import {felicaCardReadAsync, icCard0008Number, ICType} from "../lib/iccard"; +import {AMServerConnectionInfo, AMServerInstanceMetrics, fetchServerInfo, getGameName, performCardIn} from "amnet-shared"; import ObjectId = BSON.ObjectId; @@ -153,7 +139,7 @@ export default function ServerCardIn({route, navigation}) { const cardId = selectedCard.physicalCardData && server.preferredCardIdFormat === "idm" ? icCard0008Number(selectedCard.physicalCardData.cardIDm) : selectedCard.code; const abortController = new AbortController(); - performCardIn(server, {cardId}, abortController.signal).then(async r => { + performCardIn(server, {cardId}, abortController.signal).then(r => { const now = new Date(); realm.write(() => { server.lastUsed = now; @@ -172,6 +158,30 @@ export default function ServerCardIn({route, navigation}) { return () => abortController.abort(); }, [server, selectedCard]); + const performPhysicalCardIn = useCallback(async () => { + const card = await felicaCardReadAsync(); + + if (!card) { + return; + } + + setCardInCompleted(false); + + const cardId = server.preferredCardIdFormat === "idm" || card.type !== ICType.Amusement ? icCard0008Number(card.idm) : card.accessCode; + const abortController = new AbortController(); + + performCardIn(server, {cardId}, abortController.signal).then(r => { + setCardInCompleted(r); + }).catch(() => { + setCardInCompleted(false); + }).finally(() => { + setTimeout(() => setCardInCompleted(null), 3000); + }); + + setTimeout(() => abortController.abort(), 5000); + return () => abortController.abort(); + }, [server]); + const performRefresh = () => { setServerRefreshing(true); setServerReloadCounter(serverReloadCounter + 1); @@ -191,7 +201,8 @@ export default function ServerCardIn({route, navigation}) { } return ( - }> + }> @@ -202,15 +213,27 @@ export default function ServerCardIn({route, navigation}) { actionIcon={}> {serverDefaultCard?.code == selectedCard.code && } - + + + {Platform.OS === 'ios' && ( + }/> + )} + : }/> diff --git a/amnet-native/app/card/CardAddModal.tsx b/amnet-native/app/card/CardAddModal.tsx index 5cfaf4c..7bdc2d7 100644 --- a/amnet-native/app/card/CardAddModal.tsx +++ b/amnet-native/app/card/CardAddModal.tsx @@ -35,7 +35,7 @@ function CardAddMethodSelector() { manually or generating new ones. - } title="Scan Physical Card" description="Amusement IC or Transport cards supported" @@ -46,13 +46,11 @@ function CardAddMethodSelector() { } title="Enter Details Manually" - //description="Manually enter card details (or generate a new one)" onPress={() => navigation.navigate('Manual')}/> - } title="Generate New Card" - //description="Create a card from scratch" onPress={() => navigation.navigate('Manual', {autoGenerate: true})}/> )