From 44f7cd4255ff3a39f38742e8c7557010819ab082 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 17 Apr 2025 12:01:41 +0200 Subject: [PATCH 1/5] Update window widget --- .../mih_package_components/mih_app_tile.dart | 10 +- .../mih_app_window.dart | 212 +++++++---------- .../mih_floating_menu.dart | 3 + .../test/package_test.dart | 144 +----------- .../test/package_tools/package_tool_one.dart | 157 ++++++++++--- .../test/package_tools/package_tool_two.dart | 57 +++++ .../mzansi_ai/package_tools/ai_chat.dart | 217 +++++++++--------- 7 files changed, 388 insertions(+), 412 deletions(-) create mode 100644 Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_two.dart diff --git a/Frontend/lib/mih_components/mih_package_components/mih_app_tile.dart b/Frontend/lib/mih_components/mih_package_components/mih_app_tile.dart index 0651c6de..f2f0bd55 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_app_tile.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_app_tile.dart @@ -35,15 +35,13 @@ class _MihAppTileState extends State { return MihAppWindow( fullscreen: false, windowTitle: widget.appName, - windowTools: const [], + // windowTools: const [], onWindowTapClose: () { Navigator.pop(context); }, - windowBody: [ - MIHYTVideoPlayer( - videoYTLink: widget.ytVideoID!, - ), - ], + windowBody: MIHYTVideoPlayer( + videoYTLink: widget.ytVideoID!, + ), ); }, ); diff --git a/Frontend/lib/mih_components/mih_package_components/mih_app_window.dart b/Frontend/lib/mih_components/mih_package_components/mih_app_window.dart index da0aa305..5359c397 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_app_window.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_app_window.dart @@ -1,17 +1,19 @@ import 'package:flutter/material.dart'; -import '../../main.dart'; +import 'package:mzansi_innovation_hub/main.dart'; class MihAppWindow extends StatefulWidget { final String windowTitle; - final List windowBody; - final List windowTools; + final Widget windowBody; + final Widget? windowTools; + // final List menuOptions; final void Function() onWindowTapClose; final bool fullscreen; const MihAppWindow({ super.key, required this.fullscreen, required this.windowTitle, - required this.windowTools, + this.windowTools, + // required this.menuOptions, required this.onWindowTapClose, required this.windowBody, }); @@ -51,139 +53,45 @@ class _MihAppWindowState extends State { } } - Widget getWidnowClose() { + Widget getWindowHeader() { return Container( - alignment: Alignment.centerRight, - child: IconButton( - onPressed: widget.onWindowTapClose, - icon: Icon( - Icons.close, - color: MzanziInnovationHub.of(context)!.theme.errorColor(), - size: 35, - ), - ), - ); - } - - Widget getWidnowTools() { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: widget.windowTools, - ); - } - - Widget getWidnowTitle() { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: Text( - widget.windowTitle, - textAlign: TextAlign.center, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - fontSize: windowTitleSize, - fontWeight: FontWeight.bold, + // color: Colors.green, + alignment: Alignment.center, + height: 50, + child: Row( + children: [ + widget.windowTools != null ? widget.windowTools! : Container(), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 15), + // color: Colors.pink, + child: Text( + widget.windowTitle, + textAlign: TextAlign.left, + style: TextStyle( + fontSize: windowTitleSize, + fontWeight: FontWeight.bold, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), ), ), - ), - ], - ); - } - - Widget getWidnowHeader() { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - getWidnowTools(), - Expanded( - flex: 2, - child: getWidnowTitle(), - ), - getWidnowClose(), - ], - ); - } - - Widget getWidnowBody() { - if (widget.fullscreen) { - return Expanded( - child: Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: widget.windowBody, + Container( + // color: Colors.white, + alignment: Alignment.center, + child: IconButton( + iconSize: 35, + onPressed: () { + widget.onWindowTapClose(); + }, + icon: Icon( + Icons.close, + color: MzanziInnovationHub.of(context)!.theme.errorColor(), + ), + ), ), - ), - ); - } else { - return Padding( - padding: const EdgeInsets.all(10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: widget.windowBody, - ), - ); - } - } - - Widget createWindow(Widget header, Widget body) { - Widget visibleItems; - if (widget.fullscreen) { - visibleItems = Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - header, - //const Divider(), - body, ], - ); - } else { - visibleItems = SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - header, - //const Divider(), - body, - ], - ), - ); - } - return Dialog( - insetPadding: EdgeInsets.symmetric( - horizontal: horizontralWindowPadding, - vertical: vertticalWindowPadding, - ), - insetAnimationCurve: Easing.emphasizedDecelerate, - insetAnimationDuration: Durations.short1, - child: Container( - //padding: const EdgeInsets.all(10), - width: windowWidth, - //height: windowHeight, - decoration: BoxDecoration( - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - borderRadius: BorderRadius.circular(25.0), - border: Border.all( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - width: 5.0), - ), - child: visibleItems, ), ); } @@ -206,9 +114,43 @@ class _MihAppWindowState extends State { height = size.height; }); checkScreenSize(); - return createWindow( - getWidnowHeader(), - getWidnowBody(), + return Dialog( + insetPadding: EdgeInsets.symmetric( + horizontal: horizontralWindowPadding, + vertical: vertticalWindowPadding, + ), + insetAnimationCurve: Easing.emphasizedDecelerate, + insetAnimationDuration: Durations.short1, + child: Container( + decoration: BoxDecoration( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + borderRadius: BorderRadius.circular(25.0), + border: Border.all( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + width: 5.0), + ), + child: widget.fullscreen + ? Column( + mainAxisSize: MainAxisSize.max, + children: [ + getWindowHeader(), + Expanded(child: widget.windowBody), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + getWindowHeader(), + Padding( + padding: const EdgeInsets.only( + left: 15, + right: 15, + bottom: 15, + ), + child: widget.windowBody), + ], + ), + ), ); } } diff --git a/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart index eea4ff96..cbab49de 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart @@ -5,11 +5,13 @@ import 'package:mzansi_innovation_hub/main.dart'; class MihFloatingMenu extends StatefulWidget { final IconData? icon; final AnimatedIconData? animatedIcon; + final SpeedDialDirection? direction; final List children; const MihFloatingMenu({ super.key, this.icon, this.animatedIcon, + this.direction, required this.children, }); @@ -28,6 +30,7 @@ class _MihFloatingMenuState extends State { child: SpeedDial( icon: widget.icon, animatedIcon: widget.animatedIcon, + direction: widget.direction ?? SpeedDialDirection.up, activeIcon: Icons.close, backgroundColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart index 9069f807..a91025a1 100644 --- a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart +++ b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart @@ -1,14 +1,10 @@ -import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/test/package_tools/package_tool_one.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/test/package_tools/package_tool_two.dart'; import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; @@ -38,12 +34,12 @@ class _PackageTestState extends State { MihAppTools getTools() { Map temp = Map(); - temp[const Icon(Icons.arrow_back)] = () { + temp[const Icon(Icons.inbox)] = () { setState(() { _selcetedIndex = 0; }); }; - temp[const Icon(Icons.arrow_forward)] = () { + temp[const Icon(Icons.outbond)] = () { setState(() { _selcetedIndex = 1; }); @@ -113,134 +109,10 @@ class _PackageTestState extends State { ); } - void showFullScreenWindow() { - showDialog( - context: context, - builder: (context) { - return MihAppWindow( - fullscreen: true, - windowTitle: "Test", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - Text( - "Window test", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - fontSize: 15, - fontWeight: FontWeight.bold, - ), - ) - ], - ); - }, - ); - } - - void showNormalWindow() { - showDialog( - context: context, - builder: (context) { - return MihAppWindow( - fullscreen: false, - windowTitle: "Test", - windowTools: const [], - onWindowTapClose: () { - Navigator.pop(context); - }, - windowBody: [ - Text( - "Window test", - style: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - fontSize: 15, - fontWeight: FontWeight.bold, - ), - ) - ], - ); - }, - ); - } - - List getToolBody() { - List toolBodies = [ - MihAppToolBody( - borderOn: true, - bodyItem: MihSingleChildScroll( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Text( - "Hello", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - const SizedBox(height: 10), - MihFloatingMenu(children: [ - SpeedDialChild( - child: Icon( - Icons.add, - color: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - label: "Add", - labelBackgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - labelStyle: TextStyle( - color: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - backgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onTap: () {}, - ) - ]), - Container( - color: Colors.black, - width: 200, - height: 200, - padding: EdgeInsets.zero, - alignment: Alignment.center, - child: IconButton.filled( - onPressed: () {}, - icon: Icon( - MihIcons.mihLogo, - color: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - ) - ], - ), - ), - ), - MihAppToolBody( - borderOn: false, - bodyItem: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Text( - "World!!!", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - ), - ], - ), - ), + List getToolBody() { + List toolBodies = [ + const PackageToolOne(), + const PackageToolTwo(), ]; return toolBodies; } diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart index 73b857c1..bcaea3fb 100644 --- a/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart +++ b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart @@ -1,7 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; class PackageToolOne extends StatefulWidget { @@ -12,6 +15,40 @@ class PackageToolOne extends StatefulWidget { } class _PackageToolOneState extends State { + void showTestFullWindow() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return MihAppWindow( + fullscreen: true, + windowTitle: "Test Full", + onWindowTapClose: () { + Navigator.of(context).pop(); + }, + windowBody: Text("Testing Window Body"), + ); + }, + ); + } + + void showTestWindow() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return MihAppWindow( + fullscreen: false, + windowTitle: "Test No Full", + onWindowTapClose: () { + Navigator.of(context).pop(); + }, + windowBody: Text("Testing Window Body"), + ); + }, + ); + } + @override Widget build(BuildContext context) { return MihAppToolBody( @@ -21,40 +58,98 @@ class _PackageToolOneState extends State { } Widget getBody() { - return MihAppToolBody( - borderOn: true, - bodyItem: MihSingleChildScroll( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Text( - "Hello", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + return Stack( + children: [ + MihSingleChildScroll( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Hello", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], ), - ), - const SizedBox(height: 10), - Container( - color: Colors.black, - width: 200, - height: 200, - padding: EdgeInsets.zero, - alignment: Alignment.center, - child: IconButton.filled( - onPressed: () {}, - icon: Icon( - MihIcons.mihLogo, - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + const SizedBox(height: 10), + Container( + color: Colors.black, + width: 200, + height: 200, + padding: EdgeInsets.zero, + alignment: Alignment.center, + child: IconButton.filled( + onPressed: () {}, + icon: Icon( + MihIcons.mihLogo, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), ), - ), - ) - ], + ) + ], + ), ), - ), + Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Show New Window", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + showTestWindow(); + }, + ), + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Show New Full Window", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + showTestFullWindow(); + }, + ), + ]), + ) + ], ); } } diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_two.dart b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_two.dart new file mode 100644 index 00000000..593fb041 --- /dev/null +++ b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_two.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; + +class PackageToolTwo extends StatefulWidget { + const PackageToolTwo({super.key}); + + @override + State createState() => _PackageToolTwoState(); +} + +class _PackageToolTwoState extends State { + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: false, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return MihSingleChildScroll( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + "World", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + const SizedBox(height: 10), + Container( + color: Colors.black, + width: 200, + height: 200, + padding: EdgeInsets.zero, + alignment: Alignment.center, + child: IconButton.filled( + onPressed: () {}, + icon: Icon( + MihIcons.mihLogo, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ), + ) + ], + ), + ); + } +} 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 b8762cb1..9739fc44 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 @@ -126,132 +126,141 @@ class _AiChatState extends State { return MihAppWindow( fullscreen: false, windowTitle: 'Mzansi AI Thoughts', - windowTools: [ - Visibility( - visible: _aiThinking == false, - child: Padding( - padding: const EdgeInsets.all(5.0), - child: Container( - //color: MzanziInnovationHub.of(context)!.theme.successColor(), - decoration: BoxDecoration( - color: - MzanziInnovationHub.of(context)!.theme.successColor(), - borderRadius: const BorderRadius.all( - Radius.circular(100), + windowTools: Row( + children: [ + Visibility( + visible: _aiThinking == false, + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Container( + //color: MzanziInnovationHub.of(context)!.theme.successColor(), + decoration: BoxDecoration( + color: MzanziInnovationHub.of(context)! + .theme + .successColor(), + borderRadius: const BorderRadius.all( + Radius.circular(100), + ), ), - ), - child: IconButton( - color: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPressed: () async { - print("Start TTS now"); + child: IconButton( + color: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + onPressed: () async { + print("Start TTS now"); - _speakText(snapshot.requireData); - }, - icon: const Icon(Icons.volume_up), - ), - ), - ), - ), - Visibility( - visible: _aiThinking == true, - child: Padding( - padding: const EdgeInsets.all(5.0), - child: Container( - // color: MzanziInnovationHub.of(context)!.theme.errorColor(), - decoration: BoxDecoration( - color: - MzanziInnovationHub.of(context)!.theme.errorColor(), - borderRadius: const BorderRadius.all( - Radius.circular(100), + _speakText(snapshot.requireData); + }, + icon: const Icon(Icons.volume_up), ), ), - child: IconButton( - color: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPressed: () { - //print("Start TTS now"); - _flutterTts.stop(); - }, - icon: const Icon(Icons.volume_off), + ), + ), + Visibility( + visible: _aiThinking == true, + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Container( + // color: MzanziInnovationHub.of(context)!.theme.errorColor(), + decoration: BoxDecoration( + color: + MzanziInnovationHub.of(context)!.theme.errorColor(), + borderRadius: const BorderRadius.all( + Radius.circular(100), + ), + ), + child: IconButton( + color: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + onPressed: () { + //print("Start TTS now"); + _flutterTts.stop(); + }, + icon: const Icon(Icons.volume_off), + ), ), ), ), - ), - ], + ], + ), onWindowTapClose: () { _captureAIResponse(snapshot.requireData); _flutterTts.stop(); Navigator.of(context).pop(); }, - windowBody: [ - Stack( - children: [ - Text( - snapshot.requireData, - textAlign: TextAlign.left, - style: TextStyle( - color: MzanziInnovationHub.of(context)! - .theme - .secondaryColor(), - fontSize: _chatFrontSize, - fontWeight: FontWeight.bold, - ), - ), - Positioned( - bottom: 0, - right: 0, - child: Visibility( - visible: _aiThinking == false, - child: IconButton.filled( - iconSize: 25, - autofocus: true, - onPressed: () { - _captureAIResponse(snapshot.requireData); - _flutterTts.stop(); - Navigator.of(context).pop(); - }, - focusColor: MzanziInnovationHub.of(context)! - .theme - .successColor(), - icon: Icon( - Icons.check, - color: MzanziInnovationHub.of(context)! - .theme - .primaryColor(), + windowBody: Column( + children: [ + Stack( + children: [ + Column( + children: [ + Text( + snapshot.requireData, + textAlign: TextAlign.left, + style: TextStyle( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + fontSize: _chatFrontSize, + fontWeight: FontWeight.bold, + ), ), - ), - - // MIHButton( - // onTap: () { - // _captureAIResponse(snapshot.requireData); - // Navigator.of(context).pop(); - // }, - // buttonText: "Continue", - // buttonColor: MzanziInnovationHub.of(context)! - // .theme - // .successColor(), - // textColor: MzanziInnovationHub.of(context)! - // .theme - // .primaryColor(), - // ), + ], ), - ), - ], - ), - ], + Positioned( + bottom: 0, + right: 0, + child: Visibility( + visible: _aiThinking == false, + child: IconButton.filled( + iconSize: 25, + autofocus: true, + onPressed: () { + _captureAIResponse(snapshot.requireData); + _flutterTts.stop(); + Navigator.of(context).pop(); + }, + focusColor: MzanziInnovationHub.of(context)! + .theme + .successColor(), + icon: Icon( + Icons.check, + color: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + + // MIHButton( + // onTap: () { + // _captureAIResponse(snapshot.requireData); + // Navigator.of(context).pop(); + // }, + // buttonText: "Continue", + // buttonColor: MzanziInnovationHub.of(context)! + // .theme + // .successColor(), + // textColor: MzanziInnovationHub.of(context)! + // .theme + // .primaryColor(), + // ), + ), + ), + ], + ), + ], + ), ); } else { return MihAppWindow( fullscreen: false, windowTitle: 'Mzansi AI Thoughts', - windowTools: [], + // windowTools: [], onWindowTapClose: () { Navigator.of(context).pop(); }, - windowBody: const [ - Mihloadingcircle(), - ], + windowBody: Mihloadingcircle(), ); } }, From 7739b63f365efe791d599fe34d57c6e200877f24 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 17 Apr 2025 12:41:01 +0200 Subject: [PATCH 2/5] add apis to add as favourite --- backend/routers/mzansi_wallet.py | 81 ++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/backend/routers/mzansi_wallet.py b/backend/routers/mzansi_wallet.py index e4ca2d8d..64551efe 100644 --- a/backend/routers/mzansi_wallet.py +++ b/backend/routers/mzansi_wallet.py @@ -17,7 +17,13 @@ class MzansiWalletInsertRequest(BaseModel): app_id: str shop_name: str card_number: str + favourite: str + priority_index: int +class MzansiWalletUpdateRequest(BaseModel): + idloyalty_cards: int + favourite: str + priority_index: int # class patientNoteUpdateRequest(BaseModel): # idpatient_notes: int # note_name: str @@ -39,6 +45,30 @@ async def read_all_loyalty_cards_by_app_id(app_id: str, session: SessionContaine "app_id": item[1], "shop_name": item[2], "card_number": item[3], + "favourite": item[4], + "priority_index": item[5], + } + for item in cursor.fetchall() + ] + cursor.close() + db.close() + return items + +# Get List of favourite loyalty cards by user +@router.get("/mzasni-wallet/loyalty-cards/favourites/{app_id}", tags=["Mzansi Wallet"]) +async def read_favourite_loyalty_cards_by_app_id(app_id: str, session: SessionContainer = Depends(verify_session())): # , session: SessionContainer = Depends(verify_session()) + db = database.dbConnection.dbMzansiWalletConnect() + cursor = db.cursor() + query = "SELECT * FROM loyalty_cards where app_id = %s and favourite != '' ORDER BY priority_index Asc" + cursor.execute(query, (app_id,)) + items = [ + { + "idloyalty_cards": item[0], + "app_id": item[1], + "shop_name": item[2], + "card_number": item[3], + "favourite": item[4], + "priority_index": item[5], } for item in cursor.fetchall() ] @@ -76,11 +106,13 @@ async def insert_loyalty_card(itemRequest : MzansiWalletInsertRequest): #, sessi db = database.dbConnection.dbMzansiWalletConnect() cursor = db.cursor() query = "insert into loyalty_cards " - query += "(app_id, shop_name, card_number) " - query += "values (%s, %s, %s)" + query += "(app_id, shop_name, card_number, favourite, priority_index) " + query += "values (%s, %s, %s, %s, %s)" notetData = (itemRequest.app_id, itemRequest.shop_name, itemRequest.card_number, + itemRequest.favourite, + itemRequest.priority_index, ) try: cursor.execute(query, notetData) @@ -113,26 +145,25 @@ async def Delete_loyalty_card(itemRequest : LoyaltyCardDeleteRequest, session: S db.close() return {"message": "Successfully deleted Record"} -# Update Patient note on table -# @router.put("/notes/update/", tags="patients_notes") -# async def UpdatePatient(itemRequest : patientNoteUpdateRequest, session: SessionContainer = Depends(verify_session())): -# today = date.today() -# db = database.dbConnection.dbPatientManagerConnect() -# cursor = db.cursor() -# query = "update patient_notes " -# query += "set note_name=%s, note_text=%s, patient_id=%s, insert_date=%s " -# query += "where idpatient_notes=%s" -# notetData = (itemRequest.note_name, -# itemRequest.note_text, -# itemRequest.patient_id, -# today, -# itemRequest.idpatient_notes) -# try: -# cursor.execute(query, notetData) -# except Exception as error: -# raise HTTPException(status_code=404, detail="Failed to Update Record") -# #return {"query": query, "message": error} -# db.commit() -# cursor.close() -# db.close() -# return {"message": "Successfully Updated Record"} \ No newline at end of file +# Update on table +@router.put("/mzasni-wallet/loyalty-cards/update/", tags=["Mzansi Wallet"]) +async def UpdatePatient(itemRequest : MzansiWalletUpdateRequest, session: SessionContainer = Depends(verify_session())): + today = date.today() + db = database.dbConnection.dbMzansiWalletConnect() + cursor = db.cursor() + query = "update loyalty_cards " + query += "set favourite=%s, priority_index=%s " + query += "where idloyalty_cards=%s" + notetData = (itemRequest.favourite, + itemRequest.priority_index, + itemRequest.idloyalty_cards, + ) + try: + cursor.execute(query, notetData) + except Exception as error: + raise HTTPException(status_code=404, detail="Failed to Update Record") + #return {"query": query, "message": error} + db.commit() + cursor.close() + db.close() + return {"message": "Successfully Updated Record"} \ No newline at end of file From 35e10df9271f93355dda9c12ec5e67995b7cd1e0 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 17 Apr 2025 13:08:10 +0200 Subject: [PATCH 3/5] Add Wallet Argument Object --- Frontend/lib/mih_objects/arguments.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Frontend/lib/mih_objects/arguments.dart b/Frontend/lib/mih_objects/arguments.dart index 9ede98d7..0f67f2c2 100644 --- a/Frontend/lib/mih_objects/arguments.dart +++ b/Frontend/lib/mih_objects/arguments.dart @@ -197,3 +197,13 @@ class PatManagerArguments { this.businessUser, ); } + +class WalletArguments { + final AppUser signedInUser; + final int index; + + WalletArguments( + this.signedInUser, + this.index, + ); +} From 5fcf8bed47b86a3c6e92d9e11c1d761a3d13c415 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 17 Apr 2025 13:08:36 +0200 Subject: [PATCH 4/5] use wallet argument obj as param --- .../mzansi_wallet/mih_wallet.dart | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart index 9709ccae..54f22baa 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -1,15 +1,18 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.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_packages/mzansi_wallet/package_tools/mih_card_favourites.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tools/mih_cards.dart'; import 'package:flutter/material.dart'; class MihWallet extends StatefulWidget { - final AppUser signedInUser; + final WalletArguments arguments; + // final AppUser signedInUser; const MihWallet({ super.key, - required this.signedInUser, + required this.arguments, + // required this.signedInUser, }); @override @@ -23,7 +26,7 @@ class _MihWalletState extends State { void initState() { super.initState(); setState(() { - _selcetedIndex = 0; + _selcetedIndex = widget.arguments.index; }); } @@ -56,11 +59,16 @@ class _MihWalletState extends State { MihAppTools getTools() { Map temp = {}; - temp[const Icon(Icons.card_membership)] = () { + temp[const Icon(Icons.favorite)] = () { setState(() { _selcetedIndex = 0; }); }; + temp[const Icon(Icons.card_membership)] = () { + setState(() { + _selcetedIndex = 1; + }); + }; return MihAppTools( tools: temp, @@ -70,8 +78,11 @@ class _MihWalletState extends State { List getToolBody() { List toolBodies = [ + MihCardFavourites( + signedInUser: widget.arguments.signedInUser, + ), MihCards( - signedInUser: widget.signedInUser, + signedInUser: widget.arguments.signedInUser, ), ]; return toolBodies; From 117e7dbb579162b1c2068af4b78d72e2a2fbf6b5 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 17 Apr 2025 13:09:12 +0200 Subject: [PATCH 5/5] add favourites tool --- .../lib/mih_apis/mih_mzansi_wallet_apis.dart | 92 +++++- Frontend/lib/mih_objects/loyalty_card.dart | 8 + .../builder/build_loyalty_card_list.dart | 286 ++++++++++++++---- .../package_tiles/mih_wallet_tile.dart | 3 +- .../package_tools/mih_card_favourites.dart | 124 ++++++++ .../package_tools/mih_cards.dart | 4 + Frontend/lib/mih_router/routeGenerator.dart | 4 +- 7 files changed, 454 insertions(+), 67 deletions(-) create mode 100644 Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart diff --git a/Frontend/lib/mih_apis/mih_mzansi_wallet_apis.dart b/Frontend/lib/mih_apis/mih_mzansi_wallet_apis.dart index 6f70dddd..9bf002bb 100644 --- a/Frontend/lib/mih_apis/mih_mzansi_wallet_apis.dart +++ b/Frontend/lib/mih_apis/mih_mzansi_wallet_apis.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.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/loyalty_card.dart'; import 'package:flutter/material.dart'; // import '../mih_components/mih_pop_up_messages/mih_error_message.dart'; @@ -40,7 +41,6 @@ class MIHMzansiWalletApis { // print("Code: ${response.statusCode}"); // errorCode = response.statusCode.toString(); // errorBody = response.body; - if (response.statusCode == 200) { //print("Here1"); Iterable l = jsonDecode(response.body); @@ -55,6 +55,36 @@ class MIHMzansiWalletApis { } } + /// This function is used to fetch a list of loyalty cards for a user. + /// + /// Patameters: app_id . + /// + /// Returns List. + static Future> getFavouriteLoyaltyCards( + String app_id, + ) async { + //print("Patien manager page: $endpoint"); + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/favourites/$app_id")); + // print("Here"); + // print("Body: ${response.body}"); + // print("Code: ${response.statusCode}"); + // errorCode = response.statusCode.toString(); + // errorBody = response.body; + if (response.statusCode == 200) { + // print("Here1"); + Iterable l = jsonDecode(response.body); + //print("Here2"); + List patientQueue = List.from( + l.map((model) => MIHLoyaltyCard.fromJson(model))); + //print("Here3"); + //print(patientQueue); + return patientQueue; + } else { + throw Exception('failed to fatch loyalty cards'); + } + } + /// This function is used to Delete loyalty card from users mzansi wallet. /// /// Patameters:- @@ -66,6 +96,7 @@ class MIHMzansiWalletApis { static Future deleteLoyaltyCardAPICall( AppUser signedInUser, int idloyalty_cards, + int navIndex, BuildContext context, ) async { loadingPopUp(context); @@ -83,14 +114,16 @@ class MIHMzansiWalletApis { Navigator.of(context).pop(); Navigator.of(context).pop(); Navigator.of(context).pop(); + Navigator.of(context).pop(); Navigator.of(context).pushNamed( '/mzansi-wallet', - arguments: signedInUser, + arguments: WalletArguments(signedInUser, navIndex), ); String message = "The loyalty card has been deleted successfully. This means it will no longer be visible in your Mzansi Wallet."; successPopUp(message, context); } else { + Navigator.pop(context); internetConnectionPopUp(context); } } @@ -110,6 +143,9 @@ class MIHMzansiWalletApis { String app_id, String shop_name, String card_number, + String favourite, + int priority_index, + int navIndex, BuildContext context, ) async { loadingPopUp(context); @@ -123,6 +159,8 @@ class MIHMzansiWalletApis { "app_id": app_id, "shop_name": shop_name, "card_number": card_number, + "favourite": favourite, + "priority_index": priority_index, }), ); if (response.statusCode == 201) { @@ -133,7 +171,7 @@ class MIHMzansiWalletApis { Navigator.pop(context); Navigator.of(context).pushNamed( '/mzansi-wallet', - arguments: signedInUser, + arguments: WalletArguments(signedInUser, navIndex), ); successPopUp(message, context); } else { @@ -142,6 +180,54 @@ class MIHMzansiWalletApis { } } + /// This function is used to Update loyalty card from users mzansi wallet. + /// + /// Patameters:- + /// AppUser signedInUser, + /// int idloyalty_cards, + /// BuildContext context, + /// + /// Returns VOID (TRIGGERS NOTIGICATIOPN ON SUCCESS) + static Future updateLoyaltyCardAPICall( + AppUser signedInUser, + int idloyalty_cards, + String favourite, + int priority_index, + int navIndex, + BuildContext context, + ) async { + loadingPopUp(context); + var response = await http.put( + Uri.parse( + "${AppEnviroment.baseApiUrl}/mzasni-wallet/loyalty-cards/update/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "idloyalty_cards": idloyalty_cards, + "favourite": favourite, + "priority_index": priority_index, + }), + ); + //print("Here4"); + //print(response.statusCode); + if (response.statusCode == 200) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed( + '/mzansi-wallet', + arguments: WalletArguments(signedInUser, navIndex), + ); + String message = "The loyalty card has been added to your favourites."; + successPopUp(message, context); + } else { + Navigator.pop(context); + internetConnectionPopUp(context); + } + } + //================== POP UPS ========================================================================== static void internetConnectionPopUp(BuildContext context) { diff --git a/Frontend/lib/mih_objects/loyalty_card.dart b/Frontend/lib/mih_objects/loyalty_card.dart index a5a137df..daa368e7 100644 --- a/Frontend/lib/mih_objects/loyalty_card.dart +++ b/Frontend/lib/mih_objects/loyalty_card.dart @@ -3,12 +3,16 @@ class MIHLoyaltyCard { final String app_id; final String shop_name; final String card_number; + final String favourite; + final int priority_index; const MIHLoyaltyCard({ required this.idloyalty_cards, required this.app_id, required this.shop_name, required this.card_number, + required this.favourite, + required this.priority_index, }); factory MIHLoyaltyCard.fromJson(Map json) { @@ -18,12 +22,16 @@ class MIHLoyaltyCard { "app_id": String app_id, "shop_name": String shop_name, "card_number": String card_number, + "favourite": String favourite, + "priority_index": int priority_index, } => MIHLoyaltyCard( idloyalty_cards: idloyalty_cards, app_id: app_id, shop_name: shop_name, card_number: card_number, + favourite: favourite, + priority_index: priority_index, ), _ => throw const FormatException('Failed to load loyalty card objects'), }; diff --git a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart index 294ba169..6640524a 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart @@ -1,6 +1,8 @@ import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_wallet_apis.dart'; -import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_alert.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_delete_message.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; @@ -13,10 +15,13 @@ import 'package:barcode_widget/barcode_widget.dart'; class BuildLoyaltyCardList extends StatefulWidget { final AppUser signedInUser; final List cardList; + final int navIndex; + const BuildLoyaltyCardList({ super.key, required this.signedInUser, required this.cardList, + required this.navIndex, }); @override @@ -24,6 +29,8 @@ class BuildLoyaltyCardList extends StatefulWidget { } class _BuildLoyaltyCardListState extends State { + late int _noFavourites; + void deleteCardWindow(BuildContext ctxt, int index) { showDialog( context: context, @@ -35,6 +42,7 @@ class _BuildLoyaltyCardListState extends State { MIHMzansiWalletApis.deleteLoyaltyCardAPICall( widget.signedInUser, widget.cardList[index].idloyalty_cards, + widget.navIndex, context, ); }); @@ -42,6 +50,114 @@ class _BuildLoyaltyCardListState extends State { ); } + void addToFavCardWindow(BuildContext ctxt, int index) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return MihAppAlert( + alertIcon: Icon( + Icons.favorite, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + size: 100, + ), + alertTitle: "Add to Favourites", + alertBody: Column( + children: [ + Text( + "Are you sure you want to add this card to your favourites?", + style: TextStyle( + fontSize: 20, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + const SizedBox( + height: 15, + ), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + MIHMzansiWalletApis.updateLoyaltyCardAPICall( + widget.signedInUser, + widget.cardList[index].idloyalty_cards, + "Yes", + _noFavourites, + 0, + ctxt, + ); + }, + buttonText: "Add", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ), + ], + ), + alertColour: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ); + }, + ); + } + + void removeFromFavCardWindow(BuildContext ctxt, int index) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return MihAppAlert( + alertIcon: Icon( + Icons.favorite_border, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + size: 100, + ), + alertTitle: "Remove From Favourites", + alertBody: Column( + children: [ + Text( + "Are you sure you want to remove this card from your favourites?", + style: TextStyle( + fontSize: 20, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + const SizedBox( + height: 15, + ), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + MIHMzansiWalletApis.updateLoyaltyCardAPICall( + widget.signedInUser, + widget.cardList[index].idloyalty_cards, + "", + 0, + 0, + ctxt, + ); + }, + buttonText: "Remove", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ), + ], + ), + alertColour: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ); + }, + ); + } + void viewCardWindow(int index) { //print(widget.cardList[index].card_number); String formattedCardNumber = ""; @@ -54,74 +170,104 @@ class _BuildLoyaltyCardListState extends State { showDialog( context: context, barrierDismissible: false, - builder: (context) => MIHWindow( + builder: (context) => MihAppWindow( fullscreen: false, windowTitle: widget.cardList[index].shop_name.toUpperCase(), - windowTools: [ - IconButton( - onPressed: () { - deleteCardWindow(context, index); - }, - icon: Icon( - Icons.delete, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + windowTools: Row( + children: [ + IconButton( + onPressed: () { + deleteCardWindow(context, index); + }, + icon: Icon( + Icons.delete, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), ), - ), - ], + Visibility( + visible: widget.cardList[index].favourite == "", + child: IconButton( + onPressed: () { + addToFavCardWindow(context, index); + }, + icon: Icon( + Icons.favorite, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + ), + Visibility( + visible: widget.cardList[index].favourite != "", + child: IconButton( + onPressed: () { + removeFromFavCardWindow(context, index); + }, + icon: Icon( + Icons.favorite_border, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + ), + ], + ), onWindowTapClose: () { Navigator.pop(context); }, - windowBody: [ - Container( - child: MihCardDisplay( - shopName: widget.cardList[index].shop_name, height: 250), - ), - const SizedBox(height: 20), - Container( - width: 500, - //color: Colors.white, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: Colors.white, + windowBody: Column( + children: [ + Container( + child: MihCardDisplay( + shopName: widget.cardList[index].shop_name, height: 250), ), - child: Column( - children: [ - // const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.all(10.0), - child: SizedBox( - height: 75, - width: 300, - child: BarcodeWidget( - //color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - barcode: Barcode.code128(), - backgroundColor: Colors.white, - data: widget.cardList[index].card_number, - drawText: false, - ), - // SfBarcodeGenerator( - // backgroundColor: Colors.white, - // barColor: Colors.black, - // value: widget.cardList[index].card_number, - // symbology: Code128(), - // //showValue: true, - // ), - ), - ), - // const SizedBox(height: 10), - Text( - formattedCardNumber, - style: const TextStyle( - color: Colors.black, - fontSize: 25, - fontWeight: FontWeight.bold - //MzanziInnovationHub.of(context)!.theme.secondaryColor(), + const SizedBox(height: 20), + Container( + width: 500, + //color: Colors.white, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white, + ), + child: Column( + children: [ + // const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.all(10.0), + child: SizedBox( + height: 75, + width: 300, + child: BarcodeWidget( + //color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + barcode: Barcode.code128(), + backgroundColor: Colors.white, + data: widget.cardList[index].card_number, + drawText: false, ), - ), - ], - ), - ) - ], + // SfBarcodeGenerator( + // backgroundColor: Colors.white, + // barColor: Colors.black, + // value: widget.cardList[index].card_number, + // symbology: Code128(), + // //showValue: true, + // ), + ), + ), + // const SizedBox(height: 10), + Text( + formattedCardNumber, + style: const TextStyle( + color: Colors.black, + fontSize: 25, + fontWeight: FontWeight.bold + //MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + ], + ), + ) + ], + ), ), ); } @@ -134,6 +280,24 @@ class _BuildLoyaltyCardListState extends State { } } + int countFavourites() { + int count = 0; + for (var card in widget.cardList) { + if (card.favourite != "") { + count++; + } + } + return count; + } + + @override + void initState() { + super.initState(); + setState(() { + _noFavourites = countFavourites(); + }); + } + @override Widget build(BuildContext context) { final Size size = MediaQuery.sizeOf(context); diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart index 3d34bf0b..2f764676 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart @@ -3,6 +3,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; class MihWalletTile extends StatefulWidget { final AppUser signedInUser; @@ -25,7 +26,7 @@ class _MihWalletTileState extends State { onTap: () { Navigator.of(context).pushNamed( '/mzansi-wallet', - arguments: widget.signedInUser, + arguments: WalletArguments(widget.signedInUser, 0), ); }, appName: "Mzansi Wallet", diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart new file mode 100644 index 00000000..483ae255 --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_card_favourites.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_wallet_apis.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; +import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart'; +import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart'; + +class MihCardFavourites extends StatefulWidget { + final AppUser signedInUser; + const MihCardFavourites({ + super.key, + required this.signedInUser, + }); + + @override + State createState() => _MihCardFavouritesState(); +} + +class _MihCardFavouritesState extends State { + late Future> cardList; + List listOfCards = []; + + @override + void initState() { + super.initState(); + cardList = MIHMzansiWalletApis.getFavouriteLoyaltyCards( + widget.signedInUser.app_id, + ); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return Stack( + children: [ + MihSingleChildScroll( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Favourites", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ), + Divider( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + FutureBuilder( + future: cardList, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + listOfCards = snapshot.data!; + // searchShop(); + return BuildLoyaltyCardList( + cardList: listOfCards, + signedInUser: widget.signedInUser, + navIndex: 0, + ); + } else { + return const Center( + child: Text("Error Loading Loyalty Cards"), + ); + } + }, + ), + ], + ), + ), + // Positioned( + // right: 0, + // bottom: 0, + // child: MihFloatingMenu( + // animatedIcon: AnimatedIcons.menu_close, + // children: [ + // SpeedDialChild( + // child: Icon( + // Icons.add, + // color: + // MzanziInnovationHub.of(context)!.theme.primaryColor(), + // ), + // label: "Add Loyalty Card", + // labelBackgroundColor: + // MzanziInnovationHub.of(context)!.theme.successColor(), + // labelStyle: TextStyle( + // color: + // MzanziInnovationHub.of(context)!.theme.primaryColor(), + // fontWeight: FontWeight.bold, + // ), + // backgroundColor: + // MzanziInnovationHub.of(context)!.theme.successColor(), + // onTap: () { + // // addCardWindow(context); + // }, + // ) + // ]), + // ) + ], + ); + } +} diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart index 5e0a7c1b..fe9de9ea 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart @@ -201,6 +201,9 @@ class _MihCardsState extends State { widget.signedInUser.app_id, shopController.text, cardNumberController.text, + "", + 0, + 1, context, ); } @@ -314,6 +317,7 @@ class _MihCardsState extends State { return BuildLoyaltyCardList( cardList: searchShopName.value, signedInUser: widget.signedInUser, + navIndex: 1, ); }, ); diff --git a/Frontend/lib/mih_router/routeGenerator.dart b/Frontend/lib/mih_router/routeGenerator.dart index 95fb7df6..5a687d3e 100644 --- a/Frontend/lib/mih_router/routeGenerator.dart +++ b/Frontend/lib/mih_router/routeGenerator.dart @@ -188,12 +188,12 @@ class RouteGenerator { // /mzansi wallet case '/mzansi-wallet': - if (args is AppUser) { + if (args is WalletArguments) { //print("route generator: $args"); return MaterialPageRoute( settings: settings, builder: (_) => MihWallet( - signedInUser: args, + arguments: args, ), // MzansiWallet( // signedInUser: args,