request medical report implementation contd.
							parent
							
								
									2de02102c2
								
							
						
					
					
						commit
						8bb0e495cc
					
				| @ -1,94 +0,0 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_staggered_animations/flutter_staggered_animations.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/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/widgets/appbar/collapsing_list_view.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_medical_report_card.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| 
 | ||||
| class MedicalReportsPage extends StatefulWidget { | ||||
|   const MedicalReportsPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<MedicalReportsPage> createState() => _MedicalReportsPageState(); | ||||
| } | ||||
| 
 | ||||
| class _MedicalReportsPageState extends State<MedicalReportsPage> { | ||||
|   late MedicalFileViewModel medicalFileViewModel; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     medicalFileViewModel = Provider.of<MedicalFileViewModel>(context, listen: false); | ||||
|     return Scaffold( | ||||
|       backgroundColor: AppColors.bgScaffoldColor, | ||||
|       body: CollapsingListView( | ||||
|         title: "Medical Reports".needTranslation, | ||||
|         child: SingleChildScrollView( | ||||
|           child: Column( | ||||
|             children: [ | ||||
|               SizedBox(height: 16.h), | ||||
|               CustomTabBar( | ||||
|                 activeTextColor: Color(0xffED1C2B), | ||||
|                 activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), | ||||
|                 tabs: [ | ||||
|                   CustomTabBarModel(null, "Requested".needTranslation), | ||||
|                   CustomTabBarModel(null, "Ready".needTranslation), | ||||
|                   CustomTabBarModel(null, "Cancelled".needTranslation), | ||||
|                 ], | ||||
|                 onTabChange: (index) { | ||||
|                   medicalFileViewModel.onMedicalReportTabChange(index); | ||||
|                 }, | ||||
|               ).paddingSymmetrical(24.h, 0.h), | ||||
|               Consumer<MedicalFileViewModel>(builder: (context, medicalFileVM, child) { | ||||
|                 return ListView.separated( | ||||
|                   padding: EdgeInsets.only(top: 24.h), | ||||
|                   shrinkWrap: true, | ||||
|                   physics: NeverScrollableScrollPhysics(), | ||||
|                   itemCount: medicalFileViewModel.isPatientMedicalReportsListLoading ? 3 : medicalFileViewModel.patientMedicalReportList.length, | ||||
|                   // medicalFileViewModel.patientMedicalReportList.isNotEmpty | ||||
|                   //         ? medicalFileViewModel.patientMedicalReportList.length | ||||
|                   //         : 1, | ||||
|                   itemBuilder: (context, index) { | ||||
|                     return medicalFileViewModel.isPatientMedicalReportsListLoading | ||||
|                         ? PatientMedicalReportCard( | ||||
|                             patientMedicalReportResponseModel: PatientMedicalReportResponseModel(), | ||||
|                             medicalFileViewModel: medicalFileVM, | ||||
|                             isLoading: true, | ||||
|                           ).paddingSymmetrical(24.h, 0.h) | ||||
|                         : AnimationConfiguration.staggeredList( | ||||
|                             position: index, | ||||
|                             duration: const Duration(milliseconds: 500), | ||||
|                             child: SlideAnimation( | ||||
|                               verticalOffset: 100.0, | ||||
|                               child: FadeInAnimation( | ||||
|                                 child: AnimatedContainer( | ||||
|                                   duration: Duration(milliseconds: 300), | ||||
|                                   curve: Curves.easeInOut, | ||||
|                                   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), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ); | ||||
|                   }, | ||||
|                   separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), | ||||
|                 ); | ||||
|               }), | ||||
|               SizedBox(height: 24.h), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,61 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_staggered_animations/flutter_staggered_animations.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/medical_file/medical_file_view_model.dart'; | ||||
| import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_card.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| 
 | ||||
| class MedicalReportRequestPage extends StatelessWidget { | ||||
|   MedicalReportRequestPage({super.key}); | ||||
| 
 | ||||
|   late MedicalFileViewModel medicalFileViewModel; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     medicalFileViewModel = Provider.of<MedicalFileViewModel>(context, listen: false); | ||||
|     return CollapsingListView( | ||||
|       title: "Medical Reports".needTranslation, | ||||
|       isClose: true, | ||||
|       child: Column( | ||||
|         children: [ | ||||
|           ListView.separated( | ||||
|             padding: EdgeInsets.only(top: 24.h), | ||||
|             shrinkWrap: true, | ||||
|             physics: NeverScrollableScrollPhysics(), | ||||
|             itemCount: medicalFileViewModel.patientMedicalReportAppointmentHistoryList.length, | ||||
|             itemBuilder: (context, index) { | ||||
|               return AnimationConfiguration.staggeredList( | ||||
|                 position: index, | ||||
|                 duration: const Duration(milliseconds: 500), | ||||
|                 child: SlideAnimation( | ||||
|                   verticalOffset: 100.0, | ||||
|                   child: FadeInAnimation( | ||||
|                     child: AnimatedContainer( | ||||
|                       duration: Duration(milliseconds: 300), | ||||
|                       curve: Curves.easeInOut, | ||||
|                       decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), | ||||
|                       child: AppointmentCard( | ||||
|                         patientAppointmentHistoryResponseModel: medicalFileViewModel.patientMedicalReportAppointmentHistoryList[index], | ||||
|                         myAppointmentsViewModel: Provider.of<MyAppointmentsViewModel>(context, listen: false), | ||||
|                         medicalFileViewModel: medicalFileViewModel, | ||||
|                         isLoading: false, | ||||
|                         isFromHomePage: false, | ||||
|                         isFromMedicalReport: true, | ||||
|                       ), | ||||
|                     ).paddingSymmetrical(24.h, 0.h), | ||||
|                   ), | ||||
|                 ), | ||||
|               ); | ||||
|             }, | ||||
|             separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,176 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; | ||||
| import 'package:hmg_patient_app_new/core/app_assets.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||||
| import 'package:hmg_patient_app_new/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/presentation/medical_report/medical_report_request_page.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/medical_report/widgets/patient_medical_report_card.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/custom_tab_bar.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| 
 | ||||
| class MedicalReportsPage extends StatefulWidget { | ||||
|   const MedicalReportsPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<MedicalReportsPage> createState() => _MedicalReportsPageState(); | ||||
| } | ||||
| 
 | ||||
| class _MedicalReportsPageState extends State<MedicalReportsPage> { | ||||
|   late MedicalFileViewModel medicalFileViewModel; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     medicalFileViewModel = Provider.of<MedicalFileViewModel>(context, listen: false); | ||||
|     return Scaffold( | ||||
|       backgroundColor: AppColors.bgScaffoldColor, | ||||
|       body: Column( | ||||
|         children: [ | ||||
|           Expanded( | ||||
|             child: CollapsingListView( | ||||
|               title: "Medical Reports".needTranslation, | ||||
|               child: SingleChildScrollView( | ||||
|                 child: Column( | ||||
|                   children: [ | ||||
|                     SizedBox(height: 16.h), | ||||
|                     CustomTabBar( | ||||
|                       activeTextColor: Color(0xffED1C2B), | ||||
|                       activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), | ||||
|                       tabs: [ | ||||
|                         CustomTabBarModel(null, "Requested".needTranslation), | ||||
|                         CustomTabBarModel(null, "Ready".needTranslation), | ||||
|                         CustomTabBarModel(null, "Cancelled".needTranslation), | ||||
|                       ], | ||||
|                       onTabChange: (index) { | ||||
|                         medicalFileViewModel.onMedicalReportTabChange(index); | ||||
|                       }, | ||||
|                     ).paddingSymmetrical(24.h, 0.h), | ||||
|                     Consumer<MedicalFileViewModel>(builder: (context, medicalFileVM, child) { | ||||
|                       return ListView.separated( | ||||
|                         padding: EdgeInsets.only(top: 24.h), | ||||
|                         shrinkWrap: true, | ||||
|                         physics: NeverScrollableScrollPhysics(), | ||||
|                         itemCount: medicalFileViewModel.isPatientMedicalReportsListLoading | ||||
|                             ? 3 | ||||
|                             : medicalFileViewModel.patientMedicalReportList.isNotEmpty | ||||
|                                 ? medicalFileViewModel.patientMedicalReportList.length | ||||
|                                 : 1, | ||||
|                         itemBuilder: (context, index) { | ||||
|                           return medicalFileViewModel.isPatientMedicalReportsListLoading | ||||
|                               ? PatientMedicalReportCard( | ||||
|                                   patientMedicalReportResponseModel: PatientMedicalReportResponseModel(), | ||||
|                                   medicalFileViewModel: medicalFileVM, | ||||
|                                   isLoading: true, | ||||
|                                 ).paddingSymmetrical(24.h, 0.h) | ||||
|                               : medicalFileViewModel.patientMedicalReportList.isNotEmpty | ||||
|                                   ? AnimationConfiguration.staggeredList( | ||||
|                                       position: index, | ||||
|                                       duration: const Duration(milliseconds: 500), | ||||
|                                       child: SlideAnimation( | ||||
|                                         verticalOffset: 100.0, | ||||
|                                         child: FadeInAnimation( | ||||
|                                           child: AnimatedContainer( | ||||
|                                             duration: Duration(milliseconds: 300), | ||||
|                                             curve: Curves.easeInOut, | ||||
|                                             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), | ||||
|                                         ), | ||||
|                                       ), | ||||
|                                     ) | ||||
|                                   : Utils.getNoDataWidget(context, noDataText: "You don't have any medical reports yet.".needTranslation).paddingSymmetrical(24.h, 0.h); | ||||
|                         }, | ||||
|                         separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), | ||||
|                       ); | ||||
|                     }), | ||||
|                     SizedBox(height: 24.h), | ||||
|                   ], | ||||
|                 ), | ||||
|               ), | ||||
|             ), | ||||
|           ), | ||||
|           Container( | ||||
|             decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||
|               color: AppColors.whiteColor, | ||||
|               borderRadius: 24.h, | ||||
|               hasShadow: true, | ||||
|             ), | ||||
|             child: CustomButton( | ||||
|               text: "Request medical report".needTranslation, | ||||
|               onPressed: () async { | ||||
|                 LoaderBottomSheet.showLoader(); | ||||
|                 await medicalFileViewModel.getPatientMedicalReportAppointmentsList(onSuccess: (val) async { | ||||
|                   LoaderBottomSheet.hideLoader(); | ||||
|                   bool? value = await Navigator.of(context).push( | ||||
|                     CustomPageRoute( | ||||
|                       page: MedicalReportRequestPage(), | ||||
|                       fullScreenDialog: true, | ||||
|                       direction: AxisDirection.down, | ||||
|                     ), | ||||
|                   ); | ||||
|                   if (value != null) { | ||||
|                     showConfirmRequestMedicalReportBottomSheet(); | ||||
|                   } | ||||
|                 }, onError: (err) { | ||||
|                   LoaderBottomSheet.hideLoader(); | ||||
|                   showCommonBottomSheetWithoutHeight( | ||||
|                     context, | ||||
|                     child: Utils.getErrorWidget(loadingText: "You do not have any appointments to request a medical report.".needTranslation), | ||||
|                     callBackFunc: () {}, | ||||
|                     isFullScreen: false, | ||||
|                     isCloseButtonVisible: true, | ||||
|                   ); | ||||
|                 }); | ||||
|               }, | ||||
|               backgroundColor: AppColors.primaryRedColor, | ||||
|               borderColor: AppColors.primaryRedColor, | ||||
|               textColor: AppColors.whiteColor, | ||||
|               fontSize: 16, | ||||
|               fontWeight: FontWeight.w500, | ||||
|               borderRadius: 12, | ||||
|               padding: EdgeInsets.fromLTRB(10, 0, 10, 0), | ||||
|               height: 45.h, | ||||
|               icon: AppAssets.requests, | ||||
|               iconColor: AppColors.whiteColor, | ||||
|               iconSize: 20.h, | ||||
|             ).paddingSymmetrical(24.h, 24.h), | ||||
|           ), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   showConfirmRequestMedicalReportBottomSheet() { | ||||
|     showCommonBottomSheetWithoutHeight( | ||||
|       title: LocaleKeys.notice.tr(context: context), | ||||
|       context, | ||||
|       child: Utils.getWarningWidget( | ||||
|           loadingText: "Are you sure you want to request a medical report for this appointment?".needTranslation, | ||||
|           isShowActionButtons: true, | ||||
|           onCancelTap: () { | ||||
|             Navigator.pop(context); | ||||
|           }, | ||||
|           onConfirmTap: () async { | ||||
|             Navigator.pop(context); | ||||
|           }), | ||||
|       callBackFunc: () {}, | ||||
|       isFullScreen: false, | ||||
|       isCloseButtonVisible: true, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Haroon Amjad
						Haroon Amjad