import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; import '../providers/settings_provider.dart'; import '../services/api_service.dart'; import 'register_page.dart'; class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State { final _usernameController = TextEditingController(); final _passwordController = TextEditingController(); bool _isLoading = false; void _handleLogin() async { setState(() => _isLoading = true); final settings = context.read(); final auth = context.read(); final api = ApiService(settings, null); try { final response = await api.login( _usernameController.text, _passwordController.text, ); if (response.statusCode == 200) { final data = jsonDecode(response.body); await auth.login(data['token']); } else { final error = jsonDecode(response.body)['error'] ?? "Login Failed"; ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(error))); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Network Error"))); } finally { setState(() => _isLoading = false); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Login")), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField(controller: _usernameController, decoration: InputDecoration(labelText: "Username")), TextField(controller: _passwordController, decoration: InputDecoration(labelText: "Password"), obscureText: true), SizedBox(height: 20), _isLoading ? CircularProgressIndicator() : ElevatedButton(onPressed: _handleLogin, child: Text("Login")), TextButton( onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => RegisterPage())), child: Text("Don't have an account? Register"), ), ], ), ), ); } }