import 'dart:convert'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/notification.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:flutter/material.dart'; import 'package:supertokens_flutter/http.dart' as http; class MihNotificationApis { final baseAPI = AppEnviroment.baseApiUrl; //================== Notifications ========================================================================== Future> getNotificationByUser( String app_id, int notificationAmount, ) async { var responseNotification = await http.get( Uri.parse("$baseAPI/notifications/$app_id?amount=$notificationAmount")); if (responseNotification.statusCode == 200) { String body = responseNotification.body; Iterable l = jsonDecode(body); List notifications = List.from( l.map((model) => MIHNotification.fromJson(model))); return notifications; } else { return []; } } /// This function is used to create notification to patient for access reviews /// /// Patameters:- /// String app_id, /// String business_name, /// BuildContext context, /// /// Returns void. (ON SUCCESS 201 , NAVIGATE TO /patient-manager) static Future addAccessRequestNotificationAPICall( String app_id, String business_name, bool personalSelected, BusinessArguments args, BuildContext context, ) async { var response = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/notifications/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": app_id, "notification_type": "Forever Access Request", "notification_message": "A new Forever Access Request has been sent by $business_name in order to access your Patient Profile. Please review request.", "action_path": "/mih-access", }), ); if (response.statusCode == 201) { String message = "A request has been sent to the patient advising that you have requested access to their profile. Only once access has been granted will you be able to book an appointment."; Navigator.of(context).pop(); context.goNamed( 'patientManager', extra: PatManagerArguments( args.signedInUser, personalSelected, args.business, args.businessUser, ), ); successPopUp(message, context); } else { internetConnectionPopUp(context); } } /// This function is used to create notification to patient for access reviews /// /// Patameters:- /// String app_id, /// String business_name, /// BuildContext context, /// /// Returns void. (ON SUCCESS 201 , NAVIGATE TO /patient-manager) static Future reapplyAccessRequestNotificationAPICall( String app_id, bool personalSelected, BusinessArguments args, BuildContext context, ) async { var response = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/notifications/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": app_id, "notification_type": "Re-applying for Access", "notification_message": "${args.business!.Name} is re-applying for access to your Patient Profile. Please review request.", "action_path": "/mih-access", }), ); if (response.statusCode == 201) { String message = "A request has been sent to the patient advising that you have re-applied for access to their profile. Only once access has been granted will you be able to book an appointment."; Navigator.of(context).pop(); context.goNamed( 'patientManager', extra: PatManagerArguments( args.signedInUser, personalSelected, args.business, args.businessUser, ), ); // Navigator.of(context).pop(); // Navigator.of(context).pushNamed( // '/patient-manager', // arguments: PatManagerArguments( // args.signedInUser, // personalSelected, // args.business, // args.businessUser, // ), // ); successPopUp(message, context); } else { internetConnectionPopUp(context); } } /// This function is used to create notification to patient for access reviews /// /// Patameters:- /// String app_id, /// String business_name, /// String origDate_time, /// String date, /// String time, /// BusinessArguments args, /// BuildContext context, /// /// Returns void. (ON SUCCESS 201 , NAVIGATE TO /patient-manager) static Future addRescheduledAppointmentNotificationAPICall( String app_id, bool personalSelected, String business_name, String origDate_time, String date, String time, BusinessArguments args, BuildContext context, ) async { var response = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/notifications/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": app_id, "notification_type": "Appointment Rescheduled", "notification_message": "Your appointment with $business_name for the ${origDate_time.replaceAll("T", " ").substring(0, origDate_time.length - 3)} has been rescheduled to the ${date} ${time}.", "action_path": "/appointments", }), ); if (response.statusCode == 201) { Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pushNamed( '/patient-manager', arguments: PatManagerArguments( args.signedInUser, personalSelected, args.business, args.businessUser, ), ); String message = "The appointment has been successfully rescheduled."; successPopUp(message, context); } else { internetConnectionPopUp(context); } } /// This function is used to create notification to patient for access reviews /// /// Patameters:- /// String app_id, /// String business_name, /// String origDate_time, /// String date, /// String time, /// BusinessArguments args, /// BuildContext context, /// /// Returns void. (ON SUCCESS 201 , NAVIGATE TO /patient-manager) static Future addCancelledAppointmentNotificationAPICall( String app_id, bool personalSelected, String date_time, BusinessArguments args, BuildContext context, ) async { var response = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/notifications/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": app_id, "notification_type": "Appointment Cancelled", "notification_message": "Your appointment with ${args.business!.Name} for the ${date_time.replaceAll("T", " ")} has been cancelled.", "action_path": "/appointments", }), ); if (response.statusCode == 201) { Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pushNamed( '/patient-manager', arguments: PatManagerArguments( args.signedInUser, personalSelected, args.business, args.businessUser, ), ); String message = "The appointment has been cancelled successfully. This means it will no longer be visible in your waiting room and calender."; successPopUp(message, context); } else { internetConnectionPopUp(context); } } /// This function is used to create notification to patient for access reviews /// /// Patameters:- /// String app_id, /// String business_name, /// String origDate_time, /// String date, /// String time, /// BusinessArguments args, /// BuildContext context, /// /// Returns void. (ON SUCCESS 201 , NAVIGATE TO /patient-manager) static Future addNewAppointmentNotificationAPICall( String app_id, bool personalSelected, String date, String time, BusinessArguments args, BuildContext context, ) async { var response = await http.post( Uri.parse("${AppEnviroment.baseApiUrl}/notifications/insert/"), headers: { "Content-Type": "application/json; charset=UTF-8" }, body: jsonEncode({ "app_id": app_id, "notification_type": "New Appointment Booked", "notification_message": "An appointment with ${args.business!.Name} has been booked for the $date $time.", "action_path": "/appointments", }), ); if (response.statusCode == 201) { Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pushNamed( '/patient-manager', arguments: PatManagerArguments( args.signedInUser, personalSelected, args.business, args.businessUser, ), ); String message = "The appointment was been created successfully. This means it will now be visible in your waiting room and calender."; successPopUp(message, context); } else { internetConnectionPopUp(context); } } //================== POP UPS ========================================================================== static void internetConnectionPopUp(BuildContext context) { showDialog( context: context, builder: (context) { return const MIHErrorMessage( errorType: "Internet Connection", ); }, ); } static void successPopUp(String message, BuildContext context) { showDialog( context: context, builder: (context) { return MIHSuccessMessage( successType: "Success", successMessage: message, ); }, ); } }