import 'package:hmg_patient_app/config/size_config.dart'; import 'package:hmg_patient_app/core/model/hospitals/hospitals_model.dart'; import 'package:hmg_patient_app/core/viewModels/project_view_model.dart'; import 'package:hmg_patient_app/models/Appointments/DoctorListResponse.dart'; import 'package:hmg_patient_app/models/Appointments/OBGyneProcedureListResponse.dart'; import 'package:hmg_patient_app/pages/BookAppointment/search_result/ResultByClinic.dart'; import 'package:hmg_patient_app/pages/BookAppointment/search_result/ResultByDoctors.dart'; import 'package:hmg_patient_app/pages/BookAppointment/search_result/ResultByFacility.dart'; import 'package:hmg_patient_app/pages/BookAppointment/search_result/ResultByHospital.dart'; import 'package:hmg_patient_app/pages/BookAppointment/search_result/ResultByRegion.dart'; import 'package:hmg_patient_app/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:hmg_patient_app/services/appointment_services/GetDoctorsList.dart'; import 'package:hmg_patient_app/services/appointment_services/doctor_response_mapper.dart'; import 'package:hmg_patient_app/theme/colors.dart'; import 'package:hmg_patient_app/uitl/app_toast.dart'; import 'package:hmg_patient_app/uitl/gif_loader_dialog_utils.dart'; import 'package:hmg_patient_app/uitl/translations_delegate_base.dart'; import 'package:hmg_patient_app/uitl/utils_new.dart'; import 'package:hmg_patient_app/widgets/others/app_expandable_notifier.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; import '../../../config/shared_pref_kay.dart'; import '../../../core/service/client/base_app_client.dart'; class SearchResultWithTabForHospital extends StatefulWidget { List doctorsList = []; RegionList patientDoctorAppointmentListHospital; bool isLiveCareAppointment; bool isObGyneAppointment; bool isDoctorNameSearch; OBGyneProcedureListResponse? obGyneProcedureListResponse; bool isDoctorSearchResult; bool isForHospital; SearchResultWithTabForHospital({ required this.doctorsList, required this.patientDoctorAppointmentListHospital, this.isObGyneAppointment = false, this.isDoctorNameSearch = false, required this.isLiveCareAppointment, required this.isDoctorSearchResult, this.obGyneProcedureListResponse, this.isForHospital = true, }); @override State createState() => _SearchResultWithTabForHospitalState(); } class _SearchResultWithTabForHospitalState extends State { int _currentIndex = 0; late PageController _controller; String selectedRegion = ""; HospitalsModel? selectedHospital; bool isHMCSelected = false; int selectedHospitalIndex = -1; ScrollController scrollController = ScrollController(); RegionList? doctorList; bool nearestAppointment= false; int clinicId = -1; @override void initState() { super.initState(); _controller = new PageController(); } changePageViewIndex(pageIndex) { _controller.jumpToPage(pageIndex); // if (scrollController.hasClients) { // print("it has clients"); // scrollController.animateTo(pageIndex.toDouble(),curve: Curves.easeOut, // duration: const Duration(milliseconds: 300),);} } void handleBackClick() { switch (_currentIndex) { case 1: selectedHospitalIndex = -1; selectedRegion = ""; doctorList = null; _currentIndex = 0; changePageViewIndex(0); break; case 2: selectedHospitalIndex = -1; doctorList = null; _currentIndex = 1; changePageViewIndex(1); break; case 3: selectedHospitalIndex = -1; doctorList = null; _currentIndex = 2; changePageViewIndex(2); break; case 4: _currentIndex = 3; doctorList = null; changePageViewIndex(3); } } @override Widget build(BuildContext context) { return SizedBox( child: widget.patientDoctorAppointmentListHospital.registeredDoctorMap ?.isNotEmpty == true ? SizedBox( height: SizeConfig.realScreenHeight! * .9, width: SizeConfig.realScreenWidth, child: Column(children: [ Container( width: double.infinity, padding: EdgeInsets.only(left: 20, right: 20, top: 12), child: SizedBox( height: 100, child: ListView( scrollDirection: Axis.horizontal, controller: scrollController, children: [ SizedBox( width: MediaQuery.of(context).size.width / 5.2, child: showProgress( title: TranslationBase.of(context).selectRegion, status: _currentIndex == 0 ? TranslationBase.of(context).inPrgress : _currentIndex > 0 ? TranslationBase.of(context).completed : TranslationBase.of(context).locked, color: _currentIndex == 0 ? CustomColors.orange : CustomColors.green, onTap: () { setState(() { selectedHospitalIndex = -1; selectedRegion = ""; doctorList = null; _currentIndex = 0; changePageViewIndex(0); nearestAppointment = false; clinicId = -1; }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 5.2, child: showProgress( title: TranslationBase.of(context).selectFacitlity, status: _currentIndex == 1 ? TranslationBase.of(context).inPrgress : _currentIndex > 1 ? TranslationBase.of(context).completed : TranslationBase.of(context).locked, color: _currentIndex == 1 ? CustomColors.orange : _currentIndex > 1 ? CustomColors.green : CustomColors.grey2, onTap: () { setState(() { selectedHospitalIndex = -1; doctorList = null; _currentIndex = 1; changePageViewIndex(1); nearestAppointment = false; clinicId = -1; }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 5.2, child: showProgress( title: TranslationBase.of(context).selectBranch, status: _currentIndex == 2 ? TranslationBase.of(context).inPrgress : _currentIndex > 1 ? TranslationBase.of(context).completed : TranslationBase.of(context).locked, color: _currentIndex == 2 ? CustomColors.orange : _currentIndex > 2 ? CustomColors.green : CustomColors.grey2, onTap: () { setState(() { selectedHospitalIndex = -1; doctorList = null; _currentIndex = 2; changePageViewIndex(2); nearestAppointment = false; clinicId = -1; }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 5.2, child: showProgress( title: TranslationBase.of(context).selectClinic, status: _currentIndex == 3 ? TranslationBase.of(context).inPrgress : _currentIndex > 3 ? TranslationBase.of(context).completed : TranslationBase.of(context).locked, color: _currentIndex == 3 ? CustomColors.orange : _currentIndex > 3 ? CustomColors.green : CustomColors.grey2, onTap: () { setState(() { doctorList = null; changePageViewIndex(3); _currentIndex = 3; nearestAppointment= false; clinicId = -1; }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 5.2, child: showProgress( title: TranslationBase.of(context).selectDoctor, status: _currentIndex == ((widget.isForHospital) ? 4 : 3) ? TranslationBase.of(context).inPrgress : TranslationBase.of(context).locked, color: _currentIndex == ((widget.isForHospital) ? 4 : 3) ? CustomColors.orange : _currentIndex == ((widget.isForHospital) ? 5 : 4) ? CustomColors.green : CustomColors.grey2, isNeedBorder: false, onTap: () { setState(() { _currentIndex = ((widget.isForHospital) ? 4 : 3); changePageViewIndex(_currentIndex); }); }, ), ), ], ), ), ), Padding( padding: const EdgeInsetsDirectional.fromSTEB(10.0, 18, 0, 24), child: Row( children: [ (_currentIndex != 0) ? InkWell( onTap: () { handleBackClick(); }, child: Padding( padding: const EdgeInsetsDirectional.fromSTEB( 0, 0, 04, 0), child: Icon( Icons.arrow_back, color: Theme.of(context).primaryColor, ), ), ) : mWidth(24), Text( getTitle(), style: TextStyle( fontSize: 18, fontWeight: FontWeight.w600, color: Colors.black), ) ], ), ), // mHeight(24), Expanded( child: PageView( physics: NeverScrollableScrollPhysics(), controller: _controller, onPageChanged: (index) { setState(() { _currentIndex = index; }); }, scrollDirection: Axis.horizontal, children: [ ResultByRegion( doctorsList: widget.doctorsList, patientDoctorAppointmentListHospital: widget.patientDoctorAppointmentListHospital, onRegionSelected: (key) { setState(() { selectedRegion = key; _currentIndex = 1; changePageViewIndex(1); }); }), (selectedRegion != "") ? ResultByFacility( doctorsList: widget.doctorsList, patientDoctorAppointmentListHospital: widget.patientDoctorAppointmentListHospital, selectedRegion: selectedRegion, onFacilitySelected: (isHMCSelected) { setState(() { this.isHMCSelected = isHMCSelected; _currentIndex = 2; changePageViewIndex(2); }); }, ) : SizedBox.shrink(), (selectedRegion != '') ? ResultByHospital( doctorsList: widget.doctorsList, paitientDoctorAppointmentList: (isHMCSelected) ? widget .patientDoctorAppointmentListHospital .registeredDoctorMap![selectedRegion]! .hmcDoctorList ?? [] : widget .patientDoctorAppointmentListHospital .registeredDoctorMap?[selectedRegion] ?.hmgDoctorList ?? [], isHMCSelected: isHMCSelected, isLiveCareAppointment: widget.isLiveCareAppointment, isDoctorSearchResult: widget.isDoctorSearchResult, onHospitalSelected: (hospitalName, index) { setState(() { selectedHospitalIndex = index; selectedHospital = (!isHMCSelected) ? widget .patientDoctorAppointmentListHospital .registeredDoctorMap![selectedRegion]! .hmgDoctorList![selectedHospitalIndex] .hospitalList .first : widget .patientDoctorAppointmentListHospital .registeredDoctorMap![selectedRegion]! .hmcDoctorList![selectedHospitalIndex] .hospitalList .first; _currentIndex = 3; changePageViewIndex(3); }); }) : SizedBox.shrink(), (selectedHospital != null && selectedRegion != '' && selectedHospitalIndex != -1) ? ResultByClinic( onClinicSelected: (doctorList, clinicId) { setState(() { this.nearestAppointment = false; this.doctorList = doctorList; _currentIndex = 4; changePageViewIndex(4); if(clinicId != null) this.clinicId = clinicId; }); }, selectedValue: selectedHospital) : SizedBox.shrink(), (selectedRegion != '' && selectedHospitalIndex != -1 && doctorList != null) ? ResultByDoctor( doctorsList: widget.doctorsList, patientDoctorAppointmentListHospital: (!isHMCSelected) ? doctorList! .registeredDoctorMap![ selectedRegion]! .hmgDoctorList! .first .patientDoctorAppointmentList ?? [] : doctorList! .registeredDoctorMap?[ selectedRegion] ?.hmcDoctorList! .first .patientDoctorAppointmentList ?? [], isLiveCareAppointment: widget.isLiveCareAppointment, isDoctorSearchResult: widget.isDoctorSearchResult, isObGyneAppointment: widget.isObGyneAppointment, isDoctorNameSearch: widget.isDoctorNameSearch, showNearestAppointment: clinicId != -1 , nearestAppointmentDoctors: nearestAppointment, refreshDoctorList: (isNearestAppointmentChecked){ setState(() { // changePageViewIndex(3); // _currentIndex = 3; nearestAppointment= false; }); callDoctorsSearchAPI(clinicId, isNearestAppointmentChecked); }, ) : SizedBox.shrink(), ], ), ), ]), ) : getNoDataWidget(context), ); } callDoctorsSearchAPI(int clinicID, bool nearestAppointment) { var isArabic = context.read().isArabic; int languageID = isArabic ? 1 : 2; GifLoaderDialogUtils.showMyDialog(context); List doctorsList = []; List arr = []; List arrDistance = []; List result; int numAll; List _patientDoctorAppointmentListHospital = []; DoctorsListService service = new DoctorsListService(); service .getDoctorsList(clinicID, selectedHospital?.mainProjectID.toString() != "" ? int.parse(selectedHospital?.mainProjectID.toString() ?? "-1") : 0, nearestAppointment, languageID, null) .then((res) async { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { RegionList regionHospitalList = RegionList(); if (res['DoctorList'].length != 0) { res['DoctorList'].forEach((v) { doctorsList.add(new DoctorList.fromJson( v, )); }); regionHospitalList = await DoctorMapper.getMappedDoctor(doctorsList, isArabic: isArabic); var lat = await sharedPref.getDouble(USER_LAT); var lng = await sharedPref.getDouble(USER_LONG); var isLocationEnabled = (lat != null && lat != 0.0) && (lng != null && lng != 0.0); regionHospitalList = await DoctorMapper.sortList(isLocationEnabled, regionHospitalList); setState(() { this.doctorList = regionHospitalList; _currentIndex = 4; changePageViewIndex(4); this.nearestAppointment = nearestAppointment; }); } else { GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: res['ErrorSearchMsg']); } GifLoaderDialogUtils.hideDialog(context); // navigateToSearchResults(context, doctorsList, _patientDoctorAppointmentListHospital); } else { GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); print(err); AppToast.showErrorToast(message: err, localContext: context); }); } String getTitle() { switch (_currentIndex) { case 0: return TranslationBase.of(context).selectRegion; case 1: return TranslationBase.of(context).selectFacitlity; case 2: return TranslationBase.of(context).selectBranch; case 3: return TranslationBase.of(context).selectClinic; case 4: return TranslationBase.of(context).selectDoctor; } return ""; } Widget showProgress( {String? title, String? status, Color? color, bool isNeedBorder = true, Function()? onTap}) { return InkWell( onTap: () { if (status == TranslationBase.of(context).completed) { onTap?.call(); } }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Container( width: 26, height: 26, decoration: containerRadius(color!, 200), child: Icon( Icons.done, color: Colors.white, size: 16, ), ), if (isNeedBorder) Expanded( child: Padding( padding: const EdgeInsets.all(8.0), child: mDivider(Colors.grey), )), ], ), mHeight(8), Text( title!, style: TextStyle( fontSize: 10, fontWeight: FontWeight.w500, letterSpacing: -0.44, ), ), mHeight(2), Container( padding: EdgeInsets.all(5), decoration: containerRadius(color!.withOpacity(0.2), 4), child: Text( status!, style: TextStyle( fontSize: 8, fontWeight: FontWeight.w600, letterSpacing: -0.32, color: color, ), ), ), ], ) ], ), ); } } class HospitalBodyWidget extends StatelessWidget { final List? patientDoctorAppointmentListHospital; final bool isLiveCareAppointment; final bool isObGyneAppointment; final bool isDoctorNameSearch; final bool isDoctorSearchResult; final OBGyneProcedureListResponse? obGyneProcedureListResponse; const HospitalBodyWidget({ super.key, this.patientDoctorAppointmentListHospital, required this.isLiveCareAppointment, required this.isObGyneAppointment, required this.isDoctorNameSearch, required this.isDoctorSearchResult, this.obGyneProcedureListResponse, }); @override Widget build(BuildContext context) { return ListView.separated( addAutomaticKeepAlives: true, shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: patientDoctorAppointmentListHospital?.length ?? 0, separatorBuilder: (context, index) { return Container( height: 12, margin: EdgeInsets.only(left: 21, right: 21), ); }, itemBuilder: (context, index) { return AppExpandableNotifier( applyBackgroundColor: false, widgetColor: CustomColors.appBackgroudGrey2Color, title: (patientDoctorAppointmentListHospital?[index].distanceInKMs != "0") ? patientDoctorAppointmentListHospital![index].filterName! + " - " + patientDoctorAppointmentListHospital![index].distanceInKMs! + " " + TranslationBase.of(context).km : patientDoctorAppointmentListHospital![index].filterName, projectTitleTop: patientDoctorAppointmentListHospital![index].projectTopName, projectTitleBottom: (patientDoctorAppointmentListHospital![index] .distanceInKMs != "0") ? patientDoctorAppointmentListHospital![index] .projectBottomName .toString() + " - " + patientDoctorAppointmentListHospital![index].distanceInKMs! + " " + TranslationBase.of(context).km : patientDoctorAppointmentListHospital![index] .projectBottomName .toString(), isTitleSingleLine: false, isDoctorSearchResult: isDoctorSearchResult, isExpand: patientDoctorAppointmentListHospital?.length == 1 ? true : false, bodyWidget: ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.only(bottom: 10, top: 10, left: 21, right: 21), itemBuilder: (context, _index) { // print("the index of patientDoctorAppointmentList is ${_index}"); // print("the index of parent is ${index}"); final doctor = patientDoctorAppointmentListHospital![index] .patientDoctorAppointmentList![_index]; // print('the doctor is ${doctor.toJson()}'); return DoctorView( doctor: doctor, isLiveCareAppointment: isLiveCareAppointment, isObGyneAppointment: isObGyneAppointment, isDoctorNameSearch: isDoctorNameSearch, obGyneProcedureListResponse: obGyneProcedureListResponse, isShowDate: false, onTap: () { context .read() .analytics .appointment .book_appointment_select_doctor( appointment_type: 'regular', doctor: doctor); }); }, separatorBuilder: (context, index) => SizedBox(height: 14), itemCount: patientDoctorAppointmentListHospital?[index] .patientDoctorAppointmentList ?.length ?? 0), ); }, ); } } class RegionTitle extends StatelessWidget { final String title; final String hmcCount; final String hmgCount; const RegionTitle( {super.key, required this.title, required this.hmcCount, required this.hmgCount}); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( fontSize: 22, color: Colors.black, fontWeight: FontWeight.w700), ), SizedBox( height: 8, ), Row( children: [ Text( "${TranslationBase.of(context).HospitalString(num.parse(hmgCount)).replaceAll("@", hmgCount)} ,", style: TextStyle( fontSize: 14, color: Color(0xFFD02127), fontWeight: FontWeight.w600), ), SizedBox( width: 8, ), Text( "${TranslationBase.of(context).MedicalCenterString(num.parse(hmcCount)).replaceAll("@", hmcCount)}", style: TextStyle( fontSize: 14, color: Color(0xFF40ACC9), fontWeight: FontWeight.w600), ), ], ), ], ), ); } } class HospitalTitle extends StatelessWidget { final String title; final String iconUrl; final bool isHMC; final String itemCount; const HospitalTitle( {super.key, required this.title, required this.iconUrl, required this.isHMC, required this.itemCount}); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ SvgPicture.asset(iconUrl), SizedBox( width: 8, ), Text( title, style: TextStyle( fontSize: 18, color: isHMC ? Color(0xFF40ACC9) : Color(0xFFD02127), fontWeight: FontWeight.w600), ), ], ), SizedBox( height: 6, ), Text( isHMC ? "${TranslationBase.of(context).MedicalCenterString(num.parse(itemCount)).replaceAll("@", itemCount)}" : "${TranslationBase.of(context).HospitalString(num.parse(itemCount)).replaceAll("@", itemCount)}", style: TextStyle( fontSize: 12, color: Colors.black, fontWeight: FontWeight.w600), ), ], ), ); } } ///todo the current content of the application /// return AppExpandableNotifier( // paddingValue: 10, // applyBackgroundToOnlyHeader: true, // completeHeaderColor: CustomColors.appBackgroudGrey2Color, // headerWidget: RegionTitle( // title: key, // hmcCount: // "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmcSize ?? 0}", // hmgCount: // "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmgSize ?? 0}", // ), // showDropDownIconWithCustomHeader: true, // isTitleSingleLine: false, // isDoctorSearchResult: widget.isDoctorSearchResult, // widgetColor: Color(0xFFF8F8F8), // bodyWidget: Column( // children: [ // Padding( // padding: const EdgeInsets.all(8.0), // child: AppExpandableNotifier( // paddingValue: 8, // applyBackgroundColor: false, // applyBackgroundToOnlyHeader: true, // completeHeaderColor: Colors.white, // headerRadius: BorderRadius.circular(16), // headerWidget: HospitalTitle( // iconUrl: 'assets/images/svg/HMG.svg', // title: TranslationBase.of(context).hmgHospital, // isHMC: false, // itemCount: // "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmgSize ?? 0}", // ), // showDropDownIconWithCustomHeader: true, // bodyWidget: HospitalBodyWidget( // patientDoctorAppointmentListHospital: // widget.patientDoctorAppointmentListHospital // .registeredDoctorMap?[key]?.hmgDoctorList, // isLiveCareAppointment: widget.isLiveCareAppointment, // isObGyneAppointment: widget.isObGyneAppointment, // isDoctorNameSearch: widget.isDoctorNameSearch, // isDoctorSearchResult: widget.isDoctorSearchResult, // ), // ), // ), // Padding( // padding: const EdgeInsets.only( // bottom: 8.0, left: 8, right: 8), // child: AppExpandableNotifier( // paddingValue: 8, // applyBackgroundColor: false, // applyBackgroundToOnlyHeader: true, // completeHeaderColor: Colors.white, // headerRadius: BorderRadius.circular(16), // headerWidget: HospitalTitle( // iconUrl: 'assets/images/svg/HMC.svg', // title: TranslationBase.of(context).hmcHospital, // isHMC: true, // itemCount: // "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmcSize ?? 0}", // ), // showDropDownIconWithCustomHeader: true, // bodyWidget: HospitalBodyWidget( // patientDoctorAppointmentListHospital: // widget.patientDoctorAppointmentListHospital // .registeredDoctorMap?[key]?.hmcDoctorList, // isLiveCareAppointment: widget.isLiveCareAppointment, // isObGyneAppointment: widget.isObGyneAppointment, // isDoctorNameSearch: widget.isDoctorNameSearch, // isDoctorSearchResult: widget.isDoctorSearchResult, // ), // ), // ), // ], // ));