import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/user_provider.dart'; import 'register_screen.dart'; import 'password_reset_screen.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; String? _errorMessage; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future _handleLogin() async { if (!_formKey.currentState!.validate()) { return; } setState(() { _errorMessage = null; }); final userProvider = Provider.of(context, listen: false); final success = await userProvider.login( _usernameController.text.trim(), _passwordController.text, ); if (success) { if (mounted) { Navigator.of(context).pop(); // Zurück zur vorherigen Seite ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Erfolgreich eingeloggt!'), backgroundColor: Colors.green, ), ); } } else { setState(() { _errorMessage = 'Ungültige Anmeldedaten. Bitte versuche es erneut.'; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Anmelden'), ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 32), // Logo oder Titel Icon( Icons.account_circle, size: 80, color: Theme.of(context).primaryColor, ), const SizedBox(height: 16), Text( 'Willkommen zurück', style: Theme.of(context).textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( 'Melde dich an, um deine Bestellungen zu sehen', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.grey[600], ), textAlign: TextAlign.center, ), const SizedBox(height: 48), // Fehlermeldung if (_errorMessage != null) Container( padding: const EdgeInsets.all(12), margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.red[50], borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.red[300]!), ), child: Row( children: [ Icon(Icons.error_outline, color: Colors.red[700]), const SizedBox(width: 8), Expanded( child: Text( _errorMessage!, style: TextStyle(color: Colors.red[700]), ), ), ], ), ), // Benutzername/E-Mail Feld TextFormField( controller: _usernameController, decoration: InputDecoration( labelText: 'Benutzername oder E-Mail', prefixIcon: const Icon(Icons.person), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.next, validator: (value) { if (value == null || value.isEmpty) { return 'Bitte gib deinen Benutzernamen oder E-Mail ein'; } return null; }, ), const SizedBox(height: 16), // Passwort Feld TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: 'Passwort', prefixIcon: const Icon(Icons.lock), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), obscureText: _obscurePassword, textInputAction: TextInputAction.done, onFieldSubmitted: (_) => _handleLogin(), validator: (value) { if (value == null || value.isEmpty) { return 'Bitte gib dein Passwort ein'; } return null; }, ), const SizedBox(height: 24), // Anmelden Button Consumer( builder: (context, userProvider, child) { return ElevatedButton( onPressed: userProvider.isLoading ? null : _handleLogin, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF8B6F47), foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: userProvider.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, valueColor: AlwaysStoppedAnimation(Colors.white), ), ) : const Text( 'Anmelden', style: TextStyle(fontSize: 16), ), ); }, ), const SizedBox(height: 8), // Passwort vergessen Link Align( alignment: Alignment.centerRight, child: TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const PasswordResetScreen(), ), ); }, child: const Text('Passwort vergessen?'), ), ), const SizedBox(height: 16), // Registrieren Link Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Noch kein Konto? '), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const RegisterScreen(), ), ); }, child: const Text('Jetzt registrieren'), ), ], ), ], ), ), ), ), ); } }