import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.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 ForgotPasswordPage extends StatefulWidget { const ForgotPasswordPage({super.key}); @override State createState() => _ForgotPasswordPageState(); } class _ForgotPasswordPageState extends State { final _emailController = TextEditingController(); final _formKey = GlobalKey(); @override void dispose() { _emailController.dispose(); super.dispose(); } String? _validateEmail(String? value) { if (value == null || value.trim().isEmpty) { return 'Email requis'; } final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); if (!emailRegex.hasMatch(value.trim())) { return 'Email invalide'; } return null; } void _submit() { if (_formKey.currentState!.validate()) { context.read().add( AuthPasswordResetRequested(email: _emailController.text.trim()), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( icon: Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ), backgroundColor: Colors.transparent, elevation: 0, ), body: BlocListener( listener: (context, state) { if (state is AuthPasswordResetSent) { ErrorService().showSnackbar( message: 'Email de réinitialisation envoyé !', isError: false, ); Navigator.pop(context); } else if (state is AuthError) { ErrorService().showError(message: state.message); } }, child: SafeArea( child: Padding( padding: const EdgeInsets.all(16.0), child: Center( child: SingleChildScrollView( child: Form( key: _formKey, child: Column( children: [ const Text( "Travel Mate", style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 24), const Text( "Vous avez oublié votre mot de passe ? \n Ne vous inquiétez pas vous pouvez le réinitaliser !", textAlign: TextAlign.center, style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 40), const Text( "Quel est votre email ? \n Si celui-ci existe dans note base de donées, nous vous enverrons un mail avec un mot de passe unique.", textAlign: TextAlign.center, style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 24), TextFormField( controller: _emailController, validator: _validateEmail, keyboardType: TextInputType.emailAddress, decoration: const InputDecoration( labelText: 'Email', hintText: 'example@travelmate.com', border: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), ), prefixIcon: Icon(Icons.email_outlined), ), ), const SizedBox(height: 40), BlocBuilder( builder: (context, state) { final isLoading = state is AuthLoading; return ElevatedButton( onPressed: isLoading ? null : _submit, style: ElevatedButton.styleFrom( minimumSize: const Size.fromHeight(50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), backgroundColor: Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.black, foregroundColor: Theme.of(context).brightness == Brightness.dark ? Colors.black : Colors.white, ), child: isLoading ? SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Theme.of(context).brightness == Brightness.dark ? Colors.black : Colors.white, ), ) : const Text( 'Envoyer', style: TextStyle(fontSize: 18), ), ); }, ), const SizedBox(height: 20), Container( width: double.infinity, height: 1, color: Colors.grey.shade300, ), const SizedBox(height: 24), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text("Pas encore inscrit ? "), GestureDetector( onTap: () { // Go to sign up page Navigator.pushReplacementNamed( context, '/signup', ); }, child: const Text( 'Inscrivez-vous !', style: TextStyle( color: Color.fromARGB(255, 37, 109, 167), decoration: TextDecoration.underline, ), ), ), ], ), ], ), ), ), ), ), ), ), ); } }