diff --git a/assets/images/svg/visa_mastercard.svg b/assets/images/svg/visa_mastercard.svg
new file mode 100644
index 0000000..22e19fa
--- /dev/null
+++ b/assets/images/svg/visa_mastercard.svg
@@ -0,0 +1,14 @@
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index aead424..57e0ebc 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -132,6 +132,7 @@ class AppAssets {
static const String touch_face_id = '$svgBasePath/touch_face_id.svg';
static const String minus = '$svgBasePath/minus.svg';
static const String home_lab_result_icon = '$svgBasePath/home_lab_result_icon.svg';
+ static const String visa_mastercard_icon = '$svgBasePath/visa_mastercard.svg';
//bottom navigation//
static const String homeBottom = '$svgBasePath/home_bottom.svg';
diff --git a/lib/core/app_state.dart b/lib/core/app_state.dart
index e9abeaa..c906374 100644
--- a/lib/core/app_state.dart
+++ b/lib/core/app_state.dart
@@ -44,6 +44,7 @@ class AppState {
setIsAuthenticated = true;
_authenticatedRootUser = authenticatedUser;
}
+
}
AuthenticatedUser? getAuthenticatedUser({bool isFamily = false}) {
@@ -97,7 +98,7 @@ class AppState {
set setDeviceTypeID(v) => deviceTypeID = v;
List vidaPlusProjectList = [];
- List privilegeModelList = [];
+ List privilegeModelList = [];
List hMCProjectListModel = [];
List projectDetailListModel = [];
@@ -105,7 +106,7 @@ class AppState {
vidaPlusProjectList = vidaPlusProjectListModelInput;
}
- setPrivilegeModelList(List privilegeModelListInput) {
+ setPrivilegeModelList(List privilegeModelListInput) {
privilegeModelList = privilegeModelListInput;
}
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index 6b74a7b..e0eeb23 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -650,7 +650,7 @@ class Utils {
);
}
- static Widget getPaymentAmountWithSymbol2(num habibWalletAmount, Color iconColor, double iconSize, {bool isSaudiCurrency = true, bool isExpanded = true}) {
+ static Widget getPaymentAmountWithSymbol2(num habibWalletAmount, {double iconSize = 14, Color iconColor = AppColors.textColor, Color textColor = AppColors.blackColor, bool isSaudiCurrency = true, bool isExpanded = true}) {
return RichText(
maxLines: 1,
text: TextSpan(
@@ -658,11 +658,11 @@ class Utils {
WidgetSpan(
alignment: PlaceholderAlignment.baseline,
baseline: TextBaseline.alphabetic,
- child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: 14.h, height: 14.h, iconColor: Colors.black.withValues(alpha: 0.31)),
+ child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: iconSize.h, height: iconSize.h, iconColor: iconColor),
),
TextSpan(
text: " $habibWalletAmount",
- style: TextStyle(color: AppColors.blackColor, fontSize: 32.fSize, letterSpacing: -4, fontWeight: FontWeight.w600, height: 1),
+ style: TextStyle(color: textColor, fontSize: 32.fSize, letterSpacing: -4, fontWeight: FontWeight.w600, height: 1),
),
],
),
@@ -708,4 +708,16 @@ class Utils {
await file.writeAsBytes(bytes);
return file.path;
}
+
+ static bool havePrivilege(int id) {
+ bool isHavePrivilege = false;
+ try {
+ for (var element in appState.privilegeModelList) {
+ if (element.id == id) isHavePrivilege = element.previlege!;
+ }
+ } catch (e) {
+ print(e);
+ }
+ return isHavePrivilege;
+ }
}
diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart
index 11374b7..c8adf78 100644
--- a/lib/features/authentication/authentication_view_model.dart
+++ b/lib/features/authentication/authentication_view_model.dart
@@ -23,6 +23,7 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart';
import 'package:hmg_patient_app_new/features/authentication/models/request_models/check_activation_code_register_request_model.dart';
import 'package:hmg_patient_app_new/features/authentication/models/request_models/registration_payload_model.dart';
+import 'package:hmg_patient_app_new/features/authentication/models/resp_models/authenticated_user_resp_model.dart';
import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_activation_code_resp_model.dart';
import 'package:hmg_patient_app_new/features/authentication/models/resp_models/check_user_staus_nhic_response_model.dart';
import 'package:hmg_patient_app_new/features/authentication/models/resp_models/select_device_by_imei.dart';
@@ -497,6 +498,7 @@ class AuthenticationViewModel extends ChangeNotifier {
} else {
if (activation.list != null && activation.list!.isNotEmpty) {
_appState.setAuthenticatedUser(activation.list!.first);
+ _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!);
}
_appState.setUserBloodGroup = (activation.patientBlodType ?? "");
_appState.setAppAuthToken = activation.authenticationTokenId;
@@ -905,7 +907,7 @@ class AuthenticationViewModel extends ChangeNotifier {
Future getServicePrivilege() async {
final resultEither = await _authenticationRepo.getServicePrivilege();
- List privilegeModelList = [];
+ List privilegeModelList = [];
List vidaPlusProjectListModel = [];
List hMCProjectListModel = [];
List projectDetailListModel = [];
@@ -917,9 +919,9 @@ class AuthenticationViewModel extends ChangeNotifier {
await _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage ?? "ErrorEmpty");
} else {
apiResponse.data["ServicePrivilegeList"].forEach((v) {
- privilegeModelList.add(PrivilegeModel.fromJson(v));
+ privilegeModelList.add(ListPrivilege.fromJson(v));
});
- _appState.setPrivilegeModelList(privilegeModelList);
+ _appState.setPrivilegeModelList(privilegeModelList.cast());
apiResponse.data["ProjectListVidaPlus"].forEach((v) {
vidaPlusProjectListModel.add(VidaPlusProjectListModel.fromJson(v));
diff --git a/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart b/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart
index 2682f0a..67848c6 100644
--- a/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart
+++ b/lib/features/authentication/models/resp_models/check_activation_code_resp_model.dart
@@ -613,35 +613,3 @@ class ListElement {
"status": listStatus,
};
}
-
-class ListPrivilege {
- int? id;
- String? serviceName;
- bool? previlege;
- dynamic region;
-
- ListPrivilege({
- this.id,
- this.serviceName,
- this.previlege,
- this.region,
- });
-
- factory ListPrivilege.fromRawJson(String str) => ListPrivilege.fromJson(json.decode(str));
-
- String toRawJson() => json.encode(toJson());
-
- factory ListPrivilege.fromJson(Map json) => ListPrivilege(
- id: json["ID"],
- serviceName: json["ServiceName"],
- previlege: json["Previlege"],
- region: json["Region"],
- );
-
- Map toJson() => {
- "ID": id,
- "ServiceName": serviceName,
- "Previlege": previlege,
- "Region": region,
- };
-}
diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart
index 7454b80..81faf91 100644
--- a/lib/features/book_appointments/book_appointments_repo.dart
+++ b/lib/features/book_appointments/book_appointments_repo.dart
@@ -42,11 +42,9 @@ abstract class BookAppointmentsRepo {
Function(dynamic)? onSuccess,
Function(String)? onError});
- Future>>>
- getProjectList();
+ Future>>> getProjectList();
Future>>> getClinicsWithRespectToClinicId(String projectID);
-
}
class BookAppointmentsRepoImp implements BookAppointmentsRepo {
@@ -371,8 +369,7 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo {
}
@override
- Future>>>
- getProjectList() async {
+ Future>>> getProjectList() async {
Map request = {};
try {
@@ -388,11 +385,7 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo {
try {
final list = response['ListProject'];
- final appointmentsList = list
- .map((item) =>
- HospitalsModel.fromJson(item as Map))
- .toList()
- .cast();
+ final appointmentsList = list.map((item) => HospitalsModel.fromJson(item as Map)).toList().cast();
apiResponse = GenericApiModel>(
messageStatus: messageStatus,
diff --git a/lib/features/habib_wallet/habib_wallet_repo.dart b/lib/features/habib_wallet/habib_wallet_repo.dart
index 5f47f6c..659510d 100644
--- a/lib/features/habib_wallet/habib_wallet_repo.dart
+++ b/lib/features/habib_wallet/habib_wallet_repo.dart
@@ -3,10 +3,20 @@ import 'package:hmg_patient_app_new/core/api/api_client.dart';
import 'package:hmg_patient_app_new/core/api_consts.dart';
import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart';
import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart';
import 'package:hmg_patient_app_new/services/logger_service.dart';
abstract class HabibWalletRepo {
Future>> getPatientBalanceAmount();
+
+ Future>>> getProjectList();
+
+ Future>> HISCreateAdvancePayment(
+ {required String paymentMethodName, required num paidAmount, required String paymentReference, required String patientID, required int projectID, required String depositorName});
+
+ Future>> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference});
+
+ Future>> getPatientInfoByPatientID({required String patientID});
}
class HabibWalletRepoImp implements HabibWalletRepo {
@@ -55,4 +65,165 @@ class HabibWalletRepoImp implements HabibWalletRepo {
return Left(UnknownFailure(e.toString()));
}
}
+
+ @override
+ Future>>> getProjectList() async {
+ Map request = {"IsOnlineCheckIn": true, "IsAdvancePayment": true};
+
+ try {
+ GenericApiModel>? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ GET_PROJECT_LIST,
+ body: request,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ final list = response['ListProject'];
+
+ final appointmentsList = list.map((item) => HospitalsModel.fromJson(item as Map)).toList().cast();
+
+ apiResponse = GenericApiModel>(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: appointmentsList,
+ );
+ } 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> HISCreateAdvancePayment(
+ {required String paymentMethodName, required num paidAmount, required String paymentReference, required String patientID, required int projectID, required String depositorName}) async {
+ Map request = {
+ "CustName": depositorName,
+ "CustID": patientID,
+ "SetupID": "010266",
+ "ProjectID": projectID,
+ "PatientID": patientID,
+ "AccountID": patientID,
+ "PaymentAmount": paidAmount,
+ "NationalityID": null,
+ "DepositorName": depositorName,
+ "CreatedBy": 3,
+ "PaymentMethodName": paymentMethodName,
+ "PaymentReference": paymentReference,
+ "PaymentMethod": paymentMethodName,
+ "IsAncillaryOrder": false
+ };
+
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ HIS_CREATE_ADVANCE_PAYMENT,
+ 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> addAdvanceNumberRequest({required String advanceNumber, required String paymentReference}) async {
+ Map requestBody = {
+ "AdvanceNumber": advanceNumber,
+ "AdvanceNumber_VP": advanceNumber,
+ "PaymentReferenceNumber": paymentReference,
+ "AppointmentID": 0,
+ };
+
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ ADD_ADVANCE_NUMBER_REQUEST,
+ body: requestBody,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ apiResponse = GenericApiModel(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ 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> getPatientInfoByPatientID({required String patientID}) async {
+ Map requestBody = {"SearchPatientID": patientID};
+
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ GET_PATIENT_INFO_BY_ID,
+ body: requestBody,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ apiResponse = GenericApiModel(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ 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/habib_wallet/habib_wallet_view_model.dart b/lib/features/habib_wallet/habib_wallet_view_model.dart
index 8e4fc26..c620b08 100644
--- a/lib/features/habib_wallet/habib_wallet_view_model.dart
+++ b/lib/features/habib_wallet/habib_wallet_view_model.dart
@@ -1,23 +1,66 @@
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart';
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
class HabibWalletViewModel extends ChangeNotifier {
bool isWalletAmountLoading = false;
num habibWalletAmount = 0;
+ num walletRechargeAmount = 0;
+
+ int currentIndex = 0;
+
+ List advancePaymentHospitals = [];
+
+ HospitalsModel? selectedHospital;
HabibWalletRepo habibWalletRepo;
ErrorHandlerService errorHandlerService;
+ String fileNumber = '';
+ String depositorName = '';
+ String mobileNumber = '';
+
HabibWalletViewModel({required this.habibWalletRepo, required this.errorHandlerService});
initHabibWalletProvider() {
isWalletAmountLoading = true;
habibWalletAmount = 0;
+ walletRechargeAmount = 0;
+ advancePaymentHospitals.clear();
+ selectedHospital = null;
+ fileNumber = '';
+ depositorName = '';
+ mobileNumber = '';
+ notifyListeners();
+ }
+
+ setSelectedHospital(HospitalsModel hospital) {
+ selectedHospital = hospital;
+ notifyListeners();
+ }
+
+ setWalletRechargeAmount(num amount) {
+ walletRechargeAmount = amount;
+ notifyListeners();
+ }
+
+ setDepositorDetails(String fileNum, String depositor, String mobile) {
+ fileNumber = fileNum;
+ depositorName = depositor;
+ mobileNumber = mobile;
+ notifyListeners();
+ }
+
+ setCurrentIndex(int index) {
+ currentIndex = index;
notifyListeners();
}
Future getPatientBalanceAmount({Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ isWalletAmountLoading = true;
+ notifyListeners();
+
final result = await habibWalletRepo.getPatientBalanceAmount();
result.fold(
@@ -36,4 +79,85 @@ class HabibWalletViewModel extends ChangeNotifier {
},
);
}
+
+ Future getProjectsList() async {
+ advancePaymentHospitals.clear();
+ notifyListeners();
+ final result = await habibWalletRepo.getProjectList();
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) async {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ advancePaymentHospitals = apiResponse.data!;
+ notifyListeners();
+ }
+ },
+ );
+ }
+
+ Future HISCreateAdvancePayment(
+ {required String paymentMethodName,
+ required num paidAmount,
+ required String paymentReference,
+ required String patientID,
+ required int projectID,
+ required String depositorName,
+ Function(dynamic)? onSuccess,
+ Function(String)? onError}) async {
+ final result = await habibWalletRepo.HISCreateAdvancePayment(
+ paymentMethodName: paymentMethodName, paidAmount: paidAmount, paymentReference: paymentReference, patientID: patientID, projectID: projectID, depositorName: depositorName);
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
+
+ Future addAdvanceNumberRequest({required String advanceNumber, required String paymentReference, Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ final result = await habibWalletRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference);
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
+
+ Future getPatientInfoByPatientID({required String patientID, Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ final result = await habibWalletRepo.getPatientInfoByPatientID(patientID: patientID);
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(failure: failure),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
}
diff --git a/lib/features/payfort/payfort_view_model.dart b/lib/features/payfort/payfort_view_model.dart
index d99de80..6b67ce9 100644
--- a/lib/features/payfort/payfort_view_model.dart
+++ b/lib/features/payfort/payfort_view_model.dart
@@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/features/payfort/models/payfort_project_deta
import 'package:hmg_patient_app_new/features/payfort/models/sdk_token_response_model.dart';
import 'package:hmg_patient_app_new/features/payfort/payfort_repo.dart';
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
+import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
import 'package:network_info_plus/network_info_plus.dart';
class PayfortViewModel extends ChangeNotifier {
@@ -183,6 +184,7 @@ class PayfortViewModel extends ChangeNotifier {
isApplePayConfigurationLoading = false;
notifyListeners();
+ LoaderBottomSheet.hideLoader();
_payfort.callPayFortForApplePay(
request: request,
diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart
index 4d5fd8f..e68e000 100644
--- a/lib/presentation/appointments/appointment_payment_page.dart
+++ b/lib/presentation/appointments/appointment_payment_page.dart
@@ -273,7 +273,6 @@ class _AppointmentPaymentPageState extends State {
isSaudiCurrency: true),
],
).paddingSymmetrical(24.h, 0.h),
- //TODO: Add Apple Pay Privileges
Platform.isIOS
? Utils.buildSvgWithAssets(
icon: AppAssets.apple_pay_button,
@@ -282,7 +281,11 @@ class _AppointmentPaymentPageState extends State {
fit: BoxFit.contain,
).paddingSymmetrical(24.h, 0.h).onPress(() {
// payfortVM.setIsApplePayConfigurationLoading(true);
- startApplePay();
+ if (Utils.havePrivilege(103)) {
+ startApplePay();
+ } else {
+ openPaymentURL(selectedPaymentMethod);
+ }
})
: SizedBox(height: 12.h),
SizedBox(height: 12.h),
@@ -363,8 +366,8 @@ class _AppointmentPaymentPageState extends State {
appointmentNo: widget.patientAppointmentHistoryResponseModel.appointmentNo.toString(),
payedAmount: payfortViewModel.payfortCheckPaymentStatusResponseModel!.amount!,
paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
- patientID: "4767477",
- patientType: 1,
+ patientID: appState.getAuthenticatedUser()!.patientId.toString(),
+ patientType: appState.getAuthenticatedUser()!.patientType!,
onSuccess: (value) async {
print(value);
await myAppointmentsViewModel.addAdvanceNumberRequest(
diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart
index 41fb924..81cc318 100644
--- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart
+++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart
@@ -17,8 +17,7 @@ class HospitalListItem extends StatelessWidget {
late AppState appState;
- HospitalListItem(
- {super.key, required this.hospitalData, required this.isLocationEnabled});
+ HospitalListItem({super.key, required this.hospitalData, required this.isLocationEnabled});
@override
Widget build(BuildContext context) {
@@ -70,24 +69,17 @@ class HospitalListItem extends StatelessWidget {
);
Widget get distanceInfo => Row(
-
children: [
Visibility(
- visible: (hospitalData?.distanceInKMs != "0"),
- child:
-
-
- AppCustomChipWidget(
- labelText:
- "${hospitalData?.distanceInKMs ?? ""} km".needTranslation,
- deleteIcon: AppAssets.location_red,
- deleteIconSize: Size(9, 12),
- backgroundColor: AppColors.secondaryLightRedColor,
- textColor: AppColors.errorColor,
- ),
-
-
- ),
+ visible: (hospitalData?.distanceInKMs != "0"),
+ child: AppCustomChipWidget(
+ labelText: "${hospitalData?.distanceInKMs ?? ""} km".needTranslation,
+ deleteIcon: AppAssets.location_red,
+ deleteIconSize: Size(9, 12),
+ backgroundColor: AppColors.secondaryLightRedColor,
+ textColor: AppColors.errorColor,
+ ),
+ ),
Visibility(
visible: (hospitalData?.distanceInKMs == "0"),
child: Row(
@@ -96,8 +88,9 @@ class HospitalListItem extends StatelessWidget {
labelText: "Distance not available".needTranslation,
textColor: AppColors.blackColor,
),
- SizedBox(width: 8.h,)
-
+ SizedBox(
+ width: 8.h,
+ )
],
)),
Visibility(
diff --git a/lib/presentation/habib_wallet/habib_wallet_page.dart b/lib/presentation/habib_wallet/habib_wallet_page.dart
index 6add7bd..e1d1ba2 100644
--- a/lib/presentation/habib_wallet/habib_wallet_page.dart
+++ b/lib/presentation/habib_wallet/habib_wallet_page.dart
@@ -14,7 +14,6 @@ import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.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/routes/custom_page_route.dart';
-import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
import 'package:provider/provider.dart';
class HabibWalletPage extends StatefulWidget {
@@ -25,8 +24,11 @@ class HabibWalletPage extends StatefulWidget {
}
class _HabibWalletState extends State {
+ late HabibWalletViewModel habibWalletVM;
+
@override
Widget build(BuildContext context) {
+ habibWalletVM = Provider.of(context, listen: false);
AppState _appState = getIt.get();
return Scaffold(
backgroundColor: AppColors.bgScaffoldColor,
@@ -66,10 +68,10 @@ class _HabibWalletState extends State {
),
Spacer(),
LocaleKeys.balanceAmount.tr(context: context).toText14(weight: FontWeight.w500, color: AppColors.whiteColor),
+ SizedBox(height: 4.h),
Consumer(builder: (context, habibWalletVM, child) {
- return Utils.getPaymentAmountWithSymbol(habibWalletVM.habibWalletAmount.toString().toText32(isBold: true, color: AppColors.whiteColor), AppColors.whiteColor, 13.h,
- isExpanded: false)
- .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 40.h);
+ return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, textColor: AppColors.whiteColor, iconColor: AppColors.whiteColor, iconSize: 13, isExpanded: false)
+ .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 24.h);
}),
],
),
@@ -84,11 +86,15 @@ class _HabibWalletState extends State {
iconSize: 21.h,
text: "Recharge".needTranslation,
onPressed: () {
- Navigator.of(context).push(
+ Navigator.of(context)
+ .push(
CustomPageRoute(
page: RechargeWalletPage(),
),
- );
+ )
+ .then((val) {
+ habibWalletVM.getPatientBalanceAmount();
+ });
},
backgroundColor: AppColors.infoColor,
borderColor: AppColors.infoColor,
diff --git a/lib/presentation/habib_wallet/recharge_wallet_page.dart b/lib/presentation/habib_wallet/recharge_wallet_page.dart
index 02a9426..098610b 100644
--- a/lib/presentation/habib_wallet/recharge_wallet_page.dart
+++ b/lib/presentation/habib_wallet/recharge_wallet_page.dart
@@ -1,5 +1,6 @@
+import 'dart:async';
+
import 'package:easy_localization/easy_localization.dart';
-import 'package:family_bottom_sheet/family_bottom_sheet.dart';
import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_assets.dart';
import 'package:hmg_patient_app_new/core/app_state.dart';
@@ -8,12 +9,17 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/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/habib_wallet/habib_wallet_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/habib_wallet/wallet_payment_confirm_page.dart';
+import 'package:hmg_patient_app_new/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart';
import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.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/common_bottom_sheet.dart';
import 'package:hmg_patient_app_new/widgets/input_widget.dart';
+import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
+import 'package:provider/provider.dart';
import 'widgets/select-medical_file.dart';
@@ -27,8 +33,20 @@ class RechargeWalletPage extends StatefulWidget {
class _RechargeWalletPageState extends State {
FocusNode textFocusNode = FocusNode();
+ late HabibWalletViewModel habibWalletVM;
+ final TextEditingController amountTextController = TextEditingController();
+
+ @override
+ void initState() {
+ scheduleMicrotask(() {
+ habibWalletVM.getProjectsList();
+ });
+ super.initState();
+ }
+
@override
Widget build(BuildContext context) {
+ habibWalletVM = Provider.of(context, listen: false);
AppState appState = getIt.get();
return Scaffold(
backgroundColor: AppColors.bgScaffoldColor,
@@ -36,189 +54,197 @@ class _RechargeWalletPageState extends State {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
- child: CollapsingListView(
- title: LocaleKeys.createAdvancedPayment.tr(context: context),
- child: SingleChildScrollView(
- child: Padding(
- padding: EdgeInsets.all(24.h),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Container(
- height: 135.h,
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.h,
- hasShadow: false,
- side: BorderSide(color: AppColors.textColor, width: 2.h),
- ),
- child: Padding(
- padding: EdgeInsets.all(16.h),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- "Enter an amount".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
- Spacer(),
- Row(
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- Utils.getPaymentAmountWithSymbol(
- SizedBox(
- width: 150.h,
- child: TextInputWidget(
- labelText: "",
- hintText: "",
- isEnable: true,
- prefix: null,
- isAllowRadius: true,
- isBorderAllowed: false,
- isAllowLeadingIcon: true,
- autoFocus: true,
- fontSize: 40,
- padding: EdgeInsets.symmetric(horizontal: 8.h, vertical: 0.h),
- focusNode: textFocusNode,
- isWalletAmountInput: true,
- // leadingIcon: AppAssets.student_card,
+ child: CollapsingListView(
+ title: LocaleKeys.createAdvancedPayment.tr(context: context),
+ child: SingleChildScrollView(
+ child: Padding(
+ padding: EdgeInsets.all(24.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ height: 135.h,
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 24.h,
+ hasShadow: false,
+ side: BorderSide(color: AppColors.textColor, width: 2.h),
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ //TODO: Check with hussain to show AED or SAR
+ "Enter an amount".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ Spacer(),
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Utils.getPaymentAmountWithSymbol(
+ SizedBox(
+ width: 150.h,
+ child: TextInputWidget(
+ controller: amountTextController,
+ labelText: "",
+ hintText: "",
+ isEnable: true,
+ prefix: null,
+ isAllowRadius: true,
+ isBorderAllowed: false,
+ isAllowLeadingIcon: true,
+ autoFocus: true,
+ fontSize: 40,
+ padding: EdgeInsets.symmetric(horizontal: 8.h, vertical: 0.h),
+ focusNode: textFocusNode,
+ isWalletAmountInput: true,
+ keyboardType: TextInputType.numberWithOptions(signed: false, decimal: true),
+ // leadingIcon: AppAssets.student_card,
+ ),
),
- ),
- AppColors.textColor,
- 13.h,
- isExpanded: false),
- const Spacer(),
- "SAR".needTranslation.toText20(color: AppColors.greyTextColor, weight: FontWeight.w500),
- ],
- ),
- ],
+ AppColors.textColor,
+ 13.h,
+ isExpanded: false),
+ const Spacer(),
+ "SAR".needTranslation.toText20(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ ],
+ ),
+ ],
+ ),
),
),
- ),
- SizedBox(height: 24.h),
- Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 24.h,
- hasShadow: false,
- ),
- child: Padding(
- padding: EdgeInsets.all(16.h),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ SizedBox(height: 24.h),
+ Consumer(builder: (context, habibWalletVM, child) {
+ return Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 24.h,
+ hasShadow: false,
+ ),
+ child: Padding(
+ padding: EdgeInsets.all(16.h),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Utils.buildSvgWithAssets(icon: AppAssets.my_account_icon, width: 40.h, height: 40.h),
- SizedBox(width: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ Row(
children: [
- LocaleKeys.myAccount.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
- "${LocaleKeys.medicalFile.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}"
- .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ Utils.buildSvgWithAssets(icon: AppAssets.my_account_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 8.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.myAccount.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ "${LocaleKeys.medicalFile.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}"
+ .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ ],
+ ),
],
),
+ Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
],
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
- ],
- ).onPress(() async {
- // showCommonBottomSheetWithoutHeight(context, title: "Select Medical File".needTranslation, child: SelectMedicalFile(), callBackFunc: () {}, isFullScreen: false);
- // showCommonBottomSheetWithoutHeight(context, title: "Select Medical File".needTranslation, child: const MultiPageBottomSheet(), callBackFunc: () {}, isFullScreen: false);
- await FamilyModalSheet.show(
- context: context,
- contentBackgroundColor: AppColors.scaffoldBgColor,
- backgroundColor: AppColors.bottomSheetBgColor,
- mainContentPadding: EdgeInsets.all(24.h),
- isScrollControlled: true,
- safeAreaMinimum: EdgeInsets.zero,
- useSafeArea: false,
- sheetAnimationStyle: AnimationStyle(
- duration: Duration(milliseconds: 500), // Custom animation duration
- reverseDuration: Duration(milliseconds: 300), // Custom reverse animation duration
- ),
- builder: (ctx) {
- return const MultiPageBottomSheet();
- },
-
- // Optional configurations
- );
- }),
- SizedBox(height: 16.h),
- Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
- SizedBox(height: 16.h),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
+ ).onPress(() async {
+ habibWalletVM.setCurrentIndex(0);
+ showCommonBottomSheetWithoutHeight(context, title: "Select Medical File".needTranslation,
+ titleWidget: Consumer(builder: (context, habibWalletVM, child) {
+ return habibWalletVM.currentIndex != 0
+ ? IconButton(
+ icon: Utils.buildSvgWithAssets(icon: AppAssets.arrow_back, width: 24.h, height: 24.h),
+ padding: EdgeInsets.zero,
+ onPressed: () => habibWalletVM.setCurrentIndex(0),
+ highlightColor: Colors.transparent,
+ )
+ : "Select Medical File".needTranslation.toText20(weight: FontWeight.w600);
+ }), child: Consumer(builder: (context, habibWalletVM, child) {
+ return MultiPageBottomSheet();
+ }), callBackFunc: () {}, isFullScreen: false, isCloseButtonVisible: true);
+ }),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
+ SizedBox(height: 16.h),
Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Utils.buildSvgWithAssets(icon: AppAssets.select_hospital_icon, width: 40.h, height: 40.h),
- SizedBox(width: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ Row(
children: [
- LocaleKeys.hospital.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
- "Olaya".toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ Utils.buildSvgWithAssets(icon: AppAssets.select_hospital_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 8.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.hospital.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ SizedBox(
+ width: MediaQuery.of(context).size.width * 0.55,
+ child: (habibWalletVM.selectedHospital != null ? habibWalletVM.selectedHospital!.name : LocaleKeys.selectHospital.tr(context: context))!
+ .toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ ),
+ ],
+ ),
],
- ),
+ ).onPress(() {
+ showCommonBottomSheetWithoutHeight(context,
+ title: LocaleKeys.selectHospital.tr(context: context), isDismissible: false, child: SelectHospitalBottomSheet(), callBackFunc: () {});
+ }),
+ Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
],
),
- Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h),
- ],
- ),
- SizedBox(height: 16.h),
- Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
- SizedBox(height: 16.h),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
+ SizedBox(height: 16.h),
Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h),
- SizedBox(width: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ Row(
children: [
- LocaleKeys.email.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
- "${appState.getAuthenticatedUser()!.emailAddress}".toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 8.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.email.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
+ "${appState.getAuthenticatedUser()!.emailAddress}".toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ ],
+ ),
],
),
],
),
- ],
- ),
- SizedBox(height: 16.h),
- Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
- SizedBox(height: 16.h),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
+ SizedBox(height: 16.h),
Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Utils.buildSvgWithAssets(icon: AppAssets.notes_icon, width: 40.h, height: 40.h),
- SizedBox(width: 8.h),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ Row(
children: [
- LocaleKeys.notes.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
- "Lorem Ipsum".toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ Utils.buildSvgWithAssets(icon: AppAssets.notes_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 8.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.notes.tr(context: context).toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
+ "Lorem Ipsum".toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ ],
+ ),
],
),
],
),
+ SizedBox(height: 8.h),
],
),
- SizedBox(height: 8.h),
- ],
- ),
- ),
- ),
- ],
+ ),
+ );
+ }),
+ ],
+ ),
),
),
),
- )),
+ ),
+ //TODO: Handle Family member selection & Other Account Selection
Container(
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
@@ -227,7 +253,38 @@ class _RechargeWalletPageState extends State {
),
child: CustomButton(
text: LocaleKeys.next.tr(context: context),
- onPressed: () {},
+ onPressed: () {
+ if (amountTextController.text.isEmpty) {
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: "Please enter amount to continue.".needTranslation),
+ callBackFunc: () {
+ textFocusNode.requestFocus();
+ },
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ } else if (habibWalletVM.selectedHospital == null) {
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: "Please select hospital to continue.".needTranslation),
+ callBackFunc: () {
+ textFocusNode.requestFocus();
+ },
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ } else {
+ habibWalletVM.setWalletRechargeAmount(num.parse(amountTextController.text));
+ habibWalletVM.setDepositorDetails(appState.getAuthenticatedUser()!.patientId.toString(), "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
+ appState.getAuthenticatedUser()!.mobileNumber!);
+ Navigator.of(context).push(
+ CustomPageRoute(
+ page: WalletPaymentConfirmPage(),
+ ),
+ );
+ }
+ },
backgroundColor: AppColors.primaryRedColor,
borderColor: AppColors.primaryRedColor,
textColor: AppColors.whiteColor,
diff --git a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart
new file mode 100644
index 0000000..329a3fe
--- /dev/null
+++ b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart
@@ -0,0 +1,423 @@
+import 'dart:async';
+import 'dart:developer';
+import 'dart:io';
+
+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_state.dart';
+import 'package:hmg_patient_app_new/core/cache_consts.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/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/habib_wallet/habib_wallet_view_model.dart';
+import 'package:hmg_patient_app_new/features/payfort/models/apple_pay_request_insert_model.dart';
+import 'package:hmg_patient_app_new/features/payfort/payfort_view_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/theme/colors.dart';
+import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart';
+import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart';
+import 'package:hmg_patient_app_new/widgets/in_app_browser/InAppBrowser.dart';
+import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
+import 'package:provider/provider.dart';
+
+class WalletPaymentConfirmPage extends StatefulWidget {
+ const WalletPaymentConfirmPage({super.key});
+
+ @override
+ State createState() => _WalletPaymentConfirmPageState();
+}
+
+class _WalletPaymentConfirmPageState extends State {
+ late PayfortViewModel payfortViewModel;
+ late AppState appState;
+ late HabibWalletViewModel habibWalletVM;
+
+ MyInAppBrowser? browser;
+ String selectedPaymentMethod = "";
+
+ String transID = "";
+
+ @override
+ void initState() {
+ scheduleMicrotask(() {
+ payfortViewModel.initPayfortViewModel();
+ });
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ appState = getIt.get();
+ habibWalletVM = Provider.of(context, listen: false);
+ payfortViewModel = Provider.of(context, listen: false);
+ return Scaffold(
+ backgroundColor: AppColors.bgScaffoldColor,
+ body: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: CollapsingListView(
+ title: "Select Payment Method",
+ child: SingleChildScrollView(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(height: 24.h),
+ Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 20.h,
+ hasShadow: false,
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Image.asset(AppAssets.mada, width: 72.h, height: 25.h).toShimmer2(isShow: false),
+ SizedBox(height: 16.h),
+ "Mada".needTranslation.toText16(isBold: true).toShimmer2(isShow: false),
+ ],
+ ),
+ SizedBox(width: 8.h),
+ const Spacer(),
+ Utils.buildSvgWithAssets(
+ icon: AppAssets.forward_arrow_icon,
+ iconColor: AppColors.blackColor,
+ width: 18.h,
+ height: 13.h,
+ fit: BoxFit.contain,
+ ).toShimmer2(isShow: false),
+ ],
+ ).paddingSymmetrical(16.h, 16.h),
+ ).paddingSymmetrical(24.h, 0.h).onPress(() {
+ selectedPaymentMethod = "MADA";
+ openPaymentURL("mada");
+ }),
+ SizedBox(height: 16.h),
+ Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 20.h,
+ hasShadow: false,
+ ),
+ child: Row(
+ mainAxisSize: MainAxisSize.max,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Image.asset(AppAssets.visa, width: 40.h, height: 40.h),
+ SizedBox(width: 8.h),
+ Image.asset(AppAssets.Mastercard, width: 40.h, height: 40.h),
+ ],
+ ).toShimmer2(isShow: false),
+ SizedBox(height: 16.h),
+ "Visa or Mastercard".needTranslation.toText16(isBold: true).toShimmer2(isShow: false),
+ ],
+ ),
+ SizedBox(width: 8.h),
+ const Spacer(),
+ Utils.buildSvgWithAssets(
+ icon: AppAssets.forward_arrow_icon,
+ iconColor: AppColors.blackColor,
+ width: 18.h,
+ height: 13.h,
+ fit: BoxFit.contain,
+ ).toShimmer2(isShow: false),
+ ],
+ ).paddingSymmetrical(16.h, 16.h),
+ ).paddingSymmetrical(24.h, 0.h).onPress(() {
+ selectedPaymentMethod = "VISA";
+ openPaymentURL("visa");
+ }),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Container(
+ // height: 200.h,
+ width: MediaQuery.of(context).size.width,
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 24.h,
+ hasShadow: true,
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(height: 24.h),
+ habibWalletVM.depositorName.toText18(isBold: true).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 12.h),
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 4.h,
+ runSpacing: 4.h,
+ children: [
+ AppCustomChipWidget(labelText: "${LocaleKeys.fileno.tr(context: context)}.: ${habibWalletVM.fileNumber}"),
+ AppCustomChipWidget(labelText: "${LocaleKeys.mobileNumber.tr(context: context)}: ${habibWalletVM.mobileNumber}"),
+ AppCustomChipWidget(labelText: "${habibWalletVM.selectedHospital!.name}"),
+ ],
+ ).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 16.h),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ "Total amount to pay".needTranslation.toText16(isBold: true),
+ Utils.getPaymentAmountWithSymbol(habibWalletVM.walletRechargeAmount.toString().toText24(isBold: true), AppColors.blackColor, 15.h, isSaudiCurrency: true),
+ ],
+ ).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 12.h),
+ Platform.isIOS
+ ? Utils.buildSvgWithAssets(
+ icon: AppAssets.apple_pay_button,
+ width: 200.h,
+ height: 56.h,
+ fit: BoxFit.contain,
+ ).paddingSymmetrical(24.h, 0.h).onPress(() {
+ if (Utils.havePrivilege(103)) {
+ startApplePay();
+ } else {
+ openPaymentURL("applepay");
+ }
+ })
+ : SizedBox(height: 12.h),
+ SizedBox(height: 32.h),
+ ],
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+
+ startApplePay() async {
+ LoaderBottomSheet.showLoader();
+ ApplePayInsertRequest applePayInsertRequest = ApplePayInsertRequest();
+
+ transID = Utils.getAdvancePaymentTransID(habibWalletVM.selectedHospital!.iD!, int.parse(habibWalletVM.fileNumber));
+
+ await payfortViewModel.getPayfortConfigurations(serviceId: ServiceTypeEnum.advancePayment.getIdFromServiceEnum(), projectId: habibWalletVM.selectedHospital!.iD!, integrationId: 2);
+
+ applePayInsertRequest.clientRequestID = transID;
+ applePayInsertRequest.clinicID = 0;
+
+ applePayInsertRequest.currency = appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED";
+ applePayInsertRequest.customerEmail = "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com";
+ applePayInsertRequest.customerID = appState.getAuthenticatedUser()!.patientId.toString();
+ applePayInsertRequest.customerName = "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}";
+
+ applePayInsertRequest.deviceToken = await Utils.getStringFromPrefs(CacheConst.pushToken);
+ applePayInsertRequest.voipToken = await Utils.getStringFromPrefs(CacheConst.voipToken);
+ applePayInsertRequest.doctorID = 0;
+ applePayInsertRequest.projectID = habibWalletVM.selectedHospital!.iD!.toString();
+ applePayInsertRequest.serviceID = ServiceTypeEnum.appointmentPayment.getIdFromServiceEnum().toString();
+ applePayInsertRequest.channelID = 3;
+ applePayInsertRequest.patientID = appState.getAuthenticatedUser()!.patientId.toString();
+ applePayInsertRequest.patientTypeID = appState.getAuthenticatedUser()!.patientType;
+ applePayInsertRequest.patientOutSA = appState.getAuthenticatedUser()!.outSa;
+ applePayInsertRequest.appointmentDate = null;
+ applePayInsertRequest.appointmentNo = 0;
+ applePayInsertRequest.orderDescription = "Advance Payment";
+ applePayInsertRequest.liveServiceID = "0";
+ applePayInsertRequest.latitude = "0.0";
+ applePayInsertRequest.longitude = "0.0";
+ applePayInsertRequest.amount = habibWalletVM.walletRechargeAmount.toString();
+ applePayInsertRequest.isSchedule = "0";
+ applePayInsertRequest.language = appState.isArabic() ? 'ar' : 'en';
+ applePayInsertRequest.languageID = appState.isArabic() ? 1 : 2;
+ applePayInsertRequest.userName = appState.getAuthenticatedUser()!.patientId;
+ applePayInsertRequest.responseContinueURL = "http://hmg.com/Documents/success.html";
+ applePayInsertRequest.backClickUrl = "http://hmg.com/Documents/success.html";
+ applePayInsertRequest.paymentOption = "ApplePay";
+
+ applePayInsertRequest.isMobSDK = true;
+ applePayInsertRequest.merchantReference = transID;
+ applePayInsertRequest.merchantIdentifier = payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier;
+ applePayInsertRequest.commandType = "PURCHASE";
+ applePayInsertRequest.signature = payfortViewModel.payfortProjectDetailsRespModel!.signature;
+ applePayInsertRequest.accessCode = payfortViewModel.payfortProjectDetailsRespModel!.accessCode;
+ applePayInsertRequest.shaRequestPhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaRequest;
+ applePayInsertRequest.shaResponsePhrase = payfortViewModel.payfortProjectDetailsRespModel!.shaResponse;
+ applePayInsertRequest.returnURL = "";
+
+ //TODO: Need to pass dynamic params to the Apple Pay instead of static values
+ await payfortViewModel.applePayRequestInsert(applePayInsertRequest: applePayInsertRequest).then((value) {
+ payfortViewModel.paymentWithApplePay(
+ customerName: "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
+ // customerEmail: projectViewModel.authenticatedUserObject.user.emailAddress,
+ customerEmail: "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
+ orderDescription: "Appointment Payment",
+ orderAmount: double.parse(habibWalletVM.walletRechargeAmount.toString()),
+ merchantReference: transID,
+ merchantIdentifier: payfortViewModel.payfortProjectDetailsRespModel!.merchantIdentifier,
+ applePayAccessCode: payfortViewModel.payfortProjectDetailsRespModel!.accessCode,
+ applePayShaRequestPhrase: payfortViewModel.payfortProjectDetailsRespModel!.shaRequest,
+ currency: appState.getAuthenticatedUser()!.outSa! == 0 ? "SAR" : "AED",
+ onFailed: (failureResult) async {
+ log("failureResult: ${failureResult.message.toString()}");
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: failureResult.message.toString()),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ },
+ onSucceeded: (successResult) async {
+ log("successResult: ${successResult.responseMessage.toString()}");
+ selectedPaymentMethod = successResult.paymentOption ?? "VISA";
+ checkPaymentStatus();
+ },
+ );
+ });
+ }
+
+ void checkPaymentStatus() async {
+ LoaderBottomSheet.showLoader();
+ await payfortViewModel.checkPaymentStatus(
+ transactionID: transID,
+ onSuccess: (apiResponse) async {
+ print(apiResponse.data);
+ if (payfortViewModel.payfortCheckPaymentStatusResponseModel!.responseMessage!.toLowerCase() == "success") {
+ await habibWalletVM.HISCreateAdvancePayment(
+ paymentMethodName: selectedPaymentMethod,
+ paidAmount: habibWalletVM.walletRechargeAmount,
+ paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
+ patientID: habibWalletVM.fileNumber,
+ projectID: habibWalletVM.selectedHospital!.iD!,
+ depositorName: habibWalletVM.depositorName,
+ onSuccess: (value) async {
+ await habibWalletVM.addAdvanceNumberRequest(
+ advanceNumber: Utils.isVidaPlusProject(habibWalletVM.selectedHospital!.iD)
+ ? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
+ : value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
+ paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
+ onSuccess: (value) {
+ LoaderBottomSheet.hideLoader();
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getSuccessWidget(loadingText: "Payment Successful!".needTranslation),
+ callBackFunc: () {
+ Navigator.of(context).pop();
+ Navigator.of(context).pop();
+ },
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ },
+ onError: (err) {
+ LoaderBottomSheet.hideLoader();
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: "Payment Failed - ${err}".needTranslation),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ });
+ },
+ onError: (err) {});
+ } else {
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: "Payment Failed! Please try again.".needTranslation),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ }
+ },
+ );
+ }
+
+ onBrowserLoadStart(String url) {
+ print("onBrowserLoadStart");
+ print(url);
+
+ if (selectedPaymentMethod == "tamara") {
+ if (Platform.isAndroid) {
+ Uri uri = new Uri.dataFromString(url);
+ // tamaraPaymentStatus = uri.queryParameters['status']!;
+ // tamaraOrderID = uri.queryParameters['AuthorizePaymentId']!;
+ } else {
+ Uri uri = new Uri.dataFromString(url);
+ // tamaraPaymentStatus = uri.queryParameters['paymentStatus']!;
+ // tamaraOrderID = uri.queryParameters['orderId']!;
+ }
+ }
+
+ // if(selectedPaymentMethod != "TAMARA") {
+ MyInAppBrowser.successURLS.forEach((element) {
+ if (url.contains(element)) {
+ browser?.close();
+ MyInAppBrowser.isPaymentDone = true;
+ return;
+ }
+ });
+ // }
+
+ // if(selectedPaymentMethod != "TAMARA") {
+ MyInAppBrowser.errorURLS.forEach((element) {
+ if (url.contains(element)) {
+ browser?.close();
+ MyInAppBrowser.isPaymentDone = false;
+ return;
+ }
+ });
+ // }
+ }
+
+ onBrowserExit(bool isPaymentMade) async {
+ print("onBrowserExit Called!!!!");
+ if (selectedPaymentMethod == "TAMARA") {
+ // checkTamaraPaymentStatus(transID!, appo);
+ // if (tamaraPaymentStatus != null && tamaraPaymentStatus.toLowerCase() == "approved") {
+ // updateTamaraRequestStatus("success", "14", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo);
+ // } else {
+ // updateTamaraRequestStatus("Failed", "00", Utils.getAppointmentTransID(appo.projectID, appo.clinicID, appo.appointmentNo), tamaraOrderID, num.parse(selectedInstallments), appo);
+ // }
+ } else {
+ checkPaymentStatus();
+ // checkPaymentStatus(appo);
+ }
+ }
+
+ openPaymentURL(String paymentMethod) {
+ browser = MyInAppBrowser(onExitCallback: onBrowserExit, onLoadStartCallback: onBrowserLoadStart, context: context);
+ transID = Utils.getAdvancePaymentTransID(habibWalletVM.selectedHospital!.iD!, int.parse(habibWalletVM.fileNumber));
+
+ browser?.openPaymentBrowser(
+ habibWalletVM.walletRechargeAmount,
+ "Advance Payment",
+ transID,
+ habibWalletVM.selectedHospital!.iD!.toString(),
+ "CustID_${appState.getAuthenticatedUser()!.patientId.toString()}@HMG.com",
+ selectedPaymentMethod,
+ appState.getAuthenticatedUser()!.patientType.toString(),
+ "${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}",
+ appState.getAuthenticatedUser()!.patientId.toString(),
+ appState.getAuthenticatedUser()!,
+ browser!,
+ false,
+ "3",
+ "0",
+ context,
+ "",
+ "",
+ "",
+ "",
+ "3");
+ }
+}
diff --git a/lib/presentation/habib_wallet/widgets/hospital_list_item.dart b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart
new file mode 100644
index 0000000..e2151f2
--- /dev/null
+++ b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart
@@ -0,0 +1,103 @@
+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/utils/utils.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/hospital_model.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart';
+
+class HospitalListItemAdvancePayment extends StatelessWidget {
+ final HospitalsModel hospitalModel;
+ final bool isLocationEnabled;
+
+ late AppState appState;
+
+ HospitalListItemAdvancePayment({super.key, required this.hospitalModel, required this.isLocationEnabled});
+
+ @override
+ Widget build(BuildContext context) {
+ appState = getIt.get();
+ return DecoratedBox(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 20.h,
+ hasShadow: false,
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ spacing: 8.h,
+ children: [hospitalName],
+ ),
+ ),
+ Utils.buildSvgWithAssets(
+ icon: AppAssets.forward_arrow_icon,
+ iconColor: AppColors.blackColor,
+ width: 18,
+ height: 13,
+ fit: BoxFit.contain,
+ ),
+ ],
+ ).paddingSymmetrical(16.h, 16.h),
+ );
+ }
+
+ Widget get hospitalName => Row(
+ children: [
+ Utils.buildSvgWithAssets(
+ icon: (hospitalModel.isHMC == true) ? AppAssets.hmc : AppAssets.hmg,
+ ).paddingOnly(right: 10),
+ Expanded(
+ child: Text(
+ hospitalModel.name ?? "",
+ style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 16,
+ color: AppColors.blackColor,
+ ),
+ ),
+ )
+ ],
+ );
+
+// Widget get distanceInfo => Row(
+// children: [
+// Visibility(
+// visible: (hospitalModel.distanceInKMs != "0"),
+// child: AppCustomChipWidget(
+// labelText: "${hospitalData?.distanceInKMs ?? ""} km".needTranslation,
+// deleteIcon: AppAssets.location_red,
+// deleteIconSize: Size(9, 12),
+// backgroundColor: AppColors.secondaryLightRedColor,
+// textColor: AppColors.errorColor,
+// ),
+// ),
+// Visibility(
+// visible: (hospitalData?.distanceInKMs == "0"),
+// child: Row(
+// children: [
+// AppCustomChipWidget(
+// labelText: "Distance not available".needTranslation,
+// textColor: AppColors.blackColor,
+// ),
+// SizedBox(
+// width: 8.h,
+// )
+// ],
+// )),
+// Visibility(
+// visible: !isLocationEnabled,
+// child: AppCustomChipWidget(
+// labelText: "Location turned off".needTranslation,
+// deleteIcon: AppAssets.location_unavailable,
+// deleteIconSize: Size(9, 12),
+// textColor: AppColors.blackColor,
+// )),
+// ],
+// );
+}
diff --git a/lib/presentation/habib_wallet/widgets/select-medical_file.dart b/lib/presentation/habib_wallet/widgets/select-medical_file.dart
index 4724ea1..1c56cdd 100644
--- a/lib/presentation/habib_wallet/widgets/select-medical_file.dart
+++ b/lib/presentation/habib_wallet/widgets/select-medical_file.dart
@@ -27,8 +27,12 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/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/habib_wallet/habib_wallet_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/input_widget.dart';
+import 'package:provider/provider.dart';
class MultiPageBottomSheet extends StatefulWidget {
const MultiPageBottomSheet({Key? key}) : super(key: key);
@@ -40,89 +44,139 @@ class MultiPageBottomSheet extends StatefulWidget {
class _MultiPageBottomSheetState extends State {
late AppState appState;
+ TextEditingController fileNumberEditingController = TextEditingController();
+
@override
Widget build(BuildContext context) {
appState = getIt.get();
- return SizedBox(
- height: MediaQuery.of(context).size.height * 0.38,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
+ return Consumer(builder: (context, habibWalletVM, child) {
+ return Padding(
+ padding: MediaQuery.of(context).viewInsets,
+ child: getCurrentIndexWidget(habibWalletVM),
+ );
+ });
+ }
+
+ Widget getCurrentIndexWidget(HabibWalletViewModel habibWalletVM) {
+ switch (habibWalletVM.currentIndex) {
+ case 0:
+ return getSelectMedicalFileContent(habibWalletVM);
+ case 1:
+ return getOtherAccountContent(habibWalletVM);
+ case 2:
+ return getOtherAccountContent(habibWalletVM);
+ default:
+ return getSelectMedicalFileContent(habibWalletVM);
+ }
+ }
+
+ Widget getOtherAccountContent(HabibWalletViewModel habibWalletVM) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "Enter File Number".needTranslation.toText20(weight: FontWeight.w600),
+ SizedBox(height: 12.h),
+ TextInputWidget(
+ labelText: LocaleKeys.fileNumber.tr(),
+ hintText: "xxxxxxxxx",
+ controller: fileNumberEditingController,
+ // focusNode: _nationalIdFocusNode,
+ isEnable: true,
+ prefix: null,
+ isAllowRadius: true,
+ isBorderAllowed: false,
+ isAllowLeadingIcon: true,
+ autoFocus: true,
+ padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h),
+ leadingIcon: AppAssets.requests,
+ ).withVerticalPadding(8),
+ SizedBox(height: 12.h),
+ CustomButton(
+ text: LocaleKeys.submit.tr(),
+ onPressed: () async {
+ await habibWalletVM.getPatientInfoByPatientID(patientID: fileNumberEditingController.text, onSuccess: (response) {
+ print(response.data["GetPatientInfoByPatientIDList"][0]["FullName"]);
+ }, onError: (error) {});
+ },
+ backgroundColor: AppColors.primaryRedColor,
+ borderColor: AppColors.primaryRedBorderColor,
+ textColor: AppColors.whiteColor,
+ ),
+ ],
+ );
+ }
+
+ Widget getSelectMedicalFileContent(HabibWalletViewModel habibWalletVM) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 16.h,
+ hasShadow: false,
+ ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- "Select Medical File".toText20(weight: FontWeight.w600).expanded,
- Utils.buildSvgWithAssets(icon: AppAssets.close_bottom_sheet_icon, iconColor: Color(0xff2B353E)).onPress(() {
- Navigator.of(context).pop();
- }),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.myMedicalFile.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ "${LocaleKeys.fileno.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
],
+ ).paddingAll(16.h),
+ ).onPress(() {
+ Navigator.of(context).pop();
+ }),
+ SizedBox(height: 16.h),
+ Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 16.h,
+ hasShadow: false,
),
- Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 16.h,
- hasShadow: false,
- ),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.myMedicalFile.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
- "${LocaleKeys.fileno.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500),
- ],
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
- ],
- ).paddingAll(16.h),
- ).onPress(() {
- Navigator.of(context).pop();
- }),
- SizedBox(height: 16.h),
- Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 16.h,
- hasShadow: false,
- ),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.familyTitle.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
- "Select a medical file from your family".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
- ],
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
- ],
- ).paddingAll(16.h),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.familyTitle.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ "Select a medical file from your family".needTranslation.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
+ ],
+ ).paddingAll(16.h),
+ ),
+ SizedBox(height: 16.h),
+ Container(
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
+ color: AppColors.whiteColor,
+ borderRadius: 16.h,
+ hasShadow: false,
),
- SizedBox(height: 16.h),
- Container(
- decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
- color: AppColors.whiteColor,
- borderRadius: 16.h,
- hasShadow: false,
- ),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.otherAccount.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
- "Any active medical file from HMG".toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
- ],
- ),
- Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
- ],
- ).paddingAll(16.h),
- ).onPress(() {}),
- ],
- ),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.otherAccount.tr(context: context).toText16(color: AppColors.textColor, weight: FontWeight.w500),
+ "Any active medical file from HMG".toText14(color: AppColors.greyTextColor, weight: FontWeight.w500),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
+ ],
+ ).paddingAll(16.h),
+ ).onPress(() {
+ habibWalletVM.setCurrentIndex(2);
+ }),
+ ],
);
}
}
diff --git a/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart
new file mode 100644
index 0000000..54c6fb3
--- /dev/null
+++ b/lib/presentation/habib_wallet/widgets/select_hospital_bottom_sheet.dart
@@ -0,0 +1,96 @@
+import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension;
+import 'package:flutter/material.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/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
+import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart';
+import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart';
+import 'package:hmg_patient_app_new/presentation/appointments/widgets/hospital_bottom_sheet/type_selection_widget.dart';
+import 'package:hmg_patient_app_new/presentation/habib_wallet/widgets/hospital_list_item.dart';
+import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.dart';
+import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors;
+import 'package:hmg_patient_app_new/widgets/input_widget.dart';
+import 'package:provider/provider.dart';
+
+class SelectHospitalBottomSheet extends StatelessWidget {
+ late HabibWalletViewModel habibWalletVM;
+ final TextEditingController searchText = TextEditingController();
+
+ SelectHospitalBottomSheet({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ habibWalletVM = Provider.of(context, listen: false);
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ // Text(
+ // LocaleKeys.selectHospital.tr(),
+ // style: TextStyle(
+ // fontSize: 21,
+ // fontWeight: FontWeight.w600,
+ // color: AppColors.blackColor,
+ // ),
+ // ),
+ Text(
+ "Please select the hospital you want to make an advance payment for.".needTranslation,
+ style: TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.w500,
+ color: AppColors.greyTextColor,
+ ),
+ ),
+ SizedBox(height: 16.h),
+ // TextInputWidget(
+ // labelText: LocaleKeys.search.tr(),
+ // hintText: "Search Hospital".tr(),
+ // controller: searchText,
+ // onChange: (value) {
+ // // appointmentsViewModel.filterHospitalListByString(value, regionalViewModel.selectedRegionId , regionalViewModel.selectedFacilityType ==
+ // // FacilitySelection.HMG.name);
+ // },
+ // isEnable: true,
+ // prefix: null,
+ // autoFocus: false,
+ // isBorderAllowed: false,
+ // keyboardType: TextInputType.text,
+ // isAllowLeadingIcon: true,
+ // selectionType: SelectionTypeEnum.search,
+ // padding: EdgeInsets.symmetric(
+ // vertical: ResponsiveExtension(10).h,
+ // horizontal: ResponsiveExtension(15).h,
+ // ),
+ // ),
+ // SizedBox(height: 24.h),
+ // TypeSelectionWidget(
+ // hmcCount: "0",
+ // hmgCount: "0",
+ // ),
+ // SizedBox(height: 21.h),
+ SizedBox(
+ height: MediaQuery.sizeOf(context).height * .4,
+ child: ListView.separated(
+ itemBuilder: (_, index) {
+ return HospitalListItemAdvancePayment(
+ hospitalModel: habibWalletVM.advancePaymentHospitals[index],
+ isLocationEnabled: false,
+ ).onPress(() {
+ habibWalletVM.setSelectedHospital(habibWalletVM.advancePaymentHospitals[index]);
+ Navigator.of(context).pop();
+ });
+ },
+ separatorBuilder: (_, __) => SizedBox(
+ height: 16.h,
+ ),
+ itemCount: habibWalletVM.advancePaymentHospitals.length),
+ )
+ ],
+ );
+ }
+}
diff --git a/lib/presentation/insurance/widgets/insurance_history.dart b/lib/presentation/insurance/widgets/insurance_history.dart
index 397cb63..de5581c 100644
--- a/lib/presentation/insurance/widgets/insurance_history.dart
+++ b/lib/presentation/insurance/widgets/insurance_history.dart
@@ -10,6 +10,7 @@ import 'package:hmg_patient_app_new/features/insurance/insurance_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/chip/app_custom_chip_widget.dart';
import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart';
import 'package:provider/provider.dart';
@@ -73,7 +74,7 @@ class InsuranceHistory extends StatelessWidget {
],
),
SizedBox(height: 8.h),
- "Haroon Amjad".toText16(weight: FontWeight.w600),
+ // "Haroon Amjad".toText16(weight: FontWeight.w600),
SizedBox(height: 8.h),
Row(
children: [
@@ -82,38 +83,11 @@ class InsuranceHistory extends StatelessWidget {
spacing: 4.h,
runSpacing: 4.h,
children: [
- Row(
- children: [
- CustomButton(
- text: "File No.: 3628599",
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.w500,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
- ),
- ],
+ AppCustomChipWidget(
+ labelText: "File No.: ${insuranceVM.patientInsuranceCardHistoryList[index].patientID}",
),
- Row(
- children: [
- CustomButton(
- text: insuranceVM.patientInsuranceCardHistoryList[index].createdOn!,
- // text: "test",
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.w500,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
- ),
- ],
+ AppCustomChipWidget(
+ labelText: insuranceVM.patientInsuranceCardHistoryList[index].createdOn!,
),
],
),
diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart
index 520bfec..0e14565 100644
--- a/lib/presentation/lab/lab_orders_page.dart
+++ b/lib/presentation/lab/lab_orders_page.dart
@@ -6,6 +6,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_staggered_animations/flutter_staggered_animations.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/extensions/string_extensions.dart';
+import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
@@ -13,6 +15,7 @@ import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart';
import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart';
+import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart';
import 'package:provider/provider.dart';
import 'collapsing_list_view.dart';
@@ -65,6 +68,20 @@ class _LabOrdersPageState extends State {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
+ SizedBox(height: 16.h),
+ CustomTabBar(
+ activeTextColor: Color(0xffED1C2B),
+ activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
+ tabs: [
+ CustomTabBarModel(null, "By Visit".needTranslation),
+ CustomTabBarModel(null, "By Test".needTranslation),
+ // CustomTabBarModel(null, "Completed".needTranslation),
+ ],
+ onTabChange: (index) {
+ // myAppointmentsViewModel.onTabChange(index);
+ },
+ ),
+ SizedBox(height: 16.h),
selectedFilterText!.isNotEmpty
? CustomChipWidget(
chipText: selectedFilterText!,
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 22de759..d5e5d5a 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -22,6 +22,7 @@ import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_mo
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart';
import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart';
+import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
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';
@@ -117,6 +118,7 @@ class _MedicalFilePageState extends State {
child: Padding(
padding: EdgeInsets.all(16.h),
child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -132,35 +134,19 @@ class _MedicalFilePageState extends State {
children: [
"${appState.getAuthenticatedUser()!.firstName} ${appState.getAuthenticatedUser()!.lastName}".toText18(isBold: true),
SizedBox(height: 4.h),
- Row(
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 4.h,
+ runSpacing: 4.h,
children: [
- CustomButton(
+ AppCustomChipWidget(
icon: AppAssets.file_icon,
- iconColor: AppColors.blackColor,
- iconSize: 12.h,
- text: "File no: ${appState.getAuthenticatedUser()!.patientId}",
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.normal,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
+ labelText: "File no: ${appState.getAuthenticatedUser()!.patientId}",
),
- SizedBox(width: 4.h),
- CustomButton(
- text: LocaleKeys.verified.tr(context: context),
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.normal,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
+ AppCustomChipWidget(
+ icon: AppAssets.checkmark_icon,
+ labelText: LocaleKeys.verified.tr(context: context),
+ iconColor: AppColors.successColor,
),
],
),
@@ -171,55 +157,21 @@ class _MedicalFilePageState extends State {
SizedBox(height: 16.h),
Divider(color: AppColors.dividerColor, height: 1.h),
SizedBox(height: 16.h),
- Row(
+ Wrap(
+ direction: Axis.horizontal,
+ spacing: 4.h,
+ runSpacing: 4.h,
children: [
- CustomButton(
- text: "${appState.getAuthenticatedUser()!.age} Years Old",
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.normal,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
+ AppCustomChipWidget(
+ labelText: "${appState.getAuthenticatedUser()!.age} Years Old",
),
- SizedBox(width: 4.h),
- CustomButton(
+ AppCustomChipWidget(
icon: AppAssets.blood_icon,
+ labelText: "Blood: ${appState.getUserBloodGroup}",
iconColor: AppColors.primaryRedColor,
- iconSize: 13.h,
- text: "Blood: ${appState.getUserBloodGroup}",
- onPressed: () {},
- backgroundColor: AppColors.greyColor,
- borderColor: AppColors.greyColor,
- textColor: AppColors.blackColor,
- fontSize: 10,
- fontWeight: FontWeight.normal,
- borderRadius: 12,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 30.h,
),
- // SizedBox(width: 4.h),
- // CustomButton(
- // icon: AppAssets.insurance_active_icon,
- // iconColor: AppColors.successColor,
- // iconSize: 13.h,
- // text: "Insurance Active",
- // onPressed: () {},
- // backgroundColor: AppColors.bgGreenColor.withOpacity(0.20),
- // borderColor: AppColors.bgGreenColor.withOpacity(0.0),
- // textColor: AppColors.blackColor,
- // fontSize: 10,
- // fontWeight: FontWeight.normal,
- // borderRadius: 12,
- // padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- // height: 30.h,
- // ),
],
),
- SizedBox(height: 8.h),
],
),
),
@@ -327,7 +279,7 @@ class _MedicalFilePageState extends State {
scrollDirection: Axis.horizontal,
padding: EdgeInsets.only(top: 16.h, left: 24.h, right: 24.h, bottom: 0.h),
shrinkWrap: true,
- itemCount: myAppointmentsVM.isMyAppointmentsLoading ? 5 : myAppointmentsVM.patientAppointmentsHistoryList.length,
+ itemCount: myAppointmentsVM.isMyAppointmentsLoading ? 5 : (myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty ? myAppointmentsVM.patientAppointmentsHistoryList.length : 1),
itemBuilder: (context, index) {
return AnimationConfiguration.staggeredList(
position: index,
@@ -345,14 +297,50 @@ class _MedicalFilePageState extends State {
onRescheduleTap: () {},
onAskDoctorTap: () {},
)
- : MedicalFileAppointmentCard(
- patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index],
- myAppointmentsViewModel: myAppointmentsViewModel,
- onRescheduleTap: () {
- openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]);
- },
- onAskDoctorTap: () {},
- ),
+ : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty
+ ? MedicalFileAppointmentCard(
+ patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index],
+ myAppointmentsViewModel: myAppointmentsViewModel,
+ onRescheduleTap: () {
+ openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]);
+ },
+ onAskDoctorTap: () {},
+ )
+ : Container(
+ width: MediaQuery.of(context).size.width - 48.h,
+ decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24, hasShadow: true),
+ child: Padding(
+ padding: EdgeInsets.all(12.h),
+ child: Column(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h),
+ SizedBox(height: 12.h),
+ "You do not have any appointments. Please book an appointment".needTranslation.toText12(isCenter: true),
+ SizedBox(height: 12.h),
+ CustomButton(
+ text: LocaleKeys.bookAppo.tr(context: context),
+ onPressed: () {
+ Navigator.of(context).push(
+ CustomPageRoute(
+ page: BookAppointmentPage(),
+ ),
+ );
+ },
+ backgroundColor: Color(0xffFEE9EA),
+ borderColor: Color(0xffFEE9EA),
+ textColor: Color(0xffED1C2B),
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ borderRadius: 12,
+ padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
+ height: 40,
+ icon: AppAssets.add_icon,
+ iconColor: AppColors.primaryRedColor,
+ ),
+ ],
+ ),
+ ),
+ ),
),
),
),
diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart
index a991ab8..a1a6f88 100644
--- a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart
+++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart
@@ -13,6 +13,7 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/appointments/appointment_details_page.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/chip/app_custom_chip_widget.dart';
import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart';
import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
@@ -30,20 +31,14 @@ class MedicalFileAppointmentCard extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- CustomButton(
- text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false),
- onPressed: () {},
- backgroundColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor,
- borderColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyLightColor : AppColors.secondaryLightRedColor,
- textColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor,
- fontSize: 12,
- fontWeight: FontWeight.w500,
- borderRadius: 12.h,
- padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
- height: 40.h,
+ AppCustomChipWidget(
+ richText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false).toText12().paddingSymmetrical(12.h, 0.h),
icon: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppAssets.appointment_calendar_icon : AppAssets.alarm_clock_icon,
iconColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor,
iconSize: 16.h,
+ backgroundColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor,
+ textColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor,
+ padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 8.h, right: 8.h),
).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading),
SizedBox(height: 16.h),
Container(
diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart
index 4610361..4328a58 100644
--- a/lib/presentation/profile_settings/profile_settings.dart
+++ b/lib/presentation/profile_settings/profile_settings.dart
@@ -100,13 +100,13 @@ class _ProfileSettingsState extends State {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.h, height: 40.h),
- "Al Habib Wallet".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded,
+ "Habib Wallet".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded,
Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward),
],
),
Spacer(),
Consumer(builder: (context, habibWalletVM, child) {
- return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, AppColors.whiteColor, 13.h, isExpanded: false)
+ return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, isExpanded: false)
.toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 24.h);
}),
CustomButton(
diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart
index 7df7dfb..81eb292 100644
--- a/lib/widgets/buttons/custom_button.dart
+++ b/lib/widgets/buttons/custom_button.dart
@@ -62,7 +62,7 @@ class CustomButton extends StatelessWidget {
children: [
if (icon != null)
Padding(
- padding: const EdgeInsets.only(right: 8.0),
+ padding: const EdgeInsets.only(right: 8.0, left: 8.0, bottom: 4.5),
child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconSize, height: iconSize),
),
Text(
diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart
index 85c13f2..b29f6e6 100644
--- a/lib/widgets/chip/app_custom_chip_widget.dart
+++ b/lib/widgets/chip/app_custom_chip_widget.dart
@@ -23,6 +23,7 @@ class AppCustomChipWidget extends StatelessWidget {
this.deleteIconSize = const Size(12, 12),
this.deleteIconColor = AppColors.textColor,
this.deleteIconHasColor = false,
+ this.padding = EdgeInsets.zero,
});
final String? labelText;
@@ -38,6 +39,7 @@ class AppCustomChipWidget extends StatelessWidget {
final bool iconHasColor;
final bool deleteIconHasColor;
final OutlinedBorder? shape;
+ final EdgeInsets? padding;
@override
Widget build(BuildContext context) {
@@ -50,7 +52,7 @@ class AppCustomChipWidget extends StatelessWidget {
color: Colors.transparent, // Crucially, set color to transparent
style: BorderStyle.none,
),
- borderRadius: BorderRadius.circular(8.0), // Apply a border radius of 16.0
+ borderRadius: BorderRadius.circular(10.0), // Apply a border radius of 16.0
),
),
child: icon.isNotEmpty
@@ -67,7 +69,8 @@ class AppCustomChipWidget extends StatelessWidget {
weight: FontWeight.w500,
letterSpacing: -0.64,
color: textColor),
- padding: EdgeInsets.all(0.0),
+ // padding: EdgeInsets.all(0.0),
+ padding: padding,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
labelPadding: EdgeInsets.only(
left: -4.h,
diff --git a/pubspec.yaml b/pubspec.yaml
index 5423904..ea41d43 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -80,7 +80,6 @@ dependencies:
path_provider: ^2.0.8
open_filex: ^4.7.0
flutter_swiper_view: ^1.1.8
- family_bottom_sheet: ^0.1.0
location: ^8.0.1
gms_check: ^1.0.4