Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
08fdbdf
Add multi-address support to "Faucet" button
TazzyMeister Feb 17, 2025
e82db99
isMobile not displaying Faucet button
TazzyMeister Feb 20, 2025
de2e433
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Feb 24, 2025
85825e8
Update coin_addresses.dart
TazzyMeister Feb 26, 2025
3a80929
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Feb 26, 2025
b36440f
Merge branch 'dev' into add/multi-address-faucet
CharlVS Feb 26, 2025
c26a51c
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Feb 26, 2025
cb2a740
Merge remote-tracking branch 'origin/dev' into add/multi-address-faucet
TazzyMeister Feb 27, 2025
54a8721
Update faucet_button.dart
TazzyMeister Feb 27, 2025
f9add4b
Merge remote-tracking branch 'origin/dev' into add/multi-address-faucet
TazzyMeister Feb 28, 2025
4910636
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Mar 5, 2025
a808178
Created Bloc for Faucet Button
TazzyMeister Mar 5, 2025
3ed8386
Fixed multiple Dialogs
TazzyMeister Mar 5, 2025
3b4a2f6
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Mar 6, 2025
33fd5bf
Updated manner of keeping Active Address
TazzyMeister Mar 6, 2025
6507714
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Mar 20, 2025
5d6cd43
UI adjustments
TazzyMeister Mar 24, 2025
71deb6d
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Mar 25, 2025
6429215
Feedback adjustments
TazzyMeister Mar 26, 2025
7d75a26
Merge branch 'add/multi-address-faucet' of https://github.com/TazzyMe…
TazzyMeister Mar 26, 2025
e3c965f
Update faucet_button_state.dart
TazzyMeister Mar 26, 2025
74a03a2
Refactored all names
TazzyMeister Mar 26, 2025
0558253
fix: merge errors
takenagain Mar 26, 2025
485b420
Merge branch 'dev' into add/multi-address-faucet
TazzyMeister Mar 31, 2025
a5f775b
Merge remote-tracking branch 'upstream/dev' into add/multi-address-fa…
TazzyMeister Mar 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/bloc/app_bloc_root.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import 'package:web_dex/bloc/coins_bloc/coins_bloc.dart';
import 'package:web_dex/bloc/coins_bloc/coins_repo.dart';
import 'package:web_dex/bloc/coins_manager/coins_manager_bloc.dart';
import 'package:web_dex/bloc/dex_repository.dart';
import 'package:web_dex/bloc/faucet_button/faucet_button_bloc.dart';
import 'package:web_dex/bloc/market_maker_bot/market_maker_bot/market_maker_bot_bloc.dart';
import 'package:web_dex/bloc/market_maker_bot/market_maker_bot/market_maker_bot_repository.dart';
import 'package:web_dex/bloc/market_maker_bot/market_maker_order_list/market_maker_bot_order_list_repository.dart';
Expand Down Expand Up @@ -301,6 +302,9 @@ class AppBlocRoot extends StatelessWidget {
sdk: komodoDefiSdk,
),
),
BlocProvider<FaucetBloc>(
create: (context) => FaucetBloc(kdfSdk: context.read<KomodoDefiSdk>()),
)
],
child: _MyAppView(),
),
Expand Down
48 changes: 48 additions & 0 deletions lib/bloc/faucet_button/faucet_button_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:web_dex/3p_api/faucet/faucet.dart' as api;
import 'package:web_dex/3p_api/faucet/faucet_response.dart';
import 'package:web_dex/bloc/faucet_button/faucet_button_event.dart';
import 'package:web_dex/bloc/faucet_button/faucet_button_state.dart';
import 'package:logging/logging.dart';

class FaucetBloc extends Bloc<FaucetEvent, FaucetState> implements StateStreamable<FaucetState> {
final KomodoDefiSdk kdfSdk;
final _log = Logger('FaucetBloc');

Comment thread
takenagain marked this conversation as resolved.
FaucetBloc({required this.kdfSdk}) : super(FaucetInitial()) {
on<FaucetRequested>(_onFaucetRequest);
}

Future<void> _onFaucetRequest(
FaucetRequested event,
Emitter<FaucetState> emit,
) async {
if (state is FaucetRequestInProgress) {
final currentLoading = state as FaucetRequestInProgress;
if (currentLoading.address == event.address) {
return;
}
}

emit(FaucetRequestInProgress(address: event.address));

try {
final response = await api.callFaucet(event.coinAbbr, event.address);

if (response.status == FaucetStatus.success) {
emit(FaucetRequestSuccess(FaucetResponse(
status: response.status,
address: event.address,
message: response.message,
coin: event.coinAbbr,
)));
} else {
emit(FaucetRequestError("Faucet request failed: ${response.message}"));
}
} catch (error, stackTrace) {
_log.shout('Faucet request failed', error, stackTrace);
emit(FaucetRequestError("Network error: ${error.toString()}"));
}
}
}
21 changes: 21 additions & 0 deletions lib/bloc/faucet_button/faucet_button_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:equatable/equatable.dart';

abstract class FaucetEvent extends Equatable {
const FaucetEvent();

@override
List<Object> get props => [];
}

class FaucetRequested extends FaucetEvent {
final String coinAbbr;
final String address;

const FaucetRequested({
required this.coinAbbr,
required this.address,
});

@override
List<Object> get props => [coinAbbr, address];
}
40 changes: 40 additions & 0 deletions lib/bloc/faucet_button/faucet_button_state.dart
Comment thread
takenagain marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'package:equatable/equatable.dart';
import 'package:web_dex/3p_api/faucet/faucet_response.dart';

abstract class FaucetState extends Equatable {
const FaucetState();

@override
List<Object?> get props => [];
}

class FaucetInitial extends FaucetState {
const FaucetInitial();
}

class FaucetRequestInProgress extends FaucetState {
final String address;

const FaucetRequestInProgress({required this.address});

@override
List<Object?> get props => [address];
}

class FaucetRequestSuccess extends FaucetState {
final FaucetResponse response;

const FaucetRequestSuccess(this.response);

@override
List<Object?> get props => [response];
}

class FaucetRequestError extends FaucetState {
final String message;

const FaucetRequestError(this.message);

@override
List<Object?> get props => [message];
}
13 changes: 3 additions & 10 deletions lib/views/wallet/coin_details/coin_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ import 'package:web_dex/bloc/transaction_history/transaction_history_event.dart'
import 'package:web_dex/model/coin.dart';
import 'package:web_dex/views/wallet/coin_details/coin_details_info/coin_details_info.dart';
import 'package:web_dex/views/wallet/coin_details/coin_page_type.dart';
import 'package:web_dex/views/wallet/coin_details/faucet/faucet_page.dart';
import 'package:web_dex/views/wallet/coin_details/receive/receive_details.dart';
import 'package:web_dex/views/wallet/coin_details/rewards/kmd_reward_claim_success.dart';
import 'package:web_dex/views/wallet/coin_details/rewards/kmd_rewards_info.dart';
import 'package:web_dex/views/wallet/coin_details/withdraw_form/withdraw_form.dart';

class CoinDetails extends StatefulWidget {
const CoinDetails({
super.key,
Key? key,
required this.coin,
required this.onBackButtonPressed,
});
}) : super(key: key);

final Coin coin;
final VoidCallback onBackButtonPressed;
Expand Down Expand Up @@ -73,13 +73,6 @@ class _CoinDetailsState extends State<CoinDetails> {
onBackButtonPressed: _openInfo,
);

case CoinPageType.faucet:
return FaucetPage(
coinAbbr: widget.coin.abbr,
onBackButtonPressed: _openInfo,
coinAddress: widget.coin.defaultAddress,
);

case CoinPageType.claim:
return KmdRewardsInfo(
coin: widget.coin,
Expand Down
120 changes: 108 additions & 12 deletions lib/views/wallet/coin_details/coin_details_info/coin_addresses.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:app_theme/app_theme.dart';
import 'package:decimal/decimal.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:komodo_ui_kit/komodo_ui_kit.dart';
import 'package:qr_flutter/qr_flutter.dart';
Expand All @@ -14,6 +16,8 @@ import 'package:web_dex/generated/codegen_loader.g.dart';
import 'package:web_dex/model/coin.dart';
import 'package:web_dex/shared/utils/utils.dart';
import 'package:web_dex/shared/widgets/coin_type_tag.dart';
import 'package:web_dex/views/wallet/coin_details/coin_page_type.dart';
import 'package:web_dex/views/wallet/coin_details/faucet/faucet_button.dart';
import 'package:web_dex/views/wallet/common/address_copy_button.dart';
import 'package:web_dex/views/wallet/common/address_icon.dart';
import 'package:web_dex/views/wallet/common/address_text.dart';
Expand All @@ -22,16 +26,28 @@ class CoinAddresses extends StatefulWidget {
const CoinAddresses({
super.key,
required this.coin,
required this.setPageType,
});

final Coin coin;
final void Function(CoinPageType) setPageType;

@override
State<CoinAddresses> createState() => _CoinAddressesState();
}

class _CoinAddressesState extends State<CoinAddresses> {
CoinAddressesBloc get _addressesBloc => context.read<CoinAddressesBloc>();
late final CoinAddressesBloc _addressesBloc;

@override
void initState() {
super.initState();
final kdfSdk = RepositoryProvider.of<KomodoDefiSdk>(context);
_addressesBloc = CoinAddressesBloc(
kdfSdk,
widget.coin.abbr,
)..add(const LoadAddressesEvent());
}

@override
void dispose() {
Expand Down Expand Up @@ -74,14 +90,15 @@ class _CoinAddressesState extends State<CoinAddresses> {
final index = entry.key;
final address = entry.value;
if (state.hideZeroBalance &&
!address.balance.hasValue) {
address.balance.spendable == Decimal.zero) {
return const SizedBox();
}

return AddressCard(
address: address,
index: index,
coin: widget.coin,
setPageType: widget.setPageType,
);
},
),
Expand Down Expand Up @@ -178,11 +195,13 @@ class AddressCard extends StatelessWidget {
required this.address,
required this.index,
required this.coin,
required this.setPageType,
});

final PubkeyInfo address;
final int index;
final Coin coin;
final void Function(CoinPageType) setPageType;

@override
Widget build(BuildContext context) {
Expand All @@ -206,6 +225,17 @@ class AddressCard extends StatelessWidget {
const SizedBox(width: 8),
AddressText(address: address.address),
const SizedBox(width: 8),
if (coin.hasFaucet)
ConstrainedBox(
constraints: BoxConstraints(
minWidth: 80,
maxWidth: isMobile ? 100 : 160,
),
child: FaucetButton(
coinAbbr: coin.abbr,
address: address,
),
),
SwapAddressTag(address: address),
const Spacer(),
AddressCopyButton(address: address.address),
Expand All @@ -220,14 +250,28 @@ class AddressCard extends StatelessWidget {
const SizedBox(height: 4),
],
)
: Row(
children: [
AddressText(address: address.address),
const SizedBox(width: 8),
AddressCopyButton(address: address.address),
QrButton(coin: coin, address: address),
SwapAddressTag(address: address),
],
: SizedBox(
width: double.infinity,
child: Row(
children: [
AddressText(address: address.address),
const SizedBox(width: 8),
AddressCopyButton(address: address.address),
QrButton(coin: coin, address: address),
if (coin.hasFaucet)
ConstrainedBox(
constraints: BoxConstraints(
minWidth: 80,
maxWidth: isMobile ? 100 : 160,
),
child: FaucetButton(
coinAbbr: coin.abbr,
address: address,
),
),
SwapAddressTag(address: address),
],
),
),
trailing: isMobile ? null : _Balance(address: address, coin: coin),
),
Expand Down Expand Up @@ -273,8 +317,60 @@ class QrButton extends StatelessWidget {
onPressed: () {
showDialog(
context: context,
builder: (context) =>
PubkeyReceiveDialog(coin: coin, address: address),
builder: (context) => AlertDialog(
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
LocaleKeys.receive.tr(),
style: const TextStyle(fontSize: 16),
),
IconButton(
icon: const Icon(Icons.close),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
content: SizedBox(
width: 450,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
LocaleKeys.onlySendToThisAddress
.tr(args: [abbr2Ticker(coin.abbr)]),
style: const TextStyle(fontSize: 14),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
LocaleKeys.network.tr(),
style: const TextStyle(fontSize: 14),
),
CoinTypeTag(coin),
],
),
),
QrCode(
address: address.address,
coinAbbr: coin.abbr,
),
const SizedBox(height: 16),
Text(
LocaleKeys.scanTheQrCode.tr(),
style: const TextStyle(fontSize: 16),
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
],
),
),
),
);
},
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import 'package:web_dex/views/bitrefill/bitrefill_button.dart';
import 'package:web_dex/views/wallet/coin_details/coin_details_info/coin_addresses.dart';
import 'package:web_dex/views/wallet/coin_details/coin_details_info/contract_address_button.dart';
import 'package:web_dex/views/wallet/coin_details/coin_page_type.dart';
import 'package:web_dex/views/wallet/coin_details/faucet/faucet_button.dart';

class CoinDetailsCommonButtons extends StatelessWidget {
const CoinDetailsCommonButtons({
Expand Down Expand Up @@ -179,14 +178,6 @@ class CoinDetailsCommonButtonsDesktopLayout extends StatelessWidget {
context: context,
),
),
if (coin.hasFaucet)
Container(
margin: const EdgeInsets.only(left: 21),
constraints: const BoxConstraints(maxWidth: 120),
child: FaucetButton(
onPressed: () => selectWidget(CoinPageType.faucet),
),
),
if (isBitrefillIntegrationEnabled)
Container(
margin: const EdgeInsets.only(left: 21),
Expand Down
Loading
Loading