Skip to content

Commit e754136

Browse files
author
Egor Komarov
committed
feat(EWM-517): add NFT config
1 parent 908c7f8 commit e754136

File tree

16 files changed

+313
-53
lines changed

16 files changed

+313
-53
lines changed

lib/app/service/connection/connection_service.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ extension TransportTypeExtension on TransportStrategy {
149149
return '';
150150
}
151151

152+
NftInformation? get nftInformation {
153+
if (this is CommonTransportStrategy) {
154+
return (this as CommonTransportStrategy).nftInformation;
155+
}
156+
157+
return null;
158+
}
159+
152160
bool get isEverscale => networkType == 'ever';
153161
bool get isVenom => networkType == 'venom';
154162
bool get isTon => networkGroup.startsWith('ton');

lib/app/service/connection/data/connection_transport/connection_transport_data.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
import 'package:app/app/service/connection/data/account_explorer/account_explorer_link_type.dart';
2-
import 'package:app/app/service/connection/data/default_active_asset.dart';
3-
import 'package:app/app/service/connection/data/transaction_explorer/transaction_explorer_link_type.dart';
4-
import 'package:app/app/service/connection/data/transport_icons.dart';
5-
import 'package:app/app/service/connection/data/transport_manifest_option/transport_manifest_option.dart';
6-
import 'package:app/app/service/connection/data/transport_native_token_option/transport_native_token_option.dart';
7-
import 'package:app/app/service/connection/generic_token_subscriber.dart';
1+
import 'package:app/app/service/connection/connection.dart';
82
import 'package:app/generated/generated.dart';
93
import 'package:nekoton_repository/nekoton_repository.dart';
104

@@ -28,6 +22,7 @@ class ConnectionTransportData {
2822
this.tokenApiBaseUrl,
2923
this.currencyApiBaseUrl,
3024
this.defaultNativeCurrencyDecimal,
25+
this.nftInformation,
3126
List<DefaultActiveAsset>? defaultActiveAssets,
3227
}) : defaultActiveAssets = defaultActiveAssets ?? [];
3328

@@ -97,6 +92,7 @@ class ConnectionTransportData {
9792
final String? tokenApiBaseUrl;
9893
final String? currencyApiBaseUrl;
9994
final int? defaultNativeCurrencyDecimal;
95+
final NftInformation? nftInformation;
10096
}
10197

10298
class WalletDefaultAccountNames {

lib/app/service/connection/data/data.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export 'connection_network/connection_network.dart';
44
export 'connection_transport/connection_transport.dart';
55
export 'custom_network/custom_network.dart';
66
export 'default_active_asset.dart';
7+
export 'nft_information/nft_information.dart';
78
export 'transaction_explorer/transaction_explorer.dart';
89
export 'transport_icons.dart';
910
export 'transport_manifest_option/transport_manifest_option.dart';
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:freezed_annotation/freezed_annotation.dart';
2+
import 'package:nekoton_repository/nekoton_repository.dart';
3+
4+
part 'nft_information.freezed.dart';
5+
part 'nft_information.g.dart';
6+
7+
@freezed
8+
class NftInformation with _$NftInformation {
9+
factory NftInformation({
10+
String? marketplaceUrl,
11+
List<Address>? defaultCollections,
12+
}) = _NftInformation;
13+
14+
factory NftInformation.fromJson(Map<String, dynamic> json) =>
15+
_$NftInformationFromJson(json);
16+
}
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
// coverage:ignore-file
2+
// GENERATED CODE - DO NOT MODIFY BY HAND
3+
// ignore_for_file: type=lint
4+
// 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
5+
6+
part of 'nft_information.dart';
7+
8+
// **************************************************************************
9+
// FreezedGenerator
10+
// **************************************************************************
11+
12+
T _$identity<T>(T value) => value;
13+
14+
final _privateConstructorUsedError = UnsupportedError(
15+
'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');
16+
17+
NftInformation _$NftInformationFromJson(Map<String, dynamic> json) {
18+
return _NftInformation.fromJson(json);
19+
}
20+
21+
/// @nodoc
22+
mixin _$NftInformation {
23+
String? get marketplaceUrl => throw _privateConstructorUsedError;
24+
List<Address>? get defaultCollections => throw _privateConstructorUsedError;
25+
26+
/// Serializes this NftInformation to a JSON map.
27+
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
28+
29+
/// Create a copy of NftInformation
30+
/// with the given fields replaced by the non-null parameter values.
31+
@JsonKey(includeFromJson: false, includeToJson: false)
32+
$NftInformationCopyWith<NftInformation> get copyWith =>
33+
throw _privateConstructorUsedError;
34+
}
35+
36+
/// @nodoc
37+
abstract class $NftInformationCopyWith<$Res> {
38+
factory $NftInformationCopyWith(
39+
NftInformation value, $Res Function(NftInformation) then) =
40+
_$NftInformationCopyWithImpl<$Res, NftInformation>;
41+
@useResult
42+
$Res call({String? marketplaceUrl, List<Address>? defaultCollections});
43+
}
44+
45+
/// @nodoc
46+
class _$NftInformationCopyWithImpl<$Res, $Val extends NftInformation>
47+
implements $NftInformationCopyWith<$Res> {
48+
_$NftInformationCopyWithImpl(this._value, this._then);
49+
50+
// ignore: unused_field
51+
final $Val _value;
52+
// ignore: unused_field
53+
final $Res Function($Val) _then;
54+
55+
/// Create a copy of NftInformation
56+
/// with the given fields replaced by the non-null parameter values.
57+
@pragma('vm:prefer-inline')
58+
@override
59+
$Res call({
60+
Object? marketplaceUrl = freezed,
61+
Object? defaultCollections = freezed,
62+
}) {
63+
return _then(_value.copyWith(
64+
marketplaceUrl: freezed == marketplaceUrl
65+
? _value.marketplaceUrl
66+
: marketplaceUrl // ignore: cast_nullable_to_non_nullable
67+
as String?,
68+
defaultCollections: freezed == defaultCollections
69+
? _value.defaultCollections
70+
: defaultCollections // ignore: cast_nullable_to_non_nullable
71+
as List<Address>?,
72+
) as $Val);
73+
}
74+
}
75+
76+
/// @nodoc
77+
abstract class _$$NftInformationImplCopyWith<$Res>
78+
implements $NftInformationCopyWith<$Res> {
79+
factory _$$NftInformationImplCopyWith(_$NftInformationImpl value,
80+
$Res Function(_$NftInformationImpl) then) =
81+
__$$NftInformationImplCopyWithImpl<$Res>;
82+
@override
83+
@useResult
84+
$Res call({String? marketplaceUrl, List<Address>? defaultCollections});
85+
}
86+
87+
/// @nodoc
88+
class __$$NftInformationImplCopyWithImpl<$Res>
89+
extends _$NftInformationCopyWithImpl<$Res, _$NftInformationImpl>
90+
implements _$$NftInformationImplCopyWith<$Res> {
91+
__$$NftInformationImplCopyWithImpl(
92+
_$NftInformationImpl _value, $Res Function(_$NftInformationImpl) _then)
93+
: super(_value, _then);
94+
95+
/// Create a copy of NftInformation
96+
/// with the given fields replaced by the non-null parameter values.
97+
@pragma('vm:prefer-inline')
98+
@override
99+
$Res call({
100+
Object? marketplaceUrl = freezed,
101+
Object? defaultCollections = freezed,
102+
}) {
103+
return _then(_$NftInformationImpl(
104+
marketplaceUrl: freezed == marketplaceUrl
105+
? _value.marketplaceUrl
106+
: marketplaceUrl // ignore: cast_nullable_to_non_nullable
107+
as String?,
108+
defaultCollections: freezed == defaultCollections
109+
? _value._defaultCollections
110+
: defaultCollections // ignore: cast_nullable_to_non_nullable
111+
as List<Address>?,
112+
));
113+
}
114+
}
115+
116+
/// @nodoc
117+
@JsonSerializable()
118+
class _$NftInformationImpl implements _NftInformation {
119+
_$NftInformationImpl(
120+
{this.marketplaceUrl, final List<Address>? defaultCollections})
121+
: _defaultCollections = defaultCollections;
122+
123+
factory _$NftInformationImpl.fromJson(Map<String, dynamic> json) =>
124+
_$$NftInformationImplFromJson(json);
125+
126+
@override
127+
final String? marketplaceUrl;
128+
final List<Address>? _defaultCollections;
129+
@override
130+
List<Address>? get defaultCollections {
131+
final value = _defaultCollections;
132+
if (value == null) return null;
133+
if (_defaultCollections is EqualUnmodifiableListView)
134+
return _defaultCollections;
135+
// ignore: implicit_dynamic_type
136+
return EqualUnmodifiableListView(value);
137+
}
138+
139+
@override
140+
String toString() {
141+
return 'NftInformation(marketplaceUrl: $marketplaceUrl, defaultCollections: $defaultCollections)';
142+
}
143+
144+
@override
145+
bool operator ==(Object other) {
146+
return identical(this, other) ||
147+
(other.runtimeType == runtimeType &&
148+
other is _$NftInformationImpl &&
149+
(identical(other.marketplaceUrl, marketplaceUrl) ||
150+
other.marketplaceUrl == marketplaceUrl) &&
151+
const DeepCollectionEquality()
152+
.equals(other._defaultCollections, _defaultCollections));
153+
}
154+
155+
@JsonKey(includeFromJson: false, includeToJson: false)
156+
@override
157+
int get hashCode => Object.hash(runtimeType, marketplaceUrl,
158+
const DeepCollectionEquality().hash(_defaultCollections));
159+
160+
/// Create a copy of NftInformation
161+
/// with the given fields replaced by the non-null parameter values.
162+
@JsonKey(includeFromJson: false, includeToJson: false)
163+
@override
164+
@pragma('vm:prefer-inline')
165+
_$$NftInformationImplCopyWith<_$NftInformationImpl> get copyWith =>
166+
__$$NftInformationImplCopyWithImpl<_$NftInformationImpl>(
167+
this, _$identity);
168+
169+
@override
170+
Map<String, dynamic> toJson() {
171+
return _$$NftInformationImplToJson(
172+
this,
173+
);
174+
}
175+
}
176+
177+
abstract class _NftInformation implements NftInformation {
178+
factory _NftInformation(
179+
{final String? marketplaceUrl,
180+
final List<Address>? defaultCollections}) = _$NftInformationImpl;
181+
182+
factory _NftInformation.fromJson(Map<String, dynamic> json) =
183+
_$NftInformationImpl.fromJson;
184+
185+
@override
186+
String? get marketplaceUrl;
187+
@override
188+
List<Address>? get defaultCollections;
189+
190+
/// Create a copy of NftInformation
191+
/// with the given fields replaced by the non-null parameter values.
192+
@override
193+
@JsonKey(includeFromJson: false, includeToJson: false)
194+
_$$NftInformationImplCopyWith<_$NftInformationImpl> get copyWith =>
195+
throw _privateConstructorUsedError;
196+
}

lib/app/service/connection/data/nft_information/nft_information.g.dart

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/app/service/connection/mapping/transports_mapper.dart

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
1-
import 'package:app/app/service/connection/data/account_explorer/account_explorer_link_type.dart';
2-
import 'package:app/app/service/connection/data/connection_transport/connection_transport_data.dart';
3-
import 'package:app/app/service/connection/data/default_active_asset.dart';
4-
import 'package:app/app/service/connection/data/transaction_explorer/transaction_explorer_link_type.dart';
5-
import 'package:app/app/service/connection/data/transport_icons.dart';
6-
import 'package:app/app/service/connection/data/transport_manifest_option/transport_manifest_option.dart';
7-
import 'package:app/app/service/connection/data/transport_native_token_option/transport_native_token_option.dart';
8-
import 'package:app/app/service/connection/generic_token_subscriber.dart';
9-
import 'package:app/app/service/connection/group.dart';
10-
import 'package:app/utils/json/json_utils.dart';
11-
import 'package:app/utils/parse_utils.dart';
1+
import 'package:app/app/service/connection/connection.dart';
2+
import 'package:app/utils/utils.dart';
123
import 'package:nekoton_repository/nekoton_repository.dart';
134

145
Map<NetworkGroup, ConnectionTransportData>? mapToTransports(
@@ -64,6 +55,8 @@ Map<NetworkGroup, ConnectionTransportData>? mapToTransports(
6455
),
6556
tokenApiBaseUrl: transport['tokenApiBaseUrl'] as String?,
6657
currencyApiBaseUrl: transport['currencyApiBaseUrl'] as String?,
58+
nftInformation: (transport['nftInformation'] as Map<String, dynamic>?)
59+
?.let(NftInformation.fromJson),
6760
);
6861
}
6962

lib/app/service/connection/transport_strategies/common_transport_strategy.dart

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
1-
import 'package:app/app/service/connection/data/account_explorer/account_explorer_link_type.dart';
2-
import 'package:app/app/service/connection/data/connection_data/connection_data.dart';
3-
import 'package:app/app/service/connection/data/connection_transport/connection_transport_data.dart';
4-
import 'package:app/app/service/connection/data/transaction_explorer/transaction_explorer_link_type.dart';
5-
import 'package:app/app/service/connection/data/transport_icons.dart';
6-
import 'package:app/app/service/connection/data/transport_manifest_option/transport_manifest_option.dart';
7-
import 'package:app/app/service/connection/data/transport_native_token_option/transport_native_token_option.dart';
8-
import 'package:app/app/service/connection/generic_token_subscriber.dart';
9-
import 'package:app/app/service/connection/group.dart';
10-
import 'package:app/app/service/connection/network_type.dart';
11-
import 'package:app/app/service/connection/transport_strategies/app_transport_strategy.dart';
1+
import 'package:app/app/service/connection/connection.dart';
122
import 'package:app/di/di.dart';
133
import 'package:app/generated/generated.dart';
144
import 'package:dio/dio.dart';
@@ -36,6 +26,7 @@ class CommonTransportStrategy extends AppTransportStrategy {
3626
this.stakeInformation,
3727
this.tokenApiBaseUrl,
3828
this.currencyApiBaseUrl,
29+
this.nftInformation,
3930
String? baseCurrencyUrl,
4031
}) : baseCurrencyUrl = baseCurrencyUrl ?? '';
4132

@@ -69,6 +60,7 @@ class CommonTransportStrategy extends AppTransportStrategy {
6960
tokenApiBaseUrl: transportData.tokenApiBaseUrl,
7061
currencyApiBaseUrl: transportData.currencyApiBaseUrl,
7162
baseCurrencyUrl: transportData.baseCurrencyUrl,
63+
nftInformation: transportData.nftInformation,
7264
);
7365
}
7466

@@ -124,6 +116,8 @@ class CommonTransportStrategy extends AppTransportStrategy {
124116

125117
final String baseCurrencyUrl;
126118

119+
final NftInformation? nftInformation;
120+
127121
@override
128122
StakingInformation? stakeInformation;
129123

lib/feature/nft/domain/nft_service.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ class NftService {
148148

149149
Future<void> scanNftCollections(Address owner) async {
150150
final networkGroup = _nekotonRepository.currentTransport.networkGroup;
151-
// TODO(komarov): whitelist collections
152-
final whitelist = <Address>[];
151+
final defaultCollections =
152+
_nekotonRepository.currentTransport.nftInformation?.defaultCollections;
153153
final meta = (_nftStorageService.readMetadata()[owner] ?? [])
154154
.where((e) => e.networkGroup == networkGroup);
155155
final hidden =
@@ -160,7 +160,7 @@ class NftService {
160160
.toSet();
161161

162162
final collections = [
163-
...whitelist,
163+
if (defaultCollections != null) ...defaultCollections,
164164
...meta.map((e) => e.collection),
165165
...pending,
166166
];

lib/feature/nft/view/nft_item_page/nft_item_page_model.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ class NftItemPageModel extends ElementaryModel {
1616
final CurrentAccountsService _currentAccountsService;
1717
final NekotonRepository _nekotonRepository;
1818

19+
Stream<String?> get marketplaceUrlStream =>
20+
_nekotonRepository.currentTransportStream.map(
21+
(transport) => transport.nftInformation?.marketplaceUrl,
22+
);
23+
1924
Stream<KeyAccount?> get currentAccount =>
2025
_currentAccountsService.currentActiveAccountStream;
2126

0 commit comments

Comments
 (0)