import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../../core/api/api_error_mapper.dart'; import '../data/auth_providers.dart'; class LoginScreen extends ConsumerStatefulWidget { const LoginScreen({super.key}); @override ConsumerState createState() => _LoginScreenState(); } class _LoginScreenState extends ConsumerState { final _formKey = GlobalKey(); final _usernameCtrl = TextEditingController(); final _passwordCtrl = TextEditingController(); final _passwordFocus = FocusNode(); @override void dispose() { _usernameCtrl.dispose(); _passwordCtrl.dispose(); _passwordFocus.dispose(); super.dispose(); } Future _submit() async { if (!(_formKey.currentState?.validate() ?? false)) { return; } await ref.read(authStateProvider.notifier).login( _usernameCtrl.text.trim(), _passwordCtrl.text, ); // Router redirect handles navigation when authStateProvider updates. } @override Widget build(BuildContext context) { final authState = ref.watch(authStateProvider); final isLoading = authState is AsyncLoading; return Scaffold( appBar: AppBar(title: const Text('Logga in')), body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), child: Form( key: _formKey, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ TextFormField( controller: _usernameCtrl, decoration: const InputDecoration(labelText: 'Användarnamn'), textInputAction: TextInputAction.next, autofocus: true, enabled: !isLoading, onFieldSubmitted: (_) => FocusScope.of(context).requestFocus(_passwordFocus), validator: (value) { if (value == null || value.trim().isEmpty) { return 'Ange ditt användarnamn.'; } return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordCtrl, focusNode: _passwordFocus, decoration: const InputDecoration(labelText: 'Lösenord'), obscureText: true, textInputAction: TextInputAction.done, enabled: !isLoading, onFieldSubmitted: (_) => _submit(), validator: (value) { if (value == null || value.isEmpty) { return 'Ange ditt lösenord.'; } return null; }, ), const SizedBox(height: 28), if (isLoading) const Center(child: CircularProgressIndicator()) else FilledButton( onPressed: _submit, child: const Text('Logga in'), ), if (authState is AsyncError) Padding( padding: const EdgeInsets.only(top: 16), child: Text( mapErrorToUserMessage(authState.error!), textAlign: TextAlign.center, style: TextStyle( color: Theme.of(context).colorScheme.error), ), ), ], ), ), ), ), ), ); } }