import 'dart:convert'; 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:frontend/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; Future _login() async { setState(() { _isLoading = true; }); String email = _emailController.text.trim(); String password = _passwordController.text.trim(); if (email.isEmpty || password.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Email dan Password harus diisi")), ); setState(() { _isLoading = false; }); return; } try { var url = Uri.parse("http://localhost:5000/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 { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(responseData['message'] ?? "Login gagal")), ); } } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Terjadi kesalahan: $e")), ); } setState(() { _isLoading = false; }); } @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.pop(context); }, ), ), 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', border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), ), SizedBox(height: 20), TextField( controller: _passwordController, obscureText: true, decoration: InputDecoration( labelText: 'Password', border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), ), 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), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => RegisterPage(), ), ); }, child: Text( 'Belum punya akun? Daftar', style: TextStyle( color: Colors.white, decoration: TextDecoration.underline, ), ), ), SizedBox(width: 10), GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ForgotPasswordPage(), ), ); }, child: Text( 'Lupa Password?', style: TextStyle( color: Colors.white, decoration: TextDecoration.underline, ), ), ), ], ), ], ), ), ), ), ], ), ); } }