diff --git a/Frontend/lib/main.dart b/Frontend/lib/main.dart index 018c35ea..05ab1dc3 100644 --- a/Frontend/lib/main.dart +++ b/Frontend/lib/main.dart @@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_authentic import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_mine_sweeper_provider.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; @@ -85,6 +86,9 @@ class _MzansiInnovationHubState extends State { ChangeNotifierProvider( create: (context) => MzansiWalletProvider(), ), + ChangeNotifierProvider( + create: (context) => MzansiAiProvider(), + ), ChangeNotifierProvider( create: (context) => MihBannerAdProvider(), ), diff --git a/Frontend/lib/mih_components/mih_providers/mzansi_ai_provider.dart b/Frontend/lib/mih_components/mih_providers/mzansi_ai_provider.dart new file mode 100644 index 00000000..fc6b31fb --- /dev/null +++ b/Frontend/lib/mih_components/mih_providers/mzansi_ai_provider.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +class MzansiAiProvider extends ChangeNotifier { + int toolIndex; + String? startUpQuestion; + + MzansiAiProvider({ + this.toolIndex = 0, + }); + + void setToolIndex(int index) { + toolIndex = index; + notifyListeners(); + } + + void setStartUpQuestion(String? question) { + startUpQuestion = question; + notifyListeners(); + } +} diff --git a/Frontend/lib/mih_config/mih_go_router.dart b/Frontend/lib/mih_config/mih_go_router.dart index c59ad602..fb7429ce 100644 --- a/Frontend/lib/mih_config/mih_go_router.dart +++ b/Frontend/lib/mih_config/mih_go_router.dart @@ -260,14 +260,13 @@ class MihGoRouter { path: MihGoRouterPaths.mzansiAi, builder: (BuildContext context, GoRouterState state) { KenLogger.success("MihGoRouter: mzansiAi"); - final MzansiAiArguments? args = state.extra as MzansiAiArguments?; - if (args == null) { + if (context.watch().business == null) { WidgetsBinding.instance.addPostFrameCallback((_) { context.go(MihGoRouterPaths.mihHome); }); return const SizedBox.shrink(); } - return MzansiAi(arguments: args); + return MzansiAi(); }, ), // ========================== Mzansi Wallet ================================== 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 140544f2..cbfc1bad 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 @@ -6,6 +6,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.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_ai_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/about_mih/package_tile/about_mih_tile.dart'; @@ -123,11 +124,6 @@ class _MihBusinessHomeState extends State //=============== Mzansi AI =============== temp.add({ "Mzansi AI": MzansiAiTile( - arguments: MzansiAiArguments( - mzansiProfileProvider.user!, - "", - false, - ), packageSize: packageSize, ) }); @@ -205,9 +201,11 @@ class _MihBusinessHomeState extends State } Widget getBody(double width, double height) { - return Consumer( + return Consumer2( builder: (BuildContext context, - MzansiProfileProvider mzansiProfileProvider, Widget? child) { + MzansiProfileProvider mzansiProfileProvider, + MzansiAiProvider mzansiAiProvider, + Widget? child) { if (mzansiProfileProvider.business == null) { return Center( child: Mihloadingcircle(), @@ -228,25 +226,10 @@ class _MihBusinessHomeState extends State hintColor: MihColors.getPrimaryColor( MzansiInnovationHub.of(context)!.theme.mode == "Dark"), onPrefixIconTap: () { + mzansiAiProvider.setStartUpQuestion(searchController.text); context.goNamed( "mzansiAi", - extra: MzansiAiArguments( - mzansiProfileProvider.user!, - searchController.text.isEmpty - ? null - : searchController.text, - false, - ), ); - // Navigator.of(context).pushNamed( - // '/mzansi-ai', - // arguments: MzansiAiArguments( - // widget.signedInUser, - // searchController.text.isEmpty - // ? null - // : searchController.text, - // ), - // ); searchController.clear(); }, searchFocusNode: _searchFocusNode, 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 55c42822..6bc80728 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 @@ -9,6 +9,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; +import 'package:mzansi_innovation_hub/mih_components/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'; import 'package:mzansi_innovation_hub/mih_packages/access_review/package_tile/mih_access_tile.dart'; @@ -22,6 +23,7 @@ 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_profile/pat_profile/package_tiles/patient_profile_tile.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class MihPersonalHome extends StatefulWidget { final AppUser signedInUser; @@ -135,11 +137,6 @@ class _MihPersonalHomeState extends State //=============== Mzansi AI =============== temp.add({ "Mzansi AI": MzansiAiTile( - arguments: MzansiAiArguments( - widget.signedInUser, - "", - true, - ), packageSize: packageSize, ) }); @@ -263,124 +260,115 @@ class _MihPersonalHomeState extends State } Widget getBody(double width, double height) { - 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: () { - context.goNamed( - "mzansiAi", - extra: MzansiAiArguments( - widget.signedInUser, - searchController.text.isEmpty - ? null - : searchController.text, - true, - ), - ); - // Navigator.of(context).pushNamed( - // '/mzansi-ai', - // arguments: MzansiAiArguments( - // widget.signedInUser, - // searchController.text.isEmpty - // ? null - // : searchController.text, - // ), - // ); - searchController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), - ), - ), - const SizedBox(height: 20), - ValueListenableBuilder( - valueListenable: searchPackageName, - builder: (context, value, child) { - List filteredPackages = value - .where((package) => package.keys.first - .toLowerCase() - .contains(searchController.text.toLowerCase())) - .map((package) => package.values.first) - .toList(); - if (filteredPackages.isNotEmpty) { - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, + 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 + .setStartUpQuestion(searchController.text); + context.goNamed( + "mzansiAi", + ); + searchController.clear(); + }, + searchFocusNode: _searchFocusNode, ), - itemBuilder: (context, index) { - return filteredPackages[index]; - // return personalPackages[index]; - }, - ); - } else { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const SizedBox(height: 50), - Icon( - MihIcons.mzansiAi, - size: 165, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), - ), - const SizedBox(height: 10), - Text( - "Mzansi AI is here to help you!", - textAlign: TextAlign.center, - overflow: TextOverflow.visible, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MihColors.getSecondaryColor( - MzansiInnovationHub.of(context)!.theme.mode == - "Dark"), + ), + ), + const SizedBox(height: 20), + ValueListenableBuilder( + valueListenable: searchPackageName, + builder: (context, value, child) { + List filteredPackages = value + .where((package) => package.keys.first + .toLowerCase() + .contains(searchController.text.toLowerCase())) + .map((package) => package.values.first) + .toList(); + if (filteredPackages.isNotEmpty) { + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, ), - ), - ], - ); - } - }, + itemBuilder: (context, index) { + return filteredPackages[index]; + // return personalPackages[index]; + }, + ); + } else { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 50), + Icon( + MihIcons.mzansiAi, + size: 165, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + const SizedBox(height: 10), + Text( + "Mzansi AI is here to help you!", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MihColors.getSecondaryColor( + MzansiInnovationHub.of(context)!.theme.mode == + "Dark"), + ), + ), + ], + ); + } + }, + ), + ], ), - ], - ), + ); + }, ); } } diff --git a/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart b/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart index 715b0519..1d694165 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart @@ -2,19 +2,14 @@ import 'package:go_router/go_router.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_ai_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/package_tools/ai_chat.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class MzansiAi extends StatefulWidget { - // final AppUser signedInUser; - // final String? startUpQuestion; - final MzansiAiArguments arguments; const MzansiAi({ super.key, - required this.arguments, - // required this.signedInUser, - // this.startUpQuestion, }); @override @@ -22,13 +17,12 @@ class MzansiAi extends StatefulWidget { } class _MzansiAiState extends State { - int _selcetedIndex = 0; - MihPackageAction getAction() { return MihPackageAction( icon: const Icon(Icons.arrow_back), iconSize: 35, onTap: () { + context.read().setStartUpQuestion(null); context.goNamed( 'mihHome', ); @@ -40,23 +34,18 @@ class _MzansiAiState extends State { MihPackageTools getTools() { Map temp = {}; temp[const Icon(Icons.chat)] = () { - setState(() { - _selcetedIndex = 0; - }); + context.read().setToolIndex(0); }; return MihPackageTools( tools: temp, - selcetedIndex: _selcetedIndex, + selcetedIndex: context.watch().toolIndex, ); } List getToolBody() { List toolBodies = [ - AiChat( - signedInUser: widget.arguments.signedInUser, - startUpQuestion: widget.arguments.startUpQuestion, - ), + AiChat(), ]; return toolBodies; } @@ -80,12 +69,9 @@ class _MzansiAiState extends State { appTools: getTools(), appBody: getToolBody(), appToolTitles: getToolTitle(), - selectedbodyIndex: _selcetedIndex, + selectedbodyIndex: context.watch().toolIndex, onIndexChange: (newValue) { - setState(() { - _selcetedIndex = newValue; - }); - print("Index: $_selcetedIndex"); + context.read().setToolIndex(newValue); }, ); } diff --git a/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart b/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart index 24633b33..de331e7a 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart @@ -3,16 +3,13 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tile.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:flutter/material.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; class MzansiAiTile extends StatefulWidget { - final MzansiAiArguments arguments; final double packageSize; const MzansiAiTile({ super.key, - required this.arguments, required this.packageSize, }); @@ -27,7 +24,6 @@ class _MzansiAiTileState extends State { onTap: () { context.goNamed( 'mzansiAi', - extra: widget.arguments, ); // Navigator.of(context).pushNamed( // '/mzansi-ai', diff --git a/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart b/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart index 8f789669..c380456f 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart @@ -4,6 +4,8 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:gpt_markdown/gpt_markdown.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_ai_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_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_dropdwn_field.dart'; @@ -14,22 +16,18 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_radio_options.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.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:flutter_chat_ui/flutter_chat_ui.dart'; import 'package:flutter_chat_types/flutter_chat_types.dart' as types; import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_tts/flutter_tts.dart'; import 'package:ollama_dart/ollama_dart.dart' as ollama; +import 'package:provider/provider.dart'; import 'package:uuid/uuid.dart'; class AiChat extends StatefulWidget { - final AppUser signedInUser; - final String? startUpQuestion; const AiChat({ super.key, - required this.signedInUser, - this.startUpQuestion, }); @override @@ -615,9 +613,13 @@ class _AiChatState extends State { @override void initState() { super.initState(); + MzansiAiProvider mzansiAiProvider = context.read(); + MzansiProfileProvider mzansiProfileProvider = + context.read(); _user = types.User( - firstName: widget.signedInUser.fname, - id: widget.signedInUser.app_id, //'82091008-a484-4a89-ae75-a22bf8d6f3ac', + firstName: mzansiProfileProvider.user!.fname, + id: mzansiProfileProvider + .user!.app_id, //'82091008-a484-4a89-ae75-a22bf8d6f3ac', ); _mihAI = types.User( firstName: "Mzansi AI", @@ -634,8 +636,10 @@ class _AiChatState extends State { ); initTTS(); _ttsVoiceController.addListener(voiceSelected); - if (widget.startUpQuestion != null && widget.startUpQuestion!.isNotEmpty) { - final partialText = types.PartialText(text: widget.startUpQuestion!); + if (mzansiAiProvider.startUpQuestion != null && + mzansiAiProvider.startUpQuestion!.isNotEmpty) { + final partialText = + types.PartialText(text: mzansiAiProvider.startUpQuestion!); WidgetsBinding.instance.addPostFrameCallback((_) { _handleSendPressed(partialText); }); diff --git a/docker-compose.yml b/docker-compose.yml index f42cb4e8..ccdadd2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -171,14 +171,14 @@ services: networks: - MIH-network # === Added section for NVIDIA GPU acceleration === - # runtime: nvidia - # deploy: - # resources: - # reservations: - # devices: - # - driver: nvidia - # count: all # or specify a number of GPUs - # capabilities: [ gpu ] + runtime: nvidia + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all # or specify a number of GPUs + capabilities: [ gpu ] #============== Firebaase ==================================================================== # firebase: # container_name: MIH-firebase-emulator