TKK_E32231279/lib/screens/akun_screen.dart

513 lines
16 KiB
Dart

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'login_screen.dart';
class AkunScreen extends StatelessWidget {
const AkunScreen({super.key});
static const Color primaryColor = Color(0xFFA5CC36);
Widget _dialogHeader(IconData icon, String title) {
return Column(
children: [
CircleAvatar(
radius: 35,
backgroundColor: primaryColor,
child: Icon(icon, size: 35, color: Colors.black),
),
const SizedBox(height: 15),
Text(
title,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
],
);
}
Future<void> _resetPassword(BuildContext context) async {
final email = FirebaseAuth.instance.currentUser?.email;
if (email == null) return;
final konfirmasi = await showDialog<bool>(
context: context,
builder: (_) => AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
title: const Text("Reset Password"),
content: Text("Kirim link reset password ke:\n\n$email ?"),
actions: [
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text("Batal"),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context, true),
child: const Text("Kirim"),
),
],
),
);
if (konfirmasi != true) return;
try {
await FirebaseAuth.instance.sendPasswordResetEmail(email: email);
if (!context.mounted) return;
showDialog(
context: context,
barrierDismissible: false,
builder: (_) => Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25),
),
child: Padding(
padding: const EdgeInsets.all(25),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TweenAnimationBuilder(
duration: const Duration(milliseconds: 500),
tween: Tween(begin: 0.0, end: 1.0),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: Container(
width: 80,
height: 80,
decoration: const BoxDecoration(
color: primaryColor,
shape: BoxShape.circle,
),
child: const Icon(
Icons.check,
color: Colors.black,
size: 50,
),
),
);
},
),
const SizedBox(height: 20),
const Text(
"Berhasil",
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
const SizedBox(height: 10),
Text(
"Link reset password telah dikirim ke:\n\n$email",
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context),
child: const Text("OK"),
),
),
],
),
),
),
);
} catch (e) {
if (!context.mounted) return;
showDialog(
context: context,
builder: (_) => Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25),
),
child: Padding(
padding: const EdgeInsets.all(25),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TweenAnimationBuilder(
duration: const Duration(milliseconds: 500),
tween: Tween(begin: 0.0, end: 1.0),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: Container(
width: 80,
height: 80,
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
child: const Icon(
Icons.close,
color: Colors.white,
size: 50,
),
),
);
},
),
const SizedBox(height: 20),
const Text(
"Gagal",
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
const SizedBox(height: 10),
const Text(
"Gagal mengirim email reset password.\nSilakan coba lagi.",
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
),
onPressed: () => Navigator.pop(context),
child: const Text("OK"),
),
),
],
),
),
),
);
}
}
Future<void> _logout(BuildContext context) async {
final konfirmasi = await showDialog<bool>(
context: context,
builder: (_) => AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
title: const Text("Logout"),
content: const Text("Apakah Anda yakin ingin keluar dari akun?"),
actions: [
TextButton(
onPressed: () => Navigator.pop(context, false),
child: const Text("Batal"),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context, true),
child: const Text("Logout"),
),
],
),
);
if (konfirmasi != true) return;
await FirebaseAuth.instance.signOut();
if (!context.mounted) return;
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => const LoginScreen()),
(route) => false,
);
}
void _showInfoAplikasi(BuildContext context) {
showDialog(
context: context,
builder: (_) => Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
child: Padding(
padding: const EdgeInsets.all(24),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_dialogHeader(Icons.recycling, "Botol Plus"),
const SizedBox(height: 20),
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(15),
),
child: const Text(
"Botol Plus merupakan aplikasi yang dirancang untuk mendukung sistem penukaran botol berbasis Internet of Things (IoT).\n\n"
"Aplikasi ini digunakan untuk memantau hasil penukaran botol yang dilakukan melalui mesin bank sampah otomatis.\n\n"
"Pengguna dapat melihat saldo hasil penukaran botol, memantau riwayat transaksi, serta melakukan pembayaran menggunakan saldo yang dimiliki.\n\n"
"Dengan adanya aplikasi ini, proses pengelolaan sampah menjadi lebih mudah, transparan, dan efisien sehingga dapat meningkatkan kesadaran masyarakat dalam menjaga lingkungan.",
textAlign: TextAlign.justify,
),
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context),
child: const Text("Tutup"),
),
),
],
),
),
),
),
);
}
void _showPusatBantuan(BuildContext context) {
showDialog(
context: context,
builder: (_) => Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_dialogHeader(Icons.support_agent, "Pusat Bantuan"),
const SizedBox(height: 20),
Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(15),
),
child: const Column(
children: [
Text(
"Hubungi Admin",
style: TextStyle(fontWeight: FontWeight.bold),
),
SizedBox(height: 10),
Text(
"085745503094",
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
color: Colors.green,
),
),
],
),
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context),
child: const Text("Tutup"),
),
),
],
),
),
),
);
}
Widget buildMenu({
required IconData icon,
required String title,
required VoidCallback onTap,
Color iconColor = primaryColor,
}) {
return Card(
elevation: 2,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
child: ListTile(
leading: Icon(icon, color: iconColor),
title: Text(title),
trailing: const Icon(Icons.chevron_right),
onTap: onTap,
),
);
}
@override
Widget build(BuildContext context) {
final user = FirebaseAuth.instance.currentUser;
return Scaffold(
backgroundColor: Colors.grey.shade100,
appBar: AppBar(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
elevation: 0,
centerTitle: true,
title: const Text("Akun"),
),
body: ListView(
padding: const EdgeInsets.all(20),
children: [
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
),
child: Column(
children: [
const CircleAvatar(
radius: 45,
backgroundColor: primaryColor,
child: Icon(Icons.person, size: 45, color: Colors.black),
),
const SizedBox(height: 15),
Text(
user?.email ?? "-",
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
],
),
),
const SizedBox(height: 20),
buildMenu(
icon: Icons.person,
title: "Informasi Akun",
onTap: () {
showDialog(
context: context,
builder: (_) => Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25),
),
child: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_dialogHeader(Icons.person, "Informasi Akun"),
const SizedBox(height: 20),
Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(15),
),
child: Row(
children: [
const Icon(Icons.email, color: primaryColor),
const SizedBox(width: 10),
Expanded(
child: Text(
user?.email ?? "-",
style: const TextStyle(fontSize: 15),
),
),
],
),
),
const SizedBox(height: 20),
SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
),
onPressed: () => Navigator.pop(context),
child: const Text("Tutup"),
),
),
],
),
),
),
);
},
),
buildMenu(
icon: Icons.lock_reset,
title: "Reset Password",
onTap: () => _resetPassword(context),
),
buildMenu(
icon: Icons.info_outline,
title: "Informasi Aplikasi",
onTap: () => _showInfoAplikasi(context),
),
buildMenu(
icon: Icons.support_agent,
title: "Pusat Bantuan",
onTap: () => _showPusatBantuan(context),
),
const SizedBox(height: 25),
SizedBox(
height: 55,
child: ElevatedButton.icon(
icon: const Icon(Icons.logout),
label: const Text("Logout"),
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
foregroundColor: Colors.black,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
),
onPressed: () => _logout(context),
),
),
],
),
);
}
}