NEW: Mzansi Directory Provider Setup

This commit is contained in:
2025-10-22 14:43:01 +02:00
parent b0d38b4b11
commit 9bd039ca25
28 changed files with 2007 additions and 1928 deletions

View File

@@ -1,21 +1,23 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.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_alert.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_services/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart';
import 'package:supertokens_flutter/supertokens.dart';
import 'package:provider/provider.dart';
class MihAddBookmarkAlert extends StatefulWidget {
final Business business;
final void Function()? onSuccessDismissPressed;
const MihAddBookmarkAlert({
super.key,
required this.business,
required this.onSuccessDismissPressed,
});
@override
@@ -23,16 +25,16 @@ class MihAddBookmarkAlert extends StatefulWidget {
}
class _MihAddBookmarkAlertState extends State<MihAddBookmarkAlert> {
Future<void> addBookmark(String business_id) async {
Future<void> addBookmark(
MzansiProfileProvider profileProvider, String business_id) async {
showDialog(
context: context,
builder: (context) {
return const Mihloadingcircle();
},
);
String user_id = await SuperTokens.getUserId();
await MihMzansiDirectoryServices()
.addBookmarkedBusiness(user_id, business_id)
.addBookmarkedBusiness(profileProvider.user!.app_id, business_id)
.then((statusCode) {
context.pop();
if (statusCode == 201) {
@@ -77,14 +79,9 @@ class _MihAddBookmarkAlertState extends State<MihAddBookmarkAlert> {
Center(
child: MihButton(
onPressed: () {
context.goNamed(
"mzansiDirectory",
extra: MzansiDirectoryArguments(
personalSearch: false,
startSearchText: widget.business.Name,
packageIndex: 1,
),
);
widget.onSuccessDismissPressed!.call();
context.pop();
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
@@ -117,69 +114,76 @@ class _MihAddBookmarkAlertState extends State<MihAddBookmarkAlert> {
@override
Widget build(BuildContext context) {
return MihPackageAlert(
alertColour: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
alertIcon: Icon(
Icons.warning_rounded,
size: 100,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
alertTitle: "Bookmark Business",
alertBody: Column(
children: [
Text(
"Are you sure you want to save ${widget.business.Name} to your Mzansi Directory?",
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
),
return Consumer<MzansiProfileProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
Widget? child) {
return MihPackageAlert(
alertColour: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
alertIcon: Icon(
Icons.warning_rounded,
size: 100,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
const SizedBox(height: 25),
Wrap(
spacing: 10,
runSpacing: 10,
alertTitle: "Bookmark Business",
alertBody: Column(
children: [
MihButton(
width: 300,
onPressed: () async {
Navigator.of(context).pop();
},
buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
Text(
"Are you sure you want to save ${widget.business.Name} to your Mzansi Directory?",
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 15,
),
),
MihButton(
width: 300,
onPressed: () {
addBookmark(widget.business.business_id);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
child: Text(
"Bookmark Business",
style: TextStyle(
color: MihColors.getPrimaryColor(
const SizedBox(height: 25),
Wrap(
spacing: 10,
runSpacing: 10,
children: [
MihButton(
width: 300,
onPressed: () async {
Navigator.of(context).pop();
},
buttonColor: MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
child: Text(
"Cancel",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
MihButton(
width: 300,
onPressed: () {
addBookmark(profileProvider, widget.business.business_id);
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
child: Text(
"Bookmark Business",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
],
),
],
),
);
},
);
}
}

View File

@@ -7,23 +7,24 @@ import 'package:mzansi_innovation_hub/mih_components/mih_objects/business_review
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.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_package_alert.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/components/mih_review_business_window.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services.dart';
import 'package:provider/provider.dart';
import 'package:redacted/redacted.dart';
import 'package:supertokens_flutter/supertokens.dart';
import 'package:url_launcher/url_launcher.dart';
class MihBusinessCard extends StatefulWidget {
final Business business;
final String? startUpSearch;
final double width;
const MihBusinessCard({
super.key,
required this.business,
required this.startUpSearch,
required this.width,
});
@@ -409,274 +410,292 @@ class _MihBusinessCardState extends State<MihBusinessCard> {
@override
Widget build(BuildContext context) {
// double screenWidth = MediaQuery.of(context).size.width;
return Material(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark")
.withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(25),
elevation: 10,
shadowColor: Colors.black,
child: Container(
decoration: BoxDecoration(
return Consumer<MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
Widget? child) {
return Material(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
borderRadius: BorderRadius.circular(10),
),
child: Column(
children: [
const SizedBox(height: 10),
_buildContactInfo(
"Call",
"Give us a quick call.",
Icons.phone,
MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark")
.withValues(alpha: 0.6),
borderRadius: BorderRadius.circular(25),
elevation: 10,
shadowColor: Colors.black,
child: Container(
decoration: BoxDecoration(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
// print("Calling ${widget.cellNumber}");
_makePhoneCall(widget.business.contact_no);
},
borderRadius: BorderRadius.circular(10),
),
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
_buildContactInfo(
"Email",
"Send us an email.",
Icons.email,
MihColors.getPinkColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
// print("Emailing ${widget.email}");
_launchEmail(
widget.business.bus_email,
"Inquiery about ${widget.business.Name}",
"Dear ${widget.business.Name},\n\nI would like to inquire about your services.\n\nBest regards,\n",
);
},
),
Visibility(
visible: isValidGps(widget.business.gps_location),
child: Column(
children: [
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
child: Column(
children: [
const SizedBox(height: 10),
_buildContactInfo(
"Call",
"Give us a quick call.",
Icons.phone,
MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
// print("Calling ${widget.cellNumber}");
_makePhoneCall(widget.business.contact_no);
},
),
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
_buildContactInfo(
"Email",
"Send us an email.",
Icons.email,
MihColors.getPinkColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
// print("Emailing ${widget.email}");
_launchEmail(
widget.business.bus_email,
"Inquiery about ${widget.business.Name}",
"Dear ${widget.business.Name},\n\nI would like to inquire about your services.\n\nBest regards,\n",
);
},
),
Visibility(
visible: isValidGps(widget.business.gps_location),
child: Column(
children: [
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
_buildContactInfo(
"Location",
"Come visit us.",
Icons.location_on,
MihColors.getOrangeColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
final latitude = double.parse(
widget.business.gps_location.split(',')[0]);
final longitude = double.parse(
widget.business.gps_location.split(',')[1]);
_launchGoogleMapsWithUrl(
latitude: latitude,
longitude: longitude,
);
},
),
],
),
_buildContactInfo(
"Location",
"Come visit us.",
Icons.location_on,
MihColors.getOrangeColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
final latitude = double.parse(
widget.business.gps_location.split(',')[0]);
final longitude = double.parse(
widget.business.gps_location.split(',')[1]);
_launchGoogleMapsWithUrl(
latitude: latitude,
longitude: longitude,
),
Visibility(
visible: widget.business.website.isNotEmpty &&
widget.business.website != "",
child: Column(
children: [
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
_buildContactInfo(
"Website",
"Find out more about us.",
Icons.vpn_lock,
MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
_launchWebsite(widget.business.website);
},
),
],
),
),
FutureBuilder(
future: _businessReviewFuture,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState ==
ConnectionState.waiting) {
// return const SizedBox.shrink();
return Column(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
Container(
child: _buildContactInfo(
"Loading Rating",
"Loading your rating.",
Icons.star_rate_rounded,
MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
true,
null,
),
).redacted(context: context, redact: true),
],
);
},
),
],
),
} else {
BusinessReview? businessReview = asyncSnapshot.data;
String ratingDisplayTitle = "";
if (businessReview == null) {
ratingDisplayTitle = "Rate Us";
} else {
ratingDisplayTitle = "Update Rating";
}
return Column(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
_buildContactInfo(
ratingDisplayTitle,
"Let us know how we are doing.",
Icons.star_rate_rounded,
MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
businessReviewRatingWindow(directoryProvider,
businessReview, true, widget.width);
},
),
],
);
}
},
),
FutureBuilder(
future: _bookmarkedBusinessFuture,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState ==
ConnectionState.waiting) {
// return const SizedBox.shrink();
return Column(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
Container(
child: _buildContactInfo(
"Loading Bookmark",
"Loading your bookmark.",
Icons.bookmark_add_rounded,
MihColors.getBluishPurpleColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
true,
null,
),
),
],
);
} else {
BookmarkedBusiness? bookmarkBusiness = asyncSnapshot.data;
String bookmarkDisplayTitle = "";
if (bookmarkBusiness == null) {
bookmarkDisplayTitle = "Bookmark Us";
} else {
bookmarkDisplayTitle = "Remove Bookmark";
}
return Column(
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
_buildContactInfo(
bookmarkDisplayTitle,
"Save us for later.",
bookmarkBusiness == null
? Icons.bookmark_add_rounded
: Icons.bookmark_remove_rounded,
MihColors.getBluishPurpleColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
// _launchWebsite(widget.website);
if (bookmarkBusiness == null) {
showAddBookmarkAlert();
} else {
showDeleteBookmarkAlert(bookmarkBusiness);
}
},
),
],
);
}
},
),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 10.0),
// child: Divider(
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// ),
// _buildContactInfo(
// "Bookmark",
// "Save us for later.",
// Icons.bookmark_add_rounded,
// MihColors.getBluishPurpleColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// () {
// // _launchWebsite(widget.website);
// print("Saving ${widget.business.Name} to Directory");
// showBookmarkAlert();
// },
// ),
const SizedBox(height: 10),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 10.0),
// child: Divider(
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// ),
],
),
Visibility(
visible: widget.business.website.isNotEmpty &&
widget.business.website != "",
child: Column(
children: [
Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
_buildContactInfo(
"Website",
"Find out more about us.",
Icons.vpn_lock,
MihColors.getRedColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
false,
() {
_launchWebsite(widget.business.website);
},
),
],
),
),
FutureBuilder(
future: _businessReviewFuture,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState == ConnectionState.waiting) {
// return const SizedBox.shrink();
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
Container(
child: _buildContactInfo(
"Loading Rating",
"Loading your rating.",
Icons.star_rate_rounded,
MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
true,
null,
),
).redacted(context: context, redact: true),
],
);
} else {
BusinessReview? businessReview = asyncSnapshot.data;
String ratingDisplayTitle = "";
if (businessReview == null) {
ratingDisplayTitle = "Rate Us";
} else {
ratingDisplayTitle = "Update Rating";
}
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
_buildContactInfo(
ratingDisplayTitle,
"Let us know how we are doing.",
Icons.star_rate_rounded,
MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
businessReviewRatingWindow(
businessReview, true, widget.width);
},
),
],
);
}
},
),
FutureBuilder(
future: _bookmarkedBusinessFuture,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState == ConnectionState.waiting) {
// return const SizedBox.shrink();
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
Container(
child: _buildContactInfo(
"Loading Bookmark",
"Loading your bookmark.",
Icons.bookmark_add_rounded,
MihColors.getBluishPurpleColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
true,
null,
),
),
],
);
} else {
BookmarkedBusiness? bookmarkBusiness = asyncSnapshot.data;
String bookmarkDisplayTitle = "";
if (bookmarkBusiness == null) {
bookmarkDisplayTitle = "Bookmark Us";
} else {
bookmarkDisplayTitle = "Remove Bookmark";
}
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Divider(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
_buildContactInfo(
bookmarkDisplayTitle,
"Save us for later.",
bookmarkBusiness == null
? Icons.bookmark_add_rounded
: Icons.bookmark_remove_rounded,
MihColors.getBluishPurpleColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
false,
() {
// _launchWebsite(widget.website);
if (bookmarkBusiness == null) {
showAddBookmarkAlert();
} else {
showDeleteBookmarkAlert(bookmarkBusiness);
}
},
),
],
);
}
},
),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 10.0),
// child: Divider(
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// ),
// _buildContactInfo(
// "Bookmark",
// "Save us for later.",
// Icons.bookmark_add_rounded,
// MihColors.getBluishPurpleColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// () {
// // _launchWebsite(widget.website);
// print("Saving ${widget.business.Name} to Directory");
// showBookmarkAlert();
// },
// ),
const SizedBox(height: 10),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 10.0),
// child: Divider(
// color: MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// ),
// ),
],
),
),
),
);
},
);
}
Future<void> businessReviewRatingWindow(
BusinessReview? myReview, bool previouslyRated, double width) async {
MzansiDirectoryProvider directoryProvider,
BusinessReview? myReview,
bool previouslyRated,
double width) async {
if (_isUserSignedIn) {
showDialog(
context: context,
@@ -685,6 +704,17 @@ class _MihBusinessCardState extends State<MihBusinessCard> {
businessReview: myReview,
screenWidth: width,
readOnly: false,
onSuccessDismissPressed: () async {
List<Business>? businessSearchResults = [];
businessSearchResults = await MihBusinessDetailsServices()
.searchBusinesses(directoryProvider.searchTerm,
directoryProvider.businessTypeFilter, context);
directoryProvider.setSearchedBusinesses(
searchedBusinesses: businessSearchResults);
setState(() {
_businessReviewFuture = getUserReview();
});
},
),
);
} else {
@@ -698,6 +728,11 @@ class _MihBusinessCardState extends State<MihBusinessCard> {
context: context,
builder: (context) => MihAddBookmarkAlert(
business: widget.business,
onSuccessDismissPressed: () {
setState(() {
_bookmarkedBusinessFuture = getUserBookmark();
});
},
),
);
} else {
@@ -712,7 +747,12 @@ class _MihBusinessCardState extends State<MihBusinessCard> {
builder: (context) => MihDeleteBookmarkAlert(
business: widget.business,
bookmarkBusiness: bookmarkBusiness,
startUpSearch: widget.startUpSearch,
onSuccessDismissPressed: () {
setState(() {
_bookmarkedBusinessFuture = getUserBookmark();
});
},
// startUpSearch: widget.startUpSearch,
));
} else {
showSignInRequiredAlert();

View File

@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/bookmarked_business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
@@ -14,12 +13,14 @@ import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_directory_services
class MihDeleteBookmarkAlert extends StatefulWidget {
final Business business;
final BookmarkedBusiness? bookmarkBusiness;
final String? startUpSearch;
final void Function()? onSuccessDismissPressed;
// final String? startUpSearch;
const MihDeleteBookmarkAlert({
super.key,
required this.business,
required this.bookmarkBusiness,
required this.startUpSearch,
required this.onSuccessDismissPressed,
// required this.startUpSearch,
});
@override
@@ -80,14 +81,17 @@ class _MihDeleteBookmarkAlertState extends State<MihDeleteBookmarkAlert> {
Center(
child: MihButton(
onPressed: () {
context.goNamed(
"mzansiDirectory",
extra: MzansiDirectoryArguments(
personalSearch: false,
startSearchText: widget.business.Name,
packageIndex: 1,
),
);
// context.goNamed(
// "mzansiDirectory",
// extra: MzansiDirectoryArguments(
// personalSearch: false,
// startSearchText: widget.business.Name,
// packageIndex: 1,
// ),
// );
widget.onSuccessDismissPressed!.call();
context.pop();
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),

View File

@@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:go_router/go_router.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_review.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
@@ -13,23 +12,28 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
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_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_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_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_mzansi_directory_services.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart';
import 'package:supertokens_flutter/supertokens.dart';
import 'package:provider/provider.dart';
class MihReviewBusinessWindow extends StatefulWidget {
final Business business;
final BusinessReview? businessReview;
final double screenWidth;
final bool readOnly;
final void Function()? onSuccessDismissPressed;
const MihReviewBusinessWindow({
super.key,
required this.business,
required this.businessReview,
required this.screenWidth,
required this.readOnly,
required this.onSuccessDismissPressed,
});
@override
@@ -47,9 +51,8 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
TextEditingController();
late final VoidCallback _reviewDescriptionListener;
final ValueNotifier<int> _counter = ValueNotifier<int>(0);
String userId = "";
void showDeleteReviewAlert() {
void showDeleteReviewAlert(MzansiDirectoryProvider directoryProvider) {
showDialog(
context: context,
builder: (context) => MihPackageAlert(
@@ -93,10 +96,11 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
widget.businessReview!.rating_score,
widget.business.rating,
)
.then((statusCode) {
.then((statusCode) async {
context.pop(); //Remove loading dialog
context.pop(); //Remove delete dialog
if (statusCode == 200) {
await refreshBusiness(directoryProvider);
context.pop(); //Remove window
successPopUp(
"Successfully Deleted Review!",
@@ -160,7 +164,19 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
}
}
void submitForm() async {
Future<void> refreshBusiness(
MzansiDirectoryProvider directoryProvider) async {
Business? refresedBusiness = await MihBusinessDetailsServices()
.getBusinessDetailsByBusinessId(widget.business.business_id);
if (refresedBusiness != null) {
directoryProvider.setSelectedBusiness(business: refresedBusiness);
}
}
void submitForm(
MzansiProfileProvider profileProvider,
MzansiDirectoryProvider directoryProvider,
) async {
showDialog(
context: context,
builder: (context) {
@@ -178,9 +194,10 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
widget.businessReview!.rating_score,
widget.business.rating,
)
.then((statusCode) {
.then((statusCode) async {
context.pop(); //Remove loading dialog
if (statusCode == 200) {
await refreshBusiness(directoryProvider);
context.pop();
successPopUp(
"Successfully Updated Review!",
@@ -197,16 +214,17 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
} else {
await MihMzansiDirectoryServices()
.addBusinessReview(
userId,
profileProvider.user!.app_id,
widget.business.business_id,
_reviewTitleController.text,
_reviewDescriptionController.text,
_reviewScoreController.text,
widget.business.rating.isEmpty ? "0.0" : widget.business.rating,
)
.then((statusCode) {
.then((statusCode) async {
context.pop(); //Remove loading dialog
if (statusCode == 201) {
await refreshBusiness(directoryProvider);
context.pop();
successPopUp(
"Successfully Added Review!",
@@ -250,13 +268,15 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
Center(
child: MihButton(
onPressed: () {
context.goNamed(
"mzansiDirectory",
extra: MzansiDirectoryArguments(
personalSearch: false,
startSearchText: widget.business.Name,
),
);
// context.goNamed(
// "mzansiDirectory",
// extra: MzansiDirectoryArguments(
// personalSearch: false,
// startSearchText: widget.business.Name,
// ),
// );
widget.onSuccessDismissPressed!.call();
context.pop();
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
@@ -323,265 +343,277 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
} else {
_reviewScoreController.text = "1.0"; // Default score
}
SuperTokens.getUserId().then((value) {
setState(() {
userId = value;
});
});
}
@override
Widget build(BuildContext context) {
// return const Placeholder();
return MihPackageWindow(
fullscreen: false,
windowTitle: getWindowTitle(),
onWindowTapClose: () {
Navigator.of(context).pop();
},
menuOptions: widget.businessReview != null && !widget.readOnly
? [
SpeedDialChild(
child: Icon(
Icons.delete,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
label: "Delete Review",
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: () {
showDeleteReviewAlert();
},
),
]
: null,
windowBody: MihSingleChildScroll(
child: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
return Consumer2<MzansiProfileProvider, MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiProfileProvider profileProvider,
MzansiDirectoryProvider directoryProvider, Widget? child) {
return MihPackageWindow(
fullscreen: false,
windowTitle: getWindowTitle(),
onWindowTapClose: () {
Navigator.of(context).pop();
},
menuOptions: widget.businessReview != null && !widget.readOnly
? [
SpeedDialChild(
child: Icon(
Icons.delete,
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
label: "Delete Review",
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: () {
showDeleteReviewAlert(directoryProvider);
},
),
]
: null,
windowBody: MihSingleChildScroll(
child: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
"desktop"
? EdgeInsets.symmetric(horizontal: widget.screenWidth * 0.05)
: EdgeInsets.symmetric(horizontal: widget.screenWidth * 0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
MihForm(
formKey: _formKey,
formFields: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Business Rating",
textAlign: TextAlign.left,
style: TextStyle(
color: MihColors.getSecondaryColor(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [
MihForm(
formKey: _formKey,
formFields: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Business Rating",
textAlign: TextAlign.left,
style: TextStyle(
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
),
const SizedBox(height: 4),
widget.readOnly
? RatingBar.readOnly(
size: 50,
alignment: Alignment.centerLeft,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// filledColor: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
isHalfAllowed: true,
initialRating: widget.businessReview != null
? double.parse(_reviewScoreController.text)
: 1,
maxRating: 5,
)
: RatingBar(
size: 50,
alignment: Alignment.centerLeft,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
isHalfAllowed: true,
initialRating: widget.businessReview != null
? double.parse(_reviewScoreController.text)
: 1,
maxRating: 5,
onRatingChanged: (double) {
setState(() {
_reviewScoreController.text =
double.toStringAsFixed(1);
});
print(_reviewScoreController.text);
},
),
Visibility(
visible: widget.readOnly,
child: const SizedBox(height: 10),
),
Visibility(
visible: widget.readOnly,
child: MihTextFormField(
// width: 200,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 18,
fontWeight: FontWeight.bold,
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _reviewReviewerController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "Reviewer",
validator: (value) {
return null;
},
),
),
const SizedBox(height: 10),
MihTextFormField(
// width: 200,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _reviewTitleController,
multiLineInput: false,
requiredText: true,
readOnly: widget.readOnly,
hintText: "Review Title",
validator: (value) {
return MihValidationServices()
.isEmpty(_reviewTitleController.text);
},
),
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: _reviewDescriptionController,
multiLineInput: true,
requiredText: widget.readOnly,
readOnly: widget.readOnly,
hintText: "Review Description",
validator: (value) {
if (_reviewDescriptionController.text.isEmpty) {
return null;
} else {
return MihValidationServices().validateLength(
_reviewDescriptionController.text, 256);
}
},
),
Visibility(
visible: !widget.readOnly,
child: 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: 25),
Visibility(
visible: !widget.readOnly,
child: Center(
child: MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
submitForm(
profileProvider,
directoryProvider,
);
} else {
MihAlertServices()
.formNotFilledCompletely(context);
}
},
buttonColor: MihColors.getGreenColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
width: 300,
child: Text(
widget.businessReview != null
? "Update Review"
: "Add Review",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
),
],
),
const SizedBox(height: 4),
widget.readOnly
? RatingBar.readOnly(
size: 50,
alignment: Alignment.centerLeft,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// filledColor: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
isHalfAllowed: true,
initialRating: widget.businessReview != null
? double.parse(_reviewScoreController.text)
: 1,
maxRating: 5,
)
: RatingBar(
size: 50,
alignment: Alignment.centerLeft,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
isHalfAllowed: true,
initialRating: widget.businessReview != null
? double.parse(_reviewScoreController.text)
: 1,
maxRating: 5,
onRatingChanged: (double) {
setState(() {
_reviewScoreController.text =
double.toStringAsFixed(1);
});
print(_reviewScoreController.text);
},
),
Visibility(
visible: widget.readOnly,
child: const SizedBox(height: 10),
),
Visibility(
visible: widget.readOnly,
child: MihTextFormField(
// width: 200,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
controller: _reviewReviewerController,
multiLineInput: false,
requiredText: true,
readOnly: true,
hintText: "Reviewer",
validator: (value) {
return null;
},
),
),
const SizedBox(height: 10),
MihTextFormField(
// width: 200,
fillColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
inputColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
controller: _reviewTitleController,
multiLineInput: false,
requiredText: true,
readOnly: widget.readOnly,
hintText: "Review Title",
validator: (value) {
return MihValidationServices()
.isEmpty(_reviewTitleController.text);
},
),
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: _reviewDescriptionController,
multiLineInput: true,
requiredText: widget.readOnly,
readOnly: widget.readOnly,
hintText: "Review Description",
validator: (value) {
if (_reviewDescriptionController.text.isEmpty) {
return null;
} else {
return MihValidationServices().validateLength(
_reviewDescriptionController.text, 256);
}
},
),
Visibility(
visible: !widget.readOnly,
child: 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: 25),
Visibility(
visible: !widget.readOnly,
child: 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(
widget.businessReview != null
? "Update Review"
: "Add Review",
style: TextStyle(
color: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
),
],
),
],
),
),
),
),
);
},
);
}
}

View File

@@ -86,7 +86,7 @@ class _MzansiBusinessProfileState extends State<MzansiBusinessProfile> {
business: context.watch<MzansiProfileProvider>().business!),
MihBusinessQrCode(
business: context.watch<MzansiProfileProvider>().business!,
startUpSearch: "",
// startUpSearch: "",
),
];
return toolBodies;

View File

@@ -1,23 +1,22 @@
import 'package:go_router/go_router.dart';
import 'package:ken_logger/ken_logger.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_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_tools.dart';
import 'package:flutter/material.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_directory_provider.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_profile_provider.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details_view.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_packages/mzansi_profile/business_profile/package_tools/mih_business_reviews.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
import 'package:provider/provider.dart';
class MzansiBusinessProfileView extends StatefulWidget {
final BusinessViewArguments? arguments;
final String? businessId;
const MzansiBusinessProfileView({
super.key,
required this.arguments,
required this.businessId,
});
@@ -28,16 +27,10 @@ class MzansiBusinessProfileView extends StatefulWidget {
class _MzansiBusinessProfileViewState extends State<MzansiBusinessProfileView> {
int _selcetedIndex = 0;
Business? business;
String startUpSearch = "";
Future<void> _fetchBusinessDetails() async {
if (widget.arguments != null) {
setState(() {
business = widget.arguments!.business;
startUpSearch = widget.arguments!.startUpSearch ?? "";
});
} else if (widget.businessId != null) {
Future<void> _fetchBusinessDetails(
MzansiDirectoryProvider directoryProvider) async {
if (widget.businessId != null) {
final biz = await MihBusinessDetailsServices()
.getBusinessDetailsByBusinessId(widget.businessId!);
if (biz == null) {
@@ -47,10 +40,7 @@ class _MzansiBusinessProfileViewState extends State<MzansiBusinessProfileView> {
);
} else {
KenLogger.success("Business found: ${biz.Name}");
setState(() {
business = biz;
startUpSearch = "";
});
directoryProvider.setSelectedBusiness(business: biz);
}
}
}
@@ -58,32 +48,39 @@ class _MzansiBusinessProfileViewState extends State<MzansiBusinessProfileView> {
@override
void initState() {
super.initState();
_fetchBusinessDetails();
MzansiDirectoryProvider directoryProvider =
context.read<MzansiDirectoryProvider>();
_fetchBusinessDetails(directoryProvider);
}
@override
Widget build(BuildContext context) {
if (business == null) {
KenLogger.warning("Business is null, showing loading indicator");
return Scaffold(
body: const Center(
child: Mihloadingcircle(),
),
);
} else {
return MihPackage(
appActionButton: getAction(),
appTools: getTools(),
appBody: getToolBody(),
appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
},
);
}
return Consumer<MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
Widget? child) {
if (directoryProvider.selectedBusiness == null) {
KenLogger.warning("Business is null, showing loading indicator");
return Scaffold(
body: const Center(
child: Mihloadingcircle(),
),
);
} else {
return MihPackage(
appActionButton: getAction(),
appTools: getTools(),
appBody: getToolBody(directoryProvider),
appToolTitles: getToolTitle(),
selectedbodyIndex: _selcetedIndex,
onIndexChange: (newValue) {
setState(() {
_selcetedIndex = newValue;
});
},
);
}
},
);
}
MihPackageAction getAction() {
@@ -91,13 +88,18 @@ class _MzansiBusinessProfileViewState extends State<MzansiBusinessProfileView> {
icon: const Icon(Icons.arrow_back),
iconSize: 35,
onTap: () {
context.goNamed(
"mzansiDirectory",
extra: MzansiDirectoryArguments(
personalSearch: false,
startSearchText: business!.Name,
),
);
MzansiProfileProvider profileProvider =
context.read<MzansiProfileProvider>();
if (profileProvider.user == null) {
context.goNamed(
'mihHome',
);
} else {
context.pop();
}
// context.goNamed(
// "mzansiDirectory",
// );
FocusScope.of(context).unfocus();
},
);
@@ -126,16 +128,12 @@ class _MzansiBusinessProfileViewState extends State<MzansiBusinessProfileView> {
);
}
List<Widget> getToolBody() {
List<Widget> getToolBody(MzansiDirectoryProvider directoryProvider) {
List<Widget> toolBodies = [
MihBusinessDetailsView(
business: business!,
startUpSearch: startUpSearch,
),
MihBusinessReviews(business: business!),
MihBusinessDetailsView(),
MihBusinessReviews(business: directoryProvider.selectedBusiness!),
MihBusinessQrCode(
business: business!,
startUpSearch: startUpSearch,
business: directoryProvider.selectedBusiness!,
)
];
return toolBodies;

View File

@@ -135,7 +135,7 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
width: 700,
child: MihBusinessCard(
business: mzansiProfileProvider.business!,
startUpSearch: null,
// startUpSearch: null,
width: width,
),
),

View File

@@ -2,22 +2,19 @@ import 'package:custom_rating_bar/custom_rating_bar.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_provider.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_services/mih_file_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_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:provider/provider.dart';
class MihBusinessDetailsView extends StatefulWidget {
final Business business;
final String? startUpSearch;
const MihBusinessDetailsView({
super.key,
required this.business,
required this.startUpSearch,
});
@override
@@ -36,8 +33,10 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
@override
void initState() {
super.initState();
futureImageUrl =
MihFileApi.getMinioFileUrl(widget.business.logo_path, context);
MzansiDirectoryProvider directoryProvider =
context.read<MzansiDirectoryProvider>();
futureImageUrl = MihFileApi.getMinioFileUrl(
directoryProvider.selectedBusiness!.logo_path, context);
}
@override
@@ -52,173 +51,182 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
Widget getBody(double width, BuildContext context) {
double profilePictureWidth = 150;
return Stack(
children: [
MihSingleChildScroll(
child: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
return Consumer<MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
Widget? child) {
return Stack(
children: [
MihSingleChildScroll(
child: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
"desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column(
children: [
FutureBuilder(
future: futureImageUrl,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState ==
ConnectionState.done &&
asyncSnapshot.hasData) {
if (asyncSnapshot.requireData != "") {
return MihCircleAvatar(
imageFile: NetworkImage(asyncSnapshot.requireData),
width: profilePictureWidth,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: () {},
);
} else {
return Icon(
MihIcons.iDontKnow,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
} else {
return Icon(
MihIcons.mihRing,
size: profilePictureWidth,
child: Column(
children: [
FutureBuilder(
future: futureImageUrl,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState ==
ConnectionState.done &&
asyncSnapshot.hasData) {
if (asyncSnapshot.requireData != "") {
return MihCircleAvatar(
imageFile:
NetworkImage(asyncSnapshot.requireData),
width: profilePictureWidth,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
onChange: () {},
);
} else {
return Icon(
MihIcons.iDontKnow,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!
.theme
.mode ==
"Dark"),
);
}
} else {
return Icon(
MihIcons.mihRing,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
}),
// Center(
// child: MihCircleAvatar(
// imageFile: widget.logoImage,
// width: 150,
// editable: false,
// 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;
// });
// },
// ),
// ),
FittedBox(
child: Text(
directoryProvider.selectedBusiness!.Name,
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
}),
// Center(
// child: MihCircleAvatar(
// imageFile: widget.logoImage,
// width: 150,
// editable: false,
// 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;
// });
// },
// ),
// ),
FittedBox(
child: Text(
widget.business.Name,
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
FittedBox(
child: Text(
widget.business.type,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
const SizedBox(height: 5),
// FittedBox(
// child: Text(
// "Mission & Vision",
// style: TextStyle(
// fontSize: 15,
// fontWeight: FontWeight.bold,
// color: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
// ),
// ),
// ),
Center(
child: SizedBox(
width: 700,
child: Text(
widget.business.mission_vision.isNotEmpty
? widget.business.mission_vision
: "No Mission & Vision added yet",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
),
FittedBox(
child: Text(
directoryProvider.selectedBusiness!.type,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
const SizedBox(height: 5),
// FittedBox(
// child: Text(
// "Mission & Vision",
// style: TextStyle(
// fontSize: 15,
// fontWeight: FontWeight.bold,
// color: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
// ),
// ),
// ),
Center(
child: SizedBox(
width: 700,
child: Text(
directoryProvider
.selectedBusiness!.mission_vision.isNotEmpty
? directoryProvider
.selectedBusiness!.mission_vision
: "No Mission & Vision added yet",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
),
const SizedBox(height: 10),
RatingBar.readOnly(
size: 50,
alignment: Alignment.center,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
isHalfAllowed: true,
initialRating:
directoryProvider.selectedBusiness!.rating.isNotEmpty
? double.parse(
directoryProvider.selectedBusiness!.rating)
: 0,
maxRating: 5,
),
const SizedBox(height: 20),
SizedBox(
width: 700,
child: MihBusinessCard(
business: directoryProvider.selectedBusiness!,
width: width,
),
),
],
),
const SizedBox(height: 10),
RatingBar.readOnly(
size: 50,
alignment: Alignment.center,
filledIcon: Icons.star,
emptyIcon: Icons.star_border,
halfFilledIcon: Icons.star_half,
filledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
emptyColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
halfFilledColor: MihColors.getYellowColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
isHalfAllowed: true,
initialRating: widget.business.rating.isNotEmpty
? double.parse(widget.business.rating)
: 0,
maxRating: 5,
),
const SizedBox(height: 20),
SizedBox(
width: 700,
child: MihBusinessCard(
business: widget.business,
startUpSearch: widget.startUpSearch,
// businessid: widget.business.business_id,
// businessName: widget.business.Name,
// cellNumber: widget.business.contact_no,
// email: widget.business.bus_email,
// gpsLocation: widget.business.gps_location,
// rating: widget.business.rating.isNotEmpty
// ? double.parse(widget.business.rating)
// : 0,
// website: widget.business.website,
width: width,
),
),
],
),
),
),
),
],
],
);
},
);
}
}

View File

@@ -25,11 +25,11 @@ import 'package:supertokens_flutter/supertokens.dart';
class MihBusinessQrCode extends StatefulWidget {
final Business business;
final String? startUpSearch;
// final String? startUpSearch;
const MihBusinessQrCode({
super.key,
required this.business,
required this.startUpSearch,
// required this.startUpSearch,
});
@override

View File

@@ -41,6 +41,7 @@ class _MihBusinessReviewsState extends State<MihBusinessReviews> {
businessReview: businessReview,
screenWidth: width,
readOnly: true,
onSuccessDismissPressed: () {},
);
},
);

View File

@@ -1,6 +1,4 @@
import 'package:go_router/go_router.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_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_tools.dart';
@@ -8,10 +6,8 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profi
import 'package:flutter/material.dart';
class MzansiProfileView extends StatefulWidget {
final AppUser user;
const MzansiProfileView({
super.key,
required this.user,
});
@override
@@ -42,13 +38,7 @@ class _MzansiProfileViewState extends State<MzansiProfileView> {
icon: const Icon(Icons.arrow_back),
iconSize: 35,
onTap: () {
context.goNamed(
"mzansiDirectory",
extra: MzansiDirectoryArguments(
personalSearch: true,
startSearchText: widget.user.username,
),
);
context.pop();
FocusScope.of(context).unfocus();
},
);
@@ -69,9 +59,9 @@ class _MzansiProfileViewState extends State<MzansiProfileView> {
List<Widget> getToolBody() {
List<Widget> toolBodies = [];
toolBodies.add(MihPersonalProfileView(
user: widget.user,
));
toolBodies.add(
MihPersonalProfileView(),
);
return toolBodies;
}

View File

@@ -1,6 +1,6 @@
import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_providers/mzansi_directory_provider.dart';
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart';
@@ -8,12 +8,11 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_circle_avatar.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MihPersonalProfileView extends StatefulWidget {
final AppUser user;
const MihPersonalProfileView({
super.key,
required this.user,
});
@override
@@ -32,8 +31,10 @@ class _MihPersonalProfileViewState extends State<MihPersonalProfileView> {
@override
void initState() {
super.initState();
futureImageUrl =
MihFileApi.getMinioFileUrl(widget.user.pro_pic_path, context);
MzansiDirectoryProvider directoryProvider =
context.read<MzansiDirectoryProvider>();
futureImageUrl = MihFileApi.getMinioFileUrl(
directoryProvider.selectedUser!.pro_pic_path, context);
}
@override
@@ -48,152 +49,123 @@ class _MihPersonalProfileViewState extends State<MihPersonalProfileView> {
Widget getBody(double width) {
double profilePictureWidth = 150;
return MihSingleChildScroll(
child: Padding(
padding: MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
FutureBuilder(
future: futureImageUrl,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState == ConnectionState.done &&
asyncSnapshot.hasData) {
if (asyncSnapshot.requireData != "") {
return MihCircleAvatar(
imageFile: NetworkImage(asyncSnapshot.requireData),
width: profilePictureWidth,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: () {},
);
} else {
return Icon(
MihIcons.iDontKnow,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
} else {
return Icon(
MihIcons.mihRing,
size: profilePictureWidth,
return Consumer<MzansiDirectoryProvider>(
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
Widget? child) {
return MihSingleChildScroll(
child: Padding(
padding:
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
? EdgeInsets.symmetric(horizontal: width * 0.2)
: EdgeInsets.symmetric(horizontal: width * 0.075),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
FutureBuilder(
future: futureImageUrl,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.connectionState ==
ConnectionState.done &&
asyncSnapshot.hasData) {
if (asyncSnapshot.requireData != "") {
return MihCircleAvatar(
imageFile: NetworkImage(asyncSnapshot.requireData),
width: profilePictureWidth,
editable: false,
fileNameController: TextEditingController(),
userSelectedfile: file,
frameColor: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
backgroundColor: MihColors.getPrimaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
onChange: () {},
);
} else {
return Icon(
MihIcons.iDontKnow,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
} else {
return Icon(
MihIcons.mihRing,
size: profilePictureWidth,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
}),
FittedBox(
child: Text(
directoryProvider.selectedUser!.username.isNotEmpty
? directoryProvider.selectedUser!.username
: "Username",
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
);
}
// return Center(
// child: MihCircleAvatar(
// imageFile: propicPreview,
// width: 150,
// editable: false,
// fileNameController: proPicController,
// userSelectedfile: proPic,
// frameColor: MzansiInnovationHub.of(context)!
// .theme
// .secondaryColor(),
// backgroundColor:
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// onChange: (selectedImage) {
// setState(() {
// proPic = selectedImage;
// });
// },
// ),
// );
}),
FittedBox(
child: Text(
widget.user.username.isNotEmpty
? widget.user.username
: "Username",
style: TextStyle(
fontSize: 35,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
),
FittedBox(
child: Text(
widget.user.fname.isNotEmpty
? "${widget.user.fname} ${widget.user.lname}"
: "Name Surname",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
),
FittedBox(
child: Text(
widget.user.type.toUpperCase(),
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
),
const SizedBox(height: 10.0),
Center(
child: SizedBox(
width: 700,
child: Text(
widget.user.purpose.isNotEmpty
? widget.user.purpose
: "No Personal Mission added yet",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
),
),
),
),
FittedBox(
child: Text(
directoryProvider.selectedUser!.fname.isNotEmpty
? "${directoryProvider.selectedUser!.fname} ${directoryProvider.selectedUser!.lname}"
: "Name Surname",
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
FittedBox(
child: Text(
directoryProvider.selectedUser!.type.toUpperCase(),
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
const SizedBox(height: 10.0),
Center(
child: SizedBox(
width: 700,
child: Text(
directoryProvider.selectedUser!.purpose.isNotEmpty
? directoryProvider.selectedUser!.purpose
: "No Personal Mission added yet",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: MihColors.getSecondaryColor(
MzansiInnovationHub.of(context)!.theme.mode ==
"Dark"),
),
),
),
),
const SizedBox(height: 30.0),
],
),
const SizedBox(height: 30.0),
// Center(
// child: MihButton(
// onPressed: () {
// // Connect with the user
// },
// buttonColor:
// MihColors.getGreenColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// width: 300,
// child: Text(
// widget.user.username.isEmpty
// ? "Set Up Profile"
// : "Edit Profile",
// style: TextStyle(
// color:
// MihColors.getPrimaryColor(MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
// fontSize: 20,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// ),
],
),
),
),
);
},
);
}
}