164 lines
4.2 KiB
TypeScript
164 lines
4.2 KiB
TypeScript
import React, { useState } from 'react'
|
|
import { View, Text, TextInput, TouchableOpacity, StyleSheet, Alert } from 'react-native'
|
|
import { useRouter } from 'expo-router'
|
|
import axios from 'axios'
|
|
import { API_BASE_URL, API_ENDPOINTS } from '../config/api'
|
|
|
|
export default function RegisterScreen() {
|
|
const [formData, setFormData] = useState({
|
|
email: '',
|
|
password: '',
|
|
firstName: '',
|
|
lastName: '',
|
|
phone: '',
|
|
})
|
|
const [loading, setLoading] = useState(false)
|
|
const router = useRouter()
|
|
|
|
const handleRegister = async () => {
|
|
if (!formData.email || !formData.password || !formData.firstName || !formData.lastName) {
|
|
Alert.alert('Error', 'Please fill in all required fields')
|
|
return
|
|
}
|
|
|
|
setLoading(true)
|
|
try {
|
|
const response = await axios.post(`${API_BASE_URL}${API_ENDPOINTS.AUTH.REGISTER}`, formData)
|
|
|
|
if (response.status === 201) {
|
|
Alert.alert('Success', 'Registration successful! Please login.', [
|
|
{ text: 'OK', onPress: () => router.push('/login') }
|
|
])
|
|
}
|
|
} catch (error: any) {
|
|
Alert.alert('Error', error.response?.data?.error || 'Registration failed')
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<Text style={styles.title}>Create Account</Text>
|
|
<Text style={styles.subtitle}>Join FitAI today</Text>
|
|
|
|
<View style={styles.form}>
|
|
<TextInput
|
|
style={styles.input}
|
|
placeholder="First Name"
|
|
value={formData.firstName}
|
|
onChangeText={(text) => setFormData({ ...formData, firstName: text })}
|
|
autoCapitalize="words"
|
|
/>
|
|
|
|
<TextInput
|
|
style={styles.input}
|
|
placeholder="Last Name"
|
|
value={formData.lastName}
|
|
onChangeText={(text) => setFormData({ ...formData, lastName: text })}
|
|
autoCapitalize="words"
|
|
/>
|
|
|
|
<TextInput
|
|
style={styles.input}
|
|
placeholder="Email"
|
|
value={formData.email}
|
|
onChangeText={(text) => setFormData({ ...formData, email: text })}
|
|
keyboardType="email-address"
|
|
autoCapitalize="none"
|
|
/>
|
|
|
|
<TextInput
|
|
style={styles.input}
|
|
placeholder="Phone (optional)"
|
|
value={formData.phone}
|
|
onChangeText={(text) => setFormData({ ...formData, phone: text })}
|
|
keyboardType="phone-pad"
|
|
/>
|
|
|
|
<TextInput
|
|
style={styles.input}
|
|
placeholder="Password"
|
|
value={formData.password}
|
|
onChangeText={(text) => setFormData({ ...formData, password: text })}
|
|
secureTextEntry
|
|
/>
|
|
|
|
<TouchableOpacity
|
|
style={[styles.button, loading && styles.buttonDisabled]}
|
|
onPress={handleRegister}
|
|
disabled={loading}
|
|
>
|
|
<Text style={styles.buttonText}>
|
|
{loading ? 'Creating Account...' : 'Create Account'}
|
|
</Text>
|
|
</TouchableOpacity>
|
|
|
|
<TouchableOpacity
|
|
style={styles.linkButton}
|
|
onPress={() => router.push('/login')}
|
|
>
|
|
<Text style={styles.linkText}>
|
|
Already have an account? Login
|
|
</Text>
|
|
</TouchableOpacity>
|
|
</View>
|
|
</View>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
backgroundColor: '#f5f5f5',
|
|
padding: 20,
|
|
},
|
|
title: {
|
|
fontSize: 32,
|
|
fontWeight: 'bold',
|
|
marginBottom: 8,
|
|
color: '#333',
|
|
},
|
|
subtitle: {
|
|
fontSize: 16,
|
|
color: '#666',
|
|
marginBottom: 32,
|
|
},
|
|
form: {
|
|
width: '100%',
|
|
maxWidth: 400,
|
|
},
|
|
input: {
|
|
backgroundColor: 'white',
|
|
paddingHorizontal: 16,
|
|
paddingVertical: 12,
|
|
borderRadius: 8,
|
|
marginBottom: 16,
|
|
borderWidth: 1,
|
|
borderColor: '#ddd',
|
|
},
|
|
button: {
|
|
backgroundColor: '#3b82f6',
|
|
paddingVertical: 14,
|
|
borderRadius: 8,
|
|
alignItems: 'center',
|
|
marginBottom: 16,
|
|
},
|
|
buttonDisabled: {
|
|
backgroundColor: '#9ca3af',
|
|
},
|
|
buttonText: {
|
|
color: 'white',
|
|
fontSize: 16,
|
|
fontWeight: '600',
|
|
},
|
|
linkButton: {
|
|
alignItems: 'center',
|
|
},
|
|
linkText: {
|
|
color: '#3b82f6',
|
|
fontSize: 14,
|
|
},
|
|
}) |