TIF_NGANJUK_E41212036/lib/presentation/controllers/profil_controller.dart

319 lines
9.7 KiB
Dart

import 'dart:developer';
import 'package:e_porter/_core/service/preferences_service.dart';
import 'package:e_porter/_core/utils/snackbar/snackbar_helper.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:get/get.dart';
import '../../domain/models/user_entity.dart';
import '../../domain/usecases/profil_usecase.dart';
class ProfilController extends GetxController {
final CreatePassengerUseCase createPassengerUseCase;
final GetPassengerByIdUseCase getPassengerByIdUseCase;
final GetUserByIdUseCase getUserByIdUseCase;
final ChangePasswordUseCase changePasswordUseCase;
final ChangePhoneUseCase changePhoneUseCase;
final ChangeNoIdUseCase changeNoIdUseCase;
final DeletePassengerUseCase deletePassengerUseCase;
final UpdatePassengerUseCase updatePassengerUseCase;
// final ChangeEmailUseCase changeEmailUseCase;
var passengerList = <PassengerModel>[].obs;
var userData = Rxn<UserData>();
var isLoading = false.obs;
var isChangingPassword = false.obs;
var isChangingPhone = false.obs;
var isChangingNoId = false.obs;
var isDeletingPassenger = false.obs;
var isUpdatingPassenger = false.obs;
// var isChangingEmail = false.obs;
ProfilController({
required this.createPassengerUseCase,
required this.getPassengerByIdUseCase,
required this.getUserByIdUseCase,
required this.changePasswordUseCase,
required this.changePhoneUseCase,
required this.changeNoIdUseCase,
required this.deletePassengerUseCase,
required this.updatePassengerUseCase,
// required this.changeEmailUseCase,
});
@override
void onInit() {
super.onInit();
_loadProfile();
}
// Future<void> reloadProfile() async {
// final user = FirebaseAuth.instance.currentUser;
// if (user == null) return;
// final uid = user.uid;
// await FirebaseFirestore.instance.collection('users').doc(uid).update({'email': user.email});
// final fresh = await getUserByIdUseCase(uid);
// userData.value = fresh;
// await PreferencesService.saveUserData(fresh);
// }
Future<void> _loadProfile() async {
isLoading.value = true;
try {
final cached = await PreferencesService.getUserData();
String? uid = cached?.uid;
uid ??= FirebaseAuth.instance.currentUser?.uid;
if (uid == null) {
log("Tidak ditemukan user yang sedang login");
return;
}
final fresh = await getUserByIdUseCase(uid);
userData.value = fresh;
await PreferencesService.saveUserData(fresh);
} catch (e) {
log("Error fetching profile: $e");
} finally {
isLoading.value = false;
}
}
Future<void> addPassenger({
required String userId,
required String typeId,
required String noId,
required String name,
required String gender,
}) async {
final passenger = PassengerModel(
typeId: typeId,
noId: noId,
name: name,
gender: gender,
);
await createPassengerUseCase(
userId: userId,
passenger: passenger,
);
}
Future<void> fetchPassangerById(String userId) async {
try {
List<PassengerModel> list = await getPassengerByIdUseCase(userId);
passengerList.assignAll(list);
} catch (e) {
log("Error fetching passengers: $e");
}
}
Future<bool> deletePassenger({
required String userId,
required String passengerId,
}) async {
isDeletingPassenger.value = true;
try {
await deletePassengerUseCase(
userId: userId,
passengerId: passengerId,
);
SnackbarHelper.showSuccess("Berhasil", "Data penumpang berhasil dihapus.");
return true;
} catch (e) {
log("Error deleting passenger: $e");
SnackbarHelper.showError("Gagal", "Terjadi kesalahan saat menghapus data penumpang.");
return false;
} finally {
isDeletingPassenger.value = false;
}
}
Future<bool> updatePassenger({
required String userId,
required String passengerId,
required PassengerModel passenger,
}) async {
isUpdatingPassenger.value = true;
try {
await updatePassengerUseCase(
userId: userId,
passengerId: passengerId,
passenger: passenger,
);
return true;
} catch (e) {
log("Error updating passenger: $e");
SnackbarHelper.showError("Gagal", "Terjadi kesalahan saat mengupdate data penumpang.");
return false;
} finally {
isUpdatingPassenger.value = false;
}
}
Future<bool> changePassword({
required String oldPassword,
required String newPassword,
}) async {
isChangingPassword.value = true;
try {
await changePasswordUseCase(
oldPassword: oldPassword,
newPassword: newPassword,
);
SnackbarHelper.showSuccess("Berhasil", "Password berhasil diperbarui.");
return true;
} on FirebaseAuthException catch (e) {
if (e.code == 'wrong-password' || e.code == 'invalid-credential') {
SnackbarHelper.showError("Gagal", "Password lama salah.");
} else if (e.code == 'weak-password') {
SnackbarHelper.showError("Gagal", "Password baru terlalu lemah.");
} else {
SnackbarHelper.showError("Gagal", "Error: ${e.message}");
}
return false;
} catch (e) {
SnackbarHelper.showError("Gagal", "Terjadi kesalahan.");
return false;
} finally {
isChangingPassword.value = false;
}
}
Future<bool> changePhone({
required String oldPassword,
required String newPhone,
}) async {
isChangingPhone.value = true;
try {
await changePhoneUseCase(
oldPassword: oldPassword,
newPhone: newPhone,
);
await _loadProfile();
SnackbarHelper.showSuccess("Berhasil", "Nomor telepon berhasil diperbarui.");
return true;
} on FirebaseAuthException catch (e) {
if (e.code == 'wrong-password' || e.code == 'invalid-credential') {
SnackbarHelper.showError("Gagal", "Password lama salah.");
} else {
SnackbarHelper.showError("Gagal", e.message ?? "Terjadi kesalahan.");
}
return false;
} catch (_) {
SnackbarHelper.showError("Gagal", "Terjadi kesalahan.");
return false;
} finally {
isChangingPhone.value = false;
}
}
Future<bool> changeNoId({
required String oldPassword,
required String typeId,
required String noId,
}) async {
isChangingNoId.value = true;
try {
await changeNoIdUseCase(
oldPassword: oldPassword,
typeId: typeId,
noId: noId,
);
await _loadProfile();
SnackbarHelper.showSuccess("Berhasil", "Nomor ID berhasil diperbarui.");
return true;
} on FirebaseAuthException catch (e) {
if (e.code == 'wrong-password' || e.code == 'invalid-credential') {
SnackbarHelper.showError("Gagal", "Password lama salah.");
} else {
SnackbarHelper.showError("Gagal", e.message ?? "Terjadi kesalahan.");
}
return false;
} catch (e) {
if (e.toString().contains("Nomor ID sudah digunakan oleh pengguna lain")) {
SnackbarHelper.showError("Gagal", "Nomor ID sudah digunakan oleh pengguna lain.");
} else {
SnackbarHelper.showError("Gagal", "Terjadi kesalahan: $e");
}
return false;
} finally {
isChangingNoId.value = false;
}
}
// Future<bool> changeEmail({
// required String oldPassword,
// required String newEmail,
// }) async {
// isChangingEmail.value = true;
// try {
// await changeEmailUseCase(
// oldPassword: oldPassword,
// newEmail: newEmail,
// );
// await reloadProfile();
// SnackbarHelper.showSuccess("Berhasil", "Email berhasil diubah. Silakan cek $newEmail untuk verifikasi.");
// return true;
// } on FirebaseAuthException catch (e) {
// switch (e.code) {
// case 'wrong-password':
// case 'invalid-credential':
// SnackbarHelper.showError("Gagal", "Password lama salah.");
// break;
// case 'email-already-in-use':
// SnackbarHelper.showError("Gagal", "Email baru sudah digunakan.");
// break;
// case 'operation-not-allowed':
// SnackbarHelper.showError("Gagal", "Email/Password signin belum diaktifkan di Firebase Console.");
// break;
// default:
// SnackbarHelper.showError("Gagal", e.message ?? e.code);
// }
// return false;
// } finally {
// isChangingEmail.value = false;
// }
// }
// Future<bool> changeEmail({
// required String oldPassword,
// required String newEmail,
// }) async {
// isChangingEmail.value = true;
// try {
// await changeEmailUseCase(oldPassword: oldPassword, newEmail: newEmail);
// SnackbarHelper.showSuccess("Link Terkirim", "Silakan cek email $newEmail untuk verifikasi.");
// return true;
// } on FirebaseAuthException catch (e) {
// switch (e.code) {
// case 'wrong-password':
// case 'invalid-credential':
// SnackbarHelper.showError("Gagal", "Password lama salah.");
// break;
// case 'email-already-in-use':
// SnackbarHelper.showError("Gagal", "Email baru sudah digunakan.");
// break;
// case 'unauthorized-domain':
// SnackbarHelper.showError(
// "Gagal",
// "Domain verifikasi belum diizinkan. "
// "Tambahkan \"eporter.page.link\" di Firebase Console → Authentication → Settings → Authorized domains.");
// break;
// default:
// SnackbarHelper.showError("Gagal", e.message ?? e.code);
// }
// return false;
// } catch (_) {
// SnackbarHelper.showError("Gagal", "Terjadi kesalahan.");
// return false;
// } finally {
// isChangingEmail.value = false;
// }
// }
}