From 39a42048c2c5942dc804af95bf145dcbb2865f6e Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 29 Oct 2025 15:43:05 +0200 Subject: [PATCH] NEW: Patient Manager Provider Setup pt3 --- .../patient_manager_provider.dart | 7 + Frontend/lib/mih_config/mih_go_router.dart | 18 +- .../build_my_patient_list_list.dart | 182 +++++++++--------- .../package_tiles/pat_manager_tile.dart | 1 - .../package_tools/my_patient_list.dart | 98 +++------- .../package_tools/waiting_room.dart | 81 ++++---- .../pat_manager/pat_manager.dart | 108 ++++++----- .../package_tiles/patient_profile_tile.dart | 5 + .../pat_profile/patient_profile.dart | 11 +- ...h_claim_statement_generation_services.dart | 1 - .../mih_mzansi_calendar_services.dart | 5 +- .../mih_services/mih_patient_services.dart | 18 ++ .../lib/mih_services/mih_service_calls.dart | 23 --- 13 files changed, 263 insertions(+), 295 deletions(-) diff --git a/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart b/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart index 308fbe3c..160faaf8 100644 --- a/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/claim_statement_file.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/patient_access.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; class PatientManagerProvider extends ChangeNotifier { @@ -9,6 +10,7 @@ class PatientManagerProvider extends ChangeNotifier { int patientManagerIndex; int fileViewerIndex; bool personalMode; + List? myPaitentList; Patient? selectedPatient; List? consultationNotes; List? patientDocuments; @@ -53,6 +55,11 @@ class PatientManagerProvider extends ChangeNotifier { notifyListeners(); } + void setMyPatientList({required List? myPaitentList}) { + this.myPaitentList = myPaitentList ?? []; + notifyListeners(); + } + void setConsultationNotes({required List? consultationNotes}) { this.consultationNotes = consultationNotes ?? []; notifyListeners(); diff --git a/Frontend/lib/mih_config/mih_go_router.dart b/Frontend/lib/mih_config/mih_go_router.dart index e0963b7c..71de50cc 100644 --- a/Frontend/lib/mih_config/mih_go_router.dart +++ b/Frontend/lib/mih_config/mih_go_router.dart @@ -320,6 +320,7 @@ class MihGoRouter { name: "mihAccess", path: MihGoRouterPaths.mihAccess, builder: (BuildContext context, GoRouterState state) { + KenLogger.success("MihGoRouter: mihAccess"); if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); @@ -336,20 +337,21 @@ class MihGoRouter { name: "patientProfile", path: MihGoRouterPaths.patientProfile, builder: (BuildContext context, GoRouterState state) { - final String? argPatientAppId = state.extra as String?; + KenLogger.success("MihGoRouter: patientProfile"); if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return PatientProfile(patientAppId: argPatientAppId); + return PatientProfile(); }, ), GoRoute( name: "patientProfileSetup", path: MihGoRouterPaths.patientProfileSetup, builder: (BuildContext context, GoRouterState state) { + KenLogger.success("MihGoRouter: patientProfileSetup"); if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); @@ -363,8 +365,8 @@ class MihGoRouter { name: "patientManager", path: MihGoRouterPaths.patientManager, builder: (BuildContext context, GoRouterState state) { - final PatManagerArguments? args = state.extra as PatManagerArguments?; - if (args == null) { + KenLogger.success("MihGoRouter: patientManager"); + if (context.watch().business == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); @@ -372,7 +374,6 @@ class MihGoRouter { } return PatManager( key: UniqueKey(), - arguments: args, ); }, ), @@ -380,14 +381,14 @@ class MihGoRouter { name: "patientManagerPatient", path: MihGoRouterPaths.patientManagerPatient, builder: (BuildContext context, GoRouterState state) { - final String? argPatientAppId = state.extra as String?; + KenLogger.success("MihGoRouter: patientManagerPatient"); if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return PatientProfile(patientAppId: argPatientAppId); + return PatientProfile(); }, ), // ========================== Mzansi Directory ================================== @@ -395,6 +396,7 @@ class MihGoRouter { name: "mzansiDirectory", path: MihGoRouterPaths.mzansiDirectory, builder: (BuildContext context, GoRouterState state) { + KenLogger.success("MihGoRouter: mzansiDirectory"); if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); @@ -409,6 +411,7 @@ class MihGoRouter { name: "fileViewer", path: MihGoRouterPaths.fileViewer, builder: (BuildContext context, GoRouterState state) { + KenLogger.success("MihGoRouter: fileViewer"); final FileViewArguments? args = state.extra as FileViewArguments?; return FullScreenFileViewer(arguments: args!); }, @@ -417,6 +420,7 @@ class MihGoRouter { name: "printPreview", path: MihGoRouterPaths.printPreview, builder: (BuildContext context, GoRouterState state) { + KenLogger.success("MihGoRouter: printPreview"); final PrintPreviewArguments? args = state.extra as PrintPreviewArguments?; return MIHPrintPreview(arguments: args!); diff --git a/Frontend/lib/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart b/Frontend/lib/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart index d7e6059a..c588abf5 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart @@ -1,9 +1,11 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_service_calls.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_calendar_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; @@ -15,26 +17,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ 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_warning_message.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patient_access.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class BuildMyPatientListList extends StatefulWidget { - final List patientAccesses; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - const BuildMyPatientListList({ super.key, - required this.patientAccesses, - required this.signedInUser, - required this.business, - required this.businessUser, }); @override @@ -51,24 +39,21 @@ class _BuildPatientsListState extends State { final baseAPI = AppEnviroment.baseApiUrl; - Future submitApointment(int index) async { + Future submitApointment(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, int index) async { //To-Do: Add the appointment to the database // print("To-Do: Add the appointment to the database"); String description = "Date: ${dateController.text}\nTime: ${timeController.text}\n"; - description += "Medical Practice: ${widget.business!.Name}\n"; - description += "Contact Number: ${widget.business!.contact_no}"; + description += "Medical Practice: ${profileProvider.business!.Name}\n"; + description += "Contact Number: ${profileProvider.business!.contact_no}"; int statusCode; statusCode = await MihMzansiCalendarApis.addPatientAppointment( - widget.signedInUser, + profileProvider.user!, false, - widget.patientAccesses[index].app_id, - BusinessArguments( - widget.signedInUser, - widget.businessUser, - widget.business, - ), - "${widget.patientAccesses[index].fname} ${widget.patientAccesses[index].lname} - Doctors Visit", + patientManagerProvider.myPaitentList![index].app_id, + profileProvider.business!.business_id, + "${patientManagerProvider.myPaitentList![index].fname} ${patientManagerProvider.myPaitentList![index].lname} - Doctors Visit", description, dateController.text, timeController.text, @@ -164,11 +149,16 @@ class _BuildPatientsListState extends State { } } - void appointmentPopUp(int index, double width) { - var firstLetterFName = widget.patientAccesses[index].fname; - var firstLetterLName = widget.patientAccesses[index].lname; + void appointmentPopUp( + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + int index, + double width, + ) { + var firstLetterFName = patientManagerProvider.myPaitentList![index].fname; + var firstLetterLName = patientManagerProvider.myPaitentList![index].lname; setState(() { - idController.text = widget.patientAccesses[index].id_no; + idController.text = patientManagerProvider.myPaitentList![index].id_no; fnameController.text = firstLetterFName; lnameController.text = firstLetterLName; }); @@ -260,7 +250,8 @@ class _BuildPatientsListState extends State { if (_formKey.currentState!.validate()) { bool filled = isAppointmentFieldsFilled(); if (filled) { - submitApointment(index); + submitApointment( + profileProvider, patientManagerProvider, index); } else { showDialog( context: context, @@ -299,8 +290,9 @@ class _BuildPatientsListState extends State { ); } - void noAccessWarning(int index) { - if (widget.patientAccesses[index].status == "pending") { + void noAccessWarning( + PatientManagerProvider patientManagerProvider, int index) { + if (patientManagerProvider.myPaitentList![index].status == "pending") { showDialog( context: context, builder: (context) { @@ -317,10 +309,11 @@ class _BuildPatientsListState extends State { } } - bool hasAccessToProfile(int index) { + bool hasAccessToProfile( + PatientManagerProvider patientManagerProvider, int index) { var hasAccess = false; - if (widget.patientAccesses[index].status == "approved") { + if (patientManagerProvider.myPaitentList![index].status == "approved") { hasAccess = true; } else { hasAccess = false; @@ -329,11 +322,15 @@ class _BuildPatientsListState extends State { } void patientProfileChoicePopUp( - int index, Patient? patientProfile, double width) async { - var firstLetterFName = widget.patientAccesses[index].fname; - var firstLetterLName = widget.patientAccesses[index].lname; + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + int index, + double width, + ) async { + var firstLetterFName = patientManagerProvider.myPaitentList![index].fname; + var firstLetterLName = patientManagerProvider.myPaitentList![index].lname; setState(() { - idController.text = widget.patientAccesses[index].id_no; + idController.text = patientManagerProvider.myPaitentList![index].id_no; fnameController.text = firstLetterFName; lnameController.text = firstLetterLName; }); @@ -405,7 +402,8 @@ class _BuildPatientsListState extends State { children: [ MihButton( onPressed: () { - appointmentPopUp(index, width); + appointmentPopUp(profileProvider, + patientManagerProvider, index, width); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == @@ -423,25 +421,14 @@ class _BuildPatientsListState extends State { ), ), MihButton( - onPressed: () { + onPressed: () async { + await MihPatientServices().getPatientDetails( + patientManagerProvider.myPaitentList![index].app_id, + patientManagerProvider); context.pop(); - context.pushNamed('patientManagerPatient', - extra: PatientViewArguments( - widget.signedInUser, - patientProfile, - widget.businessUser, - widget.business, - "business", - )); - // Navigator.of(context) - // .pushNamed('/patient-manager/patient', - // arguments: PatientViewArguments( - // widget.signedInUser, - // patientProfile, - // widget.businessUser, - // widget.business, - // "business", - // )); + context.pushNamed( + 'patientManagerPatient', + ); }, buttonColor: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == @@ -468,33 +455,43 @@ class _BuildPatientsListState extends State { ); } - Widget displayMyPatientTile(int index, double width) { + Widget displayMyPatientTile( + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + int index, + double width, + ) { var firstName = ""; var lastName = ""; - String access = widget.patientAccesses[index].status.toUpperCase(); + String access = + patientManagerProvider.myPaitentList![index].status.toUpperCase(); TextSpan accessWithColour; var hasAccess = false; - hasAccess = hasAccessToProfile(index); + hasAccess = hasAccessToProfile(patientManagerProvider, index); //print(hasAccess); if (access == "APPROVED") { - firstName = widget.patientAccesses[index].fname; - lastName = widget.patientAccesses[index].lname; + firstName = patientManagerProvider.myPaitentList![index].fname; + lastName = patientManagerProvider.myPaitentList![index].lname; accessWithColour = TextSpan( text: "$access\n", style: TextStyle( color: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"))); } else if (access == "PENDING") { - firstName = "${widget.patientAccesses[index].fname[0]}********"; - lastName = "${widget.patientAccesses[index].lname[0]}********"; + firstName = + "${patientManagerProvider.myPaitentList![index].fname[0]}********"; + lastName = + "${patientManagerProvider.myPaitentList![index].lname[0]}********"; accessWithColour = TextSpan( text: "$access\n", style: TextStyle( color: MihColors.getGreyColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"))); } else { - firstName = "${widget.patientAccesses[index].fname[0]}********"; - lastName = "${widget.patientAccesses[index].lname[0]}********"; + firstName = + "${patientManagerProvider.myPaitentList![index].fname[0]}********"; + lastName = + "${patientManagerProvider.myPaitentList![index].lname[0]}********"; accessWithColour = TextSpan( text: "$access\n", style: TextStyle( @@ -512,7 +509,8 @@ class _BuildPatientsListState extends State { ), subtitle: RichText( text: TextSpan( - text: "ID No.: ${widget.patientAccesses[index].id_no}\n", + text: + "ID No.: ${patientManagerProvider.myPaitentList![index].id_no}\n", style: DefaultTextStyle.of(context).style, children: [ const TextSpan(text: "Access: "), @@ -520,18 +518,16 @@ class _BuildPatientsListState extends State { ]), ), onTap: () async { - Patient? p; if (hasAccess) { - await MIHApiCalls.fetchPatientByAppId( - widget.patientAccesses[index].app_id) - .then((result) { - setState(() { - p = result; - }); - }); - patientProfileChoicePopUp(index, p, width); + await MihPatientServices() + .getPatientDetails( + patientManagerProvider.myPaitentList![index].app_id, + patientManagerProvider) + .then((result) {}); + patientProfileChoicePopUp( + profileProvider, patientManagerProvider, index, width); } else { - noAccessWarning(index); + noAccessWarning(patientManagerProvider, index); } }, trailing: Icon( @@ -555,19 +551,25 @@ class _BuildPatientsListState extends State { @override Widget build(BuildContext context) { double screenWidth = MediaQuery.of(context).size.width; - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (BuildContext context, index) { - return Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, index) { + return Divider( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ); + }, + itemCount: patientManagerProvider.myPaitentList!.length, + itemBuilder: (context, index) { + return displayMyPatientTile( + profileProvider, patientManagerProvider, index, screenWidth); + }, ); }, - itemCount: widget.patientAccesses.length, - itemBuilder: (context, index) { - return displayMyPatientTile(index, screenWidth); - }, ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tiles/pat_manager_tile.dart b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tiles/pat_manager_tile.dart index 0d95b243..438f411d 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tiles/pat_manager_tile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tiles/pat_manager_tile.dart @@ -27,7 +27,6 @@ class _PatManagerTileState extends State { onTap: () { context.goNamed( 'patientManager', - extra: widget.arguments, ); // Navigator.of(context).pushNamed( // '/patient-manager', diff --git a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart index d87f56a8..f2b426ee 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart @@ -1,31 +1,21 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_service_calls.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/patient_access.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class MyPatientList extends StatefulWidget { - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final bool personalSelected; - const MyPatientList({ super.key, - required this.signedInUser, - this.business, - this.businessUser, - this.personalSelected = false, }); @override @@ -33,7 +23,6 @@ class MyPatientList extends StatefulWidget { } class _MyPatientListState extends State { - late Future> _myPatientList; TextEditingController _myPatientSearchController = TextEditingController(); final FocusNode _searchFocusNode = FocusNode(); bool hasSearchedBefore = false; @@ -42,7 +31,8 @@ class _MyPatientListState extends State { final FocusNode _focusNode = FocusNode(); - Widget myPatientListTool(double width) { + Widget myPatientListTool(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, double width) { return MihSingleChildScroll( child: Column(mainAxisSize: MainAxisSize.max, children: [ Padding( @@ -56,10 +46,11 @@ class _MyPatientListState extends State { hintColor: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onPrefixIconTap: () { - setState(() { + setState(() async { _myPatientIdSearchString = _myPatientSearchController.text; - _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( - widget.business!.business_id); + await MihPatientServices().getPatientAccessListOfBusiness( + patientManagerProvider, + profileProvider.business!.business_id); }); }, onClearIconTap: () { @@ -67,57 +58,21 @@ class _MyPatientListState extends State { _myPatientSearchController.clear(); _myPatientIdSearchString = ""; }); - getMyPatientList(); + getMyPatientList(profileProvider, patientManagerProvider); }, searchFocusNode: _searchFocusNode, ), ), //spacer const SizedBox(height: 10), - FutureBuilder( - future: _myPatientList, - 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 (_myPatientIdSearchString == "") { - patientsAccessList = snapshot.data!; - } else { - patientsAccessList = filterAccessResults( - snapshot.data!, _myPatientIdSearchString); - //print(patientsList); - } - return displayMyPatientList(patientsAccessList); - } else { - return Center( - child: Text( - "Error pulling Patient Access Data\n$baseUrl/access-requests/business/patient/${widget.business!.business_id}", - style: TextStyle( - fontSize: 25, - color: MihColors.getRedColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark")), - textAlign: TextAlign.center, - ), - ); - } - }, - ), + displayMyPatientList(patientManagerProvider), ]), ); } - Widget displayMyPatientList(List patientsAccessList) { - if (patientsAccessList.isNotEmpty) { - return BuildMyPatientListList( - patientAccesses: patientsAccessList, - signedInUser: widget.signedInUser, - business: widget.business, - businessUser: widget.businessUser, - ); + Widget displayMyPatientList(PatientManagerProvider patientManagerProvider) { + if (patientManagerProvider.myPaitentList!.isNotEmpty) { + return BuildMyPatientListList(); } if (hasSearchedBefore && _myPatientIdSearchString.isNotEmpty) { return Column( @@ -228,10 +183,11 @@ class _MyPatientListState extends State { return templist; } - void getMyPatientList() { + Future getMyPatientList(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider) async { + await MihPatientServices().getPatientAccessListOfBusiness( + patientManagerProvider, profileProvider.business!.business_id); setState(() { - _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( - widget.business!.business_id); hasSearchedBefore = true; }); } @@ -239,8 +195,6 @@ class _MyPatientListState extends State { @override void initState() { super.initState(); - _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( - widget.business!.business_id); } @override @@ -256,10 +210,16 @@ class _MyPatientListState extends State { Widget build(BuildContext context) { final Size size = MediaQuery.sizeOf(context); final double width = size.width; - return MihPackageToolBody( - borderOn: false, - innerHorizontalPadding: 10, - bodyItem: myPatientListTool(width), + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + return MihPackageToolBody( + borderOn: false, + innerHorizontalPadding: 10, + bodyItem: + myPatientListTool(profileProvider, patientManagerProvider, width), + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart index 89e737ef..3c407aac 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart @@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_calendar_services.dart'; @@ -22,27 +23,14 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ 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_config/mih_env.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/appointment.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_packages/calendar/builder/build_appointment_list.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class WaitingRoom extends StatefulWidget { - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final bool personalSelected; - final Function(int) onIndexChange; const WaitingRoom({ super.key, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.personalSelected, - required this.onIndexChange, }); @override @@ -71,8 +59,12 @@ class _WaitingRoomState extends State { // Business Appointment Tool Widget getBusinessAppointmentsTool(double width) { - return Consumer( - builder: (BuildContext context, MihCalendarProvider mihCalendarProvider, + return Consumer3( + builder: (BuildContext context, + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + MihCalendarProvider mihCalendarProvider, Widget? child) { if (isLoading) { return const Center( @@ -132,7 +124,8 @@ class _WaitingRoomState extends State { MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { // addAppointmentWindow(); - appointmentTypeSelection(mihCalendarProvider, width); + appointmentTypeSelection(profileProvider, + patientManagerProvider, mihCalendarProvider, width); }, ) ], @@ -237,7 +230,10 @@ class _WaitingRoomState extends State { } void appointmentTypeSelection( - MihCalendarProvider mihCalendarProvider, double width) { + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + MihCalendarProvider mihCalendarProvider, + double width) { String question = "What type of appointment would you like to add?"; question += "\n\nExisting Patient: Add an appointment for an patient your practice has access to."; @@ -268,7 +264,7 @@ class _WaitingRoomState extends State { const SizedBox(height: 15), MihButton( onPressed: () { - widget.onIndexChange(1); + patientManagerProvider.setPatientManagerIndex(1); context.pop(); }, buttonColor: MihColors.getGreenColor( @@ -287,7 +283,7 @@ class _WaitingRoomState extends State { const SizedBox(height: 10), MihButton( onPressed: () { - widget.onIndexChange(2); + patientManagerProvider.setPatientManagerIndex(2); context.pop(); }, buttonColor: MihColors.getGreenColor( @@ -307,7 +303,8 @@ class _WaitingRoomState extends State { MihButton( onPressed: () { Navigator.pop(context); - addAppointmentWindow(mihCalendarProvider, width); + addAppointmentWindow( + profileProvider, mihCalendarProvider, width); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), @@ -329,7 +326,7 @@ class _WaitingRoomState extends State { ); } - void addAppointmentWindow( + void addAppointmentWindow(MzansiProfileProvider profileProvider, MihCalendarProvider mihCalendarProvider, double width) { showDialog( context: context, @@ -411,7 +408,8 @@ class _WaitingRoomState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - addAppointmentCall(mihCalendarProvider); + addAppointmentCall( + profileProvider, mihCalendarProvider); } else { MihAlertServices().formNotFilledCompletely(context); } @@ -442,34 +440,23 @@ class _WaitingRoomState extends State { ); } - Future addAppointmentCall( + Future addAppointmentCall(MzansiProfileProvider profileProvider, MihCalendarProvider mihCalendarProvider) async { if (isAppointmentInputValid()) { int statusCode; - if (widget.personalSelected == false) { - statusCode = await MihMzansiCalendarApis.addBusinessAppointment( - widget.signedInUser, - widget.business!, - widget.businessUser!, - true, - _appointmentTitleController.text, - _appointmentDescriptionIDController.text, - _appointmentDateController.text, - _appointmentTimeController.text, - mihCalendarProvider, - context, - ); - } else { - statusCode = await MihMzansiCalendarApis.addPersonalAppointment( - widget.signedInUser, - _appointmentTitleController.text, - _appointmentDescriptionIDController.text, - _appointmentDateController.text, - _appointmentTimeController.text, - mihCalendarProvider, - context, - ); - } + statusCode = await MihMzansiCalendarApis.addBusinessAppointment( + profileProvider.user!, + profileProvider.business!, + profileProvider.businessUser!, + true, + _appointmentTitleController.text, + _appointmentDescriptionIDController.text, + _appointmentDateController.text, + _appointmentTimeController.text, + mihCalendarProvider, + context, + ); + if (statusCode == 201) { context.pop(); successPopUp("Successfully Added Appointment", diff --git a/Frontend/lib/mih_packages/patient_manager/pat_manager/pat_manager.dart b/Frontend/lib/mih_packages/patient_manager/pat_manager/pat_manager.dart index dca4e520..2c0fe380 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_manager/pat_manager.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_manager/pat_manager.dart @@ -2,17 +2,19 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tools/mih_patient_search.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_calendar_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; +import 'package:provider/provider.dart'; class PatManager extends StatefulWidget { - final PatManagerArguments arguments; const PatManager({ super.key, - required this.arguments, }); @override @@ -20,11 +22,39 @@ class PatManager extends StatefulWidget { } class _PatManagerState extends State { - int _selcetedIndex = 0; + bool isLoading = true; - void updateIndex(int index) { + Future initialisePatientData() async { setState(() { - _selcetedIndex = index; + isLoading = true; + }); + MzansiProfileProvider profileProvider = + context.read(); + PatientManagerProvider patientManagerProvider = + context.read(); + MihCalendarProvider mihCalendarProvider = + context.read(); + patientManagerProvider.setPersonalMode(false); + if (profileProvider.business != null) { + await MihMzansiCalendarApis.getBusinessAppointments( + profileProvider.business!.business_id, + false, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + MihPatientServices().getPatientAccessListOfBusiness( + patientManagerProvider, profileProvider.business!.business_id); + } + setState(() { + isLoading = false; + }); + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + initialisePatientData(); }); } @@ -35,24 +65,30 @@ class _PatManagerState extends State { appTools: getTools(), appBody: getToolBody(), appToolTitles: getToolTitle(), - selectedbodyIndex: _selcetedIndex, + selectedbodyIndex: + context.watch().patientManagerIndex, onIndexChange: (newValue) { - setState(() { - _selcetedIndex = newValue; - }); + context.read().setPatientManagerIndex(newValue); }, ); } MihPackageAction getActionButton() { + PatientManagerProvider patientManagerProvider = + context.read(); return MihPackageAction( icon: const Icon(Icons.arrow_back), iconSize: 35, onTap: () { - // Navigator.of(context).pop(); - context.goNamed( - 'mihHome', - ); + patientManagerProvider.setPatientProfileIndex(0); + patientManagerProvider.setPatientManagerIndex(0); + if (!patientManagerProvider.personalMode) { + context.pop(); + } else { + context.goNamed( + 'mihHome', + ); + } FocusScope.of(context).unfocus(); }, ); @@ -61,55 +97,33 @@ class _PatManagerState extends State { MihPackageTools getTools() { Map temp = {}; temp[const Icon(Icons.calendar_month)] = () { - setState(() { - _selcetedIndex = 0; - }); + context.read().setPatientManagerIndex(0); }; - temp[const Icon(Icons.check_box_outlined)] = () { - setState(() { - _selcetedIndex = 1; - }); + context.read().setPatientManagerIndex(1); }; temp[const Icon(Icons.search)] = () { - setState(() { - _selcetedIndex = 2; - }); + context.read().setPatientManagerIndex(2); }; return MihPackageTools( tools: temp, - selcetedIndex: _selcetedIndex, + selcetedIndex: + context.watch().patientManagerIndex, ); } List getToolBody() { List toolBodies = [ - //appointment here - // Appointments( + WaitingRoom(), + MyPatientList(), + Placeholder(), + // MihPatientSearch( // signedInUser: widget.arguments.signedInUser, // business: widget.arguments.business, // personalSelected: widget.arguments.personalSelected, + // businessUser: widget.arguments.businessUser, // ), - WaitingRoom( - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - personalSelected: widget.arguments.personalSelected, - onIndexChange: updateIndex, - ), - MyPatientList( - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - personalSelected: widget.arguments.personalSelected, - ), - MihPatientSearch( - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - personalSelected: widget.arguments.personalSelected, - businessUser: widget.arguments.businessUser, - ), ]; return toolBodies; } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart index e85c1c02..1fe19f93 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart @@ -4,7 +4,9 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; +import 'package:provider/provider.dart'; class PatientProfileTile extends StatefulWidget { final PatientViewArguments arguments; @@ -26,6 +28,9 @@ class _PatientProfileTileState extends State { return MihPackageTile( authenticateUser: true, onTap: () { + PatientManagerProvider patientManagerProvider = + context.read(); + patientManagerProvider.setPersonalMode(true); context.goNamed( 'patientProfile', ); diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart index 9b91e465..806ff6d7 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart @@ -15,10 +15,8 @@ import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:provider/provider.dart'; class PatientProfile extends StatefulWidget { - final String? patientAppId; const PatientProfile({ super.key, - required this.patientAppId, }); @override @@ -36,13 +34,11 @@ class _PatientProfileState extends State { context.read(); PatientManagerProvider patientManagerProvider = context.read(); - String? app_id = widget.patientAppId ?? profileProvider.user!.app_id; - + String? app_id = profileProvider.user!.app_id; if (patientManagerProvider.selectedPatient == null) { await MihPatientServices() .getPatientDetails(app_id, patientManagerProvider); } - if (patientManagerProvider.selectedPatient == null) { // go to set up patient package context.goNamed("patientProfileSetup"); @@ -61,7 +57,9 @@ class _PatientProfileState extends State { @override void initState() { super.initState(); - initialisePatientData(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + initialisePatientData(); + }); } @override @@ -87,7 +85,6 @@ class _PatientProfileState extends State { iconSize: 35, onTap: () { patientManagerProvider.setPatientProfileIndex(0); - patientManagerProvider.setPatientManagerIndex(0); if (!patientManagerProvider.personalMode) { context.pop(); } else { diff --git a/Frontend/lib/mih_services/mih_claim_statement_generation_services.dart b/Frontend/lib/mih_services/mih_claim_statement_generation_services.dart index 9f615b9f..7cb073bd 100644 --- a/Frontend/lib/mih_services/mih_claim_statement_generation_services.dart +++ b/Frontend/lib/mih_services/mih_claim_statement_generation_services.dart @@ -129,7 +129,6 @@ class MIHClaimStatementGenerationApi { List docList = List.from( l.map((model) => ClaimStatementFile.fromJson(model))); //print("Here3"); - print(docList); patientManagerProvider.setClaimsDocuments( patientClaimsDocuments: docList); return docList; diff --git a/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart b/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart index 3acbeeea..6c18fb47 100644 --- a/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart +++ b/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart @@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/appointment.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; import 'package:flutter/material.dart'; @@ -291,7 +290,7 @@ class MihMzansiCalendarApis { AppUser signedInUser, bool personalSelected, String patientAppId, - BusinessArguments businessArgs, + String businessId, String title, String description, String date, @@ -306,7 +305,7 @@ class MihMzansiCalendarApis { }, body: jsonEncode({ "app_id": patientAppId, - "business_id": businessArgs.business?.business_id, + "business_id": businessId, "title": title, "description": description, "date": date, diff --git a/Frontend/lib/mih_services/mih_patient_services.dart b/Frontend/lib/mih_services/mih_patient_services.dart index 10e1bea3..8556a80f 100644 --- a/Frontend/lib/mih_services/mih_patient_services.dart +++ b/Frontend/lib/mih_services/mih_patient_services.dart @@ -4,6 +4,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/patient_access.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; @@ -289,4 +290,21 @@ class MihPatientServices { } return response.statusCode; } + + Future> getPatientAccessListOfBusiness( + PatientManagerProvider patientManagerProvider, + String business_id, + ) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/access-requests/business/patient/$business_id")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List patientAccesses = List.from( + l.map((model) => PatientAccess.fromJson(model))); + patientManagerProvider.setMyPatientList(myPaitentList: patientAccesses); + return patientAccesses; + } else { + throw Exception('failed to pull patient access List for business'); + } + } } diff --git a/Frontend/lib/mih_services/mih_service_calls.dart b/Frontend/lib/mih_services/mih_service_calls.dart index 2fc9014e..4cda4a90 100644 --- a/Frontend/lib/mih_services/mih_service_calls.dart +++ b/Frontend/lib/mih_services/mih_service_calls.dart @@ -126,29 +126,6 @@ class MIHApiCalls { } } - /// This function is used to get list of access the business has. - /// - /// Patameters: String business_id. - /// - /// Returns List (List of access that match the above parameters). - static Future> getPatientAccessListOfBusiness( - String business_id) async { - final response = await http.get(Uri.parse( - "${AppEnviroment.baseApiUrl}/access-requests/business/patient/$business_id")); - // var errorCode = response.statusCode.toString(); - // print(response.statusCode); - // print(response.body); - - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List patientAccesses = List.from( - l.map((model) => PatientAccess.fromJson(model))); - return patientAccesses; - } else { - throw Exception('failed to pull patient access List for business'); - } - } - /// This function is used to UPDATE access the business has. /// /// Patameters:-