diff --git a/mih_ui/lib/main_dev.dart b/mih_ui/lib/main_dev.dart index 1bc5b571..03080447 100644 --- a/mih_ui/lib/main_dev.dart +++ b/mih_ui/lib/main_dev.dart @@ -42,6 +42,7 @@ void main() async { await Hive.openBox('personal_profile_links_box'); await Hive.openBox('business_profile_links_box'); await Hive.openBox('business_employees_box'); + await Hive.openBox('profile_modifications_queue'); // Mzansi Wallet Data await Hive.openBox('loyalty_card_box'); await Hive.openBox('fav_loyalty_card_box'); diff --git a/mih_ui/lib/mih_hive/about_mih_hive_data.dart b/mih_ui/lib/mih_hive/about_mih_hive_data.dart index d1410266..551136fa 100644 --- a/mih_ui/lib/mih_hive/about_mih_hive_data.dart +++ b/mih_ui/lib/mih_hive/about_mih_hive_data.dart @@ -9,6 +9,16 @@ class AboutMihHiveData { static const String kUserCountKey = 'current_user_count'; static const String kBusinessCountKey = 'current_business_count'; + // Clear Local Cache + Future clearAboutMIHCache() async { + try { + await _mihUserBusinessCountBox.clear(); + KenLogger.success("Cleared Local About MIH Cache."); + } catch (error) { + KenLogger.error("Failed to clear local about mih cache."); + } + } + // Get Data from local storage int? getcachedUserCount() => _mihUserBusinessCountBox.get(kUserCountKey); int? getcachedBusinessCount() => diff --git a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart index 39416e9e..8ea47eec 100644 --- a/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_profile_hive_data.dart @@ -26,6 +26,25 @@ class MzansiProfileHiveData { Hive.box('business_profile_links_box'); final Box _businessEmployeesBox = Hive.box('business_Employees_box'); + final Box _modificationsQueue = + Hive.box('profile_modifications_queue'); + + // Set offline data + Future clearProfileCache() async { + try { + await _userBox.clear(); + await _businessBox.clear(); + await _businessUserBox.clear(); + await _userConsentBox.clear(); + await _personalProfileLinksBox.clear(); + await _businessProfileLinksBox.clear(); + await _businessEmployeesBox.clear(); + await _modificationsQueue.clear(); + KenLogger.success("Cleared Local Profile Cache."); + } catch (error) { + KenLogger.error("Failed to clear local profile cache."); + } + } static const String kUserKey = 'current_user'; static const String kBusinessKey = 'current_business'; @@ -144,4 +163,58 @@ class MzansiProfileHiveData { // KenLogger.warning("App operating offline mode. Sync paused: $error"); } } + + // Set Offline Data + Future addUserConsentLocally(UserConsent newConsent) async { + try { + await _userConsentBox.put(kConsentKey, newConsent); + KenLogger.success("Consent Saved Locally."); + return true; + } catch (error) { + return false; + } + } + + // Modification Processing + Future queuAddConsentModification(UserConsent newConsent) async { + await _modificationsQueue.add({ + 'action': 'ADD', + 'type': 'CONSENT', + 'payload': newConsent, + }); + KenLogger.success("Add Consent Queues for Online Sync"); + } + + Future processModificationsQueue() async { + if (_modificationsQueue.isEmpty) { + return true; + } + final List queueKeys = _modificationsQueue.keys.toList(); + for (var taskKey in queueKeys) { + final task = _modificationsQueue.get(taskKey); + if (task == null) { + continue; + } + final String action = task['action']; + final String type = task['type']; + if (type == 'CONSENT') { + final UserConsent consentTask = task['payload']; + if (action == 'ADD') { + final responseCode = + await MihUserConsentServices().insertUserConsentStatusV2( + consentTask, + ); + if (responseCode != null && responseCode == 201) { + await _modificationsQueue.delete(taskKey); + KenLogger.success("Add User Consent to MIH Server"); + } + } + } + } + return true; + } + + bool isModificationsNotEmpty() { + return _modificationsQueue.values.toList().isNotEmpty; + } } diff --git a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart index d7e767b8..8a2f91f4 100644 --- a/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart +++ b/mih_ui/lib/mih_hive/mzansi_wallet_hive_data.dart @@ -13,6 +13,18 @@ class MzansiWalletHiveData { final Box _modificationsQueue = Hive.box('wallet_modifications_queue'); + // Set offline data + Future clearWalletCache() async { + try { + await _loyaltyCardBox.clear(); + await _favLoyaltyCardBox.clear(); + await _modificationsQueue.clear(); + KenLogger.success("Cleared Local Wallet Cache."); + } catch (error) { + KenLogger.error("Failed to clear local wallet cache."); + } + } + // Get Offline Data List getCachedLoyaltyCards() { final cards = _loyaltyCardBox.values.toList(); @@ -204,8 +216,6 @@ class MzansiWalletHiveData { } final String action = task['action']; final MIHLoyaltyCard taskCard = task['payload']; - KenLogger.warning( - "Card Details: id=${taskCard.idloyalty_cards}, shop=${taskCard.shop_name}, Nunber=${taskCard.card_number}, offline_id=${taskCard.offline_id}"); if (action == 'ADD') { dynamic deleteCardTaskKey; for (var entry in _modificationsQueue.toMap().entries) { diff --git a/mih_ui/lib/mih_package_components/mih_business_info_card.dart b/mih_ui/lib/mih_package_components/mih_business_info_card.dart index 511434cf..1859c3ca 100644 --- a/mih_ui/lib/mih_package_components/mih_business_info_card.dart +++ b/mih_ui/lib/mih_package_components/mih_business_info_card.dart @@ -539,7 +539,6 @@ class _MihBusinessCardState extends State { } directoryProvider.setSearchedBusinesses( searchedBusinesses: businessSearchResults, - businessesImagesUrl: busImagesUrl, ); setState(() { _businessReviewFuture = getUserReview(); diff --git a/mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart b/mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart index 2541c0b8..a10933f4 100644 --- a/mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart +++ b/mih_ui/lib/mih_package_components/mih_business_info_card_v2.dart @@ -518,15 +518,8 @@ class _MihBusinessCardV2State extends State { businessSearchResults = await MihBusinessDetailsServices() .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); - Map> busImagesUrl = {}; - Future 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(); diff --git a/mih_ui/lib/mih_package_components/mih_business_profile_preview.dart b/mih_ui/lib/mih_package_components/mih_business_profile_preview.dart index 48f741d4..e5fff9b7 100644 --- a/mih_ui/lib/mih_package_components/mih_business_profile_preview.dart +++ b/mih_ui/lib/mih_package_components/mih_business_profile_preview.dart @@ -54,7 +54,8 @@ class _MihBusinessProfilePreviewState extends State { size: profilePictureWidth, color: MihColors.secondary(), ) - : widget.imageFile == null + : widget.business.logo_path.endsWith('/') || + widget.business.logo_path == '' ? Icon( MihIcons.mihIDontKnow, size: profilePictureWidth, diff --git a/mih_ui/lib/mih_package_components/mih_personal_profile_preview.dart b/mih_ui/lib/mih_package_components/mih_personal_profile_preview.dart index 91aa7711..ac9ea245 100644 --- a/mih_ui/lib/mih_package_components/mih_personal_profile_preview.dart +++ b/mih_ui/lib/mih_package_components/mih_personal_profile_preview.dart @@ -36,7 +36,8 @@ class _MihPersonalProfilePreviewState extends State { size: profilePictureWidth, color: MihColors.secondary(), ) - : widget.imageFile == null + : widget.user.pro_pic_path.endsWith('/') || + widget.user.pro_pic_path == "" ? Icon( MihIcons.mihIDontKnow, size: profilePictureWidth, diff --git a/mih_ui/lib/mih_packages/mih_authentication/package_tools/mih_register.dart b/mih_ui/lib/mih_packages/mih_authentication/package_tools/mih_register.dart index b855acea..84b87fea 100644 --- a/mih_ui/lib/mih_packages/mih_authentication/package_tools/mih_register.dart +++ b/mih_ui/lib/mih_packages/mih_authentication/package_tools/mih_register.dart @@ -1,18 +1,13 @@ -import 'dart:convert'; - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_authentication_provider.dart'; -import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_authentication_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:provider/provider.dart'; -import 'package:supertokens_flutter/http.dart' as http; -import 'package:supertokens_flutter/supertokens.dart'; class MihRegister extends StatefulWidget { const MihRegister({ @@ -31,142 +26,11 @@ class _MihRegisterState extends State { final _formKey = GlobalKey(); final baseAPI = AppEnviroment.baseApiUrl; - Future addUserAPICall(String email, String uid) async { - //await getOfficeIdByUser(docOfficeIdApiUrl + widget.userEmail); - //print(futureDocOfficeId.toString()); - await MihUserServices().createUser( - email, - uid, - context, - ); - // var response = await http.post( - // Uri.parse("$baseAPI/user/insert/"), - // headers: { - // "Content-Type": "application/json; charset=UTF-8" - // }, - // body: jsonEncode({ - // "email": email, - // "app_id": uid, - // }), - // ); - // if (response.statusCode == 201) { - // Navigator.of(context).pushNamedAndRemoveUntil( - // '/', - // (route) => false, - // arguments: AuthArguments( - // true, - // true, - // ), - // ); - // // signUpSuccess(); - // // setState(() { - // // successfulSignUp = true; - // // }); - // } else { - // internetConnectionPopUp(); - // } - } - - Future signUserUp() async { - context.read().reset(); - if (!validEmail()) { - MihAlertServices().invalidEmailAlert(context); - } else if (passwordController.text != confirmPasswordController.text) { - MihAlertServices().passwordMatchAlert(context); - } else { - //var _backgroundColor = Colors.transparent; - showDialog( - context: context, - builder: (context) { - return const Mihloadingcircle(); - }, - ); - try { - Uri uri = Uri.parse( - "$baseAPI/auth/emailpassword/email/exists?email=${emailController.text}"); - //print("Here"); - var response = await http.get(uri); - //print(response.body); - //print("response 1: ${response.statusCode}"); - if (response.statusCode == 200) { - var userExists = jsonDecode(response.body); - if (userExists["exists"]) { - Navigator.of(context).pop(); - MihAlertServices().emailExistsAlert(context); - } else { - var response2 = await http.post( - Uri.parse("$baseAPI/auth/signup"), - body: - '{"formFields": [{"id": "email","value": "${emailController.text}"}, {"id": "password","value": "${passwordController.text}"}]}', - headers: { - 'Content-type': 'application/json', - 'Accept': 'application/json', - }, - ); - //print("response 2: ${response2.statusCode}"); - if (response2.statusCode == 200) { - //print("response 2: ${response2.body}"); - var userCreated = jsonDecode(response2.body); - //print("Created user $userCreated"); - if (userCreated["status"] == "OK") { - //print("Here1"); - //Creat user in db - String uid = await SuperTokens.getUserId(); - //print("uid: $uid"); - addUserAPICall(emailController.text, uid); - Navigator.of(context).pop(); - //print("Here1"); - } else if (userCreated["status"] == "FIELD_ERROR") { - Navigator.of(context).pop(); - MihAlertServices().passwordRequirementAlert(context); - } else { - Navigator.of(context).pop(); - MihAlertServices().internetConnectionAlert(context); - } - } - } - } - } on Exception catch (error) { - Navigator.of(context).pop(); - loginError(error.toString()); - emailController.clear(); - passwordController.clear(); - confirmPasswordController.clear(); - } - } - } - void submitFormInput() async { - await signUserUp(); - } - - bool validEmail() { - String text = emailController.text; - var regex = RegExp(r'^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'); - return regex.hasMatch(text); - } - - void loginError(error) { - MihAlertServices().errorAdvancedAlert( - "Sign Up Error", - "An error occurred while signing up: $error Please try again later.", - [ - MihButton( - onPressed: () { - Navigator.of(context).pop(); - }, - buttonColor: MihColors.secondary(), - width: 200, - child: Text( - "Dismiss", - style: TextStyle( - color: MihColors.primary(), - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - ), - ], + await MihAuthenticationServices().signUserUp( + emailController.text, + passwordController.text, + confirmPasswordController.text, context, ); } diff --git a/mih_ui/lib/mih_packages/mih_home/components/mih_app_drawer.dart b/mih_ui/lib/mih_packages/mih_home/components/mih_app_drawer.dart index 1f0def0d..5a659af8 100644 --- a/mih_ui/lib/mih_packages/mih_home/components/mih_app_drawer.dart +++ b/mih_ui/lib/mih_packages/mih_home/components/mih_app_drawer.dart @@ -30,8 +30,7 @@ class _MIHAppDrawerState extends State { final proPicController = TextEditingController(); late Widget profilePictureLoaded; - void resetProviders() { - context.read().reset(); + Future clearCacheAndProviders() async { context.read().reset(); context.read().reset(); context.read().reset(); @@ -40,8 +39,10 @@ class _MIHAppDrawerState extends State { context.read().reset(); context.read().reset(); context.read().reset(); - context.read().reset(); context.read().reset(); + await context.read().clearAboutMihCacheAndProvider(); + await context.read().clearWalletCacheAndProvider(); + await context.read().clearProfileCacheAndProvider(); } Future signOut() async { @@ -187,32 +188,6 @@ class _MIHAppDrawerState extends State { ), ), ), - // ListTile( - // title: Row( - // mainAxisSize: MainAxisSize.max, - // children: [ - // Icon( - // Icons.home_outlined, - // color: - // MihColors.secondary(), - // ), - // const SizedBox(width: 25.0), - // Text( - // "Home", - // style: TextStyle( - // //fontWeight: FontWeight.bold, - // color: MzansiInnovationHub.of(context)! - // .theme - // .secondaryColor(), - // ), - // ), - // ], - // ), - // onTap: () { - // Navigator.of(context) - // .pushNamedAndRemoveUntil('/', (route) => false); - // }, - // ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.end, @@ -291,8 +266,7 @@ class _MIHAppDrawerState extends State { }); if (await SuperTokens.doesSessionExist() == false) { - resetProviders(); - await Future.delayed(Duration.zero); + await clearCacheAndProviders(); if (context.mounted) { context.goNamed( 'mihHome', @@ -313,21 +287,6 @@ class _MIHAppDrawerState extends State { height: 30, child: InkWell( onTap: () { - // setState(() { - // if (MzansiInnovationHub.of(context)?.theme.mode == - // "Dark") { - // //darkm = !darkm; - // MzansiInnovationHub.of(context)! - // .changeTheme(ThemeMode.light); - // //print("Dark Mode: $darkm"); - // } else { - // //darkm = !darkm; - // MzansiInnovationHub.of(context)! - // .changeTheme(ThemeMode.dark); - // //print("Dark Mode: $darkm"); - // } - // // Navigator.of(context).popAndPushNamed('/',); - // }); context.goNamed("aboutMih"); }, child: Icon( @@ -335,27 +294,6 @@ class _MIHAppDrawerState extends State { color: MihColors.primary(), ), ), - // IconButton( - // onPressed: () { - // setState(() { - // if (MzansiInnovationHub.of(context)?.theme.mode == "Dark") { - // //darkm = !darkm; - // MzansiInnovationHub.of(context)!.changeTheme(ThemeMode.light); - // //print("Dark Mode: $darkm"); - // } else { - // //darkm = !darkm; - // MzansiInnovationHub.of(context)!.changeTheme(ThemeMode.dark); - // //print("Dark Mode: $darkm"); - // } - // Navigator.of(context).popAndPushNamed('/'); - // }); - // }, - // icon: Icon( - // Icons.light_mode, - // color: MihColors.primary(), - // size: 35, - // ), - // ), ), ], ); diff --git a/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart b/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart index 97901e63..109a9461 100644 --- a/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart +++ b/mih_ui/lib/mih_packages/mih_home/components/mih_user_consent_window.dart @@ -16,56 +16,55 @@ class MihUserConsentWindow extends StatefulWidget { } class _MihUserConsentWindowState extends State { - void createOrUpdateAccpetance(MzansiProfileProvider mzansiProfileProvider) { + void createOrUpdateAccpetance( + MzansiProfileProvider mzansiProfileProvider) async { UserConsent? userConsent = mzansiProfileProvider.userConsent; - userConsent != null - ? MihUserConsentServices() - .updateUserConsentStatus( - DateTime.now().toIso8601String(), - DateTime.now().toIso8601String(), - mzansiProfileProvider, - context, - ) - .then((value) { - if (!mounted) return; - if (value == 200) { - context.goNamed("mihHome"); - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("Thank you for accepting our Policies"), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("There was an error, please try again later"), - ), - ); - } - }) - : MihUserConsentServices() - .insertUserConsentStatus( - DateTime.now().toIso8601String(), - DateTime.now().toIso8601String(), - mzansiProfileProvider, - context, - ) - .then((value) { - if (value == 201) { - context.goNamed("mihHome"); - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("Thank you for accepting our Policies"), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - MihSnackBar( - child: Text("There was an error, please try again later"), - ), - ); - } - }); + if (userConsent != null) { + MihUserConsentServices() + .updateUserConsentStatus( + DateTime.now().toIso8601String(), + DateTime.now().toIso8601String(), + mzansiProfileProvider, + context, + ) + .then((value) { + if (!mounted) return; + if (value == 200) { + context.goNamed("mihHome"); + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Thank you for accepting our Policies"), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("There was an error, please try again later"), + ), + ); + } + }); + } else { + bool success = await mzansiProfileProvider.addUserConsent(UserConsent( + app_id: mzansiProfileProvider.user!.app_id, + privacy_policy_accepted: DateTime.now(), + terms_of_services_accepted: DateTime.now(), + )); + if (success) { + context.pop(); + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("Thank you for accepting our Policies"), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + MihSnackBar( + child: Text("There was an error, please try again later"), + ), + ); + } + } } @override diff --git a/mih_ui/lib/mih_packages/mih_home/mih_home.dart b/mih_ui/lib/mih_packages/mih_home/mih_home.dart index 320f4c54..8d4cdd50 100644 --- a/mih_ui/lib/mih_packages/mih_home/mih_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/mih_home.dart @@ -45,8 +45,9 @@ class _MihHomeState extends State { mzansiProfileProvider.loadCachedProfileState(); if (mzansiProfileProvider.user == null) { await mzansiProfileProvider.syncWithMihServerData(); - } else { - mzansiProfileProvider.syncWithMihServerData(); + } + if(mzansiProfileProvider.isLocalModificationsPending()){ + mzansiProfileProvider.syncWithMihServerData(); } } diff --git a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index a2c989a1..3bfa7650 100644 --- a/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/mih_ui/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -209,15 +209,6 @@ class _MihPersonalHomeState extends State void initState() { super.initState(); searchController.addListener(searchPackage); - MzansiProfileProvider profileProvider = - context.read(); - if (profileProvider.user == null || profileProvider.user?.username == "") { - personalPackagesMap = setNerUserPersonalPackage(); - autoNavToProfile(); - } else { - personalPackagesMap = setPersonalPackagesMap(profileProvider); - } - searchPackage(); } @override @@ -237,6 +228,14 @@ class _MihPersonalHomeState extends State return Consumer2( builder: (BuildContext context, MzansiProfileProvider profileProvider, MzansiAiProvider mzansiAiProvider, Widget? child) { + if (profileProvider.user == null || + profileProvider.user?.username == "") { + personalPackagesMap = setNerUserPersonalPackage(); + autoNavToProfile(); + } else { + personalPackagesMap = setPersonalPackagesMap(profileProvider); + } + searchPackage(); return Column( children: [ Visibility( diff --git a/mih_ui/lib/mih_packages/mine_sweeper/builders/build_minesweeper_leaderboard_list.dart b/mih_ui/lib/mih_packages/mine_sweeper/builders/build_minesweeper_leaderboard_list.dart index a16e5fb2..a204d304 100644 --- a/mih_ui/lib/mih_packages/mine_sweeper/builders/build_minesweeper_leaderboard_list.dart +++ b/mih_ui/lib/mih_packages/mine_sweeper/builders/build_minesweeper_leaderboard_list.dart @@ -4,6 +4,7 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_circle_avatar.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_mine_sweeper_provider.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:provider/provider.dart'; class BuildMinesweeperLeaderboardList extends StatefulWidget { @@ -43,89 +44,69 @@ class _BuildMinesweeperLeaderboardListState }, itemCount: mineSweeperProvider.leaderboard!.length, itemBuilder: (context, index) { - return FutureBuilder( - future: mineSweeperProvider.leaderboardUserPicturesUrl[index], - builder: (context, asyncSnapshot) { - ImageProvider? imageFile; - bool loading = true; - if (asyncSnapshot.connectionState == ConnectionState.done) { - loading = false; - if (asyncSnapshot.hasData) { - imageFile = asyncSnapshot.requireData != "" - ? CachedNetworkImageProvider( - asyncSnapshot.requireData) - : null; - } else { - imageFile = null; - } - } else { - imageFile = null; - } - return Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: Row( - children: [ - Text( - "#${index + 1}", - style: TextStyle( - fontSize: 25, - color: getMedalColor(index), - ), - ), - const SizedBox(width: 10), - loading - ? Icon( - MihIcons.mihRing, - size: 80, - color: MihColors.secondary(), - ) - : imageFile == null - ? Icon( - MihIcons.mihIDontKnow, - size: 80, - color: MihColors.secondary(), - ) - : MihCircleAvatar( - key: UniqueKey(), - imageFile: imageFile, - width: 80, - expandable: true, - editable: false, - fileNameController: null, - userSelectedfile: null, - frameColor: getMedalColor(index), - backgroundColor: MihColors.primary(), - onChange: () {}, - ), - const SizedBox(width: 10), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "${mineSweeperProvider.leaderboard![index].username}${profileProvider.user!.username == mineSweeperProvider.leaderboard![index].username ? " (You)" : ""}", - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: getMedalColor(index), - ), - ), - Text( - "Score: ${mineSweeperProvider.leaderboard![index].game_score}\nTime: ${mineSweeperProvider.leaderboard![index].game_time}", - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 18, - // fontWeight: FontWeight.bold, - color: getMedalColor(index), - ), - ), - ], - ) - ], + return Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: Row( + children: [ + Text( + "#${index + 1}", + style: TextStyle( + fontSize: 25, + color: getMedalColor(index), ), - ); - }); + ), + const SizedBox(width: 10), + mineSweeperProvider.leaderboard![index].proPicUrl + .endsWith('/') || + mineSweeperProvider.leaderboard![index].proPicUrl == + '' + ? Icon( + MihIcons.mihIDontKnow, + size: 80, + color: MihColors.secondary(), + ) + : MihCircleAvatar( + key: UniqueKey(), + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2(mineSweeperProvider + .leaderboard![index].proPicUrl)), + width: 80, + expandable: true, + editable: false, + fileNameController: null, + userSelectedfile: null, + frameColor: getMedalColor(index), + backgroundColor: MihColors.primary(), + onChange: () {}, + ), + const SizedBox(width: 10), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${mineSweeperProvider.leaderboard![index].username}${profileProvider.user!.username == mineSweeperProvider.leaderboard![index].username ? " (You)" : ""}", + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: getMedalColor(index), + ), + ), + Text( + "Score: ${mineSweeperProvider.leaderboard![index].game_score}\nTime: ${mineSweeperProvider.leaderboard![index].game_time}", + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 18, + // fontWeight: FontWeight.bold, + color: getMedalColor(index), + ), + ), + ], + ) + ], + ), + ); }, ); }, diff --git a/mih_ui/lib/mih_packages/mine_sweeper/package_tools/mih_mine_sweeper_leader_board.dart b/mih_ui/lib/mih_packages/mine_sweeper/package_tools/mih_mine_sweeper_leader_board.dart index 76efe29c..6837f1d3 100644 --- a/mih_ui/lib/mih_packages/mine_sweeper/package_tools/mih_mine_sweeper_leader_board.dart +++ b/mih_ui/lib/mih_packages/mine_sweeper/package_tools/mih_mine_sweeper_leader_board.dart @@ -1,10 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ken_logger/ken_logger.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_providers/mih_mine_sweeper_provider.dart'; import 'package:mzansi_innovation_hub/mih_packages/mine_sweeper/builders/build_minesweeper_leaderboard_list.dart'; -import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_minesweeper_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:provider/provider.dart'; @@ -24,16 +21,7 @@ class _MihMineSweeperLeaderBoardState extends State { MihMineSweeperProvider mineSweeperProvider = context.read(); filterController.text = mineSweeperProvider.difficulty; - KenLogger.success("getting data"); await MihMinesweeperServices().getTop20Leaderboard(mineSweeperProvider); - List> userPicturesUrl = []; - Future userPicUrl; - for (final ranking in mineSweeperProvider.leaderboard!) { - userPicUrl = MihFileApi.getMinioFileUrl(ranking.proPicUrl); - userPicturesUrl.add(userPicUrl); - } - mineSweeperProvider.setLeaderboardUserPictures( - leaderboardUserPicturesUrl: userPicturesUrl); setState(() { isLoading = false; }); diff --git a/mih_ui/lib/mih_packages/mine_sweeper/package_tools/my_score_board.dart b/mih_ui/lib/mih_packages/mine_sweeper/package_tools/my_score_board.dart index 5d9478b5..f39ec2cf 100644 --- a/mih_ui/lib/mih_packages/mine_sweeper/package_tools/my_score_board.dart +++ b/mih_ui/lib/mih_packages/mine_sweeper/package_tools/my_score_board.dart @@ -26,10 +26,8 @@ class _MihMineSweeperLeaderBoardState extends State { MihMineSweeperProvider mineSweeperProvider = context.read(); filterController.text = mineSweeperProvider.difficulty; - KenLogger.success("getting data"); await MihMinesweeperServices() .getMyScoreboard(profileProvider, mineSweeperProvider); - KenLogger.success("${mineSweeperProvider.myScoreboard}"); } void refreshLeaderBoard( diff --git a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart index 377b2c4a..da3307be 100644 --- a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart +++ b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart @@ -5,6 +5,7 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_business_profile_preview.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:provider/provider.dart'; class BuildBusinessSearchResultsList extends StatefulWidget { @@ -27,8 +28,6 @@ class _BuildBusinessSearchResultsListState builder: (BuildContext context, MzansiDirectoryProvider directoryProvider, Widget? child) { return ListView.separated( - // shrinkWrap: true, - // physics: const NeverScrollableScrollPhysics(), itemCount: widget.businessList.length, separatorBuilder: (BuildContext context, index) { return Divider( @@ -54,32 +53,14 @@ class _BuildBusinessSearchResultsListState // vertical: 5, horizontal: 25, ), - child: FutureBuilder( - future: directoryProvider.busSearchImagesUrl![ - widget.businessList[index].business_id], - builder: (context, asyncSnapshot) { - ImageProvider? imageFile; - bool loading = true; - if (asyncSnapshot.connectionState == - ConnectionState.done) { - loading = false; - if (asyncSnapshot.hasData) { - imageFile = asyncSnapshot.requireData != "" - ? CachedNetworkImageProvider( - asyncSnapshot.requireData) - : null; - } else { - imageFile = null; - } - } else { - imageFile = null; - } - return MihBusinessProfilePreview( - business: widget.businessList[index], - imageFile: imageFile, - loading: loading, - ); - }), + child: MihBusinessProfilePreview( + business: widget.businessList[index], + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2( + widget.businessList[index].logo_path), + ), + loading: false, + ), ), ), ); diff --git a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart index 0ddeca0a..1d4ad730 100644 --- a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart +++ b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart @@ -5,6 +5,7 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_business_profile_preview.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:provider/provider.dart'; class BuildFavouriteBusinessesList extends StatefulWidget { @@ -59,32 +60,15 @@ class _BuildFavouriteBusinessesListState padding: EdgeInsets.symmetric( horizontal: 25, ), - child: FutureBuilder( - future: directoryProvider.favBusImagesUrl![ - widget.favouriteBusinesses[index]!.business_id], - builder: (context, asyncSnapshot) { - ImageProvider? imageFile; - bool loading = true; - if (asyncSnapshot.connectionState == - ConnectionState.done) { - loading = false; - if (asyncSnapshot.hasData) { - imageFile = asyncSnapshot.requireData != "" - ? CachedNetworkImageProvider( - asyncSnapshot.requireData) - : null; - } else { - imageFile = null; - } - } else { - imageFile = null; - } - return MihBusinessProfilePreview( - business: widget.favouriteBusinesses[index]!, - imageFile: imageFile, - loading: loading, - ); - }), + child: MihBusinessProfilePreview( + business: widget.favouriteBusinesses[index]!, + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2( + widget.favouriteBusinesses[index]!.logo_path, + ), + ), + loading: false, + ), ), ), ); diff --git a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart index 451e5c3b..f6e4e1e1 100644 --- a/mih_ui/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart +++ b/mih_ui/lib/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart @@ -5,6 +5,7 @@ import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_package_components/mih_personal_profile_preview.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_file_services.dart'; import 'package:provider/provider.dart'; class BuildUserSearchResultsList extends StatefulWidget { @@ -27,8 +28,6 @@ class _BuildUserSearchResultsListState builder: (BuildContext context, MzansiDirectoryProvider directoryProvider, Widget? child) { return ListView.separated( - // shrinkWrap: true, - // physics: const NeverScrollableScrollPhysics(), itemCount: widget.userList.length, separatorBuilder: (BuildContext context, index) { return Divider( @@ -53,32 +52,14 @@ class _BuildUserSearchResultsListState // vertical: 5, horizontal: 25, ), - child: FutureBuilder( - future: directoryProvider - .userSearchImagesUrl![widget.userList[index].app_id], - builder: (context, asyncSnapshot) { - ImageProvider? imageFile; - bool loading = true; - if (asyncSnapshot.connectionState == - ConnectionState.done) { - loading = false; - if (asyncSnapshot.hasData) { - imageFile = asyncSnapshot.requireData != "" - ? CachedNetworkImageProvider( - asyncSnapshot.requireData) - : null; - } else { - imageFile = null; - } - } else { - imageFile = null; - } - return MihPersonalProfilePreview( - user: widget.userList[index], - imageFile: imageFile, - loading: loading, - ); - }), + child: MihPersonalProfilePreview( + user: widget.userList[index], + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2( + widget.userList[index].pro_pic_path), + ), + loading: false, + ), ), ), ); diff --git a/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart b/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart index eb7db4d7..910ef6df 100644 --- a/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart +++ b/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_favourite_businesses.dart @@ -6,7 +6,6 @@ import 'package:mzansi_innovation_hub/mih_providers/mzansi_directory_provider.da import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_favourite_businesses_list.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.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'; @@ -37,20 +36,15 @@ class _MihFavouriteBusinessesState extends State { directoryProvider, ); List favBus = []; - Map> favBusImages = {}; - Future businessLogoUrl; for (var bus in directoryProvider.bookmarkedBusinesses) { await MihBusinessDetailsServices() .getBusinessDetailsByBusinessId(bus.business_id) .then((business) async { favBus.add(business!); - businessLogoUrl = MihFileApi.getMinioFileUrl(business.logo_path); - favBusImages[business.business_id] = businessLogoUrl; }); } directoryProvider.setFavouriteBusinesses( businesses: favBus, - businessesImagesUrl: favBusImages, ); } } diff --git a/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart b/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart index 05e878da..42568648 100644 --- a/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart +++ b/mih_ui/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:ken_logger/ken_logger.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; @@ -9,7 +8,6 @@ import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/bui import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_user_search_results_list.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_user_services.dart'; import 'package:provider/provider.dart'; @@ -26,8 +24,6 @@ class _MihSearchMzansiState extends State { final TextEditingController mzansiSearchController = TextEditingController(); final TextEditingController businessTypeController = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); - // late bool userSearch; - // Future?> futureUserSearchResults = Future.value(); List userSearchResults = []; List businessSearchResults = []; late Future> availableBusinessTypes; @@ -51,9 +47,8 @@ class _MihSearchMzansiState extends State { } void clearAll(MzansiDirectoryProvider directoryProvider) { - directoryProvider - .setSearchedBusinesses(searchedBusinesses: [], businessesImagesUrl: {}); - directoryProvider.setSearchedUsers(searchedUsers: [], userImagesUrl: {}); + directoryProvider.setSearchedBusinesses(searchedBusinesses: []); + directoryProvider.setSearchedUsers(searchedUsers: []); directoryProvider.setSearchTerm(searchTerm: ""); setState(() { mzansiSearchController.clear(); @@ -73,19 +68,8 @@ class _MihSearchMzansiState extends State { directoryProvider.searchTerm.isNotEmpty) { final userResults = await MihUserServices() .searchUsers(profileProvider, directoryProvider.searchTerm, context); - Map> userImages = {}; - Future usernProPicUrl; - for (var user in userResults) { - usernProPicUrl = MihFileApi.getMinioFileUrl(user.pro_pic_path); - userImages[user.app_id] = usernProPicUrl; - // != "" - // ? CachedNetworkImageProvider(usernProPicUrl) - // : null; - } - directoryProvider.setSearchedUsers( searchedUsers: userResults, - userImagesUrl: userImages, ); } else { List? businessSearchResults = []; @@ -98,18 +82,8 @@ class _MihSearchMzansiState extends State { .searchBusinesses(directoryProvider.searchTerm, directoryProvider.businessTypeFilter, context); } - Map> busImagesUrl = {}; - Future businessLogoUrl; - for (var bus in businessSearchResults) { - businessLogoUrl = MihFileApi.getMinioFileUrl(bus.logo_path); - busImagesUrl[bus.business_id] = businessLogoUrl; - // != "" - // ? CachedNetworkImageProvider(businessLogoUrl) - // : null; - } directoryProvider.setSearchedBusinesses( searchedBusinesses: businessSearchResults, - businessesImagesUrl: busImagesUrl, ); } setState(() { diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart index 603b399a..5da351d0 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_add_bookmark_alert.dart @@ -47,7 +47,6 @@ class _MihAddBookmarkAlertState extends State { } directoryProvider.setFavouriteBusinesses( businesses: favBus, - businessesImagesUrl: favBusImages, ); } diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart index 5ef7e8c5..79103175 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/components/mih_delete_bookmark_alert.dart @@ -52,7 +52,6 @@ class _MihDeleteBookmarkAlertState extends State { } directoryProvider.setFavouriteBusinesses( businesses: favBus, - businessesImagesUrl: favBusImages, ); } diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details_view.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details_view.dart index 7db8d42e..2bf2df9e 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details_view.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_details_view.dart @@ -69,58 +69,20 @@ class _MihBusinessDetailsViewState extends State { : EdgeInsets.symmetric(horizontal: width * 0), child: Column( children: [ - FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "") { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.secondary(), - backgroundColor: MihColors.primary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.secondary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.secondary(), - ); - } - }), - // Center( - // child: MihCircleAvatar( - // imageFile: widget.logoImage, - // width: 150, - // editable: false, - // fileNameController: fileNameController, - // userSelectedfile: imageFile, - // frameColor: - // MihColors.secondary(), - // backgroundColor: - // MihColors.primary(), - // onChange: (selectedfile) { - // setState(() { - // imageFile = selectedfile; - // }); - // }, - // ), - // ), + MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2( + directoryProvider.selectedBusiness!.logo_path), + ), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.secondary(), + backgroundColor: MihColors.primary(), + onChange: () {}, + ), FittedBox( child: Text( directoryProvider.selectedBusiness!.Name, diff --git a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart index 97057c06..a327214f 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_qr_code.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:cached_network_image/cached_network_image.dart'; import 'package:file_picker/file_picker.dart'; import 'package:file_saver/file_saver.dart'; @@ -59,7 +57,7 @@ class _MihBusinessQrCodeState extends State { String encodedData = Uri.encodeComponent("$qrCodedata${business.business_id}"); - return "https://api.qrserver.com/v1/create-qr-code/?data=$encodedData&size=${qrSize}x${qrSize}&bgcolor=$bgColor&color=$color"; + return "https://api.qrserver.com/v1/create-qr-code/?data=$encodedData&size=${qrSize}x$qrSize&bgcolor=$bgColor&color=$color"; } Future saveImage(Uint8List imageBytes) async { @@ -206,41 +204,18 @@ class _MihBusinessQrCodeState extends State { backgroundColor: MihColors.secondary(), onChange: () {}, ) - : FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "" || - asyncSnapshot.requireData.isNotEmpty) { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.primary(), - backgroundColor: MihColors.secondary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - }, + : MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2(business.logo_path), + ), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, ), FittedBox( child: Text( diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/components/mih_edit_personal_profile_window.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/components/mih_edit_personal_profile_window.dart index c2245ef8..b5dc1024 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/components/mih_edit_personal_profile_window.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/components/mih_edit_personal_profile_window.dart @@ -86,12 +86,9 @@ class _MihEditPersonalProfileWindowState ); if (responseCode == 200) { setState(() { - setProfileVariables(mzansiProfileProvider); newSelectedProPic = null; }); - // if (originalProfileTypeIsBusiness == false && businessUser == true) { - // stayOnPersonalSide = false; - // } + await mzansiProfileProvider.syncWithMihServerData(); String message = "Your information has been updated successfully!"; successPopUp( mzansiProfileProvider, diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart index 333e2807..74cd81db 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile.dart @@ -174,35 +174,67 @@ class _MihPersonalProfileState extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - MihButton( - onPressed: () { - addProfileLinksWindow(); - }, - buttonColor: MihColors.green(), - width: mzansiProfileProvider.personalLinks.isNotEmpty - ? 50 - : null, - height: 50, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - Icons.add, - color: MihColors.primary(), - ), - if (mzansiProfileProvider.personalLinks.isEmpty) - Text( - "Add Links", - style: TextStyle( - color: MihColors.primary(), - fontSize: 15, - fontWeight: FontWeight.bold, - ), + mzansiProfileProvider.user!.username != "" + ? MihButton( + onPressed: () { + addProfileLinksWindow(); + }, + buttonColor: MihColors.green(), + width: + mzansiProfileProvider.personalLinks.isNotEmpty + ? 50 + : null, + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.add, + color: MihColors.primary(), + ), + if (mzansiProfileProvider + .personalLinks.isEmpty) + Text( + "Add Links", + style: TextStyle( + color: MihColors.primary(), + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ], ), - ], - ), - ), + ) + : MihButton( + onPressed: () { + editProfileWindow(); + }, + buttonColor: MihColors.green(), + width: null, + height: 50, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.edit, + color: MihColors.primary(), + ), + const SizedBox( + width: 10, + ), + Text( + "Add Profile", + style: TextStyle( + color: MihColors.primary(), + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), const SizedBox(width: 8.0), if (mzansiProfileProvider.personalLinks.isNotEmpty) MihButton( diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile_view.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile_view.dart index 8529afe1..11858710 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile_view.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_profile_view.dart @@ -75,40 +75,21 @@ class _MihPersonalProfileViewState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "") { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.secondary(), - backgroundColor: MihColors.primary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.secondary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.secondary(), - ); - } - }), + MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2( + directoryProvider.selectedUser!.pro_pic_path, + ), + ), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.secondary(), + backgroundColor: MihColors.primary(), + onChange: () {}, + ), FittedBox( child: Text( directoryProvider.selectedUser!.username.isNotEmpty diff --git a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart index 55814fec..ea9290ea 100644 --- a/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart +++ b/mih_ui/lib/mih_packages/mzansi_profile/personal_profile/package_tools/mih_personal_qr_code.dart @@ -206,41 +206,18 @@ class _MihPersonalQrCodeState extends State { backgroundColor: MihColors.secondary(), onChange: () {}, ) - : FutureBuilder( - future: futureImageUrl, - builder: (context, asyncSnapshot) { - if (asyncSnapshot.connectionState == - ConnectionState.done && - asyncSnapshot.hasData) { - if (asyncSnapshot.requireData != "" || - asyncSnapshot.requireData.isNotEmpty) { - return MihCircleAvatar( - imageFile: CachedNetworkImageProvider( - asyncSnapshot.requireData), - width: profilePictureWidth, - expandable: true, - editable: false, - fileNameController: TextEditingController(), - userSelectedfile: file, - frameColor: MihColors.primary(), - backgroundColor: MihColors.secondary(), - onChange: () {}, - ); - } else { - return Icon( - MihIcons.mihIDontKnow, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - } else { - return Icon( - MihIcons.mihRing, - size: profilePictureWidth, - color: MihColors.primary(), - ); - } - }, + : MihCircleAvatar( + imageFile: CachedNetworkImageProvider( + MihFileApi.getMinioFileUrlV2(user.pro_pic_path), + ), + width: profilePictureWidth, + expandable: true, + editable: false, + fileNameController: TextEditingController(), + userSelectedfile: file, + frameColor: MihColors.primary(), + backgroundColor: MihColors.secondary(), + onChange: () {}, ), FittedBox( child: Text( diff --git a/mih_ui/lib/mih_providers/about_mih_provider.dart b/mih_ui/lib/mih_providers/about_mih_provider.dart index 05288d0d..5c0af5c8 100644 --- a/mih_ui/lib/mih_providers/about_mih_provider.dart +++ b/mih_ui/lib/mih_providers/about_mih_provider.dart @@ -29,8 +29,15 @@ class AboutMihProvider extends ChangeNotifier { return success; } + Future clearAboutMihCacheAndProvider() async { + await _hiveData.clearAboutMIHCache(); + reset(); + } + void reset() { toolIndex = 0; + userCount = null; + businessCount = null; notifyListeners(); } diff --git a/mih_ui/lib/mih_providers/mih_mine_sweeper_provider.dart b/mih_ui/lib/mih_providers/mih_mine_sweeper_provider.dart index 2a942979..db7fd307 100644 --- a/mih_ui/lib/mih_providers/mih_mine_sweeper_provider.dart +++ b/mih_ui/lib/mih_providers/mih_mine_sweeper_provider.dart @@ -9,7 +9,6 @@ class MihMineSweeperProvider extends ChangeNotifier { int totalMines; List? leaderboard; List? myScoreboard; - List> leaderboardUserPicturesUrl = []; MihMineSweeperProvider({ this.difficulty = "Easy", @@ -72,10 +71,4 @@ class MihMineSweeperProvider extends ChangeNotifier { } notifyListeners(); } - - void setLeaderboardUserPictures( - {required List> leaderboardUserPicturesUrl}) { - this.leaderboardUserPicturesUrl = leaderboardUserPicturesUrl; - notifyListeners(); - } } diff --git a/mih_ui/lib/mih_providers/mzansi_directory_provider.dart b/mih_ui/lib/mih_providers/mzansi_directory_provider.dart index aed3f1c5..f14fe589 100644 --- a/mih_ui/lib/mih_providers/mzansi_directory_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_directory_provider.dart @@ -13,12 +13,9 @@ class MzansiDirectoryProvider extends ChangeNotifier { bool personalSearch; List bookmarkedBusinesses = []; List? favouriteBusinessesList; - Map>? favBusImagesUrl; List searchedBusinesses = []; - Map>? busSearchImagesUrl; Business? selectedBusiness; List searchedUsers = []; - Map>? userSearchImagesUrl; AppUser? selectedUser; String searchTerm; String businessTypeFilter; @@ -88,19 +85,15 @@ class MzansiDirectoryProvider extends ChangeNotifier { void setFavouriteBusinesses({ required List businesses, - required Map> businessesImagesUrl, }) { favouriteBusinessesList = businesses; - favBusImagesUrl = businessesImagesUrl; notifyListeners(); } void setSearchedBusinesses({ required List searchedBusinesses, - required Map> businessesImagesUrl, }) { this.searchedBusinesses = searchedBusinesses; - busSearchImagesUrl = businessesImagesUrl; notifyListeners(); } @@ -111,10 +104,8 @@ class MzansiDirectoryProvider extends ChangeNotifier { void setSearchedUsers({ required List searchedUsers, - required Map> userImagesUrl, }) { this.searchedUsers = searchedUsers; - this.userSearchImagesUrl = userImagesUrl; notifyListeners(); } diff --git a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart index cc1505e6..4ed23cf2 100644 --- a/mih_ui/lib/mih_providers/mzansi_profile_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_profile_provider.dart @@ -75,6 +75,7 @@ class MzansiProfileProvider extends ChangeNotifier { } Future syncWithMihServerData() async { + await _hiveData.processModificationsQueue(); bool success = await _hiveData.syncProfileDataWithServer(); loadCachedProfileState(); return success; @@ -84,6 +85,24 @@ class MzansiProfileProvider extends ChangeNotifier { refreshIndicatorKey.currentState?.show(); } + bool isLocalModificationsPending(){ + return _hiveData.isModificationsNotEmpty(); + } + + Future addUserConsent(UserConsent newConsent) async { + bool success = await _hiveData.addUserConsentLocally(newConsent); + await _hiveData.queuAddConsentModification(newConsent); + await _hiveData.processModificationsQueue(); + await _hiveData.syncProfileDataWithServer(); + loadCachedProfileState(); + return success; + } + + Future clearProfileCacheAndProvider() async { + await _hiveData.clearProfileCache(); + reset(); + } + void reset() { personalHome = true; personalIndex = 0; @@ -98,6 +117,10 @@ class MzansiProfileProvider extends ChangeNotifier { businessUserSignatureUrl = null; businessUserSignature = null; userConsent = null; + employeeList = null; + userSearchResults = []; + personalLinks = []; + businessLinks = []; notifyListeners(); } diff --git a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart index c00f46d9..cabe77df 100644 --- a/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart +++ b/mih_ui/lib/mih_providers/mzansi_wallet_provider.dart @@ -64,10 +64,16 @@ class MzansiWalletProvider extends ChangeNotifier { loadCachedWallet(); } + Future clearWalletCacheAndProvider() async { + await _hiveData.clearWalletCache(); + reset(); + } + void reset() { toolIndex = 0; loyaltyCards = []; favouriteCards = []; + notifyListeners(); } void setToolIndex(int index) { diff --git a/mih_ui/lib/mih_services/mih_authentication_services.dart b/mih_ui/lib/mih_services/mih_authentication_services.dart index 25ffbe14..2bf3302d 100644 --- a/mih_ui/lib/mih_services/mih_authentication_services.dart +++ b/mih_ui/lib/mih_services/mih_authentication_services.dart @@ -4,11 +4,85 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mih_package_toolkit/mih_package_toolkit.dart'; import 'package:mzansi_innovation_hub/mih_config/mih_env.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_user_services.dart'; +import 'package:provider/provider.dart'; import 'package:supertokens_flutter/http.dart' as http; +import 'package:supertokens_flutter/supertokens.dart'; class MihAuthenticationServices { final baseAPI = AppEnviroment.baseApiUrl; + bool validEmail(String email) { + var regex = RegExp(r'^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'); + return regex.hasMatch(email); + } + + Future signUserUp( + String email, + String password, + String confirmPassword, + BuildContext context, + ) async { + context.read().reset(); + if (!validEmail(email)) { + MihAlertServices().invalidEmailAlert(context); + } else if (password != confirmPassword) { + MihAlertServices().passwordMatchAlert(context); + } else { + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + try { + Uri uri = + Uri.parse("$baseAPI/auth/emailpassword/email/exists?email=$email"); + var response = await http.get(uri); + if (response.statusCode == 200) { + var userExists = jsonDecode(response.body); + if (userExists["exists"]) { + context.pop(); + MihAlertServices().emailExistsAlert(context); + } else { + var response2 = await http.post( + Uri.parse("$baseAPI/auth/signup"), + body: + '{"formFields": [{"id": "email","value": "$email"}, {"id": "password","value": "$password"}]}', + headers: { + 'Content-type': 'application/json', + 'Accept': 'application/json', + }, + ); + if (response2.statusCode == 200) { + var userCreated = jsonDecode(response2.body); + if (userCreated["status"] == "OK") { + String uid = await SuperTokens.getUserId(); + await MihUserServices().createUser( + email, + uid, + context, + ); + context.pop(); + } else if (userCreated["status"] == "FIELD_ERROR") { + context.pop(); + MihAlertServices().passwordRequirementAlert(context); + } else { + context.pop(); + MihAlertServices().internetConnectionAlert(context); + } + } + } + } + } on Exception catch (error) { + Navigator.of(context).pop(); + signUpError(error, context); + } + } + } + Future signUserIn( String email, String password, @@ -104,74 +178,28 @@ class MihAuthenticationServices { ); } - void signUpError(BuildContext context) { - showDialog( - context: context, - barrierDismissible: false, - builder: (context) { - return MihPackageWindow( - fullscreen: false, - windowTitle: null, - onWindowTapClose: null, - backgroundColor: MihColors.red(), - windowBody: Column( - children: [ - Icon( - Icons.warning_amber_rounded, - size: 100, - color: MihColors.primary(), - ), - Center( - child: Text( - "Email Already Exists", - textAlign: TextAlign.center, - style: TextStyle( - color: MihColors.primary(), - fontSize: 25, - fontWeight: FontWeight.bold, - ), - ), - ), - const SizedBox(height: 15), - Text( - "Here are some things to keep in mind:", - style: TextStyle( - color: MihColors.red(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 10), - Text( - "1) Are you sure you're using the correct email address associated with your account?\n2) Is your caps lock key on? Passwords are case-sensitive.\n3) If you've forgotten your password, no worries! Click on \"Forgot Password?\" to reset it.", - textAlign: TextAlign.left, - style: TextStyle( - color: MihColors.secondary(), - fontSize: 15.0, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 15), - MihButton( - onPressed: () { - context.pop(); - }, - buttonColor: MihColors.secondary(), - width: 300, - elevation: 10, - child: Text( - "Dismiss", - style: TextStyle( - color: MihColors.primary(), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ], + void signUpError(Exception error, BuildContext context) { + MihAlertServices().errorAdvancedAlert( + "Sign Up Error", + "An error occurred while signing up: $error Please try again later.", + [ + MihButton( + onPressed: () { + Navigator.of(context).pop(); + }, + buttonColor: MihColors.secondary(), + width: 200, + child: Text( + "Dismiss", + style: TextStyle( + color: MihColors.primary(), + fontSize: 18, + fontWeight: FontWeight.bold, + ), ), - ); - }, + ), + ], + context, ); } } diff --git a/mih_ui/lib/mih_services/mih_data_helper_services.dart b/mih_ui/lib/mih_services/mih_data_helper_services.dart index 631ea612..a0772c97 100644 --- a/mih_ui/lib/mih_services/mih_data_helper_services.dart +++ b/mih_ui/lib/mih_services/mih_data_helper_services.dart @@ -1,5 +1,3 @@ -import 'package:ken_logger/ken_logger.dart'; -import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; import 'package:mzansi_innovation_hub/mih_providers/mzansi_profile_provider.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; @@ -12,7 +10,7 @@ class MihDataHelperServices { Future getUserData(MzansiProfileProvider profileProvider) async { String url; await MihUserServices().getMyUserDetails(profileProvider); - url = await MihFileApi.getMinioFileUrl( + url = MihFileApi.getMinioFileUrlV2( profileProvider.user!.pro_pic_path, ); profileProvider.setUserProfilePicUrl(url); @@ -29,12 +27,12 @@ class MihDataHelperServices { Business? responseBusiness = await MihBusinessDetailsServices() .getBusinessDetailsByUser(profileProvider); if (responseBusiness != null) { - logoUrl = await MihFileApi.getMinioFileUrl( + logoUrl = MihFileApi.getMinioFileUrlV2( profileProvider.business!.logo_path, ); profileProvider.setBusinessProfilePicUrl(logoUrl); await MihMyBusinessUserServices().getBusinessUser(profileProvider); - signatureUrl = await MihFileApi.getMinioFileUrl( + signatureUrl = MihFileApi.getMinioFileUrlV2( profileProvider.businessUser!.sig_path, ); profileProvider.setBusinessUserSignatureUrl(signatureUrl); diff --git a/mih_ui/lib/mih_services/mih_user_consent_services.dart b/mih_ui/lib/mih_services/mih_user_consent_services.dart index 3a1ca03a..3a64efc4 100644 --- a/mih_ui/lib/mih_services/mih_user_consent_services.dart +++ b/mih_ui/lib/mih_services/mih_user_consent_services.dart @@ -54,6 +54,23 @@ class MihUserConsentServices { return response.statusCode; } + Future insertUserConsentStatusV2( + UserConsent userConsent, + ) async { + try { + final response = await http + .post( + Uri.parse("${AppEnviroment.baseApiUrl}/user-consent/insert/"), + headers: {"Content-Type": "application/json"}, + body: jsonEncode(userConsent.toJson()), + ) + .timeout(const Duration(seconds: 5)); + return response.statusCode; + } catch (error) { + return null; + } + } + Future updateUserConsentStatus( String latestPrivacyPolicyDate, String latestTermOfServiceDate, diff --git a/mih_ui/pubspec.lock b/mih_ui/pubspec.lock index 9f3c1832..e3e48834 100644 --- a/mih_ui/pubspec.lock +++ b/mih_ui/pubspec.lock @@ -1137,29 +1137,29 @@ packages: source: hosted version: "6.1.0" local_auth: - dependency: "direct main" + dependency: transitive description: name: local_auth - sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "3.0.1" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 + sha256: fdb936d59ab945c7af297defd67bd1ed87b11b6db1bc16d01e94677a8f1c38ec url: "https://pub.dev" source: hosted - version: "1.0.56" + version: "2.0.9" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" + sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 url: "https://pub.dev" source: hosted - version: "1.6.1" + version: "2.0.3" local_auth_platform_interface: dependency: transitive description: @@ -1172,10 +1172,10 @@ packages: dependency: transitive description: name: local_auth_windows - sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 url: "https://pub.dev" source: hosted - version: "1.0.11" + version: "2.0.1" logging: dependency: transitive description: @@ -1236,10 +1236,10 @@ packages: dependency: "direct main" description: name: mih_package_toolkit - sha256: "3d0dec0ae9471a37b8c6822419633643721b6b463f2b9b862233feefcec6e8a6" + sha256: d648dd37dc69c01c552f45e98d69bb2b324cff382e8e36537a96ed5a812d03f8 url: "https://pub.dev" source: hosted - version: "0.0.6" + version: "0.1.0" mime: dependency: transitive description: diff --git a/mih_ui/pubspec.yaml b/mih_ui/pubspec.yaml index 505f1e82..72021325 100644 --- a/mih_ui/pubspec.yaml +++ b/mih_ui/pubspec.yaml @@ -5,24 +5,20 @@ version: 1.4.0+135 environment: sdk: ">=3.5.3 <4.0.0" - # flutter: ">=1.17.0" dependencies: flutter: sdk: flutter flutter_web_plugins: sdk: flutter - mih_package_toolkit: ^0.0.6 + mih_package_toolkit: ^0.1.0 cupertino_icons: ^1.0.8 font_awesome_flutter: ^11.0.0 - # firebase_core: ^4.4.0 - # firebase_core_desktop: ^1.0.2 syncfusion_flutter_core: ^33.2.15 syncfusion_flutter_pdfviewer: ^33.2.15 universal_html: ^2.2.4 file_picker: ^12.0.0-beta.7 supertokens_flutter: ^0.6.3 http: ^1.2.1 - # args: ^2.7.0 intl: ^0.20.2 flutter_native_splash: ^2.4.6 printing: ^5.14.2 @@ -34,7 +30,6 @@ dependencies: barcode_widget: ^2.0.4 #Generate Barcodes url_launcher: ^6.3.1 fl_downloader: ^2.0.2 - local_auth: ^2.3.0 math_expressions: ^3.1.0 ollama_dart: ^2.3.0 flutter_chat_ui: ^2.11.1 @@ -43,7 +38,6 @@ dependencies: flutter_tts: ^4.2.3 flutter_speed_dial: ^7.0.0 share_plus: ^13.2.0 - #app_settings: ^6.1.1 pwa_install: ^0.0.6 google_mobile_ads: ^8.0.0 gma_mediation_meta: ^1.5.2