import 'package:flutter/material.dart'; import 'dart:convert'; import '../../BlindMasterResources/secure_transmissions.dart'; import 'verify_reset_code_screen.dart'; class ForgotPasswordScreen extends StatefulWidget { const ForgotPasswordScreen({super.key}); @override State createState() => _ForgotPasswordScreenState(); } class _ForgotPasswordScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); bool _isLoading = false; @override void dispose() { _emailController.dispose(); super.dispose(); } String? _emailValidator(String? value) { if (value == null || value.isEmpty) { return 'Please enter your email'; } final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+'); if (!emailRegex.hasMatch(value)) { return 'Please enter a valid email'; } return null; } Future _handleSendCode() async { if (!_formKey.currentState!.validate()) { return; } setState(() { _isLoading = true; }); try { final response = await regularPost( { 'email': _emailController.text.trim(), }, '/forgot-password', ); if (!mounted) return; if (response.statusCode == 200) { Navigator.push( context, MaterialPageRoute( builder: (context) => VerifyResetCodeScreen( email: _emailController.text.trim(), ), ), ); } else if (response.statusCode == 429) { final body = json.decode(response.body) as Map; final retryAfter = body['retryAfter'] ?? 'some time'; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Please wait $retryAfter seconds before requesting another code.'), backgroundColor: Colors.red, duration: const Duration(seconds: 5), ), ); } else { final body = json.decode(response.body) as Map; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(body['error'] ?? 'Failed to send reset code'), backgroundColor: Colors.red, ), ); } } catch (error) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Error: $error'), backgroundColor: Colors.red, ), ); } finally { if (mounted) { setState(() { _isLoading = false; }); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Forgot Password'), backgroundColor: Theme.of(context).primaryColorLight, ), body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Icon( Icons.lock_reset, size: 80, color: Theme.of(context).primaryColorLight, ), const SizedBox(height: 32), const Text( 'Reset Your Password', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 16), const Text( 'Enter your email address and we\'ll send you a 6-character code to reset your password.', style: TextStyle( fontSize: 16, color: Colors.grey, ), textAlign: TextAlign.center, ), const SizedBox(height: 32), TextFormField( controller: _emailController, decoration: const InputDecoration( labelText: 'Email', border: OutlineInputBorder(), prefixIcon: Icon(Icons.email), ), keyboardType: TextInputType.emailAddress, validator: _emailValidator, enabled: !_isLoading, ), const SizedBox(height: 24), ElevatedButton( onPressed: _isLoading ? null : _handleSendCode, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).primaryColorLight, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: _isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, valueColor: AlwaysStoppedAnimation(Colors.white), ), ) : const Text( 'Send Reset Code', style: TextStyle( fontSize: 16, color: Colors.white, ), ), ), ], ), ), ), ), ), ); } }