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/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/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, this.changeCurrentTab, this.patientER, this.patientER_RC, 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; 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 = null; }); }, 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 = null; }); }, ), 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, ), ], ), ), ), bottomSheet: Container( color: Theme.of(context).scaffoldBackgroundColor, padding: EdgeInsets.all(12.0), 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.changeCurrentTab(2); }); }, ), ), ); } 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 : ""; } 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); }); } }