created a localised login system

This commit is contained in:
bobbert committed 2026-02-21 13:14:01 +00:00
1 parent 59ac1fc926
commit 37511780b7
16 files changed
+3721 -20

No files matched your search

+258
View File
@@ -0,0 +1,258 @@
import React, { useState } from 'react';
import {
StyleSheet,
View,
Text,
TextInput,
TouchableOpacity,
Alert,
ActivityIndicator,
KeyboardAvoidingView,
Platform,
ScrollView,
} from 'react-native';
import DatabaseService from '../services/DatabaseService';
const RegisterScreen = ({ navigation }) => {
const [username, setUsername] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const [loading, setLoading] = useState(false);
const validateForm = () => {
if (!username.trim()) {
Alert.alert('Error', 'Please enter a username');
return false;
}
if (!email.trim()) {
Alert.alert('Error', 'Please enter an email');
return false;
}
if (!email.includes('@')) {
Alert.alert('Error', 'Please enter a valid email');
return false;
}
if (!password.trim()) {
Alert.alert('Error', 'Please enter a password');
return false;
}
if (password.length < 6) {
Alert.alert('Error', 'Password must be at least 6 characters');
return false;
}
if (password !== confirmPassword) {
Alert.alert('Error', 'Passwords do not match');
return false;
}
return true;
};
const handleRegister = async () => {
if (!validateForm()) {
return;
}
setLoading(true);
try {
await DatabaseService.initDatabase();
// Check if email already exists
const exists = await DatabaseService.userExists(email);
if (exists) {
Alert.alert('Error', 'Email already registered');
setLoading(false);
return;
}
// Create new user
const userId = await DatabaseService.createUser(username, email, password);
Alert.alert('Success', 'Account created successfully!', [
{
text: 'OK',
onPress: () => {
// Navigate to onboarding after successful registration
navigation.replace('Onboarding', { userId });
},
},
]);
} catch (error) {
console.error('Registration error:', error);
Alert.alert('Error', 'Failed to register: ' + error.message);
} finally {
setLoading(false);
}
};
return (
<KeyboardAvoidingView
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
style={styles.container}
>
<ScrollView
contentContainerStyle={styles.scrollContent}
showsVerticalScrollIndicator={false}
>
<View style={styles.content}>
<View style={styles.headerContainer}>
<Text style={styles.title}>Create Account</Text>
<Text style={styles.subtitle}>Join our photo library</Text>
</View>
<View style={styles.inputContainer}>
<Text style={styles.label}>Username</Text>
<TextInput
style={styles.input}
placeholder="Choose a username"
placeholderTextColor="#999"
value={username}
onChangeText={setUsername}
editable={!loading}
autoCapitalize="none"
/>
<Text style={styles.label}>Email</Text>
<TextInput
style={styles.input}
placeholder="Enter your email"
placeholderTextColor="#999"
value={email}
onChangeText={setEmail}
editable={!loading}
keyboardType="email-address"
autoCapitalize="none"
/>
<Text style={styles.label}>Password</Text>
<TextInput
style={styles.input}
placeholder="Create a password (min 6 characters)"
placeholderTextColor="#999"
value={password}
onChangeText={setPassword}
editable={!loading}
secureTextEntry={true}
autoCapitalize="none"
/>
<Text style={styles.label}>Confirm Password</Text>
<TextInput
style={styles.input}
placeholder="Confirm your password"
placeholderTextColor="#999"
value={confirmPassword}
onChangeText={setConfirmPassword}
editable={!loading}
secureTextEntry={true}
autoCapitalize="none"
/>
</View>
<TouchableOpacity
style={[styles.registerButton, loading && styles.buttonDisabled]}
onPress={handleRegister}
disabled={loading}
>
{loading ? (
<ActivityIndicator color="#fff" />
) : (
<Text style={styles.buttonText}>Create Account</Text>
)}
</TouchableOpacity>
<View style={styles.loginContainer}>
<Text style={styles.loginText}>Already have an account? </Text>
<TouchableOpacity
onPress={() => navigation.navigate('Login')}
disabled={loading}
>
<Text style={styles.loginLink}>Login here</Text>
</TouchableOpacity>
</View>
</View>
</ScrollView>
</KeyboardAvoidingView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#f5f5f5',
},
scrollContent: {
flexGrow: 1,
justifyContent: 'center',
},
content: {
paddingHorizontal: 20,
paddingVertical: 40,
},
headerContainer: {
marginBottom: 40,
alignItems: 'center',
},
title: {
fontSize: 32,
fontWeight: 'bold',
color: '#333',
marginBottom: 10,
},
subtitle: {
fontSize: 16,
color: '#999',
},
inputContainer: {
marginBottom: 30,
},
label: {
fontSize: 14,
fontWeight: '600',
color: '#333',
marginBottom: 8,
marginTop: 16,
},
input: {
borderWidth: 1,
borderColor: '#ddd',
borderRadius: 8,
paddingHorizontal: 16,
paddingVertical: 12,
fontSize: 16,
backgroundColor: '#fff',
color: '#333',
},
registerButton: {
backgroundColor: '#34C759',
borderRadius: 8,
paddingVertical: 14,
paddingHorizontal: 20,
alignItems: 'center',
marginBottom: 20,
},
buttonDisabled: {
opacity: 0.6,
},
buttonText: {
color: '#fff',
fontSize: 16,
fontWeight: '600',
},
loginContainer: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
},
loginText: {
color: '#666',
fontSize: 14,
},
loginLink: {
color: '#007AFF',
fontSize: 14,
fontWeight: '600',
},
});
export default RegisterScreen;