NEW: Patient Manager Provider Setup pt1

This commit is contained in:
2025-10-27 18:46:20 +02:00
parent fd2f3a2138
commit f548db7d82
18 changed files with 1784 additions and 2202 deletions

View File

@@ -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<MzansiInnovationHub> {
ChangeNotifierProvider(
create: (context) => MihMineSweeperProvider(),
),
ChangeNotifierProvider(
create: (context) => PatientManagerProvider(),
),
],
child: MaterialApp.router(
title: getTitle(),

View File

@@ -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<Note>? consultationNotes;
List<PFile>? 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<Note>? consultationNotes}) {
this.consultationNotes = consultationNotes ?? [];
notifyListeners();
}
void setPatientDocuments({required List<PFile>? patientDocuments}) {
this.patientDocuments = patientDocuments ?? [];
notifyListeners();
}
}

View File

@@ -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<MzansiProfileProvider>().business == null) {
if (context.watch<MzansiProfileProvider>().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<MzansiProfileProvider>().business == null) {
if (context.watch<MzansiProfileProvider>().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<MzansiProfileProvider>().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<MzansiProfileProvider>().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<MzansiProfileProvider>().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<MzansiProfileProvider>().business == null) {
if (context.watch<MzansiProfileProvider>().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<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
});
return const SizedBox.shrink();
}
return MihMineSweeper();
},
),

View File

@@ -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<AddOrViewPatient> createState() => _AddOrViewPatientState();
}
class _AddOrViewPatientState extends State<AddOrViewPatient> {
late double width;
late double height;
late Widget loading;
late Future<Patient?> patient;
Future<Patient?> 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);
}
},
);
}
}

View File

@@ -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<AddPatient> createState() => _AddPatientState();
State<MihEditPatientDetailsWindow> createState() =>
_MihEditPatientDetailsWindowState();
}
class _AddPatientState extends State<AddPatient> {
final idController = TextEditingController();
class _MihEditPatientDetailsWindowState
extends State<MihEditPatientDetailsWindow> {
var idController = TextEditingController();
final fnameController = TextEditingController();
final lnameController = TextEditingController();
final cellController = TextEditingController();
@@ -45,51 +37,16 @@ class _AddPatientState extends State<AddPatient> {
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<bool> medRequired = ValueNotifier(false);
final FocusNode _focusNode = FocusNode();
final _formKey = GlobalKey<FormState>();
late bool medAidPosition;
late bool medMainMemberPosition;
final ValueNotifier<bool> 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<void> addPatientService() async {
int statusCode = await MihPatientServices().addPatientService(
Future<void> 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<AddPatient> {
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<AddPatient> {
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<AddPatient> {
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<AddPatient> {
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
submitForm();
updatePatientApiCall(patientManagerProvider);
} else {
MihAlertServices().formNotFilledCompletely(context);
}
@@ -494,7 +433,7 @@ class _AddPatientState extends State<AddPatient> {
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<AddPatient> {
);
}
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<AddPatient> {
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<AddPatient> {
@override
void initState() {
medAidController.addListener(isRequired);
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
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<PatientManagerProvider>(
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),
// ),
// )
// ],
// ),
// ),
// );
}
}

View File

@@ -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<PFile> 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<BuildFilesList> {
return teporaryFileUrl;
}
Future<void> 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<void> 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<void> deletePatientFileLocationToDB(int fileID) async {
showDialog(
context: context,
builder: (context) {
return const Mihloadingcircle();
},
);
var response2 = await http.delete(
Uri.parse("$baseAPI/patient_files/delete/"),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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<void> deletePatientFileLocationToDB(int fileID) async {
// showDialog(
// context: context,
// builder: (context) {
// return const Mihloadingcircle();
// },
// );
// var response2 = await http.delete(
// Uri.parse("$baseAPI/patient_files/delete/"),
// headers: <String, String>{
// "Content-Type": "application/json; charset=UTF-8"
// },
// body: jsonEncode(<String, dynamic>{
// "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<BuildFilesList> {
);
}
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<BuildFilesList> {
}
}
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<BuildFilesList> {
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
deleteFilePopUp(filePath, fileID);
// deleteFilePopUp(filePath, fileID);
},
),
);
@@ -368,133 +352,138 @@ class _BuildFilesListState extends State<BuildFilesList> {
@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<MzansiProfileProvider, PatientManagerProvider>(
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,
// ),
// );
}
);
}
},
);
}
}

View File

@@ -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<Note> 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<BuildNotesList> {
int indexOn = 0;
final baseAPI = AppEnviroment.baseApiUrl;
Future<void> deleteNoteApiCall(int NoteId) async {
var response = await http.delete(
Uri.parse("$baseAPI/notes/delete/"),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{"idpatient_notes": NoteId}),
);
Future<void> 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<BuildNotesList> {
);
}
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<BuildNotesList> {
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<BuildNotesList> {
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<BuildNotesList> {
@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<MzansiProfileProvider, PatientManagerProvider>(
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,
// ),
// );
}
);
}
},
);
}
}

View File

@@ -28,7 +28,6 @@ class _PatientProfileTileState extends State<PatientProfileTile> {
onTap: () {
context.goNamed(
'patientProfile',
extra: widget.arguments,
);
// Navigator.of(context).pushNamed(
// '/patient-profile',

View File

@@ -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<PatientConsultation> {
late Future<List<Note>> futueNotes;
final titleController = TextEditingController();
final noteTextController = TextEditingController();
final officeController = TextEditingController();
@@ -56,33 +38,18 @@ class _PatientConsultationState extends State<PatientConsultation> {
String endpoint = "${AppEnviroment.baseApiUrl}/notes/patients/";
final _formKey = GlobalKey<FormState>();
Future<List<Note>> 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<Note> notes =
List<Note>.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<PatientConsultation> {
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
addPatientNoteAPICall();
// addPatientNoteAPICall();
Navigator.pop(context);
} else {
MihAlertServices().formNotFilledCompletely(context);
@@ -236,38 +203,6 @@ class _PatientConsultationState extends State<PatientConsultation> {
);
}
Future<void> addPatientNoteAPICall() async {
// String title = "";
// if (widget.businessUser!.title == "Doctor") {
// title = "Dr.";
// }
var response = await http.post(
Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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<PatientConsultation> {
@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<PatientConsultation> {
}
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<MzansiProfileProvider, PatientManagerProvider>(
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);
},
)
],
),
),
),
),
),
],
],
);
},
);
}
}

View File

@@ -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<PatientDocuments> {
late Future<List<PFile>> futueFiles;
final selectedFileController = TextEditingController();
final startDateController = TextEditingController();
final endDateTextController = TextEditingController();
@@ -68,9 +52,10 @@ class _PatientDocumentsState extends State<PatientDocuments> {
final _formKey2 = GlobalKey<FormState>();
late String env;
Future<void> submitDocUploadForm() async {
Future<void> 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<PatientDocuments> {
}
}
Future<List<PFile>> 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<PFile> files =
List<PFile>.from(l.map((model) => PFile.fromJson(model)));
return files;
} else {
internetConnectionPopUp();
throw Exception('failed to load patients');
}
}
Future<void> addPatientFileLocationToDB(PlatformFile? file) async {
Future<void> 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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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<void> uploadSelectedFile(PlatformFile? file) async {
Future<void> 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<void> generateMedCert() async {
Future<void> generateMedCert(MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider) async {
//start loading circle
showDialog(
context: context,
@@ -157,73 +116,30 @@ class _PatientDocumentsState extends State<PatientDocuments> {
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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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<PatientDocuments> {
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
submitDocUploadForm();
submitDocUploadForm(patientManagerProvider);
// uploadSelectedFile(selected);
Navigator.pop(context);
} else {
@@ -336,7 +252,10 @@ class _PatientDocumentsState extends State<PatientDocuments> {
);
}
void medCertPopUp() {
void medCertPopUp(
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
) {
showDialog(
context: context,
barrierDismissible: false,
@@ -387,7 +306,8 @@ class _PatientDocumentsState extends State<PatientDocuments> {
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<PatientDocuments> {
);
}
void prescritionPopUp() {
void prescritionPopUp(
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
) {
showDialog(
context: context,
barrierDismissible: false,
@@ -442,10 +365,10 @@ class _PatientDocumentsState extends State<PatientDocuments> {
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<PatientDocuments> {
}
}
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<PatientDocuments> {
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
uploudFilePopUp(width);
uploudFilePopUp(patientManagerProvider, width);
},
)
],
@@ -529,7 +453,7 @@ class _PatientDocumentsState extends State<PatientDocuments> {
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
uploudFilePopUp(width);
uploudFilePopUp(patientManagerProvider, width);
},
),
SpeedDialChild(
@@ -549,7 +473,7 @@ class _PatientDocumentsState extends State<PatientDocuments> {
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
medCertPopUp();
medCertPopUp(profileProvider, patientManagerProvider);
},
),
SpeedDialChild(
@@ -569,7 +493,7 @@ class _PatientDocumentsState extends State<PatientDocuments> {
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
prescritionPopUp();
prescritionPopUp(profileProvider, patientManagerProvider);
},
),
],
@@ -578,13 +502,56 @@ class _PatientDocumentsState extends State<PatientDocuments> {
}
}
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<PatientDocuments> {
@override
void initState() {
futueFiles = fetchFiles();
if (AppEnviroment.getEnv() == "Prod") {
env = "Prod";
} else {
@@ -636,39 +602,20 @@ class _PatientDocumentsState extends State<PatientDocuments> {
}
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<MzansiProfileProvider, PatientManagerProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider, Widget? child) {
return Stack(
children: [
MihSingleChildScroll(
child: Column(children: [
BuildFilesList(),
]),
),
getMenu(profileProvider, patientManagerProvider, width),
],
);
},
);
}
}

View File

@@ -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<PatientInfo> {
);
}
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<PatientInfo> {
@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<PatientInfo> {
}
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<MzansiProfileProvider, PatientManagerProvider>(
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<PatientInfo> {
"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();
},
)
],
),
),
),
),
),
],
],
);
},
);
}
}

View File

@@ -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<PatientSetupForm> createState() => _PatientSetupFormState();
}
class _PatientSetupFormState extends State<PatientSetupForm> {
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<FormState>();
final FocusNode _focusNode = FocusNode();
late bool medAidPosition;
late bool medMainMemberPosition;
final ValueNotifier<bool> medRequired = ValueNotifier(false);
Future<void> 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<MzansiProfileProvider, PatientManagerProvider>(
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<MzansiProfileProvider>();
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);
}
}

View File

@@ -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<EditPatient> createState() => _EditPatientState();
}
class _EditPatientState extends State<EditPatient> {
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<FormState>();
late bool medAidPosition;
late bool medMainMemberPosition;
late int futureDocOfficeId;
late String userEmail;
// bool medRequired = false;
final ValueNotifier<bool> 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<String, dynamic>);
// setState(() {
// //futureDocOfficeId = u.docOffice_id;
// //print(futureDocOfficeId);
// });
// } else {
// internetConnectionPopUp();
// throw Exception('failed to load patients');
// }
// }
Future<void> 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: <String, String>{
// "Content-Type": "application/json; charset=UTF-8"
// },
// body: jsonEncode(<String, dynamic>{
// "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<void> 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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(
<String, dynamic>{"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<void> 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 {},
);
}
}

View File

@@ -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<PatientProfile> {
int _selcetedIndex = 0;
bool isLoading = true;
Future<void> initialisePatientData() async {
setState(() {
isLoading = true;
});
MzansiProfileProvider profileProvider =
context.read<MzansiProfileProvider>();
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
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<PatientProfile> {
appTools: getTools(),
appBody: getToolBody(),
appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex,
selectedbodyIndex:
context.watch<PatientManagerProvider>().patientProfileIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
context.read<PatientManagerProvider>().setPatientProfileIndex(newValue);
},
);
}
MihPackageAction getAction() {
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
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<PatientProfile> {
}
MihPackageTools getTools() {
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
Map<Widget, void Function()?> 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<Widget> getToolBody() {
if (isLoading) {
return [
Center(
child: Mihloadingcircle(),
),
];
}
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
if (patientManagerProvider.selectedPatient == null) {
return [
const SizedBox(),
];
}
List<Widget> 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;
}

View File

@@ -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<PatientSetUp> createState() => _PatientSetUpState();
}
class _PatientSetUpState extends State<PatientSetUp> {
@override
Widget build(BuildContext context) {
return MihPackage(
appActionButton: getAction(),
appTools: getTools(),
appBody: getToolBody(),
appToolTitles: getToolTitle(),
selectedbodyIndex:
context.watch<PatientManagerProvider>().patientProfileIndex,
onIndexChange: (newValue) {
context.read<PatientManagerProvider>().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<PatientManagerProvider>();
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.medical_services)] = () {
patientManagerProvider.setPatientProfileIndex(0);
};
return MihPackageTools(
tools: temp,
selcetedIndex: patientManagerProvider.patientProfileIndex,
);
}
List<Widget> getToolBody() {
List<Widget> toolBodies = [
PatientSetupForm(),
];
return toolBodies;
}
List<String> getToolTitle() {
List<String> toolTitles = [
"Set Up Patient Profile",
];
return toolTitles;
}
}

View File

@@ -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<MIHTest> createState() => _MIHTestState();
}
class _MIHTestState extends State<MIHTest> {
// 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 {},
);
}
}

View File

@@ -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<Patient?> 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<int> 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<Note> notes =
List<Note>.from(l.map((model) => Note.fromJson(model)));
patientManagerProvider.setConsultationNotes(consultationNotes: notes);
}
return response.statusCode;
}
Future<int> addPatientNoteAPICall(
String title,
String noteText,
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
) async {
var response = await http.post(
Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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<int> deletePatientConsultaionNote(
int NoteId,
PatientManagerProvider patientManagerProvider,
) async {
var response = await http.delete(
Uri.parse("$baseAPI/notes/delete/"),
headers: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{"idpatient_notes": NoteId}),
);
if (response.statusCode == 201) {
await getPatientConsultationNotes(patientManagerProvider);
}
return response.statusCode;
}
Future<int> 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<PFile> patientDocuments =
List<PFile>.from(l.map((model) => PFile.fromJson(model)));
patientManagerProvider.setPatientDocuments(
patientDocuments: patientDocuments);
}
return response.statusCode;
}
Future<int> 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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"file_path": filePath,
"file_name": fname,
"app_id": patientManagerProvider.selectedPatient!.app_id
}),
);
if (response.statusCode == 201) {
await getPatientDocuments(patientManagerProvider);
}
return response.statusCode;
}
Future<int> 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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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: <String, String>{
"Content-Type": "application/json; charset=UTF-8"
},
body: jsonEncode(<String, dynamic>{
"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;
}
}

View File

@@ -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);