import 'package:flutter/material.dart'; import 'package:qyuota/config/colors.dart'; import 'package:qyuota/services/auth_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:qyuota/view/auth/welcome_screen.dart'; import 'package:qyuota/view/home/home_view.dart'; import 'package:qyuota/view/home/change_password_screen.dart'; import 'package:get/get.dart'; class ProfileView extends StatefulWidget { const ProfileView({Key? key}) : super(key: key); @override State createState() => _ProfileViewState(); } class _ProfileViewState extends State with SingleTickerProviderStateMixin { Map? userData; late AnimationController _controller; late Animation _animation; @override void initState() { super.initState(); _loadUserData(); _controller = AnimationController( duration: const Duration(milliseconds: 800), vsync: this, ); _animation = CurvedAnimation( parent: _controller, curve: Curves.easeInOut, ); _controller.forward(); } @override void dispose() { _controller.dispose(); super.dispose(); } Future _loadUserData() async { final data = await AuthService().getUserData(); setState(() { userData = data; }); } void _logout() async { // Menghapus sesi pengguna atau token SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.remove('userToken'); // Ganti 'userToken' dengan kunci yang sesuai // Navigasi ke halaman welcome Get.offAll(() => WelcomeScreen()); // Pastikan WelcomeScreen diimpor } @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: Column( children: [ Container( padding: const EdgeInsets.only(top: 50, bottom: 30), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ ConstColors.primaryColor, ConstColors.primaryColor.withOpacity(0.8), ], ), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(40), bottomRight: Radius.circular(40), ), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.3), spreadRadius: 2, blurRadius: 10, offset: const Offset(0, 3), ), ], ), child: Column( children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: Row( children: [ IconButton( icon: const Icon( Icons.arrow_back_ios, color: Colors.white, ), onPressed: () => Navigator.pop(context), ), const Expanded( child: Text( 'Profile', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ), ), ), const SizedBox(width: 40), ], ), ), FadeTransition( opacity: _animation, child: Column( children: [ Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: Colors.white, width: 3), ), child: const CircleAvatar( radius: 60, backgroundColor: Colors.white, child: Icon( Icons.person, size: 60, color: ConstColors.primaryColor, ), ), ), const SizedBox(height: 15), Text( userData?['name'] ?? 'Loading...', style: const TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: Colors.white, shadows: [ Shadow( offset: Offset(0, 2), blurRadius: 4, color: Color.fromRGBO(0, 0, 0, 0.3), ), ], ), ), const SizedBox(height: 5), Text( userData?['email'] ?? 'Loading...', style: TextStyle( color: Colors.white.withOpacity(0.9), fontSize: 16, ), ), ], ), ), ], ), ), const SizedBox(height: 30), Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: SlideTransition( position: Tween( begin: const Offset(0, 0.5), end: Offset.zero, ).animate(_animation), child: Column( children: [ _buildInfoCard( icon: Icons.email, title: 'Email', value: userData?['email'] ?? 'Not set', ), _buildInfoCard( icon: Icons.work, title: 'Position', value: userData?['role'] ?? 'Not set', ), _buildInfoCard( icon: Icons.lock, title: 'Change Password', value: 'Tap to change your password', onTap: () { // TODO: Navigate to password change screen Get.to(() => const ChangePasswordScreen()); }, ), const SizedBox(height: 20), ElevatedButton.icon( onPressed: _logout, icon: const Icon( Icons.logout, color: Colors.white, ), label: const Text( 'Log Out', style: TextStyle(color: Colors.white), ), style: ElevatedButton.styleFrom( backgroundColor: ConstColors.skyColor, ), ), ], ), ), ), ], ), ), ); } Widget _buildInfoCard({ required IconData icon, required String title, required String value, VoidCallback? onTap, }) { return Container( margin: const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(15), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.1), spreadRadius: 1, blurRadius: 8, offset: const Offset(0, 2), ), ], ), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.circular(15), onTap: onTap, child: Padding( padding: const EdgeInsets.all(20), child: Row( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: ConstColors.primaryColor.withOpacity(0.1), borderRadius: BorderRadius.circular(10), ), child: Icon( icon, color: ConstColors.primaryColor, size: 24, ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 14, color: Colors.grey[600], ), ), const SizedBox(height: 4), Text( value, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ), ], ), ), ], ), ), ), ), ); } }