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 { 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 hospitals) { List 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); }); } }