148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:firebase_auth/firebase_auth.dart';
 | |
| 
 | |
| class ResetPasswordPage extends StatefulWidget {
 | |
|   final String email;
 | |
|   final String actionCode;
 | |
| 
 | |
|   const ResetPasswordPage({
 | |
|     super.key,
 | |
|     required this.email,
 | |
|     required this.actionCode,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   ResetPasswordPageState createState() => ResetPasswordPageState();
 | |
| }
 | |
| 
 | |
| class ResetPasswordPageState extends State<ResetPasswordPage> {
 | |
|   final _formKey = GlobalKey<FormState>();
 | |
|   final _passwordController = TextEditingController();
 | |
|   final _confirmPasswordController = TextEditingController();
 | |
|   bool _isLoading = false;
 | |
|   String? _errorMessage;
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     _passwordController.dispose();
 | |
|     _confirmPasswordController.dispose();
 | |
|     super.dispose();
 | |
|   }
 | |
| 
 | |
|   Future<void> _resetPassword() async {
 | |
|     if (!_formKey.currentState!.validate()) return;
 | |
| 
 | |
|     setState(() {
 | |
|       _isLoading = true;
 | |
|       _errorMessage = null;
 | |
|     });
 | |
| 
 | |
|     try {
 | |
|       // Vérifier le code d'action
 | |
|       await FirebaseAuth.instance.verifyPasswordResetCode(widget.actionCode);
 | |
| 
 | |
|       // Réinitialiser le mot de passe
 | |
|       await FirebaseAuth.instance.confirmPasswordReset(
 | |
|         code: widget.actionCode,
 | |
|         newPassword: _passwordController.text,
 | |
|       );
 | |
| 
 | |
|       // Connecter l'utilisateur automatiquement
 | |
|       await FirebaseAuth.instance.signInWithEmailAndPassword(
 | |
|         email: widget.email,
 | |
|         password: _passwordController.text,
 | |
|       );
 | |
| 
 | |
|       if (mounted) {
 | |
|         Navigator.of(context).pushReplacementNamed('/home');
 | |
|       }
 | |
|     } catch (e) {
 | |
|       setState(() {
 | |
|         _errorMessage = 'Une erreur est survenue. Veuillez réessayer.';
 | |
|       });
 | |
|     } finally {
 | |
|       if (mounted) {
 | |
|         setState(() {
 | |
|           _isLoading = false;
 | |
|         });
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Scaffold(
 | |
|       appBar: AppBar(
 | |
|         title: const Text('Créer votre mot de passe'),
 | |
|       ),
 | |
|       body: Padding(
 | |
|         padding: const EdgeInsets.all(16.0),
 | |
|         child: Form(
 | |
|           key: _formKey,
 | |
|           child: Column(
 | |
|             mainAxisAlignment: MainAxisAlignment.center,
 | |
|             crossAxisAlignment: CrossAxisAlignment.stretch,
 | |
|             children: [
 | |
|               Text(
 | |
|                 'Bienvenue ! Veuillez créer votre mot de passe pour continuer.',
 | |
|                 style: Theme.of(context).textTheme.titleMedium,
 | |
|                 textAlign: TextAlign.center,
 | |
|               ),
 | |
|               const SizedBox(height: 24),
 | |
|               TextFormField(
 | |
|                 controller: _passwordController,
 | |
|                 decoration: const InputDecoration(
 | |
|                   labelText: 'Nouveau mot de passe',
 | |
|                   border: OutlineInputBorder(),
 | |
|                 ),
 | |
|                 obscureText: true,
 | |
|                 validator: (value) {
 | |
|                   if (value == null || value.isEmpty) {
 | |
|                     return 'Veuillez entrer un mot de passe';
 | |
|                   }
 | |
|                   if (value.length < 6) {
 | |
|                     return 'Le mot de passe doit contenir au moins 6 caractères';
 | |
|                   }
 | |
|                   return null;
 | |
|                 },
 | |
|               ),
 | |
|               const SizedBox(height: 16),
 | |
|               TextFormField(
 | |
|                 controller: _confirmPasswordController,
 | |
|                 decoration: const InputDecoration(
 | |
|                   labelText: 'Confirmer le mot de passe',
 | |
|                   border: OutlineInputBorder(),
 | |
|                 ),
 | |
|                 obscureText: true,
 | |
|                 validator: (value) {
 | |
|                   if (value != _passwordController.text) {
 | |
|                     return 'Les mots de passe ne correspondent pas';
 | |
|                   }
 | |
|                   return null;
 | |
|                 },
 | |
|               ),
 | |
|               if (_errorMessage != null) ...[
 | |
|                 const SizedBox(height: 16),
 | |
|                 Text(
 | |
|                   _errorMessage!,
 | |
|                   style: TextStyle(
 | |
|                     color: Theme.of(context).colorScheme.error,
 | |
|                   ),
 | |
|                   textAlign: TextAlign.center,
 | |
|                 ),
 | |
|               ],
 | |
|               const SizedBox(height: 24),
 | |
|               ElevatedButton(
 | |
|                 onPressed: _isLoading ? null : _resetPassword,
 | |
|                 child: _isLoading
 | |
|                     ? const CircularProgressIndicator()
 | |
|                     : const Text('Créer le mot de passe'),
 | |
|               ),
 | |
|             ],
 | |
|           ),
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |