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.
PatientApp-KKUMC/lib/pages/BookAppointment/components/LaserClinic.dart

517 lines
20 KiB
Dart

import 'dart:collection';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/laser_body_parts.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/laser_body_parts_data.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class LaserClinic extends StatefulWidget {
HospitalsModel selectedHospital;
LaserClinic({required this.selectedHospital});
@override
_LaserClinicState createState() {
return _LaserClinicState();
}
}
class _LaserClinicState extends State<LaserClinic> with SingleTickerProviderStateMixin {
List<int> _laserCategoryList = [1, 2, 11];
List<LaserBodyPart> _selectedBodyPartList = [];
bool _isFullBody = false;
late LaserBodyPart fullBody;
int _selectedCategoryIndex = 0;
List<LaserBodyPart> laserBodyPartsList = [];
late TabController _tabController;
int _duration = 0;
List<LaserCategoryType> maleLaserCategory = [];
List<LaserCategoryType> femaleLaserCategory = [];
@override
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
_tabController.addListener(() {
if (_tabController.indexIsChanging) {
} else {
_selectedBodyPartList = [];
laserBodyPartsList = [];
_selectedCategoryIndex = 0;
setState(() {});
if (_tabController.index == 0) {
callLaserBodyPartsAPI(maleLaserCategory[_selectedCategoryIndex].laserCategoryID);
} else {
callLaserBodyPartsAPI(femaleLaserCategory[_selectedCategoryIndex].laserCategoryID);
}
}
});
Future.delayed(Duration.zero, () {
callLaserBodyPartsAPI(maleLaserCategory[_selectedCategoryIndex].laserCategoryID);
});
}
callLaserBodyPartsAPI(int laserCategoryId) async {
GifLoaderDialogUtils.showMyDialog(context);
DoctorsListService service = new DoctorsListService();
service.getLaserBodyPartsList(laserCategoryId, widget.selectedHospital.iD, projectViewModel.isArabic ? 1 : 2).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res['MessageStatus'] == 1) {
if (res['Laser_GetBodyPartsByCategoryList'].length != 0) {
List<LaserBodyPart> _tempList = [];
res['Laser_GetBodyPartsByCategoryList'].forEach((v) {
_tempList.add(LaserBodyPart.fromJson(v));
});
if (_tempList[0].category == 1 || _tempList[0].category == 11 || _tempList[0].category == 2 || _tempList[0].category == 10) {
fullBody = _tempList[0];
_tempList.removeAt(0);
}
laserBodyPartsList = _tempList;
} else {}
setState(() {});
} else {
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
AppToast.showErrorToast(message: err);
});
}
bool lastIndexIsFirst = false;
bool isLastIndexIsBack = false;
late ProjectViewModel projectViewModel;
bool get isMale => _tabController.index == 0;
@override
void dispose() {
super.dispose();
_tabController.dispose();
}
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
maleLaserCategory = [
LaserCategoryType(1, TranslationBase.of(context).bodyString),
LaserCategoryType(2, TranslationBase.of(context).face),
LaserCategoryType(11, TranslationBase.of(context).retouch),
];
femaleLaserCategory = [
LaserCategoryType(1, TranslationBase.of(context).bodyString),
LaserCategoryType(2, TranslationBase.of(context).face),
LaserCategoryType(10, TranslationBase.of(context).bikini),
LaserCategoryType(11, TranslationBase.of(context).retouch),
];
return AppScaffold(
appBarTitle: TranslationBase.of(context).laserClinic,
showNewAppBar: true,
showNewAppBarTitle: true,
isShowDecPage: false,
backgroundColor: Color(0xfff7f7f7),
body: Column(
children: [
TabBar(
controller: _tabController,
indicatorWeight: 3.0,
indicatorSize: TabBarIndicatorSize.tab,
labelColor: Color(0xff2B353E),
unselectedLabelColor: Color(0xff575757),
labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20),
labelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins',
letterSpacing: -0.48,
),
unselectedLabelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins',
letterSpacing: -0.48,
),
tabs: [Text(TranslationBase.of(context).male), Text(TranslationBase.of(context).female)],
),
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController,
children: <Widget>[male(), female()],
),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).totalMinutes + ":",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: Color(0xff575757),
letterSpacing: -0.48,
),
),
Text(
"${getDuration()} / 90",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Color(0xff2E303A),
letterSpacing: -0.64,
),
),
],
),
),
Expanded(
child: DefaultButton(
TranslationBase.of(context).continues,
getDuration() != 0
? () {
callDoctorsSearchAPI();
}
: null,
color: CustomColors.green,
disabledColor: CustomColors.grey2,
),
),
],
).insideContainer,
],
),
);
}
callDoctorsSearchAPI() {
int languageID = projectViewModel.isArabic ? 1 : 2;
GifLoaderDialogUtils.showMyDialog(context, barrierDismissible: false);
List<DoctorList> doctorsList = [];
List<String> arr = [];
List<String> arrDistance = [];
List<String> result;
int numAll;
List<PatientDoctorAppointmentList> _patientDoctorAppointmentListHospital =[];
DoctorsListService service = new DoctorsListService();
projectViewModel.selectedBodyPartList = _selectedBodyPartList;
service.getDoctorsList(253, 0, false, languageID, context).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res['MessageStatus'] == 1) {
setState(() {
if (res['DoctorList'].length != 0) {
doctorsList.clear();
res['DoctorList'].forEach((v) {
doctorsList.add(new DoctorList.fromJson(v));
});
doctorsList.forEach((element) {
List<PatientDoctorAppointmentList> doctorByHospital = _patientDoctorAppointmentListHospital
.where(
(elementClinic) => elementClinic.filterName == element.projectName,
)
.toList();
if (doctorByHospital.length != 0) {
_patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element);
} else {
_patientDoctorAppointmentListHospital
.add(PatientDoctorAppointmentList(filterName: element.projectName, distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element));
}
});
} else {}
});
result = LinkedHashSet<String>.from(arr).toList();
numAll = result.length;
projectViewModel.laserSelectionDuration = _duration;
navigateToSearchResults(context, doctorsList, _patientDoctorAppointmentListHospital);
} else {
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
AppToast.showErrorToast(message: err);
});
}
Future navigateToSearchResults(context, List<DoctorList> docList, List<PatientDoctorAppointmentList> patientDoctorAppointmentListHospital) async {
Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital)))
.then((value) {
setState(() {
// dropdownValue = null;
});
// getProjectsList();
});
}
int getDuration() {
int duration = 0;
if (_isFullBody) {
_duration = int.parse(fullBody.timeDuration!);
projectViewModel.laserSelectionDuration = duration;
return _duration;
}
var lowerUpperLegsList = _selectedBodyPartList.where((element) => element.mappingCode == "47" || element.mappingCode == "48")?.toList() ?? [];
var upperLowerArmsList = _selectedBodyPartList.where((element) => element.mappingCode == "40" || element.mappingCode == "41")?.toList() ?? [];
if (_selectedBodyPartList.length > 0) {
duration = _selectedBodyPartList.fold(0, (previousValue, element) => previousValue + int.parse(element.timeDuration!));
}
if (lowerUpperLegsList.length == 2) {
duration -= 30;
}
if (upperLowerArmsList.length == 2) {
duration -= 15;
}
_duration = duration;
projectViewModel.laserSelectionDuration = duration;
return duration;
}
Widget laserCategoryWidget(List<LaserCategoryType> list, VoidCallback onTap) {
return SizedBox(
height: 40,
child: ListView.separated(
itemCount: list.length,
physics: BouncingScrollPhysics(),
scrollDirection: Axis.horizontal,
separatorBuilder: (cxt, index) => SizedBox(width: 8),
itemBuilder: (cxt, index) {
return InkWell(
onTap: () {
// setState(() {
_selectedCategoryIndex = index;
// });
onTap();
},
child: Container(
decoration: BoxDecoration(
color: _selectedCategoryIndex == index ? Color(0xffD02127) : Colors.white,
borderRadius: BorderRadius.circular(36),
border: Border.all(
width: 1,
color: _selectedCategoryIndex == index ? Colors.transparent : Color(0xffEAEAEA),
),
),
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 26),
child: Text(
list[index].title,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: _selectedCategoryIndex == index ? Colors.white : Color(0xff535353),
letterSpacing: -0.48,
),
),
),
);
},
),
);
}
Widget bodyPartsGridView() {
return Container(
padding: EdgeInsets.symmetric(vertical: 21, horizontal: 14),
margin: EdgeInsets.only(top: 16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
Radius.circular(15.0),
),
boxShadow: [
BoxShadow(
color: Color(0xff000000).withOpacity(.05),
blurRadius: 27,
offset: Offset(0, -3),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (fullBody != null)
Row(
children: [
SizedBox(
width: 22,
height: 22,
child: Theme(
data: Theme.of(context).copyWith(
unselectedWidgetColor: Color(0xffEAEAEA),
),
child: Checkbox(
value: _isFullBody,
onChanged: (value) {
setState(() {
if (value!) {
_selectedBodyPartList.clear();
_selectedBodyPartList.add(fullBody);
} else {
_selectedBodyPartList.clear();
}
_isFullBody = !_isFullBody;
});
},
activeColor: Color(0xffD02127),
),
),
),
SizedBox(width: 12),
Text(
projectViewModel.isArabic ? fullBody.bodyPartN! : fullBody.bodyPart!,
style: TextStyle(fontSize: 15, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.6, height: 21 / 14),
),
],
),
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 85 / 107, crossAxisSpacing: 4, mainAxisSpacing: 21),
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: laserBodyPartsList.length,
padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero,
itemBuilder: (BuildContext context, int index) {
bool _isSelected = _selectedBodyPartList.any((file) => file.id == laserBodyPartsList[index].id);
return InkWell(
onTap: _isFullBody
? null
: () {
if (_duration >= 90) {
if (_isSelected) {
_selectedBodyPartList.removeWhere((element) => element.id == laserBodyPartsList[index].id);
// _selectedBodyPartList.remove(laserBodyPartsList[index]);
setState(() {});
return;
}
AppToast.showToast(message: TranslationBase.of(context).laserMaxLimitReach);
return;
}
if (_isSelected) {
_selectedBodyPartList.removeWhere((element) => element.id == laserBodyPartsList[index].id);
// _selectedBodyPartList.remove(laserBodyPartsList[index]);
} else {
if (_duration + int.parse(laserBodyPartsList[index].timeDuration!) > 90) {
AppToast.showToast(message: TranslationBase.of(context).laserMaxLimitReach);
return;
}
_selectedBodyPartList.add(laserBodyPartsList[index]);
}
setState(() {});
},
child: AnimatedOpacity(
opacity: _isFullBody ? 0.25 : 1.0,
duration: Duration(milliseconds: 200),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 97 / 97,
child: FittedBox(
fit: BoxFit.fitWidth,
child: Stack(
alignment: Alignment.topRight,
children: [
Container(
margin: EdgeInsets.only(top: 5, right: 5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
border: Border.all(color: _isSelected ? Color(0xffD02127) : Color(0xffEAEAEA), width: 2),
),
child: LaserBodyParts()
.getCategoryImage(isMale, (isMale ? maleLaserCategory : femaleLaserCategory)[_selectedCategoryIndex].laserCategoryID, laserBodyPartsList[index].mappingCode!),
),
if (_isSelected)
Container(
width: 18,
height: 18,
child: Icon(Icons.done, color: Colors.white, size: 12),
decoration: BoxDecoration(
color: Color(0xffD02127),
borderRadius: BorderRadius.circular(30.0),
),
),
],
),
),
),
SizedBox(height: 6),
Expanded(
child: Text(
projectViewModel.isArabic ? laserBodyPartsList[index].bodyPartN! : laserBodyPartsList[index].bodyPart!,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.48,
),
maxLines: 1,
),
),
],
),
),
);
},
),
],
),
);
}
Widget male() {
return ListView(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.all(21),
children: [
laserCategoryWidget(maleLaserCategory, () {
callLaserBodyPartsAPI(maleLaserCategory[_selectedCategoryIndex].laserCategoryID);
}),
if (laserBodyPartsList.isNotEmpty) bodyPartsGridView()
],
);
}
Widget female() {
return ListView(
physics: BouncingScrollPhysics(),
padding: EdgeInsets.all(21),
children: [
laserCategoryWidget(femaleLaserCategory, () {
callLaserBodyPartsAPI(femaleLaserCategory[_selectedCategoryIndex].laserCategoryID);
}),
if (laserBodyPartsList.isNotEmpty) bodyPartsGridView()
],
);
}
}
class LaserCategoryType {
int laserCategoryID;
String title;
LaserCategoryType(this.laserCategoryID, this.title);
}