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.
HMG_Patient_App/lib/pages/BookAppointment/search_result/SearchResultWithTab.dart

591 lines
22 KiB
Dart

import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/OBGyneProcedureListResponse.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/search_result/ResultByFacility.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/search_result/ResultByHospital.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/search_result/ResultByRegion.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
class SearchResultWithTab extends StatefulWidget {
List<DoctorList> doctorsList = [];
RegionList patientDoctorAppointmentListHospital;
bool isLiveCareAppointment;
bool isObGyneAppointment;
bool isDoctorNameSearch;
OBGyneProcedureListResponse? obGyneProcedureListResponse;
bool isDoctorSearchResult;
SearchResultWithTab({required this.doctorsList,
required this.patientDoctorAppointmentListHospital,
this.isObGyneAppointment = false,
this.isDoctorNameSearch = false,
required this.isLiveCareAppointment,
required this.isDoctorSearchResult,
this.obGyneProcedureListResponse});
@override
State<SearchResultWithTab> createState() => _SearchResultWithTabState();
}
class _SearchResultWithTabState extends State<SearchResultWithTab> {
int _currentIndex = 0;
late PageController _controller;
String selectedRegion = "";
bool isHMCSelected = false;
int selectedHospitalIndex = -1;
@override
void initState() {
super.initState();
_controller = new PageController();
}
changePageViewIndex(pageIndex) {
_controller.jumpToPage(pageIndex);
}
@override
Widget build(BuildContext context) {
return AppScaffold(
appBarTitle: getTitle(),
isShowDecPage: false,
isShowAppBar: true,
showNewAppBarTitle: true,
showNewAppBar: true,
backgroundColor: CustomColors.appBackgroudGrey2Color,
body: widget.patientDoctorAppointmentListHospital
.registeredDoctorMap?.isNotEmpty ==
true
? SingleChildScrollView(
child: Column(children: <Widget>[
Container(
width: double.infinity,
padding: EdgeInsets.only(left: 20, right: 20, top: 12),
child: Row(
children: [
Expanded(
child: showProgress(
title: TranslationBase
.of(context)
.selectRegion,
status: _currentIndex == 0
? TranslationBase
.of(context)
.inPrgress
: _currentIndex > 0
? TranslationBase
.of(context)
.completed
: TranslationBase
.of(context)
.locked,
color: _currentIndex == 0
? CustomColors.orange
: CustomColors.green,
),
),
Expanded(
child: showProgress(
title: TranslationBase
.of(context)
.selectFacitlity,
status: _currentIndex == 1
? TranslationBase
.of(context)
.inPrgress
: _currentIndex > 1
? TranslationBase
.of(context)
.completed
: TranslationBase
.of(context)
.locked,
color: _currentIndex == 1
? CustomColors.orange
: _currentIndex > 1
? CustomColors.green
: CustomColors.grey2,
),
),
showProgress(
title: TranslationBase
.of(context)
.selectBranch,
status: _currentIndex == 2 ? TranslationBase
.of(context)
.inPrgress : TranslationBase
.of(context)
.locked,
color: _currentIndex == 2
? CustomColors.orange
: _currentIndex > 3
? CustomColors.green
: CustomColors.grey2,
isNeedBorder: false,
),
showProgress(
title: TranslationBase
.of(context)
.selectDoctor,
status: _currentIndex == 3 ? TranslationBase
.of(context)
.inPrgress : TranslationBase
.of(context)
.locked,
color: _currentIndex == 3
? CustomColors.orange
: _currentIndex > 4
? CustomColors.green
: CustomColors.grey2,
isNeedBorder: false,
),
],
),
),
Expanded(
child: PageView(
physics: NeverScrollableScrollPhysics(),
controller: _controller,
onPageChanged: (index) {
setState(() {
_currentIndex = index;
});
},
scrollDirection: Axis.horizontal,
children: <Widget>[
ResultByRegion(doctorsList: widget.doctorsList,
patientDoctorAppointmentListHospital: widget
.patientDoctorAppointmentListHospital,
onRegionSelected: (key) {
setState(() {
selectedRegion = key;
});
}),
(selectedRegion != "")
?
ResultByFacility(doctorsList: widget.doctorsList,
patientDoctorAppointmentListHospital: widget
.patientDoctorAppointmentListHospital,
selectedRegion: selectedRegion,
onFacilitySelected: (isHMCSelected) {
setState(() {
isHMCSelected = isHMCSelected;
});
},
) : SizedBox.shrink(),
(selectedRegion != '') ?
ResultByHospital(doctorsList: widget.doctorsList,
paitientDoctorAppointmentList: (isHMCSelected)?
widget.patientDoctorAppointmentListHospital
.registeredDoctorMap![selectedRegion]!.hmgDoctorList ?? []
: widget.patientDoctorAppointmentListHospital
.registeredDoctorMap?[selectedRegion]?.hmgDoctorList ?? [],
isHMCSelected: isHMCSelected,
isLiveCareAppointment: widget.isLiveCareAppointment,
isDoctorSearchResult: widget.isDoctorSearchResult,
onHospitalSelected: (hospital,index) {
setState(() {
selectedHospitalIndex = index;
});
}): SizedBox.shrink(),
],
),
),
]))
: getNoDataWidget(context),);
}
String getTitle() {
switch (_currentIndex) {
case 0:
return TranslationBase
.of(context)
.selectRegion;
case 1:
return TranslationBase
.of(context)
.selectFacitlity;
case 2:
return TranslationBase
.of(context)
.selectBranch;
case 3:
return TranslationBase
.of(context)
.selectDoctor;
}
return "";
}
Widget showProgress(
{String? title, String? status, Color? color, bool isNeedBorder = true}) {
return InkWell(
onTap: () {
if (status == TranslationBase
.of(context)
.completed) {
changePageViewIndex(_currentIndex);
}
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
width: 26,
height: 26,
decoration: containerRadius(color!, 200),
child: Icon(
Icons.done,
color: Colors.white,
size: 16,
),
),
if (isNeedBorder)
Expanded(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: mDivider(Colors.grey),
)),
],
),
mHeight(8),
Text(
title!,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
letterSpacing: -0.44,
),
),
mHeight(2),
Container(
padding: EdgeInsets.all(5),
decoration: containerRadius(color!.withOpacity(0.2), 4),
child: Text(
status!,
style: TextStyle(
fontSize: 8,
fontWeight: FontWeight.w600,
letterSpacing: -0.32,
color: color,
),
),
),
],
)
],
),
);
}
}
class HospitalBodyWidget extends StatelessWidget {
final List<PatientDoctorAppointmentList>?
patientDoctorAppointmentListHospital;
final bool isLiveCareAppointment;
final bool isObGyneAppointment;
final bool isDoctorNameSearch;
final bool isDoctorSearchResult;
final OBGyneProcedureListResponse? obGyneProcedureListResponse;
const HospitalBodyWidget({
super.key,
this.patientDoctorAppointmentListHospital,
required this.isLiveCareAppointment,
required this.isObGyneAppointment,
required this.isDoctorNameSearch,
required this.isDoctorSearchResult,
this.obGyneProcedureListResponse,
});
@override
Widget build(BuildContext context) {
return ListView.separated(
addAutomaticKeepAlives: true,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: patientDoctorAppointmentListHospital?.length ?? 0,
separatorBuilder: (context, index) {
return Container(
height: 12,
margin: EdgeInsets.only(left: 21, right: 21),
);
},
itemBuilder: (context, index) {
return AppExpandableNotifier(
applyBackgroundColor: false,
widgetColor: CustomColors.appBackgroudGrey2Color,
title: (patientDoctorAppointmentListHospital?[index].distanceInKMs !=
"0")
? patientDoctorAppointmentListHospital![index].filterName! +
" - " +
patientDoctorAppointmentListHospital![index].distanceInKMs! +
" " +
TranslationBase
.of(context)
.km
: patientDoctorAppointmentListHospital![index].filterName,
projectTitleTop:
patientDoctorAppointmentListHospital![index].projectTopName,
projectTitleBottom: (patientDoctorAppointmentListHospital![index]
.distanceInKMs !=
"0")
? patientDoctorAppointmentListHospital![index]
.projectBottomName
.toString() +
" - " +
patientDoctorAppointmentListHospital![index].distanceInKMs! +
" " +
TranslationBase
.of(context)
.km
: patientDoctorAppointmentListHospital![index]
.projectBottomName
.toString(),
isTitleSingleLine: false,
isDoctorSearchResult: isDoctorSearchResult,
isExpand:
patientDoctorAppointmentListHospital?.length == 1 ? true : false,
bodyWidget: ListView.separated(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
padding:
EdgeInsets.only(bottom: 10, top: 10, left: 21, right: 21),
itemBuilder: (context, _index) {
// print("the index of patientDoctorAppointmentList is ${_index}");
// print("the index of parent is ${index}");
final doctor = patientDoctorAppointmentListHospital![index]
.patientDoctorAppointmentList![_index];
// print('the doctor is ${doctor.toJson()}');
return DoctorView(
doctor: doctor,
isLiveCareAppointment: isLiveCareAppointment,
isObGyneAppointment: isObGyneAppointment,
isDoctorNameSearch: isDoctorNameSearch,
obGyneProcedureListResponse: obGyneProcedureListResponse,
isShowDate: false,
onTap: () {
context
.read<ProjectViewModel>()
.analytics
.appointment
.book_appointment_select_doctor(
appointment_type: 'regular', doctor: doctor);
});
},
separatorBuilder: (context, index) => SizedBox(height: 14),
itemCount: patientDoctorAppointmentListHospital?[index]
.patientDoctorAppointmentList?.length ?? 0),
);
},
);
}
}
class RegionTitle extends StatelessWidget {
final String title;
final String hmcCount;
final String hmgCount;
const RegionTitle({super.key,
required this.title,
required this.hmcCount,
required this.hmgCount});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(
fontSize: 22, color: Colors.black, fontWeight: FontWeight.w700),
),
SizedBox(
height: 8,
),
Row(
children: [
Text(
"${TranslationBase
.of(context)
.hmgHospitalCount
.replaceAll("@", hmgCount)} ,",
style: TextStyle(
fontSize: 14,
color: Color(0xFFD02127),
fontWeight: FontWeight.w600),
),
SizedBox(
width: 8,
),
Text(
"${TranslationBase
.of(context)
.hmcHospitalCount
.replaceAll("@", hmcCount)}",
style: TextStyle(
fontSize: 14,
color: Color(0xFF40ACC9),
fontWeight: FontWeight.w600),
),
],
),
],
),
);
}
}
class HospitalTitle extends StatelessWidget {
final String title;
final String iconUrl;
final bool isHMC;
final String itemCount;
const HospitalTitle({super.key,
required this.title,
required this.iconUrl,
required this.isHMC,
required this.itemCount});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
SvgPicture.asset(iconUrl),
SizedBox(
width: 8,
),
Text(
title,
style: TextStyle(
fontSize: 18,
color: isHMC ? Color(0xFF40ACC9) : Color(0xFFD02127),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 6,
),
Text(
isHMC
? "${TranslationBase
.of(context)
.hmcHospitalCount
.replaceAll("@", itemCount)}"
: "${TranslationBase
.of(context)
.hmgHospitalCount
.replaceAll("@", itemCount)}",
style: TextStyle(
fontSize: 12, color: Colors.black, fontWeight: FontWeight.w600),
),
],
),
);
}
}
///todo the current content of the application
/// return AppExpandableNotifier(
// paddingValue: 10,
// applyBackgroundToOnlyHeader: true,
// completeHeaderColor: CustomColors.appBackgroudGrey2Color,
// headerWidget: RegionTitle(
// title: key,
// hmcCount:
// "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmcSize ?? 0}",
// hmgCount:
// "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmgSize ?? 0}",
// ),
// showDropDownIconWithCustomHeader: true,
// isTitleSingleLine: false,
// isDoctorSearchResult: widget.isDoctorSearchResult,
// widgetColor: Color(0xFFF8F8F8),
// bodyWidget: Column(
// children: [
// Padding(
// padding: const EdgeInsets.all(8.0),
// child: AppExpandableNotifier(
// paddingValue: 8,
// applyBackgroundColor: false,
// applyBackgroundToOnlyHeader: true,
// completeHeaderColor: Colors.white,
// headerRadius: BorderRadius.circular(16),
// headerWidget: HospitalTitle(
// iconUrl: 'assets/images/svg/HMG.svg',
// title: TranslationBase.of(context).hmgHospital,
// isHMC: false,
// itemCount:
// "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmgSize ?? 0}",
// ),
// showDropDownIconWithCustomHeader: true,
// bodyWidget: HospitalBodyWidget(
// patientDoctorAppointmentListHospital:
// widget.patientDoctorAppointmentListHospital
// .registeredDoctorMap?[key]?.hmgDoctorList,
// isLiveCareAppointment: widget.isLiveCareAppointment,
// isObGyneAppointment: widget.isObGyneAppointment,
// isDoctorNameSearch: widget.isDoctorNameSearch,
// isDoctorSearchResult: widget.isDoctorSearchResult,
// ),
// ),
// ),
// Padding(
// padding: const EdgeInsets.only(
// bottom: 8.0, left: 8, right: 8),
// child: AppExpandableNotifier(
// paddingValue: 8,
// applyBackgroundColor: false,
// applyBackgroundToOnlyHeader: true,
// completeHeaderColor: Colors.white,
// headerRadius: BorderRadius.circular(16),
// headerWidget: HospitalTitle(
// iconUrl: 'assets/images/svg/HMC.svg',
// title: TranslationBase.of(context).hmcHospital,
// isHMC: true,
// itemCount:
// "${widget.patientDoctorAppointmentListHospital.registeredDoctorMap?[key]?.hmcSize ?? 0}",
// ),
// showDropDownIconWithCustomHeader: true,
// bodyWidget: HospitalBodyWidget(
// patientDoctorAppointmentListHospital:
// widget.patientDoctorAppointmentListHospital
// .registeredDoctorMap?[key]?.hmcDoctorList,
// isLiveCareAppointment: widget.isLiveCareAppointment,
// isObGyneAppointment: widget.isObGyneAppointment,
// isDoctorNameSearch: widget.isDoctorNameSearch,
// isDoctorSearchResult: widget.isDoctorSearchResult,
// ),
// ),
// ),
// ],
// ));