From ee7d3881e6ed9811331454335305a86b78356f61 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 27 Nov 2025 12:40:34 +0200 Subject: [PATCH] BUG: Image loading of businesses --- .../package_tools/package_tool_one.dart | 21 ++- .../mih_business_profile_preview copy.dart | 127 ++++++++++++++++++ .../mih_business_profile_preview.dart | 63 +++------ .../build_business_search_resultsList.dart | 2 + .../build_favourite_businesses_list.dart | 2 + .../mzansi_directory/mzansi_directory.dart | 15 ++- .../package_tools/mih_search_mzansi.dart | 20 ++- .../components/mih_add_bookmark_alert.dart | 13 +- .../components/mih_business_info_card.dart | 12 +- .../components/mih_delete_bookmark_alert.dart | 13 +- .../mzansi_directory_provider.dart | 14 +- 11 files changed, 232 insertions(+), 70 deletions(-) create mode 100644 Frontend/lib/mih_package_components/mih_business_profile_preview copy.dart diff --git a/Frontend/lib/mih_package_components/Example/package_tools/package_tool_one.dart b/Frontend/lib/mih_package_components/Example/package_tools/package_tool_one.dart index 0bb85e04..176b5012 100644 --- a/Frontend/lib/mih_package_components/Example/package_tools/package_tool_one.dart +++ b/Frontend/lib/mih_package_components/Example/package_tools/package_tool_one.dart @@ -8,7 +8,6 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_banner_ad.dart'; -import 'package:mzansi_innovation_hub/mih_package_components/mih_business_profile_preview.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_personal_profile_preview.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; @@ -393,16 +392,16 @@ class _PackageToolOneState extends State { child: Center(child: Text("Location unavailable")), ); } else { - final myLocation = asyncSnapshot.data - .toString() - .replaceAll("Latitude: ", "") - .replaceAll("Longitude: ", ""); - print("My Location is this: $myLocation"); - return widget.business != null - ? MihBusinessProfilePreview( - business: widget.business!, - ) - : Text("NoBusiness Data"); + // final myLocation = asyncSnapshot.data + // .toString() + // .replaceAll("Latitude: ", "") + // .replaceAll("Longitude: ", ""); + // print("My Location is this: $myLocation"); + // return widget.business != null + // ? MihBusinessProfilePreview( + // business: widget.business!, + // ) + return Text("NoBusiness Data"); } }), // const SizedBox(height: 10), diff --git a/Frontend/lib/mih_package_components/mih_business_profile_preview copy.dart b/Frontend/lib/mih_package_components/mih_business_profile_preview copy.dart new file mode 100644 index 00000000..45864d3d --- /dev/null +++ b/Frontend/lib/mih_package_components/mih_business_profile_preview copy.dart @@ -0,0 +1,127 @@ +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; +import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_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_services/mih_location_services.dart'; +import 'package:provider/provider.dart'; + +class MihBusinessProfilePreview extends StatefulWidget { + final Business business; + const MihBusinessProfilePreview({ + super.key, + required this.business, + }); + + @override + State createState() => + _MihBusinessProfilePreviewState(); +} + +class _MihBusinessProfilePreviewState extends State { + late Future futureImageUrl; + PlatformFile? file; + + String calculateDistance(MzansiDirectoryProvider directoryProvider) { + try { + double distanceInKm = MIHLocationAPI().getDistanceInMeaters( + directoryProvider.userLocation, widget.business.gps_location) / + 1000; + return "${distanceInKm.toStringAsFixed(2)} km"; + } catch (error) { + print(error); + return "*.** km"; + } + } + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + double profilePictureWidth = 60; + return Consumer( + builder: (BuildContext context, MzansiDirectoryProvider directoryProvider, + Widget? child) { + return Row( + children: [ + FutureBuilder( + future: MihFileApi.getMinioFileUrl(widget.business.logo_path), + builder: (context, asyncSnapshot) { + if (asyncSnapshot.connectionState == ConnectionState.done && + asyncSnapshot.hasData) { + if (asyncSnapshot.requireData != "") { + return MihCircleAvatar( + imageFile: NetworkImage(asyncSnapshot.requireData), + width: profilePictureWidth, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + backgroundColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + onChange: () {}, + ); + } else { + return Icon( + MihIcons.iDontKnow, + size: profilePictureWidth, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ); + } + } else { + return Icon( + MihIcons.mihRing, + size: profilePictureWidth, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ); + } + }), + const SizedBox(width: 15), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.business.Name, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + Text( + widget.business.type, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + ), + ), + Text( + directoryProvider.userPosition != null + ? calculateDistance(directoryProvider) + : "0.00 km", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 10, + ), + ), + ], + ) + ], + ); + }, + ); + } +} diff --git a/Frontend/lib/mih_package_components/mih_business_profile_preview.dart b/Frontend/lib/mih_package_components/mih_business_profile_preview.dart index 45864d3d..a9fcd70d 100644 --- a/Frontend/lib/mih_package_components/mih_business_profile_preview.dart +++ b/Frontend/lib/mih_package_components/mih_business_profile_preview.dart @@ -1,4 +1,3 @@ -import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; @@ -6,15 +5,16 @@ import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.d import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_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_services/mih_location_services.dart'; import 'package:provider/provider.dart'; class MihBusinessProfilePreview extends StatefulWidget { final Business business; + final ImageProvider? imageFile; const MihBusinessProfilePreview({ super.key, required this.business, + required this.imageFile, }); @override @@ -23,9 +23,6 @@ class MihBusinessProfilePreview extends StatefulWidget { } class _MihBusinessProfilePreviewState extends State { - late Future futureImageUrl; - PlatformFile? file; - String calculateDistance(MzansiDirectoryProvider directoryProvider) { try { double distanceInKm = MIHLocationAPI().getDistanceInMeaters( @@ -51,45 +48,23 @@ class _MihBusinessProfilePreviewState extends State { Widget? child) { return Row( children: [ - FutureBuilder( - future: MihFileApi.getMinioFileUrl(widget.business.logo_path), - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "") { - return MihCircleAvatar( - imageFile: NetworkImage(asyncSnapshot.requireData), - width: profilePictureWidth, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - backgroundColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.iDontKnow, - size: profilePictureWidth, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ); - } - }), + widget.imageFile == null + ? Icon( + MihIcons.iDontKnow, + size: profilePictureWidth, + ) + : 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 122d5014..1ef16c88 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 @@ -60,6 +60,8 @@ class _BuildBusinessSearchResultsListState ), child: MihBusinessProfilePreview( business: widget.businessList[index], + imageFile: directoryProvider.busSearchImages![ + widget.businessList[index].business_id], ), ), ), diff --git a/Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart b/Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart index 665fddd0..6da7624c 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart @@ -61,6 +61,8 @@ class _BuildFavouriteBusinessesListState ), child: MihBusinessProfilePreview( business: widget.favouriteBusinesses[index]!, + imageFile: directoryProvider.favBusImages![ + widget.favouriteBusinesses[index]!.business_id], ), ), ), diff --git a/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart b/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart index f61b2914..3b392b8b 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/mzansi_directory.dart @@ -12,6 +12,7 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/package_tool import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_location_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart'; import 'package:provider/provider.dart'; @@ -40,10 +41,10 @@ class _MzansiDirectoryState extends State { mzansiProfileProvider, ); await getFavouriteBusinesses(); - initialiseGPSLocation(); setState(() { _isLoadingInitialData = false; }); + initialiseGPSLocation(); } Future initialiseGPSLocation() async { @@ -63,14 +64,22 @@ class _MzansiDirectoryState extends State { directoryProvider, ); List favBus = []; + Map?> favBusImages = {}; + String businessLogoUrl = ""; for (var bus in directoryProvider.bookmarkedBusinesses) { await MihBusinessDetailsServices() .getBusinessDetailsByBusinessId(bus.business_id) - .then((business) { + .then((business) async { favBus.add(business!); + businessLogoUrl = await MihFileApi.getMinioFileUrl(business.logo_path); + favBusImages[business.business_id] = + businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; }); } - directoryProvider.setFavouriteBusinesses(businesses: favBus); + directoryProvider.setFavouriteBusinesses( + businesses: favBus, + businessesImages: favBusImages, + ); } @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 b4cd3caa..4d545ecf 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 @@ -17,6 +17,7 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/bui import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:provider/provider.dart'; @@ -40,7 +41,6 @@ class _MihSearchMzansiState extends State { late Future> availableBusinessTypes; bool filterOn = false; bool loadingSearchResults = false; - Future swapPressed(MzansiProfileProvider profileProvider, MzansiDirectoryProvider directoryProvider) async { directoryProvider.setPersonalSearch(!directoryProvider.personalSearch); @@ -58,7 +58,8 @@ class _MihSearchMzansiState extends State { } void clearAll(MzansiDirectoryProvider directoryProvider) { - directoryProvider.setSearchedBusinesses(searchedBusinesses: []); + directoryProvider + .setSearchedBusinesses(searchedBusinesses: [], businessesImages: {}); directoryProvider.setSearchedUsers(searchedUsers: []); directoryProvider.setSearchTerm(searchTerm: ""); setState(() { @@ -91,8 +92,19 @@ class _MihSearchMzansiState extends State { .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); } + Map?> busImages = {}; + String businessLogoUrl = ""; + for (var bus in businessSearchResults) { + KenLogger.success("Business Logo Path: ${bus.logo_path}"); + businessLogoUrl = await MihFileApi.getMinioFileUrl(bus.logo_path); + KenLogger.success("Business Logo Path: ${bus.logo_path}"); + busImages[bus.business_id] = + businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; + } directoryProvider.setSearchedBusinesses( - searchedBusinesses: businessSearchResults); + searchedBusinesses: businessSearchResults, + businessesImages: busImages, + ); } setState(() { loadingSearchResults = false; @@ -280,8 +292,6 @@ class _MihSearchMzansiState extends State { Widget displayBusinessSearchResults( MzansiDirectoryProvider directoryProvider) { - KenLogger.success( - "Searched Businesses: ${directoryProvider.searchedBusinesses}"); if (directoryProvider.searchedBusinesses == null || loadingSearchResults) { return Center( child: const Mihloadingcircle(), diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart index e7173d62..7be2787d 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart @@ -10,6 +10,7 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_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_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart'; import 'package:provider/provider.dart'; @@ -37,14 +38,22 @@ class _MihAddBookmarkAlertState extends State { directoryProvider, ); List favBus = []; + Map?> favBusImages = {}; + String businessLogoUrl = ""; for (var bus in directoryProvider.bookmarkedBusinesses) { await MihBusinessDetailsServices() .getBusinessDetailsByBusinessId(bus.business_id) - .then((business) { + .then((business) async { favBus.add(business!); + businessLogoUrl = await MihFileApi.getMinioFileUrl(business.logo_path); + favBusImages[business.business_id] = + businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; }); } - directoryProvider.setFavouriteBusinesses(businesses: favBus); + directoryProvider.setFavouriteBusinesses( + businesses: favBus, + businessesImages: favBusImages, + ); } Future addBookmark( 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 fa5b1440..727ab8ce 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 @@ -15,6 +15,7 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profi import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart'; import 'package:provider/provider.dart'; import 'package:redacted/redacted.dart'; @@ -573,8 +574,17 @@ class _MihBusinessCardState extends State { businessSearchResults = await MihBusinessDetailsServices() .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); + Map?> busImages = {}; + String businessLogoUrl = ""; + for (var bus in businessSearchResults) { + businessLogoUrl = await MihFileApi.getMinioFileUrl(bus.logo_path); + busImages[bus.business_id] = + businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; + } directoryProvider.setSearchedBusinesses( - searchedBusinesses: businessSearchResults); + searchedBusinesses: businessSearchResults, + businessesImages: busImages, + ); setState(() { _businessReviewFuture = getUserReview(); }); diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart index df496d72..57e5421d 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart @@ -11,6 +11,7 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.da import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart'; import 'package:provider/provider.dart'; @@ -42,14 +43,22 @@ class _MihDeleteBookmarkAlertState extends State { directoryProvider, ); List favBus = []; + Map?> favBusImages = {}; + String businessLogoUrl = ""; for (var bus in directoryProvider.bookmarkedBusinesses) { await MihBusinessDetailsServices() .getBusinessDetailsByBusinessId(bus.business_id) - .then((business) { + .then((business) async { favBus.add(business!); + businessLogoUrl = await MihFileApi.getMinioFileUrl(business.logo_path); + favBusImages[business.business_id] = + businessLogoUrl != "" ? NetworkImage(businessLogoUrl) : null; }); } - directoryProvider.setFavouriteBusinesses(businesses: favBus); + directoryProvider.setFavouriteBusinesses( + businesses: favBus, + businessesImages: favBusImages, + ); } Future deleteBookmark(int idbookmarked_businesses) async { diff --git a/Frontend/lib/mih_providers/mzansi_directory_provider.dart b/Frontend/lib/mih_providers/mzansi_directory_provider.dart index ed88e863..ebffc52e 100644 --- a/Frontend/lib/mih_providers/mzansi_directory_provider.dart +++ b/Frontend/lib/mih_providers/mzansi_directory_provider.dart @@ -11,7 +11,9 @@ class MzansiDirectoryProvider extends ChangeNotifier { bool personalSearch; List bookmarkedBusinesses = []; List? favouriteBusinessesList; + Map?>? favBusImages; List? searchedBusinesses; + Map?>? busSearchImages; Business? selectedBusiness; List? searchedUsers; AppUser? selectedUser; @@ -67,13 +69,21 @@ class MzansiDirectoryProvider extends ChangeNotifier { notifyListeners(); } - void setFavouriteBusinesses({required List businesses}) { + void setFavouriteBusinesses({ + required List businesses, + required Map?> businessesImages, + }) { favouriteBusinessesList = businesses; + favBusImages = businessesImages; notifyListeners(); } - void setSearchedBusinesses({required List searchedBusinesses}) { + void setSearchedBusinesses({ + required List searchedBusinesses, + required Map?> businessesImages, + }) { this.searchedBusinesses = searchedBusinesses; + busSearchImages = businessesImages; notifyListeners(); }