diff --git a/Frontend/lib/mih_components/medicine_search.dart b/Frontend/lib/mih_components/medicine_search.dart deleted file mode 100644 index 8db4b912..00000000 --- a/Frontend/lib/mih_components/medicine_search.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import '../mih_components/mih_layout/mih_window.dart'; -import '../mih_packages/patient_profile/builder/build_med_list.dart'; -import '../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../mih_env/env.dart'; -import '../mih_objects/medicine.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -class MedicineSearch extends StatefulWidget { - final TextEditingController searchVlaue; - const MedicineSearch({ - super.key, - required this.searchVlaue, - }); - - @override - State createState() => _MedicineSearchState(); -} - -class _MedicineSearchState extends State { - final String endpointMeds = "${AppEnviroment.baseApiUrl}/users/medicine/"; - - //TextEditingController searchController = TextEditingController(); - - late Future> futueMeds; - //String searchString = ""; - - Future> getMedList(String endpoint) async { - final response = await http.get(Uri.parse(endpoint)); - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List medicines = - List.from(l.map((model) => Medicine.fromJson(model))); - // List meds = []; - // medicines.forEach((element) => meds.add(element.name)); - return medicines; - } else { - internetConnectionPopUp(); - throw Exception('failed to load medicine'); - } - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - @override - void dispose() { - super.dispose(); - } - - @override - void initState() { - futueMeds = getMedList(endpointMeds + widget.searchVlaue.text); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return MIHWindow( - fullscreen: false, - windowTitle: "Select Medicine", - windowTools: [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - FutureBuilder( - future: futueMeds, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const SizedBox( - height: 400, - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData && snapshot.data!.isNotEmpty) { - final medsList = snapshot.data!; - return SizedBox( - height: 400, - child: BuildMedicinesList( - contoller: widget.searchVlaue, - medicines: medsList, - //searchString: searchString, - ), - ); - } else { - return const SizedBox( - height: 400, - child: Center( - child: Text( - "No Match Found\nPlease close and manually capture medicine", - style: TextStyle(fontSize: 25, color: Colors.grey), - textAlign: TextAlign.center, - ), - ), - ); - } - }, - ), - ], - ); - // return Dialog( - // child: Stack( - // children: [ - // Container( - // padding: const EdgeInsets.all(10.0), - // width: 700.0, - // //height: 475.0, - // decoration: BoxDecoration( - // color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - // borderRadius: BorderRadius.circular(25.0), - // border: Border.all( - // color: - // MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // width: 5.0), - // ), - // child: SingleChildScrollView( - // padding: const EdgeInsets.symmetric(horizontal: 10), - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.center, - // mainAxisAlignment: MainAxisAlignment.center, - // mainAxisSize: MainAxisSize.min, - // children: [ - // Text( - // "Select Medicine", - // textAlign: TextAlign.center, - // style: TextStyle( - // color: MzanziInnovationHub.of(context)! - // .theme - // .secondaryColor(), - // fontSize: 35.0, - // fontWeight: FontWeight.bold, - // ), - // ), - // const SizedBox(height: 25.0), - // FutureBuilder( - // future: futueMeds, - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return const SizedBox( - // height: 400, - // child: Mihloadingcircle(), - // ); - // } else if (snapshot.hasData && - // snapshot.data!.isNotEmpty) { - // final medsList = snapshot.data!; - // return SizedBox( - // height: 400, - // child: BuildMedicinesList( - // contoller: widget.searchVlaue, - // medicines: medsList, - // //searchString: searchString, - // ), - // ); - // } else { - // return const SizedBox( - // height: 400, - // child: Center( - // child: Text( - // "No Match Found\nPlease close and manually capture medicine", - // style: - // TextStyle(fontSize: 25, color: Colors.grey), - // textAlign: TextAlign.center, - // ), - // ), - // ); - // } - // }, - // ), - // ], - // ), - // ), - // ), - // Positioned( - // top: 5, - // right: 5, - // width: 50, - // height: 50, - // child: IconButton( - // onPressed: () { - // Navigator.pop(context); - // }, - // icon: const Icon( - // Icons.close, - // color: Colors.red, - // size: 35, - // ), - // ), - // ), - // ], - // ), - // ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_access_list.dart b/Frontend/lib/mih_packages/patient_profile/builder/build_patient_access_list.dart deleted file mode 100644 index 250839fd..00000000 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_access_list.dart +++ /dev/null @@ -1,468 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -import '../../../main.dart'; -import '../../../mih_apis/mih_api_calls.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_date_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_time_input.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_warning_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/arguments.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/patient_access.dart'; -import '../../../mih_objects/patients.dart'; - -class BuildPatientAccessList extends StatefulWidget { - final List patientAccesses; - final AppUser signedInUser; - final Business? business; - final BusinessArguments arguments; - - const BuildPatientAccessList({ - super.key, - required this.patientAccesses, - required this.signedInUser, - required this.business, - required this.arguments, - }); - - @override - State createState() => _BuildPatientsListState(); -} - -class _BuildPatientsListState extends State { - TextEditingController dateController = TextEditingController(); - TextEditingController timeController = TextEditingController(); - TextEditingController idController = TextEditingController(); - TextEditingController fnameController = TextEditingController(); - TextEditingController lnameController = TextEditingController(); - - final baseAPI = AppEnviroment.baseApiUrl; - - Future addPatientAppointmentAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/queue/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "business_id": widget.business!.business_id, - "app_id": widget.patientAccesses[index].app_id, - "date": dateController.text, - "time": timeController.text, - "access": "pending", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - String message = - "The appointment has been successfully booked!\n\nAn approval request as been sent to the patient.Once the access request has been approved, you will be able to access the patientAccesses profile. ou can check the status of your request in patient queue under the appointment."; - // "${fnameController.text} ${lnameController.text} patient profiole has been successfully added!\n"; - Navigator.pop(context); - Navigator.pop(context); - setState(() { - dateController.text = ""; - timeController.text = ""; - }); - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: BusinessArguments( - widget.arguments.signedInUser, - widget.arguments.businessUser, - widget.arguments.business, - ), - ); - successPopUp(message); - addAccessReviewNotificationAPICall(index); - } else { - internetConnectionPopUp(); - } - } - - Future addAccessReviewNotificationAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/notifications/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "app_id": widget.patientAccesses[index].app_id, - "notification_type": "New Appointment Booked", - "notification_message": - "A new Appointment has been booked by ${widget.arguments.business!.Name} for the ${dateController.text} ${timeController.text}. Please approve the Access Review request.", - "action_path": "/mih-access", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - } else { - internetConnectionPopUp(); - } - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void submitApointment(int index) { - MIHApiCalls.addAppointmentAPICall( - widget.arguments.business!.business_id, - widget.patientAccesses[index].app_id, - false, - dateController.text, - timeController.text, - widget.arguments, - context, - ); - //addPatientAppointmentAPICall(index); - } - - bool isAppointmentFieldsFilled() { - if (dateController.text.isEmpty || timeController.text.isEmpty) { - return false; - } else { - return true; - } - } - - void appointmentPopUp(int index) { - var firstLetterFName = widget.patientAccesses[index].fname; - var firstLetterLName = widget.patientAccesses[index].lname; - - setState(() { - idController.text = widget.patientAccesses[index].id_no; - fnameController.text = firstLetterFName; - lnameController.text = firstLetterLName; - }); - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Patient Appointment", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - MIHTextField( - controller: idController, - hintText: "ID No.", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: fnameController, - hintText: "First Name", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: lnameController, - hintText: "Surname", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHDateField( - controller: dateController, - lableText: "Date", - required: true, - ), - const SizedBox(height: 10.0), - MIHTimeField( - controller: timeController, - lableText: "Time", - required: true, - ), - const SizedBox(height: 30.0), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Book", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - //print("here1"); - bool filled = isAppointmentFieldsFilled(); - //print("fields filled: $filled"); - if (filled) { - //print("here2"); - submitApointment(index); - //print("here3"); - } else { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Input Error"); - }, - ); - } - }, - ), - ) - ], - ), - ); - } - - void noAccessWarning(int index) { - if (widget.patientAccesses[index].status == "pending") { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "No Access"); - }, - ); - } else { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "Access Declined"); - }, - ); - } - } - - bool hasAccessToProfile(int index) { - var hasAccess = false; - - if (widget.patientAccesses[index].status == "approved") { - hasAccess = true; - } else { - hasAccess = false; - } - return hasAccess; - } - - void patientProfileChoicePopUp(int index, Patient? patientProfile) async { - var firstLetterFName = widget.patientAccesses[index].fname; - var firstLetterLName = widget.patientAccesses[index].lname; - - setState(() { - idController.text = widget.patientAccesses[index].id_no; - fnameController.text = firstLetterFName; - lnameController.text = firstLetterLName; - }); - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Patient Profile", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - MIHTextField( - controller: idController, - hintText: "ID No.", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: fnameController, - hintText: "First Name", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: lnameController, - hintText: "Surname", - editable: false, - required: true, - ), - const SizedBox(height: 30.0), - Wrap(runSpacing: 10, spacing: 10, children: [ - SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Book Appointment", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - print("Book an Appointment!!!"); - appointmentPopUp(index); - - // //print("here1"); - // bool filled = isAppointmentFieldsFilled(); - // //print("fields filled: $filled"); - // if (filled) { - // //print("here2"); - // submitApointment(index); - // //print("here3"); - // } else { - // showDialog( - // context: context, - // builder: (context) { - // return const MIHErrorMessage(errorType: "Input Error"); - // }, - // ); - // } - }, - ), - ), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "View Patient Profile", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - Navigator.of(context).pop(); - Navigator.of(context).pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - patientProfile, - widget.arguments.businessUser, - widget.business, - "business", - )); - }, - ), - ), - ]) - ], - ), - ); - } - - Widget displayAccessTile(int index) { - var firstName = ""; - var lastName = ""; - String access = widget.patientAccesses[index].status.toUpperCase(); - TextSpan accessWithColour; - var hasAccess = false; - hasAccess = hasAccessToProfile(index); - //print(hasAccess); - if (access == "APPROVED") { - firstName = widget.patientAccesses[index].fname; - lastName = widget.patientAccesses[index].lname; - accessWithColour = TextSpan( - text: "$access\n", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.successColor())); - } else if (access == "PENDING") { - firstName = "${widget.patientAccesses[index].fname[0]}********"; - lastName = "${widget.patientAccesses[index].lname[0]}********"; - accessWithColour = TextSpan( - text: "$access\n", - style: TextStyle( - color: - MzanziInnovationHub.of(context)!.theme.messageTextColor())); - } else { - firstName = "${widget.patientAccesses[index].fname[0]}********"; - lastName = "${widget.patientAccesses[index].lname[0]}********"; - accessWithColour = TextSpan( - text: "$access\n", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.errorColor())); - } - - return ListTile( - title: Text( - "$firstName $lastName", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - subtitle: RichText( - text: TextSpan( - text: "ID No.: ${widget.patientAccesses[index].id_no}\n", - style: DefaultTextStyle.of(context).style, - children: [ - const TextSpan(text: "Access: "), - accessWithColour, - ]), - ), - onTap: () async { - Patient? p; - if (hasAccess) { - await MIHApiCalls.fetchPatientByAppId( - widget.patientAccesses[index].app_id) - .then((result) { - setState(() { - p = result; - }); - }); - patientProfileChoicePopUp(index, p); - } else { - noAccessWarning(index); - } - }, - trailing: Icon( - Icons.arrow_forward, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ); - } - - @override - void dispose() { - dateController.dispose(); - timeController.dispose(); - idController.dispose(); - fnameController.dispose(); - lnameController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (BuildContext context, index) { - return Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ); - }, - itemCount: widget.patientAccesses.length, - itemBuilder: (context, index) { - //final patient = widget.patientAccesses[index].id_no.contains(widget.searchString); - //print(index); - return displayAccessTile(index); - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_list.dart b/Frontend/lib/mih_packages/patient_profile/builder/build_patient_list.dart deleted file mode 100644 index 03d3ccb6..00000000 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_list.dart +++ /dev/null @@ -1,694 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -import '../../../main.dart'; -import '../../../mih_apis/mih_api_calls.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_date_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_time_input.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_warning_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/arguments.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/patients.dart'; - -class BuildPatientsList extends StatefulWidget { - final List patients; - final AppUser signedInUser; - final Business? business; - final BusinessArguments arguments; - - const BuildPatientsList({ - super.key, - required this.patients, - required this.signedInUser, - required this.business, - required this.arguments, - }); - - @override - State createState() => _BuildPatientsListState(); -} - -class _BuildPatientsListState extends State { - TextEditingController dateController = TextEditingController(); - TextEditingController timeController = TextEditingController(); - TextEditingController idController = TextEditingController(); - TextEditingController fnameController = TextEditingController(); - TextEditingController lnameController = TextEditingController(); - TextEditingController accessStatusController = TextEditingController(); - final baseAPI = AppEnviroment.baseApiUrl; - - Future addPatientAppointmentAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/queue/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "business_id": widget.business!.business_id, - "app_id": widget.patients[index].app_id, - "date": dateController.text, - "time": timeController.text, - "access": "pending", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - String message = - "The appointment has been successfully booked!\n\nAn approval request as been sent to the patient.Once the access request has been approved, you will be able to access the patients profile. ou can check the status of your request in patient queue under the appointment."; - // "${fnameController.text} ${lnameController.text} patient profiole has been successfully added!\n"; - Navigator.pop(context); - Navigator.pop(context); - setState(() { - dateController.text = ""; - timeController.text = ""; - }); - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: BusinessArguments( - widget.arguments.signedInUser, - widget.arguments.businessUser, - widget.arguments.business, - ), - ); - successPopUp(message); - addAccessReviewNotificationAPICall(index); - } else { - internetConnectionPopUp(); - } - } - - Future addPatientAccessAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/access-requests/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "business_id": widget.business!.business_id, - "app_id": widget.patients[index].app_id, - "date": dateController.text, - "time": timeController.text, - "access": "pending", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - String message = - "The appointment has been successfully booked!\n\nAn approval request as been sent to the patient.Once the access request has been approved, you will be able to access the patients profile. ou can check the status of your request in patient queue under the appointment."; - // "${fnameController.text} ${lnameController.text} patient profiole has been successfully added!\n"; - Navigator.pop(context); - Navigator.pop(context); - setState(() { - dateController.text = ""; - timeController.text = ""; - }); - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: BusinessArguments( - widget.arguments.signedInUser, - widget.arguments.businessUser, - widget.arguments.business, - ), - ); - successPopUp(message); - addAccessReviewNotificationAPICall(index); - } else { - internetConnectionPopUp(); - } - } - - Future addAccessReviewNotificationAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/notifications/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "app_id": widget.patients[index].app_id, - "notification_type": "New Appointment Booked", - "notification_message": - "A new Appointment has been booked by ${widget.arguments.business!.Name} for the ${dateController.text} ${timeController.text}. Please approve the Access Review request.", - "action_path": "/mih-access", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - } else { - internetConnectionPopUp(); - } - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void submitApointment(int index) { - MIHApiCalls.addAppointmentAPICall( - widget.arguments.business!.business_id, - widget.patients[index].app_id, - false, - dateController.text, - timeController.text, - widget.arguments, - context, - ); - //addPatientAppointmentAPICall(index); - } - - bool isAppointmentFieldsFilled() { - if (dateController.text.isEmpty || timeController.text.isEmpty) { - return false; - } else { - return true; - } - } - - void appointmentPopUp(int index) { - var firstLetterFName = widget.patients[index].first_name[0]; - var firstLetterLName = widget.patients[index].last_name[0]; - var fnameStar = '*' * 8; - var lnameStar = '*' * 8; - - setState(() { - idController.text = widget.patients[index].id_no; - fnameController.text = firstLetterFName + fnameStar; - lnameController.text = firstLetterLName + lnameStar; - }); - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Patient Appointment", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - MIHTextField( - controller: idController, - hintText: "ID No.", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: fnameController, - hintText: "First Name", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: lnameController, - hintText: "Surname", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHDateField( - controller: dateController, - lableText: "Date", - required: true, - ), - const SizedBox(height: 10.0), - MIHTimeField( - controller: timeController, - lableText: "Time", - required: true, - ), - const SizedBox(height: 30.0), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Book", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - //print("here1"); - bool filled = isAppointmentFieldsFilled(); - //print("fields filled: $filled"); - if (filled) { - //print("here2"); - submitApointment(index); - //print("here3"); - } else { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Input Error"); - }, - ); - } - }, - ), - ) - ], - ), - ); - } - - void noAccessWarning() { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "No Access"); - }, - ); - } - - Future hasAccessToProfile(int index) async { - var hasAccess = false; - await MIHApiCalls.checkBusinessAccessToPatient( - widget.business!.business_id, widget.patients[index].app_id) - .then((results) { - if (results.isEmpty) { - setState(() { - hasAccess = false; - }); - } else if (results[0].status == "approved") { - setState(() { - hasAccess = true; - }); - } else { - setState(() { - hasAccess = false; - }); - } - }); - return hasAccess; - } - - Future getAccessStatusOfProfile(int index) async { - var accessStatus = ""; - await MIHApiCalls.checkBusinessAccessToPatient( - widget.business!.business_id, widget.patients[index].app_id) - .then((results) { - if (results.isEmpty) { - setState(() { - accessStatus = ""; - }); - } else { - setState(() { - accessStatus = results[0].status; - }); - } - }); - return accessStatus; - } - - void patientProfileChoicePopUp(int index) async { - var hasAccess = false; - String accessStatus = ""; - await hasAccessToProfile(index).then((result) { - setState(() { - hasAccess = result; - }); - }); - await getAccessStatusOfProfile(index).then((result) { - setState(() { - accessStatus = result; - }); - }); - // print(accessStatus); - // print(hasAccess); - var firstLetterFName = widget.patients[index].first_name[0]; - var firstLetterLName = widget.patients[index].last_name[0]; - var fnameStar = '*' * 8; - var lnameStar = '*' * 8; - if (accessStatus == "") { - accessStatus = "No Access"; - } - setState(() { - idController.text = widget.patients[index].id_no; - fnameController.text = firstLetterFName + fnameStar; - lnameController.text = firstLetterLName + lnameStar; - accessStatusController.text = accessStatus.toUpperCase(); - }); - //print(accessStatus); - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Patient Profile", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - MIHTextField( - controller: idController, - hintText: "ID No.", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: fnameController, - hintText: "First Name", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: lnameController, - hintText: "Surname", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: accessStatusController, - hintText: "Access Status", - editable: false, - required: true, - ), - const SizedBox(height: 20.0), - Visibility( - visible: !hasAccess, - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - "Important Notice: Requesting Patient Profile Access", - style: TextStyle( - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - Text( - "You are about to request access to a patient's profile. Please be aware of the following important points:", - style: TextStyle( - fontWeight: FontWeight.normal, - color: MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - SizedBox( - width: 600, - child: Text( - "1. Permanent Access: Once the patient accepts your access request, it will become permanent.", - style: TextStyle( - fontWeight: FontWeight.normal, - color: - MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - ), - SizedBox( - width: 600, - child: Text( - "2. Shared Information: Any updates you make to the patient's profile will be visible to others who have access to the profile.", - style: TextStyle( - fontWeight: FontWeight.normal, - color: - MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - ), - SizedBox( - width: 600, - child: Text( - "3. Irreversible Access: Once granted, you cannot revoke your access to the patient's profile.", - style: TextStyle( - fontWeight: FontWeight.normal, - color: - MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - ), - Text( - "By pressing the \"Request Access\" button you accept the above terms.", - style: TextStyle( - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.errorColor(), - ), - ), - ], - ), - ), - const SizedBox(height: 20.0), - Wrap(runSpacing: 10, spacing: 10, children: [ - Visibility( - visible: hasAccess, - child: SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Book Appointment", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - if (hasAccess) { - appointmentPopUp(index); - } else { - noAccessWarning(); - } - }, - ), - ), - ), - Visibility( - visible: hasAccess, - child: SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "View Patient Profile", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - if (hasAccess) { - Navigator.of(context) - .pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - widget.patients[index], - widget.arguments.businessUser, - widget.business, - "business", - )); - } else { - noAccessWarning(); - } - }, - ), - ), - ), - Visibility( - visible: !hasAccess && accessStatus == "No Access", - child: SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Request Access", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - //print("Send access Request..."); - // MIHApiCalls.addPatientAccessAPICall( - // widget.business!.business_id, - // widget.patients[index].app_id, - // "patient", - // widget.business!.Name, - // widget.arguments, - // context, - // ); - }, - ), - ), - ), - Visibility( - visible: !hasAccess && accessStatus == "declined", - child: SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Re-apply", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - print("Send rewaply access Request..."); - // MIHApiCalls.reapplyPatientAccessAPICall( - // widget.business!.business_id, - // widget.patients[index].app_id, - // widget.arguments, - // context, - // ); - }, - ), - ), - ), - Visibility( - visible: !hasAccess && accessStatus == "pending", - child: const SizedBox( - width: 500, - //height: 50, - child: Text( - "Patient has not approved access to their profile. Once access has been approved you can book and appointment or view their profile."), - ), - ), - ]) - ], - ), - ); - } - - Widget isMainMember(int index) { - //var matchRE = RegExp(r'^[a-z]+$'); - var firstLetterFName = widget.patients[index].first_name[0]; - var firstLetterLName = widget.patients[index].last_name[0]; - var fnameStar = '*' * 8; - var lnameStar = '*' * 8; - - if (widget.patients[index].medical_aid_main_member == "Yes") { - return Row( - mainAxisSize: MainAxisSize.max, - children: [ - Text( - "$firstLetterFName$fnameStar $firstLetterLName$lnameStar", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - const SizedBox( - width: 10, - ), - Icon( - Icons.star_border_rounded, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ], - ); - } else { - return Text( - "$firstLetterFName$fnameStar $firstLetterLName$lnameStar", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ); - } - } - - Widget hasMedicalAid(int index) { - var medAidNoStar = '*' * 8; - if (widget.patients[index].medical_aid == "Yes") { - return ListTile( - title: isMainMember(index), - subtitle: Text( - "ID No.: ${widget.patients[index].id_no}\nMedical Aid No.: $medAidNoStar", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - onTap: () { - patientProfileChoicePopUp(index); - // setState(() { - // appointmentPopUp(index); - // // Add popup to add patienmt to queue - // // Navigator.of(context).pushNamed('/patient-manager/patient', - // // arguments: PatientViewArguments( - // // widget.signedInUser, widget.patients[index], "business")); - // }); - }, - trailing: Icon( - Icons.arrow_forward, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ); - } else { - return ListTile( - title: isMainMember(index), - subtitle: Text( - "ID No.: ${widget.patients[index].id_no}\nMedical Aid No.: $medAidNoStar", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - onTap: () { - patientProfileChoicePopUp(index); - // setState(() { - // appointmentPopUp(index); - // // Navigator.of(context).pushNamed('/patient-manager/patient', - // // arguments: PatientViewArguments( - // // widget.signedInUser, widget.patients[index], "business")); - // }); - }, - trailing: Icon( - Icons.add, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ); - } - } - - @override - void dispose() { - dateController.dispose(); - timeController.dispose(); - idController.dispose(); - fnameController.dispose(); - lnameController.dispose(); - accessStatusController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (BuildContext context, index) { - return Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ); - }, - itemCount: widget.patients.length, - itemBuilder: (context, index) { - //final patient = widget.patients[index].id_no.contains(widget.searchString); - //print(index); - return hasMedicalAid(index); - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_queue_list.dart b/Frontend/lib/mih_packages/patient_profile/builder/build_patient_queue_list.dart deleted file mode 100644 index bdd795bd..00000000 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_patient_queue_list.dart +++ /dev/null @@ -1,845 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -import '../../../main.dart'; -import '../../../mih_apis/mih_api_calls.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_date_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_time_input.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_delete_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_warning_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/arguments.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/business_user.dart'; -import '../../../mih_objects/patient_queue.dart'; -import '../../../mih_objects/patients.dart'; - -class BuildPatientQueueList extends StatefulWidget { - final List patientQueue; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - - const BuildPatientQueueList({ - super.key, - required this.patientQueue, - required this.signedInUser, - required this.business, - required this.businessUser, - }); - - @override - State createState() => _BuildPatientsListState(); -} - -class _BuildPatientsListState extends State { - String baseAPI = AppEnviroment.baseApiUrl; - TextEditingController dateController = TextEditingController(); - TextEditingController timeController = TextEditingController(); - TextEditingController idController = TextEditingController(); - TextEditingController fnameController = TextEditingController(); - TextEditingController lnameController = TextEditingController(); - TextEditingController daysExtensionController = TextEditingController(); - int counter = 0; - - Future updateAccessAPICall(int index, String accessType) async { - var response = await http.put( - Uri.parse("$baseAPI/access-requests/update/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "business_id": widget.business!.business_id, - "app_id": widget.patientQueue[index].app_id, - "date_time": widget.patientQueue[index].date_time, - "access": accessType, - }), - ); - if (response.statusCode == 200) { - //Navigator.of(context).pushNamed('/home'); - addCancelledAppointmentNotificationAPICall(index); - // Navigator.of(context).pop(); - // Navigator.of(context).pop(); - // Navigator.of(context).pushNamed( - // '/patient-manager', - // arguments: BusinessArguments( - // widget.signedInUser, - // widget.businessUser, - // widget.business, - // ), - // ); - // String message = - // "The appointment for ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name} at ${widget.patientQueue[index].date_time} has been successfully canceled."; - - // successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - - // Future extendAccessAPICall(int index, String revokeDate) async { - // var response = await http.put( - // Uri.parse("$baseAPI/access-requests/extension/"), - // headers: { - // "Content-Type": "application/json; charset=UTF-8" - // }, - // body: jsonEncode({ - // "business_id": widget.business!.business_id, - // "app_id": widget.patientQueue[index].app_id, - // "date_time": widget.patientQueue[index].date_time, - // "revoke_date": revokeDate, - // }), - // ); - // if (response.statusCode == 200) { - // addAccessExtensionNotificationAPICall(index, revokeDate); - // //addCancelledAppointmentNotificationAPICall(index); - // } else { - // internetConnectionPopUp(); - // } - // } - - Future updateApointmentAPICall(int index) async { - var response = await http.put( - Uri.parse("$baseAPI/queue/appoointment/update/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "idpatient_queue": widget.patientQueue[index].idpatient_queue, - "date": dateController.text, - "time": timeController.text, - }), - ); - if (response.statusCode == 200) { - //Navigator.of(context).pushNamed('/home'); - addRescheduledAppointmentNotificationAPICall(index); - // Navigator.of(context).pop(); - // Navigator.of(context).pop(); - // Navigator.of(context).pop(); - // Navigator.of(context).pushNamed( - // '/patient-manager', - // arguments: BusinessArguments( - // widget.signedInUser, - // widget.businessUser, - // widget.business, - // ), - // ); - - // String message = - // "The appointment has been rescheduled for ${dateController.text} ${timeController.text}.\n\nJust a heads up: We've reset your access to the patient's profile and it will have to be approved again."; - - // successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - - Future fetchPatients(String app_id) async { - //print("pat man drawer: " + endpointUserData + widget.userEmail); - - var response = await http.get(Uri.parse("$baseAPI/patients/$app_id")); - - // print(response.statusCode); - // print(response.body); - if (response.statusCode == 200) { - // print("here"); - String body = response.body; - var decodedData = jsonDecode(body); - Patient u = Patient.fromJson(decodedData); - // print(u.email); - //setState(() { - //_widgetOptions = setLayout(u); - //}); - return u; - } else { - throw Exception("Error: GetUserData status code ${response.statusCode}"); - } - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void deleteFilePopUp(int index) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHDeleteMessage( - deleteType: "appointment", - onTap: () async { - await updateAccessAPICall(index, "cancelled"); - }, - ), - ); - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void viewConfirmationPopUp(int index) { - String subtitle = - "Appointment: ${widget.patientQueue[index].date_time.substring(0, 16).replaceAll("T", " ")}\n"; - subtitle += "ID No.: ${widget.patientQueue[index].id_no}\n"; - subtitle += - "Patient: ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name}\n"; - // subtitle += - // "Patient: ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name}\n\n"; - //subtitle += "Business Type: ${widget.patientQueue[index].last_name}\n\n"; - subtitle += - "Would you like to view the patient's profile before the appointment or cancel the appointment now?\n"; - //"You are about to approve an access request to your patient profile.\nPlease be aware that once approved, ${widget.accessRequests[index].Name} will have access to your profile information until ${widget.accessRequests[index].revoke_date.substring(0, 16).replaceAll("T", " ")}.\nIf you are unsure about an upcoming appointment with ${widget.accessRequests[index].Name}, please contact ${widget.accessRequests[index].contact_no} for clarification before approving this request.\n"; - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Appointment Confirmation", - windowBody: [ - const SizedBox( - height: 10, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: Text( - subtitle, - textAlign: TextAlign.left, - style: TextStyle( - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - fontSize: 15, - //fontWeight: FontWeight.bold, - ), - ), - ), - Wrap( - runSpacing: 10, - spacing: 10, - children: [ - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - //updateAccessAPICall(index, "cancelled"); - var appointmentDateTime = widget - .patientQueue[index].date_time - .substring(0, 16) - .split("T"); - var firstName = ""; - var lastName = ""; - firstName = widget.patientQueue[index].first_name; - lastName = widget.patientQueue[index].last_name; - - setState(() { - idController.text = widget.patientQueue[index].id_no; - fnameController.text = firstName; - lnameController.text = lastName; - dateController.text = appointmentDateTime[0]; - timeController.text = appointmentDateTime[1]; - }); - manageAppointmentPopUp(index); - }, - buttonText: "Manage Appointment", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - //updateAccessAPICall(index, "approved"); - - Patient selectedPatient; - fetchPatients(widget.patientQueue[index].app_id).then( - (result) { - setState(() { - selectedPatient = result; - Navigator.of(context).pop(); - Navigator.of(context) - .pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - selectedPatient, - widget.businessUser, - widget.business, - "business", - )); - }); - }, - ); - }, - buttonText: "View Patient Profile", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }), - ); - } - - Future addCancelledAppointmentNotificationAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/notifications/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "app_id": widget.patientQueue[index].app_id, - "notification_type": "Appointment Cancelled", - "notification_message": - "Your appointment with ${widget.business!.Name} for the ${widget.patientQueue[index].date_time.replaceAll("T", " ")} has been cancelled.", - "action_path": "/mih-access", - }), - ); - if (response.statusCode == 201) { - // Navigator.pushNamed(context, '/patient-manager/patient', - // arguments: widget.signedInUser); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: BusinessArguments( - widget.signedInUser, - widget.businessUser, - widget.business, - ), - ); - String message = - "The appointment for ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name} at ${widget.patientQueue[index].date_time} has been successfully canceled."; - - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - - Future addRescheduledAppointmentNotificationAPICall(int index) async { - var response = await http.post( - Uri.parse("$baseAPI/notifications/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "app_id": widget.patientQueue[index].app_id, - "notification_type": "Rescheduled Appointment", - "notification_message": - "Your appointment with ${widget.business!.Name} for the ${widget.patientQueue[index].date_time.replaceAll("T", " ").substring(0, widget.patientQueue[index].date_time.length - 3)} has been rescheduled to the ${dateController.text} ${timeController.text}.", - "action_path": "/mih-access", - }), - ); - if (response.statusCode == 201) { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: BusinessArguments( - widget.signedInUser, - widget.businessUser, - widget.business, - ), - ); - String message = - "The appointment for ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name} at ${widget.patientQueue[index].date_time} has been successfully canceled."; - - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - - // Future addAccessExtensionNotificationAPICall( - // int index, String revokeDate) async { - // var response = await http.post( - // Uri.parse("$baseAPI/notifications/insert/"), - // headers: { - // "Content-Type": "application/json; charset=UTF-8" - // }, - // body: jsonEncode({ - // "app_id": widget.patientQueue[index].app_id, - // "notification_type": "Access Extension Request", - // "notification_message": - // "${widget.business!.Name} - access expiry date extension for appointment: ${widget.patientQueue[index].date_time.split("T")[0]}. Expiry Date: from ${widget.patientQueue[index].revoke_date.split("T")[0]} to ${revokeDate.split(" ")[0]}.", - // "action_path": "/mih-access", - // }), - // ); - // if (response.statusCode == 201) { - // Navigator.of(context).pop(); - // Navigator.of(context).pop(); - // Navigator.of(context).pushNamed( - // '/patient-manager', - // arguments: BusinessArguments( - // widget.signedInUser, - // widget.businessUser, - // widget.business, - // ), - // ); - // String message = - // "you have successfully requested an extension on the expirey date. The request has been sent tp ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name} to review and approve the request"; - - // successPopUp(message); - // } else { - // internetConnectionPopUp(); - // } - // } - - void manageAppointmentPopUp(int index) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Manage Appointment", - windowBody: [ - MIHTextField( - controller: idController, - hintText: "ID No.", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: fnameController, - hintText: "First Name", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - MIHTextField( - controller: lnameController, - hintText: "Surname", - editable: false, - required: true, - ), - const SizedBox(height: 10.0), - const SizedBox(height: 10.0), - MIHDateField( - controller: dateController, - lableText: "Date", - required: true, - ), - const SizedBox(height: 10.0), - MIHTimeField( - controller: timeController, - lableText: "Time", - required: true, - ), - const SizedBox(height: 30.0), - Wrap( - runSpacing: 10, - spacing: 10, - children: [ - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - //add mihapicall for deleting appointment - MIHApiCalls.deleteApointmentAPICall( - widget.patientQueue[index].idpatient_queue, - widget.patientQueue[index].app_id, - false, - widget.patientQueue[index].date_time, - BusinessArguments( - widget.signedInUser, - widget.businessUser, - widget.business, - ), - context, - ); - //updateAccessAPICall(index, "cancelled"); - }, - buttonText: "Cancel Appointment", - buttonColor: - MzanziInnovationHub.of(context)!.theme.errorColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - MIHApiCalls.updateApointmentAPICall( - widget.patientQueue[index].idpatient_queue, - widget.patientQueue[index].app_id, - false, - widget.business!.Name, - widget.patientQueue[index].date_time, - dateController.text, - timeController.text, - BusinessArguments( - widget.signedInUser, - widget.businessUser, - widget.business, - ), - context, - ); - }, - buttonText: "Update Appointment", - buttonColor: - MzanziInnovationHub.of(context)!.theme.successColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - ], - ), - const SizedBox( - height: 10, - ), - ], - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }), - ); - } - - Widget displayQueue(int index) { - String title = - widget.patientQueue[index].date_time.split('T')[1].substring(0, 5); - String line234 = ""; - // var nowDate = DateTime.now(); - // var expireyDate = DateTime.parse(widget.patientQueue[index].revoke_date); - - line234 += - "Name: ${widget.patientQueue[index].first_name} ${widget.patientQueue[index].last_name}\nID No.: ${widget.patientQueue[index].id_no}\nMedical Aid No: "; - if (widget.patientQueue[index].medical_aid_no == "") { - line234 += "No Medical Aid"; - } else { - // subtitle += - // "\nMedical Aid No: "; - line234 += widget.patientQueue[index].medical_aid_no; - } - - // String line5 = "\nAccess Request: "; - // String access = ""; - // if (expireyDate.isBefore(nowDate) && - // widget.patientQueue[index].access != "cacelled") { - // access += "EXPIRED"; - // } else { - // access += widget.patientQueue[index].access.toUpperCase(); - // } - // TextSpan accessWithColour; - // if (access == "APPROVED") { - // accessWithColour = TextSpan( - // text: access, - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.successColor())); - // } else if (access == "PENDING") { - // accessWithColour = TextSpan( - // text: access, - // style: TextStyle( - // color: - // MzanziInnovationHub.of(context)!.theme.messageTextColor())); - // } else { - // accessWithColour = TextSpan( - // text: access, - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.errorColor())); - // } - // String line6 = ""; - // line6 += - // "\nAccess Expiration date: ${widget.patientQueue[index].revoke_date.substring(0, 16).replaceAll("T", " ")}"; - return ListTile( - title: Text( - "Appointment: $title", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - subtitle: RichText( - text: TextSpan( - text: line234, - style: DefaultTextStyle.of(context).style, - // children: [ - // TextSpan(text: line5), - // accessWithColour, - // TextSpan(text: line6), - // ] - ), - ), - // Text( - // subtitle, - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - // ), - onTap: () { - // var todayDate = DateTime.now(); - // var revokeDate = DateTime.parse(widget.patientQueue[index].revoke_date); - // // print( - // // "Todays: $todayDate\nRevoke Date: $revokeDate\nHas revoke date passed: ${revokeDate.isBefore(todayDate)}"); - // if (revokeDate.isBefore(todayDate)) { - // expiredAccessWarning(); - // } else if (widget.patientQueue[index].access == "approved") { - // viewConfirmationPopUp(index); - // // Patient selectedPatient; - // // fetchPatients(widget.patientQueue[index].app_id).then( - // // (result) { - // // setState(() { - // // selectedPatient = result; - // // Navigator.of(context).pushNamed('/patient-manager/patient', - // // arguments: PatientViewArguments( - // // widget.signedInUser, - // // selectedPatient, - // // widget.businessUser, - // // widget.business, - // // "business", - // // )); - // // }); - // // }, - // // ); - // } else if (widget.patientQueue[index].access == "declined") { - // accessDeclinedWarning(); - // } else if (widget.patientQueue[index].access == "cancelled") { - // appointmentCancelledWarning(); - // } else { - viewConfirmationPopUp(index); - //noAccessWarning(); - // } - }, - //leading: getExtendAccessButton(access), - //trailing: getExtendAccessButton(access, index), - // Icon( - // Icons.arrow_forward, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - ); - } - - bool isAccessExpired(String accessType) { - if (accessType == "EXPIRED") { - return true; - } else { - return false; - } - } - - // Widget getExtendAccessButton(String accessType, int index) { - // if (isAccessExpired(accessType)) { - // return IconButton( - // icon: const Icon(Icons.cached), - // onPressed: () { - // setState(() { - // daysExtensionController.text = counter.toString(); - // }); - // reapplyForAccess(index); - // }, - // ); - // } else { - // return Icon( - // Icons.arrow_forward, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ); - // } - // } - - // void reapplyForAccess(int index) { - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (context) => MIHWindow( - // fullscreen: false, - // windowTitle: "Extend Access", - // windowTools: const [], - // onWindowTapClose: () { - // Navigator.pop(context); - // }, - // windowBody: [ - // Text( - // "Current Expiration Date : ${widget.patientQueue[index].revoke_date.replaceAll("T", " ")}", - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // fontSize: 15, - // fontWeight: FontWeight.normal, - // ), - // ), - // const SizedBox(height: 5), - // Text( - // "Select the number of days you would like to extend the access by.", - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // fontSize: 15, - // fontWeight: FontWeight.normal, - // ), - // ), - // const SizedBox(height: 5), - // Text( - // "Once you click \"Apply\", an access review request will be triggered to the patient.", - // style: TextStyle( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // fontSize: 15, - // fontWeight: FontWeight.normal, - // ), - // ), - // const SizedBox(height: 30), - // Row( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ - // IconButton.filled( - // onPressed: () { - // if (counter > 0) { - // counter--; - // setState(() { - // daysExtensionController.text = counter.toString(); - // }); - // } - // }, - // icon: const Icon(Icons.remove), - // ), - // const SizedBox(width: 15), - // SizedBox( - // width: 100, - // child: MIHTextField( - // controller: daysExtensionController, - // hintText: "Days", - // editable: false, - // required: true, - // ), - // ), - // const SizedBox(width: 15), - // IconButton.filled( - // onPressed: () { - // counter++; - // setState(() { - // daysExtensionController.text = counter.toString(); - // }); - // }, - // icon: const Icon(Icons.add), - // ), - // ], - // ), - // const SizedBox(height: 30), - // SizedBox( - // width: 300, - // height: 50, - // child: MIHButton( - // onTap: () { - // print( - // "Revoke Date (String): ${widget.patientQueue[index].revoke_date}"); - // var revokeDate = DateTime.parse(widget - // .patientQueue[index].revoke_date - // .replaceAll("T", " ")); - // var newRevokeDate = revokeDate.add( - // Duration(days: int.parse(daysExtensionController.text))); - // print("Revoke Date (DateTime): $revokeDate"); - // print("New Revoke Date (DateTime): $newRevokeDate"); - // print( - // "${widget.business!.Name} would like to extend the access expirey date for your appointment on the ${widget.patientQueue[index].date_time}.\nNew Expirey Date: $revokeDate", - // ); - // extendAccessAPICall(index, "$newRevokeDate"); - // }, - // buttonText: "Apply", - // buttonColor: - // MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - // ), - // ), - // ], - // ), - // ); - // } - - void noAccessWarning() { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "No Access"); - }, - ); - } - - void accessDeclinedWarning() { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "Access Declined"); - }, - ); - } - - void appointmentCancelledWarning() { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "Appointment Canelled"); - }, - ); - } - - void expiredAccessWarning() { - showDialog( - context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "Expired Access"); - }, - ); - } - - @override - void dispose() { - daysExtensionController.dispose(); - dateController.dispose(); - timeController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - separatorBuilder: (BuildContext context, index) { - return Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ); - }, - itemCount: widget.patientQueue.length, - itemBuilder: (context, index) { - //final patient = widget.patients[index].id_no.contains(widget.searchString); - //print(index); - return displayQueue(index); - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/app_tools/waiting_room.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/app_tools/waiting_room.dart index e7ff178b..6675d2ac 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/app_tools/waiting_room.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/app_tools/waiting_room.dart @@ -262,7 +262,6 @@ class _WaitingRoomState extends State { } void addAppointmentWindow() { - print(widget.personalSelected); showDialog( context: context, barrierDismissible: false, diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/pat_manager.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/pat_manager.dart index 851132a3..c517c7a6 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/pat_manager.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/pat_manager.dart @@ -38,7 +38,6 @@ class _PatManagerState extends State { setState(() { _selcetedIndex = newValue; }); - print("Index: $_selcetedIndex"); }, ); } @@ -96,6 +95,7 @@ class _PatManagerState extends State { MyPatientList( signedInUser: widget.arguments.signedInUser, business: widget.arguments.business, + businessUser: widget.arguments.businessUser, personalSelected: widget.arguments.personalSelected, ), MihPatientSearch( diff --git a/Frontend/lib/mih_packages/patient_profile/add_or_view_patient.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/add_or_view_patient.dart similarity index 81% rename from Frontend/lib/mih_packages/patient_profile/add_or_view_patient.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/add_or_view_patient.dart index ca6f5630..456b7418 100644 --- a/Frontend/lib/mih_packages/patient_profile/add_or_view_patient.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/add_or_view_patient.dart @@ -1,16 +1,15 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/patient_add.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/patient_profile.dart'; import 'package:flutter/material.dart'; -import '../../main.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/patients.dart'; -import 'patient_add.dart'; -import 'patient_view.dart'; - class AddOrViewPatient extends StatefulWidget { //final AppUser signedInUser; final PatientViewArguments arguments; @@ -70,7 +69,7 @@ class _AddOrViewPatientState extends State { snapshot.hasData) { // Extracting data from snapshot object //final data = snapshot.data as String; - return PatientView( + return PatientProfile( arguments: PatientViewArguments( widget.arguments.signedInUser, snapshot.requireData, diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart new file mode 100644 index 00000000..6f96351a --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart @@ -0,0 +1,151 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_apis/mih_claim_statement_generation_api.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/claim_statement_file.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_claim_statement_files_list.dart'; +import 'package:flutter/material.dart'; + +class PatientClaimOrStatement extends StatefulWidget { + final int patientIndex; + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + final String type; + const PatientClaimOrStatement({ + super.key, + required this.patientIndex, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + required this.type, + }); + + @override + State createState() => + _PatientClaimOrStatementState(); +} + +class _PatientClaimOrStatementState extends State { + late Future> futueFiles; + + void claimOrStatementWindow() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => ClaimStatementWindow( + selectedPatient: widget.selectedPatient, + signedInUser: widget.signedInUser, + business: widget.business, + businessUser: widget.businessUser, + ), + ); + } + + List setIcons() { + if (widget.type == "personal") { + return [ + Text( + "Claims/ Statements", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + ]; + } else { + return [ + Text( + "Claims/ Statements", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + // new window to input fields for claim/ statements + claimOrStatementWindow(); + }, + icon: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ) + ]; + } + } + + @override + void initState() { + if (widget.business == null) { + futueFiles = + MIHClaimStatementGenerationApi.getClaimStatementFilesByPatient( + widget.signedInUser.app_id); + } else { + futueFiles = + MIHClaimStatementGenerationApi.getClaimStatementFilesByBusiness( + widget.business!.business_id); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return FutureBuilder( + future: futueFiles, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final filesList = snapshot.data!; + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: setIcons(), + ), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + //const Placeholder(), + BuildClaimStatementFileList( + files: filesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ], + ); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/patient_notes.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart similarity index 73% rename from Frontend/lib/mih_packages/patient_profile/patient_notes.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart index 7a604967..f3e0e8aa 100644 --- a/Frontend/lib/mih_packages/patient_profile/patient_notes.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart @@ -1,32 +1,32 @@ import 'dart:convert'; - +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_single_child_scroll.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/notes.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_notes_list.dart'; import 'package:flutter/material.dart'; -import '../../main.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../mih_components/mih_layout/mih_window.dart'; -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/business.dart'; -import '../../mih_objects/business_user.dart'; -import '../../mih_objects/notes.dart'; -import '../../mih_objects/patients.dart'; -import 'builder/build_notes_list.dart'; - -class PatientNotes extends StatefulWidget { +class PatientConsultation extends StatefulWidget { final String patientAppId; final Patient selectedPatient; final AppUser signedInUser; final Business? business; final BusinessUser? businessUser; final String type; - const PatientNotes({ + const PatientConsultation({ super.key, required this.patientAppId, required this.selectedPatient, @@ -37,20 +37,18 @@ class PatientNotes extends StatefulWidget { }); @override - State createState() => _PatientNotesState(); + State createState() => _PatientConsultationState(); } -class _PatientNotesState extends State { - String endpoint = "${AppEnviroment.baseApiUrl}/notes/patients/"; - String apiUrlAddNote = "${AppEnviroment.baseApiUrl}/notes/insert/"; +class _PatientConsultationState extends State { + late Future> futueNotes; final titleController = TextEditingController(); final noteTextController = TextEditingController(); final officeController = TextEditingController(); final dateController = TextEditingController(); final doctorController = TextEditingController(); - late Future> futueNotes; - //int noteDetailCount = 0; final ValueNotifier _counter = ValueNotifier(0); + String endpoint = "${AppEnviroment.baseApiUrl}/notes/patients/"; Future> fetchNotes(String endpoint) async { final response = await http.get(Uri.parse( @@ -67,75 +65,12 @@ class _PatientNotesState extends State { } } - Future addPatientNoteAPICall() async { - // String title = ""; - // if (widget.businessUser!.title == "Doctor") { - // title = "Dr."; - // } - var response = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "note_name": titleController.text, - "note_text": noteTextController.text, - "doc_office": officeController.text, - "doctor": doctorController.text, - "app_id": widget.selectedPatient.app_id, - }), - ); - if (response.statusCode == 201) { - setState(() { - futueNotes = fetchNotes(endpoint + widget.patientAppId.toString()); - }); - // Navigator.of(context) - // .pushNamed('/patient-manager', arguments: widget.userEmail); - String message = - "Your note has been successfully added to the patients medical record. You can now view it alongside their other important information."; - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void messagePopUp(error) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(error), - ); - }, - ); - } - void addNotePopUp() { DateTime now = new DateTime.now(); DateTime date = new DateTime(now.year, now.month, now.day); var title = ""; - if (widget.businessUser!.title == "Doctor") { + print("Business User: ${widget.businessUser}"); + if (widget.businessUser?.title == "Doctor") { title = "Dr."; } setState(() { @@ -251,11 +186,35 @@ class _PatientNotesState extends State { ); } - Color getNoteDetailLimitColor() { - if (_counter.value <= 512) { - return MzanziInnovationHub.of(context)!.theme.secondaryColor(); + Future addPatientNoteAPICall() async { + // String title = ""; + // if (widget.businessUser!.title == "Doctor") { + // title = "Dr."; + // } + var response = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "note_name": titleController.text, + "note_text": noteTextController.text, + "doc_office": officeController.text, + "doctor": doctorController.text, + "app_id": widget.selectedPatient.app_id, + }), + ); + if (response.statusCode == 201) { + setState(() { + futueNotes = fetchNotes(endpoint + widget.patientAppId.toString()); + }); + // Navigator.of(context) + // .pushNamed('/patient-manager', arguments: widget.userEmail); + String message = + "Your note has been successfully added to the patients medical record. You can now view it alongside their other important information."; + successPopUp(message); } else { - return MzanziInnovationHub.of(context)!.theme.errorColor(); + internetConnectionPopUp(); } } @@ -269,11 +228,19 @@ class _PatientNotesState extends State { } } + Color getNoteDetailLimitColor() { + if (_counter.value <= 512) { + return MzanziInnovationHub.of(context)!.theme.secondaryColor(); + } else { + return MzanziInnovationHub.of(context)!.theme.errorColor(); + } + } + List setIcons() { if (widget.type == "personal") { return [ Text( - "Notes", + "Consultation Notes", textAlign: TextAlign.center, style: TextStyle( fontSize: 25, @@ -284,7 +251,7 @@ class _PatientNotesState extends State { } else { return [ Text( - "Notes", + "Consultation Notes", textAlign: TextAlign.center, style: TextStyle( fontSize: 25, @@ -293,6 +260,7 @@ class _PatientNotesState extends State { ), IconButton( onPressed: () { + // addConsultationNotePopUp(); addNotePopUp(); }, icon: Icon(Icons.add, @@ -302,6 +270,27 @@ class _PatientNotesState extends State { } } + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + @override void dispose() { titleController.dispose(); @@ -315,52 +304,58 @@ class _PatientNotesState extends State { @override void initState() { futueNotes = fetchNotes(endpoint + widget.patientAppId); - // setState(() { - // noteDetailCount = noteTextController.text.length; - // }); noteTextController.addListener(() { setState(() { _counter.value = noteTextController.text.characters.length; }); - print(_counter.value); }); super.initState(); } @override Widget build(BuildContext context) { - return FutureBuilder( - future: futueNotes, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final notesList = snapshot.data!; - return Column(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - BuildNotesList( - notes: notesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return MihSingleChildScroll( + child: FutureBuilder( + future: futueNotes, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final notesList = snapshot.data!; + return Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: setIcons(), + ), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + BuildNotesList( + notes: notesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ]); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ), ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/patient_files.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart similarity index 82% rename from Frontend/lib/mih_packages/patient_profile/patient_files.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart index 32b93acf..1270c3c5 100644 --- a/Frontend/lib/mih_packages/patient_profile/patient_files.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart @@ -1,38 +1,37 @@ -import 'dart:async'; import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/med_cert_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_file_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_single_child_scroll.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/files.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/prescip_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_files_list.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; -import '../../main.dart'; +import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/http.dart' as http; import 'package:http/http.dart' as http2; -import 'package:supertokens_flutter/supertokens.dart'; -import '../../mih_components/med_cert_input.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_file_input.dart'; -import '../../mih_components/mih_layout/mih_window.dart'; -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/business.dart'; -import '../../mih_objects/business_user.dart'; -import '../../mih_objects/files.dart'; -import '../../mih_objects/patients.dart'; -import 'builder/build_files_list.dart'; -import 'prescip_input.dart'; - -class PatientFiles extends StatefulWidget { +class PatientDocuments extends StatefulWidget { final int patientIndex; final Patient selectedPatient; final AppUser signedInUser; final Business? business; final BusinessUser? businessUser; final String type; - - const PatientFiles({ + const PatientDocuments({ super.key, required this.patientIndex, required this.selectedPatient, @@ -43,21 +42,15 @@ class PatientFiles extends StatefulWidget { }); @override - State createState() => _PatientFilesState(); + State createState() => _PatientDocumentsState(); } -class _PatientFilesState extends State { - String endpointFiles = "${AppEnviroment.baseApiUrl}/files/patients/"; - String endpointUser = "${AppEnviroment.baseApiUrl}/users/profile/"; - String endpointGenFiles = - "${AppEnviroment.baseApiUrl}/files/generate/med-cert/"; - String endpointFileUpload = "${AppEnviroment.baseApiUrl}/files/upload/file/"; - String endpointInsertFiles = "${AppEnviroment.baseApiUrl}/files/insert/"; - +class _PatientDocumentsState extends State { + late Future> futueFiles; + final selectedFileController = TextEditingController(); final startDateController = TextEditingController(); final endDateTextController = TextEditingController(); final retDateTextController = TextEditingController(); - final selectedFileController = TextEditingController(); final medicineController = TextEditingController(); final quantityController = TextEditingController(); final dosageController = TextEditingController(); @@ -65,11 +58,84 @@ class _PatientFilesState extends State { final noDaysController = TextEditingController(); final noRepeatsController = TextEditingController(); final outputController = TextEditingController(); - - late Future> futueFiles; - late String userEmail = ""; late PlatformFile selected; - final baseAPI = AppEnviroment.baseApiUrl; + + Future> fetchFiles() async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/files/patients/${widget.selectedPatient.app_id}")); + //print(response.statusCode); + //print(response.body); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List files = + List.from(l.map((model) => PFile.fromJson(model))); + return files; + } else { + internetConnectionPopUp(); + throw Exception('failed to load patients'); + } + } + + Future uploadSelectedFile(PlatformFile file) async { + //var strem = new http.ByteStream.fromBytes(file.bytes.) + //start loading circle + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + var token = await SuperTokens.getAccessToken(); + //print(t); + //print("here1"); + var request = http2.MultipartRequest( + 'POST', Uri.parse("${AppEnviroment.baseApiUrl}/minio/upload/file/")); + request.headers['accept'] = 'application/json'; + request.headers['Authorization'] = 'Bearer $token'; + request.headers['Content-Type'] = 'multipart/form-data'; + request.fields['app_id'] = widget.selectedPatient.app_id; + request.fields['folder'] = "patient_files"; + request.files.add(await http2.MultipartFile.fromBytes('file', file.bytes!, + filename: file.name.replaceAll(RegExp(r' '), '-'))); + //print("here2"); + var response1 = await request.send(); + //print("here3"); + //print(response1.statusCode); + //print(response1.toString()); + if (response1.statusCode == 200) { + //print("here3"); + var fname = file.name.replaceAll(RegExp(r' '), '-'); + var filePath = "${widget.selectedPatient.app_id}/patient_files/$fname"; + var response2 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": filePath, + "file_name": fname, + "app_id": widget.selectedPatient.app_id + }), + ); + //print("here5"); + //print(response2.statusCode); + if (response2.statusCode == 201) { + setState(() { + selectedFileController.clear(); + futueFiles = fetchFiles(); + }); + // end loading circle + Navigator.of(context).pop(); + String message = + "The file ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } else { + internetConnectionPopUp(); + } + } Future generateMedCert() async { //start loading circle @@ -79,7 +145,6 @@ class _PatientFilesState extends State { return const Mihloadingcircle(); }, ); - var response1 = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/minio/generate/med-cert/"), headers: { @@ -143,105 +208,64 @@ class _PatientFilesState extends State { } } - Future uploadSelectedFile(PlatformFile file) async { - //var strem = new http.ByteStream.fromBytes(file.bytes.) - //start loading circle + void uploudFilePopUp() { showDialog( context: context, - builder: (context) { - return const Mihloadingcircle(); - }, - ); - - var token = await SuperTokens.getAccessToken(); - //print(t); - //print("here1"); - var request = http2.MultipartRequest( - 'POST', Uri.parse("${AppEnviroment.baseApiUrl}/minio/upload/file/")); - request.headers['accept'] = 'application/json'; - request.headers['Authorization'] = 'Bearer $token'; - request.headers['Content-Type'] = 'multipart/form-data'; - request.fields['app_id'] = widget.selectedPatient.app_id; - request.fields['folder'] = "patient_files"; - request.files.add(await http2.MultipartFile.fromBytes('file', file.bytes!, - filename: file.name.replaceAll(RegExp(r' '), '-'))); - //print("here2"); - var response1 = await request.send(); - //print("here3"); - //print(response1.statusCode); - //print(response1.toString()); - if (response1.statusCode == 200) { - //print("here3"); - var fname = file.name.replaceAll(RegExp(r' '), '-'); - var filePath = "${widget.selectedPatient.app_id}/patient_files/$fname"; - var response2 = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/files/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Upload File", + windowTools: const [], + onWindowTapClose: () { + Navigator.pop(context); }, - body: jsonEncode({ - "file_path": filePath, - "file_name": fname, - "app_id": widget.selectedPatient.app_id - }), - ); - //print("here5"); - //print(response2.statusCode); - if (response2.statusCode == 201) { - setState(() { - selectedFileController.clear(); - futueFiles = fetchFiles(); - }); - // end loading circle - Navigator.of(context).pop(); - String message = - "The file ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } else { - internetConnectionPopUp(); - } - } - - Future> fetchFiles() async { - final response = await http.get(Uri.parse( - "${AppEnviroment.baseApiUrl}/files/patients/${widget.selectedPatient.app_id}")); - - //print(response.statusCode); - //print(response.body); - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List files = - List.from(l.map((model) => PFile.fromJson(model))); - return files; - } else { - internetConnectionPopUp(); - throw Exception('failed to load patients'); - } - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void messagePopUp(error) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(error), - ); - }, + windowBody: [ + MIHFileField( + controller: selectedFileController, + hintText: "Select File", + editable: false, + required: true, + onPressed: () async { + FilePickerResult? result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['jpg', 'png', 'pdf'], + ); + if (result == null) return; + final selectedFile = result.files.first; + setState(() { + selected = selectedFile; + }); + setState(() { + selectedFileController.text = selectedFile.name; + }); + }, + ), + const SizedBox(height: 15), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Add File", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () { + if (isFileFieldsFilled()) { + uploadSelectedFile(selected); + Navigator.pop(context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + ), + ) + ], + ), ); } @@ -327,89 +351,18 @@ class _PatientFilesState extends State { ); } - void uploudFilePopUp() { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Upload File", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - MIHFileField( - controller: selectedFileController, - hintText: "Select File", - editable: false, - required: true, - onPressed: () async { - FilePickerResult? result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: ['jpg', 'png', 'pdf'], - ); - if (result == null) return; - final selectedFile = result.files.first; - setState(() { - selected = selectedFile; - }); - - setState(() { - selectedFileController.text = selectedFile.name; - }); - }, - ), - const SizedBox(height: 15), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - buttonText: "Add File", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onTap: () { - if (isFileFieldsFilled()) { - uploadSelectedFile(selected); - Navigator.pop(context); - } else { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Input Error"); - }, - ); - } - }, - ), - ) - ], - ), - ); - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - bool isMedCertFieldsFilled() { - if (startDateController.text.isEmpty || - endDateTextController.text.isEmpty || - retDateTextController.text.isEmpty) { + bool isFileFieldsFilled() { + if (selectedFileController.text.isEmpty) { return false; } else { return true; } } - bool isFileFieldsFilled() { - if (selectedFileController.text.isEmpty) { + bool isMedCertFieldsFilled() { + if (startDateController.text.isEmpty || + endDateTextController.text.isEmpty || + retDateTextController.text.isEmpty) { return false; } else { return true; @@ -480,6 +433,27 @@ class _PatientFilesState extends State { } } + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + @override void dispose() { startDateController.dispose(); @@ -499,45 +473,53 @@ class _PatientFilesState extends State { @override void initState() { futueFiles = fetchFiles(); - //patientDetails = getPatientDetails() as Patient; - //getUserDetails(); super.initState(); } @override Widget build(BuildContext context) { - return FutureBuilder( - future: futueFiles, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final filesList = snapshot.data!; - return Column(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - BuildFilesList( - files: filesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return MihSingleChildScroll( + child: FutureBuilder( + future: futueFiles, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final filesList = snapshot.data!; + return Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: setIcons(), + ), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + BuildFilesList( + files: filesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ]); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ), ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/patient_details.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart similarity index 70% rename from Frontend/lib/mih_packages/patient_profile/patient_details.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart index 8772de95..5b1f1697 100644 --- a/Frontend/lib/mih_packages/patient_profile/patient_details.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart @@ -1,15 +1,17 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_single_child_scroll.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; import 'package:flutter/material.dart'; -import '../../main.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/patients.dart'; -class PatientDetails extends StatefulWidget { +class PatientInfo extends StatefulWidget { final AppUser signedInUser; final Patient selectedPatient; final String type; - const PatientDetails({ + const PatientInfo({ super.key, required this.signedInUser, required this.selectedPatient, @@ -17,10 +19,10 @@ class PatientDetails extends StatefulWidget { }); @override - State createState() => _PatientDetailsState(); + State createState() => _PatientInfoState(); } -class _PatientDetailsState extends State { +class _PatientInfoState extends State { final idController = TextEditingController(); final fnameController = TextEditingController(); final lnameController = TextEditingController(); @@ -33,8 +35,6 @@ class _PatientDetailsState extends State { final medAidController = TextEditingController(); final medMainMemController = TextEditingController(); final medAidCodeController = TextEditingController(); - double? headingFontSize = 35.0; - double? bodyFonstSize = 20.0; double textFieldWidth = 400.0; late String medAid; @@ -173,7 +173,6 @@ class _PatientDetailsState extends State { ), //), ]); - return Wrap( spacing: 10, runSpacing: 10, @@ -181,44 +180,6 @@ class _PatientDetailsState extends State { ); } - List setIcons() { - if (widget.type == "personal") { - return [ - Text( - "Personal Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - IconButton( - icon: const Icon(Icons.edit), - alignment: Alignment.topRight, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onPressed: () { - Navigator.of(context).pushNamed('/patient-profile/edit', - arguments: PatientEditArguments( - widget.signedInUser, widget.selectedPatient)); - }, - ) - ]; - } else { - return [ - Text( - "Patient Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - ]; - } - } - @override void dispose() { idController.dispose(); @@ -269,30 +230,65 @@ class _PatientDetailsState extends State { @override Widget build(BuildContext context) { - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - //crossAxisAlignment: , - children: setIcons(), - ), - Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - getPatientDetailsField(), - const SizedBox(height: 10), - Text( - "Medical Aid Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return MihSingleChildScroll( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + //crossAxisAlignment: , + children: [ + Text( + "Personal Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + Visibility( + visible: widget.type == "personal", + child: IconButton( + icon: const Icon(Icons.edit), + alignment: Alignment.topRight, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onPressed: () { + Navigator.of(context).pushNamed('/patient-profile/edit', + arguments: PatientEditArguments( + widget.signedInUser, widget.selectedPatient)); + }, + ), + ) + ]), + Divider( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + getPatientDetailsField(), + const SizedBox(height: 10), + Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), ), - ), - Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - getMedAidDetailsFields(), - ], + Divider( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + getMedAidDetailsFields(), + ], + ), ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/Claim_Statement_Window.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart similarity index 80% rename from Frontend/lib/mih_packages/patient_profile/Claim_Statement_Window.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart index 3c0b0970..9d93caad 100644 --- a/Frontend/lib/mih_packages/patient_profile/Claim_Statement_Window.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart @@ -14,7 +14,7 @@ import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/icd10_code.dart.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/icd10_search_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/icd10_search_window.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -86,110 +86,6 @@ class _ClaimStatementWindowState extends State { enableSearch: false, ), const SizedBox(height: 10), - // Text( - // "Patient Details", - // textAlign: TextAlign.center, - // style: TextStyle( - // fontSize: 20, - // fontWeight: FontWeight.bold, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - // ), - // Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _fullNameController, - // hintText: "Full Name", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _idController, - // hintText: "ID No.", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _medAidController, - // hintText: "Has Medical Aid", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // ValueListenableBuilder( - // valueListenable: serviceDesc, - // builder: (BuildContext context, String value, Widget? child) { - // return Visibility( - // visible: value == "Yes", - // child: Column( - // children: [ - // MIHTextField( - // controller: _medAidNoController, - // hintText: "Medical Aid No.", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _medAidCodeController, - // hintText: "Medical Aid Code", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _medAidNameController, - // hintText: "Medical Aid Name", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _medAidSchemeController, - // hintText: "Medical Aid Scheme", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // ], - // ), - // ); - // }, - // ), - // Text( - // "Provider Details", - // textAlign: TextAlign.center, - // style: TextStyle( - // fontSize: 20, - // fontWeight: FontWeight.bold, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - // ), - // Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _providerNameController, - // hintText: "Provider Name", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _practiceNoController, - // hintText: "Practice No.", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), - // MIHTextField( - // controller: _vatNoController, - // hintText: "VAT No.", - // editable: false, - // required: true, - // ), - // const SizedBox(height: 10), Text( "Service Details", textAlign: TextAlign.center, diff --git a/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart similarity index 96% rename from Frontend/lib/mih_packages/patient_profile/full_screen_file.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart index 983a1853..0620f1e4 100644 --- a/Frontend/lib/mih_packages/patient_profile/full_screen_file.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:flutter/material.dart'; -import '../../main.dart'; +import '../../../../main.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; import "package:universal_html/html.dart" as html; @@ -11,11 +11,11 @@ import 'package:http/http.dart' as http; import 'package:printing/printing.dart'; import 'package:fl_downloader/fl_downloader.dart'; -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; -import '../../mih_objects/arguments.dart'; +import '../../../../mih_components/mih_layout/mih_action.dart'; +import '../../../../mih_components/mih_layout/mih_body.dart'; +import '../../../../mih_components/mih_layout/mih_header.dart'; +import '../../../../mih_components/mih_layout/mih_layout_builder.dart'; +import '../../../../mih_objects/arguments.dart'; class FullScreenFileViewer extends StatefulWidget { final FileViewArguments arguments; diff --git a/Frontend/lib/mih_packages/patient_profile/icd10_search_window.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/icd10_search_window.dart similarity index 96% rename from Frontend/lib/mih_packages/patient_profile/icd10_search_window.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/components/icd10_search_window.dart index f7613aaa..a191d30f 100644 --- a/Frontend/lib/mih_packages/patient_profile/icd10_search_window.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/icd10_search_window.dart @@ -1,7 +1,7 @@ import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/icd10_code.dart.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/builder/build_icd10_code_list.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_icd10_code_list.dart'; import 'package:flutter/material.dart'; class ICD10SearchWindow extends StatefulWidget { diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/medicine_search.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/medicine_search.dart new file mode 100644 index 00000000..af9c00c6 --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/medicine_search.dart @@ -0,0 +1,112 @@ +import 'dart:convert'; + +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/medicine.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_med_list.dart'; +import 'package:flutter/material.dart'; + +import 'package:supertokens_flutter/http.dart' as http; + +class MedicineSearch extends StatefulWidget { + final TextEditingController searchVlaue; + const MedicineSearch({ + super.key, + required this.searchVlaue, + }); + + @override + State createState() => _MedicineSearchState(); +} + +class _MedicineSearchState extends State { + final String endpointMeds = "${AppEnviroment.baseApiUrl}/users/medicine/"; + + //TextEditingController searchController = TextEditingController(); + + late Future> futueMeds; + //String searchString = ""; + + Future> getMedList(String endpoint) async { + final response = await http.get(Uri.parse(endpoint)); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List medicines = + List.from(l.map((model) => Medicine.fromJson(model))); + // List meds = []; + // medicines.forEach((element) => meds.add(element.name)); + return medicines; + } else { + internetConnectionPopUp(); + throw Exception('failed to load medicine'); + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + @override + void dispose() { + super.dispose(); + } + + @override + void initState() { + futueMeds = getMedList(endpointMeds + widget.searchVlaue.text); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MIHWindow( + fullscreen: false, + windowTitle: "Select Medicine", + windowTools: [], + onWindowTapClose: () { + Navigator.pop(context); + }, + windowBody: [ + FutureBuilder( + future: futueMeds, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const SizedBox( + height: 400, + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData && snapshot.data!.isNotEmpty) { + final medsList = snapshot.data!; + return SizedBox( + height: 400, + child: BuildMedicinesList( + contoller: widget.searchVlaue, + medicines: medsList, + //searchString: searchString, + ), + ); + } else { + return const SizedBox( + height: 400, + child: Center( + child: Text( + "No Match Found\nPlease close and manually capture medicine", + style: TextStyle(fontSize: 25, color: Colors.grey), + textAlign: TextAlign.center, + ), + ), + ); + } + }, + ), + ], + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/prescip_input.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart similarity index 93% rename from Frontend/lib/mih_packages/patient_profile/prescip_input.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart index 4a85b090..19e246ce 100644 --- a/Frontend/lib/mih_packages/patient_profile/prescip_input.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart @@ -1,25 +1,24 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/medicine_search.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_search_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/perscription.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import '../../main.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../mih_components/medicine_search.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_search_input.dart'; -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/business.dart'; -import '../../mih_objects/business_user.dart'; -import '../../mih_objects/patients.dart'; -import '../../mih_objects/perscription.dart'; - class PrescripInput extends StatefulWidget { final TextEditingController medicineController; final TextEditingController quantityController; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_claim_statement_files_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_claim_statement_files_list.dart similarity index 87% rename from Frontend/lib/mih_packages/patient_profile/builder/build_claim_statement_files_list.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_claim_statement_files_list.dart index ee548458..8456a0ab 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_claim_statement_files_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_claim_statement_files_list.dart @@ -1,23 +1,22 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; import 'package:Mzansi_Innovation_Hub/mih_apis/mih_claim_statement_generation_api.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_delete_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/claim_statement_file.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_file_view.dart'; import 'package:flutter/material.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../../main.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_delete_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/business_user.dart'; -import '../../../mih_objects/patients.dart'; -import 'build_file_view.dart'; - class BuildClaimStatementFileList extends StatefulWidget { final AppUser signedInUser; final List files; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_file_view.dart similarity index 99% rename from Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_file_view.dart index 3500e9bf..ba08bc62 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_file_view.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_file_view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:Mzansi_Innovation_Hub/main.dart'; import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; @@ -9,8 +10,6 @@ import "package:universal_html/html.dart" as html; import 'package:http/http.dart' as http; import 'package:fl_downloader/fl_downloader.dart'; -import '../../../mih_objects/arguments.dart'; - class BuildFileView extends StatefulWidget { final String link; final String path; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_files_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_files_list.dart similarity index 91% rename from Frontend/lib/mih_packages/patient_profile/builder/build_files_list.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_files_list.dart index 42aebb42..7e440891 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_files_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_files_list.dart @@ -1,23 +1,22 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_delete_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/files.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_file_view.dart'; import 'package:flutter/material.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../../main.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_delete_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/arguments.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/business_user.dart'; -import '../../../mih_objects/files.dart'; -import '../../../mih_objects/patients.dart'; -import 'build_file_view.dart'; - class BuildFilesList extends StatefulWidget { final AppUser signedInUser; final List files; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_icd10_code_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_icd10_code_list.dart similarity index 95% rename from Frontend/lib/mih_packages/patient_profile/builder/build_icd10_code_list.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_icd10_code_list.dart index 7bce328c..936ae228 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_icd10_code_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_icd10_code_list.dart @@ -1,9 +1,8 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; import 'package:Mzansi_Innovation_Hub/mih_objects/icd10_code.dart.dart'; import 'package:flutter/material.dart'; -import '../../../main.dart'; -import '../../../mih_env/env.dart'; - class BuildICD10CodeList extends StatefulWidget { final TextEditingController icd10CodeController; final List icd10codeList; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_med_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_med_list.dart similarity index 94% rename from Frontend/lib/mih_packages/patient_profile/builder/build_med_list.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_med_list.dart index 70ab9d0e..f43124ae 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_med_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_med_list.dart @@ -1,8 +1,7 @@ +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/medicine.dart'; import 'package:flutter/material.dart'; -import '../../../main.dart'; -import '../../../mih_objects/medicine.dart'; - class BuildMedicinesList extends StatefulWidget { final TextEditingController contoller; final List medicines; diff --git a/Frontend/lib/mih_packages/patient_profile/builder/build_notes_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_notes_list.dart similarity index 91% rename from Frontend/lib/mih_packages/patient_profile/builder/build_notes_list.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_notes_list.dart index c48f15bb..66f28cc3 100644 --- a/Frontend/lib/mih_packages/patient_profile/builder/build_notes_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/list_builders/build_notes_list.dart @@ -1,23 +1,22 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_delete_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/notes.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; import 'package:flutter/material.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../../main.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart'; -import '../../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../../mih_components/mih_layout/mih_window.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_delete_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../../mih_env/env.dart'; -import '../../../mih_objects/app_user.dart'; -import '../../../mih_objects/arguments.dart'; -import '../../../mih_objects/business.dart'; -import '../../../mih_objects/business_user.dart'; -import '../../../mih_objects/notes.dart'; -import '../../../mih_objects/patients.dart'; - class BuildNotesList extends StatefulWidget { final AppUser signedInUser; final List notes; diff --git a/Frontend/lib/mih_packages/patient_profile/patient_add.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_add.dart similarity index 92% rename from Frontend/lib/mih_packages/patient_profile/patient_add.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/patient_add.dart index 192cea3f..95d677c1 100644 --- a/Frontend/lib/mih_packages/patient_profile/patient_add.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_add.dart @@ -1,23 +1,22 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_action.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_header.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_layout_builder.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import '../../main.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/arguments.dart'; - class AddPatient extends StatefulWidget { final AppUser signedInUser; diff --git a/Frontend/lib/mih_packages/patient_profile/patient_edit.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_edit.dart similarity index 95% rename from Frontend/lib/mih_packages/patient_profile/patient_edit.dart rename to Frontend/lib/mih_packages/patient_profile/pat_profile/patient_edit.dart index f913721e..ea108318 100644 --- a/Frontend/lib/mih_packages/patient_profile/patient_edit.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_edit.dart @@ -1,25 +1,24 @@ import 'dart:convert'; +import 'package:Mzansi_Innovation_Hub/main.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_action.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_header.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_layout_builder.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import '../../main.dart'; import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/http.dart' as http; -import '../../mih_components/mih_inputs_and_buttons/mih_button.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_text_input.dart'; -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/patients.dart'; - class EditPatient extends StatefulWidget { final Patient selectedPatient; final AppUser signedInUser; diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_profile.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_profile.dart new file mode 100644 index 00000000..031b71c5 --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_profile.dart @@ -0,0 +1,111 @@ +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app_action.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app_tools.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/app_tools/patient_claim_or_statement.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart'; +import 'package:flutter/material.dart'; + +class PatientProfile extends StatefulWidget { + final PatientViewArguments arguments; + const PatientProfile({ + super.key, + required this.arguments, + }); + + @override + State createState() => _PatientProfileState(); +} + +class _PatientProfileState extends State { + int _selcetedIndex = 0; + @override + Widget build(BuildContext context) { + return MihApp( + appActionButton: getAction(), + appTools: getTools(), + appBody: getToolBody(), + selectedbodyIndex: _selcetedIndex, + onIndexChange: (newValue) { + setState(() { + _selcetedIndex = newValue; + }); + }, + ); + } + + MihAppAction getAction() { + return MihAppAction( + icon: const Icon(Icons.arrow_back), + iconSize: 35, + onTap: () { + Navigator.of(context).pop(); + }, + ); + } + + MihAppTools getTools() { + Map temp = {}; + temp[const Icon(Icons.perm_identity)] = () { + setState(() { + _selcetedIndex = 0; + }); + }; + temp[const Icon(Icons.article_outlined)] = () { + setState(() { + _selcetedIndex = 1; + }); + }; + temp[const Icon(Icons.file_present)] = () { + setState(() { + _selcetedIndex = 2; + }); + }; + temp[const Icon(Icons.file_open_outlined)] = () { + setState(() { + _selcetedIndex = 3; + }); + }; + return MihAppTools( + tools: temp, + selcetedIndex: _selcetedIndex, + ); + } + + List getToolBody() { + List toolBodies = [ + PatientInfo( + signedInUser: widget.arguments.signedInUser, + selectedPatient: widget.arguments.selectedPatient!, + type: widget.arguments.type, + ), + PatientConsultation( + patientAppId: widget.arguments.selectedPatient!.app_id, + selectedPatient: widget.arguments.selectedPatient!, + signedInUser: widget.arguments.signedInUser, + business: widget.arguments.business, + businessUser: widget.arguments.businessUser, + type: widget.arguments.type, + ), + PatientDocuments( + patientIndex: widget.arguments.selectedPatient!.idpatients, + selectedPatient: widget.arguments.selectedPatient!, + signedInUser: widget.arguments.signedInUser, + business: widget.arguments.business, + businessUser: widget.arguments.businessUser, + type: widget.arguments.type, + ), + PatientClaimOrStatement( + patientIndex: widget.arguments.selectedPatient!.idpatients, + selectedPatient: widget.arguments.selectedPatient!, + signedInUser: widget.arguments.signedInUser, + business: widget.arguments.business, + businessUser: widget.arguments.businessUser, + type: widget.arguments.type, + ), + ]; + return toolBodies; + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/patient_claims_statements.dart b/Frontend/lib/mih_packages/patient_profile/patient_claims_statements.dart deleted file mode 100644 index b168816e..00000000 --- a/Frontend/lib/mih_packages/patient_profile/patient_claims_statements.dart +++ /dev/null @@ -1,272 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:Mzansi_Innovation_Hub/mih_apis/mih_claim_statement_generation_api.dart'; -import 'package:Mzansi_Innovation_Hub/mih_objects/claim_statement_file.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/Claim_Statement_Window.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/builder/build_claim_statement_files_list.dart'; -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import '../../main.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -import '../../mih_components/mih_pop_up_messages/mih_error_message.dart'; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_components/mih_pop_up_messages/mih_success_message.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/app_user.dart'; -import '../../mih_objects/business.dart'; -import '../../mih_objects/business_user.dart'; -import '../../mih_objects/files.dart'; -import '../../mih_objects/patients.dart'; -// import 'builder/build_files_list.dart'; - -class PatientClaimsOrStatements extends StatefulWidget { - final int patientIndex; - final Patient selectedPatient; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final String type; - - const PatientClaimsOrStatements({ - super.key, - required this.patientIndex, - required this.selectedPatient, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.type, - }); - - @override - State createState() => - _PatientClaimsOrStatementsState(); -} - -class _PatientClaimsOrStatementsState extends State { - String endpointFiles = "${AppEnviroment.baseApiUrl}/files/patients/"; - String endpointUser = "${AppEnviroment.baseApiUrl}/users/profile/"; - String endpointGenFiles = - "${AppEnviroment.baseApiUrl}/files/generate/med-cert/"; - String endpointFileUpload = "${AppEnviroment.baseApiUrl}/files/upload/file/"; - String endpointInsertFiles = "${AppEnviroment.baseApiUrl}/files/insert/"; - - final startDateController = TextEditingController(); - final endDateTextController = TextEditingController(); - final retDateTextController = TextEditingController(); - final selectedFileController = TextEditingController(); - final medicineController = TextEditingController(); - final quantityController = TextEditingController(); - final dosageController = TextEditingController(); - final timesDailyController = TextEditingController(); - final noDaysController = TextEditingController(); - final noRepeatsController = TextEditingController(); - final outputController = TextEditingController(); - - late Future> futueFiles; - late String userEmail = ""; - late PlatformFile selected; - final baseAPI = AppEnviroment.baseApiUrl; - - Future> fetchFiles() async { - final response = await http.get(Uri.parse( - "${AppEnviroment.baseApiUrl}/files/patients/${widget.selectedPatient.app_id}")); - - //print(response.statusCode); - //print(response.body); - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List files = - List.from(l.map((model) => PFile.fromJson(model))); - return files; - } else { - internetConnectionPopUp(); - throw Exception('failed to load patients'); - } - } - - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void messagePopUp(error) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(error), - ); - }, - ); - } - - void claimOrStatementWindow() { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => ClaimStatementWindow( - selectedPatient: widget.selectedPatient, - signedInUser: widget.signedInUser, - business: widget.business, - businessUser: widget.businessUser, - ), - ); - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - bool isMedCertFieldsFilled() { - if (startDateController.text.isEmpty || - endDateTextController.text.isEmpty || - retDateTextController.text.isEmpty) { - return false; - } else { - return true; - } - } - - bool isFileFieldsFilled() { - if (selectedFileController.text.isEmpty) { - return false; - } else { - return true; - } - } - - List setIcons() { - if (widget.type == "personal") { - return [ - Text( - "Claims/ Statements", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - // IconButton( - // onPressed: () { - // uploudFilePopUp(); - // }, - // icon: Icon( - // Icons.add, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - // ) - ]; - } else { - return [ - Text( - "Claims/ Statements", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - IconButton( - onPressed: () { - // new window to input fields for claim/ statements - claimOrStatementWindow(); - }, - icon: Icon( - Icons.add, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ) - ]; - } - } - - @override - void dispose() { - startDateController.dispose(); - endDateTextController.dispose(); - retDateTextController.dispose(); - selectedFileController.dispose(); - medicineController.dispose(); - quantityController.dispose(); - dosageController.dispose(); - timesDailyController.dispose(); - noDaysController.dispose(); - noRepeatsController.dispose(); - outputController.dispose(); - super.dispose(); - } - - @override - void initState() { - if (widget.business == null) { - futueFiles = - MIHClaimStatementGenerationApi.getClaimStatementFilesByPatient( - widget.signedInUser.app_id); - } else { - futueFiles = - MIHClaimStatementGenerationApi.getClaimStatementFilesByBusiness( - widget.business!.business_id); - } - - //patientDetails = getPatientDetails() as Patient; - //getUserDetails(); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: futueFiles, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final filesList = snapshot.data!; - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - //const Placeholder(), - BuildClaimStatementFileList( - files: filesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ], - ); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/patient_manager.dart b/Frontend/lib/mih_packages/patient_profile/patient_manager.dart deleted file mode 100644 index 3ab8b7c9..00000000 --- a/Frontend/lib/mih_packages/patient_profile/patient_manager.dart +++ /dev/null @@ -1,734 +0,0 @@ -import 'dart:async'; -import 'package:flutter_swipe_detector/flutter_swipe_detector.dart'; -import 'package:intl/intl.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import '../../main.dart'; -import '../../mih_apis/mih_api_calls.dart'; -import '../../mih_components/mih_calendar.dart'; -import '../../mih_components/mih_inputs_and_buttons/mih_search_input.dart'; -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; -import '../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/patient_access.dart'; -import '../../mih_objects/patient_queue.dart'; -import '../../mih_objects/patients.dart'; -import 'builder/build_patient_access_list.dart'; -import 'builder/build_patient_list.dart'; -import 'builder/build_patient_queue_list.dart'; - -class PatientManager extends StatefulWidget { - //final AppUser signedInUser; - final BusinessArguments arguments; - const PatientManager({ - super.key, - required this.arguments, - }); - - @override - State createState() => _PatientManagerState(); -} - -// -class _PatientManagerState extends State { - TextEditingController searchController = TextEditingController(); - TextEditingController accessSearchController = TextEditingController(); - TextEditingController queueDateController = TextEditingController(); - - String baseUrl = AppEnviroment.baseApiUrl; - - final FocusNode _focusNode = FocusNode(); - - String searchString = ""; - String accessSearchString = ""; - var now = DateTime.now(); - var formatter = DateFormat('yyyy-MM-dd'); - late String formattedDate; - bool start = true; - int _selectedIndex = 0; - - late Future> patientSearchResults; - late Future> patientAccessResults; - late Future> patientQueueResults; - - //Waiting Room Widgets/ Functions - List filterQueueResults( - List queueList, String query) { - List templist = []; - //print(query); - for (var item in queueList) { - if (item.date_time.contains(query)) { - //print(item.medical_aid_no); - templist.add(item); - } - } - //print(templist); - return templist; - } - - Widget displayQueueList(List patientQueueList) { - if (patientQueueList.isNotEmpty) { - return Expanded( - child: BuildPatientQueueList( - patientQueue: patientQueueList, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - ), - ); - } - return Padding( - padding: const EdgeInsets.only(top: 35.0), - child: Center( - child: Text( - "No Appointments for $formattedDate", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)!.theme.messageTextColor()), - textAlign: TextAlign.center, - ), - ), - ); - } - - Widget patientQueue() { - return Container( - child: Stack( - children: [ - Column( - mainAxisSize: MainAxisSize.max, - children: [ - //const SizedBox(height: 15), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - "Waiting Room", - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - ), - IconButton( - iconSize: 20, - icon: const Icon( - Icons.refresh, - ), - onPressed: () { - refreshQueue(); - }, - ), - ], - ), - // Divider( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - MIHCalendar( - calendarWidth: 500, - rowHeight: 35, - setDate: (value) { - setState(() { - queueDateController.text = value; - }); - }), - //spacer - Row( - mainAxisSize: MainAxisSize.max, - children: [ - FutureBuilder( - future: patientQueueResults, - builder: (context, snapshot) { - //print("patient Queue List ${snapshot.hasData}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == - ConnectionState.done) { - List patientQueueList; - // if (searchString == "") { - // patientQueueList = []; - // } else { - patientQueueList = filterQueueResults( - snapshot.requireData, queueDateController.text); - // print(patientQueueList); - // } - - return displayQueueList(patientQueueList); - } else { - return Center( - child: Text( - "Error pulling Patients Data\n$baseUrl/patients/search/$searchString", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)! - .theme - .errorColor()), - textAlign: TextAlign.center, - ), - ); - } - }, - ), - ], - ), - ], - ), - Positioned( - right: 0, - bottom: 0, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50), - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - child: IconButton( - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPressed: () { - // addAppointmentWindow(); - }, - icon: const Icon( - Icons.add, - size: 50, - ), - ), - )) - ], - ), - ); - } - - void refreshQueue() { - setState(() { - start = true; - }); - checkforchange(); - } - - void refreshAccessList() { - setState(() { - patientAccessResults = MIHApiCalls.getPatientAccessListOfBusiness( - widget.arguments.business!.business_id); - }); - } - - void checkforchange() { - if (start == true) { - setState(() { - patientQueueResults = MIHApiCalls.fetchBusinessAppointmentsAPICall( - queueDateController.text, widget.arguments.business!.business_id); - start = false; - }); - } - if (formattedDate != queueDateController.text) { - setState(() { - patientQueueResults = MIHApiCalls.fetchBusinessAppointmentsAPICall( - queueDateController.text, widget.arguments.business!.business_id); - formattedDate = queueDateController.text; - }); - } - } - - //Patient Lookup Widgets/ Functions - - List filterSearchResults(List patList, String query) { - List templist = []; - //print(query); - for (var item in patList) { - if (item.id_no.contains(searchString) || - item.medical_aid_no.contains(searchString)) { - //print(item.medical_aid_no); - templist.add(item); - } - } - return templist; - } - - Widget displayPatientList(List patientsList, String searchString) { - if (patientsList.isNotEmpty) { - return BuildPatientsList( - patients: patientsList, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - arguments: widget.arguments, - ); - } else if (patientsList.isEmpty && searchString != "") { - return Padding( - padding: const EdgeInsets.only(top: 35.0), - child: Center( - child: Text( - "No ID or Medical Aid No. matches a Patient", - style: TextStyle( - fontSize: 25, - color: - MzanziInnovationHub.of(context)!.theme.messageTextColor()), - textAlign: TextAlign.center, - ), - ), - ); - } else { - return Padding( - padding: const EdgeInsets.only(top: 35.0), - child: Center( - child: Text( - "Enter ID or Medical Aid No. of Patient", - style: TextStyle( - fontSize: 25, - color: - MzanziInnovationHub.of(context)!.theme.messageTextColor()), - textAlign: TextAlign.center, - ), - ), - ); - } - } - - Widget patientSearch() { - return KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - submitPatientForm(); - } - }, - child: Column(mainAxisSize: MainAxisSize.max, children: [ - const Text( - "Patient Lookup", - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - ), - Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - //spacer - const SizedBox(height: 10), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible( - flex: 1, - child: MIHSearchField( - controller: searchController, - hintText: "ID or Medical Aid No. Search", - required: false, - editable: true, - onTap: () { - submitPatientForm(); - }, - ), - ), - IconButton( - onPressed: () { - setState(() { - searchController.clear(); - searchString = ""; - }); - submitPatientForm(); - }, - icon: const Icon( - Icons.filter_alt_off, - size: 25, - )) - ], - ), - //spacer - const SizedBox(height: 10), - FutureBuilder( - future: patientSearchResults, - builder: (context, snapshot) { - //print("patient Liust ${snapshot.data}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List patientsList; - if (searchString == "") { - patientsList = []; - } else { - patientsList = - filterSearchResults(snapshot.data!, searchString); - //print(patientsList); - } - return displayPatientList(patientsList, searchString); - } else { - return Center( - child: Text( - "Error pulling Patients Data\n$baseUrl/patients/search/$searchString", - style: TextStyle( - fontSize: 25, - color: - MzanziInnovationHub.of(context)!.theme.errorColor()), - textAlign: TextAlign.center, - ), - ); - } - }, - ), - ]), - ); - } - - void submitPatientForm() { - if (searchController.text != "") { - setState(() { - searchString = searchController.text; - patientSearchResults = MIHApiCalls.fetchPatients(searchString); - }); - } - // else { - // showDialog( - // context: context, - // builder: (context) { - // return const MIHErrorMessage(errorType: "Input Error"); - // }, - // ); - // } - } - - //Patient Access Widgets/ Functions - List filterAccessResults( - List patAccList, String query) { - List templist = []; - //print(query); - for (var item in patAccList) { - if (item.id_no.contains(query)) { - //print(item.medical_aid_no); - templist.add(item); - } - } - return templist; - } - - Widget displayPatientAccessList(List patientsAccessList) { - if (patientsAccessList.isNotEmpty) { - return BuildPatientAccessList( - patientAccesses: patientsAccessList, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - arguments: widget.arguments, - ); - } - return Padding( - padding: const EdgeInsets.only(top: 35.0), - child: Center( - child: Text( - "No Patients matching search", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)!.theme.messageTextColor()), - textAlign: TextAlign.center, - ), - ), - ); - } - - Widget patientAccessSearch() { - return KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - submitPatientAccessForm(); - } - }, - child: Column(mainAxisSize: MainAxisSize.max, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - "My Patient List", - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - ), - IconButton( - iconSize: 20, - icon: const Icon( - Icons.refresh, - ), - onPressed: () { - refreshAccessList(); - }, - ), - ], - ), - Divider(color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - //spacer - const SizedBox(height: 10), - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Flexible( - flex: 1, - child: MIHSearchField( - controller: accessSearchController, - hintText: "ID Search", - required: false, - editable: true, - onTap: () { - submitPatientAccessForm(); - }, - ), - ), - IconButton( - onPressed: () { - setState(() { - accessSearchController.clear(); - accessSearchString = ""; - }); - submitPatientAccessForm(); - }, - icon: const Icon( - Icons.filter_alt_off, - size: 25, - )) - ], - ), - //spacer - const SizedBox(height: 10), - FutureBuilder( - future: patientAccessResults, - builder: (context, snapshot) { - //print("patient Liust ${snapshot.data}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List patientsAccessList; - if (accessSearchString == "") { - patientsAccessList = snapshot.data!; - } else { - patientsAccessList = - filterAccessResults(snapshot.data!, accessSearchString); - //print(patientsList); - } - return displayPatientAccessList(patientsAccessList); - } else { - return Center( - child: Text( - "Error pulling Patient Access Data\n$baseUrl/access-requests/business/patient/${widget.arguments.business!.business_id}", - style: TextStyle( - fontSize: 25, - color: - MzanziInnovationHub.of(context)!.theme.errorColor()), - textAlign: TextAlign.center, - ), - ); - } - }, - ), - ]), - ); - } - - void submitPatientAccessForm() { - // if (searchController.text != "") { - setState(() { - accessSearchString = accessSearchController.text; - patientAccessResults = MIHApiCalls.getPatientAccessListOfBusiness( - widget.arguments.business!.business_id); - }); - // } else { - // showDialog( - // context: context, - // builder: (context) { - // return const MIHErrorMessage(errorType: "Input Error"); - // }, - // ); - // } - } - - //Layout Widgets/ Functions - - Widget showSelection(int index) { - if (index == 0) { - return SizedBox( - //width: 660, - child: patientQueue(), - ); - } else if (index == 1) { - return SizedBox( - //width: 660, - child: patientAccessSearch(), - ); - } else { - return SizedBox( - //width: 660, - child: patientSearch(), - ); - } - } - - MIHAction getActionButton() { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - Navigator.of(context).pop(); - - Navigator.of(context).popAndPushNamed( - '/', - arguments: AuthArguments(false, false), - ); - }, - ); - } - - MIHHeader getHeader() { - return MIHHeader( - headerAlignment: MainAxisAlignment.end, - headerItems: [ - //============ Waiting Room ================ - Visibility( - visible: _selectedIndex != 0, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.people, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 0, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.people, - size: 35, - ), - ), - ), - //============ My Patient List ================ - Visibility( - visible: _selectedIndex != 1, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 1; - }); - }, - icon: const Icon( - Icons.check_box_outlined, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 1, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 1; - }); - }, - icon: const Icon( - Icons.check_box_outlined, - size: 35, - ), - ), - ), - //============ Patient Lookup ================ - Visibility( - visible: _selectedIndex != 2, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 2; - }); - }, - icon: const Icon( - Icons.search, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 2, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 2; - }); - }, - icon: const Icon( - Icons.search, - size: 35, - ), - ), - ), - ], - ); - } - - MIHBody getBody() { - return MIHBody( - borderOn: true, - bodyItems: [ - showSelection(_selectedIndex), - ], - ); - } - - @override - void dispose() { - searchController.dispose(); - accessSearchController.dispose(); - queueDateController.dispose(); - _focusNode.dispose(); - super.dispose(); - } - - @override - void initState() { - patientSearchResults = MIHApiCalls.fetchPatients("abc"); - patientAccessResults = MIHApiCalls.getPatientAccessListOfBusiness( - widget.arguments.business!.business_id); - queueDateController.addListener(checkforchange); - setState(() { - formattedDate = formatter.format(now); - queueDateController.text = formattedDate; - }); - - super.initState(); - } - - @override - Widget build(BuildContext context) { - return SwipeDetector( - onSwipeLeft: (offset) { - if (_selectedIndex < 2) { - setState(() { - _selectedIndex += 1; - }); - } - //print("swipe left"); - }, - onSwipeRight: (offset) { - if (_selectedIndex > 0) { - setState(() { - _selectedIndex -= 1; - }); - } - //print("swipe right"); - }, - child: MIHLayoutBuilder( - actionButton: getActionButton(), - header: getHeader(), - secondaryActionButton: null, - body: getBody(), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, - ), - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_profile/patient_view.dart b/Frontend/lib/mih_packages/patient_profile/patient_view.dart deleted file mode 100644 index 8b4f7ffe..00000000 --- a/Frontend/lib/mih_packages/patient_profile/patient_view.dart +++ /dev/null @@ -1,318 +0,0 @@ -import 'dart:convert'; - -import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/patient_claims_statements.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_swipe_detector/flutter_swipe_detector.dart'; -import '../../main.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; -import '../../mih_env/env.dart'; -import '../../mih_objects/arguments.dart'; -import '../../mih_objects/patients.dart'; -import 'patient_details.dart'; -import 'patient_files.dart'; -import 'patient_notes.dart'; - -class PatientView extends StatefulWidget { - //final AppUser signedInUser; - final PatientViewArguments arguments; - const PatientView({ - super.key, - required this.arguments, - }); - - @override - State createState() => _PatientViewState(); -} - -class _PatientViewState extends State { - int _selectedIndex = 0; - late double popUpWidth; - late double? popUpheight; - late double popUpTitleSize; - late double popUpSubtitleSize; - late double popUpBodySize; - late double popUpIconSize; - late double popUpPaddingSize; - late double width; - late double height; - - Future fetchPatient() async { - //print("Patien manager page: $endpoint"); - var patientAppId = widget.arguments.selectedPatient!.app_id; - - final response = await http - .get(Uri.parse("${AppEnviroment.baseApiUrl}/patients/$patientAppId")); - // print("Here"); - // print("Body: ${response.body}"); - // print("Code: ${response.statusCode}"); - // var errorCode = response.statusCode.toString(); - // var errorBody = response.body; - - if (response.statusCode == 200) { - //print("Here1"); - var decodedData = jsonDecode(response.body); - // print("Here2"); - Patient patients = Patient.fromJson(decodedData as Map); - // print("Here3"); - // print(patients); - return patients; - } - return null; - } - - void checkScreenSize() { - if (MzanziInnovationHub.of(context)!.theme.screenType == "desktop") { - setState(() { - popUpWidth = (width / 4) * 2; - popUpheight = null; - }); - } else { - setState(() { - popUpWidth = width - (width * 0.1); - popUpheight = null; - }); - } - } - - Widget showSelection(int index) { - if (index == 0) { - return PatientDetails( - signedInUser: widget.arguments.signedInUser, - selectedPatient: widget.arguments.selectedPatient!, - type: widget.arguments.type, - ); - } else if (index == 1) { - return PatientNotes( - patientAppId: widget.arguments.selectedPatient!.app_id, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ); - } else if (index == 2) { - return PatientFiles( - patientIndex: widget.arguments.selectedPatient!.idpatients, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ); - } else { - return PatientClaimsOrStatements( - patientIndex: widget.arguments.selectedPatient!.idpatients, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ); - } - } - - MIHAction getActionButton() { - if (widget.arguments.type == "Personal") { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - Navigator.of(context).pop(); - Navigator.of(context).popAndPushNamed( - '/', - arguments: AuthArguments(true, false), - ); - }, - ); - } else { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - Navigator.of(context).pop(); - }, - ); - } - } - - MIHHeader getHeader() { - return MIHHeader( - headerAlignment: MainAxisAlignment.end, - headerItems: [ - //============ Patient Details ================ - Visibility( - visible: _selectedIndex != 0, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.perm_identity, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 0, - child: IconButton.filled( - iconSize: 35, - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.perm_identity, - ), - ), - ), - //============ Patient Notes ================ - Visibility( - visible: _selectedIndex != 1, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 1; - }); - }, - icon: const Icon( - Icons.article_outlined, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 1, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 1; - }); - }, - icon: const Icon( - Icons.article_outlined, - size: 35, - ), - ), - ), - //============ Patient Files ================ - Visibility( - visible: _selectedIndex != 2, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 2; - }); - }, - icon: const Icon( - Icons.file_present, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 2, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 2; - }); - }, - icon: const Icon( - Icons.file_present, - size: 35, - ), - ), - ), - //============ Claims/ Statements ================ - Visibility( - visible: _selectedIndex != 3, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 3; - }); - }, - icon: const Icon( - Icons.file_open_outlined, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 3, - child: IconButton.filled( - onPressed: () { - setState(() { - _selectedIndex = 3; - }); - }, - icon: const Icon( - Icons.file_open_outlined, - size: 35, - ), - ), - ), - ], - ); - } - - MIHBody getBody() { - return MIHBody( - borderOn: true, - bodyItems: [showSelection(_selectedIndex)], - ); - } - - @override - void dispose() { - // TODO: implement dispose - super.dispose(); - } - - @override - Widget build(BuildContext context) { - var size = MediaQuery.of(context).size; - setState(() { - width = size.width; - height = size.height; - }); - checkScreenSize(); - return SwipeDetector( - onSwipeLeft: (offset) { - if (_selectedIndex < 3) { - setState(() { - _selectedIndex += 1; - }); - } - //print("swipe left"); - }, - onSwipeRight: (offset) { - if (_selectedIndex > 0) { - setState(() { - _selectedIndex -= 1; - }); - } - //print("swipe right"); - }, - child: MIHLayoutBuilder( - actionButton: getActionButton(), - header: getHeader(), - secondaryActionButton: null, - body: getBody(), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, - ), - ); - } -} diff --git a/Frontend/lib/mih_router/routeGenerator.dart b/Frontend/lib/mih_router/routeGenerator.dart index 1607893a..ef3908dd 100644 --- a/Frontend/lib/mih_router/routeGenerator.dart +++ b/Frontend/lib/mih_router/routeGenerator.dart @@ -11,19 +11,19 @@ import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_profile/personal_profi import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/components/mih_barcode_scanner.dart'; import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/mih_wallet.dart'; import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_manager/pat_manager.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/add_or_view_patient.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/patient_add.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/patient_edit.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/patient_profile.dart'; import 'package:flutter/material.dart'; import '../mih_components/mih_layout/mih_print_prevew.dart'; import '../mih_components/mih_pop_up_messages/mih_notification_message.dart'; import '../mih_packages/authentication/auth_check.dart'; -import '../mih_packages/patient_profile/add_or_view_patient.dart'; -import '../mih_packages/patient_profile/patient_add.dart'; -import '../mih_packages/patient_profile/patient_edit.dart'; import '../mih_objects/app_user.dart'; import '../mih_objects/arguments.dart'; import '../mih_packages/authentication/forgot_password.dart'; import '../mih_packages/authentication/reset_password.dart'; -import '../mih_packages/patient_profile/full_screen_file.dart'; -import '../mih_packages/patient_profile/patient_view.dart'; +import '../mih_packages/patient_profile/pat_profile/components/full_screen_file.dart'; import '../mih_packages/manage_business/profile_business_add.dart'; class RouteGenerator { @@ -270,7 +270,7 @@ class RouteGenerator { if (args is PatientViewArguments) { return MaterialPageRoute( settings: settings, - builder: (_) => PatientView( + builder: (_) => PatientProfile( arguments: args, ), );