WellNuo/app/(auth)/register.tsx
Sergei 1e2c2b9856 Full sync with auth screens and discussion docs
Added:
- forgot-password.tsx, register.tsx auth screens
- Discussion_Points.md and Discussion_Points.txt

Updated:
- login, chat, index, beneficiary detail screens
- profile/help and profile/support
- API service
- Scheme files (Discussion, AppStore)

All assets/images are tracked and safe.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-12 17:04:46 -08:00

220 lines
5.8 KiB
TypeScript

import React, { useState } from 'react';
import {
View,
Text,
StyleSheet,
KeyboardAvoidingView,
Platform,
ScrollView,
TouchableOpacity,
Alert,
} from 'react-native';
import { router } from 'expo-router';
import { Ionicons } from '@expo/vector-icons';
import { Button } from '@/components/ui/Button';
import { Input } from '@/components/ui/Input';
import { AppColors, BorderRadius, FontSizes, Spacing } from '@/constants/theme';
export default function RegisterScreen() {
const [username, setUsername] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const [name, setName] = useState('');
const [phone, setPhone] = useState('');
const [isLoading, setIsLoading] = useState(false);
const handleSubmit = () => {
// Basic validation
if (!username.trim()) {
Alert.alert('Error', 'Username is required');
return;
}
if (!email.trim()) {
Alert.alert('Error', 'Email is required');
return;
}
if (!password.trim()) {
Alert.alert('Error', 'Password is required');
return;
}
if (password !== confirmPassword) {
Alert.alert('Error', 'Passwords do not match');
return;
}
if (!name.trim()) {
Alert.alert('Error', 'Full name is required');
return;
}
// Show "in development" message
Alert.alert(
'Coming Soon',
'Account registration is currently under development. Please contact support to create an account.',
[{ text: 'OK' }]
);
};
return (
<KeyboardAvoidingView
style={styles.container}
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
>
<ScrollView
contentContainerStyle={styles.scrollContent}
keyboardShouldPersistTaps="handled"
showsVerticalScrollIndicator={false}
>
{/* Back Button */}
<TouchableOpacity style={styles.backButton} onPress={() => router.back()}>
<Ionicons name="arrow-back" size={24} color={AppColors.textPrimary} />
</TouchableOpacity>
{/* Header */}
<View style={styles.header}>
<Text style={styles.title}>Create Account</Text>
<Text style={styles.subtitle}>
Join WellNuo to start monitoring your loved ones
</Text>
</View>
{/* Form */}
<View style={styles.form}>
<Input
label="Username"
placeholder="Choose a username"
leftIcon="person-outline"
value={username}
onChangeText={setUsername}
autoCapitalize="none"
autoCorrect={false}
editable={!isLoading}
/>
<Input
label="Email Address"
placeholder="Enter your email"
leftIcon="mail-outline"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
autoCorrect={false}
editable={!isLoading}
/>
<Input
label="Full Name"
placeholder="Enter your full name"
leftIcon="person-circle-outline"
value={name}
onChangeText={setName}
autoCapitalize="words"
editable={!isLoading}
/>
<Input
label="Phone (optional)"
placeholder="Enter your phone number"
leftIcon="call-outline"
value={phone}
onChangeText={setPhone}
keyboardType="phone-pad"
editable={!isLoading}
/>
<Input
label="Password"
placeholder="Create a password"
leftIcon="lock-closed-outline"
secureTextEntry
value={password}
onChangeText={setPassword}
editable={!isLoading}
/>
<Input
label="Confirm Password"
placeholder="Confirm your password"
leftIcon="lock-closed-outline"
secureTextEntry
value={confirmPassword}
onChangeText={setConfirmPassword}
editable={!isLoading}
/>
<Button
title="Create Account"
onPress={handleSubmit}
loading={isLoading}
fullWidth
size="lg"
/>
</View>
{/* Footer */}
<View style={styles.footer}>
<Text style={styles.footerText}>Already have an account? </Text>
<TouchableOpacity onPress={() => router.back()}>
<Text style={styles.footerLink}>Sign In</Text>
</TouchableOpacity>
</View>
</ScrollView>
</KeyboardAvoidingView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: AppColors.background,
},
scrollContent: {
flexGrow: 1,
paddingHorizontal: Spacing.lg,
paddingTop: Spacing.xl,
paddingBottom: Spacing.xl,
},
backButton: {
width: 40,
height: 40,
borderRadius: BorderRadius.full,
backgroundColor: AppColors.surface,
justifyContent: 'center',
alignItems: 'center',
marginBottom: Spacing.lg,
},
header: {
alignItems: 'center',
marginBottom: Spacing.xl,
},
title: {
fontSize: FontSizes['2xl'],
fontWeight: '700',
color: AppColors.textPrimary,
marginBottom: Spacing.sm,
},
subtitle: {
fontSize: FontSizes.base,
color: AppColors.textSecondary,
textAlign: 'center',
},
form: {
marginBottom: Spacing.xl,
},
footer: {
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
},
footerText: {
fontSize: FontSizes.base,
color: AppColors.textSecondary,
},
footerLink: {
fontSize: FontSizes.base,
color: AppColors.primary,
fontWeight: '600',
},
});