|
|
|
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';
|
|
|
|
|
|
|
|
class SchedulePage extends StatefulWidget {
|
|
|
|
final DoctorList doctorList;
|
|
|
|
final 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) {
|
|
|
|
return BaseView<MedicalViewModel>(
|
|
|
|
onModelReady: (model) => model.getDoctorSchedule(doctorList),
|
|
|
|
builder: (_, model, widget) => BaseView<MedicalViewModel>(
|
|
|
|
onModelReady: (model2) => model2.getFreeSlots(doctorList),
|
|
|
|
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,
|
|
|
|
isShowAppBar: true,
|
|
|
|
baseViewModel: model2,
|
|
|
|
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:
|
|
|
|
EdgeInsets.only(
|
|
|
|
left: 20),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Column(
|
|
|
|
children: [
|
|
|
|
Texts(
|
|
|
|
weeks[index][index2]
|
|
|
|
[
|
|
|
|
'DayName'],
|
|
|
|
fontSize:
|
|
|
|
13,
|
|
|
|
),
|
|
|
|
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: 20,
|
|
|
|
bottom:
|
|
|
|
20),
|
|
|
|
margin: EdgeInsets.only(
|
|
|
|
left: 20,
|
|
|
|
right: 20,
|
|
|
|
top: 7,
|
|
|
|
bottom: 7),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
boxShadow: [
|
|
|
|
weeks[index][index2]['fullDay'] ==
|
|
|
|
false
|
|
|
|
? BoxShadow(
|
|
|
|
color: Colors.green,
|
|
|
|
offset: Offset(-5, 0))
|
|
|
|
: BoxShadow(),
|
|
|
|
],
|
|
|
|
borderRadius:
|
|
|
|
const BorderRadius.all(Radius.circular(
|
|
|
|
10.0)),
|
|
|
|
color: Colors
|
|
|
|
.white),
|
|
|
|
child: Row(
|
|
|
|
children: [
|
|
|
|
Expanded(
|
|
|
|
child:
|
|
|
|
Texts(
|
|
|
|
weeks[index][index2]
|
|
|
|
[
|
|
|
|
'WorkingHours'],
|
|
|
|
fontWeight:
|
|
|
|
FontWeight.w400,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
))),
|
|
|
|
)
|
|
|
|
],
|
|
|
|
))));
|
|
|
|
},
|
|
|
|
)),
|
|
|
|
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<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.push(
|
|
|
|
context,
|
|
|
|
FadePage(
|
|
|
|
page: AppointmentDetails(
|
|
|
|
appo: widget.appo,
|
|
|
|
doctorSchedule: selectedDate,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|