import { useState } from 'react'; import { View, Text, StyleSheet, Alert, KeyboardAvoidingView, Platform, ScrollView, Pressable } from 'react-native'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { useAuthStore } from '@/lib/auth-store'; import { getApiError } from '@/lib/api'; import { Colors } from '@/lib/colors'; import { FontSize, FontWeight, IconSize, LineHeight, MIN_TOUCH, Radius, Spacing } from '@/lib/theme'; import { AppBar, Button, Card, TextField } from '@/components/ui'; const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; export default function RegisterScreen() { const router = useRouter(); const { register } = useAuthStore(); const [nom, setNom] = useState(''); const [prenom, setPrenom] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [passwordConfirmation, setPasswordConfirmation] = useState(''); const [consentement, setConsentement] = useState(false); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState>({}); const validate = (): boolean => { const e: Record = {}; if (!nom.trim()) e.nom = 'Le nom est obligatoire'; if (!prenom.trim()) e.prenom = 'Le prénom est obligatoire'; if (!email.trim()) e.email = 'L\'email est obligatoire'; else if (!EMAIL_REGEX.test(email)) e.email = 'Format d\'email invalide'; if (!password) e.password = 'Le mot de passe est obligatoire'; else if (password.length < 8) e.password = 'Le mot de passe doit faire au moins 8 caractères'; if (password !== passwordConfirmation) e.passwordConfirmation = 'Les mots de passe ne correspondent pas'; if (!consentement) e.consentement = 'Vous devez accepter le traitement de vos données (RGPD)'; setErrors(e); return Object.keys(e).length === 0; }; const handleRegister = async () => { if (!validate()) return; setLoading(true); try { await register({ nom, prenom, email, password, password_confirmation: passwordConfirmation, consentement_rgpd: consentement, }); router.replace('/(tabs)'); } catch (error) { const data = getApiError(error); const msg = data.message || 'Erreur lors de l\'inscription'; const apiErrors = data.errors; if (apiErrors) { const mapped: Record = {}; Object.entries(apiErrors).forEach(([k, v]) => { mapped[k] = Array.isArray(v) ? v[0] as string : String(v); }); setErrors(mapped); } Alert.alert('Erreur', msg); } finally { setLoading(false); } }; const consentError = errors.consentement || errors.consentement_rgpd; return ( setConsentement(!consentement)} accessibilityRole="checkbox" accessibilityState={{ checked: consentement }} > J'accepte le traitement de mes données de bien-être conformément à la{' '} politique de confidentialité (RGPD). {consentError ? ( {consentError} ) : null}