import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../core/api_client.dart'; import '../core/auth_service.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 _isSubmitting = false; String? _errorMessage; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } Future _submit() async { if (!_formKey.currentState!.validate()) return; setState(() { _isSubmitting = true; _errorMessage = null; }); try { await context.read().login(_emailController.text.trim(), _passwordController.text); } on ApiException catch (e) { setState(() => _errorMessage = e.message); } finally { if (mounted) setState(() => _isSubmitting = false); } } @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( 'Домашняя автоматизация', style: Theme.of(context).textTheme.headlineSmall, textAlign: TextAlign.center, ), const SizedBox(height: 32), TextFormField( controller: _emailController, keyboardType: TextInputType.emailAddress, autofillHints: const [AutofillHints.email], decoration: const InputDecoration(labelText: 'Email'), validator: (value) => (value == null || value.isEmpty) ? 'Введите email' : null, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, obscureText: true, autofillHints: const [AutofillHints.password], decoration: const InputDecoration(labelText: 'Пароль'), validator: (value) => (value == null || value.isEmpty) ? 'Введите пароль' : null, onFieldSubmitted: (_) => _submit(), ), if (_errorMessage != null) ...[ const SizedBox(height: 16), Text( _errorMessage!, style: TextStyle(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.center, ), ], const SizedBox(height: 24), FilledButton( onPressed: _isSubmitting ? null : _submit, child: _isSubmitting ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) : const Text('Войти'), ), ], ), ), ), ), ), ); } }