@@ -20,13 +20,16 @@ import '../../../db/isar/main_db.dart';
2020import '../../../models/add_wallet_list_entity/add_wallet_list_entity.dart' ;
2121import '../../../models/add_wallet_list_entity/sub_classes/coin_entity.dart' ;
2222import '../../../models/add_wallet_list_entity/sub_classes/eth_token_entity.dart' ;
23+ import '../../../models/add_wallet_list_entity/sub_classes/sol_token_entity.dart' ;
2324import '../../../models/isar/models/ethereum/eth_contract.dart' ;
25+ import '../../../models/isar/models/solana/spl_token.dart' ;
2426import '../../../pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart' ;
2527import '../../../providers/providers.dart' ;
2628import '../../../themes/stack_colors.dart' ;
2729import '../../../utilities/assets.dart' ;
2830import '../../../utilities/constants.dart' ;
2931import '../../../utilities/default_eth_tokens.dart' ;
32+ import '../../../utilities/default_spl_tokens.dart' ;
3033import '../../../utilities/text_styles.dart' ;
3134import '../../../utilities/util.dart' ;
3235import '../../../wallets/crypto_currency/crypto_currency.dart' ;
@@ -41,6 +44,7 @@ import '../../../widgets/rounded_white_container.dart';
4144import '../../../widgets/stack_text_field.dart' ;
4245import '../../../widgets/textfield_icon_button.dart' ;
4346import '../add_token_view/add_custom_token_view.dart' ;
47+ import '../add_token_view/add_custom_solana_token_view.dart' ;
4448import '../add_token_view/sub_widgets/add_custom_token_selector.dart' ;
4549import 'sub_widgets/add_wallet_text.dart' ;
4650import 'sub_widgets/expanding_sub_list_item.dart' ;
@@ -68,6 +72,7 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
6872 final List <AddWalletListEntity > coinEntities = [];
6973 final List <AddWalletListEntity > coinTestnetEntities = [];
7074 final List <EthTokenEntity > tokenEntities = [];
75+ final List <SolTokenEntity > solTokenEntities = [];
7176
7277 final bool isDesktop = Util .isDesktop;
7378
@@ -84,6 +89,8 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
8489 e.name.toLowerCase ().contains (lowercaseTerm) ||
8590 e.cryptoCurrency.identifier.toLowerCase ().contains (lowercaseTerm) ||
8691 (e is EthTokenEntity &&
92+ e.token.address.toLowerCase ().contains (lowercaseTerm)) ||
93+ (e is SolTokenEntity &&
8794 e.token.address.toLowerCase ().contains (lowercaseTerm)),
8895 );
8996 }
@@ -125,6 +132,38 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
125132 }
126133 }
127134
135+ Future <void > _addSolToken () async {
136+ SplToken ? token;
137+ if (isDesktop) {
138+ token = await showDialog (
139+ context: context,
140+ builder:
141+ (context) => const DesktopDialog (
142+ maxWidth: 580 ,
143+ maxHeight: 500 ,
144+ child: AddCustomSolanaTokenView (),
145+ ),
146+ );
147+ } else {
148+ token = await Navigator .of (
149+ context,
150+ ).pushNamed (AddCustomSolanaTokenView .routeName);
151+ }
152+
153+ if (token != null ) {
154+ await MainDB .instance.putSplToken (token);
155+ if (mounted) {
156+ setState (() {
157+ if (solTokenEntities
158+ .where ((e) => e.token.address == token! .address)
159+ .isEmpty) {
160+ solTokenEntities.add (SolTokenEntity (token! ));
161+ }
162+ });
163+ }
164+ }
165+ }
166+
128167 @override
129168 void initState () {
130169 _searchFieldController = TextEditingController ();
@@ -153,6 +192,20 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
153192 tokenEntities.addAll (contracts.map ((e) => EthTokenEntity (e)));
154193 }
155194
195+ if (AppConfig .coins.whereType <Solana >().isNotEmpty) {
196+ // Add default tokens.
197+ final defaultTokenAddresses = DefaultSplTokens .list.map ((e) => e.address).toSet ();
198+ solTokenEntities.addAll (DefaultSplTokens .list.map ((e) => SolTokenEntity (e)));
199+
200+ // Add custom tokens from database.
201+ final allDatabaseTokens = MainDB .instance.getSplTokens ().findAllSync ();
202+ for (final token in allDatabaseTokens) {
203+ if (! defaultTokenAddresses.contains (token.address)) {
204+ solTokenEntities.add (SolTokenEntity (token));
205+ }
206+ }
207+ }
208+
156209 WidgetsBinding .instance.addPostFrameCallback ((_) {
157210 if (mounted) {
158211 ref.refresh (addWalletSelectedEntityStateProvider);
@@ -296,14 +349,24 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
296349 ),
297350 if (tokenEntities.isNotEmpty)
298351 ExpandingSubListItem (
299- title: "Tokens " ,
352+ title: "Ethereum tokens " ,
300353 entities: filter (_searchTerm, tokenEntities),
301354 initialState: ExpandableState .expanded,
302355 animationDurationMultiplier: 0.5 ,
303356 trailing: AddCustomTokenSelector (
304357 addFunction: _addToken,
305358 ),
306359 ),
360+ if (solTokenEntities.isNotEmpty)
361+ ExpandingSubListItem (
362+ title: "Solana tokens" ,
363+ entities: filter (_searchTerm, solTokenEntities),
364+ initialState: ExpandableState .expanded,
365+ animationDurationMultiplier: 0.5 ,
366+ trailing: AddCustomTokenSelector (
367+ addFunction: _addSolToken,
368+ ),
369+ ),
307370 ],
308371 ),
309372 ),
@@ -427,10 +490,16 @@ class _AddWalletViewState extends ConsumerState<AddWalletView> {
427490 ),
428491 if (tokenEntities.isNotEmpty)
429492 ExpandingSubListItem (
430- title: "Tokens " ,
493+ title: "Ethereum tokens " ,
431494 entities: filter (_searchTerm, tokenEntities),
432495 initialState: ExpandableState .expanded,
433496 ),
497+ if (solTokenEntities.isNotEmpty)
498+ ExpandingSubListItem (
499+ title: "Solana tokens" ,
500+ entities: filter (_searchTerm, solTokenEntities),
501+ initialState: ExpandableState .expanded,
502+ ),
434503 ],
435504 ),
436505 ),
0 commit comments