import 'package:flutter/material.dart'; import 'package:frontend_splatournament_manager/providers/auth_provider.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); final _formKey = GlobalKey(); bool _isRegistering = false; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future _submit() async { if (!_formKey.currentState!.validate()) return; final authProvider = context.read(); final username = _usernameController.text.trim(); final password = _passwordController.text.trim(); bool success; if (_isRegistering) { success = await authProvider.register(username, password); } else { success = await authProvider.login(username, password); } if (success && mounted) { context.go('/'); } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 16), Text( 'Splatournament Manager', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineSmall, ), const SizedBox(height: 32), TextFormField( controller: _usernameController, decoration: const InputDecoration( labelText: 'Benutzername', prefixIcon: Icon(Icons.person), border: OutlineInputBorder(), ), validator: (value) { if (value == null || value.trim().isEmpty) { return 'Bitte gib einen Benutzernamen ein'; } return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: true, decoration: const InputDecoration( labelText: 'Passwort', prefixIcon: Icon(Icons.lock), border: OutlineInputBorder(), ), validator: (value) { if (value == null || value.trim().isEmpty) { return 'Bitte gib ein Passwort ein'; } if (_isRegistering && value.trim().length < 4) { return 'Das Passwort muss mindestens 4 Zeichen lang sein'; } return null; }, onFieldSubmitted: (_) => _submit(), ), const SizedBox(height: 8), Consumer( builder: (context, auth, _) { if (auth.error != null) { return Padding( padding: const EdgeInsets.only(bottom: 8), child: Text( auth.error!, style: TextStyle( color: Theme.of(context).colorScheme.error, ), textAlign: TextAlign.center, ), ); } return const SizedBox.shrink(); }, ), const SizedBox(height: 8), Consumer( builder: (context, auth, _) { return FilledButton( onPressed: auth.isLoading ? null : _submit, child: auth.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, ), ) : Text( _isRegistering ? 'Registrieren' : 'Anmelden', ), ); }, ), const SizedBox(height: 12), TextButton( onPressed: () { setState(() { _isRegistering = !_isRegistering; }); final authProvider = context.read(); authProvider.clearError(); }, child: Text( _isRegistering ? 'Bereits ein Konto? Anmelden' : 'Noch kein Konto? Registrieren', ), ), ], ), ), ), ), ), ); } }