import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'register_screen.dart'; import 'home_screen.dart'; class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final emailController = TextEditingController(); final passController = TextEditingController(); bool isLoading = false; bool _obscurePassword = true; // 👈 untuk icon mata Future loginUser() async { /// VALIDASI KOSONG if (emailController.text.isEmpty || passController.text.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text("Email dan Password wajib diisi"), ), ); return; } try { setState(() => isLoading = true); await FirebaseAuth.instance.signInWithEmailAndPassword( email: emailController.text.trim(), password: passController.text.trim(), ); /// JIKA BERHASIL Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => const HomeScreen()), ); } on FirebaseAuthException catch (e) { String message; switch (e.code) { case 'user-not-found': message = "Akun belum terdaftar"; break; case 'wrong-password': message = "Password salah"; break; case 'invalid-credential': message = "Email atau password salah"; break; case 'invalid-email': message = "Format email tidak valid"; break; default: message = e.message ?? "Login gagal"; } ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message)), ); } finally { setState(() => isLoading = false); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFF34C759), body: Stack( children: [ /// CONTAINER PUTIH BAWAH Align( alignment: Alignment.bottomCenter, child: Container( height: MediaQuery.of(context).size.height * 0.75, padding: const EdgeInsets.all(25), decoration: const BoxDecoration( color: Color(0xFFF2F2F2), borderRadius: BorderRadius.only( topLeft: Radius.circular(30), topRight: Radius.circular(30), ), ), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ /// LOGO Center( child: Column( children: [ Image.asset( "assets/logo.png", height: 100, ), const SizedBox(height: 10), const Text("Selamat Datang!"), ], ), ), const SizedBox(height: 30), const Text( "Masuk", style: TextStyle( fontSize: 22, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 20), /// EMAIL TextField( controller: emailController, decoration: InputDecoration( hintText: "Email / No. Telepon", filled: true, fillColor: Colors.white, border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), ), const SizedBox(height: 15), /// PASSWORD + ICON MATA TextField( controller: passController, obscureText: _obscurePassword, decoration: InputDecoration( hintText: "Kata Sandi", filled: true, fillColor: Colors.white, border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), suffixIcon: IconButton( icon: Icon( _obscurePassword ? Icons.visibility_off : Icons.visibility, color: const Color(0xFF34C759), ), onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, ), ), ), const SizedBox(height: 20), /// BUTTON MASUK SizedBox( width: double.infinity, height: 45, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF34C759), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), onPressed: isLoading ? null : loginUser, child: isLoading ? const CircularProgressIndicator( color: Colors.white) : const Text("Masuk"), ), ), const SizedBox(height: 15), /// BUTTON REGISTER SizedBox( width: double.infinity, height: 45, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF34C759), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (_) => const RegisterScreen()), ); }, child: const Text("Buat Akun"), ), ), ], ), ), ), ) ], ), ); } }