diff --git a/Frontend/lib/mih_package_components/mih_personal_profile_preview.dart b/Frontend/lib/mih_package_components/mih_personal_profile_preview.dart index 25251ba6..1b562f81 100644 --- a/Frontend/lib/mih_package_components/mih_personal_profile_preview.dart +++ b/Frontend/lib/mih_package_components/mih_personal_profile_preview.dart @@ -3,14 +3,17 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; +import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; class MihPersonalProfilePreview extends StatefulWidget { final AppUser user; final ImageProvider? imageFile; + final bool loading; const MihPersonalProfilePreview({ super.key, required this.user, required this.imageFile, + required this.loading, }); @override @@ -29,18 +32,32 @@ class _MihPersonalProfilePreviewState extends State { double profilePictureWidth = 60; return Row( children: [ - MihCircleAvatar( - imageFile: widget.imageFile, - width: profilePictureWidth, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: null, - frameColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - backgroundColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onChange: () {}, - ), + widget.loading + ? Icon( + MihIcons.mihRing, + size: profilePictureWidth, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ) + : widget.imageFile == null + ? Icon( + MihIcons.iDontKnow, + size: profilePictureWidth, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + ) + : MihCircleAvatar( + imageFile: widget.imageFile, + width: profilePictureWidth, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: null, + frameColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + backgroundColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onChange: () {}, + ), const SizedBox(width: 15), Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/Frontend/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart b/Frontend/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart index 04270fd9..0861cf7b 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; @@ -58,13 +59,32 @@ class _BuildBusinessSearchResultsListState // vertical: 5, horizontal: 25, ), - child: MihBusinessProfilePreview( - business: widget.businessList[index], - imageFile: directoryProvider.busSearchImages![ - widget.businessList[index].business_id], - loading: false, - //To Do - ), + child: FutureBuilder( + future: directoryProvider.busSearchImagesUrl![ + widget.businessList[index].business_id], + builder: (context, asyncSnapshot) { + ImageProvider? imageFile; + bool loading = true; + if (asyncSnapshot.connectionState == + ConnectionState.done) { + loading = false; + if (asyncSnapshot.hasData) { + imageFile = asyncSnapshot.requireData != "" + ? CachedNetworkImageProvider( + asyncSnapshot.requireData) + : null; + } else { + imageFile = null; + } + } else { + imageFile = null; + } + return MihBusinessProfilePreview( + business: widget.businessList[index], + imageFile: imageFile, + loading: loading, + ); + }), ), ), ); diff --git a/Frontend/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart b/Frontend/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart index a9aa591a..2d50b15e 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; @@ -57,11 +58,32 @@ class _BuildUserSearchResultsListState // vertical: 5, horizontal: 25, ), - child: MihPersonalProfilePreview( - user: widget.userList[index], - imageFile: directoryProvider - .userSearchImages![widget.userList[index].app_id], - ), + child: FutureBuilder( + future: directoryProvider + .userSearchImagesUrl![widget.userList[index].app_id], + builder: (context, asyncSnapshot) { + ImageProvider? imageFile; + bool loading = true; + if (asyncSnapshot.connectionState == + ConnectionState.done) { + loading = false; + if (asyncSnapshot.hasData) { + imageFile = asyncSnapshot.requireData != "" + ? CachedNetworkImageProvider( + asyncSnapshot.requireData) + : null; + } else { + imageFile = null; + } + } else { + imageFile = null; + } + return MihPersonalProfilePreview( + user: widget.userList[index], + imageFile: imageFile, + loading: loading, + ); + }), ), ), ); 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 893eac80..3cfded84 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 @@ -1,4 +1,3 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; @@ -60,8 +59,8 @@ class _MihSearchMzansiState extends State { void clearAll(MzansiDirectoryProvider directoryProvider) { directoryProvider - .setSearchedBusinesses(searchedBusinesses: [], businessesImages: {}); - directoryProvider.setSearchedUsers(searchedUsers: [], userImages: {}); + .setSearchedBusinesses(searchedBusinesses: [], businessesImagesUrl: {}); + directoryProvider.setSearchedUsers(searchedUsers: [], userImagesUrl: {}); directoryProvider.setSearchTerm(searchTerm: ""); setState(() { mzansiSearchController.clear(); @@ -81,20 +80,21 @@ class _MihSearchMzansiState extends State { directoryProvider.searchTerm.isNotEmpty) { final userResults = await MihUserServices() .searchUsers(profileProvider, directoryProvider.searchTerm, context); - Map?> userImages = {}; - String usernProPicUrl = ""; + Map> userImages = {}; + Future usernProPicUrl; for (var user in userResults) { KenLogger.success("Business Logo Path: ${user.pro_pic_path}"); - usernProPicUrl = await MihFileApi.getMinioFileUrl(user.pro_pic_path); + usernProPicUrl = MihFileApi.getMinioFileUrl(user.pro_pic_path); KenLogger.success("Business Logo Path: ${user.pro_pic_path}"); - userImages[user.app_id] = usernProPicUrl != "" - ? CachedNetworkImageProvider(usernProPicUrl) - : null; + userImages[user.app_id] = usernProPicUrl; + // != "" + // ? CachedNetworkImageProvider(usernProPicUrl) + // : null; } directoryProvider.setSearchedUsers( searchedUsers: userResults, - userImages: userImages, + userImagesUrl: userImages, ); } else { List? businessSearchResults = []; @@ -107,19 +107,20 @@ class _MihSearchMzansiState extends State { .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); } - Map?> busImages = {}; - String businessLogoUrl = ""; + Map> busImagesUrl = {}; + Future businessLogoUrl; for (var bus in businessSearchResults) { KenLogger.success("Business Logo Path: ${bus.logo_path}"); - businessLogoUrl = await MihFileApi.getMinioFileUrl(bus.logo_path); + businessLogoUrl = MihFileApi.getMinioFileUrl(bus.logo_path); KenLogger.success("Business Logo Path: ${bus.logo_path}"); - busImages[bus.business_id] = businessLogoUrl != "" - ? CachedNetworkImageProvider(businessLogoUrl) - : null; + busImagesUrl[bus.business_id] = businessLogoUrl; + // != "" + // ? CachedNetworkImageProvider(businessLogoUrl) + // : null; } directoryProvider.setSearchedBusinesses( searchedBusinesses: businessSearchResults, - businessesImages: busImages, + businessesImagesUrl: busImagesUrl, ); } setState(() { @@ -143,7 +144,10 @@ class _MihSearchMzansiState extends State { MihBusinessDetailsServices().fetchAllBusinessTypes(); mzansiSearchController.text = ""; WidgetsBinding.instance.addPostFrameCallback((_) async { - directoryProvider.setSearchedUsers(searchedUsers: [], userImages: {}); + directoryProvider.setSearchedUsers( + searchedUsers: [], + userImagesUrl: {}, + ); }); } diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart index 727ab8ce..debdb38e 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart @@ -574,16 +574,18 @@ class _MihBusinessCardState extends State { businessSearchResults = await MihBusinessDetailsServices() .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); - Map?> busImages = {}; - String businessLogoUrl = ""; + // Map?> busImages = {}; + Map> busImagesUrl = {}; + // String businessLogoUrl = ""; + Future businessLogoUrl; for (var bus in businessSearchResults) { - businessLogoUrl = await MihFileApi.getMinioFileUrl(bus.logo_path); - busImages[bus.business_id] = - businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; + businessLogoUrl = MihFileApi.getMinioFileUrl(bus.logo_path); + busImagesUrl[bus.business_id] = businessLogoUrl; + // != "" ? NetworkImage(businessLogoUrl) : null; } directoryProvider.setSearchedBusinesses( searchedBusinesses: businessSearchResults, - businessesImages: busImages, + businessesImagesUrl: busImagesUrl, ); setState(() { _businessReviewFuture = getUserReview(); diff --git a/Frontend/lib/mih_providers/mzansi_directory_provider.dart b/Frontend/lib/mih_providers/mzansi_directory_provider.dart index 52b4bd88..525fb507 100644 --- a/Frontend/lib/mih_providers/mzansi_directory_provider.dart +++ b/Frontend/lib/mih_providers/mzansi_directory_provider.dart @@ -11,13 +11,12 @@ class MzansiDirectoryProvider extends ChangeNotifier { bool personalSearch; List bookmarkedBusinesses = []; List? favouriteBusinessesList; - Map?>? favBusImages; Map>? favBusImagesUrl; List? searchedBusinesses; - Map?>? busSearchImages; + Map>? busSearchImagesUrl; Business? selectedBusiness; List? searchedUsers; - Map?>? userSearchImages; + Map>? userSearchImagesUrl; AppUser? selectedUser; String searchTerm; String businessTypeFilter; @@ -74,20 +73,18 @@ class MzansiDirectoryProvider extends ChangeNotifier { void setFavouriteBusinesses({ required List businesses, required Map> businessesImagesUrl, - // required Map?> businessesImages, }) { favouriteBusinessesList = businesses; - // favBusImages = businessesImages; favBusImagesUrl = businessesImagesUrl; notifyListeners(); } void setSearchedBusinesses({ required List searchedBusinesses, - required Map?> businessesImages, + required Map> businessesImagesUrl, }) { this.searchedBusinesses = searchedBusinesses; - busSearchImages = businessesImages; + busSearchImagesUrl = businessesImagesUrl; notifyListeners(); } @@ -98,10 +95,10 @@ class MzansiDirectoryProvider extends ChangeNotifier { void setSearchedUsers({ required List searchedUsers, - required Map?> userImages, + required Map> userImagesUrl, }) { this.searchedUsers = searchedUsers; - this.userSearchImages = userImages; + this.userSearchImagesUrl = userImagesUrl; notifyListeners(); }