Compare commits
31 Commits
V.1.2.5
...
518dd1300e
| Author | SHA1 | Date | |
|---|---|---|---|
| 518dd1300e | |||
| 221030eff3 | |||
| 707b49c088 | |||
| 5135629b33 | |||
| bb64be077f | |||
| 281ea863e8 | |||
| 64af64f28b | |||
| 1c0dd6d328 | |||
| 07d4ba4afa | |||
| 6ad6b6ccbd | |||
| ce2575035f | |||
| baea2c9fdb | |||
| 27639cb964 | |||
| 1143d11054 | |||
| 213f3d418d | |||
| e33a62b909 | |||
| ebab9bae52 | |||
| 82c25c5406 | |||
| 3f0fc08a5c | |||
| f137ea41ac | |||
| a7effa3576 | |||
| 74341a9cc6 | |||
| c5267c0540 | |||
| d4ba3aaa03 | |||
| 103ccdc022 | |||
| f8a722eb50 | |||
| fdb28080e3 | |||
| 8a384921c5 | |||
| 4b47bf5288 | |||
| 141611b84d | |||
| a29d0afeb8 |
11
.vscode/launch.json
vendored
11
.vscode/launch.json
vendored
@@ -11,6 +11,17 @@
|
|||||||
"type": "dart",
|
"type": "dart",
|
||||||
"program": "lib/main_dev.dart"
|
"program": "lib/main_dev.dart"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Debug (web)",
|
||||||
|
"cwd": "mih_ui",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"program": "lib/main_dev.dart",
|
||||||
|
"args": [
|
||||||
|
"--web-port",
|
||||||
|
"1995"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Profile",
|
"name": "Profile",
|
||||||
"cwd": "mih_ui",
|
"cwd": "mih_ui",
|
||||||
|
|||||||
@@ -42,18 +42,21 @@ st_api_key = os.getenv("SUPERTOKENS_API_KEY")
|
|||||||
origins = [
|
origins = [
|
||||||
"http://localhost",
|
"http://localhost",
|
||||||
"http://localhost:80",
|
"http://localhost:80",
|
||||||
|
"http://localhost:1995",
|
||||||
"http://localhost:8080",
|
"http://localhost:8080",
|
||||||
"http://MIH-API-Hub:80",
|
"http://MIH-API-Hub:80",
|
||||||
"http://MIH-API-Hub",
|
"http://MIH-API-Hub",
|
||||||
"http://api.mzansi-innovation-hub.co.za",
|
"http://api.mzansi-innovation-hub.co.za",
|
||||||
"http://app.mzansi-innovation-hub.co.za",
|
"http://app.mzansi-innovation-hub.co.za",
|
||||||
|
"https://api.mzansi-innovation-hub.co.za",
|
||||||
|
"https://app.mzansi-innovation-hub.co.za",
|
||||||
]
|
]
|
||||||
|
|
||||||
init(
|
init(
|
||||||
app_info=InputAppInfo(
|
app_info=InputAppInfo(
|
||||||
app_name="Mzansi Innovation Hub",
|
app_name="Mzansi Innovation Hub",
|
||||||
api_domain="http://localhost:8080/",
|
api_domain="http://localhost:8080/",
|
||||||
website_domain="http://app.mzansi-innovation-hub.co.za",
|
website_domain="https://app.mzansi-innovation-hub.co.za",
|
||||||
api_base_path="/auth",
|
api_base_path="/auth",
|
||||||
website_base_path="/auth"
|
website_base_path="/auth"
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ watchfiles
|
|||||||
python-multipart
|
python-multipart
|
||||||
python-dotenv
|
python-dotenv
|
||||||
xlrd
|
xlrd
|
||||||
supertokens-python
|
supertokens-python==0.24.0
|
||||||
sniffio
|
sniffio
|
||||||
@@ -5,5 +5,6 @@
|
|||||||
<item>@drawable/mzansi_wallet_sc</item>
|
<item>@drawable/mzansi_wallet_sc</item>
|
||||||
<item>@drawable/mzansi_ai_sc</item>
|
<item>@drawable/mzansi_ai_sc</item>
|
||||||
<item>@drawable/mih_calculator_sc</item>
|
<item>@drawable/mih_calculator_sc</item>
|
||||||
|
<item>@drawable/mzansi_directory_sc</item>
|
||||||
</array>
|
</array>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -26,7 +26,15 @@ abstract class AppEnviroment {
|
|||||||
baseApiUrl = "http://localhost:8080";
|
baseApiUrl = "http://localhost:8080";
|
||||||
baseFileUrl = "http://localhost:9000";
|
baseFileUrl = "http://localhost:9000";
|
||||||
baseAiUrl = "http://localhost:11434";
|
baseAiUrl = "http://localhost:11434";
|
||||||
bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174';
|
bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; // IOS ID
|
||||||
|
break;
|
||||||
|
} else if (Platform.isIOS || Platform.isLinux) {
|
||||||
|
//================= Web Dev Urls =================
|
||||||
|
baseAppUrl = "http://localhost:80";
|
||||||
|
baseApiUrl = "http://localhost:8080";
|
||||||
|
baseFileUrl = "http://localhost:9000";
|
||||||
|
baseAiUrl = "http://localhost:11434";
|
||||||
|
bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; // IOS ID
|
||||||
break;
|
break;
|
||||||
} else if (Platform.isAndroid) {
|
} else if (Platform.isAndroid) {
|
||||||
//================= Android Dev Urls =================
|
//================= Android Dev Urls =================
|
||||||
@@ -35,14 +43,6 @@ abstract class AppEnviroment {
|
|||||||
baseFileUrl = "http://10.0.2.2:9000";
|
baseFileUrl = "http://10.0.2.2:9000";
|
||||||
baseAiUrl = "http://10.0.2.2:11434";
|
baseAiUrl = "http://10.0.2.2:11434";
|
||||||
bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741';
|
bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741';
|
||||||
} else {
|
|
||||||
//================= Web & iOS Dev Urls =================
|
|
||||||
baseAppUrl = "http://localhost:80";
|
|
||||||
baseApiUrl = "http://localhost:8080";
|
|
||||||
baseFileUrl = "http://localhost:9000";
|
|
||||||
baseAiUrl = "http://localhost:11434";
|
|
||||||
bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174';
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case Enviroment.prod:
|
case Enviroment.prod:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class MihTheme {
|
|||||||
late String loadingAssetText;
|
late String loadingAssetText;
|
||||||
late TargetPlatform platform;
|
late TargetPlatform platform;
|
||||||
bool kIsWeb = const bool.fromEnvironment('dart.library.js_util');
|
bool kIsWeb = const bool.fromEnvironment('dart.library.js_util');
|
||||||
String latestVersion = "1.2.5";
|
String latestVersion = "1.2.6";
|
||||||
MihTheme() {
|
MihTheme() {
|
||||||
mode = "Dark";
|
mode = "Dark";
|
||||||
}
|
}
|
||||||
@@ -98,6 +98,12 @@ class MihTheme {
|
|||||||
return "Android";
|
return "Android";
|
||||||
} else if (platform == TargetPlatform.iOS) {
|
} else if (platform == TargetPlatform.iOS) {
|
||||||
return "iOS";
|
return "iOS";
|
||||||
|
} else if (platform == TargetPlatform.linux) {
|
||||||
|
return "Linux";
|
||||||
|
} else if (platform == TargetPlatform.macOS) {
|
||||||
|
return "macOS";
|
||||||
|
} else if (platform == TargetPlatform.windows) {
|
||||||
|
return "Windows";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "Other";
|
return "Other";
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:country_code_picker/country_code_picker.dart';
|
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/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
||||||
import 'package:geolocator/geolocator.dart';
|
import 'package:geolocator/geolocator.dart';
|
||||||
@@ -161,6 +164,7 @@ class _PackageToolOneState extends State<PackageToolOne> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
@@ -450,7 +454,8 @@ class _PackageToolOneState extends State<PackageToolOne> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
MihBannerAd(),
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS))
|
||||||
|
MihBannerAd(),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Divider(
|
Divider(
|
||||||
color: MihColors.getSecondaryColor(
|
color: MihColors.getSecondaryColor(
|
||||||
@@ -773,6 +778,7 @@ class _PackageToolOneState extends State<PackageToolOne> {
|
|||||||
MihCircleAvatar(
|
MihCircleAvatar(
|
||||||
imageFile: imagePreview,
|
imageFile: imagePreview,
|
||||||
width: 50,
|
width: 50,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: _fileNameController,
|
fileNameController: _fileNameController,
|
||||||
userSelectedfile: file,
|
userSelectedfile: file,
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ class _PackageToolThreeState extends State<PackageToolThree> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class _PackageToolTwoState extends State<PackageToolTwo> {
|
|||||||
|
|
||||||
Widget getBody() {
|
Widget getBody() {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class _PackageToolZeroState extends State<PackageToolZero> {
|
|||||||
|
|
||||||
Widget getBody() {
|
Widget getBody() {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
659
mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart
Normal file
659
mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart
Normal file
@@ -0,0 +1,659 @@
|
|||||||
|
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_objects/bookmarked_business.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_objects/business.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_objects/business_review.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/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_providers/mzansi_profile_provider.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_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 MihBusinessCardV2 extends StatefulWidget {
|
||||||
|
final Business business;
|
||||||
|
final double width;
|
||||||
|
const MihBusinessCardV2({
|
||||||
|
super.key,
|
||||||
|
required this.business,
|
||||||
|
required this.width,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<MihBusinessCardV2> createState() => _MihBusinessCardV2State();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MihBusinessCardV2State extends State<MihBusinessCardV2> {
|
||||||
|
Future<BusinessReview?>? _businessReviewFuture;
|
||||||
|
Future<BookmarkedBusiness?>? _bookmarkedBusinessFuture;
|
||||||
|
bool _isUserSignedIn = false;
|
||||||
|
|
||||||
|
Future<void> _checkUserSession() async {
|
||||||
|
final doesSessionExist = await SuperTokens.doesSessionExist();
|
||||||
|
setState(() {
|
||||||
|
_isUserSignedIn = doesSessionExist;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
RedactedConfiguration getRedactedConfiguration() {
|
||||||
|
return RedactedConfiguration(
|
||||||
|
// redactedColor: Colors.pink,
|
||||||
|
redactedColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _makePhoneCall(String phoneNumber) async {
|
||||||
|
String formattedNumber = phoneNumber.replaceAll("-", "");
|
||||||
|
final Uri url = Uri(scheme: 'tel', path: formattedNumber);
|
||||||
|
if (await canLaunchUrl(url)) {
|
||||||
|
await launchUrl(url);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Making Call",
|
||||||
|
"We couldn't open your phone app to call $formattedNumber. To fix this, make sure you have a phone application installed and it's set as your default dialer.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String? _encodeQueryParameters(Map<String, String> params) {
|
||||||
|
return params.entries
|
||||||
|
.map((MapEntry<String, String> e) =>
|
||||||
|
'${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}')
|
||||||
|
.join('&');
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _launchEmail(
|
||||||
|
String recipient, String subject, String body) async {
|
||||||
|
final Uri emailLaunchUri = Uri(
|
||||||
|
scheme: 'mailto',
|
||||||
|
path: recipient,
|
||||||
|
query: _encodeQueryParameters(<String, String>{
|
||||||
|
'subject': subject,
|
||||||
|
'body': body,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
if (await canLaunchUrl(emailLaunchUri)) {
|
||||||
|
await launchUrl(emailLaunchUri);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Creating Email",
|
||||||
|
"We couldn't launch your email app to send a message to $recipient. To fix this, please confirm that you have an email application installed and that it's set as your default.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _launchGoogleMapsWithUrl({
|
||||||
|
required double latitude,
|
||||||
|
required double longitude,
|
||||||
|
String? label,
|
||||||
|
}) async {
|
||||||
|
final Uri googleMapsUrl = Uri.parse(
|
||||||
|
'https://www.google.com/maps/search/?api=1&query=$latitude,$longitude${label != null ? '&query_place_id=' : ''}',
|
||||||
|
);
|
||||||
|
try {
|
||||||
|
if (await canLaunchUrl(googleMapsUrl)) {
|
||||||
|
await launchUrl(googleMapsUrl);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Opening Maps",
|
||||||
|
"There was an issue opening maps for ${widget.business.Name}. This usually happens if you don't have a maps app installed or it's not set as your default. Please install one to proceed.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Opening Maps",
|
||||||
|
"There was an issue opening maps for ${widget.business.Name}. This usually happens if you don't have a maps app installed or it's not set as your default. Please install one to proceed.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _launchWebsite(String urlString) async {
|
||||||
|
String newUrl = urlString;
|
||||||
|
if (!newUrl.startsWith("https://")) {
|
||||||
|
newUrl = "https://$urlString";
|
||||||
|
}
|
||||||
|
final Uri url = Uri.parse(newUrl);
|
||||||
|
try {
|
||||||
|
if (await canLaunchUrl(url)) {
|
||||||
|
await launchUrl(url);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Opening Website",
|
||||||
|
"We couldn't open the link to $newUrl. To view this website, please ensure you have a web browser installed and set as your default.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
MihAlertServices().errorBasicAlert(
|
||||||
|
"Error Opening Website",
|
||||||
|
"We couldn't open the link to $newUrl. To view this website, please ensure you have a web browser installed and set as your default.",
|
||||||
|
context,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<BusinessReview?> getUserReview() async {
|
||||||
|
String user_id = await SuperTokens.getUserId();
|
||||||
|
return await MihMzansiDirectoryServices().getUserReviewOfBusiness(
|
||||||
|
user_id,
|
||||||
|
widget.business.business_id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<BookmarkedBusiness?> getUserBookmark() async {
|
||||||
|
String user_id = await SuperTokens.getUserId();
|
||||||
|
return await MihMzansiDirectoryServices().getUserBookmarkOfBusiness(
|
||||||
|
user_id,
|
||||||
|
widget.business.business_id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isValidGps(String coordinateString) {
|
||||||
|
final RegExp gpsRegex = RegExp(
|
||||||
|
r"^-?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*-?(1[0-7]\d(\.\d+)?|180(\.0+)?|\d{1,2}(\.\d+)?)$");
|
||||||
|
return gpsRegex.hasMatch(coordinateString);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_checkUserSession();
|
||||||
|
_businessReviewFuture = getUserReview();
|
||||||
|
_bookmarkedBusinessFuture = getUserBookmark();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
// double screenWidth = MediaQuery.of(context).size.width;
|
||||||
|
return Consumer2<MzansiProfileProvider, MzansiDirectoryProvider>(
|
||||||
|
builder: (BuildContext context, MzansiProfileProvider profileProvider,
|
||||||
|
MzansiDirectoryProvider directoryProvider, Widget? child) {
|
||||||
|
double iconSize = 50.0;
|
||||||
|
return Wrap(
|
||||||
|
alignment: WrapAlignment.center,
|
||||||
|
runSpacing: 10,
|
||||||
|
spacing: 10,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
_makePhoneCall(widget.business.contact_no);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.phone,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"Call",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
_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",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getPinkColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.email,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"Email",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (isValidGps(widget.business.gps_location))
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
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,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getOrangeColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.location_on,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"Maps",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (widget.business.website.isNotEmpty &&
|
||||||
|
widget.business.website != "")
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
_launchWebsite(widget.business.website);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getRedColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.language,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"Website",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
FutureBuilder(
|
||||||
|
future: _businessReviewFuture,
|
||||||
|
builder: (context, asyncSnapshot) {
|
||||||
|
if (asyncSnapshot.connectionState == ConnectionState.waiting) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {},
|
||||||
|
buttonColor: MihColors.getGreyColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.star_rate_rounded,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
).redacted(context: context, redact: true),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"Rate Us",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
).redacted(context: context, redact: true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
BusinessReview? businessReview = asyncSnapshot.data;
|
||||||
|
String ratingTitle = "";
|
||||||
|
if (businessReview == null) {
|
||||||
|
ratingTitle = "Rate Us";
|
||||||
|
} else {
|
||||||
|
ratingTitle = "Edit";
|
||||||
|
}
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
businessReviewRatingWindow(directoryProvider,
|
||||||
|
businessReview, true, widget.width);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getYellowColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.star_rate_rounded,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
ratingTitle,
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
FutureBuilder(
|
||||||
|
future: _bookmarkedBusinessFuture,
|
||||||
|
builder: (context, asyncSnapshot) {
|
||||||
|
if (asyncSnapshot.connectionState == ConnectionState.waiting) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {},
|
||||||
|
buttonColor: MihColors.getGreyColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Icon(
|
||||||
|
Icons.bookmark_add_rounded,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
).redacted(context: context, redact: true),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
"bookmark",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
).redacted(context: context, redact: true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
BookmarkedBusiness? bookmarkBusiness = asyncSnapshot.data;
|
||||||
|
String bookmarkDisplayTitle = "";
|
||||||
|
if (bookmarkBusiness == null) {
|
||||||
|
bookmarkDisplayTitle = "Bookmark";
|
||||||
|
} else {
|
||||||
|
bookmarkDisplayTitle = "Remove";
|
||||||
|
}
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
MihButton(
|
||||||
|
width: 80,
|
||||||
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
|
if (bookmarkBusiness == null) {
|
||||||
|
showAddBookmarkAlert();
|
||||||
|
} else {
|
||||||
|
showDeleteBookmarkAlert(bookmarkBusiness);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getBluishPurpleColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Icon(
|
||||||
|
bookmarkBusiness == null
|
||||||
|
? Icons.bookmark_add_rounded
|
||||||
|
: Icons.bookmark_remove_rounded,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
size: iconSize,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 2),
|
||||||
|
FittedBox(
|
||||||
|
child: Text(
|
||||||
|
bookmarkDisplayTitle,
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> businessReviewRatingWindow(
|
||||||
|
MzansiDirectoryProvider directoryProvider,
|
||||||
|
BusinessReview? myReview,
|
||||||
|
bool previouslyRated,
|
||||||
|
double width) async {
|
||||||
|
if (_isUserSignedIn) {
|
||||||
|
showDialog(
|
||||||
|
barrierDismissible: false,
|
||||||
|
context: context,
|
||||||
|
builder: (context) => MihReviewBusinessWindow(
|
||||||
|
business: widget.business,
|
||||||
|
businessReview: myReview,
|
||||||
|
screenWidth: width,
|
||||||
|
readOnly: false,
|
||||||
|
onSuccessDismissPressed: () async {
|
||||||
|
List<Business>? businessSearchResults = [];
|
||||||
|
businessSearchResults = await MihBusinessDetailsServices()
|
||||||
|
.searchBusinesses(directoryProvider.searchTerm,
|
||||||
|
directoryProvider.businessTypeFilter, context);
|
||||||
|
Map<String, Future<String>> busImagesUrl = {};
|
||||||
|
Future<String> businessLogoUrl;
|
||||||
|
for (var bus in businessSearchResults) {
|
||||||
|
businessLogoUrl = MihFileApi.getMinioFileUrl(bus.logo_path);
|
||||||
|
busImagesUrl[bus.business_id] = businessLogoUrl;
|
||||||
|
}
|
||||||
|
directoryProvider.setSearchedBusinesses(
|
||||||
|
searchedBusinesses: businessSearchResults,
|
||||||
|
businessesImagesUrl: busImagesUrl,
|
||||||
|
);
|
||||||
|
setState(() {
|
||||||
|
_businessReviewFuture = getUserReview();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
showSignInRequiredAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void showAddBookmarkAlert() {
|
||||||
|
if (_isUserSignedIn) {
|
||||||
|
showDialog(
|
||||||
|
barrierDismissible: false,
|
||||||
|
context: context,
|
||||||
|
builder: (context) => MihAddBookmarkAlert(
|
||||||
|
business: widget.business,
|
||||||
|
onSuccessDismissPressed: () async {
|
||||||
|
_bookmarkedBusinessFuture = getUserBookmark();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
showSignInRequiredAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void showDeleteBookmarkAlert(BookmarkedBusiness? bookmarkBusiness) {
|
||||||
|
if (_isUserSignedIn) {
|
||||||
|
showDialog(
|
||||||
|
barrierDismissible: false,
|
||||||
|
context: context,
|
||||||
|
builder: (context) => MihDeleteBookmarkAlert(
|
||||||
|
business: widget.business,
|
||||||
|
bookmarkBusiness: bookmarkBusiness,
|
||||||
|
onSuccessDismissPressed: () {
|
||||||
|
_bookmarkedBusinessFuture = getUserBookmark();
|
||||||
|
},
|
||||||
|
// startUpSearch: widget.startUpSearch,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
showSignInRequiredAlert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void showSignInRequiredAlert() {
|
||||||
|
showDialog(
|
||||||
|
barrierDismissible: false,
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return MihPackageWindow(
|
||||||
|
fullscreen: false,
|
||||||
|
windowTitle: null,
|
||||||
|
onWindowTapClose: () {
|
||||||
|
context.pop();
|
||||||
|
},
|
||||||
|
windowBody: Column(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
MihIcons.mihLogo,
|
||||||
|
size: 125,
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Text(
|
||||||
|
"Let's Get Started",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
fontSize: 25,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 15),
|
||||||
|
Text(
|
||||||
|
"Ready to dive in to the world of MIH?\nSign in or create a free MIH account to unlock all the powerful features of the MIH app. It's quick and easy!",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
fontSize: 15,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 25),
|
||||||
|
Center(
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
context.goNamed(
|
||||||
|
'mihHome',
|
||||||
|
extra: true,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
elevation: 10,
|
||||||
|
width: 300,
|
||||||
|
child: Text(
|
||||||
|
"Sign In/ Create Account",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -68,6 +68,7 @@ class _MihBusinessProfilePreviewState extends State<MihBusinessProfilePreview> {
|
|||||||
: MihCircleAvatar(
|
: MihCircleAvatar(
|
||||||
imageFile: widget.imageFile,
|
imageFile: widget.imageFile,
|
||||||
width: profilePictureWidth,
|
width: profilePictureWidth,
|
||||||
|
expandable: false,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: TextEditingController(),
|
fileNameController: TextEditingController(),
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -2,13 +2,17 @@ import 'dart:io';
|
|||||||
|
|
||||||
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: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_package_components/mih_icons.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.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_package_components/mih_package_window.dart';
|
||||||
|
|
||||||
class MihCircleAvatar extends StatefulWidget {
|
class MihCircleAvatar extends StatefulWidget {
|
||||||
final ImageProvider<Object>? imageFile;
|
final ImageProvider<Object>? imageFile;
|
||||||
final double width;
|
final double width;
|
||||||
|
final bool expandable;
|
||||||
final bool editable;
|
final bool editable;
|
||||||
final TextEditingController? fileNameController;
|
final TextEditingController? fileNameController;
|
||||||
final onChange;
|
final onChange;
|
||||||
@@ -19,6 +23,7 @@ class MihCircleAvatar extends StatefulWidget {
|
|||||||
super.key,
|
super.key,
|
||||||
required this.imageFile,
|
required this.imageFile,
|
||||||
required this.width,
|
required this.width,
|
||||||
|
required this.expandable,
|
||||||
required this.editable,
|
required this.editable,
|
||||||
required this.fileNameController,
|
required this.fileNameController,
|
||||||
required this.userSelectedfile,
|
required this.userSelectedfile,
|
||||||
@@ -35,23 +40,33 @@ class _MihCircleAvatarState extends State<MihCircleAvatar> {
|
|||||||
late ImageProvider<Object>? imagePreview;
|
late ImageProvider<Object>? imagePreview;
|
||||||
|
|
||||||
ImageProvider<Object>? getAvatar() {
|
ImageProvider<Object>? getAvatar() {
|
||||||
// Color dark = const Color(0XFF3A4454);
|
|
||||||
if (widget.imageFile == null) {
|
if (widget.imageFile == null) {
|
||||||
return null;
|
return null;
|
||||||
// if (widget.backgroundColor == dark) {
|
|
||||||
// print("here in light icon");
|
|
||||||
// return const AssetImage(
|
|
||||||
// 'lib/mih_package_components/assets/images/i-dont-know-light.png');
|
|
||||||
// } else {
|
|
||||||
// print("here in dark icon");
|
|
||||||
// return const AssetImage(
|
|
||||||
// 'lib/mih_package_components/assets/images/i-dont-know-dark.png');
|
|
||||||
// }
|
|
||||||
} else {
|
} else {
|
||||||
return widget.imageFile;
|
return widget.imageFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void expandAvatar() {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return MihPackageWindow(
|
||||||
|
fullscreen: true,
|
||||||
|
windowTitle: "",
|
||||||
|
scrollbarOn: false,
|
||||||
|
onWindowTapClose: () {
|
||||||
|
context.pop();
|
||||||
|
},
|
||||||
|
windowBody: SizedBox.expand(
|
||||||
|
child: InteractiveViewer(
|
||||||
|
child: Image(image: imagePreview!),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@@ -62,111 +77,121 @@ class _MihCircleAvatarState extends State<MihCircleAvatar> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return GestureDetector(
|
||||||
// color: Colors.white,
|
onTap: widget.expandable
|
||||||
alignment: Alignment.center,
|
? () {
|
||||||
width: widget.width,
|
KenLogger.success("Avatar tapped");
|
||||||
height: widget.width,
|
expandAvatar();
|
||||||
child: Stack(
|
}
|
||||||
|
: null,
|
||||||
|
child: Container(
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
width: widget.width,
|
||||||
Visibility(
|
height: widget.width,
|
||||||
visible: imagePreview != null,
|
child: Stack(
|
||||||
child: Positioned(
|
alignment: Alignment.center,
|
||||||
right: widget.width * 0.03,
|
children: [
|
||||||
child: CircleAvatar(
|
Visibility(
|
||||||
radius: widget.width / 2.2,
|
visible: imagePreview != null,
|
||||||
backgroundColor: widget.backgroundColor,
|
child: Positioned(
|
||||||
backgroundImage: imagePreview,
|
right: widget.width * 0.03,
|
||||||
|
child: CircleAvatar(
|
||||||
|
radius: widget.width / 2.2,
|
||||||
|
backgroundColor: widget.backgroundColor,
|
||||||
|
backgroundImage: imagePreview,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
Visibility(
|
||||||
Visibility(
|
visible: imagePreview != null,
|
||||||
visible: imagePreview != null,
|
child: Icon(
|
||||||
child: Icon(
|
size: widget.width,
|
||||||
size: widget.width,
|
MihIcons.mihRing,
|
||||||
MihIcons.mihRing,
|
color: widget.frameColor,
|
||||||
color: widget.frameColor,
|
),
|
||||||
),
|
),
|
||||||
),
|
Visibility(
|
||||||
Visibility(
|
visible: imagePreview == null,
|
||||||
visible: imagePreview == null,
|
child: Icon(
|
||||||
child: Icon(
|
MihIcons.iDontKnow,
|
||||||
MihIcons.iDontKnow,
|
size: widget.width,
|
||||||
size: widget.width,
|
color: widget.frameColor,
|
||||||
color: widget.frameColor,
|
),
|
||||||
),
|
),
|
||||||
),
|
Visibility(
|
||||||
Visibility(
|
visible: widget.editable,
|
||||||
visible: widget.editable,
|
child: Positioned(
|
||||||
child: Positioned(
|
bottom: 0,
|
||||||
bottom: 0,
|
right: 0,
|
||||||
right: 0,
|
child: IconButton.filled(
|
||||||
child: IconButton.filled(
|
style: ButtonStyle(
|
||||||
style: ButtonStyle(
|
backgroundColor: WidgetStateProperty.all<Color>(
|
||||||
backgroundColor: WidgetStateProperty.all<Color>(
|
MihColors.getGreenColor(
|
||||||
MihColors.getGreenColor(
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
"Dark"),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
onPressed: () async {
|
||||||
onPressed: () async {
|
try {
|
||||||
try {
|
FilePickerResult? result =
|
||||||
FilePickerResult? result =
|
await FilePicker.platform.pickFiles(
|
||||||
await FilePicker.platform.pickFiles(
|
type: FileType.image,
|
||||||
type: FileType.image,
|
);
|
||||||
);
|
// print("Here 1");
|
||||||
// print("Here 1");
|
if (MzansiInnovationHub.of(context)!
|
||||||
if (MzansiInnovationHub.of(context)!.theme.getPlatform() ==
|
.theme
|
||||||
"Web") {
|
.getPlatform() ==
|
||||||
// print("Here 2");
|
"Web") {
|
||||||
if (result == null) return;
|
// print("Here 2");
|
||||||
// print("Here 3");
|
if (result == null) return;
|
||||||
PlatformFile? selectedFile = result.files.first;
|
// print("Here 3");
|
||||||
setState(() {
|
PlatformFile? selectedFile = result.files.first;
|
||||||
// print("Here 4");
|
|
||||||
widget.onChange(selectedFile);
|
|
||||||
// print("Here 5");
|
|
||||||
imagePreview = MemoryImage(selectedFile.bytes!);
|
|
||||||
});
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
widget.fileNameController!.text = selectedFile.name;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (result != null) {
|
|
||||||
File file = File(result.files.single.path!);
|
|
||||||
PlatformFile? androidFile = PlatformFile(
|
|
||||||
path: file.path,
|
|
||||||
name: file.path.split('/').last,
|
|
||||||
size: file.lengthSync(),
|
|
||||||
bytes: await file.readAsBytes(), // Read file bytes
|
|
||||||
//extension: fileExtension,
|
|
||||||
);
|
|
||||||
setState(() {
|
setState(() {
|
||||||
widget.onChange(androidFile);
|
// print("Here 4");
|
||||||
imagePreview = FileImage(file);
|
widget.onChange(selectedFile);
|
||||||
|
// print("Here 5");
|
||||||
|
imagePreview = MemoryImage(selectedFile.bytes!);
|
||||||
});
|
});
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
widget.fileNameController!.text =
|
widget.fileNameController!.text = selectedFile.name;
|
||||||
file.path.split('/').last;
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
print("here in else");
|
if (result != null) {
|
||||||
// User canceled the picker
|
File file = File(result.files.single.path!);
|
||||||
|
PlatformFile? androidFile = PlatformFile(
|
||||||
|
path: file.path,
|
||||||
|
name: file.path.split('/').last,
|
||||||
|
size: file.lengthSync(),
|
||||||
|
bytes: await file.readAsBytes(), // Read file bytes
|
||||||
|
//extension: fileExtension,
|
||||||
|
);
|
||||||
|
setState(() {
|
||||||
|
widget.onChange(androidFile);
|
||||||
|
imagePreview = FileImage(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
widget.fileNameController!.text =
|
||||||
|
file.path.split('/').last;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
print("here in else");
|
||||||
|
// User canceled the picker
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print("Here Error: $e");
|
||||||
}
|
}
|
||||||
} catch (e) {
|
},
|
||||||
print("Here Error: $e");
|
icon: Icon(
|
||||||
}
|
Icons.camera_alt,
|
||||||
},
|
),
|
||||||
icon: Icon(
|
|
||||||
Icons.camera_alt,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,6 +103,18 @@ class _MihDropdownFieldState extends State<MihDropdownField> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: Theme(
|
child: Theme(
|
||||||
data: Theme.of(context).copyWith(
|
data: Theme.of(context).copyWith(
|
||||||
|
scrollbarTheme: ScrollbarThemeData(
|
||||||
|
thumbColor: WidgetStatePropertyAll(
|
||||||
|
MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark")),
|
||||||
|
thickness: const WidgetStatePropertyAll(6),
|
||||||
|
radius: const Radius.circular(10),
|
||||||
|
thumbVisibility: const WidgetStatePropertyAll(
|
||||||
|
true), // Always show when scrolling
|
||||||
|
),
|
||||||
textSelectionTheme: TextSelectionThemeData(
|
textSelectionTheme: TextSelectionThemeData(
|
||||||
cursorColor: MihColors.getPrimaryColor(
|
cursorColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ class _MihloadingcircleState extends State<Mihloadingcircle>
|
|||||||
late AnimationController _controller;
|
late AnimationController _controller;
|
||||||
late Animation<double> _animation;
|
late Animation<double> _animation;
|
||||||
|
|
||||||
late double width;
|
|
||||||
late double height;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@@ -82,16 +79,15 @@ class _MihloadingcircleState extends State<Mihloadingcircle>
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
widget.message != null
|
if (widget.message != null)
|
||||||
? Text(
|
Text(
|
||||||
widget.message!,
|
widget.message!,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
: SizedBox(),
|
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
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/mih_package_components/mih_scack_bar.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_scack_bar.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_package_components/mih_package_tools.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tools.dart';
|
||||||
@@ -100,7 +102,7 @@ class _MihPackageState extends State<MihPackage>
|
|||||||
// _peakAnimation();
|
// _peakAnimation();
|
||||||
// });
|
// });
|
||||||
// }
|
// }
|
||||||
if (!MzansiInnovationHub.of(context)!.theme.kIsWeb) {
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
|
||||||
// Trigger the peak animation only AFTER the route transition is complete
|
// Trigger the peak animation only AFTER the route transition is complete
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
final ModalRoute? currentRoute = ModalRoute.of(context);
|
final ModalRoute? currentRoute = ModalRoute.of(context);
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:app_settings/app_settings.dart';
|
import 'package:app_settings/app_settings.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:local_auth/local_auth.dart';
|
import 'package:local_auth/local_auth.dart';
|
||||||
@@ -155,7 +157,8 @@ class _MihPackageTileState extends State<MihPackageTile> {
|
|||||||
Future<void> authenticateUser() async {
|
Future<void> authenticateUser() async {
|
||||||
if (widget.authenticateUser != null &&
|
if (widget.authenticateUser != null &&
|
||||||
widget.authenticateUser! &&
|
widget.authenticateUser! &&
|
||||||
!kIsWeb) {
|
!kIsWeb &&
|
||||||
|
!Platform.isLinux) {
|
||||||
if (await isUserAuthenticated()) {
|
if (await isUserAuthenticated()) {
|
||||||
widget.onTap();
|
widget.onTap();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class MihPackageWindow extends StatefulWidget {
|
|||||||
final Color? foregroundColor;
|
final Color? foregroundColor;
|
||||||
final bool? borderOn;
|
final bool? borderOn;
|
||||||
final bool fullscreen;
|
final bool fullscreen;
|
||||||
|
final bool? scrollbarOn;
|
||||||
const MihPackageWindow({
|
const MihPackageWindow({
|
||||||
super.key,
|
super.key,
|
||||||
required this.fullscreen,
|
required this.fullscreen,
|
||||||
@@ -23,6 +24,7 @@ class MihPackageWindow extends StatefulWidget {
|
|||||||
required this.onWindowTapClose,
|
required this.onWindowTapClose,
|
||||||
required this.windowBody,
|
required this.windowBody,
|
||||||
this.borderOn,
|
this.borderOn,
|
||||||
|
this.scrollbarOn,
|
||||||
this.backgroundColor,
|
this.backgroundColor,
|
||||||
this.foregroundColor,
|
this.foregroundColor,
|
||||||
});
|
});
|
||||||
@@ -177,7 +179,13 @@ class _MihPackageWindowState extends State<MihPackageWindow> {
|
|||||||
getHeader(),
|
getHeader(),
|
||||||
const SizedBox(height: 5),
|
const SizedBox(height: 5),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: SingleChildScrollView(child: widget.windowBody)),
|
child: widget.scrollbarOn != null || !widget.scrollbarOn!
|
||||||
|
? widget.windowBody
|
||||||
|
: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
|
child: widget.windowBody,
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
: Column(
|
: Column(
|
||||||
@@ -197,7 +205,10 @@ class _MihPackageWindowState extends State<MihPackageWindow> {
|
|||||||
maxHeight: windowHeight * 0.85,
|
maxHeight: windowHeight * 0.85,
|
||||||
maxWidth: windowWidth * 0.85,
|
maxWidth: windowWidth * 0.85,
|
||||||
),
|
),
|
||||||
child: MihSingleChildScroll(child: widget.windowBody),
|
child: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
|
child: widget.windowBody,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ class _MihPersonalProfilePreviewState extends State<MihPersonalProfilePreview> {
|
|||||||
: MihCircleAvatar(
|
: MihCircleAvatar(
|
||||||
imageFile: widget.imageFile,
|
imageFile: widget.imageFile,
|
||||||
width: profilePictureWidth,
|
width: profilePictureWidth,
|
||||||
|
expandable: false,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: TextEditingController(),
|
fileNameController: TextEditingController(),
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -3,19 +3,17 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
|||||||
import 'package:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.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_objects/profile_link.dart';
|
import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tile.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
|
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
class MihProfileLinks extends StatefulWidget {
|
class MihProfileLinks extends StatefulWidget {
|
||||||
final List<ProfileLink> links;
|
final List<ProfileLink> links;
|
||||||
final double? buttonSize;
|
|
||||||
final bool? paddingOn;
|
final bool? paddingOn;
|
||||||
const MihProfileLinks({
|
const MihProfileLinks({
|
||||||
super.key,
|
super.key,
|
||||||
required this.links,
|
required this.links,
|
||||||
this.buttonSize,
|
|
||||||
this.paddingOn,
|
this.paddingOn,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -26,72 +24,89 @@ class MihProfileLinks extends StatefulWidget {
|
|||||||
class _MihProfileLinksState extends State<MihProfileLinks> {
|
class _MihProfileLinksState extends State<MihProfileLinks> {
|
||||||
Widget displayLinkButton(ProfileLink link) {
|
Widget displayLinkButton(ProfileLink link) {
|
||||||
IconData iconData;
|
IconData iconData;
|
||||||
Color iconColor;
|
Color btnColor;
|
||||||
|
Color iconColor = Colors.white;
|
||||||
switch (link.destination.toLowerCase()) {
|
switch (link.destination.toLowerCase()) {
|
||||||
case "youtube":
|
case "youtube":
|
||||||
iconData = FontAwesomeIcons.youtube;
|
iconData = FontAwesomeIcons.youtube;
|
||||||
iconColor = const Color(0xFFFF0000);
|
btnColor = const Color(0xFFFF0000);
|
||||||
break;
|
break;
|
||||||
case "tiktok":
|
case "tiktok":
|
||||||
iconData = FontAwesomeIcons.tiktok;
|
iconData = FontAwesomeIcons.tiktok;
|
||||||
iconColor = const Color(0xFF000000);
|
btnColor = const Color(0xFF000000);
|
||||||
break;
|
break;
|
||||||
case "twitch":
|
case "twitch":
|
||||||
iconData = FontAwesomeIcons.twitch;
|
iconData = FontAwesomeIcons.twitch;
|
||||||
iconColor = const Color(0xFF6441a5);
|
btnColor = const Color(0xFF6441a5);
|
||||||
break;
|
break;
|
||||||
case "threads":
|
case "threads":
|
||||||
iconData = FontAwesomeIcons.threads;
|
iconData = FontAwesomeIcons.threads;
|
||||||
iconColor = const Color(0xFF000000);
|
btnColor = const Color(0xFF000000);
|
||||||
break;
|
break;
|
||||||
case "whatsapp":
|
case "whatsapp":
|
||||||
iconData = FontAwesomeIcons.whatsapp;
|
iconData = FontAwesomeIcons.whatsapp;
|
||||||
iconColor = const Color(0xFF25D366);
|
btnColor = const Color(0xFF25D366);
|
||||||
break;
|
break;
|
||||||
case "instagram":
|
case "instagram":
|
||||||
iconData = FontAwesomeIcons.instagram;
|
iconData = FontAwesomeIcons.instagram;
|
||||||
iconColor = const Color(0xFFF56040);
|
btnColor = const Color(0xFFF56040);
|
||||||
break;
|
break;
|
||||||
case "x":
|
case "x":
|
||||||
iconData = FontAwesomeIcons.xTwitter;
|
iconData = FontAwesomeIcons.xTwitter;
|
||||||
iconColor = const Color(0xFF000000);
|
btnColor = const Color(0xFF000000);
|
||||||
break;
|
break;
|
||||||
case "linkedin":
|
case "linkedin":
|
||||||
iconData = FontAwesomeIcons.linkedin;
|
iconData = FontAwesomeIcons.linkedin;
|
||||||
iconColor = const Color(0xFF0a66c2);
|
btnColor = const Color(0xFF0a66c2);
|
||||||
break;
|
break;
|
||||||
case "facebook":
|
case "facebook":
|
||||||
iconData = FontAwesomeIcons.facebook;
|
iconData = FontAwesomeIcons.facebook;
|
||||||
iconColor = const Color(0xFF4267B2);
|
btnColor = const Color(0xFF4267B2);
|
||||||
break;
|
break;
|
||||||
case "reddit":
|
case "reddit":
|
||||||
iconData = FontAwesomeIcons.reddit;
|
iconData = FontAwesomeIcons.reddit;
|
||||||
iconColor = const Color(0xFFFF4500);
|
btnColor = const Color(0xFFFF4500);
|
||||||
break;
|
break;
|
||||||
case "discord":
|
case "discord":
|
||||||
iconData = FontAwesomeIcons.discord;
|
iconData = FontAwesomeIcons.discord;
|
||||||
iconColor = const Color(0xFF5865F2);
|
btnColor = const Color(0xFF5865F2);
|
||||||
|
break;
|
||||||
|
case "git":
|
||||||
|
iconData = FontAwesomeIcons.git;
|
||||||
|
btnColor = const Color(0xFF73A952);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
iconData = FontAwesomeIcons.link;
|
iconData = FontAwesomeIcons.link;
|
||||||
iconColor = MihColors.getPrimaryColor(
|
btnColor = MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark");
|
||||||
}
|
}
|
||||||
|
return MihButton(
|
||||||
return MihPackageTile(
|
width: 80,
|
||||||
onTap: () {
|
height: 80,
|
||||||
|
onPressed: () {
|
||||||
launchSocialUrl(Uri.parse(link.web_link));
|
launchSocialUrl(Uri.parse(link.web_link));
|
||||||
},
|
},
|
||||||
appName: link.destination,
|
buttonColor: btnColor,
|
||||||
appIcon: Icon(
|
child: FaIcon(
|
||||||
iconData,
|
iconData,
|
||||||
color: iconColor,
|
color: iconColor,
|
||||||
|
size: 40,
|
||||||
),
|
),
|
||||||
iconSize: 200,
|
|
||||||
textColor: Colors.black,
|
|
||||||
// MihColors.getPrimaryColor(
|
|
||||||
// MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
);
|
);
|
||||||
|
// return MihPackageTile(
|
||||||
|
// onTap: () {
|
||||||
|
// launchSocialUrl(Uri.parse(link.web_link));
|
||||||
|
// },
|
||||||
|
// appName: link.destination,
|
||||||
|
// appIcon: Icon(
|
||||||
|
// iconData,
|
||||||
|
// color: btnColor,
|
||||||
|
// ),
|
||||||
|
// iconSize: 200,
|
||||||
|
// textColor: Colors.black,
|
||||||
|
// // MihColors.getPrimaryColor(
|
||||||
|
// // MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> launchSocialUrl(Uri linkUrl) async {
|
Future<void> launchSocialUrl(Uri linkUrl) async {
|
||||||
@@ -110,54 +125,33 @@ class _MihProfileLinksState extends State<MihProfileLinks> {
|
|||||||
padding: widget.paddingOn == null || widget.paddingOn!
|
padding: widget.paddingOn == null || widget.paddingOn!
|
||||||
? MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
? 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)
|
||||||
: EdgeInsetsGeometry.all(0),
|
: EdgeInsetsGeometry.all(0),
|
||||||
child: Material(
|
child: widget.links.isEmpty
|
||||||
color: MihColors.getSecondaryColor(
|
? SizedBox(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark")
|
height: 35,
|
||||||
.withValues(alpha: 0.6),
|
child: Text(
|
||||||
borderRadius: BorderRadius.circular(25),
|
"No Profile Links",
|
||||||
elevation: 10,
|
textAlign: TextAlign.center,
|
||||||
shadowColor: Colors.black,
|
style: TextStyle(
|
||||||
child: Container(
|
fontSize: 25,
|
||||||
width: 500,
|
fontWeight: FontWeight.bold,
|
||||||
padding: EdgeInsets.all(10),
|
color: MihColors.getPrimaryColor(
|
||||||
decoration: BoxDecoration(
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
color: MihColors.getSecondaryColor(
|
"Dark"),
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
borderRadius: BorderRadius.circular(10),
|
|
||||||
),
|
|
||||||
child: widget.links.isEmpty
|
|
||||||
? SizedBox(
|
|
||||||
height: 35,
|
|
||||||
child: Text(
|
|
||||||
"No Profile Links",
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 25,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: Wrap(
|
|
||||||
alignment: WrapAlignment.center,
|
|
||||||
runSpacing: 15,
|
|
||||||
spacing: 15,
|
|
||||||
children: widget.links.map(
|
|
||||||
(link) {
|
|
||||||
return SizedBox(
|
|
||||||
width: widget.buttonSize ?? 80,
|
|
||||||
height: widget.buttonSize ?? 80,
|
|
||||||
child: displayLinkButton(link),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
).toList(),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
)
|
||||||
|
: Wrap(
|
||||||
|
alignment: WrapAlignment.center,
|
||||||
|
runSpacing: 10,
|
||||||
|
spacing: 10,
|
||||||
|
children: widget.links.map(
|
||||||
|
(link) {
|
||||||
|
return displayLinkButton(link);
|
||||||
|
},
|
||||||
|
).toList(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
||||||
@@ -21,72 +20,30 @@ class _MihAttributesState extends State<MihAttributes> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TableRow displayIcon(IconData icon, String creator, String link) {
|
Widget displayAttribution(IconData resource, String creator, String link) {
|
||||||
return TableRow(
|
return GestureDetector(
|
||||||
children: [
|
onTap: () {
|
||||||
TableCell(
|
launchUrlLink(
|
||||||
verticalAlignment: TableCellVerticalAlignment.middle,
|
Uri.parse(
|
||||||
child: SizedBox(
|
link,
|
||||||
height: 150,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 15.0),
|
|
||||||
child: FittedBox(
|
|
||||||
child: Center(
|
|
||||||
child: Icon(
|
|
||||||
icon,
|
|
||||||
// size: 125,
|
|
||||||
color: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
TableCell(
|
},
|
||||||
verticalAlignment: TableCellVerticalAlignment.middle,
|
child: Column(
|
||||||
child: Padding(
|
children: [
|
||||||
padding: const EdgeInsets.all(15.0),
|
Icon(
|
||||||
child: Center(
|
resource,
|
||||||
child: Text(
|
color: MihColors.getSecondaryColor(
|
||||||
creator,
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
textAlign: TextAlign.center,
|
size: 100,
|
||||||
style: const TextStyle(
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
const SizedBox(height: 5),
|
||||||
TableCell(
|
Text(
|
||||||
verticalAlignment: TableCellVerticalAlignment.middle,
|
creator,
|
||||||
child: Padding(
|
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
||||||
padding: const EdgeInsets.only(bottom: 15.0),
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
launchUrlLink(
|
|
||||||
Uri.parse(
|
|
||||||
link,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
width: 100,
|
|
||||||
child: Text(
|
|
||||||
"Visit",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,157 +89,50 @@ class _MihAttributesState extends State<MihAttributes> {
|
|||||||
height: 10,
|
height: 10,
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 700,
|
width: 900,
|
||||||
child: Table(
|
child: Wrap(
|
||||||
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
|
alignment: WrapAlignment.center,
|
||||||
columnWidths: const {
|
runSpacing: 10,
|
||||||
0: FlexColumnWidth(1),
|
spacing: 10,
|
||||||
1: FlexColumnWidth(1),
|
|
||||||
2: FlexColumnWidth(1),
|
|
||||||
},
|
|
||||||
children: [
|
children: [
|
||||||
const TableRow(
|
displayAttribution(MihIcons.mihRing, "Tarah Meth",
|
||||||
children: [
|
|
||||||
TableCell(
|
|
||||||
verticalAlignment: TableCellVerticalAlignment.middle,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 15.0),
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
"Resources",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 25,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TableCell(
|
|
||||||
verticalAlignment: TableCellVerticalAlignment.middle,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 15.0),
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
"Creator",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 25,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TableCell(
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(bottom: 15.0),
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
"Link",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 25,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
displayIcon(MihIcons.mihRing, "Tarah Meth",
|
|
||||||
"https://www.linkedin.com/in/tarah-meth-3b6309254/"),
|
"https://www.linkedin.com/in/tarah-meth-3b6309254/"),
|
||||||
displayIcon(MihIcons.mihLogo, "Tarah Meth",
|
displayAttribution(MihIcons.mihLogo, "Tarah Meth",
|
||||||
"https://www.linkedin.com/in/tarah-meth-3b6309254/"),
|
"https://www.linkedin.com/in/tarah-meth-3b6309254/"),
|
||||||
displayIcon(
|
displayAttribution(
|
||||||
MihIcons.mzansiAi, "Ollama", "https://ollama.com/"),
|
MihIcons.mzansiAi, "Ollama", "https://ollama.com/"),
|
||||||
displayIcon(MihIcons.mzansiWallet, "Freepik",
|
displayAttribution(MihIcons.mzansiWallet, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/wallet-passes-app_3884407?term=wallet&page=1&position=21&origin=search&related_id=3884407"),
|
"https://www.flaticon.com/free-icon/wallet-passes-app_3884407?term=wallet&page=1&position=21&origin=search&related_id=3884407"),
|
||||||
displayIcon(MihIcons.patientProfile, "RaftelDesign",
|
displayAttribution(MihIcons.patientProfile, "RaftelDesign",
|
||||||
"https://www.flaticon.com/free-icon/patient_2376100?term=medication&page=1&position=6&origin=search&related_id=2376100"),
|
"https://www.flaticon.com/free-icon/patient_2376100?term=medication&page=1&position=6&origin=search&related_id=2376100"),
|
||||||
displayIcon(MihIcons.patientProfile, "Srip",
|
displayAttribution(MihIcons.patientProfile, "Srip",
|
||||||
"https://www.flaticon.com/free-icon/hospital_1233930?term=medical+snake&page=1&position=7&origin=search&related_id=1233930"),
|
"https://www.flaticon.com/free-icon/hospital_1233930?term=medical+snake&page=1&position=7&origin=search&related_id=1233930"),
|
||||||
displayIcon(MihIcons.calendar, "Freepik",
|
displayAttribution(MihIcons.calendar, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/calendar_2278049?term=calendar&page=1&position=5&origin=search&related_id=2278049"),
|
"https://www.flaticon.com/free-icon/calendar_2278049?term=calendar&page=1&position=5&origin=search&related_id=2278049"),
|
||||||
displayIcon(MihIcons.calculator, "Freepik",
|
displayAttribution(MihIcons.calculator, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/calculator_2374409?term=calculator&page=1&position=20&origin=search&related_id=2374409"),
|
"https://www.flaticon.com/free-icon/calculator_2374409?term=calculator&page=1&position=20&origin=search&related_id=2374409"),
|
||||||
displayIcon(MihIcons.aboutMih, "Chanut",
|
displayAttribution(MihIcons.aboutMih, "Chanut",
|
||||||
"https://www.flaticon.com/free-icon/info_151776?term=about&page=1&position=8&origin=search&related_id=151776"),
|
"https://www.flaticon.com/free-icon/info_151776?term=about&page=1&position=8&origin=search&related_id=151776"),
|
||||||
displayIcon(MihIcons.personalProfile, "Freepik",
|
displayAttribution(MihIcons.personalProfile, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/user_1077063?term=profile&page=1&position=6&origin=search&related_id=1077063"),
|
"https://www.flaticon.com/free-icon/user_1077063?term=profile&page=1&position=6&origin=search&related_id=1077063"),
|
||||||
displayIcon(MihIcons.businessProfile, "Gravisio",
|
displayAttribution(MihIcons.businessProfile, "Gravisio",
|
||||||
"https://www.flaticon.com/free-icon/contractor_11813336?term=company+profile&page=1&position=2&origin=search&related_id=11813336"),
|
"https://www.flaticon.com/free-icon/contractor_11813336?term=company+profile&page=1&position=2&origin=search&related_id=11813336"),
|
||||||
displayIcon(MihIcons.patientManager, "Vector Tank",
|
displayAttribution(MihIcons.patientManager, "Vector Tank",
|
||||||
"https://www.flaticon.com/free-icon/doctor_10215061?term=doctor&page=1&position=73&origin=search&related_id=10215061"),
|
"https://www.flaticon.com/free-icon/doctor_10215061?term=doctor&page=1&position=73&origin=search&related_id=10215061"),
|
||||||
displayIcon(MihIcons.profileSetup, "Freepik",
|
displayAttribution(MihIcons.profileSetup, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/add-user_748137?term=profile+add&page=1&position=1&origin=search&related_id=748137"),
|
"https://www.flaticon.com/free-icon/add-user_748137?term=profile+add&page=1&position=1&origin=search&related_id=748137"),
|
||||||
displayIcon(MihIcons.businessSetup, "kerismaker",
|
displayAttribution(MihIcons.businessSetup, "kerismaker",
|
||||||
"https://www.flaticon.com/free-icon/business_13569850?term=company+add&page=1&position=25&origin=search&related_id=13569850"),
|
"https://www.flaticon.com/free-icon/business_13569850?term=company+add&page=1&position=25&origin=search&related_id=13569850"),
|
||||||
displayIcon(MihIcons.calculator, "fawazahmed0",
|
displayAttribution(MihIcons.calculator, "fawazahmed0",
|
||||||
"https://github.com/fawazahmed0/exchange-api"),
|
"https://github.com/fawazahmed0/exchange-api"),
|
||||||
displayIcon(MihIcons.iDontKnow, "Freepik",
|
displayAttribution(MihIcons.iDontKnow, "Freepik",
|
||||||
"https://www.flaticon.com/free-icon/i-dont-know_5359909?term=i+dont+know&page=1&position=7&origin=search&related_id=5359909"),
|
"https://www.flaticon.com/free-icon/i-dont-know_5359909?term=i+dont+know&page=1&position=7&origin=search&related_id=5359909"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// SizedBox(
|
const SizedBox(
|
||||||
// width: 500,
|
height: 30,
|
||||||
// child: Column(
|
),
|
||||||
// children: [
|
|
||||||
// const SizedBox(
|
|
||||||
// width: double.infinity,
|
|
||||||
// child: Row(
|
|
||||||
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
// mainAxisSize: MainAxisSize.max,
|
|
||||||
// children: [
|
|
||||||
// Flexible(
|
|
||||||
// child: Text(
|
|
||||||
// "Icon",
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 25,
|
|
||||||
// fontWeight: FontWeight.bold,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// Flexible(
|
|
||||||
// child: Text(
|
|
||||||
// "Creator",
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 25,
|
|
||||||
// fontWeight: FontWeight.bold,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// Flexible(
|
|
||||||
// child: Text(
|
|
||||||
// "Link",
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 25,
|
|
||||||
// fontWeight: FontWeight.bold,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// const Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(vertical: 10.0),
|
|
||||||
// child: Divider(),
|
|
||||||
// ),
|
|
||||||
// displayIcon(MihIcons.mihLogo, "Tarah Meth",
|
|
||||||
// "https://app.mzansi-innovation-hub.co.za/"),
|
|
||||||
// const SizedBox(height: 10),
|
|
||||||
// displayIcon(MihIcons.mihLogo, "Test",
|
|
||||||
// "https://www.flaticon.com/free-icons/mih"),
|
|
||||||
// const SizedBox(height: 10),
|
|
||||||
// displayIcon(MihIcons.mihLogo, "Test",
|
|
||||||
// "https://www.flaticon.com/free-icons/mih"),
|
|
||||||
// const SizedBox(height: 10),
|
|
||||||
// displayIcon(MihIcons.mihLogo, "Test",
|
|
||||||
// "https://www.flaticon.com/free-icons/mih"),
|
|
||||||
// const SizedBox(height: 10),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import 'package:flutter_speed_dial/flutter_speed_dial.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/main.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_objects/profile_link.dart';
|
import 'package:mzansi_innovation_hub/mih_objects/profile_link.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_package_components/mih_package_window.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_profile_links.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_profile_links.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
|
import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_services/mih_install_services.dart';
|
import 'package:mzansi_innovation_hub/mih_services/mih_install_services.dart';
|
||||||
@@ -432,7 +434,119 @@ class _MihInfoState extends State<MihInfo> {
|
|||||||
children: [
|
children: [
|
||||||
MihButton(
|
MihButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
MihInstallServices().installMihTrigger(context);
|
if (MzansiInnovationHub.of(context)!.theme.getPlatform() ==
|
||||||
|
"Android") {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return MihPackageWindow(
|
||||||
|
fullscreen: false,
|
||||||
|
windowTitle: "Select Option",
|
||||||
|
onWindowTapClose: () {
|
||||||
|
context.pop();
|
||||||
|
},
|
||||||
|
windowBody: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Please select the platform you want to install/ Update MIH from",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 25),
|
||||||
|
MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
launchSocialUrl(
|
||||||
|
Uri.parse(
|
||||||
|
"https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
FaIcon(
|
||||||
|
FontAwesomeIcons.googlePlay,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 10),
|
||||||
|
Text(
|
||||||
|
"Play Store",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
|
MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
launchSocialUrl(
|
||||||
|
Uri.parse(
|
||||||
|
"https://appgallery.huawei.com/app/C113315335?pkgName=za.co.mzansiinnovationhub.mih",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
FaIcon(
|
||||||
|
Icons.store,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 10),
|
||||||
|
Text(
|
||||||
|
"App Gallery",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
MihInstallServices().installMihTrigger(context);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
buttonColor: MihColors.getGreenColor(
|
buttonColor: MihColors.getGreenColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
@@ -736,6 +850,14 @@ class _MihInfoState extends State<MihInfo> {
|
|||||||
destination: "Reddit",
|
destination: "Reddit",
|
||||||
web_link: "https://www.reddit.com/r/Mzani_Innovation_Hub/",
|
web_link: "https://www.reddit.com/r/Mzani_Innovation_Hub/",
|
||||||
),
|
),
|
||||||
|
ProfileLink(
|
||||||
|
idprofile_links: 1,
|
||||||
|
app_id: "1234",
|
||||||
|
business_id: "",
|
||||||
|
destination: "Git",
|
||||||
|
web_link:
|
||||||
|
"https://git.mzansi-innovation-hub.co.za/yaso_meth/mih-project",
|
||||||
|
),
|
||||||
];
|
];
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
@@ -752,7 +874,7 @@ class _MihInfoState extends State<MihInfo> {
|
|||||||
),
|
),
|
||||||
MihProfileLinks(links: links),
|
MihProfileLinks(links: links),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 25,
|
height: 75,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
@@ -157,7 +160,11 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
Consumer(builder: (context, bannerAdDisplay, child) {
|
Consumer(builder: (context, bannerAdDisplay, child) {
|
||||||
return MihBannerAd();
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
|
||||||
|
return MihBannerAd();
|
||||||
|
} else {
|
||||||
|
return const SizedBox(height: 0);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -290,6 +297,7 @@ class _CurrencyExchangeRateState extends State<CurrencyExchangeRate> {
|
|||||||
return Consumer<MihCalculatorProvider>(
|
return Consumer<MihCalculatorProvider>(
|
||||||
builder: (context, calculatorProvider, child) {
|
builder: (context, calculatorProvider, child) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ class _SimpleCalcState extends State<SimpleCalc> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_banner_ad.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_banner_ad.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
||||||
@@ -229,7 +232,11 @@ class _TipCalcState extends State<TipCalc> {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
Consumer(builder: (context, bannerAdDisplay, child) {
|
Consumer(builder: (context, bannerAdDisplay, child) {
|
||||||
return MihBannerAd();
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
|
||||||
|
return MihBannerAd();
|
||||||
|
} else {
|
||||||
|
return const SizedBox(height: 0);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
// if (splitBillController.text == "Yes") const Divider(),
|
// if (splitBillController.text == "Yes") const Divider(),
|
||||||
],
|
],
|
||||||
@@ -259,6 +266,7 @@ class _TipCalcState extends State<TipCalc> {
|
|||||||
|
|
||||||
Widget getBody(double width) {
|
Widget getBody(double width) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
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)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/main.dart';
|
|||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
||||||
@@ -139,89 +140,85 @@ class _MihForgotPasswordState extends State<MihForgotPassword> {
|
|||||||
validateInput();
|
validateInput();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: SafeArea(
|
child: MihSingleChildScroll(
|
||||||
child: SingleChildScrollView(
|
scrollbarOn: true,
|
||||||
physics: const BouncingScrollPhysics(),
|
child: Padding(
|
||||||
child: Padding(
|
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
||||||
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
"desktop"
|
||||||
"desktop"
|
? EdgeInsets.symmetric(vertical: 25, horizontal: width * 0.2)
|
||||||
? EdgeInsets.symmetric(vertical: 25, horizontal: width * 0.2)
|
: EdgeInsets.symmetric(vertical: 25, horizontal: width * 0.075),
|
||||||
: EdgeInsets.symmetric(vertical: 25, horizontal: width * 0.075),
|
child: Column(
|
||||||
child: Column(
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
mainAxisSize: MainAxisSize.max,
|
||||||
mainAxisSize: MainAxisSize.max,
|
children: [
|
||||||
children: [
|
//logo
|
||||||
//logo
|
Icon(
|
||||||
Icon(
|
Icons.lock,
|
||||||
Icons.lock,
|
size: 100,
|
||||||
size: 100,
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
),
|
||||||
|
//spacer
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
//Heading
|
||||||
|
Text(
|
||||||
|
'Forgot Password',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 25,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
color: MihColors.getSecondaryColor(
|
color: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
),
|
),
|
||||||
//spacer
|
),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 25),
|
||||||
//Heading
|
MihForm(
|
||||||
Text(
|
formKey: _formKey,
|
||||||
'Forgot Password',
|
formFields: [
|
||||||
style: TextStyle(
|
MihTextFormField(
|
||||||
fontSize: 25,
|
fillColor: MihColors.getSecondaryColor(
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
color: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
inputColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
controller: emailController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Email",
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices().validateEmail(value);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
//spacer
|
||||||
const SizedBox(height: 25),
|
const SizedBox(height: 20),
|
||||||
MihForm(
|
Align(
|
||||||
formKey: _formKey,
|
alignment: Alignment.center,
|
||||||
formFields: [
|
child: MihButton(
|
||||||
MihTextFormField(
|
onPressed: () {
|
||||||
fillColor: MihColors.getSecondaryColor(
|
if (_formKey.currentState!.validate()) {
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
prePassResteWarning();
|
||||||
"Dark"),
|
} else {
|
||||||
inputColor: MihColors.getPrimaryColor(
|
MihAlertServices().inputErrorAlert(context);
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
}
|
||||||
"Dark"),
|
|
||||||
controller: emailController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "Email",
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().validateEmail(value);
|
|
||||||
},
|
},
|
||||||
),
|
buttonColor: MihColors.getGreenColor(
|
||||||
//spacer
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
const SizedBox(height: 20),
|
"Dark"),
|
||||||
Align(
|
width: 300,
|
||||||
alignment: Alignment.center,
|
child: Text(
|
||||||
child: MihButton(
|
"Reset Password",
|
||||||
onPressed: () {
|
style: TextStyle(
|
||||||
if (_formKey.currentState!.validate()) {
|
color: MihColors.getPrimaryColor(
|
||||||
prePassResteWarning();
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
} else {
|
"Dark"),
|
||||||
MihAlertServices().inputErrorAlert(context);
|
fontSize: 20,
|
||||||
}
|
fontWeight: FontWeight.bold,
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
"Reset Password",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -205,6 +205,7 @@ class _MihRegisterState extends State<MihRegister> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: MihSingleChildScroll(
|
child: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:mzansi_innovation_hub/main.dart';
|
|||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_text_form_field.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_loading_circle.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
||||||
@@ -104,110 +105,104 @@ class _MihResetPasswordState extends State<MihResetPassword> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: SafeArea(
|
child: MihSingleChildScroll(
|
||||||
child: SingleChildScrollView(
|
scrollbarOn: true,
|
||||||
physics: const BouncingScrollPhysics(),
|
child: Padding(
|
||||||
child: Padding(
|
padding:
|
||||||
padding:
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
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(
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
children: [
|
||||||
children: [
|
// Text("Token: ${widget.token}"), // For testing purposes only
|
||||||
// Text("Token: ${widget.token}"), // For testing purposes only
|
//logo
|
||||||
//logo
|
Icon(
|
||||||
Icon(
|
Icons.lock,
|
||||||
Icons.lock,
|
size: 100,
|
||||||
size: 100,
|
color: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
),
|
||||||
|
//spacer
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
//Heading
|
||||||
|
Text(
|
||||||
|
'Reset Password',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 25,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
color: MihColors.getSecondaryColor(
|
color: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
),
|
),
|
||||||
//spacer
|
),
|
||||||
const SizedBox(height: 10),
|
//spacer
|
||||||
//Heading
|
const SizedBox(height: 25),
|
||||||
Text(
|
MihForm(
|
||||||
'Reset Password',
|
formKey: _formKey,
|
||||||
style: TextStyle(
|
formFields: [
|
||||||
fontSize: 25,
|
MihTextFormField(
|
||||||
fontWeight: FontWeight.bold,
|
fillColor: MihColors.getSecondaryColor(
|
||||||
color: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
inputColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
controller: passwordController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Password",
|
||||||
|
passwordMode: true,
|
||||||
|
autofillHints: const [AutofillHints.password],
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices().validatePassword(value);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
//spacer
|
||||||
//spacer
|
const SizedBox(height: 10),
|
||||||
const SizedBox(height: 25),
|
MihTextFormField(
|
||||||
MihForm(
|
fillColor: MihColors.getSecondaryColor(
|
||||||
formKey: _formKey,
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
formFields: [
|
inputColor: MihColors.getPrimaryColor(
|
||||||
MihTextFormField(
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
fillColor: MihColors.getSecondaryColor(
|
controller: confirmPasswordController,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
multiLineInput: false,
|
||||||
"Dark"),
|
requiredText: true,
|
||||||
inputColor: MihColors.getPrimaryColor(
|
hintText: "Confirm Password",
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
passwordMode: true,
|
||||||
"Dark"),
|
autofillHints: const [AutofillHints.password],
|
||||||
controller: passwordController,
|
validator: (value) {
|
||||||
multiLineInput: false,
|
return MihValidationServices().validatePassword(value);
|
||||||
requiredText: true,
|
},
|
||||||
hintText: "Password",
|
),
|
||||||
passwordMode: true,
|
//spacer
|
||||||
autofillHints: const [AutofillHints.password],
|
const SizedBox(height: 25),
|
||||||
validator: (value) {
|
// sign in button
|
||||||
return MihValidationServices().validatePassword(value);
|
Center(
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitFormInput();
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
),
|
buttonColor: MihColors.getGreenColor(
|
||||||
//spacer
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
MihTextFormField(
|
|
||||||
fillColor: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
inputColor: MihColors.getPrimaryColor(
|
width: 300,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
child: Text(
|
||||||
"Dark"),
|
"Reset Password",
|
||||||
controller: confirmPasswordController,
|
style: TextStyle(
|
||||||
multiLineInput: false,
|
color: MihColors.getPrimaryColor(
|
||||||
requiredText: true,
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
hintText: "Confirm Password",
|
"Dark"),
|
||||||
passwordMode: true,
|
fontSize: 20,
|
||||||
autofillHints: const [AutofillHints.password],
|
fontWeight: FontWeight.bold,
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().validatePassword(value);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
//spacer
|
|
||||||
const SizedBox(height: 25),
|
|
||||||
// sign in button
|
|
||||||
Center(
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
if (_formKey.currentState!.validate()) {
|
|
||||||
submitFormInput();
|
|
||||||
} else {
|
|
||||||
MihAlertServices().inputErrorAlert(context);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
"Reset Password",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
],
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ class _MihSignInState extends State<MihSignIn> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: MihSingleChildScroll(
|
child: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class _MIHAppDrawerState extends State<MIHAppDrawer> {
|
|||||||
? mzansiProfileProvider.userProfilePicture
|
? mzansiProfileProvider.userProfilePicture
|
||||||
: mzansiProfileProvider.businessProfilePicture,
|
: mzansiProfileProvider.businessProfilePicture,
|
||||||
width: 60,
|
width: 60,
|
||||||
|
expandable: false,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: proPicController,
|
fileNameController: proPicController,
|
||||||
onChange: (_) {},
|
onChange: (_) {},
|
||||||
|
|||||||
@@ -353,6 +353,7 @@ class _MihHomeState extends State<MihHome> {
|
|||||||
key: Key(imageKey),
|
key: Key(imageKey),
|
||||||
imageFile: currentImage,
|
imageFile: currentImage,
|
||||||
width: 50,
|
width: 50,
|
||||||
|
expandable: false,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: null,
|
fileNameController: null,
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class _BuildMinesweeperLeaderboardListState
|
|||||||
key: UniqueKey(),
|
key: UniqueKey(),
|
||||||
imageFile: imageFile,
|
imageFile: imageFile,
|
||||||
width: 80,
|
width: 80,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: null,
|
fileNameController: null,
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ class LeaderboardUserRanking extends StatelessWidget {
|
|||||||
.toString()), // Use ValueKey for stable identity
|
.toString()), // Use ValueKey for stable identity
|
||||||
imageFile: asyncSnapshot.data,
|
imageFile: asyncSnapshot.data,
|
||||||
width: 60,
|
width: 60,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: null,
|
fileNameController: null,
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:io';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
@@ -626,6 +628,7 @@ class _MineSweeperGameState extends State<MineSweeperGame> {
|
|||||||
alignment: Alignment.topCenter,
|
alignment: Alignment.topCenter,
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: board.isEmpty && squaresLeft < 0
|
child: board.isEmpty && squaresLeft < 0
|
||||||
// Start Up Message before setting up game
|
// Start Up Message before setting up game
|
||||||
? Padding(
|
? Padding(
|
||||||
@@ -850,7 +853,9 @@ class _MineSweeperGameState extends State<MineSweeperGame> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_timer != null ? MihBannerAd() : SizedBox(),
|
_timer != null && !kIsWeb && (Platform.isAndroid || Platform.isIOS)
|
||||||
|
? MihBannerAd()
|
||||||
|
: SizedBox(),
|
||||||
SizedBox(height: 15),
|
SizedBox(height: 15),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -845,6 +845,7 @@ class _MineSweeperQuickStartGuideState
|
|||||||
|
|
||||||
Widget getBody(double width) {
|
Widget getBody(double width) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: width / 20),
|
padding: EdgeInsets.symmetric(horizontal: width / 20),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ class _MihMineSweeperLeaderBoardState extends State<MyScoreBoard> {
|
|||||||
child: MihCircleAvatar(
|
child: MihCircleAvatar(
|
||||||
imageFile: profileProvider.userProfilePicture,
|
imageFile: profileProvider.userProfilePicture,
|
||||||
width: 150,
|
width: 150,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: null,
|
fileNameController: null,
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -112,15 +113,35 @@ class _MihAiChatState extends State<MihAiChat> with WidgetsBindingObserver {
|
|||||||
|
|
||||||
void speakLastMessage(MzansiAiProvider aiProvider) {
|
void speakLastMessage(MzansiAiProvider aiProvider) {
|
||||||
final history = aiProvider.ollamaProvider.history;
|
final history = aiProvider.ollamaProvider.history;
|
||||||
if (history.isNotEmpty) {
|
if (history.isEmpty) return;
|
||||||
final historyList = history.toList();
|
|
||||||
for (int i = historyList.length - 1; i >= 0; i--) {
|
final historyList = history.toList();
|
||||||
if (historyList[i].origin == MessageOrigin.llm &&
|
String? textToSpeak;
|
||||||
historyList[i].text != null &&
|
|
||||||
historyList[i].text!.isNotEmpty) {
|
// Find the last LLM message
|
||||||
_flutterTts.speak(historyList[i].text!);
|
for (int i = historyList.length - 1; i >= 0; i--) {
|
||||||
return;
|
if (historyList[i].origin == MessageOrigin.llm &&
|
||||||
}
|
historyList[i].text != null &&
|
||||||
|
historyList[i].text!.isNotEmpty) {
|
||||||
|
textToSpeak = historyList[i].text!;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textToSpeak != null) {
|
||||||
|
if (!kIsWeb && Platform.isLinux) {
|
||||||
|
// Linux Workaround: Use Speech Dispatcher (standard on most distros)
|
||||||
|
// '-t female1' is optional for voice variety
|
||||||
|
Process.run('spd-say', [textToSpeak]);
|
||||||
|
|
||||||
|
// Since spd-say doesn't have an easy "completion handler" via CLI,
|
||||||
|
// we manually toggle the UI state or just leave it off.
|
||||||
|
aiProvider.setTTSstate(true);
|
||||||
|
Future.delayed(
|
||||||
|
Duration(seconds: 5), () => aiProvider.setTTSstate(false));
|
||||||
|
} else {
|
||||||
|
// Your existing mobile/web logic
|
||||||
|
_flutterTts.speak(textToSpeak);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,11 +204,16 @@ class _MihAiChatState extends State<MihAiChat> with WidgetsBindingObserver {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
void stopTTS(MzansiAiProvider aiProvider) {
|
void stopTTS(MzansiAiProvider aiProvider) {
|
||||||
_flutterTts.stop();
|
if (!kIsWeb && Platform.isLinux) {
|
||||||
|
Process.run('spd-say', ['-S']); // The -S flag stops current speech
|
||||||
|
} else {
|
||||||
|
_flutterTts.stop();
|
||||||
|
}
|
||||||
aiProvider.setTTSstate(false);
|
aiProvider.setTTSstate(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> initTts(MzansiAiProvider aiProvider) async {
|
Future<void> initTts(MzansiAiProvider aiProvider) async {
|
||||||
|
if (!kIsWeb && Platform.isLinux) return;
|
||||||
try {
|
try {
|
||||||
await _flutterTts.setSpeechRate(!kIsWeb ? 0.55 : 1);
|
await _flutterTts.setSpeechRate(!kIsWeb ? 0.55 : 1);
|
||||||
// await _flutterTts.setLanguage("en-US");
|
// await _flutterTts.setLanguage("en-US");
|
||||||
@@ -258,7 +284,9 @@ class _MihAiChatState extends State<MihAiChat> with WidgetsBindingObserver {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_flutterTts.stop();
|
if (!kIsWeb && !Platform.isLinux) {
|
||||||
|
_flutterTts.stop();
|
||||||
|
}
|
||||||
WidgetsBinding.instance.removeObserver(this);
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class _MihContactsState extends State<MihContacts> {
|
|||||||
|
|
||||||
Widget getBody(double width) {
|
Widget getBody(double width) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Padding(
|
Padding(
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
|
|||||||
} else if (directoryProvider.searchedBusinesses.isEmpty &&
|
} else if (directoryProvider.searchedBusinesses.isEmpty &&
|
||||||
directoryProvider.searchTerm.isNotEmpty) {
|
directoryProvider.searchTerm.isNotEmpty) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 50),
|
const SizedBox(height: 50),
|
||||||
@@ -357,6 +358,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
|
|||||||
} else if (directoryProvider.searchedBusinesses.isEmpty &&
|
} else if (directoryProvider.searchedBusinesses.isEmpty &&
|
||||||
directoryProvider.searchTerm.isEmpty) {
|
directoryProvider.searchTerm.isEmpty) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -472,6 +474,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
|
|||||||
} else if (directoryProvider.searchedUsers.isEmpty &&
|
} else if (directoryProvider.searchedUsers.isEmpty &&
|
||||||
directoryProvider.searchTerm.isEmpty) {
|
directoryProvider.searchTerm.isEmpty) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -533,6 +536,7 @@ class _MihSearchMzansiState extends State<MihSearchMzansi> {
|
|||||||
} else if (directoryProvider.searchedUsers.isEmpty &&
|
} else if (directoryProvider.searchedUsers.isEmpty &&
|
||||||
directoryProvider.searchTerm.isNotEmpty) {
|
directoryProvider.searchTerm.isNotEmpty) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 50),
|
const SizedBox(height: 50),
|
||||||
|
|||||||
@@ -316,6 +316,7 @@ class _MihReviewBusinessWindowState extends State<MihReviewBusinessWindow> {
|
|||||||
]
|
]
|
||||||
: null,
|
: null,
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
||||||
"desktop"
|
"desktop"
|
||||||
|
|||||||
@@ -251,278 +251,45 @@ class _MihUpdateBusinessDetailsWindowState
|
|||||||
context.pop();
|
context.pop();
|
||||||
},
|
},
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
? EdgeInsets.symmetric(horizontal: widget.width * 0.05)
|
? EdgeInsets.symmetric(horizontal: widget.width * 0.05)
|
||||||
: EdgeInsets.symmetric(horizontal: widget.width * 0),
|
: EdgeInsets.symmetric(horizontal: widget.width * 0),
|
||||||
child: Column(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
MihForm(
|
Column(
|
||||||
formKey: _formKey,
|
children: [
|
||||||
formFields: [
|
MihForm(
|
||||||
Center(
|
formKey: _formKey,
|
||||||
child: MihCircleAvatar(
|
formFields: [
|
||||||
imageFile: newSelectedLogoPic != null
|
Center(
|
||||||
? MemoryImage(newSelectedLogoPic!.bytes!)
|
child: MihCircleAvatar(
|
||||||
: mzansiProfileProvider.businessProfilePicture,
|
imageFile: newSelectedLogoPic != null
|
||||||
width: 150,
|
? MemoryImage(newSelectedLogoPic!.bytes!)
|
||||||
editable: true,
|
: mzansiProfileProvider
|
||||||
fileNameController: fileNameController,
|
.businessProfilePicture,
|
||||||
userSelectedfile: newSelectedLogoPic,
|
width: 150,
|
||||||
frameColor: MihColors.getSecondaryColor(
|
expandable: false,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
editable: true,
|
||||||
"Dark"),
|
fileNameController: fileNameController,
|
||||||
backgroundColor: MihColors.getPrimaryColor(
|
userSelectedfile: newSelectedLogoPic,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
frameColor: MihColors.getSecondaryColor(
|
||||||
"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 ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
inputColor: MihColors.getPrimaryColor(
|
backgroundColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
controller: contactController,
|
onChange: (selectedfile) {
|
||||||
numberMode: true,
|
setState(() {
|
||||||
multiLineInput: false,
|
newSelectedLogoPic = selectedfile;
|
||||||
requiredText: true,
|
});
|
||||||
hintText: null,
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().isEmpty(value);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
Visibility(
|
||||||
),
|
visible: false,
|
||||||
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(
|
child: MihTextFormField(
|
||||||
fillColor: MihColors.getSecondaryColor(
|
fillColor: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
@@ -530,84 +297,374 @@ class _MihUpdateBusinessDetailsWindowState
|
|||||||
inputColor: MihColors.getPrimaryColor(
|
inputColor: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
controller: locationController,
|
controller: fileNameController,
|
||||||
multiLineInput: false,
|
multiLineInput: false,
|
||||||
requiredText: true,
|
requiredText: true,
|
||||||
readOnly: true,
|
readOnly: true,
|
||||||
hintText: "GPS Location",
|
hintText: "Selected File Name",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 10.0),
|
const SizedBox(height: 20),
|
||||||
MihButton(
|
MihTextFormField(
|
||||||
onPressed: () {
|
fillColor: MihColors.getSecondaryColor(
|
||||||
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 ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
width: 100,
|
inputColor: MihColors.getPrimaryColor(
|
||||||
child: Text(
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Set",
|
"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(
|
style: TextStyle(
|
||||||
color: MihColors.getPrimaryColor(
|
fontSize: 18,
|
||||||
MzansiInnovationHub.of(context)!
|
|
||||||
.theme
|
|
||||||
.mode ==
|
|
||||||
"Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
Row(
|
||||||
),
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
const SizedBox(height: 25),
|
children: [
|
||||||
Center(
|
CountryCodePicker(
|
||||||
child: MihButton(
|
padding: EdgeInsetsGeometry.all(0),
|
||||||
onPressed: () {
|
onChanged: (selectedCode) {
|
||||||
if (_formKey.currentState!.validate()) {
|
setState(() {
|
||||||
submitForm(mzansiProfileProvider);
|
countryCodeController.text =
|
||||||
} else {
|
selectedCode.toString();
|
||||||
MihAlertServices().inputErrorAlert(context);
|
});
|
||||||
}
|
debugPrint(
|
||||||
},
|
"Selected Country Code: ${countryCodeController.text}");
|
||||||
buttonColor: MihColors.getGreenColor(
|
},
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
initialSelection: countryCodeController.text,
|
||||||
"Dark"),
|
showDropDownButton: false,
|
||||||
width: 300,
|
pickerStyle: PickerStyle.bottomSheet,
|
||||||
child: Text(
|
dialogBackgroundColor:
|
||||||
"Update",
|
MihColors.getPrimaryColor(
|
||||||
style: TextStyle(
|
MzansiInnovationHub.of(context)!
|
||||||
color: MihColors.getPrimaryColor(
|
.theme
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
fontSize: 20,
|
barrierColor: MihColors.getPrimaryColor(
|
||||||
fontWeight: FontWeight.bold,
|
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().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 300,
|
||||||
|
child: Text(
|
||||||
|
"Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
top: 0,
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
//Add validation here
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitForm(mzansiProfileProvider);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 100,
|
||||||
|
height: 25,
|
||||||
|
child: Text(
|
||||||
|
mzansiProfileProvider.user!.username.isEmpty
|
||||||
|
? "Setup Profile"
|
||||||
|
: "Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
),
|
||||||
],
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import 'package:mzansi_innovation_hub/main.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_package_components/mih_button.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart';
|
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_form.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_image_display.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_image_display.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_window.dart';
|
||||||
@@ -127,190 +126,224 @@ class _MihUpdateMyBusinessUserDetailsState
|
|||||||
builder: (BuildContext context,
|
builder: (BuildContext context,
|
||||||
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
|
MzansiProfileProvider mzansiProfileProvider, Widget? child) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
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: Stack(
|
||||||
children: [
|
children: [
|
||||||
MihForm(
|
Column(
|
||||||
formKey: _formKey,
|
children: [
|
||||||
formFields: [
|
MihForm(
|
||||||
Center(
|
formKey: _formKey,
|
||||||
child: MihCircleAvatar(
|
formFields: [
|
||||||
imageFile: mzansiProfileProvider.userProfilePicture,
|
// Center(
|
||||||
width: 150,
|
// child: MihCircleAvatar(
|
||||||
editable: false,
|
// imageFile: mzansiProfileProvider.userProfilePicture,
|
||||||
fileNameController: fileNameController,
|
// width: 150,
|
||||||
userSelectedfile: userPicFile,
|
// editable: false,
|
||||||
frameColor: MihColors.getSecondaryColor(
|
// fileNameController: fileNameController,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
// userSelectedfile: userPicFile,
|
||||||
"Dark"),
|
// frameColor: MihColors.getSecondaryColor(
|
||||||
backgroundColor: MihColors.getPrimaryColor(
|
// MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
// "Dark"),
|
||||||
"Dark"),
|
// backgroundColor: MihColors.getPrimaryColor(
|
||||||
onChange: (_) {},
|
// MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
),
|
// "Dark"),
|
||||||
),
|
// onChange: (_) {},
|
||||||
Visibility(
|
// ),
|
||||||
visible: false,
|
// ),
|
||||||
child: MihTextFormField(
|
Visibility(
|
||||||
fillColor: MihColors.getSecondaryColor(
|
visible: false,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
child: MihTextFormField(
|
||||||
"Dark"),
|
fillColor: MihColors.getSecondaryColor(
|
||||||
inputColor: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
controller: fileNameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
readOnly: true,
|
|
||||||
hintText: "Selected File Name",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
MihTextFormField(
|
|
||||||
fillColor: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
inputColor: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
controller: titleTextController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
readOnly: false,
|
|
||||||
hintText: "Title",
|
|
||||||
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: fnameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
readOnly: true,
|
|
||||||
hintText: "First 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: lnameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
readOnly: true,
|
|
||||||
hintText: "Surname",
|
|
||||||
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: accessController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "Access Level",
|
|
||||||
readOnly: true,
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().isEmpty(value);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
Container(
|
|
||||||
width: 300,
|
|
||||||
alignment: Alignment.topLeft,
|
|
||||||
child: const Text(
|
|
||||||
"Signature:",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Center(
|
|
||||||
child: MihImageDisplay(
|
|
||||||
imageFile: newSelectedSignaturePic != null
|
|
||||||
? MemoryImage(newSelectedSignaturePic!.bytes!)
|
|
||||||
: mzansiProfileProvider.businessUserSignature,
|
|
||||||
width: 300,
|
|
||||||
height: 200,
|
|
||||||
editable: true,
|
|
||||||
fileNameController: signtureController,
|
|
||||||
userSelectedfile: newSelectedSignaturePic,
|
|
||||||
onChange: (selectedFile) {
|
|
||||||
setState(() {
|
|
||||||
newSelectedSignaturePic = selectedFile;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
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 Signature File",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 15),
|
|
||||||
Center(
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
if (_formKey.currentState!.validate()) {
|
|
||||||
submitForm(mzansiProfileProvider);
|
|
||||||
} else {
|
|
||||||
MihAlertServices().inputErrorAlert(context);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
"Update",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
fontSize: 20,
|
inputColor: MihColors.getPrimaryColor(
|
||||||
fontWeight: FontWeight.bold,
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
controller: fileNameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
readOnly: true,
|
||||||
|
hintText: "Selected File Name",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
MihTextFormField(
|
||||||
|
fillColor: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
inputColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
controller: titleTextController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
readOnly: false,
|
||||||
|
hintText: "Title",
|
||||||
|
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: fnameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
readOnly: true,
|
||||||
|
hintText: "First 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: lnameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
readOnly: true,
|
||||||
|
hintText: "Surname",
|
||||||
|
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: accessController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Access Level",
|
||||||
|
readOnly: true,
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices().isEmpty(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Container(
|
||||||
|
width: 300,
|
||||||
|
alignment: Alignment.topLeft,
|
||||||
|
child: const Text(
|
||||||
|
"Signature:",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: MihImageDisplay(
|
||||||
|
imageFile: newSelectedSignaturePic != null
|
||||||
|
? MemoryImage(newSelectedSignaturePic!.bytes!)
|
||||||
|
: mzansiProfileProvider.businessUserSignature,
|
||||||
|
width: 300,
|
||||||
|
height: 200,
|
||||||
|
editable: true,
|
||||||
|
fileNameController: signtureController,
|
||||||
|
userSelectedfile: newSelectedSignaturePic,
|
||||||
|
onChange: (selectedFile) {
|
||||||
|
setState(() {
|
||||||
|
newSelectedSignaturePic = selectedFile;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
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 Signature File",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 15),
|
||||||
|
Center(
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitForm(mzansiProfileProvider);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 300,
|
||||||
|
child: Text(
|
||||||
|
"Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 20),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitForm(mzansiProfileProvider);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
width: 100,
|
||||||
|
height: 25,
|
||||||
|
child: Text(
|
||||||
|
"Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
),
|
||||||
],
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
import 'package:custom_rating_bar/custom_rating_bar.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:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_business_info_card_v2.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
|
import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_colors.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_business_info_card.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_packages/mzansi_profile/business_profile/components/mih_update_business_details_window.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_button.dart';
|
||||||
@@ -60,32 +61,63 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
padding: 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),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Center(
|
Center(
|
||||||
child: MihCircleAvatar(
|
child: Stack(
|
||||||
key: UniqueKey(),
|
children: [
|
||||||
imageFile: mzansiProfileProvider.businessProfilePicture,
|
MihCircleAvatar(
|
||||||
width: 150,
|
key: UniqueKey(),
|
||||||
editable: false,
|
imageFile:
|
||||||
fileNameController: fileNameController,
|
mzansiProfileProvider.businessProfilePicture,
|
||||||
userSelectedfile: newSelectedLogoPic,
|
width: 150,
|
||||||
frameColor: MihColors.getSecondaryColor(
|
expandable: true,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
editable: false,
|
||||||
"Dark"),
|
fileNameController: fileNameController,
|
||||||
backgroundColor: MihColors.getPrimaryColor(
|
userSelectedfile: newSelectedLogoPic,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
frameColor: MihColors.getSecondaryColor(
|
||||||
"Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
onChange: (selectedfile) {
|
"Dark"),
|
||||||
setState(() {
|
backgroundColor: MihColors.getPrimaryColor(
|
||||||
newSelectedLogoPic = selectedfile;
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
});
|
"Dark"),
|
||||||
},
|
onChange: (selectedfile) {
|
||||||
|
setState(() {
|
||||||
|
newSelectedLogoPic = selectedfile;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
bottom: 5,
|
||||||
|
right: 5,
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
// editProfileWindow(width);
|
||||||
|
editBizProfileWindow(
|
||||||
|
mzansiProfileProvider, width);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 35,
|
||||||
|
height: 35,
|
||||||
|
child: Icon(
|
||||||
|
Icons.edit,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
FittedBox(
|
FittedBox(
|
||||||
@@ -112,6 +144,30 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
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: mzansiProfileProvider
|
||||||
|
.business!.rating.isNotEmpty
|
||||||
|
? double.parse(mzansiProfileProvider.business!.rating)
|
||||||
|
: 0,
|
||||||
|
maxRating: 5,
|
||||||
|
),
|
||||||
const SizedBox(height: 5),
|
const SizedBox(height: 5),
|
||||||
Center(
|
Center(
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
@@ -133,68 +189,16 @@ class _MihBusinessDetailsState extends State<MihBusinessDetails> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
SizedBox(
|
MihBusinessCardV2(
|
||||||
width: 700,
|
business: mzansiProfileProvider.business!,
|
||||||
child: MihBusinessCard(
|
// startUpSearch: null,
|
||||||
business: mzansiProfileProvider.business!,
|
width: width,
|
||||||
// startUpSearch: null,
|
|
||||||
width: width,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 30.0),
|
const SizedBox(height: 30.0),
|
||||||
Center(
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
// Connect with the user
|
|
||||||
editBizProfileWindow(mzansiProfileProvider, width);
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
"Edit Profile",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// 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: () {
|
|
||||||
// editBizProfileWindow(width);
|
|
||||||
// },
|
|
||||||
// )
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -330,6 +330,7 @@ class _MihBusinessDetailsSetUpState extends State<MihBusinessDetailsSetUp> {
|
|||||||
? MemoryImage(newSelectedLogoPic!.bytes!)
|
? MemoryImage(newSelectedLogoPic!.bytes!)
|
||||||
: mzansiProfileProvider.businessProfilePicture,
|
: mzansiProfileProvider.businessProfilePicture,
|
||||||
width: 150,
|
width: 150,
|
||||||
|
expandable: false,
|
||||||
editable: true,
|
editable: true,
|
||||||
fileNameController: logoFileNameController,
|
fileNameController: logoFileNameController,
|
||||||
userSelectedfile: newSelectedLogoPic,
|
userSelectedfile: newSelectedLogoPic,
|
||||||
@@ -765,7 +766,7 @@ class _MihBusinessDetailsSetUpState extends State<MihBusinessDetailsSetUp> {
|
|||||||
"Dark"),
|
"Dark"),
|
||||||
width: 300,
|
width: 300,
|
||||||
child: Text(
|
child: Text(
|
||||||
"Add",
|
"Set Up Buasiness",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: MihColors.getPrimaryColor(
|
color: MihColors.getPrimaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import 'package:custom_rating_bar/custom_rating_bar.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:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_business_info_card_v2.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_icons.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.dart';
|
import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_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_package_components/mih_business_info_card.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_package_components/mih_single_child_scroll.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_single_child_scroll.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/mih_package_tool_body.dart';
|
||||||
@@ -58,11 +58,12 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
padding: 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),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
@@ -76,6 +77,7 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
|
|||||||
imageFile: CachedNetworkImageProvider(
|
imageFile: CachedNetworkImageProvider(
|
||||||
asyncSnapshot.requireData),
|
asyncSnapshot.requireData),
|
||||||
width: profilePictureWidth,
|
width: profilePictureWidth,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: TextEditingController(),
|
fileNameController: TextEditingController(),
|
||||||
userSelectedfile: file,
|
userSelectedfile: file,
|
||||||
@@ -154,40 +156,6 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
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(
|
RatingBar.readOnly(
|
||||||
size: 50,
|
size: 50,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
@@ -213,14 +181,32 @@ class _MihBusinessDetailsViewState extends State<MihBusinessDetailsView> {
|
|||||||
: 0,
|
: 0,
|
||||||
maxRating: 5,
|
maxRating: 5,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 5),
|
||||||
SizedBox(
|
Center(
|
||||||
width: 700,
|
child: SizedBox(
|
||||||
child: MihBusinessCard(
|
width: 700,
|
||||||
business: directoryProvider.selectedBusiness!,
|
child: Text(
|
||||||
width: width,
|
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: 20),
|
||||||
|
MihBusinessCardV2(
|
||||||
|
business: directoryProvider.selectedBusiness!,
|
||||||
|
width: width,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:file_saver/file_saver.dart';
|
import 'package:file_saver/file_saver.dart';
|
||||||
@@ -82,6 +84,19 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
|
|||||||
fileExtension: "png",
|
fileExtension: "png",
|
||||||
mimeType: MimeType.png,
|
mimeType: MimeType.png,
|
||||||
);
|
);
|
||||||
|
} else if (defaultTargetPlatform == TargetPlatform.linux ||
|
||||||
|
defaultTargetPlatform == TargetPlatform.windows) {
|
||||||
|
// Use File Picker to get a save path on Desktop
|
||||||
|
String? outputFile = await FilePicker.platform.saveFile(
|
||||||
|
dialogTitle: 'Please select where to save your QR Code:',
|
||||||
|
fileName: filename,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (outputFile != null) {
|
||||||
|
final file = File(outputFile);
|
||||||
|
await file.writeAsBytes(imageBytes);
|
||||||
|
KenLogger.success("Saved to $outputFile");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
await FileSaver.instance.saveAs(
|
await FileSaver.instance.saveAs(
|
||||||
name: filename,
|
name: filename,
|
||||||
@@ -95,14 +110,14 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
|
|||||||
Future<void> downloadQrCode() async {
|
Future<void> downloadQrCode() async {
|
||||||
if (_isUserSignedIn) {
|
if (_isUserSignedIn) {
|
||||||
await screenshotController.capture().then((image) {
|
await screenshotController.capture().then((image) {
|
||||||
KenLogger.success("Image Captured: $image");
|
// KenLogger.success("Image Captured: $image");
|
||||||
setState(() {
|
setState(() {
|
||||||
businessQRImageFile = image;
|
businessQRImageFile = image;
|
||||||
});
|
});
|
||||||
}).catchError((onError) {
|
}).catchError((onError) {
|
||||||
KenLogger.error(onError);
|
KenLogger.error(onError);
|
||||||
});
|
});
|
||||||
KenLogger.success("QR Code Image Captured : $businessQRImageFile");
|
// KenLogger.success("QR Code Image Captured : $businessQRImageFile");
|
||||||
saveImage(businessQRImageFile!);
|
saveImage(businessQRImageFile!);
|
||||||
} else {
|
} else {
|
||||||
showSignInRequiredAlert();
|
showSignInRequiredAlert();
|
||||||
@@ -211,6 +226,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
|
|||||||
imageFile: CachedNetworkImageProvider(
|
imageFile: CachedNetworkImageProvider(
|
||||||
asyncSnapshot.requireData),
|
asyncSnapshot.requireData),
|
||||||
width: profilePictureWidth,
|
width: profilePictureWidth,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: TextEditingController(),
|
fileNameController: TextEditingController(),
|
||||||
userSelectedfile: file,
|
userSelectedfile: file,
|
||||||
@@ -298,7 +314,9 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
|
|||||||
height: 300,
|
height: 300,
|
||||||
child: CachedNetworkImage(
|
child: CachedNetworkImage(
|
||||||
imageUrl: getQrCodeData(qrSize.toInt()),
|
imageUrl: getQrCodeData(qrSize.toInt()),
|
||||||
placeholder: (context, url) => const Mihloadingcircle(),
|
placeholder: (context, url) => FittedBox(
|
||||||
|
child: const Mihloadingcircle(),
|
||||||
|
),
|
||||||
errorWidget: (context, url, error) =>
|
errorWidget: (context, url, error) =>
|
||||||
const Icon(Icons.error),
|
const Icon(Icons.error),
|
||||||
),
|
),
|
||||||
@@ -367,6 +385,7 @@ class _MihBusinessQrCodeState extends State<MihBusinessQrCode> {
|
|||||||
alignment: Alignment.topCenter,
|
alignment: Alignment.topCenter,
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 15.0),
|
padding: const EdgeInsets.symmetric(horizontal: 15.0),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
padding: MzansiInnovationHub.of(context)!.theme.screenType ==
|
||||||
"desktop"
|
"desktop"
|
||||||
@@ -183,19 +184,47 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Center(
|
Center(
|
||||||
child: MihCircleAvatar(
|
child: Stack(
|
||||||
imageFile: mzansiProfileProvider.userProfilePicture,
|
children: [
|
||||||
width: 150,
|
MihCircleAvatar(
|
||||||
editable: false,
|
imageFile: mzansiProfileProvider.userProfilePicture,
|
||||||
fileNameController: fileNameController,
|
width: 150,
|
||||||
userSelectedfile: userPicFile,
|
expandable: true,
|
||||||
frameColor: MihColors.getSecondaryColor(
|
editable: false,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
fileNameController: fileNameController,
|
||||||
"Dark"),
|
userSelectedfile: userPicFile,
|
||||||
backgroundColor: MihColors.getPrimaryColor(
|
frameColor: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
onChange: (_) {},
|
backgroundColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
onChange: (_) {},
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
bottom: 5,
|
||||||
|
right: 5,
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
editBizUserProfileWindow(
|
||||||
|
mzansiProfileProvider, width);
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 35,
|
||||||
|
height: 35,
|
||||||
|
child: Icon(
|
||||||
|
Icons.edit,
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
@@ -245,28 +274,6 @@ class _MihMyBusinessUserState extends State<MihMyBusinessUser> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Center(
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
editBizUserProfileWindow(
|
|
||||||
mzansiProfileProvider, width);
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
"Edit Profile",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
fontSize: 20,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -329,195 +329,233 @@ class _MihEditPersonalProfileWindowState
|
|||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
? EdgeInsets.symmetric(horizontal: screenWidth * 0.05)
|
? EdgeInsets.symmetric(horizontal: screenWidth * 0.05)
|
||||||
: EdgeInsets.symmetric(horizontal: screenWidth * 0),
|
: EdgeInsets.symmetric(horizontal: screenWidth * 0),
|
||||||
child: Column(
|
child: Stack(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
children: [
|
||||||
MihForm(
|
Column(
|
||||||
formKey: _formKey,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
formFields: [
|
children: [
|
||||||
Center(
|
MihForm(
|
||||||
child: MihCircleAvatar(
|
formKey: _formKey,
|
||||||
imageFile: newSelectedProPic != null
|
formFields: [
|
||||||
? MemoryImage(newSelectedProPic!.bytes!)
|
Center(
|
||||||
: mzansiProfileProvider.userProfilePicture,
|
child: MihCircleAvatar(
|
||||||
width: 150,
|
imageFile: newSelectedProPic != null
|
||||||
editable: true,
|
? MemoryImage(newSelectedProPic!.bytes!)
|
||||||
fileNameController: proPicController,
|
: mzansiProfileProvider.userProfilePicture,
|
||||||
userSelectedfile: newSelectedProPic,
|
width: 150,
|
||||||
frameColor: MihColors.getSecondaryColor(
|
expandable: false,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
editable: true,
|
||||||
"Dark"),
|
fileNameController: proPicController,
|
||||||
backgroundColor: MihColors.getPrimaryColor(
|
userSelectedfile: newSelectedProPic,
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
frameColor: MihColors.getSecondaryColor(
|
||||||
"Dark"),
|
|
||||||
onChange: (selectedImage) {
|
|
||||||
setState(() {
|
|
||||||
newSelectedProPic = selectedImage;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
// const SizedBox(height: 25.0),
|
|
||||||
Visibility(
|
|
||||||
visible: false,
|
|
||||||
child: MihTextFormField(
|
|
||||||
fillColor: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
inputColor: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
controller: proPicController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
readOnly: true,
|
|
||||||
hintText: "Selected File Name",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
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: usernameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "Username",
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().validateUsername(value);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
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: fnameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "First Name",
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().isEmpty(value);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
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: lnameController,
|
|
||||||
multiLineInput: false,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "Last Name",
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices().isEmpty(value);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10.0),
|
|
||||||
MihTextFormField(
|
|
||||||
height: 250,
|
|
||||||
fillColor: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
inputColor: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
controller: purposeController,
|
|
||||||
multiLineInput: true,
|
|
||||||
requiredText: true,
|
|
||||||
hintText: "Your Personal Mission",
|
|
||||||
validator: (value) {
|
|
||||||
return MihValidationServices()
|
|
||||||
.validateLength(purposeController.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: getPurposeLimitColor(256),
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(width: 5),
|
|
||||||
Text(
|
|
||||||
"/256",
|
|
||||||
style: TextStyle(
|
|
||||||
color: getPurposeLimitColor(256),
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10.0),
|
|
||||||
MihToggle(
|
|
||||||
hintText: "Activate Business Account",
|
|
||||||
initialPostion: businessUser,
|
|
||||||
fillColor: MihColors.getSecondaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
secondaryFillColor: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
onChange: (value) {
|
|
||||||
setState(() {
|
|
||||||
businessUser = value;
|
|
||||||
});
|
|
||||||
KenLogger.success("Business User: $businessUser");
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const SizedBox(height: 30.0),
|
|
||||||
Center(
|
|
||||||
child: MihButton(
|
|
||||||
onPressed: () {
|
|
||||||
//Add validation here
|
|
||||||
if (_formKey.currentState!.validate()) {
|
|
||||||
submitForm(mzansiProfileProvider);
|
|
||||||
} else {
|
|
||||||
MihAlertServices().inputErrorAlert(context);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
buttonColor: MihColors.getGreenColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
|
||||||
"Dark"),
|
|
||||||
width: 300,
|
|
||||||
child: Text(
|
|
||||||
mzansiProfileProvider.user!.username.isEmpty
|
|
||||||
? "Setup Profile"
|
|
||||||
: "Update",
|
|
||||||
style: TextStyle(
|
|
||||||
color: MihColors.getPrimaryColor(
|
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
"Dark"),
|
"Dark"),
|
||||||
fontSize: 20,
|
backgroundColor: MihColors.getPrimaryColor(
|
||||||
fontWeight: FontWeight.bold,
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
onChange: (selectedImage) {
|
||||||
|
setState(() {
|
||||||
|
newSelectedProPic = selectedImage;
|
||||||
|
});
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
// const SizedBox(height: 25.0),
|
||||||
|
Visibility(
|
||||||
|
visible: false,
|
||||||
|
child: MihTextFormField(
|
||||||
|
fillColor: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
inputColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
controller: proPicController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
readOnly: true,
|
||||||
|
hintText: "Selected File Name",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
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: usernameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Username",
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices()
|
||||||
|
.validateUsername(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
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: fnameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "First Name",
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices().isEmpty(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
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: lnameController,
|
||||||
|
multiLineInput: false,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Last Name",
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices().isEmpty(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10.0),
|
||||||
|
MihTextFormField(
|
||||||
|
height: 250,
|
||||||
|
fillColor: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
inputColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
controller: purposeController,
|
||||||
|
multiLineInput: true,
|
||||||
|
requiredText: true,
|
||||||
|
hintText: "Your Personal Mission",
|
||||||
|
validator: (value) {
|
||||||
|
return MihValidationServices()
|
||||||
|
.validateLength(purposeController.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: getPurposeLimitColor(256),
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 5),
|
||||||
|
Text(
|
||||||
|
"/256",
|
||||||
|
style: TextStyle(
|
||||||
|
color: getPurposeLimitColor(256),
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 10.0),
|
||||||
|
MihToggle(
|
||||||
|
hintText: "Activate Business Account",
|
||||||
|
initialPostion: businessUser,
|
||||||
|
fillColor: MihColors.getSecondaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
secondaryFillColor: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
onChange: (value) {
|
||||||
|
setState(() {
|
||||||
|
businessUser = value;
|
||||||
|
});
|
||||||
|
KenLogger.success("Business User: $businessUser");
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(height: 30.0),
|
||||||
|
Center(
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
//Add validation here
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitForm(mzansiProfileProvider);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
width: 300,
|
||||||
|
child: Text(
|
||||||
|
mzansiProfileProvider.user!.username.isEmpty
|
||||||
|
? "Setup Profile"
|
||||||
|
: "Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!
|
||||||
|
.theme
|
||||||
|
.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 20,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
top: 0,
|
||||||
|
child: MihButton(
|
||||||
|
onPressed: () {
|
||||||
|
//Add validation here
|
||||||
|
if (_formKey.currentState!.validate()) {
|
||||||
|
submitForm(mzansiProfileProvider);
|
||||||
|
} else {
|
||||||
|
MihAlertServices().inputErrorAlert(context);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
buttonColor: MihColors.getGreenColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
|
width: 100,
|
||||||
|
height: 25,
|
||||||
|
child: Text(
|
||||||
|
mzansiProfileProvider.user!.username.isEmpty
|
||||||
|
? "Setup Profile"
|
||||||
|
: "Update",
|
||||||
|
style: TextStyle(
|
||||||
|
color: MihColors.getPrimaryColor(
|
||||||
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
|
"Dark"),
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
@@ -159,6 +160,7 @@ class _MihPersonalProfileState extends State<MihPersonalProfile> {
|
|||||||
MihCircleAvatar(
|
MihCircleAvatar(
|
||||||
imageFile: mzansiProfileProvider.userProfilePicture,
|
imageFile: mzansiProfileProvider.userProfilePicture,
|
||||||
width: 150,
|
width: 150,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: proPicController,
|
fileNameController: proPicController,
|
||||||
userSelectedfile: newSelectedProPic,
|
userSelectedfile: newSelectedProPic,
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ class _MihPersonalProfileViewState extends State<MihPersonalProfileView> {
|
|||||||
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
|
builder: (BuildContext context, MzansiDirectoryProvider directoryProvider,
|
||||||
Widget? child) {
|
Widget? child) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding:
|
||||||
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
MzansiInnovationHub.of(context)!.theme.screenType == "desktop"
|
||||||
@@ -73,6 +74,7 @@ class _MihPersonalProfileViewState extends State<MihPersonalProfileView> {
|
|||||||
imageFile: CachedNetworkImageProvider(
|
imageFile: CachedNetworkImageProvider(
|
||||||
asyncSnapshot.requireData),
|
asyncSnapshot.requireData),
|
||||||
width: profilePictureWidth,
|
width: profilePictureWidth,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: TextEditingController(),
|
fileNameController: TextEditingController(),
|
||||||
userSelectedfile: file,
|
userSelectedfile: file,
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ class _MihPersonalSettingsState extends State<MihPersonalSettings> {
|
|||||||
|
|
||||||
Widget getBody(MzansiProfileProvider mzansiProfileProvider) {
|
Widget getBody(MzansiProfileProvider mzansiProfileProvider) {
|
||||||
return MihSingleChildScroll(
|
return MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Center(
|
Center(
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
@@ -545,7 +547,7 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
SizedBox(height: 10),
|
||||||
MihBannerAd()
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) MihBannerAd()
|
||||||
// MihBannerAd(),
|
// MihBannerAd(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -572,7 +574,7 @@ class _BuildLoyaltyCardListState extends State<BuildLoyaltyCardList> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setScreenBrightness(double newBrightness) async {
|
Future<void> setScreenBrightness(double newBrightness) async {
|
||||||
if (!kIsWeb) {
|
if (!kIsWeb && !Platform.isLinux) {
|
||||||
bool canChange =
|
bool canChange =
|
||||||
await ScreenBrightness.instance.canChangeSystemBrightness;
|
await ScreenBrightness.instance.canChangeSystemBrightness;
|
||||||
|
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ class _PatientInfoState extends State<PatientInfo> {
|
|||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
MihSingleChildScroll(
|
MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
@@ -313,6 +314,7 @@ class _PatientInfoState extends State<PatientInfo> {
|
|||||||
imageFile:
|
imageFile:
|
||||||
patientManagerProvider.selectedPatientProfilePicture,
|
patientManagerProvider.selectedPatientProfilePicture,
|
||||||
width: 160,
|
width: 160,
|
||||||
|
expandable: true,
|
||||||
editable: false,
|
editable: false,
|
||||||
fileNameController: null,
|
fileNameController: null,
|
||||||
userSelectedfile: null,
|
userSelectedfile: null,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:google_mobile_ads/google_mobile_ads.dart';
|
import 'package:google_mobile_ads/google_mobile_ads.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
|
import 'package:mzansi_innovation_hub/mih_config/mih_env.dart';
|
||||||
@@ -28,35 +30,37 @@ class MihBannerAdProvider extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loadBannerAd() {
|
void loadBannerAd() {
|
||||||
if (bannerAd != null) {
|
if (!kIsWeb && (Platform.isAndroid || Platform.isIOS)) {
|
||||||
bannerAd!.dispose();
|
if (bannerAd != null) {
|
||||||
bannerAd = null;
|
bannerAd!.dispose();
|
||||||
isBannerAdLoaded = false;
|
bannerAd = null;
|
||||||
|
isBannerAdLoaded = false;
|
||||||
|
}
|
||||||
|
bannerAd = BannerAd(
|
||||||
|
adUnitId: adUnitId,
|
||||||
|
request: const AdRequest(),
|
||||||
|
size: AdSize.banner,
|
||||||
|
listener: BannerAdListener(
|
||||||
|
onAdLoaded: (ad) {
|
||||||
|
debugPrint('$ad loaded.');
|
||||||
|
isBannerAdLoaded = true;
|
||||||
|
notifyListeners();
|
||||||
|
},
|
||||||
|
onAdFailedToLoad: (ad, err) {
|
||||||
|
debugPrint('BannerAd failed to load: $err');
|
||||||
|
errorMessage =
|
||||||
|
'Failed to load ad- Message: ${err.message} Code :${err.code}';
|
||||||
|
ad.dispose(); // Dispose the ad to free resources
|
||||||
|
isBannerAdLoaded = false; // ⬅️ Explicitly set to false
|
||||||
|
bannerAd = null; // ⬅️ Explicitly set to null
|
||||||
|
notifyListeners();
|
||||||
|
},
|
||||||
|
onAdOpened: (Ad ad) => debugPrint('$ad opened.'),
|
||||||
|
onAdClosed: (Ad ad) => debugPrint('$ad closed.'),
|
||||||
|
onAdImpression: (Ad ad) => debugPrint('$ad impression.'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
bannerAd!.load();
|
||||||
}
|
}
|
||||||
bannerAd = BannerAd(
|
|
||||||
adUnitId: adUnitId,
|
|
||||||
request: const AdRequest(),
|
|
||||||
size: AdSize.banner,
|
|
||||||
listener: BannerAdListener(
|
|
||||||
onAdLoaded: (ad) {
|
|
||||||
debugPrint('$ad loaded.');
|
|
||||||
isBannerAdLoaded = true;
|
|
||||||
notifyListeners();
|
|
||||||
},
|
|
||||||
onAdFailedToLoad: (ad, err) {
|
|
||||||
debugPrint('BannerAd failed to load: $err');
|
|
||||||
errorMessage =
|
|
||||||
'Failed to load ad- Message: ${err.message} Code :${err.code}';
|
|
||||||
ad.dispose(); // Dispose the ad to free resources
|
|
||||||
isBannerAdLoaded = false; // ⬅️ Explicitly set to false
|
|
||||||
bannerAd = null; // ⬅️ Explicitly set to null
|
|
||||||
notifyListeners();
|
|
||||||
},
|
|
||||||
onAdOpened: (Ad ad) => debugPrint('$ad opened.'),
|
|
||||||
onAdClosed: (Ad ad) => debugPrint('$ad closed.'),
|
|
||||||
onAdImpression: (Ad ad) => debugPrint('$ad impression.'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
bannerAd!.load();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class MzansiAiProvider extends ChangeNotifier {
|
|||||||
ollamaProvider = OllamaProvider(
|
ollamaProvider = OllamaProvider(
|
||||||
baseUrl: "${AppEnviroment.baseAiUrl}/api",
|
baseUrl: "${AppEnviroment.baseAiUrl}/api",
|
||||||
model: AppEnviroment.getEnv() == "Prod"
|
model: AppEnviroment.getEnv() == "Prod"
|
||||||
? 'qwen3-vl:8b'
|
? 'qwen3-vl:8b-instruct'
|
||||||
: "qwen3-vl:2b-instruct",
|
: "qwen3-vl:2b-instruct",
|
||||||
think: false,
|
think: false,
|
||||||
systemPrompt: "---INSTRUCTION START---\n"
|
systemPrompt: "---INSTRUCTION START---\n"
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.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:mzansi_innovation_hub/main.dart';
|
import 'package:mzansi_innovation_hub/main.dart';
|
||||||
@@ -32,6 +35,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -109,6 +113,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -132,7 +137,9 @@ class MihAlertServices {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 15),
|
const SizedBox(height: 15),
|
||||||
Text(
|
Text(
|
||||||
"To get the most out of MIH, we need your location. Please go to the site settings of the app and enable location services. Once you do that, we can start showing you relevant information based on your location.",
|
!kIsWeb && Platform.isLinux
|
||||||
|
? "To get the most out of MIH, we need your location. Please go to your System Settings and enable location services. Once you do that, we can start showing you relevant information based on your location."
|
||||||
|
: "To get the most out of MIH, we need your location. Please go to the site settings of the app and enable location services. Once you do that, we can start showing you relevant information based on your location.",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: MihColors.getSecondaryColor(
|
color: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode ==
|
MzansiInnovationHub.of(context)!.theme.mode ==
|
||||||
@@ -186,6 +193,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -298,6 +306,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -416,6 +425,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -493,6 +503,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -594,6 +605,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -671,6 +683,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -748,6 +761,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getSecondaryColor(
|
backgroundColor: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -830,6 +844,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getSecondaryColor(
|
backgroundColor: MihColors.getSecondaryColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -900,6 +915,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -1007,6 +1023,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getGreenColor(
|
backgroundColor: MihColors.getGreenColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -1089,6 +1106,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getGreenColor(
|
backgroundColor: MihColors.getGreenColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode == "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -1159,6 +1177,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
@@ -1244,6 +1263,7 @@ class MihAlertServices {
|
|||||||
backgroundColor: MihColors.getRedColor(
|
backgroundColor: MihColors.getRedColor(
|
||||||
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
MzansiInnovationHub.of(context)!.theme.mode != "Dark"),
|
||||||
windowBody: MihSingleChildScroll(
|
windowBody: MihSingleChildScroll(
|
||||||
|
scrollbarOn: true,
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
Icon(
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:flutter/foundation.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/mih_package_components/mih_loading_circle.dart';
|
import 'package:mzansi_innovation_hub/mih_package_components/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:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -51,6 +54,15 @@ class MihFileApi {
|
|||||||
} finally {
|
} finally {
|
||||||
// Navigator.of(context).pop(); // Always pop loading dialog
|
// Navigator.of(context).pop(); // Always pop loading dialog
|
||||||
}
|
}
|
||||||
|
KenLogger.success("File URL: $fileUrl");
|
||||||
|
if (AppEnviroment.getEnv() == "Dev" && kIsWeb) {
|
||||||
|
fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1");
|
||||||
|
} else if (AppEnviroment.getEnv() == "Dev" && Platform.isIOS) {
|
||||||
|
fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1");
|
||||||
|
} else if (AppEnviroment.getEnv() == "Dev" && Platform.isLinux) {
|
||||||
|
fileUrl = fileUrl.replaceAll("10.0.2.2", "127.0.0.1");
|
||||||
|
}
|
||||||
|
KenLogger.success("File URL: $fileUrl");
|
||||||
return fileUrl;
|
return fileUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:geolocator/geolocator.dart';
|
import 'package:geolocator/geolocator.dart';
|
||||||
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
|
import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart';
|
||||||
@@ -13,6 +16,12 @@ class MIHLocationAPI {
|
|||||||
///if user has blocked permission (denied or denied forver), user will get error pop up.
|
///if user has blocked permission (denied or denied forver), user will get error pop up.
|
||||||
///if user has granted permission (while in use), function will return Position object.
|
///if user has granted permission (while in use), function will return Position object.
|
||||||
Future<Position?> getGPSPosition(BuildContext context) async {
|
Future<Position?> getGPSPosition(BuildContext context) async {
|
||||||
|
bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
|
||||||
|
if (!serviceEnabled && !kIsWeb && Platform.isLinux) {
|
||||||
|
// Direct the user to their System Settings
|
||||||
|
MihAlertServices().locationPermissionAlert(context);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
print("Before checkPermission"); // Debug
|
print("Before checkPermission"); // Debug
|
||||||
LocationPermission permission = await Geolocator.checkPermission();
|
LocationPermission permission = await Geolocator.checkPermission();
|
||||||
print("After checkPermission: $permission"); // Debug
|
print("After checkPermission: $permission"); // Debug
|
||||||
|
|||||||
@@ -369,6 +369,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.1.0"
|
||||||
|
dbus:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: dbus
|
||||||
|
sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.7.12"
|
||||||
device_info_plus:
|
device_info_plus:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -808,6 +816,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "4.0.0"
|
||||||
|
geoclue:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: geoclue
|
||||||
|
sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.1"
|
||||||
geolocator:
|
geolocator:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -832,6 +848,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.13"
|
version: "2.3.13"
|
||||||
|
geolocator_linux:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: geolocator_linux
|
||||||
|
sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.4"
|
||||||
geolocator_platform_interface:
|
geolocator_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -904,6 +928,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.3.2"
|
||||||
|
gsettings:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: gsettings
|
||||||
|
sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.8"
|
||||||
html:
|
html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: mzansi_innovation_hub
|
name: mzansi_innovation_hub
|
||||||
description: ""
|
description: ""
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
version: 1.2.5+126
|
version: 1.2.6+130
|
||||||
# version: 1.1.1+97 #--- Updated version for upgrader package testing
|
# version: 1.1.1+97 #--- Updated version for upgrader package testing
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
@@ -29,6 +29,7 @@ dependencies:
|
|||||||
flutter_native_splash: ^2.4.6
|
flutter_native_splash: ^2.4.6
|
||||||
printing: ^5.13.3
|
printing: ^5.13.3
|
||||||
geolocator: ^14.0.1
|
geolocator: ^14.0.1
|
||||||
|
geolocator_linux: ^0.2.4
|
||||||
table_calendar: ^3.1.2
|
table_calendar: ^3.1.2
|
||||||
youtube_player_iframe: ^5.2.0
|
youtube_player_iframe: ^5.2.0
|
||||||
mobile_scanner: ^7.0.1
|
mobile_scanner: ^7.0.1
|
||||||
|
|||||||
Reference in New Issue
Block a user