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,433 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_access_controlls_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_authentication_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_calculator_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_calendar_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mih_mine_sweeper_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.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_providers/patient_manager_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart';
import '../../../main.dart';
import 'package:supertokens_flutter/supertokens.dart';
class MIHAppDrawer extends StatefulWidget {
const MIHAppDrawer({
super.key,
});
@override
State<MIHAppDrawer> createState() => _MIHAppDrawerState();
}
class _MIHAppDrawerState extends State<MIHAppDrawer> {
final proPicController = TextEditingController();
late Widget profilePictureLoaded;
void resetProviders() {
context.read<AboutMihProvider>().reset();
context.read<MihAccessControllsProvider>().reset();
context.read<MihAuthenticationProvider>().reset();
context.read<MihBannerAdProvider>().reset();
context.read<MihCalculatorProvider>().reset();
context.read<MihCalendarProvider>().reset();
context.read<MihMineSweeperProvider>().reset();
context.read<MzansiAiProvider>().reset();
context.read<MzansiDirectoryProvider>().reset();
context.read<MzansiWalletProvider>().reset();
context.read<PatientManagerProvider>().reset();
}
Future<bool> signOut() async {
await SuperTokens.signOut(completionHandler: (error) {
// handle error if any
});
return true;
}
Widget displayProPic(MzansiProfileProvider mzansiProfileProvider) {
return GestureDetector(
onTap: () {
if (mzansiProfileProvider.personalHome) {
context.goNamed(
'mzansiProfileManage',
);
} else {
if (mzansiProfileProvider.business == null) {
context.goNamed(
'businessProfileSetup',
extra: mzansiProfileProvider.user,
);
} else {
context.goNamed(
"businessProfileManage",
);
}
}
},
child: MihCircleAvatar(
imageFile: mzansiProfileProvider.personalHome
? mzansiProfileProvider.userProfilePicture
: mzansiProfileProvider.businessProfilePicture,
width: 60,
editable: false,
fileNameController: proPicController,
onChange: (_) {},
userSelectedfile: null,
frameColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
backgroundColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
);
}
@override
void dispose() {
proPicController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
// precacheImage(
// MzansiInnovationHub.of(context)!.theme.logoImage().image, context);
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return SafeArea(
child: Drawer(
//backgroundColor: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
return Stack(
//fit: StackFit.passthrough,
children: [
Column(
// reverse: false,
// padding: EdgeInsets.zero,
mainAxisSize: MainAxisSize.max,
children: [
DrawerHeader(
decoration: BoxDecoration(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
child: SizedBox(
// height: 300,
width: constraints.maxWidth,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
displayProPic(mzansiProfileProvider),
Visibility(
visible: !mzansiProfileProvider.personalHome,
child: Text(
mzansiProfileProvider.business?.Name ??
"Setup Business",
style: TextStyle(
fontWeight: FontWeight.bold,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
),
Visibility(
visible: mzansiProfileProvider.personalHome,
child: Text(
"${mzansiProfileProvider.user!.fname} ${mzansiProfileProvider.user!.lname}",
style: TextStyle(
fontWeight: FontWeight.bold,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
),
Visibility(
visible: !mzansiProfileProvider.personalHome,
child: Text(
mzansiProfileProvider.business?.type ?? "",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
),
Visibility(
visible: mzansiProfileProvider.personalHome,
child: Text(
"@${mzansiProfileProvider.user!.username}",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
),
Text(
mzansiProfileProvider.user!.type
.toUpperCase(),
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.bold,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
],
),
),
),
// ListTile(
// title: Row(
// mainAxisSize: MainAxisSize.max,
// children: [
// Icon(
// Icons.home_outlined,
// color:
// MihColors.getSecondaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// const SizedBox(width: 25.0),
// Text(
// "Home",
// style: TextStyle(
// //fontWeight: FontWeight.bold,
// color: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
// ),
// ),
// ],
// ),
// onTap: () {
// Navigator.of(context)
// .pushNamedAndRemoveUntil('/', (route) => false);
// },
// ),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
ListTile(
title: Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.policy,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
const SizedBox(width: 25.0),
Text(
"Privacy Policy",
style: TextStyle(
//fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
],
),
onTap: () {
WidgetsBinding.instance
.addPostFrameCallback((_) async {
context
.read<AboutMihProvider>()
.setToolIndex(1);
});
context.goNamed(
"aboutMih",
extra: true,
);
},
),
ListTile(
title: Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.design_services_rounded,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
const SizedBox(width: 25.0),
Text(
"Terms of Service",
style: TextStyle(
//fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
],
),
onTap: () {
WidgetsBinding.instance
.addPostFrameCallback((_) async {
context
.read<AboutMihProvider>()
.setToolIndex(2);
});
context.goNamed(
"aboutMih",
extra: true,
);
},
),
ListTile(
title: Row(
mainAxisSize: MainAxisSize.max,
children: [
Icon(
Icons.logout,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
const SizedBox(width: 25.0),
Text(
"Sign Out",
style: TextStyle(
//fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
),
],
),
onTap: () async {
await SuperTokens.signOut(
completionHandler: (error) {
print(error);
});
if (await SuperTokens.doesSessionExist() ==
false) {
resetProviders();
await Future.delayed(Duration.zero);
if (context.mounted) {
context.goNamed(
'mihHome',
);
}
}
},
),
],
),
),
],
),
Positioned(
top: 5,
right: 5,
width: 30,
height: 30,
child: InkWell(
onTap: () {
// setState(() {
// if (MzansiInnovationHub.of(context)?.theme.mode ==
// "Dark") {
// //darkm = !darkm;
// MzansiInnovationHub.of(context)!
// .changeTheme(ThemeMode.light);
// //print("Dark Mode: $darkm");
// } else {
// //darkm = !darkm;
// MzansiInnovationHub.of(context)!
// .changeTheme(ThemeMode.dark);
// //print("Dark Mode: $darkm");
// }
// // Navigator.of(context).popAndPushNamed('/',);
// });
context.goNamed("aboutMih");
},
child: Icon(
MihIcons.mihLogo,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
// IconButton(
// onPressed: () {
// setState(() {
// if (MzansiInnovationHub.of(context)?.theme.mode == "Dark") {
// //darkm = !darkm;
// MzansiInnovationHub.of(context)!.changeTheme(ThemeMode.light);
// //print("Dark Mode: $darkm");
// } else {
// //darkm = !darkm;
// MzansiInnovationHub.of(context)!.changeTheme(ThemeMode.dark);
// //print("Dark Mode: $darkm");
// }
// Navigator.of(context).popAndPushNamed('/');
// });
// },
// icon: Icon(
// Icons.light_mode,
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// size: 35,
// ),
// ),
),
],
);
},
),
),
);
},
);
}
}

View File

@@ -0,0 +1,413 @@
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_objects/user_consent.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.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_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_scack_bar.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_providers/about_mih_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_business_home.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_data_helper_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart';
import 'package:provider/provider.dart';
class MihHome extends StatefulWidget {
const MihHome({
super.key,
});
@override
State<MihHome> createState() => _MihHomeState();
}
class _MihHomeState extends State<MihHome> {
DateTime latestPrivacyPolicyDate = DateTime.parse("2024-12-01");
DateTime latestTermOfServiceDate = DateTime.parse("2024-12-01");
bool _isLoadingInitialData = true;
late final MihPersonalHome _personalHome;
late final MihBusinessHome? _businessHome;
Future<void> _loadInitialData() async {
setState(() {
_isLoadingInitialData = true;
});
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
if (mzansiProfileProvider.user == null) {
await MihDataHelperServices().loadUserDataWithBusinessesData(
mzansiProfileProvider,
);
}
_personalHome = const MihPersonalHome();
_businessHome = mzansiProfileProvider.business != null
? MihBusinessHome(isLoading: _isLoadingInitialData)
: null;
if (mounted) {
setState(() {
_isLoadingInitialData = false;
});
}
}
bool showPolicyWindow(UserConsent? userConsent) {
if (userConsent == null) {
return true;
} else {
if (userConsent.privacy_policy_accepted
.isAfter(latestPrivacyPolicyDate) &&
userConsent.terms_of_services_accepted
.isAfter(latestTermOfServiceDate)) {
return false;
} else {
return true;
}
}
}
void createOrUpdateAccpetance(MzansiProfileProvider mzansiProfileProvider) {
UserConsent? userConsent = mzansiProfileProvider.userConsent;
userConsent != null
? MihUserConsentServices()
.updateUserConsentStatus(
DateTime.now().toIso8601String(),
DateTime.now().toIso8601String(),
mzansiProfileProvider,
context,
)
.then((value) {
if (!mounted) return;
if (value == 200) {
context.goNamed("mihHome");
ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar(
child: Text("Thank you for accepting our Policies"),
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar(
child: Text("There was an error, please try again later"),
),
);
}
})
: MihUserConsentServices()
.insertUserConsentStatus(
DateTime.now().toIso8601String(),
DateTime.now().toIso8601String(),
mzansiProfileProvider,
context,
)
.then((value) {
if (value == 201) {
context.goNamed("mihHome");
ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar(
child: Text("Thank you for accepting our Policies"),
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar(
child: Text("There was an error, please try again later"),
),
);
}
});
}
Widget displayConsentWindow(MzansiProfileProvider mzansiProfileProvider) {
return Container(
color: Colors.black.withValues(alpha: 0.5),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
MihPackageWindow(
fullscreen: false,
windowTitle: null,
onWindowTapClose: null,
windowBody: Column(
children: [
Icon(
Icons.policy,
size: 150,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark",
),
),
const SizedBox(height: 10),
Text(
"Welcome to the MIH App",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark",
),
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 10),
Text(
"To keep using the MIH app, please take a moment to review and accept our Policies. Our agreements helps us keep things running smoothly and securely.",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark",
),
fontSize: 18,
fontWeight: FontWeight.normal,
),
),
const SizedBox(height: 20),
Center(
child: Wrap(
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
alignment: WrapAlignment.center,
spacing: 10,
runSpacing: 10,
children: [
MihButton(
onPressed: () {
WidgetsBinding.instance
.addPostFrameCallback((_) async {
context.read<AboutMihProvider>().setToolIndex(1);
});
context.goNamed("aboutMih",
extra: mzansiProfileProvider.personalHome);
},
buttonColor: MihColors.getOrangeColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
elevation: 10,
width: 300,
child: Text(
"Privacy Policy",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () {
WidgetsBinding.instance
.addPostFrameCallback((_) async {
context.read<AboutMihProvider>().setToolIndex(2);
});
context.goNamed("aboutMih",
extra: mzansiProfileProvider.personalHome);
},
buttonColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
elevation: 10,
width: 300,
child: Text(
"Terms of Service",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () {
DateTime now = DateTime.now();
KenLogger.success("Date Time Now: $now");
createOrUpdateAccpetance(mzansiProfileProvider);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
elevation: 10,
width: 300,
child: Text(
"Accept",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
const SizedBox(height: 10),
],
),
),
],
),
);
}
@override
void dispose() {
super.dispose();
}
@override
void initState() {
super.initState();
_loadInitialData();
}
List<String> getToolTitle() {
List<String> toolTitles = [
"Personal",
"Business",
];
return toolTitles;
}
@override
Widget build(BuildContext context) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
if (_isLoadingInitialData) {
return Scaffold(
body: Center(
child: Mihloadingcircle(),
),
);
}
// bool showConsentWindow =
// showPolicyWindow(mzansiProfileProvider.userConsent);
return Stack(
children: [
RefreshIndicator(
onRefresh: () async {
await _loadInitialData();
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: SizedBox(
height: MediaQuery.of(context).size.height,
child: MihPackage(
appActionButton: getAction(),
appTools: getTools(mzansiProfileProvider,
mzansiProfileProvider.user!.type != "personal"),
appBody: getToolBody(mzansiProfileProvider),
appToolTitles: getToolTitle(),
actionDrawer: getActionDrawer(),
selectedbodyIndex:
mzansiProfileProvider.personalHome ? 0 : 1,
onIndexChange: (newValue) {
mzansiProfileProvider.setPersonalHome(newValue == 0);
},
),
),
),
),
if (showPolicyWindow(mzansiProfileProvider.userConsent))
displayConsentWindow(mzansiProfileProvider),
],
);
},
);
}
Widget getAction() {
return Builder(builder: (context) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
ImageProvider<Object>? currentImage;
String imageKey;
if (mzansiProfileProvider.personalHome) {
currentImage = mzansiProfileProvider.userProfilePicture;
imageKey = 'user_${mzansiProfileProvider.userProfilePicUrl}';
} else {
currentImage = mzansiProfileProvider.businessProfilePicture;
imageKey =
'business_${mzansiProfileProvider.businessProfilePicUrl}';
}
return MihPackageAction(
icon: Padding(
padding: const EdgeInsets.only(left: 5.0),
child: MihCircleAvatar(
key: Key(imageKey),
imageFile: currentImage,
width: 50,
editable: false,
fileNameController: null,
userSelectedfile: null,
// frameColor: frameColor,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onChange: (_) {},
),
),
iconSize: 45,
onTap: () {
Scaffold.of(context).openDrawer();
FocusScope.of(context)
.requestFocus(FocusNode()); // Fully unfocus all fields
// FocusScope.of(context).unfocus(); // Unfocus any text fields
},
);
},
);
});
}
MIHAppDrawer getActionDrawer() {
return MIHAppDrawer();
}
MihPackageTools getTools(
MzansiProfileProvider mzansiProfileProvider, bool isBusinessUser) {
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.person)] = () {
mzansiProfileProvider.setPersonalHome(true);
};
if (isBusinessUser) {
temp[const Icon(Icons.business_center)] = () {
mzansiProfileProvider.setPersonalHome(false);
};
}
return MihPackageTools(
tools: temp,
selcetedIndex: mzansiProfileProvider.personalHome ? 0 : 1,
);
}
List<Widget> getToolBody(MzansiProfileProvider mzansiProfileProvider) {
if (mzansiProfileProvider.business == null) {
return [
_personalHome,
];
} else {
return [
_personalHome,
_businessHome!,
];
}
}
}

View File

@@ -0,0 +1,151 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.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_package.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
class MihHomeError extends StatefulWidget {
final String errorMessage;
const MihHomeError({
super.key,
required this.errorMessage,
});
@override
State<MihHomeError> createState() => _MihHomeErrorState();
}
class _MihHomeErrorState extends State<MihHomeError> {
int _selcetedIndex = 0;
@override
Widget build(BuildContext context) {
return MihPackage(
appActionButton: getErrorAction(),
appTools: getErrorTools(),
appToolTitles: ["Connection Error"],
appBody: getErrorToolBody(widget.errorMessage),
selectedbodyIndex: _selcetedIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
//print("Index: $_selcetedIndex");
},
);
}
MihPackageAction getErrorAction() {
return MihPackageAction(
icon: const Icon(Icons.refresh),
iconSize: 35,
onTap: () {
context.goNamed(
'mihHome',
extra: true,
);
},
);
}
MihPackageTools getErrorTools() {
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.power_off_outlined)] = () {
setState(() {
_selcetedIndex = 0;
});
};
return MihPackageTools(
tools: temp,
selcetedIndex: _selcetedIndex,
);
}
List<Widget> getErrorToolBody(String error) {
List<Widget> toolBodies = [
MihPackageToolBody(
borderOn: true,
bodyItem: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
"Connection Error",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 35,
fontWeight: FontWeight.bold,
),
),
Icon(
Icons.power_off_outlined,
size: 150,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
SizedBox(
width: 500,
child: Text(
"Looks like we ran into an issue getting your data.\nPlease check you internet connection and try again.",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(height: 15),
MihButton(
onPressed: () {
context.goNamed(
'mihHome',
extra: true,
);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Refresh",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
const SizedBox(height: 15),
Padding(
padding: const EdgeInsets.all(10.0),
child: SizedBox(
width: 500,
child: SelectionArea(
child: Text(
"Error: $error",
textAlign: TextAlign.left,
style: TextStyle(
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
),
),
),
],
),
)
];
return toolBodies;
}
}

View File

@@ -0,0 +1,150 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.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_icons.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_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
class MihRouteError extends StatefulWidget {
const MihRouteError({
super.key,
});
@override
State<MihRouteError> createState() => _MihRouteErrorState();
}
class _MihRouteErrorState extends State<MihRouteError> {
int _selcetedIndex = 0;
@override
Widget build(BuildContext context) {
return MihPackage(
appActionButton: getErrorAction(),
appTools: getErrorTools(),
appToolTitles: ["Invalid Path"],
appBody: getErrorToolBody(),
selectedbodyIndex: _selcetedIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
//print("Index: $_selcetedIndex");
},
);
}
MihPackageAction getErrorAction() {
return MihPackageAction(
icon: const Icon(MihIcons.mihLogo),
iconSize: 35,
onTap: () {
context.goNamed(
'mihHome',
extra: true,
);
},
);
}
MihPackageTools getErrorTools() {
Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.link_off_rounded)] = () {
setState(() {
_selcetedIndex = 0;
});
};
return MihPackageTools(
tools: temp,
selcetedIndex: _selcetedIndex,
);
}
List<Widget> getErrorToolBody() {
List<Widget> toolBodies = [
MihPackageToolBody(
borderOn: true,
bodyItem: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
"Oops! Wrong Turn.",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 35,
fontWeight: FontWeight.bold,
),
),
Icon(
Icons.link_off_rounded,
size: 150,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
SizedBox(
width: 700,
child: Text(
"It looks like you've taken a wrong turn and ended up on a package that doesn't exist within the MIH App.\n\nDon't worry, getting back is easy. Just click the button below or the MIH Logo to return to the correct path.",
textAlign: TextAlign.center,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.w500,
),
),
),
const SizedBox(height: 15),
MihButton(
onPressed: () {
context.goNamed(
'mihHome',
extra: true,
);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
width: 300,
child: Text(
"Back to MIH",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
// const SizedBox(height: 15),
// Padding(
// padding: const EdgeInsets.all(10.0),
// child: SizedBox(
// width: 500,
// child: SelectionArea(
// child: Text(
// "Error: $error",
// textAlign: TextAlign.left,
// style: TextStyle(
// color: MihColors.getRedColor(
// MzansiInnovationHub.of(context)!.theme.mode ==
// "Dark"),
// fontSize: 15,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// ),
// ),
],
),
)
];
return toolBodies;
}
}

View File

@@ -0,0 +1,293 @@
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_search_bar.dart';
import 'package:mzansi_innovation_hub/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_mih_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tiles/mih_calculator_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/package_tiles/mzansi_directory_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tiles/mzansi_business_profile_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tiles/mzansi_setup_business_profile_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_manager/package_tiles/pat_manager_tile.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MihBusinessHome extends StatefulWidget {
final bool isLoading;
const MihBusinessHome({
super.key,
required this.isLoading,
});
@override
State<MihBusinessHome> createState() => _MihBusinessHomeState();
}
class _MihBusinessHomeState extends State<MihBusinessHome>
with SingleTickerProviderStateMixin {
final TextEditingController searchController = TextEditingController();
late List<Map<String, Widget>> businessPackagesMap;
final ValueNotifier<List<Map<String, Widget>>> searchPackageName =
ValueNotifier([]);
double packageSize = 200;
// late final AnimationController _marqueeController;
// late final ScrollController _scrollController;
final FocusNode _searchFocusNode = FocusNode();
final String maintenanceMsg =
"\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly.";
// void _startMarquee() async {
// while (mounted) {
// final double maxScroll = _scrollController.position.maxScrollExtent;
// await Future.delayed(const Duration(milliseconds: 500));
// await _scrollController.animateTo(
// maxScroll,
// duration: _marqueeController.duration!,
// curve: Curves.linear,
// );
// await Future.delayed(const Duration(milliseconds: 500));
// _scrollController.jumpTo(0);
// await Future.delayed(const Duration(milliseconds: 500));
// }
// }
List<Map<String, Widget>> setNewBusinessUserPackages() {
List<Map<String, Widget>> temp = [];
temp.add({
"Setup Business": MzansiSetupBusinessProfileTile(
packageSize: packageSize,
)
});
return temp;
}
List<Map<String, Widget>> setBusinessPackages() {
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
// if (mzansiProfileProvider.user == null ||
// mzansiProfileProvider.business == null ||
// mzansiProfileProvider.businessUser == null) {
// return []; // Return empty list if data isn't ready
// }
List<Map<String, Widget>> temp = [];
if (mzansiProfileProvider.business == null && !widget.isLoading) {
temp.add({
"Setup Business": MzansiSetupBusinessProfileTile(
packageSize: packageSize,
)
});
return temp;
}
//=============== Biz Profile ===============
temp.add({
"Business Profile": MzansiBusinessProfileTile(
packageSize: packageSize,
)
});
//=============== Pat Manager ===============
temp.add({
"Patient Manager": PatManagerTile(
arguments: PatManagerArguments(
mzansiProfileProvider.user!,
false,
mzansiProfileProvider.business!,
mzansiProfileProvider.businessUser!,
),
packageSize: packageSize,
)
});
//=============== Calendar ===============
temp.add({
"Calendar": MzansiCalendarTile(
packageSize: packageSize,
)
});
//=============== Mzansi Directory ===============
temp.add({
"Mzansi Directory": MzansiDirectoryTile(
packageSize: packageSize,
)
});
//=============== Calculator ===============
temp.add({
"Calculator": MihCalculatorTile(
packageSize: packageSize,
)
});
//=============== Mzansi AI ===============
temp.add({
"Mzansi AI": MzansiAiTile(
packageSize: packageSize,
)
});
//=============== About MIH ===============
temp.add({
"About MIH": AboutMihTile(
packageSize: packageSize,
)
});
return temp;
}
EdgeInsets getPadding(double width, double height) {
if (MzansiInnovationHub.of(context)!.theme.screenType == "mobile") {
double mobilePadding = 10;
return EdgeInsets.only(
left: mobilePadding,
right: mobilePadding,
bottom: mobilePadding,
);
} else {
return EdgeInsets.only(
left: width / 13,
right: width / 13,
bottom: height / 15,
);
}
}
void searchPackage() {
if (searchController.text.isEmpty) {
searchPackageName.value = businessPackagesMap;
} else {
List<Map<String, Widget>> temp = [];
for (var item in businessPackagesMap) {
if (item.keys.first.toLowerCase().contains(searchController.text)) {
temp.add(item);
}
}
searchPackageName.value = temp;
}
}
@override
void dispose() {
super.dispose();
searchController.removeListener(searchPackage);
searchController.dispose();
// _marqueeController.dispose();
// _scrollController.dispose();
_searchFocusNode.dispose();
}
@override
void initState() {
super.initState();
searchController.addListener(searchPackage);
businessPackagesMap = setBusinessPackages();
searchPackage();
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
final double width = size.width;
final double height = size.height;
return MihPackageToolBody(
borderOn: false,
bodyItem: getBody(width, height),
);
}
Widget getBody(double width, double height) {
return Consumer2<MzansiProfileProvider, MzansiAiProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider,
MzansiAiProvider mzansiAiProvider,
Widget? child) {
return Column(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: width / 20),
child: Visibility(
visible: mzansiProfileProvider.business != null,
child: MihSearchBar(
controller: searchController,
hintText: "Ask Mzansi",
prefixIcon: Icons.search,
prefixAltIcon: MihIcons.mzansiAi,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
hintColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onPrefixIconTap: () {
mzansiAiProvider.ollamaProvider.resetChat();
if (searchController.text.isNotEmpty) {
mzansiAiProvider
.setStartUpQuestion(searchController.text);
}
context.goNamed("mzansiAi");
searchController.clear();
},
searchFocusNode: _searchFocusNode,
),
),
),
const SizedBox(height: 10),
Expanded(
child: ValueListenableBuilder(
valueListenable: searchPackageName,
builder: (context, value, child) {
List<Widget> filteredPackages = value
.where((package) => package.keys.first
.toLowerCase()
.contains(searchController.text.toLowerCase()))
.map((package) => package.values.first)
.toList();
if (filteredPackages.isNotEmpty) {
return GridView.builder(
padding: getPadding(width, height),
itemCount: filteredPackages.length,
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: packageSize,
crossAxisSpacing: 5,
),
itemBuilder: (context, index) {
return filteredPackages[index];
},
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Icon(
MihIcons.mzansiAi,
size: 165,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
const SizedBox(height: 10),
Text(
"Mzansi AI is here to help you!",
textAlign: TextAlign.center,
overflow: TextOverflow.visible,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
],
);
}
},
),
),
],
);
},
);
}
}

View File

@@ -0,0 +1,313 @@
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_package_components/Example/package_tiles/test_package_tile.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_package_components/mih_search_bar.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_ai_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_mih_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/access_review/package_tile/mih_access_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/package_tiles/mih_calculator_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/calendar/package_tiles/mzansi_calendar_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mine_sweeper/package_tiles/mih_mine_sweeper_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/package_tiles/mzansi_directory_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tiles/mzansi_profile_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tiles/mzansi_setup_profile_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/package_tiles/mih_wallet_tile.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_manager/pat_profile/package_tiles/patient_profile_tile.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
import 'package:provider/provider.dart';
class MihPersonalHome extends StatefulWidget {
const MihPersonalHome({
super.key,
});
@override
State<MihPersonalHome> createState() => _MihPersonalHomeState();
}
class _MihPersonalHomeState extends State<MihPersonalHome>
with SingleTickerProviderStateMixin {
final TextEditingController searchController = TextEditingController();
late List<Map<String, Widget>> personalPackagesMap;
final ValueNotifier<List<Map<String, Widget>>> searchPackageName =
ValueNotifier([]);
double packageSize = 200;
// late final AnimationController _marqueeController;
// late final ScrollController _scrollController;
final FocusNode _searchFocusNode = FocusNode();
final String maintenanceMsg =
"\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly.";
// void _startMarquee() async {
// while (mounted) {
// final double maxScroll = _scrollController.position.maxScrollExtent;
// await Future.delayed(const Duration(milliseconds: 500));
// await _scrollController.animateTo(
// maxScroll,
// duration: _marqueeController.duration!,
// curve: Curves.linear,
// );
// await Future.delayed(const Duration(milliseconds: 500));
// _scrollController.jumpTo(0);
// await Future.delayed(const Duration(milliseconds: 500));
// }
// }
List<Map<String, Widget>> setNerUserPersonalPackage() {
List<Map<String, Widget>> temp = [];
temp.add({
"Setup Profile": MzansiSetupProfileTile(
packageSize: packageSize,
)
});
return temp;
}
List<Map<String, Widget>> setPersonalPackagesMap() {
List<Map<String, Widget>> temp = [];
//=============== Mzansi Profile ===============
temp.add({
"Mzansi Profile": MzansiProfileTile(
packageSize: packageSize,
)
});
//=============== Mzansi Wallet ===============
temp.add({
"Mzansi Wallet": MihWalletTile(
packageSize: packageSize,
)
});
//=============== Patient Profile ===============
temp.add({
"Patient Profile": PatientProfileTile(
packageSize: packageSize,
)
});
//=============== Mzansi Directory ===============
temp.add({
"Mzansi Directory": MzansiDirectoryTile(
packageSize: packageSize,
)
});
//=============== Calendar ===============
temp.add({
"Calendar": MzansiCalendarTile(
packageSize: packageSize,
)
});
//=============== Mzansi AI ===============
temp.add({
"Mzansi AI": MzansiAiTile(
packageSize: packageSize,
)
});
//=============== Calculator ===============
temp.add({
"Calculator": MihCalculatorTile(
packageSize: packageSize,
)
});
//=============== Mine Sweeper ===============
temp.add({
"Mine Sweeper": MihMineSweeperTile(
packageSize: packageSize,
)
});
//=============== MIH Access ===============
temp.add({
"MIH Access": MihAccessTile(
packageSize: packageSize,
)
});
//=============== About MIH ===============
temp.add({
"About MIH": AboutMihTile(
packageSize: packageSize,
)
});
//=============== Dev ===============
if (AppEnviroment.getEnv() == "Dev") {
temp.add({
"test": TestPackageTile(
packageSize: packageSize,
)
});
}
return temp;
}
EdgeInsets getPadding(double width, double height) {
if (MzansiInnovationHub.of(context)!.theme.screenType == "mobile") {
double mobilePadding = 10;
return EdgeInsets.only(
left: mobilePadding,
right: mobilePadding,
bottom: mobilePadding,
);
} else {
return EdgeInsets.only(
left: width / 13,
right: width / 13,
bottom: height / 15,
);
}
}
void searchPackage() {
if (searchController.text.isEmpty) {
searchPackageName.value = personalPackagesMap;
} else {
List<Map<String, Widget>> temp = [];
for (var item in personalPackagesMap) {
if (item.keys.first.toLowerCase().contains(searchController.text)) {
temp.add(item);
}
}
searchPackageName.value = temp;
}
}
void autoNavToProfile() {
WidgetsBinding.instance.addPostFrameCallback((_) {
context.goNamed(
'mzansiProfileManage',
);
});
}
@override
void dispose() {
super.dispose();
searchController.removeListener(searchPackage);
searchController.dispose();
_searchFocusNode.dispose();
// _marqueeController.dispose();
// _scrollController.dispose();
}
@override
void initState() {
super.initState();
searchController.addListener(searchPackage);
MzansiProfileProvider profileProvider =
context.read<MzansiProfileProvider>();
if (profileProvider.user!.username == "") {
personalPackagesMap = setNerUserPersonalPackage();
autoNavToProfile();
} else {
personalPackagesMap = setPersonalPackagesMap();
}
searchPackage();
}
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.sizeOf(context);
final double width = size.width;
final double height = size.height;
return MihPackageToolBody(
borderOn: false,
bodyItem: getBody(width, height),
);
}
Widget getBody(double width, double height) {
return Consumer2<MzansiProfileProvider, MzansiAiProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
MzansiAiProvider mzansiAiProvider, Widget? child) {
return Column(
children: [
Visibility(
visible: profileProvider.user!.username != "",
child: Padding(
padding: EdgeInsets.symmetric(horizontal: width / 20),
child: MihSearchBar(
controller: searchController,
hintText: "Ask Mzansi",
prefixIcon: Icons.search,
prefixAltIcon: MihIcons.mzansiAi,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
hintColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
onPrefixIconTap: () {
mzansiAiProvider.ollamaProvider.resetChat();
if (searchController.text.isNotEmpty) {
mzansiAiProvider
.setStartUpQuestion(searchController.text);
}
context.goNamed("mzansiAi");
searchController.clear();
},
searchFocusNode: _searchFocusNode,
),
),
),
const SizedBox(height: 10),
Expanded(
child: ValueListenableBuilder(
valueListenable: searchPackageName,
builder: (context, value, child) {
List<Widget> filteredPackages = value
.where((package) => package.keys.first
.toLowerCase()
.contains(searchController.text.toLowerCase()))
.map((package) => package.values.first)
.toList();
if (filteredPackages.isNotEmpty) {
return GridView.builder(
padding: getPadding(width, height),
itemCount: filteredPackages.length,
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: packageSize,
crossAxisSpacing: 5,
),
itemBuilder: (context, index) {
return filteredPackages[index];
},
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Icon(
MihIcons.mzansiAi,
size: 165,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
const SizedBox(height: 10),
Text(
"Mzansi AI is here to help you!",
textAlign: TextAlign.center,
overflow: TextOverflow.visible,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
],
);
}
},
),
),
],
);
},
);
}
}