TKK_E32231279/lib/screens/login_screen.dart

222 lines
9.2 KiB
Dart

import 'package:flutter/material.dart';
import '../services/auth_service.dart';
import 'dashboard_screen.dart';
import 'admin_dashboard_screen.dart'; // 🔥 tambah ini
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
bool _obscurePassword = true;
bool _isLoading = false;
@override
Widget build(BuildContext context) {
final screenHeight = MediaQuery.of(context).size.height;
return Scaffold(
resizeToAvoidBottomInset: true,
body: Container(
width: double.infinity,
height: double.infinity,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/background.png"),
fit: BoxFit.cover,
),
),
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.only(
top: screenHeight * 0.12,
left: 25,
right: 25,
),
child: Column(
children: [
Image.asset(
"assets/logo.png",
width: 200,
),
SizedBox(height: screenHeight * 0.05),
Container(
width: double.infinity,
padding: const EdgeInsets.all(25),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 165, 204, 54),
borderRadius: BorderRadius.circular(25),
),
child: Form(
key: _formKey,
child: Column(
children: [
// ===== EMAIL =====
TextFormField(
controller: _emailController,
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
labelText: "Email",
filled: true,
fillColor:
const Color.fromARGB(255, 223, 242, 112),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
borderSide: BorderSide.none,
),
),
validator: (value) {
if (value == null || value.isEmpty) {
return "Email tidak boleh kosong";
}
return null;
},
),
const SizedBox(height: 20),
// ===== PASSWORD =====
TextFormField(
controller: _passwordController,
obscureText: _obscurePassword,
decoration: InputDecoration(
labelText: "Password",
filled: true,
fillColor:
const Color.fromARGB(255, 223, 242, 112),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(15),
borderSide: BorderSide.none,
),
suffixIcon: IconButton(
icon: Icon(
_obscurePassword
? Icons.visibility_off
: Icons.visibility,
),
onPressed: () {
setState(() {
_obscurePassword = !_obscurePassword;
});
},
),
),
validator: (value) {
if (value == null || value.isEmpty) {
return "Password tidak boleh kosong";
}
return null;
},
),
const SizedBox(height: 20),
// ===== LOGIN BUTTON =====
SizedBox(
width: 140,
height: 45,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor:
const Color.fromARGB(255, 11, 22, 0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
onPressed: _isLoading
? null
: () async {
if (_formKey.currentState!.validate()) {
setState(() {
_isLoading = true;
});
try {
final user =
await AuthService().login(
email: _emailController.text.trim(),
password:
_passwordController.text.trim(),
);
if (user != null) {
final role = user['role'];
// 🔥 CEK ROLE
if (role == "admin") {
Navigator.pushReplacement(
// ignore: use_build_context_synchronously
context,
MaterialPageRoute(
builder: (_) =>
const AdminDashboardScreen(),
),
);
} else {
Navigator.pushReplacement(
// ignore: use_build_context_synchronously
context,
MaterialPageRoute(
builder: (_) =>
const DashboardScreen(),
),
);
}
} else {
throw Exception(
"Data user tidak ditemukan");
}
} catch (e) {
// ignore: use_build_context_synchronously
ScaffoldMessenger.of(context)
.showSnackBar(
SnackBar(
content: Text(
e
.toString()
.replaceAll("Exception:", ""),
),
backgroundColor: Colors.red,
),
);
}
setState(() {
_isLoading = false;
});
}
},
child: _isLoading
? const CircularProgressIndicator(
color: Colors.white,
strokeWidth: 2,
)
: const Text(
"Login",
style:
TextStyle(color: Colors.white),
),
),
),
],
),
),
),
],
),
),
),
),
);
}
}