TKK_E32230949/lib/screens/login_screen.dart

223 lines
7.0 KiB
Dart

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<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final emailController = TextEditingController();
final passController = TextEditingController();
bool isLoading = false;
bool _obscurePassword = true; // 👈 untuk icon mata
Future<void> 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"),
),
),
],
),
),
),
)
],
),
);
}
}