From 7c446e772ff932c058fe0db568416360c7848132 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 11:01:40 +0200 Subject: [PATCH 1/7] move to componewnt folder --- .../mzansi_wallet/{ => components}/mih_barcode_scanner.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Frontend/lib/mih_packages/mzansi_wallet/{ => components}/mih_barcode_scanner.dart (100%) diff --git a/Frontend/lib/mih_packages/mzansi_wallet/mih_barcode_scanner.dart b/Frontend/lib/mih_packages/mzansi_wallet/components/mih_barcode_scanner.dart similarity index 100% rename from Frontend/lib/mih_packages/mzansi_wallet/mih_barcode_scanner.dart rename to Frontend/lib/mih_packages/mzansi_wallet/components/mih_barcode_scanner.dart From bdff05c99250ae45ddf30d1897d8b4c0e6ed2cdb Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 11:01:53 +0200 Subject: [PATCH 2/7] delete old version of wallet --- .../mzansi_wallet/loyalty_cards.dart | 358 ------------------ .../mzansi_wallet/mzansi_wallet.dart | 179 --------- 2 files changed, 537 deletions(-) delete mode 100644 Frontend/lib/mih_packages/mzansi_wallet/loyalty_cards.dart delete mode 100644 Frontend/lib/mih_packages/mzansi_wallet/mzansi_wallet.dart diff --git a/Frontend/lib/mih_packages/mzansi_wallet/loyalty_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/loyalty_cards.dart deleted file mode 100644 index 072f6b96..00000000 --- a/Frontend/lib/mih_packages/mzansi_wallet/loyalty_cards.dart +++ /dev/null @@ -1,358 +0,0 @@ -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_inputs_and_buttons/mih_button.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_number_input.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_search_input.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.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'; -import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/components/mih_card_display.dart'; -import 'package:flutter/material.dart'; -import 'package:mobile_scanner/mobile_scanner.dart'; - -class LoyaltyCards extends StatefulWidget { - final AppUser signedInUser; - const LoyaltyCards({ - super.key, - required this.signedInUser, - }); - - @override - State createState() => _LoyaltyCardsState(); -} - -class _LoyaltyCardsState extends State { - final TextEditingController shopController = TextEditingController(); - final TextEditingController cardNumberController = TextEditingController(); - final TextEditingController cardSearchController = TextEditingController(); - late Future> cardList; - List listOfCards = []; - //bool showSelectedCardType = false; - final ValueNotifier shopName = ValueNotifier(""); - final ValueNotifier> searchShopName = ValueNotifier([]); - - final MobileScannerController scannerController = MobileScannerController( - detectionSpeed: DetectionSpeed.unrestricted, - ); - final boxFit = BoxFit.contain; - - void foundCode(BarcodeCapture bcode) { - if (bcode.barcodes.first.rawValue != null) { - setState(() { - cardNumberController.text = bcode.barcodes.first.rawValue!; - }); - //print(bcode.barcodes.first.rawValue); - scannerController.stop(); - Navigator.of(context).pop(); - } - } - - void openscanner() async { - // if (MzanziInnovationHub.of(context)!.theme.getPlatform() == "Web") { - // print("================ Web ===================="); - // print("here 1"); - // try { - // String? res = await SimpleBarcodeScanner.scanBarcode( - // context, - // barcodeAppBar: const BarcodeAppBar( - // appBarTitle: 'Scan Barcode', - // centerTitle: true, - // enableBackButton: true, - // backButtonIcon: Icon(Icons.arrow_back), - // ), - // isShowFlashIcon: true, - // delayMillis: 500, - // cameraFace: CameraFace.back, - // scanFormat: ScanFormat.ONLY_BARCODE, - // ); - // if (res != null) { - // setState(() { - // cardNumberController.text = res; - // }); - // } - // } catch (error) { - // print(error); - // } - // } else { - Navigator.of(context).pushNamed( - '/scanner', - arguments: cardNumberController, - ); - // } - } - - void addCardWindow(BuildContext ctxt) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => MIHWindow( - fullscreen: false, - windowTitle: "Add New Loyalty Card", - windowTools: const [ - SizedBox(width: 35), - // IconButton( - // onPressed: () { - // //Delete card API Call - // }, - // icon: Icon( - // Icons.delete, - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - // ), - ], - onWindowTapClose: () { - shopController.clear(); - cardNumberController.clear(); - shopName.value = ""; - Navigator.pop(context); - }, - windowBody: [ - MIHDropdownField( - controller: shopController, - hintText: "Shop Name", - dropdownOptions: const [ - "Best Before", - "Checkers", - "Clicks", - "Cotton:On", - "Dis-Chem", - "Edgars", - "Eskom", - "Fresh Stop", - "Infinity", - "Jet", - "Makro", - "Panarottis", - "Pick n Pay", - "Shell", - "Shoprite", - "Spar", - "Spur", - "Woolworths" - ], - required: true, - editable: true, - enableSearch: false, - ), - ValueListenableBuilder( - valueListenable: shopName, - builder: (BuildContext context, String value, Widget? child) { - return Visibility( - visible: value != "", - child: Column( - children: [ - const SizedBox(height: 10), - MihCardDisplay(shopName: shopName.value, height: 200), - ], - ), - ); - }, - ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - Flexible( - child: MIHNumberField( - controller: cardNumberController, - hintText: "Card Number", - editable: true, - required: true, - enableDecimal: false, - ), - ), - const SizedBox(width: 10), - MIHButton( - onTap: () async { - openscanner(); - }, - buttonText: "Scan", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ], - ), - const SizedBox(height: 15), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - if (shopController.text == "" || - cardNumberController.text == "") { - showDialog( - context: context, - builder: (context) { - return const MIHErrorMessage(errorType: "Input Error"); - }, - ); - } else { - MIHMzansiWalletApis.addLoyaltyCardAPICall( - widget.signedInUser, - widget.signedInUser.app_id, - shopController.text, - cardNumberController.text, - context, - ); - } - }, - buttonText: "Add", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - ], - ), - ); - } - - void shopSelected() { - if (shopController.text.isNotEmpty) { - shopName.value = shopController.text; - } else { - shopName.value = ""; - } - } - - void searchShop() { - if (cardSearchController.text.isEmpty) { - searchShopName.value = listOfCards; - } else { - List temp = []; - for (var item in listOfCards) { - if (item.shop_name - .toLowerCase() - .contains(cardSearchController.text.toLowerCase())) { - temp.add(item); - } - } - searchShopName.value = temp; - } - } - - @override - void dispose() { - cardNumberController.dispose(); - - shopController.removeListener(shopSelected); - shopController.dispose(); - cardSearchController.removeListener(searchShop); - cardSearchController.dispose(); - searchShopName.dispose(); - shopName.dispose(); - super.dispose(); - } - - @override - void initState() { - cardList = MIHMzansiWalletApis.getLoyaltyCards(widget.signedInUser.app_id); - shopController.addListener(shopSelected); - cardSearchController.addListener(searchShop); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: cardList, - builder: (context, snapshot) { - //print(snapshot.connectionState); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - listOfCards = snapshot.data!; - searchShop(); - //print(listOfCards); - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Loyalty Cards", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)! - .theme - .secondaryColor(), - ), - ), - IconButton( - icon: const Icon(Icons.add_card), - alignment: Alignment.topRight, - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onPressed: () { - addCardWindow(context); - }, - ) - ], - ), - // Divider( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Flexible( - flex: 4, - child: SizedBox( - height: 50, - child: MIHSearchField( - controller: cardSearchController, - hintText: "Shop Name", - required: false, - editable: true, - onTap: () {}, - ), - ), - ), - Flexible( - flex: 1, - child: IconButton( - onPressed: () { - FocusScope.of(context).unfocus(); - cardSearchController.clear(); - }, - icon: const Icon(Icons.filter_alt_off), - ), - ), - ], - ), - const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchShopName, - builder: (BuildContext context, List value, - Widget? child) { - return BuildLoyaltyCardList( - cardList: searchShopName.value, - signedInUser: widget.signedInUser, - ); - }, - ), - ], - ); - } else { - return const Center( - child: Text("Error Loading Loyalty Cards"), - ); - } - }, - ); - } -} diff --git a/Frontend/lib/mih_packages/mzansi_wallet/mzansi_wallet.dart b/Frontend/lib/mih_packages/mzansi_wallet/mzansi_wallet.dart deleted file mode 100644 index f8cc7dc1..00000000 --- a/Frontend/lib/mih_packages/mzansi_wallet/mzansi_wallet.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_action.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_body.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_header.dart'; -import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_layout_builder.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/loyalty_cards.dart'; -import 'package:flutter/material.dart'; - -class MzansiWallet extends StatefulWidget { - final AppUser signedInUser; - const MzansiWallet({ - super.key, - required this.signedInUser, - }); - - @override - State createState() => _MzansiWalletState(); -} - -class _MzansiWalletState extends State { - int _selectedIndex = 0; - - MIHAction getActionButton() { - return MIHAction( - icon: const Icon(Icons.arrow_back), - iconSize: 35, - onTap: () { - Navigator.of(context).pop(); - Navigator.of(context).popAndPushNamed( - '/', - arguments: AuthArguments(true, false), - ); - }, - ); - } - - MIHHeader getHeader() { - return const MIHHeader( - headerAlignment: MainAxisAlignment.center, - headerItems: [ - Text( - "", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25, - ), - ), - ], - ); - } - - MIHHeader getSecAction() { - return MIHHeader( - headerAlignment: MainAxisAlignment.end, - headerItems: [ - //============ Patient Details ================ - Visibility( - visible: _selectedIndex != 0, - child: IconButton( - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.card_membership, - size: 35, - ), - ), - ), - Visibility( - visible: _selectedIndex == 0, - child: IconButton.filled( - iconSize: 35, - onPressed: () { - setState(() { - _selectedIndex = 0; - }); - }, - icon: const Icon( - Icons.card_membership, - ), - ), - ), - //============ Patient Notes ================ - // Visibility( - // visible: _selectedIndex != 1, - // child: IconButton( - // onPressed: () { - // setState(() { - // _selectedIndex = 1; - // }); - // }, - // icon: const Icon( - // Icons.article_outlined, - // size: 35, - // ), - // ), - // ), - // Visibility( - // visible: _selectedIndex == 1, - // child: IconButton.filled( - // onPressed: () { - // setState(() { - // _selectedIndex = 1; - // }); - // }, - // icon: const Icon( - // Icons.article_outlined, - // size: 35, - // ), - // ), - // ), - // //============ Patient Files ================ - // Visibility( - // visible: _selectedIndex != 2, - // child: IconButton( - // onPressed: () { - // setState(() { - // _selectedIndex = 2; - // }); - // }, - // icon: const Icon( - // Icons.file_present, - // size: 35, - // ), - // ), - // ), - // Visibility( - // visible: _selectedIndex == 2, - // child: IconButton.filled( - // onPressed: () { - // setState(() { - // _selectedIndex = 2; - // }); - // }, - // icon: const Icon( - // Icons.file_present, - // size: 35, - // ), - // ), - // ), - ], - ); - } - - MIHBody getBody() { - return MIHBody( - borderOn: true, - bodyItems: [showSelection(_selectedIndex)], - ); - } - - Widget showSelection(int index) { - if (index == 0) { - return LoyaltyCards(signedInUser: widget.signedInUser); - } else if (index == 1) { - return const Placeholder(); - } else { - return const Placeholder(); - } - } - - @override - Widget build(BuildContext context) { - return MIHLayoutBuilder( - actionButton: getActionButton(), - header: getHeader(), - secondaryActionButton: getSecAction(), - body: getBody(), - actionDrawer: null, - secondaryActionDrawer: null, - bottomNavBar: null, - pullDownToRefresh: false, - onPullDown: () async {}, - ); - } -} From 3c223947ab8e2523dcbd2a4fc9e298f2af5b34e3 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 11:02:10 +0200 Subject: [PATCH 3/7] update route to new wallet --- Frontend/lib/mih_router/routeGenerator.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Frontend/lib/mih_router/routeGenerator.dart b/Frontend/lib/mih_router/routeGenerator.dart index 60d064b1..ef613938 100644 --- a/Frontend/lib/mih_router/routeGenerator.dart +++ b/Frontend/lib/mih_router/routeGenerator.dart @@ -5,8 +5,8 @@ import 'package:Mzansi_Innovation_Hub/mih_packages/about_mih/mih_policy_tos_ext/ import 'package:Mzansi_Innovation_Hub/mih_packages/calendar/mzansi_calendar.dart'; import 'package:Mzansi_Innovation_Hub/mih_packages/calculator/mih_calculator.dart'; import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_ai/mzansi_ai.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/mih_barcode_scanner.dart'; -import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/mzansi_wallet.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/components/mih_barcode_scanner.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/mih_wallet.dart'; import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_manager/pat_manager.dart'; import 'package:flutter/material.dart'; import '../mih_components/mih_layout/mih_print_prevew.dart'; @@ -202,9 +202,12 @@ class RouteGenerator { //print("route generator: $args"); return MaterialPageRoute( settings: settings, - builder: (_) => MzansiWallet( + builder: (_) => MihWallet( signedInUser: args, ), + // MzansiWallet( + // signedInUser: args, + // ), ); } return _errorRoute(); From 6ba5bd18b4013217e06f0f41bab99eb356eb0c52 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 11:02:25 +0200 Subject: [PATCH 4/7] use MIH App Widget --- .../mzansi_wallet/app_tools/mih_cards.dart | 327 ++++++++++++++++++ .../mzansi_wallet/mih_wallet.dart | 78 +++++ 2 files changed, 405 insertions(+) create mode 100644 Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart create mode 100644 Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart diff --git a/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart new file mode 100644 index 00000000..6393efcc --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart @@ -0,0 +1,327 @@ +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_inputs_and_buttons/mih_button.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_number_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_search_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_error_message.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'; +import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/components/mih_card_display.dart'; +import 'package:flutter/material.dart'; +import 'package:mobile_scanner/mobile_scanner.dart'; + +class MihCards extends StatefulWidget { + final AppUser signedInUser; + const MihCards({ + super.key, + required this.signedInUser, + }); + + @override + State createState() => _MihCardsState(); +} + +class _MihCardsState extends State { + final TextEditingController shopController = TextEditingController(); + final TextEditingController cardNumberController = TextEditingController(); + final TextEditingController cardSearchController = TextEditingController(); + late Future> cardList; + List listOfCards = []; + //bool showSelectedCardType = false; + final ValueNotifier shopName = ValueNotifier(""); + final ValueNotifier> searchShopName = ValueNotifier([]); + + final MobileScannerController scannerController = MobileScannerController( + detectionSpeed: DetectionSpeed.unrestricted, + ); + final boxFit = BoxFit.contain; + + void searchShop() { + if (cardSearchController.text.isEmpty) { + searchShopName.value = listOfCards; + } else { + List temp = []; + for (var item in listOfCards) { + if (item.shop_name + .toLowerCase() + .contains(cardSearchController.text.toLowerCase())) { + temp.add(item); + } + } + searchShopName.value = temp; + } + } + + void openscanner() async { + Navigator.of(context).pushNamed( + '/scanner', + arguments: cardNumberController, + ); + } + + void shopSelected() { + if (shopController.text.isNotEmpty) { + shopName.value = shopController.text; + } else { + shopName.value = ""; + } + } + + void addCardWindow(BuildContext ctxt) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Add New Loyalty Card", + windowTools: const [ + SizedBox(width: 35), + // IconButton( + // onPressed: () { + // //Delete card API Call + // }, + // icon: Icon( + // Icons.delete, + // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + // ), + // ), + ], + onWindowTapClose: () { + shopController.clear(); + cardNumberController.clear(); + shopName.value = ""; + Navigator.pop(context); + }, + windowBody: [ + MIHDropdownField( + controller: shopController, + hintText: "Shop Name", + dropdownOptions: const [ + "Best Before", + "Checkers", + "Clicks", + "Cotton:On", + "Dis-Chem", + "Edgars", + "Eskom", + "Fresh Stop", + "Infinity", + "Jet", + "Makro", + "Panarottis", + "Pick n Pay", + "Shell", + "Shoprite", + "Spar", + "Spur", + "Woolworths" + ], + required: true, + editable: true, + enableSearch: false, + ), + ValueListenableBuilder( + valueListenable: shopName, + builder: (BuildContext context, String value, Widget? child) { + return Visibility( + visible: value != "", + child: Column( + children: [ + const SizedBox(height: 10), + MihCardDisplay(shopName: shopName.value, height: 200), + ], + ), + ); + }, + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Flexible( + child: MIHNumberField( + controller: cardNumberController, + hintText: "Card Number", + editable: true, + required: true, + enableDecimal: false, + ), + ), + const SizedBox(width: 10), + MIHButton( + onTap: () async { + openscanner(); + }, + buttonText: "Scan", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ], + ), + const SizedBox(height: 15), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + if (shopController.text == "" || + cardNumberController.text == "") { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } else { + MIHMzansiWalletApis.addLoyaltyCardAPICall( + widget.signedInUser, + widget.signedInUser.app_id, + shopController.text, + cardNumberController.text, + context, + ); + } + }, + buttonText: "Add", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ), + ], + ), + ); + } + + @override + void dispose() { + cardNumberController.dispose(); + shopController.removeListener(shopSelected); + shopController.dispose(); + cardSearchController.removeListener(searchShop); + cardSearchController.dispose(); + searchShopName.dispose(); + shopName.dispose(); + super.dispose(); + } + + @override + void initState() { + cardList = MIHMzansiWalletApis.getLoyaltyCards(widget.signedInUser.app_id); + shopController.addListener(shopSelected); + cardSearchController.addListener(searchShop); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: bodyItem(), + ); + } + + Widget bodyItem() { + return FutureBuilder( + future: cardList, + builder: (context, snapshot) { + //print(snapshot.connectionState); + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + listOfCards = snapshot.data!; + searchShop(); + //print(listOfCards); + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Loyalty Cards", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + IconButton( + icon: const Icon(Icons.add_card), + alignment: Alignment.topRight, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onPressed: () { + addCardWindow(context); + }, + ) + ], + ), + // Divider( + // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + // ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Flexible( + flex: 4, + child: SizedBox( + height: 50, + child: MIHSearchField( + controller: cardSearchController, + hintText: "Shop Name", + required: false, + editable: true, + onTap: () {}, + ), + ), + ), + Flexible( + flex: 1, + child: IconButton( + onPressed: () { + FocusScope.of(context).unfocus(); + cardSearchController.clear(); + }, + icon: const Icon(Icons.filter_alt_off), + ), + ), + ], + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: searchShopName, + builder: (BuildContext context, List value, + Widget? child) { + return BuildLoyaltyCardList( + cardList: searchShopName.value, + signedInUser: widget.signedInUser, + ); + }, + ), + ], + ); + } else { + return const Center( + child: Text("Error Loading Loyalty Cards"), + ); + } + }, + ); + } +} diff --git a/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart new file mode 100644 index 00000000..cabd4380 --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_wallet/mih_wallet.dart @@ -0,0 +1,78 @@ +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app_action.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih_app_tools.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/mzansi_wallet/app_tools/mih_cards.dart'; +import 'package:flutter/material.dart'; + +class MihWallet extends StatefulWidget { + final AppUser signedInUser; + const MihWallet({ + super.key, + required this.signedInUser, + }); + + @override + State createState() => _MihWalletState(); +} + +class _MihWalletState extends State { + late int _selcetedIndex; + + @override + void initState() { + super.initState(); + setState(() { + _selcetedIndex = 0; + }); + } + + @override + Widget build(BuildContext context) { + return MihApp( + appActionButton: getAction(), + appTools: getTools(), + appBody: getToolBody(), + selectedbodyIndex: _selcetedIndex, + onIndexChange: (newValue) { + setState(() { + _selcetedIndex = newValue; + }); + print("Index: $_selcetedIndex"); + }, + ); + } + + MihAppAction getAction() { + return MihAppAction( + icon: const Icon(Icons.arrow_back), + iconSize: 35, + onTap: () { + Navigator.of(context).pop(); + }, + ); + } + + MihAppTools getTools() { + Map temp = {}; + temp[const Icon(Icons.card_membership)] = () { + setState(() { + _selcetedIndex = 0; + }); + }; + + return MihAppTools( + tools: temp, + selcetedIndex: _selcetedIndex, + ); + } + + List getToolBody() { + List toolBodies = [ + MihCards( + signedInUser: widget.signedInUser, + ), + ]; + return toolBodies; + } +} From 96c1604c55f0800a15cafb98183adbdbcbf4c268 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 13:05:57 +0200 Subject: [PATCH 5/7] fix overflow issue --- .../mzansi_wallet/app_tools/mih_cards.dart | 97 +++++++++++-------- .../builder/build_loyalty_card_list.dart | 71 ++++++++------ .../components/mih_card_display.dart | 95 ++++-------------- 3 files changed, 112 insertions(+), 151 deletions(-) diff --git a/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart index 6393efcc..c3a1c6be 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/app_tools/mih_cards.dart @@ -226,25 +226,15 @@ class _MihCardsState extends State { Widget build(BuildContext context) { return MihAppToolBody( borderOn: true, - bodyItem: bodyItem(), + bodyItem: getBody(), ); } - Widget bodyItem() { - return FutureBuilder( - future: cardList, - builder: (context, snapshot) { - //print(snapshot.connectionState); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - listOfCards = snapshot.data!; - searchShop(); - //print(listOfCards); - return Column( + Widget getBody() { + return Stack( + children: [ + SingleChildScrollView( + child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, @@ -260,20 +250,8 @@ class _MihCardsState extends State { .secondaryColor(), ), ), - IconButton( - icon: const Icon(Icons.add_card), - alignment: Alignment.topRight, - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onPressed: () { - addCardWindow(context); - }, - ) ], ), - // Divider( - // color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - // ), const SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -304,24 +282,57 @@ class _MihCardsState extends State { ], ), const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchShopName, - builder: (BuildContext context, List value, - Widget? child) { - return BuildLoyaltyCardList( - cardList: searchShopName.value, - signedInUser: widget.signedInUser, - ); + 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 ValueListenableBuilder( + valueListenable: searchShopName, + builder: (BuildContext context, + List value, Widget? child) { + return BuildLoyaltyCardList( + cardList: searchShopName.value, + signedInUser: widget.signedInUser, + ); + }, + ); + } else { + return const Center( + child: Text("Error Loading Loyalty Cards"), + ); + } }, ), ], - ); - } else { - return const Center( - child: Text("Error Loading Loyalty Cards"), - ); - } - }, + ), + ), + Positioned( + right: 0, + bottom: 0, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50), + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + child: IconButton( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPressed: () { + addCardWindow(context); + }, + icon: const Icon( + Icons.add_card, + size: 50, + ), + ), + )) + ], ); } } 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 bf61f6b1..2834c78b 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 @@ -143,32 +143,35 @@ class _BuildLoyaltyCardListState extends State { // final double width = size.width; //final double height = size.height; if (widget.cardList.isNotEmpty) { - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: EdgeInsets.only( - left: getHorizontalPaddingSize(size), - right: getHorizontalPaddingSize(size), - //bottom: height / 5, - //top: 20, + return SizedBox( + height: size.height, + child: GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.only( + left: getHorizontalPaddingSize(size), + right: getHorizontalPaddingSize(size), + //bottom: height / 5, + //top: 20, + ), + // physics: , + // shrinkWrap: true, + itemCount: widget.cardList.length, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + mainAxisSpacing: 0, + crossAxisSpacing: 10, + maxCrossAxisExtent: 200, + ), + itemBuilder: (context, index) { + return GestureDetector( + child: MihCardDisplay( + shopName: widget.cardList[index].shop_name, height: 100), + onTap: () { + viewCardWindow(index); + }, + ); + }, ), - // physics: , - // shrinkWrap: true, - itemCount: widget.cardList.length, - gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - mainAxisSpacing: 0, - crossAxisSpacing: 10, - maxCrossAxisExtent: 175, - ), - itemBuilder: (context, index) { - return GestureDetector( - child: MihCardDisplay( - shopName: widget.cardList[index].shop_name, height: 100), - onTap: () { - viewCardWindow(index); - }, - ); - }, ); // return ListView.separated( // shrinkWrap: true, @@ -191,13 +194,17 @@ class _BuildLoyaltyCardListState extends State { // }, // ); } else { - return const Padding( - padding: EdgeInsets.only(top: 25.0), - child: Center( - child: Text( - "No Cards Available", - style: TextStyle(fontSize: 25, color: Colors.grey), - textAlign: TextAlign.center, + return Padding( + padding: const EdgeInsets.only(top: 25.0), + child: SizedBox( + height: size.height, + child: const Align( + alignment: Alignment.topCenter, + child: Text( + "No Cards Available", + style: TextStyle(fontSize: 25, color: Colors.grey), + textAlign: TextAlign.center, + ), ), ), ); diff --git a/Frontend/lib/mih_packages/mzansi_wallet/components/mih_card_display.dart b/Frontend/lib/mih_packages/mzansi_wallet/components/mih_card_display.dart index a1014fc6..78c96447 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/components/mih_card_display.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/components/mih_card_display.dart @@ -17,100 +17,43 @@ class _MihCardDisplayState extends State { Widget displayLoyaltyCard() { switch (widget.shopName.toLowerCase()) { case "best before": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/best_before.png'), - ); + return Image.asset('images/loyalty_cards/best_before.png'); case "checkers": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/checkers.png'), - ); + return Image.asset('images/loyalty_cards/checkers.png'); case "clicks": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/Clicks_Club.png'), - ); + return Image.asset('images/loyalty_cards/Clicks_Club.png'); case "cotton:on": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/cotton_on_perks.png'), - ); + return Image.asset('images/loyalty_cards/cotton_on_perks.png'); case "dis-chem": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/dischem_benefit.png'), - ); + return Image.asset('images/loyalty_cards/dischem_benefit.png'); case "pick n pay": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/pnp_smart.png'), - ); + return Image.asset('images/loyalty_cards/pnp_smart.png'); case "shoprite": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/shoprite.png'), - ); + return Image.asset('images/loyalty_cards/shoprite.png'); case "spar": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/spar_rewards.png'), - ); + return Image.asset('images/loyalty_cards/spar_rewards.png'); case "woolworths": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/wrewards.png'), - ); + return Image.asset('images/loyalty_cards/wrewards.png'); case "makro": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/makro.png'), - ); + return Image.asset('images/loyalty_cards/makro.png'); case "fresh stop": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/fresh_stop.png'), - ); + return Image.asset('images/loyalty_cards/fresh_stop.png'); case "panarottis": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/panarottis.png'), - ); + return Image.asset('images/loyalty_cards/panarottis.png'); case "shell": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/Shell.png'), - ); + return Image.asset('images/loyalty_cards/Shell.png'); case "edgars": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/edgars.png'), - ); + return Image.asset('images/loyalty_cards/edgars.png'); case "jet": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/jet.png'), - ); + return Image.asset('images/loyalty_cards/jet.png'); case "spur": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/spur.png'), - ); + return Image.asset('images/loyalty_cards/spur.png'); case "infinity": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/infinity.png'), - ); + return Image.asset('images/loyalty_cards/infinity.png'); case "eskom": - return SizedBox( - height: widget.height, - child: Image.asset('images/loyalty_cards/eskom.png'), - ); + return Image.asset('images/loyalty_cards/eskom.png'); default: - return SizedBox( - height: widget.height, - child: const Placeholder(), - ); + return const Placeholder(); } } From f8a523ec88c10081a79ba5bd335d807566fc1089 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 13:25:23 +0200 Subject: [PATCH 6/7] fix card list cutoff --- .../mih_package/mih-app_tool_body.dart | 1 + .../builder/build_loyalty_card_list.dart | 53 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Frontend/lib/mih_components/mih_package/mih-app_tool_body.dart b/Frontend/lib/mih_components/mih_package/mih-app_tool_body.dart index d0f2da0c..2cb2a068 100644 --- a/Frontend/lib/mih_components/mih_package/mih-app_tool_body.dart +++ b/Frontend/lib/mih_components/mih_package/mih-app_tool_body.dart @@ -76,6 +76,7 @@ class _MihAppToolBodyState extends State { top: 0, ), child: Container( + height: screenSize.height, decoration: getBoader(), child: Padding( padding: EdgeInsets.all(_innerBodyPadding), 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 2834c78b..dd117511 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 @@ -143,35 +143,32 @@ class _BuildLoyaltyCardListState extends State { // final double width = size.width; //final double height = size.height; if (widget.cardList.isNotEmpty) { - return SizedBox( - height: size.height, - child: GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: EdgeInsets.only( - left: getHorizontalPaddingSize(size), - right: getHorizontalPaddingSize(size), - //bottom: height / 5, - //top: 20, - ), - // physics: , - // shrinkWrap: true, - itemCount: widget.cardList.length, - gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - mainAxisSpacing: 0, - crossAxisSpacing: 10, - maxCrossAxisExtent: 200, - ), - itemBuilder: (context, index) { - return GestureDetector( - child: MihCardDisplay( - shopName: widget.cardList[index].shop_name, height: 100), - onTap: () { - viewCardWindow(index); - }, - ); - }, + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.only( + left: getHorizontalPaddingSize(size), + right: getHorizontalPaddingSize(size), + //bottom: height / 5, + //top: 20, ), + // physics: , + // shrinkWrap: true, + itemCount: widget.cardList.length, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + mainAxisSpacing: 0, + crossAxisSpacing: 10, + maxCrossAxisExtent: 200, + ), + itemBuilder: (context, index) { + return GestureDetector( + child: MihCardDisplay( + shopName: widget.cardList[index].shop_name, height: 100), + onTap: () { + viewCardWindow(index); + }, + ); + }, ); // return ListView.separated( // shrinkWrap: true, From 388a8423036fe09d3405153eb4a7491f43ea859d Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 10 Mar 2025 13:33:26 +0200 Subject: [PATCH 7/7] fix display card overflow --- .../mzansi_wallet/builder/build_loyalty_card_list.dart | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) 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 dd117511..78b6cf1c 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 @@ -72,12 +72,9 @@ class _BuildLoyaltyCardListState extends State { Navigator.pop(context); }, windowBody: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - MihCardDisplay( - shopName: widget.cardList[index].shop_name, height: 250), - ], + Container( + child: MihCardDisplay( + shopName: widget.cardList[index].shop_name, height: 250), ), const SizedBox(height: 20), Container(