import 'package:flutter/material.dart'; import 'package:email_validator/email_validator.dart'; import '../services/auth_service.dart'; import '../utils/error_handler.dart'; import 'login_screen.dart'; class RegisterScreen extends StatefulWidget { const RegisterScreen({super.key}); @override State createState() => _RegisterScreenState(); } class _RegisterScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); final _confirmPasswordController = TextEditingController(); final _firstNameController = TextEditingController(); final _lastNameController = TextEditingController(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; bool _isLoading = false; bool _acceptTerms = false; @override void dispose() { _emailController.dispose(); _usernameController.dispose(); _passwordController.dispose(); _confirmPasswordController.dispose(); _firstNameController.dispose(); _lastNameController.dispose(); super.dispose(); } Future _handleRegister() async { if (!_formKey.currentState!.validate()) { return; } if (!_acceptTerms) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Bitte akzeptiere die Nutzungsbedingungen'), backgroundColor: Colors.red, ), ); return; } setState(() { _isLoading = true; }); try { final authService = AuthService(); final result = await authService.register( email: _emailController.text.trim(), username: _usernameController.text.trim(), password: _passwordController.text, firstName: _firstNameController.text.trim(), lastName: _lastNameController.text.trim(), ); if (mounted) { setState(() { _isLoading = false; }); if (result['success'] == true) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Registrierung erfolgreich! Du kannst dich jetzt anmelden.'), backgroundColor: Colors.green, ), ); Navigator.of(context).pop(); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(result['message'] ?? 'Registrierung fehlgeschlagen'), backgroundColor: Colors.red, ), ); } } } catch (e) { if (mounted) { setState(() { _isLoading = false; }); ErrorHandler.showError(context, e); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Registrieren'), ), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Icon( Icons.person_add, size: 80, color: Theme.of(context).primaryColor, ), const SizedBox(height: 16), Text( 'Account erstellen', style: Theme.of(context).textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 32), // Vorname TextFormField( controller: _firstNameController, decoration: InputDecoration( labelText: 'Vorname', prefixIcon: const Icon(Icons.person), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), textInputAction: TextInputAction.next, ), const SizedBox(height: 16), // Nachname TextFormField( controller: _lastNameController, decoration: InputDecoration( labelText: 'Nachname', prefixIcon: const Icon(Icons.person_outline), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), textInputAction: TextInputAction.next, ), const SizedBox(height: 16), // E-Mail TextFormField( controller: _emailController, decoration: InputDecoration( labelText: 'E-Mail', prefixIcon: const Icon(Icons.email), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), keyboardType: TextInputType.emailAddress, textInputAction: TextInputAction.next, validator: (value) { if (value == null || value.isEmpty) { return 'Bitte gib deine E-Mail ein'; } if (!EmailValidator.validate(value)) { return 'Bitte gib eine gültige E-Mail ein'; } return null; }, ), const SizedBox(height: 16), // Benutzername TextFormField( controller: _usernameController, decoration: InputDecoration( labelText: 'Benutzername', prefixIcon: const Icon(Icons.account_circle), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), textInputAction: TextInputAction.next, validator: (value) { if (value == null || value.isEmpty) { return 'Bitte gib einen Benutzernamen ein'; } if (value.length < 3) { return 'Benutzername muss mindestens 3 Zeichen lang sein'; } return null; }, ), const SizedBox(height: 16), // Passwort 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.next, validator: (value) { if (value == null || value.isEmpty) { return 'Bitte gib ein Passwort ein'; } if (value.length < 6) { return 'Passwort muss mindestens 6 Zeichen lang sein'; } return null; }, ), const SizedBox(height: 16), // Passwort bestätigen TextFormField( controller: _confirmPasswordController, decoration: InputDecoration( labelText: 'Passwort bestätigen', prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _obscureConfirmPassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscureConfirmPassword = !_obscureConfirmPassword; }); }, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), ), obscureText: _obscureConfirmPassword, textInputAction: TextInputAction.done, onFieldSubmitted: (_) => _handleRegister(), validator: (value) { if (value == null || value.isEmpty) { return 'Bitte bestätige dein Passwort'; } if (value != _passwordController.text) { return 'Passwörter stimmen nicht überein'; } return null; }, ), const SizedBox(height: 16), // Nutzungsbedingungen Row( children: [ Checkbox( value: _acceptTerms, onChanged: (value) { setState(() { _acceptTerms = value ?? false; }); }, ), Expanded( child: GestureDetector( onTap: () { setState(() { _acceptTerms = !_acceptTerms; }); }, child: Text( 'Ich akzeptiere die Nutzungsbedingungen und Datenschutzerklärung', style: Theme.of(context).textTheme.bodySmall, ), ), ), ], ), const SizedBox(height: 24), // Registrieren Button ElevatedButton( onPressed: _isLoading ? null : _handleRegister, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF8B6F47), foregroundColor: Colors.white, 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( 'Registrieren', style: TextStyle(fontSize: 16), ), ), const SizedBox(height: 16), // Link zum Login Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('Bereits ein Konto? '), TextButton( onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => const LoginScreen(), ), ); }, child: const Text('Jetzt anmelden'), ), ], ), ], ), ), ), ), ); } }