From f5479da262c0a4826db5df81520272edc8cbf3d9 Mon Sep 17 00:00:00 2001 From: yaso-meth Date: Fri, 16 Aug 2024 11:56:45 +0200 Subject: [PATCH] add pop up to approve or decline a request. add api call to update request --- .../builders/buildAccessRequestList.dart | 211 +++++++++++++++++- 1 file changed, 201 insertions(+), 10 deletions(-) diff --git a/Frontend/patient_manager/lib/components/builders/buildAccessRequestList.dart b/Frontend/patient_manager/lib/components/builders/buildAccessRequestList.dart index 5a947e7e..4495bf6c 100644 --- a/Frontend/patient_manager/lib/components/builders/buildAccessRequestList.dart +++ b/Frontend/patient_manager/lib/components/builders/buildAccessRequestList.dart @@ -1,9 +1,14 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; -import 'package:patient_manager/components/popUpMessages/mihWarningMessage.dart'; +import 'package:patient_manager/components/inputsAndButtons/mihButton.dart'; +import 'package:patient_manager/components/popUpMessages/mihErrorMessage.dart'; +import 'package:patient_manager/components/popUpMessages/mihSuccessMessage.dart'; import 'package:patient_manager/env/env.dart'; import 'package:patient_manager/main.dart'; import 'package:patient_manager/objects/accessRequest.dart'; import 'package:patient_manager/objects/appUser.dart'; +import 'package:supertokens_flutter/http.dart' as http; class BuildAccessRequestList extends StatefulWidget { final List accessRequests; @@ -22,14 +27,76 @@ class BuildAccessRequestList extends StatefulWidget { class _BuildPatientsListState extends State { String baseAPI = AppEnviroment.baseApiUrl; + Future updateAccessAPICall(int index, String accessType) async { + var response = await http.put( + Uri.parse("$baseAPI/access-requests/update/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "business_id": widget.accessRequests[index].business_id, + "app_id": widget.accessRequests[index].app_id, + "date_time": widget.accessRequests[index].date_time, + "access": accessType, + }), + ); + if (response.statusCode == 200) { + //Navigator.of(context).pushNamed('/home'); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed( + '/patient-access-review', + arguments: widget.signedInUser, + ); + String message = ""; + if (accessType == "approved") { + message = + "You've successfully approved the access request! ${widget.accessRequests[index].Name} now has access to your profile until ${widget.accessRequests[index].revoke_date.substring(0, 16).replaceAll("T", " ")}."; + } else { + message = + "You've declined the access request. ${widget.accessRequests[index].Name} will not have access to your profile."; + } + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + Widget displayQueue(int index) { String title = - "Appointment: ${widget.accessRequests[index].date_time.substring(0, 10)}"; + "Appointment: ${widget.accessRequests[index].date_time.substring(0, 16).replaceAll("T", " ")}"; String subtitle = ""; subtitle += "Requestor: ${widget.accessRequests[index].Name}\n"; - subtitle += "Business Type: ${widget.accessRequests[index].type}\n"; - subtitle += "Access: ${widget.accessRequests[index].access.toUpperCase()}"; - + //subtitle += "Business Type: ${widget.accessRequests[index].type}\n"; + subtitle += + "Access: ${widget.accessRequests[index].access.toUpperCase()}\n"; + if (widget.accessRequests[index].revoke_date.contains("9999")) { + subtitle += "Access Expiration date: NOT SET"; + } else { + subtitle += + "Access Expiration date: ${widget.accessRequests[index].revoke_date.substring(0, 10)}"; + } return ListTile( title: Text( title, @@ -44,7 +111,7 @@ class _BuildPatientsListState extends State { ), ), onTap: () { - //popup to approve + viewApprovalPopUp(index); }, trailing: Icon( Icons.arrow_forward, @@ -53,12 +120,136 @@ class _BuildPatientsListState extends State { ); } - void noAccessWarning() { + void viewApprovalPopUp(int index) { + String subtitle = + "Appointment: ${widget.accessRequests[index].date_time.substring(0, 16).replaceAll("T", " ")}\n"; + subtitle += "Requestor: ${widget.accessRequests[index].Name}\n"; + subtitle += "Business Type: ${widget.accessRequests[index].type}\n\n"; + // subtitle += "Access: ${widget.accessRequests[index].access.toUpperCase()}"; + // if (widget.accessRequests[index].revoke_date.contains("9999")) { + // subtitle += "Access Expiration date: NOT SET\n\n"; + // } else { + // subtitle += + // "Access Expiration date: ${widget.accessRequests[index].revoke_date.substring(0, 10)}\n\n"; + // } + subtitle += + "You are about to approve an access request to your patient profile.\nPlease be aware that once approved, ${widget.accessRequests[index].Name} will have access to your profile information until ${widget.accessRequests[index].revoke_date.substring(0, 16).replaceAll("T", " ")}.\nIf you are unsure about an upcoming appointment with ${widget.accessRequests[index].Name}, please contact ${widget.accessRequests[index].contact_no} for clarification before approving this request.\n"; showDialog( context: context, - builder: (context) { - return const MIHWarningMessage(warningType: "No Access"); - }, + barrierDismissible: false, + builder: (context) => Dialog( + child: Stack( + children: [ + Container( + //padding: const EdgeInsets.all(15.0), + width: 800.0, + //height: 475.0, + decoration: BoxDecoration( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + borderRadius: BorderRadius.circular(25.0), + border: Border.all( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + width: 5.0), + ), + child: SingleChildScrollView( + padding: const EdgeInsets.all(15.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox( + height: 25, + ), + Text( + "Update Appointment Access", + textAlign: TextAlign.center, + style: TextStyle( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + fontSize: 35.0, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25.0), + SizedBox( + width: 600, + child: Text( + subtitle, + textAlign: TextAlign.left, + style: TextStyle( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + fontSize: 20.0, + //fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(height: 25.0), + Wrap( + runSpacing: 10, + spacing: 10, + children: [ + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + updateAccessAPICall(index, "declined"); + }, + buttonText: "Decline", + buttonColor: MzanziInnovationHub.of(context)! + .theme + .errorColor(), + textColor: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + updateAccessAPICall(index, "approved"); + }, + buttonText: "Approve", + buttonColor: MzanziInnovationHub.of(context)! + .theme + .successColor(), + textColor: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + ], + ) + ], + ), + ), + ), + Positioned( + top: 5, + right: 5, + width: 50, + height: 50, + child: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.close, + color: MzanziInnovationHub.of(context)!.theme.errorColor(), + size: 35, + ), + ), + ), + ], + ), + ), ); }