import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:sign_in_button/sign_in_button.dart'; import 'package:travel_mate/components/loading/laoding_content.dart'; import 'package:travel_mate/components/signup/sign_up_platform_content.dart'; import 'package:travel_mate/services/auth_service.dart'; import '../blocs/auth/auth_bloc.dart'; import '../blocs/auth/auth_event.dart'; import '../blocs/auth/auth_state.dart'; import '../services/error_service.dart'; class SignUpPage extends StatefulWidget { const SignUpPage({super.key}); @override State createState() => _SignUpPageState(); } class _SignUpPageState extends State { final _formKey = GlobalKey(); final _nomController = TextEditingController(); final _prenomController = TextEditingController(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); final _phoneNumberController = TextEditingController(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; final _errorService = ErrorService(); final _authService = AuthService(); @override void dispose() { _nomController.dispose(); _prenomController.dispose(); _emailController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); super.dispose(); } String? _validateField(String? value, String fieldName) { if (value == null || value.trim().isEmpty) { return '$fieldName est requis'; } return null; } String? _validateEmail(String? value) { if (value == null || value.trim().isEmpty) { return 'Email est requis'; } final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); if (!emailRegex.hasMatch(value.trim())) { return 'Email invalide'; } return null; } String? _validatePassword(String? value) { if (value == null || value.isEmpty) { return 'Mot de passe est requis'; } if (value.length < 8) { return 'Le mot de passe doit contenir au moins 8 caractères'; } return null; } String? _validateConfirmPassword(String? value) { if (value == null || value.isEmpty) { return 'Confirmation du mot de passe requise'; } if (value != _passwordController.text) { return 'Les mots de passe ne correspondent pas'; } return null; } void _signUp(BuildContext context) { if (!_formKey.currentState!.validate()) { return; } context.read().add( AuthSignUpRequested( email: _emailController.text.trim(), password: _passwordController.text, nom: _nomController.text.trim(), prenom: _prenomController.text.trim(), phoneNumber: _phoneNumberController.text.trim(), ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( icon: const Icon(Icons.arrow_back), onPressed: () => Navigator.pop(context), ), backgroundColor: Colors.transparent, elevation: 0, ), body: BlocConsumer( listener: (context, state) { if (state is AuthAuthenticated) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Compte créé avec succès !'), backgroundColor: Colors.green, ), ); Navigator.pushReplacementNamed(context, '/home'); } else if (state is AuthError) { _errorService.showError( message: 'Erreur lors de la création du compte', ); } }, builder: (context, state) { final isLoading = state is AuthLoading; return SafeArea( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( children: [ const SizedBox(height: 40), const Text( 'Créer un compte', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 12), const Text( 'Rejoignez Travel Mate', style: TextStyle(fontSize: 16, color: Colors.grey), ), const SizedBox(height: 40), // Champ Prénom TextFormField( controller: _prenomController, validator: (value) => _validateField(value, 'Prénom'), decoration: const InputDecoration( labelText: 'Prénom', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: Icon(Icons.person_outline), ), ), const SizedBox(height: 20), // Champ Nom TextFormField( controller: _nomController, validator: (value) => _validateField(value, 'Nom'), decoration: const InputDecoration( labelText: 'Nom', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: Icon(Icons.person), ), ), const SizedBox(height: 20), // Champ Numéro de téléphone TextFormField( controller: _phoneNumberController, validator: (value) => _validateField(value, 'Numéro de téléphone'), decoration: const InputDecoration( labelText: 'Numéro de téléphone', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: Icon(Icons.phone), ), ), const SizedBox(height: 20), // Champ Email TextFormField( controller: _emailController, validator: _validateEmail, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: 'Email', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: Icon(Icons.email), ), ), const SizedBox(height: 20), // Champ Mot de passe TextFormField( controller: _passwordController, validator: _validatePassword, obscureText: _obscurePassword, decoration: InputDecoration( labelText: 'Mot de passe', border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: const Icon(Icons.lock), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), ), const SizedBox(height: 20), // Champ Confirmation mot de passe TextFormField( controller: _confirmPasswordController, validator: _validateConfirmPassword, obscureText: _obscureConfirmPassword, decoration: InputDecoration( labelText: 'Confirmez le mot de passe', border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, ), ), ), const SizedBox(height: 30), // Bouton d'inscription SizedBox( width: double.infinity, height: 50, child: ElevatedButton( onPressed: isLoading ? null : () => _signUp(context), style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), child: isLoading ? const CircularProgressIndicator( color: Colors.white, ) : const Text( 'S\'inscrire', style: TextStyle(fontSize: 18), ), ), ), const SizedBox(height: 20), // Lien vers login Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text("Déjà un compte ? "), GestureDetector( onTap: () => Navigator.pop(context), child: const Text( 'Connectez-vous !', style: TextStyle( color: Colors.blue, fontWeight: FontWeight.bold, ), ), ), ], ), const SizedBox(height: 20), // Divider Container( width: double.infinity, height: 1, color: Colors.grey.shade300, ), const SizedBox(height: 20), const Text( 'Ou inscrivez-vous avec', style: TextStyle(color: Colors.grey), ), const SizedBox(height: 20), SignInButton( Buttons.google, onPressed: () async { // Afficher la page de loading Navigator.push( context, MaterialPageRoute( builder: (context) => LoadingContent( onBackgroundTask: () async { // Effectuer la requête vers Google et donner les informations de l'utilisateur pour le signup await _authService.signInWithGoogle(); }, onComplete: () { // Fermer le loading et naviguer vers SignUpPlatformContent Navigator.pop( context, ); // Fermer LoadingContent final user = _authService.currentUser; if (user != null) { Navigator.push( context, MaterialPageRoute( builder: (context) => SignUpPlatformContent( platform: 'google', email: user.email ?? '', firstName: user.displayName ?.split(' ') .first ?? 'Prénom', name: user.displayName ?.split(' ') .skip(1) .join(' ') ?? 'Nom', ), ), ); } }, ), ), ); }, ), const SizedBox(height: 16), SignInButton( Buttons.apple, onPressed: () async { // Afficher la page de loading Navigator.push( context, MaterialPageRoute( builder: (context) => LoadingContent( onBackgroundTask: () async { // Effectuer la requête vers Google await _authService.signInWithApple(); }, onComplete: () { // Fermer le loading et naviguer vers SignUpPlatformContent Navigator.pop( context, ); // Fermer LoadingContent final user = _authService.currentUser; if (user != null) { Navigator.push( context, MaterialPageRoute( builder: (context) => SignUpPlatformContent( platform: 'apple', email: user.email ?? '', firstName: user.displayName ?.split(' ') .first ?? 'Prénom', name: user.displayName ?.split(' ') .skip(1) .join(' ') ?? 'Nom', ), ), ); } }, ), ), ); }, ), ], ), ), ), ), ); }, ), ); } }