|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/app_export.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/app_state.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/cache_consts.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/enums.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/utils/request_utils.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/core/utils/utils.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/features/authentication/models/request_models/check_patient_authentication_request_model.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_activation_code_resp_model.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/presentation/authentication/login.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/services/cache_service.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/services/dialog_service.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/services/error_handler_service.dart'; | 
					
						
							|  |  |  | import 'package:hmg_patient_app_new/services/navigation_service.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AuthenticationViewModel extends ChangeNotifier { | 
					
						
							|  |  |  |   AuthenticationRepo authenticationRepo; | 
					
						
							|  |  |  |   AppState appState; | 
					
						
							|  |  |  |   ErrorHandlerService errorHandlerService; | 
					
						
							|  |  |  |   DialogService dialogService; | 
					
						
							|  |  |  |   NavigationService navigationService; | 
					
						
							|  |  |  |   CacheService cacheService; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   AuthenticationViewModel({ | 
					
						
							|  |  |  |     required this.appState, | 
					
						
							|  |  |  |     required this.authenticationRepo, | 
					
						
							|  |  |  |     required this.errorHandlerService, | 
					
						
							|  |  |  |     required this.dialogService, | 
					
						
							|  |  |  |     required this.navigationService, | 
					
						
							|  |  |  |     required this.cacheService, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   final TextEditingController nationalIdController = TextEditingController(); | 
					
						
							|  |  |  |   final TextEditingController phoneNumberController = TextEditingController(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void login() { | 
					
						
							|  |  |  |     if (ValidationUtils.isValidatePhoneAndId(nationalId: nationalIdController.text, phoneNumber: phoneNumberController.text)) { | 
					
						
							|  |  |  |     } else {} | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //checkUserAuthentication();
 | 
					
						
							|  |  |  |   bool isDubai = false; | 
					
						
							|  |  |  |   bool authenticated = false; | 
					
						
							|  |  |  |   late int mobileNumber; | 
					
						
							|  |  |  |   String errorMsg = ''; | 
					
						
							|  |  |  |   var registerd_data; | 
					
						
							|  |  |  |   bool isMoreOption = false; | 
					
						
							|  |  |  |   var zipCode; | 
					
						
							|  |  |  |   var patientOutSA; | 
					
						
							|  |  |  |   var loginTokenID; | 
					
						
							|  |  |  |   var loginType; | 
					
						
							|  |  |  |   var deviceToken; | 
					
						
							|  |  |  |   var lastLogin; | 
					
						
							|  |  |  |   final FocusNode myFocusNode = FocusNode(); | 
					
						
							|  |  |  |   late int selectedOption = 1; | 
					
						
							|  |  |  |   bool onlySMSBox = false; | 
					
						
							|  |  |  |   int fingrePrintBefore = 0; | 
					
						
							|  |  |  |   var dob; | 
					
						
							|  |  |  |   late int isHijri; | 
					
						
							|  |  |  |   var healthId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> selectDeviceImei({required Function(dynamic data) onSuccess, Function(String)? onError}) async { | 
					
						
							|  |  |  |     String firebaseToken = appState.deviceToken == "" | 
					
						
							|  |  |  |         ? "dOGRRszQQMGe_9wA5Hx3kO:APA91bFV5IcIJXvcCXXk0tc2ddtZgWwCPq7sGSuPr-YW7iiJpQZKgFGN9GAzCVOWL8MfheaP1slE8MdxB7lczdPBGdONQ7WbMmhgHcsUCUktq-hsapGXXqc" | 
					
						
							|  |  |  |         : appState.deviceToken; | 
					
						
							|  |  |  |     final result = await authenticationRepo.selectDeviceByImei(firebaseToken: firebaseToken); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     result.fold( | 
					
						
							|  |  |  |       (failure) async => await errorHandlerService.handleError(failure: failure), | 
					
						
							|  |  |  |       (apiResponse) { | 
					
						
							|  |  |  |         if (apiResponse.messageStatus == 1) { | 
					
						
							|  |  |  |           onSuccess(apiResponse.data); | 
					
						
							|  |  |  |         } else if (apiResponse.messageStatus == 2) { | 
					
						
							|  |  |  |           dialogService.showErrorDialog(message: "Message Status = 2", onOkPressed: () {}); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> onLoginPressed() async { | 
					
						
							|  |  |  |     var data = await cacheService.getObject(key: CacheConst.imeiUserData); | 
					
						
							|  |  |  |     //TODO:  Why???
 | 
					
						
							|  |  |  |     cacheService.remove(key: CacheConst.registerDataForLogin); | 
					
						
							|  |  |  |     if (data != null) { | 
					
						
							|  |  |  |       SelectDeviceByImeiRespModelElement savedData = SelectDeviceByImeiRespModelElement.fromJson(data); | 
					
						
							|  |  |  |       // TODO : SavedLogin Page is not there or renamed.
 | 
					
						
							|  |  |  |       // navigationService.pushPage(page: SavedLogin(savedData));
 | 
					
						
							|  |  |  |       // Navigator.of(context).push(
 | 
					
						
							|  |  |  |       //   MaterialPageRoute(
 | 
					
						
							|  |  |  |       //     builder: (BuildContext context) => SavedLogin(savedData),
 | 
					
						
							|  |  |  |       //   ),
 | 
					
						
							|  |  |  |       // );
 | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       // Todo: Show Loader Here
 | 
					
						
							|  |  |  |       // GifLoaderDialogUtils.showMyDialog(context);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       selectDeviceImei( | 
					
						
							|  |  |  |         onSuccess: (dynamic respData) async { | 
					
						
							|  |  |  |           var data = await cacheService.getObject(key: CacheConst.imeiUserData); | 
					
						
							|  |  |  |           if (respData != null) { | 
					
						
							|  |  |  |             cacheService.saveObject(key: CacheConst.imeiUserData, value: respData); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // SelectDeviceByImeiRespModelElement savedData = SelectDeviceByImeiRespModelElement.fromJson(data);
 | 
					
						
							|  |  |  |             // setUserValues(value);
 | 
					
						
							|  |  |  |             // TODO : SavedLogin Page is not there or renamed.
 | 
					
						
							|  |  |  |             // navigationService.pushPage(page: SavedLogin(savedData));
 | 
					
						
							|  |  |  |             // Navigator.of(context).push(
 | 
					
						
							|  |  |  |             //   MaterialPageRoute(
 | 
					
						
							|  |  |  |             //     builder: (BuildContext context) => SavedLogin(savedData),
 | 
					
						
							|  |  |  |             //   ),
 | 
					
						
							|  |  |  |             // );
 | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             //Todo: Hide Loader Here
 | 
					
						
							|  |  |  |             // GifLoaderDialogUtils.hideDialog(context);
 | 
					
						
							|  |  |  |             navigationService.pushPage(page: LoginScreen()); | 
					
						
							|  |  |  |             // Navigator.of(context).push(
 | 
					
						
							|  |  |  |             //   MaterialPageRoute(
 | 
					
						
							|  |  |  |             //     builder: (BuildContext context) => WelcomeLogin(),
 | 
					
						
							|  |  |  |             //   ),
 | 
					
						
							|  |  |  |             // );
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> checkUserAuthentication({required OTPTypeEnum otpTypeEnum, Function(dynamic)? onSuccess, Function(String)? onError}) async { | 
					
						
							|  |  |  |     CheckPatientAuthenticationReq checkPatientAuthenticationReq = RequestUtils.getCommonRequestWelcome( | 
					
						
							|  |  |  |       phoneNumber: '0567184134', | 
					
						
							|  |  |  |       otpTypeEnum: OTPTypeEnum.sms, | 
					
						
							|  |  |  |       deviceToken: 'dummyDeviceToken123', | 
					
						
							|  |  |  |       patientOutSA: true, | 
					
						
							|  |  |  |       loginTokenID: 'dummyLoginToken456', | 
					
						
							|  |  |  |       registeredData: null, | 
					
						
							|  |  |  |       patientId: 12345, | 
					
						
							|  |  |  |       nationIdText: '1234567890', | 
					
						
							|  |  |  |       countryCode: 'SA', | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final result = await authenticationRepo.checkPatientAuthentication(checkPatientAuthenticationReq: checkPatientAuthenticationReq); | 
					
						
							|  |  |  |     result.fold( | 
					
						
							|  |  |  |       (failure) async => await errorHandlerService.handleError(failure: failure), | 
					
						
							|  |  |  |       (apiResponse) { | 
					
						
							|  |  |  |         if (apiResponse.data['isSMSSent']) { | 
					
						
							|  |  |  |           // TODO:  set this in AppState
 | 
					
						
							|  |  |  |           // sharedPref.setString(LOGIN_TOKEN_ID, value['LogInTokenID']);
 | 
					
						
							|  |  |  |           //    loginTokenID = value['LogInTokenID'],
 | 
					
						
							|  |  |  |           // sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, request),
 | 
					
						
							|  |  |  |           sendActivationCode(otpTypeEnum: otpTypeEnum); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           if (apiResponse.data['IsAuthenticated']) { | 
					
						
							|  |  |  |             checkActivationCode(onWrongActivationCode: (String? message) {}, activationCode: 0000); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> sendActivationCode({ | 
					
						
							|  |  |  |     required OTPTypeEnum otpTypeEnum, | 
					
						
							|  |  |  |   }) async { | 
					
						
							|  |  |  |     var request = RequestUtils.getCommonRequestAuthProvider( | 
					
						
							|  |  |  |       otpTypeEnum: otpTypeEnum, | 
					
						
							|  |  |  |       registeredData: null, | 
					
						
							|  |  |  |       deviceToken: "dummyLoginToken456", | 
					
						
							|  |  |  |       mobileNumber: "0567184134", | 
					
						
							|  |  |  |       zipCode: "SA", | 
					
						
							|  |  |  |       patientOutSA: true, | 
					
						
							|  |  |  |       loginTokenID: "dummyLoginToken456", | 
					
						
							|  |  |  |       selectedOption: otpTypeEnum.toInt(), | 
					
						
							|  |  |  |       patientId: 12345, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // TODO: GET APP SMS SIGNATURE HERE
 | 
					
						
							|  |  |  |     request.sMSSignature = ""; | 
					
						
							|  |  |  |     // GifLoaderDialogUtils.showMyDialog(context);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool isForRegister = healthId != null || isDubai; | 
					
						
							|  |  |  |     if (isForRegister) { | 
					
						
							|  |  |  |       if (!isDubai) { | 
					
						
							|  |  |  |         request.dob = dob; //isHijri == 1 ? dob : dateFormat2.format(dateFormat.parse(dob));
 | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       request.healthId = healthId; | 
					
						
							|  |  |  |       request.isHijri = isHijri; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       request.dob = ""; | 
					
						
							|  |  |  |       request.healthId = ""; | 
					
						
							|  |  |  |       request.isHijri = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final resultEither = await authenticationRepo.sendActivationCodeRepo( | 
					
						
							|  |  |  |       checkPatientAuthenticationReq: request, | 
					
						
							|  |  |  |       isRegister: isForRegister, | 
					
						
							|  |  |  |       languageID: 'er', | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     resultEither.fold( | 
					
						
							|  |  |  |       (failure) async => await errorHandlerService.handleError(failure: failure), | 
					
						
							|  |  |  |       (apiResponse) { | 
					
						
							|  |  |  |         if (apiResponse.data != null && apiResponse.data['isSMSSent'] == true) { | 
					
						
							|  |  |  |           // startSMSService(otpTypeEnum.toInt());
 | 
					
						
							|  |  |  |           navigateToOTPScreen(otpTypeEnum: otpTypeEnum, phoneNumber: request.mobileNumber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> checkActivationCode({ | 
					
						
							|  |  |  |     required int activationCode, | 
					
						
							|  |  |  |     required Function(String? message) onWrongActivationCode, | 
					
						
							|  |  |  |   }) async { | 
					
						
							|  |  |  |     final request = RequestUtils.getCommonRequestWelcome( | 
					
						
							|  |  |  |       phoneNumber: '0567184134', | 
					
						
							|  |  |  |       otpTypeEnum: OTPTypeEnum.sms, | 
					
						
							|  |  |  |       deviceToken: 'dummyDeviceToken123', | 
					
						
							|  |  |  |       patientOutSA: true, | 
					
						
							|  |  |  |       loginTokenID: 'dummyLoginToken456', | 
					
						
							|  |  |  |       registeredData: null, | 
					
						
							|  |  |  |       patientId: 12345, | 
					
						
							|  |  |  |       nationIdText: '1234567890', | 
					
						
							|  |  |  |       countryCode: 'SA', | 
					
						
							|  |  |  |     ).toJson(); | 
					
						
							|  |  |  |     dynamic res; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool isForRegister = healthId != null || isDubai; | 
					
						
							|  |  |  |     if (isForRegister) { | 
					
						
							|  |  |  |       if (isDubai) request['DOB'] = dob; | 
					
						
							|  |  |  |       request['HealthId'] = healthId; | 
					
						
							|  |  |  |       request['IsHijri'] = isHijri; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       final resultEither = await authenticationRepo.checkActivationCodeRepo( | 
					
						
							|  |  |  |         newRequest: request, | 
					
						
							|  |  |  |         activationCode: activationCode.toString(), | 
					
						
							|  |  |  |         isRegister: true, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       res = resultEither; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { | 
					
						
							|  |  |  |         final activation = CheckActivationCode.fromJson(apiResponse.data as Map<String, dynamic>); | 
					
						
							|  |  |  |         if (registerd_data?.isRegister == true) { | 
					
						
							|  |  |  |           navigationService.popUntilNamed(AppRoutes.registerNewScreen); | 
					
						
							|  |  |  |           // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew));
 | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       final resultEither = await authenticationRepo.checkActivationCodeRepo( | 
					
						
							|  |  |  |         newRequest: request, | 
					
						
							|  |  |  |         activationCode: activationCode.toString(), | 
					
						
							|  |  |  |         isRegister: false, | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       res = resultEither; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { | 
					
						
							|  |  |  |         final activation = CheckActivationCode.fromJson(resultEither as Map<String, dynamic>); | 
					
						
							|  |  |  |         if (activation.errorCode == '699') { | 
					
						
							|  |  |  |           // Todo: Hide Loader
 | 
					
						
							|  |  |  |           // GifLoaderDialogUtils.hideDialog(context);
 | 
					
						
							|  |  |  |           onWrongActivationCode(activation.errorEndUserMessage); | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } else if (registerd_data?.isRegister == true) { | 
					
						
							|  |  |  |           navigationService.popUntilNamed(AppRoutes.registerNewScreen); | 
					
						
							|  |  |  |           // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew));
 | 
					
						
							|  |  |  |           return; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           // TODO: setPreferences and stuff
 | 
					
						
							|  |  |  |           // sharedPref.remove(FAMILY_FILE);
 | 
					
						
							|  |  |  |           // activation.list!.isFamily = false;
 | 
					
						
							|  |  |  |           // userData = activation.list;
 | 
					
						
							|  |  |  |           // sharedPref.setString(BLOOD_TYPE, activation.patientBloodType ?? "");
 | 
					
						
							|  |  |  |           // authenticatedUserObject.user = activation.list!;
 | 
					
						
							|  |  |  |           // projectViewModel.setPrivilege(privilegeList: res);
 | 
					
						
							|  |  |  |           // await sharedPref.setObject(MAIN_USER, activation.list);
 | 
					
						
							|  |  |  |           // await sharedPref.setObject(USER_PROFILE, activation.list);
 | 
					
						
							|  |  |  |           // loginTokenID = activation.logInTokenID;
 | 
					
						
							|  |  |  |           // await sharedPref.setObject(LOGIN_TOKEN_ID, activation.logInTokenID);
 | 
					
						
							|  |  |  |           // await sharedPref.setString(TOKEN, activation.authenticationTokenID!);
 | 
					
						
							|  |  |  |           // checkIfUserAgreedBefore(activation);
 | 
					
						
							|  |  |  |           // projectViewModel.analytics.loginRegistration.login_successful();
 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> navigateToOTPScreen({required OTPTypeEnum otpTypeEnum, required String phoneNumber}) async { | 
					
						
							|  |  |  |     navigationService.pushToOtpScreen( | 
					
						
							|  |  |  |       phoneNumber: phoneNumber, | 
					
						
							|  |  |  |       checkActivationCode: (int activationCode) async { | 
					
						
							|  |  |  |         await checkActivationCode( | 
					
						
							|  |  |  |             activationCode: activationCode, | 
					
						
							|  |  |  |             onWrongActivationCode: (String? value) { | 
					
						
							|  |  |  |               onWrongActivationCode(message: value); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       onResendOTPPressed: (String phoneNumber) {}, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> onWrongActivationCode({String? message}) async { | 
					
						
							|  |  |  |     // TODO: HANDLE THIS VIA BOTTOM SHEET
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |