381 lines
15 KiB
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()),
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|