import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/models/DoctorScheduleResponse.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/widgets/indicator.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/medical_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:provider/provider.dart'; class SchedulePage extends StatefulWidget { DoctorList doctorList; AppoitmentAllHistoryResultList appo; SchedulePage({ this.appo, this.doctorList, }); @override _SchedulePageState createState() => _SchedulePageState(); } class _SchedulePageState extends State { DoctorsListService service; PageController _pageController = PageController(); double currentPage = 0; int selectedindex = 0; List weeks = []; List doctorScheduleResponse = []; int weekMS = 604800 * 1000; DoctorList doctorList; List freeSlots = []; bool isPageChange = false; AppSharedPreferences sharedPref = AppSharedPreferences(); @override void initState() { this.doctorList = widget.doctorList; super.initState(); } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getDoctorSchedule(doctorList), allowAny: true, builder: (_, model, widget) => BaseView( onModelReady: (model2) => model2.getFreeSlots(doctorList), allowAny: true, builder: (_, model2, widget2) { if (model.freeSlots.length > 0 && isPageChange == false) { this.freeSlots = model.freeSlots; this.doctorScheduleResponse = model.getDoctorScheduleList; this.generateWeeksSchedules(); } return AppScaffold( appBarTitle: TranslationBase.of(context).schedule, showNewAppBar: true, showNewAppBarTitle: true, isShowAppBar: true, baseViewModel: model2, isShowDecPage: false, body: SizedBox( height: MediaQuery.of(context).size.height, child: Stack( children: [ Container( margin: EdgeInsets.only(top: 40), child: PageView.builder( controller: _pageController, itemCount: weeks.length, onPageChanged: (index) { setState(() { isPageChange = true; this.currentPage = index.toDouble(); }); }, itemBuilder: (context, index) { return Container( child: ListView.builder( itemCount: weeks[index].length, itemBuilder: (context, index2) => InkWell( onTap: () { openBookAppointment(weeks[index][index2]); }, child: Row( children: [ Expanded( flex: 1, child: Padding( padding: projectViewModel.isArabic ? EdgeInsets.only(right: 20) : EdgeInsets.only(left: 20), child: Row(children: [ Column( children: [ Texts( weeks[index][index2]['DayName'], fontSize: 13, fontWeight: projectViewModel.isArabic ? FontWeight.w600 : FontWeight.w500, ), Texts( getDayMonths( DateUtil.convertStringToDate( weeks[index][index2]['Date'], ), ), fontWeight: FontWeight.bold, fontSize: 18, ) ], ) ])), ), Expanded( flex: 3, child: ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(20.0)), child: Container( padding: EdgeInsets.only(left: 10, right: 10, top: 15, bottom: 20), margin: EdgeInsets.only(left: 20, right: 20, top: 7, bottom: 7), decoration: BoxDecoration(boxShadow: [ DateUtil.convertStringToDate(weeks[index][index2]['Date']).toString().substring(0, 10) == DateTime.now().toString().substring(0, 10) ? BoxShadow(color: Colors.green, offset: Offset(projectViewModel.isArabic ? 5 : -5, 0)) : BoxShadow( color: Colors.grey[100], blurRadius: 5, spreadRadius: 4, offset: Offset(0, 10), ), ], borderRadius: const BorderRadius.all(Radius.circular(10.0)), color: Colors.white), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ DateUtil.convertStringToDate(weeks[index][index2]['Date']).toString().substring(0, 10) == DateTime.now().toString().substring(0, 10) ? Texts( TranslationBase.of(context).today, color: Colors.green, fontWeight: FontWeight.w600, fontSize: 12, marginTop: 0, ) : SizedBox(), Row( children: [ Expanded( child: Texts( weeks[index][index2]['WorkingHours'], fontWeight: FontWeight.w500, ), ) ], ) ]))), ) ], )))); }, )), PageViewIndicator( isActive: true, currentPage: this.currentPage, length: weeks.length, ) ], ))); })); } generateWeeksSchedules() { this.weeks.clear(); for (var i = 0; i < 8; i++) { var weekSchedule = generateNewWeekSchedule(i); this.markWeekFreeDays(weekSchedule); this.weeks.add(weekSchedule); } //print(this.weeks); } markWeekFreeDays(schedule) { for (var workDay in schedule) { workDay['fullDay'] = !this.hasFreeSlot(workDay['Date']); } } generateNewWeekSchedule(weekIndex) { var weekMSOffset = weekIndex * weekMS; var newWeekSchedule = []; for (var workDay in this.doctorScheduleResponse) { Map newWorkDay = Map(); newWorkDay['Date'] = DateUtil.convertDateMSToJsonDate(DateUtil.convertStringToDate(workDay.date).millisecondsSinceEpoch + weekMSOffset); newWorkDay['DayName'] = workDay.dayName; newWorkDay['WorkingHours'] = workDay.workingHours; newWeekSchedule.add(newWorkDay); } return newWeekSchedule; } hasFreeSlot(String jsonDate) { var date = DateUtil.convertStringToDate(jsonDate); var scheduleDay = date; for (var event in this.freeSlots) { var date = DateUtil.convertStringToDate(event); var nDate = DateTime(date.year, date.month, date.day); if (nDate.millisecondsSinceEpoch == scheduleDay.millisecondsSinceEpoch) { return true; } } return false; } String getDayMonths(DateTime dateTime) { String dateFormat = '${dateTime.day} ${DateUtil.getMonth(dateTime.month).toString().substring(0, 3)}'; return dateFormat; } openBookAppointment(selectedDate) { //sharedPref.setObject(DOCTOR_SCHEDULE_DATE_SEL, selectedDate); Navigator.of(context).pop(selectedDate); // Navigator.push( // context, // FadePage( // page: AppointmentDetails( // appo: widget.appo, // doctorSchedule: selectedDate, // ), // ), // ); } }