import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, Alert, StyleSheet } from 'react-native';
export default function UserRegistration() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [nameError, setNameError] = useState('');
const [emailError, setEmailError] = useState('');
const [passwordError, setPasswordError] = useState('');
const [isFormValid, setIsFormValid] = useState(false);
function validateName(value) {
if (value.trim().length === 0) {
setNameError('Name cannot be empty');
return false;
} else {
setNameError('');
return true;
}
}
function validateEmail(value) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(value)) {
setEmailError('Enter a valid email');
return false;
} else {
setEmailError('');
return true;
}
}
function validatePassword(value) {
if (value.length < 6) {
setPasswordError('Password must be at least 6 characters');
return false;
} else {
setPasswordError('');
return true;
}
}
useEffect(() => {
const nameValid = validateName(name);
const emailValid = validateEmail(email);
const passwordValid = validatePassword(password);
setIsFormValid(nameValid && emailValid && passwordValid);
}, [name, email, password]);
function handleRegister() {
Alert.alert('Registration Successful');
setName('');
setEmail('');
setPassword('');
}
return (
<View style={styles.container}>
<Text style={styles.title}>User Registration</Text>
<Text>Name:</Text>
<TextInput
style={styles.input}
value={name}
onChangeText={setName}
placeholder="Enter your name"
autoCapitalize="words"
accessibilityLabel="Name input"
/>
{nameError ? <Text style={styles.errorText}>{nameError}</Text> : null}
<Text>Email:</Text>
<TextInput
style={styles.input}
value={email}
onChangeText={setEmail}
placeholder="Enter your email"
keyboardType="email-address"
autoCapitalize="none"
accessibilityLabel="Email input"
/>
{emailError ? <Text style={styles.errorText}>{emailError}</Text> : null}
<Text>Password:</Text>
<TextInput
style={styles.input}
value={password}
onChangeText={setPassword}
placeholder="Enter your password"
secureTextEntry
accessibilityLabel="Password input"
/>
{passwordError ? <Text style={styles.errorText}>{passwordError}</Text> : null}
<Button
title="Register"
onPress={handleRegister}
disabled={!isFormValid}
accessibilityLabel="Register button"
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
padding: 20,
flex: 1,
justifyContent: 'center',
},
title: {
fontSize: 24,
marginBottom: 20,
fontWeight: 'bold',
},
input: {
borderWidth: 1,
borderColor: '#999',
borderRadius: 4,
padding: 8,
marginBottom: 5,
},
errorText: {
color: 'red',
marginBottom: 10,
},
});This solution uses React Native functional components with hooks to manage form state and validation.
We keep track of the input values and their error messages separately. Each field has a validation function that sets an error message if invalid or clears it if valid.
The useEffect hook runs validation whenever any input changes, updating a boolean isFormValid state. This boolean controls whether the Register button is enabled.
When the Register button is pressed, an alert shows success, and the form resets.
Error messages appear below each input if the input is invalid, helping the user fix mistakes before submitting.