diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index bd2eb71..d31679c 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -212,7 +212,7 @@ var GET_QR_PARKING = 'Services/SWP.svc/REST/GetQRParkingByID'; //URL to get clinic list var GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized"; -var GET_CLINICS_LIST_WRT_HOSPITAL_URL = "Services/Lists.svc/REST/GetClinicFromDoctorSchedule"; +var GET_CLINICS_LIST_WRT_HOSPITAL_ID_URL = "Services/Lists.svc/REST/GetClinicFromDoctorSchedule"; //URL to get active appointment list var GET_ACTIVE_APPOINTMENTS_LIST_URL = "Services/Doctors.svc/Rest/Dr_GetAppointmentActiveNumber"; diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart index f41fbc4..7454b80 100644 --- a/lib/features/book_appointments/book_appointments_repo.dart +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -44,6 +44,9 @@ abstract class BookAppointmentsRepo { Future>>> getProjectList(); + + Future>>> getClinicsWithRespectToClinicId(String projectID); + } class BookAppointmentsRepoImp implements BookAppointmentsRepo { @@ -409,4 +412,42 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future>>> getClinicsWithRespectToClinicId(String projectID) async { + Map mapDevice = {"ProjectID": projectID}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_CLINICS_LIST_WRT_HOSPITAL_ID_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['ListClinic']; + + final clinicsList = list.map((item) => GetClinicsListResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } 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/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index 271db44..c2b9639 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -70,6 +70,10 @@ class BookAppointmentsViewModel extends ChangeNotifier { FacilitySelection currentlySelectedFacility = FacilitySelection.ALL; bool isRegionListLoading = false; + ///this will be used to call the clinic call when navigating from my REGION SELECTION to book appointment screen + bool shouldLoadSpecificClinic = false; + String? currentlySelectedHospitalFromRegionFlow; + BookAppointmentsViewModel({required this.bookAppointmentsRepo, required this.errorHandlerService, required this.navigationService, required this.myAppointmentsViewModel}); void initializeFilteredList() { @@ -109,7 +113,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { clinicsList.clear(); } isClinicsListLoading = value; - notifyListeners(); + // notifyListeners(); } setSelectedClinic(GetClinicsListResponseModel clinic) { @@ -148,7 +152,18 @@ class BookAppointmentsViewModel extends ChangeNotifier { notifyListeners(); } - Future getClinics({Function(dynamic)? onSuccess, Function(String)? onError}) async { + /// this function will decide which clinic api to be called + /// either api for region flow or the select clinic api + Future getClinics() async + { + if(shouldLoadSpecificClinic) { + getRegionSelectedClinics(); + } else { + getAllClinics(); + } + } + + Future getAllClinics({Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await bookAppointmentsRepo.getClinics(); result.fold( @@ -173,6 +188,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { Future getDoctorsList( {int projectID = 0, bool isNearest = false, int doctorId = 0, String doctorName = "", isContinueDentalPlan = false, Function(dynamic)? onSuccess, Function(String)? onError}) async { doctorsList.clear(); + projectID = currentlySelectedHospitalFromRegionFlow != null?int.parse(currentlySelectedHospitalFromRegionFlow!):projectID; final result = await bookAppointmentsRepo.getDoctorsList(selectedClinic.clinicID ?? 0, projectID, isNearest, doctorId, doctorName); result.fold( @@ -391,6 +407,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { } Future getRegionMappedProjectList() async { + //todo handle the case in the location is switch on if(hospitalList != null && hospitalList!.registeredDoctorMap != null && hospitalList!.registeredDoctorMap!.isNotEmpty){ filteredHospitalList = hospitalList; return; @@ -469,4 +486,33 @@ class BookAppointmentsViewModel extends ChangeNotifier { isLocationEnabled().then((value) => isLocationAvaiable = value); return isLocationAvaiable; } + + void setLoadSpecificClinic(bool status) { + shouldLoadSpecificClinic = status; + } + + void setProjectID(String? mainProjectID) { + currentlySelectedHospitalFromRegionFlow = mainProjectID; + } + + Future getRegionSelectedClinics() async{ + final result = await bookAppointmentsRepo.getClinicsWithRespectToClinicId(currentlySelectedHospitalFromRegionFlow??""); + + 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) { + clinicsList = apiResponse.data!; + isClinicsListLoading = false; + initializeFilteredList(); + notifyListeners(); + } + }, + ); + } + void resetFilterList(){ + filteredHospitalList = hospitalList; + } } diff --git a/lib/features/my_appointments/appointment_via_region_viewmodel.dart b/lib/features/my_appointments/appointment_via_region_viewmodel.dart index 7bcd0a6..a49e1c4 100644 --- a/lib/features/my_appointments/appointment_via_region_viewmodel.dart +++ b/lib/features/my_appointments/appointment_via_region_viewmodel.dart @@ -1,4 +1,8 @@ import 'package:flutter/foundation.dart' show ChangeNotifier; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/doctor_list_api_response.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/select_clinic_page.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; enum AppointmentViaRegionState { REGION_SELECTION, @@ -11,9 +15,13 @@ enum AppointmentViaRegionState { class AppointmentViaRegionViewmodel extends ChangeNotifier { String? selectedRegionId; String? selectedFacilityType; + PatientDoctorAppointmentList? selectedHospital; + final NavigationService navigationService; AppointmentViaRegionState bottomSheetState = AppointmentViaRegionState.REGION_SELECTION; + AppointmentViaRegionViewmodel({required this.navigationService}); + void setSelectedRegionId(String? regionId) { selectedRegionId = regionId; notifyListeners(); @@ -29,10 +37,16 @@ class AppointmentViaRegionViewmodel extends ChangeNotifier { notifyListeners(); } + void handleLastStep(){ + navigationService.pop(); + navigationService.push(FadePage( + page: SelectClinicPage(), + ),); + } + void handleBackPress() { switch (bottomSheetState) { case AppointmentViaRegionState.REGION_SELECTION: - // Do nothing or exit the bottom sheet break; case AppointmentViaRegionState.TYPE_SELECTION: setBottomSheetState(AppointmentViaRegionState.REGION_SELECTION); @@ -41,19 +55,6 @@ class AppointmentViaRegionViewmodel extends ChangeNotifier { case AppointmentViaRegionState.HOSPITAL_SELECTION: setBottomSheetState(AppointmentViaRegionState.TYPE_SELECTION); break; - - // case AppointmentViaRegionState.HOSPITAL_SELECTION: - // case AppointmentViaRegionState.CLINIC_SELECTION: - // setBottomSheetState(AppointmentViaRegionState.TYPE_SELECTION); - // setFacility(null); - // break; - // case AppointmentViaRegionState.DOCTOR_SELECTION: - // if (selectedFacilityType == 'Hospital') { - // setBottomSheetState(AppointmentViaRegionState.HOSPITAL_SELECTION); - // } else if (selectedFacilityType == 'Medical Center') { - // setBottomSheetState(AppointmentViaRegionState.CLINIC_SELECTION); - // } - // break; default: } } @@ -63,4 +64,8 @@ class AppointmentViaRegionViewmodel extends ChangeNotifier { setFacility(null); setBottomSheetState(AppointmentViaRegionState.REGION_SELECTION); } + + void setHospitalModel(PatientDoctorAppointmentList? hospital) { + selectedHospital = hospital; + } } diff --git a/lib/main.dart b/lib/main.dart index 02f8dd1..c75cf91 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -146,7 +146,8 @@ void main() async { ), ), ChangeNotifierProvider( - create: (_) => AppointmentViaRegionViewmodel()) + create: (_) => + AppointmentViaRegionViewmodel(navigationService: getIt())) ], child: MyApp()), ), ); diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart index 242c7ca..71cc07d 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_bottom_sheet_body.dart @@ -4,6 +4,7 @@ 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/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/facility_selection.dart'; @@ -76,21 +77,28 @@ class HospitalBottomSheetBody extends StatelessWidget { 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(), - ), + itemBuilder: (_, index) + { + var hospital = regionalViewModel.selectedFacilityType == + FacilitySelection.HMG.name + ? appointmentsViewModel + .filteredHospitalList! + .registeredDoctorMap![ + regionalViewModel.selectedRegionId!]! + .hmgDoctorList![index] + : appointmentsViewModel + .filteredHospitalList + ?.registeredDoctorMap?[ + regionalViewModel.selectedRegionId!] + ?.hmcDoctorList?[index]; + return HospitalListItem( + hospitalData: hospital, + isLocationEnabled: appointmentsViewModel.getLocationStatus(), + ).onPress(() { + regionalViewModel.setHospitalModel(hospital); + regionalViewModel.setBottomSheetState(AppointmentViaRegionState.CLINIC_SELECTION); + regionalViewModel.handleLastStep(); + });}, separatorBuilder: (_, __) => SizedBox( height: 16.h, ), diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index a6d6c5e..482d864 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -122,6 +122,8 @@ class _BookAppointmentPageState extends State { ], ).onPress(() { bookAppointmentsViewModel.setIsClinicsListLoading(true); + bookAppointmentsViewModel.setLoadSpecificClinic(false); + bookAppointmentsViewModel.setProjectID(null); Navigator.of(context).push( FadePage( page: SelectClinicPage(), @@ -194,6 +196,7 @@ class _BookAppointmentPageState extends State { } void openRegionListBottomSheet(BuildContext context) { + regionalViewModel.flush(); // AppointmentViaRegionViewmodel? viewmodel = null; showCommonBottomSheetWithoutHeight(context, title: "", @@ -203,7 +206,6 @@ class _BookAppointmentPageState extends State { child: Consumer(builder: (_, data, __) { return getRegionalSelectionWidget(data); }), callBackFunc: () { - regionalViewModel.flush(); }); } @@ -212,11 +214,20 @@ class _BookAppointmentPageState extends State { return RegionBottomSheetBody(); } if(data.bottomSheetState == AppointmentViaRegionState.TYPE_SELECTION){ + bookAppointmentsViewModel.resetFilterList(); return FacilityTypeSelectionWidget(selectedRegion: data.selectedRegionId??"",); } if (data.bottomSheetState == AppointmentViaRegionState.HOSPITAL_SELECTION) { return HospitalBottomSheetBody(); - } else { + } + if (data.bottomSheetState == AppointmentViaRegionState.CLINIC_SELECTION) { + // Navigator.of(context).pop(); + bookAppointmentsViewModel.setIsClinicsListLoading(true); + bookAppointmentsViewModel.setLoadSpecificClinic(true); + bookAppointmentsViewModel.setProjectID(regionalViewModel.selectedHospital?.hospitalList.first?.mainProjectID.toString()); + + } + else { SizedBox.shrink(); } return SizedBox.shrink(); diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart index 3ece752..85c13f2 100644 --- a/lib/widgets/chip/app_custom_chip_widget.dart +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -41,7 +41,6 @@ class AppCustomChipWidget extends StatelessWidget { @override Widget build(BuildContext context) { - print("detected icon: $deleteIcon"); return ChipTheme( data: ChipThemeData( padding: EdgeInsets.all(0.0),