import 'dart:convert'; import 'package:SIBAYAM/user/before_login.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'home_page.dart'; import 'package:SIBAYAM/admin/admin_page.dart'; import 'register_page.dart'; import 'forgot_password_page.dart'; class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); } class _LoginPageState extends State { final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); bool _isLoading = false; bool _isPasswordVisible = false; // Method to show error dialog void _showErrorDialog(String message) { showDialog( context: context, builder: (context) => AlertDialog( title: Row( children: [ Icon(Icons.error_outline, color: Colors.red), SizedBox(width: 10), Text('Error'), ], ), content: Text(message), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: Text('OK', style: TextStyle(color: Color(0xFF9DC08D))), ), ], shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), ), ); } Future _login() async { setState(() { _isLoading = true; }); String email = _emailController.text.trim(); String password = _passwordController.text.trim(); if (email.isEmpty || password.isEmpty) { setState(() { _isLoading = false; }); _showErrorDialog('Email dan Password harus diisi'); return; } try { var url = Uri.parse( "https://beckend-sistem-pakar-diagnosa-penyakit.onrender.com/api/auth/login", ); var response = await http.post( url, headers: {"Content-Type": "application/json"}, body: jsonEncode({"email": email, "password": password}), ); var responseData = jsonDecode(response.body); if (response.statusCode == 200) { // Simpan token & role ke SharedPreferences final SharedPreferences prefs = await SharedPreferences.getInstance(); print("User ID dari respons login: ${responseData['userId']}"); await prefs.setString('token', responseData['token']); await prefs.setString('role', responseData['role']); await prefs.setString('email', email); await prefs.setString('userId', responseData['userId'].toString()); // Redirect berdasarkan role if (responseData['role'] == 'admin') { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => AdminPage()), ); } else { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => HomePage()), ); } } else { setState(() { _isLoading = false; }); _showErrorDialog( responseData['message'] ?? 'Email atau Password salah', ); } } catch (e) { setState(() { _isLoading = false; }); _showErrorDialog('Terjadi kesalahan koneksi. Silakan coba lagi.'); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xFF9DC08D), body: Stack( children: [ Positioned( top: 40, left: 20, child: IconButton( icon: Icon(Icons.arrow_back, color: Colors.white), onPressed: () { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => BeforeLogin()), ); }, ), ), Center( child: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset('assets/images/bayam.png', height: 150), SizedBox(height: 30), Card( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15), ), elevation: 5, child: Padding( padding: const EdgeInsets.all(20.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ TextField( controller: _emailController, decoration: InputDecoration( labelText: 'email', labelStyle: TextStyle( color: Colors.black.withOpacity(0.7), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: BorderSide( color: Colors.black.withOpacity(0.6), width: 2, ), ), ), ), SizedBox(height: 20), TextField( controller: _passwordController, obscureText: !_isPasswordVisible, // Toggle visibility based on state decoration: InputDecoration( labelText: 'Password', labelStyle: TextStyle( color: Colors.black.withOpacity(0.7), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: BorderSide( color: Colors.black.withOpacity(0.6), width: 2, ), ), suffixIcon: IconButton( icon: Icon( _isPasswordVisible ? Icons.visibility : Icons.visibility_off, color: Color(0xFF9DC08D), ), onPressed: () { setState(() { _isPasswordVisible = !_isPasswordVisible; }); }, ), ), ), SizedBox(height: 20), SizedBox( width: double.infinity, height: 50, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.green, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), onPressed: _isLoading ? null : _login, child: _isLoading ? CircularProgressIndicator( color: Colors.white, ) : Text( 'Login', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ], ), ), ), SizedBox(height: 20), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => RegisterPage(), ), ); }, style: TextButton.styleFrom( backgroundColor: Colors.white, padding: EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.person_add_outlined, color: Color(0xFF9DC08D), size: 16, ), SizedBox(width: 8), Text( 'Belum punya akun? Daftar', style: TextStyle( color: Color(0xFF9DC08D), fontWeight: FontWeight.w500, fontSize: 13, ), ), ], ), ), SizedBox(height: 10), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ForgotPasswordPage(), ), ); }, style: TextButton.styleFrom( backgroundColor: Colors.white, padding: EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.lock_reset_outlined, color: Color(0xFF9DC08D), size: 16, ), SizedBox(width: 8), Text( 'Lupa Password?', style: TextStyle( color: Color(0xFF9DC08D), fontWeight: FontWeight.w500, fontSize: 13, ), ), ], ), ), ], ), ], ), ), ), ), ], ), ); } }