import {useCallback, useLayoutEffect, useState} from "react"; import {TextInput, TouchableOpacity, View} from "react-native"; import {Button, Card, Divider, Paragraph, useTheme} from "react-native-paper"; import {useModalStyles} from "../utils/ModalStyles"; import {AMCard} from "../models/AMCard"; import RealmContext from "../models/RealmContext"; import {generateCardNumber} from "../models/AM-API"; const {useRealm} = RealmContext; export default function CardAddModal({navigation}) { const realm = useRealm(); const theme = useTheme(); const modalStyles = useModalStyles(); // state values const [cardName, setCardName] = useState(''); const [cardNumber, setCardNumber] = useState(''); const cardAddCallback = useCallback((cardId: string, cardName: string) => { const duplicateCard = realm.objects("card").find(x => x.code == cardNumber); if (duplicateCard) { realm.write(() => { duplicateCard.name = cardName; }); } else { realm.write(() => { realm.create("card", AMCard.generate(cardId, cardName)); }); } navigation.goBack(); }, [realm]); // header effects useLayoutEffect(() => { navigation.setOptions({ headerLeft: () => navigation.goBack()}> Cancel , }); }, [navigation, modalStyles]); useLayoutEffect(() => { const canSave = cardName.length && cardNumber.length === 20; const themeOptions = canSave ? modalStyles.headerText : {color: theme.colors.outline}; navigation.setOptions({ headerRight: () => cardAddCallback(cardNumber, cardName)}> Save }) }, [navigation, modalStyles, cardName, cardNumber]); return ( Card Name Matrix Code setCardNumber(val?.replaceAll(/\D/g, '').substring(0, 20) ?? '')}/> If you have a physical card, you can enter the 20-digit code on the back. ) }