From 1a474137fd080ad9ac5332724bb6446f15c051ce Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Tue, 9 Sep 2025 11:45:29 +0200 Subject: [PATCH] update pat man nav --- Frontend/lib/mih_config/mih_go_router.dart | 75 ++++++------ .../builder/build_appointment_list.dart | 25 +++- .../build_mih_patient_search_list.dart | 28 +++-- .../build_my_patient_list_list.dart | 114 ++++++++++++++++-- .../package_tiles/pat_manager_tile.dart | 12 +- .../package_tools/waiting_room.dart | 95 +++++++++++++-- .../pat_manager/pat_manager.dart | 7 +- .../pat_profile/patient_profile.dart | 12 +- 8 files changed, 288 insertions(+), 80 deletions(-) diff --git a/Frontend/lib/mih_config/mih_go_router.dart b/Frontend/lib/mih_config/mih_go_router.dart index 192c4aad..525805ab 100644 --- a/Frontend/lib/mih_config/mih_go_router.dart +++ b/Frontend/lib/mih_config/mih_go_router.dart @@ -21,8 +21,10 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profi import 'package:ken_logger/ken_logger.dart'; 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_edit.dart'; +import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_profile.dart'; import 'package:supertokens_flutter/supertokens.dart'; class MihGoRouterPaths { @@ -385,6 +387,38 @@ class MihGoRouter { ); }, ), + GoRoute( + name: "patientManager", + path: MihGoRouterPaths.patientManager, + builder: (BuildContext context, GoRouterState state) { + final PatManagerArguments? args = state.extra as PatManagerArguments?; + if (args == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go(MihGoRouterPaths.mihHome); + }); + return const SizedBox.shrink(); + } + return PatManager( + key: UniqueKey(), + arguments: args, + ); + }, + ), + GoRoute( + name: "patientManagerPatient", + path: MihGoRouterPaths.patientManagerPatient, + builder: (BuildContext context, GoRouterState state) { + final PatientViewArguments? args = + state.extra as PatientViewArguments?; + if (args == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go(MihGoRouterPaths.mihHome); + }); + return const SizedBox.shrink(); + } + return PatientProfile(arguments: args); + }, + ), // ========================== Mzansi Directory ================================== GoRoute( name: "mzansiDirectory", @@ -403,12 +437,6 @@ class MihGoRouter { ), // ========================== End ================================== // GoRoute( -// name: "mihAuthentication", -// path: MihGoRouterPaths.mihAuthentication, -// builder: (BuildContext context, GoRouterState state) => -// MihAuthentication(), -// ), -// GoRoute( // name: "notifications", // path: MihGoRouterPaths.notifications, // builder: (BuildContext context, GoRouterState state) { @@ -417,41 +445,6 @@ class MihGoRouter { // }, // ), // GoRoute( -// name: "patientProfileSetup", -// path: MihGoRouterPaths.patientProfileSetup, -// builder: (BuildContext context, GoRouterState state) { -// final AppUser? signedInUser = state.extra as AppUser?; -// return AddPatient(signedInUser: signedInUser!); -// }, -// ), -// // Note: You can't have two separate GoRoutes with the same path. -// // 'appointments' and 'calendar' now need a distinct path, or be sub-routes. -// // Here, we'll assume they should be separate. -// GoRoute( -// name: "mihAppointments", -// path: MihGoRouterPaths.appointments, -// builder: (BuildContext context, GoRouterState state) { -// final CalendarArguments? args = state.extra as CalendarArguments?; -// return MzansiCalendar(arguments: args!); -// }, -// ), -// GoRoute( -// name: "patientManager", -// path: MihGoRouterPaths.patientManager, -// builder: (BuildContext context, GoRouterState state) { -// final PatManagerArguments? args = state.extra as PatManagerArguments?; -// return PatManager(arguments: args!); -// }, -// ), -// GoRoute( -// name: "patientManagerPatient", -// path: MihGoRouterPaths.patientManagerPatient, -// builder: (BuildContext context, GoRouterState state) { -// final PatientViewArguments? args = state.extra as PatientViewArguments?; -// return PatientProfile(arguments: args!); -// }, -// ), -// GoRoute( // name: "fileViewer", // path: MihGoRouterPaths.fileViewer, // builder: (BuildContext context, GoRouterState state) { diff --git a/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart b/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart index c70c23d3..b195fb75 100644 --- a/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart +++ b/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart @@ -1,5 +1,6 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:go_router/go_router.dart'; +import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; @@ -201,7 +202,7 @@ class _BuildAppointmentListState extends State { ), ], onWindowTapClose: () { - Navigator.of(context).pop(); + context.pop(); widget.dateController.clear(); widget.timeController.clear(); widget.titleController.clear(); @@ -323,7 +324,7 @@ class _BuildAppointmentListState extends State { ), ], onWindowTapClose: () { - Navigator.of(context).pop(); + context.pop(); widget.dateController.clear(); widget.timeController.clear(); widget.titleController.clear(); @@ -424,7 +425,7 @@ class _BuildAppointmentListState extends State { .split('T')[1] .substring(0, 5); }); - Navigator.of(context).pop(); + context.pop(); }, windowBody: Padding( padding: @@ -600,6 +601,7 @@ class _BuildAppointmentListState extends State { context.pop(); context.pop(); if (!widget.inWaitingRoom) { + KenLogger.warning("calendar route"); context.goNamed( "mihCalendar", extra: CalendarArguments( @@ -610,7 +612,22 @@ class _BuildAppointmentListState extends State { ), ); } else { - //to-Do waiting room apointments + KenLogger.warning("waiting room route"); + // GoRouter.of(context).refresh(); + context.goNamed( + 'mihHome', + extra: false, + ); + context.goNamed( + 'patientManager', + extra: PatManagerArguments( + widget.signedInUser, + false, + widget.business, + widget.businessUser, + ), + ); + // context.pop(); } } else { internetConnectionPopUp(); diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_mih_patient_search_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_mih_patient_search_list.dart index 0772435e..68f98a06 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_mih_patient_search_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_mih_patient_search_list.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_service_calls.dart'; @@ -363,15 +364,24 @@ class _BuildPatientsListState extends State { child: MihButton( onPressed: () { if (hasAccess) { - Navigator.of(context) - .pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - widget.patients[index], - widget.businessUser, - widget.business, - "business", - )); + context.pop(); + context.pushNamed('patientManagerPatient', + extra: PatientViewArguments( + widget.signedInUser, + widget.patients[index], + widget.businessUser, + widget.business, + "business", + )); + // Navigator.of(context) + // .pushNamed('/patient-manager/patient', + // arguments: PatientViewArguments( + // widget.signedInUser, + // widget.patients[index], + // widget.businessUser, + // widget.business, + // "business", + // )); } else { noAccessWarning(); } diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_my_patient_list_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_my_patient_list_list.dart index aed37d40..d7e6059a 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_my_patient_list_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/list_builders/build_my_patient_list_list.dart @@ -1,4 +1,6 @@ +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_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'; @@ -49,14 +51,15 @@ class _BuildPatientsListState extends State { final baseAPI = AppEnviroment.baseApiUrl; - void submitApointment(int index) { + Future submitApointment(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}"; - MihMzansiCalendarApis.addPatientAppointment( + int statusCode; + statusCode = await MihMzansiCalendarApis.addPatientAppointment( widget.signedInUser, false, widget.patientAccesses[index].app_id, @@ -71,6 +74,86 @@ class _BuildPatientsListState extends State { timeController.text, context, ); + if (statusCode == 201) { + context.pop(); + successPopUp("Successfully Added Appointment", + "You appointment has been successfully added to your calendar."); + } else { + internetConnectionPopUp(); + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage( + errorType: "Internet Connection", + ); + }, + ); + } + + void successPopUp(String title, String message) { + showDialog( + context: context, + builder: (context) { + return MihPackageAlert( + alertIcon: Icon( + Icons.check_circle_outline_rounded, + size: 150, + color: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + alertTitle: title, + alertBody: Column( + children: [ + Text( + message, + style: TextStyle( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25), + Center( + child: MihButton( + onPressed: () { + context.pop(); + context.pop(); + setState(() { + dateController.clear(); + timeController.clear(); + idController.clear(); + fnameController.clear(); + lnameController.clear(); + }); + }, + buttonColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + elevation: 10, + width: 300, + child: Text( + "Dismiss", + style: TextStyle( + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + ], + ), + alertColour: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ); + }, + ); } bool isAppointmentFieldsFilled() { @@ -341,15 +424,24 @@ class _BuildPatientsListState extends State { ), MihButton( onPressed: () { - Navigator.of(context) - .pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - patientProfile, - widget.businessUser, - widget.business, - "business", - )); + 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", + // )); }, buttonColor: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tiles/pat_manager_tile.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tiles/pat_manager_tile.dart index b17e794a..0d95b243 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tiles/pat_manager_tile.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tiles/pat_manager_tile.dart @@ -1,3 +1,4 @@ +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_tile.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; @@ -22,11 +23,16 @@ class _PatManagerTileState extends State { @override Widget build(BuildContext context) { return MihPackageTile( + authenticateUser: true, onTap: () { - Navigator.of(context).pushNamed( - '/patient-manager', - arguments: widget.arguments, + context.goNamed( + 'patientManager', + extra: widget.arguments, ); + // Navigator.of(context).pushNamed( + // '/patient-manager', + // arguments: widget.arguments, + // ); }, appName: "Patient Manager", appIcon: Icon( diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/waiting_room.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/waiting_room.dart index ac7dfb49..9dfe5cbf 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/waiting_room.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/waiting_room.dart @@ -1,6 +1,8 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; +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_icons.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.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'; @@ -269,7 +271,7 @@ class _WaitingRoomState extends State { fullscreen: false, windowTitle: "Appointment Type", onWindowTapClose: () { - Navigator.of(context).pop(); + context.pop(); }, windowBody: Column( children: [ @@ -285,7 +287,7 @@ class _WaitingRoomState extends State { MihButton( onPressed: () { widget.onIndexChange(1); - Navigator.of(context).pop(); + context.pop(); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), @@ -304,7 +306,7 @@ class _WaitingRoomState extends State { MihButton( onPressed: () { widget.onIndexChange(2); - Navigator.of(context).pop(); + context.pop(); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), @@ -354,7 +356,7 @@ class _WaitingRoomState extends State { fullscreen: false, windowTitle: "Add Appointment", onWindowTapClose: () { - Navigator.of(context).pop(); + context.pop(); _appointmentDateController.clear(); _appointmentTimeController.clear(); _appointmentTitleController.clear(); @@ -457,10 +459,11 @@ class _WaitingRoomState extends State { ); } - void addAppointmentCall() { + Future addAppointmentCall() async { if (isAppointmentInputValid()) { + int statusCode; if (widget.personalSelected == false) { - MihMzansiCalendarApis.addBusinessAppointment( + statusCode = await MihMzansiCalendarApis.addBusinessAppointment( widget.signedInUser, widget.business!, widget.businessUser!, @@ -472,7 +475,7 @@ class _WaitingRoomState extends State { context, ); } else { - MihMzansiCalendarApis.addPersonalAppointment( + statusCode = await MihMzansiCalendarApis.addPersonalAppointment( widget.signedInUser, _appointmentTitleController.text, _appointmentDescriptionIDController.text, @@ -481,6 +484,13 @@ class _WaitingRoomState extends State { context, ); } + if (statusCode == 201) { + context.pop(); + successPopUp("Successfully Added Appointment", + "You appointment has been successfully added to your calendar."); + } else { + internetConnectionPopUp(); + } } else { showDialog( context: context, @@ -492,6 +502,77 @@ class _WaitingRoomState extends State { checkforchange(); } + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage( + errorType: "Internet Connection", + ); + }, + ); + } + + void successPopUp(String title, String message) { + showDialog( + context: context, + builder: (context) { + return MihPackageAlert( + alertIcon: Icon( + Icons.check_circle_outline_rounded, + size: 150, + color: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + alertTitle: title, + alertBody: Column( + children: [ + Text( + message, + style: TextStyle( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25), + Center( + child: MihButton( + onPressed: () { + context.pop(); + setState(() { + _appointmentDateController.clear(); + _appointmentTimeController.clear(); + _appointmentTitleController.clear(); + _appointmentDescriptionIDController.clear(); + }); + }, + buttonColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + elevation: 10, + width: 300, + child: Text( + "Dismiss", + style: TextStyle( + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + ], + ), + alertColour: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ); + }, + ); + } + bool isAppointmentInputValid() { if (_appointmentDescriptionIDController.text.isEmpty || _appointmentDateController.text.isEmpty || 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 da284a2a..77003af1 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 @@ -1,3 +1,4 @@ +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'; @@ -48,7 +49,11 @@ class _PatManagerState extends State { icon: const Icon(Icons.arrow_back), iconSize: 35, onTap: () { - Navigator.of(context).pop(); + // Navigator.of(context).pop(); + context.goNamed( + 'mihHome', + extra: false, + ); FocusScope.of(context).unfocus(); }, ); 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 index 90cfb4fa..01f3d6b6 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_profile.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/patient_profile.dart @@ -43,10 +43,14 @@ class _PatientProfileState extends State { icon: const Icon(Icons.arrow_back), iconSize: 35, onTap: () { - context.goNamed( - 'mihHome', - extra: true, - ); + if (widget.arguments.type == "business") { + context.pop(); + } else { + context.goNamed( + 'mihHome', + extra: true, + ); + } FocusScope.of(context).unfocus(); }, );