Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: ewm-385 #715

Open
wants to merge 9 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 0 additions & 1 deletion lib/app/service/assets_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,6 @@ class AssetsService {
if (transport.networkType == 'ton') {
final details = await JettonWallet.getJettonRootDetails(
transport: transport.transport,
gqlConnection: connectionFactory.getTonGqlConnection(),
tokenRoot: rootTokenContract,
);
final info = await tonRepository.getTokenInfo(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:app/app/service/service.dart';
import 'package:app/data/models/models.dart';
import 'package:app/feature/wallet/widgets/select_account/select_account_data.dart';
import 'package:elementary/elementary.dart';
import 'package:nekoton_repository/nekoton_repository.dart';

Expand All @@ -17,17 +18,31 @@ class RequestPermissionsModel extends ElementaryModel {

String get symbol => currentTransport.nativeTokenTicker;

KeyAccount? get currentAccount =>
_currentAccountsService.currentActiveAccount;

List<KeyAccount> get accounts => _nekotonRepository.seedList.seeds
.expand(
(seed) => seed.allKeys.expand(
(key) => key.accountList.allAccounts,
),
)
.where((account) => !account.isHidden)
.toList();
Stream<KeyAccount?> get currentAccount =>
_currentAccountsService.currentActiveAccountStream;

List<SelectAccountData> get seedWithAccountsFromValue {
final seedList = _nekotonRepository.seedList;
final seeds = seedList.seeds..sort((a, b) => a.name.compareTo(b.name));

return seeds.map((seed) {
final privateKeys = seed.allKeys.map((key) {
final accounts = key.accountList.allAccounts
.where((account) => !account.isHidden)
.toList();
return SeedWithInfo(
keyName: key.name,
key: key.publicKey.toEllipseString(),
accounts: accounts,
);
}).toList();

return SelectAccountData(
name: seed.name,
privateKeys: privateKeys,
);
}).toList();
}

TransportStrategy get currentTransport => _nekotonRepository.currentTransport;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:app/data/models/models.dart';
import 'package:app/feature/browser/approvals_listener/actions/request_permissions/account_list_item.dart';
import 'package:app/feature/browser/approvals_listener/actions/request_permissions/request_permissions_wm.dart';
import 'package:app/feature/browser/approvals_listener/actions/widgets/widgets.dart';
import 'package:app/feature/wallet/wallet.dart';
import 'package:app/feature/wallet/widgets/select_account/widgets/seed_item_widget.dart';
import 'package:app/generated/generated.dart';
import 'package:elementary/elementary.dart';
import 'package:elementary_helper/elementary_helper.dart';
Expand Down Expand Up @@ -50,8 +50,6 @@ class _SelectAccountWidget extends StatelessWidget {

@override
Widget build(BuildContext context) {
final theme = context.themeStyleV2;

return SeparatedColumn(
separatorSize: DimensSizeV2.d12,
children: [
Expand All @@ -67,45 +65,39 @@ class _SelectAccountWidget extends StatelessWidget {
onSubmit: (_) => wm.onSearch(),
),
Flexible(
child: Container(
width: double.maxFinite,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
border: Border.all(color: theme.colors.border1),
borderRadius: BorderRadius.circular(
DimensRadiusV2.radius12,
),
color: theme.colors.background1,
),
child: DoubleSourceBuilder(
firstSource: wm.accounts,
secondSource: wm.selected,
builder: (_, accounts, selected) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollToActiveAccount(accounts, selected);
});
return ListView.separated(
controller: scrollController,
physics: const ClampingScrollPhysics(),
itemCount: accounts?.length ?? 0,
itemBuilder: (_, index) {
final account = accounts?[index];
return account == null
? const SizedBox.shrink()
: AccountListItem(
key: ValueKey(account.address),
account: account,
balance: wm.getBalanceEntity(account),
active: account.address == selected?.address,
onTap: () => wm.onSelectedChanged(account),
);
},
separatorBuilder: (_, __) => CommonDivider(
color: theme.colors.border0,
child: DoubleSourceBuilder(
firstSource: wm.accounts,
secondSource: wm.selected,
builder: (_, list, selected) {
return SingleChildScrollView(
controller: scrollController,
physics: const ClampingScrollPhysics(),
child: Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(
list?.length ?? 0,
(index) {
final data = list![index];
final isExpanded = data.hasCurrentAccount(selected);
return Padding(
padding: const EdgeInsets.only(
bottom: DimensSizeV2.d8,
),
child: SeedItem(
data: data,
isExpanded: isExpanded,
key: ValueKey(data.name),
currentAccount: selected,
onTapAccount: wm.onSelectedChanged,
getBalanceEntity: wm.getBalanceEntity,
scrollController: scrollController,
),
);
},
),
);
},
),
),
);
},
),
),
],
Expand All @@ -122,25 +114,6 @@ class _SelectAccountWidget extends StatelessWidget {
],
);
}

void _scrollToActiveAccount(
List<KeyAccount>? accounts,
KeyAccount? selected,
) {
if (accounts != null && selected != null) {
final index = accounts.indexWhere(
(account) => account.address == selected.address,
);

if (index != -1) {
scrollController.animateTo(
index * DimensSizeV2.d72,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
);
}
}
}
}

class _ConfirmPermissionsWidget extends StatelessWidget {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:app/di/di.dart';
import 'package:app/feature/browser/approvals_listener/actions/request_permissions/request_permissions_model.dart';
import 'package:app/feature/browser/approvals_listener/actions/request_permissions/request_permissions_widget.dart';
import 'package:app/feature/browser/browser.dart';
import 'package:collection/collection.dart';
import 'package:app/feature/wallet/widgets/select_account/select_account_data.dart';
import 'package:elementary_helper/elementary_helper.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -35,8 +35,8 @@ class RequestPermissionsWidgetModel extends CustomWidgetModel<

late final searchController = createTextEditingController();
late final _step = createValueNotifier(RequestPermissionsStep.account);
late final _selected = createNotifier(_initialSelectedAccount);
late final _accounts = createNotifier(model.accounts);
late final _selected = createNotifierFromStream(model.currentAccount);
late final _accounts = createNotifier(model.seedWithAccountsFromValue);
late final _permissions = createNotifier(widget.permissions.toSet());
late final _zeroBalance = Money.fromBigIntWithCurrency(
BigInt.zero,
Expand All @@ -47,19 +47,12 @@ class RequestPermissionsWidgetModel extends CustomWidgetModel<

ValueListenable<RequestPermissionsStep> get step => _step;

ListenableState<List<KeyAccount>> get accounts => _accounts;
ListenableState<List<SelectAccountData>> get accounts => _accounts;

ListenableState<KeyAccount?> get selected => _selected;

ListenableState<Set<Permission>> get permissions => _permissions;

KeyAccount? get _initialSelectedAccount =>
model.accounts.firstWhereOrNull(
(a) => a.address == widget.previousSelectedAccount,
) ??
model.currentAccount ??
model.accounts.firstOrNull;

void onNext() {
if (_selected.value == null) return;
_step.value = RequestPermissionsStep.confirm;
Expand All @@ -69,14 +62,39 @@ class RequestPermissionsWidgetModel extends CustomWidgetModel<
final value = searchController.value.text.trim().toLowerCase();

if (value.isEmpty) {
_accounts.accept(model.accounts);
_accounts.accept(model.seedWithAccountsFromValue);
} else {
_accounts.accept(
model.accounts
model.seedWithAccountsFromValue
.map((selectAccountData) {
final filteredPrivateKeys = selectAccountData.privateKeys
.map((keyInfo) {
final filteredAccounts = keyInfo.accounts.where(
(account) {
return account.name.toLowerCase().contains(value) ||
account.address.address
.toLowerCase()
.contains(value);
},
).toList();

return SeedWithInfo(
keyName: keyInfo.keyName,
key: keyInfo.key,
accounts: filteredAccounts,
);
})
.where(
(keyInfo) => keyInfo.accounts.isNotEmpty,
)
.toList();
return SelectAccountData(
name: selectAccountData.name,
privateKeys: filteredPrivateKeys,
);
})
.where(
(account) =>
account.name.toLowerCase().contains(value) ||
account.address.address.toLowerCase().contains(value),
(selectAccountData) => selectAccountData.privateKeys.isNotEmpty,
)
.toList(),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
// ignore_for_file: inference_failure_on_function_return_type
import 'package:app/feature/wallet/widgets/select_account/select_account_data.dart';
import 'package:app/feature/wallet/widgets/select_account/select_account_wm.dart';
import 'package:app/feature/wallet/widgets/select_account/widgets/private_key_item_widget.dart';
import 'package:app/feature/wallet/widgets/select_account/widgets/seed_phrase_item_widget.dart';
import 'package:app/feature/wallet/widgets/select_account/widgets/seed_item_widget.dart';
import 'package:app/generated/generated.dart';
import 'package:elementary/elementary.dart';
import 'package:elementary_helper/elementary_helper.dart';
import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:nekoton_repository/nekoton_repository.dart';
import 'package:ui_components_lib/ui_components_lib.dart';
import 'package:ui_components_lib/v2/ui_components_lib_v2.dart';

Expand Down Expand Up @@ -49,12 +46,12 @@ class SelectAccountWidget extends ElementaryWidget<SelectAccountWidgetModel> {
final isExpanded = data.hasCurrentAccount(currentAccount);
return Padding(
padding: const EdgeInsets.only(bottom: DimensSizeV2.d8),
child: _SeedItem(
child: SeedItem(
data: data,
isExpanded: isExpanded,
key: ValueKey(data.name),
currentAccount: currentAccount,
onTapAccount: (item) => wm.onSelect(item),
onTapAccount: wm.onSelect,
getBalanceEntity: wm.getBalanceEntity,
scrollController: scrollController,
),
Expand Down Expand Up @@ -86,82 +83,3 @@ class SelectAccountWidget extends ElementaryWidget<SelectAccountWidgetModel> {
);
}
}

class _SeedItem extends StatefulWidget {
const _SeedItem({
required this.data,
required this.isExpanded,
required this.currentAccount,
required this.onTapAccount,
required this.getBalanceEntity,
required this.scrollController,
super.key,
});

final SelectAccountData data;
final bool isExpanded;
final KeyAccount? currentAccount;
final Function(KeyAccount) onTapAccount;
final ListenableState<Money?> Function(KeyAccount) getBalanceEntity;
final ScrollController scrollController;

@override
State<_SeedItem> createState() => _SeedItemState();
}

class _SeedItemState extends State<_SeedItem> {
late bool _isExpanded = widget.isExpanded;
late bool _isScrollToAccount = true;

@override
Widget build(BuildContext context) {
final theme = context.themeStyleV2;
return GestureDetector(
onTap: _toggleExpand,
child: Container(
padding: EdgeInsets.only(
top: DimensSizeV2.d16,
bottom: _isExpanded ? 0 : DimensSize.d16,
),
decoration: BoxDecoration(
color: theme.colors.background2,
borderRadius: BorderRadius.circular(DimensRadiusV2.radius12),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SeedPhraseItemWidget(
name: widget.data.name,
isExpanded: _isExpanded,
),
if (_isExpanded) const SizedBox(height: DimensSizeV2.d16),
if (_isExpanded) const CommonDivider(),
AnimatedSize(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
child: _isExpanded
? PrivateKeyItemWidget(
seedWithInfo: widget.data.privateKeys,
currentAccount: widget.currentAccount,
onTap: widget.onTapAccount,
getBalanceEntity: widget.getBalanceEntity,
scrollController: widget.scrollController,
isScrollToAccount: _isScrollToAccount,
)
: const SizedBox.shrink(),
),
],
),
),
);
}

void _toggleExpand() {
if (!_isExpanded && _isScrollToAccount) {
_isScrollToAccount = false;
}
setState(() {
_isExpanded = !_isExpanded;
});
}
}
Loading
Loading