import 'package:get/get.dart'; import 'package:taafee_mobile/core/local_storage/local_storage.dart'; import 'package:taafee_mobile/core/routing/routing_manager.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/forgot_password.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/login.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/login_response.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/register.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/reset_token.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/user.dart'; import 'package:taafee_mobile/features/auth/data_layer/model/verification_code.dart'; import 'package:taafee_mobile/features/auth/data_layer/source/auth_service.dart'; import 'package:rx_future/rx_future.dart'; class AuthController extends GetxController { //------------Data source AuthService authService = AuthService(); LocalStorage storage = LocalStorage(); //------------register-----------// RegisterModel registerModel = RegisterModel.zero(); RxFuture registerModelState = RxFuture(null); Future register( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await registerModelState.observe((p0) async { await authService.register(registerModel); }, onSuccess: (value) { verificationCodeModel.email = registerModel.email; onSuccess?.call(value); }, onError: onError); } //--------------verification code------------------// RxFuture verifyState = RxFuture(null); VerificationCodeModel verificationCodeModel = VerificationCodeModel.zero(); Future verify( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await verifyState.observe( (p0) async { await authService.verify(verificationCodeModel); }, onSuccess: (value) async { if (loginModel.email == '' || loginModel.password == '') { loginModel.email = registerModel.email; loginModel.password = registerModel.password; } await login( onSuccess: (p0) { storage.saveIsGuest(false); storage.saveUser(p0.user); storage.saveToken(p0.token); onSuccess?.call(value); }, ); }, onError: (error) { onError?.call(error); }, ); } //-----------------login---------------------// RxFuture loginState = RxFuture(LoginResponseModel.zero()); LoginModel loginModel = LoginModel.zero(); Future login( {void Function(LoginResponseModel)? onSuccess, void Function(Object)? onError}) async { await loginState.observe( (p0) async { return await authService.login(loginModel); }, onSuccess: (value) async { onSuccess?.call(value); await storage.saveUser(value.user); storage.saveToken(value.token); storage.saveChatToken(value.chatToken); storage.saveChatUserId(value.chatUserId); isGuest = false.obs; storage.saveIsGuest(false); }, onError: (error) { if (error.toString() == "User is not verified") { verificationCodeModel.email = loginModel.email; } onError?.call(error); }, ); } ///---------logout--------/// RxFuture logoutState = RxFuture(null); Future logout({void Function(void)? onSuccess}) async { loginModel = LoginModel.zero(); await logoutState.observe( (p0) async { await authService.logout(); }, onSuccess: (value) async { isGuest = false.obs; storage.saveIsGuest(false); await storage.clearCache(); onSuccess?.call(value); }, ); } ///---------resend code----------------// RxFuture resendCodeState = RxFuture(null); Future resendCode(String email) async { await resendCodeState.observe((p0) async { await authService.resendCode(email); }); } ///----------forgot password---------// ForgotPasswordModel forgotPasswordModel = ForgotPasswordModel.zero(); RxFuture forgotPasswordState = RxFuture(null); Future forgotPassword( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await forgotPasswordState.observe( (p0) async { await authService.forgotPassword(forgotPasswordModel.email); }, onSuccess: (value) { onSuccess?.call(value); }, onError: (error) { onError?.call(error); }, ); } ///------------verify forgot password-----------/// RxFuture verifyForgotPasswordState = RxFuture(ResetToken.zero()); Future verifyForgotPassword( {void Function(ResetToken)? onSuccess, void Function(Object)? onError}) async { await verifyForgotPasswordState.observe( (p0) async { return await authService.verifyForgotPassword( forgotPasswordModel.email, forgotPasswordModel.code); }, onSuccess: (value) { onSuccess?.call(value); }, onError: (error) { onError?.call(error); }, ); } ///------------change password----------/// RxFuture changePasswordState = RxFuture(null); Future changePassword( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await changePasswordState.observe( (p0) async { await authService.changePassword( verifyForgotPasswordState.result.resetToken, forgotPasswordModel.password, ); }, onSuccess: (p0) async { loginModel.email = forgotPasswordModel.email; loginModel.password = forgotPasswordModel.password; await login( onSuccess: (value) { isGuest = false.obs; storage.saveUser(value.user); storage.saveToken(value.token); onSuccess?.call(p0); }, ); }, onError: (error) { onError?.call(error); }, ); } ///--------delete account-----/// RxFuture deleteAccountState = RxFuture(null); String password = ''; Future deleteAccount( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await deleteAccountState.observe( (p0) async { await authService.deleteAccount(password); }, onSuccess: (value) { isGuest = true.obs; onSuccess?.call(value); storage.clearCache(); }, onError: (error) { onError?.call(error); }, ); } /// ------------- terminate other sessions ---------/// RxFuture terminateOtherSessionsState = RxFuture(null); Future terminateOtherSessions( {void Function(void)? onSuccess, void Function(Object)? onError}) async { terminateOtherSessionsState.observe((value) async { return await authService.terminateOtherSessions(); }, onSuccess: (value) { onSuccess?.call(value); }, onError: (err) { onError?.call(err); }); } ///----------- obsecure password -------/// //register screen RxBool registerPassowrdVisible = false.obs; void toggleRegisterPassowrdVisibilty() { registerPassowrdVisible.value = !registerPassowrdVisible.value; registerPassowrdVisible.refresh(); } RxBool registerConfirmPassowrdVisible = false.obs; void toggleRegisterConfirmPassowrdVisibilty() { registerConfirmPassowrdVisible.value = !registerConfirmPassowrdVisible.value; registerConfirmPassowrdVisible.refresh(); } RxBool loginPasswordVisible = false.obs; RxBool changePasswordNewPasswordVisible = false.obs; RxBool changePasswordConfirmPasswordVisible = false.obs; RxBool changePasswordOldPasswordVisible = false.obs; RxBool resetPasswordNewPasswordVisible = false.obs; RxBool resetPasswordConfirmPasswordVisible = false.obs; void toggleLoginPasswordVisibility() { loginPasswordVisible.value = !loginPasswordVisible.value; loginPasswordVisible.refresh(); } void toggleChangePasswordNewPasswordVisibility() { changePasswordNewPasswordVisible.value = !changePasswordNewPasswordVisible.value; changePasswordNewPasswordVisible.refresh(); } void toggleChangePasswordConfirmPasswordVisibility() { changePasswordConfirmPasswordVisible.value = !changePasswordConfirmPasswordVisible.value; changePasswordConfirmPasswordVisible.refresh(); } void toggleChangePasswordOldPasswordVisibility() { changePasswordOldPasswordVisible.value = !changePasswordOldPasswordVisible.value; changePasswordOldPasswordVisible.refresh(); } void toggleResetPasswordNewPasswordVisibility() { resetPasswordNewPasswordVisible.value = !resetPasswordNewPasswordVisible.value; resetPasswordNewPasswordVisible.refresh(); } void toggleResetPasswordConfirmPasswordVisibility() { resetPasswordConfirmPasswordVisible.value = !resetPasswordConfirmPasswordVisible.value; resetPasswordConfirmPasswordVisible.refresh(); } /// -------------guest--------------/// RxBool isGuest = false.obs; RxFuture guestState = RxFuture(''); void guestSignIn({void Function(Object)? onError}) { guestState.observe((p0) async { return await authService.guest(); }, onSuccess: (token) { isGuest = true.obs; storage.saveToken(token); storage.saveIsGuest(true); storage.saveUser(User( id: 0, firstName: 'guest', lastName: '', email: '', chatUserId: 0, avatarImage: null)); RoutingManager.off(RouteName.superHome); }, onError: onError); } }