import 'package:flutter/material.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _isPasswordVisible = false; bool _isLoading = false; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } String? _validateEmail(String? value) { if (value == null || value.isEmpty) { return 'Please enter your email'; } final emailRegExp = RegExp(r'^[^@]+@[^@]+\.[^@]+'); if (!emailRegExp.hasMatch(value)) { return 'Please enter a valid email address'; } return null; } String? _validatePassword(String? value) { if (value == null || value.isEmpty) { return 'Please enter your password'; } if (value.length < 6) { return 'Password must be at least 6 characters long'; } return null; } Future _handleLogin() async { if (!_formKey.currentState!.validate()) { return; } setState(() { _isLoading = true; }); // Simulate API call await Future.delayed(const Duration(seconds: 2)); if (!mounted) return; // Simple demo login - accept any valid email/password if (_emailController.text.isNotEmpty && _passwordController.text.length >= 6) { // Navigate to home screen (will be implemented when routing is set up) ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Login successful!'), backgroundColor: Colors.green, ), ); } else { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Login failed. Please check your credentials.'), backgroundColor: Colors.red, ), ); } setState(() { _isLoading = false; }); } @override Widget build(BuildContext context) { final theme = Theme.of(context); final colorScheme = theme.colorScheme; return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24.0), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // App Logo/Title Icon( Icons.lock_outline, size: 80, color: colorScheme.primary, ), const SizedBox(height: 24), // Welcome Text Text( 'Welcome Back', style: theme.textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, color: colorScheme.onSurface, ), textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( 'Sign in to your account', style: theme.textTheme.bodyLarge?.copyWith( color: colorScheme.onSurfaceVariant, ), textAlign: TextAlign.center, ), const SizedBox(height: 48), // Email Field TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.next, validator: _validateEmail, decoration: InputDecoration( labelText: 'Email', hintText: 'Enter your email address', prefixIcon: const Icon(Icons.email_outlined), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), filled: true, fillColor: colorScheme.surfaceVariant.withOpacity(0.3), ), ), const SizedBox(height: 16), // Password Field TextFormField( controller: _passwordController, obscureText: !_isPasswordVisible, textInputAction: TextInputAction.done, validator: _validatePassword, onFieldSubmitted: (_) => _handleLogin(), decoration: InputDecoration( labelText: 'Password', hintText: 'Enter your password', prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _isPasswordVisible ? Icons.visibility_off_outlined : Icons.visibility_outlined, ), onPressed: () { setState(() { _isPasswordVisible = !_isPasswordVisible; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), ), filled: true, fillColor: colorScheme.surfaceVariant.withOpacity(0.3), ), ), const SizedBox(height: 24), // Forgot Password Link Align( alignment: Alignment.centerRight, child: TextButton( onPressed: () { // Handle forgot password ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Forgot password functionality not implemented yet'), ), ); }, child: Text( 'Forgot Password?', style: TextStyle(color: colorScheme.primary), ), ), ), const SizedBox(height: 24), // Login Button FilledButton( onPressed: _isLoading ? null : _handleLogin, style: FilledButton.styleFrom( minimumSize: const Size(double.infinity, 56), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), child: _isLoading ? SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: colorScheme.onPrimary, ), ) : const Text( 'Sign In', style: TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), ), const SizedBox(height: 32), // Sign up link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Don't have an account? ", style: theme.textTheme.bodyMedium?.copyWith( color: colorScheme.onSurfaceVariant, ), ), TextButton( onPressed: () { // Handle sign up ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Sign up functionality not implemented yet'), ), ); }, child: Text( 'Sign Up', style: TextStyle( color: colorScheme.primary, fontWeight: FontWeight.w600, ), ), ), ], ), ], ), ), ), ), ), ), ); } }