From 47ce5022d3f54eae135a280953d43e466a221ce8 Mon Sep 17 00:00:00 2001 From: aamir-csol Date: Wed, 24 Sep 2025 14:43:10 +0300 Subject: [PATCH] family screen & widgets --- .../authentication/authentication_repo.dart | 24 +++++- .../authentication_view_model.dart | 74 +++++++++++++------ .../widgets/otp_verification_screen.dart | 10 +-- .../medical_file/medical_file_view_model.dart | 5 +- lib/services/navigation_service.dart | 4 +- 5 files changed, 82 insertions(+), 35 deletions(-) diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart index 8038c43..a02ef70 100644 --- a/lib/features/authentication/authentication_repo.dart +++ b/lib/features/authentication/authentication_repo.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:dartz/dartz.dart'; import 'package:hmg_patient_app_new/core/api/api_client.dart'; import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:hmg_patient_app_new/core/common_models/privilege/PrivilegeModel.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; @@ -19,7 +20,8 @@ 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 isExcludedUser = false}); + Future>> checkActivationCodeRepo( + {required dynamic newRequest, required String? activationCode, required bool isRegister, bool isFormFamilyFile = false, int? patientShareRequestID, int? responseID}); Future>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}); @@ -178,7 +180,9 @@ class AuthenticationRepoImp implements AuthenticationRepo { required dynamic newRequest, // could be CheckActivationCodeReq or CheckActivationCodeRegisterReq required String? activationCode, required bool isRegister, - bool isExcludedUser = false, + bool isFormFamilyFile = false, + int? patientShareRequestID, + int? responseID, }) async { if (isRegister) { newRequest["activationCode"] = activationCode ?? "0000"; @@ -191,8 +195,16 @@ class AuthenticationRepoImp implements AuthenticationRepo { newRequest.forRegisteration = newRequest.isRegister ?? false; newRequest.isRegister = false; } + Map familyRequest = {}; + if (isFormFamilyFile) { + familyRequest = newRequest.toJson(); + familyRequest['PatientShareRequestID'] = patientShareRequestID; + familyRequest['ResponseID'] = responseID; + familyRequest['Status'] = 3; + familyRequest["PatientID"] = newRequest["PatientID"]; + } - final endpoint = isExcludedUser + final endpoint = isFormFamilyFile ? ApiConsts.checkActivationCodeForFamily : isRegister ? ApiConsts.checkActivationCodeRegister @@ -204,7 +216,11 @@ class AuthenticationRepoImp implements AuthenticationRepo { await apiClient.post( endpoint, - body: isRegister ? newRequest : newRequest.toJson(), + body: isFormFamilyFile + ? familyRequest + : isRegister + ? newRequest + : newRequest.toJson(), onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; }, diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 558f02d..a108835 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -382,12 +382,16 @@ class AuthenticationViewModel extends ChangeNotifier { _appState.setUserRegistrationPayload = RegistrationDataModelPayload.fromJson(payload); } - final resultEither = - await _authenticationRepo.sendActivationCodeRepo(sendActivationCodeReq: request, isRegister: checkIsUserComingForRegister(request: payload), languageID: 'er', isFormFamilyFile: isFormFamilyFile); + final resultEither = await _authenticationRepo.sendActivationCodeRepo( + sendActivationCodeReq: request, isRegister: checkIsUserComingForRegister(request: payload), languageID: 'er', isFormFamilyFile: isFormFamilyFile); resultEither.fold( (failure) async => await _errorHandlerService.handleError(failure: failure), (apiResponse) async { + int? patientShareRequestID = 0; + if (isFormFamilyFile) { + patientShareRequestID = apiResponse.data['PatientShareRequestID']; + } if (apiResponse.messageStatus == 2) { LoaderBottomSheet.hideLoader(); await _dialogService.showCommonBottomSheetWithoutH( @@ -400,7 +404,15 @@ class AuthenticationViewModel extends ChangeNotifier { LoaderBottomSheet.hideLoader(); if (!isComingFromResendOTP) { navigateToOTPScreen( - otpTypeEnum: otpTypeEnum, phoneNumber: phoneNumber, isComingFromRegister: checkIsUserComingForRegister(request: payload), payload: payload, isExcludedUser: isExcludedUser); + otpTypeEnum: otpTypeEnum, + phoneNumber: phoneNumber, + isComingFromRegister: checkIsUserComingForRegister(request: payload), + payload: payload, + isFormFamilyFile: isFormFamilyFile, + isExcludedUser: isExcludedUser, + responseID: responseID, + patientShareRequestID: patientShareRequestID, + ); } } else { // TODO: Handle isSMSSent false @@ -424,8 +436,8 @@ class AuthenticationViewModel extends ChangeNotifier { required OTPTypeEnum otpTypeEnum, required Function(String? message) onWrongActivationCode, Function()? onResendActivation, - bool isExcludedUser = false, - dynamic requestID, + bool isFormFamilyFile = false, + dynamic patientShareRequestID, dynamic responseID}) async { bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1); @@ -453,12 +465,6 @@ class AuthenticationViewModel extends ChangeNotifier { loginType: loginTypeEnum.toInt) .toJson(); - if (isExcludedUser) { - request['PatientShareRequestID'] = requestID; - request['ResponseID'] = responseID; - request['Status'] = 3; - } - LoaderBottomSheet.showLoader(); if (isForRegister) { if (_appState.getUserRegistrationPayload.patientOutSa == 0) request['DOB'] = _appState.getUserRegistrationPayload.dob; @@ -468,7 +474,11 @@ 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(); @@ -495,7 +505,12 @@ class AuthenticationViewModel extends ChangeNotifier { }); } else { final resultEither = await _authenticationRepo.checkActivationCodeRepo( - newRequest: CheckActivationCodeRegisterReq.fromJson(request), activationCode: activationCode, isRegister: false, isExcludedUser: isExcludedUser); + newRequest: CheckActivationCodeRegisterReq.fromJson(request), + activationCode: activationCode, + isRegister: false, + isFormFamilyFile: isFormFamilyFile, + patientShareRequestID: patientShareRequestID, + responseID: responseID); resultEither.fold( (failure) async => await _errorHandlerService.handleError( @@ -509,6 +524,8 @@ class AuthenticationViewModel extends ChangeNotifier { LoaderBottomSheet.hideLoader(); await _dialogService.showCommonBottomSheetWithoutH(message: failure.message, label: LocaleKeys.notice.tr(), onOkPressed: () {}); }), (apiResponse) async { + print("API Response Data: ${apiResponse.data}"); + final activation = CheckActivationCode.fromJson(apiResponse.data as Map); if (activation.errorCode == '699') { @@ -605,14 +622,25 @@ class AuthenticationViewModel extends ChangeNotifier { _navigationService.pushAndReplace(AppRoutes.landingScreen); } - Future navigateToOTPScreen({required OTPTypeEnum otpTypeEnum, required String phoneNumber, required bool isComingFromRegister, dynamic payload, bool isExcludedUser = false}) async { + Future navigateToOTPScreen( + {required OTPTypeEnum otpTypeEnum, + required String phoneNumber, + required bool isComingFromRegister, + dynamic payload, + bool isFormFamilyFile = false, + bool isExcludedUser = false, + int? responseID, + int? patientShareRequestID}) async { _navigationService.pushToOtpScreen( phoneNumber: phoneNumber, + isFormFamilyFile: isFormFamilyFile, checkActivationCode: (int activationCode) async { await checkActivationCode( activationCode: activationCode.toString(), - isExcludedUser: isExcludedUser, + isFormFamilyFile: isFormFamilyFile, otpTypeEnum: otpTypeEnum, + responseID: responseID, + patientShareRequestID: patientShareRequestID, onWrongActivationCode: (String? value) { onWrongActivationCode(message: value); }, @@ -620,12 +648,16 @@ class AuthenticationViewModel extends ChangeNotifier { }, onResendOTPPressed: (String phoneNumber) async { await sendActivationCode( - otpTypeEnum: otpTypeEnum, - phoneNumber: phoneNumberController.text, - nationalIdOrFileNumber: nationalIdController.text, - isForRegister: isComingFromRegister, - isComingFromResendOTP: true, - payload: payload); + otpTypeEnum: otpTypeEnum, + phoneNumber: phoneNumberController.text, + nationalIdOrFileNumber: nationalIdController.text, + isForRegister: isComingFromRegister, + isComingFromResendOTP: true, + payload: payload, + isFormFamilyFile: isFormFamilyFile, + isExcludedUser: isExcludedUser, + responseID: responseID, + ); }, ); } diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart index e7f8d72..10e34cd 100644 --- a/lib/features/authentication/widgets/otp_verification_screen.dart +++ b/lib/features/authentication/widgets/otp_verification_screen.dart @@ -428,13 +428,9 @@ class OTPVerificationScreen extends StatefulWidget { final String phoneNumber; final Function(int code) checkActivationCode; final Function(String phoneNumber) onResendOTPPressed; + final bool isFormFamilyFile; - const OTPVerificationScreen({ - super.key, - required this.phoneNumber, - required this.checkActivationCode, - required this.onResendOTPPressed, - }); + const OTPVerificationScreen({super.key, required this.phoneNumber, required this.checkActivationCode, required this.onResendOTPPressed, required this.isFormFamilyFile}); @override State createState() => _OTPVerificationScreenState(); @@ -559,7 +555,7 @@ class _OTPVerificationScreenState extends State { LocaleKeys.weHaveSendOTP.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), _getMaskedPhoneNumber().toText15(color: AppColors.inputLabelTextColor, isBold: true), LocaleKeys.via.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), - authVM.loginTypeEnum.displayName.toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), + (widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName).toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true ? LocaleKeys.forRegistrationVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4) : LocaleKeys.forLoginVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index 1c3d353..b3b1db1 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -17,6 +17,7 @@ import 'package:hmg_patient_app_new/features/medical_file/models/patient_vaccine 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'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; class MedicalFileViewModel extends ChangeNotifier { int selectedTabIndex = 0; @@ -301,6 +302,7 @@ class MedicalFileViewModel extends ChangeNotifier { } Future addFamilyFile({required OTPTypeEnum otpTypeEnum, required bool isExcludedUser}) async { + LoaderBottomSheet.showLoader(); AuthenticationViewModel authVM = getIt.get(); NavigationService navigationService = getIt.get(); FamilyFileRequest request = @@ -311,9 +313,11 @@ class MedicalFileViewModel extends ChangeNotifier { if (apiResponse != null && apiResponse.data != null) { request.isPatientExcluded = apiResponse.data["IsPatientExcluded"]; request.responseID = apiResponse.data["ReponseID"]; + LoaderBottomSheet.hideLoader(); _dialogService.showExceptionBottomSheet( message: apiResponse.data['Message'], onOkPressed: () { + LoaderBottomSheet.showLoader(); print("=================== On Press Ok =================="); authVM.sendActivationCode( otpTypeEnum: otpTypeEnum, @@ -324,7 +328,6 @@ class MedicalFileViewModel extends ChangeNotifier { responseID: apiResponse.data["ReponseID"], isFormFamilyFile: true); - // insertFamilyData(payload: apiResponse.data![0]['ShareFamilyFileObj'], isExcludedPatient: apiResponse.data![0]['ShareFamilyFileObj']['IsPatientExcluded']); }, onCancelPressed: () { navigationService.pop(); diff --git a/lib/services/navigation_service.dart b/lib/services/navigation_service.dart index 420c4cf..0c2a901 100644 --- a/lib/services/navigation_service.dart +++ b/lib/services/navigation_service.dart @@ -22,9 +22,9 @@ class NavigationService { navigatorKey.currentState?.pushReplacementNamed(routeName); } - Future pushToOtpScreen({required String phoneNumber, required Function(int code) checkActivationCode, required Function(String phoneNumber) onResendOTPPressed}) { + Future pushToOtpScreen({required String phoneNumber, required Function(int code) checkActivationCode, required Function(String phoneNumber) onResendOTPPressed, bool isFormFamilyFile = false}) { return navigatorKey.currentState!.push( - MaterialPageRoute(builder: (_) => OTPVerificationScreen(phoneNumber: phoneNumber, checkActivationCode: checkActivationCode, onResendOTPPressed: onResendOTPPressed)), + MaterialPageRoute(builder: (_) => OTPVerificationScreen(phoneNumber: phoneNumber, checkActivationCode: checkActivationCode, onResendOTPPressed: onResendOTPPressed, isFormFamilyFile : isFormFamilyFile)), ); }