TKK_E32210493/lib/login.dart

282 lines
9.5 KiB
Dart

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<Login> createState() => _LoginState();
}
class _LoginState extends State<Login> {
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
bool isPasswordVisible = false;
bool rememberMe = false;
bool isLoading = false;
@override
void initState() {
super.initState();
checkLoginStatus();
}
Future<void> checkLoginStatus() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool loggedIn = prefs.getBool('loggedIn') ?? false;
if (loggedIn) {
Navigator.pushReplacement(
context, MaterialPageRoute(builder: (context) => Dashboard()));
}
}
Future<void> 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<void> 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: <Widget>[
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),
),
),
],
),
],
),
),
),
);
}
}