From f548db7d82015d0a36799b4b6828cc15c2353ef8 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 27 Oct 2025 18:46:20 +0200 Subject: [PATCH] NEW: Patient Manager Provider Setup pt1 --- Frontend/lib/main.dart | 4 + .../patient_manager_provider.dart | 21 + Frontend/lib/mih_config/mih_go_router.dart | 50 +- .../pat_profile/add_or_view_patient.dart | 79 -- .../mih_edit_patient_details_window.dart} | 350 +++---- .../list_builders/build_files_list.dart | 415 ++++---- .../list_builders/build_notes_list.dart | 382 ++++---- .../package_tiles/patient_profile_tile.dart | 1 - .../package_tools/patient_consultation.dart | 197 ++-- .../package_tools/patient_documents.dart | 301 +++--- .../package_tools/patient_info.dart | 254 ++--- .../package_tools/patient_setup_form.dart | 543 +++++++++++ .../pat_profile/patient_edit.dart | 903 ------------------ .../pat_profile/patient_profile.dart | 135 ++- .../pat_profile/patient_set_up.dart | 72 ++ Frontend/lib/mih_packages/test/test.dart | 68 -- .../mih_services/mih_patient_services.dart | 194 +++- .../lib/mih_services/mih_service_calls.dart | 17 +- 18 files changed, 1784 insertions(+), 2202 deletions(-) delete mode 100644 Frontend/lib/mih_packages/patient_manager/pat_profile/add_or_view_patient.dart rename Frontend/lib/mih_packages/patient_manager/pat_profile/{patient_add.dart => components/mih_edit_patient_details_window.dart} (76%) create mode 100644 Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_setup_form.dart delete mode 100644 Frontend/lib/mih_packages/patient_manager/pat_profile/patient_edit.dart create mode 100644 Frontend/lib/mih_packages/patient_manager/pat_profile/patient_set_up.dart delete mode 100644 Frontend/lib/mih_packages/test/test.dart diff --git a/Frontend/lib/main.dart b/Frontend/lib/main.dart index 3569ecb1..783a11a3 100644 --- a/Frontend/lib/main.dart +++ b/Frontend/lib/main.dart @@ -11,6 +11,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_ai_pro import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:provider/provider.dart'; import 'package:upgrader/upgrader.dart'; @@ -113,6 +114,9 @@ class _MzansiInnovationHubState extends State { ChangeNotifierProvider( create: (context) => MihMineSweeperProvider(), ), + ChangeNotifierProvider( + create: (context) => PatientManagerProvider(), + ), ], child: MaterialApp.router( title: getTitle(), diff --git a/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart b/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart index cbddf3e1..a0d10806 100644 --- a/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/patient_manager_provider.dart @@ -1,15 +1,21 @@ import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; class PatientManagerProvider extends ChangeNotifier { int patientProfileIndex; int patientManagerIndex; + int fileViewerIndex; bool personalMode; Patient? selectedPatient; + List? consultationNotes; + List? patientDocuments; PatientManagerProvider({ this.patientProfileIndex = 0, this.patientManagerIndex = 0, + this.fileViewerIndex = 0, this.personalMode = true, }); @@ -30,6 +36,11 @@ class PatientManagerProvider extends ChangeNotifier { notifyListeners(); } + void setFileViewerIndex(int index) { + patientProfileIndex = index; + notifyListeners(); + } + void setPersonalMode(bool personalMode) { this.personalMode = personalMode; notifyListeners(); @@ -39,4 +50,14 @@ class PatientManagerProvider extends ChangeNotifier { this.selectedPatient = selectedPatient; notifyListeners(); } + + void setConsultationNotes({required List? consultationNotes}) { + this.consultationNotes = consultationNotes ?? []; + notifyListeners(); + } + + void setPatientDocuments({required List? patientDocuments}) { + this.patientDocuments = patientDocuments ?? []; + notifyListeners(); + } } diff --git a/Frontend/lib/mih_config/mih_go_router.dart b/Frontend/lib/mih_config/mih_go_router.dart index 430304b8..9dae1781 100644 --- a/Frontend/lib/mih_config/mih_go_router.dart +++ b/Frontend/lib/mih_config/mih_go_router.dart @@ -26,10 +26,9 @@ 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_manager/pat_manager/pat_manager.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/add_or_view_patient.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/components/full_screen_file.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/patient_edit.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/patient_profile.dart'; +import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/patient_set_up.dart'; import 'package:provider/provider.dart'; import 'package:supertokens_flutter/supertokens.dart'; @@ -53,7 +52,6 @@ class MihGoRouterPaths { static const String businessProfileView = '/business-profile/view'; static const String patientProfile = '/patient-profile'; static const String patientProfileSetup = '/patient-profile/set-up'; - static const String patientProfileEdit = '/patient-profile/edit'; static const String mzansiWallet = '/mzansi-wallet'; static const String mzansiDirectory = '/mzansi-directory'; static const String mihAccess = '/mih-access'; @@ -66,7 +64,7 @@ class MihGoRouterPaths { static const String barcodeScanner = '/scanner'; static const String calculator = '/calculator'; static const String mzansiAi = '/mzansi-ai'; - static const String mihMineSweeper = '/mih-mine-sweeper'; + static const String mihMineSweeper = '/mih-minesweeper'; static const String packageDevTest = '/package-dev'; } @@ -274,7 +272,7 @@ class MihGoRouter { path: MihGoRouterPaths.mzansiWallet, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mzansiWallet"); - if (context.watch().business == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); @@ -322,7 +320,7 @@ class MihGoRouter { name: "mihAccess", path: MihGoRouterPaths.mihAccess, builder: (BuildContext context, GoRouterState state) { - if (context.watch().business == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); @@ -338,36 +336,27 @@ class MihGoRouter { name: "patientProfile", path: MihGoRouterPaths.patientProfile, builder: (BuildContext context, GoRouterState state) { - final PatientViewArguments? args = - state.extra as PatientViewArguments?; - if (args == null) { + final String? argPatientAppId = state.extra as String?; + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return AddOrViewPatient( - key: UniqueKey(), - arguments: args, - ); + return PatientProfile(patientAppId: argPatientAppId); }, ), GoRoute( - name: "patientProfileEdit", - path: MihGoRouterPaths.patientProfileEdit, + name: "patientProfileSetup", + path: MihGoRouterPaths.patientProfileSetup, builder: (BuildContext context, GoRouterState state) { - final PatientEditArguments? args = - state.extra as PatientEditArguments?; - if (args == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return EditPatient( - signedInUser: args.signedInUser, - selectedPatient: args.selectedPatient, - ); + return PatientSetUp(); }, ), GoRoute( @@ -391,15 +380,14 @@ class MihGoRouter { name: "patientManagerPatient", path: MihGoRouterPaths.patientManagerPatient, builder: (BuildContext context, GoRouterState state) { - final PatientViewArguments? args = - state.extra as PatientViewArguments?; - if (args == null) { + final String? argPatientAppId = state.extra as String?; + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return PatientProfile(arguments: args); + return PatientProfile(patientAppId: argPatientAppId); }, ), // ========================== Mzansi Directory ================================== @@ -407,7 +395,7 @@ class MihGoRouter { name: "mzansiDirectory", path: MihGoRouterPaths.mzansiDirectory, builder: (BuildContext context, GoRouterState state) { - if (context.watch().business == null) { + if (context.watch().user == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); @@ -436,10 +424,16 @@ class MihGoRouter { ), // ========================== MIH Calculator ================================== GoRoute( - name: "mihMineSweeper", + name: "mihMinesweeper", path: MihGoRouterPaths.mihMineSweeper, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mihMineSweeper"); + if (context.watch().user == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.go(MihGoRouterPaths.mihHome); + }); + return const SizedBox.shrink(); + } return MihMineSweeper(); }, ), diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/add_or_view_patient.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/add_or_view_patient.dart deleted file mode 100644 index 841ca9f3..00000000 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/add_or_view_patient.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; -import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/patient_add.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/patient_profile.dart'; -import 'package:flutter/material.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; - -class AddOrViewPatient extends StatefulWidget { - //final AppUser signedInUser; - final PatientViewArguments arguments; - const AddOrViewPatient({ - super.key, - required this.arguments, - }); - - @override - State createState() => _AddOrViewPatientState(); -} - -class _AddOrViewPatientState extends State { - late double width; - late double height; - late Widget loading; - late Future patient; - - Future fetchPatientData() async { - return await MihPatientServices() - .getPatientDetails(widget.arguments.signedInUser.app_id); - } - - @override - void initState() { - super.initState(); - patient = fetchPatientData(); - } - - @override - Widget build(BuildContext context) { - print("AddOrViewPatient"); - var size = MediaQuery.of(context).size; - setState(() { - width = size.width; - height = size.height; - }); - return FutureBuilder( - future: patient, - builder: (ctx, snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - // Extracting data from snapshot object - //final data = snapshot.data as String; - return PatientProfile( - arguments: PatientViewArguments( - widget.arguments.signedInUser, - snapshot.requireData, - null, - null, - widget.arguments.type, - )); - } else if (snapshot.connectionState == ConnectionState.waiting) { - loading = Container( - width: width, - height: height, - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - child: const Mihloadingcircle(), - ); - - return loading; - } else { - return AddPatient(signedInUser: widget.arguments.signedInUser); - } - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_add.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/components/mih_edit_patient_details_window.dart similarity index 76% rename from Frontend/lib/mih_packages/patient_manager/pat_profile/patient_add.dart rename to Frontend/lib/mih_packages/patient_manager/pat_profile/components/mih_edit_patient_details_window.dart index 3863c927..87defc63 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_add.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/components/mih_edit_patient_details_window.dart @@ -1,39 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.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_button.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_action.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_body.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_header.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_layout_builder.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.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/arguments.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; -class AddPatient extends StatefulWidget { - final AppUser signedInUser; - - const AddPatient({ - super.key, - required this.signedInUser, - }); +class MihEditPatientDetailsWindow extends StatefulWidget { + const MihEditPatientDetailsWindow({super.key}); @override - State createState() => _AddPatientState(); + State createState() => + _MihEditPatientDetailsWindowState(); } -class _AddPatientState extends State { - final idController = TextEditingController(); +class _MihEditPatientDetailsWindowState + extends State { + var idController = TextEditingController(); final fnameController = TextEditingController(); final lnameController = TextEditingController(); final cellController = TextEditingController(); @@ -45,51 +37,16 @@ class _AddPatientState extends State { final medAidController = TextEditingController(); final medMainMemController = TextEditingController(); final medAidCodeController = TextEditingController(); - - late bool medAidPosition; - late bool medMainMemberPosition; - final baseAPI = AppEnviroment.baseApiUrl; - late int futureDocOfficeId; - //late bool medRequired; - final ValueNotifier medRequired = ValueNotifier(false); final FocusNode _focusNode = FocusNode(); final _formKey = GlobalKey(); + late bool medAidPosition; + late bool medMainMemberPosition; + final ValueNotifier medRequired = ValueNotifier(false); - bool isFieldsFilled() { - if (medRequired.value) { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - medNoController.text.isEmpty || - medNameController.text.isEmpty || - medSchemeController.text.isEmpty || - addressController.text.isEmpty || - medAidController.text.isEmpty || - medMainMemController.text.isEmpty || - medAidCodeController.text.isEmpty) { - return false; - } else { - return true; - } - } else { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - addressController.text.isEmpty || - medAidController.text.isEmpty) { - return false; - } else { - return true; - } - } - } - - Future addPatientService() async { - int statusCode = await MihPatientServices().addPatientService( + Future updatePatientApiCall( + PatientManagerProvider patientManagerProvider) async { + var statusCode = await MihPatientServices().updatePatientService( + patientManagerProvider.selectedPatient!.app_id, idController.text, fnameController.text, lnameController.text, @@ -102,14 +59,19 @@ class _AddPatientState extends State { medNameController.text, medSchemeController.text, addressController.text, - widget.signedInUser, + patientManagerProvider, ); - if (statusCode == 201) { - String message = - "${fnameController.text} ${lnameController.text} patient profile has been successfully added!\n"; - successPopUp("Successfully created Patient Profile", message); + if (statusCode == 200) { + successPopUp( + "Successfully Updated Profile!", + "${fnameController.text} ${lnameController.text}'s information has been updated successfully! Their medical records and details are now current.", + ); } else { - internetConnectionPopUp(); + MihAlertServices().errorAlert( + "Error Updating Profile", + "There was an error updating your profile. Please try again later.", + context, + ); } } @@ -140,17 +102,18 @@ class _AddPatientState extends State { Center( child: MihButton( onPressed: () { + // context.goNamed( + // "patientProfile", + // extra: PatientViewArguments( + // widget.signedInUser, + // widget.selectedPatient, + // null, + // null, + // "personal", + // ), + // ); + context.pop(); context.pop(); - context.goNamed( - 'patientProfile', - extra: PatientViewArguments( - widget.signedInUser, - null, - null, - null, - "personal", - ), - ); }, buttonColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), @@ -173,45 +136,21 @@ class _AddPatientState extends State { alertColour: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ); + // return MIHSuccessMessage( + // successType: "Success", + // successMessage: message, + // ); }, ); } - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void messagePopUp(error) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(error), - ); - }, - ); - } - - void isRequired() { - //print("listerner triggered"); - if (medAidController.text == "Yes") { - medRequired.value = true; - } else { - medRequired.value = false; - } - } - - Widget displayForm(double width) { + Widget displayForm( + PatientManagerProvider patientManagerProvider, double width) { return SingleChildScrollView( child: Padding( padding: MzansiInnovationHub.of(context)!.theme.screenType == "desktop" - ? EdgeInsets.symmetric(horizontal: width * 0.2) - : EdgeInsets.symmetric(horizontal: width * 0.075), + ? EdgeInsets.symmetric(horizontal: width * 0.05) + : const EdgeInsets.symmetric(horizontal: 0), child: Column( children: [ MihForm( @@ -485,7 +424,7 @@ class _AddPatientState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - submitForm(); + updatePatientApiCall(patientManagerProvider); } else { MihAlertServices().formNotFilledCompletely(context); } @@ -494,7 +433,7 @@ class _AddPatientState extends State { MzansiInnovationHub.of(context)!.theme.mode == "Dark"), width: 300, child: Text( - "Add", + "Update", style: TextStyle( color: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == @@ -514,60 +453,12 @@ class _AddPatientState extends State { ); } - void submitForm() { - addPatientService(); - } - - MIHAction getActionButton() { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - context.goNamed( - 'mihHome', - extra: true, - ); - FocusScope.of(context).unfocus(); - }, - ); - } - - MIHHeader getHeader() { - return const MIHHeader( - headerAlignment: MainAxisAlignment.center, - headerItems: [ - Text( - "Set Up Patient Profile", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - ], - ); - } - - MIHBody getBody(double width) { - return MIHBody( - borderOn: false, - bodyItems: [ - KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - if (_formKey.currentState!.validate()) { - submitForm(); - } else { - MihAlertServices().formNotFilledCompletely(context); - } - } - }, - child: displayForm(width), - ), - ], - ); + void isRequired() { + if (medAidController.text == "Yes") { + medRequired.value = true; + } else if (medAidController.text == "No") { + medRequired.value = false; + } else {} } @override @@ -583,9 +474,9 @@ class _AddPatientState extends State { addressController.dispose(); medAidController.dispose(); medAidCodeController.removeListener(isRequired); - medRequired.dispose(); medMainMemController.dispose(); medAidCodeController.dispose(); + medRequired.dispose(); _focusNode.dispose(); super.dispose(); } @@ -593,67 +484,76 @@ class _AddPatientState extends State { @override void initState() { medAidController.addListener(isRequired); + PatientManagerProvider patientManagerProvider = + context.read(); setState(() { - fnameController.text = widget.signedInUser.fname; - lnameController.text = widget.signedInUser.lname; - emailController.text = widget.signedInUser.email; - medAidPosition = false; - medMainMemberPosition = false; - medAidController.text = "No"; - medMainMemController.text = "No"; + idController.text = patientManagerProvider.selectedPatient!.id_no; + fnameController.text = patientManagerProvider.selectedPatient!.first_name; + lnameController.text = patientManagerProvider.selectedPatient!.last_name; + cellController.text = patientManagerProvider.selectedPatient!.cell_no; + emailController.text = patientManagerProvider.selectedPatient!.email; + medNameController.text = + patientManagerProvider.selectedPatient!.medical_aid_name; + medNoController.text = + patientManagerProvider.selectedPatient!.medical_aid_no; + medSchemeController.text = + patientManagerProvider.selectedPatient!.medical_aid_scheme; + addressController.text = patientManagerProvider.selectedPatient!.address; + medAidController.text = + patientManagerProvider.selectedPatient!.medical_aid; + medMainMemController.text = + patientManagerProvider.selectedPatient!.medical_aid_main_member; + medAidCodeController.text = + patientManagerProvider.selectedPatient!.medical_aid_code; }); + if (medAidController.text == "Yes") { + medAidPosition = true; + } else { + medAidPosition = false; + medAidController.text = "No"; + } + if (medMainMemController.text == "Yes") { + medMainMemberPosition = true; + } else { + medMainMemberPosition = false; + medMainMemController.text = "No"; + } super.initState(); } @override Widget build(BuildContext context) { - double screenWidth = MediaQuery.of(context).size.width; - return MIHLayoutBuilder( - actionButton: getActionButton(), - header: getHeader(), - secondaryActionButton: null, - body: getBody(screenWidth), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, + var size = MediaQuery.of(context).size; + return MihPackageWindow( + fullscreen: false, + windowTitle: "Edit Patient Details", + onWindowTapClose: () { + context.pop(); + }, + windowBody: getBody(size.width), + ); + } + + Widget getBody(double width) { + return Consumer( + builder: (BuildContext context, + PatientManagerProvider patientManagerProvider, Widget? child) { + return KeyboardListener( + focusNode: _focusNode, + autofocus: true, + onKeyEvent: (event) async { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { + if (_formKey.currentState!.validate()) { + updatePatientApiCall(patientManagerProvider); + } else { + MihAlertServices().formNotFilledCompletely(context); + } + } + }, + child: displayForm(patientManagerProvider, width), + ); + }, ); - // return Scaffold( - // // appBar: const MIHAppBar( - // // barTitle: "Add Patient", - // // propicFile: null, - // // ), - // //drawer: MIHAppDrawer(signedInUser: widget.signedInUser), - // body: SafeArea( - // child: Stack( - // children: [ - // KeyboardListener( - // focusNode: _focusNode, - // autofocus: true, - // onKeyEvent: (event) async { - // if (event is KeyDownEvent && - // event.logicalKey == LogicalKeyboardKey.enter) { - // submitForm(); - // } - // }, - // child: displayForm(), - // ), - // Positioned( - // top: 10, - // left: 5, - // width: 50, - // height: 50, - // child: IconButton( - // onPressed: () { - // Navigator.of(context).pop(); - // }, - // icon: const Icon(Icons.arrow_back), - // ), - // ) - // ], - // ), - // ), - // ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_files_list.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_files_list.dart index e825d002..a7b38555 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_files_list.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_files_list.dart @@ -1,48 +1,30 @@ import 'dart:async'; -import 'dart:convert'; import 'package:fl_downloader/fl_downloader.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_icons.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; -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_components/mih_pop_up_messages/mih_loading_circle.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:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/list_builders/build_file_view.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:supertokens_flutter/http.dart' as http; import 'package:http/http.dart' as http2; import "package:universal_html/html.dart" as html; class BuildFilesList extends StatefulWidget { - final AppUser signedInUser; - final List files; - final Patient selectedPatient; - final Business? business; - final BusinessUser? businessUser; - final String type; - final String env; const BuildFilesList({ super.key, - required this.files, - required this.signedInUser, - required this.selectedPatient, - required this.business, - required this.businessUser, - required this.type, - required this.env, }); @override @@ -68,71 +50,72 @@ class _BuildFilesListState extends State { return teporaryFileUrl; } - Future deleteFileApiCall(String filePath, int fileID) async { - var response = await MihFileApi.deleteFile( - widget.selectedPatient.app_id, - widget.env, - "patient_files", - filePath.split("/").last, - context, - ); - if (response == 200) { - // delete file from database - await deletePatientFileLocationToDB(fileID); - } else { - String message = - "The File has not been deleted successfully. Please try again."; - successPopUp(message); - } - } + // Future deleteFileApiCall(PatientManagerProvider patientManagerProvider, + // String filePath, int fileID) async { + // var response = await MihFileApi.deleteFile( + // patientManagerProvider.selectedPatient!.app_id, + // widget.env, + // "patient_files", + // filePath.split("/").last, + // context, + // ); + // if (response == 200) { + // // delete file from database + // await deletePatientFileLocationToDB(fileID); + // } else { + // String message = + // "The File has not been deleted successfully. Please try again."; + // successPopUp(message); + // } + // } - Future deletePatientFileLocationToDB(int fileID) async { - showDialog( - context: context, - builder: (context) { - return const Mihloadingcircle(); - }, - ); - var response2 = await http.delete( - Uri.parse("$baseAPI/patient_files/delete/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "idpatient_files": fileID, - "env": widget.env, - }), - ); - if (response2.statusCode == 200) { - context.pop(); //Remove Loading Dialog - context.pop(); //Remove Delete Dialog - context.pop(); //Remove File View Dialog - context.pop(); //Remove File List Dialog - //print(widget.business); - if (widget.business == null) { - context.pushNamed('patientManagerPatient', - extra: PatientViewArguments( - widget.signedInUser, - widget.selectedPatient, - widget.businessUser, - widget.business, - "personal")); - } else { - context.pushNamed('patientManagerPatient', - extra: PatientViewArguments( - widget.signedInUser, - widget.selectedPatient, - widget.businessUser, - widget.business, - "business")); - } - String message = - "The File has been deleted successfully. This means it will no longer be visible on your and cannot be used for future appointments."; - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } + // Future deletePatientFileLocationToDB(int fileID) async { + // showDialog( + // context: context, + // builder: (context) { + // return const Mihloadingcircle(); + // }, + // ); + // var response2 = await http.delete( + // Uri.parse("$baseAPI/patient_files/delete/"), + // headers: { + // "Content-Type": "application/json; charset=UTF-8" + // }, + // body: jsonEncode({ + // "idpatient_files": fileID, + // "env": widget.env, + // }), + // ); + // if (response2.statusCode == 200) { + // context.pop(); //Remove Loading Dialog + // context.pop(); //Remove Delete Dialog + // context.pop(); //Remove File View Dialog + // context.pop(); //Remove File List Dialog + // //print(widget.business); + // if (widget.business == null) { + // context.pushNamed('patientManagerPatient', + // extra: PatientViewArguments( + // widget.signedInUser, + // widget.selectedPatient, + // widget.businessUser, + // widget.business, + // "personal")); + // } else { + // context.pushNamed('patientManagerPatient', + // extra: PatientViewArguments( + // widget.signedInUser, + // widget.selectedPatient, + // widget.businessUser, + // widget.business, + // "business")); + // } + // String message = + // "The File has been deleted successfully. This means it will no longer be visible on your and cannot be used for future appointments."; + // successPopUp(message); + // } else { + // internetConnectionPopUp(); + // } + // } void internetConnectionPopUp() { showDialog( @@ -155,18 +138,18 @@ class _BuildFilesListState extends State { ); } - void deleteFilePopUp(String filePath, int fileID) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHDeleteMessage( - deleteType: "File", - onTap: () async { - await deleteFileApiCall(filePath, fileID); - }, - ), - ); - } + // void deleteFilePopUp(String filePath, int fileID) { + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (context) => MIHDeleteMessage( + // deleteType: "File", + // onTap: () async { + // await deleteFileApiCall(filePath, fileID); + // }, + // ), + // ); + // } String getFileName(String path) { //print(pdfLink.split(".")[1]); @@ -202,9 +185,10 @@ class _BuildFilesListState extends State { } } - void viewFilePopUp(String fileName, String filePath, int fileID, String url) { + void viewFilePopUp(PatientManagerProvider patientManagerProvider, + String fileName, String filePath, int fileID, String url) { bool hasAccessToDelete = false; - if (widget.type == "business") { + if (!patientManagerProvider.personalMode) { hasAccessToDelete = true; } @@ -307,7 +291,7 @@ class _BuildFilesListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - deleteFilePopUp(filePath, fileID); + // deleteFilePopUp(filePath, fileID); }, ), ); @@ -368,133 +352,138 @@ class _BuildFilesListState extends State { @override Widget build(BuildContext context) { - if (widget.files.isNotEmpty) { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (BuildContext context, int index) { - return Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ); - }, - itemCount: widget.files.length, - itemBuilder: (context, index) { - return ListTile( - title: Text( - widget.files[index].file_name, - style: TextStyle( + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + if (patientManagerProvider.patientDocuments!.isNotEmpty) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, int index) { + return Divider( color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ), - subtitle: Text( - widget.files[index].insert_date, - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ), - // trailing: Icon( - // Icons.arrow_forward, - // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - // ), - onTap: () async { - await getFileUrlApiCall(widget.files[index].file_path) - .then((urlHere) { - //print(url); - setState(() { - fileUrl = urlHere; - }); - }); - - viewFilePopUp( - widget.files[index].file_name, - widget.files[index].file_path, - widget.files[index].idpatient_files, - fileUrl); + ); }, - ); - }, - ); - } else { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - // crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox(height: 50), - Stack( - alignment: AlignmentDirectional.center, - children: [ - Icon( - MihIcons.mihRing, - size: 165, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - Icon( - Icons.file_present, - size: 110, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ], - ), - const SizedBox(height: 10), - Text( - "No Documents have been added to this profile.", - textAlign: TextAlign.center, - overflow: TextOverflow.visible, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ), - const SizedBox(height: 25), - Center( - child: RichText( - textAlign: TextAlign.center, - text: TextSpan( + itemCount: patientManagerProvider.patientDocuments!.length, + itemBuilder: (context, index) { + return ListTile( + title: Text( + patientManagerProvider.patientDocuments![index].file_name, style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.normal, color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), + ), + subtitle: Text( + patientManagerProvider.patientDocuments![index].insert_date, + style: TextStyle( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + ), + // trailing: Icon( + // Icons.arrow_forward, + // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + // ), + onTap: () async { + await getFileUrlApiCall(patientManagerProvider + .patientDocuments![index].file_path) + .then((urlHere) { + //print(url); + setState(() { + fileUrl = urlHere; + }); + }); + + viewFilePopUp( + patientManagerProvider, + patientManagerProvider.patientDocuments![index].file_name, + patientManagerProvider.patientDocuments![index].file_path, + patientManagerProvider + .patientDocuments![index].idpatient_files, + fileUrl); + }, + ); + }, + ); + } else { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 50), + Stack( + alignment: AlignmentDirectional.center, children: [ - TextSpan(text: "Press "), - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.menu, - size: 20, + Icon( + MihIcons.mihRing, + size: 165, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + Icon( + Icons.file_present, + size: 110, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ], + ), + const SizedBox(height: 10), + Text( + "No Documents have been added to this profile.", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + ), + const SizedBox(height: 25), + Center( + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.normal, color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), + children: [ + TextSpan(text: "Press "), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.menu, + size: 20, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ), + TextSpan(text: " to add "), + !patientManagerProvider.personalMode + ? TextSpan( + text: " or generate a the first document") + : TextSpan(text: " the first document"), + ], ), - TextSpan(text: " to add "), - widget.business != null - ? TextSpan(text: " or generate a the first document") - : TextSpan(text: " the first document"), - ], + ), ), - ), + ], ), - ], - ), - ); - // return const Center( - // child: Text( - // "No Documents Available", - // style: TextStyle(fontSize: 25, color: Colors.grey), - // textAlign: TextAlign.center, - // ), - // ); - } + ); + } + }, + ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_notes_list.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_notes_list.dart index e3bb088a..832d0d9f 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_notes_list.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/list_builders/build_notes_list.dart @@ -1,38 +1,25 @@ -import 'dart:convert'; 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_button.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_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; 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_components/mih_pop_up_messages/mih_success_message.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; +import 'package:provider/provider.dart'; class BuildNotesList extends StatefulWidget { - final AppUser signedInUser; - final List notes; - final Patient selectedPatient; - final Business? business; - final BusinessUser? businessUser; - final String type; const BuildNotesList({ super.key, - required this.notes, - required this.signedInUser, - required this.selectedPatient, - required this.business, - required this.businessUser, - required this.type, }); @override @@ -48,45 +35,80 @@ class _BuildNotesListState extends State { int indexOn = 0; final baseAPI = AppEnviroment.baseApiUrl; - Future deleteNoteApiCall(int NoteId) async { - var response = await http.delete( - Uri.parse("$baseAPI/notes/delete/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({"idpatient_notes": NoteId}), - ); + Future deleteNoteApiCall( + PatientManagerProvider patientManagerProvider, int NoteId) async { + int statusCode = await MihPatientServices() + .deletePatientConsultaionNote(NoteId, patientManagerProvider); //print("Here4"); //print(response.statusCode); - if (response.statusCode == 200) { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - if (widget.business == null) { - Navigator.of(context).pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - widget.selectedPatient, - widget.businessUser, - widget.business, - "personal")); - } else { - Navigator.of(context).pushNamed('/patient-manager/patient', - arguments: PatientViewArguments( - widget.signedInUser, - widget.selectedPatient, - widget.businessUser, - widget.business, - "business")); - } - setState(() {}); + if (statusCode == 200) { String message = "The note has been deleted successfully. This means it will no longer be visible on your and cannot be used for future appointments."; - successPopUp(message); + successPopUp("Successfuly Deleted", message); } else { internetConnectionPopUp(); } } + 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(); + }, + 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"), + ); + // return MIHSuccessMessage( + // successType: "Success", + // successMessage: message, + // ); + }, + ); + } + void internetConnectionPopUp() { showDialog( context: context, @@ -96,32 +118,22 @@ class _BuildNotesListState extends State { ); } - void successPopUp(String message) { - showDialog( - context: context, - builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, - ); - }, - ); - } - - void deletePatientPopUp(int NoteId) { + void deletePatientPopUp( + PatientManagerProvider patientManagerProvider, int NoteId) { showDialog( context: context, barrierDismissible: false, builder: (context) => MIHDeleteMessage( deleteType: "Note", onTap: () { - deleteNoteApiCall(NoteId); + deleteNoteApiCall(patientManagerProvider, NoteId); }, ), ); } - void viewNotePopUp(Note selectednote) { + void viewNotePopUp(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Note selectednote) { setState(() { noteTitleController.text = selectednote.note_name; noteTextController.text = selectednote.note_text; @@ -130,8 +142,8 @@ class _BuildNotesListState extends State { dateController.text = selectednote.insert_date; }); bool hasAccessToDelete = false; - if (widget.type == "business" && - selectednote.doc_office == widget.business!.Name) { + if (!patientManagerProvider.personalMode && + selectednote.doc_office == profileProvider.business!.Name) { hasAccessToDelete = true; } showDialog( @@ -159,7 +171,8 @@ class _BuildNotesListState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - deletePatientPopUp(selectednote.idpatient_notes); + deletePatientPopUp( + patientManagerProvider, selectednote.idpatient_notes); }, ), ] @@ -248,136 +261,141 @@ class _BuildNotesListState extends State { @override Widget build(BuildContext context) { - if (widget.notes.isNotEmpty) { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (BuildContext context, int index) { - return Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ); - }, - itemCount: widget.notes.length, - itemBuilder: (context, index) { - String notePreview = widget.notes[index].note_text; - if (notePreview.length > 30) { - notePreview = "${notePreview.substring(0, 30)} ..."; - } - return ListTile( - title: Text( - "${widget.notes[index].note_name}\n${widget.notes[index].doc_office} - ${widget.notes[index].doctor}", - style: TextStyle( + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + if (patientManagerProvider.consultationNotes!.isNotEmpty) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, int index) { + return Divider( color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ), - subtitle: Text( - "${widget.notes[index].insert_date}:\n$notePreview", - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ), //Text(widget.notes[index].note_text), - trailing: Icon( - Icons.arrow_forward, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - onTap: () { - viewNotePopUp(widget.notes[index]); + ); }, - ); - }, - ); - } else { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - const SizedBox(height: 50), - Stack( - alignment: AlignmentDirectional.center, - children: [ - Icon( - MihIcons.mihRing, - size: 165, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - Icon( - Icons.article_outlined, - size: 110, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - ], - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Text( - "No Notes have been added to this profile.", - textAlign: TextAlign.center, - overflow: TextOverflow.visible, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ), + itemCount: patientManagerProvider.consultationNotes!.length, + itemBuilder: (context, index) { + String notePreview = + patientManagerProvider.consultationNotes![index].note_text; + if (notePreview.length > 30) { + notePreview = "${notePreview.substring(0, 30)} ..."; + } + return ListTile( + title: Text( + "${patientManagerProvider.consultationNotes![index].note_name}\n${patientManagerProvider.consultationNotes![index].doc_office} - ${patientManagerProvider.consultationNotes![index].doctor}", + style: TextStyle( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), ), - ], - ), - const SizedBox(height: 25), - Visibility( - visible: widget.business != null, - child: Center( - child: RichText( - textAlign: TextAlign.center, - text: TextSpan( - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.normal, + subtitle: Text( + "${patientManagerProvider.consultationNotes![index].insert_date}:\n$notePreview", + style: TextStyle( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + ), //Text(widget.notes[index].note_text), + trailing: Icon( + Icons.arrow_forward, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ), + onTap: () { + viewNotePopUp( + profileProvider, + patientManagerProvider, + patientManagerProvider.consultationNotes![index], + ); + }, + ); + }, + ); + } else { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + const SizedBox(height: 50), + Stack( + alignment: AlignmentDirectional.center, + children: [ + Icon( + MihIcons.mihRing, + size: 165, color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), - children: [ - TextSpan(text: "Press "), - WidgetSpan( - alignment: PlaceholderAlignment.middle, - child: Icon( - Icons.menu, - size: 20, + Icon( + Icons.article_outlined, + size: 110, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ], + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text( + "No Notes have been added to this profile.", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), ), - TextSpan(text: " to add the first note"), - ], + ), + ], + ), + const SizedBox(height: 25), + Visibility( + visible: !patientManagerProvider.personalMode, + child: Center( + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.normal, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + children: [ + TextSpan(text: "Press "), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: Icon( + Icons.menu, + size: 20, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ), + TextSpan(text: " to add the first note"), + ], + ), + ), ), ), - ), + ], ), - ], - ), - ); - // return const Center( - // child: Text( - // "No Notes Available", - // style: TextStyle(fontSize: 25, color: Colors.grey), - // textAlign: TextAlign.center, - // ), - // ); - } + ); + } + }, + ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart index e6a82763..e85c1c02 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart @@ -28,7 +28,6 @@ class _PatientProfileTileState extends State { onTap: () { context.goNamed( 'patientProfile', - extra: widget.arguments, ); // Navigator.of(context).pushNamed( // '/patient-profile', diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_consultation.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_consultation.dart index f7cca32d..fdd28fbe 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_consultation.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_consultation.dart @@ -1,6 +1,7 @@ -import 'dart:convert'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; @@ -12,33 +13,15 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_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_pop_up_messages/mih_loading_circle.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:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/list_builders/build_notes_list.dart'; import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; +import 'package:provider/provider.dart'; class PatientConsultation extends StatefulWidget { - final String patientAppId; - final Patient selectedPatient; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final String type; const PatientConsultation({ super.key, - required this.patientAppId, - required this.selectedPatient, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.type, }); @override @@ -46,7 +29,6 @@ class PatientConsultation extends StatefulWidget { } class _PatientConsultationState extends State { - late Future> futueNotes; final titleController = TextEditingController(); final noteTextController = TextEditingController(); final officeController = TextEditingController(); @@ -56,33 +38,18 @@ class _PatientConsultationState extends State { String endpoint = "${AppEnviroment.baseApiUrl}/notes/patients/"; final _formKey = GlobalKey(); - Future> fetchNotes(String endpoint) async { - final response = await http.get(Uri.parse( - "${AppEnviroment.baseApiUrl}/notes/patients/${widget.selectedPatient.app_id}")); - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List notes = - List.from(l.map((model) => Note.fromJson(model))); - //print("Here notes"); - return notes; - } else { - internetConnectionPopUp(); - throw Exception('failed to load patients'); - } - } - - void addNotePopUp(double width) { + void addNotePopUp(MzansiProfileProvider profileProvider, double width) { DateTime now = new DateTime.now(); DateTime date = new DateTime(now.year, now.month, now.day); var title = ""; - print("Business User: ${widget.businessUser}"); - if (widget.businessUser?.title == "Doctor") { + print("Business User: ${profileProvider.businessUser}"); + if (profileProvider.businessUser?.title == "Doctor") { title = "Dr."; } setState(() { - officeController.text = widget.business!.Name; + officeController.text = profileProvider.business!.Name; doctorController.text = - "$title ${widget.signedInUser.fname} ${widget.signedInUser.lname}"; + "$title ${profileProvider.user!.fname} ${profileProvider.user!.lname}"; dateController.text = date.toString().substring(0, 10); }); showDialog( @@ -205,7 +172,7 @@ class _PatientConsultationState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - addPatientNoteAPICall(); + // addPatientNoteAPICall(); Navigator.pop(context); } else { MihAlertServices().formNotFilledCompletely(context); @@ -236,38 +203,6 @@ class _PatientConsultationState extends State { ); } - Future addPatientNoteAPICall() async { - // String title = ""; - // if (widget.businessUser!.title == "Doctor") { - // title = "Dr."; - // } - var response = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "note_name": titleController.text, - "note_text": noteTextController.text, - "doc_office": officeController.text, - "doctor": doctorController.text, - "app_id": widget.selectedPatient.app_id, - }), - ); - if (response.statusCode == 201) { - setState(() { - futueNotes = fetchNotes(endpoint + widget.patientAppId.toString()); - }); - // Navigator.of(context) - // .pushNamed('/patient-manager', arguments: widget.userEmail); - String message = - "Your note has been successfully added to the patients medical record. You can now view it alongside their other important information."; - successPopUp(message); - } else { - internetConnectionPopUp(); - } - } - bool isFieldsFilled() { if (titleController.text.isEmpty || noteTextController.text.isEmpty || @@ -321,7 +256,6 @@ class _PatientConsultationState extends State { @override void initState() { - futueNotes = fetchNotes(endpoint + widget.patientAppId); noteTextController.addListener(() { setState(() { _counter.value = noteTextController.text.characters.length; @@ -340,71 +274,56 @@ class _PatientConsultationState extends State { } Widget getBody(double width) { - return Stack( - children: [ - MihSingleChildScroll( - child: FutureBuilder( - future: futueNotes, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final notesList = snapshot.data!; - return Column(children: [ - BuildNotesList( - notes: notesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, - ), - ), - Visibility( - visible: widget.type != "personal", - child: 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 Note", - 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: () { - // addConsultationNotePopUp(); - addNotePopUp(width); - }, - ) - ], + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + return Stack( + children: [ + MihSingleChildScroll( + child: Column(children: [ + BuildNotesList(), + ])), + Visibility( + visible: !patientManagerProvider.personalMode, + child: 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 Note", + 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: () { + // addConsultationNotePopUp(); + addNotePopUp(profileProvider, width); + }, + ) + ], + ), + ), ), - ), - ), - ], + ], + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart index c537baa6..7f278050 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart @@ -1,10 +1,13 @@ -import 'dart:convert'; - 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_package_alert.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; @@ -16,34 +19,16 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_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_pop_up_messages/mih_loading_circle.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:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/components/prescip_input.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/list_builders/build_files_list.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; -import 'package:supertokens_flutter/http.dart' as http; +import 'package:provider/provider.dart'; class PatientDocuments extends StatefulWidget { - final int patientIndex; - final Patient selectedPatient; - final AppUser signedInUser; - final Business? business; - final BusinessUser? businessUser; - final String type; const PatientDocuments({ super.key, - required this.patientIndex, - required this.selectedPatient, - required this.signedInUser, - required this.business, - required this.businessUser, - required this.type, }); @override @@ -51,7 +36,6 @@ class PatientDocuments extends StatefulWidget { } class _PatientDocumentsState extends State { - late Future> futueFiles; final selectedFileController = TextEditingController(); final startDateController = TextEditingController(); final endDateTextController = TextEditingController(); @@ -68,9 +52,10 @@ class _PatientDocumentsState extends State { final _formKey2 = GlobalKey(); late String env; - Future submitDocUploadForm() async { + Future submitDocUploadForm( + PatientManagerProvider patientManagerProvider) async { if (isFileFieldsFilled()) { - await uploadSelectedFile(selected); + await uploadSelectedFile(patientManagerProvider, selected); } else { showDialog( context: context, @@ -81,75 +66,49 @@ class _PatientDocumentsState extends State { } } - Future> fetchFiles() async { - final response = await http.get(Uri.parse( - "${AppEnviroment.baseApiUrl}/patient_files/get/${widget.selectedPatient.app_id}")); - //print(response.statusCode); - //print(response.body); - if (response.statusCode == 200) { - Iterable l = jsonDecode(response.body); - List files = - List.from(l.map((model) => PFile.fromJson(model))); - return files; - } else { - internetConnectionPopUp(); - throw Exception('failed to load patients'); - } - } - - Future addPatientFileLocationToDB(PlatformFile? file) async { + Future addPatientFileLocationToDB( + PatientManagerProvider patientManagerProvider, PlatformFile? file) async { showDialog( context: context, builder: (context) { return const Mihloadingcircle(); }, ); - var fname = file!.name.replaceAll(RegExp(r' '), '-'); - var filePath = "${widget.selectedPatient.app_id}/patient_files/$fname"; - var response2 = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/patient_files/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "file_path": filePath, - "file_name": fname, - "app_id": widget.selectedPatient.app_id - }), - ); - //print("here5"); - //print(response2.statusCode); - if (response2.statusCode == 201) { + int statusCode = + await MihPatientServices().addPatientFile(file, patientManagerProvider); + if (statusCode == 201) { setState(() { selectedFileController.clear(); - futueFiles = fetchFiles(); }); + var fname = file!.name.replaceAll(RegExp(r' '), '-'); // end loading circle Navigator.of(context).pop(); String message = - "The file ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; - successPopUp(message); + "The file $fname has been successfully generated and added to ${patientManagerProvider.selectedPatient!.first_name} ${patientManagerProvider.selectedPatient!.last_name}'s record. You can now access and download it for their use."; + successPopUp("Successfully Uplouded File", message); } else { internetConnectionPopUp(); } } - Future uploadSelectedFile(PlatformFile? file) async { + Future uploadSelectedFile( + PatientManagerProvider patientManagerProvider, PlatformFile? file) async { var response = await MihFileApi.uploadFile( - widget.selectedPatient.app_id, + patientManagerProvider.selectedPatient!.app_id, env, "patient_files", file, context, ); if (response == 200) { - await addPatientFileLocationToDB(file); + await addPatientFileLocationToDB(patientManagerProvider, file); } else { internetConnectionPopUp(); } } - Future generateMedCert() async { + Future generateMedCert(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider) async { //start loading circle showDialog( context: context, @@ -157,73 +116,30 @@ class _PatientDocumentsState extends State { return const Mihloadingcircle(); }, ); - DateTime now = DateTime.now(); - // DateTime date = new DateTime(now.year, now.month, now.day); - String fileName = - "Med-Cert-${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}-${now.toString().substring(0, 19)}.pdf" - .replaceAll(RegExp(r' '), '-'); - var response1 = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/minio/generate/med-cert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "app_id": widget.selectedPatient.app_id, - "env": env, - "patient_full_name": - "${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}", - "fileName": fileName, - "id_no": widget.selectedPatient.id_no, - "docfname": - "DR. ${widget.signedInUser.fname} ${widget.signedInUser.lname}", - "startDate": startDateController.text, - "busName": widget.business!.Name, - "busAddr": "*TO BE ADDED IN THE FUTURE*", - "busNo": widget.business!.contact_no, - "busEmail": widget.business!.bus_email, - "endDate": endDateTextController.text, - "returnDate": retDateTextController.text, - "logo_path": widget.business!.logo_path, - "sig_path": widget.businessUser!.sig_path, - }), + int statusCodeCetificateGeneration = + await MihPatientServices().generateMedicalCertificate( + startDateController.text, + endDateTextController.text, + retDateTextController.text, + profileProvider, + patientManagerProvider, ); - print(response1.statusCode); - if (response1.statusCode == 200) { - var response2 = await http.post( - Uri.parse("${AppEnviroment.baseApiUrl}/patient_files/insert/"), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode({ - "file_path": - "${widget.selectedPatient.app_id}/patient_files/$fileName", - "file_name": fileName, - "app_id": widget.selectedPatient.app_id - }), - ); - //print(response2.statusCode); - if (response2.statusCode == 201) { - setState(() { - startDateController.clear(); - endDateTextController.clear(); - retDateTextController.clear(); - futueFiles = fetchFiles(); - }); - // end loading circle - Navigator.of(context).pop(); - Navigator.of(context).pop(); - String message = - "The medical certificate $fileName has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; - successPopUp(message); - } else { - internetConnectionPopUp(); - } + DateTime now = DateTime.now(); + String fileName = + "Med-Cert-${patientManagerProvider.selectedPatient!.first_name} ${patientManagerProvider.selectedPatient!.last_name}-${now.toString().substring(0, 19)}.pdf" + .replaceAll(RegExp(r' '), '-'); + if (statusCodeCetificateGeneration == 200) { + context.pop(); //Loading removal + String message = + "The medical certificate $fileName has been successfully generated and added to ${patientManagerProvider.selectedPatient!.first_name} ${patientManagerProvider.selectedPatient!.last_name}'s record. You can now access and download it for their use."; + successPopUp("Successfully Generated Certificate", message); } else { internetConnectionPopUp(); } } - void uploudFilePopUp(double width) { + void uploudFilePopUp( + PatientManagerProvider patientManagerProvider, double width) { showDialog( context: context, barrierDismissible: false, @@ -304,7 +220,7 @@ class _PatientDocumentsState extends State { child: MihButton( onPressed: () { if (_formKey.currentState!.validate()) { - submitDocUploadForm(); + submitDocUploadForm(patientManagerProvider); // uploadSelectedFile(selected); Navigator.pop(context); } else { @@ -336,7 +252,10 @@ class _PatientDocumentsState extends State { ); } - void medCertPopUp() { + void medCertPopUp( + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + ) { showDialog( context: context, barrierDismissible: false, @@ -387,7 +306,8 @@ class _PatientDocumentsState extends State { child: MihButton( onPressed: () async { if (_formKey2.currentState!.validate()) { - await generateMedCert(); + await generateMedCert( + profileProvider, patientManagerProvider); //Navigator.pop(context); } else { MihAlertServices().formNotFilledCompletely(context); @@ -416,7 +336,10 @@ class _PatientDocumentsState extends State { ); } - void prescritionPopUp() { + void prescritionPopUp( + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + ) { showDialog( context: context, barrierDismissible: false, @@ -442,10 +365,10 @@ class _PatientDocumentsState extends State { noDaysController: noDaysController, noRepeatsController: noRepeatsController, outputController: outputController, - selectedPatient: widget.selectedPatient, - signedInUser: widget.signedInUser, - business: widget.business, - businessUser: widget.businessUser, + selectedPatient: patientManagerProvider.selectedPatient!, + signedInUser: profileProvider.user!, + business: profileProvider.business, + businessUser: profileProvider.businessUser, env: env, ), ], @@ -472,8 +395,9 @@ class _PatientDocumentsState extends State { } } - Widget getMenu(double width) { - if (widget.type == "personal") { + Widget getMenu(MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, double width) { + if (patientManagerProvider.personalMode) { return Positioned( right: 10, bottom: 10, @@ -498,7 +422,7 @@ class _PatientDocumentsState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - uploudFilePopUp(width); + uploudFilePopUp(patientManagerProvider, width); }, ) ], @@ -529,7 +453,7 @@ class _PatientDocumentsState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - uploudFilePopUp(width); + uploudFilePopUp(patientManagerProvider, width); }, ), SpeedDialChild( @@ -549,7 +473,7 @@ class _PatientDocumentsState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - medCertPopUp(); + medCertPopUp(profileProvider, patientManagerProvider); }, ), SpeedDialChild( @@ -569,7 +493,7 @@ class _PatientDocumentsState extends State { backgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onTap: () { - prescritionPopUp(); + prescritionPopUp(profileProvider, patientManagerProvider); }, ), ], @@ -578,13 +502,56 @@ class _PatientDocumentsState extends State { } } - void successPopUp(String message) { + void successPopUp(String title, String message) { showDialog( context: context, builder: (context) { - return MIHSuccessMessage( - successType: "Success", - successMessage: message, + 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(); + }, + 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"), ); }, ); @@ -617,7 +584,6 @@ class _PatientDocumentsState extends State { @override void initState() { - futueFiles = fetchFiles(); if (AppEnviroment.getEnv() == "Prod") { env = "Prod"; } else { @@ -636,39 +602,20 @@ class _PatientDocumentsState extends State { } Widget getBody(double width) { - return Stack( - children: [ - MihSingleChildScroll( - child: FutureBuilder( - future: futueFiles, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final filesList = snapshot.data!; - return Column(children: [ - BuildFilesList( - files: filesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - env: env, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, - ), - ), - getMenu(width), - ], + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + return Stack( + children: [ + MihSingleChildScroll( + child: Column(children: [ + BuildFilesList(), + ]), + ), + getMenu(profileProvider, patientManagerProvider, width), + ], + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_info.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_info.dart index 2f59f61e..a5a04253 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_info.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_info.dart @@ -1,5 +1,4 @@ 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_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; @@ -7,21 +6,16 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; +import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/components/mih_edit_patient_details_window.dart'; +import 'package:provider/provider.dart'; class PatientInfo extends StatefulWidget { - final AppUser signedInUser; - final Patient selectedPatient; - final String type; const PatientInfo({ super.key, - required this.signedInUser, - required this.selectedPatient, - required this.type, }); @override @@ -297,6 +291,40 @@ class _PatientInfoState extends State { ); } + void initialiseControllers(PatientManagerProvider patientManagerProvider) { + idController.text = patientManagerProvider.selectedPatient!.id_no; + fnameController.text = patientManagerProvider.selectedPatient!.first_name; + lnameController.text = patientManagerProvider.selectedPatient!.last_name; + cellController.text = patientManagerProvider.selectedPatient!.cell_no; + emailController.text = patientManagerProvider.selectedPatient!.email; + medNameController.text = + patientManagerProvider.selectedPatient!.medical_aid_name; + medNoController.text = + patientManagerProvider.selectedPatient!.medical_aid_no; + medSchemeController.text = + patientManagerProvider.selectedPatient!.medical_aid_scheme; + addressController.text = patientManagerProvider.selectedPatient!.address; + medAidController.text = patientManagerProvider.selectedPatient!.medical_aid; + medMainMemController.text = + patientManagerProvider.selectedPatient!.medical_aid_main_member; + medAidCodeController.text = + patientManagerProvider.selectedPatient!.medical_aid_code; + medAid = patientManagerProvider.selectedPatient!.medical_aid; + if (medAid == "Yes") { + medAidPosition = true; + } else { + medAidPosition = false; + } + } + + void showEditPatientWindow() { + showDialog( + context: context, + builder: (context) { + return MihEditPatientDetailsWindow(); + }); + } + @override void dispose() { idController.dispose(); @@ -316,37 +344,6 @@ class _PatientInfoState extends State { @override void initState() { - setState(() { - idController.value = TextEditingValue(text: widget.selectedPatient.id_no); - fnameController.value = - TextEditingValue(text: widget.selectedPatient.first_name); - lnameController.value = - TextEditingValue(text: widget.selectedPatient.last_name); - cellController.value = - TextEditingValue(text: widget.selectedPatient.cell_no); - emailController.value = - TextEditingValue(text: widget.selectedPatient.email); - medNameController.value = - TextEditingValue(text: widget.selectedPatient.medical_aid_name); - medNoController.value = - TextEditingValue(text: widget.selectedPatient.medical_aid_no); - medSchemeController.value = - TextEditingValue(text: widget.selectedPatient.medical_aid_scheme); - addressController.value = - TextEditingValue(text: widget.selectedPatient.address); - medAidController.value = - TextEditingValue(text: widget.selectedPatient.medical_aid); - medMainMemController.value = TextEditingValue( - text: widget.selectedPatient.medical_aid_main_member); - medAidCodeController.value = - TextEditingValue(text: widget.selectedPatient.medical_aid_code); - medAid = widget.selectedPatient.medical_aid; - }); - if (medAid == "Yes") { - medAidPosition = true; - } else { - medAidPosition = false; - } super.initState(); } @@ -361,21 +358,47 @@ class _PatientInfoState extends State { } Widget getBody(double width) { - return Stack( - children: [ - MihSingleChildScroll( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - MihForm( - formKey: _formKey, - formFields: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - //crossAxisAlignment: , - children: [ - Text( - "Personal", + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + initialiseControllers(patientManagerProvider); + return Stack( + children: [ + MihSingleChildScroll( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MihForm( + formKey: _formKey, + formFields: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + //crossAxisAlignment: , + children: [ + Text( + "Personal", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + ), + ), + ]), + Divider( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark")), + const SizedBox(height: 10), + getPatientDetailsField(), + const SizedBox(height: 10), + Center( + child: Text( + "Medical Aid", textAlign: TextAlign.center, style: TextStyle( fontSize: 25, @@ -385,78 +408,65 @@ class _PatientInfoState extends State { "Dark"), ), ), - ]), - Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark")), - const SizedBox(height: 10), - getPatientDetailsField(), - const SizedBox(height: 10), - Center( - child: Text( - "Medical Aid", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MihColors.getSecondaryColor( + ), + Divider( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark")), + const SizedBox(height: 10), + getMedAidDetailsFields(), + ], + ), + ], + ), + ), + Visibility( + visible: patientManagerProvider.personalMode, + child: Positioned( + right: 10, + bottom: 10, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.edit, + color: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), - ), - ), - Divider( - color: MihColors.getSecondaryColor( + label: "Edit Profile", + labelBackgroundColor: MihColors.getGreenColor( MzansiInnovationHub.of(context)!.theme.mode == - "Dark")), - const SizedBox(height: 10), - getMedAidDetailsFields(), - ], - ), - ], - ), - ), - Visibility( - visible: widget.type == "personal", - child: Positioned( - right: 10, - bottom: 10, - child: MihFloatingMenu( - icon: Icons.add, - animatedIcon: AnimatedIcons.menu_close, - children: [ - SpeedDialChild( - child: Icon( - Icons.edit, - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - ), - label: "Edit Profile", - 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: () { - context.goNamed( - 'patientProfileEdit', - extra: PatientEditArguments( - widget.signedInUser, - widget.selectedPatient, + "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: () { + // context.goNamed( + // 'patientProfileEdit', + // extra: PatientEditArguments( + // profileProvider.user!, + // patientManagerProvider.selectedPatient!, + // ), + // ); + showEditPatientWindow(); + }, + ) + ], + ), + ), ), - ), - ), - ], + ], + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_setup_form.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_setup_form.dart new file mode 100644 index 00000000..c982820a --- /dev/null +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tools/patient_setup_form.dart @@ -0,0 +1,543 @@ +import 'package:flutter/material.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_button.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; +import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; +import 'package:provider/provider.dart'; + +class PatientSetupForm extends StatefulWidget { + const PatientSetupForm({super.key}); + + @override + State createState() => _PatientSetupFormState(); +} + +class _PatientSetupFormState extends State { + final idController = TextEditingController(); + final fnameController = TextEditingController(); + final lnameController = TextEditingController(); + final cellController = TextEditingController(); + final emailController = TextEditingController(); + final medNoController = TextEditingController(); + final medNameController = TextEditingController(); + final medSchemeController = TextEditingController(); + final addressController = TextEditingController(); + final medAidController = TextEditingController(); + final medMainMemController = TextEditingController(); + final medAidCodeController = TextEditingController(); + final _formKey = GlobalKey(); + final FocusNode _focusNode = FocusNode(); + late bool medAidPosition; + late bool medMainMemberPosition; + final ValueNotifier medRequired = ValueNotifier(false); + + Future addPatientService( + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + ) async { + int statusCode = await MihPatientServices().addPatientService( + idController.text, + fnameController.text, + lnameController.text, + emailController.text, + cellController.text, + medAidController.text, + medMainMemController.text, + medNoController.text, + medAidCodeController.text, + medNameController.text, + medSchemeController.text, + addressController.text, + profileProvider, + patientManagerProvider, + ); + if (statusCode == 201) { + String message = + "${fnameController.text} ${lnameController.text} patient profile has been successfully added!\n"; + successPopUp("Successfully created Patient Profile", message); + } else { + internetConnectionPopUp(); + } + } + + 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.goNamed( + 'patientProfile', + ); + }, + 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"), + ); + }, + ); + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + void isRequired() { + //print("listerner triggered"); + if (medAidController.text == "Yes") { + medRequired.value = true; + } else { + medRequired.value = false; + } + } + + Widget displayForm(double width) { + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, Widget? child) { + return SingleChildScrollView( + child: Padding( + padding: + MzansiInnovationHub.of(context)!.theme.screenType == "desktop" + ? EdgeInsets.symmetric(horizontal: width * 0.2) + : EdgeInsets.symmetric(horizontal: width * 0.075), + child: Column( + children: [ + MihForm( + formKey: _formKey, + formFields: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Personal", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ), + ], + ), + Divider( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark")), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: idController, + multiLineInput: false, + requiredText: true, + hintText: "ID No.", + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: fnameController, + multiLineInput: false, + requiredText: true, + readOnly: true, + hintText: "First Name", + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: lnameController, + multiLineInput: false, + requiredText: true, + readOnly: true, + hintText: "Surname", + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: cellController, + multiLineInput: false, + requiredText: true, + hintText: "Cell No.", + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: emailController, + multiLineInput: false, + requiredText: true, + readOnly: true, + hintText: "Email", + validator: (value) { + return MihValidationServices().validateEmail(value); + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + height: 100, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + controller: addressController, + multiLineInput: true, + requiredText: true, + hintText: "Address", + validator: (value) { + return MihValidationServices().isEmpty(value); + }, + ), + const SizedBox(height: 15.0), + Center( + child: Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ), + ), + Divider( + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark")), + const SizedBox(height: 10.0), + MihToggle( + hintText: "Medical Aid", + initialPostion: medAidPosition, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + secondaryFillColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + onChange: (value) { + if (value) { + setState(() { + medAidController.text = "Yes"; + medAidPosition = value; + }); + } else { + setState(() { + medAidController.text = "No"; + medAidPosition = value; + }); + } + }, + ), + ValueListenableBuilder( + valueListenable: medRequired, + builder: + (BuildContext context, bool value, Widget? child) { + return Visibility( + visible: value, + child: Column( + children: [ + const SizedBox(height: 10.0), + MihToggle( + hintText: "Main Member", + initialPostion: medMainMemberPosition, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + secondaryFillColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + onChange: (value) { + if (value) { + setState(() { + medMainMemController.text = "Yes"; + medMainMemberPosition = value; + }); + } else { + setState(() { + medMainMemController.text = "No"; + medMainMemberPosition = value; + }); + } + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + controller: medNoController, + multiLineInput: false, + requiredText: true, + hintText: "No.", + validator: (validationValue) { + if (value) { + return MihValidationServices() + .isEmpty(validationValue); + } + return null; + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + controller: medAidCodeController, + multiLineInput: false, + requiredText: true, + hintText: "Code", + validator: (validationValue) { + if (value) { + return MihValidationServices() + .isEmpty(validationValue); + } + return null; + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + controller: medNameController, + multiLineInput: false, + requiredText: true, + hintText: "Name", + validator: (validationValue) { + if (value) { + return MihValidationServices() + .isEmpty(validationValue); + } + return null; + }, + ), + const SizedBox(height: 10.0), + MihTextFormField( + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + inputColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)! + .theme + .mode == + "Dark"), + controller: medSchemeController, + multiLineInput: false, + requiredText: true, + hintText: "Plan", + validator: (validationValue) { + if (value) { + return MihValidationServices() + .isEmpty(validationValue); + } + return null; + }, + ), + const SizedBox(height: 10.0), + ], + ), + ); + }, + ), + const SizedBox(height: 20.0), + Center( + child: MihButton( + onPressed: () { + if (_formKey.currentState!.validate()) { + addPatientService( + profileProvider, patientManagerProvider); + } else { + MihAlertServices().formNotFilledCompletely(context); + } + }, + buttonColor: MihColors.getGreenColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + width: 300, + child: Text( + "Add", + style: TextStyle( + color: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + const SizedBox(height: 30.0), + ], + ), + ], + ), + ), + ); + }, + ); + } + + @override + void dispose() { + idController.dispose(); + fnameController.dispose(); + lnameController.dispose(); + cellController.dispose(); + emailController.dispose(); + medNoController.dispose(); + medNameController.dispose(); + medSchemeController.dispose(); + addressController.dispose(); + medAidController.dispose(); + medAidCodeController.removeListener(isRequired); + medRequired.dispose(); + medMainMemController.dispose(); + medAidCodeController.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + void initState() { + medAidController.addListener(isRequired); + MzansiProfileProvider profileProvider = + context.read(); + setState(() { + fnameController.text = profileProvider.user!.fname; + lnameController.text = profileProvider.user!.lname; + emailController.text = profileProvider.user!.email; + medAidPosition = false; + medMainMemberPosition = false; + medAidController.text = "No"; + medMainMemController.text = "No"; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + return displayForm(screenWidth); + } +} diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_edit.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_edit.dart deleted file mode 100644 index 1de1d5e4..00000000 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_edit.dart +++ /dev/null @@ -1,903 +0,0 @@ -import 'dart:convert'; - -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_patient_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_action.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_body.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_header.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_layout_builder.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.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/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:supertokens_flutter/supertokens.dart'; -import 'package:supertokens_flutter/http.dart' as http; - -class EditPatient extends StatefulWidget { - final Patient selectedPatient; - final AppUser signedInUser; - const EditPatient({ - super.key, - required this.selectedPatient, - required this.signedInUser, - }); - - @override - State createState() => _EditPatientState(); -} - -class _EditPatientState extends State { - var idController = TextEditingController(); - final fnameController = TextEditingController(); - final lnameController = TextEditingController(); - final cellController = TextEditingController(); - final emailController = TextEditingController(); - final medNoController = TextEditingController(); - final medNameController = TextEditingController(); - final medSchemeController = TextEditingController(); - final addressController = TextEditingController(); - final medAidController = TextEditingController(); - final medMainMemController = TextEditingController(); - final medAidCodeController = TextEditingController(); - final baseAPI = AppEnviroment.baseApiUrl; - final docOfficeIdApiUrl = "${AppEnviroment.baseApiUrl}/users/profile/"; - final apiUrlEdit = "${AppEnviroment.baseApiUrl}/patients/update/"; - final apiUrlDelete = "${AppEnviroment.baseApiUrl}/patients/delete/"; - final _formKey = GlobalKey(); - - late bool medAidPosition; - late bool medMainMemberPosition; - late int futureDocOfficeId; - late String userEmail; - // bool medRequired = false; - final ValueNotifier medRequired = ValueNotifier(false); - - late double width; - late double height; - - final FocusNode _focusNode = FocusNode(); - - // Future getOfficeIdByUser(String endpoint) async { - // final response = await http.get(Uri.parse(endpoint)); - // if (response.statusCode == 200) { - // String body = response.body; - // var decodedData = jsonDecode(body); - // AppUser u = AppUser.fromJson(decodedData as Map); - // setState(() { - // //futureDocOfficeId = u.docOffice_id; - // //print(futureDocOfficeId); - // }); - // } else { - // internetConnectionPopUp(); - // throw Exception('failed to load patients'); - // } - // } - - Future updatePatientApiCall() async { - var statusCode = await MihPatientServices().updatePatientService( - widget.selectedPatient.app_id, - idController.text, - fnameController.text, - lnameController.text, - emailController.text, - cellController.text, - medAidController.text, - medMainMemController.text, - medNoController.text, - medAidCodeController.text, - medNameController.text, - medSchemeController.text, - addressController.text, - ); - if (statusCode == 200) { - successPopUp( - "Successfully Updated Profile!", - "${fnameController.text} ${lnameController.text}'s information has been updated successfully! Their medical records and details are now current.", - ); - } else { - MihAlertServices().errorAlert( - "Error Updating Profile", - "There was an error updating your profile. Please try again later.", - context, - ); - } - // var response = await http.put( - // Uri.parse(apiUrlEdit), - // headers: { - // "Content-Type": "application/json; charset=UTF-8" - // }, - // body: jsonEncode({ - // "id_no": idController.text, - // "first_name": fnameController.text, - // "last_name": lnameController.text, - // "email": emailController.text, - // "cell_no": cellController.text, - // "medical_aid": medAidController.text, - // "medical_aid_main_member": medMainMemController.text, - // "medical_aid_no": medNoController.text, - // "medical_aid_code": medAidCodeController.text, - // "medical_aid_name": medNameController.text, - // "medical_aid_scheme": medSchemeController.text, - // "address": addressController.text, - // "app_id": widget.selectedPatient.app_id, - // }), - // ); - // print(response.statusCode); - // if (response.statusCode == 200) { - // Navigator.of(context).pop(); - // Navigator.of(context).pop(); - // Navigator.of(context).pushNamed('/patient-profile', - // arguments: PatientViewArguments( - // widget.signedInUser, null, null, null, "personal")); - // //Navigator.of(context).pushNamed('/'); - // String message = - // "${fnameController.text} ${lnameController.text}'s information has been updated successfully! Their medical records and details are now current."; - // successPopUp(message); - // } else { - // internetConnectionPopUp(); - // } - } - - 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.goNamed( - "patientProfile", - extra: PatientViewArguments( - widget.signedInUser, - widget.selectedPatient, - null, - null, - "personal", - ), - ); - }, - 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"), - ); - // return MIHSuccessMessage( - // successType: "Success", - // successMessage: message, - // ); - }, - ); - } - - Future deletePatientApiCall() async { - //print("Here1"); - //userEmail = getLoginUserEmail() as String; - //print(userEmail); - //print("Here2"); - //await getOfficeIdByUser(docOfficeIdApiUrl + userEmail); - //print("Office ID: ${futureDocOfficeId.toString()}"); - //print("OPatient ID No: ${idController.text}"); - //print("Here3"); - var response = await http.delete( - Uri.parse(apiUrlDelete), - headers: { - "Content-Type": "application/json; charset=UTF-8" - }, - body: jsonEncode( - {"app_id": widget.selectedPatient.app_id}), - ); - //print("Here4"); - //print(response.statusCode); - if (response.statusCode == 200) { - Navigator.of(context).pop(); - Navigator.of(context).pop(); - Navigator.of(context).popAndPushNamed('/patient-profile', - arguments: PatientViewArguments( - widget.signedInUser, null, null, null, "personal")); - String message = - "${fnameController.text} ${lnameController.text}'s record has been deleted successfully. This means it will no longer be visible in patient manager and cannot be used for future appointments."; - successPopUp("Error", message); - } else { - internetConnectionPopUp(); - } - } - - Future getLoginUserEmail() async { - var uid = await SuperTokens.getUserId(); - var response = await http.get(Uri.parse("$baseAPI/user/$uid")); - if (response.statusCode == 200) { - var user = jsonDecode(response.body); - userEmail = user["email"]; - } - } - - void messagePopUp(error) { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text(error), - ); - }, - ); - } - - void internetConnectionPopUp() { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Internet Connection"); - }, - ); - } - - void deletePatientPopUp() { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => Dialog( - child: Stack( - children: [ - Container( - padding: const EdgeInsets.all(10.0), - width: 700.0, - height: (height / 3) * 2, - decoration: BoxDecoration( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - borderRadius: BorderRadius.circular(25.0), - border: Border.all( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - width: 5.0), - ), - child: SingleChildScrollView( - child: Column( - //mainAxisSize: MainAxisSize.max, - children: [ - Icon( - Icons.warning_amber_rounded, - size: 100, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ), - const SizedBox(height: 15), - Text( - "Are you sure you want to delete this?", - textAlign: TextAlign.center, - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 25.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: Text( - "This action is permanent! Deleting ${fnameController.text} ${lnameController.text} will remove him\\her from your account. You won't be able to recover it once it's gone.", - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - const SizedBox(height: 15), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: Text( - "Here's what you'll be deleting:", - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 20.0, - fontWeight: FontWeight.bold, - ), - ), - ), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: SizedBox( - width: 450, - child: Text( - "1) Patient Profile Information.\n2) Patient Notes\n3) Patient Files.", - textAlign: TextAlign.left, - style: TextStyle( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - MihButton( - onPressed: deletePatientApiCall, - buttonColor: MihColors.getRedColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - width: 300, - child: Text( - "Delete", - style: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - ), - ), - Positioned( - top: 5, - right: 5, - width: 50, - height: 50, - child: IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon( - Icons.close, - color: MihColors.getRedColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - size: 35, - ), - ), - ), - ], - ), - ), - ); - } - - bool isFieldsFilled() { - if (medRequired.value) { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - medNoController.text.isEmpty || - medNameController.text.isEmpty || - medSchemeController.text.isEmpty || - addressController.text.isEmpty || - medAidController.text.isEmpty || - medMainMemController.text.isEmpty || - medAidCodeController.text.isEmpty) { - return false; - } else { - return true; - } - } else { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - addressController.text.isEmpty || - medAidController.text.isEmpty) { - return false; - } else { - return true; - } - } - } - - void isRequired() { - print("listerner triggered"); - if (medAidController.text == "Yes") { - medRequired.value = true; - } else if (medAidController.text == "No") { - medRequired.value = false; - } else { - //print("here"); - } - } - - Widget displayForm(double width) { - return SingleChildScrollView( - child: Padding( - padding: MzansiInnovationHub.of(context)!.theme.screenType == "desktop" - ? EdgeInsets.symmetric(horizontal: width * 0.2) - : EdgeInsets.symmetric(horizontal: width * 0.075), - child: Column( - children: [ - MihForm( - formKey: _formKey, - formFields: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Personal", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ), - ), - ], - ), - Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark")), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: idController, - multiLineInput: false, - requiredText: true, - hintText: "ID No.", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: fnameController, - multiLineInput: false, - requiredText: true, - readOnly: true, - hintText: "First Name", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: lnameController, - multiLineInput: false, - requiredText: true, - readOnly: true, - hintText: "Surname", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: cellController, - multiLineInput: false, - requiredText: true, - hintText: "Cell No.", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: emailController, - multiLineInput: false, - requiredText: true, - readOnly: true, - hintText: "Email", - validator: (value) { - return MihValidationServices().validateEmail(value); - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - height: 100, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - controller: addressController, - multiLineInput: true, - requiredText: true, - hintText: "Address", - validator: (value) { - return MihValidationServices().isEmpty(value); - }, - ), - const SizedBox(height: 15.0), - Center( - child: Text( - "Medical Aid Details", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ), - ), - ), - Divider( - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark")), - const SizedBox(height: 10.0), - MihToggle( - hintText: "Medical Aid", - initialPostion: medAidPosition, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - secondaryFillColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onChange: (value) { - if (value) { - setState(() { - medAidController.text = "Yes"; - medAidPosition = value; - }); - } else { - setState(() { - medAidController.text = "No"; - medAidPosition = value; - }); - } - }, - ), - ValueListenableBuilder( - valueListenable: medRequired, - builder: (BuildContext context, bool value, Widget? child) { - return Visibility( - visible: value, - child: Column( - children: [ - const SizedBox(height: 10.0), - MihToggle( - hintText: "Main Member", - initialPostion: medMainMemberPosition, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - secondaryFillColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - onChange: (value) { - if (value) { - setState(() { - medMainMemController.text = "Yes"; - medMainMemberPosition = value; - }); - } else { - setState(() { - medMainMemController.text = "No"; - medMainMemberPosition = value; - }); - } - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - controller: medNoController, - multiLineInput: false, - requiredText: true, - hintText: "No.", - validator: (validationValue) { - if (value) { - return MihValidationServices() - .isEmpty(validationValue); - } - return null; - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - controller: medAidCodeController, - multiLineInput: false, - requiredText: true, - hintText: "Code", - validator: (validationValue) { - if (value) { - return MihValidationServices() - .isEmpty(validationValue); - } - return null; - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - controller: medNameController, - multiLineInput: false, - requiredText: true, - hintText: "Name", - validator: (validationValue) { - if (value) { - return MihValidationServices() - .isEmpty(validationValue); - } - return null; - }, - ), - const SizedBox(height: 10.0), - MihTextFormField( - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - inputColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - controller: medSchemeController, - multiLineInput: false, - requiredText: true, - hintText: "Plan", - validator: (validationValue) { - if (value) { - return MihValidationServices() - .isEmpty(validationValue); - } - return null; - }, - ), - const SizedBox(height: 10.0), - ], - ), - ); - }, - ), - const SizedBox(height: 20.0), - Center( - child: MihButton( - onPressed: () { - if (_formKey.currentState!.validate()) { - submitForm(); - } else { - MihAlertServices().formNotFilledCompletely(context); - } - }, - buttonColor: MihColors.getGreenColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - width: 300, - child: Text( - "Update", - style: TextStyle( - color: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - const SizedBox(height: 20.0), - ], - ), - ], - ), - ), - ); - } - - void submitForm() { - updatePatientApiCall(); - } - - MIHAction getActionButton() { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - context.goNamed( - 'patientProfile', - extra: PatientViewArguments( - widget.signedInUser, - null, - null, - null, - "personal", - ), - ); - // Navigator.of(context).pop(); - }, - ); - } - - MIHHeader getHeader() { - return const MIHHeader( - headerAlignment: MainAxisAlignment.center, - headerItems: [ - Text( - "Edit Patient Details", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - ], - ); - } - - MIHBody getBody(double width) { - return MIHBody( - borderOn: false, - bodyItems: [ - KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - if (_formKey.currentState!.validate()) { - submitForm(); - } else { - MihAlertServices().formNotFilledCompletely(context); - } - } - }, - child: displayForm(width), - ), - ], - ); - } - - @override - void dispose() { - idController.dispose(); - fnameController.dispose(); - lnameController.dispose(); - cellController.dispose(); - emailController.dispose(); - medNoController.dispose(); - medNameController.dispose(); - medSchemeController.dispose(); - addressController.dispose(); - medAidController.dispose(); - medAidCodeController.removeListener(isRequired); - medMainMemController.dispose(); - medAidCodeController.dispose(); - medRequired.dispose(); - _focusNode.dispose(); - super.dispose(); - } - - @override - void initState() { - getLoginUserEmail(); - medAidController.addListener(isRequired); - setState(() { - idController.text = widget.selectedPatient.id_no; - fnameController.text = widget.selectedPatient.first_name; - lnameController.text = widget.selectedPatient.last_name; - cellController.text = widget.selectedPatient.cell_no; - emailController.text = widget.selectedPatient.email; - medNameController.text = widget.selectedPatient.medical_aid_name; - medNoController.text = widget.selectedPatient.medical_aid_no; - medSchemeController.text = widget.selectedPatient.medical_aid_scheme; - addressController.text = widget.selectedPatient.address; - medAidController.text = widget.selectedPatient.medical_aid; - medMainMemController.text = - widget.selectedPatient.medical_aid_main_member; - medAidCodeController.text = widget.selectedPatient.medical_aid_code; - }); - - if (medAidController.text == "Yes") { - medAidPosition = true; - } else { - medAidPosition = false; - medAidController.text = "No"; - } - if (medMainMemController.text == "Yes") { - medMainMemberPosition = true; - } else { - medMainMemberPosition = false; - medMainMemController.text = "No"; - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - var size = MediaQuery.of(context).size; - setState(() { - width = size.width; - height = size.height; - }); - return MIHLayoutBuilder( - actionButton: getActionButton(), - header: getHeader(), - secondaryActionButton: null, - body: getBody(width), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, - ); - } -} diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart index fccb9c0b..420def9f 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_profile.dart @@ -2,18 +2,21 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tools/patient_claim_or_statement.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/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tools/patient_consultation.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tools/patient_documents.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tools/patient_info.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; +import 'package:provider/provider.dart'; class PatientProfile extends StatefulWidget { - final PatientViewArguments arguments; + final String? patientAppId; const PatientProfile({ super.key, - required this.arguments, + required this.patientAppId, }); @override @@ -21,7 +24,42 @@ class PatientProfile extends StatefulWidget { } class _PatientProfileState extends State { - int _selcetedIndex = 0; + bool isLoading = true; + + Future initialisePatientData() async { + setState(() { + isLoading = true; + }); + MzansiProfileProvider profileProvider = + context.read(); + PatientManagerProvider patientManagerProvider = + context.read(); + String? app_id = widget.patientAppId ?? profileProvider.user!.app_id; + + if (patientManagerProvider.selectedPatient == null) { + await MihPatientServices() + .getPatientDetails(app_id, patientManagerProvider); + } + + if (patientManagerProvider.selectedPatient == null) { + // go to set up patient package + context.goNamed("patientProfileSetup"); + } else { + await MihPatientServices() + .getPatientConsultationNotes(patientManagerProvider); + await MihPatientServices().getPatientDocuments(patientManagerProvider); + } + setState(() { + isLoading = false; + }); + } + + @override + void initState() { + super.initState(); + initialisePatientData(); + } + @override Widget build(BuildContext context) { return MihPackage( @@ -29,21 +67,24 @@ class _PatientProfileState extends State { appTools: getTools(), appBody: getToolBody(), appToolTitles: getToolTitle(), - selectedbodyIndex: _selcetedIndex, + selectedbodyIndex: + context.watch().patientProfileIndex, onIndexChange: (newValue) { - setState(() { - _selcetedIndex = newValue; - }); + context.read().setPatientProfileIndex(newValue); }, ); } MihPackageAction getAction() { + PatientManagerProvider patientManagerProvider = + context.read(); return MihPackageAction( icon: const Icon(Icons.arrow_back), iconSize: 35, onTap: () { - if (widget.arguments.type == "business") { + patientManagerProvider.setPatientProfileIndex(0); + patientManagerProvider.setPatientManagerIndex(0); + if (!patientManagerProvider.personalMode) { context.pop(); } else { context.goNamed( @@ -56,64 +97,54 @@ class _PatientProfileState extends State { } MihPackageTools getTools() { + PatientManagerProvider patientManagerProvider = + context.read(); Map temp = {}; temp[const Icon(Icons.perm_identity)] = () { - setState(() { - _selcetedIndex = 0; - }); + patientManagerProvider.setPatientProfileIndex(0); }; temp[const Icon(Icons.article_outlined)] = () { - setState(() { - _selcetedIndex = 1; - }); + patientManagerProvider.setPatientProfileIndex(1); }; temp[const Icon(Icons.file_present)] = () { - setState(() { - _selcetedIndex = 2; - }); + patientManagerProvider.setPatientProfileIndex(2); }; temp[const Icon(Icons.file_open_outlined)] = () { - setState(() { - _selcetedIndex = 3; - }); + patientManagerProvider.setPatientProfileIndex(3); }; return MihPackageTools( tools: temp, - selcetedIndex: _selcetedIndex, + selcetedIndex: patientManagerProvider.patientProfileIndex, ); } List getToolBody() { + if (isLoading) { + return [ + Center( + child: Mihloadingcircle(), + ), + ]; + } + PatientManagerProvider patientManagerProvider = + context.read(); + if (patientManagerProvider.selectedPatient == null) { + return [ + const SizedBox(), + ]; + } List toolBodies = [ - PatientInfo( - signedInUser: widget.arguments.signedInUser, - selectedPatient: widget.arguments.selectedPatient!, - type: widget.arguments.type, - ), - PatientConsultation( - patientAppId: widget.arguments.selectedPatient!.app_id, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ), - PatientDocuments( - patientIndex: widget.arguments.selectedPatient!.idpatients, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ), - PatientClaimOrStatement( - patientIndex: widget.arguments.selectedPatient!.idpatients, - selectedPatient: widget.arguments.selectedPatient!, - signedInUser: widget.arguments.signedInUser, - business: widget.arguments.business, - businessUser: widget.arguments.businessUser, - type: widget.arguments.type, - ), + PatientInfo(), + PatientConsultation(), + PatientDocuments(), + // PatientClaimOrStatement( + // patientIndex: widget.arguments.selectedPatient!.idpatients, + // selectedPatient: widget.arguments.selectedPatient!, + // signedInUser: widget.arguments.signedInUser, + // business: widget.arguments.business, + // businessUser: widget.arguments.businessUser, + // type: widget.arguments.type, + // ), ]; return toolBodies; } diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_set_up.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_set_up.dart new file mode 100644 index 00000000..5f4f319d --- /dev/null +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/patient_set_up.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +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_providers/patient_manager_provider.dart'; +import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tools/patient_setup_form.dart'; +import 'package:provider/provider.dart'; + +class PatientSetUp extends StatefulWidget { + const PatientSetUp({super.key}); + + @override + State createState() => _PatientSetUpState(); +} + +class _PatientSetUpState extends State { + @override + Widget build(BuildContext context) { + return MihPackage( + appActionButton: getAction(), + appTools: getTools(), + appBody: getToolBody(), + appToolTitles: getToolTitle(), + selectedbodyIndex: + context.watch().patientProfileIndex, + onIndexChange: (newValue) { + context.read().setPatientProfileIndex(newValue); + }, + ); + } + + MihPackageAction getAction() { + return MihPackageAction( + icon: const Icon(Icons.arrow_back), + iconSize: 35, + onTap: () { + context.goNamed( + 'mihHome', + ); + FocusScope.of(context).unfocus(); + }, + ); + } + + MihPackageTools getTools() { + PatientManagerProvider patientManagerProvider = + context.read(); + Map temp = {}; + temp[const Icon(Icons.medical_services)] = () { + patientManagerProvider.setPatientProfileIndex(0); + }; + return MihPackageTools( + tools: temp, + selcetedIndex: patientManagerProvider.patientProfileIndex, + ); + } + + List getToolBody() { + List toolBodies = [ + PatientSetupForm(), + ]; + return toolBodies; + } + + List getToolTitle() { + List toolTitles = [ + "Set Up Patient Profile", + ]; + return toolTitles; + } +} diff --git a/Frontend/lib/mih_packages/test/test.dart b/Frontend/lib/mih_packages/test/test.dart deleted file mode 100644 index af787b72..00000000 --- a/Frontend/lib/mih_packages/test/test.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../mih_components/mih_layout/mih_action.dart'; -import '../../mih_components/mih_layout/mih_body.dart'; -import '../../mih_components/mih_layout/mih_header.dart'; -import '../../mih_components/mih_layout/mih_layout_builder.dart'; - -class MIHTest extends StatefulWidget { - const MIHTest({super.key}); - - @override - State createState() => _MIHTestState(); -} - -class _MIHTestState extends State { - // late YoutubePlayerController videoController; - // String videoLink = "https://www.youtube.com/watch?v=P2bM9eosJ_A"; - // @override - // void initState() { - // videoController = YoutubePlayerController( - // initialVideoId: "P2bM9eosJ_A", - // ); - // super.initState(); - // } - - @override - Widget build(BuildContext context) { - return MIHLayoutBuilder( - actionButton: MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - Navigator.of(context).pushNamedAndRemoveUntil( - '/', - arguments: true, - (route) => false, - ); - }, - ), - header: const MIHHeader( - headerAlignment: MainAxisAlignment.center, - headerItems: [ - Text( - "Test", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - ], - ), - secondaryActionButton: null, - body: const MIHBody( - borderOn: false, - bodyItems: [ - // YoutubePlayer( - // controller: videoController, - // ), - ], - ), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, - ); - } -} diff --git a/Frontend/lib/mih_services/mih_patient_services.dart b/Frontend/lib/mih_services/mih_patient_services.dart index 57420896..10e1bea3 100644 --- a/Frontend/lib/mih_services/mih_patient_services.dart +++ b/Frontend/lib/mih_services/mih_patient_services.dart @@ -1,7 +1,12 @@ import 'dart:convert'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:ken_logger/ken_logger.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/files.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/notes.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:supertokens_flutter/http.dart' as http; @@ -10,6 +15,7 @@ class MihPatientServices { Future getPatientDetails( String appId, + PatientManagerProvider patientManagerProvider, ) async { var response = await http.get( Uri.parse("${AppEnviroment.baseApiUrl}/patients/$appId"), @@ -19,8 +25,11 @@ class MihPatientServices { ); if (response.statusCode == 200) { String body = response.body; + KenLogger.success(response.body); var jsonBody = jsonDecode(body); - return Patient.fromJson(jsonBody); + Patient patient = Patient.fromJson(jsonBody); + patientManagerProvider.setSelectedPatient(selectedPatient: patient); + return patient; } else { return null; } @@ -39,7 +48,8 @@ class MihPatientServices { String medName, String medScheme, String address, - AppUser signedInUser, + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, ) async { var response = await http.post( Uri.parse("$baseAPI/patients/insert/"), @@ -59,9 +69,31 @@ class MihPatientServices { "medical_aid_name": medName, "medical_aid_scheme": medScheme, "address": address, - "app_id": signedInUser.app_id, + "app_id": profileProvider.user!.app_id, }), ); + if (response.statusCode == 201) { + await getPatientDetails( + profileProvider.user!.app_id, patientManagerProvider); + // patientManagerProvider.setSelectedPatient( + // selectedPatient: Patient( + // idpatients: 0, + // id_no: id_no, + // first_name: fname, + // last_name: lname, + // email: email, + // cell_no: cell, + // medical_aid: medAid, + // medical_aid_name: medName, + // medical_aid_no: medNo, + // medical_aid_main_member: medMainMem, + // medical_aid_code: medAidCode, + // medical_aid_scheme: medScheme, + // address: address, + // app_id: profileProvider.user!.app_id, + // ), + // ); + } return response.statusCode; } @@ -79,6 +111,7 @@ class MihPatientServices { String medName, String medScheme, String address, + PatientManagerProvider patientManagerProvider, ) async { var response = await http.put( Uri.parse("$baseAPI/patients/update/"), @@ -101,6 +134,159 @@ class MihPatientServices { "app_id": app_id, }), ); + if (response.statusCode == 200) { + await getPatientDetails(app_id, patientManagerProvider); + } + return response.statusCode; + } + + Future getPatientConsultationNotes( + PatientManagerProvider patientManagerProvider) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/notes/patients/${patientManagerProvider.selectedPatient!.app_id}")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List notes = + List.from(l.map((model) => Note.fromJson(model))); + patientManagerProvider.setConsultationNotes(consultationNotes: notes); + } + return response.statusCode; + } + + Future addPatientNoteAPICall( + String title, + String noteText, + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + ) async { + var response = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "note_name": title, + "note_text": noteText, + "doc_office": profileProvider.business!.Name, + "doctor": + "${profileProvider.user!.fname} ${profileProvider.user!.lname}", + "app_id": patientManagerProvider.selectedPatient!.app_id, + }), + ); + if (response.statusCode == 201) { + await getPatientConsultationNotes(patientManagerProvider); + } + return response.statusCode; + } + + Future deletePatientConsultaionNote( + int NoteId, + PatientManagerProvider patientManagerProvider, + ) async { + var response = await http.delete( + Uri.parse("$baseAPI/notes/delete/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({"idpatient_notes": NoteId}), + ); + if (response.statusCode == 201) { + await getPatientConsultationNotes(patientManagerProvider); + } + return response.statusCode; + } + + Future getPatientDocuments( + PatientManagerProvider patientManagerProvider) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/patient_files/get/${patientManagerProvider.selectedPatient!.app_id}")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List patientDocuments = + List.from(l.map((model) => PFile.fromJson(model))); + patientManagerProvider.setPatientDocuments( + patientDocuments: patientDocuments); + } + return response.statusCode; + } + + Future addPatientFile( + PlatformFile? file, + PatientManagerProvider patientManagerProvider, + ) async { + var fname = file!.name.replaceAll(RegExp(r' '), '-'); + var filePath = + "${patientManagerProvider.selectedPatient!.app_id}/patient_files/$fname"; + var response = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/patient_files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": filePath, + "file_name": fname, + "app_id": patientManagerProvider.selectedPatient!.app_id + }), + ); + if (response.statusCode == 201) { + await getPatientDocuments(patientManagerProvider); + } + return response.statusCode; + } + + Future generateMedicalCertificate( + String startDate, + String endDate, + String returnDate, + MzansiProfileProvider profileProvider, + PatientManagerProvider patientManagerProvider, + ) async { + DateTime now = DateTime.now(); + String fileName = + "Med-Cert-${patientManagerProvider.selectedPatient!.first_name} ${patientManagerProvider.selectedPatient!.last_name}-${now.toString().substring(0, 19)}.pdf" + .replaceAll(RegExp(r' '), '-'); + var response = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/minio/generate/med-cert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "app_id": patientManagerProvider.selectedPatient!.app_id, + "env": AppEnviroment.getEnv(), + "patient_full_name": + "${patientManagerProvider.selectedPatient!.first_name} ${patientManagerProvider.selectedPatient!.last_name}", + "fileName": fileName, + "id_no": patientManagerProvider.selectedPatient!.id_no, + "docfname": + "DR. ${profileProvider.user!.fname} ${profileProvider.user!.lname}", + "startDate": startDate, + "busName": profileProvider.business!.Name, + "busAddr": "*TO BE ADDED IN THE FUTURE*", + "busNo": profileProvider.business!.contact_no, + "busEmail": profileProvider.business!.bus_email, + "endDate": endDate, + "returnDate": returnDate, + "logo_path": profileProvider.business!.logo_path, + "sig_path": profileProvider.businessUser!.sig_path, + }), + ); + if (response.statusCode == 200) { + var responseAddFiletoDB = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/patient_files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": + "${patientManagerProvider.selectedPatient!.app_id}/patient_files/$fileName", + "file_name": fileName, + "app_id": patientManagerProvider.selectedPatient!.app_id + }), + ); + if (responseAddFiletoDB.statusCode == 201) { + await getPatientDocuments(patientManagerProvider); + } + } return response.statusCode; } } diff --git a/Frontend/lib/mih_services/mih_service_calls.dart b/Frontend/lib/mih_services/mih_service_calls.dart index ec463b70..2fc9014e 100644 --- a/Frontend/lib/mih_services/mih_service_calls.dart +++ b/Frontend/lib/mih_services/mih_service_calls.dart @@ -4,7 +4,6 @@ import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_my_business_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_notification_services.dart'; import 'package:flutter/material.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/http.dart' as http; @@ -88,14 +87,14 @@ class MIHApiCalls { ); //get patient profile - Patient? patient = await MihPatientServices().getPatientDetails( - uid, - ); - if (patient != null) { - patientData = patient; - } else { - patientData = null; - } + // Patient? patient = await MihPatientServices().getPatientDetails( + // uid, + // ); + // if (patient != null) { + // patientData = patient; + // } else { + // patientData = null; + // } return HomeArguments( userData, bUserData, busData, patientData, notifi, userPic);