diff --git a/lib/app.dart b/lib/app.dart index b3c3572f..20a2c49d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -96,8 +96,8 @@ class HyphaAppView extends StatelessWidget { navigateToSignTransaction: (ScanQrCodeResultData data) { _showSignTransactionBottomSheet(data); }, - showJoinDaoRationale: (daoName, secret) { - _showJoinDaoRationale(daoName, secret, context); + showJoinDaoRationale: (inviteLinkData) { + _showJoinDaoRationale(inviteLinkData, context); }, ); context.read().add(const DeeplinkEvent.clearPageCommand()); @@ -226,9 +226,9 @@ class HyphaAppView extends StatelessWidget { ); } - void _showJoinDaoRationale(String daoName, String secret, BuildContext context) { + void _showJoinDaoRationale(InviteLinkData inviteLinkData, BuildContext context) { Get.Get.bottomSheet( - JoinDaoRationaleBottomSheet(daoName: daoName, secret: secret), + JoinDaoRationaleBottomSheet(inviteLinkData: inviteLinkData), isScrollControlled: true, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(30)), diff --git a/lib/core/di/bloc_module.dart b/lib/core/di/bloc_module.dart index 2da41ff5..4b7abe64 100644 --- a/lib/core/di/bloc_module.dart +++ b/lib/core/di/bloc_module.dart @@ -107,12 +107,13 @@ void _registerBlocsModule() { ), ); - _registerFactoryWithParams( - (secret, _) => JoinDaoBloc( + _registerFactoryWithParams( + (inviteLinkData, _) => JoinDaoBloc( _getIt(), _getIt(), _getIt(), - secret, + _getIt(), + inviteLinkData, ), ); diff --git a/lib/core/di/di_setup.dart b/lib/core/di/di_setup.dart index 05b6e44e..6dbe9e48 100644 --- a/lib/core/di/di_setup.dart +++ b/lib/core/di/di_setup.dart @@ -45,6 +45,7 @@ import 'package:hypha_wallet/ui/history/details/interactor/transaction_detail_bl import 'package:hypha_wallet/ui/history/transactions/interactor/transactions_bloc.dart'; import 'package:hypha_wallet/ui/history/transactions/usecases/get_transaction_history_use_case.dart'; import 'package:hypha_wallet/ui/home_page/interactor/home_bloc.dart'; +import 'package:hypha_wallet/ui/home_page/usecases/get_dao_name_use_case.dart'; import 'package:hypha_wallet/ui/home_page/usecases/parse_qr_code_use_case.dart'; import 'package:hypha_wallet/ui/onboarding/create_account/interactor/create_account_bloc.dart'; import 'package:hypha_wallet/ui/onboarding/edit_account/edit_account_page.dart'; diff --git a/lib/core/di/usecases_module.dart b/lib/core/di/usecases_module.dart index 7fe06393..191eb3dd 100644 --- a/lib/core/di/usecases_module.dart +++ b/lib/core/di/usecases_module.dart @@ -74,4 +74,6 @@ void _registerUseCasesModule() { _getIt(), _getIt(), )); + + _registerFactory(() => GetDaoNameUseCase(_getIt())); } diff --git a/lib/core/network/api/services/dao_service.dart b/lib/core/network/api/services/dao_service.dart index 37af5af5..64d1b81e 100644 --- a/lib/core/network/api/services/dao_service.dart +++ b/lib/core/network/api/services/dao_service.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:dio/dio.dart'; import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart'; import 'package:hypha_wallet/core/logging/log_helper.dart'; @@ -60,9 +58,6 @@ class DaoService { try { final res = await _networkingManager.post(url, data: query); final Map response = res.data; - - print("response: ${response}"); - final List daos = response['data']['queryDao']; return Result.value(daos.isNotEmpty ? DaoData.fromJson(daos[0]) : null); } catch (error, stackTrace) { diff --git a/lib/ui/blocs/deeplink/deeplink_bloc.dart b/lib/ui/blocs/deeplink/deeplink_bloc.dart index fa8c0a34..b9a1618c 100644 --- a/lib/ui/blocs/deeplink/deeplink_bloc.dart +++ b/lib/ui/blocs/deeplink/deeplink_bloc.dart @@ -96,13 +96,20 @@ class DeeplinkBloc extends Bloc { if (queryParams.isNotEmpty && queryParams.containsKey('code') && queryParams.containsKey('chain')) { final code = queryParams['code']!; final chain = queryParams['chain']!; + final network = Network.fromString(chain); final dao = queryParams['dao']!; - final String enrollSecret = queryParams['enroll_secret']!; + final inviteLinkData = InviteLinkData( + code: code, + network: network, + dao: dao, + enrollSecret: enrollSecret, + ); + final PageCommand command; - if(_authRepository.currentAuthStatus is Authenticated) { - command = PageCommand.showJoinDaoRationale(dao, enrollSecret); + if (_authRepository.currentAuthStatus is Authenticated) { + command = PageCommand.showJoinDaoRationale(inviteLinkData); } else { command = const PageCommand.navigateToCreateAccount(); } @@ -110,12 +117,7 @@ class DeeplinkBloc extends Bloc { /// Emit new state with data from link emit( state.copyWith( - inviteLinkData: InviteLinkData( - code: code, - network: Network.fromString(chain), - dao: dao, - enrollSecret: enrollSecret, - ), + inviteLinkData: inviteLinkData, command: command, ), ); diff --git a/lib/ui/blocs/deeplink/deeplink_bloc.freezed.dart b/lib/ui/blocs/deeplink/deeplink_bloc.freezed.dart index 1a97a8f2..35eb8b98 100644 --- a/lib/ui/blocs/deeplink/deeplink_bloc.freezed.dart +++ b/lib/ui/blocs/deeplink/deeplink_bloc.freezed.dart @@ -775,7 +775,7 @@ mixin _$PageCommand { @optionalTypeArgs TResult when({ required TResult Function() navigateToCreateAccount, - required TResult Function(String daoName, String secret) + required TResult Function(InviteLinkData inviteLinkData) showJoinDaoRationale, required TResult Function(ScanQrCodeResultData data) navigateToSignTransaction, @@ -784,14 +784,14 @@ mixin _$PageCommand { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? navigateToCreateAccount, - TResult? Function(String daoName, String secret)? showJoinDaoRationale, + TResult? Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult? Function(ScanQrCodeResultData data)? navigateToSignTransaction, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? navigateToCreateAccount, - TResult Function(String daoName, String secret)? showJoinDaoRationale, + TResult Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult Function(ScanQrCodeResultData data)? navigateToSignTransaction, required TResult orElse(), }) => @@ -882,7 +882,7 @@ class _$_NavigateToCreateAccount implements _NavigateToCreateAccount { @optionalTypeArgs TResult when({ required TResult Function() navigateToCreateAccount, - required TResult Function(String daoName, String secret) + required TResult Function(InviteLinkData inviteLinkData) showJoinDaoRationale, required TResult Function(ScanQrCodeResultData data) navigateToSignTransaction, @@ -894,7 +894,7 @@ class _$_NavigateToCreateAccount implements _NavigateToCreateAccount { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? navigateToCreateAccount, - TResult? Function(String daoName, String secret)? showJoinDaoRationale, + TResult? Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult? Function(ScanQrCodeResultData data)? navigateToSignTransaction, }) { return navigateToCreateAccount?.call(); @@ -904,7 +904,7 @@ class _$_NavigateToCreateAccount implements _NavigateToCreateAccount { @optionalTypeArgs TResult maybeWhen({ TResult Function()? navigateToCreateAccount, - TResult Function(String daoName, String secret)? showJoinDaoRationale, + TResult Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult Function(ScanQrCodeResultData data)? navigateToSignTransaction, required TResult orElse(), }) { @@ -963,7 +963,7 @@ abstract class _$$_ShowJoinDaoRationaleCopyWith<$Res> { $Res Function(_$_ShowJoinDaoRationale) then) = __$$_ShowJoinDaoRationaleCopyWithImpl<$Res>; @useResult - $Res call({String daoName, String secret}); + $Res call({InviteLinkData inviteLinkData}); } /// @nodoc @@ -977,18 +977,13 @@ class __$$_ShowJoinDaoRationaleCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? daoName = null, - Object? secret = null, + Object? inviteLinkData = null, }) { return _then(_$_ShowJoinDaoRationale( - null == daoName - ? _value.daoName - : daoName // ignore: cast_nullable_to_non_nullable - as String, - null == secret - ? _value.secret - : secret // ignore: cast_nullable_to_non_nullable - as String, + null == inviteLinkData + ? _value.inviteLinkData + : inviteLinkData // ignore: cast_nullable_to_non_nullable + as InviteLinkData, )); } } @@ -996,16 +991,14 @@ class __$$_ShowJoinDaoRationaleCopyWithImpl<$Res> /// @nodoc class _$_ShowJoinDaoRationale implements _ShowJoinDaoRationale { - const _$_ShowJoinDaoRationale(this.daoName, this.secret); + const _$_ShowJoinDaoRationale(this.inviteLinkData); @override - final String daoName; - @override - final String secret; + final InviteLinkData inviteLinkData; @override String toString() { - return 'PageCommand.showJoinDaoRationale(daoName: $daoName, secret: $secret)'; + return 'PageCommand.showJoinDaoRationale(inviteLinkData: $inviteLinkData)'; } @override @@ -1013,12 +1006,12 @@ class _$_ShowJoinDaoRationale implements _ShowJoinDaoRationale { return identical(this, other) || (other.runtimeType == runtimeType && other is _$_ShowJoinDaoRationale && - (identical(other.daoName, daoName) || other.daoName == daoName) && - (identical(other.secret, secret) || other.secret == secret)); + (identical(other.inviteLinkData, inviteLinkData) || + other.inviteLinkData == inviteLinkData)); } @override - int get hashCode => Object.hash(runtimeType, daoName, secret); + int get hashCode => Object.hash(runtimeType, inviteLinkData); @JsonKey(ignore: true) @override @@ -1031,34 +1024,34 @@ class _$_ShowJoinDaoRationale implements _ShowJoinDaoRationale { @optionalTypeArgs TResult when({ required TResult Function() navigateToCreateAccount, - required TResult Function(String daoName, String secret) + required TResult Function(InviteLinkData inviteLinkData) showJoinDaoRationale, required TResult Function(ScanQrCodeResultData data) navigateToSignTransaction, }) { - return showJoinDaoRationale(daoName, secret); + return showJoinDaoRationale(inviteLinkData); } @override @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? navigateToCreateAccount, - TResult? Function(String daoName, String secret)? showJoinDaoRationale, + TResult? Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult? Function(ScanQrCodeResultData data)? navigateToSignTransaction, }) { - return showJoinDaoRationale?.call(daoName, secret); + return showJoinDaoRationale?.call(inviteLinkData); } @override @optionalTypeArgs TResult maybeWhen({ TResult Function()? navigateToCreateAccount, - TResult Function(String daoName, String secret)? showJoinDaoRationale, + TResult Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult Function(ScanQrCodeResultData data)? navigateToSignTransaction, required TResult orElse(), }) { if (showJoinDaoRationale != null) { - return showJoinDaoRationale(daoName, secret); + return showJoinDaoRationale(inviteLinkData); } return orElse(); } @@ -1103,11 +1096,10 @@ class _$_ShowJoinDaoRationale implements _ShowJoinDaoRationale { } abstract class _ShowJoinDaoRationale implements PageCommand { - const factory _ShowJoinDaoRationale( - final String daoName, final String secret) = _$_ShowJoinDaoRationale; + const factory _ShowJoinDaoRationale(final InviteLinkData inviteLinkData) = + _$_ShowJoinDaoRationale; - String get daoName; - String get secret; + InviteLinkData get inviteLinkData; @JsonKey(ignore: true) _$$_ShowJoinDaoRationaleCopyWith<_$_ShowJoinDaoRationale> get copyWith => throw _privateConstructorUsedError; @@ -1183,7 +1175,7 @@ class _$_ESRLinkNavigateToSignTransaction @optionalTypeArgs TResult when({ required TResult Function() navigateToCreateAccount, - required TResult Function(String daoName, String secret) + required TResult Function(InviteLinkData inviteLinkData) showJoinDaoRationale, required TResult Function(ScanQrCodeResultData data) navigateToSignTransaction, @@ -1195,7 +1187,7 @@ class _$_ESRLinkNavigateToSignTransaction @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? navigateToCreateAccount, - TResult? Function(String daoName, String secret)? showJoinDaoRationale, + TResult? Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult? Function(ScanQrCodeResultData data)? navigateToSignTransaction, }) { return navigateToSignTransaction?.call(data); @@ -1205,7 +1197,7 @@ class _$_ESRLinkNavigateToSignTransaction @optionalTypeArgs TResult maybeWhen({ TResult Function()? navigateToCreateAccount, - TResult Function(String daoName, String secret)? showJoinDaoRationale, + TResult Function(InviteLinkData inviteLinkData)? showJoinDaoRationale, TResult Function(ScanQrCodeResultData data)? navigateToSignTransaction, required TResult orElse(), }) { diff --git a/lib/ui/blocs/deeplink/page_command.dart b/lib/ui/blocs/deeplink/page_command.dart index 14a14464..0aff4df1 100644 --- a/lib/ui/blocs/deeplink/page_command.dart +++ b/lib/ui/blocs/deeplink/page_command.dart @@ -3,6 +3,6 @@ part of 'deeplink_bloc.dart'; @freezed class PageCommand with _$PageCommand { const factory PageCommand.navigateToCreateAccount() = _NavigateToCreateAccount; - const factory PageCommand.showJoinDaoRationale(String daoName, String secret) = _ShowJoinDaoRationale; + const factory PageCommand.showJoinDaoRationale(InviteLinkData inviteLinkData) = _ShowJoinDaoRationale; const factory PageCommand.navigateToSignTransaction(ScanQrCodeResultData data) = _ESRLinkNavigateToSignTransaction; } diff --git a/lib/ui/home_page/usecases/get_dao_name_use_case.dart b/lib/ui/home_page/usecases/get_dao_name_use_case.dart new file mode 100644 index 00000000..105b9436 --- /dev/null +++ b/lib/ui/home_page/usecases/get_dao_name_use_case.dart @@ -0,0 +1,24 @@ +import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart'; +import 'package:hypha_wallet/core/network/api/services/dao_service.dart'; +import 'package:hypha_wallet/core/network/models/dao_data_model.dart'; +import 'package:hypha_wallet/core/network/models/network.dart'; +import 'package:hypha_wallet/ui/architecture/result/result.dart' as HResult; + +class GetDaoNameUseCase { + final DaoService _daoService; + + GetDaoNameUseCase(this._daoService); + + Future> run(String daoId, Network network) async { + final HResult.Result data = await _daoService.getDaoById(daoId: daoId, network: network); + final daoName = data.asValue?.value?.settingsDaoTitle; + + if (daoName != null) { + return HResult.Result.value(daoName); + } else if (data.isError) { + return HResult.Result.error(data.asError!.error); + } else { + return HResult.Result.error(HyphaError.generic('Could not find dao with ID: $daoId')); + } + } +} diff --git a/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.dart b/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.dart index e4448703..1cc822d0 100644 --- a/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.dart +++ b/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.dart @@ -7,6 +7,8 @@ import 'package:hypha_wallet/core/error_handler/error_handler_manager.dart'; import 'package:hypha_wallet/core/network/api/services/invite_service.dart'; import 'package:hypha_wallet/core/network/repository/auth_repository.dart'; import 'package:hypha_wallet/ui/architecture/interactor/page_states.dart'; +import 'package:hypha_wallet/ui/blocs/deeplink/deeplink_bloc.dart'; +import 'package:hypha_wallet/ui/home_page/usecases/get_dao_name_use_case.dart'; part 'join_dao_bloc.freezed.dart'; @@ -18,30 +20,38 @@ class JoinDaoBloc extends Bloc { final AuthRepository _authRepository; final InviteService _inviteService; final ErrorHandlerManager _errorHandlerManager; - final String secret; + final GetDaoNameUseCase _getDaoNameUseCase; + final InviteLinkData _inviteLinkData; JoinDaoBloc( this._authRepository, this._inviteService, this._errorHandlerManager, - this.secret, + this._getDaoNameUseCase, + this._inviteLinkData, ) : super(const JoinDaoState()) { on<_Initial>(_initial); on<_OnYesTapped>(_onYesTapped); } Future _initial(_Initial event, Emitter emit) async { - emit(state.copyWith(pageState: PageState.success)); + emit(state.copyWith(pageState: PageState.loading)); + final result = await _getDaoNameUseCase.run(_inviteLinkData.dao!, _inviteLinkData.network); + if (result.isValue) { + emit(state.copyWith(pageState: PageState.success, daoName: result.asValue!.value)); + } else { + emit(state.copyWith(pageState: PageState.failure)); + } } FutureOr _onYesTapped(_OnYesTapped event, Emitter emit) async { emit(state.copyWith(isButtonLoading: true)); final result = await _inviteService.redeemInvite( user: _authRepository.authDataOrCrash.userProfileData, - secret: secret, + secret: _inviteLinkData.enrollSecret!, ); - if(result.isValue) { + if (result.isValue) { emit(state.copyWith(isButtonLoading: false)); Get.back(); } else { diff --git a/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.freezed.dart b/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.freezed.dart index 1d185ca6..72b06e58 100644 --- a/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.freezed.dart +++ b/lib/ui/onboarding/join_dao/interactor/join_dao_bloc.freezed.dart @@ -281,6 +281,7 @@ abstract class _OnYesTapped implements JoinDaoEvent { mixin _$JoinDaoState { PageState get pageState => throw _privateConstructorUsedError; bool get isButtonLoading => throw _privateConstructorUsedError; + String get daoName => throw _privateConstructorUsedError; @JsonKey(ignore: true) $JoinDaoStateCopyWith get copyWith => @@ -293,7 +294,7 @@ abstract class $JoinDaoStateCopyWith<$Res> { JoinDaoState value, $Res Function(JoinDaoState) then) = _$JoinDaoStateCopyWithImpl<$Res, JoinDaoState>; @useResult - $Res call({PageState pageState, bool isButtonLoading}); + $Res call({PageState pageState, bool isButtonLoading, String daoName}); } /// @nodoc @@ -311,6 +312,7 @@ class _$JoinDaoStateCopyWithImpl<$Res, $Val extends JoinDaoState> $Res call({ Object? pageState = null, Object? isButtonLoading = null, + Object? daoName = null, }) { return _then(_value.copyWith( pageState: null == pageState @@ -321,6 +323,10 @@ class _$JoinDaoStateCopyWithImpl<$Res, $Val extends JoinDaoState> ? _value.isButtonLoading : isButtonLoading // ignore: cast_nullable_to_non_nullable as bool, + daoName: null == daoName + ? _value.daoName + : daoName // ignore: cast_nullable_to_non_nullable + as String, ) as $Val); } } @@ -333,7 +339,7 @@ abstract class _$$_JoinDaoStateCopyWith<$Res> __$$_JoinDaoStateCopyWithImpl<$Res>; @override @useResult - $Res call({PageState pageState, bool isButtonLoading}); + $Res call({PageState pageState, bool isButtonLoading, String daoName}); } /// @nodoc @@ -349,6 +355,7 @@ class __$$_JoinDaoStateCopyWithImpl<$Res> $Res call({ Object? pageState = null, Object? isButtonLoading = null, + Object? daoName = null, }) { return _then(_$_JoinDaoState( pageState: null == pageState @@ -359,6 +366,10 @@ class __$$_JoinDaoStateCopyWithImpl<$Res> ? _value.isButtonLoading : isButtonLoading // ignore: cast_nullable_to_non_nullable as bool, + daoName: null == daoName + ? _value.daoName + : daoName // ignore: cast_nullable_to_non_nullable + as String, )); } } @@ -367,7 +378,9 @@ class __$$_JoinDaoStateCopyWithImpl<$Res> class _$_JoinDaoState extends _JoinDaoState { const _$_JoinDaoState( - {this.pageState = PageState.initial, this.isButtonLoading = false}) + {this.pageState = PageState.initial, + this.isButtonLoading = false, + this.daoName = ''}) : super._(); @override @@ -376,10 +389,13 @@ class _$_JoinDaoState extends _JoinDaoState { @override @JsonKey() final bool isButtonLoading; + @override + @JsonKey() + final String daoName; @override String toString() { - return 'JoinDaoState(pageState: $pageState, isButtonLoading: $isButtonLoading)'; + return 'JoinDaoState(pageState: $pageState, isButtonLoading: $isButtonLoading, daoName: $daoName)'; } @override @@ -390,11 +406,13 @@ class _$_JoinDaoState extends _JoinDaoState { (identical(other.pageState, pageState) || other.pageState == pageState) && (identical(other.isButtonLoading, isButtonLoading) || - other.isButtonLoading == isButtonLoading)); + other.isButtonLoading == isButtonLoading) && + (identical(other.daoName, daoName) || other.daoName == daoName)); } @override - int get hashCode => Object.hash(runtimeType, pageState, isButtonLoading); + int get hashCode => + Object.hash(runtimeType, pageState, isButtonLoading, daoName); @JsonKey(ignore: true) @override @@ -406,7 +424,8 @@ class _$_JoinDaoState extends _JoinDaoState { abstract class _JoinDaoState extends JoinDaoState { const factory _JoinDaoState( {final PageState pageState, - final bool isButtonLoading}) = _$_JoinDaoState; + final bool isButtonLoading, + final String daoName}) = _$_JoinDaoState; const _JoinDaoState._() : super._(); @override @@ -414,6 +433,8 @@ abstract class _JoinDaoState extends JoinDaoState { @override bool get isButtonLoading; @override + String get daoName; + @override @JsonKey(ignore: true) _$$_JoinDaoStateCopyWith<_$_JoinDaoState> get copyWith => throw _privateConstructorUsedError; diff --git a/lib/ui/onboarding/join_dao/interactor/join_dao_state.dart b/lib/ui/onboarding/join_dao/interactor/join_dao_state.dart index 60157849..18a0c641 100644 --- a/lib/ui/onboarding/join_dao/interactor/join_dao_state.dart +++ b/lib/ui/onboarding/join_dao/interactor/join_dao_state.dart @@ -7,6 +7,7 @@ class JoinDaoState with _$JoinDaoState { const factory JoinDaoState({ @Default(PageState.initial) PageState pageState, @Default(false) bool isButtonLoading, + @Default('') String daoName, }) = _JoinDaoState; } diff --git a/lib/ui/onboarding/join_dao/join_dao_rationale_bottom_sheet.dart b/lib/ui/onboarding/join_dao/join_dao_rationale_bottom_sheet.dart index a1a524fd..8a100299 100644 --- a/lib/ui/onboarding/join_dao/join_dao_rationale_bottom_sheet.dart +++ b/lib/ui/onboarding/join_dao/join_dao_rationale_bottom_sheet.dart @@ -6,52 +6,87 @@ import 'package:hypha_wallet/design/buttons/button_type.dart'; import 'package:hypha_wallet/design/buttons/hypha_app_button.dart'; import 'package:hypha_wallet/design/hypha_colors.dart'; import 'package:hypha_wallet/design/themes/extensions/theme_extension_provider.dart'; +import 'package:hypha_wallet/ui/blocs/deeplink/deeplink_bloc.dart'; import 'package:hypha_wallet/ui/onboarding/join_dao/interactor/join_dao_bloc.dart'; +import 'package:hypha_wallet/ui/shared/hypha_body_widget.dart'; class JoinDaoRationaleBottomSheet extends StatelessWidget { - final String daoName; - final String secret; + final InviteLinkData inviteLinkData; - const JoinDaoRationaleBottomSheet({super.key, required this.daoName, required this.secret}); + const JoinDaoRationaleBottomSheet({super.key, required this.inviteLinkData}); @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => GetIt.I.get(param1: secret)..add(const JoinDaoEvent.initial()), - child: DecoratedBox( - decoration: BoxDecoration( - gradient: context.isDarkTheme ? HyphaColors.gradientBlack : HyphaColors.gradientWhite, - borderRadius: const BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30)), - ), - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Do you want to join DAO "$daoName"?', style: context.textTheme.titleSmall), - const SizedBox(height: 24), - BlocBuilder( - builder: (context, state) { - return HyphaAppButton( - title: 'Yes', - isLoading: state.isButtonLoading, - onPressed: () { - context.read().add(const JoinDaoEvent.onYesTapped()); - }, - ); - }, + create: (context) => + GetIt.I.get(param1: inviteLinkData) + ..add(const JoinDaoEvent.initial()), + child: BlocBuilder( + builder: (context, state) { + return HyphaBodyWidget( + pageState: state.pageState, + success: (context) => DecoratedBox( + decoration: BoxDecoration( + gradient: context.isDarkTheme ? HyphaColors.gradientBlack : HyphaColors.gradientWhite, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30)), ), - const SizedBox(height: 8), - HyphaAppButton( - title: 'Cancel', - buttonType: ButtonType.secondary, - onPressed: () { - Get.back(); - }, + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Do you want to join DAO "${state.daoName}"?', style: context.textTheme.titleSmall), + const SizedBox(height: 24), + BlocBuilder( + builder: (context, state) { + return HyphaAppButton( + title: 'Yes', + isLoading: state.isButtonLoading, + onPressed: () { + context.read().add(const JoinDaoEvent.onYesTapped()); + }, + ); + }, + ), + const SizedBox(height: 8), + HyphaAppButton( + title: 'Cancel', + buttonType: ButtonType.secondary, + onPressed: () { + Get.back(); + }, + ), + ], + ), ), - ], - ), - ), + ), + failure: (context) => DecoratedBox( + decoration: BoxDecoration( + gradient: context.isDarkTheme ? HyphaColors.gradientBlack : HyphaColors.gradientWhite, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(30), topRight: Radius.circular(30)), + ), + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 24), + Text('Error loading dao data. Please try again later', style: context.textTheme.titleSmall), + const SizedBox(height: 24), + HyphaAppButton( + title: 'Close', + isLoading: state.isButtonLoading, + onPressed: () { + context.read().add(const JoinDaoEvent.onYesTapped()); + }, + ), + const SizedBox(height: 8), + ], + ), + ), + ), + ); + }, ), ); }