import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:environment_monitoring_app/services/api_service.dart'; import 'package:environment_monitoring_app/auth_provider.dart'; import 'package:environment_monitoring_app/home_page.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); // FIX: Removed direct instantiation of ApiService bool _isLoading = false; String _errorMessage = ''; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); super.dispose(); } Future _login() async { if (!_formKey.currentState!.validate()) { return; } setState(() { _isLoading = true; _errorMessage = ''; }); final auth = Provider.of(context, listen: false); // FIX: Retrieve ApiService from the Provider tree final apiService = Provider.of(context, listen: false); // --- Offline Check for First Login --- if (auth.isFirstLogin) { final connectivityResult = await Connectivity().checkConnectivity(); if (connectivityResult == ConnectivityResult.none) { if (!mounted) return; setState(() { _isLoading = false; _errorMessage = 'An internet connection is required for the first login to sync initial data.'; }); _showSnackBar(_errorMessage, isError: true); return; } } // --- API Call --- final Map result = await apiService.login( // FIX: Use retrieved instance _emailController.text.trim(), _passwordController.text.trim(), ); if (!mounted) return; if (result['success'] == true) { // --- Update AuthProvider --- final String token = result['data']['token']; // CORRECTED: The API now returns a 'profile' object on login, not 'user'. final Map profile = result['data']['profile']; // The login method in AuthProvider now handles setting the token, profile, // and triggering the full data sync. await auth.login(token, profile); if (auth.isFirstLogin) { await auth.setIsFirstLogin(false); } if (!mounted) return; // Navigate to the home screen Navigator.of(context).pushReplacement( MaterialPageRoute(builder: (context) => const HomePage()), ); } else { // Login failed, show error message setState(() { _isLoading = false; _errorMessage = result['message'] ?? 'An unknown error occurred.'; }); _showSnackBar(_errorMessage, isError: true); } } void _showSnackBar(String message, {bool isError = false}) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message), backgroundColor: isError ? Theme.of(context).colorScheme.error : null, ), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Login'), centerTitle: true, ), body: Center( child: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Form( key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "PSTW MMS V4", style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 32), Center( child: Image.asset( 'assets/icon_3_512x512.png', height: 120, width: 120, ), ), const SizedBox(height: 48), TextFormField( controller: _emailController, decoration: const InputDecoration(labelText: "Email"), keyboardType: TextInputType.emailAddress, validator: (val) => val == null || val.isEmpty ? "Enter your email" : null, ), const SizedBox(height: 16), TextFormField( controller: _passwordController, decoration: const InputDecoration(labelText: "Password"), obscureText: true, validator: (val) => val == null || val.length < 6 ? "Minimum 6 characters" : null, ), const SizedBox(height: 24), _isLoading ? const CircularProgressIndicator() : ElevatedButton( onPressed: _login, style: ElevatedButton.styleFrom( minimumSize: const Size(double.infinity, 50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: const Text( 'Login', style: TextStyle(fontSize: 18), ), ), if (_errorMessage.isNotEmpty) Padding( padding: const EdgeInsets.only(top: 12), child: Text( _errorMessage, style: TextStyle(color: Theme.of(context).colorScheme.error), textAlign: TextAlign.center, ), ), const SizedBox(height: 15), TextButton( onPressed: () { Navigator.pushNamed(context, '/forgot-password'); }, child: const Text('Forgot Password?'), ), TextButton( onPressed: () { Navigator.pushNamed(context, '/register'); }, child: const Text('Don\'t have an account? Register'), ), ], ), ), ), ), ); } }