From 7b94199d58a46d541708e4dd586cb5bb092f3418 Mon Sep 17 00:00:00 2001
From: Haroon Amjad <>
Date: Sun, 14 Sep 2025 01:33:49 +0300
Subject: [PATCH] Medical report implementation done, Book Appointment
implementation contd.
---
assets/images/svg/search_by_clinic_icon.svg | 5 +
assets/images/svg/search_by_doctor_icon.svg | 5 +
assets/images/svg/search_by_region_icon.svg | 5 +
lib/core/app_assets.dart | 3 +
lib/core/dependencies.dart | 8 +
lib/core/utils/utils.dart | 3 +-
.../book_appointments_view_model.dart | 17 ++
.../medical_file/medical_file_repo.dart | 62 +++++++
.../medical_file/medical_file_view_model.dart | 29 ++++
lib/main.dart | 7 +
.../appointment_payment_page.dart | 2 +-
.../book_appointment_page.dart | 159 ++++++++++++++++++
.../book_appointment/select_clinic_page.dart | 29 ++++
lib/presentation/home/navigation_screen.dart | 3 +-
.../home/widgets/small_service_card.dart | 18 ++
.../medical_file/medical_file_page.dart | 3 +-
.../medical_file/medical_reports_page.dart | 3 +
.../widgets/patient_medical_report_card.dart | 45 ++++-
18 files changed, 399 insertions(+), 7 deletions(-)
create mode 100644 assets/images/svg/search_by_clinic_icon.svg
create mode 100644 assets/images/svg/search_by_doctor_icon.svg
create mode 100644 assets/images/svg/search_by_region_icon.svg
create mode 100644 lib/presentation/book_appointment/book_appointment_page.dart
create mode 100644 lib/presentation/book_appointment/select_clinic_page.dart
diff --git a/assets/images/svg/search_by_clinic_icon.svg b/assets/images/svg/search_by_clinic_icon.svg
new file mode 100644
index 0000000..ce00f8c
--- /dev/null
+++ b/assets/images/svg/search_by_clinic_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/svg/search_by_doctor_icon.svg b/assets/images/svg/search_by_doctor_icon.svg
new file mode 100644
index 0000000..2ca5eb9
--- /dev/null
+++ b/assets/images/svg/search_by_doctor_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/images/svg/search_by_region_icon.svg b/assets/images/svg/search_by_region_icon.svg
new file mode 100644
index 0000000..00abe12
--- /dev/null
+++ b/assets/images/svg/search_by_region_icon.svg
@@ -0,0 +1,5 @@
+
diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart
index c6e6a3c..106a5ad 100644
--- a/lib/core/app_assets.dart
+++ b/lib/core/app_assets.dart
@@ -103,6 +103,9 @@ class AppAssets {
static const String all_medications_icon = '$svgBasePath/all_medications_icon.svg';
static const String allergy_info_icon = '$svgBasePath/allergy_info_icon.svg';
static const String vaccine_info_icon = '$svgBasePath/vaccine_info_icon.svg';
+ static const String search_by_clinic_icon = '$svgBasePath/search_by_clinic_icon.svg';
+ static const String search_by_doctor_icon = '$svgBasePath/search_by_doctor_icon.svg';
+ static const String search_by_region_icon = '$svgBasePath/search_by_region_icon.svg';
//bottom navigation//
static const String homeBottom = '$svgBasePath/home_bottom.svg';
diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart
index 3518abe..f86ec97 100644
--- a/lib/core/dependencies.dart
+++ b/lib/core/dependencies.dart
@@ -6,6 +6,7 @@ import 'package:hmg_patient_app_new/core/location_util.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_repo.dart';
import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart';
import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart';
+import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart';
import 'package:hmg_patient_app_new/features/common/common_repo.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
@@ -158,6 +159,13 @@ class AppDependencies {
),
);
+ getIt.registerLazySingleton(
+ () => BookAppointmentsViewModel(
+ bookAppointmentsRepo: getIt(),
+ errorHandlerService: getIt(),
+ ),
+ );
+
getIt.registerLazySingleton(
() => AuthenticationViewModel(
authenticationRepo: getIt(), cacheService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), localAuthService: getIt()),
diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart
index 90a810c..e228591 100644
--- a/lib/core/utils/utils.dart
+++ b/lib/core/utils/utils.dart
@@ -342,7 +342,8 @@ class Utils {
).center;
}
- static bool isVidaPlusProject(AppState appState, int projectID) {
+ static bool isVidaPlusProject(int projectID) {
+ AppState appState = getIt.get();
bool isVidaPlus = false;
for (var element in appState.vidaPlusProjectList) {
if (element.projectID == projectID) {
diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart
index e69de29..8f096dd 100644
--- a/lib/features/book_appointments/book_appointments_view_model.dart
+++ b/lib/features/book_appointments/book_appointments_view_model.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_repo.dart';
+import 'package:hmg_patient_app_new/services/error_handler_service.dart';
+
+class BookAppointmentsViewModel extends ChangeNotifier {
+ int selectedTabIndex = 0;
+
+ BookAppointmentsRepo bookAppointmentsRepo;
+ ErrorHandlerService errorHandlerService;
+
+ BookAppointmentsViewModel({required this.bookAppointmentsRepo, required this.errorHandlerService});
+
+ void onTabChanged(int index) {
+ selectedTabIndex = index;
+ notifyListeners();
+ }
+}
diff --git a/lib/features/medical_file/medical_file_repo.dart b/lib/features/medical_file/medical_file_repo.dart
index 6d30adc..affe564 100644
--- a/lib/features/medical_file/medical_file_repo.dart
+++ b/lib/features/medical_file/medical_file_repo.dart
@@ -3,6 +3,8 @@ 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/core/utils/date_util.dart';
+import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/patient_sickleave_response_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/patient_vaccine_response_model.dart';
@@ -18,6 +20,8 @@ abstract class MedicalFileRepo {
Future>> getPatientSickLeavePDF(PatientSickLeavesResponseModel patientSickLeavesResponseModel, AuthenticatedUser authenticatedUser);
Future>>> getPatientMedicalReportsList();
+
+ Future>> getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser);
}
class MedicalFileRepoImp implements MedicalFileRepo {
@@ -205,4 +209,62 @@ class MedicalFileRepoImp implements MedicalFileRepo {
return Left(UnknownFailure(e.toString()));
}
}
+
+ @override
+ Future> getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser) async {
+ Map mapDevice = {
+ "SetupID": patientMedicalReportResponseModel.setupId,
+ "PrintDate": patientMedicalReportResponseModel.requestDate!,
+ "ProcedureID": "05005009",
+ "Reporttype": "MEDICAL REPORT",
+ "stamp": patientMedicalReportResponseModel.requestDate!,
+ "To": authenticatedUser.emailAddress,
+ "DateofBirth": authenticatedUser.dateofBirth,
+ "PatientIditificationNum": authenticatedUser.patientIdentificationNo,
+ "PatientMobileNumber": authenticatedUser.mobileNumber,
+ "PatientName": "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}",
+ "ProjectName": patientMedicalReportResponseModel.projectName,
+ "ClinicName": patientMedicalReportResponseModel.clinicDescription,
+ "ProjectID": patientMedicalReportResponseModel.projectID,
+ "InvoiceNo": Utils.isVidaPlusProject(patientMedicalReportResponseModel.projectID!) ? patientMedicalReportResponseModel.invoiceNoVP : patientMedicalReportResponseModel.invoiceNo,
+ "InvoiceNo_VP": Utils.isVidaPlusProject(patientMedicalReportResponseModel.projectID!) ? patientMedicalReportResponseModel.invoiceNoVP : patientMedicalReportResponseModel.invoiceNo,
+ "PrintedByName": "${authenticatedUser.firstName!} ${authenticatedUser.lastName!}",
+ };
+
+ try {
+ GenericApiModel? apiResponse;
+ Failure? failure;
+ await apiClient.post(
+ GET_MEDICAL_REPORT_PDF,
+ body: mapDevice,
+ onFailure: (error, statusCode, {messageStatus, failureType}) {
+ failure = failureType;
+ },
+ onSuccess: (response, statusCode, {messageStatus, errorMessage}) {
+ try {
+ // final list = response['List_SickLeave'];
+ // if (list == null || list.isEmpty) {
+ // throw Exception("lab list is empty");
+ // }
+
+ // final vaccinesList = list.map((item) => PatientSickLeavesResponseModel.fromJson(item as Map)).toList().cast();
+
+ apiResponse = GenericApiModel(
+ messageStatus: messageStatus,
+ statusCode: statusCode,
+ errorMessage: null,
+ data: response["MedicalReportBase64"],
+ );
+ } 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 bcc7ed2..73167bb 100644
--- a/lib/features/medical_file/medical_file_view_model.dart
+++ b/lib/features/medical_file/medical_file_view_model.dart
@@ -26,6 +26,7 @@ class MedicalFileViewModel extends ChangeNotifier {
List patientMedicalReportCancelledList = [];
String patientSickLeavePDFBase64 = "";
+ String patientMedicalReportPDFBase64 = "";
int selectedMedicalReportsTabIndex = 0;
@@ -62,6 +63,7 @@ class MedicalFileViewModel extends ChangeNotifier {
setIsPatientSickLeaveListLoading(bool val) {
if (val) {
patientSickLeaveList.clear();
+ patientSickLeavePDFBase64 = "";
}
isPatientSickLeaveListLoading = val;
notifyListeners();
@@ -70,6 +72,7 @@ class MedicalFileViewModel extends ChangeNotifier {
setIsPatientMedicalReportsLoading(bool val) {
if (val) {
patientMedicalReportList.clear();
+ patientMedicalReportPDFBase64 = "";
}
isPatientMedicalReportsListLoading = val;
notifyListeners();
@@ -179,6 +182,7 @@ class MedicalFileViewModel extends ChangeNotifier {
patientMedicalReportReadyList = patientMedicalReportList.where((element) => element.status == 2).toList();
patientMedicalReportCancelledList = patientMedicalReportList.where((element) => element.status == 4).toList();
}
+ onMedicalReportTabChange(0);
isPatientMedicalReportsListLoading = false;
notifyListeners();
if (onSuccess != null) {
@@ -188,4 +192,29 @@ class MedicalFileViewModel extends ChangeNotifier {
},
);
}
+
+ Future getPatientMedicalReportPDF(PatientMedicalReportResponseModel patientMedicalReportResponseModel, AuthenticatedUser authenticatedUser,
+ {Function(dynamic)? onSuccess, Function(String)? onError}) async {
+ final result = await medicalFileRepo.getPatientMedicalReportPDF(patientMedicalReportResponseModel, authenticatedUser);
+
+ result.fold(
+ (failure) async => await errorHandlerService.handleError(
+ failure: failure,
+ onOkPressed: () {
+ onError!(failure.message);
+ },
+ ),
+ (apiResponse) {
+ if (apiResponse.messageStatus == 2) {
+ // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
+ } else if (apiResponse.messageStatus == 1) {
+ patientMedicalReportPDFBase64 = apiResponse.data!;
+ notifyListeners();
+ if (onSuccess != null) {
+ onSuccess(apiResponse);
+ }
+ }
+ },
+ );
+ }
}
diff --git a/lib/main.dart b/lib/main.dart
index 8c6e05b..901c529 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -9,6 +9,7 @@ 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/features/authentication/authentication_view_model.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/insurance/insurance_view_model.dart';
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart';
@@ -119,6 +120,12 @@ void main() async {
errorHandlerService: getIt(),
),
),
+ ChangeNotifierProvider(
+ create: (_) => BookAppointmentsViewModel(
+ bookAppointmentsRepo: getIt(),
+ errorHandlerService: getIt(),
+ ),
+ ),
ChangeNotifierProvider(
create: (_) => AuthenticationViewModel(
authenticationRepo: getIt(),
diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart
index baa2af3..a617647 100644
--- a/lib/presentation/appointments/appointment_payment_page.dart
+++ b/lib/presentation/appointments/appointment_payment_page.dart
@@ -370,7 +370,7 @@ class _AppointmentPaymentPageState extends State {
onSuccess: (value) async {
print(value);
await myAppointmentsViewModel.addAdvanceNumberRequest(
- advanceNumber: Utils.isVidaPlusProject(appState, widget.patientAppointmentHistoryResponseModel.projectID)
+ advanceNumber: Utils.isVidaPlusProject(widget.patientAppointmentHistoryResponseModel.projectID)
? value.data['OnlineCheckInAppointments'][0]['AdvanceNumber_VP'].toString()
: value.data['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
paymentReference: payfortViewModel.payfortCheckPaymentStatusResponseModel!.fortId!,
diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart
new file mode 100644
index 0000000..0f9a325
--- /dev/null
+++ b/lib/presentation/book_appointment/book_appointment_page.dart
@@ -0,0 +1,159 @@
+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/dependencies.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/book_appointments/book_appointments_view_model.dart';
+import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
+import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.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/custom_tab_bar.dart';
+import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
+import 'package:provider/provider.dart';
+
+class BookAppointmentPage extends StatefulWidget {
+ const BookAppointmentPage({super.key});
+
+ @override
+ State createState() => _BookAppointmentPageState();
+}
+
+class _BookAppointmentPageState extends State {
+ late AppState appState;
+
+ @override
+ Widget build(BuildContext context) {
+ appState = getIt.get();
+ return Scaffold(
+ backgroundColor: AppColors.bgScaffoldColor,
+ body: CollapsingListView(
+ title: LocaleKeys.bookAppo.tr(context: context),
+ child: SingleChildScrollView(
+ child: Consumer(builder: (context, bookAppointmentsVM, child) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(height: 16.h),
+ CustomTabBar(
+ activeTextColor: Color(0xffED1C2B),
+ activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1),
+ tabs: [
+ CustomTabBarModel(null, "General".needTranslation),
+ CustomTabBarModel(null, "LiveCare".needTranslation),
+ ],
+ onTabChange: (index) {
+ bookAppointmentsVM.onTabChanged(index);
+ },
+ ).paddingSymmetrical(24.h, 0.h),
+ SizedBox(height: 24.h),
+ getSelectedTabData(bookAppointmentsVM.selectedTabIndex),
+ ],
+ );
+ }),
+ ),
+ ),
+ );
+ }
+
+ Widget getSelectedTabData(int index) {
+ switch (index) {
+ case 0:
+ return Column(
+ children: [
+ 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: [
+ Row(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 12.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "Search By Clinic".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500),
+ "Tap to select clinic".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500),
+ ],
+ ),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
+ ],
+ ).onPress(() {
+ Navigator.of(context).push(
+ FadePage(
+ page: SelectClinicPage(),
+ ),
+ );
+ }),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
+ SizedBox(height: 16.h),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 12.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "Search By Doctor".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500),
+ "Tap to select".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500),
+ ],
+ ),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
+ ],
+ ).onPress(() {}),
+ SizedBox(height: 16.h),
+ Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h),
+ SizedBox(height: 16.h),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ children: [
+ Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h),
+ SizedBox(width: 12.h),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "Search By Region".needTranslation.toText14(color: AppColors.textColor, weight: FontWeight.w500),
+ "Central Region".needTranslation.toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500),
+ ],
+ ),
+ ],
+ ),
+ Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 15.h, height: 15.h),
+ ],
+ ).onPress(() {}),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ).paddingSymmetrical(24.h, 0.h);
+ default:
+ SizedBox.shrink();
+ }
+ return Container();
+ }
+}
diff --git a/lib/presentation/book_appointment/select_clinic_page.dart b/lib/presentation/book_appointment/select_clinic_page.dart
new file mode 100644
index 0000000..496f7d5
--- /dev/null
+++ b/lib/presentation/book_appointment/select_clinic_page.dart
@@ -0,0 +1,29 @@
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.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';
+
+class SelectClinicPage extends StatefulWidget {
+ const SelectClinicPage({super.key});
+
+ @override
+ State createState() => _SelectClinicPageState();
+}
+
+class _SelectClinicPageState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: AppColors.bgScaffoldColor,
+ body: CollapsingListView(
+ title: LocaleKeys.selectClinic.tr(context: context),
+ child: SingleChildScrollView(
+ child: Column(
+ children: [],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/home/navigation_screen.dart b/lib/presentation/home/navigation_screen.dart
index 152bbd2..bdce393 100644
--- a/lib/presentation/home/navigation_screen.dart
+++ b/lib/presentation/home/navigation_screen.dart
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
+import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart';
import 'package:hmg_patient_app_new/presentation/home/landing_page.dart';
import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart';
import 'package:hmg_patient_app_new/widgets/bottom_navigation/bottom_navigation.dart';
@@ -23,7 +24,7 @@ class _LandingNavigationState extends State {
children: [
const LandingPage(),
MedicalFilePage(),
- const LandingPage(),
+ const BookAppointmentPage(),
const LandingPage(),
const LandingPage(),
],
diff --git a/lib/presentation/home/widgets/small_service_card.dart b/lib/presentation/home/widgets/small_service_card.dart
index f988e18..6e1c588 100644
--- a/lib/presentation/home/widgets/small_service_card.dart
+++ b/lib/presentation/home/widgets/small_service_card.dart
@@ -2,8 +2,10 @@ import 'package:flutter/material.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/presentation/appointments/my_doctors_page.dart';
import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart';
+import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart';
import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart';
import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart';
@@ -85,6 +87,22 @@ class SmallServiceCard extends StatelessWidget {
),
);
break;
+
+ case "my_doctors":
+ Navigator.of(context).push(
+ FadePage(
+ page: MyDoctorsPage(),
+ ),
+ );
+ break;
+
+ case "sick_leaves":
+ Navigator.of(context).push(
+ FadePage(
+ page: PatientSickleavesListPage(),
+ ),
+ );
+ break;
default:
// Handle unknown service
break;
diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart
index 22aff4d..48193e8 100644
--- a/lib/presentation/medical_file/medical_file_page.dart
+++ b/lib/presentation/medical_file/medical_file_page.dart
@@ -24,6 +24,7 @@ import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.d
import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart';
import 'package:hmg_patient_app_new/presentation/lab/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';
import 'package:hmg_patient_app_new/presentation/medical_file/vaccine_list_page.dart';
import 'package:hmg_patient_app_new/presentation/medical_file/widgets/lab_rad_card.dart';
import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart';
@@ -700,7 +701,7 @@ class _MedicalFilePageState extends State {
).onPress(() {
Navigator.of(context).push(
FadePage(
- page: VaccineListPage(),
+ page: PatientSickleavesListPage(),
),
);
}),
diff --git a/lib/presentation/medical_file/medical_reports_page.dart b/lib/presentation/medical_file/medical_reports_page.dart
index c30f9af..ea3c34d 100644
--- a/lib/presentation/medical_file/medical_reports_page.dart
+++ b/lib/presentation/medical_file/medical_reports_page.dart
@@ -57,6 +57,7 @@ class _MedicalReportsPageState extends State {
return medicalFileViewModel.isPatientMedicalReportsListLoading
? PatientMedicalReportCard(
patientMedicalReportResponseModel: PatientMedicalReportResponseModel(),
+ medicalFileViewModel: medicalFileVM,
isLoading: true,
).paddingSymmetrical(24.h, 0.h)
: AnimationConfiguration.staggeredList(
@@ -71,6 +72,8 @@ class _MedicalReportsPageState extends State {
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true),
child: PatientMedicalReportCard(
patientMedicalReportResponseModel: medicalFileVM.patientMedicalReportList[index],
+ medicalFileViewModel: medicalFileVM,
+
isLoading: false,
),
).paddingSymmetrical(24.h, 0.h),
diff --git a/lib/presentation/medical_file/widgets/patient_medical_report_card.dart b/lib/presentation/medical_file/widgets/patient_medical_report_card.dart
index 3f890e6..eb1730c 100644
--- a/lib/presentation/medical_file/widgets/patient_medical_report_card.dart
+++ b/lib/presentation/medical_file/widgets/patient_medical_report_card.dart
@@ -1,25 +1,35 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.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/dependencies.dart';
import 'package:hmg_patient_app_new/core/utils/date_util.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/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_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/common_bottom_sheet.dart';
+import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
+import 'package:open_filex/open_filex.dart';
+import 'package:share_plus/share_plus.dart';
class PatientMedicalReportCard extends StatelessWidget {
- PatientMedicalReportCard({super.key, required this.patientMedicalReportResponseModel, this.isLoading = false});
+ PatientMedicalReportCard({super.key, required this.patientMedicalReportResponseModel, required this.medicalFileViewModel, this.isLoading = false});
PatientMedicalReportResponseModel patientMedicalReportResponseModel;
+ MedicalFileViewModel medicalFileViewModel;
bool isLoading = true;
@override
Widget build(BuildContext context) {
+ AppState _appState = getIt.get();
return Container(
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
color: AppColors.whiteColor,
@@ -78,7 +88,9 @@ class PatientMedicalReportCard extends StatelessWidget {
Expanded(
child: CustomButton(
text: "Share",
- onPressed: () {},
+ onPressed: () {
+ getMedicalReportPDF(true, context, _appState);
+ },
backgroundColor: AppColors.secondaryLightRedColor,
borderColor: AppColors.secondaryLightRedColor,
textColor: AppColors.primaryRedColor,
@@ -95,7 +107,9 @@ class PatientMedicalReportCard extends StatelessWidget {
Expanded(
child: CustomButton(
text: "Download",
- onPressed: () {},
+ onPressed: () async {
+ getMedicalReportPDF(false, context, _appState);
+ },
backgroundColor: AppColors.secondaryLightRedColor,
borderColor: AppColors.secondaryLightRedColor,
textColor: AppColors.primaryRedColor,
@@ -117,4 +131,29 @@ class PatientMedicalReportCard extends StatelessWidget {
),
);
}
+
+ void getMedicalReportPDF(bool isShare, BuildContext context, AppState _appState) async {
+ LoaderBottomSheet.showLoader();
+ await medicalFileViewModel.getPatientMedicalReportPDF(patientMedicalReportResponseModel, _appState.getAuthenticatedUser()!).then((val) async {
+ LoaderBottomSheet.hideLoader();
+ if (medicalFileViewModel.patientMedicalReportPDFBase64.isNotEmpty) {
+ String path = await Utils.createFileFromString(medicalFileViewModel.patientMedicalReportPDFBase64, "pdf");
+ if (isShare) {
+ Share.shareXFiles([XFile(path)], text: "Medical Report");
+ } else {
+ try {
+ OpenFilex.open(path);
+ } catch (ex) {
+ showCommonBottomSheetWithoutHeight(
+ context,
+ child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation),
+ callBackFunc: () {},
+ isFullScreen: false,
+ isCloseButtonVisible: true,
+ );
+ }
+ }
+ }
+ });
+ }
}