From 926b749fa8ab9b0f465232d52f139e3f156d7228 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Tue, 21 Oct 2025 13:00:52 +0200 Subject: [PATCH] NEW: MIH Calendar Provider Setup --- Frontend/lib/main.dart | 4 + .../mih_package_components/mih_calendar.dart | 18 +- .../mih_providers/mih_calendar_provider.dart | 66 ++++ Frontend/lib/mih_config/mih_go_router.dart | 6 +- .../builder/build_appointment_list.dart | 262 ++++++++------- .../calendar/mzansi_calendar.dart | 17 +- .../package_tiles/mzansi_calendar_tile.dart | 4 - .../calendar/package_tools/appointments.dart | 306 +++++++++--------- .../package_tools/mih_business_home.dart | 6 - .../package_tools/mih_personal_home.dart | 6 - .../package_tools/waiting_room.dart | 214 ++++++------ .../mih_mzansi_calendar_services.dart | 151 ++++----- 12 files changed, 576 insertions(+), 484 deletions(-) diff --git a/Frontend/lib/main.dart b/Frontend/lib/main.dart index 05ab1dc3..efee465d 100644 --- a/Frontend/lib/main.dart +++ b/Frontend/lib/main.dart @@ -4,6 +4,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_providers/about_mih_pro import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_authentication_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_mine_sweeper_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; @@ -95,6 +96,9 @@ class _MzansiInnovationHubState extends State { ChangeNotifierProvider( create: (context) => MihCalculatorProvider(), ), + ChangeNotifierProvider( + create: (context) => MihCalendarProvider(), + ), ChangeNotifierProvider( create: (context) => AboutMihProvider(), ), diff --git a/Frontend/lib/mih_components/mih_package_components/mih_calendar.dart b/Frontend/lib/mih_components/mih_package_components/mih_calendar.dart index 01fc2f18..8989da51 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_calendar.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_calendar.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; +import 'package:provider/provider.dart'; import 'package:table_calendar/table_calendar.dart'; class MIHCalendar extends StatefulWidget { @@ -19,16 +22,29 @@ class MIHCalendar extends StatefulWidget { } class _MIHCalendarState extends State { - DateTime selectedDay = DateTime.now(); + late DateTime selectedDay; CalendarFormat _calendarFormat = CalendarFormat.week; void onDaySelected(DateTime day, DateTime focusedDay) { + KenLogger.success("Selected Day: $day"); setState(() { selectedDay = day; }); widget.setDate(selectedDay.toString().split(" ")[0]); } + @override + void initState() { + super.initState(); + MihCalendarProvider mihCalendarProvider = + context.read(); + if (mihCalendarProvider.selectedDay.isNotEmpty) { + selectedDay = DateTime.parse(mihCalendarProvider.selectedDay); + } else { + selectedDay = DateTime.now(); + } + } + @override Widget build(BuildContext context) { return SizedBox( diff --git a/Frontend/lib/mih_components/mih_providers/mih_calendar_provider.dart b/Frontend/lib/mih_components/mih_providers/mih_calendar_provider.dart index 7b80ab62..57cb2e92 100644 --- a/Frontend/lib/mih_components/mih_providers/mih_calendar_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/mih_calendar_provider.dart @@ -1,7 +1,11 @@ import 'package:flutter/foundation.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/appointment.dart'; class MihCalendarProvider extends ChangeNotifier { int toolIndex; + String selectedDay = DateTime.now().toString().split(" ")[0]; + List? personalAppointments; + List? businessAppointments; MihCalendarProvider({ this.toolIndex = 0, @@ -11,4 +15,66 @@ class MihCalendarProvider extends ChangeNotifier { toolIndex = index; notifyListeners(); } + + void setSelectedDay(String day) { + selectedDay = day; + notifyListeners(); + } + + void resetSelectedDay() { + selectedDay = DateTime.now().toString().split(" ")[0]; + notifyListeners(); + } + + void setPersonalAppointments({required List appointments}) { + personalAppointments = appointments; + notifyListeners(); + } + + void setBusinessAppointments({required List appointments}) { + businessAppointments = appointments; + notifyListeners(); + } + + void addPersonalAppointment({required Appointment newAppointment}) { + personalAppointments?.add(newAppointment); + notifyListeners(); + } + + void addBusinessAppointment({required Appointment newAppointment}) { + businessAppointments?.add(newAppointment); + notifyListeners(); + } + + void editPersonalAppointment({required Appointment updatedAppointment}) { + int index = personalAppointments?.indexWhere((appointment) => + appointment.idappointments == updatedAppointment.idappointments) ?? + -1; + if (index != -1) { + personalAppointments?[index] = updatedAppointment; + notifyListeners(); + } + } + + void editBusinessAppointment({required Appointment updatedAppointment}) { + int index = businessAppointments?.indexWhere((appointment) => + appointment.idappointments == updatedAppointment.idappointments) ?? + -1; + if (index != -1) { + businessAppointments?[index] = updatedAppointment; + notifyListeners(); + } + } + + void deletePersonalAppointment({required int appointmentId}) { + personalAppointments?.removeWhere( + (appointment) => appointment.idappointments == appointmentId); + notifyListeners(); + } + + void deleteBusinessAppointment({required int appointmentId}) { + businessAppointments?.removeWhere( + (appointment) => appointment.idappointments == appointmentId); + notifyListeners(); + } } diff --git a/Frontend/lib/mih_config/mih_go_router.dart b/Frontend/lib/mih_config/mih_go_router.dart index fb7429ce..69732265 100644 --- a/Frontend/lib/mih_config/mih_go_router.dart +++ b/Frontend/lib/mih_config/mih_go_router.dart @@ -241,8 +241,7 @@ class MihGoRouter { path: MihGoRouterPaths.calendar, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mihCalendar"); - final CalendarArguments? args = state.extra as CalendarArguments?; - if (args == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); @@ -250,7 +249,6 @@ class MihGoRouter { } return MzansiCalendar( key: UniqueKey(), - arguments: args, ); }, ), @@ -260,7 +258,7 @@ class MihGoRouter { path: MihGoRouterPaths.mzansiAi, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mzansiAi"); - if (context.watch().business == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); 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 b195fb75..d56ef908 100644 --- a/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart +++ b/Frontend/lib/mih_packages/calendar/builder/build_appointment_list.dart @@ -2,8 +2,11 @@ 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/appointment.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'; +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_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'; @@ -17,18 +20,10 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ 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_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:flutter/material.dart'; +import 'package:provider/provider.dart'; class BuildAppointmentList extends StatefulWidget { - final List appointmentList; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final bool personalSelected; final bool inWaitingRoom; final TextEditingController titleController; final TextEditingController descriptionIDController; @@ -38,11 +33,6 @@ class BuildAppointmentList extends StatefulWidget { const BuildAppointmentList({ super.key, - required this.appointmentList, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.personalSelected, required this.inWaitingRoom, required this.titleController, required this.descriptionIDController, @@ -77,22 +67,39 @@ class _BuildAppointmentListState extends State { } } - Widget displayAppointment(int index, double bodyWidth) { - String heading = - "${widget.appointmentList[index].date_time.split('T')[1].substring(0, 5)} - ${widget.appointmentList[index].title.toUpperCase()}"; - String description = widget.appointmentList[index].description; - DateTime now = new DateTime.now(); - int hourNow = int.parse(now.toString().split(' ')[1].substring(0, 2)); - String date = - new DateTime(now.year, now.month, now.day).toString().split(' ')[0]; - String appointDate = widget.appointmentList[index].date_time.split('T')[0]; - int appointHour = int.parse( - widget.appointmentList[index].date_time.split('T')[1].substring(0, 2)); - // print("Date Time Now: $now"); - // print("Hour Now: $hourNow"); - // print("Date: $date"); - // print("Appointment Date: $appointDate"); - // print("Appointment Hour: $appointHour"); + Widget displayAppointment(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, int index, double bodyWidth) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; + String heading = ""; + String description = ""; + DateTime now; + int hourNow = 0; + String date = ""; + int appointHour = 0; + String appointDate = ""; + if (appointmentList[index].date_time.contains("T")) { + heading = + "${appointmentList[index].date_time.split('T')[1].substring(0, 5)} - ${appointmentList[index].title.toUpperCase()}"; + description = appointmentList[index].description; + now = DateTime.now(); + hourNow = int.parse(now.toString().split(' ')[1].substring(0, 2)); + date = DateTime(now.year, now.month, now.day).toString().split(' ')[0]; + appointDate = appointmentList[index].date_time.split('T')[0]; + appointHour = int.parse( + appointmentList[index].date_time.split('T')[1].substring(0, 2)); + } else { + heading = + "${appointmentList[index].date_time.split(' ')[1].substring(0, 5)} - ${appointmentList[index].title.toUpperCase()}"; + description = appointmentList[index].description; + now = DateTime.now(); + hourNow = int.parse(now.toString().split(' ')[1].substring(0, 2)); + date = DateTime(now.year, now.month, now.day).toString().split(' ')[0]; + appointDate = appointmentList[index].date_time.split(' ')[0]; + appointHour = int.parse( + appointmentList[index].date_time.split(' ')[1].substring(0, 2)); + } Color appointmentColor = MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"); if (date == appointDate) { @@ -132,26 +139,28 @@ class _BuildAppointmentListState extends State { ), onTap: () { setState(() { - widget.titleController.text = widget.appointmentList[index].title; + widget.titleController.text = appointmentList[index].title; widget.descriptionIDController.text = - widget.appointmentList[index].description; + appointmentList[index].description; widget.dateController.text = - widget.appointmentList[index].date_time.split('T')[0]; - widget.timeController.text = widget.appointmentList[index].date_time - .split('T')[1] - .substring(0, 5); + appointmentList[index].date_time.split('T')[0]; + widget.timeController.text = + appointmentList[index].date_time.split('T')[1].substring(0, 5); }); if (widget.inWaitingRoom == false) { - appointmentDetailsWindow(index, bodyWidth); + appointmentDetailsWindow( + mzansiProfileProvider, mihCalendarProvider, index, bodyWidth); } else { - waitingRiinAppointmentDetailsWindow(index, bodyWidth); + waitingRoomAppointmentDetailsWindow( + mzansiProfileProvider, mihCalendarProvider, index, bodyWidth); } }, ), ); } - void appointmentDetailsWindow(int index, double bodyWidth) { + void appointmentDetailsWindow(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, int index, double bodyWidth) { showDialog( context: context, barrierDismissible: false, @@ -177,7 +186,8 @@ class _BuildAppointmentListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - appointmentUpdateWindow(index, bodyWidth); + appointmentUpdateWindow(mzansiProfileProvider, + mihCalendarProvider, index, bodyWidth); }, ), SpeedDialChild( @@ -197,7 +207,8 @@ class _BuildAppointmentListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - deleteAppointmentConfirmationWindow(index); + deleteAppointmentConfirmationWindow( + mzansiProfileProvider, mihCalendarProvider, index); }, ), ], @@ -273,7 +284,11 @@ class _BuildAppointmentListState extends State { ); } - void waitingRiinAppointmentDetailsWindow(int index, double bodyWidth) { + void waitingRoomAppointmentDetailsWindow( + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + int index, + double bodyWidth) { showDialog( context: context, barrierDismissible: false, @@ -299,7 +314,8 @@ class _BuildAppointmentListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - appointmentUpdateWindow(index, bodyWidth); + appointmentUpdateWindow(mzansiProfileProvider, + mihCalendarProvider, index, bodyWidth); }, ), SpeedDialChild( @@ -319,7 +335,8 @@ class _BuildAppointmentListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - deleteAppointmentConfirmationWindow(index); + deleteAppointmentConfirmationWindow( + mzansiProfileProvider, mihCalendarProvider, index); }, ), ], @@ -405,7 +422,11 @@ class _BuildAppointmentListState extends State { ); } - void appointmentUpdateWindow(int index, double bodyWidth) { + void appointmentUpdateWindow(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, int index, double bodyWidth) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; showDialog( context: context, barrierDismissible: false, @@ -415,13 +436,13 @@ class _BuildAppointmentListState extends State { windowTitle: "Update Appointment", onWindowTapClose: () { setState(() { - widget.titleController.text = widget.appointmentList[index].title; + widget.titleController.text = appointmentList[index].title; widget.descriptionIDController.text = - widget.appointmentList[index].description; + appointmentList[index].description; widget.dateController.text = - widget.appointmentList[index].date_time.split('T')[0]; - widget.timeController.text = widget - .appointmentList[index].date_time + appointmentList[index].date_time.split('T')[0]; + widget.timeController.text = appointmentList[index] + .date_time .split('T')[1] .substring(0, 5); }); @@ -497,7 +518,8 @@ class _BuildAppointmentListState extends State { MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - updateAppointmentCall(index); + updateAppointmentCall(mzansiProfileProvider, + mihCalendarProvider, index); } else { MihAlertServices() .formNotFilledCompletely(context); @@ -542,7 +564,10 @@ class _BuildAppointmentListState extends State { } } - void deleteAppointmentConfirmationWindow(int index) { + void deleteAppointmentConfirmationWindow( + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + int index) { showDialog( context: context, barrierDismissible: false, @@ -550,46 +575,55 @@ class _BuildAppointmentListState extends State { return MIHDeleteMessage( deleteType: "Appointment", onTap: () { - deleteAppointmentCall(index); + deleteAppointmentCall( + mzansiProfileProvider, mihCalendarProvider, index); }); }, ); } - Future updateAppointmentCall(int index) async { + Future updateAppointmentCall( + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + int index) async { int statusCode; if (isAppointmentInputValid()) { - if (widget.personalSelected == true) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; + if (mzansiProfileProvider.personalHome == true) { statusCode = await MihMzansiCalendarApis.updatePersonalAppointment( - widget.signedInUser, - widget.business, + mzansiProfileProvider.user!, + mzansiProfileProvider.business, null, - widget.appointmentList[index].idappointments, + appointmentList[index].idappointments, widget.titleController.text, widget.descriptionIDController.text, widget.dateController.text, widget.timeController.text, + mihCalendarProvider, context, ); - } else if (widget.personalSelected == false && + } else if (mzansiProfileProvider.personalHome == false && widget.inWaitingRoom == false) { statusCode = await MihMzansiCalendarApis.updateBusinessAppointment( - widget.signedInUser, - widget.business, - widget.businessUser, - widget.appointmentList[index].idappointments, + mzansiProfileProvider.user!, + mzansiProfileProvider.business, + mzansiProfileProvider.businessUser, + appointmentList[index].idappointments, widget.titleController.text, widget.descriptionIDController.text, widget.dateController.text, widget.timeController.text, + mihCalendarProvider, context, ); } else { statusCode = await MihMzansiCalendarApis.updatePatientAppointment( - widget.signedInUser, - widget.business, - widget.businessUser, - widget.appointmentList[index].idappointments, + mzansiProfileProvider.user!, + mzansiProfileProvider.business, + mzansiProfileProvider.businessUser, + appointmentList[index].idappointments, widget.titleController.text, widget.descriptionIDController.text, widget.dateController.text, @@ -604,27 +638,20 @@ class _BuildAppointmentListState extends State { KenLogger.warning("calendar route"); context.goNamed( "mihCalendar", - extra: CalendarArguments( - widget.signedInUser, - widget.personalSelected, - widget.business, - widget.businessUser, - ), ); } else { KenLogger.warning("waiting room route"); // GoRouter.of(context).refresh(); context.goNamed( 'mihHome', - extra: false, ); context.goNamed( 'patientManager', extra: PatManagerArguments( - widget.signedInUser, + mzansiProfileProvider.user!, false, - widget.business, - widget.businessUser, + mzansiProfileProvider.business, + mzansiProfileProvider.businessUser, ), ); // context.pop(); @@ -642,22 +669,26 @@ class _BuildAppointmentListState extends State { } } - Future deleteAppointmentCall(int index) async { + Future deleteAppointmentCall( + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + int index) async { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; int statucCode = await MihMzansiCalendarApis.deleteAppointmentAPICall( - widget.signedInUser, - widget.personalSelected, - widget.business, - widget.businessUser, + mzansiProfileProvider.user!, + mzansiProfileProvider.personalHome, + mzansiProfileProvider.business, + mzansiProfileProvider.businessUser, widget.inWaitingRoom, - widget.appointmentList[index].idappointments, + appointmentList[index].idappointments, + mihCalendarProvider, context, ); if (statucCode == 200) { context.pop(); context.pop(); - setState(() { - widget.appointmentList.removeAt(index); - }); successPopUp("Successfully Deleted Appointment", "You appointment has been successfully deleted from your calendar."); } else { @@ -730,20 +761,24 @@ class _BuildAppointmentListState extends State { ); } - bool canEditAppointment(int index) { - if (widget.personalSelected == true && - widget.appointmentList[index].app_id == widget.signedInUser.app_id && - widget.appointmentList[index].business_id == "") { + bool canEditAppointment(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, int index) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; + if (mzansiProfileProvider.personalHome == true && + appointmentList[index].app_id == mzansiProfileProvider.user!.app_id && + appointmentList[index].business_id == "") { return true; - } else if (widget.personalSelected == false && - widget.appointmentList[index].business_id == - widget.business!.business_id && - widget.appointmentList[index].app_id.isEmpty) { + } else if (mzansiProfileProvider.personalHome == false && + appointmentList[index].business_id == + mzansiProfileProvider.business!.business_id && + appointmentList[index].app_id.isEmpty) { return true; - } else if (widget.personalSelected == false && - widget.appointmentList[index].business_id == - widget.business!.business_id && - widget.appointmentList[index].app_id.isNotEmpty) { + } else if (mzansiProfileProvider.personalHome == false && + appointmentList[index].business_id == + mzansiProfileProvider.business!.business_id && + appointmentList[index].app_id.isNotEmpty) { return true; } else { return false; @@ -765,16 +800,27 @@ class _BuildAppointmentListState extends State { width = size.width; height = size.height; }); - return Padding( - padding: EdgeInsets.symmetric(horizontal: getPaddingSize()), - child: ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: widget.appointmentList.length, - itemBuilder: (context, index) { - return displayAppointment(index, width); - }, - ), + return Consumer2( + builder: (BuildContext context, + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + Widget? child) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; + return Padding( + padding: EdgeInsets.symmetric(horizontal: getPaddingSize()), + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: appointmentList.length, + itemBuilder: (context, index) { + return displayAppointment( + mzansiProfileProvider, mihCalendarProvider, index, width); + }, + ), + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/calendar/mzansi_calendar.dart b/Frontend/lib/mih_packages/calendar/mzansi_calendar.dart index fc148291..cb0687e4 100644 --- a/Frontend/lib/mih_packages/calendar/mzansi_calendar.dart +++ b/Frontend/lib/mih_packages/calendar/mzansi_calendar.dart @@ -2,17 +2,15 @@ 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_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_packages/calendar/package_tools/appointments.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class MzansiCalendar extends StatefulWidget { - final CalendarArguments arguments; const MzansiCalendar({ super.key, - required this.arguments, }); @override @@ -40,9 +38,9 @@ class _MzansiCalendarState extends State { iconSize: 35, onTap: () { // Navigator.of(context).pop(); + context.read().resetSelectedDay(); context.goNamed( 'mihHome', - extra: widget.arguments.personalSelected, ); FocusScope.of(context).unfocus(); }, @@ -64,19 +62,16 @@ class _MzansiCalendarState extends State { List getToolBody() { List toolBodies = [ //appointment here - Appointments( - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - personalSelected: widget.arguments.personalSelected, - ), + Appointments(), ]; return toolBodies; } List getToolTitle() { + MzansiProfileProvider mzansiProfileProvider = + context.read(); List toolTitles = [ - widget.arguments.personalSelected == true ? "Personal" : "Business", + mzansiProfileProvider.personalHome == true ? "Personal" : "Business", ]; return toolTitles; } diff --git a/Frontend/lib/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart b/Frontend/lib/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart index 7abb6097..545aac53 100644 --- a/Frontend/lib/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart +++ b/Frontend/lib/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart @@ -2,17 +2,14 @@ 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'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; class MzansiCalendarTile extends StatefulWidget { - final CalendarArguments arguments; final double packageSize; const MzansiCalendarTile({ super.key, - required this.arguments, required this.packageSize, }); @@ -27,7 +24,6 @@ class _MzansiCalendarTileState extends State { onTap: () { context.goNamed( "mihCalendar", - extra: widget.arguments, ); // Navigator.of(context).pushNamed( // '/calendar', diff --git a/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart b/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart index db9bb941..1d198a82 100644 --- a/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart +++ b/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart @@ -1,7 +1,13 @@ +import 'package:flutter/material.dart'; 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_calendar.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_components/mih_pop_up_messages/mih_loading_circle.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_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'; @@ -17,29 +23,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_time_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.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 '../../../main.dart'; - -import '../../../mih_components/mih_package_components/mih_calendar.dart'; -import '../../../mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import '../../../mih_config/mih_env.dart'; -import '../../../mih_components/mih_objects/app_user.dart'; +import 'package:provider/provider.dart'; class Appointments extends StatefulWidget { - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final bool personalSelected; - const Appointments({ super.key, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.personalSelected, }); @override @@ -57,25 +46,18 @@ class _PatientAccessRequestState extends State { TextEditingController(); final TextEditingController _appointmentTimeController = TextEditingController(); - String baseUrl = AppEnviroment.baseApiUrl; - - String selectedDay = DateTime.now().toString().split(" ")[0]; - - late Future> personalAppointmentResults; - late Future> businessAppointmentResults; - late Future> appointmentResults; + bool isLoading = true; final _formKey = GlobalKey(); - Widget displayAppointmentList(List appointmentList) { + Widget displayAppointmentList(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider) { + List appointmentList = mzansiProfileProvider.personalHome + ? mihCalendarProvider.personalAppointments! + : mihCalendarProvider.businessAppointments!; if (appointmentList.isNotEmpty) { return Expanded( child: BuildAppointmentList( - appointmentList: appointmentList, - signedInUser: widget.signedInUser, - business: widget.business, - businessUser: widget.businessUser, - personalSelected: widget.personalSelected, inWaitingRoom: false, titleController: _appointmentTitleController, descriptionIDController: _appointmentDescriptionIDController, @@ -101,7 +83,7 @@ class _PatientAccessRequestState extends State { ), const SizedBox(height: 10), Text( - "No appointments for $selectedDay", + "No appointments for ${mihCalendarProvider.selectedDay}", textAlign: TextAlign.center, overflow: TextOverflow.visible, style: TextStyle( @@ -147,7 +129,8 @@ class _PatientAccessRequestState extends State { ); } - void addAppointmentWindow(double width) { + void addAppointmentWindow(MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, double width) { showDialog( context: context, barrierDismissible: false, @@ -227,7 +210,8 @@ class _PatientAccessRequestState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - addAppointmentCall(); + addAppointmentCall( + mzansiProfileProvider, mihCalendarProvider); } else { MihAlertServices().formNotFilledCompletely(context); } @@ -269,28 +253,33 @@ class _PatientAccessRequestState extends State { } } - Future addAppointmentCall() async { + Future addAppointmentCall( + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + ) async { if (isAppointmentInputValid()) { int statusCode; - if (widget.personalSelected == false) { + if (mzansiProfileProvider.personalHome == false) { statusCode = await MihMzansiCalendarApis.addBusinessAppointment( - widget.signedInUser, - widget.business!, - widget.businessUser!, + mzansiProfileProvider.user!, + mzansiProfileProvider.business!, + mzansiProfileProvider.businessUser!, false, _appointmentTitleController.text, _appointmentDescriptionIDController.text, _appointmentDateController.text, _appointmentTimeController.text, + mihCalendarProvider, context, ); } else { statusCode = await MihMzansiCalendarApis.addPersonalAppointment( - widget.signedInUser, + mzansiProfileProvider.user!, _appointmentTitleController.text, _appointmentDescriptionIDController.text, _appointmentDateController.text, _appointmentTimeController.text, + mihCalendarProvider, context, ); } @@ -298,20 +287,20 @@ class _PatientAccessRequestState extends State { context.pop(); successPopUp("Successfully Added Appointment", "You appointment has been successfully added to your calendar."); - setState(() { - if (widget.personalSelected) { - appointmentResults = MihMzansiCalendarApis.getPersonalAppointments( - widget.signedInUser.app_id, - selectedDay, - ); - } else { - appointmentResults = MihMzansiCalendarApis.getBusinessAppointments( - widget.business!.business_id, - false, - selectedDay, - ); - } - }); + if (mzansiProfileProvider.personalHome == true) { + await MihMzansiCalendarApis.getPersonalAppointments( + mzansiProfileProvider.user!.app_id, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + } else { + await MihMzansiCalendarApis.getBusinessAppointments( + mzansiProfileProvider.business!.business_id, + false, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + } } else { internetConnectionPopUp(); } @@ -397,8 +386,8 @@ class _PatientAccessRequestState extends State { ); } - String getTitle() { - if (widget.personalSelected == false) { + String getTitle(MzansiProfileProvider mzansiProfileProvider) { + if (mzansiProfileProvider.personalHome == false) { return "Business Appointments"; } else { return "Personal Appointments"; @@ -407,108 +396,114 @@ class _PatientAccessRequestState extends State { void checkforchange() { setState(() { - if (widget.personalSelected == false) { - appointmentResults = MihMzansiCalendarApis.getBusinessAppointments( - widget.business!.business_id, - false, - selectedDay, - ); - } else { - appointmentResults = MihMzansiCalendarApis.getPersonalAppointments( - widget.signedInUser.app_id, - selectedDay, - ); - } + isLoading = true; }); + _loadInitialAppointments(); } Widget getBody(double width) { - return Stack( - children: [ - MihSingleChildScroll( - child: Column( - children: [ - MIHCalendar( - calendarWidth: 500, - rowHeight: 35, - setDate: (value) { - setState(() { - selectedDay = value; - selectedAppointmentDateController.text = selectedDay; - }); - }), - // Divider( - // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - // ), - Row( - mainAxisSize: MainAxisSize.max, + if (isLoading) { + return const Center( + child: Mihloadingcircle(), + ); + } + return Consumer2( + builder: (BuildContext context, + MzansiProfileProvider mzansiProfileProvider, + MihCalendarProvider mihCalendarProvider, + Widget? child) { + return Stack( + children: [ + MihSingleChildScroll( + child: Column( children: [ - FutureBuilder( - future: appointmentResults, - builder: (context, snapshot) { - if (snapshot.connectionState == - ConnectionState.waiting) { - return const Expanded( - child: Center(child: Mihloadingcircle())); - } else if (snapshot.connectionState == - ConnectionState.done && - snapshot.hasData) { - return displayAppointmentList(snapshot.requireData); - } else { - return Center( - child: Text( - "Error pulling appointments", - style: TextStyle( - fontSize: 25, - color: MihColors.getRedColor( - MzansiInnovationHub.of(context)! - .theme - .mode == - "Dark")), - textAlign: TextAlign.center, - ), - ); - } + MIHCalendar( + calendarWidth: 500, + rowHeight: 35, + setDate: (value) { + mihCalendarProvider.setSelectedDay(value); + setState(() { + selectedAppointmentDateController.text = value; + }); }), + // Divider( + // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + // ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + displayAppointmentList( + mzansiProfileProvider, + mihCalendarProvider, + ), + ], + ) ], - ) - ], - ), - ), - Positioned( - right: 10, - bottom: 10, - child: MihFloatingMenu( - icon: Icons.add, - animatedIcon: AnimatedIcons.menu_close, - children: [ - SpeedDialChild( - child: Icon( - Icons.add, - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - label: "Add Appointment", - labelBackgroundColor: MihColors.getGreenColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - labelStyle: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - fontWeight: FontWeight.bold, - ), - backgroundColor: MihColors.getGreenColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onTap: () { - addAppointmentWindow(width); - }, - ) - ], - ), - ), - ], + ), + ), + Positioned( + right: 10, + bottom: 10, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + label: "Add Appointment", + labelBackgroundColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + labelStyle: TextStyle( + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + fontWeight: FontWeight.bold, + ), + backgroundColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onTap: () { + addAppointmentWindow( + mzansiProfileProvider, mihCalendarProvider, width); + }, + ) + ], + ), + ), + ], + ); + }, ); } + Future _loadInitialAppointments() async { + MzansiProfileProvider mzansiProfileProvider = + context.read(); + MihCalendarProvider mihCalendarProvider = + context.read(); + if (mzansiProfileProvider.personalHome == false) { + await MihMzansiCalendarApis.getBusinessAppointments( + mzansiProfileProvider.business!.business_id, + false, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + } else { + await MihMzansiCalendarApis.getPersonalAppointments( + mzansiProfileProvider.user!.app_id, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + } + setState(() { + isLoading = false; + }); + } + @override void dispose() { selectedAppointmentDateController.dispose(); @@ -522,19 +517,8 @@ class _PatientAccessRequestState extends State { @override void initState() { selectedAppointmentDateController.addListener(checkforchange); - setState(() { - if (widget.personalSelected == false) { - appointmentResults = MihMzansiCalendarApis.getBusinessAppointments( - widget.business!.business_id, - false, - selectedDay, - ); - } else { - appointmentResults = MihMzansiCalendarApis.getPersonalAppointments( - widget.signedInUser.app_id, - selectedDay, - ); - } + WidgetsBinding.instance.addPostFrameCallback((_) async { + _loadInitialAppointments(); }); super.initState(); } diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index 7c3c49bd..6b19a4c2 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -98,12 +98,6 @@ class _MihBusinessHomeState extends State //=============== Calendar =============== temp.add({ "Calendar": MzansiCalendarTile( - arguments: CalendarArguments( - mzansiProfileProvider.user!, - false, - mzansiProfileProvider.business!, - mzansiProfileProvider.businessUser!, - ), packageSize: packageSize, ) }); diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index 0b879fc2..dac8ef6c 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -125,12 +125,6 @@ class _MihPersonalHomeState extends State //=============== Calendar =============== temp.add({ "Calendar": MzansiCalendarTile( - arguments: CalendarArguments( - widget.signedInUser, - true, - widget.business, - widget.businessUser, - ), packageSize: packageSize, ) }); 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 9dfe5cbf..89e737ef 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 @@ -3,6 +3,8 @@ 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_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_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'; @@ -26,6 +28,7 @@ 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; @@ -60,113 +63,91 @@ class _WaitingRoomState extends State { final TextEditingController _patientController = TextEditingController(); String baseUrl = AppEnviroment.baseApiUrl; - String selectedDay = DateTime.now().toString().split(" ")[0]; - late Future> businessAppointmentResults; late Future> appointmentResults; bool inWaitingRoom = true; + bool isLoading = true; final _formKey = GlobalKey(); // Business Appointment Tool Widget getBusinessAppointmentsTool(double width) { - return Stack( - children: [ - MihSingleChildScroll( - child: Column( - children: [ - MIHCalendar( - calendarWidth: 500, - rowHeight: 35, - setDate: (value) { - setState(() { - selectedDay = value; - selectedAppointmentDateController.text = selectedDay; - }); - }), - // Divider( - // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - // ), - Row( - mainAxisSize: MainAxisSize.max, + return Consumer( + builder: (BuildContext context, MihCalendarProvider mihCalendarProvider, + Widget? child) { + if (isLoading) { + return const Center( + child: Mihloadingcircle(), + ); + } + return Stack( + children: [ + MihSingleChildScroll( + child: Column( children: [ - FutureBuilder( - future: appointmentResults, - builder: (context, snapshot) { - if (snapshot.connectionState == - ConnectionState.waiting) { - return const Expanded( - child: Center(child: Mihloadingcircle())); - } else if (snapshot.connectionState == - ConnectionState.done && - snapshot.hasData) { - return - // Container(child: const Placeholder()); - displayAppointmentList(snapshot.requireData); - } else { - return Center( - child: Text( - "Error pulling appointments", - style: TextStyle( - fontSize: 25, - color: MihColors.getRedColor( - MzansiInnovationHub.of(context)! - .theme - .mode == - "Dark")), - textAlign: TextAlign.center, - ), - ); - } + MIHCalendar( + calendarWidth: 500, + rowHeight: 35, + setDate: (value) { + mihCalendarProvider.setSelectedDay(value); + setState(() { + selectedAppointmentDateController.text = value; + }); }), + // Divider( + // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + // ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + displayAppointmentList(mihCalendarProvider), + ], + ) ], - ) - ], - ), - ), - Positioned( - right: 10, - bottom: 10, - child: MihFloatingMenu( - icon: Icons.add, - animatedIcon: AnimatedIcons.menu_close, - children: [ - SpeedDialChild( - child: Icon( - Icons.add, - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - label: "Add Appointment", - labelBackgroundColor: MihColors.getGreenColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - labelStyle: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - fontWeight: FontWeight.bold, - ), - backgroundColor: MihColors.getGreenColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onTap: () { - // addAppointmentWindow(); - appointmentTypeSelection(width); - }, - ) - ], - ), - ), - ], + ), + ), + Positioned( + right: 10, + bottom: 10, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + label: "Add Appointment", + labelBackgroundColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + labelStyle: TextStyle( + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + fontWeight: FontWeight.bold, + ), + backgroundColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onTap: () { + // addAppointmentWindow(); + appointmentTypeSelection(mihCalendarProvider, width); + }, + ) + ], + ), + ), + ], + ); + }, ); } - Widget displayAppointmentList(List appointmentList) { - if (appointmentList.isNotEmpty) { + Widget displayAppointmentList(MihCalendarProvider mihCalendarProvider) { + if (mihCalendarProvider.businessAppointments!.isNotEmpty) { return Expanded( child: BuildAppointmentList( - appointmentList: appointmentList, - signedInUser: widget.signedInUser, - business: widget.business, - businessUser: widget.businessUser, - personalSelected: widget.personalSelected, inWaitingRoom: true, titleController: _appointmentTitleController, descriptionIDController: _appointmentDescriptionIDController, @@ -192,7 +173,7 @@ class _WaitingRoomState extends State { ), const SizedBox(height: 10), Text( - "No Appointments for $selectedDay", + "No Appointments for ${mihCalendarProvider.selectedDay}", textAlign: TextAlign.center, overflow: TextOverflow.visible, style: TextStyle( @@ -255,7 +236,8 @@ class _WaitingRoomState extends State { // ); } - void appointmentTypeSelection(double width) { + void appointmentTypeSelection( + 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."; @@ -325,7 +307,7 @@ class _WaitingRoomState extends State { MihButton( onPressed: () { Navigator.pop(context); - addAppointmentWindow(width); + addAppointmentWindow(mihCalendarProvider, width); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), @@ -347,7 +329,8 @@ class _WaitingRoomState extends State { ); } - void addAppointmentWindow(double width) { + void addAppointmentWindow( + MihCalendarProvider mihCalendarProvider, double width) { showDialog( context: context, barrierDismissible: false, @@ -428,7 +411,7 @@ class _WaitingRoomState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - addAppointmentCall(); + addAppointmentCall(mihCalendarProvider); } else { MihAlertServices().formNotFilledCompletely(context); } @@ -459,7 +442,8 @@ class _WaitingRoomState extends State { ); } - Future addAppointmentCall() async { + Future addAppointmentCall( + MihCalendarProvider mihCalendarProvider) async { if (isAppointmentInputValid()) { int statusCode; if (widget.personalSelected == false) { @@ -472,6 +456,7 @@ class _WaitingRoomState extends State { _appointmentDescriptionIDController.text, _appointmentDateController.text, _appointmentTimeController.text, + mihCalendarProvider, context, ); } else { @@ -481,6 +466,7 @@ class _WaitingRoomState extends State { _appointmentDescriptionIDController.text, _appointmentDateController.text, _appointmentTimeController.text, + mihCalendarProvider, context, ); } @@ -488,6 +474,7 @@ class _WaitingRoomState extends State { context.pop(); successPopUp("Successfully Added Appointment", "You appointment has been successfully added to your calendar."); + _loadInitialAppointments(); } else { internetConnectionPopUp(); } @@ -585,11 +572,24 @@ class _WaitingRoomState extends State { void checkforchange() { setState(() { - appointmentResults = MihMzansiCalendarApis.getBusinessAppointments( - widget.business!.business_id, - true, - selectedDay, - ); + isLoading = true; + }); + _loadInitialAppointments(); + } + + Future _loadInitialAppointments() async { + MzansiProfileProvider mzansiProfileProvider = + context.read(); + MihCalendarProvider mihCalendarProvider = + context.read(); + await MihMzansiCalendarApis.getBusinessAppointments( + mzansiProfileProvider.business!.business_id, + false, + mihCalendarProvider.selectedDay, + mihCalendarProvider, + ); + setState(() { + isLoading = false; }); } @@ -606,12 +606,8 @@ class _WaitingRoomState extends State { @override void initState() { selectedAppointmentDateController.addListener(checkforchange); - setState(() { - appointmentResults = MihMzansiCalendarApis.getBusinessAppointments( - widget.business!.business_id, - true, - selectedDay, - ); + WidgetsBinding.instance.addPostFrameCallback((_) { + _loadInitialAppointments(); }); super.initState(); } diff --git a/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart b/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart index d01785aa..3acbeeea 100644 --- a/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart +++ b/Frontend/lib/mih_services/mih_mzansi_calendar_services.dart @@ -8,6 +8,7 @@ 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'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.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_success_message.dart'; @@ -23,9 +24,10 @@ class MihMzansiCalendarApis { /// date (yyyy-mm-dd), /// /// Returns Future>. - static Future> getPersonalAppointments( + static Future getPersonalAppointments( String app_id, String date, + MihCalendarProvider mihCalendarProvider, ) async { final response = await http.get(Uri.parse( "${AppEnviroment.baseApiUrl}/appointments/personal/$app_id?date=$date")); @@ -33,7 +35,9 @@ class MihMzansiCalendarApis { Iterable l = jsonDecode(response.body); List personalAppointments = List.from(l.map((model) => Appointment.fromJson(model))); - return personalAppointments; + mihCalendarProvider.setPersonalAppointments( + appointments: personalAppointments); + return response.statusCode; } else { throw Exception('failed to fatch personal appointments'); } @@ -46,38 +50,21 @@ class MihMzansiCalendarApis { /// date (yyyy-mm-dd), /// /// Returns Future>. - static Future> getBusinessAppointments( + static Future getBusinessAppointments( String business_id, bool waitingRoom, String date, + MihCalendarProvider mihCalendarProvider, ) async { - //print("Patien manager page: $endpoint"); final response = await http.get(Uri.parse( "${AppEnviroment.baseApiUrl}/appointments/business/$business_id?date=$date")); - // print("Here"); - // print("Body: ${response.body}"); - // print("Code: ${response.statusCode}"); - // errorCode = response.statusCode.toString(); - // errorBody = response.body; - if (response.statusCode == 200) { - //print("Here1"); Iterable l = jsonDecode(response.body); - //print("Here2"); List businessAppointments = List.from(l.map((model) => Appointment.fromJson(model))); - //print("Here3"); - //print(patientQueue); - // if (waitingRoom == true) { - // businessAppointments = businessAppointments - // .where((element) => element.app_id != "") - // .toList(); - // } else { - // businessAppointments = businessAppointments - // .where((element) => element.app_id == "") - // .toList(); - // } - return businessAppointments; + mihCalendarProvider.setBusinessAppointments( + appointments: businessAppointments); + return response.statusCode; } else { throw Exception('failed to fatch business appointments'); } @@ -98,6 +85,7 @@ class MihMzansiCalendarApis { BusinessUser? businessUser, bool inWaitingRoom, int idappointments, + MihCalendarProvider mihCalendarProvider, BuildContext context, ) async { loadingPopUp(context); @@ -109,6 +97,19 @@ class MihMzansiCalendarApis { body: jsonEncode({"idappointments": idappointments}), ); context.pop(); + if (response.statusCode == 200) { + if (personalSelected == true) { + mihCalendarProvider.deletePersonalAppointment( + appointmentId: idappointments); + getPersonalAppointments(signedInUser.app_id, + mihCalendarProvider.selectedDay, mihCalendarProvider); + } else { + mihCalendarProvider.deleteBusinessAppointment( + appointmentId: idappointments); + getBusinessAppointments(business!.business_id, inWaitingRoom, + mihCalendarProvider.selectedDay, mihCalendarProvider); + } + } return response.statusCode; //print("Here4"); //print(response.statusCode); @@ -163,6 +164,7 @@ class MihMzansiCalendarApis { String description, String date, String time, + MihCalendarProvider mihCalendarProvider, BuildContext context, ) async { loadingPopUp(context); @@ -181,6 +183,18 @@ class MihMzansiCalendarApis { }), ); context.pop(); + if (response.statusCode == 201) { + mihCalendarProvider.addPersonalAppointment( + newAppointment: Appointment( + idappointments: 0, + app_id: signedInUser.app_id, + business_id: "", + date_time: "$date $time", + title: title, + description: description, + ), + ); + } return response.statusCode; // if (response.statusCode == 201) { // Navigator.pop(context); @@ -227,6 +241,7 @@ class MihMzansiCalendarApis { String description, String date, String time, + MihCalendarProvider mihCalendarProvider, BuildContext context, ) async { loadingPopUp(context); @@ -245,43 +260,19 @@ class MihMzansiCalendarApis { }), ); context.pop(); + if (response.statusCode == 201) { + mihCalendarProvider.addBusinessAppointment( + newAppointment: Appointment( + idappointments: 0, + app_id: "", + business_id: business.business_id, + date_time: "$date $time", + title: title, + description: description, + ), + ); + } return response.statusCode; - // if (response.statusCode == 201) { - // // Navigator.pop(context); - // Navigator.pop(context); - // Navigator.pop(context); - // Navigator.pop(context); - // String message = - // "Your appointment \"$title\" for the $date $title has been deleted."; - - // // Navigator.pop(context); - // if (inWaitingRoom) { - // Navigator.of(context).pushNamed( - // '/patient-manager', - // arguments: PatManagerArguments( - // signedInUser, - // false, - // business, - // businessUser, - // ), - // ); - // } else { - // Navigator.of(context).pushNamed( - // '/calendar', - // arguments: CalendarArguments( - // signedInUser, - // false, - // business, - // businessUser, - // ), - // ); - // } - - // successPopUp(message, context); - // } else { - // Navigator.pop(context); - // internetConnectionPopUp(context); - // } } /// This function is used to add an appointment to users mzansi Calendar. @@ -324,20 +315,6 @@ class MihMzansiCalendarApis { ); context.pop(); return response.statusCode; - // if (response.statusCode == 201) { - // MihNotificationApis.addNewAppointmentNotificationAPICall( - // patientAppId, - // personalSelected, - // date, - // time, - // businessArgs, - // context, - // ); - // // Navigator.pop(context); - // } else { - // Navigator.pop(context); - // internetConnectionPopUp(context); - // } } /// This function is used to update an appointment to users mzansi Calendar. @@ -362,6 +339,7 @@ class MihMzansiCalendarApis { String description, String date, String time, + MihCalendarProvider mihCalendarProvider, BuildContext context, ) async { loadingPopUp(context); @@ -379,6 +357,18 @@ class MihMzansiCalendarApis { }), ); context.pop(); + if (response.statusCode == 200) { + mihCalendarProvider.editPersonalAppointment( + updatedAppointment: Appointment( + idappointments: idappointments, + app_id: signedInUser.app_id, + business_id: "", + date_time: "$date $time", + title: title, + description: description, + ), + ); + } return response.statusCode; // if (response.statusCode == 200) { // Navigator.pop(context); @@ -426,6 +416,7 @@ class MihMzansiCalendarApis { String description, String date, String time, + MihCalendarProvider mihCalendarProvider, BuildContext context, ) async { loadingPopUp(context); @@ -443,6 +434,18 @@ class MihMzansiCalendarApis { }), ); context.pop(); + if (response.statusCode == 200) { + mihCalendarProvider.editBusinessAppointment( + updatedAppointment: Appointment( + idappointments: idappointments, + app_id: "", + business_id: business!.business_id, + date_time: "$date $time", + title: title, + description: description, + ), + ); + } return response.statusCode; // if (response.statusCode == 200) { // Navigator.pop(context);