NEW: MIH Home & Mzansi Profile Provider Setup pt 1

This commit is contained in:
2025-10-16 10:16:18 +02:00
parent 553d22dd6b
commit d51603ff5d
28 changed files with 2687 additions and 2515 deletions

View File

@@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_authentic
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_banner_ad_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calculator_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_mine_sweeper_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_mine_sweeper_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_wallet_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -78,6 +79,9 @@ class _MzansiInnovationHubState extends State<MzansiInnovationHub> {
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => MihAuthenticationProvider(), create: (context) => MihAuthenticationProvider(),
), ),
ChangeNotifierProvider(
create: (context) => MzansiProfileProvider(),
),
ChangeNotifierProvider( ChangeNotifierProvider(
create: (context) => MzansiWalletProvider(), create: (context) => MzansiWalletProvider(),
), ),

View File

@@ -32,19 +32,8 @@ class _MihImageDisplayState extends State<MihImageDisplay> {
late ImageProvider<Object>? imagePreview; late ImageProvider<Object>? imagePreview;
ImageProvider<Object>? getImage() { ImageProvider<Object>? getImage() {
Color dark = const Color(0XFF3A4454);
if (widget.imageFile == null) { if (widget.imageFile == null) {
if (MihColors.getSecondaryColor( return null;
MzansiInnovationHub.of(context)!.theme.mode == "Dark") ==
dark) {
print("here in light icon");
return const AssetImage(
'lib/mih_components/mih_package_components/assets/images/i-dont-know-dark.png');
} else {
print("here in dark icon");
return const AssetImage(
'lib/mih_components/mih_package_components/assets/images/i-dont-know-light.png');
}
} else { } else {
return widget.imageFile; return widget.imageFile;
} }
@@ -69,10 +58,13 @@ class _MihImageDisplayState extends State<MihImageDisplay> {
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
ClipRRect( Visibility(
visible: imagePreview != null,
child: ClipRRect(
borderRadius: BorderRadius.circular(widget.width * 0.1), borderRadius: BorderRadius.circular(widget.width * 0.1),
child: Image(image: imagePreview!), child: Image(image: imagePreview!),
), ),
),
Visibility( Visibility(
visible: widget.editable, visible: widget.editable,
child: Positioned( child: Positioned(

View File

@@ -0,0 +1,14 @@
import 'package:flutter/foundation.dart';
class MihCalendarProvider extends ChangeNotifier {
int toolIndex;
MihCalendarProvider({
this.toolIndex = 0,
});
void setToolIndex(int index) {
toolIndex = index;
notifyListeners();
}
}

View File

@@ -0,0 +1,35 @@
import 'package:flutter/widgets.dart';
class MihMineSweeperProvider extends ChangeNotifier {
int toolIndex;
int rowCount;
int columnCount;
int totalMines;
MihMineSweeperProvider({
this.toolIndex = 0,
this.rowCount = 10,
this.columnCount = 10,
this.totalMines = 15,
});
void setToolIndex(int index) {
toolIndex = index;
notifyListeners();
}
void setRowCount(int rowCount) {
this.rowCount = rowCount;
notifyListeners();
}
void setCoulmnCount(int columnCount) {
this.columnCount = columnCount;
notifyListeners();
}
void setTotalMines(int totalMines) {
this.totalMines = totalMines;
notifyListeners();
}
}

View File

@@ -0,0 +1,102 @@
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/user_consent.dart';
class MzansiProfileProvider extends ChangeNotifier {
bool personalHome;
int personalIndex;
int businessIndex;
AppUser? user;
String? userProfilePicUrl;
ImageProvider<Object>? userProfilePicture;
Business? business;
String? businessProfilePicUrl;
ImageProvider<Object>? businessProfilePicture;
BusinessUser? businessUser;
String? businessUserSignatureUrl;
ImageProvider<Object>? businessUserSignature;
UserConsent? userConsent;
List<BusinessEmployee>? employeeList;
MzansiProfileProvider({
this.personalHome = true,
this.personalIndex = 0,
this.businessIndex = 0,
});
void reset() {
personalHome = true;
personalIndex = 0;
businessIndex = 0;
user = null;
userProfilePicUrl = null;
userProfilePicture = null;
business = null;
businessProfilePicUrl = null;
businessProfilePicture = null;
businessUser = null;
businessUserSignatureUrl = null;
businessUserSignature = null;
userConsent = null;
}
void setPersonalIndex(int index) {
personalIndex = index;
notifyListeners();
}
void setBusinessIndex(int index) {
businessIndex = index;
notifyListeners();
}
void setUser({
required AppUser newUser,
}) {
user = newUser;
notifyListeners();
}
void setUserProfilePicUrl(String url) {
userProfilePicUrl = url;
userProfilePicture = url.isNotEmpty ? NetworkImage(url) : null;
notifyListeners();
}
void setBusiness({
Business? newBusiness,
}) {
business = newBusiness;
notifyListeners();
}
void setBusinessProfilePicUrl(String url) {
businessProfilePicUrl = url;
businessProfilePicture = url.isNotEmpty ? NetworkImage(url) : null;
notifyListeners();
}
void setBusinessUser({required BusinessUser newBusinessUser}) {
businessUser = newBusinessUser;
notifyListeners();
}
void setBusinessUserSignatureUrl(String url) {
businessUserSignatureUrl = url;
businessUserSignature = url.isNotEmpty ? NetworkImage(url) : null;
notifyListeners();
}
void setUserConsent(UserConsent? newUserConsent) {
userConsent = newUserConsent;
notifyListeners();
}
void setEmployeeList({required List<BusinessEmployee> employeeList}) {
this.employeeList = employeeList;
notifyListeners();
}
}

View File

@@ -37,7 +37,7 @@ class MihColors {
if (darkMode == true) { if (darkMode == true) {
return const Color(0xff8ae290); return const Color(0xff8ae290);
} else { } else {
return const Color(0xffB0F2B4); return const Color(0xFF41B349);
} }
} }
@@ -63,7 +63,7 @@ class MihColors {
return const Color(0xffd69d7d); return const Color(0xffd69d7d);
} else { } else {
// Add a different shade of pink for light mode // Add a different shade of pink for light mode
return const Color(0xffd69d7d); return const Color(0xFFBD7145);
} }
} }
@@ -81,7 +81,7 @@ class MihColors {
return const Color(0xff6e7dcc); return const Color(0xff6e7dcc);
} else { } else {
// Add a different shade of pink for light mode // Add a different shade of pink for light mode
return const Color(0xff6e7dcc); return const Color(0xFF5567C0);
} }
} }
@@ -90,7 +90,7 @@ class MihColors {
return const Color(0xffb682e7); return const Color(0xffb682e7);
} else { } else {
// Add a different shade of pink for light mode // Add a different shade of pink for light mode
return const Color(0xffb682e7); return const Color(0xFF9857D4);
} }
} }
} }

View File

@@ -4,6 +4,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_print_prevew
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/Example/package_test.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/Example/package_test.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/about_mih.dart'; import 'package:mzansi_innovation_hub/mih_packages/about_mih/about_mih.dart';
import 'package:mzansi_innovation_hub/mih_packages/access_review/mih_access.dart'; import 'package:mzansi_innovation_hub/mih_packages/access_review/mih_access.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/mih_calculator.dart'; import 'package:mzansi_innovation_hub/mih_packages/calculator/mih_calculator.dart';
@@ -29,6 +30,7 @@ import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/a
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_edit.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_edit.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_profile.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_profile.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/supertokens.dart';
class MihGoRouterPaths { class MihGoRouterPaths {
@@ -133,16 +135,8 @@ class MihGoRouter {
path: MihGoRouterPaths.mihHome, path: MihGoRouterPaths.mihHome,
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: mihHome"); KenLogger.success("MihGoRouter: mihHome");
if (state.extra != null) {
final bool personalSelected = state.extra as bool;
return MihHome( return MihHome(
key: UniqueKey(), key: UniqueKey(),
personalSelected: personalSelected,
);
}
return MihHome(
key: UniqueKey(),
personalSelected: true,
); );
}, },
), ),
@@ -166,15 +160,13 @@ class MihGoRouter {
path: MihGoRouterPaths.mzansiProfileManage, path: MihGoRouterPaths.mzansiProfileManage,
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: mzansiProfileManage"); KenLogger.success("MihGoRouter: mzansiProfileManage");
final AppProfileUpdateArguments? args = if (context.watch<MzansiProfileProvider>().user == null) {
state.extra as AppProfileUpdateArguments?;
if (args == null) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome); context.go(MihGoRouterPaths.mihHome);
}); });
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return MzansiProfile(arguments: args); return MzansiProfile();
}, },
), ),
GoRoute( GoRoute(
@@ -198,8 +190,7 @@ class MihGoRouter {
path: MihGoRouterPaths.businessProfileManage, path: MihGoRouterPaths.businessProfileManage,
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
KenLogger.success("MihGoRouter: businessProfileManage"); KenLogger.success("MihGoRouter: businessProfileManage");
final BusinessArguments? args = state.extra as BusinessArguments?; if (context.watch<MzansiProfileProvider>().business == null) {
if (args == null) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
context.go(MihGoRouterPaths.mihHome); context.go(MihGoRouterPaths.mihHome);
}); });
@@ -207,7 +198,6 @@ class MihGoRouter {
} }
return MzansiBusinessProfile( return MzansiBusinessProfile(
key: UniqueKey(), key: UniqueKey(),
arguments: args,
); );
}, },
), ),

View File

@@ -28,10 +28,6 @@ class _MihCalculatorTileState extends State<MihCalculatorTile> {
"mihCalculator", "mihCalculator",
extra: widget.personalSelected, extra: widget.personalSelected,
); );
// Navigator.of(context).pushNamed(
// '/calculator',
// arguments: widget.personalSelected,
// );
}, },
appName: "Calculator", appName: "Calculator",
appIcon: Icon( appIcon: Icon(

View File

@@ -3,8 +3,10 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mih_calendar_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/calendar/package_tools/appointments.dart'; import 'package:mzansi_innovation_hub/mih_packages/calendar/package_tools/appointments.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MzansiCalendar extends StatefulWidget { class MzansiCalendar extends StatefulWidget {
final CalendarArguments arguments; final CalendarArguments arguments;
@@ -18,8 +20,6 @@ class MzansiCalendar extends StatefulWidget {
} }
class _MzansiCalendarState extends State<MzansiCalendar> { class _MzansiCalendarState extends State<MzansiCalendar> {
int _selcetedIndex = 0;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MihPackage( return MihPackage(
@@ -27,12 +27,9 @@ class _MzansiCalendarState extends State<MzansiCalendar> {
appTools: getTools(), appTools: getTools(),
appBody: getToolBody(), appBody: getToolBody(),
appToolTitles: getToolTitle(), appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex, selectedbodyIndex: context.watch<MihCalendarProvider>().toolIndex,
onIndexChange: (newValue) { onIndexChange: (newIndex) {
setState(() { context.read<MihCalendarProvider>().setToolIndex(newIndex);
_selcetedIndex = newValue;
});
print("Index: $_selcetedIndex");
}, },
); );
} }
@@ -55,14 +52,12 @@ class _MzansiCalendarState extends State<MzansiCalendar> {
MihPackageTools getTools() { MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {}; Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.calendar_month)] = () { temp[const Icon(Icons.calendar_month)] = () {
setState(() { context.read<MihCalendarProvider>().setToolIndex(0);
_selcetedIndex = 0;
});
}; };
return MihPackageTools( return MihPackageTools(
tools: temp, tools: temp,
selcetedIndex: _selcetedIndex, selcetedIndex: context.watch<MihCalendarProvider>().toolIndex,
); );
} }

View File

@@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/about_mih_provider.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/about_mih_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../main.dart'; import '../../../main.dart';
@@ -78,6 +79,9 @@ class _MIHAppDrawerState extends State<MIHAppDrawer> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// precacheImage( // precacheImage(
// MzansiInnovationHub.of(context)!.theme.logoImage().image, context); // MzansiInnovationHub.of(context)!.theme.logoImage().image, context);
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return SafeArea( return SafeArea(
child: Drawer( child: Drawer(
//backgroundColor: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"), //backgroundColor: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
@@ -286,6 +290,7 @@ class _MIHAppDrawerState extends State<MIHAppDrawer> {
}); });
if (await SuperTokens.doesSessionExist() == if (await SuperTokens.doesSessionExist() ==
false) { false) {
mzansiProfileProvider.reset();
context.goNamed( context.goNamed(
'mihHome', 'mihHome',
extra: true, extra: true,
@@ -366,5 +371,7 @@ class _MIHAppDrawerState extends State<MIHAppDrawer> {
), ),
), ),
); );
},
);
} }
} }

View File

@@ -1,7 +1,8 @@
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:ken_logger/ken_logger.dart'; import 'package:ken_logger/ken_logger.dart';
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/user_consent.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart';
@@ -13,22 +14,24 @@ import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_scack_bar.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_scack_bar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/about_mih_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/mih_home_error.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_business_home.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/package_tools/mih_personal_home.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_service_calls.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_my_business_user_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_consent_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart';
import 'package:provider/provider.dart';
// ignore: must_be_immutable
class MihHome extends StatefulWidget { class MihHome extends StatefulWidget {
final bool personalSelected;
const MihHome({ const MihHome({
super.key, super.key,
required this.personalSelected,
}); });
@override @override
@@ -38,12 +41,49 @@ class MihHome extends StatefulWidget {
class _MihHomeState extends State<MihHome> { class _MihHomeState extends State<MihHome> {
final proPicController = TextEditingController(); final proPicController = TextEditingController();
late int _selcetedIndex; late int _selcetedIndex;
late bool _personalSelected; late bool _personalHome;
late Future<HomeArguments> profileData;
late Future<UserConsent?> futureUserConsent;
bool showUserConsent = false;
DateTime latestPrivacyPolicyDate = DateTime.parse("2024-12-01"); DateTime latestPrivacyPolicyDate = DateTime.parse("2024-12-01");
DateTime latestTermOfServiceDate = DateTime.parse("2024-12-01"); DateTime latestTermOfServiceDate = DateTime.parse("2024-12-01");
bool _isLoadingInitialData = true;
Future<void> _loadInitialData() async {
// Note: getUserData sets user and userProfilePicUrl in the provider
await getUserData();
// Note: getUserConsentStatus sets userConsent in the provider
await getUserConsentStatus();
await getBusinessData();
// 2. Set state after all data is loaded
if (mounted) {
setState(() {
_isLoadingInitialData = false;
});
}
}
Future<void> getBusinessData() async {
Business? business = context.read<MzansiProfileProvider>().business;
AppUser? user = context.read<MzansiProfileProvider>().user;
String logoUrl;
String signatureUrl;
if (business == null && user!.type == "business") {
// Get Business
await MihBusinessDetailsServices().getBusinessDetailsByUser(context);
logoUrl = await MihFileApi.getMinioFileUrl(
context.read<MzansiProfileProvider>().business!.logo_path,
context,
);
context.read<MzansiProfileProvider>().setBusinessProfilePicUrl(logoUrl);
// Get Business User
await MihMyBusinessUserServices().getBusinessUser(context);
signatureUrl = await MihFileApi.getMinioFileUrl(
context.read<MzansiProfileProvider>().businessUser!.sig_path,
context,
);
context
.read<MzansiProfileProvider>()
.setBusinessUserSignatureUrl(signatureUrl);
}
}
bool showPolicyWindow(UserConsent? userConsent) { bool showPolicyWindow(UserConsent? userConsent) {
if (userConsent == null) { if (userConsent == null) {
@@ -60,20 +100,19 @@ class _MihHomeState extends State<MihHome> {
} }
} }
void createOrUpdateAccpetance(UserConsent? userConsent, String app_id) { void createOrUpdateAccpetance(MzansiProfileProvider mzansiProfileProvider) {
UserConsent? userConsent = mzansiProfileProvider.userConsent;
userConsent != null userConsent != null
? MihUserConsentServices() ? MihUserConsentServices()
.updateUserConsentStatus( .updateUserConsentStatus(
app_id,
DateTime.now().toIso8601String(), DateTime.now().toIso8601String(),
DateTime.now().toIso8601String(), DateTime.now().toIso8601String(),
mzansiProfileProvider,
context,
) )
.then((value) { .then((value) {
if (value == 200) { if (value == 200) {
// setState(() { context.goNamed("mihHome");
// showUserConsent = false;
// });
context.goNamed("mihHome", extra: false);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar( MihSnackBar(
child: Text("Thank you for accepting our Policies"), child: Text("Thank you for accepting our Policies"),
@@ -89,16 +128,14 @@ class _MihHomeState extends State<MihHome> {
}) })
: MihUserConsentServices() : MihUserConsentServices()
.insertUserConsentStatus( .insertUserConsentStatus(
app_id,
DateTime.now().toIso8601String(), DateTime.now().toIso8601String(),
DateTime.now().toIso8601String(), DateTime.now().toIso8601String(),
mzansiProfileProvider,
context,
) )
.then((value) { .then((value) {
if (value == 201) { if (value == 201) {
// setState(() { context.goNamed("mihHome");
// showUserConsent = false;
// });
context.goNamed("mihHome", extra: false);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
MihSnackBar( MihSnackBar(
child: Text("Thank you for accepting our Policies"), child: Text("Thank you for accepting our Policies"),
@@ -114,6 +151,22 @@ class _MihHomeState extends State<MihHome> {
}); });
} }
Future<void> getUserData() async {
String url;
await MihUserServices().getUserDetails(
context,
);
url = await MihFileApi.getMinioFileUrl(
context.read<MzansiProfileProvider>().user!.pro_pic_path,
context,
);
context.read<MzansiProfileProvider>().setUserProfilePicUrl(url);
}
Future<void> getUserConsentStatus() async {
await MihUserConsentServices().getUserConsentStatus(context);
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@@ -122,18 +175,15 @@ class _MihHomeState extends State<MihHome> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
profileData = MIHApiCalls().getProfile(10, context); WidgetsBinding.instance.addPostFrameCallback((_) async {
futureUserConsent = MihUserConsentServices().getUserConsentStatus(); _loadInitialData();
if (widget.personalSelected == true) { });
setState(() { if (context.read<MzansiProfileProvider>().personalHome == true) {
_selcetedIndex = 0; _selcetedIndex = 0;
_personalSelected = true; _personalHome = true;
});
} else { } else {
setState(() {
_selcetedIndex = 1; _selcetedIndex = 1;
_personalSelected = false; _personalHome = false;
});
} }
} }
@@ -147,64 +197,45 @@ class _MihHomeState extends State<MihHome> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder( return Consumer<MzansiProfileProvider>(
future: profileData, builder: (BuildContext context,
builder: (context, asyncSnapshot) { MzansiProfileProvider mzansiProfileProvider, Widget? child) {
if (asyncSnapshot.connectionState == ConnectionState.waiting) { if (_isLoadingInitialData) {
return Scaffold( return Scaffold(
body: const Mihloadingcircle( body: Center(
// message: "Fetching your Data...", child: Mihloadingcircle(),
), ),
); );
} else if (asyncSnapshot.connectionState == ConnectionState.done && }
asyncSnapshot.hasData) { // bool showConsentWindow =
// showPolicyWindow(mzansiProfileProvider.userConsent);
return Stack( return Stack(
children: [ children: [
MihPackage( MihPackage(
appActionButton: getAction(asyncSnapshot.data!.profilePicUrl), appActionButton:
appTools: getTools( getAction(mzansiProfileProvider.userProfilePicUrl as String),
asyncSnapshot.data!.signedInUser.type != "personal"), appTools:
appBody: getToolBody(asyncSnapshot.data!), getTools(mzansiProfileProvider.user!.type != "personal"),
appBody: getToolBody(),
appToolTitles: getToolTitle(), appToolTitles: getToolTitle(),
actionDrawer: getActionDrawer( actionDrawer: getActionDrawer(),
asyncSnapshot.data!.signedInUser,
asyncSnapshot.data!.profilePicUrl,
),
selectedbodyIndex: _selcetedIndex, selectedbodyIndex: _selcetedIndex,
onIndexChange: (newValue) { onIndexChange: (newValue) {
if (_selcetedIndex == 0) { if (_selcetedIndex == 0) {
setState(() { setState(() {
_selcetedIndex = newValue; _selcetedIndex = newValue;
_personalSelected = true; _personalHome = true;
}); });
} else { } else {
setState(() { setState(() {
_selcetedIndex = newValue; _selcetedIndex = newValue;
_personalSelected = false; _personalHome = false;
}); });
} }
}, },
), ),
FutureBuilder( Visibility(
future: futureUserConsent, visible: showPolicyWindow(mzansiProfileProvider.userConsent),
builder: (context, asyncSnapshotUserConsent) {
if (asyncSnapshotUserConsent.connectionState ==
ConnectionState.waiting) {
showUserConsent = false;
} else if (asyncSnapshotUserConsent.connectionState ==
ConnectionState.done &&
asyncSnapshotUserConsent.hasData) {
showUserConsent =
showPolicyWindow(asyncSnapshotUserConsent.data);
} else if (asyncSnapshotUserConsent.connectionState ==
ConnectionState.done &&
!asyncSnapshotUserConsent.hasData) {
showUserConsent = true;
} else {
showUserConsent = false;
}
return Visibility(
visible: showUserConsent,
child: Container( child: Container(
color: Colors.black.withValues(alpha: 0.5), color: Colors.black.withValues(alpha: 0.5),
child: Column( child: Column(
@@ -213,8 +244,7 @@ class _MihHomeState extends State<MihHome> {
children: [ children: [
MihPackageWindow( MihPackageWindow(
fullscreen: false, fullscreen: false,
windowTitle: windowTitle: "Privacy Policy & Terms Of Service Alert!",
"Privacy Policy & Terms Of Service Alert!",
onWindowTapClose: () { onWindowTapClose: () {
showDialog( showDialog(
context: context, context: context,
@@ -247,9 +277,7 @@ class _MihHomeState extends State<MihHome> {
), ),
), ),
alertColour: MihColors.getRedColor( alertColour: MihColors.getRedColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark", "Dark",
), ),
); );
@@ -261,9 +289,7 @@ class _MihHomeState extends State<MihHome> {
Icons.policy, Icons.policy,
size: 150, size: 150,
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark", "Dark",
), ),
), ),
@@ -273,9 +299,7 @@ class _MihHomeState extends State<MihHome> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark", "Dark",
), ),
fontSize: 30, fontSize: 30,
@@ -288,9 +312,7 @@ class _MihHomeState extends State<MihHome> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!.theme.mode ==
.theme
.mode ==
"Dark", "Dark",
), ),
fontSize: 15, fontSize: 15,
@@ -306,13 +328,15 @@ class _MihHomeState extends State<MihHome> {
children: [ children: [
MihButton( MihButton(
onPressed: () { onPressed: () {
context.goNamed( WidgetsBinding.instance
"aboutMih", .addPostFrameCallback((_) async {
extra: AboutArguments( context
widget.personalSelected, .read<AboutMihProvider>()
1, .setToolIndex(1);
), });
); context.goNamed("aboutMih",
extra:
mzansiProfileProvider.personalHome);
}, },
buttonColor: MihColors.getOrangeColor( buttonColor: MihColors.getOrangeColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!
@@ -325,8 +349,7 @@ class _MihHomeState extends State<MihHome> {
"Privacy Policy", "Privacy Policy",
style: TextStyle( style: TextStyle(
color: MihColors.getPrimaryColor( color: MihColors.getPrimaryColor(
MzansiInnovationHub.of( MzansiInnovationHub.of(context)!
context)!
.theme .theme
.mode == .mode ==
"Dark"), "Dark"),
@@ -337,13 +360,15 @@ class _MihHomeState extends State<MihHome> {
), ),
MihButton( MihButton(
onPressed: () { onPressed: () {
context.goNamed( WidgetsBinding.instance
"aboutMih", .addPostFrameCallback((_) async {
extra: AboutArguments( context
widget.personalSelected, .read<AboutMihProvider>()
2, .setToolIndex(2);
), });
); context.goNamed("aboutMih",
extra:
mzansiProfileProvider.personalHome);
}, },
buttonColor: MihColors.getYellowColor( buttonColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!
@@ -356,8 +381,7 @@ class _MihHomeState extends State<MihHome> {
"Terms of Service", "Terms of Service",
style: TextStyle( style: TextStyle(
color: MihColors.getPrimaryColor( color: MihColors.getPrimaryColor(
MzansiInnovationHub.of( MzansiInnovationHub.of(context)!
context)!
.theme .theme
.mode == .mode ==
"Dark"), "Dark"),
@@ -369,13 +393,9 @@ class _MihHomeState extends State<MihHome> {
MihButton( MihButton(
onPressed: () { onPressed: () {
DateTime now = DateTime.now(); DateTime now = DateTime.now();
KenLogger.success( KenLogger.success("Date Time Now: $now");
"Date Time Now: $now");
createOrUpdateAccpetance( createOrUpdateAccpetance(
asyncSnapshotUserConsent.data, mzansiProfileProvider);
asyncSnapshot
.data!.signedInUser.app_id,
);
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)! MzansiInnovationHub.of(context)!
@@ -388,8 +408,7 @@ class _MihHomeState extends State<MihHome> {
"Accept", "Accept",
style: TextStyle( style: TextStyle(
color: MihColors.getPrimaryColor( color: MihColors.getPrimaryColor(
MzansiInnovationHub.of( MzansiInnovationHub.of(context)!
context)!
.theme .theme
.mode == .mode ==
"Dark"), "Dark"),
@@ -408,17 +427,9 @@ class _MihHomeState extends State<MihHome> {
], ],
), ),
), ),
); ),
}),
], ],
); );
} else {
return MihHomeError(
errorMessage: asyncSnapshot.hasError
? asyncSnapshot.error.toString()
: "An unknown error occurred",
);
}
}, },
); );
} }
@@ -464,7 +475,11 @@ class _MihHomeState extends State<MihHome> {
}); });
} }
MIHAppDrawer getActionDrawer(AppUser signedInUser, String proPicUrl) { MIHAppDrawer getActionDrawer() {
AppUser signedInUser =
context.watch<MzansiProfileProvider>().user as AppUser;
String proPicUrl =
context.watch<MzansiProfileProvider>().userProfilePicUrl ?? "";
return MIHAppDrawer( return MIHAppDrawer(
signedInUser: signedInUser, signedInUser: signedInUser,
propicFile: proPicUrl != "" ? NetworkImage(proPicUrl) : null, propicFile: proPicUrl != "" ? NetworkImage(proPicUrl) : null,
@@ -476,14 +491,14 @@ class _MihHomeState extends State<MihHome> {
temp[const Icon(Icons.person)] = () { temp[const Icon(Icons.person)] = () {
setState(() { setState(() {
_selcetedIndex = 0; _selcetedIndex = 0;
_personalSelected = true; _personalHome = true;
}); });
}; };
if (isBusinessUser) { if (isBusinessUser) {
temp[const Icon(Icons.business_center)] = () { temp[const Icon(Icons.business_center)] = () {
setState(() { setState(() {
_selcetedIndex = 1; _selcetedIndex = 1;
_personalSelected = false; _personalHome = false;
}); });
}; };
} }
@@ -493,29 +508,35 @@ class _MihHomeState extends State<MihHome> {
); );
} }
List<Widget> getToolBody(HomeArguments profData) { List<Widget> getToolBody() {
List<Widget> toolBodies = []; List<Widget> toolBodies = [];
AppUser? user = context.watch<MzansiProfileProvider>().user;
Business? business = context.watch<MzansiProfileProvider>().business;
BusinessUser? businessUser =
context.watch<MzansiProfileProvider>().businessUser;
String userProfilePictureUrl =
context.watch<MzansiProfileProvider>().userProfilePicUrl ?? "";
toolBodies.add( toolBodies.add(
MihPersonalHome( MihPersonalHome(
signedInUser: profData.signedInUser, signedInUser: user!,
personalSelected: _personalSelected, personalSelected: _personalHome,
business: profData.business, business: business,
businessUser: profData.businessUser, businessUser: businessUser,
propicFile: profData.profilePicUrl != "" propicFile: userProfilePictureUrl != ""
? NetworkImage(profData.profilePicUrl) ? NetworkImage(userProfilePictureUrl)
: null, : null,
isDevActive: AppEnviroment.getEnv() == "Dev", isDevActive: AppEnviroment.getEnv() == "Dev",
isUserNew: profData.signedInUser.username == "", isUserNew: user.username == "",
), ),
); );
if (profData.signedInUser.type != "personal") { if (user.type != "personal") {
toolBodies.add( toolBodies.add(
MihBusinessHome( MihBusinessHome(
signedInUser: profData.signedInUser, signedInUser: user,
personalSelected: _personalSelected, personalSelected: _personalHome,
businessUser: profData.businessUser, businessUser: businessUser,
business: profData.business, business: business,
isBusinessUserNew: profData.businessUser == null, isBusinessUserNew: businessUser == null,
), ),
); );
} }

View File

@@ -14,6 +14,7 @@ import 'package:mzansi_innovation_hub/mih_packages/about_mih/package_tile/about_
import 'package:mzansi_innovation_hub/mih_packages/access_review/package_tile/mih_access_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/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/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_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_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_profile_tile.dart';
@@ -153,6 +154,13 @@ class _MihPersonalHomeState extends State<MihPersonalHome>
packageSize: packageSize, packageSize: packageSize,
) )
}); });
//=============== Mine Sweeper ===============
temp.add({
"Mine Sweeper": MihMineSweeperTile(
personalSelected: widget.personalSelected,
packageSize: packageSize,
)
});
//=============== MIH Access =============== //=============== MIH Access ===============
temp.add({ temp.add({
"MIH Access": MihAccessTile( "MIH Access": MihAccessTile(

View File

@@ -4,6 +4,7 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.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_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
@@ -16,19 +17,17 @@ import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_del
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
class BuildEmployeeList extends StatefulWidget { class BuildEmployeeList extends StatefulWidget {
final List<BusinessEmployee> employees; final List<BusinessEmployee> employees;
final BusinessArguments arguments;
const BuildEmployeeList({ const BuildEmployeeList({
super.key, super.key,
required this.employees, required this.employees,
required this.arguments,
}); });
@override @override
@@ -369,6 +368,9 @@ class _BuildEmployeeListState extends State<BuildEmployeeList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width; double screenWidth = MediaQuery.of(context).size.width;
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return ListView.separated( return ListView.separated(
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
@@ -383,7 +385,7 @@ class _BuildEmployeeListState extends State<BuildEmployeeList> {
//final patient = widget.patients[index].id_no.contains(widget.searchString); //final patient = widget.patients[index].id_no.contains(widget.searchString);
//print(index); //print(index);
var isMe = ""; var isMe = "";
if (widget.arguments.signedInUser.app_id == if (mzansiProfileProvider.user!.app_id ==
widget.employees[index].app_id) { widget.employees[index].app_id) {
isMe = "(You)"; isMe = "(You)";
} }
@@ -403,5 +405,7 @@ class _BuildEmployeeListState extends State<BuildEmployeeList> {
); );
}, },
); );
},
);
} }
} }

View File

@@ -0,0 +1,705 @@
import 'package:country_code_picker/country_code_picker.dart';
import 'package:file_picker/file_picker.dart';
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_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_location_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:provider/provider.dart';
class MihUpdateBusinessDetailsWindow extends StatefulWidget {
final double width;
const MihUpdateBusinessDetailsWindow({
super.key,
required this.width,
});
@override
State<MihUpdateBusinessDetailsWindow> createState() =>
_MihUpdateBusinessDetailsWindowState();
}
class _MihUpdateBusinessDetailsWindowState
extends State<MihUpdateBusinessDetailsWindow> {
final _formKey = GlobalKey<FormState>();
PlatformFile? newSelectedLogoPic;
final fileNameController = TextEditingController();
final regController = TextEditingController();
final nameController = TextEditingController();
final typeController = TextEditingController();
final practiceNoController = TextEditingController();
final vatNoController = TextEditingController();
final countryCodeController = TextEditingController();
final contactController = TextEditingController();
final emailController = TextEditingController();
final locationController = TextEditingController();
final websiteController = TextEditingController();
final ratingController = TextEditingController();
final missionVisionController = TextEditingController();
final ValueNotifier<int> _counter = ValueNotifier<int>(0);
late String env;
void setContactNumberControllers(
MzansiProfileProvider mzansiProfileProvider) {
if (mzansiProfileProvider.business!.contact_no[0] == "+") {
List<String> contactDetails =
mzansiProfileProvider.business!.contact_no.split("-");
setState(() {
countryCodeController.text = contactDetails[0];
contactController.text = contactDetails[1];
});
} else {
setState(() {
countryCodeController.text = "+27";
contactController.text = mzansiProfileProvider.business!.contact_no;
});
}
}
void setControllers() {
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
setState(() {
fileNameController.text =
mzansiProfileProvider.business!.logo_path.split("/").last;
regController.text = mzansiProfileProvider.business!.registration_no;
nameController.text = mzansiProfileProvider.business!.Name;
typeController.text = mzansiProfileProvider.business!.type;
practiceNoController.text = mzansiProfileProvider.business!.practice_no;
vatNoController.text = mzansiProfileProvider.business!.vat_no;
emailController.text = mzansiProfileProvider.business!.bus_email;
locationController.text = mzansiProfileProvider.business!.gps_location;
websiteController.text = mzansiProfileProvider.business!.website;
ratingController.text = mzansiProfileProvider.business!.rating;
missionVisionController.text =
mzansiProfileProvider.business!.mission_vision;
});
setContactNumberControllers(mzansiProfileProvider);
if (AppEnviroment.getEnv() == "Prod") {
env = "Prod";
} else {
env = "Dev";
}
}
Color getMissionVisionLimitColor(int limit) {
if (_counter.value <= limit) {
return MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
} else {
return MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
}
}
void _updateMissionVisionCounter() {
// New function name
// No need for setState since you are using a ValueNotifier for _counter
_counter.value = missionVisionController.text.characters.length;
}
String getNumberWithCountryCode() {
String numberWithoutBeginingZero = "";
if (contactController.text[0] == "0") {
numberWithoutBeginingZero = contactController.text
.replaceAll(" ", "")
.substring(1, contactController.text.length);
} else {
numberWithoutBeginingZero = contactController.text.replaceAll("-", " ");
}
return "${countryCodeController.text}-$numberWithoutBeginingZero";
}
bool isFormFilled() {
if (typeController.text.isEmpty) {
return false;
} else {
return true;
}
}
void successPopUp(String message, bool stayOnPersonalSide) {
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.check_circle_outline_rounded,
size: 150,
color: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Successfully Updated Profile",
alertBody: Column(
children: [
Text(
message,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
elevation: 10,
width: 300,
child: Text(
"Dismiss",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
)
],
),
alertColour: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
// return MIHSuccessMessage(
// successType: "Success",
// successMessage: message,
// );
},
);
}
Future<bool> uploadFile(MzansiProfileProvider mzansiProfileProvider) async {
if (newSelectedLogoPic != null) {
int uploadStatusCode = 0;
uploadStatusCode = await MihFileApi.uploadFile(
mzansiProfileProvider.business!.business_id,
env,
"business_files",
newSelectedLogoPic!,
context,
);
if (uploadStatusCode == 200) {
int deleteStatusCode = 0;
deleteStatusCode = await MihFileApi.deleteFile(
mzansiProfileProvider.business!.logo_path.split("/").first,
env,
"business_files",
mzansiProfileProvider.business!.logo_path.split("/").last,
context,
);
if (deleteStatusCode == 200) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return true; // No file selected, so no upload needed
}
}
Future<void> submitForm(MzansiProfileProvider mzansiProfileProvider) async {
KenLogger.success("Start Submit Form");
if (isFormFilled()) {
KenLogger.success("Form Filled");
KenLogger.success("Start File Upload");
bool successfullyUploadedFile = await uploadFile(mzansiProfileProvider);
KenLogger.success(
"File Upload Complete: outcome $successfullyUploadedFile");
if (!mounted) return;
KenLogger.success("is mounted");
if (successfullyUploadedFile) {
KenLogger.success("Start Details Update");
int statusCode = 0;
statusCode = await MihBusinessDetailsServices().updateBusinessDetailsV2(
mzansiProfileProvider.business!.business_id,
nameController.text,
typeController.text,
regController.text,
practiceNoController.text,
vatNoController.text,
emailController.text,
getNumberWithCountryCode(),
// contactController.text,
locationController.text,
fileNameController.text,
websiteController.text,
ratingController.text.isEmpty ? "0" : ratingController.text,
missionVisionController.text,
mzansiProfileProvider,
context,
);
KenLogger.success("Details Update Complete: status code $statusCode");
if (!mounted) return;
KenLogger.success("is mounted");
if (statusCode == 200) {
KenLogger.success("Start Success Message");
//You left of here
String message = "Your information has been updated successfully!";
context.pop();
successPopUp(message, false);
// File uploaded successfully
} else {
context.pop();
// File upload failed
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.warning_rounded,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Error Updating Business Details",
alertBody: Column(
children: [
Text(
"An error occurred while updating the business details. Please check internet connection and try again.",
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
],
),
alertColour: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
},
);
}
} else {
context.pop();
if (!mounted) return;
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Internet Connection");
},
);
}
} else {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Input Error");
},
);
}
}
@override
void initState() {
super.initState();
setControllers();
missionVisionController.addListener(_updateMissionVisionCounter);
}
@override
Widget build(BuildContext context) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return MihPackageWindow(
fullscreen: false,
windowTitle: 'Edit Profile',
onWindowTapClose: () {
context.pop();
},
windowBody: MihSingleChildScroll(
child: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: widget.width * 0.05)
: EdgeInsets.symmetric(horizontal: widget.width * 0),
child: Column(
children: [
MihForm(
formKey: _formKey,
formFields: [
Center(
child: MihCircleAvatar(
imageFile: newSelectedLogoPic != null
? MemoryImage(newSelectedLogoPic!.bytes!)
: mzansiProfileProvider.businessProfilePicture,
width: 150,
editable: true,
fileNameController: fileNameController,
userSelectedfile: newSelectedLogoPic,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (selectedfile) {
setState(() {
newSelectedLogoPic = selectedfile;
});
},
),
),
Visibility(
visible: false,
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fileNameController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "Selected File Name",
),
),
const SizedBox(height: 20),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: nameController,
multiLineInput: false,
requiredText: true,
hintText: "Business Name",
validator: (value) {
return MihValidationServices().isEmpty(value);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: typeController,
multiLineInput: false,
requiredText: true,
hintText: "Business Type",
validator: (value) {
return MihValidationServices()
.validateNoSpecialChars(value);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: emailController,
multiLineInput: false,
requiredText: true,
hintText: "Business Email",
validator: (value) {
return MihValidationServices().validateEmail(value);
},
),
const SizedBox(height: 10),
Container(
width: 300,
alignment: Alignment.topLeft,
child: const Text(
"Contact Number:",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
CountryCodePicker(
padding: EdgeInsetsGeometry.all(0),
onChanged: (selectedCode) {
setState(() {
countryCodeController.text =
selectedCode.toString();
});
debugPrint(
"Selected Country Code: ${countryCodeController.text}");
},
initialSelection: countryCodeController.text,
showDropDownButton: false,
pickerStyle: PickerStyle.bottomSheet,
dialogBackgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
barrierColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
Expanded(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: contactController,
numberMode: true,
multiLineInput: false,
requiredText: true,
hintText: null,
validator: (value) {
return MihValidationServices().isEmpty(value);
},
),
),
],
),
const SizedBox(height: 10),
MihTextFormField(
height: 250,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: missionVisionController,
multiLineInput: true,
requiredText: true,
hintText: "Business Mission & Vision",
validator: (value) {
return MihValidationServices().validateLength(
missionVisionController.text, 256);
},
),
SizedBox(
height: 15,
child: ValueListenableBuilder(
valueListenable: _counter,
builder:
(BuildContext context, int value, Widget? child) {
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
"$value",
style: TextStyle(
color: getMissionVisionLimitColor(256),
fontWeight: FontWeight.bold,
),
),
const SizedBox(width: 5),
Text(
"/256",
style: TextStyle(
color: getMissionVisionLimitColor(256),
fontWeight: FontWeight.bold,
),
),
],
);
},
),
),
const SizedBox(height: 10.0),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: websiteController,
multiLineInput: false,
requiredText: false,
hintText: "Business Website",
validator: (value) {
return MihValidationServices()
.validateWebsite(value, false);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: regController,
multiLineInput: false,
requiredText: false,
hintText: "Registration No.",
validator: (value) {
// return MihValidationServices().isEmpty(value);
return null;
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: practiceNoController,
multiLineInput: false,
requiredText: false,
hintText: "Practice Number",
validator: (validateValue) {
return null;
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: vatNoController,
multiLineInput: false,
requiredText: false,
hintText: "VAT Number",
validator: (value) {
// return MihValidationServices().isEmpty(value);
return null;
},
),
const SizedBox(height: 10),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Flexible(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: locationController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "GPS Location",
),
),
const SizedBox(width: 10.0),
MihButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return const Mihloadingcircle(
message: "Getting your location",
);
},
);
MIHLocationAPI()
.getGPSPosition(context)
.then((position) {
if (position != null) {
setState(() {
locationController.text =
"${position.latitude}, ${position.longitude}";
});
}
//Dismiss loading indicator
context.pop();
});
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 100,
child: Text(
"Set",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
submitForm(mzansiProfileProvider);
} else {
MihAlertServices()
.formNotFilledCompletely(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,
),
),
),
),
const SizedBox(height: 20),
],
),
],
),
),
),
);
},
);
}
}

View File

@@ -1,23 +1,22 @@
import 'dart:convert';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_my_business_team.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_my_business_team.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_my_business_user.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_my_business_user.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http;
class MzansiBusinessProfile extends StatefulWidget { class MzansiBusinessProfile extends StatefulWidget {
final BusinessArguments arguments;
const MzansiBusinessProfile({ const MzansiBusinessProfile({
super.key, super.key,
required this.arguments,
}); });
@override @override
@@ -25,26 +24,38 @@ class MzansiBusinessProfile extends StatefulWidget {
} }
class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> { class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
int _selcetedIndex = 0; String errorCode = "";
late Future<String> futureLogoUrl; String errorBody = "";
late Future<String> futureProPicUrl;
late Future<String> futureUserSignatureUrl; Future<void> fetchEmployees() async {
//print("Patien manager page: $endpoint");
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
final response = await http.get(Uri.parse(
"${AppEnviroment.baseApiUrl}/business-user/employees/${mzansiProfileProvider.businessUser!.business_id}"));
errorCode = response.statusCode.toString();
errorBody = response.body;
if (response.statusCode == 200) {
//print("Here1");
Iterable l = jsonDecode(response.body);
//print("Here2");
List<BusinessEmployee> employeeList = List<BusinessEmployee>.from(
l.map((model) => BusinessEmployee.fromJson(model)));
mzansiProfileProvider.setEmployeeList(employeeList: employeeList);
//print("Here3");
//print(patientQueue);
// return patientQueue;
} else {
throw Exception('failed to load employees');
}
}
@override @override
void initState() { void initState() {
super.initState(); super.initState();
futureLogoUrl = MihFileApi.getMinioFileUrl( WidgetsBinding.instance.addPostFrameCallback((_) async {
widget.arguments.business!.logo_path, await fetchEmployees();
context, });
);
futureProPicUrl = MihFileApi.getMinioFileUrl(
widget.arguments.signedInUser.pro_pic_path,
context,
);
futureUserSignatureUrl = MihFileApi.getMinioFileUrl(
widget.arguments.businessUser!.sig_path,
context,
);
} }
@override @override
@@ -54,11 +65,9 @@ class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
appTools: getTools(), appTools: getTools(),
appBody: getToolBody(), appBody: getToolBody(),
appToolTitles: getToolTitle(), appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex, selectedbodyIndex: context.watch<MzansiProfileProvider>().businessIndex,
onIndexChange: (newValue) { onIndexChange: (newIndex) {
setState(() { context.read<MzansiProfileProvider>().setBusinessIndex(newIndex);
_selcetedIndex = newValue;
});
}, },
); );
} }
@@ -80,96 +89,40 @@ class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
MihPackageTools getTools() { MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {}; Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.business)] = () { temp[const Icon(Icons.business)] = () {
setState(() { context.read<MzansiProfileProvider>().setBusinessIndex(0);
_selcetedIndex = 0;
});
}; };
temp[const Icon(Icons.person)] = () { temp[const Icon(Icons.person)] = () {
setState(() { context.read<MzansiProfileProvider>().setBusinessIndex(1);
_selcetedIndex = 1;
});
}; };
// temp[const Icon(Icons.warning)] = () {
// setState(() {
// _selcetedIndex = 2;
// });
// };
temp[const Icon(Icons.people)] = () { temp[const Icon(Icons.people)] = () {
setState(() { context.read<MzansiProfileProvider>().setBusinessIndex(2);
_selcetedIndex = 2;
});
};
temp[const Icon(Icons.add)] = () {
setState(() {
_selcetedIndex = 3;
});
};
temp[const Icon(Icons.star_rate_rounded)] = () {
setState(() {
_selcetedIndex = 4;
});
};
temp[const Icon(Icons.qr_code_rounded)] = () {
setState(() {
_selcetedIndex = 5;
});
}; };
// temp[const Icon(Icons.add)] = () {
// context.read<MzansiProfileProvider>().setBusinessIndex(3);
// };
// temp[const Icon(Icons.star_rate_rounded)] = () {
// context.read<MzansiProfileProvider>().setBusinessIndex(4);
// };
// temp[const Icon(Icons.qr_code_rounded)] = () {
// context.read<MzansiProfileProvider>().setBusinessIndex(5);
// };
return MihPackageTools( return MihPackageTools(
tools: temp, tools: temp,
selcetedIndex: _selcetedIndex, selcetedIndex: context.watch<MzansiProfileProvider>().businessIndex,
); );
} }
List<Widget> getToolBody() { List<Widget> getToolBody() {
List<Widget> toolBodies = [ List<Widget> toolBodies = [
FutureBuilder( MihBusinessDetails(),
future: futureLogoUrl, MihMyBusinessUser(),
builder: (context, snapshot) { MihMyBusinessTeam(),
if (snapshot.connectionState == ConnectionState.waiting) { // MihBusinessUserSearch(arguments: widget.arguments),
return const Center(child: Mihloadingcircle()); // MihBusinessReviews(business: widget.arguments.business!),
} else if (snapshot.connectionState == ConnectionState.done && // MihBusinessQrCode(
snapshot.hasData) { // business: widget.arguments.business!,
final logoUrl = snapshot.data!.isNotEmpty // startUpSearch: "",
? NetworkImage(snapshot.data!) // ),
: null;
return MihBusinessDetails(
arguments: widget.arguments,
logoImage: logoUrl,
);
} else {
return Text("Error: ${snapshot.error}");
}
}),
FutureBuilder<List<String>>(
future: Future.wait([futureProPicUrl, futureUserSignatureUrl]),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: Mihloadingcircle());
} else if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
final proPicUrl = NetworkImage(snapshot.data![0]);
print("=============== Signature URL: ${snapshot.data![1]}");
final signatureUrl = snapshot.data![1].isNotEmpty
? NetworkImage(snapshot.data![1])
: null;
return MihMyBusinessUser(
arguments: widget.arguments,
userProPicImage: proPicUrl,
userSignatureImage: signatureUrl,
);
} else {
return Text("Error: ${snapshot.error}");
}
},
),
// MihBusinessProfile(arguments: widget.arguments),
MihMyBusinessTeam(arguments: widget.arguments),
MihBusinessUserSearch(arguments: widget.arguments),
MihBusinessReviews(business: widget.arguments.business!),
MihBusinessQrCode(
business: widget.arguments.business!,
startUpSearch: "",
),
]; ];
return toolBodies; return toolBodies;
} }
@@ -179,9 +132,9 @@ class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
"Profile", "Profile",
"User", "User",
"Team", "Team",
"Add", // "Add",
"Reviews", // "Reviews",
"Share", // "Share",
]; ];
return toolTitles; return toolTitles;
} }

View File

@@ -1,35 +1,19 @@
import 'package:country_code_picker/country_code_picker.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_business_info_card.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_update_business_details_window.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_location_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; import 'package:provider/provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
class MihBusinessDetails extends StatefulWidget { class MihBusinessDetails extends StatefulWidget {
final BusinessArguments arguments;
final ImageProvider<Object>? logoImage;
const MihBusinessDetails({ const MihBusinessDetails({
super.key, super.key,
required this.arguments,
required this.logoImage,
}); });
@override @override
@@ -37,696 +21,25 @@ class MihBusinessDetails extends StatefulWidget {
} }
class _MihBusinessDetailsState extends State<MihBusinessDetails> { class _MihBusinessDetailsState extends State<MihBusinessDetails> {
PlatformFile? imageFile; PlatformFile? newSelectedLogoPic;
final fileNameController = TextEditingController(); final fileNameController = TextEditingController();
final regController = TextEditingController();
final nameController = TextEditingController();
final typeController = TextEditingController();
final practiceNoController = TextEditingController();
final vatNoController = TextEditingController();
final countryCodeController = TextEditingController();
final contactController = TextEditingController();
final emailController = TextEditingController();
final locationController = TextEditingController();
final websiteController = TextEditingController();
final ratingController = TextEditingController();
final missionVisionController = TextEditingController();
final _formKey = GlobalKey<FormState>();
final ValueNotifier<int> _counter = ValueNotifier<int>(0);
late String env;
void successPopUp(String message, bool stayOnPersonalSide) { void editBizProfileWindow(
MzansiProfileProvider mzansiProfileProvider, double width) {
showDialog( showDialog(
context: context, context: context,
builder: (context) { builder: (context) => MihUpdateBusinessDetailsWindow(width: width),
return MihPackageAlert(
alertIcon: Icon(
Icons.check_circle_outline_rounded,
size: 150,
color: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Successfully Updated Profile",
alertBody: Column(
children: [
Text(
message,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
context.goNamed(
'mihHome',
extra: stayOnPersonalSide,
); );
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
elevation: 10,
width: 300,
child: Text(
"Dismiss",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
)
],
),
alertColour: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
// return MIHSuccessMessage(
// successType: "Success",
// successMessage: message,
// );
},
);
}
Future<void> submitForm() async {
if (isFormFilled()) {
int statusCode = 0;
statusCode = await MihBusinessDetailsServices().updateBusinessDetailsV2(
widget.arguments.business!.business_id,
nameController.text,
typeController.text,
regController.text,
practiceNoController.text,
vatNoController.text,
emailController.text,
getNumberWithCountryCode(),
// contactController.text,
locationController.text,
fileNameController.text,
websiteController.text,
ratingController.text.isEmpty ? "0" : ratingController.text,
missionVisionController.text,
context,
);
if (statusCode == 200) {
bool successfullyUploadedFile = await uploadFile();
if (successfullyUploadedFile) {
//You left of here
String message = "Your information has been updated successfully!";
successPopUp(message, false);
// File uploaded successfully
} else {
// File upload failed
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.warning_rounded,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Error Updating Business Details",
alertBody: Column(
children: [
Text(
"An error occurred while updating the business details. Please check internet connection and try again.",
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
],
),
alertColour: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
},
);
}
} else {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Internet Connection");
},
);
}
} else {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Input Error");
},
);
}
}
Future<bool> uploadFile() async {
if (imageFile != null) {
int uploadStatusCode = 0;
uploadStatusCode = await MihFileApi.uploadFile(
widget.arguments.business!.business_id,
env,
"business_files",
imageFile!,
context,
);
if (uploadStatusCode == 200) {
int deleteStatusCode = 0;
deleteStatusCode = await MihFileApi.deleteFile(
widget.arguments.business!.logo_path.split("/").first,
env,
"business_files",
widget.arguments.business!.logo_path.split("/").last,
context,
);
if (deleteStatusCode == 200) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return true; // No file selected, so no upload needed
}
}
bool isFileSelected() {
if (imageFile != null) {
return true;
} else {
return false;
}
}
bool isEmailValid() {
String text = emailController.text;
var regex = RegExp(r'^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$');
return regex.hasMatch(text);
}
bool isFormFilled() {
if (typeController.text.isEmpty) {
return false;
} else {
return true;
}
}
void setContactNumberControllers() {
if (widget.arguments.business!.contact_no[0] == "+") {
List<String> contactDetails =
widget.arguments.business!.contact_no.split("-");
setState(() {
countryCodeController.text = contactDetails[0];
contactController.text = contactDetails[1];
});
} else {
setState(() {
countryCodeController.text = "+27";
contactController.text = widget.arguments.business!.contact_no;
});
}
}
String getNumberWithCountryCode() {
String numberWithoutBeginingZero = "";
if (contactController.text[0] == "0") {
numberWithoutBeginingZero = contactController.text
.replaceAll(" ", "")
.substring(1, contactController.text.length);
} else {
numberWithoutBeginingZero = contactController.text.replaceAll("-", " ");
}
return "${countryCodeController.text}-$numberWithoutBeginingZero";
}
void editBizProfileWindow(double width) {
showDialog(
context: context,
builder: (context) => MihPackageWindow(
fullscreen: false,
windowTitle: 'Edit Profile',
onWindowTapClose: () {
context.pop();
resetControllers();
},
windowBody: MihSingleChildScroll(
child: 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: [
Center(
child: MihCircleAvatar(
imageFile: widget.logoImage,
width: 150,
editable: true,
fileNameController: fileNameController,
userSelectedfile: imageFile,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (selectedfile) {
setState(() {
imageFile = selectedfile;
});
},
),
),
Visibility(
visible: false,
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fileNameController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "Selected File Name",
),
),
const SizedBox(height: 20),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: nameController,
multiLineInput: false,
requiredText: true,
hintText: "Business Name",
validator: (value) {
return MihValidationServices().isEmpty(value);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: typeController,
multiLineInput: false,
requiredText: true,
hintText: "Business Type",
validator: (value) {
return MihValidationServices()
.validateNoSpecialChars(value);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: emailController,
multiLineInput: false,
requiredText: true,
hintText: "Business Email",
validator: (value) {
return MihValidationServices()
.validateEmail(value);
},
),
const SizedBox(height: 10),
Container(
width: 300,
alignment: Alignment.topLeft,
child: const Text(
"Contact Number:",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
CountryCodePicker(
padding: EdgeInsetsGeometry.all(0),
onChanged: (selectedCode) {
setState(() {
countryCodeController.text =
selectedCode.toString();
});
debugPrint(
"Selected Country Code: ${countryCodeController.text}");
},
initialSelection: countryCodeController.text,
showDropDownButton: false,
pickerStyle: PickerStyle.bottomSheet,
dialogBackgroundColor:
MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
barrierColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
),
Expanded(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
controller: contactController,
numberMode: true,
multiLineInput: false,
requiredText: true,
hintText: null,
validator: (value) {
return MihValidationServices()
.isEmpty(value);
},
),
),
],
),
const SizedBox(height: 10),
MihTextFormField(
height: 250,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: missionVisionController,
multiLineInput: true,
requiredText: true,
hintText: "Business Mission & Vision",
validator: (value) {
return MihValidationServices().validateLength(
missionVisionController.text, 256);
},
),
SizedBox(
height: 15,
child: ValueListenableBuilder(
valueListenable: _counter,
builder: (BuildContext context, int value,
Widget? child) {
return Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
"$value",
style: TextStyle(
color: getMissionVisionLimitColor(256),
fontWeight: FontWeight.bold,
),
),
const SizedBox(width: 5),
Text(
"/256",
style: TextStyle(
color: getMissionVisionLimitColor(256),
fontWeight: FontWeight.bold,
),
),
],
);
},
),
),
const SizedBox(height: 10.0),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: websiteController,
multiLineInput: false,
requiredText: false,
hintText: "Business Website",
validator: (value) {
return MihValidationServices()
.validateWebsite(value, false);
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: regController,
multiLineInput: false,
requiredText: false,
hintText: "Registration No.",
validator: (value) {
// return MihValidationServices().isEmpty(value);
return null;
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: practiceNoController,
multiLineInput: false,
requiredText: false,
hintText: "Practice Number",
validator: (validateValue) {
return null;
},
),
const SizedBox(height: 10),
MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: vatNoController,
multiLineInput: false,
requiredText: false,
hintText: "VAT Number",
validator: (value) {
// return MihValidationServices().isEmpty(value);
return null;
},
),
const SizedBox(height: 10),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Flexible(
child: MihTextFormField(
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
controller: locationController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "GPS Location",
),
),
const SizedBox(width: 10.0),
MihButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return const Mihloadingcircle(
message: "Getting your location",
);
},
);
MIHLocationAPI()
.getGPSPosition(context)
.then((position) {
if (position != null) {
setState(() {
locationController.text =
"${position.latitude}, ${position.longitude}";
});
}
//Dismiss loading indicator
Navigator.of(context).pop();
});
},
buttonColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
width: 100,
child: Text(
"Set",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
submitForm();
} else {
MihAlertServices()
.formNotFilledCompletely(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,
),
),
),
),
const SizedBox(height: 20),
],
),
],
),
),
),
));
}
Color getMissionVisionLimitColor(int limit) {
if (_counter.value <= limit) {
return MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
} else {
return MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
}
}
void resetControllers() {
setState(() {
fileNameController.text =
widget.arguments.business!.logo_path.split("/").last;
regController.text = widget.arguments.business!.registration_no;
nameController.text = widget.arguments.business!.Name;
typeController.text = widget.arguments.business!.type;
practiceNoController.text = widget.arguments.business!.practice_no;
vatNoController.text = widget.arguments.business!.vat_no;
emailController.text = widget.arguments.business!.bus_email;
locationController.text = widget.arguments.business!.gps_location;
websiteController.text = widget.arguments.business!.website;
ratingController.text = widget.arguments.business!.rating;
missionVisionController.text = widget.arguments.business!.mission_vision;
});
setContactNumberControllers();
if (AppEnviroment.getEnv() == "Prod") {
env = "Prod";
} else {
env = "Dev";
}
missionVisionController.addListener(() {
setState(() {
_counter.value = missionVisionController.text.characters.length;
});
});
} }
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
fileNameController.dispose();
regController.dispose();
nameController.dispose();
typeController.dispose();
practiceNoController.dispose();
vatNoController.dispose();
contactController.dispose();
emailController.dispose();
locationController.dispose();
websiteController.dispose();
ratingController.dispose();
missionVisionController.dispose();
imageFile = null;
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
resetControllers();
} }
@override @override
@@ -740,37 +53,42 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
} }
Widget getBody(double width, BuildContext context) { Widget getBody(double width, BuildContext context) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return Stack( return Stack(
children: [ children: [
MihSingleChildScroll( MihSingleChildScroll(
child: Padding( child: Padding(
padding: padding: MzansiInnovationHub.of(context)!.theme.screenType ==
MzansiInnovationHub.of(context)!.theme.screenType == "desktop" "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2) ? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075), : EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column( child: Column(
children: [ children: [
Center( Center(
child: MihCircleAvatar( child: MihCircleAvatar(
imageFile: widget.logoImage, imageFile: mzansiProfileProvider.businessProfilePicture,
width: 150, width: 150,
editable: false, editable: false,
fileNameController: fileNameController, fileNameController: fileNameController,
userSelectedfile: imageFile, userSelectedfile: newSelectedLogoPic,
frameColor: MihColors.getSecondaryColor( frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor( backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (selectedfile) { onChange: (selectedfile) {
setState(() { setState(() {
imageFile = selectedfile; newSelectedLogoPic = selectedfile;
}); });
}, },
), ),
), ),
FittedBox( FittedBox(
child: Text( child: Text(
widget.arguments.business!.Name, mzansiProfileProvider.business!.Name,
style: TextStyle( style: TextStyle(
fontSize: 35, fontSize: 35,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -782,7 +100,7 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
), ),
FittedBox( FittedBox(
child: Text( child: Text(
widget.arguments.business!.type, mzansiProfileProvider.business!.type,
style: TextStyle( style: TextStyle(
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@@ -793,24 +111,13 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
), ),
), ),
const SizedBox(height: 5), const SizedBox(height: 5),
// FittedBox(
// child: Text(
// "Mission & Vision",
// style: TextStyle(
// fontSize: 15,
// fontWeight: FontWeight.bold,
// color: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
// ),
// ),
// ),
Center( Center(
child: SizedBox( child: SizedBox(
width: 700, width: 700,
child: Text( child: Text(
widget.arguments.business!.mission_vision.isNotEmpty mzansiProfileProvider
? widget.arguments.business!.mission_vision .business!.mission_vision.isNotEmpty
? mzansiProfileProvider.business!.mission_vision
: "No Mission & Vision added yet", : "No Mission & Vision added yet",
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
@@ -827,16 +134,7 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
SizedBox( SizedBox(
width: 700, width: 700,
child: MihBusinessCard( child: MihBusinessCard(
// businessid: widget.arguments.business!.business_id, business: mzansiProfileProvider.business!,
// businessName: widget.arguments.business!.Name,
// cellNumber: widget.arguments.business!.contact_no,
// email: widget.arguments.business!.bus_email,
// gpsLocation: widget.arguments.business!.gps_location,
// rating: widget.arguments.business!.rating.isNotEmpty
// ? double.parse(widget.arguments.business!.rating)
// : 0,
// website: widget.arguments.business!.website,
business: widget.arguments.business!,
startUpSearch: null, startUpSearch: null,
width: width, width: width,
), ),
@@ -846,10 +144,11 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
child: MihButton( child: MihButton(
onPressed: () { onPressed: () {
// Connect with the user // Connect with the user
editBizProfileWindow(width); editBizProfileWindow(mzansiProfileProvider, width);
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300, width: 300,
child: Text( child: Text(
"Edit Profile", "Edit Profile",
@@ -896,5 +195,7 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
// ), // ),
], ],
); );
},
);
} }
} }

View File

@@ -3,19 +3,18 @@ import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_employee.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/builders/build_employee_list.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/builders/build_employee_list.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
class MihMyBusinessTeam extends StatefulWidget { class MihMyBusinessTeam extends StatefulWidget {
final BusinessArguments arguments;
const MihMyBusinessTeam({ const MihMyBusinessTeam({
super.key, super.key,
required this.arguments,
}); });
@override @override
@@ -23,36 +22,35 @@ class MihMyBusinessTeam extends StatefulWidget {
} }
class _MihMyBusinessTeamState extends State<MihMyBusinessTeam> { class _MihMyBusinessTeamState extends State<MihMyBusinessTeam> {
late Future<List<BusinessEmployee>> employeeList;
String errorCode = ""; String errorCode = "";
String errorBody = ""; String errorBody = "";
Future<List<BusinessEmployee>> fetchEmployees() async { // Future<void> fetchEmployees(
//print("Patien manager page: $endpoint"); // MzansiProfileProvider mzansiProfileProvider) async {
final response = await http.get(Uri.parse( // //print("Patien manager page: $endpoint");
"${AppEnviroment.baseApiUrl}/business-user/employees/${widget.arguments.businessUser!.business_id}")); // final response = await http.get(Uri.parse(
errorCode = response.statusCode.toString(); // "${AppEnviroment.baseApiUrl}/business-user/employees/${mzansiProfileProvider.businessUser!.business_id}"));
errorBody = response.body; // errorCode = response.statusCode.toString();
if (response.statusCode == 200) { // errorBody = response.body;
//print("Here1"); // if (response.statusCode == 200) {
Iterable l = jsonDecode(response.body); // //print("Here1");
//print("Here2"); // Iterable l = jsonDecode(response.body);
List<BusinessEmployee> patientQueue = List<BusinessEmployee>.from( // //print("Here2");
l.map((model) => BusinessEmployee.fromJson(model))); // List<BusinessEmployee> employeeList = List<BusinessEmployee>.from(
//print("Here3"); // l.map((model) => BusinessEmployee.fromJson(model)));
//print(patientQueue); // mzansiProfileProvider.setEmployeeList(employeeList: employeeList);
return patientQueue; // //print("Here3");
} else { // //print(patientQueue);
throw Exception('failed to load employees'); // // return patientQueue;
} // } else {
} // throw Exception('failed to load employees');
// }
// }
Widget displayEmployeeList(List<BusinessEmployee> employeeList) { Widget displayEmployeeList(List<BusinessEmployee> employeeList) {
if (employeeList.isNotEmpty) { if (employeeList.isNotEmpty) {
return BuildEmployeeList( return BuildEmployeeList(
employees: employeeList, employees: employeeList,
arguments: widget.arguments,
); );
} }
return Center( return Center(
@@ -70,7 +68,10 @@ class _MihMyBusinessTeamState extends State<MihMyBusinessTeam> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
employeeList = fetchEmployees(); // fetchEmployees(context.read<MzansiProfileProvider>()).catchError((e) {
// // Handle the error thrown in fetchEmployees
// print('Error fetching employees: $e');
// });
} }
@override @override
@@ -82,40 +83,20 @@ class _MihMyBusinessTeamState extends State<MihMyBusinessTeam> {
} }
Widget getBody() { Widget getBody() {
return MihSingleChildScroll( return Consumer<MzansiProfileProvider>(
child: Column(mainAxisSize: MainAxisSize.max, children: [ builder: (BuildContext context,
FutureBuilder( MzansiProfileProvider mzansiProfileProvider, Widget? child) {
future: employeeList, if (mzansiProfileProvider.employeeList == null) {
builder: (context, snapshot) {
//print("patient Queue List ${snapshot.hasData}");
if (snapshot.connectionState == ConnectionState.waiting) {
return const Mihloadingcircle();
} else if (snapshot.connectionState == ConnectionState.done) {
//List<BusinessEmployee> employeeListResults;
// if (searchString == "") {
// patientQueueList = [];
// } else {
// print(patientQueueList);
// }
return displayEmployeeList(snapshot.requireData);
} else {
return Center( return Center(
child: Text( child: Mihloadingcircle(),
"$errorCode: Error pulling Patients Data\n${AppEnviroment.baseApiUrl}/business-user/users/${widget.arguments.businessUser!.business_id}\n$errorBody",
style: TextStyle(
fontSize: 25,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark")),
textAlign: TextAlign.center,
),
); );
} }
}, return MihSingleChildScroll(
), child: Column(mainAxisSize: MainAxisSize.max, children: [
displayEmployeeList(mzansiProfileProvider.employeeList!),
]), ]),
); );
},
);
} }
} }

View File

@@ -1,7 +1,9 @@
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.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/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.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_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
@@ -17,18 +19,11 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:provider/provider.dart';
class MihMyBusinessUser extends StatefulWidget { class MihMyBusinessUser extends StatefulWidget {
final BusinessArguments arguments;
final ImageProvider<Object>? userProPicImage;
final ImageProvider<Object>? userSignatureImage;
const MihMyBusinessUser({ const MihMyBusinessUser({
super.key, super.key,
required this.arguments,
required this.userProPicImage,
required this.userSignatureImage,
}); });
@override @override
@@ -37,7 +32,7 @@ class MihMyBusinessUser extends StatefulWidget {
class _MihMyBusinessUserState extends State<MihMyBusinessUser> { class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
PlatformFile? userPicFile; PlatformFile? userPicFile;
PlatformFile? userSignatureFile; PlatformFile? newSelectedSignaturePic;
final fileNameController = TextEditingController(); final fileNameController = TextEditingController();
final titleTextController = TextEditingController(); final titleTextController = TextEditingController();
final fnameController = TextEditingController(); final fnameController = TextEditingController();
@@ -55,23 +50,24 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
} }
} }
Future<bool> uploadFile() async { Future<bool> uploadFile(MzansiProfileProvider mzansiProfileProvider) async {
if (userSignatureFile != null) { if (newSelectedSignaturePic != null) {
int uploadStatusCode = 0; int uploadStatusCode = 0;
uploadStatusCode = await MihFileApi.uploadFile( uploadStatusCode = await MihFileApi.uploadFile(
widget.arguments.signedInUser.app_id, mzansiProfileProvider.user!.app_id,
env, env,
"business_files", "business_files",
userSignatureFile!, newSelectedSignaturePic!,
context, context,
); );
if (uploadStatusCode == 200) { if (uploadStatusCode == 200) {
signtureController.text = newSelectedSignaturePic!.name;
int deleteStatusCode = 0; int deleteStatusCode = 0;
deleteStatusCode = await MihFileApi.deleteFile( deleteStatusCode = await MihFileApi.deleteFile(
widget.arguments.signedInUser.app_id, mzansiProfileProvider.user!.app_id,
env, env,
"business_files", "business_files",
widget.arguments.businessUser!.sig_path.split("/").last, mzansiProfileProvider.businessUser!.sig_path.split("/").last,
context, context,
); );
if (deleteStatusCode == 200) { if (deleteStatusCode == 200) {
@@ -87,42 +83,34 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
} }
} }
Future<void> submitForm() async { Future<void> submitForm(MzansiProfileProvider mzansiProfileProvider) async {
KenLogger.success("Start Submit Form");
if (isFormFilled()) { if (isFormFilled()) {
KenLogger.success("Form Filled");
KenLogger.success("Start File Upload");
bool successfullyUploadedFile = await uploadFile(mzansiProfileProvider);
KenLogger.success(
"File Upload Complete: outcome $successfullyUploadedFile");
if (!mounted) return;
KenLogger.success("is mounted");
if (successfullyUploadedFile) {
int statusCode = await MihMyBusinessUserServices().updateBusinessUser( int statusCode = await MihMyBusinessUserServices().updateBusinessUser(
widget.arguments.signedInUser.app_id, mzansiProfileProvider.user!.app_id,
widget.arguments.businessUser!.business_id, mzansiProfileProvider.businessUser!.business_id,
titleTextController.text, titleTextController.text,
accessController.text, accessController.text,
signtureController.text, signtureController.text,
mzansiProfileProvider,
context, context,
); );
KenLogger.success("Details Update Complete: status code $statusCode");
if (!mounted) return;
KenLogger.success("is mounted");
if (statusCode == 200) { if (statusCode == 200) {
bool successfullyUploadedFile = await uploadFile(); KenLogger.success("Start Success Message");
if (successfullyUploadedFile) {
// Navigator.of(context).pop();
// Navigator.of(context).pop();
// Navigator.of(context).pushNamed(
// '/',
// arguments: AuthArguments(
// false,
// false,
// ),
// );
// File uploaded successfully
String message = "Business details updated successfully"; String message = "Business details updated successfully";
successPopUp(message, false); successPopUp(message, false);
// showDialog(
// context: context,
// builder: (context) {
// return const MIHSuccessMessage(
// successType: "Success",
// successMessage: "Business details updated successfully",
// );
// },
// );
} else { } else {
// File upload failed
showDialog( showDialog(
context: context, context: context,
builder: (context) { builder: (context) {
@@ -196,10 +184,7 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
Center( Center(
child: MihButton( child: MihButton(
onPressed: () { onPressed: () {
context.goNamed( context.pop();
'mihHome',
extra: stayOnPersonalSide,
);
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
@@ -230,6 +215,29 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
); );
} }
void setControllers() {
MzansiProfileProvider mzansiProfileProvider =
context.read<MzansiProfileProvider>();
setState(() {
fileNameController.text =
mzansiProfileProvider.user!.pro_pic_path.split("/").last;
signtureController.text =
mzansiProfileProvider.businessUser!.sig_path.split("/").last;
KenLogger.success("title: ${mzansiProfileProvider.businessUser!.title}");
KenLogger.success(
"sig url: ${mzansiProfileProvider.businessUser!.sig_path}");
titleTextController.text = mzansiProfileProvider.businessUser!.title;
fnameController.text = mzansiProfileProvider.user!.fname;
lnameController.text = mzansiProfileProvider.user!.lname;
accessController.text = mzansiProfileProvider.businessUser!.access;
});
if (AppEnviroment.getEnv() == "Prod") {
env = "Prod";
} else {
env = "Dev";
}
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@@ -240,27 +248,13 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
accessController.dispose(); accessController.dispose();
signtureController.dispose(); signtureController.dispose();
userPicFile = null; userPicFile = null;
userSignatureFile = null; newSelectedSignaturePic = null;
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
setState(() { setControllers();
fileNameController.text =
widget.arguments.signedInUser.pro_pic_path.split("/").last;
signtureController.text =
widget.arguments.businessUser!.sig_path.split("/").last;
titleTextController.text = widget.arguments.businessUser!.title;
fnameController.text = widget.arguments.signedInUser.fname;
lnameController.text = widget.arguments.signedInUser.lname;
accessController.text = widget.arguments.businessUser!.access;
});
if (AppEnviroment.getEnv() == "Prod") {
env = "Prod";
} else {
env = "Dev";
}
} }
@override @override
@@ -274,9 +268,13 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
} }
Widget getBody(double width) { Widget getBody(double width) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return MihSingleChildScroll( return MihSingleChildScroll(
child: Padding( child: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType == "desktop" padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2) ? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075), : EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column( child: Column(
@@ -286,15 +284,17 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
formFields: [ formFields: [
Center( Center(
child: MihCircleAvatar( child: MihCircleAvatar(
imageFile: widget.userProPicImage, imageFile: mzansiProfileProvider.userProfilePicture,
width: 150, width: 150,
editable: false, editable: false,
fileNameController: fileNameController, fileNameController: fileNameController,
userSelectedfile: userPicFile, userSelectedfile: userPicFile,
frameColor: MihColors.getSecondaryColor( frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor( backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (_) {}, onChange: (_) {},
), ),
), ),
@@ -302,9 +302,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
visible: false, visible: false,
child: MihTextFormField( child: MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fileNameController, controller: fileNameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -315,9 +317,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
const SizedBox(height: 20), const SizedBox(height: 20),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: titleTextController, controller: titleTextController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -330,9 +334,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
const SizedBox(height: 10), const SizedBox(height: 10),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fnameController, controller: fnameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -345,9 +351,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
const SizedBox(height: 10), const SizedBox(height: 10),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: lnameController, controller: lnameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -360,9 +368,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
const SizedBox(height: 10), const SizedBox(height: 10),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: accessController, controller: accessController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -386,15 +396,17 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
), ),
Center( Center(
child: MihImageDisplay( child: MihImageDisplay(
imageFile: widget.userSignatureImage, imageFile: newSelectedSignaturePic != null
? MemoryImage(newSelectedSignaturePic!.bytes!)
: mzansiProfileProvider.businessUserSignature,
width: 300, width: 300,
height: 200, height: 200,
editable: true, editable: true,
fileNameController: signtureController, fileNameController: signtureController,
userSelectedfile: userSignatureFile, userSelectedfile: newSelectedSignaturePic,
onChange: (selectedFile) { onChange: (selectedFile) {
setState(() { setState(() {
userSignatureFile = selectedFile; newSelectedSignaturePic = selectedFile;
}); });
}, },
), ),
@@ -404,9 +416,11 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
visible: false, visible: false,
child: MihTextFormField( child: MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fileNameController, controller: fileNameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -419,13 +433,14 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
child: MihButton( child: MihButton(
onPressed: () { onPressed: () {
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
submitForm(); submitForm(mzansiProfileProvider);
} else { } else {
MihAlertServices().formNotFilledCompletely(context); MihAlertServices().formNotFilledCompletely(context);
} }
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300, width: 300,
child: Text( child: Text(
"Update", "Update",
@@ -446,5 +461,7 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
), ),
), ),
); );
},
);
} }
} }

View File

@@ -2,16 +2,15 @@ import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_settings.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_settings.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MzansiProfile extends StatefulWidget { class MzansiProfile extends StatefulWidget {
final AppProfileUpdateArguments arguments;
const MzansiProfile({ const MzansiProfile({
super.key, super.key,
required this.arguments,
}); });
@override @override
@@ -19,8 +18,6 @@ class MzansiProfile extends StatefulWidget {
} }
class _MzansiProfileState extends State<MzansiProfile> { class _MzansiProfileState extends State<MzansiProfile> {
int _selcetedIndex = 0;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MihPackage( return MihPackage(
@@ -28,11 +25,9 @@ class _MzansiProfileState extends State<MzansiProfile> {
appTools: getTools(), appTools: getTools(),
appBody: getToolBody(), appBody: getToolBody(),
appToolTitles: getToolTitle(), appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex, selectedbodyIndex: context.watch<MzansiProfileProvider>().personalIndex,
onIndexChange: (newValue) { onIndexChange: (newIndex) {
setState(() { context.read<MzansiProfileProvider>().setPersonalIndex(newIndex);
_selcetedIndex = newValue;
});
}, },
); );
} }
@@ -55,29 +50,25 @@ class _MzansiProfileState extends State<MzansiProfile> {
MihPackageTools getTools() { MihPackageTools getTools() {
Map<Widget, void Function()?> temp = {}; Map<Widget, void Function()?> temp = {};
temp[const Icon(Icons.person)] = () { temp[const Icon(Icons.person)] = () {
setState(() { context.read<MzansiProfileProvider>().setPersonalIndex(0);
_selcetedIndex = 0;
});
}; };
// temp[const Icon(Icons.person)] = () {
// context.read<MzansiProfileProvider>().setPersonalIndex(1);
// };
temp[const Icon(Icons.settings)] = () { temp[const Icon(Icons.settings)] = () {
setState(() { context.read<MzansiProfileProvider>().setPersonalIndex(1);
_selcetedIndex = 1;
});
}; };
return MihPackageTools( return MihPackageTools(
tools: temp, tools: temp,
selcetedIndex: _selcetedIndex, selcetedIndex: context.watch<MzansiProfileProvider>().personalIndex,
); );
} }
List<Widget> getToolBody() { List<Widget> getToolBody() {
List<Widget> toolBodies = []; List<Widget> toolBodies = [];
toolBodies.add(MihPersonalProfile( toolBodies.add(MihPersonalProfile());
arguments: widget.arguments, // toolBodies.add(MihPersonalProfile());
)); toolBodies.add(MihPersonalSettings());
toolBodies.add(MihPersonalSettings(
signedInUser: widget.arguments.signedInUser,
));
return toolBodies; return toolBodies;
} }

View File

@@ -1,251 +1,80 @@
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.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/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:provider/provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_text_form_field.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_toggle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
class MihPersonalProfile extends StatefulWidget { class MihPersonalProfile extends StatefulWidget {
final AppProfileUpdateArguments arguments; const MihPersonalProfile({super.key});
const MihPersonalProfile({
super.key,
required this.arguments,
});
@override @override
State<MihPersonalProfile> createState() => _MihPersonalProfileState(); State<MihPersonalProfile> createState() => _MihPersonalProfileState();
} }
class _MihPersonalProfileState extends State<MihPersonalProfile> { class _MihPersonalProfileState extends State<MihPersonalProfile> {
final proPicController = TextEditingController(); TextEditingController proPicController = TextEditingController();
final usernameController = TextEditingController(); TextEditingController usernameController = TextEditingController();
final fnameController = TextEditingController(); TextEditingController fnameController = TextEditingController();
final lnameController = TextEditingController(); TextEditingController lnameController = TextEditingController();
final purposeController = TextEditingController(); TextEditingController purposeController = TextEditingController();
final ValueNotifier<int> _counter = ValueNotifier<int>(0); final ValueNotifier<int> _counter = ValueNotifier<int>(0);
PlatformFile? proPic; PlatformFile? newSelectedProPic;
late ImageProvider<Object>? propicPreview; bool businessUser = false;
late bool originalProfileTypeIsBusiness; bool _controllersInitialized = false;
late bool businessUser; String env = "";
late String oldProPicName; String oldProPicName = "";
late String env;
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
void notUniqueAlert() { void initializeControllers(MzansiProfileProvider mzansiProfileProvider) {
showDialog( if (!_controllersInitialized && mzansiProfileProvider.user != null) {
context: context, usernameController.text = mzansiProfileProvider.user!.username;
builder: (context) { fnameController.text = mzansiProfileProvider.user!.fname;
return MihPackageAlert( lnameController.text = mzansiProfileProvider.user!.lname;
alertIcon: Icon( purposeController.text = mzansiProfileProvider.user!.purpose;
Icons.warning_amber_rounded, proPicController.text =
size: 100, mzansiProfileProvider.user!.pro_pic_path.isNotEmpty
color: MihColors.getRedColor( ? mzansiProfileProvider.user!.pro_pic_path.split("/").last
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), : "";
), businessUser = mzansiProfileProvider.user!.type == "business";
alertTitle: "Too Slow, That Username is Taken", _controllersInitialized = true;
alertBody: const Text(
"The username you have entered is already taken by another member of Mzansi. Please choose a different username and try again.",
style: TextStyle(
fontSize: 15,
),
),
alertColour: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
},
);
}
Future<void> submitForm() async {
// print("============\nsubmiit form\n=================");
if (widget.arguments.signedInUser.username != usernameController.text) {
bool isUsernameUnique = await MihUserServices.isUsernameUnique(
usernameController.text, context);
print("isUsernameUnique: $isUsernameUnique");
if (isUsernameUnique == false) {
notUniqueAlert();
return;
}
}
if (oldProPicName != proPicController.text) {
await uploadSelectedFile(proPic);
}
await updateUserApiCall();
}
bool isBusinessUser() {
if (widget.arguments.signedInUser.type == "personal") {
return false;
} else {
return true;
}
}
bool isUsernameValid(String username) {
return RegExp(r'^[a-zA-Z][a-zA-Z0-9_]{5,19}$').hasMatch(username);
}
Future<void> uploadSelectedFile(PlatformFile? file) async {
var response = await MihFileApi.uploadFile(
widget.arguments.signedInUser.app_id,
env,
"profile_files",
file,
context,
);
if (response == 200) {
deleteFileApiCall(oldProPicName);
} else {
internetConnectionPopUp();
}
}
Future<void> updateUserApiCall() async {
int responseCode = await MihUserServices().updateUserV2(
widget.arguments.signedInUser,
fnameController.text,
lnameController.text,
usernameController.text,
proPicController.text,
purposeController.text,
businessUser,
context,
);
if (responseCode == 200) {
bool stayOnPersonalSide = true;
if (originalProfileTypeIsBusiness == false && businessUser == true) {
stayOnPersonalSide = false;
}
String message = "Your information has been updated successfully!";
successPopUp(message, stayOnPersonalSide);
} else {
internetConnectionPopUp();
}
}
Future<void> deleteFileApiCall(String filename) async {
var response = await MihFileApi.deleteFile(
widget.arguments.signedInUser.app_id,
env,
"profile_files",
filename,
context,
);
if (response == 200) {
//SQL delete
} else {
internetConnectionPopUp();
}
}
void successPopUp(String message, bool stayOnPersonalSide) {
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.check_circle_outline_rounded,
size: 150,
color: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Successfully Updated Profile",
alertBody: Column(
children: [
Text(
message,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
context.goNamed(
'mihHome',
extra: stayOnPersonalSide,
);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
elevation: 10,
width: 300,
child: Text(
"Dismiss",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
)
],
),
alertColour: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
// return MIHSuccessMessage(
// successType: "Success",
// successMessage: message,
// );
},
);
}
void internetConnectionPopUp() {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Internet Connection");
},
);
}
void usernamePopUp() {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Invalid Username");
},
);
}
Color getPurposeLimitColor(int limit) {
if (_counter.value <= limit) {
return MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
} else {
return MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
} }
} }
void editProfileWindow(double width) { void editProfileWindow(double width) {
showDialog( showDialog(
context: context, context: context,
builder: (context) => MihPackageWindow( builder: (context) => Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
// usernameController.text = mzansiProfileProvider.user!.username;
// fnameController.text = mzansiProfileProvider.user!.fname;
// lnameController.text = mzansiProfileProvider.user!.lname;
// purposeController.text = mzansiProfileProvider.user!.purpose;
// proPicController.text =
// mzansiProfileProvider.user!.pro_pic_path.isNotEmpty
// ? mzansiProfileProvider.user!.pro_pic_path.split("/").last
// : "";
initializeControllers(mzansiProfileProvider);
return MihPackageWindow(
fullscreen: false, fullscreen: false,
windowTitle: "Edit Profile", windowTitle: "Edit Profile",
onWindowTapClose: () { onWindowTapClose: () {
@@ -264,11 +93,13 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
formFields: [ formFields: [
Center( Center(
child: MihCircleAvatar( child: MihCircleAvatar(
imageFile: propicPreview, imageFile: newSelectedProPic != null
? MemoryImage(newSelectedProPic!.bytes!)
: mzansiProfileProvider.userProfilePicture,
width: 150, width: 150,
editable: true, editable: true,
fileNameController: proPicController, fileNameController: proPicController,
userSelectedfile: proPic, userSelectedfile: newSelectedProPic,
frameColor: MihColors.getSecondaryColor( frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"), "Dark"),
@@ -277,7 +108,7 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
"Dark"), "Dark"),
onChange: (selectedImage) { onChange: (selectedImage) {
setState(() { setState(() {
proPic = selectedImage; newSelectedProPic = selectedImage;
}); });
}, },
), ),
@@ -302,23 +133,28 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: usernameController, controller: usernameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
hintText: "Username", hintText: "Username",
validator: (value) { validator: (value) {
return MihValidationServices().validateUsername(value); return MihValidationServices()
.validateUsername(value);
}, },
), ),
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: fnameController, controller: fnameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -330,9 +166,11 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MihTextFormField( MihTextFormField(
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: lnameController, controller: lnameController,
multiLineInput: false, multiLineInput: false,
requiredText: true, requiredText: true,
@@ -345,9 +183,11 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
MihTextFormField( MihTextFormField(
height: 250, height: 250,
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor( inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: purposeController, controller: purposeController,
multiLineInput: true, multiLineInput: true,
requiredText: true, requiredText: true,
@@ -392,9 +232,11 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
hintText: "Activate Business Account", hintText: "Activate Business Account",
initialPostion: businessUser, initialPostion: businessUser,
fillColor: MihColors.getSecondaryColor( fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
secondaryFillColor: MihColors.getPrimaryColor( secondaryFillColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (value) { onChange: (value) {
setState(() { setState(() {
businessUser = value; businessUser = value;
@@ -407,9 +249,10 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
onPressed: () { onPressed: () {
//Add validation here //Add validation here
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
submitForm(); submitForm(mzansiProfileProvider);
} else { } else {
MihAlertServices().formNotFilledCompletely(context); MihAlertServices()
.formNotFilledCompletely(context);
} }
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
@@ -433,52 +276,196 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
], ],
), ),
), ),
);
},
), ),
); );
} }
@override Future<void> submitForm(MzansiProfileProvider mzansiProfileProvider) async {
void dispose() { if (mzansiProfileProvider.user!.username != usernameController.text) {
proPicController.dispose(); bool isUsernameUnique = await MihUserServices.isUsernameUnique(
usernameController.dispose(); usernameController.text, context);
fnameController.dispose(); if (isUsernameUnique == false) {
lnameController.dispose(); notUniqueAlert();
purposeController.dispose(); return;
super.dispose(); }
}
if (oldProPicName != proPicController.text) {
await uploadSelectedFile(mzansiProfileProvider, newSelectedProPic);
}
await updateUserApiCall(mzansiProfileProvider);
} }
@override Future<void> uploadSelectedFile(
void initState() { MzansiProfileProvider mzansiProfileProvider, PlatformFile? file) async {
super.initState(); var response = await MihFileApi.uploadFile(
var proPicName = ""; mzansiProfileProvider.user!.app_id,
if (widget.arguments.signedInUser.pro_pic_path.isNotEmpty) { env,
proPicName = widget.arguments.signedInUser.pro_pic_path.split("/").last; "profile_files",
} file,
if (AppEnviroment.getEnv() == "Prod") { context,
env = "Prod"; );
if (response == 200) {
deleteFileApiCall(mzansiProfileProvider, oldProPicName);
} else { } else {
env = "Dev"; internetConnectionPopUp();
} }
purposeController.addListener(() { }
setState(() {
_counter.value = purposeController.text.characters.length; Future<void> deleteFileApiCall(
}); MzansiProfileProvider mzansiProfileProvider, String filename) async {
}); var response = await MihFileApi.deleteFile(
setState(() { mzansiProfileProvider.user!.app_id,
propicPreview = widget.arguments.propicFile; env,
oldProPicName = proPicName; "profile_files",
proPicController.text = proPicName; filename,
fnameController.text = widget.arguments.signedInUser.fname; context,
lnameController.text = widget.arguments.signedInUser.lname; );
usernameController.text = widget.arguments.signedInUser.username; if (response == 200) {
purposeController.text = widget.arguments.signedInUser.purpose; //SQL delete
businessUser = isBusinessUser();
if (businessUser) {
originalProfileTypeIsBusiness = true;
} else { } else {
originalProfileTypeIsBusiness = false; internetConnectionPopUp();
} }
}
Future<void> updateUserApiCall(
MzansiProfileProvider mzansiProfileProvider) async {
int responseCode = await MihUserServices().updateUserV2(
mzansiProfileProvider.user!,
fnameController.text,
lnameController.text,
usernameController.text,
proPicController.text,
purposeController.text,
businessUser,
context,
);
if (responseCode == 200) {
setState(() {
setProfileVariables(mzansiProfileProvider);
newSelectedProPic = null;
}); });
bool stayOnPersonalSide = true;
// if (originalProfileTypeIsBusiness == false && businessUser == true) {
// stayOnPersonalSide = false;
// }
String message = "Your information has been updated successfully!";
context.pop();
successPopUp(message, stayOnPersonalSide);
} else {
internetConnectionPopUp();
}
}
Color getPurposeLimitColor(int limit) {
if (_counter.value <= limit) {
return MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
} else {
return MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
}
}
void setProfileVariables(MzansiProfileProvider mzansiProfileProvider) {
businessUser = mzansiProfileProvider.user!.type == "business";
oldProPicName = mzansiProfileProvider.user!.pro_pic_path.isNotEmpty
? mzansiProfileProvider.user!.pro_pic_path.split("/").last
: "";
env = AppEnviroment.getEnv() == "Prod" ? env = "Prod" : env = "Dev";
}
void successPopUp(String message, bool stayOnPersonalSide) {
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.check_circle_outline_rounded,
size: 150,
color: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Successfully Updated Profile",
alertBody: Column(
children: [
Text(
message,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 25),
Center(
child: MihButton(
onPressed: () {
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
elevation: 10,
width: 300,
child: Text(
"Dismiss",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
)
],
),
alertColour: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
// return MIHSuccessMessage(
// successType: "Success",
// successMessage: message,
// );
},
);
}
void internetConnectionPopUp() {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Internet Connection");
},
);
}
void notUniqueAlert() {
showDialog(
context: context,
builder: (context) {
return MihPackageAlert(
alertIcon: Icon(
Icons.warning_amber_rounded,
size: 100,
color: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Too Slow, That Username is Taken",
alertBody: const Text(
"The username you have entered is already taken by another member of Mzansi. Please choose a different username and try again.",
style: TextStyle(
fontSize: 15,
),
),
alertColour: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
);
},
);
} }
@override @override
@@ -492,9 +479,27 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
} }
Widget getBody(double width) { Widget getBody(double width) {
return Stack( return Consumer<MzansiProfileProvider>(
children: [ builder: (BuildContext context,
MihSingleChildScroll( MzansiProfileProvider mzansiProfileProvider, Widget? child) {
if (mzansiProfileProvider.user == null) {
//Change to new user flow
return Center(
child: Mihloadingcircle(),
);
}
// else if (mzansiProfileProvider.user!.username.isEmpty) {
// editProfileWindow(width);
// }
else {
businessUser = mzansiProfileProvider.user!.type == "business";
oldProPicName = mzansiProfileProvider.user!.pro_pic_path.isNotEmpty
? mzansiProfileProvider.user!.pro_pic_path.split("/").last
: "";
env = AppEnviroment.getEnv() == "Prod" ? env = "Prod" : env = "Dev";
KenLogger.success(
mzansiProfileProvider.userProfilePicture.toString());
return MihSingleChildScroll(
child: Padding( child: Padding(
padding: padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop" MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
@@ -505,26 +510,29 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
children: [ children: [
Center( Center(
child: MihCircleAvatar( child: MihCircleAvatar(
imageFile: propicPreview, imageFile: mzansiProfileProvider.userProfilePicture,
width: 150, width: 150,
editable: false, editable: false,
fileNameController: proPicController, fileNameController: proPicController,
userSelectedfile: proPic, userSelectedfile: newSelectedProPic,
frameColor: MihColors.getSecondaryColor( frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor( backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: (selectedImage) { onChange: (selectedImage) {
setState(() { setState(() {
proPic = selectedImage; newSelectedProPic = selectedImage;
}); });
}, },
key: ValueKey(mzansiProfileProvider.userProfilePicUrl),
), ),
), ),
FittedBox( FittedBox(
child: Text( child: Text(
widget.arguments.signedInUser.username.isNotEmpty mzansiProfileProvider.user!.username.isNotEmpty
? widget.arguments.signedInUser.username ? mzansiProfileProvider.user!.username
: "username", : "username",
style: TextStyle( style: TextStyle(
fontSize: 35, fontSize: 35,
@@ -537,8 +545,8 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
), ),
FittedBox( FittedBox(
child: Text( child: Text(
widget.arguments.signedInUser.fname.isNotEmpty mzansiProfileProvider.user!.fname.isNotEmpty
? "${widget.arguments.signedInUser.fname} ${widget.arguments.signedInUser.lname}" ? "${mzansiProfileProvider.user!.fname} ${mzansiProfileProvider.user!.lname}"
: "Name Surname", : "Name Surname",
style: TextStyle( style: TextStyle(
fontSize: 25, fontSize: 25,
@@ -551,7 +559,7 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
), ),
FittedBox( FittedBox(
child: Text( child: Text(
businessUser ? "Business" : "Personal", businessUser == true ? "Business" : "Personal",
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: 15,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@@ -566,8 +574,8 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
child: SizedBox( child: SizedBox(
width: 700, width: 700,
child: Text( child: Text(
widget.arguments.signedInUser.purpose.isNotEmpty mzansiProfileProvider.user!.purpose.isNotEmpty
? widget.arguments.signedInUser.purpose ? mzansiProfileProvider.user!.purpose
: "No Personal Mission added yet", : "No Personal Mission added yet",
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
@@ -588,10 +596,11 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
editProfileWindow(width); editProfileWindow(width);
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300, width: 300,
child: Text( child: Text(
widget.arguments.signedInUser.username.isEmpty mzansiProfileProvider.user!.username.isEmpty
? "Set Up Profile" ? "Set Up Profile"
: "Edit Profile", : "Edit Profile",
style: TextStyle( style: TextStyle(
@@ -607,35 +616,9 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
], ],
), ),
), ),
), );
// Positioned( }
// right: 5, },
// bottom: 10,
// child: MihFloatingMenu(
// animatedIcon: AnimatedIcons.menu_close,
// children: [
// SpeedDialChild(
// child: Icon(
// Icons.edit,
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// label: "Edit Profile",
// 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: () {
// editProfileWindow(width);
// },
// )
// ],
// ),
// ),
],
); );
} }
} }

View File

@@ -1,19 +1,18 @@
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
class MihPersonalSettings extends StatefulWidget { class MihPersonalSettings extends StatefulWidget {
final AppUser signedInUser;
const MihPersonalSettings({ const MihPersonalSettings({
super.key, super.key,
required this.signedInUser,
}); });
@override @override
@@ -35,6 +34,9 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context,
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
return MihPackageAlert( return MihPackageAlert(
alertIcon: Icon( alertIcon: Icon(
Icons.warning_amber_rounded, Icons.warning_amber_rounded,
@@ -51,7 +53,8 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
"This action will remove all of your data, and it cannot be recovered. We understand this is a big decision, so please take a moment to double-check.\n\nIf you're certain, please confirm below. If you've changed your mind, you can simply close this window.", "This action will remove all of your data, and it cannot be recovered. We understand this is a big decision, so please take a moment to double-check.\n\nIf you're certain, please confirm below. If you've changed your mind, you can simply close this window.",
style: TextStyle( style: TextStyle(
color: MihColors.getSecondaryColor( color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 15, fontSize: 15,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
@@ -64,10 +67,11 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
MihButton( MihButton(
onPressed: () { onPressed: () {
MihUserServices.deleteAccount( MihUserServices.deleteAccount(
widget.signedInUser.app_id, context); mzansiProfileProvider, context);
}, },
buttonColor: MihColors.getRedColor( buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300, width: 300,
child: Text( child: Text(
"Delete", "Delete",
@@ -85,7 +89,8 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
Navigator.pop(context); Navigator.pop(context);
}, },
buttonColor: MihColors.getGreenColor( buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"), MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300, width: 300,
child: Text( child: Text(
"Cancel", "Cancel",
@@ -107,6 +112,8 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
); );
}, },
); );
},
);
} }
Widget getBody() { Widget getBody() {

View File

@@ -1,10 +1,15 @@
import 'dart:convert'; import 'dart:convert';
import 'package:go_router/go_router.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/supertokens.dart';
import '../mih_components/mih_pop_up_messages/mih_error_message.dart'; import '../mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
@@ -75,8 +80,9 @@ class MihBusinessDetailsServices {
} }
Future<Business?> getBusinessDetailsByUser( Future<Business?> getBusinessDetailsByUser(
String app_id, BuildContext context,
) async { ) async {
String app_id = await SuperTokens.getUserId();
var response = await http.get( var response = await http.get(
Uri.parse("${AppEnviroment.baseApiUrl}/business/app_id/$app_id"), Uri.parse("${AppEnviroment.baseApiUrl}/business/app_id/$app_id"),
headers: <String, String>{ headers: <String, String>{
@@ -86,7 +92,9 @@ class MihBusinessDetailsServices {
if (response.statusCode == 200) { if (response.statusCode == 200) {
String body = response.body; String body = response.body;
var jsonBody = jsonDecode(body); var jsonBody = jsonDecode(body);
return Business.fromJson(jsonBody); Business? business = Business.fromJson(jsonBody);
context.read<MzansiProfileProvider>().setBusiness(newBusiness: business);
return business;
} else { } else {
return null; return null;
} }
@@ -175,6 +183,7 @@ class MihBusinessDetailsServices {
String businessWebsite, String businessWebsite,
String businessRating, String businessRating,
String businessMissionVision, String businessMissionVision,
MzansiProfileProvider provider,
BuildContext context, BuildContext context,
) async { ) async {
showDialog( showDialog(
@@ -183,6 +192,7 @@ class MihBusinessDetailsServices {
return const Mihloadingcircle(); return const Mihloadingcircle();
}, },
); );
var filePath = "$business_id/business_files/$business_logo_name";
var response = await http.put( var response = await http.put(
Uri.parse("${AppEnviroment.baseApiUrl}/business/update/v2/"), Uri.parse("${AppEnviroment.baseApiUrl}/business/update/v2/"),
headers: <String, String>{ headers: <String, String>{
@@ -194,7 +204,7 @@ class MihBusinessDetailsServices {
"type": business_type, "type": business_type,
"registration_no": business_registration_no, "registration_no": business_registration_no,
"logo_name": business_logo_name, "logo_name": business_logo_name,
"logo_path": "$business_id/business_files/$business_logo_name", "logo_path": filePath,
"contact_no": business_phone_number, "contact_no": business_phone_number,
"bus_email": business_email, "bus_email": business_email,
"gps_location": business_location, "gps_location": business_location,
@@ -205,8 +215,29 @@ class MihBusinessDetailsServices {
"mission_vision": businessMissionVision, "mission_vision": businessMissionVision,
}), }),
); );
Navigator.of(context).pop(); context.pop();
if (response.statusCode == 200) { if (response.statusCode == 200) {
provider.setBusiness(
newBusiness: Business(
business_id,
business_name,
business_type,
business_registration_no,
business_logo_name,
filePath,
business_phone_number,
business_email,
provider.business!.app_id,
business_location,
business_practice_no,
business_vat_no,
businessWebsite,
businessRating,
businessMissionVision,
),
);
String newProPicUrl = await MihFileApi.getMinioFileUrl(filePath, context);
provider.setBusinessProfilePicUrl(newProPicUrl);
return 200; return 200;
} else { } else {
return 500; return 500;

View File

@@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart';
@@ -75,7 +76,7 @@ class MihFileApi {
request.files.add(await http2.MultipartFile.fromBytes('file', file!.bytes!, request.files.add(await http2.MultipartFile.fromBytes('file', file!.bytes!,
filename: file.name.replaceAll(RegExp(r' '), '-'))); filename: file.name.replaceAll(RegExp(r' '), '-')));
var response = await request.send(); var response = await request.send();
Navigator.of(context).pop(); // Pop loading dialog context.pop(); // Pop loading dialog
return response.statusCode; return response.statusCode;
} }
@@ -99,7 +100,7 @@ class MihFileApi {
"env": env, "env": env,
}), }),
); );
Navigator.of(context).pop(); // Pop loading dialog context.pop(); // Pop loading dialog
return response.statusCode; return response.statusCode;
} }

View File

@@ -1,15 +1,22 @@
import 'dart:convert'; import 'dart:convert';
import 'package:go_router/go_router.dart';
import 'package:ken_logger/ken_logger.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/supertokens.dart';
import '../mih_components/mih_pop_up_messages/mih_error_message.dart'; import '../mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
class MihMyBusinessUserServices { class MihMyBusinessUserServices {
Future<BusinessUser?> getBusinessUser( Future<BusinessUser?> getBusinessUser(
String app_id, BuildContext context,
) async { ) async {
String app_id = await SuperTokens.getUserId();
var response = await http.get( var response = await http.get(
Uri.parse("${AppEnviroment.baseApiUrl}/business-user/$app_id"), Uri.parse("${AppEnviroment.baseApiUrl}/business-user/$app_id"),
headers: <String, String>{ headers: <String, String>{
@@ -17,7 +24,13 @@ class MihMyBusinessUserServices {
}, },
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
return BusinessUser.fromJson(jsonDecode(response.body)); KenLogger.success(response.body);
BusinessUser? businessUser =
BusinessUser.fromJson(jsonDecode(response.body));
context
.read<MzansiProfileProvider>()
.setBusinessUser(newBusinessUser: businessUser);
return businessUser;
} else { } else {
return null; return null;
} }
@@ -51,7 +64,7 @@ class MihMyBusinessUserServices {
"access": access, "access": access,
}), }),
); );
Navigator.of(context).pop(); context.pop();
if (response.statusCode == 201) { if (response.statusCode == 201) {
return 201; return 201;
} else { } else {
@@ -67,6 +80,7 @@ class MihMyBusinessUserServices {
String bUserTitle, String bUserTitle,
String bUserAccess, String bUserAccess,
String signatureFileName, String signatureFileName,
MzansiProfileProvider provider,
BuildContext context, BuildContext context,
) async { ) async {
showDialog( showDialog(
@@ -75,6 +89,7 @@ class MihMyBusinessUserServices {
return const Mihloadingcircle(); return const Mihloadingcircle();
}, },
); );
var filePath = "$app_id/business_files/$signatureFileName";
var response = await http.put( var response = await http.put(
Uri.parse("${AppEnviroment.baseApiUrl}/business-user/update/"), Uri.parse("${AppEnviroment.baseApiUrl}/business-user/update/"),
headers: <String, String>{ headers: <String, String>{
@@ -84,32 +99,26 @@ class MihMyBusinessUserServices {
"business_id": business_id, "business_id": business_id,
"app_id": app_id, "app_id": app_id,
"signature": signatureFileName, "signature": signatureFileName,
"sig_path": "$app_id/business_files/$signatureFileName", "sig_path": filePath,
"title": bUserTitle, "title": bUserTitle,
"access": bUserAccess, "access": bUserAccess,
}), }),
); );
// var response = await http.put( context.pop();
// Uri.parse("${AppEnviroment.baseApiUrl}/business/update/"),
// headers: <String, String>{
// "Content-Type": "application/json; charset=UTF-8"
// },
// body: jsonEncode(<String, dynamic>{
// "business_id": business_id,
// "Name": business_name,
// "type": business_type,
// "registration_no": business_registration_no,
// "logo_name": business_logo_name,
// "logo_path": "$business_id/business_files/$business_logo_name",
// "contact_no": business_phone_number,
// "bus_email": business_email,
// "gps_location": business_location,
// "practice_no": business_practice_no,
// "vat_no": business_vat_no,
// }),
// );
Navigator.of(context).pop();
if (response.statusCode == 200) { if (response.statusCode == 200) {
provider.setBusinessUser(
newBusinessUser: BusinessUser(
provider.businessUser!.idbusiness_users,
business_id,
app_id,
signatureFileName,
filePath,
bUserTitle,
bUserAccess,
),
);
String newProPicUrl = await MihFileApi.getMinioFileUrl(filePath, context);
provider.setBusinessUserSignatureUrl(newProPicUrl);
return 200; return 200;
} else { } else {
internetConnectionPopUp(context); internetConnectionPopUp(context);

View File

@@ -61,7 +61,7 @@ class MIHApiCalls {
// Get Userdata // Get Userdata
var uid = await SuperTokens.getUserId(); var uid = await SuperTokens.getUserId();
AppUser? user = await MihUserServices().getUserDetails(uid, context); AppUser? user = await MihUserServices().getUserDetails(context);
if (user != null) { if (user != null) {
userData = user; userData = user;
} else { } else {
@@ -70,7 +70,7 @@ class MIHApiCalls {
// Get BusinessUserdata // Get BusinessUserdata
BusinessUser? businessUser = BusinessUser? businessUser =
await MihMyBusinessUserServices().getBusinessUser(uid); await MihMyBusinessUserServices().getBusinessUser(context);
if (businessUser != null) { if (businessUser != null) {
bUserData = businessUser; bUserData = businessUser;
} else { } else {
@@ -79,9 +79,7 @@ class MIHApiCalls {
// Get Businessdata // Get Businessdata
Business? business = Business? business =
await MihBusinessDetailsServices().getBusinessDetailsByUser( await MihBusinessDetailsServices().getBusinessDetailsByUser(context);
uid,
);
if (business != null) { if (business != null) {
busData = business; busData = business;
} else { } else {

View File

@@ -1,31 +1,39 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/user_consent.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/user_consent.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/supertokens.dart';
class MihUserConsentServices { class MihUserConsentServices {
Future<UserConsent?> getUserConsentStatus() async { Future<void> getUserConsentStatus(
BuildContext context,
) async {
var app_id = await SuperTokens.getUserId(); var app_id = await SuperTokens.getUserId();
final response = await http.get( final response = await http.get(
Uri.parse("${AppEnviroment.baseApiUrl}/user-consent/user/$app_id")); Uri.parse("${AppEnviroment.baseApiUrl}/user-consent/user/$app_id"));
if (response.statusCode == 200) { if (response.statusCode == 200) {
Map<String, dynamic> userMap = jsonDecode(response.body); Map<String, dynamic> userMap = jsonDecode(response.body);
UserConsent userConsent = UserConsent.fromJson(userMap); UserConsent userConsent = UserConsent.fromJson(userMap);
return userConsent; context.read<MzansiProfileProvider>().setUserConsent(userConsent);
} else { // return userConsent;
return null;
} }
// else {
// return null;
// }
} }
Future<int> insertUserConsentStatus( Future<int> insertUserConsentStatus(
String app_id,
String latestPrivacyPolicyDate, String latestPrivacyPolicyDate,
String latestTermOfServiceDate, String latestTermOfServiceDate,
MzansiProfileProvider provider,
BuildContext context,
) async { ) async {
UserConsent userConsent = UserConsent( UserConsent userConsent = UserConsent(
app_id: app_id, app_id: provider.user!.app_id,
privacy_policy_accepted: DateTime.parse(latestPrivacyPolicyDate), privacy_policy_accepted: DateTime.parse(latestPrivacyPolicyDate),
terms_of_services_accepted: DateTime.parse(latestTermOfServiceDate), terms_of_services_accepted: DateTime.parse(latestTermOfServiceDate),
); );
@@ -34,16 +42,18 @@ class MihUserConsentServices {
headers: {"Content-Type": "application/json"}, headers: {"Content-Type": "application/json"},
body: jsonEncode(userConsent.toJson()), body: jsonEncode(userConsent.toJson()),
); );
provider.setUserConsent(userConsent);
return response.statusCode; return response.statusCode;
} }
Future<int> updateUserConsentStatus( Future<int> updateUserConsentStatus(
String app_id,
String latestPrivacyPolicyDate, String latestPrivacyPolicyDate,
String latestTermOfServiceDate, String latestTermOfServiceDate,
MzansiProfileProvider provider,
BuildContext context,
) async { ) async {
UserConsent userConsent = UserConsent( UserConsent userConsent = UserConsent(
app_id: app_id, app_id: provider.user!.app_id,
privacy_policy_accepted: DateTime.parse(latestPrivacyPolicyDate), privacy_policy_accepted: DateTime.parse(latestPrivacyPolicyDate),
terms_of_services_accepted: DateTime.parse(latestTermOfServiceDate), terms_of_services_accepted: DateTime.parse(latestTermOfServiceDate),
); );
@@ -52,6 +62,7 @@ class MihUserConsentServices {
headers: {"Content-Type": "application/json"}, headers: {"Content-Type": "application/json"},
body: jsonEncode(userConsent.toJson()), body: jsonEncode(userConsent.toJson()),
); );
provider.setUserConsent(userConsent);
return response.statusCode; return response.statusCode;
} }
} }

View File

@@ -7,9 +7,12 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:provider/provider.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
import 'package:supertokens_flutter/supertokens.dart'; import 'package:supertokens_flutter/supertokens.dart';
@@ -94,9 +97,9 @@ class MihUserServices {
} }
Future<AppUser?> getUserDetails( Future<AppUser?> getUserDetails(
String app_id,
BuildContext context, BuildContext context,
) async { ) async {
String app_id = await SuperTokens.getUserId();
var response = await http.get( var response = await http.get(
Uri.parse("${AppEnviroment.baseApiUrl}/user/$app_id"), Uri.parse("${AppEnviroment.baseApiUrl}/user/$app_id"),
headers: <String, String>{ headers: <String, String>{
@@ -107,6 +110,9 @@ class MihUserServices {
if (response.statusCode == 200) { if (response.statusCode == 200) {
String body = response.body; String body = response.body;
var jsonBody = jsonDecode(body); var jsonBody = jsonDecode(body);
context.read<MzansiProfileProvider>().setUser(
newUser: AppUser.fromJson(jsonBody),
);
return AppUser.fromJson(jsonBody); return AppUser.fromJson(jsonBody);
} else { } else {
return null; return null;
@@ -147,6 +153,21 @@ class MihUserServices {
}), }),
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
context.read<MzansiProfileProvider>().setUser(
newUser: AppUser(
signedInUser.idUser,
signedInUser.email,
firstName,
lastName,
profileType,
signedInUser.app_id,
username,
filePath,
purpose,
),
);
String newProPicUrl = await MihFileApi.getMinioFileUrl(filePath, context);
context.read<MzansiProfileProvider>().setUserProfilePicUrl(newProPicUrl);
return response.statusCode; return response.statusCode;
} else { } else {
return response.statusCode; return response.statusCode;
@@ -192,7 +213,7 @@ class MihUserServices {
} }
static Future<void> deleteAccount( static Future<void> deleteAccount(
String app_id, MzansiProfileProvider provider,
BuildContext context, BuildContext context,
) async { ) async {
loadingPopUp(context); loadingPopUp(context);
@@ -202,7 +223,7 @@ class MihUserServices {
"Content-Type": "application/json; charset=UTF-8" "Content-Type": "application/json; charset=UTF-8"
}, },
body: jsonEncode(<String, dynamic>{ body: jsonEncode(<String, dynamic>{
"app_id": app_id, "app_id": provider.user!.app_id,
"env": AppEnviroment.getEnv(), "env": AppEnviroment.getEnv(),
}), }),
); );
@@ -212,18 +233,12 @@ class MihUserServices {
print(error); print(error);
}); });
if (await SuperTokens.doesSessionExist() == false) { if (await SuperTokens.doesSessionExist() == false) {
// Navigator.of(context).pop(); // Pop loading dialog
// Navigator.of(context).pop(); // Pop delete account dialog
// Navigator.of(context).pop(); // Pop Mzansi Profile
// Navigator.of(context).popAndPushNamed(
// '/',
// arguments: AuthArguments(true, false),
// ); //Pop and push to login page
successPopUp( successPopUp(
"Account Deleted Successfully", "Account Deleted Successfully",
"Your account has been successfully deleted. We are sorry to see you go, but we respect your decision.", "Your account has been successfully deleted. We are sorry to see you go, but we respect your decision.",
context, context,
); // Show success message. ); // Show success message.
provider.dispose();
} }
} else { } else {
Navigator.of(context).pop(); // Pop loading dialog Navigator.of(context).pop(); // Pop loading dialog

View File

@@ -249,6 +249,7 @@ async def delete_users_data_by_app_id(itemRequest: userDeleteRequest, session:
"DELETE FROM patient_manager.patient_notes where app_id = %s", "DELETE FROM patient_manager.patient_notes where app_id = %s",
"DELETE FROM patient_manager.patient_files where app_id = %s", "DELETE FROM patient_manager.patient_files where app_id = %s",
"DELETE FROM patient_manager.claim_statement_file where app_id = %s", "DELETE FROM patient_manager.claim_statement_file where app_id = %s",
"DELETE FROM app_data.user_consent where app_id = %s",
"DELETE FROM app_data.users where app_id = %s", "DELETE FROM app_data.users where app_id = %s",
] ]
# Delete user from all tables # Delete user from all tables