import React, { useCallback } from 'react'; import { ScrollView, View } from 'react-native'; import { useForm, Controller } from 'react-hook-form'; import { TextInput, Button, HelperText, Text } from 'react-native-paper'; import { setInternetCredentials } from 'react-native-keychain'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { NativeStackNavigationProp, NativeStackScreenProps, } from '@react-navigation/native-stack'; import { useNavigation } from '@react-navigation/native'; import { StackParamsList } from '../types'; import styles from '../styles/stylesheet'; import { retrieveNetworksData } from '../utils/accounts'; import { useNetworks } from '../context/NetworksContext'; import { EIP155, EMPTY_FIELD_ERROR, INVALID_URL_ERROR, } from '../utils/constants'; const networksFormDataSchema = z.object({ networkName: z.string().nonempty({ message: EMPTY_FIELD_ERROR }), rpcUrl: z.string().url({ message: INVALID_URL_ERROR }), blockExplorerUrl: z .string() .url({ message: INVALID_URL_ERROR }) .or(z.literal('')), gasPrice: z .string() .nonempty({ message: EMPTY_FIELD_ERROR }) .regex(/^\d+(\.\d+)?$/), }); type EditNetworkProps = NativeStackScreenProps; const EditNetwork = ({ route }: EditNetworkProps) => { const { setNetworksData } = useNetworks(); const navigation = useNavigation>(); const { control, formState: { errors, isSubmitting }, handleSubmit, } = useForm>({ mode: 'onChange', resolver: zodResolver(networksFormDataSchema), }); const networkData = route.params.selectedNetwork; const submit = useCallback( async (data: z.infer) => { const retrievedNetworksData = await retrieveNetworksData(); const newNetworkData = { ...networkData, ...data }; const index = retrievedNetworksData.findIndex( network => network.networkId === networkData.networkId, ); retrievedNetworksData.splice(index, 1, newNetworkData); await setInternetCredentials( 'networks', '_', JSON.stringify(retrievedNetworksData), ); setNetworksData(retrievedNetworksData); navigation.navigate('Laconic'); }, [networkData, navigation, setNetworksData], ); return ( Edit {networkData?.networkName} details ( <> onChange(textValue)} /> {errors.networkName?.message} )} /> ( <> onChange(textValue)} /> {errors.rpcUrl?.message} )} /> ( <> onChange(textValue)} /> {errors.blockExplorerUrl?.message} )} /> {networkData.namespace !== EIP155 ? ( ( <> {errors.gasPrice?.message} )} /> ) : null} ); }; export default EditNetwork;