import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import 'ver.dart'; import 'privacy_policy.dart'; class PengaturanScreen extends StatefulWidget { const PengaturanScreen({super.key}); @override State createState() => _PengaturanScreenState(); } class _PengaturanScreenState extends State { String apiUrl = "http://192.168.100.9/kopikaocare_api/change_password.php"; void showChangePasswordDialog() { final oldPassword = TextEditingController(); final newPassword = TextEditingController(); final confirmPassword = TextEditingController(); bool hide1 = true; bool hide2 = true; bool hide3 = true; bool isLoading = false; showDialog( context: context, barrierDismissible: false, builder: (context) { return StatefulBuilder( builder: (context, setStateDialog) { return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(25), ), child: Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( borderRadius: BorderRadius.circular(25), gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ Colors.white, Colors.red.shade50, ], ), ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.red.withOpacity(0.1), shape: BoxShape.circle, ), child: const Icon( Icons.lock_reset, size: 40, color: Colors.red, ), ), const SizedBox(height: 16), const Text( 'Ganti Password', style: TextStyle( fontSize: 22, fontWeight: FontWeight.bold, color: Color(0xff2d2d2d), ), ), const SizedBox(height: 8), const Text( 'Masukkan password lama dan baru', style: TextStyle( fontSize: 13, color: Color(0xff666666), ), ), const SizedBox(height: 24), TextField( controller: oldPassword, obscureText: hide1, style: const TextStyle(fontSize: 14), decoration: InputDecoration( labelText: 'Password Lama', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( hide1 ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () => setStateDialog(() => hide1 = !hide1), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.grey.shade50, ), ), const SizedBox(height: 16), TextField( controller: newPassword, obscureText: hide2, style: const TextStyle(fontSize: 14), decoration: InputDecoration( labelText: 'Password Baru', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( hide2 ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () => setStateDialog(() => hide2 = !hide2), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.grey.shade50, ), ), const SizedBox(height: 16), TextField( controller: confirmPassword, obscureText: hide3, style: const TextStyle(fontSize: 14), decoration: InputDecoration( labelText: 'Konfirmasi Password', prefixIcon: const Icon(Icons.lock_outline, color: Colors.red), suffixIcon: IconButton( icon: Icon( hide3 ? Icons.visibility_off : Icons.visibility, color: Colors.grey, ), onPressed: () => setStateDialog(() => hide3 = !hide3), ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(15), borderSide: BorderSide.none, ), filled: true, fillColor: Colors.grey.shade50, ), ), const SizedBox(height: 24), Row( children: [ Expanded( child: OutlinedButton( onPressed: () => Navigator.pop(context), style: OutlinedButton.styleFrom( foregroundColor: Colors.grey, side: BorderSide(color: Colors.grey.shade300), padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), child: const Text('Batal'), ), ), const SizedBox(width: 12), Expanded( child: ElevatedButton( onPressed: isLoading ? null : () async { if (newPassword.text != confirmPassword.text) { ScaffoldMessenger.of(context) .showSnackBar( const SnackBar( content: Text('Password baru tidak cocok'), backgroundColor: Colors.orange, ), ); return; } setStateDialog(() => isLoading = true); final prefs = await SharedPreferences.getInstance(); String email = prefs.getString('email') ?? ''; var response = await http.post( Uri.parse(apiUrl), body: { "email": email, "old_password": oldPassword.text, "new_password": newPassword.text, }, ); setStateDialog(() => isLoading = false); if (response.body.trim() == "success") { Navigator.pop(context); ScaffoldMessenger.of(context) .showSnackBar( const SnackBar( content: Text('Password berhasil diubah'), backgroundColor: Colors.green, ), ); } else { ScaffoldMessenger.of(context) .showSnackBar( const SnackBar( content: Text('Password lama salah'), backgroundColor: Colors.red, ), ); } }, style: ElevatedButton.styleFrom( backgroundColor: Colors.red, padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), child: isLoading ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator( strokeWidth: 2, color: Colors.white, ), ) : const Text('Simpan'), ), ), ], ), ], ), ), ); }, ); }, ); } Widget menuItem(String title, IconData icon, VoidCallback onTap, {Color color = Colors.red}) { return Container( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ BoxShadow( blurRadius: 10, color: Colors.red.withOpacity(0.05), offset: const Offset(0, 4), ), ], ), child: ListTile( leading: Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: color.withOpacity(0.1), borderRadius: BorderRadius.circular(15), ), child: Icon(icon, color: color, size: 24), ), title: Text( title, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Color(0xff2d2d2d), ), ), trailing: Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( color: Colors.red.withOpacity(0.1), borderRadius: BorderRadius.circular(10), ), child: const Icon(Icons.arrow_forward_ios, size: 14, color: Colors.red), ), onTap: onTap, ), ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xfff8f9fa), appBar: AppBar( title: const Text( 'Pengaturan', style: TextStyle(fontWeight: FontWeight.bold), ), backgroundColor: Colors.red, foregroundColor: Colors.white, elevation: 0, ), body: Column( children: [ const SizedBox(height: 20), Container( margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.all(16), decoration: BoxDecoration( gradient: LinearGradient( colors: [Colors.red.shade50, Colors.white], ), borderRadius: BorderRadius.circular(20), border: Border.all(color: Colors.red.withOpacity(0.1)), ), child: Row( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(15), ), child: const Icon(Icons.settings, color: Colors.white, size: 24), ), const SizedBox(width: 12), const Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Pengaturan Aplikasi', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Color(0xff2d2d2d), ), ), Text( 'Atur preferensi aplikasi Anda', style: TextStyle(fontSize: 12, color: Color(0xff888888)), ), ], ), ), ], ), ), const SizedBox(height: 10), menuItem("Ganti Password", Icons.lock, showChangePasswordDialog), menuItem("Versi Aplikasi", Icons.info_outline, () { Navigator.push( context, MaterialPageRoute(builder: (context) => const VerScreen()), ); }), menuItem("Privacy Policy", Icons.privacy_tip, () { Navigator.push( context, MaterialPageRoute( builder: (context) => const PrivacyPolicyScreen()), ); }), ], ), ); } }