/* *@author: Amjad Amireh Merge to Elham rababah *@Date:27/4/2020 *@param: *@return:PatientsScreen *@desc: */ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/models/patient/patient_model.dart'; import 'package:doctor_app_flutter/models/patient/topten_users_res_model.dart'; import 'package:doctor_app_flutter/providers/patients_provider.dart'; import 'package:doctor_app_flutter/routes.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/dr_app_circular_progress_Indeicator.dart'; import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../config/size_config.dart'; import 'package:hexcolor/hexcolor.dart'; import '../../widgets/shared/app_scaffold_widget.dart'; import '../../widgets/shared/card_with_bg_widget.dart'; import 'package:doctor_app_flutter/config/config.dart'; class PatientsScreen extends StatefulWidget { @override _PatientsScreenState createState() => _PatientsScreenState(); } class _PatientsScreenState extends State { List litems; List parsed; List date; List unfilterDate; List responseModelList; List responseModelList2; // List _locations = ['Today', 'Old Date', 'YESTERDAY']; List _locations = ['Today', 'Tomorrow', 'Next Week']; int _activeLocation = 0; bool _isInit = true; String patientType; String patientTypetitle; var _isLoading = false; bool _isError = true; String error = ""; final _controller = TextEditingController(); PatientModel patient; PatientsProvider patientsProv; @override void didChangeDependencies() { final routeArgs = ModalRoute.of(context).settings.arguments as Map; patient = routeArgs['patientSearchForm']; patientType = routeArgs['selectedType']; patientTypetitle = SERVICES_PATIANT_HEADER[int.parse(patientType)]; print(patientType); if (_isInit) { PatientsProvider patientsProv = Provider.of(context); setState(() { _isLoading = true; _isError = false; error = ""; }); patientsProv.getPatientList(patient, patientType).then((res) { setState(() { _isLoading = false; if (res['MessageStatus'] == 1) { int val2 = int.parse(patientType); litems = res[SERVICES_PATIANT2[val2]]; parsed = litems; responseModelList = new ModelResponse.fromJson(parsed).list; responseModelList2 = responseModelList; _isError = false; } else { _isError = true; error = res['ErrorEndUserMessage'] ?? res['ErrorMessage'] ; } }); }).catchError((error) { setState(() { _isError = true; this.error = helpers.generateContactAdminMsg(error); }); }); } _isInit = false; super.didChangeDependencies(); } /* *@author: Amjad Amireh *@Date:2/5/2020 *@param: *@return:PatientsScreen Search textbox filter *@desc: */ searchData(String str) { this.responseModelList = this.responseModelList2; var strExist = str.length > 0 ? true : false; if (strExist) { List filterData = []; for (var i = 0; i < responseModelList2.length; i++) { String firstName = responseModelList[i].firstName.toUpperCase(); String lastName = responseModelList[i].lastName.toUpperCase(); if (firstName.contains(str.toUpperCase()) || lastName.contains(str.toUpperCase())) { filterData.add(responseModelList[i]); } } setState(() { this.responseModelList = filterData; }); } else { setState(() { this.responseModelList = this.responseModelList2; }); } } /* *@author: Amjad Amireh *@Date:5/5/2020 *@param: *@return:Convert time from Milesecond to date with time *@desc: */ convertDate(String str) { String timeConvert; const start = "/Date("; const end = "+0300)"; final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); var date = new DateTime.fromMillisecondsSinceEpoch( int.parse(str.substring(startIndex + start.length, endIndex))); String newDateformat = date.year.toString() + "/" + date.month.toString().padLeft(2, '0') + "/" + date.day.toString().padLeft(2, '0') + " " + "-" + " " + date.hour.toString().padLeft(2, '0') + ":" + date.minute.toString().toString().padLeft(2, '0'); return newDateformat.toString(); } /* *@author: Amjad Amireh *@Date:5/5/2020 *@param: *@return:Convert time from Milesecond to date *@desc: */ convertDateFormat(String str) { String timeConvert; const start = "/Date("; const end = "+0300)"; final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); var date = new DateTime.fromMillisecondsSinceEpoch( int.parse(str.substring(startIndex + start.length, endIndex))); String newDate = date.year.toString() + "-" + date.month.toString().padLeft(2, '0') + "-" + date.day.toString().padLeft(2, '0'); return newDate.toString(); } convertDateFormat2(String str) { String timeConvert; const start = "/Date("; const end = "+0300)"; final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); var date = new DateTime.fromMillisecondsSinceEpoch( int.parse(str.substring(startIndex + start.length, endIndex))); String newDate = date.year.toString() + "/" + date.month.toString().padLeft(2, '0') + "/" + date.day.toString().padLeft(2, '0'); return newDate.toString(); } filterBooking(String str) { this.responseModelList = this.responseModelList2; var strExist = str.length > 0 ? true : false; if (true) { List filterDate = []; for (var i = 0; i < responseModelList2.length; i++) { String patiantAppointment = convertDateFormat(responseModelList[i].appointmentDate); String dateAppointment = checkDate(patiantAppointment); if (dateAppointment.contains(str)) { filterDate.add(responseModelList[i]); } } setState(() { this.responseModelList = filterDate; }); } else { setState(() { this.responseModelList = this.responseModelList2; }); } } String checkDate(String dateString) { DateTime checkedTime = DateTime.parse(dateString); DateTime currentTime = DateTime.now(); if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month) && (currentTime.day == checkedTime.day)) { return "Today"; } else if ((currentTime.year == checkedTime.year) && (currentTime.month == checkedTime.month)) { if ((currentTime.day - checkedTime.day) == 1) { return "YESTERDAY"; } else if ((currentTime.day - checkedTime.day) == -1) { return "Tomorrow"; } if ((currentTime.day - checkedTime.day) <= -2) { return "Next Week"; } else { return "Old Date"; } } return "Old Date"; } @override Widget build(BuildContext context) { PatientsProvider patientsProv = Provider.of(context); return AppScaffold( appBarTitle: patientTypetitle, body: _isLoading ? DrAppCircularProgressIndeicator() : _isError ? DrAppEmbeddedError(error: error) : litems == null ? DrAppEmbeddedError(error: 'You don\'t have any patient') : Container( child: ListView( scrollDirection: Axis.vertical, children: [ Container( child: litems == null ? Column( children: [ Container( child: Center( child: Padding( padding: const EdgeInsets.fromLTRB( 0, 250, 0, 0), child: DrAppCircularProgressIndeicator(), )), ), ], ) : Column( children: [ Padding( padding: EdgeInsets.only( top: MediaQuery.of(context) .size .height * 0.03), child: SERVICES_PATIANT2[ int.parse(patientType)] == "List_MyOutPatient" ? _locationBar(context) : Container(), ), SizedBox(height: 10.0), Container( width: SizeConfig.screenWidth * 0.80, child: TextField( controller: _controller, onChanged: (String str) { this.searchData(str); }, decoration: buildInputDecoration( context, 'Search Patient'), ), ), Container( margin: EdgeInsets.fromLTRB(15, 0, 15, 0), child: Column( children: responseModelList .map((PatiantInformtion item) { return InkWell( child: CardWithBgWidget( widget: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppText( item.firstName + " " + item.lastName + "- " + item.patientId .toString(), fontSize: 2.5 * SizeConfig .textMultiplier, fontWeight: FontWeight.bold, ), SizedBox( height: 8, ), SERVICES_PATIANT2[int.parse( patientType)] == "List_MyOutPatient" ? AppText( convertDateFormat2(item .appointmentDate .toString()) + " " + "-" + " " + item.startTime, fontSize: 2.5 * SizeConfig .textMultiplier) : AppText( item .nationalityName, fontSize: 2.5 * SizeConfig .textMultiplier) ], ), ), onTap: () { Navigator.of(context).pushNamed( PATIENTS_PROFILE, arguments: { "patient": item }); }, ); }).toList(), ), ), ], ), ) ], ), ), ); } InputDecoration buildInputDecoration(BuildContext context, hint) { return InputDecoration( prefixIcon: Icon(Icons.search, color: Colors.red), filled: true, fillColor: Colors.white, hintText: hint, hintStyle: TextStyle(fontSize: 2 * SizeConfig.textMultiplier), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(20)), borderSide: BorderSide(color: Hexcolor('#CCCCCC')), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(color: Theme.of(context).primaryColor), )); } Widget _locationBar(BuildContext _context) { return Container( height: MediaQuery.of(context).size.height * 0.065, width: SizeConfig.screenWidth * 0.80, decoration: BoxDecoration( color: Color(0Xff59434f), borderRadius: BorderRadius.circular(20)), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: _locations.map((item) { bool _isActive = _locations[_activeLocation] == item ? true : false; return Column(mainAxisSize: MainAxisSize.min, children: [ InkWell( child: Text( item, style: TextStyle( fontSize: 15, color: Colors.white, fontWeight: FontWeight.bold), ), onTap: () { print(_locations.indexOf(item)); filterBooking(item.toString()); setState(() { _activeLocation = _locations.indexOf(item); }); }), _isActive ? Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white), height: 3, width: 80, ) : Container() ]); }).toList(), ), ); } }