diff --git a/assets/translations/en.json b/assets/translations/en.json index e36b491..dd7813f 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -8,6 +8,7 @@ "bookmarks": "Bookmarks", "dark_mode": "Dark Mode", "light_mode": "Light Mode", + "delete_account": "Delete Account", "log_out": "Log out", "scan_tap_qr_code": "Scan/Tap QR Code", "authorize_this_request_with_keychain_for_hive_app": "Authorize this request with 'Keychain for Hive' app.", @@ -48,5 +49,6 @@ "no_threads_found": "No threads found", "age_limit": "\u2022 Only accounts older than {} days allowed", "interpretation_token": "\u2022 User HP based vote interpretation", - "max_choices": "\u2022 You may select upto {} choices" + "max_choices": "\u2022 You may select upto {} choices", + "the_account_doesnt_exist":"The account doesn't exists" } \ No newline at end of file diff --git a/lib/core/common/widgets/drawer/drawer_tile.dart b/lib/core/common/widgets/drawer/drawer_tile.dart index e270358..20be77f 100644 --- a/lib/core/common/widgets/drawer/drawer_tile.dart +++ b/lib/core/common/widgets/drawer/drawer_tile.dart @@ -7,6 +7,7 @@ class DrawerTile extends StatelessWidget { this.onTap, required this.text, required this.icon, + this.color, this.leftPadding, this.trailing}); final VoidCallback? onTap; @@ -14,6 +15,7 @@ class DrawerTile extends StatelessWidget { final IconData icon; final double? leftPadding; final Widget? trailing; + final Color? color; @override Widget build(BuildContext context) { @@ -23,8 +25,8 @@ class DrawerTile extends StatelessWidget { padding: EdgeInsets.only(left: leftPadding ?? 0.0), child: ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20), - leading: Icon(icon), - title: Text(text), + leading: Icon(icon, color: color,), + title: Text(text, style: TextStyle(color: color),), trailing: trailing, ), ), diff --git a/lib/core/dependency_injection/get_it/repositories_get_it.dart b/lib/core/dependency_injection/get_it/repositories_get_it.dart index 826c660..b594312 100644 --- a/lib/core/dependency_injection/get_it/repositories_get_it.dart +++ b/lib/core/dependency_injection/get_it/repositories_get_it.dart @@ -21,6 +21,6 @@ class RepositoriesGetIt extends GetItFeature { getIt.registerFactory( () => UserRepository(apiService: getIt.call())); getIt.registerFactory( - () => SettingsRepository(localService: getIt.call())); + () => SettingsRepository(localService: getIt.call(),apiService: getIt.call())); } } diff --git a/lib/core/locales/locale_text.dart b/lib/core/locales/locale_text.dart index b622fcf..0b64a5b 100644 --- a/lib/core/locales/locale_text.dart +++ b/lib/core/locales/locale_text.dart @@ -14,6 +14,7 @@ class LocaleText { static String get bookmarks => "bookmarks".tr(); static String get darkMode => "dark_mode".tr(); static String get lightMode => "light_mode".tr(); + static String get deleteAccount => "delete_account".tr(); static String get logOut => "log_out".tr(); static String get scanTapQRCode => "scan_tap_qr_code".tr(); static String get authorizeThisRequestWithKeyChainForHiveApp => @@ -62,4 +63,7 @@ class LocaleText { static String get pollVote => "poll_vote".tr(); static String get pollVoted => "poll_voted".tr(); static String get pollRevote => "poll_revote".tr(); + static String get theAccountDoesntExist => "the_account_doesnt_exist"; + + } diff --git a/lib/core/services/data_service/api_service.dart b/lib/core/services/data_service/api_service.dart index b22a384..419e09e 100644 --- a/lib/core/services/data_service/api_service.dart +++ b/lib/core/services/data_service/api_service.dart @@ -440,4 +440,30 @@ class ApiService { status: ResponseStatus.failed, errorMessage: e.toString()); } } + + Future> deleteAccount( + String accountName) async { + try { + var url = Uri.parse("https://ecency.com/private-api/request-delete"); + + http.Response response = await http.post(url, + body: json.encode({ + "type": "content", + "data": {"account":accountName} + })); + if (response.statusCode == 200) { + return ActionSingleDataResponse( + data: ReportResponse.fromRawJson(response.body), + status: ResponseStatus.success, + isSuccess: true, + errorMessage: ""); + } else { + return ActionSingleDataResponse( + status: ResponseStatus.failed, errorMessage: "Server Error"); + } + } catch (e) { + return ActionSingleDataResponse( + status: ResponseStatus.failed, errorMessage: e.toString()); + } + } } diff --git a/lib/core/services/user_local_service.dart b/lib/core/services/user_local_service.dart index 9c3761d..9548f0a 100644 --- a/lib/core/services/user_local_service.dart +++ b/lib/core/services/user_local_service.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get_storage/get_storage.dart'; import 'package:waves/core/utilities/enum.dart'; @@ -10,12 +12,16 @@ class UserLocalService { static const String _currentUserAccountStorageKey = 'currentUserAccount'; static const String _allUserAccountsStorageKey = 'allUserAccounts'; static const String _termsAcceptedFlagKey = 'termsAcceptedFlag'; + static const String _deletedAccountsKey = 'deletedAccounts'; final FlutterSecureStorage _secureStorage; final GetStorage _getStorage; - UserLocalService({required FlutterSecureStorage secureStorage, required final GetStorage getStorage}) - : _secureStorage = secureStorage, _getStorage = getStorage; + UserLocalService( + {required FlutterSecureStorage secureStorage, + required final GetStorage getStorage}) + : _secureStorage = secureStorage, + _getStorage = getStorage; Future cleanup() async { await _secureStorage.delete(key: _currentUserAccountStorageKey); @@ -84,15 +90,25 @@ class UserLocalService { await _secureStorage.delete(key: _currentUserAccountStorageKey); } - Future writeTermsAcceptedFlag(bool status) async { await _getStorage.write(_termsAcceptedFlagKey, status); } bool readTermsAcceptedFlag() { - bool? data = _getStorage.read(_termsAcceptedFlagKey); return data ?? false; } + List readDeletedAccounts() { + String? data = _getStorage.read(_deletedAccountsKey); + if (data != null) { + return List.from(json.decode(data)); + } + return []; + } + + Future writeDeleteAccount(String accountName) async { + List deletedAccounts = [...readDeletedAccounts(), accountName]; + await _getStorage.write(_deletedAccountsKey, json.encode(deletedAccounts)); + } } diff --git a/lib/features/auth/presentation/controller/hive_signer_controller.dart b/lib/features/auth/presentation/controller/hive_signer_controller.dart index 2903cfb..1cdfca8 100644 --- a/lib/features/auth/presentation/controller/hive_signer_controller.dart +++ b/lib/features/auth/presentation/controller/hive_signer_controller.dart @@ -1,5 +1,8 @@ import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; import 'package:waves/core/dependency_injection/dependency_injection.dart'; +import 'package:waves/core/locales/locale_text.dart'; import 'package:waves/core/utilities/enum.dart'; import 'package:waves/features/auth/models/hive_signer_auth_model.dart'; import 'package:waves/features/auth/models/hive_signer_helper_model.dart'; @@ -12,11 +15,17 @@ class HiveSignerController { final StreamController _userStreamController = getIt>(); - void onLogin(String url, {required Function(String) onSuccess}) { + void onLogin(String url, + {required Function(String) onSuccess, + required Function(String) onFailure}) { HiveSignerHelperModel? data = extractTokenFromUrl(url); if (data != null) { - _saveToLocal(data.username, data.token) - .then((_) => onSuccess(data.username)); + if (!_userLocalRepository.isAccountDeleted(data.username)) { + _saveToLocal(data.username, data.token) + .then((_) => onSuccess(data.username)); + } else { + onFailure(LocaleText.theAccountDoesntExist.tr()); + } } } diff --git a/lib/features/auth/presentation/controller/posting_auth_controller.dart b/lib/features/auth/presentation/controller/posting_auth_controller.dart index 8a5c538..f43039f 100644 --- a/lib/features/auth/presentation/controller/posting_auth_controller.dart +++ b/lib/features/auth/presentation/controller/posting_auth_controller.dart @@ -46,6 +46,8 @@ class PostingAuthController extends ChangeNotifier { } } + + bool _isKeyFromResponse(String? data) => data != null && data != 'true' && data != 'false' && data.isNotEmpty; diff --git a/lib/features/auth/presentation/view/hive_key_chain_auth_view.dart b/lib/features/auth/presentation/view/hive_key_chain_auth_view.dart index 4d4e3b9..5e23559 100644 --- a/lib/features/auth/presentation/view/hive_key_chain_auth_view.dart +++ b/lib/features/auth/presentation/view/hive_key_chain_auth_view.dart @@ -2,6 +2,7 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:provider/provider.dart'; import 'package:waves/core/common/extensions/platform_navigation.dart'; import 'package:waves/core/common/extensions/ui.dart'; import 'package:waves/core/locales/locale_text.dart'; @@ -11,6 +12,7 @@ import 'package:waves/core/utilities/constants/ui_constants.dart'; import 'package:waves/core/utilities/enum.dart'; import 'package:waves/features/auth/presentation/widgets/auth_button.dart'; import 'package:waves/features/auth/presentation/widgets/auth_textfield.dart'; +import 'package:waves/features/user/view/user_controller.dart'; class HiveKeyChainAuthView extends StatefulWidget { const HiveKeyChainAuthView({super.key, required this.authType}); @@ -54,16 +56,14 @@ class _HiveKeyChainAuthViewState extends State { const Gap(20), if (widget.authType == AuthType.hiveKeyChain) AuthButton( - authType: AuthType.hiveKeyChain, - onTap: () => onHiveAuthLoginTap(AuthType.hiveKeyChain), - label: "HiveKeychain" - ), + authType: AuthType.hiveKeyChain, + onTap: () => onHiveAuthLoginTap(AuthType.hiveKeyChain), + label: "HiveKeychain"), if (widget.authType == AuthType.hiveAuth) AuthButton( - authType: AuthType.hiveAuth, - onTap: () => onHiveAuthLoginTap(AuthType.hiveAuth), - label: "HiveAuth" - ), + authType: AuthType.hiveAuth, + onTap: () => onHiveAuthLoginTap(AuthType.hiveAuth), + label: "HiveAuth"), ], ), ), @@ -76,6 +76,8 @@ class _HiveKeyChainAuthViewState extends State { String accountName = accountNameController.text.trim().toLowerCase(); if (accountName.isEmpty) { context.showSnackBar(LocaleText.pleaseEnterTheUsername.tr()); + } else if (context.read().isAccountDeleted(accountName)) { + context.showSnackBar(LocaleText.theAccountDoesntExist.tr()); } else { if (type == AuthType.hiveKeyChain) { context.platformPushNamed(Routes.hiveAuthTransactionView, diff --git a/lib/features/auth/presentation/view/hive_signer_auth_view.dart b/lib/features/auth/presentation/view/hive_signer_auth_view.dart index 4fa8db6..7f42714 100644 --- a/lib/features/auth/presentation/view/hive_signer_auth_view.dart +++ b/lib/features/auth/presentation/view/hive_signer_auth_view.dart @@ -25,22 +25,20 @@ class _HiveSignerAuthViewState extends State { onProgress: (int progress) { loadingProgress.value = progress; }, - onPageFinished: (String url) { - - }, + onPageFinished: (String url) {}, onHttpError: (HttpResponseError error) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://example.com/')) { - controller.onLogin( - request.url, - onSuccess: (accountname) { + controller.onLogin(request.url, onSuccess: (accountname) { context.showSnackBar( LocaleText.successfullLoginMessage(accountname)); Navigator.pop(context); Navigator.pop(context); - }, - ); + }, onFailure: (errorMessage) { + context.showSnackBar(errorMessage); + Navigator.pop(context); + }); return NavigationDecision.prevent; } return NavigationDecision.navigate; @@ -48,7 +46,7 @@ class _HiveSignerAuthViewState extends State { ), ) ..loadRequest(Uri.parse( - 'https://hivesigner.com/oauth2/authorize?client_id=ecency.app&redirect_uri=https://example.com/callback/&scope=vote,comment')); + 'https://hivesigner.com/oauth2/authorize?client_id=ecency.app&redirect_uri=https://example.com/callback/&scope=vote,comment')); super.initState(); } diff --git a/lib/features/auth/presentation/view/posting_key_auth_view.dart b/lib/features/auth/presentation/view/posting_key_auth_view.dart index 28ada63..58efe70 100644 --- a/lib/features/auth/presentation/view/posting_key_auth_view.dart +++ b/lib/features/auth/presentation/view/posting_key_auth_view.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:provider/provider.dart'; import 'package:waves/core/common/extensions/ui.dart'; import 'package:waves/core/locales/locale_text.dart'; import 'package:waves/core/utilities/constants/ui_constants.dart'; @@ -8,6 +9,7 @@ import 'package:waves/core/utilities/enum.dart'; import 'package:waves/features/auth/presentation/controller/posting_auth_controller.dart'; import 'package:waves/features/auth/presentation/widgets/auth_button.dart'; import 'package:waves/features/auth/presentation/widgets/auth_textfield.dart'; +import 'package:waves/features/user/view/user_controller.dart'; class PostingKeyAuthView extends StatefulWidget { const PostingKeyAuthView({super.key}); @@ -55,7 +57,9 @@ class _PostingKeyAuthViewState extends State { textEditingController: postingKeyController), const Gap(20), AuthButton( - authType: AuthType.postingKey, onTap: onPostingLoginTap, label: "Login"), + authType: AuthType.postingKey, + onTap: onPostingLoginTap, + label: "Login"), ], ), ), @@ -68,6 +72,8 @@ class _PostingKeyAuthViewState extends State { String accountName = accountNameController.text.trim().toLowerCase(); if (accountName.isEmpty) { context.showSnackBar(LocaleText.pleaseEnterTheUsername.tr()); + } else if (context.read().isAccountDeleted(accountName)) { + context.showSnackBar(LocaleText.theAccountDoesntExist.tr()); } else if (postingKeyController.text.trim().isEmpty) { context.showSnackBar(LocaleText.pleaseEnterThePostingKey.tr()); } else { diff --git a/lib/features/settings/presentation/setting/controller/settings_controller.dart b/lib/features/settings/presentation/setting/controller/settings_controller.dart index bac7069..d44ced2 100644 --- a/lib/features/settings/presentation/setting/controller/settings_controller.dart +++ b/lib/features/settings/presentation/setting/controller/settings_controller.dart @@ -1,9 +1,13 @@ import 'package:waves/core/dependency_injection/dependency_injection.dart'; +import 'package:waves/core/models/action_response.dart'; import 'package:waves/core/utilities/enum.dart'; import 'package:waves/features/settings/repository/settings_repository.dart'; +import 'package:waves/features/threads/models/thread_feeds/reported/report_reponse.dart'; +import 'package:waves/features/user/repository/user_local_repository.dart'; class SettingsController { final SettingsRepository _repository = getIt(); + final UserLocalRepository _userLocalRepository = getIt(); ThreadFeedType readThreadType() { return _repository.readDefaultThread(); @@ -12,4 +16,14 @@ class SettingsController { void saveThreadType(ThreadFeedType type) async { await _repository.writeDefaultThread(type); } + + Future> deleteAccount( + String accountName) async { + ActionSingleDataResponse response = + await _repository.deleteAccount(accountName); + if (response.isSuccess) { + await _userLocalRepository.writeDeleteAccount(accountName); + } + return response; + } } diff --git a/lib/features/settings/presentation/setting/view/setting_view.dart b/lib/features/settings/presentation/setting/view/setting_view.dart index 41d3b07..01c4723 100644 --- a/lib/features/settings/presentation/setting/view/setting_view.dart +++ b/lib/features/settings/presentation/setting/view/setting_view.dart @@ -1,10 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; +import 'package:waves/core/common/extensions/ui.dart'; import 'package:waves/core/common/widgets/drawer/drawer_tile.dart'; import 'package:waves/core/locales/locale_text.dart'; import 'package:waves/core/utilities/theme/theme_mode.dart'; import 'package:waves/features/settings/presentation/setting/controller/settings_controller.dart'; import 'package:waves/features/settings/presentation/setting/widgets/default_thread_dropdown.dart'; +import 'package:waves/features/settings/presentation/setting/widgets/delete_account_dialog.dart'; +import 'package:waves/features/user/view/user_controller.dart'; class SettingView extends StatelessWidget { const SettingView({super.key}); @@ -12,6 +16,7 @@ class SettingView extends StatelessWidget { @override Widget build(BuildContext context) { final themeController = context.read(); + return Provider( create: (context) => SettingsController(), builder: (context, child) { @@ -37,7 +42,14 @@ class SettingView extends StatelessWidget { text: "Default Feed", icon: Icons.help_outline, trailing: DefaultThreadDropdown(), - ) + ), + if (context.read().isUserLoggedIn) + DrawerTile( + onTap: () => onDeletePress(context), + text: LocaleText.deleteAccount, + icon: Icons.delete_forever, + color: Colors.red[600], + ), ], ), )), @@ -45,4 +57,34 @@ class SettingView extends StatelessWidget { }, ); } + + onDeletePress(BuildContext context) { + UserController userController = context.read(); + SettingsController controller = context.read(); + showDialog( + context: context, + builder: (_) { + return DeleteAccountDialog( + onDelete: () { + context.showLoader(); + controller + .deleteAccount(userController.userName!) + .then((response) { + if (context.mounted) { + context.hideLoader(); + if (response.isSuccess) { + context + .showSnackBar("Account has been deleted successfully"); + userController.logOutUser(); + context.pop(); + } else { + context.showSnackBar(response.errorMessage); + } + } + }); + }, + ); + }); + // userController.logOutUser(); + } } diff --git a/lib/features/settings/presentation/setting/widgets/delete_account_dialog.dart b/lib/features/settings/presentation/setting/widgets/delete_account_dialog.dart new file mode 100644 index 0000000..e33c15e --- /dev/null +++ b/lib/features/settings/presentation/setting/widgets/delete_account_dialog.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:waves/core/common/widgets/dialog/dialog_template.dart'; + +class DeleteAccountDialog extends StatelessWidget { + const DeleteAccountDialog({super.key, required this.onDelete}); + + final VoidCallback onDelete; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return DialogTemplate( + title: "Delete Account", + content: Text( + "Are you sure you want to delete your account?", + style: theme.textTheme.bodyMedium, + ), + declineButtonText: "Cancel", + proceedButtonText: "Confirm", + onProceedTap: () { + onDelete(); + }, + ); + } +} diff --git a/lib/features/settings/repository/settings_repository.dart b/lib/features/settings/repository/settings_repository.dart index 613d465..510ac75 100644 --- a/lib/features/settings/repository/settings_repository.dart +++ b/lib/features/settings/repository/settings_repository.dart @@ -1,12 +1,18 @@ +import 'package:waves/core/models/action_response.dart'; +import 'package:waves/core/services/data_service/api_service.dart'; import 'package:waves/core/services/local_service.dart'; import 'package:waves/core/utilities/enum.dart'; import 'package:waves/core/utilities/generics/classes/thread.dart'; +import 'package:waves/features/threads/models/thread_feeds/reported/report_reponse.dart'; class SettingsRepository { final LocalService _localService; + final ApiService _apiService; - SettingsRepository({required LocalService localService}) - : _localService = localService; + SettingsRepository( + {required LocalService localService, required ApiService apiService}) + : _localService = localService, + _apiService = apiService; ThreadFeedType readDefaultThread() { return _localService.readDefaultThread() ?? Thread.defaultThreadType; @@ -15,4 +21,9 @@ class SettingsRepository { Future writeDefaultThread(ThreadFeedType type) async { return await _localService.writeDefaultThread(type); } + + Future> deleteAccount( + String accountName) async { + return await _apiService.deleteAccount(accountName); + } } diff --git a/lib/features/threads/repository/thread_local_repository.dart b/lib/features/threads/repository/thread_local_repository.dart index 2259527..4026f87 100644 --- a/lib/features/threads/repository/thread_local_repository.dart +++ b/lib/features/threads/repository/thread_local_repository.dart @@ -1,13 +1,13 @@ import 'package:waves/core/services/local_service.dart'; import 'package:waves/core/utilities/enum.dart'; -import 'package:waves/features/settings/repository/settings_repository.dart'; +import 'package:waves/core/utilities/generics/classes/thread.dart'; import 'package:waves/features/threads/models/thread_feeds/reported/thread_info_model.dart'; import 'package:waves/features/threads/models/thread_feeds/thread_feed_model.dart'; -class ThreadLocalRepository extends SettingsRepository { +class ThreadLocalRepository { final LocalService _localService; - ThreadLocalRepository({required super.localService}) + ThreadLocalRepository({required LocalService localService}) : _localService = localService; List? readLocalThreads(ThreadFeedType type) { @@ -26,4 +26,12 @@ class ThreadLocalRepository extends SettingsRepository { Future writeReportedThreads(ThreadInfoModel item) async { return await _localService.writeReportedThreads(item); } + + ThreadFeedType readDefaultThread() { + return _localService.readDefaultThread() ?? Thread.defaultThreadType; + } + + Future writeDefaultThread(ThreadFeedType type) async { + return await _localService.writeDefaultThread(type); + } } diff --git a/lib/features/user/repository/user_local_repository.dart b/lib/features/user/repository/user_local_repository.dart index 2adf6fb..afeb53c 100644 --- a/lib/features/user/repository/user_local_repository.dart +++ b/lib/features/user/repository/user_local_repository.dart @@ -1,5 +1,5 @@ -import 'package:waves/features/auth/models/user_auth_model.dart'; import 'package:waves/core/services/user_local_service.dart'; +import 'package:waves/features/auth/models/user_auth_model.dart'; class UserLocalRepository { final UserLocalService _localService; @@ -36,5 +36,15 @@ class UserLocalRepository { return await _localService.writeTermsAcceptedFlag(status); } - + List readDeletedAccounts() { + return _localService.readDeletedAccounts(); + } + + Future writeDeleteAccount(String accountName) async { + return await _localService.writeDeleteAccount(accountName); + } + + bool isAccountDeleted(String accountName) { + return readDeletedAccounts().any((e) => e == accountName); + } } diff --git a/lib/features/user/view/user_controller.dart b/lib/features/user/view/user_controller.dart index a7db2d8..3164a7b 100644 --- a/lib/features/user/view/user_controller.dart +++ b/lib/features/user/view/user_controller.dart @@ -39,6 +39,10 @@ class UserController extends ChangeNotifier { return userData!.imageUploadToken; } + bool isAccountDeleted(String accountName) { + return _localRepository.isAccountDeleted(accountName); + } + Future _readUserFromLocal() async { userData = await _localRepository.readCurrentUser(); if (userData != null) notifyListeners(); @@ -52,7 +56,7 @@ class UserController extends ChangeNotifier { _userSteamController.add(null); } - bool getTermsAcceptedFlag() { + bool getTermsAcceptedFlag() { return _localRepository.readTermsAcceptedFlag(); } diff --git a/pubspec.lock b/pubspec.lock index fc6cf95..9853b33 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -489,18 +489,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -553,18 +553,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -838,10 +838,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" timeago: dependency: "direct main" description: @@ -942,10 +942,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ede42b4..2401c2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+22 +version: 1.0.0+23 environment: sdk: '>=3.3.2 <4.0.0'