import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:firebase_auth/firebase_auth.dart'; import '../widgets/fade_in_up.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final emailController = TextEditingController(); final passwordController = TextEditingController(); bool isLoading = false; bool obscurePassword = true; bool rememberMe = false; Future loginUser() async { final emailText = emailController.text.trim(); final passwordText = passwordController.text.trim(); if (emailText.isEmpty || passwordText.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Email/Username dan Password tidak boleh kosong")), ); return; } // Jika pengguna memasukkan username saja tanpa email format, // kita bantu tambahkan domain default agar valid sebagai email di Firebase String email = emailText; if (!emailText.contains('@')) { email = "$emailText@safebite.com"; } setState(() => isLoading = true); try { await FirebaseAuth.instance.signInWithEmailAndPassword( email: email, password: passwordText, ); if (mounted) { Navigator.pushReplacementNamed(context, '/dashboard'); } } on FirebaseAuthException catch (e) { String errorMessage = "Login gagal"; if (e.code == 'user-not-found' || e.code == 'invalid-credential') { errorMessage = "Email/Username atau Password salah."; } else if (e.code == 'wrong-password') { errorMessage = "Password salah."; } else if (e.code == 'invalid-email') { errorMessage = "Format email tidak valid."; } else { errorMessage = e.message ?? "Login gagal: ${e.code}"; } if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(errorMessage)), ); } } catch (e) { debugPrint("Login Error: $e"); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Terjadi kesalahan: $e")), ); } } finally { if (mounted) { setState(() => isLoading = false); } } } @override Widget build(BuildContext context) { return Scaffold( body: Container( width: double.infinity, height: double.infinity, decoration: const BoxDecoration( gradient: LinearGradient( colors: [Colors.white, Color(0xFFE3F2FD), Color(0xFF42A5F5), Color(0xFF1565C0)], begin: Alignment.topLeft, end: Alignment.bottomRight, stops: [0.1, 0.4, 0.8, 1.0], ), ), child: SafeArea( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: SingleChildScrollView( child: Column( children: [ const SizedBox(height: 60), /// ===== LOGO ===== FadeInUp( delay: 200, child: Hero( tag: 'app_logo', child: Image.asset('assets/images/logo_formalin.png', height: 160), ), ), const SizedBox(height: 50), /// ===== INPUT ===== FadeInUp( delay: 300, child: _buildTextField( controller: emailController, hint: "Username or Email", icon: Icons.person, ), ), const SizedBox(height: 20), FadeInUp( delay: 400, child: _buildTextField( controller: passwordController, hint: "Password", icon: Icons.lock, isPassword: true, ), ), const SizedBox(height: 50), /// ===== LOGIN BUTTON ===== FadeInUp( delay: 500, child: Container( width: double.infinity, height: 55, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(30), boxShadow: [ BoxShadow( color: const Color(0xFF1565C0).withOpacity(0.3), blurRadius: 15, offset: const Offset(0, 8), ), ], ), child: ElevatedButton( onPressed: isLoading ? null : loginUser, style: ElevatedButton.styleFrom( backgroundColor: Colors.transparent, shadowColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), child: isLoading ? const CircularProgressIndicator(color: Color(0xFF1565C0)) : const Text( "Login", style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Color(0xFF1565C0), letterSpacing: 1.2, ), ), ), ), ), const SizedBox(height: 30), /// ===== REGISTER TEXT ===== Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( "Don't have an account yet? ", style: TextStyle(color: Colors.white70), ), GestureDetector( onTap: () { Navigator.pushNamed(context, '/signup'); }, child: const Text( "Register", style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, decoration: TextDecoration.underline, decorationColor: Colors.white, ), ), ), ], ), const SizedBox(height: 30), ], ), ), ), ), ), ); } /// ===== TEXTFIELD ===== Widget _buildTextField({ required TextEditingController controller, required String hint, required IconData icon, bool isPassword = false, }) { return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(25), boxShadow: [ BoxShadow( color: const Color(0xFF1565C0).withOpacity(0.15), blurRadius: 15, offset: const Offset(0, 8), ), ], ), child: TextField( controller: controller, obscureText: isPassword ? obscurePassword : false, decoration: InputDecoration( prefixIcon: Icon(icon, color: const Color(0xFF1565C0)), hintText: hint, hintStyle: const TextStyle(color: Colors.grey), border: InputBorder.none, contentPadding: const EdgeInsets.symmetric(vertical: 20), suffixIcon: isPassword ? IconButton( icon: Icon( obscurePassword ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () { setState(() { obscurePassword = !obscurePassword; }); }, ) : null, ), ), ); } }