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(); bool _obscurePassword = true; @override void dispose() { _usernameController.dispose(); _passwordController.dispose(); super.dispose(); } Future _login() async { final username = _usernameController.text.trim(); final password = _passwordController.text; if (username.isEmpty || password.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Please enter username and password'), backgroundColor: Colors.orange, ), ); return; } final auth = context.read(); await auth.login(username, password); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFF1A1A1A), body: SafeArea( child: SingleChildScrollView( padding: const EdgeInsets.all(24), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: 60), // Logo Icon( Icons.auto_awesome, size: 80, color: Colors.orange.shade400, ), const SizedBox(height: 24), // Title const Text( 'Captain Claude', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 32, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( 'Your AI Command Center', textAlign: TextAlign.center, style: TextStyle( color: Colors.grey.shade400, fontSize: 16, ), ), const SizedBox(height: 60), // Username field TextField( controller: _usernameController, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: 'Username', labelStyle: TextStyle(color: Colors.grey.shade400), prefixIcon: Icon(Icons.person, color: Colors.grey.shade400), filled: true, fillColor: const Color(0xFF2D2D2D), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: Colors.orange.shade400), ), ), ), const SizedBox(height: 16), // Password field TextField( controller: _passwordController, obscureText: _obscurePassword, style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: 'Password', labelStyle: TextStyle(color: Colors.grey.shade400), prefixIcon: Icon(Icons.lock, color: Colors.grey.shade400), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: Colors.grey.shade400, ), onPressed: () { setState(() => _obscurePassword = !_obscurePassword); }, ), filled: true, fillColor: const Color(0xFF2D2D2D), border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide.none, ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: Colors.orange.shade400), ), ), onSubmitted: (_) => _login(), ), const SizedBox(height: 24), // Error message Consumer( builder: (context, auth, _) { if (auth.error != null) { return Padding( padding: const EdgeInsets.only(bottom: 16), child: Text( auth.error!, textAlign: TextAlign.center, style: TextStyle( color: Colors.red.shade400, fontSize: 14, ), ), ); } return const SizedBox.shrink(); }, ), // Login button Consumer( builder: (context, auth, _) { return ElevatedButton( onPressed: auth.isLoading ? null : _login, style: ElevatedButton.styleFrom( backgroundColor: Colors.orange.shade700, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), disabledBackgroundColor: Colors.grey.shade800, ), child: auth.isLoading ? const SizedBox( width: 24, height: 24, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text( 'Sign In', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ); }, ), ], ), ), ), ); } }