import 'package:hmg_patient_app/config/size_config.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/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/theme/colors.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:hmg_patient_app/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; class SearchResultWithTab extends StatefulWidget { List doctorsList = []; RegionList patientDoctorAppointmentListHospital; bool isLiveCareAppointment; bool isObGyneAppointment; bool isDoctorNameSearch; OBGyneProcedureListResponse? obGyneProcedureListResponse; bool isDoctorSearchResult; bool isForHospital; SearchResultWithTab({required this.doctorsList, required this.patientDoctorAppointmentListHospital, this.isObGyneAppointment = false, this.isDoctorNameSearch = false, required this.isLiveCareAppointment, required this.isDoctorSearchResult, this.obGyneProcedureListResponse, this.isForHospital = false, }); @override State createState() => _SearchResultWithTabState(); } class _SearchResultWithTabState extends State { int _currentIndex = 0; late PageController _controller; String selectedRegion = ""; bool isHMCSelected = false; int selectedHospitalIndex = -1; ScrollController scrollController = ScrollController(); @override void initState() { super.initState(); _controller = new PageController(); } changePageViewIndex(pageIndex) { _controller.jumpToPage(pageIndex); // scrollController.jumpTo(pageIndex); } @override Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).bookAppo, isShowDecPage: false, isShowAppBar: true, showNewAppBarTitle: true, showNewAppBar: true, backgroundColor: CustomColors.appBackgroudGrey2Color, body: 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 / 4, 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 = ""; _currentIndex = 0; changePageViewIndex(0); }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 4, 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; _currentIndex = 1; changePageViewIndex(1); }); }, ), ), SizedBox( width: MediaQuery.of(context).size.width / 4, 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; _currentIndex = 2; changePageViewIndex(2); }); }, ), ), (widget.isForHospital) ? SizedBox( width: MediaQuery.of(context).size.width / 4, child: showProgress( title: TranslationBase.of(context).selectClinic, status: _currentIndex == 3 ? TranslationBase.of(context).inPrgress : TranslationBase.of(context).locked, color: _currentIndex == 3 ? CustomColors.orange : _currentIndex > 4 ? CustomColors.green : CustomColors.grey2, isNeedBorder: false, onTap: () { setState(() { _currentIndex = 3; changePageViewIndex(3); }); }, ), ) : SizedBox.shrink(), SizedBox( width: MediaQuery.of(context).size.width / 4, 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: (hospital, index) { setState(() { selectedHospitalIndex = index; _currentIndex = 3; changePageViewIndex(3); }); }) : SizedBox.shrink(), (selectedRegion != '' && selectedHospitalIndex != -1) ? ResultByDoctor( doctorsList: widget.doctorsList, patientDoctorAppointmentListHospital: (!isHMCSelected) ? widget .patientDoctorAppointmentListHospital .registeredDoctorMap![selectedRegion]! .hmgDoctorList![selectedHospitalIndex] .patientDoctorAppointmentList ?? [] : widget .patientDoctorAppointmentListHospital .registeredDoctorMap?[selectedRegion] ?.hmcDoctorList?[ selectedHospitalIndex] .patientDoctorAppointmentList ?? [], isLiveCareAppointment: widget.isLiveCareAppointment, isDoctorSearchResult: widget.isDoctorSearchResult, isObGyneAppointment: widget.isObGyneAppointment, isDoctorNameSearch: widget.isDoctorNameSearch) : SizedBox.shrink(), ], ), ), ]), ) : getNoDataWidget(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) .selectDoctor; } return ""; } void handleBackClick() { switch (_currentIndex) { case 1: selectedHospitalIndex = -1; selectedRegion = ""; _currentIndex = 0; changePageViewIndex(0); break; case 2: selectedHospitalIndex = -1; _currentIndex = 1; changePageViewIndex(1); break; case 3: selectedHospitalIndex = -1; _currentIndex = 2; changePageViewIndex(2); break; } } 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: 11, fontWeight: FontWeight.w600, 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, // ), // ), // ), // ], // ));