diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 9b013a5..e11de15 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -810,6 +810,7 @@ class ApiConsts { static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService'; static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile'; static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile'; + static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId'; // static values for Api diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart index c906374..3e0bbc1 100644 --- a/lib/core/app_state.dart +++ b/lib/core/app_state.dart @@ -97,6 +97,16 @@ class AppState { set setDeviceTypeID(v) => deviceTypeID = v; + + + String _familyFileTokenID = ""; + + String get getFamilyFileTokenID => _familyFileTokenID; + + set setFamilyFileTokenID(String value) { + _familyFileTokenID = value; + } + List vidaPlusProjectList = []; List privilegeModelList = []; List hMCProjectListModel = []; diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart index c2a49bf..3ed05c6 100644 --- a/lib/features/authentication/authentication_repo.dart +++ b/lib/features/authentication/authentication_repo.dart @@ -22,7 +22,7 @@ abstract class AuthenticationRepo { Future>> sendActivationCodeRepo({required dynamic sendActivationCodeReq, String? languageID, bool isRegister = false, bool isFormFamilyFile = false}); Future>> checkActivationCodeRepo( - {required dynamic newRequest, required String? activationCode, required bool isRegister, bool isFormFamilyFile = false, int? patientShareRequestID, int? responseID, String? familyFileTokenID}); + {required dynamic newRequest, required String? activationCode, required bool isRegister, bool isFormFamilyFile = false, int? patientShareRequestID, int? responseID}); Future>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}); @@ -139,6 +139,16 @@ class AuthenticationRepoImp implements AuthenticationRepo { int isOutKsa = (sendActivationCodeReq.zipCode == '966' || sendActivationCodeReq.zipCode == '+966') ? 0 : 1; sendActivationCodeReq.patientOutSA = isOutKsa; sendActivationCodeReq.isDentalAllowedBackend = false; + final payload = sendActivationCodeReq.toJson(); + if (isFormFamilyFile) { + payload.remove("MobileNo"); + payload.remove("NationalID"); + payload.remove("SMSSignature"); + payload.remove("ResponseID"); + print("=================== Final Payload ==================="); + print(payload); + print("====================================================="); + } try { GenericApiModel? apiResponse; @@ -150,7 +160,7 @@ class AuthenticationRepoImp implements AuthenticationRepo { : isRegister ? ApiConsts.sendActivationCodeRegister : ApiConsts.sendActivationCode, - body: sendActivationCodeReq.toJson(), + body: isFormFamilyFile ? payload : sendActivationCodeReq.toJson(), onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; }, @@ -183,8 +193,7 @@ class AuthenticationRepoImp implements AuthenticationRepo { required bool isRegister, bool isFormFamilyFile = false, int? patientShareRequestID, - int? responseID, - String? familyFileTokenID}) async { + int? responseID}) async { if (isRegister) { newRequest["activationCode"] = activationCode ?? "0000"; newRequest["isSilentLogin"] = activationCode != null ? false : true; @@ -199,12 +208,27 @@ class AuthenticationRepoImp implements AuthenticationRepo { Map familyRequest = {}; if (isFormFamilyFile) { AppState appState = getIt.get(); - familyRequest = newRequest.toJson(); + familyRequest = {}; familyRequest['PatientShareRequestID'] = patientShareRequestID; familyRequest['ResponseID'] = responseID; familyRequest['Status'] = 3; familyRequest["PatientID"] = appState.getAuthenticatedUser()!.patientId ?? 0; - familyRequest["LogInTokenID"] = familyFileTokenID; + familyRequest["LogInTokenID"] = appState.getFamilyFileTokenID; + + // // Remove unnecessary keys from familyRequest + // familyRequest.remove("MobileNo"); + // familyRequest.remove("DeviceToken"); + // familyRequest.remove("ProjectOutSA"); + // familyRequest.remove("LoginType"); + // familyRequest.remove("ZipCode"); + // familyRequest.remove("isRegister"); + // familyRequest.remove("SearchType"); + // familyRequest.remove("NationalID"); + // familyRequest.remove("IsSilentLogin"); + // familyRequest.remove("isDentalAllowedBackend"); + // familyRequest.remove("ForRegisteration"); + + } final endpoint = isFormFamilyFile diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 8db44ab..f314cc4 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -376,6 +376,9 @@ class AuthenticationViewModel extends ChangeNotifier { isFormFamilyFile: isFormFamilyFile, responseID: responseID); + + + // TODO: GET APP SMS SIGNATURE HERE request.sMSSignature = await getSignature(); @@ -390,10 +393,9 @@ class AuthenticationViewModel extends ChangeNotifier { (failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { int? patientShareRequestID = 0; - String? familyFileTokenID; if (isFormFamilyFile) { patientShareRequestID = apiResponse.data['PatientShareRequestID']; - familyFileTokenID = apiResponse.data['LogInTokenID']; + _appState.setFamilyFileTokenID = apiResponse.data['LogInTokenID']; } if (apiResponse.messageStatus == 2) { LoaderBottomSheet.hideLoader(); @@ -407,15 +409,15 @@ class AuthenticationViewModel extends ChangeNotifier { LoaderBottomSheet.hideLoader(); if (!isComingFromResendOTP) { navigateToOTPScreen( - otpTypeEnum: otpTypeEnum, - phoneNumber: phoneNumber, - isComingFromRegister: checkIsUserComingForRegister(request: payload), - payload: payload, - isFormFamilyFile: isFormFamilyFile, - isExcludedUser: isExcludedUser, - responseID: responseID, - patientShareRequestID: patientShareRequestID, - familyFileTokenID: familyFileTokenID); + otpTypeEnum: otpTypeEnum, + phoneNumber: phoneNumber, + isComingFromRegister: checkIsUserComingForRegister(request: payload), + payload: payload, + isFormFamilyFile: isFormFamilyFile, + isExcludedUser: isExcludedUser, + responseID: responseID, + patientShareRequestID: patientShareRequestID, + ); } } else { // TODO: Handle isSMSSent false @@ -441,8 +443,7 @@ class AuthenticationViewModel extends ChangeNotifier { Function()? onResendActivation, bool isFormFamilyFile = false, dynamic patientShareRequestID, - dynamic responseID, - String? familyFileTokenID}) async { + dynamic responseID}) async { bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1); final request = RequestUtils.getCommonRequestWelcome( @@ -478,11 +479,7 @@ class AuthenticationViewModel extends ChangeNotifier { request["ForRegisteration"] = _appState.getUserRegistrationPayload.isRegister; request["isRegister"] = false; - final resultEither = await _authenticationRepo.checkActivationCodeRepo( - newRequest: request, - activationCode: activationCode.toString(), - isRegister: true, - ); + final resultEither = await _authenticationRepo.checkActivationCodeRepo(newRequest: request, activationCode: activationCode.toString(), isRegister: true); LoaderBottomSheet.hideLoader(); @@ -514,8 +511,7 @@ class AuthenticationViewModel extends ChangeNotifier { isRegister: false, isFormFamilyFile: isFormFamilyFile, patientShareRequestID: patientShareRequestID, - responseID: responseID, - familyFileTokenID: familyFileTokenID); + responseID: responseID); resultEither.fold( (failure) async => await _errorHandlerService.handleError( @@ -549,59 +545,62 @@ class AuthenticationViewModel extends ChangeNotifier { return; } else { if (isFormFamilyFile) { - _dialogService.showCommonBottomSheetWithoutH( - message: "Family File Added Successfully", - onOkPressed: () { - LoaderBottomSheet.showLoader(); - MedicalFileViewModel medicalFileVM = GetIt.instance(); - medicalFileVM.getFamilyFiles(); - LoaderBottomSheet.hideLoader(); - _navigationService.popUntilNamed(AppRoutes.medicalFilePage); - }); - } - - if (activation.list != null && activation.list!.isNotEmpty) { - _appState.setAuthenticatedUser(activation.list!.first); - _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!); - } - _appState.setUserBloodGroup = (activation.patientBlodType ?? ""); - _appState.setAppAuthToken = activation.authenticationTokenId; - final request = RequestUtils.getAuthanticatedCommonRequest().toJson(); - bool isUserAgreedBefore = await checkIfUserAgreedBefore(request: request); - - //updating the last login type in app state to show the fingerprint/face id option on home screen - if (_appState.getSelectDeviceByImeiRespModelElement != null) { - _appState.getSelectDeviceByImeiRespModelElement!.logInType = loginTypeEnum.toInt; - } - LoaderBottomSheet.hideLoader(); - insertPatientIMEIData(loginTypeEnum.toInt); - await clearDefaultInputValues(); - if (isUserAgreedBefore) { - navigateToHomeScreen(); + await navigateToFamilyFilePage(); + // _dialogService.showCommonBottomSheetWithoutH( + // message: "Family File Added Successfully", + // onOkPressed: () async { + // print("navigating to family file page"); + // + // }); } else { - navigateToHomeScreen(); - //Agreement page not designed yet so we are navigating to home screen directly - // getUserAgreementContent(request: request); + if (activation.list != null && activation.list!.isNotEmpty) { + _appState.setAuthenticatedUser(activation.list!.first); + _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!); + } + _appState.setUserBloodGroup = (activation.patientBlodType ?? ""); + _appState.setAppAuthToken = activation.authenticationTokenId; + final request = RequestUtils.getAuthanticatedCommonRequest().toJson(); + bool isUserAgreedBefore = await checkIfUserAgreedBefore(request: request); + + //updating the last login type in app state to show the fingerprint/face id option on home screen + if (_appState.getSelectDeviceByImeiRespModelElement != null) { + _appState.getSelectDeviceByImeiRespModelElement!.logInType = loginTypeEnum.toInt; + } + LoaderBottomSheet.hideLoader(); + insertPatientIMEIData(loginTypeEnum.toInt); + await clearDefaultInputValues(); + if (isUserAgreedBefore) { + navigateToHomeScreen(); + } else { + navigateToHomeScreen(); + //Agreement page not designed yet so we are navigating to home screen directly + // getUserAgreementContent(request: request); + } + // 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!); + + // projectViewModel.analytics.loginRegistration.login_successful(); } - // 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!); - - // projectViewModel.analytics.loginRegistration.login_successful(); } }); } } + Future navigateToFamilyFilePage() async { + MedicalFileViewModel medicalFileVM = GetIt.instance(); + medicalFileVM.handleFamilyFileRequestOTPVerification(); + } + Future checkIfUserAgreedBefore({required dynamic request}) async { bool isAgreed = false; if (havePrivilege(109)) { @@ -647,8 +646,7 @@ class AuthenticationViewModel extends ChangeNotifier { bool isFormFamilyFile = false, bool isExcludedUser = false, int? responseID, - int? patientShareRequestID, - String? familyFileTokenID}) async { + int? patientShareRequestID}) async { _navigationService.pushToOtpScreen( phoneNumber: phoneNumber, isFormFamilyFile: isFormFamilyFile, @@ -659,7 +657,6 @@ class AuthenticationViewModel extends ChangeNotifier { otpTypeEnum: otpTypeEnum, responseID: responseID, patientShareRequestID: patientShareRequestID, - familyFileTokenID: familyFileTokenID, onWrongActivationCode: (String? value) { onWrongActivationCode(message: value); }, diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart index 3042aba..0997cbc 100644 --- a/lib/features/medical_file/medical_file_repo.dart +++ b/lib/features/medical_file/medical_file_repo.dart @@ -26,6 +26,8 @@ abstract class MedicalFileRepo { Future>>> getPatientFamilyFiles(); + Future>>> getAllPendingRecordsByResponseId({required Map request}); + Future>> addFamilyFile({required dynamic request}); } @@ -312,6 +314,45 @@ class MedicalFileRepoImp implements MedicalFileRepo { } } + @override + Future>>> getAllPendingRecordsByResponseId({required Map request}) async { + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + ApiConsts.getAllPendingRecordsByResponseId, + body: request, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['GetAllSharedRecordsByStatusList']; + // if (list == null || list.isEmpty) { + // throw Exception("lab list is empty"); + // } + + final familyLists = list.map((item) => FamilyFileResponseModelLists.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: familyLists, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + @override Future>> addFamilyFile({dynamic request}) async { try { @@ -325,6 +366,7 @@ class MedicalFileRepoImp implements MedicalFileRepo { }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { + apiResponse = GenericApiModel( messageStatus: messageStatus, statusCode: statusCode, diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index b3b1db1..59363ba 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -268,6 +268,22 @@ class MedicalFileViewModel extends ChangeNotifier { ); } + Future getAllPendingRecordsByResponseId() async { + AppState appState = getIt(); + final result = await medicalFileRepo.getAllPendingRecordsByResponseId(request: {'ResponseID': appState.getAuthenticatedUser()!.patientId ?? "0", "Status": 2}); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + print("======= Pending Records Response: ${jsonEncode(apiResponse.data)}"); + } + }, + ); + } + Future switchFamilyFiles({Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await medicalFileRepo.getPatientFamilyFiles(); @@ -318,7 +334,6 @@ class MedicalFileViewModel extends ChangeNotifier { message: apiResponse.data['Message'], onOkPressed: () { LoaderBottomSheet.showLoader(); - print("=================== On Press Ok =================="); authVM.sendActivationCode( otpTypeEnum: otpTypeEnum, nationalIdOrFileNumber: request.sharedPatientIdentificationId!, @@ -327,7 +342,6 @@ class MedicalFileViewModel extends ChangeNotifier { isExcludedUser: apiResponse.data['IsPatientExcluded'], responseID: apiResponse.data["ReponseID"], isFormFamilyFile: true); - }, onCancelPressed: () { navigationService.pop(); @@ -335,4 +349,11 @@ class MedicalFileViewModel extends ChangeNotifier { } }); } + + Future handleFamilyFileRequestOTPVerification() async { + LoaderBottomSheet.showLoader(); + await getFamilyFiles(); + await getAllPendingRecordsByResponseId(); + LoaderBottomSheet.hideLoader(); + } } diff --git a/lib/presentation/my_family/my_Family.dart b/lib/presentation/my_family/my_Family.dart index 7ebd069..a4be2bf 100644 --- a/lib/presentation/my_family/my_Family.dart +++ b/lib/presentation/my_family/my_Family.dart @@ -38,7 +38,7 @@ class FamilyMedicalScreen extends StatefulWidget { } class _FamilyMedicalScreenState extends State { - List tabs = [CustomTabBarModel("", LocaleKeys.medicalFile.tr()), CustomTabBarModel("", LocaleKeys.request.tr())]; + List tabs = [CustomTabBarModel(null, LocaleKeys.medicalFile.tr()), CustomTabBarModel(null, LocaleKeys.request.tr())]; MedicalFileViewModel? medicalVM; @override