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/ErService/AmbulanceRequestIndexPages/PickupLocation.dart

704 lines
33 KiB
Dart

import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/er/PatientER.dart';
import 'package:diplomaticquarterapp/core/model/er/PatientER_RC.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/models/ambulanceRequest/locationDetails.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/location_util.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/radio_selection_dialog.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/pickupLocation/PickupLocationFromMap.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../AvailableAppointmentsPage.dart';
enum HaveAppointment { YES, NO }
class PickupLocation extends StatefulWidget {
final Function changeCurrentTab;
final PatientER patientER;
final PatientER_RC patientER_RC;
final AmRequestViewModel amRequestViewModel;
PickupLocation({Key? key, required this.changeCurrentTab, required this.patientER, required this.patientER_RC, required this.amRequestViewModel});
@override
_PickupLocationState createState() => _PickupLocationState();
}
class _PickupLocationState extends State<PickupLocation> {
bool _isInsideHome = false;
HaveAppointment _haveAppointment = HaveAppointment.NO;
// double _latitude;
// double _longitude;
AppoitmentAllHistoryResultList? myAppointment;
HospitalsModel? _selectedHospital;
LocationDetails? _result ;
LocationUtils? locationUtils;
late ProjectViewModel projectViewModel;
@override
void initState() {
super.initState();
locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context);
WidgetsBinding.instance.addPostFrameCallback((_) => locationUtils!.getCurrentLocation());
setState(() {});
}
// _getCurrentLocation() async {
// await Geolocator.getLastKnownPosition().then((value) {
// _latitude = value.latitude;
// _longitude = value.longitude;
// }).catchError((e) {
// _longitude = 0;
// _latitude = 0;
// });
// }
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return AppScaffold(
isShowAppBar: false,
isShowDecPage: false,
body: SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: Container(
margin: EdgeInsets.only(left: 12, right: 12, top: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.patientER_RC.transportationDetails!.direction == 0)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(TranslationBase.of(context).pickupLocation, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 15,
),
Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: () {
if (projectViewModel.latitude != null && projectViewModel.longitude != null) {
Navigator.push(
context,
FadePage(
page: PickupLocationFromMap(
latitude: projectViewModel.latitude ?? 0,
longitude: projectViewModel.longitude ?? 0,
onPick: (value) {
setState(() {
_result = value;
});
},
)),
);
} else {
locationUtils!.getCurrentLocation();
}
},
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).selectMap,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
Text(
getSelectFromMapName(context),
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
],
),
),
Icon(Icons.arrow_drop_down),
],
),
),
),
SizedBox(
height: 12,
),
Text(TranslationBase.of(context).pickupSpot, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 5,
),
InkWell(
onTap: () {
setState(() {
_isInsideHome = !_isInsideHome;
});
},
child: Container(
child: ListTile(
contentPadding: EdgeInsets.only(left: 0.0, right: 0.0),
title: Row(
children: [
Checkbox(
value: _isInsideHome,
onChanged: (value) {
setState(() {
_isInsideHome = value!;
});
},
),
Text(
TranslationBase.of(context).insideHome,
style: TextStyle(
fontSize: 12.0,
letterSpacing: -0.48,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
),
SizedBox(
height: 12,
),
Text(TranslationBase.of(context).haveAppo, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 5,
),
Row(
children: [
Expanded(
child: InkWell(
onTap: () {
if (myAppointment == null) {
getAppointment();
setState(() {
_haveAppointment = HaveAppointment.YES;
});
}
},
child: Container(
child: ListTile(
contentPadding: EdgeInsets.only(left: 0.0, right: 0.0),
title: Row(
children: [
Radio(
value: HaveAppointment.YES,
groupValue: _haveAppointment,
onChanged: (value) {
if (myAppointment == null) {
getAppointment();
setState(() {
_haveAppointment = value!;
});
}
},
),
Text(
TranslationBase.of(context).yes,
style: TextStyle(
fontSize: 12.0,
letterSpacing: -0.48,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
),
),
Expanded(
child: InkWell(
onTap: () {
setState(() {
_haveAppointment = HaveAppointment.NO;
myAppointment = AppoitmentAllHistoryResultList();
});
},
child: Container(
child: ListTile(
contentPadding: EdgeInsets.only(left: 0.0, right: 0.0),
title: Row(
children: [
Radio(
value: HaveAppointment.NO,
groupValue: _haveAppointment,
onChanged: (value) {
setState(() {
_haveAppointment = value!;
myAppointment = AppoitmentAllHistoryResultList();
});
},
),
Text(
TranslationBase.of(context).no,
style: TextStyle(
fontSize: 12.0,
letterSpacing: -0.48,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
),
),
],
),
if (myAppointment != null)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 12,
),
DoctorCard(
isInOutPatient: myAppointment!.isInOutPatient,
name: myAppointment!.doctorTitle! + " " + myAppointment!.doctorNameObj!,
profileUrl: myAppointment!.doctorImageURL,
subName: myAppointment!.clinicName,
isLiveCareAppointment: myAppointment!.isLiveCareAppointment,
date: DateUtil.convertStringToDate(myAppointment!.appointmentDate!),
isSortByClinic: false,
rating: myAppointment!.actualDoctorRate! + 0.0,
appointmentTime: myAppointment!.isLiveCareAppointment!
? DateUtil.convertStringToDate(myAppointment!.appointmentDate!).toString().split(" ")[1].substring(0, 5)
: myAppointment!.startTime!.substring(0, 5),
remainingTimeInMinutes: null),
],
),
SizedBox(
height: 12,
),
if (_haveAppointment == HaveAppointment.NO) Text(TranslationBase.of(context).dropoffLocation, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 8,
),
if (_haveAppointment == HaveAppointment.NO)
Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: () {
confirmSelectHospitalDialog(widget.amRequestViewModel.hospitals);
},
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).selectHospital,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
Text(
getHospitalName(""),
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
],
),
),
Icon(Icons.arrow_drop_down),
],
),
),
),
],
),
if (widget.patientER_RC.transportationDetails!.direction == 1)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(TranslationBase.of(context).pickupLocation, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 15,
),
Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: () {
confirmSelectHospitalDialog(widget.amRequestViewModel.hospitals);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).selectHospital,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
Text(
getHospitalName(""),
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
],
),
),
Icon(
Icons.arrow_drop_down,
size: 24,
color: Colors.black,
)
],
),
),
),
SizedBox(
height: 12,
),
Text(TranslationBase.of(context).dropoffLocation, style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(
height: 8,
),
Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: () {
if (projectViewModel.latitude != null && projectViewModel.longitude != null) {
Navigator.push(
context,
FadePage(
page: PickupLocationFromMap(
latitude: projectViewModel.latitude,
longitude: projectViewModel.longitude,
onPick: (value) {
setState(() {
_result = value;
});
},
),
),
);
} else {
locationUtils!.getCurrentLocation();
}
},
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).selectMap,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
Text(
getSelectFromMapName(context),
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
],
),
),
Icon(Icons.arrow_drop_down),
],
),
),
),
],
),
// SizedBox(
// height: 45,
// ),
// if (myAppointment != null)
// SizedBox(
// height: 100,
// ),
Container(
margin: EdgeInsets.only(top: 12),
decoration: cardRadius(12),
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(TranslationBase.of(context).billAmount + " : ", style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
SizedBox(height: 16.0),
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(TranslationBase.of(context).patientShareTotalToDo, style: TextStyle(fontSize: 13.0, letterSpacing: -0.64, fontWeight: FontWeight.w600)),
Text(
TranslationBase.of(context).sar + (widget.patientER_RC.transportationDetails!.tripType == 1 ? ' ${widget.patientER_RC.patientERTransportationMethod!.priceTotal}' : ' ${(widget.patientER_RC.patientERTransportationMethod!.priceTotal * 2)}'),
style: TextStyle(fontSize: 16.0, letterSpacing: -0.64, fontWeight: FontWeight.bold),
),
],
)
],
),
),
SizedBox(
height: 100,
),
],
),
),
),
bottomSheet: Container(
color: Theme.of(context).scaffoldBackgroundColor,
padding: EdgeInsets.all(12.0),
child: Row(
children: [
Expanded(
flex: 1,
child: DefaultButton(
TranslationBase.of(context).back,
() {
widget.changeCurrentTab(0);
},
),
),
SizedBox(width: 12.0),
Expanded(
flex: 1,
child: DefaultButton(
TranslationBase.of(context).next,
() {
if (_result == null || _selectedHospital == null)
AppToast.showErrorToast(message: TranslationBase.of(context).selectAll);
else
setState(() {
widget.patientER_RC.transportationDetails!.pickupSpot = _isInsideHome ? 1 : 0;
if (widget.patientER_RC.transportationDetails!.direction == 0) {
// To Hospital
widget.patientER_RC.transportationDetails!.dropoffLatitude = _result!.lat.toStringAsFixed(6);
widget.patientER_RC.transportationDetails!.dropoffLongitude = _result!.long.toStringAsFixed(6);
widget.patientER_RC.transportationDetails!.pickupLatitude = _selectedHospital!.latitude;
widget.patientER_RC.transportationDetails!.pickupLongitude = _selectedHospital!.longitude;
} else {
// From Hospital
widget.patientER_RC.transportationDetails!.pickupLatitude = _selectedHospital!.latitude;
widget.patientER_RC.transportationDetails!.pickupLongitude = _selectedHospital!.longitude;
widget.patientER_RC.transportationDetails!.dropoffLatitude = _result!.lat.toStringAsFixed(6);
widget.patientER_RC.transportationDetails!.dropoffLongitude = _result!.long.toStringAsFixed(6);
}
widget.patientER_RC.transportationDetails!.dropoffLocationName = widget.patientER_RC.transportationDetails!.direction == 1 ? _result!.formattedAddress : _selectedHospital!.name;
widget.patientER_RC.patientIdentificationID = widget.amRequestViewModel.user.patientIdentificationNo;
widget.patientER_RC.transportationDetails!.pickupDateTime = DateUtil.convertDateToStringLocation(DateTime.now());
widget.patientER_RC.transportationDetails!.pickupLocationName = widget.patientER_RC.transportationDetails!.direction == 1 ? _selectedHospital!.name : _result!.formattedAddress;
widget.patientER_RC.projectID = widget.amRequestViewModel.user.projectID;
widget.patientER_RC.patientID = widget.amRequestViewModel.user.patientID;
widget.patientER_RC.transportationDetails!.requesterIsOutSA = false;
widget.patientER_RC.transportationDetails!.requesterMobileNo = widget.amRequestViewModel.user.mobileNumber;
widget.patientER_RC.transportationDetails!.requesterFileNo = widget.amRequestViewModel.user.patientID;
if (_haveAppointment == HaveAppointment.YES) {
widget.patientER_RC.transportationDetails!.appointmentNo = myAppointment!.appointmentNo.toString();
widget.patientER_RC.transportationDetails!.appointmentClinicName = myAppointment!.clinicName;
widget.patientER_RC.transportationDetails!.appointmentDoctorName = myAppointment!.doctorNameObj;
widget.patientER_RC.transportationDetails!.appointmentBranch = myAppointment!.projectName;
widget.patientER_RC.transportationDetails!.appointmentTime = myAppointment!.appointmentDate;
widget.patientER_RC.transportationDetails!.haveAppointment = 1;
widget.patientER_RC.transportationDetails!.dropoffLatitude = myAppointment!.latitude;
widget.patientER_RC.transportationDetails!.dropoffLongitude = myAppointment!.longitude;
widget.patientER_RC.transportationDetails!.dropoffLocationName = myAppointment!.projectName;
} else {
widget.patientER_RC.transportationDetails!.appointmentNo = "0";
widget.patientER_RC.transportationDetails!.appointmentClinicName = "";
widget.patientER_RC.transportationDetails!.appointmentDoctorName = "";
widget.patientER_RC.transportationDetails!.appointmentBranch = "";
widget.patientER_RC.transportationDetails!.appointmentTime = "";
widget.patientER_RC.transportationDetails!.haveAppointment = 0;
}
widget.patientER_RC.transportationDetails!.pickupSpot = _isInsideHome ? 1 : 0;
widget.patientER_RC.transportationDetails!.ambulate = 3;
widget.patientER_RC.transportationDetails!.ambulateTitle = "none";
widget.patientER_RC.transportationDetails!.notes = "";
widget.changeCurrentTab(3);
});
},
color: CustomColors.green,
),
),
],
),
),
);
}
int _selectedHospitalIndex = -1;
void confirmSelectHospitalDialog(List<HospitalsModel> hospitals) {
List<RadioSelectionDialogModel> list = [
for (int i = 0; i < hospitals.length; i++) RadioSelectionDialogModel(hospitals[i].name! + ' ${hospitals[i].distanceInKilometers} ' + TranslationBase.of(context).km, i),
];
showDialog(
context: context,
builder: (cxt) => RadioSelectionDialog(
listData: list,
selectedIndex: _selectedHospitalIndex,
isScrollable: true,
onValueSelected: (index) {
_selectedHospitalIndex = index;
_selectedHospital = hospitals[index];
setState(() {});
},
),
);
}
String getHospitalName(String title) {
return _selectedHospital == null ? title : _selectedHospital!.name!;
}
String getSelectFromMapName(context) {
return _result != null
? _result!.formattedAddress != null
? _result!.formattedAddress!
: ""
: "";
}
getAppointment() {
GifLoaderDialogUtils.showMyDialog(context);
widget.amRequestViewModel.getAppointmentHistory().then((value) {
if (widget.amRequestViewModel.state == ViewState.Error || widget.amRequestViewModel.state == ViewState.ErrorLocal) {
AppToast.showErrorToast(message: widget.amRequestViewModel.error);
} else if (widget.amRequestViewModel.appoitmentAllHistoryResultList.length > 0) {
GifLoaderDialogUtils.hideDialog(context);
Navigator.push(
context,
FadePage(
page: AvailableAppointmentsPage(
appointmentsAllHistoryList: widget.amRequestViewModel.appoitmentAllHistoryResultList,
),
),
).then((value) {
if (value != null)
setState(() {
myAppointment = value;
HospitalsModel hospitalsModel = HospitalsModel();
hospitalsModel.name = myAppointment!.projectName;
hospitalsModel.iD = myAppointment!.projectID;
hospitalsModel.mainProjectID = myAppointment!.projectID;
hospitalsModel.latitude = myAppointment!.latitude;
hospitalsModel.longitude = myAppointment!.longitude;
_selectedHospital = hospitalsModel;
});
else {
ProgressDialogUtil.hideProgressDialog(context);
setState(() {
_haveAppointment = HaveAppointment.NO;
});
}
});
} else {
GifLoaderDialogUtils.hideDialog(context);
setState(() {
_haveAppointment = HaveAppointment.NO;
});
AppToast.showErrorToast(message: TranslationBase.of(context).noAppointment);
}
}).catchError((e) {
GifLoaderDialogUtils.hideDialog(context);
AppToast.showErrorToast(message: e);
});
}
}