diff --git a/assets/images/svg/active-check.svg b/assets/images/svg/active-check.svg
new file mode 100644
index 0000000..c94a3a0
--- /dev/null
+++ b/assets/images/svg/active-check.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/svg/alert-square.svg b/assets/images/svg/alert-square.svg
new file mode 100644
index 0000000..87b52e3
--- /dev/null
+++ b/assets/images/svg/alert-square.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/svg/arrow-right.svg b/assets/images/svg/arrow-right.svg
new file mode 100644
index 0000000..8818d72
--- /dev/null
+++ b/assets/images/svg/arrow-right.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/images/svg/delete_icon.svg b/assets/images/svg/delete_icon.svg
new file mode 100644
index 0000000..2e37d0d
--- /dev/null
+++ b/assets/images/svg/delete_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart
index dc8b576..b1d1d87 100644
--- a/lib/core/api/api_client.dart
+++ b/lib/core/api/api_client.dart
@@ -18,25 +18,25 @@ abstract class ApiClient {
static final NavigationService _navigationService = getIt.get();
Future post(
- String endPoint, {
- required Map body,
- required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
- required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
- bool isAllowAny,
- bool isExternal,
- bool isRCService,
- bool isPaymentServices,
- bool bypassConnectionCheck,
- });
+ String endPoint, {
+ required Map body,
+ required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
+ required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
+ bool isAllowAny,
+ bool isExternal,
+ bool isRCService,
+ bool isPaymentServices,
+ bool bypassConnectionCheck,
+ });
Future get(
- String endPoint, {
- required Function(dynamic response, int statusCode) onSuccess,
- required Function(String error, int statusCode) onFailure,
- Map? queryParams,
- bool isExternal,
- bool isRCService,
- });
+ String endPoint, {
+ required Function(dynamic response, int statusCode) onSuccess,
+ required Function(String error, int statusCode) onFailure,
+ Map? queryParams,
+ bool isExternal,
+ bool isRCService,
+ });
String getSessionId(String id);
@@ -87,16 +87,16 @@ class ApiClientImp implements ApiClient {
@override
post(
- String endPoint, {
- required Map body,
- required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
- required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
- bool isAllowAny = false,
- bool isExternal = false,
- bool isRCService = false,
- bool isPaymentServices = false,
- bool bypassConnectionCheck = false,
- }) async {
+ String endPoint, {
+ required Map body,
+ required Function(dynamic response, int statusCode, {int? messageStatus, String? errorMessage}) onSuccess,
+ required Function(String error, int statusCode, {int? messageStatus, Failure? failureType}) onFailure,
+ bool isAllowAny = false,
+ bool isExternal = false,
+ bool isRCService = false,
+ bool isPaymentServices = false,
+ bool bypassConnectionCheck = false,
+ }) async {
String url;
if (isExternal) {
url = endPoint;
@@ -322,10 +322,10 @@ class ApiClientImp implements ApiClient {
@override
get(String endPoint,
{required Function(dynamic response, int statusCode) onSuccess,
- required Function(String error, int statusCode) onFailure,
- Map? queryParams,
- bool isExternal = false,
- bool isRCService = false}) async {
+ required Function(String error, int statusCode) onFailure,
+ Map? queryParams,
+ bool isExternal = false,
+ bool isRCService = false}) async {
String url;
if (isExternal) {
url = endPoint;
diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart
index 9f5abce..fd61480 100644
--- a/lib/core/api_consts.dart
+++ b/lib/core/api_consts.dart
@@ -727,7 +727,7 @@ const FAMILY_FILES= 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatu
class ApiConsts {
static const maxSmallScreen = 660;
- static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat;
+ static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod;
// static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT
@@ -812,6 +812,8 @@ class ApiConsts {
static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile';
static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId';
static final String getAllSharedRecordsByStatus = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus';
+ static final String removeFileFromFamilyMembers = 'Services/Authentication.svc/REST/ActiveDeactive_PatientFile';
+ static final String acceptAndRejectFamilyFile = 'Services/Authentication.svc/REST/Update_FileStatus';
// static values for Api
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index 513a52a..89f2e82 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -146,6 +146,8 @@ class AppAssets {
static const String ic_low_result = '$svgBasePath/low_result.svg';
static const String ic_critical_low_result = '$svgBasePath/critical_low_result.svg';
static const String switch_user = '$svgBasePath/switch_user.svg';
+ static const String activeCheck = '$svgBasePath/active-check.svg';
+ static const String deleteIcon = '$svgBasePath/delete_icon.svg';
//bottom navigation//
static const String homeBottom = '$svgBasePath/home_bottom.svg';
@@ -157,6 +159,8 @@ class AppAssets {
static const String feedback = '$svgBasePath/feedback.svg';
static const String news = '$svgBasePath/news.svg';
static const String heart = '$svgBasePath/heart.svg';
+ static const String alertSquare = '$svgBasePath/alert-square.svg';
+ static const String arrowRight = '$svgBasePath/arrow-right.svg';
// PNGS //
static const String hmg_logo = '$pngBasePath/hmg_logo.png';
diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart
index 030cc36..404e22b 100644
--- a/lib/core/app_state.dart
+++ b/lib/core/app_state.dart
@@ -38,15 +38,15 @@ class AppState {
AuthenticatedUser? _authenticatedChildUser;
int? _superUserID;
+ bool isChildLoggedIn = false;
- void setAuthenticatedUser(AuthenticatedUser authenticatedUser, {bool isFamily = false}) {
+ void setAuthenticatedUser(AuthenticatedUser? authenticatedUser, {bool isFamily = false}) {
if (isFamily) {
_authenticatedChildUser = authenticatedUser;
} else {
setIsAuthenticated = true;
_authenticatedRootUser = authenticatedUser;
}
-
}
AuthenticatedUser? getAuthenticatedUser({bool isFamily = false}) {
@@ -59,8 +59,12 @@ class AppState {
int? get getSuperUserID => _superUserID;
+ bool get getIsChildLoggedIn => isChildLoggedIn;
+
set setSuperUserID(int? value) => _superUserID = value;
+ set setIsChildLoggedIn(bool value) => isChildLoggedIn = value;
+
String _userBloodGroup = "";
String get getUserBloodGroup => _userBloodGroup;
@@ -103,8 +107,6 @@ class AppState {
set setDeviceTypeID(v) => deviceTypeID = v;
-
-
String _familyFileTokenID = "";
String get getFamilyFileTokenID => _familyFileTokenID;
@@ -151,9 +153,8 @@ class AppState {
}
///this will be called if there is any problem in getting the user location
- void resetLocation(){
+ void resetLocation() {
userLong = 0.0;
userLong = 0.0;
}
-
}
diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 1fe2317..a3bb4c7 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -97,11 +97,7 @@ class AppDependencies {
// Global/shared VMs → LazySingleton
getIt.registerLazySingleton(
- () => LabViewModel(
- labRepo: getIt(),
- errorHandlerService: getIt(),
- navigationService: getIt()
- ),
+ () => LabViewModel(labRepo: getIt(), errorHandlerService: getIt(), navigationService: getIt()),
);
getIt.registerLazySingleton(
diff --git a/lib/core/enums.dart b/lib/core/enums.dart
index e94b3e2..4151bed 100644
--- a/lib/core/enums.dart
+++ b/lib/core/enums.dart
@@ -30,7 +30,7 @@ enum LoginTypeEnum { sms, whatsapp, face, fingerprint }
enum AppEnvironmentTypeEnum { dev, uat, preProd, qa, staging, prod }
-enum FamilyFileEnum { active, inactive, blocked, deleted, pending }
+enum FamilyFileEnum { active, inactive, blocked, deleted, pending, rejected }
extension CalenderExtension on CalenderEnum {
int get toInt {
@@ -152,6 +152,8 @@ extension FamilyFileEnumExtenshion on FamilyFileEnum {
case FamilyFileEnum.pending:
return 2;
case FamilyFileEnum.inactive:
+ return 6;
+ case FamilyFileEnum.rejected:
return 4;
}
}
@@ -170,6 +172,8 @@ extension FamilyFileEnumExtenshion on FamilyFileEnum {
return isArabic ? 'محذوف' : 'Deleted';
case FamilyFileEnum.pending:
return isArabic ? 'قيد الانتظار' : 'Pending';
+ case FamilyFileEnum.rejected:
+ return isArabic ? 'مرفوض' : 'Rejected';
}
}
diff --git a/lib/core/utils/request_utils.dart b/lib/core/utils/request_utils.dart
index cd813ed..a4ea936 100644
--- a/lib/core/utils/request_utils.dart
+++ b/lib/core/utils/request_utils.dart
@@ -262,7 +262,7 @@ class RequestUtils {
static Future getAddFamilyRequest({required String nationalIDorFile, required String mobileNo, required String countryCode}) async {
FamilyFileRequest request = FamilyFileRequest();
- int? loginType = 0; // Default to National ID
+ int? loginType = 0;
if (countryCode == CountryEnum.saudiArabia.countryCode || countryCode == '+966') {
loginType = (nationalIDorFile.length == 10) ? 1 : 2;
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index efa01d0..bac2470 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -627,8 +627,17 @@ class Utils {
double width = 24,
double height = 24,
BoxFit fit = BoxFit.cover,
+ double? border,
+ double? borderRadius,
}) {
- return Image.asset(icon, width: width, height: height, fit: fit);
+ return Container(
+ decoration: BoxDecoration(
+ border: border != null ? Border.all(color: AppColors.whiteColor, width: border) : null,
+ borderRadius: border != null ? BorderRadius.circular(borderRadius ?? 0) : null,
+ ),
+ child: Image.asset(icon, width: width, height: height, fit: fit),
+ );
+ // return Image.asset(icon, width: width, height: height, fit: fit, );
}
/// Widget to build an SVG from network
diff --git a/lib/features/authentication/authentication_repo.dart b/lib/features/authentication/authentication_repo.dart
index 96bdc0b..c034a69 100644
--- a/lib/features/authentication/authentication_repo.dart
+++ b/lib/features/authentication/authentication_repo.dart
@@ -206,38 +206,93 @@ class AuthenticationRepoImp implements AuthenticationRepo {
int? patientID,
int? loginType}) async {
AppState appState = getIt.get();
+ // if (isRegister) {
+ // newRequest["activationCode"] = activationCode ?? "0000";
+ // newRequest["isSilentLogin"] = activationCode != null ? false : true;
+ // } else {
+ // newRequest.activationCode = activationCode ?? "0000";
+ // newRequest.isSilentLogin = activationCode != null ? false : true;
+ // newRequest.projectOutSA = newRequest.zipCode == '966' ? false : true;
+ // newRequest.isDentalAllowedBackend = false;
+ // newRequest.forRegisteration = newRequest.isRegister ?? false;
+ // newRequest.isRegister = false;
+ // }
+ // Map familyRequest = {};
+ // if (isFormFamilyFile) {
+ // AppState appState = getIt.get();
+ // familyRequest = {};
+ // familyRequest['PatientShareRequestID'] = patientShareRequestID;
+ // familyRequest['ResponseID'] = responseID;
+ // familyRequest['Status'] = 3;
+ // familyRequest["PatientID"] = appState.getAuthenticatedUser()!.patientId ?? 0;
+ // familyRequest["LogInTokenID"] = appState.getFamilyFileTokenID;
+ // familyRequest["activationCode"] = activationCode ?? "0000";
+ // familyRequest["PatientMobileNumber"] = newRequest.patientMobileNumber;
+ // familyRequest["PatientIdentificationID"] = newRequest.patientIdentificationID;
+ // }
+ // Map switchRequest = {};
+ // if (isSwitchUser) {
+ // switchRequest = newRequest.toJson();
+ //
+ // switchRequest['PatientID'] = responseID;
+ // switchRequest['IsSilentLogin'] = true;
+ // switchRequest['LogInTokenID'] = null;
+ // switchRequest['SearchType'] = 2;
+ // if (loginType != 0) {
+ // switchRequest['SuperUser'] = patientID;
+ // switchRequest['DeviceToken'] = null;
+ // } else {
+ // switchRequest["LoginType"] = 2;
+ // }
+ //
+ // if (appState.getSuperUserID == responseID) {
+ // // switchRequest['LoginType'] = 3;
+ // switchRequest['PatientIdentificationID'] = "";
+ // // switchRequest['ProjectOutSA'] = newRequest.zipCode == '966' ? false : true;
+ // switchRequest.remove('NationalID');
+ // switchRequest.remove('isDentalAllowedBackend');
+ // switchRequest.remove('ProjectOutSA');
+ // switchRequest.remove('ForRegisteration');
+ // appState.setSuperUserID = null;
+ // }
+ // }
+
if (isRegister) {
newRequest["activationCode"] = activationCode ?? "0000";
- newRequest["isSilentLogin"] = activationCode != null ? false : true;
+ newRequest["isSilentLogin"] = activationCode == null;
} else {
newRequest.activationCode = activationCode ?? "0000";
- newRequest.isSilentLogin = activationCode != null ? false : true;
- newRequest.projectOutSA = newRequest.zipCode == '966' ? false : true;
+ newRequest.isSilentLogin = activationCode == null;
+ newRequest.projectOutSA = newRequest.zipCode != '966';
newRequest.isDentalAllowedBackend = false;
newRequest.forRegisteration = newRequest.isRegister ?? false;
newRequest.isRegister = false;
}
+
Map familyRequest = {};
if (isFormFamilyFile) {
- AppState appState = getIt.get();
- familyRequest = {};
- familyRequest['PatientShareRequestID'] = patientShareRequestID;
- familyRequest['ResponseID'] = responseID;
- familyRequest['Status'] = 3;
- familyRequest["PatientID"] = appState.getAuthenticatedUser()!.patientId ?? 0;
- familyRequest["LogInTokenID"] = appState.getFamilyFileTokenID;
- familyRequest["activationCode"] = activationCode ?? "0000";
- familyRequest["PatientMobileNumber"] = newRequest.patientMobileNumber;
- familyRequest["PatientIdentificationID"] = newRequest.patientIdentificationID;
+ familyRequest = {
+ 'PatientShareRequestID': patientShareRequestID,
+ 'ResponseID': responseID,
+ 'Status': 3,
+ 'PatientID': appState.getAuthenticatedUser()?.patientId ?? 0,
+ 'LogInTokenID': appState.getFamilyFileTokenID,
+ 'activationCode': activationCode ?? "0000",
+ 'PatientMobileNumber': newRequest.patientMobileNumber,
+ 'PatientIdentificationID': newRequest.patientIdentificationID,
+ };
}
+
Map switchRequest = {};
if (isSwitchUser) {
switchRequest = newRequest.toJson();
+ switchRequest.addAll({
+ 'PatientID': responseID,
+ 'IsSilentLogin': true,
+ 'LogInTokenID': null,
+ 'SearchType': 2,
+ });
- switchRequest['PatientID'] = responseID;
- switchRequest['IsSilentLogin'] = true;
- switchRequest['LogInTokenID'] = null;
- switchRequest['SearchType'] = 2;
if (loginType != 0) {
switchRequest['SuperUser'] = patientID;
switchRequest['DeviceToken'] = null;
@@ -246,13 +301,8 @@ class AuthenticationRepoImp implements AuthenticationRepo {
}
if (appState.getSuperUserID == responseID) {
- switchRequest['LoginType'] = 3;
switchRequest['PatientIdentificationID'] = "";
- // switchRequest['ProjectOutSA'] = newRequest.zipCode == '966' ? false : true;
- switchRequest.remove('NationalID');
- switchRequest.remove('isDentalAllowedBackend');
- switchRequest.remove('ProjectOutSA');
- switchRequest.remove('ForRegisteration');
+ switchRequest.removeWhere((key, value) => ['NationalID', 'isDentalAllowedBackend', 'ProjectOutSA', 'ForRegisteration'].contains(key));
}
}
@@ -303,7 +353,6 @@ class AuthenticationRepoImp implements AuthenticationRepo {
@override
Future>> checkIfUserAgreed({required dynamic commonAuthanticatedRequest}) async {
commonAuthanticatedRequest['Region'] = 1;
- print("dsfsdd");
try {
GenericApiModel? apiResponse;
Failure? failure;
@@ -338,7 +387,6 @@ class AuthenticationRepoImp implements AuthenticationRepo {
@override
Future>> getUserAgreementContent({required dynamic commonAuthanticatedRequest}) async {
commonAuthanticatedRequest['Region'] = 1;
- print("dsfsdd");
try {
GenericApiModel? apiResponse;
Failure? failure;
diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart
index b3f9617..467a476 100644
--- a/lib/features/authentication/authentication_view_model.dart
+++ b/lib/features/authentication/authentication_view_model.dart
@@ -366,7 +366,7 @@ class AuthenticationViewModel extends ChangeNotifier {
isForRegister: isForRegister,
patientOutSA: isForRegister
? isPatientOutsideSA(request: payload)
- : selectedCountrySignup.countryCode == CountryEnum.saudiArabia
+ : selectedCountrySignup.countryCode == CountryEnum.saudiArabia.countryCode
? false
: true,
payload: payload,
@@ -374,9 +374,6 @@ class AuthenticationViewModel extends ChangeNotifier {
isFormFamilyFile: isFormFamilyFile,
responseID: responseID);
-
-
-
// TODO: GET APP SMS SIGNATURE HERE
request.sMSSignature = await getSignature();
@@ -434,18 +431,17 @@ class AuthenticationViewModel extends ChangeNotifier {
return isUserComingForRegister;
}
- Future checkActivationCode(
- {required String? activationCode,
- required OTPTypeEnum otpTypeEnum,
- required Function(String? message) onWrongActivationCode,
- Function()? onResendActivation,
- bool isFormFamilyFile = false,
- dynamic patientShareRequestID,
- dynamic responseID,
- bool isSwitchUser =false,
- int? patientID,
-
- }) async {
+ Future checkActivationCode({
+ required String? activationCode,
+ required OTPTypeEnum otpTypeEnum,
+ required Function(String? message) onWrongActivationCode,
+ Function()? onResendActivation,
+ bool isFormFamilyFile = false,
+ dynamic patientShareRequestID,
+ dynamic responseID,
+ bool isSwitchUser = false,
+ int? patientID,
+ }) async {
bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1);
final request = RequestUtils.getCommonRequestWelcome(
@@ -508,15 +504,15 @@ class AuthenticationViewModel extends ChangeNotifier {
});
} else {
final resultEither = await _authenticationRepo.checkActivationCodeRepo(
- newRequest: CheckActivationCodeRegisterReq.fromJson(request),
- activationCode: activationCode,
- isRegister: false,
- isFormFamilyFile: isFormFamilyFile,
- patientShareRequestID: patientShareRequestID,
- responseID: responseID,
- isSwitchUser: isSwitchUser,
- patientID: patientID,
- loginType: _appState.getSuperUserID != null ? 0 : 2,
+ newRequest: CheckActivationCodeRegisterReq.fromJson(request),
+ activationCode: activationCode,
+ isRegister: false,
+ isFormFamilyFile: isFormFamilyFile,
+ patientShareRequestID: patientShareRequestID,
+ responseID: responseID,
+ isSwitchUser: isSwitchUser,
+ patientID: patientID,
+ loginType: _appState.getSuperUserID != null ? 0 : 2,
);
resultEither.fold(
@@ -531,8 +527,6 @@ 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') {
@@ -551,17 +545,27 @@ class AuthenticationViewModel extends ChangeNotifier {
return;
} else {
if (isFormFamilyFile) {
- await navigateToFamilyFilePage();
- // _dialogService.showCommonBottomSheetWithoutH(
- // message: "Family File Added Successfully",
- // onOkPressed: () async {
- // print("navigating to family file page");
- //
- // });
+ // await navigateToFamilyFilePage();
+ MedicalFileViewModel medicalVm = getIt();
+ if (!_appState.getIsChildLoggedIn) {
+ await medicalVm.getFamilyFiles(status: 0);
+ await medicalVm.getAllPendingRecordsByResponseId();
+ _navigationService.popUntilNamed(AppRoutes.medicalFilePage);
+ }
} else {
if (activation.list != null && activation.list!.isNotEmpty) {
- if(isSwitchUser){
- _appState.setSuperUserID = _appState.getAuthenticatedUser()?.patientId;
+ if (isSwitchUser) {
+ if (_appState.getIsChildLoggedIn) {
+ _appState.setSuperUserID = null;
+ _appState.setIsChildLoggedIn = false;
+ activation.list!.first.isParentUser = true;
+ } else {
+ _appState.setSuperUserID = _appState.getAuthenticatedUser()?.patientId;
+ _appState.setIsChildLoggedIn = true;
+ activation.list!.first.isParentUser = false;
+ }
+ } else {
+ activation.list!.first.isParentUser = true;
}
_appState.setAuthenticatedUser(activation.list!.first);
_appState.setPrivilegeModelList(activation.list!.first.listPrivilege!);
@@ -576,7 +580,14 @@ class AuthenticationViewModel extends ChangeNotifier {
_appState.getSelectDeviceByImeiRespModelElement!.logInType = loginTypeEnum.toInt;
}
LoaderBottomSheet.hideLoader();
- insertPatientIMEIData(loginTypeEnum.toInt);
+//
+ if (!isSwitchUser && !_appState.getIsChildLoggedIn) {
+ MedicalFileViewModel medicalVm = getIt();
+ insertPatientIMEIData(loginTypeEnum.toInt);
+ await medicalVm.getFamilyFiles(status: 0); //TODO: Remove status: 1 by Aamir Need to Discuss With Sultan
+ // medicalVm.getAllPendingRecordsByResponseId();
+ }
+
await clearDefaultInputValues();
if (isUserAgreedBefore) {
navigateToHomeScreen();
diff --git a/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart b/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart
index e6a8e17..8209a0f 100644
--- a/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart
+++ b/lib/features/authentication/models/resp_models/authenticated_user_resp_model.dart
@@ -70,6 +70,8 @@ class AuthenticatedUser {
dynamic authenticatedUserPatientType;
dynamic authenticatedUserStatus;
int? superUser;
+ bool? isParentUser;
+
AuthenticatedUser({
this.setupId,
this.patientType,
@@ -139,7 +141,8 @@ class AuthenticatedUser {
this.authenticatedUserPatientPayType,
this.authenticatedUserPatientType,
this.authenticatedUserStatus,
- this.superUser
+ this.superUser,
+ this.isParentUser,
});
factory AuthenticatedUser.fromRawJson(String str) => AuthenticatedUser.fromJson(json.decode(str));
@@ -147,148 +150,150 @@ class AuthenticatedUser {
String toRawJson() => json.encode(toJson());
factory AuthenticatedUser.fromJson(Map json) => AuthenticatedUser(
- setupId: json["SetupID"],
- patientType: json["PatientType"],
- patientId: json["PatientID"],
- firstName: json["FirstName"],
- middleName: json["MiddleName"],
- lastName: json["LastName"],
- firstNameN: json["FirstNameN"],
- middleNameN: json["MiddleNameN"],
- lastNameN: json["LastNameN"],
- relationshipId: json["RelationshipID"],
- gender: json["Gender"],
- dateofBirth: json["DateofBirth"],
- dateofBirthN: json["DateofBirthN"],
- nationalityId: json["NationalityID"],
- phoneResi: json["PhoneResi"],
- phoneOffice: json["PhoneOffice"],
- mobileNumber: json["MobileNumber"],
- faxNumber: json["FaxNumber"],
- emailAddress: json["EmailAddress"],
- bloodGroup: json["BloodGroup"],
- rhFactor: json["RHFactor"],
- isEmailAlertRequired: json["IsEmailAlertRequired"],
- isSmsAlertRequired: json["IsSMSAlertRequired"],
- preferredLanguage: json["PreferredLanguage"],
- isPrivilegedMember: json["IsPrivilegedMember"],
- memberId: json["MemberID"],
- expiryDate: json["ExpiryDate"],
- isHmgEmployee: json["IsHmgEmployee"],
- employeeId: json["EmployeeID"],
- emergencyContactName: json["EmergencyContactName"],
- emergencyContactNo: json["EmergencyContactNo"],
- patientPayType: json["PatientPayType"],
- dhccPatientRefId: json["DHCCPatientRefID"],
- isPatientDummy: json["IsPatientDummy"],
- status: json["Status"],
- isStatusCleared: json["IsStatusCleared"],
- patientIdentificationType: json["PatientIdentificationType"],
- patientIdentificationNo: json["PatientIdentificationNo"],
- projectId: json["ProjectID"],
- infoSourceId: json["InfoSourceID"],
- address: json["Address"],
- age: json["Age"],
- ageDesc: json["AgeDesc"],
- areaId: json["AreaID"],
- crsVerificationStatus: json["CRSVerificationStatus"],
- crsVerificationStatusDesc: json["CRSVerificationStatusDesc"],
- crsVerificationStatusDescN: json["CRSVerificationStatusDescN"],
- createdBy: json["CreatedBy"],
- genderDescription: json["GenderDescription"],
- healthIdFromNhicViaVida: json["HealthIDFromNHICViaVida"],
- ir: json["IR"],
- isoCityId: json["ISOCityID"],
- isoCountryId: json["ISOCountryID"],
- isVerfiedFromNhic: json["IsVerfiedFromNHIC"],
- listPrivilege: json["ListPrivilege"] == null ? [] : List.from(json["ListPrivilege"]!.map((x) => ListPrivilege.fromJson(x))),
- marital: json["Marital"],
- occupationId: json["OccupationID"],
- outSa: json["OutSA"],
- poBox: json["POBox"],
- receiveHealthSummaryReport: json["ReceiveHealthSummaryReport"],
- sourceType: json["SourceType"],
- strDateofBirth: json["StrDateofBirth"],
- tempAddress: json["TempAddress"],
- zipCode: json["ZipCode"],
- eHealthIdField: json["eHealthIDField"],
- authenticatedUserPatientPayType: json["patientPayType"],
- authenticatedUserPatientType: json["patientType"],
- authenticatedUserStatus: json["status"],
- superUser: json["superUser"],
- );
+ setupId: json["SetupID"],
+ patientType: json["PatientType"],
+ patientId: json["PatientID"],
+ firstName: json["FirstName"],
+ middleName: json["MiddleName"],
+ lastName: json["LastName"],
+ firstNameN: json["FirstNameN"],
+ middleNameN: json["MiddleNameN"],
+ lastNameN: json["LastNameN"],
+ relationshipId: json["RelationshipID"],
+ gender: json["Gender"],
+ dateofBirth: json["DateofBirth"],
+ dateofBirthN: json["DateofBirthN"],
+ nationalityId: json["NationalityID"],
+ phoneResi: json["PhoneResi"],
+ phoneOffice: json["PhoneOffice"],
+ mobileNumber: json["MobileNumber"],
+ faxNumber: json["FaxNumber"],
+ emailAddress: json["EmailAddress"],
+ bloodGroup: json["BloodGroup"],
+ rhFactor: json["RHFactor"],
+ isEmailAlertRequired: json["IsEmailAlertRequired"],
+ isSmsAlertRequired: json["IsSMSAlertRequired"],
+ preferredLanguage: json["PreferredLanguage"],
+ isPrivilegedMember: json["IsPrivilegedMember"],
+ memberId: json["MemberID"],
+ expiryDate: json["ExpiryDate"],
+ isHmgEmployee: json["IsHmgEmployee"],
+ employeeId: json["EmployeeID"],
+ emergencyContactName: json["EmergencyContactName"],
+ emergencyContactNo: json["EmergencyContactNo"],
+ patientPayType: json["PatientPayType"],
+ dhccPatientRefId: json["DHCCPatientRefID"],
+ isPatientDummy: json["IsPatientDummy"],
+ status: json["Status"],
+ isStatusCleared: json["IsStatusCleared"],
+ patientIdentificationType: json["PatientIdentificationType"],
+ patientIdentificationNo: json["PatientIdentificationNo"],
+ projectId: json["ProjectID"],
+ infoSourceId: json["InfoSourceID"],
+ address: json["Address"],
+ age: json["Age"],
+ ageDesc: json["AgeDesc"],
+ areaId: json["AreaID"],
+ crsVerificationStatus: json["CRSVerificationStatus"],
+ crsVerificationStatusDesc: json["CRSVerificationStatusDesc"],
+ crsVerificationStatusDescN: json["CRSVerificationStatusDescN"],
+ createdBy: json["CreatedBy"],
+ genderDescription: json["GenderDescription"],
+ healthIdFromNhicViaVida: json["HealthIDFromNHICViaVida"],
+ ir: json["IR"],
+ isoCityId: json["ISOCityID"],
+ isoCountryId: json["ISOCountryID"],
+ isVerfiedFromNhic: json["IsVerfiedFromNHIC"],
+ listPrivilege: json["ListPrivilege"] == null ? [] : List.from(json["ListPrivilege"]!.map((x) => ListPrivilege.fromJson(x))),
+ marital: json["Marital"],
+ occupationId: json["OccupationID"],
+ outSa: json["OutSA"],
+ poBox: json["POBox"],
+ receiveHealthSummaryReport: json["ReceiveHealthSummaryReport"],
+ sourceType: json["SourceType"],
+ strDateofBirth: json["StrDateofBirth"],
+ tempAddress: json["TempAddress"],
+ zipCode: json["ZipCode"],
+ eHealthIdField: json["eHealthIDField"],
+ authenticatedUserPatientPayType: json["patientPayType"],
+ authenticatedUserPatientType: json["patientType"],
+ authenticatedUserStatus: json["status"],
+ superUser: json["superUser"],
+ isParentUser: json["isParentUser"] ?? false,
+ );
Map toJson() => {
- "SetupID": setupId,
- "PatientType": patientType,
- "PatientID": patientId,
- "FirstName": firstName,
- "MiddleName": middleName,
- "LastName": lastName,
- "FirstNameN": firstNameN,
- "MiddleNameN": middleNameN,
- "LastNameN": lastNameN,
- "RelationshipID": relationshipId,
- "Gender": gender,
- "DateofBirth": dateofBirth,
- "DateofBirthN": dateofBirthN,
- "NationalityID": nationalityId,
- "PhoneResi": phoneResi,
- "PhoneOffice": phoneOffice,
- "MobileNumber": mobileNumber,
- "FaxNumber": faxNumber,
- "EmailAddress": emailAddress,
- "BloodGroup": bloodGroup,
- "RHFactor": rhFactor,
- "IsEmailAlertRequired": isEmailAlertRequired,
- "IsSMSAlertRequired": isSmsAlertRequired,
- "PreferredLanguage": preferredLanguage,
- "IsPrivilegedMember": isPrivilegedMember,
- "MemberID": memberId,
- "ExpiryDate": expiryDate,
- "IsHmgEmployee": isHmgEmployee,
- "EmployeeID": employeeId,
- "EmergencyContactName": emergencyContactName,
- "EmergencyContactNo": emergencyContactNo,
- "PatientPayType": patientPayType,
- "DHCCPatientRefID": dhccPatientRefId,
- "IsPatientDummy": isPatientDummy,
- "Status": status,
- "IsStatusCleared": isStatusCleared,
- "PatientIdentificationType": patientIdentificationType,
- "PatientIdentificationNo": patientIdentificationNo,
- "ProjectID": projectId,
- "InfoSourceID": infoSourceId,
- "Address": address,
- "Age": age,
- "AgeDesc": ageDesc,
- "AreaID": areaId,
- "CRSVerificationStatus": crsVerificationStatus,
- "CRSVerificationStatusDesc": crsVerificationStatusDesc,
- "CRSVerificationStatusDescN": crsVerificationStatusDescN,
- "CreatedBy": createdBy,
- "GenderDescription": genderDescription,
- "HealthIDFromNHICViaVida": healthIdFromNhicViaVida,
- "IR": ir,
- "ISOCityID": isoCityId,
- "ISOCountryID": isoCountryId,
- "IsVerfiedFromNHIC": isVerfiedFromNhic,
- "ListPrivilege": listPrivilege == null ? [] : List.from(listPrivilege!.map((x) => x.toJson())),
- "Marital": marital,
- "OccupationID": occupationId,
- "OutSA": outSa,
- "POBox": poBox,
- "ReceiveHealthSummaryReport": receiveHealthSummaryReport,
- "SourceType": sourceType,
- "StrDateofBirth": strDateofBirth,
- "TempAddress": tempAddress,
- "ZipCode": zipCode,
- "eHealthIDField": eHealthIdField,
- "patientPayType": authenticatedUserPatientPayType,
- "patientType": authenticatedUserPatientType,
- "status": authenticatedUserStatus,
- "superUser": superUser,
- };
+ "SetupID": setupId,
+ "PatientType": patientType,
+ "PatientID": patientId,
+ "FirstName": firstName,
+ "MiddleName": middleName,
+ "LastName": lastName,
+ "FirstNameN": firstNameN,
+ "MiddleNameN": middleNameN,
+ "LastNameN": lastNameN,
+ "RelationshipID": relationshipId,
+ "Gender": gender,
+ "DateofBirth": dateofBirth,
+ "DateofBirthN": dateofBirthN,
+ "NationalityID": nationalityId,
+ "PhoneResi": phoneResi,
+ "PhoneOffice": phoneOffice,
+ "MobileNumber": mobileNumber,
+ "FaxNumber": faxNumber,
+ "EmailAddress": emailAddress,
+ "BloodGroup": bloodGroup,
+ "RHFactor": rhFactor,
+ "IsEmailAlertRequired": isEmailAlertRequired,
+ "IsSMSAlertRequired": isSmsAlertRequired,
+ "PreferredLanguage": preferredLanguage,
+ "IsPrivilegedMember": isPrivilegedMember,
+ "MemberID": memberId,
+ "ExpiryDate": expiryDate,
+ "IsHmgEmployee": isHmgEmployee,
+ "EmployeeID": employeeId,
+ "EmergencyContactName": emergencyContactName,
+ "EmergencyContactNo": emergencyContactNo,
+ "PatientPayType": patientPayType,
+ "DHCCPatientRefID": dhccPatientRefId,
+ "IsPatientDummy": isPatientDummy,
+ "Status": status,
+ "IsStatusCleared": isStatusCleared,
+ "PatientIdentificationType": patientIdentificationType,
+ "PatientIdentificationNo": patientIdentificationNo,
+ "ProjectID": projectId,
+ "InfoSourceID": infoSourceId,
+ "Address": address,
+ "Age": age,
+ "AgeDesc": ageDesc,
+ "AreaID": areaId,
+ "CRSVerificationStatus": crsVerificationStatus,
+ "CRSVerificationStatusDesc": crsVerificationStatusDesc,
+ "CRSVerificationStatusDescN": crsVerificationStatusDescN,
+ "CreatedBy": createdBy,
+ "GenderDescription": genderDescription,
+ "HealthIDFromNHICViaVida": healthIdFromNhicViaVida,
+ "IR": ir,
+ "ISOCityID": isoCityId,
+ "ISOCountryID": isoCountryId,
+ "IsVerfiedFromNHIC": isVerfiedFromNhic,
+ "ListPrivilege": listPrivilege == null ? [] : List.from(listPrivilege!.map((x) => x.toJson())),
+ "Marital": marital,
+ "OccupationID": occupationId,
+ "OutSA": outSa,
+ "POBox": poBox,
+ "ReceiveHealthSummaryReport": receiveHealthSummaryReport,
+ "SourceType": sourceType,
+ "StrDateofBirth": strDateofBirth,
+ "TempAddress": tempAddress,
+ "ZipCode": zipCode,
+ "eHealthIDField": eHealthIdField,
+ "patientPayType": authenticatedUserPatientPayType,
+ "patientType": authenticatedUserPatientType,
+ "status": authenticatedUserStatus,
+ "superUser": superUser,
+ "isParentUser": isParentUser,
+ };
}
class ListPrivilege {
@@ -309,16 +314,16 @@ class ListPrivilege {
String toRawJson() => json.encode(toJson());
factory ListPrivilege.fromJson(Map json) => ListPrivilege(
- id: json["ID"],
- serviceName: json["ServiceName"],
- previlege: json["Previlege"],
- region: json["Region"],
- );
+ id: json["ID"],
+ serviceName: json["ServiceName"],
+ previlege: json["Previlege"],
+ region: json["Region"],
+ );
Map toJson() => {
- "ID": id,
- "ServiceName": serviceName,
- "Previlege": previlege,
- "Region": region,
- };
+ "ID": id,
+ "ServiceName": serviceName,
+ "Previlege": previlege,
+ "Region": region,
+ };
}
diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart
index 9c18696..994f9f9 100644
--- a/lib/features/medical_file/medical_file_repo.dart
+++ b/lib/features/medical_file/medical_file_repo.dart
@@ -29,6 +29,10 @@ abstract class MedicalFileRepo {
Future>>> getAllPendingRecordsByResponseId({required Map request});
Future>> addFamilyFile({required dynamic request});
+
+ Future>> removeFamilyFile({required int? id});
+
+ Future>> acceptRejectFamilyFile({required int? id, required int? status});
}
class MedicalFileRepoImp implements MedicalFileRepo {
@@ -328,10 +332,6 @@ class MedicalFileRepoImp implements MedicalFileRepo {
onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
try {
final list = response['GetAllPendingRecordsList'];
- // 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>(
@@ -384,4 +384,74 @@ class MedicalFileRepoImp implements MedicalFileRepo {
return Left(UnknownFailure(e.toString()));
}
}
+
+ @override
+ Future>> removeFamilyFile({required int? id}) async {
+ Map request = {};
+ request["ID"] = id;
+ request['IsActive'] = false;
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ ApiConsts.removeFileFromFamilyMembers,
+ body: request,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ apiResponse = GenericApiModel(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: errorMessage,
+ data: response,
+ );
+ } 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>> acceptRejectFamilyFile({required int? id, required int? status}) async {
+ Map request = {};
+ request["ID"] = id;
+ request['Status'] = status;
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ ApiConsts.acceptAndRejectFamilyFile,
+ body: request,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ apiResponse = GenericApiModel(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: errorMessage,
+ data: response,
+ );
+ } 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()));
+ }
+ }
}
diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart
index 64075b4..df8027f 100644
--- a/lib/features/medical_file/medical_file_view_model.dart
+++ b/lib/features/medical_file/medical_file_view_model.dart
@@ -1,4 +1,5 @@
import 'dart:convert';
+import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
@@ -83,7 +84,7 @@ class MedicalFileViewModel extends ChangeNotifier {
void onFamilyFileTabChange(int index) {
setSelectedFamilyFileTabIndex = index;
if (index == 1) {
- getAllPendingRecordsByResponseId();
+ // getAllPendingRecordsByResponseId();
}
notifyListeners();
}
@@ -270,148 +271,50 @@ class MedicalFileViewModel extends ChangeNotifier {
if (apiResponse.messageStatus == 2) {
_dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {});
} else if (apiResponse.messageStatus == 1) {
- patientFamilyFiles = apiResponse.data!;
if (apiResponse.data != null) {
- patientFamilyFiles.insert(
- 0,
- FamilyFileResponseModelLists(
- patientId: _appState.getAuthenticatedUser()!.patientId,
- patientName: '${_appState.getAuthenticatedUser()!.firstName!} ${_appState.getAuthenticatedUser()!.lastName!}',
- isActive: true,
- gender: _appState.getAuthenticatedUser()!.gender!,
- responseId: _appState.getAuthenticatedUser()!.patientId,
- age: _appState.getAuthenticatedUser()!.age,
- mobileNumber: _appState.getAuthenticatedUser()!.mobileNumber,
- patientIdenficationNumber: _appState.getAuthenticatedUser()!.patientIdentificationNo,
- emaiLAddress: _appState.getAuthenticatedUser()!.emailAddress,
- genderDescription: _appState.getAuthenticatedUser()!.genderDescription,
- ),
+ // Add current user as the first active family file
+ final currentUser = _appState.getAuthenticatedUser()!;
+ final currentUserFamilyFile = FamilyFileResponseModelLists(
+ patientId: currentUser.patientId,
+ patientName: '${currentUser.firstName!} ${currentUser.lastName!}',
+ isActive: true,
+ gender: currentUser.gender!,
+ responseId: currentUser.patientId,
+ age: currentUser.age,
+ mobileNumber: currentUser.mobileNumber,
+ patientIdenficationNumber: currentUser.patientIdentificationNo,
+ emaiLAddress: currentUser.emailAddress,
+ genderDescription: currentUser.genderDescription,
);
- // final List activeFamilyFiles = [];
- // final List tempPendingFamilyFiles = [];
- // for (var element in apiResponse.data!) {
- // if (element.status != null && element.status == FamilyFileEnum.active.toInt) {
- // activeFamilyFiles.add(FamilyFileResponseModelLists(
- // patientId: element.patientId,
- // patientName: element.patientName!,
- // isActive: element.status == FamilyFileEnum.active.toInt ? true : false,
- // gender: element.gender!,
- // responseId: element.patientId,
- // mobileNumber: element.mobileNumber,
- // age: element.age,
- // patientIdenficationNumber: element.patientIdenficationNumber,
- // relationship: element.relationship,
- // relationshipId: element.relationshipId,
- // relationshipN: element.relationshipN,
- // status: element.status,
- // statusDescription: element.statusDescription,
- // createdOn: element.createdOn,
- // editedOn: element.editedOn,
- // patientDataVerified: element.patientDataVerified,
- // regionId: element.regionId,
- // familyRegionId: element.familyRegionId,
- // genderDescription: element.genderDescription,
- // genderImage: element.genderImage,
- // emaiLAddress: element.emaiLAddress));
- // }
- //
- // if (element.status != null && element.status == FamilyFileEnum.pending.toInt) {
- // tempPendingFamilyFiles.add(FamilyFileResponseModelLists(
- // patientId: element.patientId,
- // patientName: element.patientName!,
- // isActive: element.status == FamilyFileEnum.active.toInt ? true : false,
- // gender: element.gender!,
- // responseId: element.patientId,
- // mobileNumber: element.mobileNumber,
- // age: element.age,
- // patientIdenficationNumber: element.patientIdenficationNumber,
- // relationship: element.relationship,
- // relationshipId: element.relationshipId,
- // relationshipN: element.relationshipN,
- // status: element.status,
- // statusDescription: element.statusDescription,
- // createdOn: element.createdOn,
- // editedOn: element.editedOn,
- // patientDataVerified: element.patientDataVerified,
- // regionId: element.regionId,
- // familyRegionId: element.familyRegionId,
- // genderDescription: element.genderDescription,
- // genderImage: element.genderImage,
- // emaiLAddress: element.emaiLAddress));
- // }
- // }
- // patientFamilyFiles.addAll(activeFamilyFiles.where((element) => !patientFamilyFiles.any((e) => e.patientId == element.patientId)));
- // pendingFamilyFiles.addAll(tempPendingFamilyFiles);
+ // Clear and start fresh with current user
+ patientFamilyFiles.clear();
+ patientFamilyFiles.add(currentUserFamilyFile);
final List activeFamilyFiles = [];
- final List tempPendingFamilyFiles = [];
- // final Set pendingIds = {};
-
- // for (var element in apiResponse.data!) {
- // if (element.status != null && element.status == FamilyFileEnum.pending.toInt) {
- // tempPendingFamilyFiles.add(FamilyFileResponseModelLists(
- // patientId: element.patientId,
- // patientName: element.patientName!,
- // isActive: false,
- // gender: element.gender!,
- // responseId: element.patientId,
- // mobileNumber: element.mobileNumber,
- // age: element.age,
- // patientIdenficationNumber: element.patientIdenficationNumber,
- // relationship: element.relationship,
- // relationshipId: element.relationshipId,
- // relationshipN: element.relationshipN,
- // status: element.status,
- // statusDescription: element.statusDescription,
- // createdOn: element.createdOn,
- // editedOn: element.editedOn,
- // patientDataVerified: element.patientDataVerified,
- // regionId: element.regionId,
- // familyRegionId: element.familyRegionId,
- // genderDescription: element.genderDescription,
- // genderImage: element.genderImage,
- // emaiLAddress: element.emaiLAddress));
- // } else if (element.status != null && element.status == FamilyFileEnum.active.toInt) {
- // activeFamilyFiles.add(FamilyFileResponseModelLists(
- // patientId: element.patientId,
- // patientName: element.patientName!,
- // isActive: element.status == FamilyFileEnum.active.toInt ? true : false,
- // gender: element.gender!,
- // responseId: element.patientId,
- // mobileNumber: element.mobileNumber,
- // age: element.age,
- // patientIdenficationNumber: element.patientIdenficationNumber,
- // relationship: element.relationship,
- // relationshipId: element.relationshipId,
- // relationshipN: element.relationshipN,
- // status: element.status,
- // statusDescription: element.statusDescription,
- // createdOn: element.createdOn,
- // editedOn: element.editedOn,
- // patientDataVerified: element.patientDataVerified,
- // regionId: element.regionId,
- // familyRegionId: element.familyRegionId,
- // genderDescription: element.genderDescription,
- // genderImage: element.genderImage,
- // emaiLAddress: element.emaiLAddress));
- // }
- // }
+ final List pendingFamilyFiles = [];
for (var element in apiResponse.data!) {
- if (element.status == null) continue;
+ if (element.status == null) {
+ continue;
+ }
- final isPending = element.status == FamilyFileEnum.pending.toInt;
+ final isPending = element.status == FamilyFileEnum.pending.toInt || element.status == FamilyFileEnum.rejected.toInt;
final isActive = element.status == FamilyFileEnum.active.toInt;
- if (!isPending && !isActive) continue;
+ print("====== Element Status: ${element.status}, isPending: $isPending, isActive: $isActive ============");
+
+ if (!isPending && !isActive) {
+ continue;
+ }
final familyFile = FamilyFileResponseModelLists(
+ id: element.id,
patientId: element.patientId,
patientName: element.patientName!,
- isActive: isActive,
+ isActive: element.isActive,
gender: element.gender!,
- responseId: element.patientId,
+ responseId: element.responseId,
mobileNumber: element.mobileNumber,
age: element.age,
patientIdenficationNumber: element.patientIdenficationNumber,
@@ -431,14 +334,22 @@ class MedicalFileViewModel extends ChangeNotifier {
);
if (isPending) {
- tempPendingFamilyFiles.add(familyFile);
- } else if (isActive) {
+ familyFile.isRequestFromMySide = true;
+ pendingFamilyFiles.add(familyFile);
+ }
+ if (isActive) {
activeFamilyFiles.add(familyFile);
}
}
- patientFamilyFiles.addAll(activeFamilyFiles.where((element) => patientFamilyFiles.every((e) => e.patientId != element.patientId || e.status != FamilyFileEnum.active.toInt)));
- pendingFamilyFiles.addAll(tempPendingFamilyFiles.where((element) => pendingFamilyFiles.every((e) => e.patientId != element.patientId)));
+ for (var activeFile in activeFamilyFiles) {
+ if (!patientFamilyFiles.any((e) => e.responseId == activeFile.responseId)) {
+ patientFamilyFiles.add(activeFile);
+ }
+ }
+
+ this.pendingFamilyFiles.clear();
+ this.pendingFamilyFiles.addAll(pendingFamilyFiles);
}
notifyListeners();
@@ -463,11 +374,12 @@ class MedicalFileViewModel extends ChangeNotifier {
if (apiResponse.data != null) {
final List tempPendingFamilyFiles = [];
for (var element in apiResponse.data!) {
- if (element.status != null && element.status == FamilyFileEnum.pending.toInt) {
+ if (element.status != null && element.status == FamilyFileEnum.pending.toInt || element.status == FamilyFileEnum.active.toInt) {
tempPendingFamilyFiles.add(FamilyFileResponseModelLists(
+ id: element.id,
patientId: element.patientId,
patientName: element.patientName!,
- isActive: element.status == FamilyFileEnum.active.toInt ? true : false,
+ isActive: element.status,
gender: element.gender,
responseId: element.patientId,
mobileNumber: element.mobileNumber,
@@ -488,7 +400,11 @@ class MedicalFileViewModel extends ChangeNotifier {
emaiLAddress: element.emaiLAddress));
}
}
+ // pendingFamilyFiles.addAll(tempPendingFamilyFiles.where((element) => !pendingFamilyFiles.any((e) => e.responseId == element.responseId)));
pendingFamilyFiles.addAll(tempPendingFamilyFiles.where((element) => !pendingFamilyFiles.any((e) => e.patientId == element.patientId)));
+
+ print("====== Pending Family Length: ${pendingFamilyFiles.length} ============");
+ print("====== Pending Family Files: ${jsonEncode(pendingFamilyFiles)} ============");
}
notifyListeners();
}
@@ -496,42 +412,6 @@ class MedicalFileViewModel extends ChangeNotifier {
);
}
- // Future switchFamilyFiles({Function(dynamic)? onSuccess, Function(String)? onError}) async {
- // // final result = await medicalFileRepo.getPatientFamilyFiles();
- // final result = await medicalFileRepo.getPatientFamilyFiles(3, _appState.superUserID != null ? _appState.superUserID! : _appState.getAuthenticatedUser()!.patientId!);
- //
- // result.fold(
- // (failure) async => await errorHandlerService.handleError(
- // failure: failure,
- // onOkPressed: () {
- // onError!(failure.message);
- // },
- // ),
- // (apiResponse) {
- // if (apiResponse.messageStatus == 2) {
- // _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {});
- // } else if (apiResponse.messageStatus == 1) {
- // patientFamilyFiles = apiResponse.data!;
- // patientFamilyFiles.insert(
- // 0,
- // FamilyFileResponseModelLists(
- // patientId: _appState.getAuthenticatedUser()!.patientId,
- // patientName: '${_appState.getAuthenticatedUser()!.firstName!} ${_appState.getAuthenticatedUser()!.lastName!}',
- // isActive: true,
- // gender: _appState.getAuthenticatedUser()!.gender!,
- // age: _appState.getAuthenticatedUser()!.age,
- // mobileNumber: _appState.getAuthenticatedUser()!.mobileNumber,
- // responseId: _appState.getAuthenticatedUser()!.patientId),
- // );
- // notifyListeners();
- // if (onSuccess != null) {
- // onSuccess(apiResponse);
- // }
- // }
- // },
- // );
- // }
-
Future switchFamilyFiles({Function(dynamic)? onSuccess, int? responseID, int? patientID, String? phoneNumber, Function(String)? onError}) async {
authVM.phoneNumberController.text = phoneNumber!.startsWith("0") ? phoneNumber.replaceFirst("0", "") : phoneNumber;
@@ -555,34 +435,107 @@ class MedicalFileViewModel extends ChangeNotifier {
final resultEither = await medicalFileRepo.addFamilyFile(request: request.toJson());
resultEither.fold((failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) async {
- if (apiResponse != null && apiResponse.data != null) {
- request.isPatientExcluded = apiResponse.data["IsPatientExcluded"];
- request.responseID = apiResponse.data["ReponseID"];
+ if (apiResponse.messageStatus == 2) {
LoaderBottomSheet.hideLoader();
- _dialogService.showExceptionBottomSheet(
- message: apiResponse.data['Message'],
+ _dialogService.showErrorBottomSheet(
+ message: apiResponse.errorMessage!,
onOkPressed: () {
- LoaderBottomSheet.showLoader();
- authVM.sendActivationCode(
- otpTypeEnum: otpTypeEnum,
- nationalIdOrFileNumber: request.sharedPatientIdentificationId!,
- phoneNumber: request.sharedPatientMobileNumber!,
- isForRegister: false,
- isExcludedUser: apiResponse.data['IsPatientExcluded'],
- responseID: apiResponse.data["ReponseID"],
- isFormFamilyFile: true);
- },
- onCancelPressed: () {
navigationService.pop();
});
+ } else if (apiResponse.messageStatus == 1) {
+ if (apiResponse.data != null) {
+ request.isPatientExcluded = apiResponse.data["IsPatientExcluded"];
+ request.responseID = apiResponse.data["ReponseID"];
+ LoaderBottomSheet.hideLoader();
+ _dialogService.showExceptionBottomSheet(
+ message: apiResponse.data["Message"],
+ onOkPressed: () {
+ LoaderBottomSheet.showLoader();
+ authVM.sendActivationCode(
+ otpTypeEnum: otpTypeEnum,
+ nationalIdOrFileNumber: request.sharedPatientIdentificationId!,
+ phoneNumber: request.sharedPatientMobileNumber!,
+ isForRegister: false,
+ isExcludedUser: apiResponse.data['IsPatientExcluded'],
+ responseID: apiResponse.data["ReponseID"],
+ isFormFamilyFile: true);
+ },
+ onCancelPressed: () {
+ navigationService.pop();
+ });
+ }
}
});
}
Future handleFamilyFileRequestOTPVerification() async {
LoaderBottomSheet.showLoader();
- await getFamilyFiles();
- await getAllPendingRecordsByResponseId();
+ if (!_appState.getIsChildLoggedIn) {
+ await getFamilyFiles(status: 0);
+ await getAllPendingRecordsByResponseId();
+ }
+
LoaderBottomSheet.hideLoader();
}
+
+ Future removeFileFromFamilyMembers({int? id}) async {
+ NavigationService navigationService = getIt.get();
+ _dialogService.showExceptionBottomSheet(
+ message: "Remove this member?",
+ onOkPressed: () async {
+ LoaderBottomSheet.showLoader();
+ final result = await medicalFileRepo.removeFamilyFile(id: id);
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ LoaderBottomSheet.hideLoader();
+ _dialogService.showErrorBottomSheet(
+ message: apiResponse.errorMessage!,
+ onOkPressed: () {
+ navigationService.pop();
+ });
+ } else if (apiResponse.messageStatus == 1) {
+ patientFamilyFiles.removeWhere((element) => element.id == id);
+ LoaderBottomSheet.hideLoader();
+ notifyListeners();
+ navigationService.pop();
+ }
+ },
+ );
+ },
+ onCancelPressed: () {
+ navigationService.pop();
+ });
+ }
+
+ Future acceptRejectFileFromFamilyMembers({int? id, int? status}) async {
+ NavigationService navigationService = getIt.get();
+ LoaderBottomSheet.showLoader();
+ final result = await medicalFileRepo.acceptRejectFamilyFile(id: id, status: status);
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ LoaderBottomSheet.hideLoader();
+ _dialogService.showErrorBottomSheet(
+ message: apiResponse.errorMessage!,
+ onOkPressed: () {
+ navigationService.pop();
+ });
+ } else if (apiResponse.messageStatus == 1) {
+ // FamilyFileResponseModelLists moveProfile = pendingFamilyFiles.firstWhere((element) => element.id == patientID);
+ // moveProfile.status = 3;
+ // moveProfile.statusDescription = "Approved";
+ // patientFamilyFiles.add(moveProfile);
+ pendingFamilyFiles.removeWhere((element) => element.id == id);
+ //TODO: Call Api Here To Load Family Members
+ getFamilyFiles(status: 0);
+ getAllPendingRecordsByResponseId();
+ LoaderBottomSheet.hideLoader();
+ onFamilyFileTabChange(0);
+ }
+ },
+ );
+ }
}
diff --git a/lib/features/medical_file/models/family_file_response_model.dart b/lib/features/medical_file/models/family_file_response_model.dart
index 82fe3d8..f4aa557 100644
--- a/lib/features/medical_file/models/family_file_response_model.dart
+++ b/lib/features/medical_file/models/family_file_response_model.dart
@@ -23,83 +23,90 @@ class FamilyFileResponseModelLists {
String? patientIdenficationNumber;
String? patientName;
String? statusDescription;
+ bool? isSuperUser = false;
+ bool? isRequestFromMySide;
- FamilyFileResponseModelLists({
- this.id,
- this.patientId,
- this.responseId,
- this.relationshipId,
- this.relationship,
- this.relationshipN,
- this.regionId,
- this.familyRegionId,
- this.status,
- this.isActive,
- this.editedOn,
- this.createdOn,
- this.age,
- this.emaiLAddress,
- this.gender,
- this.genderDescription,
- this.genderImage,
- this.mobileNumber,
- this.patientDataVerified,
- this.patientIdenficationNumber,
- this.patientName,
- this.statusDescription,
- });
+ FamilyFileResponseModelLists(
+ {this.id,
+ this.patientId,
+ this.responseId,
+ this.relationshipId,
+ this.relationship,
+ this.relationshipN,
+ this.regionId,
+ this.familyRegionId,
+ this.status,
+ this.isActive,
+ this.editedOn,
+ this.createdOn,
+ this.age,
+ this.emaiLAddress,
+ this.gender,
+ this.genderDescription,
+ this.genderImage,
+ this.mobileNumber,
+ this.patientDataVerified,
+ this.patientIdenficationNumber,
+ this.patientName,
+ this.statusDescription,
+ this.isSuperUser,
+ this.isRequestFromMySide});
factory FamilyFileResponseModelLists.fromRawJson(String str) => FamilyFileResponseModelLists.fromJson(json.decode(str));
String toRawJson() => json.encode(toJson());
factory FamilyFileResponseModelLists.fromJson(Map json) => FamilyFileResponseModelLists(
- id: json["ID"],
- patientId: json["PatientID"],
- responseId: json["ResponseID"],
- relationshipId: json["RelationshipID"],
- relationship: json["Relationship"],
- relationshipN: json["RelationshipN"],
- regionId: json["RegionID"],
- familyRegionId: json["FamilyRegionID"],
- status: json["Status"],
- isActive: json["IsActive"],
- editedOn: json["EditedOn"],
- createdOn: json["CreatedOn"],
- age: json["Age"],
- emaiLAddress: json["EmaiLAddress"],
- gender: json["Gender"],
- genderDescription: json["GenderDescription"],
- genderImage: json["GenderImage"],
- mobileNumber: json["MobileNumber"],
- patientDataVerified: json["PatientDataVerified"],
- patientIdenficationNumber: json["PatientIdenficationNumber"],
- patientName: json["PatientName"],
- statusDescription: json["StatusDescription"],
- );
+ id: json["ID"],
+ patientId: json["PatientID"],
+ responseId: json["ResponseID"],
+ relationshipId: json["RelationshipID"],
+ relationship: json["Relationship"],
+ relationshipN: json["RelationshipN"],
+ regionId: json["RegionID"],
+ familyRegionId: json["FamilyRegionID"],
+ status: json["Status"],
+ isActive: json["IsActive"],
+ editedOn: json["EditedOn"],
+ createdOn: json["CreatedOn"],
+ age: json["Age"],
+ emaiLAddress: json["EmaiLAddress"],
+ gender: json["Gender"],
+ genderDescription: json["GenderDescription"],
+ genderImage: json["GenderImage"],
+ mobileNumber: json["MobileNumber"],
+ patientDataVerified: json["PatientDataVerified"],
+ patientIdenficationNumber: json["PatientIdenficationNumber"],
+ patientName: json["PatientName"],
+ statusDescription: json["StatusDescription"],
+ isSuperUser: json["isSuperUser"] ?? false,
+ isRequestFromMySide: json["isRequestFromMySide"] ?? false,
+ );
Map toJson() => {
- "ID": id,
- "PatientID": patientId,
- "ResponseID": responseId,
- "RelationshipID": relationshipId,
- "Relationship": relationship,
- "RelationshipN": relationshipN,
- "RegionID": regionId,
- "FamilyRegionID": familyRegionId,
- "Status": status,
- "IsActive": isActive,
- "EditedOn": editedOn,
- "CreatedOn": createdOn,
- "Age": age,
- "EmaiLAddress": emaiLAddress,
- "Gender": gender,
- "GenderDescription": genderDescription,
- "GenderImage": genderImage,
- "MobileNumber": mobileNumber,
- "PatientDataVerified": patientDataVerified,
- "PatientIdenficationNumber": patientIdenficationNumber,
- "PatientName": patientName,
- "StatusDescription": statusDescription,
- };
+ "ID": id,
+ "PatientID": patientId,
+ "ResponseID": responseId,
+ "RelationshipID": relationshipId,
+ "Relationship": relationship,
+ "RelationshipN": relationshipN,
+ "RegionID": regionId,
+ "FamilyRegionID": familyRegionId,
+ "Status": status,
+ "IsActive": isActive,
+ "EditedOn": editedOn,
+ "CreatedOn": createdOn,
+ "Age": age,
+ "EmaiLAddress": emaiLAddress,
+ "Gender": gender,
+ "GenderDescription": genderDescription,
+ "GenderImage": genderImage,
+ "MobileNumber": mobileNumber,
+ "PatientDataVerified": patientDataVerified,
+ "PatientIdenficationNumber": patientIdenficationNumber,
+ "PatientName": patientName,
+ "StatusDescription": statusDescription,
+ "isSuperUser": isSuperUser,
+ "isRequestFromMySide": isRequestFromMySide,
+ };
}
diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart
index cb2f76f..da19747 100644
--- a/lib/presentation/home/landing_page.dart
+++ b/lib/presentation/home/landing_page.dart
@@ -16,6 +16,7 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart';
import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart';
@@ -81,6 +82,7 @@ class _LandingPageState extends State {
myAppointmentsViewModel.getPatientAppointments(true, false);
myAppointmentsViewModel.getPatientMyDoctors();
prescriptionsViewModel.initPrescriptionsViewModel();
+
}
});
super.initState();
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 4b5259f..b87d657 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -29,6 +29,7 @@ import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointme
import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart';
import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart';
import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart';
+import 'package:hmg_patient_app_new/services/dialog_service.dart';
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/presentation/medical_file/medical_reports_page.dart';
import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart';
@@ -80,7 +81,7 @@ class _MedicalFilePageState extends State {
medicalFileViewModel.setIsPatientSickLeaveListLoading(true);
medicalFileViewModel.getPatientSickLeaveList();
if (appState.getSuperUserID == null) {
- medicalFileViewModel.getFamilyFiles(status: 3); //TODO: Remove status: 1 by Aamir Need to Discuss With Sultan
+ medicalFileViewModel.getFamilyFiles(status: 0); //TODO: Remove status: 1 by Aamir Need to Discuss With Sultan
medicalFileViewModel.getAllPendingRecordsByResponseId(); //TODO: Added By Aamir
}
@@ -97,121 +98,139 @@ class _MedicalFilePageState extends State {
medicalFileViewModel = Provider.of(context, listen: false);
bookAppointmentsViewModel = Provider.of(context, listen: false);
NavigationService navigationService = getIt.get();
- return Scaffold(
- backgroundColor: AppColors.bgScaffoldColor,
- body: CollapsingListView(
- title: LocaleKeys.medicalFile.tr(context: context),
- isLeading: false,
- child: SingleChildScrollView(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- SizedBox(height: 16.h),
- TextInputWidget(
- labelText: LocaleKeys.search.tr(context: context),
- hintText: "Type any record",
- controller: TextEditingController(),
- keyboardType: TextInputType.number,
- isEnable: true,
- prefix: null,
- autoFocus: false,
- isBorderAllowed: false,
- isAllowLeadingIcon: true,
- padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h),
- leadingIcon: AppAssets.student_card,
- ).paddingSymmetrical(24.h, 0.0),
- SizedBox(height: 16.h),
- Container(
- width: double.infinity,
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
- child: Padding(
- padding: EdgeInsets.all(16.h),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h),
- SizedBox(width: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText18(isBold: true),
- SizedBox(height: 4.h),
- Wrap(
- direction: Axis.horizontal,
- spacing: 4.h,
- runSpacing: 4.h,
- children: [
- AppCustomChipWidget(
- icon: AppAssets.file_icon,
- labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}",
- onChipTap: () {
- navigationService.pushPage(
- page: FamilyMedicalScreen(
- profiles: medicalFileViewModel.patientFamilyFiles,
- onSelect: (FamilyFileResponseModelLists p1) {},
- ));
- },
- ),
- AppCustomChipWidget(
- icon: AppAssets.checkmark_icon,
- labelText: LocaleKeys.verified.tr(context: context),
- iconColor: AppColors.successColor,
- ),
- ],
- ),
- ],
- )
- ],
- ),
- SizedBox(height: 16.h),
- Divider(color: AppColors.dividerColor, height: 1.h),
- SizedBox(height: 16.h),
- Wrap(
- direction: Axis.horizontal,
- spacing: 4.h,
- runSpacing: 4.h,
- children: [
- AppCustomChipWidget(
- labelText: "${appState.getAuthenticatedUser()!.age} Years Old",
- ),
- AppCustomChipWidget(
- icon: AppAssets.blood_icon,
- labelText: "${LocaleKeys.bloodType.tr(context: context)}: ${appState.getUserBloodGroup}",
- iconColor: AppColors.primaryRedColor,
- ),
- ],
- ),
- ],
- ),
- ),
- ).paddingSymmetrical(24.h, 0.0),
- SizedBox(height: 16.h),
- Consumer(builder: (context, medicalFileVM, child) {
- return Column(
+ return CollapsingListView(
+ title: "Medical File".needTranslation,
+ trailing: Row(
+ children: [
+ Wrap(spacing: -15, children: [
+ Utils.buildImgWithAssets(icon: AppAssets.babyGirlImg, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h),
+ Utils.buildImgWithAssets(icon: AppAssets.femaleImg, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h),
+ Utils.buildImgWithAssets(icon: AppAssets.male_img, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h),
+ ]),
+ SizedBox(width: 4.h),
+ Utils.buildSvgWithAssets(icon: AppAssets.arrow_down)
+ ],
+ ).onPress(() {
+ DialogService dialogService = getIt.get();
+ dialogService.showFamilyBottomSheetWithoutH(
+ label: "Who do you want to book for?".needTranslation,
+ message: "This clinic or doctor is only available for the below eligible profiles.".needTranslation,
+ onSwitchPress: (FamilyFileResponseModelLists profile) {
+ medicalFileViewModel.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber);
+ },
+ profiles: medicalFileViewModel.patientFamilyFiles);
+ }),
+ isLeading: false,
+ child: SingleChildScrollView(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(height: 16.h),
+ TextInputWidget(
+ labelText: LocaleKeys.search.tr(context: context),
+ hintText: "Type any record".needTranslation,
+ controller: TextEditingController(),
+ keyboardType: TextInputType.number,
+ isEnable: true,
+ prefix: null,
+ autoFocus: false,
+ isBorderAllowed: false,
+ isAllowLeadingIcon: true,
+ padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h),
+ leadingIcon: AppAssets.student_card,
+ ).paddingSymmetrical(24.h, 0.0),
+ SizedBox(height: 16.h),
+ Container(
+ width: double.infinity,
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
+ child: Padding(
+ padding: EdgeInsets.all(16.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
- CustomTabBar(
- activeTextColor: Color(0xffED1C2B),
- activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
- tabs: [
- CustomTabBarModel(AppAssets.myFilesBottom, LocaleKeys.general.tr(context: context).needTranslation),
- CustomTabBarModel(AppAssets.insurance, LocaleKeys.insurance.tr(context: context)),
- CustomTabBarModel(AppAssets.requests, LocaleKeys.request.tr(context: context).needTranslation),
- CustomTabBarModel(AppAssets.more, "More".needTranslation),
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h),
+ SizedBox(width: 8.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}"
+ .toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1),
+ SizedBox(height: 4.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 4.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(
+ icon: AppAssets.file_icon,
+ labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}",
+ onChipTap: () {
+ navigationService.pushPage(
+ page: FamilyMedicalScreen(
+ profiles: medicalFileViewModel.patientFamilyFiles,
+ onSelect: (FamilyFileResponseModelLists p1) {},
+ ));
+ },
+ ),
+ AppCustomChipWidget(
+ icon: AppAssets.checkmark_icon,
+ labelText: LocaleKeys.verified.tr(context: context),
+ iconColor: AppColors.successColor,
+ ),
+ ],
+ ),
+ ],
+ )
+ ],
+ ),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.dividerColor, height: 1.h),
+ SizedBox(height: 16.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 4.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(
+ labelText: "${appState.getAuthenticatedUser()!.age} Years Old",
+ ),
+ AppCustomChipWidget(
+ icon: AppAssets.blood_icon,
+ labelText: "${LocaleKeys.bloodType.tr(context: context)}: ${appState.getUserBloodGroup}",
+ iconColor: AppColors.primaryRedColor,
+ ),
],
- onTabChange: (index) {
- medicalFileVM.onTabChanged(index);
- },
- ).paddingSymmetrical(24.h, 0.0),
- SizedBox(height: 24.h),
- getSelectedTabData(medicalFileVM.selectedTabIndex),
+ ),
],
- );
- }),
- ],
- ),
+ ),
+ ),
+ ).paddingSymmetrical(24.h, 0.0),
+ SizedBox(height: 16.h),
+ Consumer(builder: (context, medicalFileVM, child) {
+ return Column(
+ children: [
+ CustomTabBar(
+ activeTextColor: Color(0xffED1C2B),
+ activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
+ tabs: [
+ CustomTabBarModel(AppAssets.myFilesBottom, LocaleKeys.general.tr(context: context).needTranslation),
+ CustomTabBarModel(AppAssets.insurance, LocaleKeys.insurance.tr(context: context)),
+ CustomTabBarModel(AppAssets.requests, LocaleKeys.request.tr(context: context).needTranslation),
+ CustomTabBarModel(AppAssets.more, "More".needTranslation),
+ ],
+ onTabChange: (index) {
+ medicalFileVM.onTabChanged(index);
+ },
+ ).paddingSymmetrical(24.h, 0.0),
+ SizedBox(height: 24.h),
+ getSelectedTabData(medicalFileVM.selectedTabIndex),
+ ],
+ );
+ }),
+ ],
),
),
);
@@ -576,28 +595,28 @@ class _MedicalFilePageState extends State {
horizontalOffset: 100.0,
child: FadeInAnimation(
child: SizedBox(
- width: 80.h,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Image.network(
- myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!,
- width: 64.h,
- height: 64.h,
- fit: BoxFit.fill,
- ).circle(100).toShimmer2(isShow: false, radius: 50.h),
- SizedBox(height: 8.h),
- Expanded(
- child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName)
- .toString()
- .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
- .toShimmer2(isShow: false),
+ width: 80.h,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Image.network(
+ myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!,
+ width: 64.h,
+ height: 64.h,
+ fit: BoxFit.fill,
+ ).circle(100).toShimmer2(isShow: false, radius: 50.h),
+ SizedBox(height: 8.h),
+ Expanded(
+ child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName)
+ .toString()
+ .toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2)
+ .toShimmer2(isShow: false),
+ ),
+ ],
),
- ],
+ ),
),
),
- ),
- ),
)
: Utils.getNoDataWidget(context, noDataText: "You don't have any completed visits yet.".needTranslation, isSmallWidget: true, width: 62, height: 62)
.paddingSymmetrical(24.h, 0.h);
diff --git a/lib/presentation/my_family/my_family.dart b/lib/presentation/my_family/my_family.dart
index a2bcfaa..7de92f4 100644
--- a/lib/presentation/my_family/my_family.dart
+++ b/lib/presentation/my_family/my_family.dart
@@ -1,7 +1,10 @@
+import 'dart:convert';
+
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_assets.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/dependencies.dart';
import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/validation_utils.dart';
@@ -11,10 +14,10 @@ import 'package:hmg_patient_app_new/features/authentication/authentication_view_
import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
-import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart';
+import 'package:hmg_patient_app_new/services/dialog_service.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
-import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart';
+import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart';
@@ -48,100 +51,75 @@ class _FamilyMedicalScreenState extends State {
@override
Widget build(BuildContext context) {
- return Scaffold(
- body: CollapsingListView(
- title: "My Medical File".needTranslation,
- child: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- CustomTabBar(
- tabs: tabs,
- onTabChange: (index) {
- medicalVM!.onFamilyFileTabChange(index);
- },
+ AppState appState = getIt.get();
+ return CollapsingListView(
+ title: "My Medical File".needTranslation,
+ bottomChild: appState.getAuthenticatedUser()!.isParentUser!
+ ? Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)),
),
- SizedBox(height: 25.h),
- Consumer(builder: (context, medicalVM, child) => getFamilyTabs(index: medicalVM.getSelectedFamilyFileTabIndex)),
- SizedBox(height: 20.h),
- ],
- ).paddingSymmetrical(20, 0)),
- bottomSheet: Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)),
+ padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.h),
+ child: CustomButton(
+ text: "Add a new family member".needTranslation,
+ onPressed: () {
+ DialogService dialogService = getIt.get();
+ dialogService.showAddFamilyFileSheet(
+ label: "Add Family Member".needTranslation,
+ message: "Please fill the below field to add a new family member to your profile".needTranslation,
+ onVerificationPress: () {
+ medicalVM?.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true);
+ });
+ },
+ icon: AppAssets.add_icon,
+ height: 56.h,
+ fontWeight: FontWeight.w600))
+ : SizedBox(),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ CustomTabBar(
+ tabs: tabs,
+ onTabChange: (index) {
+ medicalVM!.onFamilyFileTabChange(index);
+ },
),
- padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.h),
- child: CustomButton(
- text: "Add a new family member",
- onPressed: () {
- showModelSheet();
- },
- icon: AppAssets.add_icon,
- height: 56.h,
- fontWeight: FontWeight.w600)),
+ SizedBox(height: 25.h),
+ Consumer(builder: (context, medicalVM, child) => getFamilyTabs(index: medicalVM.getSelectedFamilyFileTabIndex)),
+ SizedBox(height: 20.h),
+ ],
+ ).paddingSymmetrical(20, 0),
);
- // return Scaffold(
- // backgroundColor: AppColors.scaffoldBgColor,
- // appBar: CustomAppBar(
- // onBackPressed: () {
- // Navigator.of(context).pop();
- // },
- // onLanguageChanged: (lang) {},
- // hideLogoAndLang: true,
- // ),
- // body: SingleChildScrollView(
- // child: Column(
- // mainAxisSize: MainAxisSize.min,
- // crossAxisAlignment: CrossAxisAlignment.start,
- // children: [
- // LocaleKeys.myMedicalFile.tr().toText26(color: AppColors.textColor, weight: FontWeight.w600, letterSpacing: -2),
- // SizedBox(height: 25.h),
- // CustomTabBar(
- // tabs: tabs,
- // onTabChange: (index) {
- // medicalVM!.onFamilyFileTabChange(index);
- // },
- // ),
- // SizedBox(height: 25.h),
- // Consumer(builder: (context, medicalVM, child) => getFamilyTabs(index: medicalVM.getSelectedFamilyFileTabIndex)),
- // SizedBox(height: 20.h),
- // ],
- // ).paddingSymmetrical(20, 0),
- // ),
- // bottomSheet: Container(
- // decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- // color: AppColors.whiteColor,
- // customBorder: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24)),
- // ),
- // padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 20.h),
- // child: CustomButton(
- // text: "Add a new family member",
- // onPressed: () {
- // showModelSheet();
- // },
- // icon: AppAssets.add_icon,
- // height: 56.h,
- // fontWeight: FontWeight.w600,
- // )),
- // );
}
Widget getFamilyTabs({required int index}) {
switch (index) {
case 0:
+ print(jsonEncode(medicalVM!.patientFamilyFiles));
return FamilyCards(
profiles: medicalVM!.patientFamilyFiles,
onSelect: (FamilyFileResponseModelLists profile) {
medicalVM!.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber);
},
+ onRemove: (FamilyFileResponseModelLists profile) {
+ medicalVM!.removeFileFromFamilyMembers(id: profile.id);
+ },
+ isLeftAligned: true,
isShowDetails: true,
+ isShowRemoveButton: true,
);
case 1:
+ print(jsonEncode(medicalVM!.pendingFamilyFiles));
return FamilyCards(
profiles: medicalVM!.pendingFamilyFiles,
+ isRequestDesign: true,
onSelect: (FamilyFileResponseModelLists profile) {
- // medicalVM!.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber);
+ medicalVM!.acceptRejectFileFromFamilyMembers(id: profile.id, status: 3);
+ },
+ onRemove: (FamilyFileResponseModelLists profile) {
+ medicalVM!.acceptRejectFileFromFamilyMembers(id: profile.id, status: 4);
},
isShowDetails: true,
);
@@ -149,85 +127,4 @@ class _FamilyMedicalScreenState extends State {
return SizedBox.shrink();
}
}
-
- Future showModelSheet() async {
- AuthenticationViewModel authVm = getIt.get();
- return await showCommonBottomSheetWithoutHeight(context,
- title: "Add Family Member",
- useSafeArea: true,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisAlignment: MainAxisAlignment.start,
- mainAxisSize: MainAxisSize.min,
- children: [
- "Please fill the below field to add a new family member to your profile".toText16(color: AppColors.textColor, weight: FontWeight.w500),
- SizedBox(height: 20.h),
- Container(
- decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)),
- padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h),
- child: Column(
- children: [
- CustomCountryDropdown(
- countryList: CountryEnum.values,
- onCountryChange: authVm.onCountryChange,
- ).paddingOnly(top: 8.h, bottom: 16.h),
- Divider(height: 1.h, color: AppColors.spacerLineColor),
- TextInputWidget(
- labelText: LocaleKeys.nationalIdNumber.tr(),
- hintText: "xxxxxxxxx",
- controller: authVm.nationalIdController,
- // focusNode: _nationalIdFocusNode,
- isEnable: true,
- prefix: null,
- isAllowRadius: true,
- isBorderAllowed: false,
- isAllowLeadingIcon: true,
- autoFocus: true,
- keyboardType: TextInputType.number,
- padding: EdgeInsets.symmetric(vertical: 8.h),
- leadingIcon: AppAssets.student_card,
- ).paddingOnly(top: 8.h, bottom: 8.h),
- Divider(height: 1.h, color: AppColors.spacerLineColor),
- TextInputWidget(
- labelText: LocaleKeys.phoneNumber.tr(),
- hintText: "",
- controller: authVm.phoneNumberController,
- isEnable: true,
- prefix: authVm.selectedCountrySignup.countryCode,
- isAllowRadius: true,
- isBorderAllowed: false,
- isAllowLeadingIcon: true,
- autoFocus: true,
- keyboardType: TextInputType.number,
- padding: EdgeInsets.symmetric(vertical: 8.h),
- leadingIcon: AppAssets.smart_phone,
- ).paddingOnly(top: 8.h, bottom: 4.h),
- ],
- ),
- ),
- SizedBox(height: 20.h),
- CustomButton(
- text: "Verify the member",
- onPressed: () {
- FocusScope.of(context).unfocus();
- if (ValidationUtils.isValidatedIdAndPhoneWithCountryValidation(
- nationalId: authVm.nationalIdController.text,
- selectedCountry: authVm.selectedCountrySignup,
- phoneNumber: authVm.phoneNumberController.text,
- onOkPress: () {
- Navigator.of(context).pop();
- },
- )) {
- // authVm.addFamilyMember(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true);
- medicalVM?.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true);
- }
- },
- icon: AppAssets.add_icon,
- height: 56.h,
- fontWeight: FontWeight.w600),
- SizedBox(height: 20.h),
- ],
- ),
- callBackFunc: () {});
- }
}
diff --git a/lib/presentation/my_family/widget/family_cards.dart b/lib/presentation/my_family/widget/family_cards.dart
index 3916756..166b06d 100644
--- a/lib/presentation/my_family/widget/family_cards.dart
+++ b/lib/presentation/my_family/widget/family_cards.dart
@@ -17,10 +17,23 @@ import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart';
class FamilyCards extends StatefulWidget {
final List profiles;
final Function(FamilyFileResponseModelLists) onSelect;
+ final Function(FamilyFileResponseModelLists) onRemove;
final bool isShowDetails;
final bool isBottomSheet;
+ final bool isRequestDesign;
+ final bool isLeftAligned;
+ final bool isShowRemoveButton;
- const FamilyCards({super.key, required this.profiles, required this.onSelect, this.isShowDetails = false, this.isBottomSheet = false});
+ const FamilyCards(
+ {super.key,
+ required this.profiles,
+ required this.onSelect,
+ required this.onRemove,
+ this.isShowDetails = false,
+ this.isBottomSheet = false,
+ this.isRequestDesign = false,
+ this.isLeftAligned = false,
+ this.isShowRemoveButton = false});
@override
State createState() => _FamilyCardsState();
@@ -29,91 +42,315 @@ class FamilyCards extends StatefulWidget {
class _FamilyCardsState extends State {
AppState appState = getIt();
+ // bool isShowActions = true;
+
@override
Widget build(BuildContext context) {
- return GridView.builder(
- shrinkWrap: true,
- physics: NeverScrollableScrollPhysics(),
- itemCount: widget.profiles.length,
- gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
- crossAxisCount: 2,
- crossAxisSpacing: 10.h,
- mainAxisSpacing: 10.h,
- childAspectRatio: widget.isShowDetails ? 0.56.h : 0.74.h,
- ),
- padding: EdgeInsets.only(bottom: 80.h),
- itemBuilder: (context, index) {
- final profile = widget.profiles[index];
- final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId);
- return Container(
- padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h),
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
- child: Opacity(
- opacity: isActive || profile.status == FamilyFileEnum.pending.toInt ? 0.4 : 1.0, // Fade all content if active
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- SizedBox(height: 5.h),
- Utils.buildImgWithAssets(
- icon: profile.gender == null
- ? AppAssets.dummy_user
- : profile.gender == 1
- ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.male_img)
- : (profile.age! < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg),
- width: 80.h,
- height: 78.h),
- SizedBox(height: 8.h),
- (profile.patientName ?? "Unknown").toText16(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600),
- SizedBox(height: 4.h),
- CustomChipWidget(
- chipType: ChipTypeEnum.alert,
- backgroundColor: AppColors.lightGrayBGColor,
- chipText: "Relation: ${profile.relationship ?? "N/A"}",
- iconAsset: AppAssets.heart,
- isShowBorder: false,
- borderRadius: 8.h,
- textColor: AppColors.textColor),
- widget.isShowDetails ? SizedBox(height: 4.h) : SizedBox(),
- widget.isShowDetails
- ? CustomChipWidget(
+ if (widget.isRequestDesign) {
+ return Column(
+ children: [
+ Row(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.alertSquare),
+ SizedBox(width: 8.h),
+ "Sent Requests".needTranslation.toText14(color: AppColors.textColor, isUnderLine: true, weight: FontWeight.w500),
+ SizedBox(width: 4.h),
+ Utils.buildSvgWithAssets(icon: AppAssets.arrowRight),
+ ],
+ ),
+ SizedBox(height: 24.h),
+ ListView.builder(
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ padding: EdgeInsets.zero,
+ itemCount: widget.profiles.where((profile) => profile.isRequestFromMySide ?? false).length,
+ itemBuilder: (context, index) {
+ final mySideProfiles = widget.profiles.where((profile) => profile.isRequestFromMySide ?? false).toList();
+ FamilyFileResponseModelLists profile = mySideProfiles[index];
+
+ return Container(
+ margin: EdgeInsets.only(
+ bottom: 12.h,
+ ),
+ padding: EdgeInsets.symmetric(
+ vertical: 15.h,
+ horizontal: 15.h,
+ ),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
+ child: Opacity(
+ opacity: 1.0,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ CustomChipWidget(
+ height: 30.h,
+ chipType: ChipTypeEnum.alert,
+ backgroundColor: profile.status == FamilyFileEnum.pending.toInt
+ ? AppColors.alertLightColor.withValues(alpha: 0.20)
+ : profile.status == FamilyFileEnum.rejected.toInt
+ ? AppColors.primaryRedColor.withValues(alpha: 0.20)
+ : profile.status == FamilyFileEnum.active.toInt
+ ? AppColors.lightGreenColor
+ : AppColors.lightGrayBGColor,
+ chipText: profile.statusDescription ?? "N/A",
+ iconAsset: null,
+ isShowBorder: false,
+ borderRadius: 8.h,
+ textColor: profile.status == FamilyFileEnum.pending.toInt
+ ? AppColors.alertLightColor
+ : profile.status == FamilyFileEnum.rejected.toInt
+ ? AppColors.primaryRedColor
+ : profile.status == FamilyFileEnum.active.toInt
+ ? AppColors.textGreenColor
+ : AppColors.alertColor,
+ ),
+ Wrap(
+ alignment: WrapAlignment.start,
+ children: [
+ (profile.patientName ?? "").toText16(
+ isBold: false,
+ isCenter: true,
+ maxlines: 1,
+ weight: FontWeight.w600,
+ ),
+ ("has ${(profile.statusDescription ?? "").toLowerCase()} your family member request").toText14(
+ isBold: false,
+ isCenter: true,
+ maxlines: 1,
+ weight: FontWeight.w500,
+ color: AppColors.greyTextColor,
+ ),
+ ],
+ ),
+ SizedBox(height: 4.h),
+ CustomChipWidget(
+ height: 30.h,
chipType: ChipTypeEnum.alert,
backgroundColor: AppColors.lightGrayBGColor,
- chipText: "Age: ${profile.age ?? "N/A"} Years",
+ chipText: "Medical File: ${profile.responseId ?? "N/A"}",
+ iconAsset: null,
isShowBorder: false,
borderRadius: 8.h,
textColor: AppColors.textColor,
- )
- : SizedBox(),
- widget.isShowDetails ? SizedBox(height: 8.h) : SizedBox(),
- Spacer(),
- if (isActive)
- CustomButton(
- height: 40.h,
- onPressed: () {},
- text: LocaleKeys.active.tr(),
- backgroundColor: Colors.grey.shade200,
- borderColor: Colors.grey.shade200,
- textColor: AppColors.greyTextColor,
- fontSize: 13.h,
- ).paddingOnly(top: 0, bottom: 0)
- else
- CustomButton(
- height: 40.h,
- onPressed: () => widget.onSelect(profile),
- text: LocaleKeys.switchAccount.tr(),
- backgroundColor: AppColors.secondaryLightRedColor,
- borderColor: AppColors.secondaryLightRedColor,
- textColor: AppColors.primaryRedColor,
- fontSize: 13.h,
- icon: widget.isBottomSheet ? null : AppAssets.switch_user,
- iconColor: AppColors.primaryRedColor,
- padding: EdgeInsets.symmetric(vertical: 0, horizontal: 0),
- ).paddingOnly(top: 0, bottom: 0),
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ ),
+ SizedBox(height: 20.h),
+ if (widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).isNotEmpty)
+ Row(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.alertSquare),
+ SizedBox(width: 8.h),
+ "Users who want to view your profile".needTranslation.toText14(color: AppColors.textColor, isUnderLine: true, weight: FontWeight.w500),
+ SizedBox(width: 4.h),
+ Utils.buildSvgWithAssets(icon: AppAssets.arrowRight),
],
),
+
+ // Items for second group (requests from others)
+ ListView.builder(
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemCount: widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).length,
+ itemBuilder: (context, index) {
+ final otherProfiles = widget.profiles.where((profile) => !(profile.isRequestFromMySide ?? false)).toList();
+ FamilyFileResponseModelLists profile = otherProfiles[index];
+ return Container(
+ margin: EdgeInsets.only(bottom: 12.h),
+ padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
+ child: Opacity(
+ opacity: 1.0,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ CustomChipWidget(
+ height: 30.h,
+ chipType: ChipTypeEnum.alert,
+ backgroundColor: profile.status == FamilyFileEnum.pending.toInt
+ ? AppColors.alertLightColor.withValues(alpha: 0.20)
+ : profile.status == FamilyFileEnum.rejected.toInt
+ ? AppColors.primaryRedColor.withValues(alpha: 0.20)
+ : profile.status == FamilyFileEnum.active.toInt
+ ? AppColors.lightGreenColor
+ : AppColors.lightGrayBGColor,
+ chipText: profile.statusDescription ?? "N/A",
+ iconAsset: null,
+ isShowBorder: false,
+ borderRadius: 8.h,
+ textColor: profile.status == FamilyFileEnum.pending.toInt
+ ? AppColors.alertLightColor
+ : profile.status == FamilyFileEnum.rejected.toInt
+ ? AppColors.primaryRedColor
+ : profile.status == FamilyFileEnum.active.toInt
+ ? AppColors.textGreenColor
+ : AppColors.alertColor,
+ ),
+ Wrap(
+ alignment: WrapAlignment.start,
+ children: [
+ (profile.patientName ?? "").toText16(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600),
+ (profile.status == FamilyFileEnum.active.toInt ? "can view your family".needTranslation : "wants to add you as their family member".needTranslation).toText14(
+ isBold: false,
+ isCenter: true,
+ maxlines: 1,
+ weight: FontWeight.w500,
+ color: AppColors.greyTextColor,
+ ),
+ ],
+ ),
+ SizedBox(height: 4.h),
+ CustomChipWidget(
+ height: 30.h,
+ chipType: ChipTypeEnum.alert,
+ backgroundColor: AppColors.lightGrayBGColor,
+ chipText: "Medical File: ${profile.patientId ?? "N/A".needTranslation}",
+ iconAsset: null,
+ isShowBorder: false,
+ borderRadius: 8.h,
+ textColor: AppColors.textColor,
+ ),
+ SizedBox(height: 16.h),
+ Row(
+ children: [
+ profile.status == FamilyFileEnum.active.toInt
+ ? SizedBox()
+ : Expanded(
+ child: CustomButton(
+ height: 40.h,
+ text: LocaleKeys.confirm.tr(),
+ onPressed: () {
+ widget.onSelect(profile);
+ },
+ backgroundColor: AppColors.lightGreenButtonColor,
+ borderColor: AppColors.lightGreenButtonColor,
+ textColor: AppColors.textGreenColor,
+ icon: null,
+ ),
+ ),
+ profile.status == FamilyFileEnum.active.toInt ? SizedBox() : SizedBox(width: 8.h),
+ Expanded(
+ child: CustomButton(
+ height: 40.h,
+ text: profile.status == FamilyFileEnum.active.toInt ? LocaleKeys.removeMember.tr() : LocaleKeys.cancel.tr(),
+ onPressed: () {
+ widget.onRemove(profile);
+ },
+ backgroundColor: AppColors.secondaryLightRedColor,
+ borderColor: AppColors.secondaryLightRedColor,
+ textColor: AppColors.primaryRedColor,
+ icon: null,
+ iconColor: AppColors.primaryRedColor,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ },
),
- );
- },
- );
+ ],
+ );
+ } else {
+ return GridView.builder(
+ shrinkWrap: true,
+ physics: NeverScrollableScrollPhysics(),
+ itemCount: widget.profiles.length,
+ gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 2,
+ crossAxisSpacing: 10.h,
+ mainAxisSpacing: 10.h,
+ childAspectRatio: widget.isShowDetails ? 0.56.h : 0.66.h,
+ ),
+ padding: EdgeInsets.only(bottom: 20.h),
+ itemBuilder: (context, index) {
+ final profile = widget.profiles[index];
+ final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId);
+ final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+ final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID);
+ return Container(
+ padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.h),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24),
+ child: Opacity(
+ opacity: isActive || profile.status == FamilyFileEnum.pending.toInt || !canSwitch ? 0.4 : 1.0, // Fade all content if active
+ child: Stack(
+ children: [
+ Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Utils.buildImgWithAssets(
+ icon: profile.gender == null
+ ? AppAssets.dummy_user
+ : profile.gender == 1
+ ? ((profile.age ?? 0) < 7 ? AppAssets.babyBoyImg : AppAssets.male_img)
+ : (profile.age! < 7 ? AppAssets.babyGirlImg : AppAssets.femaleImg),
+ width: 80.h,
+ height: 78.h),
+ SizedBox(height: 8.h),
+ (profile.patientName ?? "Unknown").toText16(isBold: false, isCenter: true, maxlines: 1, weight: FontWeight.w600),
+ SizedBox(height: 4.h),
+ CustomChipWidget(
+ chipType: ChipTypeEnum.alert,
+ backgroundColor: AppColors.lightGrayBGColor,
+ chipText: "Relation:${profile.relationship ?? "N/A"}",
+ iconAsset: AppAssets.heart,
+ isShowBorder: false,
+ borderRadius: 8.h,
+ textColor: AppColors.textColor),
+ widget.isShowDetails ? SizedBox(height: 4.h) : SizedBox(),
+ widget.isShowDetails
+ ? CustomChipWidget(
+ chipType: ChipTypeEnum.alert,
+ backgroundColor: AppColors.lightGrayBGColor,
+ chipText: "Age:${profile.age ?? "N/A"} Years",
+ isShowBorder: false,
+ borderRadius: 8.h,
+ textColor: AppColors.textColor,
+ )
+ : SizedBox(),
+ widget.isShowDetails ? SizedBox(height: 8.h) : SizedBox(),
+ Spacer(),
+ CustomButton(
+ height: 40.h,
+ onPressed: () {
+ if (canSwitch) widget.onSelect(profile);
+ },
+ text: isActive ? "Active".needTranslation : "Switch".needTranslation,
+ backgroundColor: isActive || !canSwitch ? Colors.grey.shade200 : AppColors.secondaryLightRedColor,
+ borderColor: isActive || !canSwitch ? Colors.grey.shade200 : AppColors.secondaryLightRedColor,
+ textColor: isActive || !canSwitch ? AppColors.greyTextColor : AppColors.primaryRedColor,
+ fontSize: 13.h,
+ icon: isActive ? AppAssets.activeCheck : AppAssets.switch_user,
+ iconColor: isActive || !canSwitch ? (isActive ? null : AppColors.greyTextColor) : AppColors.primaryRedColor,
+ padding: EdgeInsets.symmetric(vertical: 0, horizontal: 0),
+ ).paddingOnly(top: 0, bottom: 0),
+ ],
+ ),
+ if (widget.isShowRemoveButton) ...[
+ Positioned(
+ top: 0,
+ right: 0,
+ child: Utils.buildSvgWithAssets(icon: AppAssets.deleteIcon).onPress(() {
+ if (!isActive) widget.onRemove(profile);
+ }),
+ ),
+ ],
+ ],
+ ),
+ ),
+ );
+ },
+ );
+ }
}
}
diff --git a/lib/presentation/my_family/widget/my_family_sheet.dart b/lib/presentation/my_family/widget/my_family_sheet.dart
index da822b1..1c085ca 100644
--- a/lib/presentation/my_family/widget/my_family_sheet.dart
+++ b/lib/presentation/my_family/widget/my_family_sheet.dart
@@ -7,7 +7,7 @@ import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
class MyFamilySheet {
static Future show(BuildContext context, List familyLists, Function(FamilyFileResponseModelLists) onSelect) async {
- return await showCommonBottomSheetWithoutHeight(
+ return showCommonBottomSheetWithoutHeight(
context,
titleWidget: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -22,6 +22,7 @@ class MyFamilySheet {
Navigator.of(context).pop(); // Close the bottom sheet
onSelect(profile); // Call the onSelect callback
},
+ onRemove: (profile) {},
isBottomSheet: true),
callBackFunc: () {},
);
diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart
index 58273fc..2afa3e0 100644
--- a/lib/presentation/profile_settings/profile_settings.dart
+++ b/lib/presentation/profile_settings/profile_settings.dart
@@ -1,16 +1,25 @@
+import 'dart:convert';
+import 'dart:developer';
+
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_swiper_view/flutter_swiper_view.dart';
import 'package:hmg_patient_app_new/core/app_assets.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/dependencies.dart';
+import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/int_extensions.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart';
import 'package:hmg_patient_app_new/features/profile_settings/profile_settings_view_model.dart';
import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page.dart';
import 'package:hmg_patient_app_new/presentation/habib_wallet/recharge_wallet_page.dart';
+import 'package:hmg_patient_app_new/services/dialog_service.dart';
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/app_language_change.dart';
@@ -48,6 +57,7 @@ class _ProfileSettingsState extends State {
@override
Widget build(BuildContext context) {
+ final MedicalFileViewModel medicalFileViewModel = getIt.get();
return CollapsingListView(
title: "Profile & Settings".needTranslation,
logout: () {},
@@ -57,11 +67,12 @@ class _ProfileSettingsState extends State {
physics: NeverScrollableScrollPhysics(),
child: Consumer(
builder: (context, model, child) {
+ print(jsonEncode(medicalFileViewModel.patientFamilyFiles));
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Swiper(
- itemCount: length,
+ itemCount: medicalFileViewModel.patientFamilyFiles.length,
layout: SwiperLayout.STACK,
loop: true,
itemWidth: MediaQuery.of(context).size.width - 42,
@@ -75,7 +86,21 @@ class _ProfileSettingsState extends State {
builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor),
),
itemBuilder: (BuildContext context, int index) {
- return FamilyCardWidget().paddingOnly(right: 16);
+ return FamilyCardWidget(
+ profile: medicalFileViewModel.patientFamilyFiles[index],
+ onAddFamilyMemberPress: () {
+ DialogService dialogService = getIt.get();
+ dialogService.showAddFamilyFileSheet(
+ label: "Add Family Member".needTranslation,
+ message: "Please fill the below field to add a new family member to your profile".needTranslation,
+ onVerificationPress: () {
+ medicalFileViewModel.addFamilyFile(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true);
+ });
+ },
+ onFamilySwitchPress: (FamilyFileResponseModelLists profile) {
+ medicalFileViewModel.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber);
+ },
+ ).paddingOnly(right: 16);
},
),
GridView(
@@ -224,16 +249,20 @@ class _ProfileSettingsState extends State {
}
class FamilyCardWidget extends StatelessWidget {
- FamilyCardWidget();
+ final Function() onAddFamilyMemberPress;
+ final Function(FamilyFileResponseModelLists member) onFamilySwitchPress;
+ final FamilyFileResponseModelLists profile;
+
+ const FamilyCardWidget({required this.onAddFamilyMemberPress, required this.profile, required this.onFamilySwitchPress(FamilyFileResponseModelLists member)});
@override
Widget build(BuildContext context) {
+ AppState appState = getIt.get();
+ final isActive = (profile.responseId == appState.getAuthenticatedUser()?.patientId);
+ final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+ final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID);
return Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 20.h,
- hasShadow: true,
- ),
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true),
child: Column(
children: [
Column(
@@ -243,16 +272,16 @@ class FamilyCardWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 8.h,
children: [
- Image.asset(true ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h),
+ Image.asset((profile.gender == 1) ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 0.h,
mainAxisSize: MainAxisSize.min,
children: [
- "Mahmoud Shrouf Shrouf".toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1),
+ (profile.patientName ?? "").toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1),
AppCustomChipWidget(
icon: AppAssets.file_icon,
- labelText: "File no: 3423443",
+ labelText: "File no: ${profile.patientId}",
iconSize: 14,
),
],
@@ -266,11 +295,11 @@ class FamilyCardWidget extends StatelessWidget {
alignment: WrapAlignment.start,
spacing: 8.h,
children: [
- AppCustomChipWidget(labelText: "35 Years Old"),
- AppCustomChipWidget(labelText: "Blood: A+"),
+ AppCustomChipWidget(labelText: "${profile.age} Years Old"),
+ AppCustomChipWidget(labelText: "Blood: N/A"),
AppCustomChipWidget(
icon: AppAssets.insurance_active_icon,
- labelText: "Insurance Active",
+ labelText: "Insurance N/A",
iconColor: AppColors.bgGreenColor,
iconSize: 14,
backgroundColor: AppColors.bgGreenColor.withValues(alpha: 0.15),
@@ -281,9 +310,92 @@ class FamilyCardWidget extends StatelessWidget {
],
).paddingOnly(top: 16, right: 16, left: 16, bottom: 12).expanded,
1.divider,
- CustomButton(icon: AppAssets.add_family, text: "Add a new family member".needTranslation, onPressed: () {}).paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+ _buildActionButton(appState),
+
+ // if (appState.getAuthenticatedUser()!.isParentUser ?? false) ...[
+ // if (member!.responseId != appState.getAuthenticatedUser()!.patientId) ...[
+ // CustomButton(
+ // icon: AppAssets.switch_user,
+ // text: "Switch Family File".needTranslation,
+ // onPressed: () {
+ // onFamilySwitchPress(member!);
+ // },
+ // ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+ // ] else
+ // ...[
+ // CustomButton(
+ // icon: AppAssets.add_family,
+ // text: "Add a new family member".needTranslation,
+ // onPressed: () {
+ // onAddFamilyMemberPress();
+ // },
+ // ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+ // ]
+ // ] else
+ // ...[
+ // if (appState.getSuperUserID != null && appState.getSuperUserID == member!.responseId) ...[
+ // CustomButton(
+ // icon: AppAssets.switch_user,
+ // text: "Switch Back To Family File".needTranslation,
+ // onPressed: () {
+ // onFamilySwitchPress(member!);
+ // },
+ // ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+ // ] else
+ // ...[
+ // CustomButton(
+ // icon: AppAssets.switch_user,
+ // text: "Disabled".needTranslation,
+ // backgroundColor: Colors.grey.shade200,
+ // borderColor: Colors.grey.shade200,
+ // textColor: AppColors.greyTextColor,
+ // onPressed: () {},
+ // iconColor: AppColors.greyTextColor,
+ // ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16),
+ // ]
+ // ]
],
),
);
}
+
+ Widget _buildActionButton(AppState appState) {
+ final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false;
+ final int? currentUserId = appState.getAuthenticatedUser()?.patientId;
+ final int? superUserId = appState.getSuperUserID;
+
+ if (isParentUser) {
+ return _buildParentUserButton(currentUserId);
+ } else {
+ return _buildNonParentUserButton(superUserId);
+ }
+ }
+
+ Widget _buildParentUserButton(int? currentUserId) {
+ final canSwitch = profile.responseId != currentUserId;
+
+ return CustomButton(
+ icon: canSwitch ? AppAssets.switch_user : AppAssets.add_family,
+ text: canSwitch ? "Switch Family File".needTranslation : "Add a new family member".needTranslation,
+ onPressed: canSwitch ? () => onFamilySwitchPress(profile) : onAddFamilyMemberPress,
+ backgroundColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor,
+ borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor,
+ textColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor,
+ iconColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor,
+ ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16);
+ }
+
+ Widget _buildNonParentUserButton(int? superUserId) {
+ final canSwitchBack = superUserId != null && superUserId == profile.responseId;
+
+ return CustomButton(
+ icon: AppAssets.switch_user,
+ text: canSwitchBack ? "Switch Back To Family File".needTranslation : "Switch".needTranslation,
+ backgroundColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200,
+ borderColor: canSwitchBack ? AppColors.primaryRedColor : Colors.grey.shade200,
+ textColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor,
+ iconColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor,
+ onPressed: canSwitchBack ? () => onFamilySwitchPress(profile) : () {},
+ ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16);
+ }
}
diff --git a/lib/services/dialog_service.dart b/lib/services/dialog_service.dart
index 6ee0ddc..4d332b3 100644
--- a/lib/services/dialog_service.dart
+++ b/lib/services/dialog_service.dart
@@ -4,12 +4,15 @@ import 'package:hmg_patient_app_new/core/app_assets.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/features/medical_file/models/family_file_response_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/my_family/widget/family_cards.dart';
import 'package:hmg_patient_app_new/services/navigation_service.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/bottomsheet/exception_bottom_sheet.dart';
import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
+import 'package:hmg_patient_app_new/widgets/family_files/family_file_add_widget.dart';
abstract class DialogService {
Future showErrorBottomSheet({String title = "", required String message, Function()? onOkPressed, Function()? onCancelPressed});
@@ -18,7 +21,12 @@ abstract class DialogService {
Future showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed});
+ Future showFamilyBottomSheetWithoutH(
+ {String? label, required String message, required Function(FamilyFileResponseModelLists response) onSwitchPress, required List profiles});
+
Future showPhoneNumberPickerSheet({String? label, String? message, required Function() onSMSPress, required Function() onWhatsappPress});
+
+ Future showAddFamilyFileSheet({String? label, String? message, required Function() onVerificationPress});
// TODO : Need to be Fixed showPhoneNumberPickerSheet ( From Login ADn Signup Bottom Sheet Move Here
}
@@ -93,6 +101,24 @@ class DialogServiceImp implements DialogService {
title: label ?? "", child: exceptionBottomSheetWidget(context: context, message: message, onOkPressed: onOkPressed, onCancelPressed: onCancelPressed), callBackFunc: () {});
}
+ @override
+ Future showFamilyBottomSheetWithoutH(
+ {String? label, required String message, required Function(FamilyFileResponseModelLists response) onSwitchPress, required List profiles}) async {
+ final context = navigationService.navigatorKey.currentContext;
+ if (context == null) return;
+ showCommonBottomSheetWithoutHeight(context,
+ title: label ?? "",
+ child: FamilyCards(
+ profiles: profiles,
+ onSelect: (FamilyFileResponseModelLists profile) {
+ onSwitchPress(profile);
+ },
+ onRemove: (FamilyFileResponseModelLists profile) {},
+ isShowDetails: false,
+ ),
+ callBackFunc: () {});
+ }
+
@override
Future showPhoneNumberPickerSheet({String? label, String? message, required Function() onSMSPress, required Function() onWhatsappPress}) async {
final context = navigationService.navigatorKey.currentContext;
@@ -100,6 +126,18 @@ class DialogServiceImp implements DialogService {
showCommonBottomSheetWithoutHeight(context,
title: label ?? "", child: showPhoneNumberPickerWidget(context: context, message: message, onSMSPress: onSMSPress, onWhatsappPress: onWhatsappPress), callBackFunc: () {});
}
+
+ @override
+ Future showAddFamilyFileSheet({String? label, String? message, required Function() onVerificationPress}) async {
+ final context = navigationService.navigatorKey.currentContext;
+ if (context == null) return;
+ showCommonBottomSheetWithoutHeight(context,
+ title: label ?? "",
+ child: FamilyFileAddWidget(() {
+ onVerificationPress();
+ }, message ?? ""),
+ callBackFunc: () {});
+ }
}
Widget exceptionBottomSheetWidget({required BuildContext context, required String message, required Function() onOkPressed, Function()? onCancelPressed}) {
@@ -216,3 +254,12 @@ Widget showPhoneNumberPickerWidget({required BuildContext context, String? messa
// );
});
}
+
+// Widget familyMemberAddWidget() {
+// AuthenticationViewModel authVm = getIt.get();
+// return showCommonBottomSheetWithoutHeight(context,
+// title: "Add Family Member".needTranslation,
+// useSafeArea: true,
+// child:
+// callBackFunc: () {});
+// }
diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart
index b18c6ee..60b0f03 100644
--- a/lib/widgets/appbar/collapsing_list_view.dart
+++ b/lib/widgets/appbar/collapsing_list_view.dart
@@ -22,10 +22,11 @@ class CollapsingListView extends StatelessWidget {
VoidCallback? logout;
VoidCallback? history;
Widget? bottomChild;
+ Widget? trailing;
bool isClose;
bool isLeading;
- CollapsingListView({required this.title, this.child, this.search, this.isClose = false, this.bottomChild, this.report, this.logout, this.history, this.isLeading = true});
+ CollapsingListView({required this.title, this.child, this.search, this.isClose = false, this.bottomChild, this.report, this.logout, this.history, this.isLeading = true, this.trailing});
@override
Widget build(BuildContext context) {
@@ -97,7 +98,8 @@ class CollapsingListView extends StatelessWidget {
if (logout != null) actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!),
if (report != null) actionButton(context, t, title: "Report".needTranslation, icon: AppAssets.report_icon).onPress(report!),
if (history != null) actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(history!),
- if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24)
+ if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24),
+ if (trailing != null) trailing!,
],
)),
),
diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart
index 2f8a9ec..b253c36 100644
--- a/lib/widgets/buttons/custom_button.dart
+++ b/lib/widgets/buttons/custom_button.dart
@@ -23,28 +23,30 @@ class CustomButton extends StatelessWidget {
final double? width;
final double iconSize;
final TextOverflow? textOverflow;
+ final BorderSide? borderSide;
- CustomButton({
- Key? key,
- required this.text,
- required this.onPressed,
- this.backgroundColor = const Color(0xFFED1C2B),
- this.borderColor = const Color(0xFFED1C2B),
- this.textColor = Colors.white,
- this.borderRadius = 12,
- this.borderWidth = 2,
- this.padding = const EdgeInsets.fromLTRB(8, 10, 8, 10),
- this.fontSize = 16,
- this.fontFamily,
- this.fontWeight = FontWeight.w500,
- this.isDisabled = false,
- this.icon,
- this.iconColor = Colors.white,
- this.height = 56,
- this.width,
- this.iconSize = 24,
- this.textOverflow,
- }) : super(key: key);
+ CustomButton(
+ {Key? key,
+ required this.text,
+ required this.onPressed,
+ this.backgroundColor = const Color(0xFFED1C2B),
+ this.borderColor = const Color(0xFFED1C2B),
+ this.textColor = Colors.white,
+ this.borderRadius = 12,
+ this.borderWidth = 2,
+ this.padding = const EdgeInsets.fromLTRB(8, 10, 8, 10),
+ this.fontSize = 16,
+ this.fontFamily,
+ this.fontWeight = FontWeight.w500,
+ this.isDisabled = false,
+ this.icon,
+ this.iconColor = Colors.white,
+ this.height = 56,
+ this.width,
+ this.iconSize = 24,
+ this.textOverflow,
+ this.borderSide})
+ : super(key: key);
@override
Widget build(BuildContext context) {
@@ -57,17 +59,15 @@ class CustomButton extends StatelessWidget {
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: isDisabled ? Colors.transparent : backgroundColor,
borderRadius: borderRadius,
- side: BorderSide(
- width: borderWidth.h,
- color: isDisabled ? borderColor.withOpacity(0.5) : borderColor,
- )),
+ customBorder: BorderRadius.circular(borderRadius),
+ side: borderSide ?? BorderSide(width: borderWidth.h, color: isDisabled ? borderColor.withValues(alpha: 0.5) : borderColor)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (icon != null)
Padding(
- padding: const EdgeInsets.only(right: 8.0, left: 8.0),
+ padding: EdgeInsets.only(right: 8.h, left: 8.h),
child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconSize, height: iconSize),
),
Padding(
@@ -85,17 +85,6 @@ class CustomButton extends StatelessWidget {
),
],
),
- )
-
- // .toSmoothContainer(
- // smoothness: 1,
- // side: BorderSide(width: borderWidth, color: backgroundColor),
- // borderRadius: BorderRadius.circular(borderRadius * 1.2),
- // foregroundDecoration: BoxDecoration(
- // color: isDisabled ? backgroundColor.withOpacity(0.5) : Colors.transparent,
- // borderRadius: BorderRadius.circular(borderRadius),
- // ),
- // ),
- );
+ ));
}
}
diff --git a/lib/widgets/chip/custom_chip_widget.dart b/lib/widgets/chip/custom_chip_widget.dart
index 1d0b5ef..5dee4f0 100644
--- a/lib/widgets/chip/custom_chip_widget.dart
+++ b/lib/widgets/chip/custom_chip_widget.dart
@@ -17,6 +17,7 @@ class CustomChipWidget extends StatelessWidget {
final Color? textColor;
final Color? borderColor;
final bool isShowBorder;
+ final double? height;
const CustomChipWidget({
super.key,
@@ -31,6 +32,7 @@ class CustomChipWidget extends StatelessWidget {
this.textColor,
this.borderColor,
this.isShowBorder = false,
+ this.height,
});
@override
@@ -39,6 +41,7 @@ class CustomChipWidget extends StatelessWidget {
final hasOnTap = onTap != null || hasIcon;
return Container(
+ height: height,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(borderRadius),
color: isSelected ? chipType.color : backgroundColor ?? chipType.backgroundColor,
diff --git a/lib/widgets/family_files/family_file_add_widget.dart b/lib/widgets/family_files/family_file_add_widget.dart
new file mode 100644
index 0000000..8e57f91
--- /dev/null
+++ b/lib/widgets/family_files/family_file_add_widget.dart
@@ -0,0 +1,105 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/core/app_assets.dart';
+import 'package:hmg_patient_app_new/core/dependencies.dart';
+import 'package:hmg_patient_app_new/core/enums.dart';
+import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
+import 'package:hmg_patient_app_new/core/utils/validation_utils.dart';
+import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
+import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart';
+import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart';
+import 'package:hmg_patient_app_new/widgets/input_widget.dart';
+
+class FamilyFileAddWidget extends StatelessWidget {
+ final Function()? onVerificationPress;
+ final String message;
+
+ const FamilyFileAddWidget(this.onVerificationPress, this.message, {super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ AuthenticationViewModel authVm = getIt.get();
+ MedicalFileViewModel? medicalVM = getIt.get();
+ // TODO: implement build
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ message.toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ SizedBox(height: 20.h),
+ Container(
+ decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)),
+ padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h),
+ child: Column(
+ children: [
+ CustomCountryDropdown(
+ countryList: CountryEnum.values,
+ onCountryChange: authVm.onCountryChange,
+ ).paddingOnly(top: 8.h, bottom: 16.h),
+ Divider(height: 1.h, color: AppColors.spacerLineColor),
+ TextInputWidget(
+ labelText: LocaleKeys.nationalIdNumber.tr(),
+ hintText: "xxxxxxxxx",
+ controller: authVm.nationalIdController,
+ isEnable: true,
+ prefix: null,
+ isAllowRadius: true,
+ isBorderAllowed: false,
+ isAllowLeadingIcon: true,
+ autoFocus: true,
+ keyboardType: TextInputType.number,
+ padding: EdgeInsets.symmetric(vertical: 8.h),
+ leadingIcon: AppAssets.student_card,
+ ).paddingOnly(top: 8.h, bottom: 8.h),
+ Divider(height: 1.h, color: AppColors.spacerLineColor),
+ TextInputWidget(
+ labelText: LocaleKeys.phoneNumber.tr(),
+ hintText: "",
+ controller: authVm.phoneNumberController,
+ isEnable: true,
+ prefix: authVm.selectedCountrySignup.countryCode,
+ isAllowRadius: true,
+ isBorderAllowed: false,
+ isAllowLeadingIcon: true,
+ autoFocus: true,
+ keyboardType: TextInputType.number,
+ padding: EdgeInsets.symmetric(vertical: 8.h),
+ leadingIcon: AppAssets.smart_phone,
+ ).paddingOnly(top: 8.h, bottom: 4.h),
+ ],
+ ),
+ ),
+ SizedBox(height: 20.h),
+ CustomButton(
+ text: "Verify the member".needTranslation,
+ onPressed: () {
+ FocusScope.of(context).unfocus();
+ if (ValidationUtils.isValidatedIdAndPhoneWithCountryValidation(
+ nationalId: authVm.nationalIdController.text,
+ selectedCountry: authVm.selectedCountrySignup,
+ phoneNumber: authVm.phoneNumberController.text,
+ onOkPress: () {
+ Navigator.of(context).pop();
+ },
+ )) {
+ // authVm.addFamilyMember(otpTypeEnum: OTPTypeEnum.sms, isExcludedUser: true);
+ if (onVerificationPress != null) {
+ onVerificationPress!();
+ }
+ }
+ },
+ icon: AppAssets.add_icon,
+ height: 56.h,
+ fontWeight: FontWeight.w600),
+ SizedBox(height: 20.h),
+ ],
+ );
+ }
+}