family screen & widgets

pull/76/head
aamir-csol 1 month ago
parent 45a1ce9254
commit 02433e1bef

@ -810,6 +810,7 @@ class ApiConsts {
static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService'; static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService';
static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile'; static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile';
static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile'; static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile';
static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId';
// static values for Api // static values for Api

@ -97,6 +97,16 @@ class AppState {
set setDeviceTypeID(v) => deviceTypeID = v; set setDeviceTypeID(v) => deviceTypeID = v;
String _familyFileTokenID = "";
String get getFamilyFileTokenID => _familyFileTokenID;
set setFamilyFileTokenID(String value) {
_familyFileTokenID = value;
}
List<VidaPlusProjectListModel> vidaPlusProjectList = []; List<VidaPlusProjectListModel> vidaPlusProjectList = [];
List<ListPrivilege> privilegeModelList = []; List<ListPrivilege> privilegeModelList = [];
List<HMCProjectListModel> hMCProjectListModel = []; List<HMCProjectListModel> hMCProjectListModel = [];

@ -22,7 +22,7 @@ abstract class AuthenticationRepo {
Future<Either<Failure, GenericApiModel<dynamic>>> sendActivationCodeRepo({required dynamic sendActivationCodeReq, String? languageID, bool isRegister = false, bool isFormFamilyFile = false}); Future<Either<Failure, GenericApiModel<dynamic>>> sendActivationCodeRepo({required dynamic sendActivationCodeReq, String? languageID, bool isRegister = false, bool isFormFamilyFile = false});
Future<Either<Failure, GenericApiModel<dynamic>>> checkActivationCodeRepo( Future<Either<Failure, GenericApiModel<dynamic>>> 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<Either<Failure, GenericApiModel<dynamic>>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}); Future<Either<Failure, GenericApiModel<dynamic>>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest});
@ -139,6 +139,16 @@ class AuthenticationRepoImp implements AuthenticationRepo {
int isOutKsa = (sendActivationCodeReq.zipCode == '966' || sendActivationCodeReq.zipCode == '+966') ? 0 : 1; int isOutKsa = (sendActivationCodeReq.zipCode == '966' || sendActivationCodeReq.zipCode == '+966') ? 0 : 1;
sendActivationCodeReq.patientOutSA = isOutKsa; sendActivationCodeReq.patientOutSA = isOutKsa;
sendActivationCodeReq.isDentalAllowedBackend = false; 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 { try {
GenericApiModel<dynamic>? apiResponse; GenericApiModel<dynamic>? apiResponse;
@ -150,7 +160,7 @@ class AuthenticationRepoImp implements AuthenticationRepo {
: isRegister : isRegister
? ApiConsts.sendActivationCodeRegister ? ApiConsts.sendActivationCodeRegister
: ApiConsts.sendActivationCode, : ApiConsts.sendActivationCode,
body: sendActivationCodeReq.toJson(), body: isFormFamilyFile ? payload : sendActivationCodeReq.toJson(),
onFailure: (error, statusCode, {messageStatus, failureType}) { onFailure: (error, statusCode, {messageStatus, failureType}) {
failure = failureType; failure = failureType;
}, },
@ -183,8 +193,7 @@ class AuthenticationRepoImp implements AuthenticationRepo {
required bool isRegister, required bool isRegister,
bool isFormFamilyFile = false, bool isFormFamilyFile = false,
int? patientShareRequestID, int? patientShareRequestID,
int? responseID, int? responseID}) async {
String? familyFileTokenID}) async {
if (isRegister) { if (isRegister) {
newRequest["activationCode"] = activationCode ?? "0000"; newRequest["activationCode"] = activationCode ?? "0000";
newRequest["isSilentLogin"] = activationCode != null ? false : true; newRequest["isSilentLogin"] = activationCode != null ? false : true;
@ -199,12 +208,27 @@ class AuthenticationRepoImp implements AuthenticationRepo {
Map<String, dynamic> familyRequest = {}; Map<String, dynamic> familyRequest = {};
if (isFormFamilyFile) { if (isFormFamilyFile) {
AppState appState = getIt.get<AppState>(); AppState appState = getIt.get<AppState>();
familyRequest = newRequest.toJson(); familyRequest = {};
familyRequest['PatientShareRequestID'] = patientShareRequestID; familyRequest['PatientShareRequestID'] = patientShareRequestID;
familyRequest['ResponseID'] = responseID; familyRequest['ResponseID'] = responseID;
familyRequest['Status'] = 3; familyRequest['Status'] = 3;
familyRequest["PatientID"] = appState.getAuthenticatedUser()!.patientId ?? 0; 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 final endpoint = isFormFamilyFile

@ -376,6 +376,9 @@ class AuthenticationViewModel extends ChangeNotifier {
isFormFamilyFile: isFormFamilyFile, isFormFamilyFile: isFormFamilyFile,
responseID: responseID); responseID: responseID);
// TODO: GET APP SMS SIGNATURE HERE // TODO: GET APP SMS SIGNATURE HERE
request.sMSSignature = await getSignature(); request.sMSSignature = await getSignature();
@ -390,10 +393,9 @@ class AuthenticationViewModel extends ChangeNotifier {
(failure) async => await _errorHandlerService.handleError(failure: failure), (failure) async => await _errorHandlerService.handleError(failure: failure),
(apiResponse) async { (apiResponse) async {
int? patientShareRequestID = 0; int? patientShareRequestID = 0;
String? familyFileTokenID;
if (isFormFamilyFile) { if (isFormFamilyFile) {
patientShareRequestID = apiResponse.data['PatientShareRequestID']; patientShareRequestID = apiResponse.data['PatientShareRequestID'];
familyFileTokenID = apiResponse.data['LogInTokenID']; _appState.setFamilyFileTokenID = apiResponse.data['LogInTokenID'];
} }
if (apiResponse.messageStatus == 2) { if (apiResponse.messageStatus == 2) {
LoaderBottomSheet.hideLoader(); LoaderBottomSheet.hideLoader();
@ -415,7 +417,7 @@ class AuthenticationViewModel extends ChangeNotifier {
isExcludedUser: isExcludedUser, isExcludedUser: isExcludedUser,
responseID: responseID, responseID: responseID,
patientShareRequestID: patientShareRequestID, patientShareRequestID: patientShareRequestID,
familyFileTokenID: familyFileTokenID); );
} }
} else { } else {
// TODO: Handle isSMSSent false // TODO: Handle isSMSSent false
@ -441,8 +443,7 @@ class AuthenticationViewModel extends ChangeNotifier {
Function()? onResendActivation, Function()? onResendActivation,
bool isFormFamilyFile = false, bool isFormFamilyFile = false,
dynamic patientShareRequestID, dynamic patientShareRequestID,
dynamic responseID, dynamic responseID}) async {
String? familyFileTokenID}) async {
bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1); bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1);
final request = RequestUtils.getCommonRequestWelcome( final request = RequestUtils.getCommonRequestWelcome(
@ -478,11 +479,7 @@ class AuthenticationViewModel extends ChangeNotifier {
request["ForRegisteration"] = _appState.getUserRegistrationPayload.isRegister; request["ForRegisteration"] = _appState.getUserRegistrationPayload.isRegister;
request["isRegister"] = false; request["isRegister"] = false;
final resultEither = await _authenticationRepo.checkActivationCodeRepo( final resultEither = await _authenticationRepo.checkActivationCodeRepo(newRequest: request, activationCode: activationCode.toString(), isRegister: true);
newRequest: request,
activationCode: activationCode.toString(),
isRegister: true,
);
LoaderBottomSheet.hideLoader(); LoaderBottomSheet.hideLoader();
@ -514,8 +511,7 @@ class AuthenticationViewModel extends ChangeNotifier {
isRegister: false, isRegister: false,
isFormFamilyFile: isFormFamilyFile, isFormFamilyFile: isFormFamilyFile,
patientShareRequestID: patientShareRequestID, patientShareRequestID: patientShareRequestID,
responseID: responseID, responseID: responseID);
familyFileTokenID: familyFileTokenID);
resultEither.fold( resultEither.fold(
(failure) async => await _errorHandlerService.handleError( (failure) async => await _errorHandlerService.handleError(
@ -549,17 +545,14 @@ class AuthenticationViewModel extends ChangeNotifier {
return; return;
} else { } else {
if (isFormFamilyFile) { if (isFormFamilyFile) {
_dialogService.showCommonBottomSheetWithoutH( await navigateToFamilyFilePage();
message: "Family File Added Successfully", // _dialogService.showCommonBottomSheetWithoutH(
onOkPressed: () { // message: "Family File Added Successfully",
LoaderBottomSheet.showLoader(); // onOkPressed: () async {
MedicalFileViewModel medicalFileVM = GetIt.instance<MedicalFileViewModel>(); // print("navigating to family file page");
medicalFileVM.getFamilyFiles(); //
LoaderBottomSheet.hideLoader(); // });
_navigationService.popUntilNamed(AppRoutes.medicalFilePage); } else {
});
}
if (activation.list != null && activation.list!.isNotEmpty) { if (activation.list != null && activation.list!.isNotEmpty) {
_appState.setAuthenticatedUser(activation.list!.first); _appState.setAuthenticatedUser(activation.list!.first);
_appState.setPrivilegeModelList(activation.list!.first.listPrivilege!); _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!);
@ -598,10 +591,16 @@ class AuthenticationViewModel extends ChangeNotifier {
// projectViewModel.analytics.loginRegistration.login_successful(); // projectViewModel.analytics.loginRegistration.login_successful();
} }
}
}); });
} }
} }
Future<void> navigateToFamilyFilePage() async {
MedicalFileViewModel medicalFileVM = GetIt.instance<MedicalFileViewModel>();
medicalFileVM.handleFamilyFileRequestOTPVerification();
}
Future<bool> checkIfUserAgreedBefore({required dynamic request}) async { Future<bool> checkIfUserAgreedBefore({required dynamic request}) async {
bool isAgreed = false; bool isAgreed = false;
if (havePrivilege(109)) { if (havePrivilege(109)) {
@ -647,8 +646,7 @@ class AuthenticationViewModel extends ChangeNotifier {
bool isFormFamilyFile = false, bool isFormFamilyFile = false,
bool isExcludedUser = false, bool isExcludedUser = false,
int? responseID, int? responseID,
int? patientShareRequestID, int? patientShareRequestID}) async {
String? familyFileTokenID}) async {
_navigationService.pushToOtpScreen( _navigationService.pushToOtpScreen(
phoneNumber: phoneNumber, phoneNumber: phoneNumber,
isFormFamilyFile: isFormFamilyFile, isFormFamilyFile: isFormFamilyFile,
@ -659,7 +657,6 @@ class AuthenticationViewModel extends ChangeNotifier {
otpTypeEnum: otpTypeEnum, otpTypeEnum: otpTypeEnum,
responseID: responseID, responseID: responseID,
patientShareRequestID: patientShareRequestID, patientShareRequestID: patientShareRequestID,
familyFileTokenID: familyFileTokenID,
onWrongActivationCode: (String? value) { onWrongActivationCode: (String? value) {
onWrongActivationCode(message: value); onWrongActivationCode(message: value);
}, },

@ -26,6 +26,8 @@ abstract class MedicalFileRepo {
Future<Either<Failure, GenericApiModel<List<FamilyFileResponseModelLists>>>> getPatientFamilyFiles(); Future<Either<Failure, GenericApiModel<List<FamilyFileResponseModelLists>>>> getPatientFamilyFiles();
Future<Either<Failure, GenericApiModel<List<FamilyFileResponseModelLists>>>> getAllPendingRecordsByResponseId({required Map<String, dynamic> request});
Future<Either<Failure, GenericApiModel<dynamic>>> addFamilyFile({required dynamic request}); Future<Either<Failure, GenericApiModel<dynamic>>> addFamilyFile({required dynamic request});
} }
@ -312,6 +314,45 @@ class MedicalFileRepoImp implements MedicalFileRepo {
} }
} }
@override
Future<Either<Failure, GenericApiModel<List<FamilyFileResponseModelLists>>>> getAllPendingRecordsByResponseId({required Map<String, dynamic> request}) async {
try {
GenericApiModel<List<FamilyFileResponseModelLists>>? 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<String, dynamic>)).toList().cast<FamilyFileResponseModelLists>();
apiResponse = GenericApiModel<List<FamilyFileResponseModelLists>>(
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 @override
Future<Either<Failure, GenericApiModel<dynamic>>> addFamilyFile({dynamic request}) async { Future<Either<Failure, GenericApiModel<dynamic>>> addFamilyFile({dynamic request}) async {
try { try {
@ -325,6 +366,7 @@ class MedicalFileRepoImp implements MedicalFileRepo {
}, },
onSuccess: (response, statusCode, {messageStatus, errorMessage}) { onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
try { try {
apiResponse = GenericApiModel<dynamic>( apiResponse = GenericApiModel<dynamic>(
messageStatus: messageStatus, messageStatus: messageStatus,
statusCode: statusCode, statusCode: statusCode,

@ -268,6 +268,22 @@ class MedicalFileViewModel extends ChangeNotifier {
); );
} }
Future<void> getAllPendingRecordsByResponseId() async {
AppState appState = getIt<AppState>();
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<void> switchFamilyFiles({Function(dynamic)? onSuccess, Function(String)? onError}) async { Future<void> switchFamilyFiles({Function(dynamic)? onSuccess, Function(String)? onError}) async {
final result = await medicalFileRepo.getPatientFamilyFiles(); final result = await medicalFileRepo.getPatientFamilyFiles();
@ -318,7 +334,6 @@ class MedicalFileViewModel extends ChangeNotifier {
message: apiResponse.data['Message'], message: apiResponse.data['Message'],
onOkPressed: () { onOkPressed: () {
LoaderBottomSheet.showLoader(); LoaderBottomSheet.showLoader();
print("=================== On Press Ok ==================");
authVM.sendActivationCode( authVM.sendActivationCode(
otpTypeEnum: otpTypeEnum, otpTypeEnum: otpTypeEnum,
nationalIdOrFileNumber: request.sharedPatientIdentificationId!, nationalIdOrFileNumber: request.sharedPatientIdentificationId!,
@ -327,7 +342,6 @@ class MedicalFileViewModel extends ChangeNotifier {
isExcludedUser: apiResponse.data['IsPatientExcluded'], isExcludedUser: apiResponse.data['IsPatientExcluded'],
responseID: apiResponse.data["ReponseID"], responseID: apiResponse.data["ReponseID"],
isFormFamilyFile: true); isFormFamilyFile: true);
}, },
onCancelPressed: () { onCancelPressed: () {
navigationService.pop(); navigationService.pop();
@ -335,4 +349,11 @@ class MedicalFileViewModel extends ChangeNotifier {
} }
}); });
} }
Future<void> handleFamilyFileRequestOTPVerification() async {
LoaderBottomSheet.showLoader();
await getFamilyFiles();
await getAllPendingRecordsByResponseId();
LoaderBottomSheet.hideLoader();
}
} }

@ -38,7 +38,7 @@ class FamilyMedicalScreen extends StatefulWidget {
} }
class _FamilyMedicalScreenState extends State<FamilyMedicalScreen> { class _FamilyMedicalScreenState extends State<FamilyMedicalScreen> {
List<CustomTabBarModel> tabs = [CustomTabBarModel("", LocaleKeys.medicalFile.tr()), CustomTabBarModel("", LocaleKeys.request.tr())]; List<CustomTabBarModel> tabs = [CustomTabBarModel(null, LocaleKeys.medicalFile.tr()), CustomTabBarModel(null, LocaleKeys.request.tr())];
MedicalFileViewModel? medicalVM; MedicalFileViewModel? medicalVM;
@override @override

Loading…
Cancel
Save