update packages, replace barcode_widget with, qr_bar_code & update for new code package

This commit is contained in:
yaso 2026-07-10 12:16:12 +02:00
parent d7e4ac134d
commit e3766c827e
12 changed files with 925 additions and 823 deletions

View file

@ -15,6 +15,8 @@ import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart';
import 'package:provider/provider.dart';
import 'package:qr_bar_code/code/src/code_generate.dart';
import 'package:qr_bar_code/code/src/code_type.dart';
import 'package:screenshot/screenshot.dart';
import 'package:share_plus/share_plus.dart';
import 'package:supertokens_flutter/supertokens.dart';
@ -33,7 +35,7 @@ class MihBusinessQrCode extends StatefulWidget {
class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
late Business business;
PlatformFile? file;
late String qrCodedata;
late String _businessShare;
int qrSize = 500;
bool _isUserSignedIn = false;
ScreenshotController screenshotController = ScreenshotController();
@ -46,19 +48,6 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
});
}
String getQrCodeData(int qrSize) {
String color =
MihColors.primary().toARGB32().toRadixString(16).substring(2, 8);
// KenLogger.warning(color);
String bgColor =
MihColors.secondary().toARGB32().toRadixString(16).substring(2, 8);
// KenLogger.warning(bgColor);
String encodedData =
Uri.encodeComponent("$qrCodedata${business.business_id}");
return "https://api.qrserver.com/v1/create-qr-code/?data=$encodedData&size=${qrSize}x$qrSize&bgcolor=$bgColor&color=$color";
}
Future<void> saveImage(Uint8List imageBytes) async {
final String filename =
"${business.Name}_QR_Code_${DateTime.now().millisecondsSinceEpoch}";
@ -186,53 +175,60 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
borderRadius: BorderRadius.circular(20),
),
child: Padding(
padding: const EdgeInsets.all(20.0),
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
widget.business == null
? MihCircleAvatar(
imageFile: profileprovider.businessProfilePicture,
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
)
: MihCircleAvatar(
imageFile: CachedNetworkImageProvider(
MihFileApi.getMinioFileUrlV2(business.logo_path),
Center(
child: widget.business == null
? MihCircleAvatar(
imageFile: profileprovider.businessProfilePicture,
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
)
: MihCircleAvatar(
imageFile: CachedNetworkImageProvider(
MihFileApi.getMinioFileUrlV2(business.logo_path),
),
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
),
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
),
Center(
child: FittedBox(
child: Text(
business.Name,
style: TextStyle(
fontSize: 45,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
FittedBox(
child: Text(
business.Name,
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
),
),
FittedBox(
child: Text(
business.type,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
Center(
child: FittedBox(
child: Text(
business.type,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
),
),
),
),
@ -244,7 +240,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
child: Text(
"Powered by MIH",
style: TextStyle(
fontSize: 15,
fontSize: 18,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
),
@ -259,26 +255,31 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
],
),
const SizedBox(height: 10),
SizedBox(
width: 300,
height: 300,
child: CachedNetworkImage(
imageUrl: getQrCodeData(qrSize.toInt()),
placeholder: (context, url) => FittedBox(
child: const Mihloadingcircle(),
),
errorWidget: (context, url, error) =>
const Icon(Icons.error),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 35.0),
child: LayoutBuilder(builder: (context, constraints) {
final double codesize = constraints.maxWidth < qrSize
? constraints.maxWidth
: qrSize.toDouble();
return Code(
color: MihColors.primary(),
data: "$_businessShare${business.business_id}",
codeType: CodeType.qrCode(),
width: codesize,
height: codesize,
);
}),
),
const SizedBox(height: 10),
FittedBox(
child: Text(
"Scan & Connect",
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
Center(
child: FittedBox(
child: Text(
"Scan & Connect",
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
),
),
),
@ -312,7 +313,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
business = profileProvider.business!;
}
_checkUserSession();
qrCodedata = "${AppEnviroment.baseAppUrl}/business-profile/view/";
_businessShare = "${AppEnviroment.baseAppUrl}/business-profile/view/";
}
@override
@ -327,12 +328,14 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
}
Widget getBody(Size screenSize, BuildContext context) {
double profilePictureWidth = 150;
double profilePictureWidth =
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? 225
: 200;
return Stack(
alignment: Alignment.topCenter,
children: [
MihSingleChildScroll(
scrollbarOn: true,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Padding(
@ -342,7 +345,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
: EdgeInsets.symmetric(
horizontal: screenSize.width * 0), //.075),
child: Padding(
padding: const EdgeInsets.only(top: 10.0),
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: displayBusinessQRCode(profilePictureWidth),
),
),
@ -386,7 +389,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
shareMIHLink(
context,
"Check out ${business.Name} on the MIH app's Mzansi Directory",
"$qrCodedata${business.business_id}",
"$_businessShare${business.business_id}",
);
},
),
@ -404,7 +407,8 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
backgroundColor: MihColors.green(),
onTap: () async {
await Clipboard.setData(
ClipboardData(text: "$qrCodedata${business.business_id}"),
ClipboardData(
text: "$_businessShare${business.business_id}"),
);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(

View file

@ -3,6 +3,7 @@ import 'package:file_picker/file_picker.dart';
import 'package:file_saver/file_saver.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.dart';
@ -16,6 +17,8 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart';
import 'package:provider/provider.dart';
import 'package:qr_bar_code/code/src/code_generate.dart';
import 'package:qr_bar_code/code/src/code_type.dart';
import 'package:screenshot/screenshot.dart';
import 'package:share_plus/share_plus.dart';
import 'package:supertokens_flutter/supertokens.dart';
@ -38,7 +41,8 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
ScreenshotController screenshotController = ScreenshotController();
Uint8List? personalQRImageFile;
bool _isUserSignedIn = false;
final String _qrCodedata = "${AppEnviroment.baseAppUrl}/mzansi-profile/view/";
final String _userShareLink =
"${AppEnviroment.baseAppUrl}/mzansi-profile/view/";
Future<void> _checkUserSession() async {
final doesSessionExist = await SuperTokens.doesSessionExist();
@ -47,18 +51,6 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
});
}
String getQrCodeData(int qrSize) {
String color =
MihColors.primary().toARGB32().toRadixString(16).substring(2, 8);
// KenLogger.warning(color);
String bgColor =
MihColors.secondary().toARGB32().toRadixString(16).substring(2, 8);
// KenLogger.warning(bgColor);
String encodedData =
Uri.encodeComponent("$_qrCodedata${user.username.toLowerCase()}");
return "https://api.qrserver.com/v1/create-qr-code/?data=$encodedData&size=${qrSize}x$qrSize&bgcolor=$bgColor&color=$color";
}
Future<void> saveImage(Uint8List imageBytes) async {
final String filename =
"${user.username}_QR_Code_${DateTime.now().millisecondsSinceEpoch}";
@ -177,64 +169,72 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
context.read<MzansiProfileProvider>();
return Screenshot(
controller: screenshotController,
child: Material(
color: MihColors.secondary().withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(25),
elevation: 10,
shadowColor: Colors.black,
child: Container(
decoration: BoxDecoration(
color: MihColors.secondary(),
borderRadius: BorderRadius.circular(20),
),
child: Padding(
padding: const EdgeInsets.all(20.0),
child: SizedBox(
child: Material(
color: MihColors.secondary().withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(25),
elevation: 10,
shadowColor: Colors.black,
child: Container(
decoration: BoxDecoration(
color: MihColors.secondary(),
borderRadius: BorderRadius.circular(20),
),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
widget.user == null
? MihCircleAvatar(
imageFile: profileProvider.userProfilePicture,
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
)
: MihCircleAvatar(
imageFile: CachedNetworkImageProvider(
MihFileApi.getMinioFileUrlV2(user.pro_pic_path),
Center(
child: widget.user == null
? MihCircleAvatar(
imageFile: profileProvider.userProfilePicture,
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
)
: MihCircleAvatar(
imageFile: CachedNetworkImageProvider(
MihFileApi.getMinioFileUrlV2(user.pro_pic_path),
),
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
),
width: profilePictureWidth,
expandable: true,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.primary(),
backgroundColor: MihColors.secondary(),
onChange: () {},
),
Center(
child: FittedBox(
child: Text(
user.username,
style: TextStyle(
fontSize: 45,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
FittedBox(
child: Text(
user.username,
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
),
),
FittedBox(
child: Text(
"${user.fname} ${user.lname}",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
Center(
child: FittedBox(
child: Text(
"${user.fname} ${user.lname}",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
),
),
),
),
@ -246,7 +246,7 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
child: Text(
"Powered by MIH",
style: TextStyle(
fontSize: 15,
fontSize: 18,
fontWeight: FontWeight.w600,
color: MihColors.primary(),
),
@ -261,31 +261,39 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
],
),
const SizedBox(height: 10),
SizedBox(
width: 300,
height: 300,
child: CachedNetworkImage(
imageUrl: getQrCodeData(qrSize.toInt()),
placeholder: (context, url) => FittedBox(
child: const Mihloadingcircle(),
),
errorWidget: (context, url, error) =>
const Icon(Icons.error),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 35.0),
child: LayoutBuilder(builder: (context, constraints) {
final double codesize = constraints.maxWidth < qrSize
? constraints.maxWidth
: qrSize.toDouble();
return Code(
color: MihColors.primary(),
data:
"$_userShareLink${profileProvider.user!.username.toLowerCase()}",
codeType: CodeType.qrCode(),
width: codesize,
height: codesize,
);
}),
),
const SizedBox(height: 10),
FittedBox(
child: Text(
"Scan & Connect",
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
Center(
child: FittedBox(
child: Text(
"Scan & Connect",
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: MihColors.primary(),
),
),
),
),
],
)),
),
),
),
),
),
);
@ -329,22 +337,24 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
}
Widget getBody(Size screenSize, BuildContext context) {
double profilePictureWidth = 150;
double profilePictureWidth =
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? 225
: 200;
return Stack(
alignment: Alignment.topCenter,
children: [
MihSingleChildScroll(
scrollbarOn: true,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15.0),
child: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: screenSize.width * 0.2)
: EdgeInsets.symmetric(
horizontal: screenSize.width * 0), //.075),
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: screenSize.width * 0.2)
: EdgeInsets.symmetric(
horizontal: screenSize.width * 0), //.075),
child: MihSingleChildScroll(
child: Padding(
padding: const EdgeInsets.only(top: 10.0),
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: displayPersonalQRCode(profilePictureWidth),
),
),
@ -388,7 +398,7 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
shareMIHLink(
context,
"Check out ${user.username} on the MIH app's Mzansi Directory",
"$_qrCodedata${user.username.toLowerCase()}",
"$_userShareLink${user.username.toLowerCase()}",
);
},
),
@ -407,7 +417,8 @@ class _MihPersonalQrCodeState extends State<MihPersonalQrCode> {
onTap: () async {
await Clipboard.setData(
ClipboardData(
text: "$_qrCodedata${user.username.toLowerCase()}"),
text:
"$_userShareLink${user.username.toLowerCase()}"),
);
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(

View file

@ -1,21 +1,19 @@
import 'dart:io';
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:mih_package_toolkit/mih_package_toolkit.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_packages/mzansi_wallet/components/mih_card_display_slanted.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display_window.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_edit_window.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_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.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';
@ -38,556 +36,18 @@ class BuildLoyaltyCardList extends StatefulWidget {
}
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.secondary(),
inputColor: MihColors.primary(),
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.secondary(),
inputColor: MihColors.primary(),
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.secondary(),
width: 100,
child: Text(
"Scan",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 15),
Center(
child: MihButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards:
widget.cardList[index].idloyalty_cards,
app_id: widget.cardList[index].app_id,
shop_name: widget.cardList[index].shop_name,
card_number: _cardNumberController.text,
favourite: widget.cardList[index].favourite,
priority_index:
widget.cardList[index].priority_index,
nickname: _nicknameController.text,
),
);
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully updated the loyalty card details.",
context,
);
} else {
MihAlertServices().inputErrorAlert(context);
}
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Update",
style: TextStyle(
color: MihColors.primary(),
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 {
walletProvider.deleteLocalLoyaltyCard(
mzansiProfileProvider,
widget.cardList[index],
);
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully deleted the loyalty card from your Mzansi Wallet.",
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.red(),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
await walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards: widget.cardList[index].idloyalty_cards,
app_id: widget.cardList[index].app_id,
shop_name: widget.cardList[index].shop_name,
card_number: widget.cardList[index].card_number,
favourite: "Yes",
priority_index: _noFavourites,
nickname: widget.cardList[index].nickname,
),
);
context.pop();
context.pop();
context.read<MzansiWalletProvider>().setToolIndex(1);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully added the loyalty card to your favourites.",
context,
);
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Add",
style: TextStyle(
color: MihColors.primary(),
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 {
await walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards: widget.cardList[index].idloyalty_cards,
app_id: widget.cardList[index].app_id,
shop_name: widget.cardList[index].shop_name,
card_number: widget.cardList[index].card_number,
favourite: "",
priority_index: 0,
nickname: widget.cardList[index].nickname,
),
);
context.pop();
context.pop();
context.read<MzansiWalletProvider>().setToolIndex(0);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully removed the loyalty card to your favourites.",
context,
);
},
buttonColor: MihColors.red(),
width: 300,
child: Text(
"Remove",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
context.pop();
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
ctxt,
);
}
Color getCardColor(String shopName) {
switch (shopName.toLowerCase()) {
case "apple tree":
return const Color(0xFFffffff);
case "best before":
return const Color(0xFF000000);
case "checkers":
return const Color(0xFF00a6a3);
case "clicks":
return const Color(0xFF005baa);
case "cotton:on":
return const Color(0xFFffffff);
case "dis-chem":
return const Color(0xFF00a950);
case "pick n pay":
return const Color(0xFFffffff);
case "shoprite":
return const Color(0xFFc12514);
case "spar":
return const Color(0xFFffffff);
case "woolworths":
return const Color(0xFF000000);
case "makro":
return const Color(0xFFffffff);
case "fresh stop":
return const Color(0xFF50b849);
case "panarottis":
return const Color(0xFF3c3c3b);
case "shell":
return const Color(0xFF1d232a);
case "edgars":
return const Color(0xFFffffff);
case "jet":
return const Color(0xFFffffff);
case "spur":
return const Color(0xFF0a0157);
case "infinity":
return const Color(0xFFffffff);
case "eskom":
return const Color(0xFF003897);
case "+more":
return const Color(0xFFffffff);
case "bp":
return const Color(0xFF9dc600);
case "builders warehouse":
return const Color(0xFFffcb26);
case "exclusive books":
return const Color(0xFF2abdc5);
case "pna":
return const Color(0xFFcf3339);
case "pq clothing":
return const Color(0xFFed2223);
case "rage":
return const Color(0xFFffffff);
case "sasol":
return const Color(0xFFffffff);
case "tfg group":
return const Color(0xFF622775);
case "toys r us":
return const Color(0xFF0962ad);
case "leroy merlin":
return const Color(0xFFffffff);
case "signature cosmetics & fragrances":
return const Color(0xFFec028b);
case "ok foods":
return const Color(0xFFffffff);
case "choppies":
return const Color(0xFFffffff);
case "boxer":
return const Color(0xFFffffff);
case "carrefour":
return const Color(0xFFffffff);
case "sefalana":
return const Color(0xFFffffff);
case "big save":
return const Color(0xFF333333);
case "justrite":
return const Color(0xFF50b849);
case "naivas":
return const Color(0xFFf26535);
case "kero":
return const Color(0xFF004986);
case "auchan":
return const Color(0xFFffffff);
case "woermann brock":
return const Color(0xFFe31e2d);
case "continente":
return const Color(0xFFffffff);
case "fresmart":
return const Color(0xFF72ba2e);
case "total energies":
return const Color(0xFFffffff);
case "engen":
return const Color(0xFF002b8f);
default:
return const Color(0xFFffffff);
}
}
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(
backgroundColor: getCardColor(widget.cardList[index].shop_name),
fullscreen: false,
windowTitle: null,
menuOptions: [
SpeedDialChild(
child: widget.cardList[index].favourite == ""
? Icon(
Icons.favorite,
color: MihColors.primary(),
)
: Icon(
Icons.favorite_border,
color: MihColors.primary(),
),
label: widget.cardList[index].favourite == ""
? "Add to Favourite"
: "Remove from Favourite",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
onTap: () {
if (widget.cardList[index].favourite == "") {
addToFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
} else {
removeFromFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
}
},
),
SpeedDialChild(
child: Icon(
Icons.edit,
color: MihColors.primary(),
),
label: "Edit Card Details",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
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.primary(),
),
label: "Delete Card",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
onTap: () {
deleteCardWindow(
mzansiProfileProvider,
walletProvider,
context,
index,
);
},
),
],
onWindowTapClose: () {
resetScreenBrightness();
context.pop();
},
windowBody: Column(
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
height: 15,
),
SizedBox(
width: 500,
child: MihCardDisplay(
shopName: widget.cardList[index].shop_name,
nickname: widget.cardList[index].nickname,
),
),
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: 150,
// width: 300,
child: BarcodeWidget(
//color: MihColors.secondary(),
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.secondary(),
),
),
],
),
),
SizedBox(height: 10),
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) MihBannerAd()
// MihBannerAd(),
],
),
builder: (context) => MihCardDisplayWindow(
displayCard: widget.cardList[index],
listIndex: index,
noFavourites: _noFavourites,
),
);
}
@ -657,22 +117,6 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
} 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.");
}
}
@ -687,8 +131,6 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
@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,

View file

@ -0,0 +1,469 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.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:mih_package_toolkit/mih_package_toolkit.dart';
import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_banner_ad.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_display.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_card_edit_window.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_services/mih_alert_services.dart';
import 'package:provider/provider.dart';
import 'package:qr_bar_code/code/src/code_generate.dart';
import 'package:qr_bar_code/code/src/code_type.dart';
import 'package:screen_brightness/screen_brightness.dart';
class MihCardDisplayWindow extends StatefulWidget {
final MIHLoyaltyCard displayCard;
final int listIndex;
final int noFavourites;
const MihCardDisplayWindow({
super.key,
required this.displayCard,
required this.listIndex,
required this.noFavourites,
});
@override
State<MihCardDisplayWindow> createState() => _MihCardDisplayWindowState();
}
class _MihCardDisplayWindowState extends State<MihCardDisplayWindow> {
double? _originalBrightness;
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.");
}
}
String getFormattedCardNumber() {
String formattedCardNumber = "";
for (int i = 0; i <= widget.displayCard.card_number.length - 1; i++) {
formattedCardNumber += widget.displayCard.card_number[i];
if ((i + 1) % 4 == 0) {
formattedCardNumber += "\t";
}
}
return formattedCardNumber;
}
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 {
walletProvider.deleteLocalLoyaltyCard(
mzansiProfileProvider,
widget.displayCard,
);
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully deleted the loyalty card from your Mzansi Wallet.",
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.red(),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
await walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards: widget.displayCard.idloyalty_cards,
app_id: widget.displayCard.app_id,
shop_name: widget.displayCard.shop_name,
card_number: widget.displayCard.card_number,
favourite: "Yes",
priority_index: widget.noFavourites,
nickname: widget.displayCard.nickname,
),
);
context.pop();
context.pop();
context.read<MzansiWalletProvider>().setToolIndex(1);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully added the loyalty card to your favourites.",
context,
);
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Add",
style: TextStyle(
color: MihColors.primary(),
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 {
await walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards: widget.displayCard.idloyalty_cards,
app_id: widget.displayCard.app_id,
shop_name: widget.displayCard.shop_name,
card_number: widget.displayCard.card_number,
favourite: "",
priority_index: 0,
nickname: widget.displayCard.nickname,
),
);
context.pop();
context.pop();
context.read<MzansiWalletProvider>().setToolIndex(0);
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully removed the loyalty card to your favourites.",
context,
);
},
buttonColor: MihColors.red(),
width: 300,
child: Text(
"Remove",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () async {
context.pop();
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
ctxt,
);
}
void editCardWindow(
int index,
) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => MihCardEditWindow(
editCard: widget.displayCard,
listIndex: widget.listIndex,
),
);
}
@override
Widget build(BuildContext context) {
return Consumer2<MzansiProfileProvider, MzansiWalletProvider>(
builder: (
BuildContext context,
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
Widget? child,
) {
return MihPackageWindow(
backgroundColor: getCardColor(widget.displayCard.shop_name),
fullscreen: false,
windowTitle: null,
menuOptions: [
SpeedDialChild(
child: widget.displayCard.favourite == ""
? Icon(
Icons.favorite,
color: MihColors.primary(),
)
: Icon(
Icons.favorite_border,
color: MihColors.primary(),
),
label: widget.displayCard.favourite == ""
? "Add to Favourite"
: "Remove from Favourite",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
onTap: () {
if (widget.displayCard.favourite == "") {
addToFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
widget.listIndex,
);
} else {
removeFromFavCardWindow(
mzansiProfileProvider,
walletProvider,
context,
widget.listIndex,
);
}
},
),
SpeedDialChild(
child: Icon(
Icons.edit,
color: MihColors.primary(),
),
label: "Edit Card Details",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
onTap: () {
editCardWindow(
widget.listIndex,
);
},
),
SpeedDialChild(
child: Icon(
Icons.delete,
color: MihColors.primary(),
),
label: "Delete Card",
labelBackgroundColor: MihColors.green(),
labelStyle: TextStyle(
color: MihColors.primary(),
fontWeight: FontWeight.bold,
),
backgroundColor: MihColors.green(),
onTap: () {
deleteCardWindow(
mzansiProfileProvider,
walletProvider,
context,
widget.listIndex,
);
},
),
],
onWindowTapClose: () {
resetScreenBrightness();
context.pop();
},
windowBody: Column(
mainAxisSize: MainAxisSize.max,
children: [
SizedBox(
height: 15,
),
SizedBox(
width: 500,
child: MihCardDisplay(
shopName: widget.displayCard.shop_name,
nickname: widget.displayCard.nickname,
),
),
const SizedBox(height: 20),
Container(
// width: 500,
//color: Colors.white,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
children: [
Code(
data: widget.displayCard.card_number,
codeType: CodeType.code128(),
drawText: false,
height: 250,
),
const SizedBox(height: 10),
Text(
getFormattedCardNumber(),
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.bold
//MihColors.secondary(),
),
),
],
),
),
),
SizedBox(height: 10),
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS))
MihBannerAd()
// MihBannerAd(),
],
),
);
},
);
}
Color getCardColor(String shopName) {
switch (shopName.toLowerCase()) {
case "apple tree":
return const Color(0xFFffffff);
case "best before":
return const Color(0xFF000000);
case "checkers":
return const Color(0xFF00a6a3);
case "clicks":
return const Color(0xFF005baa);
case "cotton:on":
return const Color(0xFFffffff);
case "dis-chem":
return const Color(0xFF00a950);
case "pick n pay":
return const Color(0xFFffffff);
case "shoprite":
return const Color(0xFFc12514);
case "spar":
return const Color(0xFFffffff);
case "woolworths":
return const Color(0xFF000000);
case "makro":
return const Color(0xFFffffff);
case "fresh stop":
return const Color(0xFF50b849);
case "panarottis":
return const Color(0xFF3c3c3b);
case "shell":
return const Color(0xFF1d232a);
case "edgars":
return const Color(0xFFffffff);
case "jet":
return const Color(0xFFffffff);
case "spur":
return const Color(0xFF0a0157);
case "infinity":
return const Color(0xFFffffff);
case "eskom":
return const Color(0xFF003897);
case "+more":
return const Color(0xFFffffff);
case "bp":
return const Color(0xFF9dc600);
case "builders warehouse":
return const Color(0xFFffcb26);
case "exclusive books":
return const Color(0xFF2abdc5);
case "pna":
return const Color(0xFFcf3339);
case "pq clothing":
return const Color(0xFFed2223);
case "rage":
return const Color(0xFFffffff);
case "sasol":
return const Color(0xFFffffff);
case "tfg group":
return const Color(0xFF622775);
case "toys r us":
return const Color(0xFF0962ad);
case "leroy merlin":
return const Color(0xFFffffff);
case "signature cosmetics & fragrances":
return const Color(0xFFec028b);
case "ok foods":
return const Color(0xFFffffff);
case "choppies":
return const Color(0xFFffffff);
case "boxer":
return const Color(0xFFffffff);
case "carrefour":
return const Color(0xFFffffff);
case "sefalana":
return const Color(0xFFffffff);
case "big save":
return const Color(0xFF333333);
case "justrite":
return const Color(0xFF50b849);
case "naivas":
return const Color(0xFFf26535);
case "kero":
return const Color(0xFF004986);
case "auchan":
return const Color(0xFFffffff);
case "woermann brock":
return const Color(0xFFe31e2d);
case "continente":
return const Color(0xFFffffff);
case "fresmart":
return const Color(0xFF72ba2e);
case "total energies":
return const Color(0xFFffffff);
case "engen":
return const Color(0xFF002b8f);
default:
return const Color(0xFFffffff);
}
}
}

View file

@ -0,0 +1,169 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mih_package_toolkit/mih_package_toolkit.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_objects/loyalty_card.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_services/mih_validation_services.dart';
import 'package:provider/provider.dart';
import '../../../mih_services/mih_alert_services.dart';
class MihCardEditWindow extends StatefulWidget {
final MIHLoyaltyCard editCard;
final int listIndex;
const MihCardEditWindow({
super.key,
required this.editCard,
required this.listIndex,
});
@override
State<MihCardEditWindow> createState() => _MihCardEditWindowState();
}
class _MihCardEditWindowState extends State<MihCardEditWindow> {
final TextEditingController _nicknameController = TextEditingController();
final TextEditingController _cardNumberController = TextEditingController();
final _formKey = GlobalKey<FormState>();
void openscanner() async {
context.pushNamed(
"barcodeScanner",
extra: _cardNumberController,
);
}
@override
void initState() {
super.initState();
_nicknameController.text = widget.editCard.nickname;
_cardNumberController.text = widget.editCard.card_number;
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
return Consumer2<MzansiProfileProvider, MzansiWalletProvider>(
builder: (
BuildContext context,
MzansiProfileProvider mzansiProfileProvider,
MzansiWalletProvider walletProvider,
Widget? child,
) {
return 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: size.width * 0.05)
: EdgeInsets.symmetric(horizontal: size.width * 0),
child: Column(
children: [
MihForm(
formKey: _formKey,
formFields: [
MihTextFormField(
fillColor: MihColors.secondary(),
inputColor: MihColors.primary(),
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.secondary(),
inputColor: MihColors.primary(),
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.secondary(),
width: 100,
child: Text(
"Scan",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 15),
Center(
child: MihButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
walletProvider.updateLocalLoyaltyCard(
mzansiProfileProvider,
MIHLoyaltyCard(
idloyalty_cards:
widget.editCard.idloyalty_cards,
app_id: widget.editCard.app_id,
shop_name: widget.editCard.shop_name,
card_number: _cardNumberController.text,
favourite: widget.editCard.favourite,
priority_index: widget.editCard.priority_index,
nickname: _nicknameController.text,
),
);
context.pop();
context.pop();
MihAlertServices().successBasicAlert(
"Success!",
"You have successfully updated the loyalty card details.",
context,
);
} else {
MihAlertServices().inputErrorAlert(context);
}
},
buttonColor: MihColors.green(),
width: 300,
child: Text(
"Update",
style: TextStyle(
color: MihColors.primary(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
],
),
),
);
},
);
}
}