This commit is contained in:
2025-10-31 12:18:13 +02:00
parent cb25b932ba
commit abd56d5a14
8 changed files with 94 additions and 98 deletions

View File

@@ -49,7 +49,11 @@ class MzansiDirectoryProvider extends ChangeNotifier {
void setUserPosition(Position? position) { void setUserPosition(Position? position) {
userPosition = position; userPosition = position;
userLocation = "${position?.latitude}, ${position?.longitude}"; if (position == null) {
userLocation = "Unknown Location";
} else {
userLocation = "${position.latitude}, ${position.longitude}";
}
notifyListeners(); notifyListeners();
} }

View File

@@ -20,6 +20,7 @@ class MzansiProfileProvider extends ChangeNotifier {
ImageProvider<Object>? businessUserSignature; ImageProvider<Object>? businessUserSignature;
UserConsent? userConsent; UserConsent? userConsent;
List<BusinessEmployee>? employeeList; List<BusinessEmployee>? employeeList;
List<AppUser> userSearchResults = [];
MzansiProfileProvider({ MzansiProfileProvider({
this.personalHome = true, this.personalHome = true,
@@ -132,4 +133,9 @@ class MzansiProfileProvider extends ChangeNotifier {
employeeList!.add(newEmployee); employeeList!.add(newEmployee);
notifyListeners(); notifyListeners();
} }
void setUserearchResults({required List<AppUser> userSearchResults}) {
this.userSearchResults = userSearchResults;
notifyListeners();
}
} }

View File

@@ -34,7 +34,9 @@ class _MzansiDirectoryState extends State<MzansiDirectory> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
initialiseGPSLocation(); initialiseGPSLocation();
});
} }
@override @override

View File

@@ -11,6 +11,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
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_single_child_scroll.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_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_provider.dart'; 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_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart';
@@ -40,7 +41,8 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
bool filterOn = false; bool filterOn = false;
bool loadingSearchResults = false; bool loadingSearchResults = false;
Future<void> swapPressed(MzansiDirectoryProvider directoryProvider) async { Future<void> swapPressed(MzansiProfileProvider profileProvider,
MzansiDirectoryProvider directoryProvider) async {
directoryProvider.setPersonalSearch(!directoryProvider.personalSearch); directoryProvider.setPersonalSearch(!directoryProvider.personalSearch);
setState(() { setState(() {
if (filterOn) { if (filterOn) {
@@ -52,7 +54,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
businessTypeController.clear(); businessTypeController.clear();
}); });
} }
await searchPressed(directoryProvider); await searchPressed(profileProvider, directoryProvider);
} }
void clearAll(MzansiDirectoryProvider directoryProvider) { void clearAll(MzansiDirectoryProvider directoryProvider) {
@@ -65,7 +67,8 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
}); });
} }
Future<void> searchPressed(MzansiDirectoryProvider directoryProvider) async { Future<void> searchPressed(MzansiProfileProvider profileProvider,
MzansiDirectoryProvider directoryProvider) async {
setState(() { setState(() {
loadingSearchResults = true; loadingSearchResults = true;
}); });
@@ -75,7 +78,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
if (directoryProvider.personalSearch && if (directoryProvider.personalSearch &&
directoryProvider.searchTerm.isNotEmpty) { directoryProvider.searchTerm.isNotEmpty) {
final userResults = await MihUserServices() final userResults = await MihUserServices()
.searchUsers(directoryProvider.searchTerm, context); .searchUsers(profileProvider, directoryProvider.searchTerm, context);
directoryProvider.setSearchedUsers(searchedUsers: userResults); directoryProvider.setSearchedUsers(searchedUsers: userResults);
} else { } else {
List<Business>? businessSearchResults = []; List<Business>? businessSearchResults = [];
@@ -108,11 +111,11 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
super.initState(); super.initState();
MzansiDirectoryProvider directoryProvider = MzansiDirectoryProvider directoryProvider =
context.read<MzansiDirectoryProvider>(); context.read<MzansiDirectoryProvider>();
directoryProvider.setSearchedUsers(searchedUsers: []);
setState(() {
availableBusinessTypes = availableBusinessTypes =
MihBusinessDetailsServices().fetchAllBusinessTypes(); MihBusinessDetailsServices().fetchAllBusinessTypes();
mzansiSearchController.text = ""; mzansiSearchController.text = "";
WidgetsBinding.instance.addPostFrameCallback((_) async {
directoryProvider.setSearchedUsers(searchedUsers: []);
}); });
} }
@@ -127,9 +130,9 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
} }
Widget getBody(double width) { Widget getBody(double width) {
return Consumer<MzansiDirectoryProvider>( return Consumer2<MzansiProfileProvider, MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider, builder: (BuildContext context, MzansiProfileProvider profileProvider,
Widget? child) { MzansiDirectoryProvider directoryProvider, Widget? child) {
return MihSingleChildScroll( return MihSingleChildScroll(
child: Column( child: Column(
children: [ children: [
@@ -149,7 +152,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
suffixTools: [ suffixTools: [
IconButton( IconButton(
onPressed: () { onPressed: () {
swapPressed(directoryProvider); swapPressed(profileProvider, directoryProvider);
}, },
icon: Icon( icon: Icon(
Icons.swap_horiz_rounded, Icons.swap_horiz_rounded,
@@ -167,7 +170,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
MzansiInnovationHub.of(context)!.theme.mode == MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"), "Dark"),
onPrefixIconTap: () { onPrefixIconTap: () {
searchPressed(directoryProvider); searchPressed(profileProvider, directoryProvider);
}, },
onClearIconTap: () { onClearIconTap: () {
clearAll(directoryProvider); clearAll(directoryProvider);
@@ -234,7 +237,8 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
MihButton( MihButton(
onPressed: () { onPressed: () {
if (businessTypeController.text.isNotEmpty) { if (businessTypeController.text.isNotEmpty) {
searchPressed(directoryProvider); searchPressed(
profileProvider, directoryProvider);
} else { } else {
MihAlertServices().errorAlert( MihAlertServices().errorAlert(
"Business Type Not Selected", "Business Type Not Selected",

View File

@@ -3,16 +3,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profil
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_add_employee_window.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_add_employee_window.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.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:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BuildUserList extends StatefulWidget { class BuildUserList extends StatefulWidget {
final List<AppUser> users;
const BuildUserList({ const BuildUserList({
super.key, super.key,
required this.users,
}); });
@override @override
@@ -28,12 +24,13 @@ class _BuildUserListState extends State<BuildUserList> {
return "$firstLetter********@$end"; return "$firstLetter********@$end";
} }
void addEmployeePopUp(int index, double width) { void addEmployeePopUp(
MzansiProfileProvider profileProvider, int index, double width) {
showDialog( showDialog(
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
builder: (context) => MihAddEmployeeWindow( builder: (context) => MihAddEmployeeWindow(
user: widget.users[index], user: profileProvider.userSearchResults[index],
), ),
); );
} }
@@ -42,8 +39,8 @@ class _BuildUserListState extends State<BuildUserList> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width; double screenWidth = MediaQuery.of(context).size.width;
return Consumer<MzansiProfileProvider>( return Consumer<MzansiProfileProvider>(
builder: (BuildContext context, builder: (BuildContext context, MzansiProfileProvider profileProvider,
MzansiProfileProvider mzansiProfileProvider, Widget? child) { Widget? child) {
return ListView.separated( return ListView.separated(
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
@@ -53,24 +50,25 @@ class _BuildUserListState extends State<BuildUserList> {
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
); );
}, },
itemCount: widget.users.length, itemCount: profileProvider.userSearchResults.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var isYou = ""; var isYou = "";
if (mzansiProfileProvider.user!.app_id == if (profileProvider.user!.app_id ==
widget.users[index].app_id) { profileProvider.userSearchResults[index].app_id) {
isYou = "(You)"; isYou = "(You)";
} }
return ListTile( return ListTile(
title: Text("@${widget.users[index].username} $isYou"), title: Text(
"@${profileProvider.userSearchResults[index].username} $isYou"),
subtitle: Text( subtitle: Text(
"Email: ${hideEmail(widget.users[index].email)}", "Email: ${hideEmail(profileProvider.userSearchResults[index].email)}",
style: TextStyle( style: TextStyle(
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
), ),
), ),
onTap: () { onTap: () {
addEmployeePopUp(index, screenWidth); addEmployeePopUp(profileProvider, index, screenWidth);
}, },
); );
}, },

View File

@@ -62,6 +62,9 @@ class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
context.read<MzansiProfileProvider>().setBusinessIndex(2); context.read<MzansiProfileProvider>().setBusinessIndex(2);
}; };
temp[const Icon(Icons.add)] = () { temp[const Icon(Icons.add)] = () {
context
.read<MzansiProfileProvider>()
.setUserearchResults(userSearchResults: []);
context.read<MzansiProfileProvider>().setBusinessIndex(3); context.read<MzansiProfileProvider>().setBusinessIndex(3);
}; };
temp[const Icon(Icons.star_rate_rounded)] = () { temp[const Icon(Icons.star_rate_rounded)] = () {

View File

@@ -3,12 +3,13 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
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_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_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_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_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart';
import 'package:provider/provider.dart';
class MihBusinessUserSearch extends StatefulWidget { class MihBusinessUserSearch extends StatefulWidget {
const MihBusinessUserSearch({ const MihBusinessUserSearch({
@@ -28,25 +29,24 @@ class _MihBusinessUserSearchState extends State<MihBusinessUserSearch> {
String errorCode = ""; String errorCode = "";
String errorBody = ""; String errorBody = "";
Future<List<AppUser>> fetchUsers(String search) async { Future<List<AppUser>> fetchUsers(
return MihUserServices().searchUsers(search, context); MzansiProfileProvider profileProvider, String search) async {
return MihUserServices().searchUsers(profileProvider, search, context);
} }
void submitUserForm() { void submitUserForm(MzansiProfileProvider profileProvider) {
if (searchController.text != "") { if (searchController.text != "") {
setState(() { setState(() {
userSearch = searchController.text; userSearch = searchController.text;
hasSearchedBefore = true; hasSearchedBefore = true;
userSearchResults = fetchUsers(userSearch); userSearchResults = fetchUsers(profileProvider, userSearch);
}); });
} }
} }
Widget displayUserList(List<AppUser> userList) { Widget displayUserList(MzansiProfileProvider profileProvider) {
if (userList.isNotEmpty) { if (profileProvider.userSearchResults.isNotEmpty) {
return BuildUserList( return BuildUserList();
users: userList,
);
} }
if (hasSearchedBefore && userSearch.isNotEmpty) { if (hasSearchedBefore && userSearch.isNotEmpty) {
return Column( return Column(
@@ -145,7 +145,6 @@ class _MihBusinessUserSearchState extends State<MihBusinessUserSearch> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
userSearchResults = fetchUsers("abc");
} }
@override @override
@@ -168,8 +167,13 @@ class _MihBusinessUserSearchState extends State<MihBusinessUserSearch> {
Widget getBody(double width) { Widget getBody(double width) {
// dscvds // dscvds
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
Widget? child) {
return MihSingleChildScroll( return MihSingleChildScroll(
child: Column(mainAxisSize: MainAxisSize.max, children: [ child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: width / 20), padding: EdgeInsets.symmetric(horizontal: width / 20),
child: MihSearchBar( child: MihSearchBar(
@@ -181,7 +185,7 @@ class _MihBusinessUserSearchState extends State<MihBusinessUserSearch> {
hintColor: MihColors.getPrimaryColor( hintColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onPrefixIconTap: () { onPrefixIconTap: () {
submitUserForm(); submitUserForm(profileProvider);
}, },
onClearIconTap: () { onClearIconTap: () {
setState(() { setState(() {
@@ -193,38 +197,11 @@ class _MihBusinessUserSearchState extends State<MihBusinessUserSearch> {
), ),
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
FutureBuilder( displayUserList(profileProvider),
future: userSearchResults, ],
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<AppUser> patientsList;
if (userSearch == "") {
patientsList = [];
} else {
patientsList = snapshot.data!;
//print(patientsList);
}
return displayUserList(patientsList);
} else {
return Center(
child: Text(
"$errorCode: Error pulling Patients Data\n/users/search/$userSearch\n$errorBody",
style: TextStyle(
fontSize: 25,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark")),
textAlign: TextAlign.center,
), ),
); );
}
}, },
),
]),
); );
} }
} }

View File

@@ -78,6 +78,7 @@ class MihUserServices {
} }
Future<List<AppUser>> searchUsers( Future<List<AppUser>> searchUsers(
MzansiProfileProvider profileProvider,
String searchText, String searchText,
BuildContext context, BuildContext context,
) async { ) async {
@@ -91,6 +92,7 @@ class MihUserServices {
Iterable l = jsonDecode(response.body); Iterable l = jsonDecode(response.body);
List<AppUser> users = List<AppUser> users =
List<AppUser>.from(l.map((model) => AppUser.fromJson(model))); List<AppUser>.from(l.map((model) => AppUser.fromJson(model)));
profileProvider.setUserearchResults(userSearchResults: users);
return users; return users;
} else { } else {
throw Exception('failed to load users'); throw Exception('failed to load users');