import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:input_kwh/dashboard.dart'; import 'package:input_kwh/registrasi.dart'; class Login extends StatefulWidget { @override State createState() => _LoginState(); } class _LoginState extends State { TextEditingController emailController = TextEditingController(); TextEditingController passwordController = TextEditingController(); bool isPasswordVisible = false; bool rememberMe = false; bool isLoading = false; @override void initState() { super.initState(); checkLoginStatus(); } Future checkLoginStatus() async { SharedPreferences prefs = await SharedPreferences.getInstance(); bool loggedIn = prefs.getBool('loggedIn') ?? false; if (loggedIn) { Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => Dashboard())); } } Future saveUserPreferences() async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setBool('rememberMe', rememberMe); if (rememberMe) { prefs.setString('email', emailController.text.trim()); prefs.setString('password', passwordController.text.trim()); } else { prefs.remove('email'); prefs.remove('password'); } } Future signInWithEmailAndPassword(BuildContext context) async { setState(() { isLoading = true; }); try { UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword( email: emailController.text.trim(), password: passwordController.text.trim(), ); if (userCredential.user != null) { await saveUserPreferences(); SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.setBool('loggedIn', true); Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => Dashboard())); } else { showErrorDialog(context, "Failed to sign in. Please check your email and password."); } } catch (e) { print("Error signing in: $e"); showErrorDialog(context, "Error signing in: $e"); } finally { setState(() { isLoading = false; }); } } void showErrorDialog(BuildContext context, String message) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text("Error"), content: Text(message), actions: [ TextButton( child: Text("OK"), onPressed: () { Navigator.of(context).pop(); }, ), ], ); }, ); } void togglePasswordVisibility() { setState(() { isPasswordVisible = !isPasswordVisible; }); } void toggleRememberMe() { setState(() { rememberMe = !rememberMe; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, backgroundColor: Colors.transparent, ), backgroundColor: Color(0xFF102C57), body: Container( margin: EdgeInsets.symmetric(horizontal: 30), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( margin: EdgeInsets.only(top: 20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Welcome Back!', style: GoogleFonts.poppins( fontSize: 28, color: Colors.white, fontWeight: FontWeight.bold), ), SizedBox(height: 10), Text( 'Login to continue', style: GoogleFonts.poppins( color: Colors.white, ), ), ], ), ), SizedBox(height: 50), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Email Address', style: GoogleFonts.poppins( fontWeight: FontWeight.bold, color: Colors.white)), SizedBox(height: 12), Container( height: 45, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(50), color: Colors.white), child: Padding( padding: EdgeInsets.symmetric(horizontal: 20), child: TextFormField( controller: emailController, style: GoogleFonts.poppins(fontWeight: FontWeight.w300), decoration: InputDecoration.collapsed( hintText: '', hintStyle: GoogleFonts.poppins( fontWeight: FontWeight.w300, color: Colors.grey)), ), ), ), ], ), SizedBox(height: 20), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Password', style: GoogleFonts.poppins( fontWeight: FontWeight.bold, color: Colors.white)), SizedBox(height: 12), Container( height: 45, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(50), color: Colors.white), child: Padding( padding: EdgeInsets.symmetric(horizontal: 20), child: Row( children: [ Expanded( child: TextFormField( controller: passwordController, obscureText: !isPasswordVisible, style: GoogleFonts.poppins( fontWeight: FontWeight.w300), decoration: InputDecoration( hintText: '', hintStyle: GoogleFonts.poppins( fontWeight: FontWeight.w300, color: Colors.grey), border: InputBorder.none, ), ), ), IconButton( icon: Icon( isPasswordVisible ? Icons.visibility : Icons.visibility_off, color: Colors.grey, ), onPressed: togglePasswordVisibility, ), ], ), ), ), SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Checkbox( value: rememberMe, onChanged: (value) { toggleRememberMe(); }, ), Text( 'Remember Me', style: GoogleFonts.poppins(color: Colors.white), ), ], ), ], ), SizedBox(height: 46), Column( children: [ Container( height: 54, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(28), color: Color(0xFFDAC0A3)), child: TextButton( onPressed: isLoading ? null : () { signInWithEmailAndPassword(context); }, child: Text('Login', style: GoogleFonts.poppins( color: Colors.black, fontWeight: FontWeight.bold))), ), SizedBox(height: 16), TextButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => RegistrationScreen())); }, child: Text( 'Don\'t have an account? Sign Up', style: GoogleFonts.poppins(color: Colors.white), ), ), ], ), ], ), ), ), ); } }