bottom sheets added of region facitlity and hospital.
							parent
							
								
									f15018b0e8
								
							
						
					
					
						commit
						9c2dd721b4
					
				| @ -0,0 +1,8 @@ | |||||||
|  | enum FacilitySelection{ | ||||||
|  | ALL('ALL'), | ||||||
|  | HMG('hmg'), | ||||||
|  | HMC('hmc'); | ||||||
|  | 
 | ||||||
|  | final String value; | ||||||
|  | const FacilitySelection(this.value); | ||||||
|  | } | ||||||
| @ -0,0 +1,88 @@ | |||||||
|  | import 'package:flutter/material.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/theme/colors.dart' show AppColors; | ||||||
|  | import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||||
|  | 
 | ||||||
|  | class FacilitySelectionItem extends StatelessWidget { | ||||||
|  |   final String svgPath; | ||||||
|  |   final String title; | ||||||
|  |   final String subTitle; | ||||||
|  | 
 | ||||||
|  |   const FacilitySelectionItem( | ||||||
|  |       {super.key, | ||||||
|  |       required this.svgPath, | ||||||
|  |       required this.subTitle, | ||||||
|  |       required this.title}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Container( | ||||||
|  |       decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||||
|  |         color: AppColors.whiteColor, | ||||||
|  |         borderRadius: 20.h, | ||||||
|  |         hasShadow: false, | ||||||
|  |       ), | ||||||
|  |       child: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.start, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |       Utils.buildSvgWithAssets( | ||||||
|  |       icon:  svgPath, | ||||||
|  |         width: 32, | ||||||
|  |         height: 32, | ||||||
|  |         fit: BoxFit.contain, | ||||||
|  |       ), | ||||||
|  |           SizedBox(height: 16,), | ||||||
|  |           Row( | ||||||
|  |             mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |             children: [ | ||||||
|  |               info, | ||||||
|  |               Utils.buildSvgWithAssets( | ||||||
|  |                 icon: AppAssets.forward_arrow_icon, | ||||||
|  |                 iconColor: AppColors.blackColor, | ||||||
|  |                 width: 18, | ||||||
|  |                 height: 13, | ||||||
|  |                 fit: BoxFit.contain, | ||||||
|  |               ), | ||||||
|  |             ], | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ).paddingAll(16.h), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  | 
 | ||||||
|  |  Widget get info => Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.start, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |           Align( | ||||||
|  |             alignment: Alignment.centerLeft, | ||||||
|  |             child: Text( | ||||||
|  |               title, | ||||||
|  |               style: TextStyle( | ||||||
|  |                 fontSize: 16.h, | ||||||
|  |                 fontWeight: FontWeight.w600, | ||||||
|  |                 color: AppColors.blackColor, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           Align( | ||||||
|  |             alignment: Alignment.centerLeft, | ||||||
|  |             child: Text( | ||||||
|  |               subTitle, | ||||||
|  |               style: TextStyle( | ||||||
|  |                 fontSize: 12.h, | ||||||
|  |                 fontWeight: FontWeight.w500, | ||||||
|  |                 color: AppColors.greyTextColor, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ); | ||||||
|  | } | ||||||
| @ -0,0 +1,79 @@ | |||||||
|  | import 'package:easy_localization/easy_localization.dart' | ||||||
|  |     show tr, StringTranslateExtension; | ||||||
|  | import 'package:flutter/cupertino.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/extensions/string_extensions.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/extensions/widget_extensions.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' | ||||||
|  |     show MyAppointmentsViewModel; | ||||||
|  | import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/presentation/appointments/widgets/faculity_selection/facility_selection_item.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||||
|  | import 'package:provider/provider.dart' show Provider; | ||||||
|  | 
 | ||||||
|  | class FacilityTypeSelectionWidget extends StatelessWidget { | ||||||
|  |   late MyAppointmentsViewModel myAppointmentsViewModel; | ||||||
|  |   late AppointmentViaRegionViewmodel regionalViewModel; | ||||||
|  |   final String selectedRegion; | ||||||
|  | 
 | ||||||
|  |   FacilityTypeSelectionWidget({super.key, required this.selectedRegion}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     myAppointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context); | ||||||
|  |     regionalViewModel = Provider.of<AppointmentViaRegionViewmodel>(context); | ||||||
|  |     return Column( | ||||||
|  |       crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |       children: [ | ||||||
|  |         Text( | ||||||
|  |           LocaleKeys.selectFacility.tr(), | ||||||
|  |           style: TextStyle( | ||||||
|  |             fontSize: 21, | ||||||
|  |             fontWeight: FontWeight.w600, | ||||||
|  |             color: AppColors.blackColor, | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |         Text( | ||||||
|  |           LocaleKeys.selectFacilitiesSubTitle, | ||||||
|  |           style: TextStyle( | ||||||
|  |             fontSize: 16, | ||||||
|  |             fontWeight: FontWeight.w500, | ||||||
|  |             color: AppColors.greyTextColor, | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |         SizedBox(height: 24.h), | ||||||
|  |         FacilitySelectionItem( | ||||||
|  |           svgPath: AppAssets.hmg, | ||||||
|  |           title: "HMG".needTranslation, | ||||||
|  |           subTitle: LocaleKeys.hospitalsWithCount.tr(namedArgs: { | ||||||
|  |             'count': | ||||||
|  |                 "${myAppointmentsViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmgSize ?? 0}" | ||||||
|  |           }), | ||||||
|  |         ).onPress( | ||||||
|  |           () { | ||||||
|  |             regionalViewModel.setFacility(FacilitySelection.HMG.name); | ||||||
|  |             regionalViewModel.setBottomSheetState( | ||||||
|  |                 AppointmentViaRegionState.HOSPITAL_SELECTION); | ||||||
|  |           }, | ||||||
|  |         ), | ||||||
|  |         SizedBox(height: 16.h), | ||||||
|  |         FacilitySelectionItem( | ||||||
|  |             svgPath: AppAssets.hmc, | ||||||
|  |             title: "HMC".needTranslation, | ||||||
|  |             subTitle: LocaleKeys.medicalCentersWithCount.tr(namedArgs: { | ||||||
|  |               'count': | ||||||
|  |                   "${myAppointmentsViewModel.hospitalList?.registeredDoctorMap?[selectedRegion]?.hmcSize ?? 0}" | ||||||
|  |             })).onPress( | ||||||
|  |           () { | ||||||
|  |             regionalViewModel.setFacility(FacilitySelection.HMC.name); | ||||||
|  |             regionalViewModel.setBottomSheetState( | ||||||
|  |                 AppointmentViaRegionState.HOSPITAL_SELECTION); | ||||||
|  |           }, | ||||||
|  |         ), | ||||||
|  |       ], | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,109 @@ | |||||||
|  | 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/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/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 HospitalBottomSheetBody extends StatelessWidget { | ||||||
|  |   late MyAppointmentsViewModel appointmentsViewModel; | ||||||
|  |   late AppointmentViaRegionViewmodel regionalViewModel; | ||||||
|  |   final TextEditingController searchText = TextEditingController(); | ||||||
|  | 
 | ||||||
|  |   HospitalBottomSheetBody({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     appointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context); | ||||||
|  |     regionalViewModel = Provider.of<AppointmentViaRegionViewmodel>(context); | ||||||
|  |     return Column( | ||||||
|  |       crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |       children: [ | ||||||
|  |         Text( | ||||||
|  |           LocaleKeys.selectHospital.tr(), | ||||||
|  |           style: TextStyle( | ||||||
|  |             fontSize: 21, | ||||||
|  |             fontWeight: FontWeight.w600, | ||||||
|  |             color: AppColors.blackColor, | ||||||
|  |           ), | ||||||
|  |         ), | ||||||
|  |         Text( | ||||||
|  |           LocaleKeys.selectHospitalSubTitle.tr(), | ||||||
|  |           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) => HospitalListItem( | ||||||
|  |                     hospitalData: regionalViewModel.selectedFacilityType == | ||||||
|  |                             FacilitySelection.HMG.name | ||||||
|  |                         ? appointmentsViewModel | ||||||
|  |                             .filteredHospitalList! | ||||||
|  |                             .registeredDoctorMap![ | ||||||
|  |                                 regionalViewModel.selectedRegionId!]! | ||||||
|  |                             .hmgDoctorList![index] | ||||||
|  |                         : appointmentsViewModel | ||||||
|  |                             .filteredHospitalList | ||||||
|  |                             ?.registeredDoctorMap?[ | ||||||
|  |                                 regionalViewModel.selectedRegionId!] | ||||||
|  |                             ?.hmcDoctorList?[index], | ||||||
|  |                     isLocationEnabled:  appointmentsViewModel.getLocationStatus(), | ||||||
|  |                   ), | ||||||
|  |               separatorBuilder: (_, __) => SizedBox( | ||||||
|  |                     height: 16.h, | ||||||
|  |                   ), | ||||||
|  |               itemCount: (regionalViewModel.selectedFacilityType == | ||||||
|  |                               FacilitySelection.HMG.name | ||||||
|  |                           ? (appointmentsViewModel.filteredHospitalList?.registeredDoctorMap?[ | ||||||
|  |                                   regionalViewModel.selectedRegionId]?.hmgDoctorList) | ||||||
|  |                           : (appointmentsViewModel | ||||||
|  |                               .filteredHospitalList | ||||||
|  |                               ?.registeredDoctorMap?[ | ||||||
|  |                                   regionalViewModel.selectedRegionId]?.hmcDoctorList))?.length ?? | ||||||
|  |                   0), | ||||||
|  |         ) | ||||||
|  |       ], | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,113 @@ | |||||||
|  | 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/string_extensions.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.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'; | ||||||
|  | import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; | ||||||
|  | 
 | ||||||
|  | class HospitalListItem extends StatelessWidget { | ||||||
|  |   final PatientDoctorAppointmentList? hospitalData; | ||||||
|  |   final bool isLocationEnabled; | ||||||
|  | 
 | ||||||
|  |   late AppState appState; | ||||||
|  | 
 | ||||||
|  |   HospitalListItem( | ||||||
|  |       {super.key, required this.hospitalData, required this.isLocationEnabled}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     appState = getIt.get<AppState>(); | ||||||
|  |     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, distanceInfo], | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           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: (hospitalData?.isHMC == true) ? AppAssets.hmc : AppAssets.hmg, | ||||||
|  |           ).paddingOnly(right: 10), | ||||||
|  |           Expanded( | ||||||
|  |             child: Text( | ||||||
|  |               hospitalData?.filterName ?? "", | ||||||
|  |               style: TextStyle( | ||||||
|  |                 fontWeight: FontWeight.w600, | ||||||
|  |                 fontSize: 16, | ||||||
|  |                 color: AppColors.blackColor, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ); | ||||||
|  | 
 | ||||||
|  |   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, | ||||||
|  |                   ), | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   ), | ||||||
|  |           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, | ||||||
|  |               )), | ||||||
|  |         ], | ||||||
|  |       ); | ||||||
|  | } | ||||||
| @ -0,0 +1,93 @@ | |||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/core/app_assets.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/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/theme/colors.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; | ||||||
|  | import 'package:provider/provider.dart' show Consumer; | ||||||
|  | 
 | ||||||
|  | class TypeSelectionWidget extends StatelessWidget { | ||||||
|  |   final String hmcCount; | ||||||
|  |   final String hmgCount; | ||||||
|  | 
 | ||||||
|  |   const TypeSelectionWidget( | ||||||
|  |       {super.key, required this.hmcCount, required this.hmgCount}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Consumer<MyAppointmentsViewModel>( | ||||||
|  |       builder: (_, data, __) => Row( | ||||||
|  |         spacing: 8, | ||||||
|  |         mainAxisSize: MainAxisSize.max, | ||||||
|  |         children: [ | ||||||
|  |           AppCustomChipWidget( | ||||||
|  |             labelText: "All Facilities".needTranslation, | ||||||
|  |             shape: RoundedRectangleBorder( | ||||||
|  |                 side: BorderSide( | ||||||
|  |                   color: data.currentlySelectedFacility == FacilitySelection.ALL | ||||||
|  |                       ? AppColors.errorColor | ||||||
|  |                       : AppColors.chipBorderColorOpacity20, | ||||||
|  |                   width: 1, | ||||||
|  |                 ), | ||||||
|  |                 borderRadius: BorderRadius.circular(10)), | ||||||
|  |             backgroundColor: | ||||||
|  |                 data.currentlySelectedFacility == FacilitySelection.ALL | ||||||
|  |                     ? AppColors.secondaryLightRedColor | ||||||
|  |                     : AppColors.whiteColor, | ||||||
|  |             textColor: data.currentlySelectedFacility == FacilitySelection.ALL | ||||||
|  |                 ? AppColors.errorColor | ||||||
|  |                 : AppColors.blackColor, | ||||||
|  |           ).onPress((){ | ||||||
|  |             data.setSelectedFacility(FacilitySelection.ALL); | ||||||
|  |           }), | ||||||
|  |           AppCustomChipWidget( | ||||||
|  |             icon: AppAssets.hmg, | ||||||
|  |             iconHasColor: false, | ||||||
|  |             labelText: "Hospitals".needTranslation, | ||||||
|  |             shape: RoundedRectangleBorder( | ||||||
|  |                 side: BorderSide( | ||||||
|  |                   color: data.currentlySelectedFacility == FacilitySelection.HMG | ||||||
|  |                       ? AppColors.errorColor | ||||||
|  |                       : AppColors.chipBorderColorOpacity20, | ||||||
|  |                   width: 1, | ||||||
|  |                 ), | ||||||
|  |                 borderRadius: BorderRadius.circular(10)), | ||||||
|  |             backgroundColor: | ||||||
|  |                 data.currentlySelectedFacility == FacilitySelection.HMG | ||||||
|  |                     ? AppColors.secondaryLightRedColor | ||||||
|  |                     : AppColors.whiteColor, | ||||||
|  |             textColor: data.currentlySelectedFacility == FacilitySelection.HMG | ||||||
|  |                 ? AppColors.errorColor | ||||||
|  |                 : AppColors.blackColor, | ||||||
|  |           ).onPress((){ | ||||||
|  |             data.setSelectedFacility(FacilitySelection.HMG); | ||||||
|  |           }), | ||||||
|  |           AppCustomChipWidget( | ||||||
|  |             icon: AppAssets.hmc, | ||||||
|  |             iconHasColor: false, | ||||||
|  |             labelText: "Medical Centers".needTranslation, | ||||||
|  |             shape: RoundedRectangleBorder( | ||||||
|  |                 side: BorderSide( | ||||||
|  |                   color: data.currentlySelectedFacility == FacilitySelection.HMC | ||||||
|  |                       ? AppColors.errorColor | ||||||
|  |                       : AppColors.chipBorderColorOpacity20, | ||||||
|  |                   width: 1, | ||||||
|  |                 ), | ||||||
|  |                 borderRadius: BorderRadius.circular(10)), | ||||||
|  |             backgroundColor: | ||||||
|  |             data.currentlySelectedFacility == FacilitySelection.HMC | ||||||
|  |                 ? AppColors.secondaryLightRedColor | ||||||
|  |                 : AppColors.whiteColor, | ||||||
|  |             textColor: data.currentlySelectedFacility == FacilitySelection.HMC | ||||||
|  |                 ? AppColors.errorColor | ||||||
|  |                 : AppColors.blackColor, | ||||||
|  |           ).onPress((){ | ||||||
|  |             data.setSelectedFacility(FacilitySelection.HMC); | ||||||
|  |           }), | ||||||
|  |         ], | ||||||
|  |       ), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -0,0 +1,114 @@ | |||||||
|  | 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/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/generated/locale_keys.g.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; | ||||||
|  | import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; | ||||||
|  | 
 | ||||||
|  | class RegionListItem extends StatelessWidget { | ||||||
|  |   final String title; | ||||||
|  |   final String hmcCount; | ||||||
|  |   final String hmgCount; | ||||||
|  |   final String subTitle; | ||||||
|  | 
 | ||||||
|  |   const RegionListItem( | ||||||
|  |       {super.key, | ||||||
|  |       required this.title, | ||||||
|  |       required this.subTitle, | ||||||
|  |       required this.hmcCount, | ||||||
|  |       required this.hmgCount}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     return Container( | ||||||
|  |       decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||||
|  |         color: AppColors.whiteColor, | ||||||
|  |         borderRadius: 20.h, | ||||||
|  |         hasShadow: false, | ||||||
|  |       ), | ||||||
|  |       child: Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |           header, | ||||||
|  |           Row( | ||||||
|  |             mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |             children: [ | ||||||
|  |               Row( | ||||||
|  |                 spacing: 8.h, | ||||||
|  |                 children: [ | ||||||
|  |                   placesCountItem( | ||||||
|  |                       AppAssets.hmg, hmgCount, " ${LocaleKeys.hospital.tr()}"), | ||||||
|  |                   placesCountItem(AppAssets.hmc, hmcCount, | ||||||
|  |                       " ${LocaleKeys.medicalCenters.tr()}"), | ||||||
|  |                 ], | ||||||
|  |               ), | ||||||
|  |               Utils.buildSvgWithAssets( | ||||||
|  |                 icon: AppAssets.forward_arrow_icon, | ||||||
|  |                 iconColor: AppColors.blackColor, | ||||||
|  |                 width: 18, | ||||||
|  |                 height: 13, | ||||||
|  |                 fit: BoxFit.contain, | ||||||
|  |               ), | ||||||
|  |             ], | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ).paddingAll(16.h), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   Widget placesCountItem(String svgPath, String count, String title) { | ||||||
|  |     return AppCustomChipWidget( | ||||||
|  |       iconSize: 14, | ||||||
|  |       icon: svgPath, | ||||||
|  |       iconHasColor: false, | ||||||
|  |       richText: RichText( | ||||||
|  |                   text: TextSpan( | ||||||
|  |                       text: count, | ||||||
|  |                       style: TextStyle( | ||||||
|  |                           fontSize: 12.h, | ||||||
|  |                           fontWeight: FontWeight.w700, | ||||||
|  |                           color: AppColors.blackColor), | ||||||
|  |                       children: [ | ||||||
|  |                     TextSpan( | ||||||
|  |                         text: title, | ||||||
|  |                         style: TextStyle( | ||||||
|  |                             fontSize: 12.h, | ||||||
|  |                             fontWeight: FontWeight.w500, | ||||||
|  |                             color: AppColors.blackColor)) | ||||||
|  |                   ])), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |  Widget get header => Column( | ||||||
|  |         mainAxisAlignment: MainAxisAlignment.start, | ||||||
|  |         crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |         children: [ | ||||||
|  |           Align( | ||||||
|  |             alignment: Alignment.centerLeft, | ||||||
|  |             child: Text( | ||||||
|  |               title, | ||||||
|  |               style: TextStyle( | ||||||
|  |                 fontSize: 16.h, | ||||||
|  |                 fontWeight: FontWeight.w600, | ||||||
|  |                 color: AppColors.blackColor, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |           Align( | ||||||
|  |             alignment: Alignment.centerLeft, | ||||||
|  |             child: Text( | ||||||
|  |               subTitle, | ||||||
|  |               style: TextStyle( | ||||||
|  |                 fontSize: 12.h, | ||||||
|  |                 fontWeight: FontWeight.w500, | ||||||
|  |                 color: AppColors.greyTextColor, | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|  |           ), | ||||||
|  |         ], | ||||||
|  |       ); | ||||||
|  | } | ||||||
| @ -0,0 +1,86 @@ | |||||||
|  | import 'dart:async'; | ||||||
|  | 
 | ||||||
|  | import 'package:flutter/material.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; | ||||||
|  | import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; | ||||||
|  | import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart' | ||||||
|  |     show MyAppointmentsViewModel; | ||||||
|  | import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart' | ||||||
|  |     show RegionListItem; | ||||||
|  | import 'package:provider/provider.dart'; | ||||||
|  | 
 | ||||||
|  | class RegionBottomSheetBody extends StatefulWidget { | ||||||
|  | 
 | ||||||
|  |   const RegionBottomSheetBody({super.key}); | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   State<RegionBottomSheetBody> createState() => _RegionBottomSheetBodyState(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class _RegionBottomSheetBodyState extends State<RegionBottomSheetBody> { | ||||||
|  |   late MyAppointmentsViewModel myAppointmentsViewModel; | ||||||
|  |   late AppointmentViaRegionViewmodel regionalViewModel; | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   void initState() { | ||||||
|  |     scheduleMicrotask(() { | ||||||
|  |       myAppointmentsViewModel.getRegionMappedProjectList(); | ||||||
|  |     }); | ||||||
|  |     super.initState(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @override | ||||||
|  |   Widget build(BuildContext context) { | ||||||
|  |     myAppointmentsViewModel = Provider.of<MyAppointmentsViewModel>(context); | ||||||
|  |     regionalViewModel = Provider.of<AppointmentViaRegionViewmodel>(context); | ||||||
|  |     return Consumer<MyAppointmentsViewModel>( | ||||||
|  |       builder: (context, myAppointmentsVM, child) { | ||||||
|  |         if (myAppointmentsVM.isRegionListLoading) { | ||||||
|  |           return Container( | ||||||
|  |             height: MediaQuery.of(context).size.height * 0.3, | ||||||
|  |             decoration: const BoxDecoration( | ||||||
|  |               color: Colors.white, | ||||||
|  |               borderRadius: BorderRadius.vertical(top: Radius.circular(16)), | ||||||
|  |             ), | ||||||
|  |             child: Center( | ||||||
|  |               child: Utils.getLoadingWidget(), | ||||||
|  |             ), | ||||||
|  |           ); | ||||||
|  |         } else { | ||||||
|  |           return SizedBox( | ||||||
|  |             height: MediaQuery.of(context).size.height * 0.5, | ||||||
|  |             child: ListView.separated( | ||||||
|  |               itemCount: | ||||||
|  |                   myAppointmentsVM.hospitalList?.registeredDoctorMap?.length ?? | ||||||
|  |                       0, | ||||||
|  |               separatorBuilder: (_, __) { | ||||||
|  |                 return SizedBox( | ||||||
|  |                   height: 16.h, | ||||||
|  |                 ); | ||||||
|  |               }, | ||||||
|  |               itemBuilder: (_, index) { | ||||||
|  |                 String key = myAppointmentsVM | ||||||
|  |                         .hospitalList?.registeredDoctorMap?.keys | ||||||
|  |                         .toList()[index] ?? | ||||||
|  |                     ''; | ||||||
|  |                 return RegionListItem( | ||||||
|  |                   title: key, | ||||||
|  |                   subTitle: "", | ||||||
|  |                   hmcCount: | ||||||
|  |                       "${myAppointmentsVM.hospitalList?.registeredDoctorMap?[key]?.hmcSize ?? 0}", | ||||||
|  |                   hmgCount: | ||||||
|  |                       "${myAppointmentsVM.hospitalList?.registeredDoctorMap?[key]?.hmgSize ?? 0}", | ||||||
|  |                 ).onPress(() { | ||||||
|  |                   regionalViewModel.setSelectedRegionId(key); | ||||||
|  |                   regionalViewModel.setBottomSheetState(AppointmentViaRegionState.TYPE_SELECTION); | ||||||
|  |                 }); | ||||||
|  |               }, | ||||||
|  |             ), | ||||||
|  |           ); | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue