TKK_E32231651/lib/pengaturan.dart

381 lines
15 KiB
Dart

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<PengaturanScreen> createState() => _PengaturanScreenState();
}
class _PengaturanScreenState extends State<PengaturanScreen> {
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()),
);
}),
],
),
);
}
}