import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; import 'package:doctor_app_flutter/models/SOAP/PostEpisodeReqModel.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/PatientProfileButton.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart'; import 'package:flutter/material.dart'; import '../../../routes.dart'; class PatientProfileScreen extends StatefulWidget { @override _PatientProfileScreenState createState() => _PatientProfileScreenState(); } class _PatientProfileScreenState extends State with SingleTickerProviderStateMixin { PatiantInformtion patient; bool isFromSearch = false; bool isInpatient = false; bool isDischargedPatient = false; bool isSearchAndOut = false; String patientType; String arrivalType; String from; String to; TabController _tabController; int index = 0; int _activeTab = 0; @override void initState() { _tabController = TabController(length: 2, vsync: this); super.initState(); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override void didChangeDependencies() { super.didChangeDependencies(); final routeArgs = ModalRoute.of(context).settings.arguments as Map; patient = routeArgs['patient']; patientType = routeArgs['patientType']; arrivalType = routeArgs['arrivalType']; from = routeArgs['from']; to = routeArgs['to']; if (routeArgs.containsKey("isSearch")) { isFromSearch = routeArgs['isSearch']; } if (routeArgs.containsKey("isInpatient")) { isInpatient = routeArgs['isInpatient']; } if (routeArgs.containsKey("isDischargedPatient")) { isDischargedPatient = routeArgs['isDischargedPatient']; }if (routeArgs.containsKey("isSearchAndOut")) { isSearchAndOut = routeArgs['isSearchAndOut']; } if (isInpatient) _activeTab = 0; else _activeTab = 1; } @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; return BaseView( builder: (_, patientViewModel, w) => AppScaffold( baseViewModel: patientViewModel, appBarTitle: TranslationBase .of(context) .patientProfile, isShowAppBar: false, //TODO fix button location // appBar: PatientProfileHeaderNewDesignAppBar(patient,arrivalType??'0',patientType,isInpatient: isInpatient,), body: Column( children: [ Stack( children: [ Column( children: [ PatientProfileHeaderNewDesignAppBar( patient, arrivalType ?? '0', patientType, isInpatient: isInpatient, height: (patient.patientStatusType != null && patient.patientStatusType == 43) ? 210 : 0, ), Container( height: !isSearchAndOut ? MediaQuery .of(context) .size .height * 0.70 : MediaQuery .of(context) .size .height * 0.69, child: ListView( children: [ Container( child: isSearchAndOut ? Column( children: [ Padding( padding: const EdgeInsets.symmetric( vertical: 15.0, horizontal: 15), child: GridView.count( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 1 / 1.0, crossAxisCount: 3, children: [ PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, from: from, to: to, nameLine1: TranslationBase .of( context) .vital, nameLine2: TranslationBase .of( context) .signs, route: VITAL_SIGN_DETAILS, icon: 'patient/vital_signs.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: LAB_RESULT, nameLine1: TranslationBase .of( context) .lab, nameLine2: TranslationBase .of( context) .result, icon: 'patient/lab_results.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, isInPatient: isInpatient, route: RADIOLOGY_PATIENT, nameLine1: TranslationBase .of( context) .radiology, nameLine2: TranslationBase .of( context) .service, icon: 'patient/health_summary.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PRESCRIPTION_NEW, nameLine1: TranslationBase .of( context) .orders, nameLine2: TranslationBase .of( context) .prescription, icon: 'patient/order_prescription.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: MEDICAL_FILE, nameLine1: "Health", //TranslationBase.of(context).medicalReport, nameLine2: "Summary", //TranslationBase.of(context).summaryReport, icon: 'patient/health_summary.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_ECG, nameLine1: TranslationBase .of( context) .patient, nameLine2: "ECG", icon: 'patient/patient_sick_leave.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PROCEDURE, nameLine1: TranslationBase .of( context) .orders, nameLine2: TranslationBase .of( context) .procedures, icon: 'patient/Order_Procedures.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_INSURANCE_APPROVALS_NEW, nameLine1: TranslationBase .of( context) .insurance, nameLine2: TranslationBase .of( context) .service, icon: 'patient/vital_signs.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ADD_SICKLEAVE, nameLine1: TranslationBase .of( context) .patientSick, nameLine2: TranslationBase .of( context) .leave, icon: 'patient/patient_sick_leave.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_UCAF_REQUEST, isDisable: patient.patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .patient, nameLine2: TranslationBase .of( context) .ucaf, icon: 'patient/ucaf.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: REFER_PATIENT_TO_DOCTOR, isDisable: patient .patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .referral, nameLine2: TranslationBase .of( context) .patient, icon: 'patient/refer_patient.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_ADMISSION_REQUEST, isDisable: patient .patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .admission, nameLine2: TranslationBase .of( context) .request, icon: 'patient/admission_req.png'), ], ), ), ], ) : isInpatient ? Padding( padding: const EdgeInsets.symmetric( vertical: 15.0, horizontal: 15), child: GridView.count( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 1 / 1.0, crossAxisCount: 3, children: [ PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, from: from, to: to, nameLine1: TranslationBase .of( context) .vital, nameLine2: TranslationBase .of( context) .signs, route: VITAL_SIGN_DETAILS, isInPatient: true, icon: 'patient/vital_signs.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: LAB_RESULT, isInPatient: true, nameLine1: TranslationBase .of( context) .lab, nameLine2: TranslationBase .of( context) .result, icon: 'patient/lab_results.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, isInPatient: isInpatient, route: RADIOLOGY_PATIENT, nameLine1: TranslationBase .of( context) .radiology, nameLine2: TranslationBase .of( context) .result, icon: 'patient/health_summary.png'), PatientProfileButton( patient: patient, isInPatient: isInpatient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PRESCRIPTION_NEW, isSelectInpatient: true, nameLine1: TranslationBase .of( context) .patient, nameLine2: TranslationBase .of( context) .prescription, icon: 'patient/order_prescription.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: PROGRESS_NOTE, isInPatient: isInpatient, isDischargedPatient: isDischargedPatient, nameLine1: TranslationBase .of( context) .progress, nameLine2: TranslationBase .of( context) .note, icon: 'patient/Progress_notes.png'), PatientProfileButton( patient: patient, isInPatient: isInpatient, patientType: patientType, arrivalType: arrivalType, route: ORDER_NOTE, isDischargedPatient: isDischargedPatient, nameLine1: "Order", //"Text", nameLine2: "Sheet", //TranslationBase.of(context).orders, icon: 'patient/Progress_notes.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PROCEDURE, isInPatient: isInpatient, nameLine1: TranslationBase .of( context) .orders, nameLine2: TranslationBase .of( context) .procedures, icon: 'patient/Order_Procedures.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: MEDICAL_FILE, nameLine1: "Health", isInPatient: isInpatient, nameLine2: "Summary", //TranslationBase.of(context).summaryReport, icon: 'patient/health_summary.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, isDisable: true, route: MEDICAL_FILE, nameLine1: "Medical", //Health isInPatient: isInpatient, nameLine2: "Report", //Report //TranslationBase.of(context).summaryReport, icon: 'patient/health_summary.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: REFER_IN_PATIENT_TO_DOCTOR, isInPatient: true, isDisable: isDischargedPatient || isFromSearch, nameLine1: TranslationBase .of( context) .referral, nameLine2: TranslationBase .of( context) .patient, icon: 'patient/refer_patient.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_INSURANCE_APPROVALS_NEW, nameLine1: TranslationBase .of( context) .insurance, nameLine2: TranslationBase .of( context) .approvals, icon: 'patient/vital_signs.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, isDisable: true, route: null, nameLine1: "Discharge", nameLine2: "Summery", icon: 'patient/patient_sick_leave.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ADD_SICKLEAVE, nameLine1: TranslationBase .of( context) .patientSick, nameLine2: TranslationBase .of( context) .leave, icon: 'patient/patient_sick_leave.png'), ], ), ) : Column( children: [ Padding( padding: const EdgeInsets .symmetric( vertical: 15.0, horizontal: 15), child: GridView.count( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 1 / 1.0, crossAxisCount: 3, children: [ PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, from: from, to: to, nameLine1: TranslationBase .of( context) .vital, nameLine2: TranslationBase .of( context) .signs, route: VITAL_SIGN_DETAILS, icon: 'patient/vital_signs.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: LAB_RESULT, nameLine1: TranslationBase .of( context) .lab, nameLine2: TranslationBase .of( context) .result, icon: 'patient/lab_results.png'), PatientProfileButton( patient: patient, patientType: patientType, arrivalType: arrivalType, isInPatient: isInpatient, route: RADIOLOGY_PATIENT, nameLine1: TranslationBase .of( context) .radiology, nameLine2: TranslationBase .of( context) .service, icon: 'patient/health_summary.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PRESCRIPTION_NEW, nameLine1: TranslationBase .of( context) .orders, nameLine2: TranslationBase .of( context) .prescription, icon: 'patient/order_prescription.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: MEDICAL_FILE, nameLine1: "Health", //TranslationBase.of(context).medicalReport, nameLine2: "Summary", //TranslationBase.of(context).summaryReport, icon: 'patient/health_summary.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_ECG, nameLine1: TranslationBase .of( context) .patient, nameLine2: "ECG", icon: 'patient/patient_sick_leave.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ORDER_PROCEDURE, nameLine1: TranslationBase .of( context) .orders, nameLine2: TranslationBase .of( context) .procedures, icon: 'patient/Order_Procedures.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_INSURANCE_APPROVALS_NEW, nameLine1: TranslationBase .of( context) .insurance, nameLine2: TranslationBase .of( context) .service, icon: 'patient/vital_signs.png'), PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: ADD_SICKLEAVE, nameLine1: TranslationBase .of( context) .patientSick, nameLine2: TranslationBase .of( context) .leave, icon: 'patient/patient_sick_leave.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_UCAF_REQUEST, isDisable: patient.patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .patient, nameLine2: TranslationBase .of( context) .ucaf, icon: 'patient/ucaf.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: REFER_PATIENT_TO_DOCTOR, isDisable: patient .patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .referral, nameLine2: TranslationBase .of( context) .patient, icon: 'patient/refer_patient.png'), if (patient.appointmentNo != null && patient.appointmentNo != 0) PatientProfileButton( isInPatient: isInpatient, patient: patient, patientType: patientType, arrivalType: arrivalType, route: PATIENT_ADMISSION_REQUEST, isDisable: patient.patientStatusType != 43 ? true : false, nameLine1: TranslationBase .of( context) .admission, nameLine2: TranslationBase .of( context) .request, icon: 'patient/admission_req.png'), ], ), ), ], ), ), ], ), ), ], ), if (patient.patientStatusType != null && patient.patientStatusType == 43) BaseView( onModelReady: (model) async {}, builder: (_, model, w) => Positioned( top: 180, left: 20, right: 20, child: Row( children: [ Expanded(child: Container()), if (patient.episodeNo == 0) AppButton( title: "${TranslationBase .of(context) .createNew}\n${TranslationBase .of(context) .episode}", color: patient.patientStatusType == 43 ? Colors.red.shade700 : Colors.grey.shade700, fontColor: Colors.white, vPadding: 8, radius: 30, hPadding: 20, fontWeight: FontWeight.normal, fontSize: 1.6, icon: Image.asset( "assets/images/create-episod.png", color: Colors.white, height: 30, ), onPressed: () async { if (patient.patientStatusType == 43) { PostEpisodeReqModel postEpisodeReqModel = PostEpisodeReqModel( appointmentNo: patient.appointmentNo, patientMRN: patient.patientMRN); GifLoaderDialogUtils.showMyDialog( context); await model.postEpisode( postEpisodeReqModel); GifLoaderDialogUtils.hideDialog( context); patient.episodeNo = model.episodeID; Navigator.of(context).pushNamed( CREATE_EPISODE, arguments: { 'patient': patient }); } }, ), if (patient.episodeNo != 0) AppButton( title: "${TranslationBase .of(context) .update}\n${TranslationBase .of(context) .episode}", color: patient.patientStatusType == 43 ? Colors.red.shade700 : Colors.grey.shade700, fontColor: Colors.white, vPadding: 8, radius: 30, hPadding: 20, fontWeight: FontWeight.normal, fontSize: 1.6, icon: Image.asset( "assets/images/modilfy-episode.png", color: Colors.white, height: 30, ), onPressed: () { if (patient.patientStatusType == 43) { Navigator.of(context).pushNamed( UPDATE_EPISODE, arguments: { 'patient': patient }); } }), ], ), )), ], ), ], ), )); } Widget tabsBar(BuildContext context, Size screenSize) { List _tabs = [ "Inpatient Info".toUpperCase(), "Outpatient Info".toUpperCase(), ]; return Container( height: screenSize.height * 0.070, decoration: TextFieldsUtils.containerBorderDecoration( Color(0Xffffffff), Color(0xFFCCCCCC), borderRadius: 4, borderWidth: 0), child: Row( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: _tabs.map((item) { bool _isActive = _tabs[_activeTab] == item ? true : false; return Expanded( child: InkWell( onTap: () async { setState(() { _activeTab = _tabs.indexOf(item); }); }, child: Center( child: Container( height: screenSize.height * 0.070, decoration: TextFieldsUtils.containerBorderDecoration( _isActive ? Color(0xFFD02127 /*B8382B*/) : Color(0xFFEAEAEA), _isActive ? Color(0xFFD02127) : Color(0xFFEAEAEA), borderRadius: 4, borderWidth: 0), child: Center( child: AppText( item, fontSize: SizeConfig.textMultiplier * 1.8, color: _isActive ? Colors.white : Color(0xFF2B353E), fontWeight: FontWeight.w700, ), ), ), ), ), ); }).toList(), ), ); } } class AvatarWidget extends StatelessWidget { final Widget avatarIcon; AvatarWidget(this.avatarIcon); @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( boxShadow: [ BoxShadow( color: Color.fromRGBO(0, 0, 0, 0.08), offset: Offset(0.0, 5.0), blurRadius: 16.0) ], borderRadius: BorderRadius.all(Radius.circular(35.0)), color: Color(0xffCCCCCC), ), child: avatarIcon, ); } }