import {useCallback, useEffect, useMemo, useState} from "react"; import {Button, Card, Divider, Paragraph, useTheme} from "react-native-paper"; import {StyleSheet, TextInput, TouchableOpacity, View} from "react-native"; import RealmContext from "../models/RealmContext"; import {generateCardNumber} from "../models/AM-API"; import {AMCard} from "../models/AMCard"; const {useRealm} = RealmContext; export default function CardAddModal({navigation}) { const theme = useTheme(); const themedStylesheet = useMemo(() => StyleSheet.create({ ...styles, formItemInput: { flex: 1, color: theme.colors.onSurface }, formFootnote: { fontSize: 13, }, headerText: { color: theme.colors.primary } }), [theme]); // state values const realm = useRealm(); 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.navigate('card-listing'); }, [realm]); // header effects useEffect(() => { navigation.setOptions({ headerLeft: () => navigation.goBack()}> Cancel , }); }, [navigation, themedStylesheet]); useEffect(() => { const canSave = cardName.length && cardNumber.length === 20; const themeOptions = canSave ? themedStylesheet.headerText : {color: theme.colors.outline}; navigation.setOptions({ headerRight: () => cardAddCallback(cardNumber, cardName)}> Save }) }, [navigation, themedStylesheet, 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. ) } const styles = StyleSheet.create({ formItemName: { minWidth: 100, fontWeight: "400" }, formItemRow: { flexDirection: "row", alignItems: "center" }, formItemDivider: { marginVertical: 15 } })