From 739ab51e6b7afa7a322c59ebfef0f6c632a6c3ed Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Tue, 29 Jul 2025 13:09:33 +0200 Subject: [PATCH] show list of favorites --- .../build_favourite_businesses_list.dart | 63 +++++++++++++++++++ .../mih_favourite_businesses.dart | 49 ++++++++++++++- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart 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 new file mode 100644 index 00000000..75b40dbb --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/bookmarked_business.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_business_profile_preview.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; + +class BuildFavouriteBusinessesList extends StatefulWidget { + final List favouriteBusinesses; + final String? myLocation; + const BuildFavouriteBusinessesList({ + super.key, + required this.favouriteBusinesses, + required this.myLocation, + }); + + @override + State createState() => + _BuildFavouriteBusinessesListState(); +} + +class _BuildFavouriteBusinessesListState + extends State { + @override + Widget build(BuildContext context) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: widget.favouriteBusinesses.length, + separatorBuilder: (BuildContext context, index) { + return Divider( + color: Theme.of(context).colorScheme.secondary, + ); + }, + itemBuilder: (context, index) { + Future businessDetails = + MihBusinessDetailsServices().getBusinessDetailsByBusinessId( + widget.favouriteBusinesses[index].business_id, + ); + return FutureBuilder( + future: businessDetails, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center( + child: Text( + 'Error: ${snapshot.error}', + style: TextStyle(color: Colors.red), + ), + ); + } else if (snapshot.hasData && snapshot.data != null) { + Business business = snapshot.data!; + return MihBusinessProfilePreview( + business: business, myLocation: widget.myLocation); + } else { + return const Center(child: Text('No business found')); + } + }, + ); + }, + ); + } +} diff --git a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart index 76c53e22..6d288d48 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart @@ -1,11 +1,20 @@ import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_objects/bookmarked_business.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_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_packages/mzansi_directory/builders/build_favourite_businesses_list.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart'; +import 'package:supertokens_flutter/supertokens.dart'; class MihFavouriteBusinesses extends StatefulWidget { - const MihFavouriteBusinesses({super.key}); + final String? myLocation; + const MihFavouriteBusinesses({ + super.key, + required this.myLocation, + }); @override State createState() => _MihFavouriteBusinessesState(); @@ -15,6 +24,18 @@ class _MihFavouriteBusinessesState extends State { final TextEditingController businessSearchController = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); + late Future> boookmarkedBusinessListFuture; + + Future> getAllBookmarkedBusinessesForUser() async { + String user_id = await SuperTokens.getUserId(); + return MihMzansiDirectoryServices().getAllUserBookmarkedBusiness(user_id); + } + + @override + void initState() { + super.initState(); + boookmarkedBusinessListFuture = getAllBookmarkedBusinessesForUser(); + } @override Widget build(BuildContext context) { @@ -44,6 +65,32 @@ class _MihFavouriteBusinessesState extends State { ), ), const SizedBox(height: 10), + FutureBuilder( + future: boookmarkedBusinessListFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Mihloadingcircle( + message: "Getting your favourites", + ); + } else if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasData && snapshot.data!.isNotEmpty) { + List bookmarkedBusinesses = + snapshot.data!; + return BuildFavouriteBusinessesList( + favouriteBusinesses: bookmarkedBusinesses, + myLocation: widget.myLocation, + ); + } else { + return Center( + child: Text("No bookmarked businesses found"), + ); + } + } else { + return Center( + child: Text("Error loading bookmarked businesses"), + ); + } + }), ], ), );