login-page/lib/forgot_password_page.dart
2025-05-17 11:13:16 +03:00

142 lines
4.6 KiB
Dart

import 'package:flutter/material.dart';
class ForgotPasswordPage extends StatefulWidget {
const ForgotPasswordPage({super.key});
@override
State<ForgotPasswordPage> createState() => _ForgotPasswordPageState();
}
class _ForgotPasswordPageState extends State<ForgotPasswordPage> {
final _formKey = GlobalKey<FormState>();
final TextEditingController _emailController = TextEditingController();
bool _isLoading = false;
String? _validateEmail(String? value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
if (!RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(value)) {
return 'Please enter a valid email';
}
return null;
}
Future<void> _sendResetLink() async {
if (_formKey.currentState!.validate()) {
setState(() {
_isLoading = true;
});
// Simulate network delay
await Future.delayed(const Duration(seconds: 1));
final email = _emailController.text;
setState(() {
_isLoading = false;
});
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('If an account exists for $email, a reset link has been mock-sent.'),
duration: const Duration(seconds: 3),
),
);
// Optionally navigate back after showing the message
await Future.delayed(const Duration(seconds: 1)); // Give time to read snackbar
if (mounted && Navigator.canPop(context)) {
Navigator.pop(context); // Go back to the login page
}
}
}
}
@override
void dispose() {
_emailController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('Reset Password'),
leading: IconButton( // Custom back button if you want, or let default work
icon: const Icon(Icons.arrow_back),
onPressed: () => Navigator.of(context).pop(),
),
),
body: Center(
child: SingleChildScrollView(
padding: const EdgeInsets.all(25.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Icon(
Icons.lock_reset_outlined,
size: 80,
color: theme.primaryColor,
),
const SizedBox(height: 20),
Text(
'Forgot Your Password?',
textAlign: TextAlign.center,
style: theme.textTheme.headlineSmall?.copyWith(
color: theme.primaryColor,
),
),
const SizedBox(height: 10),
Text(
'Enter your email address below and we\'ll (mock) send you a link to reset your password.',
textAlign: TextAlign.center,
style: theme.textTheme.bodyLarge,
),
const SizedBox(height: 40),
TextFormField(
controller: _emailController,
decoration: const InputDecoration(
hintText: 'Enter your Email Address',
prefixIcon: Icon(Icons.email_outlined),
),
keyboardType: TextInputType.emailAddress,
validator: _validateEmail,
autovalidateMode: AutovalidateMode.onUserInteraction,
),
const SizedBox(height: 30),
_isLoading
? const Center(child: CircularProgressIndicator())
: ElevatedButton(
onPressed: _sendResetLink,
child: const Text('Send Reset Link'),
),
const SizedBox(height: 20),
TextButton(
onPressed: () {
if (Navigator.canPop(context)) {
Navigator.pop(context); // Go back to login
} else {
// Fallback if it can't pop (e.g., if opened directly)
Navigator.pushReplacementNamed(context, '/');
}
},
child: Text(
'Back to Login',
style: TextStyle(color: theme.primaryColor),
),
)
],
),
),
),
),
);
}
}