From 7749060e4c29349e2f158b7f83f0d9c1a2015910 Mon Sep 17 00:00:00 2001 From: redDwarf03 Date: Mon, 20 May 2024 19:35:34 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=84=20Add=20DApps=20tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devtools_options.yaml | 1 + lib/domain/repositories/features_flags.dart | 1 - .../repositories/dapps_repository.dart | 1 - lib/l10n/intl_en.arb | 10 +- lib/l10n/intl_fr.arb | 10 +- lib/model/dapps_info.dart | 16 ++ lib/model/dapps_info.freezed.dart | 199 ++++++++++++++++++ lib/router/router.authenticated.dart | 18 +- lib/router/router.dart | 1 + lib/ui/menu/settings/main_settings_view.dart | 55 ----- lib/ui/views/dapps/components/card_dapps.dart | 121 +++++++++++ lib/ui/views/dapps/dapps_list.dart | 70 ++++++ lib/ui/views/main/components/main_appbar.dart | 19 +- lib/ui/views/main/dapps_tab.dart | 53 +++++ lib/ui/views/main/home_page.dart | 10 +- lib/ui/views/main/nft_tab.dart | 123 ++++++----- .../nft/layouts/nft_list_per_category.dart | 4 +- lib/ui/views/sheets/dex_sheet.dart | 61 +++++- pubspec.lock | 168 +++++++-------- 19 files changed, 705 insertions(+), 236 deletions(-) create mode 100644 devtools_options.yaml create mode 100644 lib/model/dapps_info.dart create mode 100644 lib/model/dapps_info.freezed.dart create mode 100644 lib/ui/views/dapps/components/card_dapps.dart create mode 100644 lib/ui/views/dapps/dapps_list.dart create mode 100644 lib/ui/views/main/dapps_tab.dart diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 000000000..7e7e7f67d --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1 @@ +extensions: diff --git a/lib/domain/repositories/features_flags.dart b/lib/domain/repositories/features_flags.dart index 43bab78c0..4d0d70dd3 100644 --- a/lib/domain/repositories/features_flags.dart +++ b/lib/domain/repositories/features_flags.dart @@ -2,5 +2,4 @@ class FeatureFlags { static const messagingActive = false; static const forceLogout = false; - static const dexActive = true; } diff --git a/lib/infrastructure/repositories/dapps_repository.dart b/lib/infrastructure/repositories/dapps_repository.dart index 4f08f3a00..0ccefd733 100644 --- a/lib/infrastructure/repositories/dapps_repository.dart +++ b/lib/infrastructure/repositories/dapps_repository.dart @@ -49,7 +49,6 @@ class DAppsRepositoryImpl implements DAppsRepositoryInterface { final dApps = await _getDAppsLocal(); switch (network) { // aeWallet-DApps-Conf service - // TODO(reddwarf03): Get true addresses case AvailableNetworks.archethicTestNet: return _getDAppsFromBlockchain( '00009087BB05F2D4DDBDFA833486CD303A805C5F73154473E5604BEB1C1512475B42', diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index a21e10307..16ac11da3 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -503,7 +503,6 @@ "bottomMainMenuAddressBook": "Address book", "bottomMainMenuKeychain": "Keychain", "bottomMainMenuMain": "Main", - "bottomMainMenuNFT": "NFT", "bottomMainMenuMessenger": "Messenger", "youHaveBeenAddedToADiscussion": "You have been added to a discussion", "leaveDiscussion": "Leave the discussion", @@ -522,5 +521,12 @@ "seedHex": "View in Hexadecimal", "burnAddressLbl": "Burn address", "webChannelIncompatibilityWarning": "Unsupported operating system", - "webChannelIncompatibilityWarningDesc": "Your operating system Webview does not support required MessageChannel feature." + "webChannelIncompatibilityWarningDesc": "Your operating system Webview does not support required MessageChannel feature.", + "dAppsHeader": "DApps", + "nftHeader": "NFT", + "aeSwapHeader": "aeSwap", + "bottomMainMenuDApps": "DApps", + "dappsTabDescriptionHeader": "Accelerate adoption with native services", + "dappsAESwapDesc": "Swap assets on-chain and access yield farming by adding liquidity", + "dappsNFTDesc": "Create your own no-code NFT" } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index a0900a1ca..72ea33063 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -478,7 +478,6 @@ "bottomMainMenuAddressBook": "Contacts", "bottomMainMenuKeychain": "Porte-clés", "bottomMainMenuMain": "Accueil", - "bottomMainMenuNFT": "NFT", "bottomMainMenuMessenger": "Discussions", "youHaveBeenAddedToADiscussion": "Vous avez été ajouté à une discussion", "leaveDiscussion": "Quitter la discussion", @@ -497,5 +496,12 @@ "seedHex": "Voir en hexadécimal", "burnAddressLbl": "Burn address", "webChannelIncompatibilityWarning": "Système non compatible", - "webChannelIncompatibilityWarningDesc": "Votre système ne supporte pas les MessageChannels." + "webChannelIncompatibilityWarningDesc": "Votre système ne supporte pas les MessageChannels.", + "dAppsHeader": "DApps", + "nftHeader": "NFT", + "aeSwapHeader": "aeSwap", + "bottomMainMenuDApps": "DApps", + "dappsTabDescriptionHeader": "Accélérez l'adoption avec des services natifs", + "dappsAESwapDesc": "Échangez des actifs on-chain, ajoutez de la liquidité et accédez au yield farming", + "dappsNFTDesc": "Créez votre propre NFT sans coder" } \ No newline at end of file diff --git a/lib/model/dapps_info.dart b/lib/model/dapps_info.dart new file mode 100644 index 000000000..1c88b98bf --- /dev/null +++ b/lib/model/dapps_info.dart @@ -0,0 +1,16 @@ +/// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'dapps_info.freezed.dart'; + +@freezed +class DAppsInfo with _$DAppsInfo { + const factory DAppsInfo({ + String? dAppName, + String? dAppDesc, + String? dAppLink, + String? dAppBackgroundImgCard, + }) = _DAppsInfo; + const DAppsInfo._(); +} diff --git a/lib/model/dapps_info.freezed.dart b/lib/model/dapps_info.freezed.dart new file mode 100644 index 000000000..ab0305fea --- /dev/null +++ b/lib/model/dapps_info.freezed.dart @@ -0,0 +1,199 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'dapps_info.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$DAppsInfo { + String? get dAppName => throw _privateConstructorUsedError; + String? get dAppDesc => throw _privateConstructorUsedError; + String? get dAppLink => throw _privateConstructorUsedError; + String? get dAppBackgroundImgCard => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $DAppsInfoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DAppsInfoCopyWith<$Res> { + factory $DAppsInfoCopyWith(DAppsInfo value, $Res Function(DAppsInfo) then) = + _$DAppsInfoCopyWithImpl<$Res, DAppsInfo>; + @useResult + $Res call( + {String? dAppName, + String? dAppDesc, + String? dAppLink, + String? dAppBackgroundImgCard}); +} + +/// @nodoc +class _$DAppsInfoCopyWithImpl<$Res, $Val extends DAppsInfo> + implements $DAppsInfoCopyWith<$Res> { + _$DAppsInfoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dAppName = freezed, + Object? dAppDesc = freezed, + Object? dAppLink = freezed, + Object? dAppBackgroundImgCard = freezed, + }) { + return _then(_value.copyWith( + dAppName: freezed == dAppName + ? _value.dAppName + : dAppName // ignore: cast_nullable_to_non_nullable + as String?, + dAppDesc: freezed == dAppDesc + ? _value.dAppDesc + : dAppDesc // ignore: cast_nullable_to_non_nullable + as String?, + dAppLink: freezed == dAppLink + ? _value.dAppLink + : dAppLink // ignore: cast_nullable_to_non_nullable + as String?, + dAppBackgroundImgCard: freezed == dAppBackgroundImgCard + ? _value.dAppBackgroundImgCard + : dAppBackgroundImgCard // ignore: cast_nullable_to_non_nullable + as String?, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$DAppsInfoImplCopyWith<$Res> + implements $DAppsInfoCopyWith<$Res> { + factory _$$DAppsInfoImplCopyWith( + _$DAppsInfoImpl value, $Res Function(_$DAppsInfoImpl) then) = + __$$DAppsInfoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {String? dAppName, + String? dAppDesc, + String? dAppLink, + String? dAppBackgroundImgCard}); +} + +/// @nodoc +class __$$DAppsInfoImplCopyWithImpl<$Res> + extends _$DAppsInfoCopyWithImpl<$Res, _$DAppsInfoImpl> + implements _$$DAppsInfoImplCopyWith<$Res> { + __$$DAppsInfoImplCopyWithImpl( + _$DAppsInfoImpl _value, $Res Function(_$DAppsInfoImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? dAppName = freezed, + Object? dAppDesc = freezed, + Object? dAppLink = freezed, + Object? dAppBackgroundImgCard = freezed, + }) { + return _then(_$DAppsInfoImpl( + dAppName: freezed == dAppName + ? _value.dAppName + : dAppName // ignore: cast_nullable_to_non_nullable + as String?, + dAppDesc: freezed == dAppDesc + ? _value.dAppDesc + : dAppDesc // ignore: cast_nullable_to_non_nullable + as String?, + dAppLink: freezed == dAppLink + ? _value.dAppLink + : dAppLink // ignore: cast_nullable_to_non_nullable + as String?, + dAppBackgroundImgCard: freezed == dAppBackgroundImgCard + ? _value.dAppBackgroundImgCard + : dAppBackgroundImgCard // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc + +class _$DAppsInfoImpl extends _DAppsInfo { + const _$DAppsInfoImpl( + {this.dAppName, this.dAppDesc, this.dAppLink, this.dAppBackgroundImgCard}) + : super._(); + + @override + final String? dAppName; + @override + final String? dAppDesc; + @override + final String? dAppLink; + @override + final String? dAppBackgroundImgCard; + + @override + String toString() { + return 'DAppsInfo(dAppName: $dAppName, dAppDesc: $dAppDesc, dAppLink: $dAppLink, dAppBackgroundImgCard: $dAppBackgroundImgCard)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DAppsInfoImpl && + (identical(other.dAppName, dAppName) || + other.dAppName == dAppName) && + (identical(other.dAppDesc, dAppDesc) || + other.dAppDesc == dAppDesc) && + (identical(other.dAppLink, dAppLink) || + other.dAppLink == dAppLink) && + (identical(other.dAppBackgroundImgCard, dAppBackgroundImgCard) || + other.dAppBackgroundImgCard == dAppBackgroundImgCard)); + } + + @override + int get hashCode => Object.hash( + runtimeType, dAppName, dAppDesc, dAppLink, dAppBackgroundImgCard); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DAppsInfoImplCopyWith<_$DAppsInfoImpl> get copyWith => + __$$DAppsInfoImplCopyWithImpl<_$DAppsInfoImpl>(this, _$identity); +} + +abstract class _DAppsInfo extends DAppsInfo { + const factory _DAppsInfo( + {final String? dAppName, + final String? dAppDesc, + final String? dAppLink, + final String? dAppBackgroundImgCard}) = _$DAppsInfoImpl; + const _DAppsInfo._() : super._(); + + @override + String? get dAppName; + @override + String? get dAppDesc; + @override + String? get dAppLink; + @override + String? get dAppBackgroundImgCard; + @override + @JsonKey(ignore: true) + _$$DAppsInfoImplCopyWith<_$DAppsInfoImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/router/router.authenticated.dart b/lib/router/router.authenticated.dart index 794ff4b72..36b149554 100644 --- a/lib/router/router.authenticated.dart +++ b/lib/router/router.authenticated.dart @@ -56,6 +56,20 @@ final _authenticatedRoutes = [ FadeTransition(opacity: animation, child: child), ), ), + GoRoute( + path: NFTTab.routerPage, + pageBuilder: (context, state) => CustomTransitionPage( + transitionDuration: Duration.zero, + reverseTransitionDuration: Duration.zero, + key: state.pageKey, + child: const NFTTab(), + transitionsBuilder: (context, animation, secondaryAnimation, child) => + FadeTransition( + opacity: animation, + child: child, + ), + ), + ), GoRoute( path: NFTListPerCategory.routerPage, pageBuilder: (context, state) => CustomTransitionPage( @@ -210,9 +224,7 @@ final _authenticatedRoutes = [ transitionDuration: Duration.zero, reverseTransitionDuration: Duration.zero, key: state.pageKey, - child: DEXSheet( - url: state.extra! as String, - ), + child: const DEXSheet(), transitionsBuilder: (context, animation, secondaryAnimation, child) => FadeTransition(opacity: animation, child: child), ), diff --git a/lib/router/router.dart b/lib/router/router.dart index deb94174d..a23f5a64b 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -21,6 +21,7 @@ import 'package:aewallet/ui/views/intro/layouts/intro_new_wallet_disclaimer.dart import 'package:aewallet/ui/views/intro/layouts/intro_new_wallet_get_first_infos.dart'; import 'package:aewallet/ui/views/intro/layouts/intro_welcome.dart'; import 'package:aewallet/ui/views/main/home_page.dart'; +import 'package:aewallet/ui/views/main/nft_tab.dart'; import 'package:aewallet/ui/views/messenger/layouts/add_discussion_sheet.dart'; import 'package:aewallet/ui/views/messenger/layouts/create_discussion_sheet.dart'; import 'package:aewallet/ui/views/messenger/layouts/create_discussion_validation_sheet.dart'; diff --git a/lib/ui/menu/settings/main_settings_view.dart b/lib/ui/menu/settings/main_settings_view.dart index ff36d6aae..81cf887c7 100644 --- a/lib/ui/menu/settings/main_settings_view.dart +++ b/lib/ui/menu/settings/main_settings_view.dart @@ -21,23 +21,6 @@ class MainMenuView extends ConsumerWidget { ref.watch(AccountProviders.selectedAccount).valueOrNull; final connectivityStatusProvider = ref.watch(connectivityStatusProviders); - final networkSettings = ref.watch( - SettingsProviders.settings.select((settings) => settings.network), - ); - - DApp? aeSwapUrl; - if (connectivityStatusProvider == ConnectivityStatus.isConnected && - FeatureFlags.dexActive && - DEXSheet.isAvailable) { - ref.watch(DAppsProviders.getDApp(networkSettings.network, 'aeSwap')).map( - data: (data) { - aeSwapUrl = data.value; - }, - error: (error) {}, - loading: (loading) {}, - ); - } - if (selectedAccount == null) return const SizedBox(); return DecoratedBox( @@ -73,44 +56,6 @@ class MainMenuView extends ConsumerWidget { ), ), ), - if (aeSwapUrl != null) - Column( - children: [ - if (connectivityStatusProvider == - ConnectivityStatus.isConnected && - FeatureFlags.dexActive && - DEXSheet.isAvailable) - const _SettingsListItem.spacer(), - if (connectivityStatusProvider == - ConnectivityStatus.isConnected && - FeatureFlags.dexActive && - DEXSheet.isAvailable) - _SettingsListItem.title( - text: localizations.dapp, - ), - if (connectivityStatusProvider == - ConnectivityStatus.isConnected && - FeatureFlags.dexActive && - DEXSheet.isAvailable) - const _SettingsListItem.spacer(), - if (connectivityStatusProvider == - ConnectivityStatus.isConnected && - FeatureFlags.dexActive && - DEXSheet.isAvailable) - _SettingsListItem.singleLineWithInfos( - heading: localizations.aeSwapLinkHeader, - info: localizations.aeSwapLinkDesc, - icon: Symbols.swap_horiz_rounded, - onPressed: () async { - await context.push( - DEXSheet.routerPage, - extra: aeSwapUrl!.url, - ); - }, - background: ArchethicTheme.backgroundAESwap, - ), - ], - ), const _SettingsListItem.spacer(), _SettingsListItem.title(text: localizations.information), const _SettingsListItem.spacer(), diff --git a/lib/ui/views/dapps/components/card_dapps.dart b/lib/ui/views/dapps/components/card_dapps.dart new file mode 100644 index 000000000..768945456 --- /dev/null +++ b/lib/ui/views/dapps/components/card_dapps.dart @@ -0,0 +1,121 @@ +/// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:ui'; + +import 'package:aewallet/application/settings/settings.dart'; +import 'package:aewallet/model/dapps_info.dart'; +import 'package:aewallet/ui/themes/archethic_theme_base.dart'; +import 'package:aewallet/ui/themes/styles.dart'; +import 'package:aewallet/util/get_it_instance.dart'; +import 'package:aewallet/util/haptic_util.dart'; +import 'package:archethic_dapp_framework_flutter/archethic_dapp_framework_flutter.dart' + as aedappfm; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_vibrate/flutter_vibrate.dart'; +import 'package:go_router/go_router.dart'; +import 'package:material_symbols_icons/symbols.dart'; + +class CardDapps extends ConsumerWidget { + const CardDapps({ + super.key, + required this.dAppsInfo, + }); + + final DAppsInfo dAppsInfo; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final preferences = ref.watch(SettingsProviders.settings); + + return Padding( + padding: const EdgeInsets.only(bottom: 20), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Stack( + children: [ + if (dAppsInfo.dAppBackgroundImgCard != null) + Positioned.fill( + child: Image.asset( + dAppsInfo.dAppBackgroundImgCard!, + fit: BoxFit.cover, + ), + ) + else + Positioned.fill( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + color: Colors.black.withOpacity(0.3), + ), + ), + ), + DecoratedBox( + decoration: BoxDecoration( + color: aedappfm.AppThemeBase.sheetBackground, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: aedappfm.AppThemeBase.sheetBorder, + ), + ), + child: InkWell( + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + key: Key('dAppsInfo${dAppsInfo.dAppName}'), + onTap: () { + sl.get().feedback( + FeedbackType.light, + preferences.activeVibrations, + ); + context.go( + dAppsInfo.dAppLink ?? '', + ); + }, + child: Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.width / 4, + color: Colors.transparent, + child: Padding( + padding: const EdgeInsets.only( + left: 20, + right: 20, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Text( + dAppsInfo.dAppName ?? '', + style: ArchethicThemeStyles + .textStyleSize16W600Primary, + ), + const SizedBox( + width: 5, + ), + Icon( + Symbols.arrow_right_alt, + size: 18, + color: ArchethicThemeBase.raspberry300, + ) + ], + ), + Text( + dAppsInfo.dAppDesc ?? '', + style: + ArchethicThemeStyles.textStyleSize14W200Primary, + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/views/dapps/dapps_list.dart b/lib/ui/views/dapps/dapps_list.dart new file mode 100644 index 000000000..a9f1165c0 --- /dev/null +++ b/lib/ui/views/dapps/dapps_list.dart @@ -0,0 +1,70 @@ +import 'package:aewallet/model/dapps_info.dart'; +import 'package:aewallet/ui/themes/archethic_theme.dart'; +import 'package:aewallet/ui/views/dapps/components/card_dapps.dart'; +import 'package:aewallet/ui/views/main/nft_tab.dart'; +import 'package:aewallet/ui/views/sheets/dex_sheet.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:flutter_gen/gen_l10n/localizations.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class DAppsList extends ConsumerStatefulWidget { + const DAppsList({super.key}); + + @override + ConsumerState createState() => DAppsListState(); +} + +class DAppsListState extends ConsumerState { + final List dAppsInfoList = []; + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) { + // Hard coded pending a more global system... + if (DEXSheet.isAvailable) { + dAppsInfoList.add( + DAppsInfo( + dAppName: 'aeSwap', + dAppDesc: AppLocalizations.of(context)!.dappsAESwapDesc, + dAppLink: DEXSheet.routerPage, + dAppBackgroundImgCard: ArchethicTheme.backgroundAESwap, + ), + ); + } + + dAppsInfoList.add( + DAppsInfo( + dAppName: 'NFT', + dAppDesc: AppLocalizations.of(context)!.dappsNFTDesc, + dAppLink: NFTTab.routerPage, + ), + ); + setState(() {}); + }); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ListView.builder( + padding: EdgeInsets.zero, + physics: const AlwaysScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: dAppsInfoList.length, + itemBuilder: (BuildContext context, int index) { + return CardDapps( + dAppsInfo: dAppsInfoList[index], + ) + .animate() + .fade(duration: Duration(milliseconds: 300 + (index * 50))) + .scale(duration: Duration(milliseconds: 300 + (index * 50))); + }, + ), + ], + ); + } +} diff --git a/lib/ui/views/main/components/main_appbar.dart b/lib/ui/views/main/components/main_appbar.dart index 15f0f0bf2..c35738bf2 100644 --- a/lib/ui/views/main/components/main_appbar.dart +++ b/lib/ui/views/main/components/main_appbar.dart @@ -12,7 +12,6 @@ import 'package:aewallet/ui/themes/archethic_theme.dart'; import 'package:aewallet/ui/themes/styles.dart'; import 'package:aewallet/ui/util/ui_util.dart'; import 'package:aewallet/ui/views/messenger/layouts/create_discussion_sheet.dart'; -import 'package:aewallet/ui/views/nft/layouts/configure_category_list.dart'; import 'package:aewallet/ui/widgets/components/icon_network_warning.dart'; import 'package:aewallet/util/get_it_instance.dart'; import 'package:aewallet/util/haptic_util.dart'; @@ -79,22 +78,6 @@ class MainAppBar extends ConsumerWidget implements PreferredSizeWidget { ), ), actions: [ - if (preferences.mainScreenCurrentPage == 3) - IconButton( - icon: const Icon( - Symbols.tune, - weight: IconSize.weightM, - opticalSize: IconSize.opticalSizeM, - grade: IconSize.gradeM, - ), - onPressed: () async { - sl.get().feedback( - FeedbackType.light, - preferences.activeVibrations, - ); - context.push(ConfigureCategoryList.routerPage); - }, - ), if (preferences.mainScreenCurrentPage == 4) Padding( padding: const EdgeInsets.only(right: 3), @@ -174,7 +157,7 @@ class MainAppBar extends ConsumerWidget implements PreferredSizeWidget { ? FittedBox( fit: BoxFit.fitWidth, child: AutoSizeText( - 'NFT', + localizations.dAppsHeader, style: ArchethicThemeStyles.textStyleSize24W700Primary, ), ) diff --git a/lib/ui/views/main/dapps_tab.dart b/lib/ui/views/main/dapps_tab.dart new file mode 100644 index 000000000..d05da34b5 --- /dev/null +++ b/lib/ui/views/main/dapps_tab.dart @@ -0,0 +1,53 @@ +import 'package:aewallet/ui/themes/styles.dart'; +import 'package:aewallet/ui/views/dapps/dapps_list.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/localizations.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class DAppsTab extends ConsumerWidget { + const DAppsTab({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SingleChildScrollView( + child: ScrollConfiguration( + behavior: ScrollConfiguration.of(context).copyWith( + dragDevices: { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + PointerDeviceKind.trackpad, + }, + ), + child: SizedBox( + height: MediaQuery.of(context).size.height, + child: Padding( + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top + 10, + left: 15, + right: 15, + ), + child: Column( + children: [ + Text( + AppLocalizations.of(context)!.dappsTabDescriptionHeader, + style: ArchethicThemeStyles.textStyleSize16W600Primary, + textAlign: TextAlign.justify, + ), + const SizedBox( + height: 20, + ), + const DAppsList(), + const SizedBox( + height: 10, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/ui/views/main/home_page.dart b/lib/ui/views/main/home_page.dart index c7437fce7..91fa31543 100755 --- a/lib/ui/views/main/home_page.dart +++ b/lib/ui/views/main/home_page.dart @@ -20,8 +20,8 @@ import 'package:aewallet/ui/views/main/address_book_tab.dart'; import 'package:aewallet/ui/views/main/bloc/providers.dart'; import 'package:aewallet/ui/views/main/components/main_appbar.dart'; import 'package:aewallet/ui/views/main/components/recovery_phrase_banner.dart'; +import 'package:aewallet/ui/views/main/dapps_tab.dart'; import 'package:aewallet/ui/views/main/keychain_tab.dart'; -import 'package:aewallet/ui/views/main/nft_tab.dart'; import 'package:aewallet/ui/views/messenger/bloc/providers.dart'; import 'package:aewallet/ui/views/messenger/layouts/messenger_tab.dart'; import 'package:aewallet/ui/views/tokens_fungibles/layouts/add_token_sheet.dart'; @@ -133,8 +133,8 @@ class _HomePageState extends ConsumerState label: AppLocalizations.of(context)!.bottomMainMenuMain, ), TabItem( - icon: Symbols.photo_library, - label: AppLocalizations.of(context)!.bottomMainMenuNFT, + icon: Symbols.widgets, + label: AppLocalizations.of(context)!.bottomMainMenuDApps, ), if (FeatureFlags.messagingActive) TabItem( @@ -193,9 +193,7 @@ class _HomePageState extends ConsumerState ), ], ), - NFTTab( - key: Key('bottomBarAddressNFTlink'), - ), + DAppsTab(), if (FeatureFlags.messagingActive) MessengerTab(), ], ), diff --git a/lib/ui/views/main/nft_tab.dart b/lib/ui/views/main/nft_tab.dart index 312dccefb..4ef8d6066 100644 --- a/lib/ui/views/main/nft_tab.dart +++ b/lib/ui/views/main/nft_tab.dart @@ -3,25 +3,34 @@ import 'package:aewallet/application/account/providers.dart'; import 'package:aewallet/application/connectivity_status.dart'; import 'package:aewallet/application/settings/settings.dart'; +import 'package:aewallet/ui/themes/archethic_theme.dart'; import 'package:aewallet/ui/themes/styles.dart'; import 'package:aewallet/ui/views/main/bloc/nft_search_bar_provider.dart'; import 'package:aewallet/ui/views/main/bloc/nft_search_bar_state.dart'; import 'package:aewallet/ui/views/main/components/nft_search_bar.dart'; +import 'package:aewallet/ui/views/main/components/sheet_appbar.dart'; +import 'package:aewallet/ui/views/main/home_page.dart'; +import 'package:aewallet/ui/views/nft/layouts/configure_category_list.dart'; import 'package:aewallet/ui/views/nft/layouts/nft_category_menu.dart'; import 'package:aewallet/ui/widgets/components/refresh_indicator.dart'; +import 'package:aewallet/ui/widgets/components/sheet_skeleton.dart'; +import 'package:aewallet/ui/widgets/components/sheet_skeleton_interface.dart'; import 'package:aewallet/util/get_it_instance.dart'; import 'package:aewallet/util/haptic_util.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_vibrate/flutter_vibrate.dart'; +import 'package:go_router/go_router.dart'; +import 'package:material_symbols_icons/symbols.dart'; class NFTTab extends ConsumerWidget { const NFTTab({ super.key, }); + static const String routerPage = '/nftTab'; + @override Widget build(BuildContext context, WidgetRef ref) { return ProviderScope( @@ -35,11 +44,55 @@ class NFTTab extends ConsumerWidget { } } -class NFTTabBody extends ConsumerWidget { +class NFTTabBody extends ConsumerWidget implements SheetSkeletonInterface { const NFTTabBody({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { + return SheetSkeleton( + appBar: getAppBar(context, ref), + floatingActionButton: getFloatingActionButton(context, ref), + sheetContent: getSheetContent(context, ref), + ); + } + + @override + Widget getFloatingActionButton(BuildContext context, WidgetRef ref) { + return const SizedBox.shrink(); + } + + @override + PreferredSizeWidget getAppBar(BuildContext context, WidgetRef ref) { + final preferences = ref.watch(SettingsProviders.settings); + return SheetAppBar( + title: AppLocalizations.of(context)!.nftHeader, + widgetLeft: BackButton( + key: const Key('back'), + color: ArchethicTheme.text, + onPressed: () { + context.go(HomePage.routerPage); + }, + ), + widgetRight: IconButton( + icon: const Icon( + Symbols.tune, + weight: IconSize.weightM, + opticalSize: IconSize.opticalSizeM, + grade: IconSize.gradeM, + ), + onPressed: () async { + sl.get().feedback( + FeedbackType.light, + preferences.activeVibrations, + ); + context.push(ConfigureCategoryList.routerPage); + }, + ), + ); + } + + @override + Widget getSheetContent(BuildContext context, WidgetRef ref) { final preferences = ref.watch(SettingsProviders.settings); return ArchethicRefreshIndicator( @@ -57,55 +110,25 @@ class NFTTabBody extends ConsumerWidget { await ref.read(AccountProviders.selectedAccount.notifier).refreshNFTs(); }), - child: SizedBox( - height: MediaQuery.of(context).size.height, - child: SingleChildScrollView( - child: ScrollConfiguration( - behavior: ScrollConfiguration.of(context).copyWith( - dragDevices: { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - PointerDeviceKind.trackpad, - }, - ), - child: SafeArea( - top: false, - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: MediaQuery.of(context).padding.top + 10, - bottom: MediaQuery.of(context).padding.bottom + 10, - left: 20, - right: 20, - ), - child: Column( - children: [ - Text( - AppLocalizations.of(context)!.nftTabDescriptionHeader, - style: - ArchethicThemeStyles.textStyleSize12W100Primary, - textAlign: TextAlign.justify, - ), - const SizedBox( - height: 20, - ), - const NFTSearchBar(), - const SizedBox( - height: 20, - ), - const NftCategoryMenu(), - const SizedBox( - height: 10, - ), - ], - ), - ), - ], - ), - ), + child: Column( + children: [ + Text( + AppLocalizations.of(context)!.nftTabDescriptionHeader, + style: ArchethicThemeStyles.textStyleSize12W100Primary, + textAlign: TextAlign.justify, ), - ), + const SizedBox( + height: 20, + ), + const NFTSearchBar(), + const SizedBox( + height: 20, + ), + const NftCategoryMenu(), + const SizedBox( + height: 10, + ), + ], ), ); } diff --git a/lib/ui/views/nft/layouts/nft_list_per_category.dart b/lib/ui/views/nft/layouts/nft_list_per_category.dart index 2228b26de..99e5264ce 100644 --- a/lib/ui/views/nft/layouts/nft_list_per_category.dart +++ b/lib/ui/views/nft/layouts/nft_list_per_category.dart @@ -5,7 +5,7 @@ import 'package:aewallet/application/settings/settings.dart'; import 'package:aewallet/ui/themes/archethic_theme.dart'; import 'package:aewallet/ui/util/dimens.dart'; import 'package:aewallet/ui/views/main/components/sheet_appbar.dart'; -import 'package:aewallet/ui/views/main/home_page.dart'; +import 'package:aewallet/ui/views/main/nft_tab.dart'; import 'package:aewallet/ui/views/nft/layouts/components/nft_list.dart'; import 'package:aewallet/ui/views/nft_creation/bloc/provider.dart'; import 'package:aewallet/ui/views/nft_creation/layouts/nft_creation_process_sheet.dart'; @@ -96,7 +96,7 @@ class NFTListPerCategory extends ConsumerWidget key: const Key('back'), color: ArchethicTheme.text, onPressed: () { - context.go(HomePage.routerPage); + context.go(NFTTab.routerPage); }, ), ); diff --git a/lib/ui/views/sheets/dex_sheet.dart b/lib/ui/views/sheets/dex_sheet.dart index a64c929d0..dc2f494cd 100755 --- a/lib/ui/views/sheets/dex_sheet.dart +++ b/lib/ui/views/sheets/dex_sheet.dart @@ -1,5 +1,10 @@ +import 'package:aewallet/application/connectivity_status.dart'; +import 'package:aewallet/application/dapps.dart'; +import 'package:aewallet/application/settings/settings.dart'; +import 'package:aewallet/domain/models/dapp.dart'; import 'package:aewallet/infrastructure/rpc/awc_webview.dart'; import 'package:aewallet/ui/themes/archethic_theme.dart'; +import 'package:aewallet/ui/themes/styles.dart'; import 'package:aewallet/ui/views/main/components/webview_appbar.dart'; import 'package:aewallet/ui/views/main/home_page.dart'; import 'package:aewallet/ui/views/sheets/unavailable_feature_warning.dart'; @@ -7,23 +12,52 @@ import 'package:aewallet/ui/widgets/components/dialog.dart'; import 'package:aewallet/ui/widgets/components/loading_list_header.dart'; import 'package:aewallet/ui/widgets/components/sheet_skeleton.dart'; import 'package:aewallet/ui/widgets/components/sheet_skeleton_interface.dart'; +import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_gen/gen_l10n/localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -class DEXSheet extends ConsumerWidget implements SheetSkeletonInterface { +class DEXSheet extends ConsumerStatefulWidget { const DEXSheet({ super.key, - required this.url, }); static bool get isAvailable => AWCWebview.isAvailable; static const String routerPage = '/dex'; - final String url; @override - Widget build(BuildContext context, WidgetRef ref) { + ConsumerState createState() => DEXSheetState(); +} + +class DEXSheetState extends ConsumerState + implements SheetSkeletonInterface { + String? aeSwapUrl; + @override + void initState() { + Future.delayed(Duration.zero, () async { + final networkSettings = ref.watch( + SettingsProviders.settings.select((settings) => settings.network), + ); + + final connectivityStatusProvider = ref.watch(connectivityStatusProviders); + DApp? dapp; + if (connectivityStatusProvider == ConnectivityStatus.isConnected && + DEXSheet.isAvailable) { + dapp = await ref.read( + DAppsProviders.getDApp(networkSettings.network, 'aeSwap').future, + ); + setState(() { + aeSwapUrl = dapp!.url; + }); + } + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { return SheetSkeleton( appBar: getAppBar(context, ref), floatingActionButton: getFloatingActionButton(context, ref), @@ -39,8 +73,16 @@ class DEXSheet extends ConsumerWidget implements SheetSkeletonInterface { @override PreferredSizeWidget getAppBar(BuildContext context, WidgetRef ref) { + final localizations = AppLocalizations.of(context)!; + return WebviewAppBar( - title: const SizedBox.shrink(), + title: FittedBox( + fit: BoxFit.fitWidth, + child: AutoSizeText( + localizations.aeSwapHeader, + style: ArchethicThemeStyles.textStyleSize24W700Primary, + ), + ).animate().fade(duration: const Duration(milliseconds: 300)), widgetLeft: BackButton( key: const Key('back'), color: ArchethicTheme.text, @@ -75,9 +117,12 @@ class DEXSheet extends ConsumerWidget implements SheetSkeletonInterface { if (!isAWCSupported) return const UnavailableFeatureWarning(); - return AWCWebview( - uri: Uri.parse(url), - ); + if (aeSwapUrl != null) { + return AWCWebview( + uri: Uri.parse(aeSwapUrl!), + ); + } + return const SizedBox.shrink(); }, ), ); diff --git a/pubspec.lock b/pubspec.lock index 1730c45e5..b0ffb78d5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "99b5dec989287c1aca71bf27339e0022b4dc3679225f442fb75790ef44535bf8" + sha256: "2350805d7afefb0efe7acd325cb19d3ae8ba4039b906eade3807ffb69938a01f" url: "https://pub.dev" source: hosted - version: "1.3.30" + version: "1.3.33" adaptive_number: dependency: transitive description: @@ -70,10 +70,10 @@ packages: dependency: "direct main" description: name: archethic_dapp_framework_flutter - sha256: fb95a351f28850cd8b9ca34ebbdbadfce211a4e4a420d7871c284198fb88b99f + sha256: "638753209488c4efd992257fb708668be3e5e696d1f320c3b30d02945d7e7332" url: "https://pub.dev" source: hosted - version: "1.1.11" + version: "1.1.17" archethic_lib_dart: dependency: "direct main" description: @@ -102,10 +102,10 @@ packages: dependency: transitive description: name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265 url: "https://pub.dev" source: hosted - version: "3.4.10" + version: "3.5.1" args: dependency: transitive description: @@ -118,10 +118,10 @@ packages: dependency: "direct main" description: name: asn1lib - sha256: c9c85fedbe2188b95133cbe960e16f5f448860f7133330e272edbbca5893ddc6 + sha256: "58082b3f0dca697204dbab0ef9ff208bfaea7767ea771076af9a343488428dda" url: "https://pub.dev" source: hosted - version: "1.5.2" + version: "1.5.3" async: dependency: transitive description: @@ -262,10 +262,10 @@ packages: dependency: transitive description: name: cached_network_image_web - sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" characters: dependency: transitive description: @@ -542,10 +542,10 @@ packages: dependency: transitive description: name: file_selector_macos - sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 url: "https://pub.dev" source: hosted - version: "0.9.3+3" + version: "0.9.4" file_selector_platform_interface: dependency: transitive description: @@ -574,10 +574,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "6b1152a5af3b1cfe7e45309e96fc1aa14873f410f7aadb3878aa7812acfa7531" + sha256: "372d94ced114b9c40cb85e18c50ac94a7e998c8eec630c50d7aec047847d27bf" url: "https://pub.dev" source: hosted - version: "2.30.0" + version: "2.31.0" firebase_core_platform_interface: dependency: transitive description: @@ -590,34 +590,34 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: c8b02226e548f35aace298e2bb2e6c24e34e8a203d614e742bb1146e5a4ad3c8 + sha256: "43d9e951ac52b87ae9cc38ecdcca1e8fa7b52a1dd26a96085ba41ce5108db8e9" url: "https://pub.dev" source: hosted - version: "2.15.0" + version: "2.17.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: d01e454837b1ce221791682051fd584e4827bdff5fdad3595708a917db01ad0a + sha256: e0882a7426821f7caccaabfc15a535155cd15b4daa73a5a7b3af701a552d73ab url: "https://pub.dev" source: hosted - version: "14.8.2" + version: "14.9.2" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: e459eb4eb0aef67833843f474e8697e091086d71aa186253b93eb141eec3ee2f + sha256: "52e12cc50e1395ad7ea3552dcbe9958fb1994b5afcf58ee4c0db053932a6fce5" url: "https://pub.dev" source: hosted - version: "4.5.32" + version: "4.5.35" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: f0600d25c1c710338d568d200164fa791ce8d390d141d04408908615834a0db6 + sha256: "8812cc5929380b783f92290d934bf32e2fea06701583f47cdccd5f13f4f24522" url: "https://pub.dev" source: hosted - version: "3.8.2" + version: "3.8.5" fixnum: dependency: transitive description: @@ -800,50 +800,50 @@ packages: dependency: "direct main" description: name: flutter_secure_storage - sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + sha256: "8496a89eea74e23f92581885f876455d9d460e71201405dffe5f55dfe1155864" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.2.1" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + sha256: "4d91bfc23047422cbcd73ac684bc169859ee766482517c22172c86596bf1464b" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + sha256: b768a7dab26d6186b68e2831b3104f8968154f0f4fdbf66e7c2dd7bdf299daaf url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.1" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.2" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.2" flutter_shaders: dependency: transitive description: @@ -922,10 +922,10 @@ packages: dependency: "direct main" description: name: ghost - sha256: "205cba406caf531b6afe59ffa2ed96975718d85bf15720eee103c6c9d2e8e922" + sha256: "626bbbdb68486c078a7c32bd13dbeddb425ce8f8894a230d7bc501cf46d68634" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.1.0" glob: dependency: transitive description: @@ -938,26 +938,26 @@ packages: dependency: "direct main" description: name: go_router - sha256: "771c8feb40ad0ef639973d7ecf1b43d55ffcedb2207fd43fab030f5639e40446" + sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836 url: "https://pub.dev" source: hosted - version: "13.2.4" + version: "13.2.5" gql: dependency: transitive description: name: gql - sha256: afe032332ddfa69b79f1dea2ad7d95923d4993c1b269b224fc7bb3d17e32d33c + sha256: "5b011ec89d08eede5a33518b7195b1b0fa1be543f82e16848d185e9042513504" url: "https://pub.dev" source: hosted - version: "1.0.1-alpha+1709845491443" + version: "1.0.1-alpha+1715931674451" gql_dedupe_link: dependency: transitive description: name: gql_dedupe_link - sha256: "2971173c68623d5c43f5327ea899bd2ee64ce3461c1263f240b4bb6211f667be" + sha256: "10bee0564d67c24e0c8bd08bd56e0682b64a135e58afabbeed30d85d5e9fea96" url: "https://pub.dev" source: hosted - version: "2.0.4-alpha+1709845491527" + version: "2.0.4-alpha+1715521079596" gql_error_link: dependency: transitive description: @@ -986,10 +986,10 @@ packages: dependency: transitive description: name: gql_link - sha256: "177500e250b3742d6d2673d57961e8413b6593dc6bd6a512c51865b6cf096f7e" + sha256: a0dae65d022285564ad333763a6988a603d6b9a075760ae178d6d22586bd342b url: "https://pub.dev" source: hosted - version: "1.0.1-alpha+1709845491457" + version: "1.0.1-alpha+1715521079517" gql_transform_link: dependency: transitive description: @@ -1090,18 +1090,18 @@ packages: dependency: "direct main" description: name: image_picker - sha256: fe9ee64ccb8d599a5dfb0e21cc6652232c610bcf667af4e79b9eb175cc30a7a5 + sha256: "33974eca2e87e8b4e3727f1b94fa3abcb25afe80b6bc2c4d449a0e150aedf720" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "8e75431a62b7feb4fd55cb4a5c6f0ac4564460ec5dc09f9c4a0d50a5ce7c4cb9" + sha256: "0f57fee1e8bfadf8cc41818bbcd7f72e53bb768a54d9496355d5e8a5681a19f1" url: "https://pub.dev" source: hosted - version: "0.8.10" + version: "0.8.12+1" image_picker_for_web: dependency: transitive description: @@ -1114,10 +1114,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: f4a6f62be96d6fd268f32a6bf8ef444cd8e3fff64d16923c6e6fe55e0c84a761 + sha256: "4824d8c7f6f89121ef0122ff79bb00b009607faecc8545b86bca9ab5ce1e95bf" url: "https://pub.dev" source: hosted - version: "0.8.10" + version: "0.8.11+2" image_picker_linux: dependency: transitive description: @@ -1186,10 +1186,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" json_rpc_2: dependency: "direct main" description: @@ -1210,10 +1210,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b url: "https://pub.dev" source: hosted - version: "6.7.1" + version: "6.8.0" jwk: dependency: transitive description: @@ -1298,10 +1298,10 @@ packages: dependency: transitive description: name: local_auth_darwin - sha256: "33381a15b0de2279523eca694089393bb146baebdce72a404555d03174ebc1e9" + sha256: "959145a4cf6f0de745b9ec9ac60101270eb4c5b8b7c2a0470907014adc1c618d" url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.3.0" local_auth_platform_interface: dependency: transitive description: @@ -1346,10 +1346,10 @@ packages: dependency: "direct main" description: name: material_symbols_icons - sha256: "4410e4bb5c6e16d811340f94532c0b3161d2a0ba60b41d0fa8a603186857cabe" + sha256: "520b3340d877d78f94ff1fc63e4d5667020811d0dac089ecd19373cf4538e293" url: "https://pub.dev" source: hosted - version: "4.2719.3" + version: "4.2744.0" meta: dependency: transitive description: @@ -1506,10 +1506,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -1546,10 +1546,10 @@ packages: dependency: transitive description: name: patrol_finders - sha256: ac33527cc1b63e3aa131dbd7107cfda8ee2df0fb4a4a423c067174a2e60db77b + sha256: e14214e88c84d34a1d7c89778ddf5c5a913bfc0a6a308da47d3ebca374a1f5f4 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.1.0" pdfx: dependency: "direct main" description: @@ -1558,14 +1558,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.6.0" - pedantic: - dependency: transitive - description: - name: pedantic - sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" - url: "https://pub.dev" - source: hosted - version: "1.11.1" pem: dependency: transitive description: @@ -1586,10 +1578,10 @@ packages: dependency: transitive description: name: phoenix_socket - sha256: "95898872f898a4f53c81b552a0ddd4ebb35881c0616f1242150f1b4f0536e6c7" + sha256: "2d56ffde59875673bffdabd1f709307ab34b317bd868402e3d3a61c23c333b1b" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.4" photo_view: dependency: transitive description: @@ -1626,10 +1618,10 @@ packages: dependency: "direct main" description: name: pointycastle - sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.9.1" pool: dependency: transitive description: @@ -1863,10 +1855,10 @@ packages: dependency: transitive description: name: sqflite - sha256: "5ce2e1a15e822c3b4bfb5400455775e421da7098eed8adc8f26298ada7c9308c" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.3+1" sqflite_common: dependency: transitive description: @@ -2031,10 +2023,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" url: "https://pub.dev" source: hosted - version: "6.2.5" + version: "6.3.0" url_launcher_linux: dependency: transitive description: @@ -2047,10 +2039,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: @@ -2183,10 +2175,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934 + sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91 url: "https://pub.dev" source: hosted - version: "3.16.0" + version: "3.16.1" webview_flutter_platform_interface: dependency: transitive description: @@ -2199,18 +2191,18 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7 + sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" url: "https://pub.dev" source: hosted - version: "3.13.0" + version: "3.13.1" win32: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" win32_registry: dependency: transitive description: @@ -2223,10 +2215,10 @@ packages: dependency: "direct main" description: name: window_manager - sha256: b3c895bdf936c77b83c5254bec2e6b3f066710c1f89c38b20b8acc382b525494 + sha256: "8699323b30da4cdbe2aa2e7c9de567a6abd8a97d9a5c850a3c86dcd0b34bbfbf" url: "https://pub.dev" source: hosted - version: "0.3.8" + version: "0.3.9" x25519: dependency: transitive description: