import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/pages/Blood/dialogs/SelectHospitalDialog.dart'; import 'package:diplomaticquarterapp/pages/ErService/widgets/AppointmentCard.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.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:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../AmbulanceReq.dart'; import '../AvailableAppointmentsPage.dart'; enum HaveAppointment { YES, NO } class PickupLocation extends StatefulWidget { final Function changeCurrentTab; final PatientER patientER; final AmRequestViewModel amRequestViewModel; PickupLocation( {Key key, this.changeCurrentTab, this.patientER, 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; PickResult _result; @override void initState() { super.initState(); _getCurrentLocation(); } _getCurrentLocation() async { await getLastKnownPosition().then((value) { _latitude = value.latitude; _longitude = value.longitude; }).catchError((e) { _longitude = 0; _latitude = 0; }); } @override Widget build(BuildContext context) { return SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( margin: EdgeInsets.only(left: 12, right: 12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.patientER.direction == 1) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts('Pickup Location'), SizedBox( height: 15, ), InkWell( onTap: (){ Navigator.push( context, MaterialPageRoute( builder: (context) => PickupLocationFromMap( latitude: _latitude, longitude: _longitude, onPick: (value) { setState(() { _result = value; }); }, ), ), ); }, child: Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(getSelectFromMapName()), Icon( FontAwesomeIcons.mapMarkerAlt, size: 24, color: Colors.black, ) ], ), ), ), SizedBox( height: 12, ), Texts('Pickup Spot'), SizedBox( height: 5, ), InkWell( onTap: () { setState(() { _isInsideHome = !_isInsideHome; }); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: ListTile( title: Texts('Inside Home'), leading: Checkbox( activeColor: Colors.red[800], value: _isInsideHome, onChanged: (value) { setState(() { _isInsideHome = value; }); }, ), ), ), ), SizedBox( height: 12, ), Texts('Do you have an appointment ?'), SizedBox( height: 5, ), Row( children: [ Expanded( child: InkWell( onTap: () { if (myAppointment == null) { getAppointment(); setState(() { _haveAppointment = HaveAppointment.YES; }); } }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: ListTile( title: Text('Yes'), leading: Radio( value: HaveAppointment.YES, groupValue: _haveAppointment, activeColor: Colors.red[800], onChanged: (value) { if (myAppointment == null) { getAppointment(); setState(() { _haveAppointment = value; }); } }, ), ), ), ), ), Expanded( child: InkWell( onTap: () { setState(() { _haveAppointment = HaveAppointment.NO; myAppointment = null; }); }, child: Container( decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: ListTile( title: Text('No'), leading: Radio( value: HaveAppointment.NO, groupValue: _haveAppointment, activeColor: Colors.red[800], onChanged: (value) { setState(() { _haveAppointment = value; myAppointment = null; }); }, ), ), ), ), ), ], ), if (myAppointment != null) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: 12, ), AppointmentCard( appointment: myAppointment, ) ], ), SizedBox( height: 12, ), Texts('Drop off Location'), SizedBox( height: 8, ), InkWell( onTap: () { confirmSelectHospitalDialog( widget.amRequestViewModel.hospitals); }, child: Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(getHospitalName('Pickup Location')), Icon( Icons.arrow_drop_down, size: 24, color: Colors.black, ) ], ), ), ), ], ), if (widget.patientER.direction == 0) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts('Pickup Location'), SizedBox( height: 15, ), InkWell( onTap: () { confirmSelectHospitalDialog( widget.amRequestViewModel.hospitals); }, child: Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(getHospitalName('Pickup Location')), Icon( Icons.arrow_drop_down, size: 24, color: Colors.black, ) ], ), ), ), SizedBox( height: 12, ), Texts('Drop off Location'), SizedBox( height: 8, ), InkWell( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => PickupLocationFromMap( latitude: _latitude, longitude: _longitude, onPick: (value) { setState(() { _result = value; }); }, ), ), ); }, child: Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey, width: 0.5), color: Colors.white, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Texts(getSelectFromMapName()), Icon( FontAwesomeIcons.mapMarkerAlt, size: 24, color: Colors.black, ) ], ), ), ), ], ), SizedBox( height: 45, ), Container( padding: EdgeInsets.all(15), width: double.maxFinite, height: 76, child: SecondaryButton( color: Colors.grey[800], textColor: Colors.white, onTap: () { if (_result == null || _selectedHospital == null) AppToast.showErrorToast( message: 'please select all fields'); else setState(() { widget.patientER.pickupSpot = _isInsideHome ? 1 : 0; if (widget.patientER.direction == 0) { widget.patientER.pickupLocationLattitude = _result.geometry.location.lat.toString(); widget.patientER.pickupLocationLongitude = _result.geometry.location.lng.toString(); widget.patientER.dropoffLocationLattitude = _selectedHospital.latitude; widget.patientER.dropoffLocationLongitude = _selectedHospital.longitude; } else { widget.patientER.pickupLocationLattitude = _selectedHospital.latitude; widget.patientER.pickupLocationLongitude = _selectedHospital.longitude; widget.patientER.dropoffLocationLattitude = _result.geometry.location.lat.toString(); widget.patientER.dropoffLocationLongitude = _result.geometry.location.lng.toString(); } widget.patientER.latitude = widget.patientER.pickupLocationLattitude; widget.patientER.longitude = widget.patientER.pickupLocationLongitude; widget.patientER.dropoffLocationName = _selectedHospital.name; widget.patientER.createdBy = widget.amRequestViewModel.user.patientID; widget.patientER.isOutPatient = widget.amRequestViewModel.user.outSA; widget.patientER.patientIdentificationID = widget.amRequestViewModel.user.patientIdentificationNo; widget.patientER.pickupDateTime = DateUtil.convertDateToStringLocation(DateTime.now()); widget.patientER.pickupLocationName = _result.formattedAddress; widget.patientER.projectID = widget.amRequestViewModel.user.projectID; widget.patientER.requesterFileNo = widget.amRequestViewModel.user.patientID; widget.patientER.requesterIsOutSA = false; widget.patientER.lineItemNo =0; widget.patientER.requesterMobileNo = widget.amRequestViewModel.user.mobileNumber; if (_haveAppointment == HaveAppointment.YES) { widget.patientER.appointmentNo = myAppointment.appointmentNo.toString(); widget.patientER.appointmentClinicName = myAppointment.clinicName; widget.patientER.appointmentDoctorName = myAppointment.doctorNameObj; widget.patientER.appointmentBranch = myAppointment.projectName; widget.patientER.appointmentTime = myAppointment.appointmentDate; widget.patientER.haveAppointment = true; } else { widget.patientER.appointmentNo = "0"; widget.patientER.appointmentClinicName = null; widget.patientER.appointmentDoctorName = null; widget.patientER.appointmentBranch = null; widget.patientER.appointmentTime = null; widget.patientER.haveAppointment = false; } widget.patientER.pickupSpot = _isInsideHome ? 1 : 0; widget.changeCurrentTab(2); }); }, label: 'Next', ), ) ], ), ), ); } void confirmSelectHospitalDialog(List hospitals) { showDialog( context: context, child: SelectHospitalDialog( hospitals: hospitals, selectedHospital: _selectedHospital, onValueSelected: (value) { setState(() { _selectedHospital = value; }); }, ), ); } String getHospitalName(String title) { return _selectedHospital == null ? title : _selectedHospital.name; } String getSelectFromMapName() { return _result != null ? _result.formattedAddress : 'Select From Map'; } getAppointment() { ProgressDialogUtil.showProgressDialog(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) { ProgressDialogUtil.hideProgressDialog(context); Navigator.push( context, MaterialPageRoute( builder: (context) => AvailableAppointmentsPage( appointmentsAllHistoryList: widget.amRequestViewModel.appoitmentAllHistoryResultList, ), ), ).then((value) { if (value != null) setState(() { myAppointment = value; }); else { ProgressDialogUtil.hideProgressDialog(context); setState(() { _haveAppointment = HaveAppointment.NO; }); } }); } else { ProgressDialogUtil.hideProgressDialog(context); setState(() { _haveAppointment = HaveAppointment.NO; }); AppToast.showErrorToast(message: 'You don\'t have any appointment'); } }).catchError((e) { ProgressDialogUtil.hideProgressDialog(context); AppToast.showErrorToast(message: e); }); } }