NEW: Patient Manager Provider Setup pt3

This commit is contained in:
2025-10-29 15:43:05 +02:00
parent 99d0fa4aa8
commit 39a42048c2
13 changed files with 263 additions and 295 deletions

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/claim_statement_file.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/patient_access.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart';
class PatientManagerProvider extends ChangeNotifier {
@@ -9,6 +10,7 @@ class PatientManagerProvider extends ChangeNotifier {
int patientManagerIndex;
int fileViewerIndex;
bool personalMode;
List<PatientAccess>? myPaitentList;
Patient? selectedPatient;
List<Note>? consultationNotes;
List<PFile>? patientDocuments;
@@ -53,6 +55,11 @@ class PatientManagerProvider extends ChangeNotifier {
notifyListeners();
}
void setMyPatientList({required List<PatientAccess>? myPaitentList}) {
this.myPaitentList = myPaitentList ?? [];
notifyListeners();
}
void setConsultationNotes({required List<Note>? consultationNotes}) {
this.consultationNotes = consultationNotes ?? [];
notifyListeners();

View File

@@ -320,6 +320,7 @@ class MihGoRouter {
name: "mihAccess",
path: MihGoRouterPaths.mihAccess,
builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: mihAccess");
if (context.watch<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
@@ -336,20 +337,21 @@ class MihGoRouter {
name: "patientProfile",
path: MihGoRouterPaths.patientProfile,
builder: (BuildContext context, GoRouterState state) {
final String? argPatientAppId = state.extra as String?;
KenLogger.success("MihGoRouter: patientProfile");
if (context.watch<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
});
return const SizedBox.shrink();
}
return PatientProfile(patientAppId: argPatientAppId);
return PatientProfile();
},
),
GoRoute(
name: "patientProfileSetup",
path: MihGoRouterPaths.patientProfileSetup,
builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: patientProfileSetup");
if (context.watch<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
@@ -363,8 +365,8 @@ class MihGoRouter {
name: "patientManager",
path: MihGoRouterPaths.patientManager,
builder: (BuildContext context, GoRouterState state) {
final PatManagerArguments? args = state.extra as PatManagerArguments?;
if (args == null) {
KenLogger.success("MihGoRouter: patientManager");
if (context.watch<MzansiProfileProvider>().business == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
});
@@ -372,7 +374,6 @@ class MihGoRouter {
}
return PatManager(
key: UniqueKey(),
arguments: args,
);
},
),
@@ -380,14 +381,14 @@ class MihGoRouter {
name: "patientManagerPatient",
path: MihGoRouterPaths.patientManagerPatient,
builder: (BuildContext context, GoRouterState state) {
final String? argPatientAppId = state.extra as String?;
KenLogger.success("MihGoRouter: patientManagerPatient");
if (context.watch<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
});
return const SizedBox.shrink();
}
return PatientProfile(patientAppId: argPatientAppId);
return PatientProfile();
},
),
// ========================== Mzansi Directory ==================================
@@ -395,6 +396,7 @@ class MihGoRouter {
name: "mzansiDirectory",
path: MihGoRouterPaths.mzansiDirectory,
builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: mzansiDirectory");
if (context.watch<MzansiProfileProvider>().user == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome);
@@ -409,6 +411,7 @@ class MihGoRouter {
name: "fileViewer",
path: MihGoRouterPaths.fileViewer,
builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: fileViewer");
final FileViewArguments? args = state.extra as FileViewArguments?;
return FullScreenFileViewer(arguments: args!);
},
@@ -417,6 +420,7 @@ class MihGoRouter {
name: "printPreview",
path: MihGoRouterPaths.printPreview,
builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: printPreview");
final PrintPreviewArguments? args =
state.extra as PrintPreviewArguments?;
return MIHPrintPreview(arguments: args!);

View File

@@ -1,9 +1,11 @@
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_service_calls.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_calendar_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
@@ -15,26 +17,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
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_warning_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/patient_access.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/patients.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class BuildMyPatientListList extends StatefulWidget {
final List<PatientAccess> patientAccesses;
final AppUser signedInUser;
final Business? business;
final BusinessUser? businessUser;
const BuildMyPatientListList({
super.key,
required this.patientAccesses,
required this.signedInUser,
required this.business,
required this.businessUser,
});
@override
@@ -51,24 +39,21 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
final baseAPI = AppEnviroment.baseApiUrl;
Future<void> submitApointment(int index) async {
Future<void> submitApointment(MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider, int index) async {
//To-Do: Add the appointment to the database
// print("To-Do: Add the appointment to the database");
String description =
"Date: ${dateController.text}\nTime: ${timeController.text}\n";
description += "Medical Practice: ${widget.business!.Name}\n";
description += "Contact Number: ${widget.business!.contact_no}";
description += "Medical Practice: ${profileProvider.business!.Name}\n";
description += "Contact Number: ${profileProvider.business!.contact_no}";
int statusCode;
statusCode = await MihMzansiCalendarApis.addPatientAppointment(
widget.signedInUser,
profileProvider.user!,
false,
widget.patientAccesses[index].app_id,
BusinessArguments(
widget.signedInUser,
widget.businessUser,
widget.business,
),
"${widget.patientAccesses[index].fname} ${widget.patientAccesses[index].lname} - Doctors Visit",
patientManagerProvider.myPaitentList![index].app_id,
profileProvider.business!.business_id,
"${patientManagerProvider.myPaitentList![index].fname} ${patientManagerProvider.myPaitentList![index].lname} - Doctors Visit",
description,
dateController.text,
timeController.text,
@@ -164,11 +149,16 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
}
}
void appointmentPopUp(int index, double width) {
var firstLetterFName = widget.patientAccesses[index].fname;
var firstLetterLName = widget.patientAccesses[index].lname;
void appointmentPopUp(
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
int index,
double width,
) {
var firstLetterFName = patientManagerProvider.myPaitentList![index].fname;
var firstLetterLName = patientManagerProvider.myPaitentList![index].lname;
setState(() {
idController.text = widget.patientAccesses[index].id_no;
idController.text = patientManagerProvider.myPaitentList![index].id_no;
fnameController.text = firstLetterFName;
lnameController.text = firstLetterLName;
});
@@ -260,7 +250,8 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
if (_formKey.currentState!.validate()) {
bool filled = isAppointmentFieldsFilled();
if (filled) {
submitApointment(index);
submitApointment(
profileProvider, patientManagerProvider, index);
} else {
showDialog(
context: context,
@@ -299,8 +290,9 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
);
}
void noAccessWarning(int index) {
if (widget.patientAccesses[index].status == "pending") {
void noAccessWarning(
PatientManagerProvider patientManagerProvider, int index) {
if (patientManagerProvider.myPaitentList![index].status == "pending") {
showDialog(
context: context,
builder: (context) {
@@ -317,10 +309,11 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
}
}
bool hasAccessToProfile(int index) {
bool hasAccessToProfile(
PatientManagerProvider patientManagerProvider, int index) {
var hasAccess = false;
if (widget.patientAccesses[index].status == "approved") {
if (patientManagerProvider.myPaitentList![index].status == "approved") {
hasAccess = true;
} else {
hasAccess = false;
@@ -329,11 +322,15 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
}
void patientProfileChoicePopUp(
int index, Patient? patientProfile, double width) async {
var firstLetterFName = widget.patientAccesses[index].fname;
var firstLetterLName = widget.patientAccesses[index].lname;
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
int index,
double width,
) async {
var firstLetterFName = patientManagerProvider.myPaitentList![index].fname;
var firstLetterLName = patientManagerProvider.myPaitentList![index].lname;
setState(() {
idController.text = widget.patientAccesses[index].id_no;
idController.text = patientManagerProvider.myPaitentList![index].id_no;
fnameController.text = firstLetterFName;
lnameController.text = firstLetterLName;
});
@@ -405,7 +402,8 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
children: [
MihButton(
onPressed: () {
appointmentPopUp(index, width);
appointmentPopUp(profileProvider,
patientManagerProvider, index, width);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
@@ -423,25 +421,14 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
),
),
MihButton(
onPressed: () {
onPressed: () async {
await MihPatientServices().getPatientDetails(
patientManagerProvider.myPaitentList![index].app_id,
patientManagerProvider);
context.pop();
context.pushNamed('patientManagerPatient',
extra: PatientViewArguments(
widget.signedInUser,
patientProfile,
widget.businessUser,
widget.business,
"business",
));
// Navigator.of(context)
// .pushNamed('/patient-manager/patient',
// arguments: PatientViewArguments(
// widget.signedInUser,
// patientProfile,
// widget.businessUser,
// widget.business,
// "business",
// ));
context.pushNamed(
'patientManagerPatient',
);
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
@@ -468,33 +455,43 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
);
}
Widget displayMyPatientTile(int index, double width) {
Widget displayMyPatientTile(
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
int index,
double width,
) {
var firstName = "";
var lastName = "";
String access = widget.patientAccesses[index].status.toUpperCase();
String access =
patientManagerProvider.myPaitentList![index].status.toUpperCase();
TextSpan accessWithColour;
var hasAccess = false;
hasAccess = hasAccessToProfile(index);
hasAccess = hasAccessToProfile(patientManagerProvider, index);
//print(hasAccess);
if (access == "APPROVED") {
firstName = widget.patientAccesses[index].fname;
lastName = widget.patientAccesses[index].lname;
firstName = patientManagerProvider.myPaitentList![index].fname;
lastName = patientManagerProvider.myPaitentList![index].lname;
accessWithColour = TextSpan(
text: "$access\n",
style: TextStyle(
color: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark")));
} else if (access == "PENDING") {
firstName = "${widget.patientAccesses[index].fname[0]}********";
lastName = "${widget.patientAccesses[index].lname[0]}********";
firstName =
"${patientManagerProvider.myPaitentList![index].fname[0]}********";
lastName =
"${patientManagerProvider.myPaitentList![index].lname[0]}********";
accessWithColour = TextSpan(
text: "$access\n",
style: TextStyle(
color: MihColors.getGreyColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark")));
} else {
firstName = "${widget.patientAccesses[index].fname[0]}********";
lastName = "${widget.patientAccesses[index].lname[0]}********";
firstName =
"${patientManagerProvider.myPaitentList![index].fname[0]}********";
lastName =
"${patientManagerProvider.myPaitentList![index].lname[0]}********";
accessWithColour = TextSpan(
text: "$access\n",
style: TextStyle(
@@ -512,7 +509,8 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
),
subtitle: RichText(
text: TextSpan(
text: "ID No.: ${widget.patientAccesses[index].id_no}\n",
text:
"ID No.: ${patientManagerProvider.myPaitentList![index].id_no}\n",
style: DefaultTextStyle.of(context).style,
children: <TextSpan>[
const TextSpan(text: "Access: "),
@@ -520,18 +518,16 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
]),
),
onTap: () async {
Patient? p;
if (hasAccess) {
await MIHApiCalls.fetchPatientByAppId(
widget.patientAccesses[index].app_id)
.then((result) {
setState(() {
p = result;
});
});
patientProfileChoicePopUp(index, p, width);
await MihPatientServices()
.getPatientDetails(
patientManagerProvider.myPaitentList![index].app_id,
patientManagerProvider)
.then((result) {});
patientProfileChoicePopUp(
profileProvider, patientManagerProvider, index, width);
} else {
noAccessWarning(index);
noAccessWarning(patientManagerProvider, index);
}
},
trailing: Icon(
@@ -555,19 +551,25 @@ class _BuildPatientsListState extends State<BuildMyPatientListList> {
@override
Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
return ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
separatorBuilder: (BuildContext context, index) {
return Divider(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
return Consumer2<MzansiProfileProvider, PatientManagerProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider, Widget? child) {
return ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
separatorBuilder: (BuildContext context, index) {
return Divider(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
},
itemCount: patientManagerProvider.myPaitentList!.length,
itemBuilder: (context, index) {
return displayMyPatientTile(
profileProvider, patientManagerProvider, index, screenWidth);
},
);
},
itemCount: widget.patientAccesses.length,
itemBuilder: (context, index) {
return displayMyPatientTile(index, screenWidth);
},
);
}
}

View File

@@ -27,7 +27,6 @@ class _PatManagerTileState extends State<PatManagerTile> {
onTap: () {
context.goNamed(
'patientManager',
extra: widget.arguments,
);
// Navigator.of(context).pushNamed(
// '/patient-manager',

View File

@@ -1,31 +1,21 @@
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_service_calls.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_patient_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_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.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/patient_access.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/list_builders/build_my_patient_list_list.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyPatientList extends StatefulWidget {
final AppUser signedInUser;
final Business? business;
final BusinessUser? businessUser;
final bool personalSelected;
const MyPatientList({
super.key,
required this.signedInUser,
this.business,
this.businessUser,
this.personalSelected = false,
});
@override
@@ -33,7 +23,6 @@ class MyPatientList extends StatefulWidget {
}
class _MyPatientListState extends State<MyPatientList> {
late Future<List<PatientAccess>> _myPatientList;
TextEditingController _myPatientSearchController = TextEditingController();
final FocusNode _searchFocusNode = FocusNode();
bool hasSearchedBefore = false;
@@ -42,7 +31,8 @@ class _MyPatientListState extends State<MyPatientList> {
final FocusNode _focusNode = FocusNode();
Widget myPatientListTool(double width) {
Widget myPatientListTool(MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider, double width) {
return MihSingleChildScroll(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Padding(
@@ -56,10 +46,11 @@ class _MyPatientListState extends State<MyPatientList> {
hintColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onPrefixIconTap: () {
setState(() {
setState(() async {
_myPatientIdSearchString = _myPatientSearchController.text;
_myPatientList = MIHApiCalls.getPatientAccessListOfBusiness(
widget.business!.business_id);
await MihPatientServices().getPatientAccessListOfBusiness(
patientManagerProvider,
profileProvider.business!.business_id);
});
},
onClearIconTap: () {
@@ -67,57 +58,21 @@ class _MyPatientListState extends State<MyPatientList> {
_myPatientSearchController.clear();
_myPatientIdSearchString = "";
});
getMyPatientList();
getMyPatientList(profileProvider, patientManagerProvider);
},
searchFocusNode: _searchFocusNode,
),
),
//spacer
const SizedBox(height: 10),
FutureBuilder(
future: _myPatientList,
builder: (context, snapshot) {
//print("patient Liust ${snapshot.data}");
if (snapshot.connectionState == ConnectionState.waiting) {
return const Mihloadingcircle();
} else if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
List<PatientAccess> patientsAccessList;
if (_myPatientIdSearchString == "") {
patientsAccessList = snapshot.data!;
} else {
patientsAccessList = filterAccessResults(
snapshot.data!, _myPatientIdSearchString);
//print(patientsList);
}
return displayMyPatientList(patientsAccessList);
} else {
return Center(
child: Text(
"Error pulling Patient Access Data\n$baseUrl/access-requests/business/patient/${widget.business!.business_id}",
style: TextStyle(
fontSize: 25,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark")),
textAlign: TextAlign.center,
),
);
}
},
),
displayMyPatientList(patientManagerProvider),
]),
);
}
Widget displayMyPatientList(List<PatientAccess> patientsAccessList) {
if (patientsAccessList.isNotEmpty) {
return BuildMyPatientListList(
patientAccesses: patientsAccessList,
signedInUser: widget.signedInUser,
business: widget.business,
businessUser: widget.businessUser,
);
Widget displayMyPatientList(PatientManagerProvider patientManagerProvider) {
if (patientManagerProvider.myPaitentList!.isNotEmpty) {
return BuildMyPatientListList();
}
if (hasSearchedBefore && _myPatientIdSearchString.isNotEmpty) {
return Column(
@@ -228,10 +183,11 @@ class _MyPatientListState extends State<MyPatientList> {
return templist;
}
void getMyPatientList() {
Future<void> getMyPatientList(MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider) async {
await MihPatientServices().getPatientAccessListOfBusiness(
patientManagerProvider, profileProvider.business!.business_id);
setState(() {
_myPatientList = MIHApiCalls.getPatientAccessListOfBusiness(
widget.business!.business_id);
hasSearchedBefore = true;
});
}
@@ -239,8 +195,6 @@ class _MyPatientListState extends State<MyPatientList> {
@override
void initState() {
super.initState();
_myPatientList = MIHApiCalls.getPatientAccessListOfBusiness(
widget.business!.business_id);
}
@override
@@ -256,10 +210,16 @@ class _MyPatientListState extends State<MyPatientList> {
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
final double width = size.width;
return MihPackageToolBody(
borderOn: false,
innerHorizontalPadding: 10,
bodyItem: myPatientListTool(width),
return Consumer2<MzansiProfileProvider, PatientManagerProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider, Widget? child) {
return MihPackageToolBody(
borderOn: false,
innerHorizontalPadding: 10,
bodyItem:
myPatientListTool(profileProvider, patientManagerProvider, width),
);
},
);
}
}

View File

@@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_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_mzansi_calendar_services.dart';
@@ -22,27 +23,14 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
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_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/appointment.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart';
import 'package:mzansi_innovation_hub/mih_packages/calendar/builder/build_appointment_list.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class WaitingRoom extends StatefulWidget {
final AppUser signedInUser;
final Business? business;
final BusinessUser? businessUser;
final bool personalSelected;
final Function(int) onIndexChange;
const WaitingRoom({
super.key,
required this.signedInUser,
required this.business,
required this.businessUser,
required this.personalSelected,
required this.onIndexChange,
});
@override
@@ -71,8 +59,12 @@ class _WaitingRoomState extends State<WaitingRoom> {
// Business Appointment Tool
Widget getBusinessAppointmentsTool(double width) {
return Consumer<MihCalendarProvider>(
builder: (BuildContext context, MihCalendarProvider mihCalendarProvider,
return Consumer3<MzansiProfileProvider, PatientManagerProvider,
MihCalendarProvider>(
builder: (BuildContext context,
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
MihCalendarProvider mihCalendarProvider,
Widget? child) {
if (isLoading) {
return const Center(
@@ -132,7 +124,8 @@ class _WaitingRoomState extends State<WaitingRoom> {
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
// addAppointmentWindow();
appointmentTypeSelection(mihCalendarProvider, width);
appointmentTypeSelection(profileProvider,
patientManagerProvider, mihCalendarProvider, width);
},
)
],
@@ -237,7 +230,10 @@ class _WaitingRoomState extends State<WaitingRoom> {
}
void appointmentTypeSelection(
MihCalendarProvider mihCalendarProvider, double width) {
MzansiProfileProvider profileProvider,
PatientManagerProvider patientManagerProvider,
MihCalendarProvider mihCalendarProvider,
double width) {
String question = "What type of appointment would you like to add?";
question +=
"\n\nExisting Patient: Add an appointment for an patient your practice has access to.";
@@ -268,7 +264,7 @@ class _WaitingRoomState extends State<WaitingRoom> {
const SizedBox(height: 15),
MihButton(
onPressed: () {
widget.onIndexChange(1);
patientManagerProvider.setPatientManagerIndex(1);
context.pop();
},
buttonColor: MihColors.getGreenColor(
@@ -287,7 +283,7 @@ class _WaitingRoomState extends State<WaitingRoom> {
const SizedBox(height: 10),
MihButton(
onPressed: () {
widget.onIndexChange(2);
patientManagerProvider.setPatientManagerIndex(2);
context.pop();
},
buttonColor: MihColors.getGreenColor(
@@ -307,7 +303,8 @@ class _WaitingRoomState extends State<WaitingRoom> {
MihButton(
onPressed: () {
Navigator.pop(context);
addAppointmentWindow(mihCalendarProvider, width);
addAppointmentWindow(
profileProvider, mihCalendarProvider, width);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
@@ -329,7 +326,7 @@ class _WaitingRoomState extends State<WaitingRoom> {
);
}
void addAppointmentWindow(
void addAppointmentWindow(MzansiProfileProvider profileProvider,
MihCalendarProvider mihCalendarProvider, double width) {
showDialog(
context: context,
@@ -411,7 +408,8 @@ class _WaitingRoomState extends State<WaitingRoom> {
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
addAppointmentCall(mihCalendarProvider);
addAppointmentCall(
profileProvider, mihCalendarProvider);
} else {
MihAlertServices().formNotFilledCompletely(context);
}
@@ -442,34 +440,23 @@ class _WaitingRoomState extends State<WaitingRoom> {
);
}
Future<void> addAppointmentCall(
Future<void> addAppointmentCall(MzansiProfileProvider profileProvider,
MihCalendarProvider mihCalendarProvider) async {
if (isAppointmentInputValid()) {
int statusCode;
if (widget.personalSelected == false) {
statusCode = await MihMzansiCalendarApis.addBusinessAppointment(
widget.signedInUser,
widget.business!,
widget.businessUser!,
true,
_appointmentTitleController.text,
_appointmentDescriptionIDController.text,
_appointmentDateController.text,
_appointmentTimeController.text,
mihCalendarProvider,
context,
);
} else {
statusCode = await MihMzansiCalendarApis.addPersonalAppointment(
widget.signedInUser,
_appointmentTitleController.text,
_appointmentDescriptionIDController.text,
_appointmentDateController.text,
_appointmentTimeController.text,
mihCalendarProvider,
context,
);
}
statusCode = await MihMzansiCalendarApis.addBusinessAppointment(
profileProvider.user!,
profileProvider.business!,
profileProvider.businessUser!,
true,
_appointmentTitleController.text,
_appointmentDescriptionIDController.text,
_appointmentDateController.text,
_appointmentTimeController.text,
mihCalendarProvider,
context,
);
if (statusCode == 201) {
context.pop();
successPopUp("Successfully Added Appointment",

View File

@@ -2,17 +2,19 @@ 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_manager/package_tools/mih_patient_search.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tools/my_patient_list.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tools/waiting_room.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_calendar_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart';
import 'package:provider/provider.dart';
class PatManager extends StatefulWidget {
final PatManagerArguments arguments;
const PatManager({
super.key,
required this.arguments,
});
@override
@@ -20,11 +22,39 @@ class PatManager extends StatefulWidget {
}
class _PatManagerState extends State<PatManager> {
int _selcetedIndex = 0;
bool isLoading = true;
void updateIndex(int index) {
Future<void> initialisePatientData() async {
setState(() {
_selcetedIndex = index;
isLoading = true;
});
MzansiProfileProvider profileProvider =
context.read<MzansiProfileProvider>();
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
MihCalendarProvider mihCalendarProvider =
context.read<MihCalendarProvider>();
patientManagerProvider.setPersonalMode(false);
if (profileProvider.business != null) {
await MihMzansiCalendarApis.getBusinessAppointments(
profileProvider.business!.business_id,
false,
mihCalendarProvider.selectedDay,
mihCalendarProvider,
);
MihPatientServices().getPatientAccessListOfBusiness(
patientManagerProvider, profileProvider.business!.business_id);
}
setState(() {
isLoading = false;
});
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
initialisePatientData();
});
}
@@ -35,24 +65,30 @@ class _PatManagerState extends State<PatManager> {
appTools: getTools(),
appBody: getToolBody(),
appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex,
selectedbodyIndex:
context.watch<PatientManagerProvider>().patientManagerIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
context.read<PatientManagerProvider>().setPatientManagerIndex(newValue);
},
);
}
MihPackageAction getActionButton() {
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
return MihPackageAction(
icon: const Icon(Icons.arrow_back),
iconSize: 35,
onTap: () {
// Navigator.of(context).pop();
context.goNamed(
'mihHome',
);
patientManagerProvider.setPatientProfileIndex(0);
patientManagerProvider.setPatientManagerIndex(0);
if (!patientManagerProvider.personalMode) {
context.pop();
} else {
context.goNamed(
'mihHome',
);
}
FocusScope.of(context).unfocus();
},
);
@@ -61,55 +97,33 @@ class _PatManagerState extends State<PatManager> {
MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.calendar_month)] = () {
setState(() {
_selcetedIndex = 0;
});
context.read<PatientManagerProvider>().setPatientManagerIndex(0);
};
temp[const Icon(Icons.check_box_outlined)] = () {
setState(() {
_selcetedIndex = 1;
});
context.read<PatientManagerProvider>().setPatientManagerIndex(1);
};
temp[const Icon(Icons.search)] = () {
setState(() {
_selcetedIndex = 2;
});
context.read<PatientManagerProvider>().setPatientManagerIndex(2);
};
return MihPackageTools(
tools: temp,
selcetedIndex: _selcetedIndex,
selcetedIndex:
context.watch<PatientManagerProvider>().patientManagerIndex,
);
}
List<Widget> getToolBody() {
List<Widget> toolBodies = [
//appointment here
// Appointments(
WaitingRoom(),
MyPatientList(),
Placeholder(),
// MihPatientSearch(
// signedInUser: widget.arguments.signedInUser,
// business: widget.arguments.business,
// personalSelected: widget.arguments.personalSelected,
// businessUser: widget.arguments.businessUser,
// ),
WaitingRoom(
signedInUser: widget.arguments.signedInUser,
business: widget.arguments.business,
businessUser: widget.arguments.businessUser,
personalSelected: widget.arguments.personalSelected,
onIndexChange: updateIndex,
),
MyPatientList(
signedInUser: widget.arguments.signedInUser,
business: widget.arguments.business,
businessUser: widget.arguments.businessUser,
personalSelected: widget.arguments.personalSelected,
),
MihPatientSearch(
signedInUser: widget.arguments.signedInUser,
business: widget.arguments.business,
personalSelected: widget.arguments.personalSelected,
businessUser: widget.arguments.businessUser,
),
];
return toolBodies;
}

View File

@@ -4,7 +4,9 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/patient_manager_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart';
class PatientProfileTile extends StatefulWidget {
final PatientViewArguments arguments;
@@ -26,6 +28,9 @@ class _PatientProfileTileState extends State<PatientProfileTile> {
return MihPackageTile(
authenticateUser: true,
onTap: () {
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
patientManagerProvider.setPersonalMode(true);
context.goNamed(
'patientProfile',
);

View File

@@ -15,10 +15,8 @@ import 'package:mzansi_innovation_hub/mih_services/mih_patient_services.dart';
import 'package:provider/provider.dart';
class PatientProfile extends StatefulWidget {
final String? patientAppId;
const PatientProfile({
super.key,
required this.patientAppId,
});
@override
@@ -36,13 +34,11 @@ class _PatientProfileState extends State<PatientProfile> {
context.read<MzansiProfileProvider>();
PatientManagerProvider patientManagerProvider =
context.read<PatientManagerProvider>();
String? app_id = widget.patientAppId ?? profileProvider.user!.app_id;
String? app_id = 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");
@@ -61,7 +57,9 @@ class _PatientProfileState extends State<PatientProfile> {
@override
void initState() {
super.initState();
initialisePatientData();
WidgetsBinding.instance.addPostFrameCallback((_) async {
initialisePatientData();
});
}
@override
@@ -87,7 +85,6 @@ class _PatientProfileState extends State<PatientProfile> {
iconSize: 35,
onTap: () {
patientManagerProvider.setPatientProfileIndex(0);
patientManagerProvider.setPatientManagerIndex(0);
if (!patientManagerProvider.personalMode) {
context.pop();
} else {

View File

@@ -129,7 +129,6 @@ class MIHClaimStatementGenerationApi {
List<ClaimStatementFile> docList = List<ClaimStatementFile>.from(
l.map((model) => ClaimStatementFile.fromJson(model)));
//print("Here3");
print(docList);
patientManagerProvider.setClaimsDocuments(
patientClaimsDocuments: docList);
return docList;

View File

@@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/appointment.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart';
import 'package:flutter/material.dart';
@@ -291,7 +290,7 @@ class MihMzansiCalendarApis {
AppUser signedInUser,
bool personalSelected,
String patientAppId,
BusinessArguments businessArgs,
String businessId,
String title,
String description,
String date,
@@ -306,7 +305,7 @@ class MihMzansiCalendarApis {
},
body: jsonEncode(<String, dynamic>{
"app_id": patientAppId,
"business_id": businessArgs.business?.business_id,
"business_id": businessId,
"title": title,
"description": description,
"date": date,

View File

@@ -4,6 +4,7 @@ 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/patient_access.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';
@@ -289,4 +290,21 @@ class MihPatientServices {
}
return response.statusCode;
}
Future<List<PatientAccess>> getPatientAccessListOfBusiness(
PatientManagerProvider patientManagerProvider,
String business_id,
) async {
final response = await http.get(Uri.parse(
"${AppEnviroment.baseApiUrl}/access-requests/business/patient/$business_id"));
if (response.statusCode == 200) {
Iterable l = jsonDecode(response.body);
List<PatientAccess> patientAccesses = List<PatientAccess>.from(
l.map((model) => PatientAccess.fromJson(model)));
patientManagerProvider.setMyPatientList(myPaitentList: patientAccesses);
return patientAccesses;
} else {
throw Exception('failed to pull patient access List for business');
}
}
}

View File

@@ -126,29 +126,6 @@ class MIHApiCalls {
}
}
/// This function is used to get list of access the business has.
///
/// Patameters: String business_id.
///
/// Returns List<PatientAccess> (List of access that match the above parameters).
static Future<List<PatientAccess>> getPatientAccessListOfBusiness(
String business_id) async {
final response = await http.get(Uri.parse(
"${AppEnviroment.baseApiUrl}/access-requests/business/patient/$business_id"));
// var errorCode = response.statusCode.toString();
// print(response.statusCode);
// print(response.body);
if (response.statusCode == 200) {
Iterable l = jsonDecode(response.body);
List<PatientAccess> patientAccesses = List<PatientAccess>.from(
l.map((model) => PatientAccess.fromJson(model)));
return patientAccesses;
} else {
throw Exception('failed to pull patient access List for business');
}
}
/// This function is used to UPDATE access the business has.
///
/// Patameters:-