import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:provider/provider.dart'; import '../config.dart'; import '../services/session_manager.dart'; class LoginScreen extends StatefulWidget { final VoidCallback onSwitchToSignup; final VoidCallback onLoginSuccess; const LoginScreen({ required this.onSwitchToSignup, required this.onLoginSuccess, super.key, }); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); Future _login() async { if (_formKey.currentState!.validate()) { final email = _emailController.text; final password = _passwordController.text; try { final response = await http.post( Uri.parse('$apiBaseUrl/api/v1/auth/signin'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'email': email, 'password': password}), ); if (response.statusCode == 200) { final data = jsonDecode(response.body); final token = data['token']; final name = data['user']?['username'] ?? data['username']; await Provider.of(context, listen: false).login( token: token, email: email, name: name, ); widget.onLoginSuccess(); } else { final data = jsonDecode(response.body); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(data['message'] ?? 'Login failed')), ); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Login error: $e')), ); } } } @override Widget build(BuildContext context) { return Scaffold( body: Padding( padding: const EdgeInsets.all(24.0), child: Form( key: _formKey, child: SingleChildScrollView( child: Column( children: [ const SizedBox(height: 40), ClipRRect( borderRadius: BorderRadius.circular(20), child: Image.asset( 'assets/icon/app_icon.png', width: 100, height: 100, ), ), const SizedBox(height: 16), Text( 'Log in to Fuel Stats', style: TextStyle( fontSize: 24, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 32), TextFormField( controller: _emailController, decoration: InputDecoration( labelText: 'Email', prefixIcon: Icon(Icons.email), border: OutlineInputBorder(), ), keyboardType: TextInputType.emailAddress, validator: (value) { if (value == null || value.isEmpty) return 'Please enter your email'; if (!RegExp(r'^[^@]+@[^@]+\.[^@]+').hasMatch(value)) return 'Enter a valid email'; return null; }, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, decoration: InputDecoration( labelText: 'Password', prefixIcon: Icon(Icons.lock), border: OutlineInputBorder(), ), obscureText: true, validator: (value) { if (value == null || value.isEmpty) return 'Please enter your password'; if (value.length < 6) return 'Password must be at least 6 characters'; return null; }, ), const SizedBox(height: 24), ElevatedButton.icon( onPressed: _login, icon: Icon(Icons.login), label: Text('Log In'), style: ElevatedButton.styleFrom( backgroundColor: Colors.green, foregroundColor: Colors.white, padding: EdgeInsets.symmetric(horizontal: 32, vertical: 12), ), ), const SizedBox(height: 12), TextButton( onPressed: widget.onSwitchToSignup, child: Text("Don't have an account? Sign up"), ), ], ), ), ), ), ); } }