rename container folders

This commit is contained in:
2026-01-29 11:11:45 +02:00
parent d5349d981c
commit 5b052a1fa9
654 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,840 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.dart';
import 'package:ken_logger/ken_logger.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display.dart';
import 'package:flutter/material.dart';
import 'package:barcode_widget/barcode_widget.dart';
import 'package:provider/provider.dart';
import 'package:screen_brightness/screen_brightness.dart';
class BuildLoyaltyCardList extends StatefulWidget {
final List<MIHLoyaltyCard> cardList;
final int navIndex;
final bool favouritesMode;
final TextEditingController searchText;
const BuildLoyaltyCardList({
super.key,
required this.cardList,
required this.navIndex,
required this.favouritesMode,
required this.searchText,
});
@override
State<BuildLoyaltyCardList> createState() => _BuildLoyaltyCardListState();
}
class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
final TextEditingController _nicknameController = TextEditingController();
final TextEditingController _cardNumberController = TextEditingController();
late int _noFavourites;
double? _originalBrightness;
final _formKey = GlobalKey<FormState>();
void openscanner() async {
context.pushNamed(
"barcodeScanner",
extra: _cardNumberController,
);
}
void editCardWindow(
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
BuildContext ctxt,
int index,
double width) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => MihPackageWindow(
fullscreen: false,
windowTitle: "Edit Loyalty Card",
onWindowTapClose: () {
_cardNumberController.clear();
_nicknameController.clear();
Navigator.pop(context);
},
windowBody: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.05)
: EdgeInsets.symmetric(horizontal: width * 0),
child: Column(
children: [
MihForm(
formKey: _formKey,
formFields: [
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
controller: _nicknameController,
multiLineInput: false,
requiredText: false,
hintText: "Card Title",
),
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
Flexible(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _cardNumberController,
multiLineInput: false,
requiredText: true,
hintText: "Card Number",
numberMode: true,
validator: (value) {
return MihValidationServices().isEmpty(value);
},
),
),
const SizedBox(width: 20),
MihButton(
onPressed: () {
openscanner();
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 100,
child: Text(
"Scan",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 15),
Center(
child: MihButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
int statusCode = await MIHMzansiWalletApis
.updateLoyaltyCardAPICall(
walletProvider,
mzansiProfileProvider.user!,
widget.cardList[index].idloyalty_cards,
widget.cardList[index].shop_name,
widget.cardList[index].favourite,
widget.cardList[index].priority_index,
_nicknameController.text,
_cardNumberController.text,
ctxt,
);
if (statusCode == 200) {
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully updated the loyalty card details.",
context,
);
} else {
MihAlertServices().internetConnectionAlert(context);
}
} else {
MihAlertServices().inputErrorAlert(context);
}
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300,
child: Text(
"Update",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
],
),
),
),
);
}
void deleteCardWindow(MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider, BuildContext ctxt, int index) {
MihAlertServices().deleteConfirmationAlert(
"This Card will be deleted permanently from your Mzansi Wallet. Are you certain you want to delete it?",
() async {
int statusCode = await MIHMzansiWalletApis.deleteLoyaltyCardAPICall(
walletProvider,
mzansiProfileProvider.user!,
widget.cardList[index].idloyalty_cards,
context,
);
if (statusCode == 200) {
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully deleted the loyalty card from your Mzansi Wallet.",
context,
);
} else {
context.pop();
MihAlertServices().internetConnectionAlert(context);
}
},
context,
);
}
void addToFavCardWindow(MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider, BuildContext ctxt, int index) {
MihAlertServices().warningAdvancedAlert(
// "Card Added to Favourites",
"Add Card to Favourites?",
"Would you like to add this card to your favourites for quick access?",
// "You have successfully added the loyalty card to your favourites.",
[
MihButton(
onPressed: () async {
context.pop();
},
buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
int statusCode = await MIHMzansiWalletApis.updateLoyaltyCardAPICall(
walletProvider,
mzansiProfileProvider.user!,
widget.cardList[index].idloyalty_cards,
widget.cardList[index].shop_name,
"Yes",
_noFavourites,
widget.cardList[index].nickname,
widget.cardList[index].card_number,
ctxt,
);
if (statusCode == 200) {
context.pop();
context.pop();
await MIHMzansiWalletApis.getFavouriteLoyaltyCards(
walletProvider,
mzansiProfileProvider.user!.app_id,
context,
);
context.read<MzansiWalletProvider>().setToolIndex(1);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully added the loyalty card to your favourites.",
context,
);
} else {
MihAlertServices().internetConnectionAlert(context);
}
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Add",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
context,
);
}
void removeFromFavCardWindow(MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider, BuildContext ctxt, int index) {
MihAlertServices().warningAdvancedAlert(
"Remove From Favourites?",
"Are you sure you want to remove this card from your favourites?",
[
MihButton(
onPressed: () async {
int statusCode = await MIHMzansiWalletApis.updateLoyaltyCardAPICall(
walletProvider,
mzansiProfileProvider.user!,
widget.cardList[index].idloyalty_cards,
widget.cardList[index].shop_name,
"",
0,
widget.cardList[index].nickname,
widget.cardList[index].card_number,
ctxt,
);
if (statusCode == 200) {
context.pop();
context.pop();
await MIHMzansiWalletApis.getFavouriteLoyaltyCards(
walletProvider,
mzansiProfileProvider.user!.app_id,
context,
);
context.read<MzansiWalletProvider>().setToolIndex(0);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully removed the loyalty card to your favourites.",
context,
);
} else {
MihAlertServices().internetConnectionAlert(context);
}
},
buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Remove",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
ctxt,
);
}
void viewCardWindow(MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider, int index, double width) {
//print(widget.cardList[index].card_number);
String formattedCardNumber = "";
for (int i = 0; i <= widget.cardList[index].card_number.length - 1; i++) {
formattedCardNumber += widget.cardList[index].card_number[i];
if ((i + 1) % 4 == 0) {
formattedCardNumber += "\t";
}
}
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => MihPackageWindow(
fullscreen: false,
windowTitle: widget.cardList[index].shop_name.toUpperCase(),
menuOptions: [
SpeedDialChild(
child: widget.cardList[index].favourite == ""
? Icon(
Icons.favorite,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
)
: Icon(
Icons.favorite_border,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
label: widget.cardList[index].favourite == ""
? "Add to Favourite"
: "Remove from Favourite",
labelBackgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
labelStyle: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
if (widget.cardList[index].favourite == "") {
addToFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
} else {
removeFromFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
}
},
),
SpeedDialChild(
child: Icon(
Icons.edit,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
label: "Edit Card Details",
labelBackgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
labelStyle: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
setState(() {
_cardNumberController.text = widget.cardList[index].card_number;
_nicknameController.text = widget.cardList[index].nickname;
});
editCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
width,
);
},
),
SpeedDialChild(
child: Icon(
Icons.delete,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
label: "Delete Card",
labelBackgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
labelStyle: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onTap: () {
deleteCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
},
),
],
onWindowTapClose: () {
resetScreenBrightness();
context.pop();
},
windowBody: Column(
mainAxisSize: MainAxisSize.max,
children: [
Container(
width: 500,
child: MihCardDisplay(
shopName: widget.cardList[index].shop_name,
nickname: widget.cardList[index].nickname,
height: 250,
),
),
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: MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
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,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.bold
//MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
],
),
),
SizedBox(height: 10),
MihBannerAd()
// MihBannerAd(),
],
),
),
);
}
double getHorizontalPaddingSize(Size screenSize) {
if (MzansiInnovationHub.of(context)!.theme.screenType == "desktop") {
return screenSize.width / 10;
} else {
return 20;
}
}
int countFavourites() {
int count = 0;
for (var card in widget.cardList) {
if (card.favourite != "") {
count++;
}
}
return count;
}
Future<void> setScreenBrightness(double newBrightness) async {
if (!kIsWeb) {
bool canChange =
await ScreenBrightness.instance.canChangeSystemBrightness;
KenLogger.success("Can change system brightness: $canChange");
if (canChange) {
// Permission is granted, you can now change the system brightness
await ScreenBrightness.instance.system.then((brightness) {
setState(() {
_originalBrightness = brightness;
});
KenLogger.success("Original brightness: $_originalBrightness");
});
await ScreenBrightness.instance
.setSystemScreenBrightness(newBrightness);
KenLogger.success("Brightness set to: $newBrightness");
} else {
context.pop();
MihAlertServices().errorAdvancedAlert(
"Permission Required",
"Sometimes it can be tough to scan your loyalty card if your phone screen is dim. To make sure your scan is successful every time, we need your permission to temporarily increase your screen brightness.\n\nWould you mind enabling this in your device settings?",
[
MihButton(
onPressed: () async {
context.pop();
await ScreenBrightness.instance
.setSystemScreenBrightness(newBrightness);
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Grant Permission",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
context,
);
}
} else {
KenLogger.warning(
"Screen brightness adjustment is not supported on Web.");
// _originalBrightness = 1.0; // Default brightness for web
// await ScreenBrightness.instance.setSystemScreenBrightness(1.0);
// KenLogger.success("Brightness set to default value: 1.0");
}
}
void resetScreenBrightness() async {
if (!kIsWeb) {
KenLogger.success(
"Resetting screen brightness to original value: $_originalBrightness");
if (_originalBrightness != null) {
await ScreenBrightness.instance
.setSystemScreenBrightness(_originalBrightness!);
}
} else {
KenLogger.warning("Screen brightness reset is not supported on Web.");
}
}
@override
void initState() {
super.initState();
setState(() {
_noFavourites = countFavourites();
});
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
// final double width = size.width;
//final double height = size.height;
if (widget.cardList.isNotEmpty) {
return Consumer2<MzansiProfileProvider, MzansiWalletProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
Widget? child) {
return GridView.builder(
padding: EdgeInsets.only(
left: getHorizontalPaddingSize(size),
right: getHorizontalPaddingSize(size),
),
itemCount: widget.cardList.length,
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
mainAxisSpacing: 0,
crossAxisSpacing: 5,
maxCrossAxisExtent: 200,
),
itemBuilder: (context, index) {
return GestureDetector(
child: MihCardDisplay(
shopName: widget.cardList[index].shop_name,
nickname: widget.cardList[index].nickname,
height: 100,
),
onTap: () {
setScreenBrightness(1.0);
viewCardWindow(
mzansiProfileProvider,
walletProvider,
index,
size.width,
);
},
);
},
);
},
);
} else {
if (!widget.favouritesMode) {
if (widget.searchText.text.isNotEmpty) {
return Column(
children: [
const SizedBox(height: 50),
Icon(
MihIcons.iDontKnow,
size: 165,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
const SizedBox(height: 10),
Text(
"Let's try refining your search",
textAlign: TextAlign.center,
overflow: TextOverflow.visible,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
],
);
}
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Icon(
MihIcons.mzansiWallet,
size: 165,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
const SizedBox(height: 10),
Text(
"No cards added to your Mzansi Wallet",
textAlign: TextAlign.center,
overflow: TextOverflow.visible,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
const SizedBox(height: 25),
Center(
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.normal,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
children: [
TextSpan(text: "Press "),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.menu,
size: 20,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
TextSpan(text: " to add your first loyalty card"),
],
),
),
),
],
),
);
} else {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Icon(
MihIcons.mzansiWallet,
size: 165,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
const SizedBox(height: 10),
Text(
"No favourite cards in your Mzansi Wallet",
textAlign: TextAlign.center,
overflow: TextOverflow.visible,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
const SizedBox(height: 25),
Center(
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.normal,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
children: [
TextSpan(text: "Press "),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Icon(
Icons.menu,
size: 20,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
TextSpan(
text:
" when viewing a loyalty card to add it to your favorites"),
],
),
),
),
],
),
);
}
}
}
}

View File

@@ -0,0 +1,294 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:ken_logger/ken_logger.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_dropdwn_field.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:provider/provider.dart';
class MihAddCardWindow extends StatefulWidget {
const MihAddCardWindow({
super.key,
});
@override
State<MihAddCardWindow> createState() => _MihAddCardWindowState();
}
class _MihAddCardWindowState extends State<MihAddCardWindow> {
final _formKey = GlobalKey<FormState>();
final TextEditingController _cardNumberController = TextEditingController();
final TextEditingController _shopController = TextEditingController();
final TextEditingController _nicknameController = TextEditingController();
final ValueNotifier<String> _shopName = ValueNotifier("");
void successPopUp(String title, String message, int packageIndex) {
MihAlertServices().successBasicAlert(
title,
message,
context,
);
}
@override
void dispose() {
_cardNumberController.dispose();
_shopController.dispose();
_nicknameController.dispose();
_shopName.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
_shopController.addListener(_shopSelected);
}
void _shopSelected() {
if (_shopController.text.isNotEmpty) {
_shopName.value = _shopController.text;
} else {
_shopName.value = "";
}
}
@override
Widget build(BuildContext context) {
final double width = MediaQuery.sizeOf(context).width;
return MihPackageWindow(
fullscreen: false,
windowTitle: "Add New Loyalty Card",
onWindowTapClose: () {
_shopController.clear();
_cardNumberController.clear();
_nicknameController.clear();
_shopName.value = "";
Navigator.pop(context);
},
windowBody: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.05)
: EdgeInsets.symmetric(horizontal: width * 0),
child: Consumer2<MzansiProfileProvider, MzansiWalletProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
Widget? child) {
return Column(
children: [
MihForm(
formKey: _formKey,
formFields: [
MihDropdownField(
controller: _shopController,
hintText: "Shop Name",
editable: true,
enableSearch: true,
validator: (value) {
return MihValidationServices().isEmpty(value);
},
requiredText: true,
dropdownOptions: const <String>[
"+More",
"Apple Tree",
"Auchan",
"Best Before",
"Big Save",
"Boxer",
"BP",
"Builders Warehouse",
"Checkers",
"Choppies",
"Clicks",
"Continente",
"Cotton:On",
"Carrefour",
"Dis-Chem",
"Edgars",
"Engen",
"Eskom",
"Exclusive Books",
"Fresh Stop",
"Fresmart",
"Infinity",
"Jet",
"Justrite",
"Kero",
"Leroy Merlin",
"Makro",
"Naivas",
"OK Foods",
"Panarottis",
"Pick n Pay",
"PnA",
"PQ Clothing",
"Rage",
"Sefalana",
"Sasol",
"Shell",
"Shoprite",
"Signature Cosmetics & Fragrances",
"Spar",
"Spur",
"TFG Group",
"Total Energies",
"Toys R Us",
"Woermann Brock",
"Woolworths",
],
),
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,
nickname: "",
height: 200),
],
),
);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _nicknameController,
multiLineInput: false,
requiredText: false,
hintText: "Card Title",
),
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
Flexible(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _cardNumberController,
multiLineInput: false,
requiredText: true,
hintText: "Card Number",
numberMode: true,
validator: (value) {
return MihValidationServices().isEmpty(value);
},
),
),
const SizedBox(width: 20),
MihButton(
onPressed: () {
context.pushNamed(
"barcodeScanner",
extra:
_cardNumberController, // Use local controller
);
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 100,
child: Text(
"Scan",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 15),
Center(
child: MihButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
if (_shopController.text == "") {
MihAlertServices().inputErrorAlert(context);
} else {
int statusCode = await MIHMzansiWalletApis
.addLoyaltyCardAPICall(
walletProvider,
mzansiProfileProvider.user!,
mzansiProfileProvider.user!.app_id,
_shopController.text,
_cardNumberController.text,
"",
0,
_nicknameController.text,
context,
);
if (statusCode == 201) {
context.pop();
KenLogger.success("Card Added Successfully");
successPopUp(
"Successfully Added Card",
"The loyalty card has been added to your favourites.",
0,
);
} else {
MihAlertServices()
.internetConnectionAlert(context);
}
}
} else {
MihAlertServices().inputErrorAlert(context);
}
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300,
child: Text(
"Add",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
],
);
},
),
),
);
}
}

View File

@@ -0,0 +1,175 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
class MihBarcodeScanner extends StatefulWidget {
final TextEditingController cardNumberController;
const MihBarcodeScanner({
super.key,
required this.cardNumberController,
});
@override
State<MihBarcodeScanner> createState() => _MihBarcodeScannerState();
}
class _MihBarcodeScannerState extends State<MihBarcodeScanner>
with WidgetsBindingObserver {
final MobileScannerController _scannerController = MobileScannerController(
detectionSpeed: DetectionSpeed.normal,
);
StreamSubscription<Object>? _subscription;
bool _isScannerStarting = false;
bool barcodeScanned = false;
Future<void> foundCode(BarcodeCapture bcode) async {
if (mounted &&
barcodeScanned == false &&
bcode.barcodes.isNotEmpty &&
bcode.barcodes.first.rawValue != null) {
setState(() {
barcodeScanned = true;
widget.cardNumberController.text = bcode.barcodes.first.rawValue!;
});
print(bcode.barcodes.first.rawValue);
await _scannerController.stop();
if (mounted) {
context.pop();
}
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (!_scannerController.value.hasCameraPermission) {
return;
}
switch (state) {
case AppLifecycleState.detached:
case AppLifecycleState.hidden:
case AppLifecycleState.paused:
return;
case AppLifecycleState.resumed:
if (!_scannerController.value.isRunning && !_isScannerStarting) {
_isScannerStarting = true;
_subscription = _scannerController.barcodes.listen(foundCode);
unawaited(_scannerController.start().then((_) {
_isScannerStarting = false;
}));
}
case AppLifecycleState.inactive:
unawaited(_subscription?.cancel());
_subscription = null;
unawaited(_scannerController.stop().then((_) {
_isScannerStarting = false;
}));
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
unawaited(_subscription?.cancel());
_subscription = null;
_scannerController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_subscription = _scannerController.barcodes.listen(foundCode);
// unawaited(_scannerController.start());
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Stack(
children: [
MobileScanner(
controller: _scannerController,
onDetect: foundCode,
),
Align(
alignment: Alignment.center,
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Container(
width: 500,
height: 150,
decoration: BoxDecoration(
border: Border.all(
width: 5,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
),
),
Align(
alignment: AlignmentDirectional.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.all(10.0),
child: MihButton(
onPressed: () {
_scannerController.stop();
context.pop();
},
buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 100,
height: 50,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
// GestureDetector(
// onTap: () {
// scannerController.stop();
// Navigator.of(context).pop();
// },
// child: const Text(
// "Cancel",
// style: TextStyle(
// fontWeight: FontWeight.bold,
// fontSize: 25,
// ),
// ),
// ),
// IconButton(
// onPressed: () {},
// icon: const Icon(
// Icons.flip_camera_android,
// size: 30,
// ),
// ),
],
),
)
],
),
),
);
}
}

View File

@@ -0,0 +1,185 @@
import 'package:flutter/material.dart';
class MihCardDisplay extends StatefulWidget {
final String shopName;
final String nickname;
final double height;
const MihCardDisplay({
super.key,
required this.shopName,
required this.height,
required this.nickname,
});
@override
State<MihCardDisplay> createState() => _MihCardDisplayState();
}
class _MihCardDisplayState extends State<MihCardDisplay> {
Widget? displayLoyaltyCard() {
switch (widget.shopName.toLowerCase()) {
case "apple tree":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/apple_tree-min.png');
case "best before":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/best_before-min.png');
case "checkers":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/checkers-min.png');
case "clicks":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/clicks-min.png');
case "cotton:on":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/cotton_on-min.png');
case "dis-chem":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/dischem-min.png');
case "pick n pay":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/pick_n_pay-min.png');
case "shoprite":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/shoprite-min.png');
case "spar":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/spar-min.png');
case "woolworths":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/woolworths-min.png');
case "makro":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/makro-min.png');
case "fresh stop":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/fresh_stop-min.png');
case "panarottis":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/panarottis-min.png');
case "shell":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/shell-min.png');
case "edgars":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/edgars-min.png');
case "jet":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/jet-min.png');
case "spur":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/spur-min.png');
case "infinity":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/infinity-min.png');
case "eskom":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/eskom-min.png');
case "+more":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/plus_more-min.png');
case "bp":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/bp-min.png');
case "builders warehouse":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/builders-min.png');
case "exclusive books":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/exclusive_books-min.png');
case "pna":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/pna-min.png');
case "pq clothing":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/pq-min.png');
case "rage":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/rage-min.png');
case "sasol":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/sasol-min.png');
case "tfg group":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/tfg-min.png');
case "toys r us":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/toysrus-min.png');
case "leroy merlin":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/leroy_merlin-min.png');
case "signature cosmetics & fragrances":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/signature_cosmetics-min.png');
case "ok foods":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/ok_food-min.png');
case "choppies":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/choppies-min.png');
case "boxer":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/boxer-min.png');
case "carrefour":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/carrefour-min.png');
case "sefalana":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/sefalana-min.png');
case "big save":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/big_save-min.png');
case "justrite":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/justrite-min.png');
case "naivas":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/naivas-min.png');
case "kero":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/kero-min.png');
case "auchan":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/auchan-min.png');
case "woermann brock":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/woermann_brock-min.png');
case "continente":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/continente-min.png');
case "fresmart":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/fresmart-min.png');
case "total energies":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/total_energies-min.png');
case "engen":
return Image.asset(
'lib/mih_package_components/assets/images/loyalty_cards/mini/engen-min.png');
default:
return null;
}
}
@override
Widget build(BuildContext context) {
return Visibility(
visible: displayLoyaltyCard() != null,
child: Column(
children: [
displayLoyaltyCard() != null ? displayLoyaltyCard()! : SizedBox(),
FittedBox(
child: Text(
widget.nickname,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
)
],
),
);
}
}

View File

@@ -0,0 +1,139 @@
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart';
import 'package:flutter/material.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:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart';
import 'package:provider/provider.dart';
class MihWallet extends StatefulWidget {
const MihWallet({
super.key,
});
@override
State<MihWallet> createState() => _MihWalletState();
}
class _MihWalletState extends State<MihWallet> {
bool _isLoadingInitialData = true;
late final MihCards _cards;
late final MihCardFavourites _cardFavourites;
Future<void> _loadInitialData() async {
setState(() {
_isLoadingInitialData = true;
});
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
MzansiWalletProvider walletProvider = context.read<MzansiWalletProvider>();
if (mzansiProfileProvider.user == null) {
await MihDataHelperServices().loadUserDataOnly(
mzansiProfileProvider,
);
}
await setLoyaltyCards(mzansiProfileProvider, walletProvider);
await setFavouritesCards(mzansiProfileProvider, walletProvider);
setState(() {
_isLoadingInitialData = false;
});
}
Future<void> setLoyaltyCards(
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
) async {
await MIHMzansiWalletApis.getLoyaltyCards(
walletProvider, mzansiProfileProvider.user!.app_id, context);
}
Future<void> setFavouritesCards(
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
) async {
await MIHMzansiWalletApis.getFavouriteLoyaltyCards(
walletProvider, mzansiProfileProvider.user!.app_id, context);
}
@override
void initState() {
super.initState();
_cards = MihCards();
_cardFavourites = MihCardFavourites();
_loadInitialData();
}
@override
Widget build(BuildContext context) {
return Consumer<MzansiWalletProvider>(
builder: (BuildContext context, MzansiWalletProvider walletProvider,
Widget? child) {
if (_isLoadingInitialData) {
return Scaffold(
body: Center(
child: Mihloadingcircle(),
),
);
}
return MihPackage(
appActionButton: getAction(),
appTools: getTools(),
appBody: getToolBody(),
appToolTitles: getToolTitle(),
selectedbodyIndex: walletProvider.toolIndex,
onIndexChange: (newIndex) {
walletProvider.setToolIndex(newIndex);
},
);
},
);
}
MihPackageAction getAction() {
return MihPackageAction(
icon: const Icon(Icons.arrow_back),
iconSize: 35,
onTap: () {
context.goNamed(
'mihHome',
);
FocusScope.of(context).unfocus();
},
);
}
MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.card_membership)] = () {
context.read<MzansiWalletProvider>().setToolIndex(0);
};
temp[const Icon(Icons.favorite)] = () {
context.read<MzansiWalletProvider>().setToolIndex(1);
};
return MihPackageTools(
tools: temp,
selcetedIndex: context.watch<MzansiWalletProvider>().toolIndex,
);
}
List<Widget> getToolBody() {
return [
_cards,
_cardFavourites,
];
}
List<String> getToolTitle() {
List<String> toolTitles = [
"Cards",
"Favourites",
];
return toolTitles;
}
}

View File

@@ -0,0 +1,46 @@
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tile.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
class MihWalletTile extends StatefulWidget {
final double packageSize;
const MihWalletTile({
super.key,
required this.packageSize,
});
@override
State<MihWalletTile> createState() => _MihWalletTileState();
}
class _MihWalletTileState extends State<MihWalletTile> {
@override
Widget build(BuildContext context) {
return MihPackageTile(
// authenticateUser: true,
onTap: () {
context.goNamed(
'mzansiWallet',
);
// Navigator.of(context).pushNamed(
// '/mzansi-wallet',
// arguments: WalletArguments(widget.signedInUser, 0),
// );
},
appName: "Mzansi Wallet",
appIcon: Icon(
MihIcons.mzansiWallet,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// size: widget.packageSize,
),
iconSize: widget.packageSize,
textColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
}
}

View File

@@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.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:provider/provider.dart';
class MihCardFavourites extends StatefulWidget {
const MihCardFavourites({
super.key,
});
@override
State<MihCardFavourites> createState() => _MihCardFavouritesState();
}
class _MihCardFavouritesState extends State<MihCardFavourites> {
late Future<List<MIHLoyaltyCard>> cardList;
List<MIHLoyaltyCard> listOfCards = [];
void getFavouriteLoyaltyCards(BuildContext context) async {
setState(() {
listOfCards = context.read<MzansiWalletProvider>().favouriteCards;
});
}
@override
void initState() {
getFavouriteLoyaltyCards(context);
super.initState();
}
@override
Widget build(BuildContext context) {
return MihPackageToolBody(
borderOn: false,
bodyItem: getBody(),
);
}
Widget getBody() {
return BuildLoyaltyCardList(
cardList: listOfCards,
navIndex: 0,
favouritesMode: true,
searchText: TextEditingController(),
);
}
}

View File

@@ -0,0 +1,185 @@
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_add_card_window.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_floating_menu.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_search_bar.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:flutter/material.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:provider/provider.dart';
class MihCards extends StatefulWidget {
const MihCards({
super.key,
});
@override
State<MihCards> createState() => _MihCardsState();
}
class _MihCardsState extends State<MihCards> {
final TextEditingController cardSearchController = TextEditingController();
final FocusNode searchFocusNode = FocusNode();
final ValueNotifier<List<MIHLoyaltyCard>> searchShopName = ValueNotifier([]);
final MobileScannerController scannerController = MobileScannerController(
detectionSpeed: DetectionSpeed.unrestricted,
);
final boxFit = BoxFit.contain;
late MzansiWalletProvider _walletProvider;
late VoidCallback _searchListener;
void searchShop(List<MIHLoyaltyCard> allCards) {
if (cardSearchController.text.isEmpty) {
searchShopName.value = allCards;
} else {
List<MIHLoyaltyCard> temp = [];
for (var item in allCards) {
if (item.shop_name
.toLowerCase()
.contains(cardSearchController.text.toLowerCase()) ||
item.nickname
.toLowerCase()
.contains(cardSearchController.text.toLowerCase())) {
temp.add(item);
}
}
searchShopName.value = temp;
}
}
void successPopUp(String title, String message, int packageIndex) {
MihAlertServices().successBasicAlert(
title,
message,
context,
);
}
void addCardWindow(BuildContext ctxt, double width) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => MihAddCardWindow(),
);
}
@override
void dispose() {
cardSearchController.removeListener(_searchListener);
cardSearchController.dispose();
searchShopName.dispose();
searchFocusNode.dispose();
super.dispose();
}
@override
void initState() {
_walletProvider = context.read<MzansiWalletProvider>();
_searchListener = () {
searchShop(_walletProvider.loyaltyCards);
};
searchShopName.value = _walletProvider.loyaltyCards;
cardSearchController.addListener(_searchListener);
super.initState();
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
final double width = size.width;
return MihPackageToolBody(
borderOn: false,
bodyItem: getBody(width),
);
}
Widget getBody(double width) {
return Consumer<MzansiWalletProvider>(
builder: (BuildContext context, MzansiWalletProvider walletProvider,
Widget? child) {
if (cardSearchController.text.isEmpty) {
searchShopName.value = walletProvider.loyaltyCards;
} else {
// Re-run search with updated card list
searchShop(walletProvider.loyaltyCards);
}
return Stack(
children: [
Column(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: width / 20),
child: MihSearchBar(
controller: cardSearchController,
hintText: "Search Cards",
// prefixIcon: Icons.search,
prefixIcon: Icons.search,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
hintColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onPrefixIconTap: () {
// print("Search Icon Pressed: ${cardSearchController.text}");
},
searchFocusNode: searchFocusNode,
),
),
const SizedBox(height: 10),
Expanded(
child: ValueListenableBuilder<List<MIHLoyaltyCard>>(
valueListenable: searchShopName,
builder: (context, filteredCards, child) {
return BuildLoyaltyCardList(
cardList: filteredCards, //listOfCards,
navIndex: 0,
favouritesMode: false,
searchText: cardSearchController,
);
},
),
),
],
),
Positioned(
right: 10,
bottom: 10,
child: MihFloatingMenu(
animatedIcon: AnimatedIcons.menu_close,
children: [
SpeedDialChild(
child: Icon(
Icons.add,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
label: "Add Loyalty Card",
labelBackgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
labelStyle: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onTap: () {
addCardWindow(context, width);
},
)
]),
)
],
);
},
);
}
}