import {generateCardNumber} from "amnet-shared"; import {useModalStyles} from "../utils/ModalStyles"; import {useCallback, useLayoutEffect, useState} from "react"; import {TextInput, TouchableOpacity, View} from "react-native"; import {Button, Card, Divider, Paragraph, useTheme} from "react-native-paper"; import {AMCard} from "../models/AMCard"; import RealmContext from "../models/RealmContext"; const {useRealm} = RealmContext; export default function CardAddModal({navigation, route}) { const realm = useRealm(); const theme = useTheme(); const modalStyles = useModalStyles(); // state values const [cardName, setCardName] = useState(''); const [cardNumber, setCardNumber] = useState(''); const [cardNumberReadOnly, setCardNumberReadOnly] = useState(false); const cardAddCallback = useCallback((cardId: string, cardName: string) => { const duplicateCard = realm.objects("card").find(x => x.code === cardId); 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]); // enable renaming by passing cardId to modal useLayoutEffect(() => { if (!route.params?.cardId) { setCardNumberReadOnly(false); return; } setCardNumber(route.params.cardId); setCardNumberReadOnly(true); if (route.params.cardName) { setCardName(route.params.cardName); } navigation.setOptions({ title: "Edit Card" }); }, [route]); return ( Card Name Matrix Code setCardNumber(val?.replaceAll(/\D/g, '').substring(0, 20) ?? '')} style={{...modalStyles.formItemInput, color: cardNumberReadOnly ? theme.colors.backdrop : undefined}}/> {/*only show card entry info when in create mode*/} {!cardNumberReadOnly && ( <> If you have a physical card, you can enter the 20-digit code on the back. )} ) }