You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
14 KiB
Dart
287 lines
14 KiB
Dart
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';
|
|
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
|
|
|
|
class SchedulePage extends StatefulWidget {
|
|
DoctorList doctorList;
|
|
AppoitmentAllHistoryResultList appo;
|
|
SchedulePage({
|
|
this.appo,
|
|
this.doctorList,
|
|
});
|
|
@override
|
|
_SchedulePageState createState() => _SchedulePageState();
|
|
}
|
|
|
|
class _SchedulePageState extends State<SchedulePage> {
|
|
DoctorsListService service;
|
|
PageController _pageController = PageController();
|
|
double currentPage = 0;
|
|
int selectedindex = 0;
|
|
List weeks = [];
|
|
List<DoctorScheduleResponse> doctorScheduleResponse = [];
|
|
int weekMS = 604800 * 1000;
|
|
DoctorList doctorList;
|
|
List<String> 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<MedicalViewModel>(
|
|
onModelReady: (model) => model.getDoctorSchedule(doctorList),
|
|
allowAny: true,
|
|
builder: (_, model, widget) => BaseView<MedicalViewModel>(
|
|
onModelReady: (model2) => model2.getFreeSlots(doctorList),
|
|
allowAny: true,
|
|
builder: (_, model2, widget2) {
|
|
if (model2.freeSlots.length > 0 && isPageChange == false && model2.state == ViewState.Idle) {
|
|
this.freeSlots = model2.freeSlots;
|
|
this.doctorScheduleResponse = model.getDoctorScheduleList;
|
|
|
|
this.generateWeeksSchedules();
|
|
} else if (model2.freeSlots.length == 0 && model2.state == ViewState.Idle) {
|
|
AppToast.showErrorToast(message: TranslationBase.of(context).emptySchedule);
|
|
Navigator.pop(context);
|
|
}
|
|
return AppScaffold(
|
|
appBarTitle: TranslationBase.of(context).schedule,
|
|
showNewAppBar: true,
|
|
showNewAppBarTitle: true,
|
|
isShowAppBar: true,
|
|
backgroundColor: Color(0xffF7F7F7),
|
|
baseViewModel: model2,
|
|
isShowDecPage: false,
|
|
body: Column(
|
|
children: [
|
|
SizedBox(height: 21),
|
|
PageViewIndicator(
|
|
isActive: true,
|
|
currentPage: this.currentPage,
|
|
length: weeks.length,
|
|
),
|
|
Expanded(
|
|
child: PageView.builder(
|
|
controller: _pageController,
|
|
itemCount: weeks.length,
|
|
onPageChanged: (index) {
|
|
setState(() {
|
|
isPageChange = true;
|
|
this.currentPage = index.toDouble();
|
|
});
|
|
},
|
|
itemBuilder: (context, index) {
|
|
return ListView.separated(
|
|
itemCount: weeks[index].length,
|
|
padding: EdgeInsets.all(21),
|
|
separatorBuilder: (context, index) => SizedBox(height: 12),
|
|
itemBuilder: (context, index2) {
|
|
bool isToday = DateUtil.convertStringToDate(weeks[index][index2]['Date']).toString().substring(0, 10) == DateTime.now().toString().substring(0, 10);
|
|
Color toDayColor = isToday ? Color(0xff359846) : Colors.white;
|
|
|
|
return InkWell(
|
|
onTap: () {
|
|
openBookAppointment(weeks[index][index2]);
|
|
},
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
flex: 1,
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
weeks[index][index2]['DayName'],
|
|
style: TextStyle(
|
|
fontSize: 13,
|
|
fontWeight: FontWeight.w600,
|
|
color: Color(0xff2E303A),
|
|
letterSpacing: -0.52,
|
|
),
|
|
),
|
|
Text(
|
|
getDayMonths(DateUtil.convertStringToDate(weeks[index][index2]['Date'])),
|
|
style: TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.w700,
|
|
color: Color(0xff2E303A),
|
|
letterSpacing: -0.72,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Expanded(
|
|
flex: 3,
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: toDayColor,
|
|
borderRadius: BorderRadius.all(
|
|
Radius.circular(10.0),
|
|
),
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: Color(0xff000000).withOpacity(.05),
|
|
blurRadius: 27,
|
|
offset: Offset(0, -3),
|
|
),
|
|
],
|
|
),
|
|
child: Container(
|
|
margin: EdgeInsets.only(left: projectViewModel.isArabic ? 0 : 6, right: projectViewModel.isArabic ? 6 : 0),
|
|
padding: EdgeInsets.symmetric(vertical: 14, horizontal: 12),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
border: Border.all(color: Colors.white, width: 1),
|
|
borderRadius: BorderRadius.only(
|
|
bottomRight: projectViewModel.isArabic ? Radius.circular(0) : Radius.circular(10.0),
|
|
topRight: projectViewModel.isArabic ? Radius.circular(0) : Radius.circular(10.0),
|
|
bottomLeft: projectViewModel.isArabic ? Radius.circular(10.0) : Radius.circular(0),
|
|
topLeft: projectViewModel.isArabic ? Radius.circular(10.0) : Radius.circular(0),
|
|
),
|
|
),
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Expanded(
|
|
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
|
if (isToday)
|
|
Text(
|
|
TranslationBase.of(context).today,
|
|
style: TextStyle(
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.w600,
|
|
color: toDayColor,
|
|
letterSpacing: -0.48,
|
|
),
|
|
),
|
|
Row(
|
|
children: [
|
|
Expanded(
|
|
child: Text(
|
|
weeks[index][index2]['WorkingHours'],
|
|
style: TextStyle(
|
|
fontSize: 13,
|
|
fontWeight: FontWeight.w600,
|
|
color: Color(0xff2E303A),
|
|
letterSpacing: -0.56,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
]),
|
|
),
|
|
Icon(Icons.arrow_forward, color: Color(0xff2B353E)),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
});
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
|
|
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<String, dynamic> 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,
|
|
// ),
|
|
// ),
|
|
// );
|
|
}
|
|
}
|