387 lines
11 KiB
Dart
387 lines
11 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:firebase_auth/firebase_auth.dart';
|
|
import 'package:firebase_database/firebase_database.dart';
|
|
import 'dashboard.dart';
|
|
import 'history.dart';
|
|
import 'pesan.dart';
|
|
import '../widgets/fade_in_up.dart';
|
|
class AkunScreen extends StatefulWidget {
|
|
const AkunScreen({super.key});
|
|
|
|
@override
|
|
State<AkunScreen> createState() => _AkunScreenState();
|
|
}
|
|
|
|
class _AkunScreenState extends State<AkunScreen> {
|
|
final user = FirebaseAuth.instance.currentUser;
|
|
int selectedIndex = 3;
|
|
|
|
String get username {
|
|
if (user?.displayName != null && user!.displayName!.isNotEmpty) {
|
|
return user!.displayName!;
|
|
}
|
|
if (user?.email != null) return user!.email!.split("@")[0];
|
|
return "User";
|
|
}
|
|
String get email => user?.email ?? "email";
|
|
|
|
Future<void> _resetFermentasi() async {
|
|
await FirebaseDatabase.instance.ref("control").update({
|
|
"reset_request": true,
|
|
"fermentasi_aktif": false,
|
|
"waktu_mulai_ui": 0,
|
|
});
|
|
await FirebaseDatabase.instance.ref("fermentasi").update({
|
|
"waktu": 0,
|
|
"status": "Belum Mulai",
|
|
});
|
|
|
|
ScaffoldMessenger.of(
|
|
context,
|
|
).showSnackBar(const SnackBar(content: Text("Reset berhasil dikirim")));
|
|
}
|
|
|
|
Future<void> _logout() async {
|
|
await FirebaseAuth.instance.signOut();
|
|
if (mounted) Navigator.pushReplacementNamed(context, '/login');
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
bottomNavigationBar: _buildBottomNavbar(),
|
|
|
|
body: Stack(
|
|
children: [
|
|
Container(
|
|
decoration: const BoxDecoration(
|
|
gradient: LinearGradient(
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
stops: [0.0, 0.4, 0.7, 1.0],
|
|
colors: [
|
|
Color(0xFFE8F5E9),
|
|
Color(0xFFFFFDF0),
|
|
Color(0xFFF1F8E9),
|
|
Color(0xFFE8F5E9),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
SafeArea(
|
|
bottom: false,
|
|
child: SingleChildScrollView(
|
|
padding: const EdgeInsets.fromLTRB(20, 24, 20, 110),
|
|
child: Column(
|
|
children: [
|
|
/// HEADER
|
|
FadeInUp(
|
|
delay: 0,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
IconButton(
|
|
icon: const Icon(Icons.arrow_back_ios_new, size: 20),
|
|
onPressed: () => Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => const DashboardPage()),
|
|
),
|
|
),
|
|
const Text(
|
|
"My Account",
|
|
style: TextStyle(
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
GestureDetector(
|
|
onTap: () => Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => const NotificationPage(),
|
|
),
|
|
),
|
|
child: Container(
|
|
width: 42,
|
|
height: 42,
|
|
decoration: BoxDecoration(
|
|
color: const Color(0xFF2E7D32),
|
|
borderRadius: BorderRadius.circular(14),
|
|
),
|
|
child: const Icon(
|
|
Icons.notifications_none_rounded,
|
|
color: Colors.white,
|
|
size: 22,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 25),
|
|
|
|
/// USERNAME CARD
|
|
FadeInUp(
|
|
delay: 150,
|
|
child: _buildTopCard(
|
|
icon: Icons.work_outline,
|
|
text: username,
|
|
color: Colors.green,
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 20),
|
|
|
|
/// PROJECT NAME
|
|
FadeInUp(delay: 300, child: _buildProjectCard()),
|
|
|
|
const SizedBox(height: 20),
|
|
|
|
/// PERSONAL INFO
|
|
FadeInUp(delay: 450, child: _buildInfoCard()),
|
|
|
|
const SizedBox(height: 30),
|
|
|
|
/// LOGOUT
|
|
FadeInUp(
|
|
delay: 600,
|
|
child: SizedBox(
|
|
width: double.infinity,
|
|
height: 50,
|
|
child: ElevatedButton(
|
|
onPressed: _logout,
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: const Color(0xFFF9A825),
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(14),
|
|
),
|
|
),
|
|
child: const Text(
|
|
"LOGOUT",
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.bold,
|
|
fontSize: 16,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 30),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
/// ================= WIDGET =================
|
|
|
|
Widget _buildTopCard({
|
|
required IconData icon,
|
|
required String text,
|
|
required Color color,
|
|
}) {
|
|
return Container(
|
|
padding: const EdgeInsets.all(16),
|
|
decoration: _cardStyle(),
|
|
child: Row(
|
|
children: [
|
|
_iconBox(icon, color),
|
|
const SizedBox(width: 12),
|
|
Text(text, style: const TextStyle(fontSize: 14)),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildProjectCard() {
|
|
return Container(
|
|
width: double.infinity,
|
|
padding: const EdgeInsets.all(18),
|
|
decoration: _cardStyle(),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: const [
|
|
Text(
|
|
"Project Name",
|
|
style: TextStyle(fontSize: 12, color: Colors.black54),
|
|
),
|
|
SizedBox(height: 6),
|
|
Text(
|
|
"Fermentasi tape ketan dan tape singkong",
|
|
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildInfoCard() {
|
|
return Container(
|
|
padding: const EdgeInsets.all(18),
|
|
decoration: _cardStyle(),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
const Text(
|
|
"PERSONAL INFO",
|
|
style: TextStyle(
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.bold,
|
|
color: Colors.black45,
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 15),
|
|
|
|
_infoRow(Icons.person, Colors.blue, "Full Name", username),
|
|
const SizedBox(height: 12),
|
|
|
|
_infoRow(Icons.mail, Colors.blueGrey, "Email", email),
|
|
const SizedBox(height: 12),
|
|
|
|
GestureDetector(
|
|
onTap: _resetFermentasi,
|
|
behavior: HitTestBehavior.opaque,
|
|
child: _infoRow(
|
|
Icons.refresh,
|
|
Colors.lightBlue,
|
|
"Fermentasi",
|
|
"reset waktu baru",
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _infoRow(IconData icon, Color color, String title, String value) {
|
|
return Row(
|
|
children: [
|
|
_iconBox(icon, color),
|
|
const SizedBox(width: 12),
|
|
|
|
Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
title,
|
|
style: const TextStyle(fontSize: 12, color: Colors.black54),
|
|
),
|
|
Text(
|
|
value,
|
|
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _iconBox(IconData icon, Color color) {
|
|
return Container(
|
|
width: 40,
|
|
height: 40,
|
|
decoration: BoxDecoration(
|
|
color: color.withOpacity(0.2),
|
|
borderRadius: BorderRadius.circular(10),
|
|
),
|
|
child: Icon(icon, color: color),
|
|
);
|
|
}
|
|
|
|
BoxDecoration _cardStyle() {
|
|
return BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(20),
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: Colors.black.withOpacity(0.05),
|
|
blurRadius: 15,
|
|
offset: const Offset(0, 5),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildBottomNavbar() {
|
|
return Container(
|
|
decoration: const BoxDecoration(
|
|
color: Color(0xFFE8F5E9),
|
|
borderRadius: BorderRadius.vertical(top: Radius.circular(30)),
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: Colors.black12,
|
|
blurRadius: 10,
|
|
offset: Offset(0, -2),
|
|
),
|
|
],
|
|
),
|
|
child: ClipRRect(
|
|
borderRadius: const BorderRadius.vertical(top: Radius.circular(30)),
|
|
child: BottomNavigationBar(
|
|
currentIndex: 2,
|
|
onTap: (index) {
|
|
if (index == 0) {
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => const DashboardPage()),
|
|
);
|
|
} else if (index == 1) {
|
|
Navigator.pushReplacement(
|
|
context,
|
|
MaterialPageRoute(builder: (context) => const HistoryPage()),
|
|
);
|
|
}
|
|
},
|
|
showSelectedLabels: false,
|
|
showUnselectedLabels: false,
|
|
backgroundColor: Colors.transparent,
|
|
elevation: 0,
|
|
type: BottomNavigationBarType.fixed,
|
|
items: [
|
|
BottomNavigationBarItem(
|
|
icon: _navIcon(Icons.home_filled, 0),
|
|
label: 'Home',
|
|
),
|
|
BottomNavigationBarItem(
|
|
icon: _navIcon(Icons.history, 1),
|
|
label: 'History',
|
|
),
|
|
BottomNavigationBarItem(
|
|
icon: _navIcon(Icons.people_alt_rounded, 2),
|
|
label: 'Profile',
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _navIcon(IconData icon, int index) {
|
|
bool isSelected = index == 2;
|
|
return AnimatedContainer(
|
|
duration: const Duration(milliseconds: 300),
|
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(16),
|
|
gradient: isSelected
|
|
? const LinearGradient(
|
|
colors: [Color(0xFF2E7D32), Color(0xFF4CAF50)],
|
|
)
|
|
: null,
|
|
),
|
|
child: Icon(
|
|
icon,
|
|
color: isSelected ? Colors.white : const Color(0xFF81C784),
|
|
size: 24,
|
|
),
|
|
);
|
|
}
|
|
}
|