From 004c2397c5119e18132c5bfa5c4b7a27791a266f Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Fri, 28 Nov 2025 12:15:12 +0200 Subject: [PATCH] QOL: MIH Home Package performance improvements --- .../package_tiles/test_package_tile.dart | 11 -- .../lib/mih_packages/mih_home/mih_home.dart | 56 +++----- .../package_tools/mih_business_home.dart | 70 +++++----- .../package_tools/mih_personal_home.dart | 131 ++++++------------ .../package_tiles/mih_mine_sweeper_tile.dart | 2 - .../package_tiles/patient_profile_tile.dart | 3 - 6 files changed, 89 insertions(+), 184 deletions(-) diff --git a/Frontend/lib/mih_package_components/Example/package_tiles/test_package_tile.dart b/Frontend/lib/mih_package_components/Example/package_tiles/test_package_tile.dart index 6cf7c228..565f3c32 100644 --- a/Frontend/lib/mih_package_components/Example/package_tiles/test_package_tile.dart +++ b/Frontend/lib/mih_package_components/Example/package_tiles/test_package_tile.dart @@ -1,20 +1,13 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tile.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; class TestPackageTile extends StatefulWidget { - final AppUser signedInUser; - final Business? business; final double packageSize; const TestPackageTile({ super.key, - required this.signedInUser, - required this.business, required this.packageSize, }); @@ -29,10 +22,6 @@ class _TestPackageTileState extends State { onTap: () { context.goNamed( 'testPackage', - extra: TestArguments( - widget.signedInUser, - widget.business, - ), ); // Navigator.of(context).pushNamed( // '/package-dev', diff --git a/Frontend/lib/mih_packages/mih_home/mih_home.dart b/Frontend/lib/mih_packages/mih_home/mih_home.dart index 554224f8..2d5b0a9e 100644 --- a/Frontend/lib/mih_packages/mih_home/mih_home.dart +++ b/Frontend/lib/mih_packages/mih_home/mih_home.dart @@ -1,22 +1,18 @@ import 'package:go_router/go_router.dart'; import 'package:ken_logger/ken_logger.dart'; import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tools.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; -import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_scack_bar.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart'; 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_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_business_home.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart'; @@ -38,6 +34,8 @@ class _MihHomeState extends State { DateTime latestPrivacyPolicyDate = DateTime.parse("2024-12-01"); DateTime latestTermOfServiceDate = DateTime.parse("2024-12-01"); bool _isLoadingInitialData = true; + late final MihPersonalHome _personalHome; + late final MihBusinessHome _businessHome; Future _loadInitialData() async { setState(() { @@ -48,9 +46,11 @@ class _MihHomeState extends State { await MihDataHelperServices().loadUserDataWithBusinessesData( mzansiProfileProvider, ); - setState(() { - _isLoadingInitialData = false; - }); + if (mounted) { + setState(() { + _isLoadingInitialData = false; + }); + } } bool showPolicyWindow(UserConsent? userConsent) { @@ -79,6 +79,7 @@ class _MihHomeState extends State { context, ) .then((value) { + if (!mounted) return; if (value == 200) { context.goNamed("mihHome"); ScaffoldMessenger.of(context).showSnackBar( @@ -262,6 +263,8 @@ class _MihHomeState extends State { @override void initState() { super.initState(); + _personalHome = const MihPersonalHome(); + _businessHome = MihBusinessHome(isLoading: _isLoadingInitialData); _loadInitialData(); } @@ -375,15 +378,11 @@ class _MihHomeState extends State { MzansiProfileProvider mzansiProfileProvider, bool isBusinessUser) { Map temp = {}; temp[const Icon(Icons.person)] = () { - setState(() { - mzansiProfileProvider.setPersonalHome(true); - }); + mzansiProfileProvider.setPersonalHome(true); }; if (isBusinessUser) { temp[const Icon(Icons.business_center)] = () { - setState(() { - mzansiProfileProvider.setPersonalHome(false); - }); + mzansiProfileProvider.setPersonalHome(false); }; } return MihPackageTools( @@ -393,32 +392,9 @@ class _MihHomeState extends State { } List getToolBody(MzansiProfileProvider mzansiProfileProvider) { - List toolBodies = []; - AppUser? user = mzansiProfileProvider.user; - Business? business = mzansiProfileProvider.business; - BusinessUser? businessUser = mzansiProfileProvider.businessUser; - String userProfilePictureUrl = - mzansiProfileProvider.userProfilePicUrl ?? ""; - toolBodies.add( - MihPersonalHome( - signedInUser: user!, - personalSelected: mzansiProfileProvider.personalHome, - business: business, - businessUser: businessUser, - propicFile: userProfilePictureUrl != "" - ? NetworkImage(userProfilePictureUrl) - : null, - isDevActive: AppEnviroment.getEnv() == "Dev", - isUserNew: user.username == "", - ), - ); - if (user.type != "personal") { - toolBodies.add( - MihBusinessHome( - isLoading: _isLoadingInitialData, - ), - ); - } - return toolBodies; + return [ + _personalHome, + _businessHome, + ]; } } diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index b14199e4..ea64faa4 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -1,6 +1,5 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_search_bar.dart'; @@ -203,44 +202,37 @@ class _MihBusinessHomeState extends State MzansiProfileProvider mzansiProfileProvider, MzansiAiProvider mzansiAiProvider, Widget? child) { - // if (mzansiProfileProvider.user == null || - // mzansiProfileProvider.business == null || - // mzansiProfileProvider.businessUser == null) { - // return Center( - // child: Mihloadingcircle(), - // ); - // } - return MihSingleChildScroll( - child: Column( - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: Visibility( - visible: mzansiProfileProvider.business != null, - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - hintColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onPrefixIconTap: () { - mzansiAiProvider.ollamaProvider.resetChat(); - if (searchController.text.isNotEmpty) { - mzansiAiProvider - .setStartUpQuestion(searchController.text); - } - context.goNamed("mzansiAi"); - searchController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + return Column( + children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: Visibility( + visible: mzansiProfileProvider.business != null, + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + hintColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onPrefixIconTap: () { + mzansiAiProvider.ollamaProvider.resetChat(); + if (searchController.text.isNotEmpty) { + mzansiAiProvider + .setStartUpQuestion(searchController.text); + } + context.goNamed("mzansiAi"); + searchController.clear(); + }, + searchFocusNode: _searchFocusNode, ), ), - const SizedBox(height: 20), - ValueListenableBuilder( + ), + const SizedBox(height: 20), + Expanded( + child: ValueListenableBuilder( valueListenable: searchPackageName, builder: (context, value, child) { List filteredPackages = value @@ -295,8 +287,8 @@ class _MihBusinessHomeState extends State } }, ), - ], - ), + ), + ], ); }, ); diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index b8249ce9..0d72a56e 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -1,14 +1,10 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_package_components/Example/package_tiles/test_package_tile.dart'; -import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_search_bar.dart'; -import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; -import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; -import 'package:mzansi_innovation_hub/mih_objects/business.dart'; -import 'package:mzansi_innovation_hub/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_mih_tile.dart'; @@ -23,26 +19,12 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profi import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:provider/provider.dart'; class MihPersonalHome extends StatefulWidget { - final AppUser signedInUser; - final bool personalSelected; - final Business? business; - final BusinessUser? businessUser; - final ImageProvider? propicFile; - final bool isUserNew; - final bool isDevActive; - const MihPersonalHome({ super.key, - required this.signedInUser, - required this.personalSelected, - required this.business, - required this.businessUser, - required this.propicFile, - required this.isUserNew, - required this.isDevActive, }); @override @@ -104,13 +86,6 @@ class _MihPersonalHomeState extends State //=============== Patient Profile =============== temp.add({ "Patient Profile": PatientProfileTile( - arguments: PatientViewArguments( - widget.signedInUser, - null, - null, - null, - "personal", - ), packageSize: packageSize, ) }); @@ -141,7 +116,6 @@ class _MihPersonalHomeState extends State //=============== Mine Sweeper =============== temp.add({ "Mine Sweeper": MihMineSweeperTile( - personalSelected: widget.personalSelected, packageSize: packageSize, ) }); @@ -158,11 +132,9 @@ class _MihPersonalHomeState extends State ) }); //=============== Dev =============== - if (widget.isDevActive) { + if (AppEnviroment.getEnv() == "Dev") { temp.add({ "test": TestPackageTile( - signedInUser: widget.signedInUser, - business: widget.business, packageSize: packageSize, ) }); @@ -205,10 +177,6 @@ class _MihPersonalHomeState extends State WidgetsBinding.instance.addPostFrameCallback((_) { context.goNamed( 'mzansiProfileManage', - extra: AppProfileUpdateArguments( - widget.signedInUser, - widget.propicFile, - ), ); }); } @@ -227,7 +195,9 @@ class _MihPersonalHomeState extends State void initState() { super.initState(); searchController.addListener(searchPackage); - if (widget.isUserNew) { + MzansiProfileProvider profileProvider = + context.read(); + if (profileProvider.user!.username == "") { personalPackagesMap = setNerUserPersonalPackage(); autoNavToProfile(); } else { @@ -249,57 +219,40 @@ class _MihPersonalHomeState extends State } Widget getBody(double width, double height) { - return Consumer( - builder: (BuildContext context, MzansiAiProvider mzansiAiProvider, - Widget? child) { - return MihSingleChildScroll( - child: Column( - children: [ - // Icon( - // MihIcons.mihLogo, - // size: 200, - // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - // ), - // const SizedBox(height: 10), - // Text( - // // "Welcome, ${widget.signedInUser.fname}!", - // "Mzansi Innovation Hub", - // textAlign: TextAlign.center, - // style: TextStyle( - // fontSize: 30, - // fontWeight: FontWeight.bold, - // color: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - // ), - // ), - // const SizedBox(height: 20), - Visibility( - visible: !widget.isUserNew, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - hintColor: MihColors.getPrimaryColor( - MzansiInnovationHub.of(context)!.theme.mode == "Dark"), - onPrefixIconTap: () { - mzansiAiProvider.ollamaProvider.resetChat(); - if (searchController.text.isNotEmpty) { - mzansiAiProvider - .setStartUpQuestion(searchController.text); - } - context.goNamed("mzansiAi"); - searchController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + return Consumer2( + builder: (BuildContext context, MzansiProfileProvider profileProvider, + MzansiAiProvider mzansiAiProvider, Widget? child) { + return Column( + children: [ + Visibility( + visible: profileProvider.user!.username != "", + child: Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + hintColor: MihColors.getPrimaryColor( + MzansiInnovationHub.of(context)!.theme.mode == "Dark"), + onPrefixIconTap: () { + mzansiAiProvider.ollamaProvider.resetChat(); + if (searchController.text.isNotEmpty) { + mzansiAiProvider + .setStartUpQuestion(searchController.text); + } + context.goNamed("mzansiAi"); + searchController.clear(); + }, + searchFocusNode: _searchFocusNode, ), ), - const SizedBox(height: 20), - ValueListenableBuilder( + ), + const SizedBox(height: 20), + Expanded( + child: ValueListenableBuilder( valueListenable: searchPackageName, builder: (context, value, child) { List filteredPackages = value @@ -310,8 +263,8 @@ class _MihPersonalHomeState extends State .toList(); if (filteredPackages.isNotEmpty) { return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, + // physics: const NeverScrollableScrollPhysics(), + // shrinkWrap: true, padding: getPadding(width, height), // shrinkWrap: true, itemCount: filteredPackages.length, @@ -355,8 +308,8 @@ class _MihPersonalHomeState extends State } }, ), - ], - ), + ), + ], ); }, ); diff --git a/Frontend/lib/mih_packages/mine_sweeper/package_tiles/mih_mine_sweeper_tile.dart b/Frontend/lib/mih_packages/mine_sweeper/package_tiles/mih_mine_sweeper_tile.dart index 1c15c4e9..aa324b7d 100644 --- a/Frontend/lib/mih_packages/mine_sweeper/package_tiles/mih_mine_sweeper_tile.dart +++ b/Frontend/lib/mih_packages/mine_sweeper/package_tiles/mih_mine_sweeper_tile.dart @@ -6,11 +6,9 @@ import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tile.da import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; class MihMineSweeperTile extends StatefulWidget { - final bool personalSelected; final double packageSize; const MihMineSweeperTile({ super.key, - required this.personalSelected, required this.packageSize, }); diff --git a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart index c22b49f0..d659c420 100644 --- a/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart +++ b/Frontend/lib/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart @@ -2,17 +2,14 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tile.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart'; -import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; class PatientProfileTile extends StatefulWidget { - final PatientViewArguments arguments; final double packageSize; const PatientProfileTile({ super.key, - required this.arguments, required this.packageSize, });