import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:ta_running/screens/main_screen.dart'; // tetap sama import 'register_screen.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:ta_running/screens/super_user_dashboard.dart'; // pastikan path sesuai class LoginScreen extends StatefulWidget { const LoginScreen({super.key}); @override State createState() => _LoginScreenState(); } class _LoginScreenState extends State { final _formKey = GlobalKey(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); bool _obscurePassword = true; Future _login() async { if (_formKey.currentState!.validate()) { try { final userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword( email: _emailController.text.trim(), password: _passwordController.text.trim(), ); final user = userCredential.user; if (user != null) { final doc = await FirebaseFirestore.instance .collection('users') .doc(user.uid) .get(); final role = doc.data()?['role'] ?? 'runner'; if (role == 'superuser') { Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => SuperUserDashboard()), (route) => false, ); } else { Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (_) => const MainScreen()), (route) => false, ); } } } on FirebaseAuthException catch (e) { String message = ''; switch (e.code) { case 'user-not-found': message = 'Email tidak ditemukan. Silakan daftar terlebih dahulu.'; break; case 'wrong-password': message = 'Password salah. Silakan coba lagi.'; break; case 'invalid-email': message = 'Format email tidak valid.'; break; case 'user-disabled': message = 'Akun ini telah dinonaktifkan.'; break; default: message = 'Terjadi kesalahan saat login.'; } ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); } catch (e) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Login gagal: ${e.toString()}"))); } } } @override Widget build(BuildContext context) { final inputBorder = OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: Colors.blueAccent), ); return Scaffold( backgroundColor: Colors.white, appBar: PreferredSize( preferredSize: const Size.fromHeight(80), child: Container( decoration: const BoxDecoration( color: Colors.blueAccent, borderRadius: BorderRadius.only( bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20), ), ), padding: const EdgeInsets.only(top: 40), // untuk push tulisan agak ke bawah child: const Center( child: Text( "Login", style: TextStyle( color: Colors.white, fontSize: 28, fontWeight: FontWeight.bold, ), ), ), ), ), body: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32), child: Form( key: _formKey, child: Column( children: [ // Logo di atas Image.asset( 'images/run.png', width: 95, height: 95, fit: BoxFit.contain, ), const SizedBox(height: 19), // Judul Text( 'Running', style: Theme.of(context).textTheme.headlineSmall?.copyWith( color: Colors.black87, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 32), // Email input TextFormField( controller: _emailController, decoration: InputDecoration( labelText: "Email", border: inputBorder, focusedBorder: inputBorder.copyWith(borderSide: const BorderSide(color: Colors.blueAccent, width: 2)), prefixIcon: const Icon(Icons.email, color: Colors.blueAccent), ), keyboardType: TextInputType.emailAddress, validator: (value) => value == null || value.isEmpty ? "Masukkan email" : null, ), const SizedBox(height: 20), // Password input TextFormField( controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( labelText: "Password", border: inputBorder, focusedBorder: inputBorder.copyWith(borderSide: const BorderSide(color: Colors.blueAccent, width: 2)), prefixIcon: const Icon(Icons.lock, color: Colors.blueAccent), suffixIcon: IconButton( icon: Icon(_obscurePassword ? Icons.visibility : Icons.visibility_off, color: Colors.blueAccent), onPressed: () => setState(() => _obscurePassword = !_obscurePassword), ), ), validator: (value) => value == null || value.isEmpty ? "Masukkan password" : null, ), const SizedBox(height: 36), // Login Button full width SizedBox( width: double.infinity, child: ElevatedButton( onPressed: _login, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 14), backgroundColor: Colors.blueAccent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), elevation: 5, ), child: const Text( "Login", style: TextStyle(fontSize: 18, color: Colors.white, fontWeight: FontWeight.bold), ), ), ), const SizedBox(height: 12), // Link ke Register TextButton( onPressed: () => Navigator.push( context, MaterialPageRoute(builder: (_) => const RegisterScreen()), ), child: RichText( text: TextSpan( children: [ const TextSpan( text: 'Belum punya akun? ', style: TextStyle( fontSize: 16, color: Colors.black, fontWeight: FontWeight.w400, ), ), TextSpan( text: 'Register', style: const TextStyle( fontSize: 16, color: Colors.blueAccent, fontWeight: FontWeight.w600, ), ), ], ), ), ) ], ), ), ), ); } }