import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/AppointmentType.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/widgets/AppointmentCardView.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class MyAppointments extends StatefulWidget { List appoList = []; List bookedAppoList = []; List confirmedAppoList = []; List arrivedAppoList = []; List _patientBookedAppointmentListHospital = List(); List _patientConfirmedAppointmentListHospital = List(); List _patientArrivedAppointmentListHospital = List(); List _patientBookedAppointmentListClinic = List(); List _patientConfirmedAppointmentListClinic = List(); List _patientArrivedAppointmentListClinic = List(); @override _MyAppointmentsState createState() => _MyAppointmentsState(); } class _MyAppointmentsState extends State with SingleTickerProviderStateMixin { TabController _tabController; bool isDataLoaded = false; var sharedPref = new AppSharedPreferences(); AuthenticatedUserObject authenticatedUserObject = locator(); List imagesInfo = List(); FilterType filterType; @override void initState() { _tabController = new TabController(length: 3, vsync: this); filterType = FilterType.Clinic; WidgetsBinding.instance.addPostFrameCallback((_) { if (Provider.of(context, listen: false).isLogin) getPatientAppointmentHistory(); }); imagesInfo.add(ImagesInfo( imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/0.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/0.png')); imagesInfo.add(ImagesInfo( imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/1.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/1.png')); super.initState(); } @override Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).myAppointments, isShowAppBar: true, imagesInfo: imagesInfo, description: TranslationBase.of(context).infoMyAppointments, body: Container( child: Column(children: [ TabBar( tabs: [ Tab(text: TranslationBase.of(context).booked), Tab(text: TranslationBase.of(context).confirmed), Tab(text: TranslationBase.of(context).arrived), ], controller: _tabController, ), Divider( color: Colors.grey[600], thickness: 0.5, ), Row( children: [ Expanded( flex: 1, child: InkWell( onTap: () => setFilterType(FilterType.Clinic), child: ListTile( title: Text(TranslationBase.of(context).clinic), leading: Radio( value: FilterType.Clinic, groupValue: filterType, activeColor: Theme.of(context).primaryColor, onChanged: (FilterType value) { setFilterType(value); }, ), ), ), ), Expanded( flex: 1, child: InkWell( onTap: () => setFilterType(FilterType.Hospital), child: ListTile( title: Text(TranslationBase.of(context).hospital), leading: Radio( value: FilterType.Hospital, groupValue: filterType, activeColor: Theme.of(context).primaryColor, onChanged: (FilterType value) => setFilterType(value), ), ), ), ) ], ), isDataLoaded ? Expanded( child: new TabBarView( physics: NeverScrollableScrollPhysics(), children: [ getBookedAppointments(), getConfirmedAppointments(), getArrivedAppointments() ], controller: _tabController, ), ) : Container(), ]), ), ); } getPatientAppointmentHistory() { GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); widget.appoList.clear(); widget.bookedAppoList.clear(); widget.confirmedAppoList.clear(); widget.arrivedAppoList.clear(); widget._patientBookedAppointmentListHospital.clear(); widget._patientConfirmedAppointmentListHospital.clear(); widget._patientArrivedAppointmentListHospital.clear(); widget._patientBookedAppointmentListClinic.clear(); widget._patientConfirmedAppointmentListClinic.clear(); widget._patientArrivedAppointmentListClinic.clear(); service.getPatientAppointmentHistory(false, context).then((res) { print(res['AppoimentAllHistoryResultList'].length); GifLoaderDialogUtils.hideDialog(context); setState(() { if (res['MessageStatus'] == 1) { // setState(() { if (res['AppoimentAllHistoryResultList'].length != 0) { // isDataLoaded = true; res['AppoimentAllHistoryResultList'].forEach((v) { widget.appoList .add(new AppoitmentAllHistoryResultList.fromJson(v)); }); sortAppointmentList(); } else {} // }); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } isDataLoaded = true; }); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); print(err); AppToast.showErrorToast(message: err); Navigator.of(context).pop(); }); } bool isConfirmed(AppoitmentAllHistoryResultList appo) { return AppointmentType.isConfirmed(appo); } bool isArrived(AppoitmentAllHistoryResultList appo) { return AppointmentType.isArrived(appo); } bool isBooked(AppoitmentAllHistoryResultList appo) { return AppointmentType.isBooked(appo); } sortAppointmentList() { widget.appoList.forEach((v) { if (isBooked(v)) { widget.bookedAppoList.add(v); } if (isConfirmed(v)) { widget.confirmedAppoList.add(v); } if (isArrived(v)) { widget.arrivedAppoList.add(v); } }); widget.bookedAppoList.forEach((element) { List doctorByClinic = widget._patientBookedAppointmentListClinic .where( (elementClinic) => elementClinic.filterName == element.clinicName, ) .toList(); if (doctorByClinic.length != 0) { widget ._patientBookedAppointmentListClinic[widget ._patientBookedAppointmentListClinic .indexOf(doctorByClinic[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientBookedAppointmentListClinic.add(PatientAppointmentList( filterName: element.clinicName, patientDoctorAppointment: element)); } List doctorByHospital = widget._patientBookedAppointmentListHospital .where( (elementClinic) => elementClinic.filterName == element.projectName, ) .toList(); if (doctorByHospital.length != 0) { widget ._patientBookedAppointmentListHospital[widget ._patientBookedAppointmentListHospital .indexOf(doctorByHospital[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientBookedAppointmentListHospital.add(PatientAppointmentList( filterName: element.projectName, patientDoctorAppointment: element)); } }); widget.confirmedAppoList.forEach((element) { List doctorByClinic = widget._patientConfirmedAppointmentListClinic .where( (elementClinic) => elementClinic.filterName == element.clinicName, ) .toList(); if (doctorByClinic.length != 0) { widget ._patientConfirmedAppointmentListClinic[widget ._patientConfirmedAppointmentListClinic .indexOf(doctorByClinic[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientConfirmedAppointmentListClinic.add( PatientAppointmentList( filterName: element.clinicName, patientDoctorAppointment: element)); } List doctorByHospital = widget._patientConfirmedAppointmentListHospital .where( (elementClinic) => elementClinic.filterName == element.projectName, ) .toList(); if (doctorByHospital.length != 0) { widget ._patientConfirmedAppointmentListHospital[widget ._patientConfirmedAppointmentListHospital .indexOf(doctorByHospital[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientConfirmedAppointmentListHospital.add( PatientAppointmentList( filterName: element.projectName, patientDoctorAppointment: element)); } }); widget.arrivedAppoList.forEach((element) { List doctorByClinic = widget._patientArrivedAppointmentListClinic .where( (elementClinic) => elementClinic.filterName == element.clinicName, ) .toList(); if (doctorByClinic.length != 0) { widget ._patientArrivedAppointmentListClinic[widget ._patientArrivedAppointmentListClinic .indexOf(doctorByClinic[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientArrivedAppointmentListClinic.add(PatientAppointmentList( filterName: element.clinicName, patientDoctorAppointment: element)); } List doctorByHospital = widget._patientArrivedAppointmentListHospital .where( (elementClinic) => elementClinic.filterName == element.projectName, ) .toList(); if (doctorByHospital.length != 0) { widget ._patientArrivedAppointmentListHospital[widget ._patientArrivedAppointmentListHospital .indexOf(doctorByHospital[0])] .patientDoctorAppointmentList .add(element); } else { widget._patientArrivedAppointmentListHospital.add( PatientAppointmentList( filterName: element.projectName, patientDoctorAppointment: element)); } openAppointmentsTab(); }); } openAppointmentsTab() async { var flag = await this.sharedPref.getInt(IS_SEARCH_APPO); if (flag == 1) { _tabController.index = 0; } else if (flag == 2) { _tabController.index = 1; } else if (flag == 3) { _tabController.index = 2; } else { if (widget._patientBookedAppointmentListClinic.length != 0) { _tabController.index = 0; } else if (widget._patientConfirmedAppointmentListClinic.length != 0) { _tabController.index = 1; } else if (widget._patientArrivedAppointmentListClinic.length != 0) { _tabController.index = 2; return; } } } Widget getBookedAppointments() { return Container( child: Container( child: widget.bookedAppoList.length != 0 ? SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ ...List.generate( filterType == FilterType.Clinic ? widget._patientBookedAppointmentListClinic.length : widget._patientBookedAppointmentListHospital.length, (index) => AppExpandableNotifier( title: filterType == FilterType.Clinic ? widget ._patientBookedAppointmentListClinic[index] .filterName : widget ._patientBookedAppointmentListHospital[index] .filterName, bodyWidget: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: filterType == FilterType.Clinic ? widget ._patientBookedAppointmentListClinic[index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList() : widget ._patientBookedAppointmentListHospital[ index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList(), )), ) ], ), ) : Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( "assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), child: Text(TranslationBase.of(context).noBookedAppo, style: TextStyle( fontSize: 16.0, )), ), ], ), ), ), ), ); } Widget getConfirmedAppointments() { return widget.confirmedAppoList.length != 0 ? Container( margin: EdgeInsets.only(top: 10.0), child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ ...List.generate( filterType == FilterType.Clinic ? widget._patientConfirmedAppointmentListClinic.length : widget ._patientConfirmedAppointmentListHospital.length, (index) => AppExpandableNotifier( title: filterType == FilterType.Clinic ? widget ._patientConfirmedAppointmentListClinic[index] .filterName : widget ._patientConfirmedAppointmentListHospital[index] .filterName, bodyWidget: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: filterType == FilterType.Clinic ? widget ._patientConfirmedAppointmentListClinic[index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList() : widget ._patientConfirmedAppointmentListHospital[ index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList(), )), ) ], ), ), ) : Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), child: Text(TranslationBase.of(context).noConfirmedAppo, style: TextStyle( fontSize: 16.0, )), ), ], ), ), ); } Widget getArrivedAppointments() { return widget.arrivedAppoList.length != 0 ? Container( margin: EdgeInsets.only(top: 10.0), child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ ...List.generate( filterType == FilterType.Clinic ? widget._patientArrivedAppointmentListClinic.length : widget._patientArrivedAppointmentListHospital.length, (index) => AppExpandableNotifier( title: filterType == FilterType.Clinic ? widget._patientArrivedAppointmentListClinic[index] .filterName : widget._patientArrivedAppointmentListHospital[index] .filterName, bodyWidget: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: filterType == FilterType.Clinic ? widget._patientArrivedAppointmentListClinic[index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList() : widget ._patientArrivedAppointmentListHospital[index] .patientDoctorAppointmentList .map((doctor) { return AppointmentCard( appo: doctor, onReloadAppointmentHistory: getPatientAppointmentHistory, ); }).toList(), ), ), ) ], ), ), ) : Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), child: Text(TranslationBase.of(context).noArrivedAppo, style: TextStyle( fontSize: 16.0, )), ), ], ), ), ); } setFilterType(FilterType filterType) { setState(() { this.filterType = filterType; }); } }