158 lines
4.0 KiB
Dart
158 lines
4.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:penyaluran_app/app/data/models/user_model.dart';
|
|
import 'package:penyaluran_app/app/services/auth_service.dart';
|
|
|
|
class ProfileController extends GetxController {
|
|
final AuthService _authService = Get.find<AuthService>();
|
|
|
|
final Rx<User?> user = Rx<User?>(null);
|
|
final RxBool isLoading = true.obs;
|
|
final RxBool isEditing = false.obs;
|
|
|
|
// Form controllers
|
|
late TextEditingController nameController;
|
|
late TextEditingController emailController;
|
|
late TextEditingController phoneController;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
nameController = TextEditingController();
|
|
emailController = TextEditingController();
|
|
phoneController = TextEditingController();
|
|
loadUserData();
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
nameController.dispose();
|
|
emailController.dispose();
|
|
phoneController.dispose();
|
|
super.onClose();
|
|
}
|
|
|
|
Future<void> loadUserData() async {
|
|
isLoading.value = true;
|
|
try {
|
|
// Mendapatkan data user dari service
|
|
final userData = await _authService.getCurrentUser();
|
|
user.value = userData;
|
|
|
|
// Mengisi form controllers dengan data user
|
|
if (userData != null) {
|
|
nameController.text = userData.name ?? '';
|
|
emailController.text = userData.email ?? '';
|
|
phoneController.text = userData.phone ?? '';
|
|
}
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
'Error',
|
|
'Gagal memuat data profil: ${e.toString()}',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
void toggleEditMode() {
|
|
isEditing.value = !isEditing.value;
|
|
}
|
|
|
|
Future<void> updateProfile() async {
|
|
if (nameController.text.isEmpty) {
|
|
Get.snackbar(
|
|
'Error',
|
|
'Nama tidak boleh kosong',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
return;
|
|
}
|
|
|
|
isLoading.value = true;
|
|
try {
|
|
// Update user data
|
|
final updatedUser = User(
|
|
id: user.value?.id,
|
|
name: nameController.text,
|
|
email: emailController.text,
|
|
phone: phoneController.text,
|
|
role: user.value?.role,
|
|
token: user.value?.token,
|
|
);
|
|
|
|
// Panggil API untuk update profil
|
|
await _authService.updateProfile(updatedUser);
|
|
|
|
// Refresh data
|
|
await loadUserData();
|
|
|
|
// Keluar dari mode edit
|
|
isEditing.value = false;
|
|
|
|
Get.snackbar(
|
|
'Sukses',
|
|
'Profil berhasil diperbarui',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
colorText: Colors.white,
|
|
);
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
'Error',
|
|
'Gagal memperbarui profil: ${e.toString()}',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
|
|
Future<void> changePassword(String currentPassword, String newPassword,
|
|
String confirmPassword) async {
|
|
if (newPassword != confirmPassword) {
|
|
Get.snackbar(
|
|
'Error',
|
|
'Konfirmasi password tidak sesuai',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
return;
|
|
}
|
|
|
|
isLoading.value = true;
|
|
try {
|
|
// Panggil API untuk ganti password
|
|
await _authService.changePassword(currentPassword, newPassword);
|
|
|
|
Get.back(); // Tutup dialog
|
|
|
|
Get.snackbar(
|
|
'Sukses',
|
|
'Password berhasil diubah',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.green,
|
|
colorText: Colors.white,
|
|
);
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
'Error',
|
|
'Gagal mengubah password: ${e.toString()}',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Colors.red,
|
|
colorText: Colors.white,
|
|
);
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
}
|
|
}
|