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.
517 lines
20 KiB
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);
|
|
}
|