import 'package:finalproject/services/auth_service.dart'; import 'package:finalproject/theme/colors.dart'; import 'package:finalproject/theme/text_styles.dart'; import 'package:flutter/material.dart'; import 'package:finalproject/widgets/password_reset_dialog.dart'; import 'settings_controller.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @override State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State { late final SettingsController _controller; String _userName = 'Ibu Sulastri'; String _userEmail = 'sulastri.aritanto10@gmail.com'; @override void initState() { super.initState(); _controller = SettingsController(); _loadAccount(); } Future _loadAccount() async { final name = await AuthService.getUserName(); final email = await AuthService.getUserEmail(); if (!mounted) return; setState(() { _userName = name; _userEmail = email; }); } void _showMessage(String message, {bool isError = false}) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(message), backgroundColor: isError ? AppColors.statusError : AppColors.primaryBrown, ), ); } Future _showResetPasswordDialog() async { final success = await showPasswordResetDialog( context, initialAccount: _userEmail, lockAccountField: true, ); if (success) { _showMessage('Password berhasil diperbarui dengan verifikasi OTP'); } } void _showLogoutDialog() { showDialog( context: context, builder: (context) => AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), title: Text( 'Logout', style: AppTextStyles.headlineSmall.copyWith( color: AppColors.textPrimary, ), ), content: Text( 'Apakah Anda yakin ingin keluar dari aplikasi?', style: AppTextStyles.bodyMedium.copyWith( color: AppColors.textSecondary, ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text( 'Batal', style: AppTextStyles.labelLarge.copyWith( color: AppColors.textSecondary, ), ), ), ElevatedButton( onPressed: () async { Navigator.pop(context); await AuthService.logout(); if (!context.mounted) return; Navigator.of( context, ).pushNamedAndRemoveUntil('/login', (route) => false); }, style: ElevatedButton.styleFrom( backgroundColor: AppColors.statusError, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: Text( 'Logout', style: AppTextStyles.labelLarge.copyWith(color: Colors.white), ), ), ], ), ); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (context, _) { return Scaffold( backgroundColor: AppColors.bgLight, appBar: AppBar( backgroundColor: AppColors.primaryBrown, elevation: 0, title: Text( 'Pengaturan', style: AppTextStyles.headlineLarge.copyWith(color: Colors.white), ), ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildSectionTitle('Akun'), const SizedBox(height: 16), _buildAccountCard(), const SizedBox(height: 32), _buildSectionTitle('Keamanan'), const SizedBox(height: 16), _buildActionCard( icon: Icons.lock_outlined, title: 'Ubah Password', subtitle: 'Verifikasi OTP melalui email akun', onTap: _showResetPasswordDialog, ), const SizedBox(height: 32), SizedBox( width: double.infinity, child: ElevatedButton.icon( onPressed: _showLogoutDialog, icon: const Icon(Icons.logout), label: const Text('Logout'), style: ElevatedButton.styleFrom( backgroundColor: AppColors.statusError, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 14), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ), ), const SizedBox(height: 32), _buildAppInfo(), ], ), ), ), bottomNavigationBar: BottomNavigationBar( currentIndex: _controller.selectedIndex, onTap: (index) { _controller.setSelectedIndex(index); switch (index) { case 0: Navigator.of(context).pushNamed('/dashboard'); break; case 1: Navigator.of(context).pushNamed('/products'); break; case 2: Navigator.of(context).pushNamed('/transaction'); break; case 3: Navigator.of(context).pushNamed('/prediction'); break; case 4: Navigator.of(context).pushNamed('/reports'); break; case 5: break; } }, type: BottomNavigationBarType.fixed, backgroundColor: Colors.white, items: const [ BottomNavigationBarItem( icon: Icon(Icons.home_outlined), label: 'Dashboard', ), BottomNavigationBarItem( icon: Icon(Icons.shopping_bag_outlined), label: 'Produk', ), BottomNavigationBarItem( icon: Icon(Icons.shopping_cart_outlined), label: 'Stok Masuk', ), BottomNavigationBarItem( icon: Icon(Icons.trending_up_outlined), label: 'Prediksi', ), BottomNavigationBarItem( icon: Icon(Icons.description_outlined), label: 'Laporan', ), BottomNavigationBarItem( icon: Icon(Icons.settings_outlined), label: 'Pengaturan', ), ], ), ); }, ); } Widget _buildSectionTitle(String title) { return Text( title, style: AppTextStyles.headlineSmall.copyWith(color: AppColors.textPrimary), ); } Widget _buildAccountCard() { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: AppColors.bgWhite, borderRadius: BorderRadius.circular(16), boxShadow: [AppColors.shadowLight], ), child: Row( children: [ Container( width: 60, height: 60, decoration: BoxDecoration( color: AppColors.primaryBrown, borderRadius: BorderRadius.circular(12), ), child: const Icon(Icons.person, color: Colors.white, size: 32), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( _userName, style: AppTextStyles.labelLarge.copyWith( color: AppColors.textPrimary, fontWeight: FontWeight.w700, ), ), const SizedBox(height: 4), Text( _userEmail, style: AppTextStyles.bodySmall.copyWith( color: AppColors.textSecondary, ), ), ], ), ), ], ), ); } Widget _buildActionCard({ required IconData icon, required String title, required String subtitle, required VoidCallback onTap, }) { return InkWell( onTap: onTap, borderRadius: BorderRadius.circular(12), child: Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: AppColors.bgWhite, borderRadius: BorderRadius.circular(12), boxShadow: [AppColors.shadowLight], ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Row( children: [ Icon(icon, color: AppColors.primaryBrown, size: 24), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: AppTextStyles.labelLarge.copyWith( color: AppColors.textPrimary, ), ), const SizedBox(height: 2), Text( subtitle, style: AppTextStyles.bodySmall.copyWith( color: AppColors.textSecondary, ), ), ], ), ), ], ), ), Icon(Icons.chevron_right, color: AppColors.textSecondary), ], ), ), ); } Widget _buildAppInfo() { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: AppColors.bgLight, borderRadius: BorderRadius.circular(12), border: Border.all(color: AppColors.grey300), ), child: Column( children: [ Text( 'Tobaku Sulastri', style: AppTextStyles.labelLarge.copyWith( color: AppColors.textPrimary, fontWeight: FontWeight.w700, ), ), const SizedBox(height: 8), Text( 'Version 1.0.0', style: AppTextStyles.bodySmall.copyWith( color: AppColors.textSecondary, ), ), const SizedBox(height: 12), Text( '(c) 2025 Tobaku Sulastri', style: AppTextStyles.bodySmall.copyWith( color: AppColors.textTertiary, ), textAlign: TextAlign.center, ), ], ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } }