diff --git a/Frontend/lib/mih_components/mih_providers/mzansi_directory_provider.dart b/Frontend/lib/mih_components/mih_providers/mzansi_directory_provider.dart index da94c4d8..59f148bc 100644 --- a/Frontend/lib/mih_components/mih_providers/mzansi_directory_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/mzansi_directory_provider.dart @@ -49,7 +49,11 @@ class MzansiDirectoryProvider extends ChangeNotifier { void setUserPosition(Position? position) { userPosition = position; - userLocation = "${position?.latitude}, ${position?.longitude}"; + if (position == null) { + userLocation = "Unknown Location"; + } else { + userLocation = "${position.latitude}, ${position.longitude}"; + } notifyListeners(); } diff --git a/Frontend/lib/mih_components/mih_providers/mzansi_profile_provider.dart b/Frontend/lib/mih_components/mih_providers/mzansi_profile_provider.dart index 0f4b9414..3570dc3c 100644 --- a/Frontend/lib/mih_components/mih_providers/mzansi_profile_provider.dart +++ b/Frontend/lib/mih_components/mih_providers/mzansi_profile_provider.dart @@ -20,6 +20,7 @@ class MzansiProfileProvider extends ChangeNotifier { ImageProvider? businessUserSignature; UserConsent? userConsent; List? employeeList; + List userSearchResults = []; MzansiProfileProvider({ this.personalHome = true, @@ -132,4 +133,9 @@ class MzansiProfileProvider extends ChangeNotifier { employeeList!.add(newEmployee); notifyListeners(); } + + void setUserearchResults({required List userSearchResults}) { + this.userSearchResults = userSearchResults; + notifyListeners(); + } } diff --git a/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart b/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart index f9710d97..baa1dda3 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart @@ -34,7 +34,9 @@ class _MzansiDirectoryState extends State { @override void initState() { super.initState(); - initialiseGPSLocation(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + initialiseGPSLocation(); + }); } @override diff --git a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart index f3596d26..472a67db 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart @@ -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_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_profile_provider.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_user_search_results_list.dart'; @@ -40,7 +41,8 @@ class _MihSearchMzansiState extends State { bool filterOn = false; bool loadingSearchResults = false; - Future swapPressed(MzansiDirectoryProvider directoryProvider) async { + Future swapPressed(MzansiProfileProvider profileProvider, + MzansiDirectoryProvider directoryProvider) async { directoryProvider.setPersonalSearch(!directoryProvider.personalSearch); setState(() { if (filterOn) { @@ -52,7 +54,7 @@ class _MihSearchMzansiState extends State { businessTypeController.clear(); }); } - await searchPressed(directoryProvider); + await searchPressed(profileProvider, directoryProvider); } void clearAll(MzansiDirectoryProvider directoryProvider) { @@ -65,7 +67,8 @@ class _MihSearchMzansiState extends State { }); } - Future searchPressed(MzansiDirectoryProvider directoryProvider) async { + Future searchPressed(MzansiProfileProvider profileProvider, + MzansiDirectoryProvider directoryProvider) async { setState(() { loadingSearchResults = true; }); @@ -75,7 +78,7 @@ class _MihSearchMzansiState extends State { if (directoryProvider.personalSearch && directoryProvider.searchTerm.isNotEmpty) { final userResults = await MihUserServices() - .searchUsers(directoryProvider.searchTerm, context); + .searchUsers(profileProvider, directoryProvider.searchTerm, context); directoryProvider.setSearchedUsers(searchedUsers: userResults); } else { List? businessSearchResults = []; @@ -108,11 +111,11 @@ class _MihSearchMzansiState extends State { super.initState(); MzansiDirectoryProvider directoryProvider = context.read(); - directoryProvider.setSearchedUsers(searchedUsers: []); - setState(() { - availableBusinessTypes = - MihBusinessDetailsServices().fetchAllBusinessTypes(); - mzansiSearchController.text = ""; + availableBusinessTypes = + MihBusinessDetailsServices().fetchAllBusinessTypes(); + mzansiSearchController.text = ""; + WidgetsBinding.instance.addPostFrameCallback((_) async { + directoryProvider.setSearchedUsers(searchedUsers: []); }); } @@ -127,9 +130,9 @@ class _MihSearchMzansiState extends State { } Widget getBody(double width) { - return Consumer( - builder: (BuildContext context, MzansiDirectoryProvider directoryProvider, - Widget? child) { + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + MzansiDirectoryProvider directoryProvider, Widget? child) { return MihSingleChildScroll( child: Column( children: [ @@ -149,7 +152,7 @@ class _MihSearchMzansiState extends State { suffixTools: [ IconButton( onPressed: () { - swapPressed(directoryProvider); + swapPressed(profileProvider, directoryProvider); }, icon: Icon( Icons.swap_horiz_rounded, @@ -167,7 +170,7 @@ class _MihSearchMzansiState extends State { MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onPrefixIconTap: () { - searchPressed(directoryProvider); + searchPressed(profileProvider, directoryProvider); }, onClearIconTap: () { clearAll(directoryProvider); @@ -234,7 +237,8 @@ class _MihSearchMzansiState extends State { MihButton( onPressed: () { if (businessTypeController.text.isNotEmpty) { - searchPressed(directoryProvider); + searchPressed( + profileProvider, directoryProvider); } else { MihAlertServices().errorAlert( "Business Type Not Selected", diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart index 2bfa71d1..cb3476fa 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart @@ -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_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_components/mih_objects/app_user.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class BuildUserList extends StatefulWidget { - final List users; - const BuildUserList({ super.key, - required this.users, }); @override @@ -28,12 +24,13 @@ class _BuildUserListState extends State { return "$firstLetter********@$end"; } - void addEmployeePopUp(int index, double width) { + void addEmployeePopUp( + MzansiProfileProvider profileProvider, int index, double width) { showDialog( context: context, barrierDismissible: false, builder: (context) => MihAddEmployeeWindow( - user: widget.users[index], + user: profileProvider.userSearchResults[index], ), ); } @@ -42,8 +39,8 @@ class _BuildUserListState extends State { Widget build(BuildContext context) { double screenWidth = MediaQuery.of(context).size.width; return Consumer( - builder: (BuildContext context, - MzansiProfileProvider mzansiProfileProvider, Widget? child) { + builder: (BuildContext context, MzansiProfileProvider profileProvider, + Widget? child) { return ListView.separated( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), @@ -53,24 +50,25 @@ class _BuildUserListState extends State { MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ); }, - itemCount: widget.users.length, + itemCount: profileProvider.userSearchResults.length, itemBuilder: (context, index) { var isYou = ""; - if (mzansiProfileProvider.user!.app_id == - widget.users[index].app_id) { + if (profileProvider.user!.app_id == + profileProvider.userSearchResults[index].app_id) { isYou = "(You)"; } return ListTile( - title: Text("@${widget.users[index].username} $isYou"), + title: Text( + "@${profileProvider.userSearchResults[index].username} $isYou"), subtitle: Text( - "Email: ${hideEmail(widget.users[index].email)}", + "Email: ${hideEmail(profileProvider.userSearchResults[index].email)}", style: TextStyle( color: MihColors.getSecondaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), ), ), onTap: () { - addEmployeePopUp(index, screenWidth); + addEmployeePopUp(profileProvider, index, screenWidth); }, ); }, diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/mzansi_business_profile.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/mzansi_business_profile.dart index 97f91792..69dd98ea 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/mzansi_business_profile.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/mzansi_business_profile.dart @@ -62,6 +62,9 @@ class _MzansiBusinessProfileState extends State { context.read().setBusinessIndex(2); }; temp[const Icon(Icons.add)] = () { + context + .read() + .setUserearchResults(userSearchResults: []); context.read().setBusinessIndex(3); }; temp[const Icon(Icons.star_rate_rounded)] = () { diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart index 70d18e09..c2bc32fb 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart @@ -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_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_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_packages/mzansi_profile/business_profile/builders/build_user_list.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; +import 'package:provider/provider.dart'; class MihBusinessUserSearch extends StatefulWidget { const MihBusinessUserSearch({ @@ -28,25 +29,24 @@ class _MihBusinessUserSearchState extends State { String errorCode = ""; String errorBody = ""; - Future> fetchUsers(String search) async { - return MihUserServices().searchUsers(search, context); + Future> fetchUsers( + MzansiProfileProvider profileProvider, String search) async { + return MihUserServices().searchUsers(profileProvider, search, context); } - void submitUserForm() { + void submitUserForm(MzansiProfileProvider profileProvider) { if (searchController.text != "") { setState(() { userSearch = searchController.text; hasSearchedBefore = true; - userSearchResults = fetchUsers(userSearch); + userSearchResults = fetchUsers(profileProvider, userSearch); }); } } - Widget displayUserList(List userList) { - if (userList.isNotEmpty) { - return BuildUserList( - users: userList, - ); + Widget displayUserList(MzansiProfileProvider profileProvider) { + if (profileProvider.userSearchResults.isNotEmpty) { + return BuildUserList(); } if (hasSearchedBefore && userSearch.isNotEmpty) { return Column( @@ -145,7 +145,6 @@ class _MihBusinessUserSearchState extends State { @override void initState() { super.initState(); - userSearchResults = fetchUsers("abc"); } @override @@ -168,63 +167,41 @@ class _MihBusinessUserSearchState extends State { Widget getBody(double width) { // dscvds - return MihSingleChildScroll( - child: Column(mainAxisSize: MainAxisSize.max, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Search Users", - prefixIcon: Icons.search, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - hintColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onPrefixIconTap: () { - submitUserForm(); - }, - onClearIconTap: () { - setState(() { - searchController.clear(); - userSearch = ""; - }); - }, - searchFocusNode: _searchFocusNode, - ), - ), - const SizedBox(height: 10), - FutureBuilder( - 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 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, + return Consumer( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + Widget? child) { + return MihSingleChildScroll( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Search Users", + prefixIcon: Icons.search, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + hintColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onPrefixIconTap: () { + submitUserForm(profileProvider); + }, + onClearIconTap: () { + setState(() { + searchController.clear(); + userSearch = ""; + }); + }, + searchFocusNode: _searchFocusNode, ), - ); - } - }, - ), - ]), + ), + const SizedBox(height: 10), + displayUserList(profileProvider), + ], + ), + ); + }, ); } } diff --git a/Frontend/lib/mih_services/mih_user_services.dart b/Frontend/lib/mih_services/mih_user_services.dart index 3467f7f0..0d8dadbb 100644 --- a/Frontend/lib/mih_services/mih_user_services.dart +++ b/Frontend/lib/mih_services/mih_user_services.dart @@ -78,6 +78,7 @@ class MihUserServices { } Future> searchUsers( + MzansiProfileProvider profileProvider, String searchText, BuildContext context, ) async { @@ -91,6 +92,7 @@ class MihUserServices { Iterable l = jsonDecode(response.body); List users = List.from(l.map((model) => AppUser.fromJson(model))); + profileProvider.setUserearchResults(userSearchResults: users); return users; } else { throw Exception('failed to load users');