import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); final _formKey = GlobalKey(); bool _obscurePassword = true; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future _login() async { if (!_formKey.currentState!.validate()) return; final auth = context.read(); final success = await auth.login( _usernameController.text, _passwordController.text, ); if (!success && mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(auth.error ?? 'Login failed'), backgroundColor: Colors.red, ), ); } } @override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Logo/Icon Container( width: 100, height: 100, decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary.withOpacity(0.2), borderRadius: BorderRadius.circular(24), ), child: Icon( Icons.terminal_rounded, size: 50, color: Theme.of(context).colorScheme.primary, ), ), const SizedBox(height: 24), // Title Text( 'Captain Claude', style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( 'TZZR Mobile Interface', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.grey, ), textAlign: TextAlign.center, ), const SizedBox(height: 48), // Username TextFormField( controller: _usernameController, decoration: const InputDecoration( labelText: 'Username', prefixIcon: Icon(Icons.person_outline), ), textInputAction: TextInputAction.next, validator: (value) { if (value == null || value.isEmpty) { return 'Enter username'; } return null; }, ), const SizedBox(height: 16), // Password TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: 'Password', prefixIcon: const Icon(Icons.lock_outline), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility : Icons.visibility_off, ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), obscureText: _obscurePassword, textInputAction: TextInputAction.done, onFieldSubmitted: (_) => _login(), validator: (value) { if (value == null || value.isEmpty) { return 'Enter password'; } return null; }, ), const SizedBox(height: 32), // Login Button Consumer( builder: (context, auth, _) { return ElevatedButton( onPressed: auth.isLoading ? null : _login, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), backgroundColor: Theme.of(context).colorScheme.primary, foregroundColor: Colors.white, ), child: auth.isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( 'Login', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ); }, ), ], ), ), ), ), ), ); } }